stitchkit 0.93.0 → 0.94.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/CHANGELOG.md +134 -0
- package/README.md +5 -2
- package/dist/agent-runtime/children-control.d.ts +6 -0
- package/dist/agent-runtime/children-control.d.ts.map +1 -0
- package/dist/agent-runtime/children-spawn.d.ts +6 -0
- package/dist/agent-runtime/children-spawn.d.ts.map +1 -0
- package/dist/agent-runtime/children-state.d.ts +46 -0
- package/dist/agent-runtime/children-state.d.ts.map +1 -0
- package/dist/agent-runtime/children-usage.d.ts +8 -0
- package/dist/agent-runtime/children-usage.d.ts.map +1 -0
- package/dist/agent-runtime/children.d.ts +11 -14
- package/dist/agent-runtime/children.d.ts.map +1 -1
- package/dist/agent-runtime/coding-tool-contract.d.ts +2 -1
- package/dist/agent-runtime/coding-tool-contract.d.ts.map +1 -1
- package/dist/agent-runtime/deferred-tool-types.d.ts +2 -2
- package/dist/agent-runtime/deferred-tool-types.d.ts.map +1 -1
- package/dist/agent-runtime/events.d.ts +1 -1
- package/dist/agent-runtime/events.d.ts.map +1 -1
- package/dist/agent-runtime/managed-tools.d.ts +1 -1
- package/dist/agent-runtime/managed-tools.d.ts.map +1 -1
- package/dist/agent-runtime/observability.d.ts +1 -1
- package/dist/agent-runtime/observability.d.ts.map +1 -1
- package/dist/{agent-runtime-openrouter.d.ts → agent-runtime/openrouter.d.ts} +3 -3
- package/dist/agent-runtime/openrouter.d.ts.map +1 -0
- package/dist/agent-runtime/projections.d.ts +1 -1
- package/dist/agent-runtime/projections.d.ts.map +1 -1
- package/dist/agent-runtime/run-acquisition.d.ts +17 -0
- package/dist/agent-runtime/run-acquisition.d.ts.map +1 -0
- package/dist/agent-runtime/run-execution-state.d.ts +133 -0
- package/dist/agent-runtime/run-execution-state.d.ts.map +1 -0
- package/dist/agent-runtime/run-execution.d.ts +17 -33
- package/dist/agent-runtime/run-execution.d.ts.map +1 -1
- package/dist/agent-runtime/run-failure.d.ts +18 -0
- package/dist/agent-runtime/run-failure.d.ts.map +1 -0
- package/dist/agent-runtime/run-model-attempts.d.ts +6 -0
- package/dist/agent-runtime/run-model-attempts.d.ts.map +1 -0
- package/dist/agent-runtime/run-prompt-history.d.ts +58 -0
- package/dist/agent-runtime/run-prompt-history.d.ts.map +1 -0
- package/dist/agent-runtime/run-provider-ledger.d.ts +26 -0
- package/dist/agent-runtime/run-provider-ledger.d.ts.map +1 -0
- package/dist/agent-runtime/run-stream-parts.d.ts +17 -0
- package/dist/agent-runtime/run-stream-parts.d.ts.map +1 -0
- package/dist/agent-runtime/run-terminal.d.ts +11 -0
- package/dist/agent-runtime/run-terminal.d.ts.map +1 -0
- package/dist/agent-runtime/run-turn-preparation.d.ts +22 -0
- package/dist/agent-runtime/run-turn-preparation.d.ts.map +1 -0
- package/dist/agent-runtime/runtime-admission-gate.d.ts +29 -0
- package/dist/agent-runtime/runtime-admission-gate.d.ts.map +1 -0
- package/dist/agent-runtime/runtime-control.d.ts +9 -0
- package/dist/agent-runtime/runtime-control.d.ts.map +1 -0
- package/dist/agent-runtime/runtime-recovery.d.ts +10 -0
- package/dist/agent-runtime/runtime-recovery.d.ts.map +1 -0
- package/dist/agent-runtime/runtime-state.d.ts +36 -0
- package/dist/agent-runtime/runtime-state.d.ts.map +1 -0
- package/dist/agent-runtime/runtime-submit.d.ts +5 -0
- package/dist/agent-runtime/runtime-submit.d.ts.map +1 -0
- package/dist/agent-runtime/runtime.d.ts +9 -4
- package/dist/agent-runtime/runtime.d.ts.map +1 -1
- package/dist/{agent-runtime-sqlite-bun.d.ts → agent-runtime/sqlite-bun.d.ts} +5 -4
- package/dist/agent-runtime/sqlite-bun.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite-events.d.ts +5 -0
- package/dist/agent-runtime/sqlite-events.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite-history.d.ts +7 -0
- package/dist/agent-runtime/sqlite-history.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite-ledger.d.ts +7 -0
- package/dist/agent-runtime/sqlite-ledger.d.ts.map +1 -0
- package/dist/{agent-runtime-sqlite-node.d.ts → agent-runtime/sqlite-node.d.ts} +5 -4
- package/dist/agent-runtime/sqlite-node.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite-reads.d.ts +14 -0
- package/dist/agent-runtime/sqlite-reads.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite-rows.d.ts +178 -0
- package/dist/agent-runtime/sqlite-rows.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite-schema.d.ts +7 -0
- package/dist/agent-runtime/sqlite-schema.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite-transactions.d.ts +25 -0
- package/dist/agent-runtime/sqlite-transactions.d.ts.map +1 -0
- package/dist/agent-runtime/sqlite.d.ts +10 -6
- package/dist/agent-runtime/sqlite.d.ts.map +1 -1
- package/dist/agent-runtime/store-archive.d.ts +16 -0
- package/dist/agent-runtime/store-archive.d.ts.map +1 -0
- package/dist/{testing/agent-store-conformance.d.ts → agent-runtime/store-conformance.d.ts} +2 -2
- package/dist/agent-runtime/store-conformance.d.ts.map +1 -0
- package/dist/agent-runtime/store-create.d.ts +11 -0
- package/dist/agent-runtime/store-create.d.ts.map +1 -0
- package/dist/agent-runtime/{store-driver.d.ts → store-driver-contract.d.ts} +7 -7
- package/dist/agent-runtime/store-driver-contract.d.ts.map +1 -0
- package/dist/agent-runtime/store-events.d.ts +7 -89
- package/dist/agent-runtime/store-events.d.ts.map +1 -1
- package/dist/agent-runtime/store-memory.d.ts +4 -0
- package/dist/agent-runtime/store-memory.d.ts.map +1 -0
- package/dist/agent-runtime/store-mutate.d.ts +13 -0
- package/dist/agent-runtime/store-mutate.d.ts.map +1 -0
- package/dist/agent-runtime/store-purge.d.ts +1 -1
- package/dist/agent-runtime/store-purge.d.ts.map +1 -1
- package/dist/agent-runtime/store-reads.d.ts +29 -0
- package/dist/agent-runtime/store-reads.d.ts.map +1 -0
- package/dist/agent-runtime/store-reduce-history.d.ts +10 -0
- package/dist/agent-runtime/store-reduce-history.d.ts.map +1 -0
- package/dist/agent-runtime/store-reduce-run.d.ts +14 -0
- package/dist/agent-runtime/store-reduce-run.d.ts.map +1 -0
- package/dist/agent-runtime/store-reduce-shared.d.ts +76 -0
- package/dist/agent-runtime/store-reduce-shared.d.ts.map +1 -0
- package/dist/agent-runtime/store-reduce-terminal.d.ts +6 -0
- package/dist/agent-runtime/store-reduce-terminal.d.ts.map +1 -0
- package/dist/agent-runtime/store-reducer.d.ts +24 -0
- package/dist/agent-runtime/store-reducer.d.ts.map +1 -0
- package/dist/agent-runtime/store-snapshot.d.ts +19 -0
- package/dist/agent-runtime/store-snapshot.d.ts.map +1 -0
- package/dist/agent-runtime/store.d.ts +1 -1
- package/dist/agent-runtime/store.d.ts.map +1 -1
- package/dist/application/admission.d.ts +1 -1
- package/dist/application/admission.d.ts.map +1 -1
- package/dist/application/events.d.ts +1 -1
- package/dist/application/events.d.ts.map +1 -1
- package/dist/{server → application}/file-state-store.d.ts +1 -1
- package/dist/application/file-state-store.d.ts.map +1 -0
- package/dist/application/health.d.ts +1 -1
- package/dist/application/health.d.ts.map +1 -1
- package/dist/application/kernel-admission.d.ts +8 -0
- package/dist/application/kernel-admission.d.ts.map +1 -0
- package/dist/application/kernel-contract.d.ts +142 -0
- package/dist/application/kernel-contract.d.ts.map +1 -0
- package/dist/application/kernel-resource-context.d.ts +24 -0
- package/dist/application/kernel-resource-context.d.ts.map +1 -0
- package/dist/application/kernel-restart.d.ts +5 -0
- package/dist/application/kernel-restart.d.ts.map +1 -0
- package/dist/application/kernel-rollback.d.ts +4 -0
- package/dist/application/kernel-rollback.d.ts.map +1 -0
- package/dist/application/kernel-shutdown.d.ts +6 -0
- package/dist/application/kernel-shutdown.d.ts.map +1 -0
- package/dist/application/kernel-start.d.ts +20 -0
- package/dist/application/kernel-start.d.ts.map +1 -0
- package/dist/application/kernel-state.d.ts +116 -0
- package/dist/application/kernel-state.d.ts.map +1 -0
- package/dist/application/kernel.d.ts +9 -140
- package/dist/application/kernel.d.ts.map +1 -1
- package/dist/application/latest-sink.d.ts +1 -1
- package/dist/application/latest-sink.d.ts.map +1 -1
- package/dist/application/opentelemetry.d.ts +1 -1
- package/dist/application/opentelemetry.d.ts.map +1 -1
- package/dist/application/watch-hub.d.ts +2 -2
- package/dist/application/watch-hub.d.ts.map +1 -1
- package/dist/browser/client-multipart.d.ts +1 -1
- package/dist/browser/client-multipart.d.ts.map +1 -1
- package/dist/browser/client-url.d.ts +1 -1
- package/dist/browser/client-url.d.ts.map +1 -1
- package/dist/browser/client.d.ts +1 -1
- package/dist/browser/client.d.ts.map +1 -1
- package/dist/browser/contract-stream.d.ts +1 -1
- package/dist/browser/contract-stream.d.ts.map +1 -1
- package/dist/browser/http.d.ts +1 -1
- package/dist/browser/http.d.ts.map +1 -1
- package/dist/browser/resumable.d.ts +1 -28
- package/dist/browser/resumable.d.ts.map +1 -1
- package/dist/browser/retained.d.ts.map +1 -0
- package/dist/browser/socket-io.d.ts +23 -1
- package/dist/browser/socket-io.d.ts.map +1 -1
- package/dist/browser/stream.d.ts +14 -2
- package/dist/browser/stream.d.ts.map +1 -1
- package/dist/contract/define.d.ts +72 -65
- package/dist/contract/define.d.ts.map +1 -1
- package/dist/{internal/errors.d.ts → contract/normalize.d.ts} +3 -39
- package/dist/contract/normalize.d.ts.map +1 -0
- package/dist/contract/tool-view.d.ts +135 -0
- package/dist/contract/tool-view.d.ts.map +1 -0
- package/dist/declaration/declaration.d.ts.map +1 -0
- package/dist/{agent-runtime/durability-contract.d.ts → durability/contract.d.ts} +2 -2
- package/dist/durability/contract.d.ts.map +1 -0
- package/dist/{agent-runtime/durability.d.ts → durability/engine.d.ts} +4 -4
- package/dist/durability/engine.d.ts.map +1 -0
- package/dist/durability/events.d.ts +101 -0
- package/dist/durability/events.d.ts.map +1 -0
- package/dist/{agent-runtime/durability-json.d.ts → durability/json.d.ts} +1 -1
- package/dist/durability/json.d.ts.map +1 -0
- package/dist/{agent-runtime/durability-ledger.d.ts → durability/ledger.d.ts} +2 -2
- package/dist/durability/ledger.d.ts.map +1 -0
- package/dist/{agent-runtime/durability-scheduler.d.ts → durability/scheduler.d.ts} +2 -2
- package/dist/durability/scheduler.d.ts.map +1 -0
- package/dist/entrypoints/agent-runtime/browser.d.ts +5 -0
- package/dist/entrypoints/agent-runtime/browser.d.ts.map +1 -0
- package/dist/{agent-runtime-browser.js → entrypoints/agent-runtime/browser.js} +3 -3
- package/dist/{agent-runtime-coding-tools.d.ts → entrypoints/agent-runtime/coding-tools.d.ts} +2 -2
- package/dist/entrypoints/agent-runtime/coding-tools.d.ts.map +1 -0
- package/dist/entrypoints/agent-runtime/coding-tools.js +22 -0
- package/dist/{agent-runtime-harness.d.ts → entrypoints/agent-runtime/harness.d.ts} +2 -2
- package/dist/entrypoints/agent-runtime/harness.d.ts.map +1 -0
- package/dist/{agent-runtime-harness.js → entrypoints/agent-runtime/harness.js} +24 -25
- package/dist/entrypoints/agent-runtime/openrouter.d.ts +2 -0
- package/dist/entrypoints/agent-runtime/openrouter.d.ts.map +1 -0
- package/dist/{agent-runtime-openrouter.js → entrypoints/agent-runtime/openrouter.js} +3 -3
- package/dist/{agent-runtime-sandbox.d.ts → entrypoints/agent-runtime/sandbox.d.ts} +5 -5
- package/dist/entrypoints/agent-runtime/sandbox.d.ts.map +1 -0
- package/dist/{agent-runtime-sandbox.js → entrypoints/agent-runtime/sandbox.js} +11 -12
- package/dist/entrypoints/agent-runtime/sqlite/bun.d.ts +2 -0
- package/dist/entrypoints/agent-runtime/sqlite/bun.d.ts.map +1 -0
- package/dist/{agent-runtime-sqlite-bun.js → entrypoints/agent-runtime/sqlite/bun.js} +8 -6
- package/dist/entrypoints/agent-runtime/sqlite/node.d.ts +2 -0
- package/dist/entrypoints/agent-runtime/sqlite/node.d.ts.map +1 -0
- package/dist/{agent-runtime-sqlite-node.js → entrypoints/agent-runtime/sqlite/node.js} +8 -6
- package/dist/entrypoints/agent-runtime/testing.d.ts +4 -0
- package/dist/entrypoints/agent-runtime/testing.d.ts.map +1 -0
- package/dist/entrypoints/agent-runtime/testing.js +1084 -0
- package/dist/{agent-runtime.d.ts → entrypoints/agent-runtime.d.ts} +41 -37
- package/dist/entrypoints/agent-runtime.d.ts.map +1 -0
- package/dist/{agent-runtime.js → entrypoints/agent-runtime.js} +408 -366
- package/dist/{application-diagnostic-journal.d.ts → entrypoints/application/diagnostic-journal.d.ts} +2 -2
- package/dist/entrypoints/application/diagnostic-journal.d.ts.map +1 -0
- package/dist/{application-diagnostic-journal.js → entrypoints/application/diagnostic-journal.js} +3 -3
- package/dist/{application-grammy.d.ts → entrypoints/application/grammy.d.ts} +2 -2
- package/dist/entrypoints/application/grammy.d.ts.map +1 -0
- package/dist/{application-grammy.js → entrypoints/application/grammy.js} +2 -2
- package/dist/{application-opentelemetry.d.ts → entrypoints/application/opentelemetry.d.ts} +2 -2
- package/dist/entrypoints/application/opentelemetry.d.ts.map +1 -0
- package/dist/{application-opentelemetry.js → entrypoints/application/opentelemetry.js} +4 -4
- package/dist/{application-schemas.d.ts → entrypoints/application/schemas.d.ts} +2 -2
- package/dist/entrypoints/application/schemas.d.ts.map +1 -0
- package/dist/{application-schemas.js → entrypoints/application/schemas.js} +2 -2
- package/dist/{application.d.ts → entrypoints/application.d.ts} +22 -21
- package/dist/entrypoints/application.d.ts.map +1 -0
- package/dist/{application.js → entrypoints/application.js} +24 -22
- package/dist/entrypoints/bin/upgrade-cli.d.ts.map +1 -0
- package/dist/{upgrade-cli.js → entrypoints/bin/upgrade-cli.js} +3 -3
- package/dist/{cli.d.ts → entrypoints/cli.d.ts} +15 -15
- package/dist/entrypoints/cli.d.ts.map +1 -0
- package/dist/{cli.js → entrypoints/cli.js} +30 -32
- package/dist/entrypoints/contract.d.ts +9 -0
- package/dist/entrypoints/contract.d.ts.map +1 -0
- package/dist/{contract/index.js → entrypoints/contract.js} +14 -6
- package/dist/entrypoints/declaration.d.ts +2 -0
- package/dist/entrypoints/declaration.d.ts.map +1 -0
- package/dist/{declaration.js → entrypoints/declaration.js} +1 -1
- package/dist/{files.d.ts → entrypoints/files.d.ts} +2 -2
- package/dist/entrypoints/files.d.ts.map +1 -0
- package/dist/{files.js → entrypoints/files.js} +3 -3
- package/dist/{geo.d.ts → entrypoints/geo.d.ts} +1 -1
- package/dist/entrypoints/geo.d.ts.map +1 -0
- package/dist/{geo.js → entrypoints/geo.js} +4 -4
- package/dist/entrypoints/google.d.ts +2 -0
- package/dist/entrypoints/google.d.ts.map +1 -0
- package/dist/{google.js → entrypoints/google.js} +1 -1
- package/dist/{index.d.ts → entrypoints/index.d.ts} +14 -13
- package/dist/entrypoints/index.d.ts.map +1 -0
- package/dist/{index.js → entrypoints/index.js} +99 -33
- package/dist/{live.d.ts → entrypoints/live.d.ts} +4 -4
- package/dist/entrypoints/live.d.ts.map +1 -0
- package/dist/{live.js → entrypoints/live.js} +6 -4
- package/dist/{node.d.ts → entrypoints/node.d.ts} +11 -11
- package/dist/entrypoints/node.d.ts.map +1 -0
- package/dist/{node.js → entrypoints/node.js} +20 -16
- package/dist/entrypoints/oauth.d.ts +2 -0
- package/dist/entrypoints/oauth.d.ts.map +1 -0
- package/dist/{oauth.js → entrypoints/oauth.js} +3 -3
- package/dist/{observability/index.d.ts → entrypoints/observability.d.ts} +11 -11
- package/dist/entrypoints/observability.d.ts.map +1 -0
- package/dist/{observability/index.js → entrypoints/observability.js} +9 -11
- package/dist/entrypoints/primitives.d.ts +3 -0
- package/dist/entrypoints/primitives.d.ts.map +1 -0
- package/dist/{primitives.js → entrypoints/primitives.js} +1 -6
- package/dist/{react.d.ts → entrypoints/react.d.ts} +4 -4
- package/dist/entrypoints/react.d.ts.map +1 -0
- package/dist/{react.js → entrypoints/react.js} +3 -3
- package/dist/{release.d.ts → entrypoints/release.d.ts} +4 -4
- package/dist/entrypoints/release.d.ts.map +1 -0
- package/dist/{release.js → entrypoints/release.js} +1 -1
- package/dist/{remote.d.ts → entrypoints/remote.d.ts} +1 -1
- package/dist/entrypoints/remote.d.ts.map +1 -0
- package/dist/entrypoints/remote.js +66 -0
- package/dist/{server/index.d.ts → entrypoints/server.d.ts} +35 -34
- package/dist/entrypoints/server.d.ts.map +1 -0
- package/dist/{server/index.js → entrypoints/server.js} +294 -244
- package/dist/{telegram.d.ts → entrypoints/telegram.d.ts} +2 -2
- package/dist/entrypoints/telegram.d.ts.map +1 -0
- package/dist/{telegram.js → entrypoints/telegram.js} +1 -1
- package/dist/entrypoints/testing.d.ts +9 -0
- package/dist/entrypoints/testing.d.ts.map +1 -0
- package/dist/{testing.js → entrypoints/testing.js} +80 -919
- package/dist/{tools/connections/index.d.ts → entrypoints/tools/connections.d.ts} +6 -7
- package/dist/entrypoints/tools/connections.d.ts.map +1 -0
- package/dist/{tools/connections/index.js → entrypoints/tools/connections.js} +7 -4
- package/dist/{tools-contract.d.ts → entrypoints/tools/contract.d.ts} +5 -5
- package/dist/entrypoints/tools/contract.d.ts.map +1 -0
- package/dist/{tools-contract.js → entrypoints/tools/contract.js} +4 -4
- package/dist/{tool-invoker.d.ts → entrypoints/tools/invoker.d.ts} +2 -2
- package/dist/entrypoints/tools/invoker.d.ts.map +1 -0
- package/dist/entrypoints/tools/invoker.js +20 -0
- package/dist/entrypoints/tools.d.ts +51 -0
- package/dist/entrypoints/tools.d.ts.map +1 -0
- package/dist/{tools.js → entrypoints/tools.js} +1787 -1751
- package/dist/{tracking-server.d.ts → entrypoints/tracking/server.d.ts} +8 -8
- package/dist/entrypoints/tracking/server.d.ts.map +1 -0
- package/dist/{tracking.d.ts → entrypoints/tracking.d.ts} +15 -15
- package/dist/entrypoints/tracking.d.ts.map +1 -0
- package/dist/{tracking.js → entrypoints/tracking.js} +5 -8
- package/dist/google/google.d.ts.map +1 -0
- package/dist/{index-a916km3r.js → index-0b1ess5e.js} +6 -13
- package/dist/{index-zwkgfq1s.js → index-1nd48tm9.js} +113 -118
- package/dist/{index-7zbps32p.js → index-1zbbzgfh.js} +2 -2
- package/dist/{index-mzvgxp0n.js → index-2cr1cqhn.js} +16 -4
- package/dist/{index-f9mb610r.js → index-35mh5bhj.js} +2 -2
- package/dist/index-48ffdxgk.js +6 -0
- package/dist/index-58k4fp34.js +1023 -0
- package/dist/{index-p13mwz16.js → index-83bdg97s.js} +1 -1
- package/dist/index-97ac4gph.js +3618 -0
- package/dist/{index-kw9t5ayn.js → index-cq4qfycf.js} +5 -5
- package/dist/{index-7gnkny4z.js → index-d9pk3td4.js} +1 -1
- package/dist/{index-e42wzzz5.js → index-dcpdvjsc.js} +7 -7
- package/dist/{index-h9etkkyk.js → index-dydjcp8z.js} +102 -25
- package/dist/{index-sr93cwf9.js → index-e2z3ahw9.js} +2 -2
- package/dist/{index-yewwh1w4.js → index-e87kakm4.js} +96 -11
- package/dist/{index-cby4ar3v.js → index-eqqvgdb3.js} +1 -1
- package/dist/index-fdp6hdxn.js +942 -0
- package/dist/{index-0a349c33.js → index-gyr48nzg.js} +125 -198
- package/dist/{index-wnfk50r0.js → index-h6eeys1v.js} +1 -1
- package/dist/{index-77fekveh.js → index-hffjpmq9.js} +1 -15
- package/dist/{index-yn8remb1.js → index-j05z5gn4.js} +50 -14
- package/dist/index-k5hsfc3j.js +31 -0
- package/dist/{index-fq77yfzc.js → index-kj2wbeta.js} +1 -1
- package/dist/index-kvj7f4hq.js +39 -0
- package/dist/{index-4fpa9dy2.js → index-m9zn6cpq.js} +2 -2
- package/dist/{index-2na0qrfn.js → index-mdzh02yc.js} +7 -7
- package/dist/{index-ywd0y6m1.js → index-mkm15s49.js} +1 -1
- package/dist/index-mp5sn43f.js +1084 -0
- package/dist/{index-3bmnp41g.js → index-n6hxg8as.js} +507 -419
- package/dist/index-ngfhvfpd.js +30 -0
- package/dist/{index-e0znv5gn.js → index-p5r7qpdd.js} +2 -93
- package/dist/{index-n0f51dfn.js → index-p81267c2.js} +608 -549
- package/dist/{index-wc4x00bn.js → index-qwhynv6x.js} +1 -1
- package/dist/index-r7nmqpsg.js +154 -0
- package/dist/{index-bx75zwt7.js → index-rewkc2hj.js} +5 -4
- package/dist/{index-9f8ztey6.js → index-sees8yf8.js} +2 -2
- package/dist/{index-vjpvjqpn.js → index-v38qyerb.js} +16 -2
- package/dist/{index-2c2bjw3s.js → index-vcvkq30w.js} +3 -3
- package/dist/index-wqgjfstn.js +18 -0
- package/dist/{index-f477k430.js → index-x4799c19.js} +1 -1
- package/dist/{index-cxqhvq21.js → index-xnj9bgxe.js} +142 -129
- package/dist/index-xsqjkha9.js +281 -0
- package/dist/{index-6kyksz9y.js → index-yw4fzmdz.js} +1 -1
- package/dist/{index-3xwxfj4z.js → index-zeemqhqx.js} +1 -1
- package/dist/{index-tmwcrptx.js → index-zfrhfn82.js} +1 -1
- package/dist/index-znfs20ss.js +98 -0
- package/dist/internal/backoff.d.ts +29 -0
- package/dist/internal/backoff.d.ts.map +1 -0
- package/dist/internal/canonical-json.d.ts +21 -11
- package/dist/internal/canonical-json.d.ts.map +1 -1
- package/dist/internal/channel.d.ts.map +1 -0
- package/dist/internal/logger.d.ts.map +1 -0
- package/dist/internal/request.d.ts.map +1 -0
- package/dist/internal/stable-digest.d.ts +0 -43
- package/dist/internal/stable-digest.d.ts.map +1 -1
- package/dist/internal/typed.d.ts +0 -8
- package/dist/internal/typed.d.ts.map +1 -1
- package/dist/internal/zod-issues.d.ts +38 -0
- package/dist/internal/zod-issues.d.ts.map +1 -0
- package/dist/{tools/json-schema-dialect.d.ts → json-schema/dialect.d.ts} +1 -1
- package/dist/json-schema/dialect.d.ts.map +1 -0
- package/dist/json-schema/json-schema.d.ts.map +1 -0
- package/dist/live/watch-delta.d.ts.map +1 -1
- package/dist/{oauth.d.ts → oauth/authorization-code.d.ts} +1 -1
- package/dist/oauth/authorization-code.d.ts.map +1 -0
- package/dist/observability/audit.d.ts +2 -2
- package/dist/observability/audit.d.ts.map +1 -1
- package/dist/observability/bounded-logger.d.ts +1 -1
- package/dist/observability/bounded-logger.d.ts.map +1 -1
- package/dist/{internal/observability-sink.d.ts → observability/bounded-sink.d.ts} +2 -2
- package/dist/observability/bounded-sink.d.ts.map +1 -0
- package/dist/observability/context.d.ts +1 -1
- package/dist/observability/context.d.ts.map +1 -1
- package/dist/observability/event.d.ts +1 -1
- package/dist/observability/event.d.ts.map +1 -1
- package/dist/observability/work.d.ts +1 -1
- package/dist/observability/work.d.ts.map +1 -1
- package/dist/primitives/audit.d.ts +1 -1
- package/dist/primitives/audit.d.ts.map +1 -1
- package/dist/primitives/export-operation.d.ts +4 -2
- package/dist/primitives/export-operation.d.ts.map +1 -1
- package/dist/realtime/socket.d.ts +1 -1
- package/dist/realtime/socket.d.ts.map +1 -1
- package/dist/server/context-contribution.d.ts +1 -1
- package/dist/server/context-contribution.d.ts.map +1 -1
- package/dist/server/context.d.ts +2 -2
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/contract-method.d.ts +15 -0
- package/dist/server/contract-method.d.ts.map +1 -0
- package/dist/server/contract-stream.d.ts +1 -1
- package/dist/server/contract-stream.d.ts.map +1 -1
- package/dist/server/create.d.ts +8 -0
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/endpoint-dispatch.d.ts +10 -0
- package/dist/server/endpoint-dispatch.d.ts.map +1 -0
- package/dist/server/endpoint-response.d.ts +18 -0
- package/dist/server/endpoint-response.d.ts.map +1 -0
- package/dist/server/error-dispatch.d.ts +17 -1
- package/dist/server/error-dispatch.d.ts.map +1 -1
- package/dist/server/error-hook.d.ts +2 -2
- package/dist/server/error-hook.d.ts.map +1 -1
- package/dist/server/handler-state.d.ts +44 -0
- package/dist/server/handler-state.d.ts.map +1 -0
- package/dist/server/implement.d.ts +1 -1
- package/dist/server/implement.d.ts.map +1 -1
- package/dist/server/middleware/auth.d.ts +1 -1
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/cors.d.ts +17 -0
- package/dist/server/middleware/cors.d.ts.map +1 -1
- package/dist/server/middleware/trust-fence.d.ts +1 -1
- package/dist/server/middleware/trust-fence.d.ts.map +1 -1
- package/dist/server/multipart.d.ts +1 -1
- package/dist/server/multipart.d.ts.map +1 -1
- package/dist/{tools/oauth-metadata.d.ts → server/oauth/metadata.d.ts} +2 -2
- package/dist/server/oauth/metadata.d.ts.map +1 -0
- package/dist/{tools/oauth-provider.d.ts → server/oauth/provider.d.ts} +2 -2
- package/dist/server/oauth/provider.d.ts.map +1 -0
- package/dist/server/realtime.d.ts +1 -1
- package/dist/server/realtime.d.ts.map +1 -1
- package/dist/server/request-completion.d.ts +16 -0
- package/dist/server/request-completion.d.ts.map +1 -0
- package/dist/server/response-metadata.d.ts +1 -1
- package/dist/server/response-metadata.d.ts.map +1 -1
- package/dist/server/route-table.d.ts +9 -0
- package/dist/server/route-table.d.ts.map +1 -0
- package/dist/server/stream.d.ts +0 -13
- package/dist/server/stream.d.ts.map +1 -1
- package/dist/server/types.d.ts +7 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/testing/handler-clients.d.ts +31 -0
- package/dist/testing/handler-clients.d.ts.map +1 -0
- package/dist/testing/managed-resource-conformance-scenarios.d.ts.map +1 -1
- package/dist/testing/surface-conformance.d.ts +2 -1
- package/dist/testing/surface-conformance.d.ts.map +1 -1
- package/dist/testing/surface-manifest.d.ts +30 -4
- package/dist/testing/surface-manifest.d.ts.map +1 -1
- package/dist/tools/{cli-args.d.ts → cli/args.d.ts} +1 -1
- package/dist/tools/cli/args.d.ts.map +1 -0
- package/dist/tools/{cli-checkpoint.d.ts → cli/checkpoint.d.ts} +1 -1
- package/dist/tools/cli/checkpoint.d.ts.map +1 -0
- package/dist/tools/{cli-command.d.ts → cli/command.d.ts} +4 -4
- package/dist/tools/cli/command.d.ts.map +1 -0
- package/dist/tools/{cli.d.ts → cli/config.d.ts} +5 -9
- package/dist/tools/cli/config.d.ts.map +1 -0
- package/dist/tools/cli/create-cli.d.ts +36 -0
- package/dist/tools/cli/create-cli.d.ts.map +1 -0
- package/dist/tools/cli/download.d.ts +8 -0
- package/dist/tools/cli/download.d.ts.map +1 -0
- package/dist/tools/{cli-format.d.ts → cli/format.d.ts} +2 -2
- package/dist/tools/cli/format.d.ts.map +1 -0
- package/dist/tools/cli/help.d.ts +24 -0
- package/dist/tools/cli/help.d.ts.map +1 -0
- package/dist/tools/{cli-installer.d.ts → cli/installer.d.ts} +2 -2
- package/dist/tools/cli/installer.d.ts.map +1 -0
- package/dist/tools/{cli-invoke.d.ts → cli/invoke.d.ts} +8 -8
- package/dist/tools/cli/invoke.d.ts.map +1 -0
- package/dist/tools/cli/io.d.ts +10 -0
- package/dist/tools/cli/io.d.ts.map +1 -0
- package/dist/tools/cli/managed-surface.d.ts +30 -0
- package/dist/tools/cli/managed-surface.d.ts.map +1 -0
- package/dist/tools/{cli-manifest.d.ts → cli/manifest.d.ts} +1 -1
- package/dist/tools/cli/manifest.d.ts.map +1 -0
- package/dist/tools/{cli-policy.d.ts → cli/policy.d.ts} +2 -2
- package/dist/tools/cli/policy.d.ts.map +1 -0
- package/dist/tools/cli/prepare.d.ts +14 -0
- package/dist/tools/cli/prepare.d.ts.map +1 -0
- package/dist/tools/{cli-profile.d.ts → cli/profile.d.ts} +2 -2
- package/dist/tools/cli/profile.d.ts.map +1 -0
- package/dist/tools/cli/run-managed.d.ts +5 -0
- package/dist/tools/cli/run-managed.d.ts.map +1 -0
- package/dist/tools/cli/run-native.d.ts +9 -0
- package/dist/tools/cli/run-native.d.ts.map +1 -0
- package/dist/tools/cli/session.d.ts +40 -0
- package/dist/tools/cli/session.d.ts.map +1 -0
- package/dist/tools/{cli-signature.d.ts → cli/signature.d.ts} +2 -2
- package/dist/tools/cli/signature.d.ts.map +1 -0
- package/dist/tools/{cli-stream.d.ts → cli/stream.d.ts} +4 -4
- package/dist/tools/cli/stream.d.ts.map +1 -0
- package/dist/tools/{cli-update.d.ts → cli/update.d.ts} +3 -3
- package/dist/tools/cli/update.d.ts.map +1 -0
- package/dist/tools/{cli-view.d.ts → cli/view.d.ts} +2 -2
- package/dist/tools/cli/view.d.ts.map +1 -0
- package/dist/tools/{cli-wait.d.ts → cli/wait.d.ts} +2 -2
- package/dist/tools/cli/wait.d.ts.map +1 -0
- package/dist/tools/connections/runtime.d.ts +1 -1
- package/dist/tools/connections/runtime.d.ts.map +1 -1
- package/dist/tools/connections/types.d.ts +3 -3
- package/dist/tools/connections/types.d.ts.map +1 -1
- package/dist/tools/durability-context.d.ts +1 -1
- package/dist/tools/durability-context.d.ts.map +1 -1
- package/dist/tools/execute.d.ts +30 -3
- package/dist/tools/execute.d.ts.map +1 -1
- package/dist/tools/internal/surface-projector.d.ts +8 -6
- package/dist/tools/internal/surface-projector.d.ts.map +1 -1
- package/dist/tools/internal/tool-view.d.ts +41 -0
- package/dist/tools/internal/tool-view.d.ts.map +1 -0
- package/dist/tools/invoker.d.ts +11 -3
- package/dist/tools/invoker.d.ts.map +1 -1
- package/dist/tools/list-names.d.ts +3 -3
- package/dist/tools/list-names.d.ts.map +1 -1
- package/dist/tools/manifest.d.ts +2 -2
- package/dist/tools/manifest.d.ts.map +1 -1
- package/dist/tools/{mcp-app.d.ts → mcp/app.d.ts} +1 -1
- package/dist/tools/mcp/app.d.ts.map +1 -0
- package/dist/tools/{mcp-catalog.d.ts → mcp/catalog.d.ts} +2 -2
- package/dist/tools/mcp/catalog.d.ts.map +1 -0
- package/dist/tools/{mcp-handler.d.ts → mcp/handler.d.ts} +5 -5
- package/dist/tools/mcp/handler.d.ts.map +1 -0
- package/dist/tools/{mcp.d.ts → mcp/mount.d.ts} +9 -9
- package/dist/tools/mcp/mount.d.ts.map +1 -0
- package/dist/tools/{mcp-prepare.d.ts → mcp/prepare.d.ts} +9 -9
- package/dist/tools/mcp/prepare.d.ts.map +1 -0
- package/dist/tools/{mcp-progress.d.ts → mcp/progress.d.ts} +2 -2
- package/dist/tools/mcp/progress.d.ts.map +1 -0
- package/dist/tools/mcp/register.d.ts +35 -0
- package/dist/tools/mcp/register.d.ts.map +1 -0
- package/dist/tools/{mcp-round-policy.d.ts → mcp/round-policy.d.ts} +2 -2
- package/dist/tools/mcp/round-policy.d.ts.map +1 -0
- package/dist/tools/{mcp-round.d.ts → mcp/round.d.ts} +4 -4
- package/dist/tools/mcp/round.d.ts.map +1 -0
- package/dist/tools/mcp/runtime-tools.d.ts +24 -0
- package/dist/tools/mcp/runtime-tools.d.ts.map +1 -0
- package/dist/tools/{mcp-stdio-signals.d.ts → mcp/stdio-signals.d.ts} +3 -3
- package/dist/tools/mcp/stdio-signals.d.ts.map +1 -0
- package/dist/tools/{mcp-stdio.d.ts → mcp/stdio.d.ts} +4 -4
- package/dist/tools/mcp/stdio.d.ts.map +1 -0
- package/dist/tools/{mcp-trace.d.ts → mcp/trace.d.ts} +1 -1
- package/dist/tools/mcp/trace.d.ts.map +1 -0
- package/dist/tools/mount.d.ts +12 -7
- package/dist/tools/mount.d.ts.map +1 -1
- package/dist/tools/native-definition.d.ts +3 -3
- package/dist/tools/native-definition.d.ts.map +1 -1
- package/dist/tools/operations/async-operation-binding-types.d.ts +127 -0
- package/dist/tools/operations/async-operation-binding-types.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-binding.d.ts +28 -0
- package/dist/tools/operations/async-operation-binding.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-canonical-types.d.ts +110 -0
- package/dist/tools/operations/async-operation-canonical-types.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-canonical.d.ts +7 -0
- package/dist/tools/operations/async-operation-canonical.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-contract.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-id.d.ts +23 -0
- package/dist/tools/operations/async-operation-id.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-runtime-tools.d.ts +40 -0
- package/dist/tools/operations/async-operation-runtime-tools.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-runtime-types.d.ts +68 -0
- package/dist/tools/operations/async-operation-runtime-types.d.ts.map +1 -0
- package/dist/tools/operations/async-operation-runtime.d.ts +5 -0
- package/dist/tools/operations/async-operation-runtime.d.ts.map +1 -0
- package/dist/tools/{define-wait-tool.d.ts → operations/define-wait-tool.d.ts} +2 -2
- package/dist/tools/operations/define-wait-tool.d.ts.map +1 -0
- package/dist/tools/operations/mount-wait.d.ts.map +1 -0
- package/dist/tools/operations/wait-core.d.ts.map +1 -0
- package/dist/tools/remote.d.ts +1 -1
- package/dist/tools/remote.d.ts.map +1 -1
- package/dist/tools/runtime-tool.d.ts +11 -4
- package/dist/tools/runtime-tool.d.ts.map +1 -1
- package/dist/tools/schema/coerce.d.ts.map +1 -0
- package/dist/tools/schema/flatten-join.d.ts.map +1 -0
- package/dist/tools/schema/flatten.d.ts.map +1 -0
- package/dist/tools/schema/portable-formats.d.ts.map +1 -0
- package/dist/tools/{presentation.d.ts → schema/presentation.d.ts} +2 -0
- package/dist/tools/schema/presentation.d.ts.map +1 -0
- package/dist/tools/schema/schema.d.ts.map +1 -0
- package/dist/tools/schema/untyped-properties.d.ts.map +1 -0
- package/dist/tools/surface.d.ts +2 -3
- package/dist/tools/surface.d.ts.map +1 -1
- package/dist/tools/toolkit.d.ts +4 -4
- package/dist/tools/toolkit.d.ts.map +1 -1
- package/dist/tools/{define-download-tool.d.ts → transfer/define-download-tool.d.ts} +4 -4
- package/dist/tools/transfer/define-download-tool.d.ts.map +1 -0
- package/dist/tools/{define-upload-tool.d.ts → transfer/define-upload-tool.d.ts} +3 -3
- package/dist/tools/transfer/define-upload-tool.d.ts.map +1 -0
- package/dist/tools/{define-view-file-tool.d.ts → transfer/define-view-file-tool.d.ts} +2 -2
- package/dist/tools/transfer/define-view-file-tool.d.ts.map +1 -0
- package/dist/tools/{download-core.d.ts → transfer/download-core.d.ts} +2 -2
- package/dist/tools/transfer/download-core.d.ts.map +1 -0
- package/dist/tools/{managed-file-error.d.ts → transfer/managed-file-error.d.ts} +1 -1
- package/dist/tools/transfer/managed-file-error.d.ts.map +1 -0
- package/dist/tools/{mount-download.d.ts → transfer/mount-download.d.ts} +1 -1
- package/dist/tools/transfer/mount-download.d.ts.map +1 -0
- package/dist/tools/{mount-upload.d.ts → transfer/mount-upload.d.ts} +1 -1
- package/dist/tools/transfer/mount-upload.d.ts.map +1 -0
- package/dist/tools/transfer/native-result.d.ts.map +1 -0
- package/dist/tools/{upload-core.d.ts → transfer/upload-core.d.ts} +1 -1
- package/dist/tools/transfer/upload-core.d.ts.map +1 -0
- package/dist/tools/transfer/view-file-contract.d.ts.map +1 -0
- package/dist/tools/{view-file.d.ts → transfer/view-file.d.ts} +1 -1
- package/dist/tools/transfer/view-file.d.ts.map +1 -0
- package/dist/tools/transports.d.ts +1 -1
- package/dist/tools/transports.d.ts.map +1 -1
- package/dist/tracking/contract.d.ts +1 -1
- package/dist/tracking/contract.d.ts.map +1 -1
- package/llms/agent-runtime-browser.txt +33 -0
- package/llms/agent-runtime-coding-tools.txt +58 -0
- package/llms/agent-runtime-harness.txt +45 -0
- package/llms/agent-runtime-openrouter.txt +22 -0
- package/llms/agent-runtime-sandbox.txt +159 -0
- package/llms/agent-runtime-sqlite-bun.txt +29 -0
- package/llms/agent-runtime-sqlite-node.txt +26 -0
- package/llms/agent-runtime-testing.txt +30 -0
- package/llms/agent-runtime.2.txt +550 -0
- package/llms/agent-runtime.3.txt +311 -0
- package/llms/agent-runtime.txt +893 -0
- package/llms/application-diagnostic-journal.txt +30 -0
- package/llms/application-grammy.txt +27 -0
- package/llms/application-opentelemetry.txt +27 -0
- package/llms/application-schemas.txt +42 -0
- package/llms/application.2.txt +223 -0
- package/llms/application.txt +1144 -0
- package/llms/cli.txt +977 -0
- package/llms/contract.txt +606 -0
- package/llms/declaration.txt +286 -0
- package/llms/files.txt +30 -0
- package/llms/geo.txt +114 -0
- package/llms/google.txt +27 -0
- package/llms/live.txt +471 -0
- package/llms/node.txt +43 -0
- package/llms/oauth.txt +136 -0
- package/llms/observability.txt +893 -0
- package/llms/primitives.txt +158 -0
- package/llms/react.txt +184 -0
- package/llms/release.txt +176 -0
- package/llms/remote.txt +25 -0
- package/llms/server.2.txt +361 -0
- package/llms/server.3.txt +1031 -0
- package/llms/server.4.txt +905 -0
- package/llms/server.5.txt +250 -0
- package/llms/server.txt +996 -0
- package/llms/stitchkit.2.txt +836 -0
- package/llms/stitchkit.3.txt +147 -0
- package/llms/stitchkit.txt +260 -0
- package/llms/telegram.txt +30 -0
- package/llms/testing.txt +676 -0
- package/llms/tools-connections.txt +45 -0
- package/llms/tools-contract.txt +9 -0
- package/llms/tools-invoker.txt +9 -0
- package/llms/tools.2.txt +838 -0
- package/llms/tools.txt +1004 -0
- package/llms/tracking-server.txt +32 -0
- package/llms/tracking.txt +263 -0
- package/llms/upgrading-0.37.0-0.50.0.txt +947 -0
- package/llms/upgrading-0.53.0-0.67.0.txt +1174 -0
- package/llms/upgrading-0.68.0-0.94.0.txt +1159 -0
- package/llms/upgrading.txt +215 -0
- package/llms-full.txt +214 -75
- package/llms.txt +54 -5
- package/package.json +84 -83
- package/dist/agent-runtime/durability-contract.d.ts.map +0 -1
- package/dist/agent-runtime/durability-json.d.ts.map +0 -1
- package/dist/agent-runtime/durability-ledger.d.ts.map +0 -1
- package/dist/agent-runtime/durability-scheduler.d.ts.map +0 -1
- package/dist/agent-runtime/durability.d.ts.map +0 -1
- package/dist/agent-runtime/store-driver.d.ts.map +0 -1
- package/dist/agent-runtime-browser.d.ts +0 -5
- package/dist/agent-runtime-browser.d.ts.map +0 -1
- package/dist/agent-runtime-coding-tools.d.ts.map +0 -1
- package/dist/agent-runtime-coding-tools.js +0 -23
- package/dist/agent-runtime-harness.d.ts.map +0 -1
- package/dist/agent-runtime-openrouter.d.ts.map +0 -1
- package/dist/agent-runtime-sandbox.d.ts.map +0 -1
- package/dist/agent-runtime-sqlite-bun.d.ts.map +0 -1
- package/dist/agent-runtime-sqlite-node.d.ts.map +0 -1
- package/dist/agent-runtime-testing.d.ts +0 -3
- package/dist/agent-runtime-testing.d.ts.map +0 -1
- package/dist/agent-runtime-testing.js +0 -156
- package/dist/agent-runtime.d.ts.map +0 -1
- package/dist/application/channel.d.ts.map +0 -1
- package/dist/application-diagnostic-journal.d.ts.map +0 -1
- package/dist/application-grammy.d.ts.map +0 -1
- package/dist/application-opentelemetry.d.ts.map +0 -1
- package/dist/application-schemas.d.ts.map +0 -1
- package/dist/application.d.ts.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/contract/index.d.ts +0 -8
- package/dist/contract/index.d.ts.map +0 -1
- package/dist/declaration.d.ts.map +0 -1
- package/dist/files.d.ts.map +0 -1
- package/dist/geo.d.ts.map +0 -1
- package/dist/google.d.ts.map +0 -1
- package/dist/index-0j3vcp5m.js +0 -28
- package/dist/index-a11g2kry.js +0 -866
- package/dist/index-cnyk6te3.js +0 -77
- package/dist/index-fadnxwna.js +0 -1046
- package/dist/index-hrbajay7.js +0 -1196
- package/dist/index-s8cnx02s.js +0 -90
- package/dist/index-v5573g1k.js +0 -142
- package/dist/index-vk3kq9sb.js +0 -3344
- package/dist/index.d.ts.map +0 -1
- package/dist/internal/errors.d.ts.map +0 -1
- package/dist/internal/observability-sink.d.ts.map +0 -1
- package/dist/live.d.ts.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/node.d.ts.map +0 -1
- package/dist/oauth.d.ts.map +0 -1
- package/dist/observability/index.d.ts.map +0 -1
- package/dist/primitives.d.ts +0 -3
- package/dist/primitives.d.ts.map +0 -1
- package/dist/react.d.ts.map +0 -1
- package/dist/release.d.ts.map +0 -1
- package/dist/remote.d.ts.map +0 -1
- package/dist/remote.js +0 -88
- package/dist/retained.d.ts.map +0 -1
- package/dist/server/file-state-store.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/request.d.ts.map +0 -1
- package/dist/telegram.d.ts.map +0 -1
- package/dist/testing/agent-store-conformance.d.ts.map +0 -1
- package/dist/testing.d.ts +0 -39
- package/dist/testing.d.ts.map +0 -1
- package/dist/tool-invoker.d.ts.map +0 -1
- package/dist/tool-invoker.js +0 -21
- package/dist/tools/async-operation-contract.d.ts.map +0 -1
- package/dist/tools/async-operation.d.ts +0 -332
- package/dist/tools/async-operation.d.ts.map +0 -1
- package/dist/tools/cli-args.d.ts.map +0 -1
- package/dist/tools/cli-checkpoint.d.ts.map +0 -1
- package/dist/tools/cli-command.d.ts.map +0 -1
- package/dist/tools/cli-format.d.ts.map +0 -1
- package/dist/tools/cli-installer.d.ts.map +0 -1
- package/dist/tools/cli-invoke.d.ts.map +0 -1
- package/dist/tools/cli-manifest.d.ts.map +0 -1
- package/dist/tools/cli-policy.d.ts.map +0 -1
- package/dist/tools/cli-profile.d.ts.map +0 -1
- package/dist/tools/cli-signature.d.ts.map +0 -1
- package/dist/tools/cli-stream.d.ts.map +0 -1
- package/dist/tools/cli-update.d.ts.map +0 -1
- package/dist/tools/cli-view.d.ts.map +0 -1
- package/dist/tools/cli-wait.d.ts.map +0 -1
- package/dist/tools/cli.d.ts.map +0 -1
- package/dist/tools/coerce.d.ts.map +0 -1
- package/dist/tools/connections/index.d.ts.map +0 -1
- package/dist/tools/define-download-tool.d.ts.map +0 -1
- package/dist/tools/define-upload-tool.d.ts.map +0 -1
- package/dist/tools/define-view-file-tool.d.ts.map +0 -1
- package/dist/tools/define-wait-tool.d.ts.map +0 -1
- package/dist/tools/download-core.d.ts.map +0 -1
- package/dist/tools/flatten-join.d.ts.map +0 -1
- package/dist/tools/flatten.d.ts.map +0 -1
- package/dist/tools/json-schema-dialect.d.ts.map +0 -1
- package/dist/tools/json-schema.d.ts.map +0 -1
- package/dist/tools/managed-file-error.d.ts.map +0 -1
- package/dist/tools/mcp-app.d.ts.map +0 -1
- package/dist/tools/mcp-catalog.d.ts.map +0 -1
- package/dist/tools/mcp-handler.d.ts.map +0 -1
- package/dist/tools/mcp-prepare.d.ts.map +0 -1
- package/dist/tools/mcp-progress.d.ts.map +0 -1
- package/dist/tools/mcp-round-policy.d.ts.map +0 -1
- package/dist/tools/mcp-round.d.ts.map +0 -1
- package/dist/tools/mcp-stdio-signals.d.ts.map +0 -1
- package/dist/tools/mcp-stdio.d.ts.map +0 -1
- package/dist/tools/mcp-trace.d.ts.map +0 -1
- package/dist/tools/mcp.d.ts.map +0 -1
- package/dist/tools/mount-download.d.ts.map +0 -1
- package/dist/tools/mount-upload.d.ts.map +0 -1
- package/dist/tools/mount-wait.d.ts.map +0 -1
- package/dist/tools/native-mcp.d.ts +0 -20
- package/dist/tools/native-mcp.d.ts.map +0 -1
- package/dist/tools/native-result.d.ts.map +0 -1
- package/dist/tools/oauth-metadata.d.ts.map +0 -1
- package/dist/tools/oauth-provider.d.ts.map +0 -1
- package/dist/tools/portable-formats.d.ts.map +0 -1
- package/dist/tools/presentation.d.ts.map +0 -1
- package/dist/tools/schema.d.ts.map +0 -1
- package/dist/tools/untyped-properties.d.ts.map +0 -1
- package/dist/tools/upload-core.d.ts.map +0 -1
- package/dist/tools/view-file-contract.d.ts.map +0 -1
- package/dist/tools/view-file.d.ts.map +0 -1
- package/dist/tools/wait-core.d.ts.map +0 -1
- package/dist/tools-contract.d.ts.map +0 -1
- package/dist/tools.d.ts +0 -50
- package/dist/tools.d.ts.map +0 -1
- package/dist/tracking-server.d.ts.map +0 -1
- package/dist/tracking.d.ts.map +0 -1
- package/dist/upgrade-cli.d.ts.map +0 -1
- package/dist/{retained.d.ts → browser/retained.d.ts} +0 -0
- package/dist/{declaration.d.ts → declaration/declaration.d.ts} +0 -0
- package/dist/{upgrade-cli.d.ts → entrypoints/bin/upgrade-cli.d.ts} +0 -0
- package/dist/{tracking-server.js → entrypoints/tracking/server.js} +0 -0
- package/dist/{google.d.ts → google/google.d.ts} +0 -0
- package/dist/{index-pq95qkbf.js → index-5jm36zv1.js} +0 -0
- package/dist/{index-actkayzn.js → index-70yj2ebz.js} +3 -3
- /package/dist/{application → internal}/channel.d.ts +0 -0
- /package/dist/{logger.d.ts → internal/logger.d.ts} +0 -0
- /package/dist/{server → internal}/request.d.ts +0 -0
- /package/dist/{tools → json-schema}/json-schema.d.ts +0 -0
- /package/dist/tools/{async-operation-contract.d.ts → operations/async-operation-contract.d.ts} +0 -0
- /package/dist/tools/{mount-wait.d.ts → operations/mount-wait.d.ts} +0 -0
- /package/dist/tools/{wait-core.d.ts → operations/wait-core.d.ts} +0 -0
- /package/dist/tools/{coerce.d.ts → schema/coerce.d.ts} +0 -0
- /package/dist/tools/{flatten-join.d.ts → schema/flatten-join.d.ts} +0 -0
- /package/dist/tools/{flatten.d.ts → schema/flatten.d.ts} +0 -0
- /package/dist/tools/{portable-formats.d.ts → schema/portable-formats.d.ts} +0 -0
- /package/dist/tools/{schema.d.ts → schema/schema.d.ts} +0 -0
- /package/dist/tools/{untyped-properties.d.ts → schema/untyped-properties.d.ts} +0 -0
- /package/dist/tools/{native-result.d.ts → transfer/native-result.d.ts} +0 -0
- /package/dist/tools/{view-file-contract.d.ts → transfer/view-file-contract.d.ts} +0 -0
package/llms/live.txt
ADDED
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
# stitchkit/live — stitchkit docs slice
|
|
2
|
+
|
|
3
|
+
> Generated from the `docs/` tree by `bun run gen:llms`. The index of all slices is
|
|
4
|
+
> `llms.txt` in this package.
|
|
5
|
+
|
|
6
|
+
Contains: Guide: Live data (docs/guide/live.md) · API reference: `stitchkit/live` (docs/api/reference.md)
|
|
7
|
+
|
|
8
|
+
==============================================================================
|
|
9
|
+
# Guide: Live data (docs/guide/live.md)
|
|
10
|
+
==============================================================================
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
title: Live data — announcements, watched reads, keyspaces and the trust fence
|
|
14
|
+
description: How to declare events beside the operation contract, share one server-side read between every browser asking the same question, keep authoritative memory in front of a durable backend, and refuse a request whose authority you never agreed to answer on.
|
|
15
|
+
type: guide
|
|
16
|
+
status: active
|
|
17
|
+
created: 2026-09-02
|
|
18
|
+
updated: 2026-09-02
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Live data
|
|
22
|
+
|
|
23
|
+
Four things an application builds by hand the second time it needs them.
|
|
24
|
+
`stitchkit/live` is **evolving**: it ships from its own entrypoint so that is
|
|
25
|
+
visible rather than discovered in a minor.
|
|
26
|
+
|
|
27
|
+
- [Announcements — `defineEvents`](#announcements)
|
|
28
|
+
- [Watched reads — `createWatchHub` / `createWatchClient`](#watched-reads)
|
|
29
|
+
- [Keyspaces — `defineKeyspace`](#keyspaces)
|
|
30
|
+
- [The trust fence — `createTrustFence`](#the-trust-fence)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Announcements
|
|
35
|
+
|
|
36
|
+
`defineContract` says what a caller may **ask**. `defineEvents` says what the
|
|
37
|
+
server may **announce**.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { defineEvents } from 'stitchkit/live';
|
|
41
|
+
import { z } from 'zod';
|
|
42
|
+
|
|
43
|
+
export const events = defineEvents(
|
|
44
|
+
{ prefix: 'notes' },
|
|
45
|
+
{
|
|
46
|
+
'changed': { schema: z.object({ folder: z.string() }), mode: 'emit' },
|
|
47
|
+
'archiving': {
|
|
48
|
+
schema: z.object({ folder: z.string() }),
|
|
49
|
+
mode: 'decision',
|
|
50
|
+
whenAllDefer: 'allow',
|
|
51
|
+
listenerTimeoutMs: 2_000,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
);
|
|
55
|
+
// events.topics has the keys 'notes.changed' and 'notes.archiving'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
A topic has exactly one name: the prefixed one. It is the key of `topics`, the
|
|
59
|
+
event on the wire, and the string you pass to `on`. The short key in the literal
|
|
60
|
+
is where the full name is *built*, not a second name for the same topic.
|
|
61
|
+
|
|
62
|
+
### The wire is the socket you already run
|
|
63
|
+
|
|
64
|
+
`toRealtimeContract` projects the declaration onto `RealtimeContract`. Everything
|
|
65
|
+
after that is the machinery Stitchkit already ships — validation both ways,
|
|
66
|
+
rejection reporting, rooms, and the client's `retain:` replay.
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { bindRealtimeServer } from 'stitchkit/server';
|
|
70
|
+
import { bindRealtimeClient } from 'stitchkit';
|
|
71
|
+
import { toRealtimeContract } from 'stitchkit/live';
|
|
72
|
+
|
|
73
|
+
const realtime = bindRealtimeServer(toRealtimeContract(events), { io });
|
|
74
|
+
realtime.emit('notes.changed', { folder: 'inbox' });
|
|
75
|
+
|
|
76
|
+
// browser
|
|
77
|
+
const live = bindRealtimeClient(toRealtimeContract(events), socket);
|
|
78
|
+
live.on('notes.changed', (payload) => { /* payload is typed */ });
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
There is no `bindEvents`. Subscribing to an announcement is `bindRealtimeClient`,
|
|
82
|
+
because a second `on()` over the same socket would be a second name for one
|
|
83
|
+
thing.
|
|
84
|
+
|
|
85
|
+
Two details worth knowing before you meet them:
|
|
86
|
+
|
|
87
|
+
- A rejected announcement is reported **at the peer that refused it**, through
|
|
88
|
+
`onRejected`. A fire-and-forget event has no acknowledgement channel to carry
|
|
89
|
+
a refusal back to the sender.
|
|
90
|
+
- An issue path names the tuple position — a bad `revision` field appears as
|
|
91
|
+
`0.revision`, because event arguments are a tuple and one payload sits at
|
|
92
|
+
index 0 of it.
|
|
93
|
+
|
|
94
|
+
### Delivery modes are about **this process**
|
|
95
|
+
|
|
96
|
+
A browser cannot delay or veto a server's announcement, so a mode says nothing
|
|
97
|
+
about the wire. It says what the server's own listeners may do.
|
|
98
|
+
|
|
99
|
+
| mode | what the caller gets back | a listener that fails |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `emit` | nothing; announce and continue | isolated, reported, the others still run |
|
|
102
|
+
| `serial` | a promise for the whole sequence | reported at its deadline; the next still runs |
|
|
103
|
+
| `decision` | a promise for `allow` / `deny` | **denies**, with the reason |
|
|
104
|
+
|
|
105
|
+
Pass the declaration to the bus and it enforces the mode:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import { createEventBus } from 'stitchkit/server';
|
|
109
|
+
import type { EventPayloads } from 'stitchkit/live';
|
|
110
|
+
|
|
111
|
+
const bus = createEventBus<EventPayloads<typeof events>>({ topics: events.topics });
|
|
112
|
+
|
|
113
|
+
bus.on('notes.archiving', async () =>
|
|
114
|
+
(await runsOpen()) ? { outcome: 'deny', reason: 'a run is still open' } : { outcome: 'allow' },
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const decision = await bus.decide('notes.archiving', { folder: 'inbox' });
|
|
118
|
+
bus.emit('notes.archiving', …); // throws: that topic is delivered with decide()
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The asymmetry in the table is deliberate and is the point of the mode. For
|
|
122
|
+
`emit`, isolating a failing listener means "the others carry on". For a vote, the
|
|
123
|
+
same isolation would mean "counted as consent" — so a listener that throws, times
|
|
124
|
+
out, or returns something that is not a decision **denies**. A listener that was
|
|
125
|
+
asked and did not answer has not agreed.
|
|
126
|
+
|
|
127
|
+
`whenAllDefer` and `listenerTimeoutMs` have no defaults, and that is on purpose:
|
|
128
|
+
either default would be a standing `allow`/`deny`, or an unbounded wait, applied
|
|
129
|
+
to every topic whose author never thought about it.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Watched reads
|
|
134
|
+
|
|
135
|
+
A watched read is a GET the server re-runs when a topic announces a change,
|
|
136
|
+
pushing the new answer to everyone watching it.
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
// server
|
|
140
|
+
import { createWatchHub } from 'stitchkit/application';
|
|
141
|
+
|
|
142
|
+
const hub = createWatchHub({
|
|
143
|
+
read: (operation, args) => api[operation.action](args),
|
|
144
|
+
watchable: (operation) => operation.service === 'notes',
|
|
145
|
+
invalidatedBy: () => ['notes.changed'],
|
|
146
|
+
subscribe: (topic, listener) => bus.on(topic, listener),
|
|
147
|
+
holdMs: 30_000,
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
// browser
|
|
153
|
+
import { createWatchClient, watchTransport } from 'stitchkit/live';
|
|
154
|
+
|
|
155
|
+
// `live` is the bound realtime client. It goes through `watchTransport`, and
|
|
156
|
+
// that is not ceremony: its `on` is generic over the contract it was bound to,
|
|
157
|
+
// and TypeScript will not relate that signature to the one a watch client
|
|
158
|
+
// declares. The conversion lives in the framework so it is written once rather
|
|
159
|
+
// than in every application.
|
|
160
|
+
const watch = createWatchClient(notesContract, {
|
|
161
|
+
transport: watchTransport(live),
|
|
162
|
+
holdMs: 30_000,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
const handle = watch.list({ folder: 'inbox' });
|
|
166
|
+
const stop = handle.subscribe({
|
|
167
|
+
value: (notes) => render(notes),
|
|
168
|
+
state: (state) => {
|
|
169
|
+
if (state.phase === 'unavailable') showBanner(state.message);
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Two browsers asking the same question are **one read**. The identity of a
|
|
175
|
+
question is `(service, action, digest of arguments)`, and the digest is
|
|
176
|
+
order-independent — `{a, b}` and `{b, a}` are the same question, which a plain
|
|
177
|
+
`JSON.stringify` key would get wrong exactly when two components happen to build
|
|
178
|
+
their argument object in a different order.
|
|
179
|
+
|
|
180
|
+
### Narrow the topic to the arguments
|
|
181
|
+
|
|
182
|
+
`invalidatedBy` is given the arguments as well as the operation, so a topic can
|
|
183
|
+
name what the answer actually depends on:
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
invalidatedBy: (operation, args) => [`chat.transcript:${args.address}`],
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Without that, one address changing wakes every watcher of the operation. Twenty
|
|
190
|
+
conversations open means twenty reads for one change — nineteen of them publish
|
|
191
|
+
nothing, because nothing changed, and the read is paid anyway.
|
|
192
|
+
|
|
193
|
+
The digest is a plain 128-bit hash computed in JavaScript, on purpose. It used
|
|
194
|
+
to be SHA-256 through Web Crypto, which exists **only in a secure context** — so
|
|
195
|
+
every watched read threw on a page served over plain HTTP from a LAN name, while
|
|
196
|
+
`localhost` (secure by definition) and every test kept saying the code was fine.
|
|
197
|
+
The key identifies a question; it does not protect one, and an attacker who can
|
|
198
|
+
choose your watch arguments can already ask the question directly.
|
|
199
|
+
|
|
200
|
+
### Who shares with whom
|
|
201
|
+
|
|
202
|
+
A key is `(service, action, digest of arguments)`, and everyone on that key gets
|
|
203
|
+
one read. So the question a sharing primitive has to answer is what keeps one
|
|
204
|
+
caller's answer from reaching another — and here the answer is structural:
|
|
205
|
+
`read` is **given no subscriber**. An answer that depends on who is asking has to
|
|
206
|
+
carry the asker in its arguments, and the arguments are what the digest is taken
|
|
207
|
+
over, so two callers who differ get two keys and two reads.
|
|
208
|
+
|
|
209
|
+
The one way to defeat that is to resolve an identity from ambient state *inside*
|
|
210
|
+
`read` — a request-scoped context, a module-level "current user". Then every
|
|
211
|
+
subscriber on that key receives whatever the first read happened to resolve.
|
|
212
|
+
Put the identity in the arguments instead.
|
|
213
|
+
|
|
214
|
+
### Three states, not two
|
|
215
|
+
|
|
216
|
+
`state.phase` comes from `LiveStatePhase`, the vocabulary the live-state
|
|
217
|
+
controller already uses. The one to notice is `opening`: subscribed, nothing read
|
|
218
|
+
yet. It is neither healthy nor broken, and rendering it as "unavailable" tells a
|
|
219
|
+
user something is wrong when the truth is that it is early.
|
|
220
|
+
|
|
221
|
+
A failed read arrives as `unavailable` with the read's own `code` and `message`.
|
|
222
|
+
The hub retries on its own backoff, and a success clears the state without anyone
|
|
223
|
+
asking.
|
|
224
|
+
|
|
225
|
+
### Across a reconnect
|
|
226
|
+
|
|
227
|
+
The hub releases a connection's keys when it detaches, so everything opened over
|
|
228
|
+
the old socket is gone the moment it drops. The client recovers on its own: on a
|
|
229
|
+
drop your `state` listener gets `unavailable` / `source-unavailable`, and on the
|
|
230
|
+
next connection every key that still has a listener is re-opened and the values
|
|
231
|
+
resume. That is what `onConnectionChange` on the transport is for, and why it is
|
|
232
|
+
required rather than optional — a client that cannot be told has no way to
|
|
233
|
+
notice, and the face stops updating without a word.
|
|
234
|
+
|
|
235
|
+
Nothing an open can fail with escapes as a rejected promise: a disconnected
|
|
236
|
+
socket, a timeout, a refusal all arrive as `unavailable` carrying the error's own
|
|
237
|
+
code and message, and the next connection retries.
|
|
238
|
+
|
|
239
|
+
The re-open carries what the client still holds, so a reconnection is usually
|
|
240
|
+
cheap: the hub answers with a difference, or with nothing at all when the answer
|
|
241
|
+
has not moved. That needs the key to still exist on the server — set `holdMs`
|
|
242
|
+
past your reconnect delay, or the last detach releases the source and the page
|
|
243
|
+
pays the whole value once.
|
|
244
|
+
|
|
245
|
+
### Large answers cross as differences
|
|
246
|
+
|
|
247
|
+
A frame carries the value, a **difference** to a revision this subscriber already
|
|
248
|
+
holds, or `unchanged`. The hub chooses per subscriber and sends a difference only
|
|
249
|
+
when it is genuinely smaller; your `value` listener sees the rebuilt value either
|
|
250
|
+
way and needs no code for this.
|
|
251
|
+
|
|
252
|
+
It matters when an answer is large and moves a little: a ~75 KB list in which two
|
|
253
|
+
timestamps change, republished every fifteen seconds, was a megabyte per
|
|
254
|
+
subscriber per minute before and is a frame under a kilobyte now.
|
|
255
|
+
|
|
256
|
+
```ts
|
|
257
|
+
createWatchHub({
|
|
258
|
+
// Superseded values kept per key, so a difference has something to be taken
|
|
259
|
+
// against. Default 262144. Set 0 to send whole values only.
|
|
260
|
+
deltaMemoryBytes: 256 * 1024,
|
|
261
|
+
holdMs: 30_000,
|
|
262
|
+
// …
|
|
263
|
+
});
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Reassembly is checked against the server's fingerprint on every frame. If a
|
|
267
|
+
difference will not apply — a client that missed a revision, a hub that restarted
|
|
268
|
+
— that **one key** resynchronises: your `state` listener sees `resync-required`
|
|
269
|
+
and the whole value follows. Other keys on the same socket are untouched.
|
|
270
|
+
|
|
271
|
+
Both ends must come from the same major release: a client older than 0.90 reads a
|
|
272
|
+
difference frame as a value of `undefined`.
|
|
273
|
+
|
|
274
|
+
### `watch` or `createLiveStateController`?
|
|
275
|
+
|
|
276
|
+
> **If you would have written `applyEvent` as `(_, next) => next`, you want
|
|
277
|
+
> `watch`: whatever crosses the wire, what your `value` listener receives is the
|
|
278
|
+
> whole answer.** `createLiveStateController` is for a server whose *protocol* is
|
|
279
|
+
> deltas that your code folds. `watch` may send a difference too, but it folds it
|
|
280
|
+
> for you and hands you the value — so applying both to one value is always a
|
|
281
|
+
> mistake.
|
|
282
|
+
|
|
283
|
+
### What it cannot promise
|
|
284
|
+
|
|
285
|
+
One source per **process**. Two processes behind a balancer are two reads, and no
|
|
286
|
+
test can show you otherwise from inside one of them.
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Keyspaces
|
|
291
|
+
|
|
292
|
+
Authoritative memory in front of a durable backend: read synchronously, write
|
|
293
|
+
through one serialised chain.
|
|
294
|
+
|
|
295
|
+
```ts
|
|
296
|
+
import { defineKeyspace, keyspaceResource, sqliteKeyspaceBackend } from 'stitchkit/application';
|
|
297
|
+
|
|
298
|
+
const sessions = defineKeyspace('sessions', {
|
|
299
|
+
schema: SessionSchema,
|
|
300
|
+
key: (session) => session.id,
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
createApplication({
|
|
304
|
+
resources: [
|
|
305
|
+
keyspaceResource(sessions, {
|
|
306
|
+
backend: sqliteKeyspaceBackend(sessions, { database }),
|
|
307
|
+
onChanged: (change) => bus.emit('sessions.changed', { id: change.key }),
|
|
308
|
+
dependsOn: ['database'],
|
|
309
|
+
}),
|
|
310
|
+
],
|
|
311
|
+
});
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The order is **backend, then memory, then the change event**, and it is the whole
|
|
315
|
+
point:
|
|
316
|
+
|
|
317
|
+
- Backend first is what makes the memory authoritative — a reader can never
|
|
318
|
+
observe a value that did not survive. The reverse order makes writes feel
|
|
319
|
+
instant and makes every rejected write a lie somebody already read.
|
|
320
|
+
- The event last, after memory, because a subscriber woken by it reads
|
|
321
|
+
immediately. An event emitted before the memory update is a wake-up to the old
|
|
322
|
+
value.
|
|
323
|
+
|
|
324
|
+
Where there is no kernel — a server that binds its own signals and closes what
|
|
325
|
+
it holds in an order it wrote — open it directly instead:
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
const opened = await openKeyspace(sessions, { backend });
|
|
329
|
+
opened.keyspace.get(id); // synchronous, from memory
|
|
330
|
+
// on shutdown, in the order you chose:
|
|
331
|
+
opened.stopAdmission();
|
|
332
|
+
await opened.drain();
|
|
333
|
+
await opened.close();
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
The resource is a thin wrapper over exactly that, so there is one implementation
|
|
337
|
+
and two lifecycles, not two keyspaces.
|
|
338
|
+
|
|
339
|
+
Where there **is** a kernel it is a **resource**, read with `context.use(...)`,
|
|
340
|
+
rather than a function you call wherever you need it. The kernel resolves its resource graph in the constructor
|
|
341
|
+
and cannot register one afterwards, so a keyspace opened by a bare call inside
|
|
342
|
+
another resource's `start` is never drained, never closed, and never ordered
|
|
343
|
+
against the things that write to it.
|
|
344
|
+
|
|
345
|
+
"Durable" means the backend's `put` resolved. It does **not** mean `fsync` —
|
|
346
|
+
SQLite in WAL mode with `synchronous = NORMAL` returns success before the data
|
|
347
|
+
reaches the disk. What an acknowledgement is worth is the backend's to state and
|
|
348
|
+
yours to configure. In the same spirit, a keyspace that closes with writes still
|
|
349
|
+
queued reports how many through `onUnwritten`, because a graceful close is
|
|
350
|
+
deadline-bounded and a forced one can cut a drain short.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## The trust fence
|
|
355
|
+
|
|
356
|
+
Compare the authority a request addressed against a list you declared, and refuse
|
|
357
|
+
before anything is dispatched.
|
|
358
|
+
|
|
359
|
+
```ts
|
|
360
|
+
import { createTrustFence } from 'stitchkit/server';
|
|
361
|
+
|
|
362
|
+
const fence = createTrustFence({
|
|
363
|
+
trustedHosts: ['app.internal', 'localhost:5180', '192.168.1.10:5180'],
|
|
364
|
+
logger,
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
createServer({
|
|
368
|
+
services,
|
|
369
|
+
hooks: composeLifecycleHooks(fence.hooks, applicationHooks),
|
|
370
|
+
socket: { io, allowRequest: fence.allowRequest },
|
|
371
|
+
});
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### A UI on one port, an API on the next
|
|
375
|
+
|
|
376
|
+
The most ordinary arrangement in development is also the one the fence refuses by
|
|
377
|
+
default: a UI dev server on `:5180` calling an API on `:5181`. The browser sends
|
|
378
|
+
`Origin: http://localhost:5180` to `Host: localhost:5181`, they differ, and both
|
|
379
|
+
lanes answer 403. Declare the second origin:
|
|
380
|
+
|
|
381
|
+
```ts
|
|
382
|
+
createTrustFence({
|
|
383
|
+
trustedHosts: ['localhost:5181'],
|
|
384
|
+
trustedOrigins: ['localhost:5180'],
|
|
385
|
+
});
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Same entry format as `trustedHosts`, compared against the `Origin`'s authority.
|
|
389
|
+
Declaring one does not widen anything else: an undeclared origin is still
|
|
390
|
+
refused, and `trustedHosts` still decides which authority the server answers on.
|
|
391
|
+
|
|
392
|
+
It is worth knowing what the `Origin` check is for, because it is not what most
|
|
393
|
+
people assume. It is **not** the DNS-rebinding defence — that attack is
|
|
394
|
+
same-origin by construction, so it sends a matching `Origin` or none at all, and
|
|
395
|
+
`trustedHosts` is what refuses it. What the `Origin` check stops is a plain
|
|
396
|
+
cross-origin request from a page that never needs to read the reply: CORS governs
|
|
397
|
+
whether a response can be *read*, never whether the request is *sent*, so a
|
|
398
|
+
state-changing endpoint is reachable without it.
|
|
399
|
+
|
|
400
|
+
### Install **both** halves
|
|
401
|
+
|
|
402
|
+
`fence.hooks` fences HTTP. `fence.allowRequest` fences the Socket.IO lane — and
|
|
403
|
+
that lane never reaches `hooks.onRequest` on either runtime: on Bun the fetch
|
|
404
|
+
handler answers the socket prefix before the contract handler exists, and on Node
|
|
405
|
+
`socket.attach` hands the upgrade to Socket.IO directly. A fence installed only
|
|
406
|
+
in `hooks` leaves open the lane a live application pushes its data over.
|
|
407
|
+
|
|
408
|
+
Order matters too: `composeLifecycleHooks` stops at the first hook that answers,
|
|
409
|
+
so the fence goes **first**. Behind a hook that returns a maintenance page, it
|
|
410
|
+
never runs.
|
|
411
|
+
|
|
412
|
+
### What it does not do
|
|
413
|
+
|
|
414
|
+
- **It does not gate operations.** "Only from this machine" is a property of an
|
|
415
|
+
operation, and an operation is known after routing, not before it. Write it as
|
|
416
|
+
an auth rule over `ctx.ipAddress` — `isLoopbackAddress` is exported for
|
|
417
|
+
exactly that — where it composes with your other rules.
|
|
418
|
+
- **It does not re-check an open connection.** Both lanes check at admission.
|
|
419
|
+
- **It does not see an `OPTIONS` preflight** when `cors` is configured; that is
|
|
420
|
+
answered earlier. The preflight carries no operation and no body, and the
|
|
421
|
+
DNS-rebinding attack the fence exists for is same-origin and sends none.
|
|
422
|
+
|
|
423
|
+
An entry is `host` or `host:port` — no scheme, no path, no wildcard — and an
|
|
424
|
+
entry that is not a readable authority stops startup naming itself, rather than
|
|
425
|
+
quietly matching nothing. There is no implicit `localhost`: list it when you want
|
|
426
|
+
it.
|
|
427
|
+
|
|
428
|
+
Every refusal answers the same bare 403. A response that said *which* rule
|
|
429
|
+
refused would let a caller learn your trusted list one guess at a time; the
|
|
430
|
+
reason goes to `onRefused` and the log, where you are.
|
|
431
|
+
|
|
432
|
+
### One thing that changed
|
|
433
|
+
|
|
434
|
+
A route group can no longer declare `onRequest`. It never worked — the framework
|
|
435
|
+
dispatched only the server-level hook — and it could not be made to work without
|
|
436
|
+
matching group prefixes a second time, ahead of the real router. Use the
|
|
437
|
+
server-level `hooks.onRequest` to refuse before dispatch, or the group's
|
|
438
|
+
`authorize` to gate once the endpoint is known.
|
|
439
|
+
|
|
440
|
+
==============================================================================
|
|
441
|
+
# API reference: `stitchkit/live` (docs/api/reference.md)
|
|
442
|
+
==============================================================================
|
|
443
|
+
|
|
444
|
+
## `stitchkit/live`
|
|
445
|
+
|
|
446
|
+
**Evolving.** Browser-and-server-safe declarations for the things that change while a caller is
|
|
447
|
+
watching: announcements, and reads the server re-runs. It owns no transport — the wire is the
|
|
448
|
+
realtime contract from `stitchkit`, and the server halves live in `stitchkit/application`.
|
|
449
|
+
→ [ADR 0150](../decisions/0150-an-event-declaration-projects-onto-the-socket-we-already-run.md),
|
|
450
|
+
[ADR 0153](../decisions/0153-a-watched-read-is-one-read-per-question.md).
|
|
451
|
+
|
|
452
|
+
| Export | Kind | Summary |
|
|
453
|
+
|--------|------|---------|
|
|
454
|
+
| `defineEvents` | function | declare topics: a wire name, one payload schema and how the topic is delivered to in-process listeners |
|
|
455
|
+
| `toRealtimeContract` | function | project a declaration onto `RealtimeContract`, so the existing validated socket carries it |
|
|
456
|
+
| `EventDeliveryMode` | _type_ | `emit` / `serial` / `decision` — how a topic reaches its in-process listeners |
|
|
457
|
+
| `PolicyDecision` / `UndecidedOutcome` | _types_ | one voter's `allow` / `deny` / `defer`, and what a run settles on when every voter defers — the same two types the decision pipeline in `stitchkit/application` uses, because a listener voting on an event and a policy voting on a request are answering the same question |
|
|
458
|
+
| `EventTopicDeclaration` / `EventTopicRegistry` / `EventsConfig` / `EventsDeclaration` | _types_ | one topic's schema, mode, `whenAllDefer` and `listenerTimeoutMs`, and the declaration they compose into |
|
|
459
|
+
| `EventPayloads` / `EventTopicsOfMode` / `WireTopic` | _types_ | payload map keyed by wire topic, the topics of one mode, and the `prefix.name` a topic is addressed by |
|
|
460
|
+
| `createWatchClient` | function | contract-shaped watch client: `watch.action(args)` returns a ref-counted handle sharing one subscription |
|
|
461
|
+
| `WatchHandle` / `WatchListeners` / `WatchClientConfig` / `WatchTransport` / `TypedWatchClient` | _types_ | subscribe/close, the value and state listeners, hold window and open deadline, and the bound realtime client it rides |
|
|
462
|
+
| `watchTransport` / `RealtimeClientLike` / `WatchInboundEvents` | function / _types_ | hands a bound realtime client to a watch client — two generic signatures TypeScript will not relate, converted once here |
|
|
463
|
+
| `watchContract` | const | the four-event realtime contract a watched read travels on |
|
|
464
|
+
| `WATCH_OPEN` / `WATCH_CLOSE` / `WATCH_VALUE` / `WATCH_STATE` | const | the event names of that contract |
|
|
465
|
+
| `WatchKey` / `WatchKeySchema` / `watchKeyString` | type / schema / function | `(service, action, arguments digest)` — the identity both ends compute the same way |
|
|
466
|
+
| `WatchValueFrame` / `WatchValueSchema` / `WatchStateFrame` / `WatchStateSchema` | _types_ | one answer — `full`, `delta` or `unchanged`, with its monotonic revision and fingerprint — and a phase from `LiveStatePhase` with the read's own code and message |
|
|
467
|
+
| `WatchHave` / `WatchHaveSchema` | type / schema | what a reconnecting subscriber already holds, offered on `open`: a revision and the fingerprint that proves it |
|
|
468
|
+
| `WatchDelta` / `WatchDeltaSchema` / `WatchArrayOp` / `WatchArrayOpSchema` | _types_ / schemas | a structural difference over parsed JSON — objects by changed and dropped key, arrays by runs copied from the previous value |
|
|
469
|
+
| `watchDiff` / `applyWatchDelta` / `watchDeltaWins` | functions | build a difference (`undefined` when equal), rebuild the value from one (throws rather than inventing), and whether it is actually smaller than the value |
|
|
470
|
+
|
|
471
|
+
---
|
package/llms/node.txt
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# stitchkit/node — stitchkit docs slice
|
|
2
|
+
|
|
3
|
+
> Generated from the `docs/` tree by `bun run gen:llms`. The index of all slices is
|
|
4
|
+
> `llms.txt` in this package.
|
|
5
|
+
|
|
6
|
+
Contains: API reference: `stitchkit/node` (docs/api/reference.md)
|
|
7
|
+
|
|
8
|
+
Also read:
|
|
9
|
+
- see `llms/server.txt` for the HTTP server guide
|
|
10
|
+
- see `llms/server.txt` for the Realtime guide
|
|
11
|
+
- see `llms/server.txt` for the Auth & errors guide
|
|
12
|
+
- see `llms/testing.txt` for the Testing & deployment guide
|
|
13
|
+
|
|
14
|
+
==============================================================================
|
|
15
|
+
# API reference: `stitchkit/node` (docs/api/reference.md)
|
|
16
|
+
==============================================================================
|
|
17
|
+
|
|
18
|
+
## `stitchkit/node`
|
|
19
|
+
|
|
20
|
+
Server-only, for Node ≥ 22 (Bun uses `stitchkit/server`). The runtime-agnostic
|
|
21
|
+
core plus a Node HTTP adapter — [ADR 0013](../decisions/0013-runtime-agnostic-core.md),
|
|
22
|
+
[deployment guide](../guide/testing-and-deployment.md#deploy-on-node). Re-exports the
|
|
23
|
+
runtime-agnostic pieces of `stitchkit/server` and the error helpers.
|
|
24
|
+
|
|
25
|
+
| Export | Kind | Summary |
|
|
26
|
+
|--------|------|---------|
|
|
27
|
+
| `serveNode` | function | build the router and start a Node HTTP server (via `srvx`) |
|
|
28
|
+
| `createHandler` | function | the router as a bare `(req) => Response` (same as `/server`) |
|
|
29
|
+
| `createSocketIOServer` | function | the typed Node Socket.IO server (`io` + `attach`; no Bun engine declarations) |
|
|
30
|
+
| `createUnixClientTransport` | function | the same fail-closed Bun/Node Unix client adapter exported by `stitchkit/server` |
|
|
31
|
+
| `implement` / `createImplement` / `createScopedImplement` / `createScopedImplementRegistry` / `createMultipartStream` | function | bind a contract to typed handlers, optionally typed per endpoint scope (same as `/server`) |
|
|
32
|
+
| `NodeServerConfig` | _type_ | config for `serveNode` |
|
|
33
|
+
| `NodeServerHandle` | _type_ | managed Node handle (`url`, `port`, `runtime`, `status`, `shutdown`) |
|
|
34
|
+
| `NodeRuntimeServer` | _type_ | concrete `srvx/node` runtime escape hatch |
|
|
35
|
+
| `NodeSocketLifecycle` | _type_ | Bun-free Socket.IO lifecycle accepted by `serveNode` |
|
|
36
|
+
| `HandlerConfig` / `ServiceDef` / `RawRoute` / `RawRouteContext` | _type_ | runtime-neutral handler types; raw routes default their host server to `unknown` and may declare stable `serviceName` / `action` observability identity |
|
|
37
|
+
| `SocketIORequestPolicy` / `SocketIOServerConfig` / `SocketIOPeerLoaders` / `SocketIOServerHandle` | _type_ | runtime-neutral handshake policy, config, optional-peer loaders and the Bun-free Node handle with `io`, `attach` and lifecycle |
|
|
38
|
+
| `UnixClientTransportConfig` / `UnixClientTransport` | _type_ | Unix socket bounds, explicit response-body mode and owned Fetch-compatible handle |
|
|
39
|
+
| `UnixResponseBodyMode` | _type_ | finite cumulative `bounded` mode or explicit pull-driven `streaming` mode |
|
|
40
|
+
| `UnixClientTransportError` / `UnixClientTransportErrorCode` / `UnixClientDeliveryState` | class / _type_ | stable failure plus dispatch certainty; no cross-transport fallback |
|
|
41
|
+
| `AppError` + `appError` / `badRequest` / `unauthorized` / `forbidden` / `notFound` / `conflict` / `rateLimited` | — | error helpers (same as `/contract`) |
|
|
42
|
+
|
|
43
|
+
---
|
package/llms/oauth.txt
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# stitchkit/oauth — stitchkit docs slice
|
|
2
|
+
|
|
3
|
+
> Generated from the `docs/` tree by `bun run gen:llms`. The index of all slices is
|
|
4
|
+
> `llms.txt` in this package.
|
|
5
|
+
|
|
6
|
+
Contains: Guide: OAuth & OpenID Connect (docs/guide/oauth.md) · API reference: `stitchkit/oauth` (docs/api/reference.md)
|
|
7
|
+
|
|
8
|
+
==============================================================================
|
|
9
|
+
# Guide: OAuth & OpenID Connect (docs/guide/oauth.md)
|
|
10
|
+
==============================================================================
|
|
11
|
+
|
|
12
|
+
# Browser OAuth and Google OIDC
|
|
13
|
+
|
|
14
|
+
Stitchkit separates the browser's Authorization Code + PKCE transaction from the server's
|
|
15
|
+
provider credential verification. The application still owns navigation, users, account matching
|
|
16
|
+
and merge policy, persistence, sessions, roles, unlink policy and UI.
|
|
17
|
+
|
|
18
|
+
## Supported profile
|
|
19
|
+
|
|
20
|
+
The current Google adapter supports one explicit profile: **web OpenID Connect Authorization Code
|
|
21
|
+
with PKCE**. A browser performs a top-level redirect, an application backend exchanges the
|
|
22
|
+
one-time code, and Stitchkit returns a verified identity. It is the redirect-based sign-in path;
|
|
23
|
+
it is not a generic name for every Google identity or authorization mechanism.
|
|
24
|
+
|
|
25
|
+
Keep adjacent Google capabilities separate because their credentials, lifecycle and trust
|
|
26
|
+
boundaries differ:
|
|
27
|
+
|
|
28
|
+
| Capability | Credential/result | Stitchkit support |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| Web OIDC Authorization Code + PKCE | verified user identity | `stitchkit/oauth` + `stitchkit/google` |
|
|
31
|
+
| Google Identity Services button, One Tap or FedCM | browser-delivered ID credential | not implemented |
|
|
32
|
+
| Incremental authorization for Drive, Calendar or other Google APIs | access/refresh tokens and granted scopes | not implemented |
|
|
33
|
+
| Installed Android, iOS or desktop application | platform client and system-browser callback | not implemented |
|
|
34
|
+
| Limited-input/device authorization | device/user codes and polling lifecycle | not implemented |
|
|
35
|
+
| Service account or workload identity | application identity, possibly domain-wide delegation | not implemented |
|
|
36
|
+
|
|
37
|
+
Do not add these as mode flags to `GoogleOidcClient`. Each future capability gets its own adapter
|
|
38
|
+
and result type, while the provider-neutral PKCE transaction can be reused where its protocol
|
|
39
|
+
actually applies. In particular, authentication establishes the person; authorization to Google
|
|
40
|
+
APIs is requested later, in product context, and owns refresh-token persistence and revocation.
|
|
41
|
+
|
|
42
|
+
## Browser transaction
|
|
43
|
+
|
|
44
|
+
`stitchkit/oauth` is browser-safe and provider-neutral. It creates independent 32-byte `state`,
|
|
45
|
+
`nonce` and PKCE verifier values, writes one versioned transaction to caller-provided storage and
|
|
46
|
+
returns the authorization URL without navigating:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { createAuthorizationCodeClient, safeInternalReturnPath } from 'stitchkit/oauth'
|
|
50
|
+
import { z } from 'zod'
|
|
51
|
+
|
|
52
|
+
const oauth = createAuthorizationCodeClient({
|
|
53
|
+
authorizationEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
54
|
+
clientId,
|
|
55
|
+
redirectUri: `${window.location.origin}/auth/google/callback`,
|
|
56
|
+
scopes: ['openid', 'email', 'profile'],
|
|
57
|
+
storage: window.sessionStorage,
|
|
58
|
+
storageKey: 'app:google:oauth',
|
|
59
|
+
contextSchema: z.object({ mode: z.enum(['login', 'link']), returnTo: z.string() }),
|
|
60
|
+
authorizationParameters: { prompt: 'select_account' },
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
const { authorizationUrl } = await oauth.begin({
|
|
64
|
+
context: { mode: 'login', returnTo: '/account' },
|
|
65
|
+
})
|
|
66
|
+
window.location.assign(authorizationUrl)
|
|
67
|
+
|
|
68
|
+
// In the callback route. Reading is one-shot even when validation fails.
|
|
69
|
+
const pending = oauth.consume({ state: new URL(location.href).searchParams.get('state') ?? '' })
|
|
70
|
+
const returnTo = safeInternalReturnPath(pending.context.returnTo, '/')
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Provider parameters cannot replace protocol-owned fields. `consume` removes the pending value
|
|
74
|
+
before parsing, version checking, context validation or state comparison, so a malformed callback
|
|
75
|
+
and a React Strict Mode replay cannot reuse it. Errors expose a stable
|
|
76
|
+
`AuthorizationCodeClientError.code` and never include transaction contents.
|
|
77
|
+
|
|
78
|
+
Token exchange, ID-token verification, credential persistence and application identity do not
|
|
79
|
+
belong to this browser entrypoint.
|
|
80
|
+
|
|
81
|
+
## Google server adapter
|
|
82
|
+
|
|
83
|
+
Install the optional peer only in an application that imports `stitchkit/google`:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
bun add google-auth-library
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import { createGoogleOidcClient } from 'stitchkit/google'
|
|
91
|
+
|
|
92
|
+
const google = createGoogleOidcClient({
|
|
93
|
+
clientId: env.GOOGLE_CLIENT_ID,
|
|
94
|
+
clientSecret: env.GOOGLE_CLIENT_SECRET,
|
|
95
|
+
allowedRedirectUris: [env.GOOGLE_WEB_CALLBACK, env.GOOGLE_LOOPBACK_CALLBACK],
|
|
96
|
+
timeoutMs: 10_000,
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
const identity = await google.exchangeAuthorizationCode({
|
|
100
|
+
code,
|
|
101
|
+
codeVerifier: pending.codeVerifier,
|
|
102
|
+
redirectUri: pending.redirectUri,
|
|
103
|
+
nonce: pending.nonce,
|
|
104
|
+
})
|
|
105
|
+
// { subject, email, name?, picture? }
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The redirect must match the immutable allowlist exactly before any outbound call. The token
|
|
109
|
+
exchange is bounded by an abort deadline; `google-auth-library` verifies the ID-token signature,
|
|
110
|
+
issuer, audience and expiry. Stitchkit additionally requires `sub`, a valid verified email and an
|
|
111
|
+
exact nonce. Access, refresh and raw ID tokens never leave the adapter.
|
|
112
|
+
|
|
113
|
+
`GoogleOidcError.code` distinguishes `MISCONFIGURED`, `INVALID_CREDENTIAL` and
|
|
114
|
+
`UPSTREAM_UNAVAILABLE` with fixed safe messages. Endpoints compose their own rate limiter and then
|
|
115
|
+
map the verified identity into application-owned user/session policy. Offline access, Google API
|
|
116
|
+
scopes, database writes, user lookup or merging, session rotation, roles and UI remain outside the
|
|
117
|
+
adapter.
|
|
118
|
+
|
|
119
|
+
==============================================================================
|
|
120
|
+
# API reference: `stitchkit/oauth` (docs/api/reference.md)
|
|
121
|
+
==============================================================================
|
|
122
|
+
|
|
123
|
+
## `stitchkit/oauth`
|
|
124
|
+
|
|
125
|
+
Browser-safe, provider-neutral Authorization Code + PKCE transaction mechanics. Navigation,
|
|
126
|
+
token exchange, identity and sessions remain application-owned. See the [OAuth guide](../guide/oauth.md).
|
|
127
|
+
|
|
128
|
+
| Export | Kind | Summary |
|
|
129
|
+
|--------|------|---------|
|
|
130
|
+
| `createAuthorizationCodeClient` / `AuthorizationCodeClient` / `AuthorizationCodeClientConfig` | function / _type_ | begin one S256 authorization request and consume its versioned pending transaction exactly once |
|
|
131
|
+
| `BeginAuthorizationCodeInput` / `BeginAuthorizationCodeResult` / `ConsumeAuthorizationCodeInput` / `ConsumedAuthorizationCode` | _type_ | inputs and safe protocol result around caller-validated context |
|
|
132
|
+
| `AuthorizationCodeStorage` / `AuthorizationCodeCrypto` | _type_ | injected browser capabilities; neither is read at module initialisation |
|
|
133
|
+
| `AuthorizationCodeClientError` / `AuthorizationCodeClientErrorCode` | class / _type_ | fixed safe failure codes for configuration, context, storage, transaction and state failures |
|
|
134
|
+
| `safeInternalReturnPath` | function | accept only a single-slash current-origin path without backslashes or ASCII controls |
|
|
135
|
+
|
|
136
|
+
---
|