@sema-agent/server 7.147.0 → 7.148.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 +1039 -24
- package/README.md +20 -7
- package/README.zh-CN.md +14 -8
- package/USAGE.md +380 -163
- 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/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +28 -30
- package/dist/approval-gate-currency.js +3 -2
- 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 +0 -14
- package/dist/auth-bridge.js +0 -7
- 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 +37 -31
- 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-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 +55 -67
- 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 +11 -4
- 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.js +9 -1
- package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
- package/dist/boot/stage-02-web-admin-pull.js +6 -1
- package/dist/boot/stage-03-store-backend.d.ts +3 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +2 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +7 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +10 -12
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +11 -8
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +11 -8
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +12 -15
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +12 -15
- 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 +3 -0
- package/dist/boot/stores.js +21 -10
- 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 +38 -11
- package/dist/capability-facts.js +47 -8
- package/dist/card-void.d.ts +4 -4
- package/dist/card-void.js +1 -1
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +62 -56
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +42 -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 +26 -17
- package/dist/config.d.ts +8 -16
- package/dist/config.js +113 -47
- 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 +30 -4
- package/dist/deployment-shape.js +7 -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-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +5 -18
- package/dist/execution-lane-caps.js +0 -22
- 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/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +67 -57
- package/dist/hooks/hook-runner.js +260 -186
- 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 +75 -78
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +54 -30
- 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 +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +76 -30
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +17 -12
- package/dist/http/execution-context.d.ts +17 -43
- package/dist/http/execution-context.js +7 -5
- 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 +391 -67
- package/dist/http/owner-access.js +371 -35
- package/dist/http/principal-gate.d.ts +24 -81
- package/dist/http/principal-gate.js +24 -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 +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +21 -18
- package/dist/http/resume-legs.js +189 -129
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +25 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +58 -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 +70 -65
- 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 +15 -18
- 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 +27 -3
- package/dist/http/routes/diagnostics.js +27 -21
- 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 +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- 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 +146 -231
- 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 +4 -2
- package/dist/http/routes/session-sync.js +21 -20
- 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 +136 -120
- 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 +39 -40
- package/dist/http/server.js +36 -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 +16 -8
- package/dist/http/submit-ctx.js +6 -2
- 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 +1 -0
- package/dist/index.js +1 -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/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +29 -2
- package/dist/memory-scope.js +64 -15
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +6 -3
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +18 -0
- package/dist/model-context-window.js +2 -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 +35 -16
- package/dist/model-entry-refusal.js +40 -27
- 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-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 +58 -38
- package/dist/observability/fail-open.js +60 -38
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +3 -4
- 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 +5 -2
- 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 +5 -4
- package/dist/org-delivery-gate.js +7 -6
- 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 +531 -0
- package/dist/owner-faces.js +126 -0
- package/dist/parked-decide.d.ts +67 -5
- package/dist/parked-decide.js +127 -5
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +6 -8
- 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 +0 -22
- package/dist/plugins/adoption-log-sql.js +5 -3
- 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 +39 -20
- package/dist/plugins/approval-ask-store-sql.js +41 -10
- package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
- package/dist/plugins/approval-exemption-skill-m46.js +25 -0
- package/dist/plugins/approval-exemption-store.d.ts +6 -1
- package/dist/plugins/approval-exemption-store.js +14 -0
- 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 +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/file-run-store.d.ts +63 -23
- package/dist/plugins/file-run-store.js +138 -83
- 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 +58 -23
- package/dist/plugins/local-checkpoint-store.js +195 -76
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- 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 +4 -2
- package/dist/plugins/local-engine-high-water.js +4 -1
- package/dist/plugins/local-session-store.d.ts +358 -125
- package/dist/plugins/local-session-store.js +824 -251
- 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 +39 -27
- package/dist/plugins/memory-run-store.js +72 -70
- package/dist/plugins/one-time-migration-marker.d.ts +10 -0
- package/dist/plugins/one-time-migration-marker.js +7 -0
- package/dist/plugins/one-time-migrations.d.ts +186 -45
- package/dist/plugins/one-time-migrations.js +442 -119
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
- package/dist/plugins/permission-rule-store-sql.js +6 -86
- package/dist/plugins/pg-pool.d.ts +1 -31
- package/dist/plugins/pg-pool.js +16 -7
- package/dist/plugins/remote-env-e2b.d.ts +7 -25
- package/dist/plugins/remote-env-e2b.js +34 -25
- package/dist/plugins/remote-env-host.d.ts +2 -9
- package/dist/plugins/remote-env-host.js +34 -22
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +107 -58
- package/dist/plugins/remote-env-local-docker.d.ts +148 -14
- package/dist/plugins/remote-env-local-docker.js +367 -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 +56 -68
- package/dist/plugins/run-store-sql.js +127 -116
- 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 +54 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +55 -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 +42 -9
- package/dist/plugins/schema-consistency.js +212 -11
- package/dist/plugins/schema-drift-sentence.d.ts +4 -1
- package/dist/plugins/schema-drift-sentence.js +4 -4
- 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 +22 -16
- 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 +20 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +3 -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/store-backend.d.ts +84 -15
- package/dist/plugins/store-backend.js +186 -55
- package/dist/plugins/store-contracts.d.ts +90 -30
- package/dist/plugins/store-contracts.js +22 -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.js +23 -8
- 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/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/question.d.ts +13 -23
- package/dist/question.js +21 -39
- 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-local.d.ts +14 -6
- package/dist/run-local.js +92 -80
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +26 -15
- package/dist/runs.js +39 -27
- 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 +21 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/session-children-retire.d.ts +7 -5
- package/dist/session-children-retire.js +7 -2
- 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/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +136 -20
- package/dist/store-posture.js +188 -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 +33 -28
- package/dist/stores-sql/checkpoint-store-sql.js +75 -44
- 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/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 +1 -1
- package/dist/task-a2a.js +3 -3
- package/dist/task-cwd.d.ts +20 -0
- package/dist/task-cwd.js +8 -0
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-mcp.js +3 -3
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +18 -7
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +131 -129
- package/dist/tool-approval.js +189 -193
- 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/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 +1 -30
- 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 +55 -42
- package/dist/trace/project.js +52 -19
- package/dist/trace/redact.d.ts +123 -27
- package/dist/trace/redact.js +880 -260
- package/dist/trace/self-minted-wire.d.ts +487 -19
- package/dist/trace/self-minted-wire.js +172 -23
- 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 +13 -16
- 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/package.json +6 -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/wire-changes/server@7.148.0.json +1517 -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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { seatText } from "../../trace/exit-seat.js";
|
|
2
|
+
import { isHolderDeathVerdict } from "../../plugins/store-contracts.js";
|
|
1
3
|
import { projectEvents, taskSummary, mapTraceEvent } from "../../trace/project.js";
|
|
2
4
|
import { redactLedgerEventForRead } from "../../observability/run-terminal.js";
|
|
3
5
|
import { projectArtifacts } from "../../trace/artifacts.js";
|
|
@@ -6,7 +8,9 @@ import { sleep } from "../sse-log.js";
|
|
|
6
8
|
import { bindSseLifecycle } from "../sse-lifecycle.js";
|
|
7
9
|
import { sendJson, sendError, sseHeaders, SSE_MAX_STREAM_MS, SSE_HEARTBEAT_IDLE_MS } from "../send.js";
|
|
8
10
|
import { filterFingerprint } from "../cursor-fingerprint.js";
|
|
9
|
-
import {
|
|
11
|
+
import { sendUnauthorized } from "../principal-gate.js";
|
|
12
|
+
import { admitRunById, enter, entryIsFleet, readVisibleRun, routeListFilter, runRowAt } from "../owner-access.js";
|
|
13
|
+
import { listFilterOf } from "../../owner-faces.js";
|
|
10
14
|
import { assertNever } from "../route-ctx.js";
|
|
11
15
|
import * as facts from "../../capability-facts.js";
|
|
12
16
|
const TOOL_RESULT_LIMIT_CAP = 262_144;
|
|
@@ -15,7 +19,7 @@ export async function handleTraceUsage(req, res, match, ctx) {
|
|
|
15
19
|
const { deps } = ctx;
|
|
16
20
|
const { safeDecode } = ctx.helpers;
|
|
17
21
|
if (match.decl.id === "tasks-source-summary") {
|
|
18
|
-
if (!
|
|
22
|
+
if (!routeListFilter(req, deps, match.decl.id).fleetWide) {
|
|
19
23
|
sendUnauthorized(res, "operator");
|
|
20
24
|
return;
|
|
21
25
|
}
|
|
@@ -35,11 +39,10 @@ export async function handleTraceUsage(req, res, match, ctx) {
|
|
|
35
39
|
match.decl.id === "task-trace-stream" ||
|
|
36
40
|
match.decl.id === "task-trace-artifacts" ||
|
|
37
41
|
match.decl.id === "task-tool-result") {
|
|
38
|
-
const
|
|
39
|
-
if (
|
|
40
|
-
sendUnauthorized(res, "identity");
|
|
42
|
+
const traceEntry = enter(req, res, deps, match.decl.id);
|
|
43
|
+
if (traceEntry === undefined)
|
|
41
44
|
return;
|
|
42
|
-
|
|
45
|
+
const gateOwner = listFilterOf(traceEntry.face, traceEntry.caller).gateOwner;
|
|
43
46
|
const runs = facts.durableRuns(deps);
|
|
44
47
|
if (!runs.available) {
|
|
45
48
|
sendError(res, 501, "capability.run_store_required", "trace API requires a durable run store (DB_BACKEND=mysql|pg|local)");
|
|
@@ -48,31 +51,33 @@ export async function handleTraceUsage(req, res, match, ctx) {
|
|
|
48
51
|
const runStore = runs.runStore;
|
|
49
52
|
const query = new URLSearchParams(match.search);
|
|
50
53
|
const taskId = match.params.taskId;
|
|
51
|
-
let
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
let admittedRun;
|
|
55
|
+
const readDeferred = match.decl.id === "task-tool-result" && entryIsFleet(traceEntry);
|
|
56
|
+
if (taskId !== undefined && !readDeferred) {
|
|
57
|
+
const admitted = await admitRunById(traceEntry, res, runStore, taskId);
|
|
58
|
+
if (admitted === undefined)
|
|
56
59
|
return;
|
|
57
|
-
|
|
58
|
-
ownedRun = run;
|
|
60
|
+
admittedRun = admitted.row;
|
|
59
61
|
}
|
|
60
62
|
switch (match.decl.id) {
|
|
61
63
|
case "task-trace-list":
|
|
62
64
|
await handleTaskList(res, runStore, query, gateOwner);
|
|
63
65
|
return;
|
|
64
66
|
case "task-trace-turns":
|
|
65
|
-
await handleTaskTurns(res, runStore,
|
|
67
|
+
await handleTaskTurns(res, runStore, admittedRun, query);
|
|
66
68
|
return;
|
|
67
69
|
case "task-trace-stream":
|
|
68
|
-
await streamTaskTrace(req, res, runStore,
|
|
70
|
+
await streamTaskTrace(req, res, runStore, admittedRun, match.search);
|
|
69
71
|
return;
|
|
70
72
|
case "task-trace-artifacts":
|
|
71
|
-
await handleTaskArtifacts(res, runStore,
|
|
73
|
+
await handleTaskArtifacts(res, runStore, admittedRun);
|
|
72
74
|
return;
|
|
73
|
-
case "task-tool-result":
|
|
74
|
-
|
|
75
|
+
case "task-tool-result": {
|
|
76
|
+
const ownedRun = admittedRun;
|
|
77
|
+
const readRun = ownedRun !== undefined ? async () => ownedRun : () => readVisibleRun(traceEntry, runStore, taskId);
|
|
78
|
+
await handleToolResult(res, deps.toolResultStore, taskId, readRun, safeDecode(match.params.ref), query);
|
|
75
79
|
return;
|
|
80
|
+
}
|
|
76
81
|
default:
|
|
77
82
|
return assertNever(match.decl.id);
|
|
78
83
|
}
|
|
@@ -88,7 +93,7 @@ export async function handleTraceUsage(req, res, match, ctx) {
|
|
|
88
93
|
return;
|
|
89
94
|
}
|
|
90
95
|
const runStore = runs.runStore;
|
|
91
|
-
const { fleetWide, gateOwner } =
|
|
96
|
+
const { fleetWide, gateOwner } = routeListFilter(req, deps, match.decl.id);
|
|
92
97
|
if (!fleetWide && gateOwner === null) {
|
|
93
98
|
sendUnauthorized(res, "identity");
|
|
94
99
|
return;
|
|
@@ -176,16 +181,12 @@ async function handleTaskList(res, runStore, query, forceOwner) {
|
|
|
176
181
|
const nextCursor = hasMore && last ? encodeCursor({ createdAt: last.createdAt, taskId: last.taskId }, f) : undefined;
|
|
177
182
|
sendJson(res, 200, { tasks, ...(nextCursor ? { nextCursor } : {}) });
|
|
178
183
|
}
|
|
179
|
-
async function handleTaskArtifacts(res, runStore,
|
|
180
|
-
const
|
|
181
|
-
if (!run) {
|
|
182
|
-
sendError(res, 404, "not_found.run", "task not found");
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
184
|
+
async function handleTaskArtifacts(res, runStore, run) {
|
|
185
|
+
const taskId = run.taskId;
|
|
185
186
|
const events = await runStore.getEvents(taskId, 0);
|
|
186
187
|
sendJson(res, 200, { artifacts: projectArtifacts(events, { taskId, jobId: run.jobId }) });
|
|
187
188
|
}
|
|
188
|
-
async function handleToolResult(res, store,
|
|
189
|
+
async function handleToolResult(res, store, taskId, readRun, ref, query) {
|
|
189
190
|
const intParam = (name, cap) => {
|
|
190
191
|
const raw = query.get(name);
|
|
191
192
|
if (raw === null)
|
|
@@ -212,7 +213,7 @@ async function handleToolResult(res, store, runStore, taskId, ownedRun, ref, que
|
|
|
212
213
|
const notFound = () => sendError(res, 404, "not_found.tool_result", "tool result not found");
|
|
213
214
|
if (ref === null)
|
|
214
215
|
return notFound();
|
|
215
|
-
const run =
|
|
216
|
+
const run = await readRun();
|
|
216
217
|
if (!run)
|
|
217
218
|
return notFound();
|
|
218
219
|
const owner = store?.ownerOf ? await store.ownerOf(ref) : undefined;
|
|
@@ -227,12 +228,8 @@ async function handleToolResult(res, store, runStore, taskId, ownedRun, ref, que
|
|
|
227
228
|
sendJson(res, 200, { content: slice.content, offset: slice.offset, totalChars: slice.totalChars });
|
|
228
229
|
}
|
|
229
230
|
const readFaceEvent = (ev) => ({ ...ev, data: redactLedgerEventForRead(ev.type, ev.data) });
|
|
230
|
-
async function handleTaskTurns(res, runStore,
|
|
231
|
-
const
|
|
232
|
-
if (!run) {
|
|
233
|
-
sendError(res, 404, "not_found.run", "task not found");
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
231
|
+
async function handleTaskTurns(res, runStore, run, query) {
|
|
232
|
+
const taskId = run.taskId;
|
|
236
233
|
const limit = Math.min(100, Math.max(1, Number(query.get("limit") ?? 20) || 20));
|
|
237
234
|
const cursorSeq = Number(query.get("cursor") ?? 0) || 0;
|
|
238
235
|
const [events, retainedFrom] = await Promise.all([runStore.getEvents(taskId, 0), runStore.retainedFrom(taskId)]);
|
|
@@ -243,12 +240,8 @@ async function handleTaskTurns(res, runStore, taskId, query) {
|
|
|
243
240
|
const nextCursor = eligible.length > limit && oldest ? String(oldest.seq) : undefined;
|
|
244
241
|
sendJson(res, 200, { turns, ...(nextCursor ? { nextCursor } : {}), retainedFrom });
|
|
245
242
|
}
|
|
246
|
-
async function streamTaskTrace(req, res, runStore,
|
|
247
|
-
const
|
|
248
|
-
if (!run0) {
|
|
249
|
-
sendError(res, 404, "not_found.run", "task not found");
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
243
|
+
async function streamTaskTrace(req, res, runStore, admitted, search) {
|
|
244
|
+
const taskId = admitted.taskId;
|
|
252
245
|
const lastId = Number(req.headers["last-event-id"] ?? new URLSearchParams(search).get("from") ?? 0);
|
|
253
246
|
let from = Number.isFinite(lastId) ? lastId : 0;
|
|
254
247
|
sseHeaders(res);
|
|
@@ -259,26 +252,27 @@ async function streamTaskTrace(req, res, runStore, taskId, staleMs, search) {
|
|
|
259
252
|
});
|
|
260
253
|
const start = Date.now();
|
|
261
254
|
let lastBeat = Date.now();
|
|
255
|
+
let deliveredTerminal = false;
|
|
262
256
|
const write = (events) => {
|
|
263
257
|
for (const ev of events) {
|
|
264
258
|
const out = mapTraceEvent(ev.type, ev.seq, (readFaceEvent(ev).data ?? {}));
|
|
265
259
|
if (out)
|
|
266
260
|
res.write(`id: ${ev.seq}\nevent: ${out.event}\ndata: ${JSON.stringify(out.data)}\n\n`);
|
|
267
261
|
from = ev.seq;
|
|
262
|
+
if (ev.type === "done" || ev.type === "failed")
|
|
263
|
+
deliveredTerminal = true;
|
|
268
264
|
}
|
|
269
265
|
};
|
|
270
266
|
while (!closed) {
|
|
271
|
-
const [events,
|
|
267
|
+
const [events, raw] = await Promise.all([runStore.getEvents(taskId, from), runStore.getRun(taskId)]);
|
|
272
268
|
write(events);
|
|
273
|
-
if (!
|
|
269
|
+
if (!raw)
|
|
274
270
|
break;
|
|
271
|
+
const run = await runRowAt("task-trace-stream", runStore, raw);
|
|
275
272
|
if (run.status !== "running") {
|
|
276
273
|
write(await runStore.getEvents(taskId, from));
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
const stale = Date.now() - new Date(run.updatedAt).getTime() > staleMs;
|
|
280
|
-
if (stale && events.length === 0) {
|
|
281
|
-
res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "WORKER_DOWN", message: "run stalled (instance lost?)" })}\n\n`);
|
|
274
|
+
if (!deliveredTerminal && isHolderDeathVerdict(run))
|
|
275
|
+
res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "WORKER_DOWN", message: seatText("trace-frame-text", run.error ?? "") })}\n\n`);
|
|
282
276
|
break;
|
|
283
277
|
}
|
|
284
278
|
if (Date.now() - start > SSE_MAX_STREAM_MS) {
|
|
@@ -2,7 +2,6 @@ import type { IncomingMessage, ServerResponse } from "node:http";
|
|
|
2
2
|
import { type WorkflowRun } from "@sema-agent/core";
|
|
3
3
|
import { type Admit } from "../../trace/projection-table.js";
|
|
4
4
|
import type { RouteCtx, RouteMatch, RouteIdsOf } from "../route-ctx.js";
|
|
5
|
-
/** SVC-5 的 steer 路——`handle()` 里位置在 tasks/runs 之后(鉴权门之后),故是**独立**的域入口。 */
|
|
6
5
|
/** 路由体 = 从 `server.ts` 的 `handle()` 里**整段剪切**过来的原文(唯一改动:统一去缩进两格)。裸 `return;`
|
|
7
6
|
* = 「本域已应答」;走到函数尾才是「没匹配上」。跨域的东西一律在首行解构出来。 */
|
|
8
7
|
export declare function handleWorkflows(req: IncomingMessage, res: ServerResponse, match: RouteMatch<WorkflowsRouteId>, ctx: RouteCtx): Promise<void>;
|
|
@@ -20,7 +19,7 @@ export interface GroupForest {
|
|
|
20
19
|
readonly roots: readonly WorkflowGroupRow[];
|
|
21
20
|
readonly childrenOf: ReadonlyMap<WorkflowGroupRow, readonly WorkflowGroupRow[]>;
|
|
22
21
|
}
|
|
23
|
-
/**
|
|
22
|
+
/** 详情面十一张表的铸键与 `rows` 读到的根:原记录 + 本次投影建一次的组森林。 */
|
|
24
23
|
export interface WorkflowDetailRoot {
|
|
25
24
|
readonly run: WorkflowRun;
|
|
26
25
|
readonly forest: GroupForest;
|
|
@@ -171,6 +170,28 @@ export declare const WORKFLOW_RUN_STATS_DISPOSITIONS: {
|
|
|
171
170
|
};
|
|
172
171
|
};
|
|
173
172
|
};
|
|
173
|
+
/**
|
|
174
|
+
* run 级预算超支(core `WorkflowRun.budgetOvershoot`:终局 run 真花超了上限才有,条件铸)。展示面审(core 型亲读):三格全是令牌数 ——
|
|
175
|
+
* `budgetTokens` 配置的上限、`spentTokens` 已结算的实花、`unsettledTokens` 终局时仍在飞的腿上观测到的花费(估计值,消费方与前者相加;引擎只在非零时写这一格,缺席与零同读)——
|
|
176
|
+
* 没有文本成员 ⇒ 逐成员 `forward`,不过脱敏器,也不开自由数据通道。
|
|
177
|
+
*/
|
|
178
|
+
export declare const WORKFLOW_BUDGET_OVERSHOOT_DISPOSITIONS: {
|
|
179
|
+
readonly budgetTokens: "forward";
|
|
180
|
+
readonly spentTokens: "forward";
|
|
181
|
+
readonly unsettledTokens: "forward";
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* run 级总超时截断(core `WorkflowRun.timeoutInterruption`:总超时的截止线在 run 到达终局之前已经触发才有,条件铸)。展示面审(core 型亲读):五格全是毫秒数与计数 ——
|
|
185
|
+
* `timeoutMs` 触发的那条线、`agentsCompleted` / `agentsFailed` / `agentsInFlight` 截断那一刻的三个计数(时点快照,`agentsFailed` 不是 run 级 `agentFailures`)、
|
|
186
|
+
* `approvalWaitedMs` 单条腿等审批的最长一段(下界,缺席 = 部署没供给,不是零)—— 没有文本成员 ⇒ 逐成员 `forward`,不过脱敏器,也不开自由数据通道。
|
|
187
|
+
*/
|
|
188
|
+
export declare const WORKFLOW_TIMEOUT_INTERRUPTION_DISPOSITIONS: {
|
|
189
|
+
readonly timeoutMs: "forward";
|
|
190
|
+
readonly agentsCompleted: "forward";
|
|
191
|
+
readonly agentsFailed: "forward";
|
|
192
|
+
readonly agentsInFlight: "forward";
|
|
193
|
+
readonly approvalWaitedMs: "forward";
|
|
194
|
+
};
|
|
174
195
|
export declare const WORKFLOW_RUN_DISPOSITIONS: {
|
|
175
196
|
readonly id: "forward";
|
|
176
197
|
readonly scope: "forward";
|
|
@@ -200,6 +221,22 @@ export declare const WORKFLOW_RUN_DISPOSITIONS: {
|
|
|
200
221
|
};
|
|
201
222
|
};
|
|
202
223
|
readonly agentFailures: "forward";
|
|
224
|
+
readonly budgetOvershoot: {
|
|
225
|
+
readonly nested: {
|
|
226
|
+
readonly budgetTokens: "forward";
|
|
227
|
+
readonly spentTokens: "forward";
|
|
228
|
+
readonly unsettledTokens: "forward";
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
readonly timeoutInterruption: {
|
|
232
|
+
readonly nested: {
|
|
233
|
+
readonly timeoutMs: "forward";
|
|
234
|
+
readonly agentsCompleted: "forward";
|
|
235
|
+
readonly agentsFailed: "forward";
|
|
236
|
+
readonly agentsInFlight: "forward";
|
|
237
|
+
readonly approvalWaitedMs: "forward";
|
|
238
|
+
};
|
|
239
|
+
};
|
|
203
240
|
readonly startedAt: "forward";
|
|
204
241
|
readonly endedAt: "forward";
|
|
205
242
|
readonly createdAt: "forward";
|
|
@@ -350,8 +387,6 @@ export declare const WORKFLOW_RUN_DISPOSITIONS: {
|
|
|
350
387
|
readonly sourceTaskId: "strip";
|
|
351
388
|
readonly originatingSessionId: "strip";
|
|
352
389
|
readonly effectiveArgs: "strip";
|
|
353
|
-
readonly budgetOvershoot: "strip";
|
|
354
|
-
readonly timeoutInterruption: "strip";
|
|
355
390
|
readonly resultFull: "strip";
|
|
356
391
|
readonly completionId: "strip";
|
|
357
392
|
readonly resume: "strip";
|
|
@@ -10,16 +10,27 @@ import { projectByTable } from "../../trace/projection-table.js";
|
|
|
10
10
|
const JOURNAL_PROJECTION_MEMO_CAP = 1024;
|
|
11
11
|
const journalProjectionMemo = new Map();
|
|
12
12
|
import { sendJson, sendError, sseHeaders } from "../send.js";
|
|
13
|
-
import {
|
|
13
|
+
import { gatedSubject, explicitOperatorOk, sendPrincipalRefusal } from "../principal-gate.js";
|
|
14
|
+
import { partsOf } from "../../owner-brands.js";
|
|
15
|
+
import { taskSpecIdentityOf } from "../../engine-identity.js";
|
|
14
16
|
import { assertNever } from "../route-ctx.js";
|
|
17
|
+
import { callerOf, sessionAsserted } from "../owner-access.js";
|
|
15
18
|
import * as facts from "../../capability-facts.js";
|
|
16
19
|
import { steerBodyKeyIssue } from "../../request-key-closure.js";
|
|
20
|
+
function sendWorkflowAbsent(res) {
|
|
21
|
+
sendError(res, 404, "not_found.workflow", "workflow not found");
|
|
22
|
+
}
|
|
23
|
+
const WORKFLOW_SESSION_ASSERTION = {
|
|
24
|
+
"workflow-detail": { phase: "accept", label: "workflow.detail" },
|
|
25
|
+
"workflow-journal": { phase: "accept", label: "workflow.journal" },
|
|
26
|
+
"workflow-stream": { phase: "accept", label: "workflow.stream" },
|
|
27
|
+
"workflow-agent-steer": { phase: "accept", label: "workflow.agent-steer" },
|
|
28
|
+
};
|
|
17
29
|
export async function handleWorkflows(req, res, match, ctx) {
|
|
18
30
|
const { deps } = ctx;
|
|
19
|
-
const { runSessionAcceptOk } = ctx.helpers;
|
|
20
31
|
{
|
|
21
|
-
const
|
|
22
|
-
if (deps.config.requirePrincipal && !
|
|
32
|
+
const subject = gatedSubject(req, deps.config);
|
|
33
|
+
if (deps.config.requirePrincipal && !subject) {
|
|
23
34
|
sendPrincipalRefusal(res, req, deps.config);
|
|
24
35
|
return;
|
|
25
36
|
}
|
|
@@ -38,7 +49,7 @@ export async function handleWorkflows(req, res, match, ctx) {
|
|
|
38
49
|
return;
|
|
39
50
|
}
|
|
40
51
|
const runStore = runs.store;
|
|
41
|
-
const scope = principal ?? "default";
|
|
52
|
+
const scope = taskSpecIdentityOf(subject === undefined ? undefined : partsOf(subject)).principal ?? "default";
|
|
42
53
|
const wfId = match.params.runId;
|
|
43
54
|
const isStream = match.decl.id === "workflow-stream";
|
|
44
55
|
if (match.decl.id === "workflows-list") {
|
|
@@ -62,11 +73,13 @@ export async function handleWorkflows(req, res, match, ctx) {
|
|
|
62
73
|
}
|
|
63
74
|
const run = await getWorkflowRun(runStore, wfId, scope);
|
|
64
75
|
if (!run || run.scope !== scope) {
|
|
65
|
-
|
|
76
|
+
sendWorkflowAbsent(res);
|
|
66
77
|
return;
|
|
67
78
|
}
|
|
68
|
-
if (!
|
|
79
|
+
if (!sessionAsserted(WORKFLOW_SESSION_ASSERTION[match.decl.id], req, run.originatingSessionId, callerOf(req, deps).operator)) {
|
|
80
|
+
sendWorkflowAbsent(res);
|
|
69
81
|
return;
|
|
82
|
+
}
|
|
70
83
|
if (match.decl.id === "workflow-journal") {
|
|
71
84
|
if (journalStore === undefined)
|
|
72
85
|
throw new Error("workflow-journal reached without the workflowsJournal journal witness");
|
|
@@ -154,7 +167,7 @@ export async function handleWorkflows(req, res, match, ctx) {
|
|
|
154
167
|
}
|
|
155
168
|
export async function handleWorkflowAgentSteer(req, res, match, ctx) {
|
|
156
169
|
const { deps } = ctx;
|
|
157
|
-
const { readJson, rateLimited, quotaExceeded, leaseDenied, safeDecode
|
|
170
|
+
const { readJson, rateLimited, quotaExceeded, leaseDenied, safeDecode } = ctx.helpers;
|
|
158
171
|
switch (match.decl.id) {
|
|
159
172
|
case "workflow-agent-steer":
|
|
160
173
|
break;
|
|
@@ -169,7 +182,8 @@ export async function handleWorkflowAgentSteer(req, res, match, ctx) {
|
|
|
169
182
|
sendWorkflowsUnavailable(res, runs.why);
|
|
170
183
|
return;
|
|
171
184
|
}
|
|
172
|
-
const
|
|
185
|
+
const subject = gatedSubject(req, deps.config);
|
|
186
|
+
const principal = subject === undefined ? undefined : partsOf(subject).person;
|
|
173
187
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
174
188
|
sendPrincipalRefusal(res, req, deps.config);
|
|
175
189
|
return;
|
|
@@ -197,14 +211,16 @@ export async function handleWorkflowAgentSteer(req, res, match, ctx) {
|
|
|
197
211
|
return;
|
|
198
212
|
}
|
|
199
213
|
const trusted = explicitOperatorOk(principal, deps.config);
|
|
200
|
-
const ownerScope = principal ?? "default";
|
|
214
|
+
const ownerScope = taskSpecIdentityOf(subject === undefined ? undefined : partsOf(subject)).principal ?? "default";
|
|
201
215
|
const wfRun = await getWorkflowRun(runs.store, wfRunId, ownerScope);
|
|
202
216
|
if (!trusted && !wfRun) {
|
|
203
|
-
|
|
217
|
+
sendWorkflowAbsent(res);
|
|
204
218
|
return;
|
|
205
219
|
}
|
|
206
|
-
if (wfRun && !
|
|
220
|
+
if (wfRun && !sessionAsserted(WORKFLOW_SESSION_ASSERTION["workflow-agent-steer"], req, wfRun.originatingSessionId, callerOf(req, deps).operator)) {
|
|
221
|
+
sendWorkflowAbsent(res);
|
|
207
222
|
return;
|
|
223
|
+
}
|
|
208
224
|
const sendNotRunningWf = (error) => sendError(res, 409, "steering.not_running", error);
|
|
209
225
|
const redacted = redactSteerIn(body.content, label);
|
|
210
226
|
const resolution = deps.workflowAgentRegistry?.resolve(wfRunId, label);
|
|
@@ -364,6 +380,18 @@ export const WORKFLOW_RUN_STATS_DISPOSITIONS = {
|
|
|
364
380
|
costMicroUsd: "forward",
|
|
365
381
|
nested: { nested: WORKFLOW_RUN_STATS_NESTED_DISPOSITIONS },
|
|
366
382
|
};
|
|
383
|
+
export const WORKFLOW_BUDGET_OVERSHOOT_DISPOSITIONS = {
|
|
384
|
+
budgetTokens: "forward",
|
|
385
|
+
spentTokens: "forward",
|
|
386
|
+
unsettledTokens: "forward",
|
|
387
|
+
};
|
|
388
|
+
export const WORKFLOW_TIMEOUT_INTERRUPTION_DISPOSITIONS = {
|
|
389
|
+
timeoutMs: "forward",
|
|
390
|
+
agentsCompleted: "forward",
|
|
391
|
+
agentsFailed: "forward",
|
|
392
|
+
agentsInFlight: "forward",
|
|
393
|
+
approvalWaitedMs: "forward",
|
|
394
|
+
};
|
|
367
395
|
export const WORKFLOW_RUN_DISPOSITIONS = {
|
|
368
396
|
id: "forward",
|
|
369
397
|
scope: "forward",
|
|
@@ -373,6 +401,8 @@ export const WORKFLOW_RUN_DISPOSITIONS = {
|
|
|
373
401
|
description: { redact: "redactSecrets" },
|
|
374
402
|
stats: { nested: WORKFLOW_RUN_STATS_DISPOSITIONS },
|
|
375
403
|
agentFailures: "forward",
|
|
404
|
+
budgetOvershoot: { nested: WORKFLOW_BUDGET_OVERSHOOT_DISPOSITIONS },
|
|
405
|
+
timeoutInterruption: { nested: WORKFLOW_TIMEOUT_INTERRUPTION_DISPOSITIONS },
|
|
376
406
|
startedAt: "forward",
|
|
377
407
|
endedAt: "forward",
|
|
378
408
|
createdAt: "forward",
|
|
@@ -396,8 +426,6 @@ export const WORKFLOW_RUN_DISPOSITIONS = {
|
|
|
396
426
|
sourceTaskId: "strip",
|
|
397
427
|
originatingSessionId: "strip",
|
|
398
428
|
effectiveArgs: "strip",
|
|
399
|
-
budgetOvershoot: "strip",
|
|
400
|
-
timeoutInterruption: "strip",
|
|
401
429
|
resultFull: "strip",
|
|
402
430
|
completionId: "strip",
|
|
403
431
|
resume: "strip",
|
|
@@ -32,40 +32,48 @@
|
|
|
32
32
|
* (drain 靠 `uncountedBillableInflight` 数它们),它们的席位就活到请求结束 —— 帽照样数得到它们。
|
|
33
33
|
*
|
|
34
34
|
* ## 拒的形
|
|
35
|
-
* 429 `limit.rate_exceeded`(沿用现有限流码,不新铸一枚:消费端的分支同「稍后再来」)+ 体里机读 `reason`(闭集 {@link RATE_EXCEEDED_REASONS}
|
|
36
|
-
* + `retryAfterSec`(固定 {@link
|
|
35
|
+
* 429 `limit.rate_exceeded`(沿用现有限流码,不新铸一枚:消费端的分支同「稍后再来」)+ 体里机读 `reason`(闭集 {@link RATE_EXCEEDED_REASONS},今天两词)
|
|
36
|
+
* + `retryAfterSec`(固定 {@link RATE_EXCEEDED_RETRY_AFTER_SEC});头 `Retry-After` 与体里同值,同其它限流 / 配额门的发送形(`res.setHeader("retry-after")` + `sendError`)。
|
|
37
37
|
* 拒在建行、认领会话与 SSE 头之前(受理漏斗已做的会话登记见上面「位置的两个如实」)。
|
|
38
38
|
*
|
|
39
39
|
* ## 谁需要 / 谁受伤 / 补偿
|
|
40
40
|
* 需要:共享一台 GPU 或一只小模型网关的家用 / 小团队部署。受伤:超帽者拿 429(新行为,缺省关)。补偿:缺省 0 = 关(升级零变化)+ `Retry-After` 给退避。
|
|
41
41
|
* 无主体请求(无头 service 凭据、`REQUIRE_PRINCIPAL=false` 的单用户部署)只受全局帽 —— 按主体帽对它不判(没有主体可分账)。
|
|
42
|
+
*
|
|
43
|
+
* ## 同一扇门的第二个拒因:沙箱容量(`sandbox_capacity`)
|
|
44
|
+
* local-docker 车道容器帽(`DOCKER_MAX_CONTAINERS`,`plugins/local-docker-capacity.ts`)的真闸在起容器处(子代、续跑腿、首个工具调用都只能在那里拒);
|
|
45
|
+
* 本门是它在提交面的早答:**闸里此刻有起动在等空位** ⇒ 新提交 429 `sandbox_capacity`(新 run 只会接到队尾)。门读闸的队列(`SandboxCapacityView.waiting`),
|
|
46
|
+
* 不调 docker、不另数;队列空而车道满时新提交照常放行,它的首个工具调用在起容器处等。判在两只 run 帽之前(拒时不占席位),与 run 帽同四口同位、同不判续跑 / 唤醒 / 作答。
|
|
42
47
|
*/
|
|
43
48
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
44
49
|
import type { RunAbort } from "../run-cancel-context.js";
|
|
45
50
|
import { type RefusalBody } from "./refusal-body.js";
|
|
46
51
|
import type { FlatServiceDeps } from "./server.js";
|
|
52
|
+
import type { TerminalSeat } from "./route-ctx.js";
|
|
47
53
|
/**
|
|
48
54
|
* 本副本在飞 run 的 id 集 —— `inflightRuns`(durable 腿)∪ `steerableRuns`(活流)的**唯一**并集写法:
|
|
49
55
|
* `drainState.inflight`(排空等多久)、`isRunLiveOnThisReplica`(这条 run 是不是在本副本跑)与并发帽读的是同一份。
|
|
50
56
|
* 参数取 `ReadonlyMap`:读法不改登记簿。
|
|
51
57
|
*/
|
|
52
58
|
export declare function liveRunIdsOf(inflightRuns: ReadonlyMap<string, unknown>, steerableRuns: ReadonlyMap<string, unknown>): Set<string>;
|
|
53
|
-
/** 并发帽拒的机读 `reason` 词。 */
|
|
54
|
-
export declare const RUN_CONCURRENCY_CAP_REASON: "run_concurrency_cap";
|
|
55
59
|
/**
|
|
56
60
|
* 429 `limit.rate_exceeded` 体上机读 `reason` 的**闭集**(穷举读它;加一种拒因 ⇒ 这里加一词,`switch` 的消费端编译红)。
|
|
61
|
+
* `run_concurrency_cap` = 本副本在飞 run 已到并发帽;`sandbox_capacity` = local-docker 车道容器帽前已有起动在等空位。
|
|
57
62
|
* 其余 `limit.rate_exceeded` 的产地(速率桶、赎回准入、MCP 探活、烘焙提交)不带 `reason` —— 读法是「有 `reason` 才分」。
|
|
58
63
|
*/
|
|
59
|
-
export declare const RATE_EXCEEDED_REASONS: readonly ["run_concurrency_cap"];
|
|
64
|
+
export declare const RATE_EXCEEDED_REASONS: readonly ["run_concurrency_cap", "sandbox_capacity"];
|
|
60
65
|
export type RateExceededReason = (typeof RATE_EXCEEDED_REASONS)[number];
|
|
61
|
-
/** 退避提示:固定 5 秒(是提示不是承诺 —— 在飞的 run
|
|
62
|
-
export declare const
|
|
66
|
+
/** 退避提示:固定 5 秒(是提示不是承诺 —— 在飞的 run / 在跑的容器可能再跑很久;满只说「稍后再来」)。两个拒因同值。 */
|
|
67
|
+
export declare const RATE_EXCEEDED_RETRY_AFTER_SEC = 5;
|
|
63
68
|
/** 一枚席位:放行与登记进在飞集之间占着的那一格。`release` 幂等(登记点放一次,提交门的 `finally` 再放一次兜底)。 */
|
|
64
69
|
export interface RunSlot {
|
|
65
70
|
release(): void;
|
|
66
71
|
}
|
|
67
|
-
/**
|
|
68
|
-
|
|
72
|
+
/**
|
|
73
|
+
* 提交门 429 的 `{status, body, retryAfterSec}`(一只铸点出闭集里每个拒因;体经全仓唯一组句器;状态与退避供发送口用)。
|
|
74
|
+
* 每个拒因一臂字面句(穷举 `switch`:加词而没写臂 ⇒ tsc 红;字面句让 `test/api-error-text-freeze.test.ts` 逐字冻住)。
|
|
75
|
+
*/
|
|
76
|
+
export declare function rateExceededRefusalOf(reason: RateExceededReason): {
|
|
69
77
|
readonly status: 429;
|
|
70
78
|
readonly body: RefusalBody;
|
|
71
79
|
readonly retryAfterSec: number;
|
|
@@ -75,11 +83,11 @@ export interface RunConcurrencyGate {
|
|
|
75
83
|
* 提交门的并发帽准入:放行 ⇒ 交回席位(调用点登记那一拍 / `finally` 放);超帽 ⇒ 已应答 429(+ `Retry-After`),交回 `undefined`,调用点 `return`。
|
|
76
84
|
* 位序:在幂等重放、`rateLimited` / `quotaExceeded` / `leaseDenied` / `usageWindowDenied` 之后,任何建行 / 认领 / SSE 头之前。
|
|
77
85
|
*/
|
|
78
|
-
admitRun(req: IncomingMessage, res: ServerResponse): RunSlot | undefined
|
|
86
|
+
admitRun(req: IncomingMessage, res: ServerResponse, seat: TerminalSeat): Promise<RunSlot | undefined>;
|
|
79
87
|
}
|
|
80
|
-
/** 装配口:`deps` 只读 `config`(两旋钮,每次判时现读)
|
|
88
|
+
/** 装配口:`deps` 只读 `config`(两旋钮,每次判时现读)、`logger` 与沙箱容量闸的只读面(缺席 ⇒ 不判);在飞集由 server 装配层交来(两张登记簿本身,不拷)。 */
|
|
81
89
|
export declare function createRunConcurrencyGate(ctx: {
|
|
82
|
-
deps: Pick<FlatServiceDeps, "config" | "logger">;
|
|
90
|
+
deps: Pick<FlatServiceDeps, "config" | "logger" | "sandboxCapacity">;
|
|
83
91
|
inflightRuns: ReadonlyMap<string, RunAbort>;
|
|
84
92
|
steerableRuns: ReadonlyMap<string, unknown>;
|
|
85
93
|
}): RunConcurrencyGate;
|
|
@@ -1,54 +1,67 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { gatedPerson } from "./principal-gate.js";
|
|
2
|
+
import { personOf } from "../owner-brands.js";
|
|
3
|
+
import { recoveredSubject } from "../owner-faces.js";
|
|
2
4
|
import { refusalBody } from "./refusal-body.js";
|
|
3
5
|
import { sendError } from "./send.js";
|
|
4
6
|
export function liveRunIdsOf(inflightRuns, steerableRuns) {
|
|
5
7
|
return new Set([...inflightRuns.keys(), ...steerableRuns.keys()]);
|
|
6
8
|
}
|
|
7
|
-
export const
|
|
8
|
-
export const
|
|
9
|
-
export const RUN_CONCURRENCY_RETRY_AFTER_SEC = 5;
|
|
9
|
+
export const RATE_EXCEEDED_REASONS = ["run_concurrency_cap", "sandbox_capacity"];
|
|
10
|
+
export const RATE_EXCEEDED_RETRY_AFTER_SEC = 5;
|
|
10
11
|
const UNTRACKED_SLOT = { release: () => undefined };
|
|
11
|
-
export function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
errorCode: "limit.rate_exceeded",
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
retryAfterSec: RUN_CONCURRENCY_RETRY_AFTER_SEC,
|
|
20
|
-
};
|
|
12
|
+
export function rateExceededRefusalOf(reason) {
|
|
13
|
+
const facts = { reason, retryAfterSec: RATE_EXCEEDED_RETRY_AFTER_SEC };
|
|
14
|
+
switch (reason) {
|
|
15
|
+
case "run_concurrency_cap":
|
|
16
|
+
return { status: 429, body: refusalBody({ errorCode: "limit.rate_exceeded", message: "too many runs are in flight on this server right now — nothing was started; retry after the Retry-After interval", facts }), retryAfterSec: RATE_EXCEEDED_RETRY_AFTER_SEC };
|
|
17
|
+
case "sandbox_capacity":
|
|
18
|
+
return { status: 429, body: refusalBody({ errorCode: "limit.rate_exceeded", message: "sandbox capacity reached: container starts are already waiting for a free slot — nothing was started; retry after the Retry-After interval", facts }), retryAfterSec: RATE_EXCEEDED_RETRY_AFTER_SEC };
|
|
19
|
+
}
|
|
21
20
|
}
|
|
22
21
|
export function createRunConcurrencyGate(ctx) {
|
|
23
22
|
const { deps, inflightRuns, steerableRuns } = ctx;
|
|
24
23
|
const seats = new Set();
|
|
25
|
-
function
|
|
24
|
+
async function refuse(res, exit, reason) {
|
|
25
|
+
const refusal = rateExceededRefusalOf(reason);
|
|
26
|
+
const { error, errorCode, ...extra } = refusal.body;
|
|
27
|
+
await exit.deliverTerminal(() => {
|
|
28
|
+
res.setHeader("retry-after", String(refusal.retryAfterSec));
|
|
29
|
+
sendError(res, refusal.status, errorCode, error, extra);
|
|
30
|
+
});
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
async function admitRun(req, res, exit) {
|
|
34
|
+
const waiting = deps.sandboxCapacity?.waiting() ?? 0;
|
|
35
|
+
if (waiting > 0) {
|
|
36
|
+
deps.logger?.info?.("sandbox_capacity_refused", { waiting });
|
|
37
|
+
return refuse(res, exit, "sandbox_capacity");
|
|
38
|
+
}
|
|
26
39
|
const { runMaxConcurrent: globalCap, runMaxConcurrentPerPrincipal: ownCap } = deps.config;
|
|
27
40
|
if (globalCap === 0 && ownCap === 0)
|
|
28
41
|
return UNTRACKED_SLOT;
|
|
29
|
-
const
|
|
42
|
+
const person = gatedPerson(req, deps.config);
|
|
30
43
|
const live = liveRunIdsOf(inflightRuns, steerableRuns);
|
|
31
44
|
const inFlight = live.size + seats.size;
|
|
32
45
|
let scope;
|
|
33
46
|
if (globalCap > 0 && inFlight >= globalCap)
|
|
34
47
|
scope = "global";
|
|
35
|
-
else if (ownCap > 0 &&
|
|
36
|
-
const holders = [...[...live].map((id) => inflightRuns.get(id)?.owner), ...[...seats].map((seat) => seat.
|
|
37
|
-
if (holders.filter((
|
|
48
|
+
else if (ownCap > 0 && person !== undefined) {
|
|
49
|
+
const holders = [...[...live].map((id) => personOfHolder(inflightRuns.get(id)?.owner)), ...[...seats].map((seat) => seat.person)];
|
|
50
|
+
if (holders.filter((p) => p === person).length >= ownCap)
|
|
38
51
|
scope = "principal";
|
|
39
52
|
}
|
|
40
53
|
if (scope !== undefined) {
|
|
41
|
-
deps.logger?.info?.("run_concurrency_cap_refused", { scope, inFlight, cap: scope === "global" ? globalCap : ownCap, hasPrincipal:
|
|
42
|
-
|
|
43
|
-
const { error, errorCode, ...extra } = refusal.body;
|
|
44
|
-
res.setHeader("retry-after", String(refusal.retryAfterSec));
|
|
45
|
-
sendError(res, refusal.status, errorCode, error, extra);
|
|
46
|
-
return undefined;
|
|
54
|
+
deps.logger?.info?.("run_concurrency_cap_refused", { scope, inFlight, cap: scope === "global" ? globalCap : ownCap, hasPrincipal: person !== undefined });
|
|
55
|
+
return refuse(res, exit, "run_concurrency_cap");
|
|
47
56
|
}
|
|
48
|
-
const seat = {
|
|
57
|
+
const seat = { person };
|
|
49
58
|
seats.add(seat);
|
|
50
59
|
return { release: () => void seats.delete(seat) };
|
|
51
60
|
}
|
|
52
61
|
return { admitRun };
|
|
53
62
|
}
|
|
63
|
+
function personOfHolder(owner) {
|
|
64
|
+
const subject = recoveredSubject(owner);
|
|
65
|
+
return subject === undefined ? undefined : personOf(subject);
|
|
66
|
+
}
|
|
54
67
|
//# sourceMappingURL=run-concurrency-cap.js.map
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { type RunRecord } from "../plugins/store-contracts.js";
|
|
2
2
|
import type { RunStore } from "../plugins/store-backend.js";
|
|
3
3
|
import type { ServiceConfig } from "../config-types.js";
|
|
4
|
-
/**
|
|
4
|
+
/** 读面要的部署配置(基建计价)。 */
|
|
5
5
|
export interface RunFaceDeps {
|
|
6
|
-
config: Pick<ServiceConfig, "
|
|
6
|
+
config: Pick<ServiceConfig, "infraCostRates">;
|
|
7
7
|
}
|
|
8
|
-
/** 一条行是不是「看起来失联」:盘上 `running`、而最后一次心跳早于 `runStaleSec` —— 读面把它折成 `failed`(`run.stalled`)。读它的人只此一只判据(读面与同步重放回执同读)。 */
|
|
9
|
-
export declare function runRowStale(deps: RunFaceDeps, run: RunRecord): boolean;
|
|
10
8
|
/**
|
|
11
9
|
* 一条行上的结果**当作出口结果读**(封口 + 脱敏的读入口)—— 读面的 `result` 与同步提交的重放体读的是同一只:
|
|
12
10
|
* 终局行按 taskId+updatedAt 记忆的读入口,非终局行(停驻 / 在跑)走店入口那一套封口的读入口;行上没有结果 ⇒ `undefined`。
|
|
@@ -26,7 +24,7 @@ export declare function readRunFace(deps: RunFaceDeps, runStore: RunStore, run:
|
|
|
26
24
|
msSinceLastActivity?: number | undefined;
|
|
27
25
|
taskId: string;
|
|
28
26
|
sessionId: string;
|
|
29
|
-
status:
|
|
27
|
+
status: import("@sema-agent/core").TaskStatus | "running";
|
|
30
28
|
}>;
|
|
31
29
|
/** run 行读面的值形 —— 从唯一投影口的返回型派生(不手抄键表)。 */
|
|
32
30
|
export type RunReadFace = Awaited<ReturnType<typeof readRunFace>>;
|