@sema-agent/server 7.147.0 → 7.149.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/MIGRATION.md +1468 -24
- package/README.md +35 -7
- package/README.zh-CN.md +18 -8
- package/USAGE.md +444 -193
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/approval-card.d.ts +36 -38
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-leg-origin.d.ts +33 -0
- package/dist/approval-leg-origin.js +4 -0
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +9 -15
- package/dist/auth-bridge.js +4 -11
- package/dist/auth-keys.d.ts +10 -1
- package/dist/auth-keys.js +8 -0
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +47 -42
- package/dist/boot/execution-lane.d.ts +6 -4
- package/dist/boot/execution-lane.js +3 -1
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-delivery.d.ts +3 -2
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +60 -70
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +14 -5
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -0
- package/dist/boot/stage-01-config.js +13 -4
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +16 -3
- package/dist/boot/stage-03-store-backend.d.ts +4 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +8 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +12 -13
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +13 -9
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +13 -9
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +14 -16
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +14 -16
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +6 -0
- package/dist/boot/stores.js +41 -27
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +39 -11
- package/dist/capability-facts.js +35 -7
- package/dist/card-settle-stored-scope.d.ts +56 -0
- package/dist/card-settle-stored-scope.js +27 -0
- package/dist/card-void.d.ts +8 -13
- package/dist/card-void.js +2 -7
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +28 -1
- package/dist/config-catalog.js +95 -85
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +43 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +62 -21
- package/dist/config.d.ts +14 -21
- package/dist/config.js +141 -64
- package/dist/context-window-notice.d.ts +31 -0
- package/dist/context-window-notice.js +28 -0
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +46 -11
- package/dist/deployment-shape.js +8 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-name-allowlist-knobs.d.ts +6 -5
- package/dist/env-name-allowlist-knobs.js +5 -0
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +25 -23
- package/dist/execution-lane-caps.js +18 -26
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/command-spawn.d.ts +7 -2
- package/dist/hooks/command-spawn.js +13 -6
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +72 -57
- package/dist/hooks/hook-runner.js +271 -193
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +76 -79
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +56 -31
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +16 -8
- package/dist/http/claimed-run.js +8 -0
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +78 -30
- package/dist/http/durable-run-leg.d.ts +11 -4
- package/dist/http/durable-run-leg.js +45 -21
- package/dist/http/execution-context.d.ts +122 -47
- package/dist/http/execution-context.js +135 -43
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +392 -67
- package/dist/http/owner-access.js +370 -35
- package/dist/http/principal-gate.d.ts +39 -89
- package/dist/http/principal-gate.js +26 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +46 -12
- package/dist/http/resume-ctx-read.js +31 -6
- package/dist/http/resume-legs.d.ts +54 -19
- package/dist/http/resume-legs.js +408 -196
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +31 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +60 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +73 -67
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +16 -19
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +29 -3
- package/dist/http/routes/diagnostics.js +49 -18
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +4 -2
- package/dist/http/routes/principal-inbox.js +5 -4
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +155 -237
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +28 -7
- package/dist/http/routes/session-sync.js +63 -50
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +237 -187
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +43 -45
- package/dist/http/server.js +61 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +17 -8
- package/dist/http/submit-ctx.js +8 -5
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/leg-facts.d.ts +7 -2
- package/dist/leg-facts.js +1 -0
- package/dist/local-store-declaration.d.ts +54 -0
- package/dist/local-store-declaration.js +59 -0
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/mcp-assertion-header.js +1 -1
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-project-layer.js +1 -1
- package/dist/memory-scope.d.ts +33 -6
- package/dist/memory-scope.js +68 -19
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +8 -5
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +57 -0
- package/dist/model-context-window.js +21 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +40 -20
- package/dist/model-entry-refusal.js +57 -30
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-reach-scope.d.ts +2 -1
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +72 -40
- package/dist/observability/fail-open.js +74 -40
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +4 -5
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +6 -2
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +36 -10
- package/dist/org-delivery-gate.js +12 -8
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +532 -0
- package/dist/owner-faces.js +126 -0
- package/dist/park-row-commit.d.ts +67 -0
- package/dist/park-row-commit.js +76 -0
- package/dist/parked-decide.d.ts +76 -12
- package/dist/parked-decide.js +152 -11
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +7 -9
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +3 -25
- package/dist/plugins/adoption-log-sql.js +23 -21
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
- package/dist/plugins/approval-ask-store-sql.js +44 -15
- package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
- package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
- package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
- package/dist/plugins/approval-exemption-skill-m46.js +21 -0
- package/dist/plugins/approval-exemption-store.d.ts +32 -2
- package/dist/plugins/approval-exemption-store.js +42 -19
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
- package/dist/plugins/ensure-schema-lock-policy.js +76 -9
- package/dist/plugins/file-run-store.d.ts +85 -32
- package/dist/plugins/file-run-store.js +177 -94
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +62 -23
- package/dist/plugins/local-checkpoint-store.js +197 -77
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-data-root-admission.d.ts +52 -0
- package/dist/plugins/local-data-root-admission.js +100 -0
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +29 -6
- package/dist/plugins/local-engine-high-water.js +27 -19
- package/dist/plugins/local-session-store.d.ts +458 -140
- package/dist/plugins/local-session-store.js +906 -292
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +53 -36
- package/dist/plugins/memory-run-store.js +116 -88
- package/dist/plugins/one-time-migration-marker.d.ts +26 -0
- package/dist/plugins/one-time-migration-marker.js +13 -0
- package/dist/plugins/one-time-migrations.d.ts +214 -47
- package/dist/plugins/one-time-migrations.js +481 -135
- package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
- package/dist/plugins/org-delivery-quota-store.js +31 -15
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
- package/dist/plugins/permission-rule-store-sql.js +11 -95
- package/dist/plugins/pg-pool.d.ts +2 -32
- package/dist/plugins/pg-pool.js +24 -17
- package/dist/plugins/remote-env-device.d.ts +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +8 -32
- package/dist/plugins/remote-env-e2b.js +44 -32
- package/dist/plugins/remote-env-host.d.ts +51 -17
- package/dist/plugins/remote-env-host.js +111 -42
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +111 -60
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +352 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +82 -75
- package/dist/plugins/run-store-sql.js +164 -125
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +131 -14
- package/dist/plugins/schema-consistency.js +388 -18
- package/dist/plugins/schema-drift-sentence.d.ts +10 -6
- package/dist/plugins/schema-drift-sentence.js +15 -7
- package/dist/plugins/schema-ensure-legs.d.ts +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +27 -20
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
- package/dist/plugins/stop-then-start-sentence.js +7 -0
- package/dist/plugins/store-backend.d.ts +99 -16
- package/dist/plugins/store-backend.js +230 -65
- package/dist/plugins/store-contracts.d.ts +123 -33
- package/dist/plugins/store-contracts.js +38 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.d.ts +11 -6
- package/dist/plugins/tidb-pool.js +39 -18
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/plugins/workspace-custody.d.ts +44 -0
- package/dist/plugins/workspace-custody.js +47 -0
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/project-identity.d.ts +8 -7
- package/dist/project-identity.js +40 -17
- package/dist/project-layer-key.d.ts +13 -2
- package/dist/project-layer-key.js +9 -1
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-deny-floor-notice.d.ts +36 -0
- package/dist/read-deny-floor-notice.js +40 -0
- package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
- package/dist/request-declaration-disposition.js +39 -0
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-cancel-card.d.ts +28 -0
- package/dist/run-cancel-card.js +19 -0
- package/dist/run-cancel-context.d.ts +10 -0
- package/dist/run-cancel-context.js +1 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +117 -90
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +56 -21
- package/dist/runs.js +73 -43
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +55 -25
- package/dist/server-secret-env.js +75 -22
- package/dist/session-agent.d.ts +3 -2
- package/dist/session-children-retire.d.ts +13 -8
- package/dist/session-children-retire.js +9 -7
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +3 -3
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-admission.d.ts +33 -0
- package/dist/store-admission.js +49 -0
- package/dist/store-posture.d.ts +141 -20
- package/dist/store-posture.js +205 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +78 -49
- package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
- package/dist/stores-sql/file-history-store-sql.js +3 -5
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +4 -6
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +3 -8
- package/dist/task-a2a.js +28 -30
- package/dist/task-cwd.d.ts +43 -7
- package/dist/task-cwd.js +11 -0
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +4 -4
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +19 -7
- package/dist/terminal.d.ts +27 -43
- package/dist/terminal.js +49 -14
- package/dist/tool-approval.d.ts +173 -163
- package/dist/tool-approval.js +247 -232
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/engine-notice-wire.d.ts +24 -21
- package/dist/trace/engine-notice-wire.js +7 -3
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +4 -31
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +59 -44
- package/dist/trace/project.js +60 -26
- package/dist/trace/redact.d.ts +135 -27
- package/dist/trace/redact.js +884 -260
- package/dist/trace/self-minted-wire.d.ts +567 -20
- package/dist/trace/self-minted-wire.js +205 -24
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +33 -23
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/docs/error-text-lexicon.json +317 -0
- package/package.json +8 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/scripts/embed-minimal.mjs +183 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/wire-changes/server@7.149.0.json +372 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
- package/dist/plain-string-record.js +0 -70
|
@@ -6,12 +6,19 @@
|
|
|
6
6
|
* call still reads the originating principal. Absent store = unattributed (dev / no principal).
|
|
7
7
|
*/
|
|
8
8
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
9
|
-
|
|
10
|
-
/**
|
|
9
|
+
import { type Person, type Subject } from "../owner-brands.js";
|
|
10
|
+
/**
|
|
11
|
+
* 场景子命名空间:ALS 带**主体**(分区键),不带人 —— 读者有两种:记账三写口(成本 / 用量批报 / 租约)读人({@link currentPerson} = `personOf(主体)`),
|
|
12
|
+
* leader 子任务的 spec 读分区(`leader/wire.ts` 经引擎交界一处铸身份格)。只带人会让 leader 子任务丢分区;只带主体、人现解码,两种读者各取一格。
|
|
13
|
+
*/
|
|
14
|
+
export declare const principalContext: AsyncLocalStorage<Subject>;
|
|
15
|
+
/** 这次执行的记账身份钉表;不在任何 {@link withSubject} 作用域里 ⇒ `undefined`(记账按此刻身份)。 */
|
|
11
16
|
export declare function currentExecutionPins(): Map<object, string> | undefined;
|
|
12
|
-
/** Run `fn` with `
|
|
13
|
-
*
|
|
14
|
-
export declare function
|
|
15
|
-
/** The
|
|
16
|
-
export declare function
|
|
17
|
+
/** Run `fn` with `subject` as the ambient context (a no-op wrapper when the subject is undefined — the outer
|
|
18
|
+
* subject, if any, stays). [ref]: also opens the execution's accounting-pin scope when none is open yet (nested calls share it). */
|
|
19
|
+
export declare function withSubject<T>(subject: Subject | undefined, fn: () => T): T;
|
|
20
|
+
/** The subject (partition key) the current async execution runs in, if any. */
|
|
21
|
+
export declare function currentSubject(): Subject | undefined;
|
|
22
|
+
/** The person the current async execution is attributed to (cost / usage / lease accounting) = the person behind {@link currentSubject}. */
|
|
23
|
+
export declare function currentPerson(): Person | undefined;
|
|
17
24
|
//# sourceMappingURL=principal-context.d.ts.map
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { personOf } from "../owner-brands.js";
|
|
2
3
|
export const principalContext = new AsyncLocalStorage();
|
|
3
4
|
const executionPins = new AsyncLocalStorage();
|
|
4
5
|
export function currentExecutionPins() {
|
|
5
6
|
return executionPins.getStore();
|
|
6
7
|
}
|
|
7
|
-
export function
|
|
8
|
-
const run = () => (
|
|
8
|
+
export function withSubject(subject, fn) {
|
|
9
|
+
const run = () => (subject ? principalContext.run(subject, fn) : fn());
|
|
9
10
|
return executionPins.getStore() !== undefined ? run() : executionPins.run(new Map(), run);
|
|
10
11
|
}
|
|
11
|
-
export function
|
|
12
|
+
export function currentSubject() {
|
|
12
13
|
return principalContext.getStore();
|
|
13
14
|
}
|
|
15
|
+
export function currentPerson() {
|
|
16
|
+
const subject = principalContext.getStore();
|
|
17
|
+
return subject === undefined ? undefined : personOf(subject);
|
|
18
|
+
}
|
|
14
19
|
//# sourceMappingURL=principal-context.js.map
|
|
@@ -86,7 +86,6 @@ export declare function notifyRunTerminal(rec: RunTerminalRecord): void;
|
|
|
86
86
|
* 不抛**:脱敏失败 ⇒ 落固定占位 `«redacted:oversized»`(绝不落原文,也绝不阻断终态翻转),并走既有 fail-open 遥测 tag。
|
|
87
87
|
* 🔴 [ref] 之后这条 throw 臂**照留**(结构性兜底,不依赖「脱敏器今天抛不抛」):它守的是「终态翻转不被一次脱敏异常拦下」,
|
|
88
88
|
* 而脱敏器是一张会长新臂的表 —— 计数 `server.run-terminal.redact-threw` 恒零是证据,不归零就是新形,运维按 detail 回溯。 */
|
|
89
|
-
export declare const OVERSIZED_REDACTION_PLACEHOLDER = "\u00ABredacted:oversized\u00BB";
|
|
90
89
|
/** [ref] 窄范围重扫 [medium]:`redactSecrets` 对 PEM 起始栅栏密集的多 MB 文案**不抛但慢**(实测 1MB 1.4s / 8MB 7.9s 同步阻塞
|
|
91
90
|
* 事件循环),而终态座每次写要扫两遍(appendEvent + setTerminal 入口)、每次读再扫一遍。超过本上限的自由文本**整段**换占位
|
|
92
91
|
* (fail-closed:不截断——截断会把密钥切成半截,[ref] 的病;不扫——O(1)),取证面丢的是「>256KB 的错误文案」这一档。 */
|
|
@@ -263,6 +262,13 @@ export declare function redactTerminalResult<T extends object | null | undefined
|
|
|
263
262
|
* 本函数是**写入口**(结果第一次落盘 ⇒ 折码运维线索 `at=exit`);读面读存量行用 {@link sealStoredRunRowResult}(读座必填)。
|
|
264
263
|
*/
|
|
265
264
|
export declare function sealRunRowResult(result: PersistedTaskResult | null): PersistedTaskResult | null;
|
|
265
|
+
/**
|
|
266
|
+
* run 行 `error_code` 列的**写律**(三只 run 店、写 `result` 的三个写口 —— `setTerminal` / `setSuspended` / `setNeedsReview` —— 同一只):
|
|
267
|
+
* 列 = 落在行上的那份结果(已过 {@link sealRunRowResult})的对外码(core 的唯一派生 `outwardPlane`);没有结果 ⇒ `null`。
|
|
268
|
+
* 列是 run 的 `errorCode` 的**唯一读法**(读面、A2A、审批对账、fleet 都读它),所以停驻行的 `review.pending` 也落在列上。
|
|
269
|
+
* 其余迁移(续跑认领 / 收割 / 接管)把 `result` 写空的同时写自己的码或空,不经本函数。
|
|
270
|
+
*/
|
|
271
|
+
export declare function runRowErrorCodeOf(sealed: PersistedTaskResult | null): string | null;
|
|
266
272
|
/**
|
|
267
273
|
* {@link sealRunRowResult} 的**读入口**(`GET /v1/runs/:id` 的非终态臂读停驻行):同一套封口 + 同一只汇点,只差折码运维线索的观看点 ——
|
|
268
274
|
* 读座必填({@link StoredResultReadSeat}),再观看走 fail-open 纪律(见 `terminal.ts` 的 `sealStoredResult`)。
|
|
@@ -3,8 +3,9 @@ import { redactSecrets } from "../trace/redact.js";
|
|
|
3
3
|
import { isProviderEchoShape } from "@sema-agent/core";
|
|
4
4
|
import { isModelTextLedgerEventType, isParkLedgerEventType } from "../trace/ledger-events.js";
|
|
5
5
|
import { isUnsuccessfulRunStatus } from "../plugins/store-contracts.js";
|
|
6
|
-
import { mapPauseSeats, PAUSE_SEATS, sealResultForExit, sealStoredResult } from "../terminal.js";
|
|
6
|
+
import { mapPauseSeats, outwardPlane, PAUSE_SEATS, sealResultForExit, sealStoredResult } from "../terminal.js";
|
|
7
7
|
import { errorText } from "./err-text.js";
|
|
8
|
+
import { OVERSIZED_REDACTION_PLACEHOLDER } from "../trace/exit-seat.js";
|
|
8
9
|
import { recordFailOpen } from "./fail-open.js";
|
|
9
10
|
import { toolEndMediaAsDescriptors } from "../trace/tool-output-media.js";
|
|
10
11
|
const MESSAGE_CAP = 1024;
|
|
@@ -53,7 +54,6 @@ export function notifyRunTerminal(rec) {
|
|
|
53
54
|
...(rec.elapsedMs !== undefined ? { elapsedMs: rec.elapsedMs } : {}),
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
|
-
export const OVERSIZED_REDACTION_PLACEHOLDER = "«redacted:oversized»";
|
|
57
57
|
export const REDACT_INPUT_CAP = 65_536;
|
|
58
58
|
export const REDACT_OUTPUT_MAX_BYTES = 65_000;
|
|
59
59
|
const OUTPUT_TRUNCATED_MARK = "…[truncated: exceeds store column]";
|
|
@@ -175,6 +175,7 @@ export const RESULT_TEXT_LEAVES = {
|
|
|
175
175
|
"cancelContext.lastEventKind": "verbatim",
|
|
176
176
|
"cancelContext.lastBrainStatus.phase": "verbatim",
|
|
177
177
|
"cancelContext.lastBrainStatus.errClass": "verbatim",
|
|
178
|
+
"readDenyFloor.message": "verbatim",
|
|
178
179
|
};
|
|
179
180
|
const DROP_LEAF = Symbol("drop-leaf");
|
|
180
181
|
function textLeafAct(treatment) {
|
|
@@ -436,6 +437,9 @@ function redactLegacyPlaneLeaves(result) {
|
|
|
436
437
|
export function sealRunRowResult(result) {
|
|
437
438
|
return result === null ? null : redactTerminalResult(sealResultForExit(result));
|
|
438
439
|
}
|
|
440
|
+
export function runRowErrorCodeOf(sealed) {
|
|
441
|
+
return sealed === null ? null : (outwardPlane(sealed.terminal).errorCode ?? null);
|
|
442
|
+
}
|
|
439
443
|
export function sealStoredRunRowResult(result, seat) {
|
|
440
444
|
return result === null ? null : redactTerminalResult(sealStoredResult(result, seat));
|
|
441
445
|
}
|
|
@@ -90,7 +90,7 @@ export declare const SECRET_ENV_SCRUB_SITES: {
|
|
|
90
90
|
};
|
|
91
91
|
readonly "server.hooks.spawn-env": {
|
|
92
92
|
readonly told: "log";
|
|
93
|
-
readonly note: "settings hooks 的命令腿(请求带来的命令跑在宿主上)的 env —— 严格名单(`PATH` / `HOME` / 终端 / locale 等十二名)
|
|
93
|
+
readonly note: "settings hooks 的命令腿(请求带来的命令跑在宿主上)的 env —— 严格名单(`PATH` / `HOME` / 终端 / locale 等十二名)∪ 部署方 `HOOK_ENV_ALLOW` 点名放回的变量,经引擎的 `hostChildEnv` 组合:其余一律不交,本服务自有凭据(名与值副本)任何情况都不交;请求的有效环境层(`settings.env`)作授予叠在上面;请求给工具 shell 的继承词对它不作用";
|
|
94
94
|
readonly remedy: null;
|
|
95
95
|
};
|
|
96
96
|
readonly "server.project-memory.git-subprocess": {
|
|
@@ -20,7 +20,7 @@ export const SECRET_ENV_SCRUB_SITES = {
|
|
|
20
20
|
},
|
|
21
21
|
"server.hooks.spawn-env": {
|
|
22
22
|
told: "log",
|
|
23
|
-
note: "settings hooks 的命令腿(请求带来的命令跑在宿主上)的 env —— 严格名单(`PATH` / `HOME` / 终端 / locale 等十二名)
|
|
23
|
+
note: "settings hooks 的命令腿(请求带来的命令跑在宿主上)的 env —— 严格名单(`PATH` / `HOME` / 终端 / locale 等十二名)∪ 部署方 `HOOK_ENV_ALLOW` 点名放回的变量,经引擎的 `hostChildEnv` 组合:其余一律不交,本服务自有凭据(名与值副本)任何情况都不交;请求的有效环境层(`settings.env`)作授予叠在上面;请求给工具 shell 的继承词对它不作用",
|
|
24
24
|
remedy: null,
|
|
25
25
|
},
|
|
26
26
|
"server.project-memory.git-subprocess": {
|
|
@@ -98,6 +98,7 @@ export declare function isScriptRealmRejection(promise: unknown): boolean;
|
|
|
98
98
|
* message channel for a rejection nobody awaited does not exist anyway.
|
|
99
99
|
*/
|
|
100
100
|
export declare function describeRejectionReason(reason: unknown): string;
|
|
101
|
+
export declare function installScriptRejectionReport(report: (summary: string) => void): void;
|
|
101
102
|
export declare function installScriptRealmRejectionGuard(): void;
|
|
102
103
|
/**
|
|
103
104
|
* The membrane handed to a surface's `buildGlobals` callback to construct the CONTEXT-LOCAL bindings the
|
|
@@ -55,17 +55,23 @@ export function describeRejectionReason(reason) {
|
|
|
55
55
|
return `<unknown typeof ${typeof reason}>`;
|
|
56
56
|
}
|
|
57
57
|
let rejectionGuardInstalled = false;
|
|
58
|
+
let scriptRejectionReport;
|
|
59
|
+
export function installScriptRejectionReport(report) {
|
|
60
|
+
scriptRejectionReport = report;
|
|
61
|
+
}
|
|
58
62
|
export function installScriptRealmRejectionGuard() {
|
|
59
63
|
if (rejectionGuardInstalled)
|
|
60
64
|
return;
|
|
61
65
|
rejectionGuardInstalled = true;
|
|
62
66
|
process.on("unhandledRejection", (reason, promise) => {
|
|
63
67
|
if (isScriptRealmRejection(promise)) {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
const report = scriptRejectionReport;
|
|
69
|
+
if (report !== undefined) {
|
|
70
|
+
try {
|
|
71
|
+
report(describeRejectionReason(reason));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
}
|
|
69
75
|
}
|
|
70
76
|
return;
|
|
71
77
|
}
|
|
@@ -1,18 +1,4 @@
|
|
|
1
1
|
import { type WorkflowScriptRunner } from "@sema-agent/core";
|
|
2
2
|
import { type HardenedVmLimits } from "./hardened-vm-runner.js";
|
|
3
|
-
/**
|
|
4
|
-
* Worker-isolated S8 hard runner ([ref] v2). Runs the hardened-vm membrane inside a `worker_thread`, adding
|
|
5
|
-
* RESOURCE isolation on top of the in-process {@link import("./hardened-vm-runner.js").createHardenedVmRunner}'s
|
|
6
|
-
* BOUNDARY isolation:
|
|
7
|
-
* - HEAP cap (`resourceLimits.maxOldGenerationSizeMb`): a runaway-allocation script OOMs the WORKER (an `error`
|
|
8
|
-
* event), never the shared main process — closes the in-process resource-exhaustion gap.
|
|
9
|
-
* - `terminate()` on wall-clock timeout / abort: kills a MICROTASK-starvation loop (`while(true){await null}`)
|
|
10
|
-
* the in-process wall-clock race cannot pre-empt (it starves its own event loop).
|
|
11
|
-
* - credential isolation: the worker gets only the script + args; `agent`/`log` IPC to the main thread (which
|
|
12
|
-
* holds the real Runner/DB/keys); a (validated-impossible) boundary crossing lands in a credential-free isolate.
|
|
13
|
-
*
|
|
14
|
-
* `safeForUntrustedScripts: true` — the membrane it runs is the conformance-validated + robustness-tested one. Use
|
|
15
|
-
* this (over the in-process runner) for genuinely-untrusted multi-tenant scripts where resource isolation matters.
|
|
16
|
-
*/
|
|
17
3
|
export declare function createWorkerHardenedVmRunner(limits?: HardenedVmLimits): WorkflowScriptRunner;
|
|
18
4
|
//# sourceMappingURL=hardened-vm-worker-runner.d.ts.map
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Worker } from "node:worker_threads";
|
|
2
2
|
import { WorkflowScriptError } from "@sema-agent/core";
|
|
3
3
|
import { scopedPhaseGate, workflowTotalTimeoutMsDefault } from "./hardened-vm-runner.js";
|
|
4
|
+
import { createLogger } from "../observability/logger.js";
|
|
4
5
|
const DEFAULTS = { totalTimeoutMs: workflowTotalTimeoutMsDefault(), syncTimeoutMs: 5_000, maxAgents: 1000, concurrency: 12, maxHeapMb: 128 };
|
|
5
6
|
const IS_TS = import.meta.url.endsWith(".ts");
|
|
6
7
|
const WORKER_URL = new URL(IS_TS ? "./hardened-vm-worker.ts" : "./hardened-vm-worker.js", import.meta.url);
|
|
7
8
|
const WORKER_EXEC_ARGV = IS_TS ? ["--import", "tsx/esm"] : undefined;
|
|
9
|
+
const containedLog = createLogger();
|
|
8
10
|
export function createWorkerHardenedVmRunner(limits = {}) {
|
|
9
11
|
const cfg = { ...DEFAULTS, ...limits };
|
|
10
12
|
return {
|
|
@@ -60,6 +62,9 @@ export function createWorkerHardenedVmRunner(limits = {}) {
|
|
|
60
62
|
else if (msg.type === "log") {
|
|
61
63
|
primitives.log(String(msg.msg));
|
|
62
64
|
}
|
|
65
|
+
else if (msg.type === "scriptRejectionContained") {
|
|
66
|
+
containedLog.warn("unhandled_rejection_script_realm_contained", { reason: String(msg.reason) });
|
|
67
|
+
}
|
|
63
68
|
else if (msg.type === "done") {
|
|
64
69
|
finish(() => resolve({ result: msg.result, meta: (msg.meta ?? { name: "workflow", description: "" }) }));
|
|
65
70
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { parentPort, workerData } from "node:worker_threads";
|
|
2
2
|
import { splitWorkflowMeta } from "@sema-agent/core";
|
|
3
3
|
const ext = import.meta.url.endsWith(".ts") ? "ts" : "js";
|
|
4
|
-
const { runInHardenedVm, orchestrationGlobals } = (await import(`./hardened-vm-runner.${ext}`));
|
|
4
|
+
const { runInHardenedVm, orchestrationGlobals, installScriptRejectionReport } = (await import(`./hardened-vm-runner.${ext}`));
|
|
5
5
|
const port = parentPort;
|
|
6
6
|
if (!port)
|
|
7
7
|
throw new Error("hardened-vm-worker must run inside a worker_thread");
|
|
@@ -26,6 +26,7 @@ port.on("message", (msg) => {
|
|
|
26
26
|
p.rej(e);
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
|
+
installScriptRejectionReport((summary) => port.postMessage({ type: "scriptRejectionContained", reason: summary }));
|
|
29
30
|
const ipcCall = (type, extra) => new Promise((res, rej) => {
|
|
30
31
|
const id = nextId++;
|
|
31
32
|
pending.set(id, { res, rej });
|
|
@@ -217,8 +217,8 @@ export declare const INBOX_SUMMARY_WITHHELD = "[payload over budget: summary wit
|
|
|
217
217
|
/**
|
|
218
218
|
* 一次 workflow 完成 → 入箱条目(`workflow_complete` 家族;启动期投递闭包的**唯一**构造点)。`summary` 在 core 的 notifier seam 上已脱敏 + 限长,这里原样入箱;
|
|
219
219
|
* `completionId`(引擎铸,`WorkflowCompletionPayload` 上在场 iff 引擎给了)逐字落进 `payload` 列 —— 同一次完成的补投帧与 live 帧同一个相关 id,本服务零自铸。
|
|
220
|
-
* `diagnostics`(引擎铸的诊断教学文本,在场 iff 引擎给了)是自由文本:**这里**过出口座(`
|
|
221
|
-
*
|
|
220
|
+
* `diagnostics`(引擎铸的诊断教学文本,在场 iff 引擎给了)是自由文本:**这里**过出口座(`completion-diagnostics-text` 行 —— 与 live `task_notification.diagnostics` **同一行**:同一份脱敏、同一份界、
|
|
221
|
+
* 读者是人的档在行上声明)再落 `payload` 列,drain 逐字带出;店里不放未洗的字节。引擎 notifier seam 递来的已是抹过的文本,座再读一遍是恒等(档的不动点)—— 补投帧与 live 帧的一致不靠上游记得抹。
|
|
222
222
|
*/
|
|
223
223
|
export declare function buildWorkflowCompleteInboxEntry(route: {
|
|
224
224
|
sessionId: string;
|
|
@@ -240,7 +240,7 @@ export declare function buildWorkflowCompleteInboxEntry(route: {
|
|
|
240
240
|
* deterministic `WorkflowStatus` poll is the floor); at-least-once — the shell dedups by runId (two legs racing
|
|
241
241
|
* the same session may double-emit; same contract).
|
|
242
242
|
*
|
|
243
|
-
* 🔒 Tenancy (defence-in-depth over the authorizer's sessionId→owner gate): only entries whose stamped
|
|
243
|
+
* 🔒 Tenancy (defence-in-depth over the authorizer's sessionId→owner gate; the face `inbox.drain` in `owner-faces.ts`): only entries whose stamped
|
|
244
244
|
* `owner` matches `callerPrincipal` are EMITTED — a session deleted-then-reclaimed by a different tenant
|
|
245
245
|
* (which rotates the sessionId→owner binding) can't surface the prior owner's completions. `owner: null`
|
|
246
246
|
* (single-user turnkey) has no tenancy boundary → always emitted. A non-matching entry is a DELIBERATE drop —
|
|
@@ -10,6 +10,7 @@ import { injectionTierOrAbsent } from "../trace/injection-tier.js";
|
|
|
10
10
|
import { semaProvenanceFields } from "../trace/sema-provenance.js";
|
|
11
11
|
import { resupplyFields, sessionBoxCarrierFields, terminalFrameFacetFields } from "../trace/task-notification-facets.js";
|
|
12
12
|
import { ensureDir, taskNotificationDedupKey } from "@sema-agent/core";
|
|
13
|
+
import { keyAdmits, ownerCellOf, recoveredSubject } from "../owner-faces.js";
|
|
13
14
|
export const MAX_PENDING_PER_SESSION = 100;
|
|
14
15
|
export const COMPACT_EVERY = 512;
|
|
15
16
|
export const PURGE_FENCE_MS = 10 * 60 * 1000;
|
|
@@ -316,7 +317,7 @@ export function buildWorkflowCompleteInboxEntry(route, p, enqueuedAt) {
|
|
|
316
317
|
runId: p.runId,
|
|
317
318
|
status: p.status,
|
|
318
319
|
enqueuedAt,
|
|
319
|
-
...encodeWorkflowCompleteExtras(p.summary, { completionId: p.completionId, diagnostics: p.diagnostics ? seatText("
|
|
320
|
+
...encodeWorkflowCompleteExtras(p.summary, { completionId: p.completionId, diagnostics: p.diagnostics ? seatText("completion-diagnostics-text", p.diagnostics) : undefined }, { sessionId: route.sessionId, key: p.runId }),
|
|
320
321
|
};
|
|
321
322
|
}
|
|
322
323
|
export async function emitPendingWorkflowCompletions(inbox, sessionId, callerPrincipal, emit, diag) {
|
|
@@ -338,7 +339,7 @@ export async function emitPendingWorkflowCompletions(inbox, sessionId, callerPri
|
|
|
338
339
|
}
|
|
339
340
|
for (const e of entries) {
|
|
340
341
|
try {
|
|
341
|
-
if (
|
|
342
|
+
if (!keyAdmits("inbox.drain", { subject: recoveredSubject(callerPrincipal), operator: false }, ownerCellOf(e.owner))) {
|
|
342
343
|
await inbox.ack(sessionId, e.runId);
|
|
343
344
|
dlog("workflow_complete_dropped_owner_mismatch", { route: diag?.route, sessionId, runId: e.runId });
|
|
344
345
|
continue;
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
* + 可选 `urgent` 与显示名;不写 `fromSession / fromMode / hopChain`)。本仓不另铸任何记录形。
|
|
16
16
|
* · **限流是配额店的两个原子动作,各管一件事**:`admitAttempt` 记发件人的每一次尝试(碰目录之前;界住刷目录的速率),
|
|
17
17
|
* `take` 在同一把锁下判并记 (from→to) 对偶界与收件人聚合界(投递额度)。SQL 两方言各是一个事务,见
|
|
18
|
-
* `plugins/org-delivery-quota-store.ts` 头注;File / Memory =
|
|
18
|
+
* `plugins/org-delivery-quota-store.ts` 头注;File / Memory = 单进程。两个动作的拒都带店算的重试秒数,门原样放进 `rate_limited` 的答案里。
|
|
19
|
+
* · **答案是 core 闭集的答案加一个本服务的成员**:core 的 `OrgDeliveryOutcome` 对 `rate_limited` 只有码与句;本服务的 wire 另带 `retryAfterSec`,
|
|
20
|
+
* 所以门交出的是 {@link ServerOrgDeliveryOutcome} —— 对 core 的类型结构上是子型(多一个成员,别的词不变),`rate_limited` 一只词多一个必填成员。
|
|
19
21
|
* · **收件人的 scope 就是收件人主体串本身**:本服务的引擎 scope = `spec.principal`(`resolve-spec.ts` 落
|
|
20
22
|
* `auth.principal`;同一事实的推导见 `peer-directory.ts` 的「scope 轴」段)。门不另造编解码。
|
|
21
23
|
*
|
|
@@ -24,15 +26,17 @@
|
|
|
24
26
|
* 收件人串交给组织目录去查,而目录的每主体状态按属主裁定不淘汰、它的量级只在「查的都是验过的主体」时有界(`org-memory-admission.ts`
|
|
25
27
|
* 的 `PrincipalState` 注);这一界让「一个成员拿任意串去刷目录」的速率与总量随时间线性有界(设计稿收件人查询面第四条:查询限流)。
|
|
26
28
|
* 与收件人无关 ⇒ 它的 `rate_limited` 不泄露收件人存不存在。
|
|
27
|
-
* 1. **成员判**(纯读):不同 org / 查无此人 / 目录不可用 / 收件人串过不了主体形判
|
|
28
|
-
*
|
|
29
|
-
*
|
|
29
|
+
* 1. **成员判**(纯读):不同 org / 查无此人 / 目录不可用 / 收件人串过不了主体形判 ⇒ 同一句 `not_member`,逐字节同 ——
|
|
30
|
+
* 门永远不是一只存在性探针(core 契约原句),也不说「是长度」。主体形判(名字 ∧ 良构 Unicode ∧ 无控制字符 ∧ ≤ `PRINCIPAL_MAX_BYTES` UTF-8 字节)**蕴含**收件箱键判官
|
|
31
|
+
* (`mailbox-store-sql.ts` 的 `mailboxKeyProblem`:非空 ∧ 良构 ∧ 无 C0 / DEL ∧ ≤ 同一只常量字节;收件人 scope 就是这只键)⇒ 收件人过了这一判,第 5 步的追加不会再按键判拒,
|
|
32
|
+
* 「吃了额度没投到」只剩追加失败这一种 —— 门里不另问键判官(零双判;蕴含性质钉在 `test/principal-one-byte-ruler.test.ts`)。收件人那一判必须在配额之前。
|
|
30
33
|
* 2. **铸信**(纯函数):放在任何有副作用的步骤之前。发件人的 scope 拼不进信封的发件人位(引擎按百分号编码后 1..190 字节判,抛闭集码
|
|
31
34
|
* `cross_session.invalid_from_scope`,`CrossSessionCodecError` 由引擎包根导出)⇒ 同一句 `not_member`、一个配额名额都没吃 —— 发件人这一侧的判官只有引擎这一只,
|
|
32
35
|
* 本仓不另抄宽度公式。部署没声明收件箱消费方(`no_consumer`)或别的铸信失败 ⇒ 门抛(core:「the gate maps that to its own failure」),HTTP 面答 500,同样没吃额度。
|
|
33
36
|
* 3. **收件箱上界**(`peekCount` 读):满 ⇒ `inbox_full`,在吃配额之前判,满箱不烧发件人的额度。与引擎同主体车道的
|
|
34
37
|
* `maxQueuedPeerMessages` 同一形(入口处读一次占用);两封并发信最多越界并发数那么多,上界由配额再界一次。
|
|
35
|
-
* 4. **配额**(原子判并记):任一界满 ⇒ `rate_limited`,与第 0 步同一句(
|
|
38
|
+
* 4. **配额**(原子判并记):任一界满 ⇒ `rate_limited`,与第 0 步同一句(不让发件人从拒句里分辨出「收件人这个窗里收了多少」);
|
|
39
|
+
* 同一个 `retryAfterSec` 口径 —— 配额店答的、到店钟当前窗结束的整秒数(第 0 步与第 4 步读同一口钟、同一道算式,数里也分辨不出是哪一界)。
|
|
36
40
|
* 5. **追加**:`append(收件人 scope, PRINCIPAL_INBOX_HANDLE, 记录)`。店的预删除态拒码(`mailbox.recipient_tombstoned`)
|
|
37
41
|
* 原样转成 `recipient_tombstoned`(core 对这只词的定义:「the store's own pre-delete code, relayed」);其余错误抛。
|
|
38
42
|
* 被拒的投递在任何地方都不追加任何东西(core 契约原句);投递额度(第 4 步)在之后只有追加失败这一种「吃了额度没投到」—— 方向是收紧;
|
|
@@ -43,13 +47,14 @@
|
|
|
43
47
|
* 跨 scope 写径:受理口(`POST /v1/principal-inbox/messages`)只调门,本仓源码里拼得出 `principal.inbox` 这只箱址的只有本文件
|
|
44
48
|
* (`test/org-delivery-gate-single-path.test.ts` 按源码钉)。
|
|
45
49
|
*/
|
|
46
|
-
import { type MailboxStore, type OrgDeliveryGate, type OrgDeliveryRefusalCode, type PrincipalInboxConsumer } from "@sema-agent/core";
|
|
50
|
+
import { type CrossPrincipalBody, type MailboxStore, type OrgAuthenticatedSender, type OrgDeliveryGate, type OrgDeliveryOutcome, type OrgDeliveryRefusalCode, type PrincipalInboxConsumer } from "@sema-agent/core";
|
|
47
51
|
import type { OrgMemoryDirectory } from "./org-memory-admission.js";
|
|
48
52
|
import type { OrgDeliveryQuotaPolicy, OrgDeliveryQuotaStore } from "./plugins/org-delivery-quota-store.js";
|
|
49
53
|
/**
|
|
50
54
|
* 跨主体配额(**唯一**的数字源;店只按它数)。默认显著紧于同主体车道(引擎 `PEER_LANE_DEFAULTS`:每发件人突发 30、
|
|
51
|
-
* 每秒回填 0.5)
|
|
52
|
-
*
|
|
55
|
+
* 每秒回填 0.5):同一对主体每个挂钟整点桶 10 封,一位收件人每个挂钟整点桶合计 30 封 —— org 里一个吵闹的主体淹不了别人的箱;
|
|
56
|
+
* 一个发件人每个挂钟整点桶 60 次尝试(成没成都算)—— 拿收件人串去问组织目录的速率有界(头注「次序」第 0 步)。
|
|
57
|
+
* 「桶」= 店钟对齐的固定窗(窗宽一小时,`floor(店钟 / windowMs)` 一处公式,`plugins/org-delivery-quota-store.ts` 头注),不是滑动的「过去 60 分钟」。
|
|
53
58
|
*/
|
|
54
59
|
export declare const ORG_DELIVERY_QUOTA: OrgDeliveryQuotaPolicy;
|
|
55
60
|
/** 收件箱上界(在箱、未被消费方确认的信封数)。与引擎同主体车道的箱上界缺省(`maxQueuedPeerMessages`)同值。 */
|
|
@@ -57,9 +62,30 @@ export declare const PRINCIPAL_INBOX_BOUND = 50;
|
|
|
57
62
|
/**
|
|
58
63
|
* 四只拒绝词各自的那**一句**(wire 上的 `error` 就是它,`routes/principal-inbox.ts` 原样中继、不手抄)。
|
|
59
64
|
* 键集 = core 闭集:core 加词 ⇒ 这张表编译红。
|
|
60
|
-
* `not_member` 一句同时服务「不同 org / 查无此人 / 目录答不上来 / 收件人串不成形 /
|
|
65
|
+
* `not_member` 一句同时服务「不同 org / 查无此人 / 目录答不上来 / 收件人串不成形 / 发件人主体拼不进信封的发件人位」—— 改它要保持各臂同字节。
|
|
61
66
|
*/
|
|
62
67
|
export declare const ORG_DELIVERY_REFUSAL_MESSAGES: Readonly<Record<OrgDeliveryRefusalCode, string>>;
|
|
68
|
+
/**
|
|
69
|
+
* 本服务的投递答案 = core 的 {@link OrgDeliveryOutcome} 加上额度拒的重试指引:`rate_limited` 一只词必带 `retryAfterSec`(配额店算的、到店钟当前窗结束的整秒数,
|
|
70
|
+
* ≥ 1),另三只词的答案与 core 的形逐字相同。对 core 的 `OrgDeliveryGate` 契约结构上是子型,所以这只门照样能交给任何读 core 契约的人。
|
|
71
|
+
* 数只在配额店算一次;HTTP 面把它投影成体里的 `retryAfterSec` 与同值 `Retry-After` 头(`routes/principal-inbox.ts`,不再算)。
|
|
72
|
+
*/
|
|
73
|
+
export type ServerOrgDeliveryOutcome = Extract<OrgDeliveryOutcome, {
|
|
74
|
+
ok: true;
|
|
75
|
+
}> | {
|
|
76
|
+
readonly ok: false;
|
|
77
|
+
readonly code: Exclude<OrgDeliveryRefusalCode, "org_delivery.rate_limited">;
|
|
78
|
+
readonly message: string;
|
|
79
|
+
} | {
|
|
80
|
+
readonly ok: false;
|
|
81
|
+
readonly code: "org_delivery.rate_limited";
|
|
82
|
+
readonly message: string;
|
|
83
|
+
readonly retryAfterSec: number;
|
|
84
|
+
};
|
|
85
|
+
/** {@link createOrgDeliveryGate} 交出的门:core 契约的子型,答案是 {@link ServerOrgDeliveryOutcome}。装配点、`ServiceDeps.orgDeliveryGate` 与受理口读这一只型。 */
|
|
86
|
+
export interface ServerOrgDeliveryGate extends OrgDeliveryGate {
|
|
87
|
+
deliverCrossPrincipal(authedFrom: OrgAuthenticatedSender, toPrincipal: string, body: CrossPrincipalBody): Promise<ServerOrgDeliveryOutcome>;
|
|
88
|
+
}
|
|
63
89
|
export interface OrgDeliveryGateDeps {
|
|
64
90
|
/** org 成员目录 —— **必须**与记忆准入 seam / memory-policy / 共享记忆读面同一个实例(头注)。 */
|
|
65
91
|
readonly directory: OrgMemoryDirectory;
|
|
@@ -77,7 +103,7 @@ export interface OrgDeliveryGateDeps {
|
|
|
77
103
|
/**
|
|
78
104
|
* 活对象(闭包持有目录 / 两只店 / 消费方)⇒ `create*`(CLAUDE.md 工厂命名律)。
|
|
79
105
|
*/
|
|
80
|
-
export declare function createOrgDeliveryGate(deps: OrgDeliveryGateDeps):
|
|
106
|
+
export declare function createOrgDeliveryGate(deps: OrgDeliveryGateDeps): ServerOrgDeliveryGate;
|
|
81
107
|
/**
|
|
82
108
|
* 箱址的读侧映射也归门(单一属主:箱址常量只在本文件出现,`test/org-delivery-gate-single-path.test.ts` ①):
|
|
83
109
|
* 被扣的跨会话信在收信会话的哪条车道上 ⇄ core 队列键的 `box`。消费方 = `src/peer-inbound-face.ts`。
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CrossSessionCodecError, MAILBOX_TOMBSTONED_RECIPIENT_CODE, PRINCIPAL_INBOX_HANDLE, peerSessionBoxHandle, mintCrossPrincipalRecord, uuidv7, } from "@sema-agent/core";
|
|
2
|
-
import { principalShapeProblem } from "./
|
|
3
|
-
import {
|
|
2
|
+
import { principalShapeProblem } from "./principal-shape.js";
|
|
3
|
+
import { personOf } from "./owner-brands.js";
|
|
4
|
+
import { recoveredSubject } from "./owner-faces.js";
|
|
4
5
|
export const ORG_DELIVERY_QUOTA = Object.freeze({ windowMs: 3_600_000, attemptsPerSender: 60, perPair: 10, perRecipient: 30 });
|
|
5
6
|
export const PRINCIPAL_INBOX_BOUND = 50;
|
|
6
7
|
export const ORG_DELIVERY_REFUSAL_MESSAGES = Object.freeze({
|
|
@@ -10,6 +11,7 @@ export const ORG_DELIVERY_REFUSAL_MESSAGES = Object.freeze({
|
|
|
10
11
|
"org_delivery.recipient_tombstoned": "the recipient is being deleted — nothing was delivered",
|
|
11
12
|
});
|
|
12
13
|
const refuse = (code) => ({ ok: false, code, message: ORG_DELIVERY_REFUSAL_MESSAGES[code] });
|
|
14
|
+
const refuseRateLimited = (retryAfterSec) => ({ ok: false, code: "org_delivery.rate_limited", message: ORG_DELIVERY_REFUSAL_MESSAGES["org_delivery.rate_limited"], retryAfterSec });
|
|
13
15
|
async function shareAnOrg(directory, a, b) {
|
|
14
16
|
const [la, lb] = await Promise.all([directory.lookup(a), directory.lookup(b)]);
|
|
15
17
|
if (la.kind !== "granted" || lb.kind !== "granted")
|
|
@@ -17,15 +19,16 @@ async function shareAnOrg(directory, a, b) {
|
|
|
17
19
|
return Object.keys(la.scopes).some((org) => Object.hasOwn(lb.scopes, org));
|
|
18
20
|
}
|
|
19
21
|
const principalShaped = (s) => principalShapeProblem(s) === undefined;
|
|
20
|
-
const fitsInboxKey = (recipient) => mailboxKeyProblem("scope", recipient) === undefined;
|
|
21
22
|
export function createOrgDeliveryGate(deps) {
|
|
22
23
|
const nowMs = deps.nowMs ?? Date.now;
|
|
23
24
|
const mintReceiptId = deps.mintReceiptId ?? uuidv7;
|
|
24
25
|
return {
|
|
25
26
|
async deliverCrossPrincipal(authedFrom, toPrincipal, body) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (!
|
|
27
|
+
const senderPerson = personOf(recoveredSubject(authedFrom.scope));
|
|
28
|
+
const attempt = await deps.quota.admitAttempt(senderPerson, ORG_DELIVERY_QUOTA);
|
|
29
|
+
if (!attempt.granted)
|
|
30
|
+
return refuseRateLimited(attempt.retryAfterSec);
|
|
31
|
+
if (!principalShaped(toPrincipal) || !(await shareAnOrg(deps.directory, senderPerson, toPrincipal))) {
|
|
29
32
|
return refuse("org_delivery.not_member");
|
|
30
33
|
}
|
|
31
34
|
const toScope = toPrincipal;
|
|
@@ -41,8 +44,9 @@ export function createOrgDeliveryGate(deps) {
|
|
|
41
44
|
}
|
|
42
45
|
if ((await deps.mailbox.peekCount(toScope, PRINCIPAL_INBOX_HANDLE)) >= PRINCIPAL_INBOX_BOUND)
|
|
43
46
|
return refuse("org_delivery.inbox_full");
|
|
44
|
-
|
|
45
|
-
|
|
47
|
+
const taken = await deps.quota.take(senderPerson, toScope, ORG_DELIVERY_QUOTA);
|
|
48
|
+
if (!taken.granted)
|
|
49
|
+
return refuseRateLimited(taken.retryAfterSec);
|
|
46
50
|
let seq;
|
|
47
51
|
try {
|
|
48
52
|
seq = await deps.mailbox.append(toScope, PRINCIPAL_INBOX_HANDLE, record);
|
|
@@ -125,7 +125,7 @@ export declare function buildOutboundProxyPosture(env?: NodeJS.ProcessEnv): Outb
|
|
|
125
125
|
* (按远端处置 = 交给代理那一半,与修前方向一致)。认哪几形(与 sema-cli 1.0.136 `isLoopbackHost` 同集):
|
|
126
126
|
* · `localhost`(含 FQDN 尾点 `localhost.`);刻意**不**认 `*.localhost` 子域(能否落到本机取决于系统解析器,不是地址本身的事实);
|
|
127
127
|
* · IPv4 `127.0.0.0/8` 整段(WHATWG URL 先把 `127.1` / `0x7f.1` 这类写法规范成点分四段);
|
|
128
|
-
* · IPv6 `::1`、IPv4 映射段 `::ffff:127.x.x.x`(URL 规范成 `::ffff:7fxx:xxxx`
|
|
128
|
+
* · IPv6 `::1`、IPv4 映射段 `::ffff:127.x.x.x`(URL 规范成 `::ffff:7fxx:xxxx` 形,经 `canonicalAddress` 折回点分 IPv4 再判);
|
|
129
129
|
* · 未指定地址 `0.0.0.0` / `::`(及映射形):作为目的地址它在本机就是「本机」,送进代理只会让代理去连它自己。
|
|
130
130
|
*/
|
|
131
131
|
export declare function isLoopbackOrigin(origin: string | URL | undefined): boolean;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Agent, Client, Dispatcher, EnvHttpProxyAgent, getGlobalDispatcher, Pool, setGlobalDispatcher } from "undici";
|
|
2
2
|
import { PROXY_TUNNEL_REFUSED } from "@sema-agent/core";
|
|
3
3
|
import { isIP } from "node:net";
|
|
4
|
+
import { canonicalAddress } from "./net-address.js";
|
|
4
5
|
import diagnosticsChannel from "node:diagnostics_channel";
|
|
5
6
|
import { buildDisplaySafeUrl, DISPLAY_SAFE_URL_TOKEN, redactSecrets } from "./trace/redact.js";
|
|
6
7
|
import { recordFailOpen } from "./observability/fail-open.js";
|
|
@@ -41,19 +42,12 @@ export function isLoopbackOrigin(origin) {
|
|
|
41
42
|
host = host.replace(/\.+$/, "");
|
|
42
43
|
if (host === "localhost")
|
|
43
44
|
return true;
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
return host.startsWith("127.") || host === "0.0.0.0";
|
|
47
|
-
if (family !== 6)
|
|
45
|
+
const address = canonicalAddress(host);
|
|
46
|
+
if (address === undefined)
|
|
48
47
|
return false;
|
|
49
|
-
if (
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
if (mapped === null)
|
|
53
|
-
return false;
|
|
54
|
-
const hi = Number.parseInt(mapped[1], 16);
|
|
55
|
-
const lo = Number.parseInt(mapped[2], 16);
|
|
56
|
-
return hi >> 8 === 127 || (hi === 0 && lo === 0);
|
|
48
|
+
if (isIP(address) === 4)
|
|
49
|
+
return address.startsWith("127.") || address === "0.0.0.0";
|
|
50
|
+
return address === "::1" || address === "::";
|
|
57
51
|
}
|
|
58
52
|
class OutboundDispatcher extends Dispatcher {
|
|
59
53
|
direct;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔴 **身份的三根轴与行上的属主**(属主律 + 场景子命名空间的类型事实;叶子:零 import)。
|
|
3
|
+
*
|
|
4
|
+
* ## 律(四句)
|
|
5
|
+
* 1. **轴在汇点上,不在串里。** {@link Person} = 外部验过的那个人(谁付钱 / 谁有权 / 谁被治理:成本、租约、用量窗、运维名册、中心场景裁定、持久规则、组织成员);
|
|
6
|
+
* {@link Scenario} = 请求自报的场景(人之内的自选收窄,不是权限主张);{@link Subject} = 分区键(行属主 / 存储键 / 列表过滤 / 检查点 scope / 记忆 scope / 幂等身份)。
|
|
7
|
+
* 读身份的每只汇点形参带品牌:人面收 `Person`,分区面收 `Subject`(行上读出的是它的持久形 {@link DurableOwnerKey})—— 收错 = 编译红。
|
|
8
|
+
* 2. **两只铸点、一只解码器。** 外部管线 {@link subjectOf}(没带场景 ⇒ 主体与人**逐字节相同**;带了 ⇒ `_scn:<场景>:<人>`);内部恢复管线 {@link partsOf}
|
|
9
|
+
* (行属主 / 检查点 scope / 引擎回传的 scope 恢复成 `{ subject, person, scenario? }`,存量串**一律先过它**)。保留前缀 / 在册 / 宽度三判只在外部管线
|
|
10
|
+
* (`security.ts` 的形判与宽度判、`http/principal-gate.ts` 的请求身份判决);恢复的不是外部输入,不判。
|
|
11
|
+
* 3. **载体只带一格。** 调用方 / 幂等身份 / 列表视域 / 执行上下文只带 `Subject`;人只经 {@link personOf} 从它读 —— 不存在「人与主体不一致」的态。
|
|
12
|
+
* 4. **存储零改形。** 主体按字节落进既有的属主 / scope 列;没带场景的请求写下的行与今天逐字节同。
|
|
13
|
+
*
|
|
14
|
+
* ## 铸点闭集(普查门 ⑤ 逐文件钉)
|
|
15
|
+
* · `Person` —— `security.ts` 的 `verifiedPerson`(验请求身份的那一只)、`principal-jwt.ts` 的 `verifyDirectDoorProof`(直连门上这一次决定的证明推出的人)、
|
|
16
|
+
* 本文件的 {@link partsOf}(恢复管线);
|
|
17
|
+
* · `Scenario` —— 本文件的 {@link scenarioNamed}(文法是它的唯一入口)与 {@link partsOf};
|
|
18
|
+
* · `Subject` —— 本文件的 {@link subjectOf} 与 {@link partsOf};
|
|
19
|
+
* · `DurableOwnerKey` —— `owner-faces.ts` 的 `ownerKeyOf`(属主列读数)、`security.ts` 的 `decodeCheckpointScope`(停驻行 scope 列)与 `http/owner-access.ts` 判行处的
|
|
20
|
+
* {@link mintOwnedRow}(门放过的那一行:同一个行对象原样交出,只在型上带品牌)。
|
|
21
|
+
* 四只品牌两两不可赋、裸 `string` 都不可赋;「调用方 vs 行属主」只经 `owner-faces.ts` 的 `sameParty`(有主行)/ `sameKey`(存储键)两座桥 —— 桥的调用方一侧是 `Subject`。
|
|
22
|
+
* 本文件是 src 里这四只品牌**唯一**出现断言的地方。
|
|
23
|
+
*/
|
|
24
|
+
declare const personBrand: unique symbol;
|
|
25
|
+
declare const scenarioBrand: unique symbol;
|
|
26
|
+
declare const subjectBrand: unique symbol;
|
|
27
|
+
declare const durableOwnerKeyBrand: unique symbol;
|
|
28
|
+
export type Person = string & {
|
|
29
|
+
readonly [personBrand]: true;
|
|
30
|
+
};
|
|
31
|
+
export type Scenario = string & {
|
|
32
|
+
readonly [scenarioBrand]: true;
|
|
33
|
+
};
|
|
34
|
+
export type Subject = string & {
|
|
35
|
+
readonly [subjectBrand]: true;
|
|
36
|
+
};
|
|
37
|
+
export type DurableOwnerKey = string & {
|
|
38
|
+
readonly [durableOwnerKeyBrand]: true;
|
|
39
|
+
};
|
|
40
|
+
/** 场景名文法(唯一一份):内建场景表与中心声明的场景、请求的场景头同读。不含冒号 ⇒ 主体里前缀后的第一个冒号唯一切分(编码单射、可解)。 */
|
|
41
|
+
export declare const SCENARIO_NAME_RE: RegExp;
|
|
42
|
+
/** 带场景的主体的保留前缀。身份边界拒以它开头的人(`security.ts` 的保留前缀表登记它),否则一个人可以自称别人的分区。 */
|
|
43
|
+
export declare const SCENARIO_SUBJECT_PREFIX = "_scn:";
|
|
44
|
+
/** {@link Person} 的铸造口(只在铸点闭集里调,见上)。 */
|
|
45
|
+
export declare function mintPerson(verified: string): Person;
|
|
46
|
+
/** {@link DurableOwnerKey} 的铸造口(只在铸点闭集里调,见上)。 */
|
|
47
|
+
export declare function mintDurableOwnerKey(persisted: string): DurableOwnerKey;
|
|
48
|
+
/** {@link Scenario} 的唯一入口:合文法 ⇒ 场景;不合 ⇒ `undefined`(调用方按自己的面答拒;不合文法的名字不可能在册)。 */
|
|
49
|
+
export declare function scenarioNamed(raw: string): Scenario | undefined;
|
|
50
|
+
/** 外部管线的主体铸点:没带场景 ⇒ 与人逐字节相同;带了 ⇒ `_scn:<场景>:<人>`。 */
|
|
51
|
+
export declare function subjectOf(person: Person, scenario?: Scenario): Subject;
|
|
52
|
+
/** 一只主体的三格(恢复管线的产物)。 */
|
|
53
|
+
export interface SubjectParts {
|
|
54
|
+
readonly subject: Subject;
|
|
55
|
+
readonly person: Person;
|
|
56
|
+
readonly scenario: Scenario | undefined;
|
|
57
|
+
}
|
|
58
|
+
/** 一只以保留前缀开头、却拆不出「合文法的场景 + 非空的人」的串 —— 存量里不该有(起服的切换检查拒启它的来源),出现即是数据坏,不猜。 */
|
|
59
|
+
export declare class MalformedSubjectError extends Error {
|
|
60
|
+
readonly code = "owner.malformed_subject";
|
|
61
|
+
constructor();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 🔴 **内部恢复管线的唯一解码器**:行属主 / 检查点 scope / 引擎回传的 scope 恢复成三格。不以保留前缀开头 ⇒ 无场景(主体 = 人,逐字节);
|
|
65
|
+
* 以它开头 ⇒ 前缀后第一个冒号切成场景与人 —— 场景不合文法或人段为空 ⇒ 抛 {@link MalformedSubjectError}(响亮,不把坏形读成人)。
|
|
66
|
+
* 不判保留前缀 / 在册 / 宽度:恢复的不是外部输入。
|
|
67
|
+
*/
|
|
68
|
+
export declare function partsOf(key: Subject | DurableOwnerKey): SubjectParts;
|
|
69
|
+
/** 一只主体(或它的持久形)背后的人 —— 人面汇点从分区键读人的唯一读法(= {@link partsOf} 的 `person` 格)。 */
|
|
70
|
+
export declare function personOf(key: Subject | DurableOwnerKey): Person;
|
|
71
|
+
/**
|
|
72
|
+
* 门放过的那一行的铸造口(只在属主存取器判行处调):**行对象原样交回** —— 运行期是同一个对象、属主是同一串,只在型上把属主那一格带 {@link DurableOwnerKey}。
|
|
73
|
+
* 不展开、不拷贝:行上可能有惰性读的格(头读的叶子 `leafId` 在会话内容读不出时是一只抛故障的读取器 —— 只判归属的口不读内容),展开一次就把内容读了。
|
|
74
|
+
*/
|
|
75
|
+
export declare function mintOwnedRow<R extends {
|
|
76
|
+
readonly owner: string | null;
|
|
77
|
+
}>(row: R): R & {
|
|
78
|
+
readonly owner: DurableOwnerKey | null;
|
|
79
|
+
};
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=owner-brands.d.ts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const SCENARIO_NAME_RE = /^[a-z][a-z0-9-]{1,31}$/;
|
|
2
|
+
export const SCENARIO_SUBJECT_PREFIX = "_scn:";
|
|
3
|
+
export function mintPerson(verified) {
|
|
4
|
+
return verified;
|
|
5
|
+
}
|
|
6
|
+
export function mintDurableOwnerKey(persisted) {
|
|
7
|
+
return persisted;
|
|
8
|
+
}
|
|
9
|
+
export function scenarioNamed(raw) {
|
|
10
|
+
return SCENARIO_NAME_RE.test(raw) ? raw : undefined;
|
|
11
|
+
}
|
|
12
|
+
export function subjectOf(person, scenario) {
|
|
13
|
+
return (scenario === undefined ? person : `${SCENARIO_SUBJECT_PREFIX}${scenario}:${person}`);
|
|
14
|
+
}
|
|
15
|
+
export class MalformedSubjectError extends Error {
|
|
16
|
+
code = "owner.malformed_subject";
|
|
17
|
+
constructor() {
|
|
18
|
+
super(`a stored owner key starts with the reserved scenario prefix "${SCENARIO_SUBJECT_PREFIX}" but does not split into a scenario name and a person`);
|
|
19
|
+
this.name = "MalformedSubjectError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function partsOf(key) {
|
|
23
|
+
const raw = key;
|
|
24
|
+
if (!raw.startsWith(SCENARIO_SUBJECT_PREFIX))
|
|
25
|
+
return { subject: raw, person: raw, scenario: undefined };
|
|
26
|
+
const rest = raw.slice(SCENARIO_SUBJECT_PREFIX.length);
|
|
27
|
+
const cut = rest.indexOf(":");
|
|
28
|
+
if (cut < 0)
|
|
29
|
+
throw new MalformedSubjectError();
|
|
30
|
+
const scenario = scenarioNamed(rest.slice(0, cut));
|
|
31
|
+
const person = rest.slice(cut + 1);
|
|
32
|
+
if (scenario === undefined || person.length === 0)
|
|
33
|
+
throw new MalformedSubjectError();
|
|
34
|
+
return { subject: raw, person: person, scenario };
|
|
35
|
+
}
|
|
36
|
+
export function personOf(key) {
|
|
37
|
+
return partsOf(key).person;
|
|
38
|
+
}
|
|
39
|
+
export function mintOwnedRow(row) {
|
|
40
|
+
return row;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=owner-brands.js.map
|