@sentropic/h2a 0.85.25 → 0.87.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/dist/bin.js +51 -2
- package/dist/bin.js.map +1 -1
- package/dist/cli-command-map.d.ts +119 -0
- package/dist/cli-command-map.d.ts.map +1 -0
- package/dist/cli-command-map.js +396 -0
- package/dist/cli-command-map.js.map +1 -0
- package/dist/cli-contract.d.ts.map +1 -1
- package/dist/cli-contract.js +39 -1
- package/dist/cli-contract.js.map +1 -1
- package/dist/cli.d.ts +25 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +356 -7
- package/dist/cli.js.map +1 -1
- package/dist/identity.d.ts +37 -3
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -0
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/runtime/enrollment/ceremony.d.ts +542 -0
- package/dist/runtime/enrollment/ceremony.d.ts.map +1 -0
- package/dist/runtime/enrollment/ceremony.js +777 -0
- package/dist/runtime/enrollment/ceremony.js.map +1 -0
- package/dist/runtime/enrollment/index.d.ts +16 -0
- package/dist/runtime/enrollment/index.d.ts.map +1 -0
- package/dist/runtime/enrollment/index.js +16 -0
- package/dist/runtime/enrollment/index.js.map +1 -0
- package/dist/runtime/feed/descriptors.d.ts +261 -0
- package/dist/runtime/feed/descriptors.d.ts.map +1 -0
- package/dist/runtime/feed/descriptors.js +425 -0
- package/dist/runtime/feed/descriptors.js.map +1 -0
- package/dist/runtime/feed/index.d.ts +12 -0
- package/dist/runtime/feed/index.d.ts.map +1 -0
- package/dist/runtime/feed/index.js +12 -0
- package/dist/runtime/feed/index.js.map +1 -0
- package/dist/runtime/identity/index.d.ts +3 -3
- package/dist/runtime/identity/index.d.ts.map +1 -1
- package/dist/runtime/identity/index.js +2 -2
- package/dist/runtime/identity/index.js.map +1 -1
- package/dist/runtime/identity/live.d.ts +68 -0
- package/dist/runtime/identity/live.d.ts.map +1 -1
- package/dist/runtime/identity/live.js +78 -2
- package/dist/runtime/identity/live.js.map +1 -1
- package/dist/runtime/identity/readers.d.ts +89 -5
- package/dist/runtime/identity/readers.d.ts.map +1 -1
- package/dist/runtime/identity/readers.js +242 -33
- package/dist/runtime/identity/readers.js.map +1 -1
- package/dist/runtime/local-files/presence.d.ts +16 -1
- package/dist/runtime/local-files/presence.d.ts.map +1 -1
- package/dist/runtime/local-files/presence.js +32 -20
- package/dist/runtime/local-files/presence.js.map +1 -1
- package/dist/runtime/loop/index.d.ts +5 -0
- package/dist/runtime/loop/index.d.ts.map +1 -1
- package/dist/runtime/loop/index.js +48 -5
- package/dist/runtime/loop/index.js.map +1 -1
- package/dist/runtime/mcp/agent-launch.d.ts +15 -1
- package/dist/runtime/mcp/agent-launch.d.ts.map +1 -1
- package/dist/runtime/mcp/agent-launch.js +45 -4
- package/dist/runtime/mcp/agent-launch.js.map +1 -1
- package/dist/runtime/mcp/index.d.ts +1 -1
- package/dist/runtime/mcp/index.d.ts.map +1 -1
- package/dist/runtime/mcp/index.js +1 -1
- package/dist/runtime/mcp/index.js.map +1 -1
- package/dist/runtime/mcp/server.d.ts +3 -1
- package/dist/runtime/mcp/server.d.ts.map +1 -1
- package/dist/runtime/mcp/server.js +7 -2
- package/dist/runtime/mcp/server.js.map +1 -1
- package/dist/runtime/mcp/sessions.d.ts +19 -0
- package/dist/runtime/mcp/sessions.d.ts.map +1 -1
- package/dist/runtime/mcp/sessions.js +44 -2
- package/dist/runtime/mcp/sessions.js.map +1 -1
- package/dist/runtime/mcp/stdio.d.ts +8 -0
- package/dist/runtime/mcp/stdio.d.ts.map +1 -1
- package/dist/runtime/mcp/stdio.js +42 -0
- package/dist/runtime/mcp/stdio.js.map +1 -1
- package/dist/runtime/mcp-registry/broker.d.ts +175 -0
- package/dist/runtime/mcp-registry/broker.d.ts.map +1 -0
- package/dist/runtime/mcp-registry/broker.js +203 -0
- package/dist/runtime/mcp-registry/broker.js.map +1 -0
- package/dist/runtime/mcp-registry/broker.typecheck.d.ts +2 -0
- package/dist/runtime/mcp-registry/broker.typecheck.d.ts.map +1 -0
- package/dist/runtime/mcp-registry/broker.typecheck.js +48 -0
- package/dist/runtime/mcp-registry/broker.typecheck.js.map +1 -0
- package/dist/runtime/mirror/accept.d.ts +43 -5
- package/dist/runtime/mirror/accept.d.ts.map +1 -1
- package/dist/runtime/mirror/accept.js +55 -7
- package/dist/runtime/mirror/accept.js.map +1 -1
- package/dist/runtime/mirror/build.d.ts +23 -4
- package/dist/runtime/mirror/build.d.ts.map +1 -1
- package/dist/runtime/mirror/build.js +34 -4
- package/dist/runtime/mirror/build.js.map +1 -1
- package/dist/runtime/mirror/index.d.ts +3 -0
- package/dist/runtime/mirror/index.d.ts.map +1 -1
- package/dist/runtime/mirror/index.js +3 -0
- package/dist/runtime/mirror/index.js.map +1 -1
- package/dist/runtime/mirror/ingest.d.ts +109 -0
- package/dist/runtime/mirror/ingest.d.ts.map +1 -0
- package/dist/runtime/mirror/ingest.js +117 -0
- package/dist/runtime/mirror/ingest.js.map +1 -0
- package/dist/runtime/mirror/push-daemon.d.ts +376 -0
- package/dist/runtime/mirror/push-daemon.d.ts.map +1 -0
- package/dist/runtime/mirror/push-daemon.js +644 -0
- package/dist/runtime/mirror/push-daemon.js.map +1 -0
- package/dist/runtime/mirror/sanitize.d.ts +477 -0
- package/dist/runtime/mirror/sanitize.d.ts.map +1 -0
- package/dist/runtime/mirror/sanitize.js +625 -0
- package/dist/runtime/mirror/sanitize.js.map +1 -0
- package/dist/runtime/mirror/serve.d.ts.map +1 -1
- package/dist/runtime/mirror/serve.js +104 -24
- package/dist/runtime/mirror/serve.js.map +1 -1
- package/dist/runtime/reporting/report-ai.d.ts.map +1 -1
- package/dist/runtime/reporting/report-ai.js +1 -0
- package/dist/runtime/reporting/report-ai.js.map +1 -1
- package/dist/runtime/reporting/stdin.d.ts +2 -0
- package/dist/runtime/reporting/stdin.d.ts.map +1 -0
- package/dist/runtime/reporting/stdin.js +8 -0
- package/dist/runtime/reporting/stdin.js.map +1 -0
- package/dist/status-surface.d.ts +167 -0
- package/dist/status-surface.d.ts.map +1 -0
- package/dist/status-surface.js +670 -0
- package/dist/status-surface.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/vendor/harness/skills/manifest.d.ts.map +1 -1
- package/dist/vendor/harness/skills/manifest.js +2 -0
- package/dist/vendor/harness/skills/manifest.js.map +1 -1
- package/focus-app/client/_app/immutable/assets/{0.BdzHFb9q.css → 0.CgEVz9YW.css} +1 -1
- package/focus-app/client/_app/immutable/assets/0.CgEVz9YW.css.br +0 -0
- package/focus-app/client/_app/immutable/assets/0.CgEVz9YW.css.gz +0 -0
- package/focus-app/client/_app/immutable/assets/2.DaTmt6o7.css +1 -0
- package/focus-app/client/_app/immutable/assets/2.DaTmt6o7.css.br +0 -0
- package/focus-app/client/_app/immutable/assets/2.DaTmt6o7.css.gz +0 -0
- package/focus-app/client/_app/immutable/assets/3.vWQUAHjz.css +1 -0
- package/focus-app/client/_app/immutable/assets/3.vWQUAHjz.css.br +0 -0
- package/focus-app/client/_app/immutable/assets/3.vWQUAHjz.css.gz +0 -0
- package/focus-app/client/_app/immutable/assets/AppShell.CDPwj3zU.css +1 -0
- package/focus-app/client/_app/immutable/assets/AppShell.CDPwj3zU.css.br +0 -0
- package/focus-app/client/_app/immutable/assets/AppShell.CDPwj3zU.css.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/{Cj6wo28J.js → 1NK_OeRJ.js} +1 -1
- package/focus-app/client/_app/immutable/chunks/1NK_OeRJ.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/1NK_OeRJ.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/{Bs3f1UbD.js → B1veta3r.js} +2 -2
- package/focus-app/client/_app/immutable/chunks/B1veta3r.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/B1veta3r.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/{DEmooz0s.js → BZ4lcC0v.js} +1 -1
- package/focus-app/client/_app/immutable/chunks/BZ4lcC0v.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/BZ4lcC0v.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/Bu7F9NOv.js +2 -0
- package/focus-app/client/_app/immutable/chunks/Bu7F9NOv.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/Bu7F9NOv.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/C6KhNEX3.js +1 -0
- package/focus-app/client/_app/immutable/chunks/C6KhNEX3.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/C6KhNEX3.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/DIljKPJN.js +1 -0
- package/focus-app/client/_app/immutable/chunks/DIljKPJN.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/DIljKPJN.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/iXQate3J.js +2 -0
- package/focus-app/client/_app/immutable/chunks/iXQate3J.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/iXQate3J.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/{ZxFklh9T.js → kCE9wz0g.js} +1 -1
- package/focus-app/client/_app/immutable/chunks/kCE9wz0g.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/kCE9wz0g.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/x-hq5fDG.js +1 -0
- package/focus-app/client/_app/immutable/chunks/x-hq5fDG.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/x-hq5fDG.js.gz +0 -0
- package/focus-app/client/_app/immutable/entry/app.C1sDdCg5.js +2 -0
- package/focus-app/client/_app/immutable/entry/app.C1sDdCg5.js.br +0 -0
- package/focus-app/client/_app/immutable/entry/app.C1sDdCg5.js.gz +0 -0
- package/focus-app/client/_app/immutable/entry/start.X3j_A5RN.js +1 -0
- package/focus-app/client/_app/immutable/entry/start.X3j_A5RN.js.br +2 -0
- package/focus-app/client/_app/immutable/entry/start.X3j_A5RN.js.gz +0 -0
- package/focus-app/client/_app/immutable/nodes/0.gLl44WzG.js +5 -0
- package/focus-app/client/_app/immutable/nodes/0.gLl44WzG.js.br +0 -0
- package/focus-app/client/_app/immutable/nodes/0.gLl44WzG.js.gz +0 -0
- package/focus-app/client/_app/immutable/nodes/1.DUrghq2x.js +1 -0
- package/focus-app/client/_app/immutable/nodes/1.DUrghq2x.js.br +0 -0
- package/focus-app/client/_app/immutable/nodes/1.DUrghq2x.js.gz +0 -0
- package/focus-app/client/_app/immutable/nodes/2.Bp7JE7Pz.js +1 -0
- package/focus-app/client/_app/immutable/nodes/2.Bp7JE7Pz.js.br +0 -0
- package/focus-app/client/_app/immutable/nodes/2.Bp7JE7Pz.js.gz +0 -0
- package/focus-app/client/_app/immutable/nodes/3.Cml8enOG.js +12 -0
- package/focus-app/client/_app/immutable/nodes/3.Cml8enOG.js.br +0 -0
- package/focus-app/client/_app/immutable/nodes/3.Cml8enOG.js.gz +0 -0
- package/focus-app/client/_app/version.json +1 -1
- package/focus-app/client/_app/version.json.br +0 -0
- package/focus-app/client/_app/version.json.gz +0 -0
- package/focus-app/h2a-focus.json +108 -80
- package/focus-app/handler.js +7 -7
- package/focus-app/index.js +7 -7
- package/focus-app/server/chunks/chunks/AppShell.js-6Pi87dO0.js +1353 -0
- package/focus-app/server/chunks/chunks/AppShell.js-6Pi87dO0.js.map +1 -0
- package/focus-app/server/chunks/chunks/agent-memory-dossier.js-nmFG_rgx.js +1036 -0
- package/focus-app/server/chunks/chunks/agent-memory-dossier.js-nmFG_rgx.js.map +1 -0
- package/focus-app/server/chunks/chunks/{exports.js-DUTkELZq.js → exports.js-CdqPbjm1.js} +3 -3
- package/focus-app/server/chunks/chunks/{exports.js-DUTkELZq.js.map → exports.js-CdqPbjm1.js.map} +1 -1
- package/focus-app/server/chunks/chunks/h2a-bus.js-bLEJ_Adi.js +233 -0
- package/focus-app/server/chunks/chunks/h2a-bus.js-bLEJ_Adi.js.map +1 -0
- package/focus-app/server/chunks/chunks/{index.js-Di21TltP.js → index.js-laGHLarB.js} +5 -2
- package/focus-app/server/chunks/chunks/index.js-laGHLarB.js.map +1 -0
- package/focus-app/server/chunks/chunks/{internal.js-33vbd70h.js → internal.js-C6T8nHkl.js} +4 -4
- package/focus-app/server/chunks/chunks/{internal.js-33vbd70h.js.map → internal.js-C6T8nHkl.js.map} +1 -1
- package/focus-app/server/chunks/chunks/{root.js-DO1m-gJA.js → root.js-CtVQOgDw.js} +2 -2
- package/focus-app/server/chunks/chunks/{root.js-DO1m-gJA.js.map → root.js-CtVQOgDw.js.map} +1 -1
- package/focus-app/server/chunks/entries/endpoints/api/decisions/inject/{_server.ts.js-j0NNcOSZ.js → _server.ts.js-hrbMnsV0.js} +13 -42
- package/focus-app/server/chunks/entries/endpoints/api/decisions/inject/_server.ts.js-hrbMnsV0.js.map +1 -0
- package/focus-app/server/chunks/entries/endpoints/api/dossiers/agent-memory/include/_server.ts.js-Dw4odGdV.js +138 -0
- package/focus-app/server/chunks/entries/endpoints/api/dossiers/agent-memory/include/_server.ts.js-Dw4odGdV.js.map +1 -0
- package/focus-app/server/chunks/entries/endpoints/api/h2a/targets/_server.ts.js-BLjYv7vg.js +41 -0
- package/focus-app/server/chunks/entries/endpoints/api/h2a/targets/_server.ts.js-BLjYv7vg.js.map +1 -0
- package/focus-app/server/chunks/entries/fallbacks/{error.svelte.js-Dj3sETSX.js → error.svelte.js-RbeaNF5a.js} +4 -4
- package/focus-app/server/chunks/entries/fallbacks/{error.svelte.js-Dj3sETSX.js.map → error.svelte.js-RbeaNF5a.js.map} +1 -1
- package/focus-app/server/chunks/entries/pages/{_layout.svelte.js-BoLsbuC2.js → _layout.svelte.js-e1E_I04z.js} +2 -2
- package/focus-app/server/chunks/entries/pages/{_layout.svelte.js-BoLsbuC2.js.map → _layout.svelte.js-e1E_I04z.js.map} +1 -1
- package/focus-app/server/chunks/entries/pages/{_page.svelte.js-QDldMYhk.js → _page.svelte.js-DbaEG23x.js} +31 -1373
- package/focus-app/server/chunks/entries/pages/_page.svelte.js-DbaEG23x.js.map +1 -0
- package/focus-app/server/chunks/entries/pages/dossier/agent-memory/_page.server.ts.js-CFC-wn6U.js +88 -0
- package/focus-app/server/chunks/entries/pages/dossier/agent-memory/_page.server.ts.js-CFC-wn6U.js.map +1 -0
- package/focus-app/server/chunks/entries/pages/dossier/agent-memory/_page.svelte.js-BpR26NMa.js +1574 -0
- package/focus-app/server/chunks/entries/pages/dossier/agent-memory/_page.svelte.js-BpR26NMa.js.map +1 -0
- package/focus-app/server/chunks/{handler-Cp_5hLyY.js → handler-Be3dyNi0.js} +3 -3
- package/focus-app/server/chunks/{handler-Cp_5hLyY.js.map → handler-Be3dyNi0.js.map} +1 -1
- package/focus-app/server/chunks/{index.js-CBh7Wjqp.js → index.js-siUxMMnK.js} +3 -3
- package/focus-app/server/chunks/{index.js-CBh7Wjqp.js.map → index.js-siUxMMnK.js.map} +1 -1
- package/focus-app/server/chunks/manifest.js-CXJqSHHn.js +78 -0
- package/focus-app/server/chunks/manifest.js-CXJqSHHn.js.map +1 -0
- package/focus-app/server/chunks/nodes/0.js-leU6sfRR.js +9 -0
- package/focus-app/server/chunks/nodes/{0.js-4wlmdsk8.js.map → 0.js-leU6sfRR.js.map} +1 -1
- package/focus-app/server/chunks/nodes/1.js-os6QXm6B.js +9 -0
- package/focus-app/server/chunks/nodes/{1.js-B-LpY-lC.js.map → 1.js-os6QXm6B.js.map} +1 -1
- package/focus-app/server/chunks/nodes/2.js-DAaLjh93.js +19 -0
- package/focus-app/server/chunks/nodes/2.js-DAaLjh93.js.map +1 -0
- package/focus-app/server/chunks/nodes/3.js-Cmgi6Uy0.js +18 -0
- package/focus-app/server/chunks/nodes/3.js-Cmgi6Uy0.js.map +1 -0
- package/package.json +5 -5
- package/skills/h2a-run/SKILL.md +100 -0
- package/skills/harness/SKILL.md +3 -1
- package/skills/harness/review/SKILL.md +99 -8
- package/skills/harness/security/SKILL.md +55 -0
- package/skills/harness/track-report/SKILL.md +103 -0
- package/skills/harness/using-harness/SKILL.md +3 -1
- package/focus-app/client/_app/immutable/assets/0.BdzHFb9q.css.br +0 -2
- package/focus-app/client/_app/immutable/assets/0.BdzHFb9q.css.gz +0 -0
- package/focus-app/client/_app/immutable/assets/2.Ddxq02y4.css +0 -1
- package/focus-app/client/_app/immutable/assets/2.Ddxq02y4.css.br +0 -0
- package/focus-app/client/_app/immutable/assets/2.Ddxq02y4.css.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/Bs3f1UbD.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/Bs3f1UbD.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/Bv8OL8ib.js +0 -1
- package/focus-app/client/_app/immutable/chunks/Bv8OL8ib.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/Bv8OL8ib.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/CVq_IFFr.js +0 -2
- package/focus-app/client/_app/immutable/chunks/CVq_IFFr.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/CVq_IFFr.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/Cj6wo28J.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/Cj6wo28J.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/DEmooz0s.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/DEmooz0s.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/DQIRXgdC.js +0 -2
- package/focus-app/client/_app/immutable/chunks/DQIRXgdC.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/DQIRXgdC.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/ZxFklh9T.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/ZxFklh9T.js.gz +0 -0
- package/focus-app/client/_app/immutable/chunks/_wRuVGPs.js +0 -1
- package/focus-app/client/_app/immutable/chunks/_wRuVGPs.js.br +0 -0
- package/focus-app/client/_app/immutable/chunks/_wRuVGPs.js.gz +0 -0
- package/focus-app/client/_app/immutable/entry/app.6DKouWRt.js +0 -2
- package/focus-app/client/_app/immutable/entry/app.6DKouWRt.js.br +0 -0
- package/focus-app/client/_app/immutable/entry/app.6DKouWRt.js.gz +0 -0
- package/focus-app/client/_app/immutable/entry/start.DlLmkUb7.js +0 -1
- package/focus-app/client/_app/immutable/entry/start.DlLmkUb7.js.br +0 -2
- package/focus-app/client/_app/immutable/entry/start.DlLmkUb7.js.gz +0 -0
- package/focus-app/client/_app/immutable/nodes/0.CuSOF0Of.js +0 -5
- package/focus-app/client/_app/immutable/nodes/0.CuSOF0Of.js.br +0 -0
- package/focus-app/client/_app/immutable/nodes/0.CuSOF0Of.js.gz +0 -0
- package/focus-app/client/_app/immutable/nodes/1.D39jdnqm.js +0 -1
- package/focus-app/client/_app/immutable/nodes/1.D39jdnqm.js.br +0 -0
- package/focus-app/client/_app/immutable/nodes/1.D39jdnqm.js.gz +0 -0
- package/focus-app/client/_app/immutable/nodes/2.CnU8ifRl.js +0 -1
- package/focus-app/client/_app/immutable/nodes/2.CnU8ifRl.js.br +0 -0
- package/focus-app/client/_app/immutable/nodes/2.CnU8ifRl.js.gz +0 -0
- package/focus-app/server/chunks/chunks/index.js-Di21TltP.js.map +0 -1
- package/focus-app/server/chunks/entries/endpoints/api/decisions/inject/_server.ts.js-j0NNcOSZ.js.map +0 -1
- package/focus-app/server/chunks/entries/pages/_page.svelte.js-QDldMYhk.js.map +0 -1
- package/focus-app/server/chunks/manifest.js-Cm6cC7mC.js +0 -56
- package/focus-app/server/chunks/manifest.js-Cm6cC7mC.js.map +0 -1
- package/focus-app/server/chunks/nodes/0.js-4wlmdsk8.js +0 -9
- package/focus-app/server/chunks/nodes/1.js-B-LpY-lC.js +0 -9
- package/focus-app/server/chunks/nodes/2.js-F6jp5eD9.js +0 -19
- package/focus-app/server/chunks/nodes/2.js-F6jp5eD9.js.map +0 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal groundwork for a principal-scoped third-party MCP broker.
|
|
3
|
+
*
|
|
4
|
+
* This module deliberately has no stdio, HTTP, or public h2a MCP wiring. The
|
|
5
|
+
* future gateway owns authenticated ingress and turns its authenticated `sub`
|
|
6
|
+
* into an AuthenticatedPrincipal before it creates this broker.
|
|
7
|
+
*/
|
|
8
|
+
/** Construct server-side opaque values at trusted integration boundaries. */
|
|
9
|
+
export function authenticatedPrincipal(sub) {
|
|
10
|
+
return sub;
|
|
11
|
+
}
|
|
12
|
+
/** Construct a server-side vault handle; no credential value is accepted. */
|
|
13
|
+
export function secretRef(ref) {
|
|
14
|
+
return ref;
|
|
15
|
+
}
|
|
16
|
+
export function established(value, asOf = new Date().toISOString()) {
|
|
17
|
+
return { kind: "established", state: "success", value, asOf };
|
|
18
|
+
}
|
|
19
|
+
export function isEstablished(resolution) {
|
|
20
|
+
return resolution.kind === "established" && resolution.state === "success" && "value" in resolution;
|
|
21
|
+
}
|
|
22
|
+
function unavailableSource(source) {
|
|
23
|
+
if (source === "catalogue" ||
|
|
24
|
+
source === "binding" ||
|
|
25
|
+
source === "grant" ||
|
|
26
|
+
source === "credential" ||
|
|
27
|
+
source === "upstream" ||
|
|
28
|
+
source === "adapter") {
|
|
29
|
+
return source;
|
|
30
|
+
}
|
|
31
|
+
return "upstream";
|
|
32
|
+
}
|
|
33
|
+
function unavailableCode(code) {
|
|
34
|
+
if (code === "upstream_timeout" ||
|
|
35
|
+
code === "upstream_protocol_error" ||
|
|
36
|
+
code === "adapter_not_available") {
|
|
37
|
+
return code;
|
|
38
|
+
}
|
|
39
|
+
return "source_unavailable";
|
|
40
|
+
}
|
|
41
|
+
function unavailable(resolution) {
|
|
42
|
+
return {
|
|
43
|
+
kind: "unavailable",
|
|
44
|
+
source: unavailableSource(resolution.source),
|
|
45
|
+
code: unavailableCode(resolution.code),
|
|
46
|
+
retryable: resolution.retryable,
|
|
47
|
+
observedAt: resolution.observedAt
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function failed(source, observedAt, code = "source_unavailable", retryable = true) {
|
|
51
|
+
return {
|
|
52
|
+
kind: "unexpected_failure",
|
|
53
|
+
state: "failure",
|
|
54
|
+
source,
|
|
55
|
+
code,
|
|
56
|
+
retryable,
|
|
57
|
+
observedAt
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function hasAgentVisibleArguments(value) {
|
|
61
|
+
return (typeof value === "object" &&
|
|
62
|
+
value !== null &&
|
|
63
|
+
Object.keys(value).length === 1 &&
|
|
64
|
+
"query" in value &&
|
|
65
|
+
typeof value.query === "string");
|
|
66
|
+
}
|
|
67
|
+
function toAgentVisibleOutput(value) {
|
|
68
|
+
if (typeof value !== "object" ||
|
|
69
|
+
value === null ||
|
|
70
|
+
!("messages" in value) ||
|
|
71
|
+
!Array.isArray(value.messages)) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const messages = [];
|
|
75
|
+
for (const message of value.messages) {
|
|
76
|
+
if (typeof message !== "object" ||
|
|
77
|
+
message === null ||
|
|
78
|
+
typeof message.id !== "string" ||
|
|
79
|
+
typeof message.subject !== "string") {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
messages.push({
|
|
83
|
+
id: message.id,
|
|
84
|
+
subject: message.subject
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return { kind: "mail.search.result", messages };
|
|
88
|
+
}
|
|
89
|
+
function effectiveTools(catalogue, resolution) {
|
|
90
|
+
if (!isEstablished(resolution)) {
|
|
91
|
+
return resolution;
|
|
92
|
+
}
|
|
93
|
+
const servers = new Map(catalogue.map((server) => [server.id, server]));
|
|
94
|
+
const effective = [];
|
|
95
|
+
for (const grant of resolution.value) {
|
|
96
|
+
if (!grant.active)
|
|
97
|
+
continue;
|
|
98
|
+
const server = servers.get(grant.serverId);
|
|
99
|
+
if (!server)
|
|
100
|
+
continue;
|
|
101
|
+
const allowed = new Set(grant.mayUseToolNames);
|
|
102
|
+
for (const tool of server.tools) {
|
|
103
|
+
if (allowed.has(tool.name)) {
|
|
104
|
+
effective.push({ grant, tool });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return established(effective, resolution.asOf);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates one broker projection for one ingress-authenticated principal.
|
|
112
|
+
* The caller supplies the principal at construction time, not as agent data.
|
|
113
|
+
*/
|
|
114
|
+
export function createPrincipalScopedRegistryBroker(options) {
|
|
115
|
+
const now = options.now ?? (() => new Date().toISOString());
|
|
116
|
+
function audit(outcome, connectorRef, toolName, correlationId) {
|
|
117
|
+
options.audit?.({
|
|
118
|
+
principalRef: options.principal,
|
|
119
|
+
connectorRef,
|
|
120
|
+
toolName,
|
|
121
|
+
outcome,
|
|
122
|
+
correlationId,
|
|
123
|
+
observedAt: now()
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function resolveEffectiveTools() {
|
|
127
|
+
try {
|
|
128
|
+
return effectiveTools(options.catalogue, options.grantResolver.resolve(options.principal));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return failed("grant", now());
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
listTools() {
|
|
136
|
+
const resolved = resolveEffectiveTools();
|
|
137
|
+
if (!isEstablished(resolved)) {
|
|
138
|
+
const result = unavailable(resolved);
|
|
139
|
+
audit("unavailable", undefined, undefined, undefined);
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
const tools = resolved.value.map(({ tool }) => tool);
|
|
143
|
+
audit("listed", undefined, undefined, undefined);
|
|
144
|
+
return { kind: "established", tools, asOf: resolved.asOf };
|
|
145
|
+
},
|
|
146
|
+
callTool(input) {
|
|
147
|
+
if (!hasAgentVisibleArguments(input.arguments)) {
|
|
148
|
+
audit("invalid_arguments", undefined, input.name, input.correlationId);
|
|
149
|
+
return { kind: "invalid_arguments" };
|
|
150
|
+
}
|
|
151
|
+
const resolved = resolveEffectiveTools();
|
|
152
|
+
if (!isEstablished(resolved)) {
|
|
153
|
+
const result = unavailable(resolved);
|
|
154
|
+
audit("unavailable", undefined, input.name, input.correlationId);
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
const selected = resolved.value.find(({ tool }) => tool.name === input.name);
|
|
158
|
+
if (!selected) {
|
|
159
|
+
audit("not_authorized", undefined, input.name, input.correlationId);
|
|
160
|
+
return { kind: "not_authorized" };
|
|
161
|
+
}
|
|
162
|
+
const adapter = options.adapters[selected.grant.serverId];
|
|
163
|
+
if (!adapter) {
|
|
164
|
+
const result = {
|
|
165
|
+
kind: "unavailable",
|
|
166
|
+
source: "adapter",
|
|
167
|
+
code: "adapter_not_available",
|
|
168
|
+
retryable: false,
|
|
169
|
+
observedAt: now()
|
|
170
|
+
};
|
|
171
|
+
audit("unavailable", selected.grant.connectorRef, input.name, input.correlationId);
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
let upstream;
|
|
175
|
+
try {
|
|
176
|
+
upstream = adapter.invoke({
|
|
177
|
+
connectorRef: selected.grant.connectorRef,
|
|
178
|
+
secretRef: selected.grant.secretRef,
|
|
179
|
+
tool: selected.tool,
|
|
180
|
+
arguments: input.arguments,
|
|
181
|
+
correlationId: input.correlationId
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
upstream = failed("upstream", now());
|
|
186
|
+
}
|
|
187
|
+
if (!isEstablished(upstream)) {
|
|
188
|
+
const result = unavailable(upstream);
|
|
189
|
+
audit("unavailable", selected.grant.connectorRef, input.name, input.correlationId);
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
const output = toAgentVisibleOutput(upstream.value);
|
|
193
|
+
if (!output) {
|
|
194
|
+
const result = unavailable(failed("upstream", now(), "upstream_protocol_error", false));
|
|
195
|
+
audit("unavailable", selected.grant.connectorRef, input.name, input.correlationId);
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
audit("called", selected.grant.connectorRef, input.name, input.correlationId);
|
|
199
|
+
return { kind: "completed", output };
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/runtime/mcp-registry/broker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.typecheck.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp-registry/broker.typecheck.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const reviewedInput = {
|
|
2
|
+
type: "object",
|
|
3
|
+
properties: { query: { type: "string" } },
|
|
4
|
+
required: ["query"],
|
|
5
|
+
additionalProperties: false
|
|
6
|
+
};
|
|
7
|
+
const reviewedOutput = {
|
|
8
|
+
kind: "mail.search.result",
|
|
9
|
+
messages: [{ id: "message-1", subject: "Quarterly report" }]
|
|
10
|
+
};
|
|
11
|
+
void reviewedInput;
|
|
12
|
+
void reviewedOutput;
|
|
13
|
+
const rejectedCredentialSchema = {
|
|
14
|
+
type: "object",
|
|
15
|
+
properties: {
|
|
16
|
+
query: { type: "string" },
|
|
17
|
+
// @ts-expect-error The agent-visible input type cannot gain a credential field.
|
|
18
|
+
accessToken: { type: "string" }
|
|
19
|
+
},
|
|
20
|
+
required: ["query"],
|
|
21
|
+
additionalProperties: false
|
|
22
|
+
};
|
|
23
|
+
const rejectedCredentialOutput = {
|
|
24
|
+
kind: "mail.search.result",
|
|
25
|
+
messages: [],
|
|
26
|
+
// @ts-expect-error The agent-visible result type cannot gain a credential field.
|
|
27
|
+
accessToken: "never-a-credential"
|
|
28
|
+
};
|
|
29
|
+
void rejectedCredentialSchema;
|
|
30
|
+
void rejectedCredentialOutput;
|
|
31
|
+
const rejectedAdapterResult = {
|
|
32
|
+
messages: [],
|
|
33
|
+
// @ts-expect-error The adapter result type cannot carry a credential field.
|
|
34
|
+
accessToken: "never-a-credential"
|
|
35
|
+
};
|
|
36
|
+
void rejectedAdapterResult;
|
|
37
|
+
const rejectedDiagnostic = {
|
|
38
|
+
kind: "unavailable",
|
|
39
|
+
// @ts-expect-error Agent-visible failures use a closed source vocabulary.
|
|
40
|
+
source: "upstream response included fake-access-token",
|
|
41
|
+
// @ts-expect-error Agent-visible failures use a closed code vocabulary.
|
|
42
|
+
code: "fake-access-token",
|
|
43
|
+
retryable: true,
|
|
44
|
+
observedAt: "2026-07-26T12:00:00.000Z"
|
|
45
|
+
};
|
|
46
|
+
void rejectedDiagnostic;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=broker.typecheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.typecheck.js","sourceRoot":"","sources":["../../../src/runtime/mcp-registry/broker.typecheck.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAA4B;IAC7C,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IACzC,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,cAAc,GAA+B;IACjD,IAAI,EAAE,oBAAoB;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC7D,CAAC;AAEF,KAAK,aAAa,CAAC;AACnB,KAAK,cAAc,CAAC;AAEpB,MAAM,wBAAwB,GAA4B;IACxD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,gFAAgF;QAChF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAChC;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,wBAAwB,GAA+B;IAC3D,IAAI,EAAE,oBAAoB;IAC1B,QAAQ,EAAE,EAAE;IACZ,iFAAiF;IACjF,WAAW,EAAE,oBAAoB;CAClC,CAAC;AAEF,KAAK,wBAAwB,CAAC;AAC9B,KAAK,wBAAwB,CAAC;AAE9B,MAAM,qBAAqB,GAA6B;IACtD,QAAQ,EAAE,EAAE;IACZ,4EAA4E;IAC5E,WAAW,EAAE,oBAAoB;CAClC,CAAC;AAEF,KAAK,qBAAqB,CAAC;AAE3B,MAAM,kBAAkB,GAAwB;IAC9C,IAAI,EAAE,aAAa;IACnB,0EAA0E;IAC1E,MAAM,EAAE,8CAA8C;IACtD,wEAAwE;IACxE,IAAI,EAAE,mBAAmB;IACzB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,0BAA0B;CACvC,CAAC;AAEF,KAAK,kBAAkB,CAAC"}
|
|
@@ -12,13 +12,42 @@
|
|
|
12
12
|
* key — an agent can mirror ONLY its own identity (no namespace squatting).
|
|
13
13
|
*
|
|
14
14
|
* Never throws on rejection; only the caller-supplied `applyRegistration` may.
|
|
15
|
+
*
|
|
16
|
+
* ── INGEST BOUNDARY (2026-07-25) ───────────────────────────────────────────
|
|
17
|
+
*
|
|
18
|
+
* Verification says the bytes came from a key we trust. It says nothing about
|
|
19
|
+
* what is IN them, and a trusted sender running an older CLI sends raw records —
|
|
20
|
+
* `workspace.path`, `launchContext`, `pid`, `file://` endpoints. So every record
|
|
21
|
+
* is narrowed by `ingest.ts` (which reuses the SEND plans) before it reaches a
|
|
22
|
+
* caller's apply callback.
|
|
23
|
+
*
|
|
24
|
+
* That narrowing is made structural by the callback TYPES: they take
|
|
25
|
+
* `H2AMirrored*`, not the local record types, so no caller of this function can
|
|
26
|
+
* be handed an unnarrowed record even by writing its callback carelessly. Same
|
|
27
|
+
* instrument as `sanitizeActorForMirror` on the send side — the raw value is not
|
|
28
|
+
* in scope at the point it would be used, so "it cannot leak here" is a
|
|
29
|
+
* consequence of the signature rather than a claim in a comment.
|
|
30
|
+
*
|
|
31
|
+
* Ordering, since a signed payload forces it: narrowing is strictly AFTER
|
|
32
|
+
* signature verification (narrowing first would alter the signed bytes and every
|
|
33
|
+
* push would fail), and strictly after the `publicKeys` authorization filter, so
|
|
34
|
+
* it can never change an authorization outcome. See `ingest.ts` for the full
|
|
35
|
+
* argument and for what this consequently does NOT claim.
|
|
15
36
|
*/
|
|
16
|
-
import { type
|
|
37
|
+
import { type H2AReplayGuard } from "@sentropic/h2a";
|
|
38
|
+
import { type H2AMirroredRegistration, type H2AMirroredSession, type H2AMirroredSubagentBinding, type MirrorNarrowingReport } from "./ingest.js";
|
|
17
39
|
export type H2AMirrorRejection = "malformed" | "not-mirror" | "no-signature" | "unauthorized-key" | "bad-signature" | "invalid-timestamp" | "expired" | "future" | "replayed" | "stale-sequence" | "instance-key-mismatch";
|
|
18
40
|
export type H2AMirrorResult = {
|
|
19
41
|
ok: true;
|
|
20
42
|
applied: string[];
|
|
21
43
|
signer: string;
|
|
44
|
+
/**
|
|
45
|
+
* What the ingest boundary removed from this push. `records: 0` means the
|
|
46
|
+
* sender already sends narrowed records — i.e. it is running a CLI with the
|
|
47
|
+
* send boundary. Anything higher is an un-upgraded sender, and this is the
|
|
48
|
+
* signal that makes that visible instead of silent.
|
|
49
|
+
*/
|
|
50
|
+
narrowed: MirrorNarrowingReport;
|
|
22
51
|
} | {
|
|
23
52
|
ok: false;
|
|
24
53
|
reason: H2AMirrorRejection;
|
|
@@ -30,14 +59,21 @@ export interface AcceptMirrorOptions {
|
|
|
30
59
|
enrolledKeys: readonly string[];
|
|
31
60
|
/** Replay guard (DEC-074) — its freshness window also enforces timestamp checks. */
|
|
32
61
|
guard: H2AReplayGuard;
|
|
33
|
-
/**
|
|
34
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Apply an authorized registration to the local (remote-side) store.
|
|
64
|
+
*
|
|
65
|
+
* Receives the NARROWED row (`H2AMirroredRegistration`), never the raw one —
|
|
66
|
+
* see the ingest-boundary note in the module header. The type is the boundary.
|
|
67
|
+
*/
|
|
68
|
+
applyRegistration: (registration: H2AMirroredRegistration) => void;
|
|
35
69
|
/**
|
|
36
70
|
* P2: apply a presence session (the impl RE-STAMPS heartbeatAt with the remote
|
|
37
71
|
* clock so freshness derives from the beat). Only called for sessions whose
|
|
38
72
|
* instance is owned by the verified key. Omit to ignore presence (P1 behavior).
|
|
73
|
+
*
|
|
74
|
+
* Receives the NARROWED record (`H2AMirroredSession`), never the raw one.
|
|
39
75
|
*/
|
|
40
|
-
applyPresence?: (session:
|
|
76
|
+
applyPresence?: (session: H2AMirroredSession) => void;
|
|
41
77
|
/**
|
|
42
78
|
* P2 fencing: return true iff `seq` is strictly newer than the last applied
|
|
43
79
|
* for `signerInstance` (and record it). Return false to reject a stale/replayed
|
|
@@ -48,8 +84,10 @@ export interface AcceptMirrorOptions {
|
|
|
48
84
|
* P3: apply a subagent binding (the impl is idempotent — a known binding is a
|
|
49
85
|
* no-op). Only called for bindings whose `parentInstance` is owned by the
|
|
50
86
|
* verified key. Omit to ignore subagents (P1/P2 behavior).
|
|
87
|
+
*
|
|
88
|
+
* Receives the NARROWED binding (`H2AMirroredSubagentBinding`).
|
|
51
89
|
*/
|
|
52
|
-
applySubagent?: (binding:
|
|
90
|
+
applySubagent?: (binding: H2AMirroredSubagentBinding) => void;
|
|
53
91
|
/** Reference time (ms epoch) for the guard. Defaults to `Date.now()`. */
|
|
54
92
|
now?: number;
|
|
55
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../../src/runtime/mirror/accept.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../../src/runtime/mirror/accept.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAKL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,YAAY,GACZ,cAAc,GACd,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,gBAAgB,GAChB,uBAAuB,CAAC;AAE5B,MAAM,MAAM,eAAe,GACvB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,QAAQ,EAAE,qBAAqB,CAAC;CACjC,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,oGAAoG;IACpG,iBAAiB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACxD,oGAAoG;IACpG,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,oFAAoF;IACpF,KAAK,EAAE,cAAc,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,YAAY,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACnE;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtD;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACjE;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC9D,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,eAAe,CAiFpG"}
|
|
@@ -12,9 +12,31 @@
|
|
|
12
12
|
* key — an agent can mirror ONLY its own identity (no namespace squatting).
|
|
13
13
|
*
|
|
14
14
|
* Never throws on rejection; only the caller-supplied `applyRegistration` may.
|
|
15
|
+
*
|
|
16
|
+
* ── INGEST BOUNDARY (2026-07-25) ───────────────────────────────────────────
|
|
17
|
+
*
|
|
18
|
+
* Verification says the bytes came from a key we trust. It says nothing about
|
|
19
|
+
* what is IN them, and a trusted sender running an older CLI sends raw records —
|
|
20
|
+
* `workspace.path`, `launchContext`, `pid`, `file://` endpoints. So every record
|
|
21
|
+
* is narrowed by `ingest.ts` (which reuses the SEND plans) before it reaches a
|
|
22
|
+
* caller's apply callback.
|
|
23
|
+
*
|
|
24
|
+
* That narrowing is made structural by the callback TYPES: they take
|
|
25
|
+
* `H2AMirrored*`, not the local record types, so no caller of this function can
|
|
26
|
+
* be handed an unnarrowed record even by writing its callback carelessly. Same
|
|
27
|
+
* instrument as `sanitizeActorForMirror` on the send side — the raw value is not
|
|
28
|
+
* in scope at the point it would be used, so "it cannot leak here" is a
|
|
29
|
+
* consequence of the signature rather than a claim in a comment.
|
|
30
|
+
*
|
|
31
|
+
* Ordering, since a signed payload forces it: narrowing is strictly AFTER
|
|
32
|
+
* signature verification (narrowing first would alter the signed bytes and every
|
|
33
|
+
* push would fail), and strictly after the `publicKeys` authorization filter, so
|
|
34
|
+
* it can never change an authorization outcome. See `ingest.ts` for the full
|
|
35
|
+
* argument and for what this consequently does NOT claim.
|
|
15
36
|
*/
|
|
16
37
|
import { isH2AEnvelope, verifyEnvelopeSignature } from "@sentropic/h2a";
|
|
17
38
|
import { H2A_MIRROR_BODY_KIND } from "./build.js";
|
|
39
|
+
import { createNarrowingTally, narrowIngestedPresence, narrowIngestedRegistration, narrowIngestedSubagent } from "./ingest.js";
|
|
18
40
|
export function acceptMirrorEnvelope(payload, options) {
|
|
19
41
|
if (!isH2AEnvelope(payload))
|
|
20
42
|
return { ok: false, reason: "malformed" };
|
|
@@ -48,23 +70,49 @@ export function acceptMirrorEnvelope(payload, options) {
|
|
|
48
70
|
if (!options.fenceSequence(signer, body.seq))
|
|
49
71
|
return { ok: false, reason: "stale-sequence" };
|
|
50
72
|
}
|
|
51
|
-
|
|
73
|
+
// ── INGEST BOUNDARY ───────────────────────────────────────────────────────
|
|
74
|
+
// Everything below narrows before it applies. The tally observes what the
|
|
75
|
+
// plans removed, so an un-upgraded sender is a number on the response instead
|
|
76
|
+
// of a silent repair. Narrowing starts only HERE: every authorization decision
|
|
77
|
+
// above (key ownership, replay, fencing) has already been taken on the record
|
|
78
|
+
// as the sender signed it, so no narrowing step can have influenced one.
|
|
79
|
+
const tally = createNarrowingTally();
|
|
80
|
+
const narrowedRegistrations = authorized.map((reg) => {
|
|
81
|
+
const narrowed = narrowIngestedRegistration(reg);
|
|
82
|
+
tally.note(reg, narrowed);
|
|
83
|
+
return narrowed;
|
|
84
|
+
});
|
|
85
|
+
for (const reg of narrowedRegistrations)
|
|
52
86
|
options.applyRegistration(reg);
|
|
53
|
-
|
|
87
|
+
// Ownership derives from the NARROWED rows: `id`/`instance` are transmitted by
|
|
88
|
+
// the registration plan, so this is the same set either way — taken from the
|
|
89
|
+
// narrowed rows so the raw list is not read again after this point.
|
|
90
|
+
const owned = new Set(narrowedRegistrations.map((r) => r.instance ?? r.id));
|
|
54
91
|
// P2 presence — only sessions whose instance the verified key owns.
|
|
55
92
|
if (options.applyPresence && Array.isArray(body.presence)) {
|
|
56
93
|
for (const session of body.presence) {
|
|
57
|
-
if (owned.has(session.instance))
|
|
58
|
-
|
|
94
|
+
if (!owned.has(session.instance))
|
|
95
|
+
continue;
|
|
96
|
+
const narrowed = narrowIngestedPresence(session);
|
|
97
|
+
tally.note(session, narrowed);
|
|
98
|
+
options.applyPresence(narrowed);
|
|
59
99
|
}
|
|
60
100
|
}
|
|
61
101
|
// P3 subagents — only bindings whose parent the verified key owns.
|
|
62
102
|
if (options.applySubagent && Array.isArray(body.subagents)) {
|
|
63
103
|
for (const binding of body.subagents) {
|
|
64
|
-
if (owned.has(binding.parentInstance))
|
|
65
|
-
|
|
104
|
+
if (!owned.has(binding.parentInstance))
|
|
105
|
+
continue;
|
|
106
|
+
const narrowed = narrowIngestedSubagent(binding);
|
|
107
|
+
tally.note(binding, narrowed);
|
|
108
|
+
options.applySubagent(narrowed);
|
|
66
109
|
}
|
|
67
110
|
}
|
|
68
|
-
return {
|
|
111
|
+
return {
|
|
112
|
+
ok: true,
|
|
113
|
+
applied: narrowedRegistrations.map((r) => r.instance ?? r.id),
|
|
114
|
+
signer,
|
|
115
|
+
narrowed: tally.report()
|
|
116
|
+
};
|
|
69
117
|
}
|
|
70
118
|
//# sourceMappingURL=accept.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/runtime/mirror/accept.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/runtime/mirror/accept.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,EACL,aAAa,EACb,uBAAuB,EAIxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAA8B,MAAM,YAAY,CAAC;AAC9E,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EAKvB,MAAM,aAAa,CAAC;AAsErB,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,OAA4B;IACjF,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvE,MAAM,QAAQ,GAAG,OAA6C,CAAC;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IACvC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC9E,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrG,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAEhE,8EAA8E;IAC9E,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAC1C,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC/E,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAEnF,MAAM,MAAM,GAAmB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAA4B,EAAE,CAAC;IAElF,+EAA+E;IAC/E,4EAA4E;IAC5E,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC/F,CAAC;IAED,6EAA6E;IAC7E,0EAA0E;IAC1E,8EAA8E;IAC9E,+EAA+E;IAC/E,8EAA8E;IAC9E,yEAAyE;IACzE,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IAErC,MAAM,qBAAqB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACnD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1B,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,GAAG,IAAI,qBAAqB;QAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAExE,+EAA+E;IAC/E,6EAA6E;IAC7E,oEAAoE;IACpE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5E,oEAAoE;IACpE,IAAI,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC3C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC9B,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,IAAI,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;gBAAE,SAAS;YACjD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC9B,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -7,20 +7,39 @@
|
|
|
7
7
|
* same envelope with more event kinds. The private key never leaves the agent;
|
|
8
8
|
* `buildInstanceMirror` returns an UNSIGNED envelope — the caller signs it with
|
|
9
9
|
* `signEnvelope` (DEC-116: possession of the key is the sole authority anchor).
|
|
10
|
+
*
|
|
11
|
+
* SEND BOUNDARY: nothing local reaches the body verbatim. Every member goes
|
|
12
|
+
* through `sanitize.ts`, which ALLOWLISTS the fields that may leave the machine
|
|
13
|
+
* — so `launchContext.cwd`, the command line, the tmux coordinates, the pid,
|
|
14
|
+
* `workspace.path` and `file://` endpoint uris do not travel. This happens
|
|
15
|
+
* BEFORE signing, so the signature still covers exactly what is transmitted.
|
|
16
|
+
*
|
|
17
|
+
* The ENVELOPE is inside that boundary too, which it was not at first. `actor`
|
|
18
|
+
* is built from the SANITIZED registration by `sanitizeActorForMirror`, not from
|
|
19
|
+
* the raw registry row — see the note in `sanitize.ts`. The other envelope
|
|
20
|
+
* fields really are constants, the instance id, or the injected clock.
|
|
10
21
|
*/
|
|
11
|
-
import { type
|
|
22
|
+
import { type H2AEnvelope } from "@sentropic/h2a";
|
|
12
23
|
import { type LocalStore } from "../local-files/index.js";
|
|
24
|
+
import { type H2AMirroredRegistration, type H2AMirroredSession, type H2AMirroredSubagentBinding } from "./sanitize.js";
|
|
13
25
|
export declare const H2A_MIRROR_BODY_KIND: "mirror.instances";
|
|
26
|
+
/**
|
|
27
|
+
* The mirror payload. Every member is a `H2AMirrored*` type, NOT the local
|
|
28
|
+
* record type: the send boundary narrows what leaves the machine, and the wire
|
|
29
|
+
* types are what make that structural rather than a review-time hope. See
|
|
30
|
+
* `sanitize.ts` for the field plans and for why an allowlist (not a scrub) is
|
|
31
|
+
* the only version of this that stays correct as the local types grow.
|
|
32
|
+
*/
|
|
14
33
|
export interface H2AInstanceMirrorBody {
|
|
15
34
|
readonly kind: typeof H2A_MIRROR_BODY_KIND;
|
|
16
35
|
/** Append-only registration events. P1: the sender's own registration only. */
|
|
17
|
-
readonly registrations:
|
|
36
|
+
readonly registrations: H2AMirroredRegistration[];
|
|
18
37
|
/**
|
|
19
38
|
* P2: the sender's live sessions. The remote RE-STAMPS `heartbeatAt` with its
|
|
20
39
|
* own clock on arrival (freshness is derived from the mirror beat, not the
|
|
21
40
|
* local clock — no ghost/skew/resurrection). Omitted in P1-only callers.
|
|
22
41
|
*/
|
|
23
|
-
readonly presence?:
|
|
42
|
+
readonly presence?: H2AMirroredSession[];
|
|
24
43
|
/**
|
|
25
44
|
* P2: monotonic per-instance sequence (the CLI uses epoch ms — increases
|
|
26
45
|
* across restarts). The remote rejects a mirror with `seq <= last applied`
|
|
@@ -32,7 +51,7 @@ export interface H2AInstanceMirrorBody {
|
|
|
32
51
|
* remote (idempotent — re-mirroring a known binding is a no-op). Only bindings
|
|
33
52
|
* whose `parentInstance` the verified key owns are applied. Omitted in P1/P2.
|
|
34
53
|
*/
|
|
35
|
-
readonly subagents?:
|
|
54
|
+
readonly subagents?: H2AMirroredSubagentBinding[];
|
|
36
55
|
}
|
|
37
56
|
/**
|
|
38
57
|
* Build the unsigned mirror envelope for `instance` from the local store.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/runtime/mirror/build.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/runtime/mirror/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAKL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAChC,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,oBAAoB,EAAG,kBAA2B,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,oBAAoB,CAAC;IAC3C,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,uBAAuB,EAAE,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,0BAA0B,EAAE,CAAC;CACnD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,WAAW,CAAC,qBAAqB,CAAC,CAiCpC"}
|
|
@@ -7,9 +7,21 @@
|
|
|
7
7
|
* same envelope with more event kinds. The private key never leaves the agent;
|
|
8
8
|
* `buildInstanceMirror` returns an UNSIGNED envelope — the caller signs it with
|
|
9
9
|
* `signEnvelope` (DEC-116: possession of the key is the sole authority anchor).
|
|
10
|
+
*
|
|
11
|
+
* SEND BOUNDARY: nothing local reaches the body verbatim. Every member goes
|
|
12
|
+
* through `sanitize.ts`, which ALLOWLISTS the fields that may leave the machine
|
|
13
|
+
* — so `launchContext.cwd`, the command line, the tmux coordinates, the pid,
|
|
14
|
+
* `workspace.path` and `file://` endpoint uris do not travel. This happens
|
|
15
|
+
* BEFORE signing, so the signature still covers exactly what is transmitted.
|
|
16
|
+
*
|
|
17
|
+
* The ENVELOPE is inside that boundary too, which it was not at first. `actor`
|
|
18
|
+
* is built from the SANITIZED registration by `sanitizeActorForMirror`, not from
|
|
19
|
+
* the raw registry row — see the note in `sanitize.ts`. The other envelope
|
|
20
|
+
* fields really are constants, the instance id, or the injected clock.
|
|
10
21
|
*/
|
|
11
22
|
import { H2A_PROTOCOL, H2A_VERSION } from "@sentropic/h2a";
|
|
12
23
|
import { listPresence } from "../local-files/index.js";
|
|
24
|
+
import { sanitizeActorForMirror, sanitizePresenceForMirror, sanitizeRegistrationForMirror, sanitizeSubagentForMirror } from "./sanitize.js";
|
|
13
25
|
export const H2A_MIRROR_BODY_KIND = "mirror.instances";
|
|
14
26
|
/**
|
|
15
27
|
* Build the unsigned mirror envelope for `instance` from the local store.
|
|
@@ -21,16 +33,34 @@ export function buildInstanceMirror(store, instance, nowMs) {
|
|
|
21
33
|
const reg = store.findInstance(instance);
|
|
22
34
|
if (!reg)
|
|
23
35
|
throw new Error(`mirror: unknown local instance ${instance}`);
|
|
24
|
-
|
|
25
|
-
|
|
36
|
+
// Sanitize EVERY member at the send boundary. `sanitize*ForMirror` iterates a
|
|
37
|
+
// field plan, so a field added to the local record later cannot travel until
|
|
38
|
+
// it is explicitly classified (an omission fails the build, not a review).
|
|
39
|
+
const presence = listPresence(store.paths.root, { now: nowMs })
|
|
40
|
+
.filter((s) => s.instance === instance)
|
|
41
|
+
.map(sanitizePresenceForMirror);
|
|
42
|
+
const subagents = store.listSubagentsOf(instance).map(sanitizeSubagentForMirror);
|
|
43
|
+
// Sanitize ONCE and reuse, so the envelope's `actor` is derived from the same
|
|
44
|
+
// narrowed record the body carries. The actor used to be assembled from `reg`
|
|
45
|
+
// directly (`role: reg.roles?.[0]`), which put a source record's field on the
|
|
46
|
+
// wire outside every field plan — the envelope was the one place with no plan
|
|
47
|
+
// and no ratchet. `sanitizeActorForMirror` takes the MIRRORED registration, so
|
|
48
|
+
// the raw record is not reachable from it at all.
|
|
49
|
+
const mirroredReg = sanitizeRegistrationForMirror(reg);
|
|
26
50
|
return {
|
|
27
51
|
protocol: H2A_PROTOCOL,
|
|
28
52
|
version: H2A_VERSION,
|
|
29
53
|
id: `mirror:${instance}:${nowMs}`,
|
|
30
54
|
type: "event",
|
|
31
|
-
actor:
|
|
55
|
+
actor: sanitizeActorForMirror(instance, mirroredReg),
|
|
32
56
|
target: { instance },
|
|
33
|
-
body: {
|
|
57
|
+
body: {
|
|
58
|
+
kind: H2A_MIRROR_BODY_KIND,
|
|
59
|
+
registrations: [mirroredReg],
|
|
60
|
+
presence,
|
|
61
|
+
seq: nowMs,
|
|
62
|
+
subagents
|
|
63
|
+
},
|
|
34
64
|
createdAt: new Date(nowMs).toISOString()
|
|
35
65
|
};
|
|
36
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/runtime/mirror/build.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/runtime/mirror/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAoB,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAmB,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,EAC7B,yBAAyB,EAI1B,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAA2B,CAAC;AAiChE;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,QAAgB,EAChB,KAAa;IAEb,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;IACxE,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC5D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;SACtC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACjF,8EAA8E;IAC9E,8EAA8E;IAC9E,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,kDAAkD;IAClD,MAAM,WAAW,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACvD,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,WAAW;QACpB,EAAE,EAAE,UAAU,QAAQ,IAAI,KAAK,EAAE;QACjC,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC;QACpD,MAAM,EAAE,EAAE,QAAQ,EAAE;QACpB,IAAI,EAAE;YACJ,IAAI,EAAE,oBAAoB;YAC1B,aAAa,EAAE,CAAC,WAAW,CAAC;YAC5B,QAAQ;YACR,GAAG,EAAE,KAAK;YACV,SAAS;SACV;QACD,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
* P1: instances only. Core stays dep-free; this lives in @sentropic/h2a.
|
|
5
5
|
*/
|
|
6
6
|
export { buildInstanceMirror, H2A_MIRROR_BODY_KIND, type H2AInstanceMirrorBody } from "./build.js";
|
|
7
|
+
export { MIRROR_ENDPOINT_PLAN, MIRROR_INTERESTS_PLAN, MIRROR_PRESENCE_PLAN, MIRROR_REGISTRATION_PLAN, MIRROR_SUBAGENT_PLAN, MIRROR_TEST_HOOKS, MIRROR_VERSION_PLAN, MIRROR_WORKSPACE_PLAN, sanitizeActorForMirror, sanitizePresenceForMirror, sanitizeRegistrationForMirror, sanitizeSubagentForMirror, sanitizeWorkspaceRefForMirror, unclassifiedMirrorFields, type H2AMirroredEndpoint, type H2AMirroredRegistration, type H2AMirroredSession, type H2AMirroredSessionInterests, type H2AMirroredSubagentBinding, type H2AMirroredWorkspaceRef, type MirrorFieldPlan, type MirrorWithholdReason } from "./sanitize.js";
|
|
7
8
|
export { acceptMirrorEnvelope, type AcceptMirrorOptions, type H2AMirrorRejection, type H2AMirrorResult } from "./accept.js";
|
|
9
|
+
export { INGEST_NARROWERS, createNarrowingTally, droppedKeyPaths, narrowIngestedPresence, narrowIngestedRegistration, narrowIngestedSubagent, type MirrorBodyRecordMember, type MirrorNarrowingReport } from "./ingest.js";
|
|
8
10
|
export { mirrorServerForStore, mirrorRejectionStatus, type MirrorServerForStoreOptions } from "./serve.js";
|
|
11
|
+
export { createMirrorPushRunner, isPushableHttpUrl, mirrorPushGloballyDisabled, redactEndpoint, runMirrorPushDaemon, sanitizeForLog, DEFAULT_MIRROR_AUTH_FAILURE_LIMIT, DEFAULT_MIRROR_BUILD_FAILURE_LIMIT, DEFAULT_MIRROR_PUSH_INTERVAL_MS, DEFAULT_MIRROR_REJECT_LIMIT, MIN_MIRROR_PUSH_INTERVAL_MS, MIRROR_PUSH_BACKOFF_BASE_MS, MIRROR_PUSH_BACKOFF_MAX_MS, MIRROR_PUSH_BUILD_FAILED_MESSAGE, MIRROR_PUSH_INVALID_URL_MESSAGE, MIRROR_PUSH_JITTER_FRACTION, MIRROR_PUSH_OFF_ENV, MIRROR_PUSH_REENROLLMENT_MESSAGE, MIRROR_PUSH_REJECTED_MESSAGE, type MirrorEnvelopeBuilder, type MirrorEnvelopeSender, type MirrorPushCycleLog, type MirrorPushCycleResult, type MirrorPushDaemonOptions, type MirrorPushDaemonSummary, type MirrorPushOutcome, type MirrorPushPayloadShape, type MirrorPushRunnerOptions, type MirrorPushStopReason } from "./push-daemon.js";
|
|
9
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/mirror/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,2BAA2B,EACjC,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/mirror/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,EAC7B,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,2BAA2B,EACjC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,+BAA+B,EAC/B,2BAA2B,EAC3B,mBAAmB,EACnB,gCAAgC,EAChC,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC"}
|