sx-pub: plan page, dev infrastructure, JS bundle rebuild

- Add sx-pub plan page under Applications with full protocol spec:
  wire format, endpoints, storage, flows, AP critique, phases
- Add nav entry and page function for /sx/(applications.(sx-pub))
- Add docker-compose.dev-pub.yml (sx_docs image + DB + IPFS + Redis)
- Add dev-pub.sh launch script (pub.sx-web.org via Caddy)
- Rebuild sx-browser.js with var fixes for SES compatibility

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 23:41:28 +00:00
parent 57cffb8bcc
commit 858275dff9
6 changed files with 415 additions and 8 deletions

View File

@@ -14,7 +14,7 @@
// =========================================================================
var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } });
var SX_VERSION = "2026-03-24T22:31:01Z";
var SX_VERSION = "2026-03-24T22:34:15Z";
function isNil(x) { return x === NIL || x === null || x === undefined; }
function isSxTruthy(x) { return x !== false && !isNil(x); }
@@ -4769,7 +4769,7 @@ PRIMITIVES["bind-sse-swap"] = bindSseSwap;
var eventName = slice(name, 6);
return (isSxTruthy(!isSxTruthy(isProcessed(el, (String("on:") + String(eventName))))) ? (markProcessed(el, (String("on:") + String(eventName))), (function() {
var exprs = sxParse(body);
return domOn(el, eventName, function(e) { return (function() {
return domListen(el, eventName, function(e) { return (function() {
var handlerEnv = envExtend({});
envBind(handlerEnv, "event", e);
envBind(handlerEnv, "this", el);
@@ -4826,7 +4826,7 @@ PRIMITIVES["process-one"] = processOne;
var els = domQueryAll(sxOr(root, domBody()), "[data-sx-emit]");
return forEach(function(el) { return (isSxTruthy(!isSxTruthy(isProcessed(el, "emit"))) ? (markProcessed(el, "emit"), (function() {
var eventName = domGetAttr(el, "data-sx-emit");
return (isSxTruthy(eventName) ? domOn(el, "click", function(e) { return (function() {
return (isSxTruthy(eventName) ? domListen(el, "click", function(e) { return (function() {
var detailJson = domGetAttr(el, "data-sx-emit-detail");
var detail = (isSxTruthy(detailJson) ? jsonParse(detailJson) : {});
return domDispatch(el, eventName, detail);
@@ -5973,12 +5973,12 @@ PRIMITIVES["clear-stores"] = clearStores;
PRIMITIVES["emit-event"] = emitEvent;
// on-event
var onEvent = function(el, eventName, handler) { return domOn(el, eventName, handler); };
var onEvent = function(el, eventName, handler) { return domListen(el, eventName, handler); };
PRIMITIVES["on-event"] = onEvent;
// bridge-event
var bridgeEvent = function(el, eventName, targetSignal, transformFn) { return effect(function() { return (function() {
var remove = domOn(el, eventName, function(e) { return (function() {
var remove = domListen(el, eventName, function(e) { return (function() {
var detail = eventDetail(e);
var newVal = (isSxTruthy(transformFn) ? cekCall(transformFn, [detail]) : detail);
return reset_b(targetSignal, newVal);
@@ -6327,8 +6327,8 @@ PRIMITIVES["resource"] = resource;
// If lambda takes 0 params, call without event arg (convenience for on-click handlers)
var wrapped = isLambda(handler)
? (lambdaParams(handler).length === 0
? function(e) { try { cekCall(handler, NIL); } catch(err) { console.error("[sx-ref] domListen handler error:", name, err); } }
: function(e) { try { cekCall(handler, [e]); } catch(err) { console.error("[sx-ref] domListen handler error:", name, err); } })
? function(e) { try { cekCall(handler, NIL); } catch(err) { console.error("[sx-ref] domListen handler error:", name, err); } finally { runPostRenderHooks(); } }
: function(e) { try { cekCall(handler, [e]); } catch(err) { console.error("[sx-ref] domListen handler error:", name, err); } finally { runPostRenderHooks(); } })
: handler;
if (name === "click") logInfo("domListen: click on <" + (el.tagName||"?").toLowerCase() + "> text=" + (el.textContent||"").substring(0,20) + " isLambda=" + isLambda(handler));
var passiveEvents = { touchstart: 1, touchmove: 1, wheel: 1, scroll: 1 };