@sema-agent/server 7.150.0 → 7.152.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 +451 -0
- package/README.md +15 -3
- package/README.zh-CN.md +10 -2
- package/USAGE.md +144 -87
- package/deploy/sema-up/README.md +11 -4
- package/deploy/sema-up/chart/Chart.yaml +1 -1
- package/deploy/sema-up/chart/templates/NOTES.txt +5 -0
- package/deploy/sema-up/chart/templates/_helpers.tpl +15 -16
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -3
- package/deploy/sema-up/chart/templates/server.yaml +5 -3
- package/deploy/sema-up/chart/values-full-single.yaml +3 -1
- package/deploy/sema-up/chart/values.yaml +8 -1
- package/deploy/sema-up/cluster-up.sh +7 -6
- package/deploy/sema-up/kube-up.sh +6 -6
- package/deploy/sema-up/lib/flagshape.sh +36 -8
- package/deploy/sema-up/lib/helm-values-cluster.py +2 -0
- package/deploy/sema-up/lib/helm-values-kube.py +2 -0
- package/deploy/sema-up/machines.example.yaml +3 -1
- package/deploy/sema-up/sema-up.sh +22 -16
- package/dist/adoption/import.js +3 -3
- package/dist/approval-ask-audit-store.d.ts +1 -1
- package/dist/approval-ask-machine.d.ts +4 -10
- package/dist/approval-ask-retention.d.ts +1 -1
- package/dist/approval-card.d.ts +12 -14
- package/dist/approval-gate-currency.d.ts +9 -9
- package/dist/approval-gate-currency.js +3 -4
- package/dist/approval-hmac.d.ts +17 -1
- package/dist/approval-hmac.js +7 -1
- package/dist/approval-queue-kind.d.ts +1 -1
- package/dist/approval.d.ts +2 -2
- package/dist/approval.js +2 -2
- package/dist/auth-bridge.d.ts +20 -0
- package/dist/auth-bridge.js +9 -0
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.d.ts +4 -2
- package/dist/bind-host.d.ts +3 -6
- package/dist/bind-host.js +4 -7
- package/dist/boot/budget-tracing.js +1 -1
- package/dist/boot/coordinators.d.ts +1 -1
- package/dist/boot/coordinators.js +9 -10
- package/dist/boot/device-lane.js +2 -0
- package/dist/boot/engine-lease.d.ts +5 -0
- package/dist/boot/engine-lease.js +1 -0
- package/dist/boot/execution-env.d.ts +9 -14
- package/dist/boot/execution-env.js +85 -22
- package/dist/boot/execution-lane.js +32 -5
- package/dist/boot/late-binds.d.ts +8 -4
- package/dist/boot/late-binds.js +7 -1
- package/dist/boot/leader.d.ts +31 -30
- package/dist/boot/leader.js +38 -28
- package/dist/boot/leg-path-adjudication.d.ts +40 -0
- package/dist/boot/leg-path-adjudication.js +18 -0
- package/dist/boot/memory-consolidation.d.ts +3 -2
- package/dist/boot/memory-consolidation.js +6 -6
- package/dist/boot/parked-revive-gate.js +3 -15
- package/dist/boot/reapers.d.ts +6 -1
- package/dist/boot/reapers.js +13 -2
- package/dist/boot/resolve-spec.d.ts +3 -3
- package/dist/boot/resolve-spec.js +43 -48
- package/dist/boot/runner-deps.d.ts +46 -35
- package/dist/boot/runner-deps.js +94 -91
- package/dist/boot/session-age-out.d.ts +36 -0
- package/dist/boot/session-age-out.js +101 -0
- package/dist/boot/session-faces.d.ts +5 -14
- package/dist/boot/session-faces.js +9 -5
- package/dist/boot/shutdown.d.ts +6 -0
- package/dist/boot/shutdown.js +10 -4
- package/dist/boot/stage-01-config.js +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +4 -5
- package/dist/boot/stage-05-execution-env.d.ts +5 -3
- package/dist/boot/stage-05-execution-env.js +3 -2
- package/dist/boot/stage-06-runners.d.ts +9 -4
- package/dist/boot/stage-06-runners.js +24 -9
- package/dist/boot/stage-07-capability-layer.d.ts +8 -4
- package/dist/boot/stage-07-capability-layer.js +3 -2
- package/dist/boot/stage-08-reapers.d.ts +8 -4
- package/dist/boot/stage-08-reapers.js +4 -2
- package/dist/boot/stage-09-leader.d.ts +12 -5
- package/dist/boot/stage-09-leader.js +14 -5
- package/dist/boot/stage-10-http-server.d.ts +19 -5
- package/dist/boot/stage-10-http-server.js +14 -21
- package/dist/boot/stores.js +7 -4
- package/dist/boot/web-admin.js +5 -8
- package/dist/boot/workflow-orchestration.d.ts +7 -2
- package/dist/boot/workflow-orchestration.js +24 -7
- package/dist/bounded-rotation.d.ts +29 -0
- package/dist/bounded-rotation.js +24 -0
- package/dist/capabilities/approvals-push.d.ts +3 -3
- package/dist/capabilities/scenarios.d.ts +28 -13
- package/dist/capabilities/scenarios.js +2 -2
- package/dist/capability-facts.d.ts +43 -32
- package/dist/capability-facts.js +45 -51
- package/dist/card-rule-offers.d.ts +32 -0
- package/dist/card-rule-offers.js +130 -0
- package/dist/center-credential.d.ts +25 -6
- package/dist/center-credential.js +25 -5
- package/dist/config-catalog.d.ts +26 -7
- package/dist/config-catalog.js +26 -22
- package/dist/config-dir-trust.js +4 -2
- package/dist/config-invariants.d.ts +20 -8
- package/dist/config-invariants.js +55 -12
- package/dist/config-lkg.d.ts +5 -19
- package/dist/config-lkg.js +8 -62
- package/dist/config-provider.d.ts +1 -1
- package/dist/config-root-migration.d.ts +2 -2
- package/dist/config-types.d.ts +38 -42
- package/dist/config.d.ts +58 -7
- package/dist/config.js +90 -40
- package/dist/control-socket.d.ts +51 -0
- package/dist/control-socket.js +115 -0
- package/dist/deployment-governance.d.ts +2 -1
- package/dist/deployment-shape.d.ts +9 -1
- package/dist/deployment-shape.js +2 -1
- package/dist/device-protocol.d.ts +5 -4
- package/dist/device-protocol.js +1 -1
- package/dist/device-ws-hub.d.ts +7 -0
- package/dist/device-ws-hub.js +10 -3
- package/dist/device-ws-protocol.d.ts +63 -10
- package/dist/device-ws-protocol.js +56 -25
- package/dist/elicitation.js +2 -2
- package/dist/engine-identity.d.ts +19 -7
- package/dist/engine-identity.js +10 -2
- package/dist/entry-mode-clamp-notice.d.ts +2 -1
- package/dist/entry-problems.d.ts +40 -3
- package/dist/entry-problems.js +3 -1
- package/dist/execution-env-refusal.d.ts +29 -0
- package/dist/execution-env-refusal.js +8 -0
- package/dist/execution-lane-caps.d.ts +3 -1
- package/dist/field-conflict.d.ts +1 -1
- package/dist/file-history-capture.d.ts +11 -4
- package/dist/file-history-capture.js +9 -6
- package/dist/file-history-disclosure.d.ts +7 -5
- package/dist/file-history-disclosure.js +7 -5
- package/dist/fleet/drain-entry.d.ts +4 -0
- package/dist/fleet/engine-signal.d.ts +12 -29
- package/dist/fleet/engine-signal.js +1 -7
- package/dist/fleet-client.js +2 -5
- package/dist/gate-settlement.d.ts +1 -8
- package/dist/gate-settlement.js +0 -4
- package/dist/history-anchor.js +1 -1
- package/dist/hitl-delivery.d.ts +2 -3
- package/dist/hitl-delivery.js +0 -2
- package/dist/hooks/hook-llm.js +4 -2
- package/dist/hooks/hook-runner.d.ts +3 -2
- package/dist/hooks/hook-runner.js +18 -3
- package/dist/host-decision.d.ts +11 -11
- package/dist/host-lsp-manager.d.ts +2 -2
- package/dist/http/active-run-conflict.d.ts +35 -2
- package/dist/http/active-run-conflict.js +48 -19
- package/dist/http/admission.js +17 -2
- package/dist/http/approval-sweeps.d.ts +1 -1
- package/dist/http/approval-sweeps.js +10 -7
- package/dist/http/checkpoint-ctx.d.ts +4 -0
- package/dist/http/checkpoint-ctx.js +2 -0
- package/dist/http/dispatch.d.ts +8 -3
- package/dist/http/dispatch.js +59 -32
- package/dist/http/durable-run-leg.js +16 -17
- package/dist/http/health-reader.d.ts +16 -9
- package/dist/http/health-reader.js +2 -1
- package/dist/http/health-self-report.d.ts +9 -1
- package/dist/http/health-self-report.js +3 -1
- package/dist/http/owner-access.d.ts +33 -14
- package/dist/http/owner-access.js +40 -10
- package/dist/http/principal-gate.d.ts +49 -21
- package/dist/http/principal-gate.js +61 -11
- package/dist/http/request-channel.d.ts +23 -0
- package/dist/http/request-channel.js +9 -0
- package/dist/http/request-guards.js +17 -2
- package/dist/http/resume-ctx-read.js +42 -3
- package/dist/http/resume-legs.d.ts +4 -3
- package/dist/http/resume-legs.js +367 -117
- package/dist/http/route-ctx.d.ts +91 -15
- package/dist/http/route-ctx.js +17 -0
- package/dist/http/route-table.d.ts +5 -1
- package/dist/http/route-table.js +4 -0
- package/dist/http/routes/admin-config-refresh.js +3 -3
- package/dist/http/routes/admin-drain.d.ts +3 -0
- package/dist/http/routes/admin-drain.js +7 -7
- package/dist/http/routes/admin-memory-optout.d.ts +1 -1
- package/dist/http/routes/admin-memory-optout.js +3 -3
- package/dist/http/routes/adoption.js +3 -5
- package/dist/http/routes/agents-roster.js +2 -3
- package/dist/http/routes/approvals-assistant.d.ts +2 -1
- package/dist/http/routes/approvals-assistant.js +99 -51
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/capabilities.d.ts +4 -0
- package/dist/http/routes/capabilities.js +38 -10
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.js +1 -1
- package/dist/http/routes/diagnostics.d.ts +3 -3
- package/dist/http/routes/diagnostics.js +19 -7
- package/dist/http/routes/fleet.js +10 -8
- package/dist/http/routes/images.js +10 -10
- package/dist/http/routes/memory-bundle.js +3 -3
- package/dist/http/routes/memory-compliance.js +3 -3
- package/dist/http/routes/memory-consolidation.js +2 -2
- package/dist/http/routes/memory-origin.js +3 -3
- package/dist/http/routes/memory-policy.js +2 -2
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/projects.d.ts +3 -2
- package/dist/http/routes/projects.js +4 -5
- package/dist/http/routes/retention-ops.js +3 -3
- package/dist/http/routes/rules.js +5 -5
- package/dist/http/routes/run-permission-mode.d.ts +2 -1
- package/dist/http/routes/run-permission-mode.js +2 -2
- package/dist/http/routes/runs.d.ts +4 -9
- package/dist/http/routes/runs.js +171 -65
- package/dist/http/routes/session-sync.d.ts +22 -9
- package/dist/http/routes/session-sync.js +204 -107
- package/dist/http/routes/sessions-list.js +13 -7
- package/dist/http/routes/sessions.js +30 -15
- package/dist/http/routes/tasks.js +46 -41
- package/dist/http/routes/trace-usage.js +2 -2
- package/dist/http/routes/workflows.js +1 -1
- package/dist/http/server.d.ts +30 -30
- package/dist/http/server.js +16 -4
- package/dist/http/submit-ctx.d.ts +1 -1
- package/dist/http/submit-ctx.js +7 -4
- package/dist/http/wire-types.d.ts +14 -4
- package/dist/human-facing-args.d.ts +33 -0
- package/dist/human-facing-args.js +33 -0
- package/dist/identity-source.d.ts +20 -3
- package/dist/identity-source.js +14 -0
- package/dist/index.d.ts +5 -1
- package/dist/k8s-api-credentials.d.ts +29 -0
- package/dist/k8s-api-credentials.js +25 -0
- package/dist/lane-home-probe.d.ts +3 -7
- package/dist/lane-home-probe.js +2 -2
- package/dist/leader/diffup.d.ts +19 -0
- package/dist/leader/diffup.js +7 -0
- package/dist/leader/leader.d.ts +116 -11
- package/dist/leader/leader.js +69 -5
- package/dist/leader/repair-wire.js +2 -2
- package/dist/leader/run-entry.d.ts +2 -1
- package/dist/leader/run-entry.js +1 -1
- package/dist/leader/wire.d.ts +42 -132
- package/dist/leader/wire.js +81 -67
- package/dist/leg-facts.d.ts +13 -5
- package/dist/leg-facts.js +2 -1
- package/dist/memory-scope.d.ts +23 -11
- package/dist/memory-scope.js +18 -6
- package/dist/memory-sync-client.d.ts +30 -2
- package/dist/memory-sync-client.js +16 -9
- package/dist/model-entry-headers.d.ts +9 -10
- package/dist/model-entry-headers.js +0 -4
- package/dist/model-entry-refusal.d.ts +7 -4
- package/dist/model-entry-refusal.js +11 -5
- package/dist/model-plane-face.d.ts +1 -1
- package/dist/model-plane-face.js +3 -1
- package/dist/model-route-endpoint.d.ts +13 -7
- package/dist/model-route-endpoint.js +14 -11
- package/dist/model-select.d.ts +22 -0
- package/dist/model-select.js +9 -0
- package/dist/model-unreachable-notice.d.ts +11 -0
- package/dist/model-unreachable-notice.js +4 -4
- package/dist/object-store-buckets.d.ts +640 -6
- package/dist/object-store-buckets.js +166 -0
- package/dist/observability/err-text.d.ts +7 -0
- package/dist/observability/err-text.js +5 -0
- package/dist/observability/fail-open.d.ts +25 -17
- package/dist/observability/fail-open.js +25 -17
- package/dist/observability/logger.js +3 -1
- package/dist/observability/metrics.js +1 -0
- package/dist/operator-roster.d.ts +68 -0
- package/dist/operator-roster.js +32 -0
- package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
- package/dist/orchestration/workflow-notify-journal.js +12 -1
- package/dist/orchestration/workflow-park-decision.d.ts +70 -18
- package/dist/orchestration/workflow-park-decision.js +49 -10
- package/dist/orchestration/workflow-park-holder.d.ts +65 -0
- package/dist/orchestration/workflow-park-holder.js +98 -0
- package/dist/orchestration/workflow-record-fence.d.ts +36 -0
- package/dist/orchestration/workflow-record-fence.js +42 -0
- package/dist/outbound-dispatcher.d.ts +71 -8
- package/dist/outbound-dispatcher.js +48 -7
- package/dist/owner-faces.d.ts +2 -2
- package/dist/parked-decide.d.ts +106 -55
- package/dist/parked-decide.js +153 -117
- package/dist/peer-directory.d.ts +2 -2
- package/dist/peer-inbound-face.d.ts +2 -6
- package/dist/peer-inbound-face.js +0 -3
- package/dist/permission-mode-admission.d.ts +74 -5
- package/dist/permission-mode-admission.js +56 -3
- package/dist/plugins/adoption-log-sql.d.ts +3 -1
- package/dist/plugins/adoption-log-sql.js +7 -1
- package/dist/plugins/approval-ask-store-file.d.ts +14 -2
- package/dist/plugins/approval-ask-store-file.js +11 -0
- package/dist/plugins/approval-ask-store-memory.d.ts +10 -1
- package/dist/plugins/approval-ask-store-memory.js +35 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +69 -4
- package/dist/plugins/approval-ask-store-sql.js +45 -5
- package/dist/plugins/approval-exemption-store.js +3 -0
- package/dist/plugins/approval-nonce-store.js +2 -0
- package/dist/plugins/blob-backend.d.ts +83 -7
- package/dist/plugins/blob-backend.js +57 -6
- package/dist/plugins/breaker-state-sql.js +2 -0
- package/dist/plugins/caching-session-store.d.ts +9 -15
- package/dist/plugins/caching-session-store.js +6 -0
- package/dist/plugins/checkpoint-index-columns.d.ts +20 -16
- package/dist/plugins/checkpoint-index-columns.js +3 -6
- package/dist/plugins/checkpoint-store-face.d.ts +119 -61
- package/dist/plugins/checkpoint-store-face.js +134 -55
- package/dist/plugins/device-store-sql.js +6 -0
- package/dist/plugins/error-origin.d.ts +18 -0
- package/dist/plugins/error-origin.js +10 -0
- package/dist/plugins/execution-placement-sql.js +6 -6
- package/dist/plugins/image-bake-store-sql.js +6 -0
- package/dist/plugins/image-index-sql.js +4 -0
- package/dist/plugins/landed-attendants.d.ts +212 -0
- package/dist/plugins/landed-attendants.js +161 -0
- package/dist/plugins/leader-run-store-sql.js +4 -0
- package/dist/plugins/local-checkpoint-store.d.ts +13 -3
- package/dist/plugins/local-checkpoint-store.js +38 -49
- package/dist/plugins/local-session-live-reference.d.ts +40 -0
- package/dist/plugins/local-session-live-reference.js +39 -0
- package/dist/plugins/local-session-store.d.ts +71 -33
- package/dist/plugins/local-session-store.js +129 -27
- package/dist/plugins/memory-engine-pg.js +4 -0
- package/dist/plugins/memory-engine-sql-apply.js +5 -2
- package/dist/plugins/memory-engine-tidb.js +4 -0
- package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
- package/dist/plugins/memory-sync-store-pg.js +5 -0
- package/dist/plugins/memory-sync-store-tidb.js +5 -0
- package/dist/plugins/one-time-migrations.d.ts +104 -80
- package/dist/plugins/one-time-migrations.js +226 -132
- package/dist/plugins/org-delivery-quota-store.js +4 -1
- package/dist/plugins/outcome-ledger-sql.js +2 -0
- package/dist/plugins/permission-rule-store-sql.js +11 -4
- package/dist/plugins/pg-cost-quota.js +4 -0
- package/dist/plugins/pg-pool.js +35 -10
- package/dist/plugins/pg-rate-limiter.js +2 -0
- package/dist/plugins/posix-shell-fs.d.ts +6 -1
- package/dist/plugins/posix-shell-fs.js +4 -1
- package/dist/plugins/remote-env-adb.d.ts +19 -15
- package/dist/plugins/remote-env-adb.js +41 -15
- package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
- package/dist/plugins/remote-env-connect-seat.js +72 -0
- package/dist/plugins/remote-env-device.d.ts +22 -5
- package/dist/plugins/remote-env-device.js +106 -8
- package/dist/plugins/remote-env-e2b.d.ts +15 -6
- package/dist/plugins/remote-env-e2b.js +42 -32
- package/dist/plugins/remote-env-file-error.js +6 -2
- package/dist/plugins/remote-env-host.d.ts +46 -10
- package/dist/plugins/remote-env-host.js +124 -52
- package/dist/plugins/remote-env-k8s.d.ts +109 -41
- package/dist/plugins/remote-env-k8s.js +160 -54
- package/dist/plugins/remote-env-local-docker.d.ts +13 -8
- package/dist/plugins/remote-env-local-docker.js +34 -41
- package/dist/plugins/remote-env-ssh.d.ts +18 -12
- package/dist/plugins/remote-env-ssh.js +60 -59
- package/dist/plugins/remote-shell.d.ts +98 -1
- package/dist/plugins/remote-shell.js +218 -0
- package/dist/plugins/replica-registration.d.ts +1 -1
- package/dist/plugins/replica-registration.js +1 -1
- package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
- package/dist/plugins/resume-anchor-store-sql.js +12 -5
- package/dist/plugins/retention-lane-store-sql.js +4 -0
- package/dist/plugins/retention-sql.d.ts +20 -2
- package/dist/plugins/retention-sql.js +11 -0
- package/dist/plugins/run-store-sql.d.ts +21 -2
- package/dist/plugins/run-store-sql.js +31 -7
- package/dist/plugins/s3-presign.d.ts +23 -0
- package/dist/plugins/s3-presign.js +37 -3
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +1 -1
- package/dist/plugins/scenario-prefix-switch-m42.js +2 -2
- package/dist/plugins/scheduler-support.d.ts +2 -2
- package/dist/plugins/scheduler-support.js +0 -3
- package/dist/plugins/schema-consistency.d.ts +4 -2
- package/dist/plugins/schema-consistency.js +19 -2
- package/dist/plugins/schema-indexes.js +2 -0
- package/dist/plugins/send-file-ledger.d.ts +2 -2
- package/dist/plugins/send-file-ledger.js +5 -2
- package/dist/plugins/send-user-file.d.ts +3 -4
- package/dist/plugins/send-user-file.js +56 -52
- package/dist/plugins/serving-requirement.d.ts +26 -7
- package/dist/plugins/serving-requirement.js +11 -4
- package/dist/plugins/session-birth.d.ts +6 -2
- package/dist/plugins/session-blob-claim-token.d.ts +15 -0
- package/dist/plugins/session-blob-claim-token.js +20 -0
- package/dist/plugins/session-blob-namespace.d.ts +46 -0
- package/dist/plugins/session-blob-namespace.js +116 -0
- package/dist/plugins/session-capture-record-store-sql.js +2 -0
- package/dist/plugins/session-ext-table.d.ts +14 -1
- package/dist/plugins/session-ext-table.js +5 -1
- package/dist/plugins/session-row-sql.d.ts +49 -2
- package/dist/plugins/session-row-sql.js +56 -13
- package/dist/plugins/session-store-sql.d.ts +34 -18
- package/dist/plugins/session-store-sql.js +98 -17
- package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
- package/dist/plugins/shared-memory-store-sql.js +6 -2
- package/dist/plugins/snapshot-bucket-presence.d.ts +25 -2
- package/dist/plugins/snapshot-bucket-presence.js +8 -2
- package/dist/plugins/sql-driver.d.ts +2 -1
- package/dist/plugins/sql-driver.js +18 -3
- package/dist/plugins/sql-errors.d.ts +11 -6
- package/dist/plugins/sql-errors.js +5 -6
- package/dist/plugins/sql-json-column.d.ts +1 -1
- package/dist/plugins/stop-then-start-sentence.d.ts +10 -4
- package/dist/plugins/stop-then-start-sentence.js +14 -10
- package/dist/plugins/stop-then-start.d.ts +109 -0
- package/dist/plugins/stop-then-start.js +104 -0
- package/dist/plugins/store-backend.d.ts +84 -15
- package/dist/plugins/store-backend.js +236 -72
- package/dist/plugins/store-boundary.d.ts +57 -0
- package/dist/plugins/store-boundary.js +139 -0
- package/dist/plugins/store-contracts.d.ts +17 -0
- package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
- package/dist/plugins/store-fault-sentence-m53.js +25 -0
- package/dist/plugins/store-fault.d.ts +26 -7
- package/dist/plugins/store-fault.js +18 -2
- package/dist/plugins/task-attachment-store.d.ts +2 -1
- package/dist/plugins/task-attachment-store.js +14 -1
- package/dist/plugins/task-list-store-sql.d.ts +2 -2
- package/dist/plugins/task-list-store-sql.js +10 -8
- package/dist/plugins/tidb-cost-quota.js +4 -0
- package/dist/plugins/tidb-pool.js +21 -25
- package/dist/plugins/tidb-rate-limiter.js +4 -0
- package/dist/plugins/user-input-ledger-sql.js +4 -0
- package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
- package/dist/plugins/workflow-run-store-sql.js +64 -4
- package/dist/plugins/workspace-custody.d.ts +4 -3
- package/dist/plugins/workspace-fill.d.ts +4 -7
- package/dist/plugins/workspace-fill.js +2 -1
- package/dist/plugins/write-behind-counter.js +5 -0
- package/dist/project-context.d.ts +0 -2
- package/dist/project-context.js +4 -8
- package/dist/project-registry.d.ts +46 -0
- package/dist/project-registry.js +44 -0
- package/dist/question.d.ts +2 -1
- package/dist/question.js +5 -13
- package/dist/request-form.d.ts +6 -1
- package/dist/request-form.js +4 -1
- package/dist/request-key-closure.js +1 -1
- package/dist/request-value-closure.d.ts +4 -0
- package/dist/request-value-closure.js +10 -0
- package/dist/rule-issue-reading.d.ts +1 -1
- package/dist/rules-consent.d.ts +1 -1
- package/dist/run-acceptance.d.ts +3 -2
- package/dist/run-acceptance.js +4 -6
- package/dist/run-local.js +9 -9
- package/dist/runs.d.ts +54 -16
- package/dist/runs.js +67 -13
- package/dist/runtime-governance.d.ts +5 -4
- package/dist/security.d.ts +30 -32
- package/dist/security.js +41 -7
- package/dist/sema-config-dir.d.ts +2 -1
- package/dist/server-secret-env.d.ts +12 -10
- package/dist/server-secret-env.js +24 -15
- package/dist/session-bindings.d.ts +82 -0
- package/dist/session-bindings.js +18 -0
- package/dist/session-children-retire.d.ts +2 -2
- package/dist/session-children-retire.js +2 -6
- package/dist/session-deletion.d.ts +16 -1
- package/dist/session-error-wire.d.ts +3 -3
- package/dist/session-error-wire.js +3 -3
- package/dist/session-incarnation.d.ts +10 -0
- package/dist/session-incarnation.js +10 -1
- package/dist/session-kind.d.ts +57 -0
- package/dist/session-kind.js +22 -0
- package/dist/session-row.d.ts +21 -1
- package/dist/session-row.js +7 -1
- package/dist/session-sync-kernel.d.ts +24 -14
- package/dist/session-sync-kernel.js +3 -6
- package/dist/session-sync.d.ts +25 -103
- package/dist/session-sync.js +14 -76
- package/dist/session-titler.d.ts +10 -3
- package/dist/session-titler.js +19 -6
- package/dist/ssh-host-key.d.ts +5 -0
- package/dist/ssh-host-key.js +3 -0
- package/dist/stores-sql/blob-index-sql.d.ts +30 -9
- package/dist/stores-sql/blob-index-sql.js +40 -21
- package/dist/stores-sql/checkpoint-store-sql.d.ts +54 -27
- package/dist/stores-sql/checkpoint-store-sql.js +70 -146
- package/dist/stores-sql/file-history-store-sql.d.ts +113 -15
- package/dist/stores-sql/file-history-store-sql.js +205 -95
- package/dist/stores-sql/pg-session-storage.d.ts +34 -7
- package/dist/stores-sql/pg-session-storage.js +37 -13
- package/dist/stores-sql/retention-store-sql.d.ts +1 -9
- package/dist/stores-sql/retention-store-sql.js +5 -19
- package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
- package/dist/stores-sql/session-policy-store-sql.js +61 -44
- package/dist/stores-sql/session-write-hooks.d.ts +11 -0
- package/dist/stores-sql/tidb-session-store.d.ts +58 -7
- package/dist/stores-sql/tidb-session-store.js +37 -13
- package/dist/submission-exit.d.ts +3 -2
- package/dist/submission-exit.js +9 -1
- package/dist/task-cwd.d.ts +2 -2
- package/dist/task-settings.d.ts +7 -5
- package/dist/task-settings.js +3 -3
- package/dist/terminal.d.ts +33 -2
- package/dist/terminal.js +139 -9
- package/dist/tool-approval.d.ts +465 -507
- package/dist/tool-approval.js +606 -1222
- package/dist/trace/core-keyset-guard.d.ts +1 -1
- package/dist/trace/ledger-events.d.ts +3 -3
- package/dist/trace/project.d.ts +2 -3
- package/dist/trace/redact.js +3 -2
- package/dist/trace/self-minted-wire.d.ts +571 -178
- package/dist/trace/self-minted-wire.js +189 -56
- package/dist/web-admin-client/apply-effective.js +2 -2
- package/dist/web-admin-client/read-warnings.d.ts +2 -2
- package/dist/web-admin-client/read-warnings.js +1 -1
- package/dist/web-admin-client/types.d.ts +1 -1
- package/dist/workspace-space.d.ts +10 -4
- package/dist/workspace-space.js +4 -1
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +79 -28
- package/package.json +7 -3
- package/scripts/embed-minimal.mjs +3 -3
- package/wire-changes/server@7.151.0.json +762 -0
- package/wire-changes/server@7.152.0.json +900 -0
- package/dist/config-d-migration.d.ts +0 -37
- package/dist/config-d-migration.js +0 -60
- package/dist/http/session-inherit-env.d.ts +0 -36
- package/dist/http/session-inherit-env.js +0 -6
package/dist/approval-card.d.ts
CHANGED
|
@@ -590,8 +590,8 @@ export declare const ApprovalCardSchema: z.ZodObject<{
|
|
|
590
590
|
inputHasBidi: z.ZodOptional<z.ZodLiteral<true>>;
|
|
591
591
|
allowRuleShadowed: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
592
592
|
member: z.ZodEnum<{
|
|
593
|
-
request: "request";
|
|
594
593
|
deployment: "deployment";
|
|
594
|
+
request: "request";
|
|
595
595
|
skill: "skill";
|
|
596
596
|
hook: "hook";
|
|
597
597
|
persisted: "persisted";
|
|
@@ -723,7 +723,7 @@ export type ApprovalCard = z.infer<typeof ApprovalCardSchema>;
|
|
|
723
723
|
* `schema_version` 列同值,列供 SQL 侧过滤,信封里这份供读面在解出内容**之前**判形)。
|
|
724
724
|
*
|
|
725
725
|
* `approvalId` = 这张卡**呈出时**的 wire 身份。7.133.0 起它恒等于行的键 `askId`(一只 ask 一只 wire 身份),本服务的活读者(重放帧 /
|
|
726
|
-
*
|
|
726
|
+
* 决断口 / 读口)一律读行的键、不读这一格;写它是给滚动升级窗里上一版的副本(它们的 strict 信封 schema 要求这一格并照它重放)。
|
|
727
727
|
* 唯一读这一格的是 local 车道的启动收敛 —— 拿它去审计账里查前世这只 ask 的成因:审计行记的就是当时呈出的那个 id
|
|
728
728
|
* (更早写下的行上是当年的登记本地 id)。
|
|
729
729
|
*
|
|
@@ -768,8 +768,8 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
|
|
|
768
768
|
inputHasBidi: z.ZodOptional<z.ZodLiteral<true>>;
|
|
769
769
|
allowRuleShadowed: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
770
770
|
member: z.ZodEnum<{
|
|
771
|
-
request: "request";
|
|
772
771
|
deployment: "deployment";
|
|
772
|
+
request: "request";
|
|
773
773
|
skill: "skill";
|
|
774
774
|
hook: "hook";
|
|
775
775
|
persisted: "persisted";
|
|
@@ -1032,8 +1032,8 @@ export declare function buildApprovalRequestFrame(input: {
|
|
|
1032
1032
|
* ({@link adoptStoredLiveFacts};行 = 真源)。带 NUL / 孤代理的一组不落座(某个后端存不下逐字的那一份,见 {@link buildApprovalCardEnvelope})。
|
|
1033
1033
|
* 卡面(`ApprovalCardSchema`)照旧不带这十一位(`approvalCard` 除外,见本注末段):
|
|
1034
1034
|
* 它们在帧顶层、不在 `card` 里,信封上是卡旁边的一座,不是卡的键。
|
|
1035
|
-
* `readRootCandidate` 随重放的射程与卡上 `ruleOffers` 同一句(`ApprovalCardSchema.ruleOffers` 顶注):回授经重放帧自己的 `
|
|
1036
|
-
*
|
|
1035
|
+
* `readRootCandidate` 随重放的射程与卡上 `ruleOffers` 同一句(`ApprovalCardSchema.ruleOffers` 顶注):回授经重放帧自己的 `askId` 走决断口的 live 形(体键 `readRootGrant`),
|
|
1036
|
+
* 有等待腿的副本兑得动;接管登记上没有等待腿,决定照收、目录不加;停驻形带它 ⇒ 400、没有等待腿可交(没有 `approval.read_root_granted` 通告 = 什么都没加)。
|
|
1037
1037
|
*
|
|
1038
1038
|
* `requiresRealApproval` 不在表里:卡上 `risk.requiresRealApproval` 是同一个事实(铸卡第三参就是它),一个事实一个读法。
|
|
1039
1039
|
* ⚠️ **`approvalCard` 是表里唯一一位 7.136.0 起同时在卡上的座**(`ApprovalCardSchema.approvalCard`:断连重放的卡要渲回同一张专卡,卡词必须进卡;
|
|
@@ -1054,9 +1054,8 @@ export declare function adoptStoredLiveFacts(frame: ApprovalRequestLiveFacts, se
|
|
|
1054
1054
|
/**
|
|
1055
1055
|
* [ref] §3.1 的呈卡帧(设计稿 §4.1 逐字)。
|
|
1056
1056
|
*
|
|
1057
|
-
* 🔴
|
|
1058
|
-
*
|
|
1059
|
-
* 一帧都不发;协议未上场的腿只发旧族。同一只 ask 在同一条腿上不再有两种开卡帧,消费方不再按 `approvalId` 去重。
|
|
1057
|
+
* 🔴 **审批只有这一个帧族**:一只 ask 的开卡 / 消卡 / 撤卡只走本族(`approval_request` / {@link ApprovalCompleteFrame} / {@link ApprovalRevokeFrame});
|
|
1058
|
+
* 呈卡协议不上场的 worker 不呈卡(问交无人值守政策口),没有回退发的另一族。
|
|
1060
1059
|
* 开卡的全部事实因此在本帧上:卡(`card`,耐久信封)+ 活面事实座({@link ApprovalRequestLiveFacts};活铸帧与重放帧同一份,见 {@link APPROVAL_REQUEST_LIVE_FACT_KEYS} 顶注)。
|
|
1061
1060
|
*/
|
|
1062
1061
|
export interface ApprovalRequestFrame extends ApprovalRequestLiveFacts {
|
|
@@ -1066,7 +1065,7 @@ export interface ApprovalRequestFrame extends ApprovalRequestLiveFacts {
|
|
|
1066
1065
|
* 活铸帧恒不带;行上有座的重放帧不带(座里缺的那一位就是真缺席)。不回填:存量行随窗到期收敛。
|
|
1067
1066
|
*/
|
|
1068
1067
|
liveFactsUnknown?: true;
|
|
1069
|
-
/** = SSE
|
|
1068
|
+
/** = SSE 具名事件名。 */
|
|
1070
1069
|
type: "approval_request";
|
|
1071
1070
|
schemaVersion: 1;
|
|
1072
1071
|
/** `deriveAskId` 派生(持久层主键;八元身份元组 —— 7.109.0 起含这一问的类集,7.143.0 起含展示的动作(工具名 + 入参摘要) —— 见 approval-ask-machine.ts)。 */
|
|
@@ -1082,22 +1081,21 @@ export interface ApprovalRequestFrame extends ApprovalRequestLiveFacts {
|
|
|
1082
1081
|
expiresAtMs: number;
|
|
1083
1082
|
serverNowMs: number;
|
|
1084
1083
|
/**
|
|
1085
|
-
* server 扩(不在设计字面)
|
|
1086
|
-
*
|
|
1084
|
+
* server 扩(不在设计字面):**恒等于 `askId`**(行的键就是这只 ask 唯一的 wire 身份;本族的消卡帧({@link ApprovalCompleteFrame})同带它)。
|
|
1085
|
+
* 7.152.0 起读它的两条口已删(决断口 / 读口按 `askId` 寻址),这一键只剩自指。
|
|
1087
1086
|
*/
|
|
1088
1087
|
approvalId: string;
|
|
1089
1088
|
}
|
|
1090
1089
|
/**
|
|
1091
1090
|
* 呈卡族的**单卡消卡帧**(`approval_complete`)—— 一只 ask 落定时发给每一条**收到过它的呈卡帧**的呈卡腿连接。
|
|
1092
1091
|
*
|
|
1093
|
-
*
|
|
1094
|
-
* `parked`),只是它属于本族:键与开卡帧对位(`askId` / `taskId` / `approvalId`,开卡帧上有的身份这里都有),消卡按开卡那一帧的键。
|
|
1092
|
+
* 一次 settle 的判决(`outcome` 三词、非人结局的 `cause`、park 路由的 `parked`):键与开卡帧对位(`askId` / `taskId` / `approvalId`,开卡帧上有的身份这里都有),消卡按开卡那一帧的键。
|
|
1095
1093
|
* 与 {@link ApprovalRevokeFrame} 的分工:撤卡帧是**批级**的(兄弟被赢家连坐成 `VOID` 的那一批,名单 = 那一次原子事务的行集,
|
|
1096
1094
|
* 不带逐卡终局);本帧是**单卡**的终局(人答 / 窗到期 / park 路由 / 取消 …)。同一只 ask 两帧都可能收到(被撤的兄弟自己的
|
|
1097
1095
|
* 登记也按 settle 收场)—— 按 `askId` 清卡即可,两帧不冲突。
|
|
1098
1096
|
*
|
|
1099
1097
|
* 投递 = 开卡帧的同一只腿传输(`hitl-delivery.ts`:先本 run 账本、再直写 —— sync 腿有 durable run 行时两只都有,bg / resume 腿只有账本)。
|
|
1100
|
-
* 门 = 这条连接上**接下过开卡帧的那几只 sink**(没见过开卡帧的 sink 收到消卡帧就是孤儿 close
|
|
1098
|
+
* 门 = 这条连接上**接下过开卡帧的那几只 sink**(没见过开卡帧的 sink 收到消卡帧就是孤儿 close;配对在竞速机一处)。
|
|
1101
1099
|
*/
|
|
1102
1100
|
export interface ApprovalCompleteFrame {
|
|
1103
1101
|
/** = SSE 具名事件名(同 `approval_request` 约定)。 */
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 一张停驻审批卡的「门」此刻还是不是它 ——
|
|
2
|
+
* 一张停驻审批卡的「门」此刻还是不是它 —— 续跑腿判 `approval_stale`(`/decide` 与决断口的停驻形都经它)与按问读口 `state` 的**同一只判官**。
|
|
3
3
|
*
|
|
4
4
|
* ## 病灶(为什么要有这一只)
|
|
5
5
|
* 问账行 `PARKED` 是终态(`approval-ask-machine.ts`:`PARKED: []`):赎回腿的单赢者是 **checkpoint 的 CAS**,取消腿动的也是 checkpoint(先 `expire` 门、再驱 run 终局),
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* 两条腿都不改 ask 行的态(赎回受理之后只把决定记在行上,行仍 `PARKED`;门被引擎重开了行也不知道)。于是「这张卡的门还在不在」这件事只有 checkpoint 店知道;读口若只看行,就会在卡被答过 / run 被取消之后继续说 `parked` 并指路去决定,
|
|
7
|
+
* 而 7.151.x 及以前的应答口(7.152.0 起已删)对同一张卡早已答 `409 approval_stale`。同一件事两个读法 —— 本模块把它收成一个:读的是同一个问题、同一个来源。
|
|
8
8
|
*
|
|
9
9
|
* ## 判官
|
|
10
|
-
* 问题:**这把 gate token 是不是该会话当前待决的审批门?**(
|
|
10
|
+
* 问题:**这把 gate token 是不是该会话当前待决的审批门?**(续跑腿的答法:`resumeCheckpoint` 的 stale 臂 —— 回显的 token ≠ 该会话当前待决的审批门 ⇒ `409 approval_stale`。)
|
|
11
11
|
* · {@link sightsCurrentGate} —— 「决断方回显的**门身份**(token / `checkpointId`)是不是当前门的同一面」的**唯一**比较(`approval_stale` 律,两道决断门一条,见下一节);
|
|
12
12
|
* 本仓每一处拿**决断方 / 读口给的那把**门身份比「是不是当前门」都经它(`/decide` 的 token 回显、计划审阅的身份回显、下面的 {@link readGateCurrency});
|
|
13
13
|
* 服务端对**自己选出的那张卡**的复核不是回显比较,不经它(`drivePlanReview` 的卡令牌复核答认领输家 `409 conflict.not_resumable`、唤醒腿的赢家比较);
|
|
14
14
|
* 射程:本判官问的是「**哪扇门**」;`/decide` 的 [ref] 第二源问的是「**哪只调用**」(回显的 `boundCallId` vs 载入行的 `toolCallId`)—— 两问不同,所以是两条比较,
|
|
15
15
|
* 不是「不能并」:它们共用同一个 409 答复,缺值规则各按各的问题定(说不出门身份 ⇒ 判「不是」;行上没有 `toolCallId` ⇒ 那一问不判,交引擎的绑定等值校验 fail-closed 兜)。
|
|
16
16
|
* 过期决断的 409 一族(门身份 / 调用绑定两问怎么排成一族、老行那一形答哪个码)是 7.138.0 的设计票(DEBTS-server,主会话开票);
|
|
17
|
-
* · {@link currentApprovalGateToken} —— 该会话当前待决的审批门(审批门型优先,没有再退到任一待决行)
|
|
17
|
+
* · {@link currentApprovalGateToken} —— 该会话当前待决的审批门(审批门型优先,没有再退到任一待决行);续跑腿的 stale 臂读它,读口读它,别处不再内联第二份;
|
|
18
18
|
* · {@link readGateCurrency} —— 一把 token 对着它的读数:`current`(带那一行)/ `absent`(店里没有这一行)/ `settled`(行在,但不再是当前待决门:已结算、已过期、被取代);
|
|
19
19
|
* · {@link createParkedGateRead} —— 协调器读口的门读席:把读数译成读口要的四种读法({@link ParkedGateReading}),`state` 闭集不加字。
|
|
20
20
|
*
|
|
@@ -46,19 +46,19 @@
|
|
|
46
46
|
* ## `settled` 怎么译(读口只说 checkpoint 上有凭据的话;一条规矩)
|
|
47
47
|
* 落盘的行不受类型面约束(旧版 / 手改 / 坏体 / 更新版本 core 写下的行可带闭集外的词或坏形),所以已结算门只按**一条规矩**读:
|
|
48
48
|
* ① 两个闭集词(行的 `status`、结算记录的种类 `settlement.kind`)各查一张穷举表,**同一查法**({@link throughTable}:只认表自己的键,非字符串不进表):
|
|
49
|
-
* 表明说 `decided` ⇒ 往下读;明说 `void` ⇒ `void`(没有人决过它,答案无处兑现 —— 已过期〔取消 /
|
|
49
|
+
* 表明说 `decided` ⇒ 往下读;明说 `void` ⇒ `void`(没有人决过它,答案无处兑现 —— 已过期〔取消 / 收割〕、仍待决却不是当前门〔被取代,决断口的停驻形答 `approval_stale`〕、
|
|
50
50
|
* 结算种类是引擎窗到期 / 宿主 SLA 扫 / 无人可答的失败族);**表外 ⇒ `unknown`**(读不懂的词撑不起「有人决过」,也撑不起「没有人决过它」);
|
|
51
51
|
* ② 结算赢家的门记录 `resolvedOutcome.gateOutcome` 先过 core 唯一的门记录筛 `screenGateOutcome`(**档案读法**:读回的耐久行,闭集 = 今日成员 ∪ 已退役词;
|
|
52
52
|
* 坏形记缺陷、绝不抛;本仓 `trace/project.ts` 投影同一种记录也只经这一只筛),有缺陷 ⇒ `unknown`,过了筛才读它的成员。core 7.56.0 [ref] 起筛自己判
|
|
53
53
|
* I10(`settlement.when` 是有限数)与 I11(调用方把赢家的 `decision` 一并交给筛:它是赢家拿得出的词,方向与记录的结算种类 / 处置同向)—— 本判官在同一次筛调用里
|
|
54
54
|
* 交 `winnerDecision`,时刻与方向的手判随之退役;
|
|
55
55
|
* ③ 分类之前记录要**读得全**:有结算记录、赢家绑的是这一行的调用且判词是 allow / deny(与
|
|
56
|
-
* `findDecidedApprovalsForBinding` 同一只 {@link approvalDecisionOfWinner})—— 缺一个都是 `unknown`(**不编一个首决**;读口答 404
|
|
56
|
+
* `findDecidedApprovalsForBinding` 同一只 {@link approvalDecisionOfWinner})—— 缺一个都是 `unknown`(**不编一个首决**;读口答 404,决断口的停驻臂读作门上没站着决定;
|
|
57
57
|
* `void` 也要读得全:绑在别的调用上的结算说的不是这张卡);读全了再按**结算种类**表分类:人 / 策略的四个种类 ⇒ `decided`(理由取自赢家的 `reason`),其余十个 ⇒ `void`
|
|
58
58
|
* (按种类不按当事方:跨版本稳定的是种类词,变过义的是当事方词 —— 此前版本的策略拒记 `policy_refused` + `who.party:"none"`,此后记 `"policy"`,按当事方查会把那一代合法历史记录读成 `void`);
|
|
59
59
|
* ④ 读的只是行的内容、不碰店:内容坏到读的时候抛(行上缺了必填成员)同样是坏行 ⇒ `unknown`,不冒成店故障(读口对店故障退回 `parked`)。
|
|
60
60
|
* `unknown` 的这一类(`decision_unreadable`)带上读不出的那几处(缺陷句,非空):读口答 404 `tool_approval.not_pending`,并记一行 error(首句 + 计数)。
|
|
61
|
-
* 行没了 ⇒ `unknown`(`row_absent
|
|
61
|
+
* 行没了 ⇒ `unknown`(`row_absent`;赎回席对「checkpoint 行没了」的 404 `not_found.approval`〔决断口渲成 `not_found.ask`〕同判)。
|
|
62
62
|
*
|
|
63
63
|
* ## 盲区(core 的筛仍不判的一处,如实写下)
|
|
64
64
|
* · 种类 × 当事方的配对(结算种类与 `settlement.who` 的当事方是否相配)—— 筛不判(core [ref]),本判官也不核:读的是种类。只有坏行 / 手改行才走得到。
|
|
@@ -99,7 +99,7 @@ export interface GateCurrencyStore {
|
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
101
|
* 该会话**当前待决的审批门**的 token:审批门型({@link APPROVAL_GATE_KINDS})优先 —— 同会话 `task_done` 纯 park 与新 run 的审批 park 可以并存(表无 per-session pending 唯一约束),
|
|
102
|
-
* 无序读会选中别的门型 —— 没有审批门才退到任一待决行(错门型诊断由 `/decide` 的 gate-kind 守卫点名)
|
|
102
|
+
* 无序读会选中别的门型 —— 没有审批门才退到任一待决行(错门型诊断由 `/decide` 的 gate-kind 守卫点名)。续跑腿的 stale 臂与按问读口读这一只。
|
|
103
103
|
*/
|
|
104
104
|
export declare function currentApprovalGateToken(cs: Pick<GateCurrencyStore, "findPendingTokenBySession">, sessionId: string): Promise<CheckpointToken | null | undefined>;
|
|
105
105
|
/** 一把 gate token 对着判官的读数(`current` / `settled` 带分类用的那一行)。 */
|
|
@@ -91,21 +91,20 @@ function readWinner(checkpoint, gateBoundCallId) {
|
|
|
91
91
|
if (byKind !== "decided")
|
|
92
92
|
return byKind;
|
|
93
93
|
const note = typeof winner?.reason === "string" && winner.reason !== "" ? winner.reason : undefined;
|
|
94
|
-
return { kind: "decided", decision: direction
|
|
94
|
+
return { kind: "decided", decision: direction, decidedAtMs: settlement.when, ...(note !== undefined ? { decisionNote: note } : {}) };
|
|
95
95
|
}
|
|
96
96
|
function isReopenReason(word) {
|
|
97
97
|
return typeof word === "string" && REOPEN_REASONS.includes(word);
|
|
98
98
|
}
|
|
99
99
|
function openReading(checkpoint, gateBoundCallId) {
|
|
100
|
-
const generation = checkpointRevOf(checkpoint);
|
|
101
100
|
const reason = checkpoint.reopenReason;
|
|
102
101
|
if (!isReopenReason(reason))
|
|
103
|
-
return { kind: "open"
|
|
102
|
+
return { kind: "open" };
|
|
104
103
|
const prior = decisionReading(checkpoint, gateBoundCallId);
|
|
105
104
|
const reopened = prior.kind === "decided"
|
|
106
105
|
? { reason, decision: prior.decision, decidedAtMs: prior.decidedAtMs, ...(prior.decisionNote !== undefined ? { decisionNote: prior.decisionNote } : {}) }
|
|
107
106
|
: { reason };
|
|
108
|
-
return { kind: "open",
|
|
107
|
+
return { kind: "open", reopened };
|
|
109
108
|
}
|
|
110
109
|
export function createParkedGateRead(cs) {
|
|
111
110
|
return async ({ gateToken, gateBoundCallId }) => {
|
package/dist/approval-hmac.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ParsedPersistRule } from "./tool-approval.js";
|
|
1
2
|
import type { QuestionAnswer } from "@sema-agent/core";
|
|
2
3
|
import type { ApprovalHmacKey } from "./auth-keys.js";
|
|
3
4
|
/**
|
|
@@ -76,6 +77,15 @@ export declare function projectQuestionAnswer(a: QuestionAnswer): QuestionAnswer
|
|
|
76
77
|
* 而是先投影(签它)、再由本函数重建(送它)—— 中间没有第二条路径,所以「签了 A 却转发了 A′」
|
|
77
78
|
* 在结构上不可能。`note` 为 `null` ⇒ **不造键**(与 core `QuestionAnswerItem.note?` 的缺席同义)。 */
|
|
78
79
|
export declare function questionAnswerFromProjection(p: QuestionAnswerProjection): QuestionAnswer;
|
|
80
|
+
/**
|
|
81
|
+
* 「不再询问」规则位(`/decide` 体上的 `persistRule`,已过唯一体形判官)在签名载荷里的**投影**:一只定序元组 —— batch 臂 `["batch", 下标]`,文本两臂
|
|
82
|
+
* `["text", 规则文本, edited]`。签的是投影、转发的是由同一份投影重建的那一位({@link persistRuleFromProjection}),「签了 A 却兑了 A′」结构上不可能(与 `answer` 同形)。
|
|
83
|
+
* 不送它的签名器零改动(扩展位,缺席 ⇒ 一个字节都不追加)。
|
|
84
|
+
*/
|
|
85
|
+
export type PersistRuleProjection = readonly ["batch", number] | readonly ["text", string, boolean];
|
|
86
|
+
export declare function projectPersistRule(slot: ParsedPersistRule): PersistRuleProjection;
|
|
87
|
+
/** 投影 → 兑付收的那一位(**「签的 = 兑的」的兑现点**)。 */
|
|
88
|
+
export declare function persistRuleFromProjection(p: PersistRuleProjection): ParsedPersistRule;
|
|
79
89
|
/**
|
|
80
90
|
* 信封的**扩展键闭集**(字典序 = 声明序 = `ext` 的 JSON 键序)。
|
|
81
91
|
*
|
|
@@ -83,7 +93,7 @@ export declare function questionAnswerFromProjection(p: QuestionAnswerProjection
|
|
|
83
93
|
* 下面那两条编译期门当场红。**不许有第三种在场判**:恒 `!== undefined`(不是真值判、也不是 `?? null`
|
|
84
94
|
* 折叠)—— `null` 与缺席在扩展位上是两个不同的被签值(「签名方明说这次不动」≠「签名方不知道有这个键」)。
|
|
85
95
|
*/
|
|
86
|
-
export declare const APPROVAL_ENVELOPE_EXT_KEYS: readonly ["answer", "checkpointId", "permissionModeAfter"];
|
|
96
|
+
export declare const APPROVAL_ENVELOPE_EXT_KEYS: readonly ["answer", "checkpointId", "permissionModeAfter", "persistRule"];
|
|
87
97
|
export type ApprovalEnvelopeExtKey = (typeof APPROVAL_ENVELOPE_EXT_KEYS)[number];
|
|
88
98
|
/** The canonical envelope both {@link approvalHmacMessage} (the signer's/verifier's shared byte-rule) and
|
|
89
99
|
* {@link verifyApprovalHmac} take — ONE named type so the two signatures cannot silently drift into two
|
|
@@ -128,6 +138,12 @@ export interface ApprovalEnvelope {
|
|
|
128
138
|
* —— 证明是瞬时物不是持久数据,没有迁移面,消费方的 401 就是通知(宪法「hard breaking 三句」)。
|
|
129
139
|
*/
|
|
130
140
|
permissionModeAfter?: string | null;
|
|
141
|
+
/**
|
|
142
|
+
* `/decide` 的「不再询问」规则位(投影形 {@link PersistRuleProjection})进签名载荷。一条规则就是一条常驻放行 —— 与 `answer` / `permissionModeAfter` 同一条判据:
|
|
143
|
+
* **凡改变续跑能做什么 / 落什么账的决裁字段都在签名信封里**。直连门部署上停驻卡只有 `/decide` 这一扇口,拒收它就在这里造出一处「行说有、门拒键」。
|
|
144
|
+
* 在场才进扩展对象;缺席 ⇒ 字节与不认识它的签名器逐字相同(既有签名器零改动);带了不签 ⇒ `401 approval_mac_invalid`。
|
|
145
|
+
*/
|
|
146
|
+
persistRule?: PersistRuleProjection;
|
|
131
147
|
}
|
|
132
148
|
export declare function approvalHmacMessage(env: ApprovalEnvelope): string;
|
|
133
149
|
/** 签名载荷里 `reason` 的字符上限。**拒**而不是截 —— 截断在这条路径上**结构上不可行**:服务端截过的字节
|
package/dist/approval-hmac.js
CHANGED
|
@@ -5,7 +5,13 @@ export function projectQuestionAnswer(a) {
|
|
|
5
5
|
export function questionAnswerFromProjection(p) {
|
|
6
6
|
return { answers: p.map(([header, selected, note]) => ({ header, selected: [...selected], ...(note === null ? {} : { note }) })) };
|
|
7
7
|
}
|
|
8
|
-
export
|
|
8
|
+
export function projectPersistRule(slot) {
|
|
9
|
+
return slot.kind === "batch" ? ["batch", slot.batchOfferIndex] : ["text", slot.rule, slot.edited];
|
|
10
|
+
}
|
|
11
|
+
export function persistRuleFromProjection(p) {
|
|
12
|
+
return p[0] === "batch" ? { kind: "batch", batchOfferIndex: p[1] } : { kind: "text", rule: p[1], edited: p[2] };
|
|
13
|
+
}
|
|
14
|
+
export const APPROVAL_ENVELOPE_EXT_KEYS = ["answer", "checkpointId", "permissionModeAfter", "persistRule"];
|
|
9
15
|
const APPROVAL_ENVELOPE_HEAD_KEYS = ["sessionId", "boundCallId", "boundInputHash", "decision", "reason"];
|
|
10
16
|
export function approvalHmacMessage(env) {
|
|
11
17
|
const head = [env.sessionId, env.boundCallId ?? null, env.boundInputHash ?? null, env.decision, env.reason ?? null];
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* ## 规则(一句)
|
|
5
5
|
* `GET /v1/approvals` 的 `pending[]`(与 `/v1/approvals/stream` 的 `pending` / `resolved` 帧)= **决断口是 `POST /v1/approvals/:id/decide` 的全部行**;
|
|
6
6
|
* 每一行自报它属于哪一族(`kind`,本闭集一词),消费方**先按 `kind` 分支**,再读那一族的键。数组名仍是决断口的判据(`livePending[]` 的口是
|
|
7
|
-
* `POST /v1/
|
|
7
|
+
* 决断口 `POST /v1/tasks/:taskId/asks/:askId/decision`,不在本闭集里);本闭集回答的是「同一扇门后面是哪一种卡」。
|
|
8
8
|
*
|
|
9
9
|
* · `checkpoint` —— 停驻门(durable park):行 = 店的 `listPending` 那一行(键集照旧,另带 `kind`),门的 `:id` = 行的 `sessionId`,
|
|
10
10
|
* 再按 `gateKind`(core 的门型闭集)分路;
|
package/dist/approval.d.ts
CHANGED
|
@@ -71,8 +71,8 @@ export declare function gateIntentUnserviceableReason(config: GateIntentView, ch
|
|
|
71
71
|
/**
|
|
72
72
|
* [ref] C3 —— 「**无应答面**」两条 boot warn 的判据与文案(纯函数;stage-07 只负责打日志)。
|
|
73
73
|
*
|
|
74
|
-
* 两条 warn 警的是同一类失败:一个 `ask` 发生了,而这台部署既没有活体协调器(
|
|
75
|
-
* durable 停车(`DURABLE_APPROVAL`)⇒ core `resolveAsk` 无 onAsk ⇒ headless 自动拒(fail-closed,写进转录)。
|
|
74
|
+
* 两条 warn 警的是同一类失败:一个 `ask` 发生了,而这台部署既没有活体协调器(只在呈卡协议上场时构造:`TOOL_APPROVAL_ENABLED` ∧ store backend ∧
|
|
75
|
+
* park 设施)也没有 durable 停车(`DURABLE_APPROVAL`)⇒ core `resolveAsk` 无 onAsk ⇒ headless 自动拒(fail-closed,写进转录)。
|
|
76
76
|
* 运维要在 **boot** 就知道,否则会把随之而来的拒绝读成故障。两条 warn 按「ask 从哪来」**划分车道**,互补不重叠:
|
|
77
77
|
* · `fs_write_gate_no_responder` —— 写门的 Write/Edit ask。它只在**手写本机盘**时才会发生(写门挂在 host
|
|
78
78
|
* 语义上,而 ask 要有手去触发)⇒ 判据 = {@link handsOnWorkerFilePlane}(今天 = `host`)。改前写的是
|
package/dist/approval.js
CHANGED
|
@@ -39,7 +39,7 @@ export function buildNoResponderBootWarns(input) {
|
|
|
39
39
|
out.push({
|
|
40
40
|
event: "fs_write_gate_no_responder",
|
|
41
41
|
fields: {
|
|
42
|
-
hint: "host-semantics lane with no approval face: the engine's write-gate asks (permissionMode default/auto, absent reads as default; acceptEdits outside the write roots) will auto-deny (fail-closed); wire
|
|
42
|
+
hint: "host-semantics lane with no approval face: the engine's write-gate asks (permissionMode default/auto, absent reads as default; acceptEdits outside the write roots) will auto-deny (fail-closed); wire DURABLE_APPROVAL=true on a store backend (DB_BACKEND) to answer them (approval cards additionally need TOOL_APPROVAL_ENABLED)",
|
|
43
43
|
},
|
|
44
44
|
});
|
|
45
45
|
}
|
|
@@ -47,7 +47,7 @@ export function buildNoResponderBootWarns(input) {
|
|
|
47
47
|
out.push({
|
|
48
48
|
event: "workflow_gate_no_responder",
|
|
49
49
|
fields: {
|
|
50
|
-
hint: "self-orchestration with no approval face: run_workflow asks (every permission mode but bypassPermissions, which releases them, and dontAsk, which refuses them; absent reads as default) will auto-deny (fail-closed); wire
|
|
50
|
+
hint: "self-orchestration with no approval face: run_workflow asks (every permission mode but bypassPermissions, which releases them, and dontAsk, which refuses them; absent reads as default) will auto-deny (fail-closed); wire DURABLE_APPROVAL=true on a store backend (DB_BACKEND) to answer them (approval cards additionally need TOOL_APPROVAL_ENABLED)",
|
|
51
51
|
},
|
|
52
52
|
});
|
|
53
53
|
}
|
package/dist/auth-bridge.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { VerifiedIdentity, type AuthBridgeErrorCode } from "@sema-agent/settings-schema/api/auth-bridge";
|
|
2
2
|
import { type TokenScopeRefusal } from "@sema-agent/settings-schema/api/scopes";
|
|
3
|
+
import type { ServiceConfig } from "./config-types.js";
|
|
3
4
|
import type { Logger } from "./observability/logger.js";
|
|
4
5
|
import type { Metrics } from "./observability/metrics.js";
|
|
5
6
|
export interface WebAdminJwtVerifierOptions {
|
|
@@ -58,6 +59,25 @@ type ReportedOutcome = {
|
|
|
58
59
|
* (调用方按验证失败处置:不设身份 ⇒ 门答 generic 401)。验证失败的结局验证器自己已记过账,这里只答「不装」。
|
|
59
60
|
*/
|
|
60
61
|
export declare function admitBridgeIdentity(outcome: ReportedOutcome, sinks: BridgeSinks): BridgeIdentity | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* [ref] —— 「本 worker 把登录令牌绑在哪个 scope」的**唯一读口**(判官 {@link ssoForeignScope} 与起服行 `auth_bridge_enabled` 同读)。
|
|
64
|
+
* · fleet 成员(`FLEET_GENERATION` 在场 —— 「是不是 fleet 形」在本仓的那一个读数,配置目录行「缺席 ⇔ 非 fleet 成员」)⇒ `config.fleetScope`:
|
|
65
|
+
* env `FLEET_SCOPE` 的唯一读数(缺席 = 契约缺省 scope),排空口的身份比对读的就是这一个值 —— 一个事实一个读数,不另读 env。
|
|
66
|
+
* 编排器给每台受管引擎同拍渲成员代际与 `FLEET_SCOPE`;成员却缺 `FLEET_SCOPE` ⇒ 绑在缺省 scope(偏多拒,与排空口同读,不读成「不绑」)。
|
|
67
|
+
* · 非成员(手接 / 壳起的个人引擎)⇒ `undefined` = 不绑:令牌的 scope 就是它的用户自己的空间,准入不比对(本仓不为这一形猜一个空间)。
|
|
68
|
+
*/
|
|
69
|
+
export declare function ssoBoundScopeOf(config: Pick<ServiceConfig, "fleetGeneration" | "fleetScope">): string | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* [ref] —— **sso 准入的 scope 相等判**(唯一判官;唯一调用点 = `http/dispatch.ts` 的入口预认证)。入参是**已装**的桥身份({@link admitBridgeIdentity} 交出的,
|
|
72
|
+
* scope 已由 `readTokenScope` 读定、恒在)。本 worker 绑了 scope 而令牌的 scope 不是它 ⇒ 拒,交回两只 scope(只进运维日志;HTTP 体不带本 worker 的 scope ——
|
|
73
|
+
* 那是另一个空间的名字);不绑或相等 ⇒ `undefined`(装)。逐字比较,不规范化(两边都是 scope id 形;不同就是不同)。
|
|
74
|
+
*/
|
|
75
|
+
export declare function ssoForeignScope(identity: {
|
|
76
|
+
readonly scope: string;
|
|
77
|
+
}, config: Pick<ServiceConfig, "fleetGeneration" | "fleetScope">): {
|
|
78
|
+
readonly tokenScope: string;
|
|
79
|
+
readonly boundScope: string;
|
|
80
|
+
} | undefined;
|
|
61
81
|
/**
|
|
62
82
|
* The live object `createWebAdminJwtVerifier` produces — a single `verify` entry point over the process-level JWKS cache, and the issuer it verifies for.
|
|
63
83
|
* This is also the type of the injected seat (`ServiceDeps.webAdminJwtVerifier`): an embedder's verifier states which issuer it verifies, so `createHttpServer`
|
package/dist/auth-bridge.js
CHANGED
|
@@ -23,6 +23,15 @@ export function admitBridgeIdentity(outcome, sinks) {
|
|
|
23
23
|
}
|
|
24
24
|
return { ...rest, scope: scoped.scope, ...(inc.data !== undefined ? { principalInc: inc.data } : {}) };
|
|
25
25
|
}
|
|
26
|
+
export function ssoBoundScopeOf(config) {
|
|
27
|
+
return config.fleetGeneration === undefined ? undefined : config.fleetScope;
|
|
28
|
+
}
|
|
29
|
+
export function ssoForeignScope(identity, config) {
|
|
30
|
+
const boundScope = ssoBoundScopeOf(config);
|
|
31
|
+
if (boundScope === undefined || identity.scope === boundScope)
|
|
32
|
+
return undefined;
|
|
33
|
+
return { tokenScope: identity.scope, boundScope };
|
|
34
|
+
}
|
|
26
35
|
export const DEFAULT_JWKS_TTL_SEC = 15 * 60;
|
|
27
36
|
export const JWKS_FETCH_TIMEOUT_MS = 10_000;
|
|
28
37
|
const MAX_JWKS_BYTES = 256 * 1024;
|
|
@@ -42,7 +42,7 @@ export interface SessionHardReap {
|
|
|
42
42
|
* `no_pgid`(未确认)、linux ⇒ `killed`;已收割 ⇒ `already_gone`。受据按观察答([ref] 车PA 删了「已硬收过」闩:组信号任一成员收到即
|
|
43
43
|
* 成功,闩在部分送达时把活着读成没了),本函数也不为「让硬面先打」挪任何一拍。
|
|
44
44
|
*
|
|
45
|
-
* `scope` =
|
|
45
|
+
* `scope` = 会话的引擎租户分区 `sessionTenantScope`(唯一换算 `engineScopeOfOwner`,与 core 注册铸值同源 —— 缺席 scope 在 core 的
|
|
46
46
|
* `canAccess` 上 fail-closed、一行都收不到,[ref] 钉过这一病)。
|
|
47
47
|
*
|
|
48
48
|
* 两处调用(见文件头 ①),都 `await`:E21 删除级联 `includeRetained:false`(显式活服务照留);停止口照传请求体。应答在硬面之后发,
|
|
@@ -16,7 +16,8 @@ interface RunnerEnv {
|
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* bake-runner 的 **env 契约**(本进程只读这些;成文另见 USAGE.md §9.7):
|
|
19
|
-
* · 必填:`IMAGE_API_BASE`(image-api 根,尾斜杠去掉)、`BAKE_RUNNER_TOKEN`(claim / heartbeat 的运维主体 bearer;不进日志、不进子进程
|
|
19
|
+
* · 必填:`IMAGE_API_BASE`(image-api 根,尾斜杠去掉)、`BAKE_RUNNER_TOKEN`(claim / heartbeat 的运维主体 bearer;不进日志、不进子进程 —— 它是本包的自有凭据,
|
|
20
|
+
* 登记在 `config-catalog.ts` `BAKE_RUNNER_CREDENTIAL_ENV`,起服第一步按名与按值向引擎声明:任何子进程组都拿不到它与它的同值副本,`BAKE_ENV_ALLOW` 点到它 ⇒ 拒启)。
|
|
20
21
|
* · `BAKE_RUNNER_ID`(缺省 `bake-runner-<HOSTNAME>`)、`RECIPE_REF`(缺省 `HEAD` = 用现成 checkout)、`RECIPE_DIR`(缺省 `/opt/recipes`)、
|
|
21
22
|
* `BUILD_SH_PATH`(缺省 `e2b-template/dev-sandbox/build.sh`)、`BAKE_DATA_DIR`(缺省 `/data`)、`LOG_LEVEL`(缺省 info)。
|
|
22
23
|
* · 数值四键(`parseNumOrFailNonNegative`,非数 / 负数拒启):`BAKE_HEARTBEAT_MS`(30000)、`BAKE_IDLE_POLL_MS`(5000)、
|
|
@@ -24,7 +25,8 @@ interface RunnerEnv {
|
|
|
24
25
|
* · `BAKE_ENV_ALLOW=NAME,NAME`(7.103.0,[ref] 残余):本进程 spawn 的每一只子进程组(build.sh 与 git fetch / docker push /
|
|
25
26
|
* docker image inspect / df)的 env 缺省 = 本进程 env 剥密(runner 自己的 `BAKE_RUNNER_TOKEN` 在内);名单点到的键从本进程 env **原样**
|
|
26
27
|
* 放回(部署方显式承担 —— 例如配方脚本真要一枚 `*_PASSWORD` 做 registry 登录)。与服务侧 `LSP_ENV_ALLOW` **同一只**解析器
|
|
27
|
-
* (`config.ts` `parseEnvNameAllowlist`)与同一只放行谓词:形错(空段 / 尾逗号 / 非变量名形 / 点名任一只名单型旋钮
|
|
28
|
+
* (`config.ts` `parseEnvNameAllowlist`)与同一只放行谓词:形错(空段 / 尾逗号 / 非变量名形 / 点名任一只名单型旋钮 / 点名本包自有凭据 —— 名是,
|
|
29
|
+
* 或值是,runner 自己的 `BAKE_RUNNER_TOKEN` 在内)⇒ **拒启**,拒句点名
|
|
28
30
|
* 旋钮与段号、不回显值;本进程环境里没有的名 ⇒ 起服 `config_env_entry_rejected` 只报序号、不放行;旋钮原文本身按凭据类,不进子进程。
|
|
29
31
|
* 没有多租户姿态(构建宿主守护进程没有主体 / 租户);生效名单见起服行 `bake_runner_start.envAllow`(只键名)。
|
|
30
32
|
* ⚠️ 这不是服务配置目录里的键(目录 `BAKE_*` 行是服务侧 bake API 的旋钮),服务进程不读它。
|
package/dist/bind-host.d.ts
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
/** 读监听地址要的那几格(取自配置的同名键)。 */
|
|
2
2
|
export interface BindHostConfig {
|
|
3
3
|
bindHost?: string;
|
|
4
|
-
/** 缝合审 M5:`bindHost` 的**来源**决定它算不算 operator 明示,见 {@link resolveBindHost}。 */
|
|
5
|
-
bindHostSource?: "BIND_HOST" | "HOST";
|
|
6
4
|
allowUnauthedWrites?: boolean;
|
|
7
5
|
authToken?: string;
|
|
8
6
|
authTokens?: Record<string, string>;
|
|
9
7
|
}
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
/** 无鉴权写面(`ALLOW_UNAUTHED_WRITES`)+ 零凭据 ⇒ 起服把监听地址收窄到 loopback(见 {@link resolveBindHost})。 */
|
|
8
|
+
/** 无鉴权写面(`ALLOW_UNAUTHED_WRITES`)+ 全局凭据门不武装(没配 service 凭据,`hasServiceAuth`)⇒ 起服把监听地址收窄到 loopback(见 {@link resolveBindHost})。
|
|
9
|
+
* 逃生口开着时写门不拒,而门不武装 ⇒ 能连上这个口的都能写 —— 鉴权桥在不在不改这一句(验不过 / 不带令牌的调用方照样过)。 */
|
|
13
10
|
export declare function bindMustNarrow(config: Pick<BindHostConfig, "allowUnauthedWrites" | "authToken" | "authTokens">): boolean;
|
|
14
11
|
/**
|
|
15
12
|
* 这台进程的监听地址(绑址旋钮 + 无鉴权自收窄)。`undefined` = Node 缺省全接口。
|
|
16
|
-
* `BIND_HOST`(
|
|
13
|
+
* `BIND_HOST` 显式值恒生效(绑址的唯一来源:`HOST` 不读);缺省:**无鉴权写面(`allowUnauthedWrites` 且零凭据)自动收窄到 127.0.0.1**,其余维持全接口。
|
|
17
14
|
*/
|
|
18
15
|
export declare function resolveBindHost(config: BindHostConfig): string | undefined;
|
|
19
16
|
/**
|
package/dist/bind-host.js
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import { isIP } from "node:net";
|
|
2
2
|
import { canonicalAddress } from "./net-address.js";
|
|
3
|
-
|
|
4
|
-
return Boolean(config.authToken) || Object.keys(config.authTokens ?? {}).length > 0;
|
|
5
|
-
}
|
|
3
|
+
import { hasServiceAuth } from "./identity-source.js";
|
|
6
4
|
export function bindMustNarrow(config) {
|
|
7
|
-
return Boolean(config.allowUnauthedWrites) && !
|
|
5
|
+
return Boolean(config.allowUnauthedWrites) && !hasServiceAuth(config);
|
|
8
6
|
}
|
|
9
7
|
export function resolveBindHost(config) {
|
|
10
|
-
|
|
11
|
-
if (config.bindHost && !(mustNarrow && config.bindHostSource === "HOST"))
|
|
8
|
+
if (config.bindHost)
|
|
12
9
|
return config.bindHost;
|
|
13
|
-
return
|
|
10
|
+
return bindMustNarrow(config) ? "127.0.0.1" : undefined;
|
|
14
11
|
}
|
|
15
12
|
export function listensLoopbackOnly(bindHost) {
|
|
16
13
|
if (bindHost === undefined)
|
|
@@ -34,7 +34,7 @@ export function createBudgetAndTracing(ctx) {
|
|
|
34
34
|
const tracer = createTracer(metrics, costQuota, modelUsageTracker, fleetUsage, fleetLease, (m) => config.modelQuotaWeights[m] ?? 1, promptManifestTracker);
|
|
35
35
|
const sideQueryAccounting = createSideQueryAccountant(metrics, costQuota, fleetUsage, fleetLease, (m) => config.modelQuotaWeights[m] ?? 1);
|
|
36
36
|
const toolResultStore = backend?.toolResult ? backend.toolResult() : undefined;
|
|
37
|
-
const sessionPolicyStore = backend ? backend.sessionPolicy(
|
|
37
|
+
const sessionPolicyStore = backend ? backend.sessionPolicy() : undefined;
|
|
38
38
|
const { store: fileHistoryStore, erasure: fileHistoryErasure } = assembleFileHistory(backend);
|
|
39
39
|
return {
|
|
40
40
|
brain, degradeRouteWatch, pricing, counterDegradeHook, costQuota, modelUsageTracker, promptManifestTracker,
|
|
@@ -38,7 +38,7 @@ export interface LiveCoordinatorsCtx {
|
|
|
38
38
|
* 提交了没有」—— 审计 settle 行等 park 提交落定才写。缺席 = 没有 park 设施(core 在 ask 回调处就收场,没有提交这一步)。 */
|
|
39
39
|
parkCommits?: ParkCommitWatch;
|
|
40
40
|
/** [ref]:checkpoint 店(stage-06 的**同一只**,与 `parkCommits` 同源;在场 ⇔ 有 park 设施)。协调器的按问读口据它判一张 `PARKED` 卡的门此刻还是不是该会话当前待决的审批门
|
|
41
|
-
* (判官 = `approval-gate-currency.ts
|
|
41
|
+
* (判官 = `approval-gate-currency.ts`,续跑腿判 `approval_stale` 读的同一只)。缺席 ⇒ 读口只能说行说的话(`parked`)。
|
|
42
42
|
* 也是流内审批协议上场门的 park 设施位:在场性与实例是一个事实 —— 门的 `active` 臂交出去的就是这一只,缺席 ⇒ 协议不上场(`no_park_facility`)。 */
|
|
43
43
|
checkpointStore?: GateCurrencyStore;
|
|
44
44
|
}
|
|
@@ -19,18 +19,18 @@ export function createLiveCoordinators(ctx) {
|
|
|
19
19
|
const durableEnabled = parkStore !== undefined;
|
|
20
20
|
const streamApprovalGate = resolveStreamApprovalGate({
|
|
21
21
|
toolApprovalEnabled: config.toolApprovalEnabled === true,
|
|
22
|
-
streamApprovalEnabled: config.streamApproval.enabled,
|
|
23
22
|
backend,
|
|
24
23
|
checkpointStore: parkStore,
|
|
25
24
|
});
|
|
26
|
-
if (
|
|
27
|
-
logger.
|
|
25
|
+
if (!streamApprovalGate.active && streamApprovalGate.reason !== "no_tool_approval") {
|
|
26
|
+
logger.warn("approval_cards_unavailable", {
|
|
28
27
|
reason: streamApprovalGate.reason,
|
|
29
28
|
backendKind: backend?.kind ?? null,
|
|
30
29
|
checkpointStore: backend?.checkpoint !== undefined,
|
|
31
30
|
durableApproval: config.durableApproval === true,
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
unattendedPolicy: config.unattendedApprovalPolicy,
|
|
32
|
+
note: "no approval card is presented on ANY leg of this worker (approval cards need a durable approval ledger: a store backend plus a park facility), so every gated tool call is refused fail-closed. " +
|
|
33
|
+
"Set DURABLE_APPROVAL=true on a store backend (DB_BACKEND) to get approval cards.",
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
if (config.toolApprovalEnabled === true && config.streamApproval.windowMs === 0) {
|
|
@@ -47,12 +47,11 @@ export function createLiveCoordinators(ctx) {
|
|
|
47
47
|
? new FileApprovalAskAuditStore(config.localDataRoot)
|
|
48
48
|
: undefined;
|
|
49
49
|
const approvalExemptionStore = backend ? backend.approvalExemption() : undefined;
|
|
50
|
-
const toolApproval =
|
|
50
|
+
const toolApproval = streamApprovalGate.active
|
|
51
51
|
? new ToolApprovalCoordinator({
|
|
52
52
|
ttlMs: config.streamApproval.windowMs,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
: {}),
|
|
53
|
+
askStore: streamApprovalGate.askStore,
|
|
54
|
+
unreachedTtlMs: config.streamApproval.unreachedTtlMs,
|
|
56
55
|
windowMarginMs: config.streamAskWindowMarginMs,
|
|
57
56
|
admitMaxPerTask: config.streamApproval.admitMaxPerTask,
|
|
58
57
|
admitMaxPerOwner: config.streamApproval.admitMaxPerOwner,
|
|
@@ -103,7 +102,7 @@ export function createLiveCoordinators(ctx) {
|
|
|
103
102
|
const send = sendFileLedger
|
|
104
103
|
? withLedgerRecording(rawSend, {
|
|
105
104
|
ledger: sendFileLedger,
|
|
106
|
-
deleteObject: (bucket, key) => issuer.deleteObject(bucket, key),
|
|
105
|
+
deleteObject: (bucket, key, track) => issuer.deleteObject(bucket, key, track),
|
|
107
106
|
warn: (msg, meta) => logger.warn(msg, meta),
|
|
108
107
|
})
|
|
109
108
|
: rawSend;
|
package/dist/boot/device-lane.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createDeviceEnrollment, createFixedWindowRateLimiter } from "../device-enrollment.js";
|
|
2
2
|
import { createDeviceWsHub } from "../device-ws-hub.js";
|
|
3
|
+
import { deviceOwnerConfinedTier } from "../http/principal-gate.js";
|
|
3
4
|
export const DEVICE_ENROLL_RATE_POLICY = { limit: 10, windowMs: 60_000 };
|
|
4
5
|
export function createDeviceLane(ctx) {
|
|
5
6
|
const { config, logger, metrics, backend, replicaId, seat } = ctx;
|
|
@@ -20,6 +21,7 @@ export function createDeviceLane(ctx) {
|
|
|
20
21
|
store,
|
|
21
22
|
enrollment,
|
|
22
23
|
replicaId,
|
|
24
|
+
ownerConfinedTier: (owner) => deviceOwnerConfinedTier(owner, config),
|
|
23
25
|
logger: {
|
|
24
26
|
warn: (msg, fields) => logger.warn(msg, fields),
|
|
25
27
|
error: (msg, fields) => logger.error(msg, fields),
|
|
@@ -245,6 +245,9 @@ export interface EngineLeaseExitReport {
|
|
|
245
245
|
* · `tickMs` = 自退检查的采样拍。自退发生在**生效窗**满之后、至多再晚一拍(顶注 8);生效窗恒 ≥ `lingerMs`(`lingerMs` 是各窗里最短的一个),所以触点比 `lingerMs` 密 ⇒ 在任何状态下都先于自退。
|
|
246
246
|
* 读数**不预言**自退时刻:父还活着时生效的是 owned 窗,自退只会更晚。
|
|
247
247
|
* · `lane`([ref])= 此刻的车道(与自退判据同一只派生函数,每次现读)。
|
|
248
|
+
* · `attached`([ref])= 本副本此刻**打开着的 SSE 流**条数 —— 与自退判据第一合取(`attachedStreams() === 0`)读**同一只**读口(`deps.attachedStreams()`),每次现读,不是采样拍的缓存。
|
|
249
|
+
* 哪些算、哪些不算写在契约 `/health` 节计法表的「附着」一列(与 `inflightBreakdown` 的「总数 / 阻断」两列同一张表):订阅流与流式提交腿算,后台腿、无流的同步腿、leader 腿不算。
|
|
250
|
+
* 它是**附着流条数,不是活跃调用方**:纯轮询壳(零 SSE)与毫秒级请求的下采样读到 0 合法 —— 判「这台引擎此刻有没有人在用」要连 `inflight` 与最近触点一起读(顶注 3),不能拿 `attached === 0` 当「没人」。
|
|
248
251
|
*
|
|
249
252
|
* ## 一源
|
|
250
253
|
* 与租约腿自己的行为同一处铸出:`engine_lease_armed` 日志、自退判据用的窗、拍频推导(`tickMs = min(15s, 最短窗)`)和本读数读的是同一组数 ——
|
|
@@ -255,6 +258,8 @@ export interface EngineLeaseFacts {
|
|
|
255
258
|
readonly tickMs: number;
|
|
256
259
|
/** [ref]:此刻的车道。 */
|
|
257
260
|
readonly lane: EngineLane;
|
|
261
|
+
/** [ref]:此刻打开着的 SSE 附着流条数(整数,≥ 0;语义与读口见上「报的是什么」一条 —— 附着流条数,不是活跃调用方)。 */
|
|
262
|
+
readonly attached: number;
|
|
258
263
|
/** [ref] 首窗格({@link EngineLeaseFirstAttachFacts}):候首触窗有限(owned 窗有限)才在场 —— 永不到期的窗不上 wire(同上一段那条律)。 */
|
|
259
264
|
readonly firstAttach?: EngineLeaseFirstAttachFacts;
|
|
260
265
|
/** [ref] 交接格({@link EngineHandoverFacts}):只在 handover 车道在场。 */
|
|
@@ -184,6 +184,7 @@ export function createEngineLeaseTracker(deps) {
|
|
|
184
184
|
lingerMs: shortestLingerMs,
|
|
185
185
|
tickMs,
|
|
186
186
|
lane: laneNow().lane,
|
|
187
|
+
attached: deps.attachedStreams(),
|
|
187
188
|
...(firstAttach !== undefined ? { firstAttach } : {}),
|
|
188
189
|
...(handover !== undefined ? { handover } : {}),
|
|
189
190
|
});
|
|
@@ -19,6 +19,7 @@ import { type LocalDockerCapacity } from "../plugins/local-docker-capacity.js";
|
|
|
19
19
|
import * as facts from "../capability-facts.js";
|
|
20
20
|
import { type TaskAttachmentStore } from "../plugins/task-attachment-store.js";
|
|
21
21
|
import type { TaskInheritEnv } from "../request-value-closure.js";
|
|
22
|
+
import { type SessionBindings, type SessionBindingSeat } from "../session-bindings.js";
|
|
22
23
|
import { type HeadRead } from "../session-incarnation.js";
|
|
23
24
|
import type { SpaceReclaimer } from "../workspace-space.js";
|
|
24
25
|
import { type SessionResidentCounts } from "../session-resident-background.js";
|
|
@@ -43,20 +44,11 @@ import { type SessionResidentCounts } from "../session-resident-background.js";
|
|
|
43
44
|
* 那一个副本上发生。跨副本的陈值靠「读面必经本副本的一次提交 ⇒ 必过本副本的围栏」兜住 —— 这条推理成立
|
|
44
45
|
* 是因为 run 在受理它的那个副本上执行(ARCHITECTURE 副本模型)。device lane 的部署形本身也是单副本(§4.6)。
|
|
45
46
|
*/
|
|
46
|
-
export interface SessionScopedRegistries {
|
|
47
|
+
export interface SessionScopedRegistries extends SessionBindingSeat {
|
|
47
48
|
readonly perSessionCwd: Map<string, string>;
|
|
48
49
|
readonly perSessionShellEnv: Map<string, Record<string, string>>;
|
|
49
|
-
/** [ref]:host shell 的继承策略(`inheritEnv` 请求键)。只读面给 host
|
|
50
|
+
/** [ref]:host shell 的继承策略(`inheritEnv` 请求键)。只读面给 host 工厂包装。 */
|
|
50
51
|
readonly perSessionInheritEnv: ReadonlyMap<string, TaskInheritEnv>;
|
|
51
|
-
setSessionCwd(sid: string, cwd: string): void;
|
|
52
|
-
setSessionShellEnv(sid: string, env: Record<string, string>): void;
|
|
53
|
-
/**
|
|
54
|
-
* [ref] —— 第三只 per-session 绑定(与 cwd / shellEnv 同一只 LRU 权威、同一条围栏、同一条删除)。
|
|
55
|
-
* `undefined` = **清掉**这一格(不是「不动」):`inheritEnv` 是「本条请求要什么」,缺席的请求要的是缺省清洗 ——
|
|
56
|
-
* 与 cwd / shellEnv 的「缺席 = 留着上一条的值」刻意不同(那两位由壳每条请求重发,粘住无害;这一位粘住 = 替一个没说话的
|
|
57
|
-
* 请求放宽凭据面)。
|
|
58
|
-
*/
|
|
59
|
-
setSessionInheritEnv(sid: string, policy: TaskInheritEnv | undefined): void;
|
|
60
52
|
/** 本进程见过的会话 → 属主(围栏表本身,只读视图;`null` = 匿名)。**会话驻留后台行的枚举源**:`session-resident-background.ts` 逐会话问注册表
|
|
61
53
|
* (core 的访问元组要带 scope,没有进程总数的读口),读的就是这一张 —— 每次提交写一笔、`dropSession` 清一笔、LRU 有界,不另立第二张会话名册。 */
|
|
62
54
|
readonly sessionOwners: ReadonlyMap<string, string | null>;
|
|
@@ -178,9 +170,11 @@ export declare function createExecutionEnv(ctx: ExecutionEnvCtx): {
|
|
|
178
170
|
perTaskImage: PerTaskImageRegistry;
|
|
179
171
|
sessionEnvSelection: SessionEnvironmentSelection;
|
|
180
172
|
perSessionCwd: Map<string, string>;
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
173
|
+
sessionBindings: {
|
|
174
|
+
commitSessionBindings: (sessionId: string, bindings: SessionBindings) => import("../session-bindings.js").SessionBindingReceipt;
|
|
175
|
+
withdrawSessionBindings: (receipt: import("../session-bindings.js").SessionBindingReceipt) => boolean;
|
|
176
|
+
settleSessionBindings: (receipt: import("../session-bindings.js").SessionBindingReceipt) => boolean;
|
|
177
|
+
};
|
|
184
178
|
fenceSessionOwner: (sid: string, owner: string | null, incarnation?: string) => void;
|
|
185
179
|
dropSessionScoped: (sid: string) => void;
|
|
186
180
|
dropSessionScopedOf: (sid: string, incarnation: string) => boolean;
|
|
@@ -190,6 +184,7 @@ export declare function createExecutionEnv(ctx: ExecutionEnvCtx): {
|
|
|
190
184
|
sendUserFileTaskEnvs: TaskEnvRegistry | undefined;
|
|
191
185
|
lspManager: import("@sema-agent/core").NodeLspManager | undefined;
|
|
192
186
|
spaceReclaimer: SpaceReclaimer | undefined;
|
|
187
|
+
sandboxApiCredentialsGate: (() => void) | undefined;
|
|
193
188
|
sandboxSecretSeatGate: (() => Promise<void>) | undefined;
|
|
194
189
|
sandboxReaper: SandboxReaper | undefined;
|
|
195
190
|
sandboxGitPlane: SandboxGitPlaneSeat;
|