@sema-agent/server 7.43.0 → 7.44.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/USAGE.md +18 -0
- package/dist/adoption/plan.js +31 -192
- package/dist/adoption/quiesce.js +3 -86
- package/dist/adoption/runner.js +3 -140
- package/dist/adoption/sql.js +0 -74
- package/dist/adoption/wire.js +0 -80
- package/dist/approval-ask-machine.js +0 -75
- package/dist/approval-card.js +0 -323
- package/dist/approval-deny-reasons.js +0 -42
- package/dist/approval-hmac.js +0 -35
- package/dist/approval-reconciler.js +8 -166
- package/dist/approval.js +4 -67
- package/dist/audit.js +1 -44
- package/dist/auth-bridge.js +4 -47
- package/dist/auth-keys.js +0 -23
- package/dist/bake-runner/main.js +4 -65
- package/dist/bake-runner/protocol.js +3 -58
- package/dist/bake-runner/runner.js +5 -91
- package/dist/bench/l8/artifact.js +2 -61
- package/dist/bench/l8/escape.js +0 -25
- package/dist/bench/l8/index.js +0 -14
- package/dist/bench/l8/probes.js +0 -60
- package/dist/bench/l8/run-probes.js +2 -45
- package/dist/bench/s1/arms.js +14 -189
- package/dist/bench/s1/live-deps.js +11 -253
- package/dist/bench/s1/oracle.js +1 -36
- package/dist/bench/s1/repair-oracle-adapter.js +0 -30
- package/dist/bench/s1/reviewer.js +0 -34
- package/dist/bench/s1/row.js +0 -62
- package/dist/bench/s1/run-firm.js +4 -70
- package/dist/bench/s1/runner-ctx.js +0 -40
- package/dist/bench/s1/tasks.js +0 -115
- package/dist/boot/adoption.js +0 -20
- package/dist/boot/budget-tracing.js +3 -55
- package/dist/boot/config-center.js +43 -551
- package/dist/boot/coordinators.js +1 -69
- package/dist/boot/crash-last.js +0 -18
- package/dist/boot/deferred-sandbox-path-env.js +3 -119
- package/dist/boot/execution-env.js +5 -171
- package/dist/boot/governance-seams.js +0 -92
- package/dist/boot/leader.js +0 -69
- package/dist/boot/limit-sync.js +0 -2
- package/dist/boot/memory-boundary.js +3 -91
- package/dist/boot/org-memory.js +1 -25
- package/dist/boot/parked-revive-gate.js +0 -150
- package/dist/boot/permission-rules-audit.js +1 -56
- package/dist/boot/reapers.js +15 -273
- package/dist/boot/resolve-spec.js +9 -768
- package/dist/boot/retention-lane.js +4 -87
- package/dist/boot/runner-deps.js +3 -297
- package/dist/boot/runtime-caps.js +0 -40
- package/dist/boot/session-faces.js +2 -133
- package/dist/boot/shutdown.js +9 -83
- package/dist/boot/side-query-lane.js +2 -137
- package/dist/boot/stores.js +15 -215
- package/dist/boot/task-list-lane.js +0 -18
- package/dist/boot/webfetch-summarize-lane.js +0 -47
- package/dist/boot/workflow-orchestration.js +3 -99
- package/dist/boot-reclaim.js +0 -20
- package/dist/bounded-session-map.js +0 -19
- package/dist/brain.js +2 -139
- package/dist/budget.js +9 -244
- package/dist/capabilities/builtin-tools.js +0 -3
- package/dist/capabilities/center-plugins.js +6 -51
- package/dist/capabilities/center-prompts.js +6 -71
- package/dist/capabilities/code-review-council.js +7 -40
- package/dist/capabilities/collab-workflows.js +1 -44
- package/dist/capabilities/hands-lane.js +0 -65
- package/dist/capabilities/memory-notice.js +0 -70
- package/dist/capabilities/prompt.js +0 -14
- package/dist/capabilities/prompts/code-review.js +0 -14
- package/dist/capabilities/prompts/identity.js +0 -6
- package/dist/capabilities/prompts/team.js +0 -4
- package/dist/capabilities/repo-tools.js +0 -34
- package/dist/capabilities/sandbox-file-send.js +3 -92
- package/dist/capabilities/scenarios.d.ts +0 -1
- package/dist/capabilities/scenarios.js +18 -279
- package/dist/capabilities/select-environment-tool.js +0 -32
- package/dist/capabilities/send-user-file-tool.js +2 -66
- package/dist/capabilities/skills.d.ts +1 -2
- package/dist/capabilities/skills.js +3 -21
- package/dist/capabilities/team.d.ts +3 -11
- package/dist/capabilities/team.js +3 -51
- package/dist/capabilities/tool-defer.js +0 -3
- package/dist/config-center/apply-effective.js +15 -330
- package/dist/config-center/apply-ledger.js +5 -38
- package/dist/config-center/facade.js +0 -41
- package/dist/config-center/hot-keys-registry.js +0 -20
- package/dist/config-center/http-client.js +2 -125
- package/dist/config-center/mcp-revocation.js +2 -34
- package/dist/config-center/read-face.js +0 -59
- package/dist/config-center/restart-signal.js +1 -85
- package/dist/config-center/skills-mcp.d.ts +1 -1
- package/dist/config-center/skills-mcp.js +9 -76
- package/dist/config-center/stage-limits.js +8 -35
- package/dist/config-invariants.js +0 -16
- package/dist/config-lkg.js +0 -42
- package/dist/config-provider.js +3 -186
- package/dist/config-types.js +0 -5
- package/dist/config.js +107 -1145
- package/dist/degenerate-instrument.js +3 -67
- package/dist/deployment-governance.js +0 -124
- package/dist/digest-form.js +0 -12
- package/dist/elicitation.js +3 -86
- package/dist/env-facts.js +7 -75
- package/dist/fleet/fleet-bus.js +34 -507
- package/dist/fleet/fleet-reconciler.js +9 -149
- package/dist/fleet/fleet-terminal-window.js +10 -178
- package/dist/fleet/subagent-tail-bus.js +3 -72
- package/dist/fleet-client.js +10 -70
- package/dist/fleet-lease.js +5 -79
- package/dist/git-api-kind.js +0 -3
- package/dist/governance-ask-marks.js +2 -78
- package/dist/hooks/branch-transcript.js +0 -74
- package/dist/hooks/cc-agent-hook-prompt.js +0 -29
- package/dist/hooks/cc-stop-prompt.js +1 -46
- package/dist/hooks/hook-llm.js +1 -53
- package/dist/hooks/hook-runner.js +20 -414
- package/dist/http/active-run-conflict.js +4 -129
- package/dist/http/cursor-fingerprint.d.ts +5 -0
- package/dist/http/cursor-fingerprint.js +5 -0
- package/dist/http/idempotency.js +0 -37
- package/dist/http/principal-gate.js +3 -40
- package/dist/http/route-ctx.js +0 -9
- package/dist/http/routes/a2a-serve.js +7 -319
- package/dist/http/routes/admin-config-refresh.js +0 -4
- package/dist/http/routes/admin-drain.js +0 -10
- package/dist/http/routes/adoption.js +1 -29
- package/dist/http/routes/agents-roster.js +1 -47
- package/dist/http/routes/approvals-assistant.js +32 -395
- package/dist/http/routes/attachments.js +4 -22
- package/dist/http/routes/capabilities.js +3 -420
- package/dist/http/routes/diagnostics.js +1 -81
- package/dist/http/routes/fleet.js +9 -185
- package/dist/http/routes/images.js +14 -239
- package/dist/http/routes/leader.js +0 -13
- package/dist/http/routes/memory-bundle.js +1 -61
- package/dist/http/routes/memory-policy.js +9 -99
- package/dist/http/routes/notify-wake.js +3 -37
- package/dist/http/routes/observability.js +2 -19
- package/dist/http/routes/retention-ops.js +2 -34
- package/dist/http/routes/rules.js +1 -93
- package/dist/http/routes/runs.js +64 -873
- package/dist/http/routes/session-sync.js +19 -258
- package/dist/http/routes/sessions-list.js +17 -43
- package/dist/http/routes/sessions.js +34 -226
- package/dist/http/routes/shared-memory.js +5 -36
- package/dist/http/routes/side-query.js +1 -87
- package/dist/http/routes/tasks.js +52 -722
- package/dist/http/routes/trace-usage.js +32 -195
- package/dist/http/routes/workflows.js +19 -195
- package/dist/http/run-meta.js +0 -6
- package/dist/http/send.js +0 -32
- package/dist/http/server.js +92 -1597
- package/dist/http/sse-lifecycle.js +2 -13
- package/dist/http/sse-log.js +3 -48
- package/dist/http/tar.js +5 -21
- package/dist/http/verify-rounds.js +0 -5
- package/dist/http/wire-gate.js +0 -9
- package/dist/http/workspace-content.js +0 -10
- package/dist/images/bake-validate.js +1 -70
- package/dist/images/manifest.js +1 -6
- package/dist/index.js +0 -21
- package/dist/key-resolver.js +2 -17
- package/dist/leader/diffout.js +1 -20
- package/dist/leader/diffup.js +0 -47
- package/dist/leader/endpoint.js +2 -57
- package/dist/leader/fanout.js +3 -45
- package/dist/leader/grader-env-factory.js +3 -72
- package/dist/leader/leader.js +5 -156
- package/dist/leader/merge.js +8 -115
- package/dist/leader/planner.js +3 -54
- package/dist/leader/repair-oracle.js +1 -60
- package/dist/leader/repair-wire.js +2 -79
- package/dist/leader/wire.js +8 -307
- package/dist/lsp/e2b-bridge.js +4 -64
- package/dist/lsp/e2b-manager.js +6 -94
- package/dist/lsp/lsp-frames.js +0 -12
- package/dist/lsp/manager.js +4 -96
- package/dist/lsp/ws-transport.js +5 -55
- package/dist/lsp-evict.js +1 -15
- package/dist/main.js +57 -765
- package/dist/memory-bundle-engine.js +0 -55
- package/dist/memory-export.js +0 -4
- package/dist/memory-posture.js +1 -15
- package/dist/memory-scope.js +11 -148
- package/dist/memory-sync-client.js +2 -44
- package/dist/memory-sync.js +1 -80
- package/dist/model-select.js +3 -80
- package/dist/observability/cost-quota.js +1 -17
- package/dist/observability/cost-taxonomy.js +0 -34
- package/dist/observability/fail-open.js +7 -86
- package/dist/observability/logger.js +0 -6
- package/dist/observability/metrics.js +0 -94
- package/dist/observability/otel-exporter.js +3 -13
- package/dist/observability/principal-context.js +0 -9
- package/dist/observability/prompt-manifest.js +1 -37
- package/dist/observability/rate-limit.js +0 -4
- package/dist/observability/secret-env-scrub.js +2 -56
- package/dist/observability/tool-trace.js +1 -70
- package/dist/orchestration/hardened-vm-runner.js +4 -118
- package/dist/orchestration/hardened-vm-worker-runner.js +1 -26
- package/dist/orchestration/hardened-vm-worker.js +0 -27
- package/dist/orchestration/subagent-steer.js +1 -45
- package/dist/orchestration/workflow-agent-steer.js +1 -80
- package/dist/orchestration/workflow-completion-inbox.js +32 -285
- package/dist/orchestration/workflow-notify-journal.js +16 -259
- package/dist/org-memory-admission.js +3 -47
- package/dist/parent-watch.js +2 -48
- package/dist/parked-decide.js +1 -109
- package/dist/per-task-image.js +0 -57
- package/dist/plan-cache-probe.js +3 -27
- package/dist/plugins/adoption-log-sql.js +2 -119
- package/dist/plugins/approval-ask-store-memory.js +3 -38
- package/dist/plugins/approval-ask-store-sql.js +6 -188
- package/dist/plugins/approval-exemption-store.js +2 -28
- package/dist/plugins/background-agent-store-sql.js +4 -105
- package/dist/plugins/background-shell-support.js +14 -122
- package/dist/plugins/blob-backend.js +6 -169
- package/dist/plugins/breaker-state-sql.js +8 -46
- package/dist/plugins/caching-session-store.js +4 -106
- package/dist/plugins/checkpoint-store-sql.js +18 -505
- package/dist/plugins/e2b-orphan-reclaim.js +0 -45
- package/dist/plugins/file-outcome-sink.js +0 -9
- package/dist/plugins/file-resume-anchor-store.js +4 -43
- package/dist/plugins/file-run-store.js +26 -364
- package/dist/plugins/file-snapshot-store-sql.js +10 -181
- package/dist/plugins/fork-routing-session-store.js +8 -111
- package/dist/plugins/host-platform.js +2 -91
- package/dist/plugins/image-bake-store-sql.js +7 -250
- package/dist/plugins/image-index-sql.js +4 -123
- package/dist/plugins/k8s-bg-scripts.js +4 -88
- package/dist/plugins/k8s-exec-protocol.js +0 -41
- package/dist/plugins/leader-run-store-sql.js +0 -101
- package/dist/plugins/local-checkpoint-store.js +8 -128
- package/dist/plugins/local-session-store.js +34 -296
- package/dist/plugins/local-task-attachment-store.js +2 -16
- package/dist/plugins/mailbox-store-sql.js +8 -65
- package/dist/plugins/memory-embedder-fingerprint.js +5 -166
- package/dist/plugins/memory-embedder.js +4 -70
- package/dist/plugins/memory-engine-pg.js +6 -170
- package/dist/plugins/memory-engine-tidb.js +7 -155
- package/dist/plugins/memory-engine-vector-util.js +0 -10
- package/dist/plugins/memory-key-guards.js +0 -34
- package/dist/plugins/memory-origin-law.js +0 -187
- package/dist/plugins/memory-resume-anchor-store.js +0 -17
- package/dist/plugins/memory-run-store.js +12 -89
- package/dist/plugins/memory-session-policy-store.js +0 -17
- package/dist/plugins/memory-sync-store-pg.js +4 -49
- package/dist/plugins/memory-sync-store-tidb.js +3 -35
- package/dist/plugins/outcome-ledger-sql.js +3 -97
- package/dist/plugins/permission-rule-store-file.js +5 -133
- package/dist/plugins/permission-rule-store-sql.d.ts +3 -0
- package/dist/plugins/permission-rule-store-sql.js +50 -307
- package/dist/plugins/pg-cost-quota.js +0 -7
- package/dist/plugins/pg-pool.js +0 -92
- package/dist/plugins/pg-rate-limiter.js +2 -13
- package/dist/plugins/pg-safe-json.js +4 -40
- package/dist/plugins/pg-session-storage.js +25 -189
- package/dist/plugins/posix-shell-fs.js +1 -31
- package/dist/plugins/remote-env-adb.js +12 -101
- package/dist/plugins/remote-env-e2b.js +40 -371
- package/dist/plugins/remote-env-file-error.js +0 -37
- package/dist/plugins/remote-env-host.js +63 -483
- package/dist/plugins/remote-env-k8s.js +32 -326
- package/dist/plugins/remote-env-local-docker.js +24 -157
- package/dist/plugins/remote-env-ssh.js +20 -128
- package/dist/plugins/remote-scratchpad.js +2 -32
- package/dist/plugins/remote-shell.js +1 -32
- package/dist/plugins/resume-anchor-store-sql.js +0 -11
- package/dist/plugins/retention-lane-store-sql.js +0 -108
- package/dist/plugins/retention-store-sql.js +4 -383
- package/dist/plugins/roster-store-sql.js +0 -55
- package/dist/plugins/run-store-sql.js +14 -251
- package/dist/plugins/s3-presign.js +2 -49
- package/dist/plugins/scheduler-support.js +3 -80
- package/dist/plugins/send-file-ledger.js +4 -53
- package/dist/plugins/send-user-file.js +4 -94
- package/dist/plugins/session-placement.js +1 -89
- package/dist/plugins/session-policy-store-sql.js +3 -81
- package/dist/plugins/session-store.js +0 -57
- package/dist/plugins/shared-memory-store-sql.js +4 -167
- package/dist/plugins/sql-driver.js +0 -17
- package/dist/plugins/sql-errors.js +0 -7
- package/dist/plugins/sql-escape.js +0 -8
- package/dist/plugins/sql-row-helpers.js +0 -25
- package/dist/plugins/store-backend.js +42 -222
- package/dist/plugins/store-contracts.js +2 -46
- package/dist/plugins/task-attachment-store.js +3 -49
- package/dist/plugins/task-list-store-sql.js +0 -79
- package/dist/plugins/tidb-cost-quota.js +1 -4
- package/dist/plugins/tidb-pool.js +1 -207
- package/dist/plugins/tidb-rate-limiter.js +3 -9
- package/dist/plugins/tidb-session-storage.js +4 -70
- package/dist/plugins/tidb-session-store.js +19 -341
- package/dist/plugins/tool-result-store-sql.js +4 -179
- package/dist/plugins/usage-window-store-sql.js +0 -8
- package/dist/plugins/web-search.js +10 -132
- package/dist/plugins/workflow-journal-store-sql.js +2 -58
- package/dist/plugins/workflow-run-store-sql.js +6 -91
- package/dist/plugins/worktree-isolation.js +6 -126
- package/dist/plugins/write-behind-counter.js +16 -75
- package/dist/principal-jwt.js +5 -60
- package/dist/project-memory.js +15 -146
- package/dist/prompts-domain-validate.js +1 -51
- package/dist/question.js +2 -111
- package/dist/resource-suspend.js +0 -18
- package/dist/router/route-orchestration.js +0 -77
- package/dist/rules-consent.d.ts +44 -5
- package/dist/rules-consent.js +75 -215
- package/dist/run-local.js +14 -381
- package/dist/runs.js +29 -617
- package/dist/runtime-caps-resolver.js +6 -132
- package/dist/runtime-governance.js +1 -232
- package/dist/sandbox-pkg-source.js +0 -37
- package/dist/sealed-key.js +3 -68
- package/dist/security.js +6 -291
- package/dist/session-leaf-bus.js +0 -32
- package/dist/session-sync-content.js +1 -69
- package/dist/session-sync-kernel.js +3 -60
- package/dist/session-sync.js +3 -66
- package/dist/session-titler.js +7 -41
- package/dist/session-watch.js +9 -73
- package/dist/shared-memory-scope-authorizer.js +0 -18
- package/dist/sighup-idle.js +1 -12
- package/dist/spec-fields.js +4 -143
- package/dist/store-live-probe.js +3 -49
- package/dist/task-a2a.js +1 -126
- package/dist/task-cwd.js +1 -103
- package/dist/task-mcp.js +1 -89
- package/dist/task-settings.js +10 -300
- package/dist/task-workflow.js +8 -75
- package/dist/tool-approval.d.ts +28 -1
- package/dist/tool-approval.js +70 -1430
- package/dist/trace/artifacts.js +5 -20
- package/dist/trace/engine-notice-wire.js +6 -138
- package/dist/trace/ledger-sink.js +7 -96
- package/dist/trace/project.js +4 -448
- package/dist/trace/redact.js +9 -77
- package/dist/turn-activity.js +1 -27
- package/dist/usage-analytics.js +4 -34
- package/dist/wall-clock-jump-guard.js +1 -68
- package/package.json +3 -3
- package/dist/capabilities/scenario-alias.d.ts +0 -27
- package/dist/capabilities/scenario-alias.js +0 -61
|
@@ -1,104 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* #214 记忆边界不变式(板 [3492]② 立案,[3521] 裁1 与 core #151 同窗)—— 启动期把「结构性写不进的记忆
|
|
3
|
-
* 部署形」说出来。
|
|
4
|
-
*
|
|
5
|
-
* 病根(test 仓 [3479] 实测,[3490]② 定位):core 的记忆工具面是 `memory_search`/`memory_get` 两只**只读**
|
|
6
|
-
* 工具;**写**记忆没有专用工具 —— 模型用 fs 工具往记忆根写文件,harvest 再从那里收编。于是整条链的成立
|
|
7
|
-
* 条件是「记忆根落在该次任务的 fs 授权边界之内」。server 把根交给 core(`RunnerDeps.memoryEngineDir`)
|
|
8
|
-
* 之后,没有任何一处保证这一点,也没有任何一处说过「这台部署的记忆写面够不着」。默认根是
|
|
9
|
-
* `~/.ai-agent`(或 `AGENT_DATA_DIR`),默认围栏是任务 cwd —— 两者天然不相交:用户说「记住 X」,模型照
|
|
10
|
-
* 提示词去 Write,拿回一个 `path_not_in_root`,而回执早就发出去了。
|
|
11
|
-
*
|
|
12
|
-
* 判据形态 = **纯函数 + 启动 warn,不拒启**。理由是诚实:共享挂载 / bind mount / operator 自己把根塞进
|
|
13
|
-
* `additionalDirectories`,都是真实可行的部署形,而我方在 boot 期看不全。看得全的是「按我们自己接的线,
|
|
14
|
-
* 这条链**结构上**走不通」——那句必须说出来。围栏根算不出来时**不说话**(判不了就闭嘴,别把猜测当告警)。
|
|
15
|
-
*
|
|
16
|
-
* ⚠️ 这不是 fail-open 的托词:真正的 fail-closed 归属面在别处(多租户记忆整体 dark、remote lane 默认 dark)。
|
|
17
|
-
* 本模块判的是「已经决定要开记忆」之后的**可达性**,而可达性的证据一半在部署环境里,不在进程里。
|
|
18
|
-
*
|
|
19
|
-
* ── 指路:声明 `false` 之后引擎那边发生什么(core 5.27.0,[3612] F2;#231 提货批)────────────────────
|
|
20
|
-
* 本模块两条 warn 的收尾句都在劝 operator 表态(`MEMORY_PERSISTENCE_CAPABLE=true|false`)。表 `false`
|
|
21
|
-
* 之后的语义自 core 5.27.0 起**不止是披露**:该会话成为**受限会话** —— materialize/search/harvest 按
|
|
22
|
-
* 已提交账(ledger + shadow)供给,磁盘上无事务背书的分歧既不收编也不供给,而是留盘 + 响亮点名
|
|
23
|
-
* (`restricted_divergence`,`HarvestRejectionCode` 新成员;server 侧把它计进
|
|
24
|
-
* `memory_harvest_rejections_total{code}` + 一条 warn,见 `boot/runner-deps.ts` 的 harvest 报告站点),
|
|
25
|
-
* 等下一次非受限会话走正常门收编。
|
|
26
|
-
* ⚠️ **这一层只在 file 记忆引擎上**(受限视图 = `FileMemoryEngineBackend` 的实装,`materialize` 取它是
|
|
27
|
-
* `?? this.backend` 的可选 seam):`MEMORY_ENGINE_BACKEND=pg|tidb` 的两条腿读侧走库、盘上只是每任务投影,
|
|
28
|
-
* 没有「读磁盘即收编」的通道,`false` 在它们上仍买到披露/写门/零收编 harvest 三件。
|
|
29
|
-
* ⚠️ **口径别混**:受限 = **会话级 verdict 单键**(declared-false 那一个键);`writeScope:null` 的只读
|
|
30
|
-
* **平面**(请求键 `memoryWrite:false` 的 per-run 暂停 / org 层默认只读 / 双根非写面)**保持 adopt-on-read
|
|
31
|
-
* 原样**。受限是会话的**声明**,永远不是平面的**结构**。
|
|
32
|
-
*
|
|
33
|
-
* ── 本仓的 `adoptionRestricted` 消费位:**没有**(记档,免下次重找)──────────────────────────────────
|
|
34
|
-
* core 5.27.0 同批 additive 两件:`MemoryEngine.materialize` 第三参 `opts?.adoptionRestricted` 与
|
|
35
|
-
* `MemorySessionHandle.adoptionRestricted` 读面。本仓**两件都不碰**,而且是结构性的:记忆引擎由 core 的
|
|
36
|
-
* runner 自己驱动(我方只交 `RunnerDeps.memoryBackend` / `memoryEngineDir`),`grep -rn "\.materialize("
|
|
37
|
-
* src test` 零命中 ⇒ 没有调用点可以传第三参,也没有 handle 可读。受限判据因此**只能**从
|
|
38
|
-
* `TaskSpec.memoryPersistenceCapable` 一条路进去(`boot/resolve-spec.ts` 直通),我方显式**不铸**受限会话、
|
|
39
|
-
* 也**不投**这个读面(硬造一个消费点 = 造给自己看的 wire 键)。哪天真要在诊断面露它,先有消费方需求。
|
|
40
|
-
*/
|
|
41
1
|
import { resolve } from "node:path";
|
|
42
|
-
/**
|
|
43
|
-
* #266 A3 源头修(黑板 [4080]/[4082]/[4083],A-044)—— `memoryPersistenceCapable` 的**装配层有效值**:
|
|
44
|
-
* operator 显式 env 恒赢;env 缺席时,`REMOTE_EXEC=host` 腿自动补 `true`;其余一律缺席(现行为)。
|
|
45
|
-
*
|
|
46
|
-
* ## 为什么 host 腿可以自动声明(而且只有 host 腿)
|
|
47
|
-
* core r13/r14 的 withhold 判据是「执行环境暴露 remote 面」——它对 host 腿是**误伤**:host 腿的文件
|
|
48
|
-
* 工具就跑在**这台机器**的 fs 上(`hostSemanticsLane`,与 core 的 remote 判决是两根轴,见下方 facts 注),
|
|
49
|
-
* 记忆根也在这台机器上,「执行车道与记忆根共享文件平面」这个 capable=true 所断言的**车道级事实**由
|
|
50
|
-
* 构造成立。剩下的围栏维(记忆根是否落在该次任务的 fs 授权边界内)在 in-process 上**同样存在**而 core
|
|
51
|
-
* 并不 withhold——它由本模块的 ② 号 warn、fs 门的 `path_not_in_root` 拒绝、`additionalDirectories`
|
|
52
|
-
* 旋钮这套既有处置管,不归 withhold 判据管。所以 host 腿自动 true 与 in-process 的默认行为**同等诚实**。
|
|
53
|
-
* 沙箱腿(e2b/k8s/ssh/local-docker)文件平面在沙箱盘,withhold 是对的,恒不自动。
|
|
54
|
-
*
|
|
55
|
-
* ## 为什么不是「围栏覆盖记忆根」的更严合取
|
|
56
|
-
* boot 期对 host 腿**算不出**围栏根(host factory 每任务另铸 `sema-host-*` 子目录、per-session cwd 可整个
|
|
57
|
-
* 换掉 workspaceBase——见 boot/stores.ts 的 codex 已核注释),那个合取在恰恰需要它的腿上永不可满足;
|
|
58
|
-
* 而且它断言的是 per-task 事实,不是本键的车道级语义。
|
|
59
|
-
*
|
|
60
|
-
* ## 位置与纪律
|
|
61
|
-
* 单源:resolve-spec 的 spec 直通、`shouldDiscloseNoPersistentMemory` 判别式、boot 审计的 declared 位
|
|
62
|
-
* 三处都必须读本函数,禁各自重算(operator-knob 律:显式 env 的优先权在这一个函数里执法一次)。
|
|
63
|
-
* 自动补位在 boot 日志上必须可见(stores.ts 的 info 行),部署方随时可用显式 env 覆盖。
|
|
64
|
-
*/
|
|
65
2
|
export function effectiveMemoryPersistenceCapable(config) {
|
|
66
3
|
if (config.memoryPersistenceCapable !== undefined)
|
|
67
4
|
return config.memoryPersistenceCapable;
|
|
68
5
|
return config.remoteExec?.provider === "host" ? true : undefined;
|
|
69
6
|
}
|
|
70
|
-
/** 词法包含判定:`child` 是否落在 `root` 之内(含相等)。纯词法,不碰 fs —— boot 期这些路径可能还没被
|
|
71
|
-
* 创建,而 `realpath` 会把「同一棵树的两种写法」这个我们**不想**放过的差别悄悄抹平。
|
|
72
|
-
* 先过 `resolve` 折掉 `.`/`..`/重复分隔符(codex 复审:`/srv/ws/../mem` 不该被读成落在 `/srv/ws` 里),
|
|
73
|
-
* 再按 `root + "/"` 前缀判,所以 `/srv/workspace-2` 不会被 `/srv/workspace` 吃掉。 */
|
|
74
7
|
function isInside(child, root) {
|
|
75
8
|
const c = resolve(child);
|
|
76
9
|
const r = resolve(root);
|
|
77
10
|
return c === r || c.startsWith(r === "/" ? "/" : `${r}/`);
|
|
78
11
|
}
|
|
79
|
-
/**
|
|
80
|
-
* 判两件事,互斥(remote 上不叠 host 的围栏话 —— 围栏根本不在这台机器上,说了是噪音):
|
|
81
|
-
*
|
|
82
|
-
* ① **remote 车道**(只可能因为 `MEMORY_ENGINE_REMOTE_LANE=allow` 才在这里还有引擎):core 5.26.0 的
|
|
83
|
-
* r13/r14 收窄把 `# Memory` 写指令在 remote executionEnv 上撤了(沙箱手带够不着 host 记忆根),
|
|
84
|
-
* 官方恢复路径是声明 `memoryPersistenceCapable: true`。未声明 ⇒ 点名 warn,把恢复旋钮写进句子里。
|
|
85
|
-
* ② **host 车道**:记忆根不在任何一个已知围栏根内 ⇒ 模型被教着往一个 fs 工具够不到的路径写。
|
|
86
|
-
*
|
|
87
|
-
* 两极声明都让本模块闭嘴,但理由不同,别合并:
|
|
88
|
-
* · `true` = operator 自证有推断看不见的持久通道(共享挂载 / 自定义 writer),我们的结构判断本就不该
|
|
89
|
-
* 压过部署方对自己环境的声明;
|
|
90
|
-
* · `false` = operator 已经承认「本机存不下」,引擎据此改口披露只读 —— 再 warn 一次是把已知情的事
|
|
91
|
-
* 当新闻报。
|
|
92
|
-
*/
|
|
93
12
|
export function buildMemoryWriteBoundaryAudit(facts) {
|
|
94
13
|
const { memoryRoot, lane, hostSemanticsLane, coreRemoteExecutionEnv, declaredCapable, containmentRoots, engineBackend } = facts;
|
|
95
14
|
if (memoryRoot === undefined)
|
|
96
|
-
return { warnings: [] };
|
|
15
|
+
return { warnings: [] };
|
|
97
16
|
if (declaredCapable !== undefined)
|
|
98
|
-
return { warnings: [] };
|
|
99
|
-
// ① 写指令被撤 —— 判据是 **core 的 remote 判决**,不是文件平面(codex round2 [medium],已核真:
|
|
100
|
-
// `REMOTE_EXEC=host` 的文件平面是本机,但 core 照样判它 remote 并撤掉写指令。按文件平面分腿会让
|
|
101
|
-
// 这一形整个静默 —— 恰恰是最容易被忽略的那台机器:记忆看着是开的,写指令没了,没人说过一句)。
|
|
17
|
+
return { warnings: [] };
|
|
102
18
|
if (coreRemoteExecutionEnv) {
|
|
103
19
|
const plane = hostSemanticsLane
|
|
104
20
|
? `the model's file tools DO run on this worker's filesystem, but core classifies this execution environment as ` +
|
|
@@ -118,13 +34,9 @@ export function buildMemoryWriteBoundaryAudit(facts) {
|
|
|
118
34
|
};
|
|
119
35
|
}
|
|
120
36
|
if (containmentRoots.length === 0)
|
|
121
|
-
return { warnings: [] };
|
|
37
|
+
return { warnings: [] };
|
|
122
38
|
if (containmentRoots.some((root) => isInside(memoryRoot, root)))
|
|
123
39
|
return { warnings: [] };
|
|
124
|
-
// 第一条恢复路径按**后端腿**指对旋钮(2026-08-12 复扫 low:pg/tidb 腿上 MEMORY_ENGINE_DIR 不接线,
|
|
125
|
-
// 而「in-process + MEMORY_ENGINE_BACKEND=pg + 未配 LOCAL_DATA_ROOT」恰恰是这条 warn 的默认命中形 ——
|
|
126
|
-
// 照旧文案去拧只会一直修不好)。另外两条(additionalDirectories / MEMORY_PERSISTENCE_CAPABLE=false)
|
|
127
|
-
// 两条腿都真有效,不分腿。
|
|
128
40
|
const relocateRoot = engineBackend === "file"
|
|
129
41
|
? `point MEMORY_ENGINE_DIR at a path under the workspace`
|
|
130
42
|
: `point LOCAL_DATA_ROOT at a path under the workspace (on the "${engineBackend}" memory plane the root is ` +
|
package/dist/boot/org-memory.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { fetchPrincipalOrgMemory } from "../config-center/http-client.js";
|
|
2
2
|
import { createMemoryScopeAdmission, createOrgMemoryDirectory, parseOrgDirectoryStatic } from "../org-memory-admission.js";
|
|
3
3
|
const ORG_PREFIX = "org:";
|
|
4
|
-
/** 部署自证 org scope 集(core 准入门的 deployment origin 词表):env 钉的 MEMORY_SCOPE(org 形时)
|
|
5
|
-
* + **单用户部署**的 projects 登记簿 org 键(N2:requirePrincipal !== true 的部署无租户边界,operator
|
|
6
|
-
* 登记簿条目归 deployment)。多租户下登记簿 org 键**不入**此集——它们由 resolve-spec 按 request 盖章,
|
|
7
|
-
* 走目录判决。 */
|
|
8
4
|
function collectDeploymentOrgScopes(config) {
|
|
9
5
|
const scopes = new Set();
|
|
10
6
|
if (config.memoryScope !== undefined && config.memoryScope.startsWith(ORG_PREFIX))
|
|
@@ -18,7 +14,6 @@ function collectDeploymentOrgScopes(config) {
|
|
|
18
14
|
}
|
|
19
15
|
return [...scopes];
|
|
20
16
|
}
|
|
21
|
-
/** 依赖收窄到真实消费面(warn/inc 各一手)——接口隔离让测试用真形字面量,零铸形([2704] §1)。 */
|
|
22
17
|
export function createOrgMemoryAdmissionWiring(opts) {
|
|
23
18
|
const { config, logger, metrics } = opts;
|
|
24
19
|
const deploymentMemoryScopes = collectDeploymentOrgScopes(config);
|
|
@@ -31,30 +26,17 @@ export function createOrgMemoryAdmissionWiring(opts) {
|
|
|
31
26
|
}
|
|
32
27
|
const directory = centerLeg !== undefined
|
|
33
28
|
? createOrgMemoryDirectory({
|
|
34
|
-
// 复审 D-2 修:走 org 段专用读取口而不是整封 caps 读。两者同一条 HTTP 腿、同一道 C8 回声核,
|
|
35
|
-
// 差别只在**解析投影**:org 腿只读 principal+orgMemory 两字段,治理面(runtimeCaps/budget)的
|
|
36
|
-
// 值漂移因此不再连坐 org 授权面(此前:一封 runtimeCaps 漂移的响应会让形状完全正确的 org 段
|
|
37
|
-
// 读不出来 ⇒ 目录记 fetch_failed ⇒ 准入瞬时拒)。C3「两张表失败域互不干扰」至此是双向的。
|
|
38
29
|
fetchSection: (principal) => fetchPrincipalOrgMemory(centerLeg.baseUrl, centerLeg.token, principal, fetch, centerLeg.worker),
|
|
39
30
|
grantTtlMs: config.memoryOrgGrantTtlMs,
|
|
40
31
|
unavailableBackoffMs: config.memoryOrgUnavailableBackoffMs,
|
|
41
32
|
})
|
|
42
33
|
: staticJson !== undefined
|
|
43
34
|
? createOrgMemoryDirectory({
|
|
44
|
-
staticTable: parseOrgDirectoryStatic(staticJson),
|
|
35
|
+
staticTable: parseOrgDirectoryStatic(staticJson),
|
|
45
36
|
grantTtlMs: config.memoryOrgGrantTtlMs,
|
|
46
37
|
unavailableBackoffMs: config.memoryOrgUnavailableBackoffMs,
|
|
47
38
|
})
|
|
48
39
|
: undefined;
|
|
49
|
-
// C12 能力探测:多租户 + **记忆面真点亮** + 登记簿有 org 用面 + 目录源缺席 ⇒ 拒启动(见文件头注)。
|
|
50
|
-
//
|
|
51
|
-
// 复审 D-1(7.1.0 后修):探测原先少了「记忆面是否真点亮」这一维,是假阳。多租户下记忆引擎只在
|
|
52
|
-
// `MEMORY_ENGINE` 开 **且** backend 非 file 时才装(boot/stores.ts:file 形在 requirePrincipal 下恒
|
|
53
|
-
// 走 memoryEngineBackendFor() = undefined,「file 底座无租户隔离」);记忆面 dark ⇒ resolve-spec 的
|
|
54
|
-
// `memoryEngine ? memorySpecForRequest(...) : undefined` 根本不铸 spec.memory ⇒ 登记簿里的 org 键
|
|
55
|
-
// 一次也到不了 core 准入门。此时拒启动既拦下了一个本来跑得好好的部署,报错串里那句「every request
|
|
56
|
-
// selecting these projects would be refused at prepare」也是假陈述——探测的成立前提就是「这些键真会
|
|
57
|
-
// 被请求带到准入门」。
|
|
58
40
|
const memoryPlaneLive = config.memoryEngineEnabled && config.memoryEngineBackend !== "file";
|
|
59
41
|
if (directory === undefined && config.requirePrincipal === true && memoryPlaneLive) {
|
|
60
42
|
const orgProjects = Object.entries(config.projects)
|
|
@@ -69,12 +51,6 @@ export function createOrgMemoryAdmissionWiring(opts) {
|
|
|
69
51
|
const memoryScopeAdmission = directory !== undefined
|
|
70
52
|
? createMemoryScopeAdmission(directory, {
|
|
71
53
|
mode: config.memoryOrgAdmissionMode,
|
|
72
|
-
// §5 观测:outcome 闭集 metric + 审计日志线(per-principal 归因走日志,principal 不入 metric label)。
|
|
73
|
-
// 复审 D-3(7.1.0 后修)两处:①`mode` 进 metric label —— 不然 audit 模式记的 would-refuse 与
|
|
74
|
-
// enforce 模式的真拒在同一条 `outcome="denied"` 曲线上不可辨,而「照算不真拒、看曲线」正是
|
|
75
|
-
// audit 这个诊断位存在的唯一用途(二值闭集,基数代价为零);②principal 真的进日志行 —— 归因
|
|
76
|
-
// 由 resolver 塞进 details(此前 details 里根本没有 principal,「per-principal 归因走日志」
|
|
77
|
-
// 这句注释与 CHANGELOG 7.0.0 的同款公开陈述都不成立:运维只看得到「某个 org scope 被拒」)。
|
|
78
54
|
onOutcome: (outcome, details) => {
|
|
79
55
|
metrics.inc("memory_admission_total", { outcome, mode: config.memoryOrgAdmissionMode });
|
|
80
56
|
if (outcome !== "ok" || details !== undefined)
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* [1596]/[1597] 跨副本父约束重供席工厂 —— durable park 的**赎回腿**(design/181 件二 / #179)。
|
|
3
|
-
*
|
|
4
|
-
* 从 main.ts 的装配体里提出来的**唯一理由不是内聚,是可测**:main.ts 顶层 `void main()`,谁 import 它
|
|
5
|
-
* 谁就启动一整个服务,所以那条腿的**运行期**语义在原地一格都钉不住(此前只有源码字符串钉)。提出来之后
|
|
6
|
-
* 「重建出来的链到底裁决成什么样」变成可断言的事实(test/parked-revive-gate-wiring.test.ts 运行期钉 +
|
|
7
|
-
* 治理矩阵的第三维消费腿)。装配次序契约不变:main.ts 仍在同一位置构造,构造条件逐字保持。
|
|
8
|
-
*/
|
|
9
1
|
import { join } from "node:path";
|
|
10
2
|
import { createAutoModeDecider, NodeExecutionEnv } from "@sema-agent/core";
|
|
11
3
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
@@ -13,19 +5,6 @@ import { decodeCheckpointScope } from "../security.js";
|
|
|
13
5
|
import { createApprovalBaselinePolicy, createDeploymentGovernanceInputs, } from "../deployment-governance.js";
|
|
14
6
|
import { applyRuntimeGovernance } from "../runtime-governance.js";
|
|
15
7
|
import { DeferredSandboxPathEnv, isSandboxPathAdjudicationLane, sandboxPathEnvSlots } from "./deferred-sandbox-path-env.js";
|
|
16
|
-
/**
|
|
17
|
-
* host 腿裁决 env 的 cwd:**从不创建**的占位目录(resolve-spec 的 `fs-write-gate-unrooted` 同族)。
|
|
18
|
-
*
|
|
19
|
-
* 赎回腿拿不到子代的工作目录(park 时未持久化,design/181 §2.2 的 v2 候件票),而 `NodeExecutionEnv`
|
|
20
|
-
* 的构造要求一个 cwd。占位形的语义:**绝对形写目标照常按真身裁决**(cwd 与它们无关),相对形则在
|
|
21
|
-
* 一个不存在的根上 canonicalize —— 段匹配照旧命中(守卫段是路径**段**判据),方向 fail-closed。
|
|
22
|
-
* 真正兜住相对形的是构造口内的 `RelativeTargetLexicalEnv` 词法臂(`PathAdjudication.cwd` 缺席即自动补层)。
|
|
23
|
-
* ⚠️ core 5.19.0(#108)后这句话的射程变窄了:守卫改按 `ToolCallRequest.cwd ?? rootPath` 解析写目标,
|
|
24
|
-
* 引擎盖了戳的调用**根本走不到**本占位根(戳优先),词法臂也随之让位给真身裁决(全文见
|
|
25
|
-
* `deployment-governance.ts` 的 `RelativeTargetLexicalEnv` 类注)。本占位根今天只在缺戳形上承重,
|
|
26
|
-
* 语义不变、方向仍 fail-closed,故保留不动。
|
|
27
|
-
* 绝不回落 `process.cwd()`:那是**服务自己的**启动目录,把它当成子代的盘是拿错基准(resolve-spec W4 同案)。
|
|
28
|
-
*/
|
|
29
8
|
function hostGateCwd(config, localRoot) {
|
|
30
9
|
return join(config.localDataRoot ?? localRoot, "parked-revive-unrooted");
|
|
31
10
|
}
|
|
@@ -33,15 +12,7 @@ export function createParkedReviveInheritedGate(deps) {
|
|
|
33
12
|
const { config, question, approvalExemptionStore, logger, localRoot, approverSeat } = deps;
|
|
34
13
|
const slots = deps.slots ?? sandboxPathEnvSlots;
|
|
35
14
|
return async (row, identity) => {
|
|
36
|
-
// A-010.1:三位决议链元数据。**async 的唯一理由**就是其中两位要按 principal 现解 entitlement
|
|
37
|
-
// (core 的 resolver 座本身也是 sync-or-async),而这条腿的消费点(parked-decide 的 `decideParkedAgent`)
|
|
38
|
-
// 从来就在 async 里,「席位必须同步」是本文件此前自设的约束,不是结构事实。
|
|
39
15
|
const metadata = await chainMetadataOf(deps, row, identity);
|
|
40
|
-
// lane 分形与 resolve-spec 同一判别式(单一属主,取值处只此一个)。
|
|
41
|
-
// 🔑 沙箱腿的 slot 键 = **row.sessionId**(子代自己的会话,design/181 §2.2 裁定):revive 后 core 以
|
|
42
|
-
// 该 sessionId 铸 env 并注册 slot(subagent → prepare-task → 工厂装饰器),这个键真能绑上。
|
|
43
|
-
// 键 rootSessionId 跨副本恒 unbound ⇒ 每一次结构化写 fail-closed ⇒ 整条腿瘫痪。
|
|
44
|
-
// 未绑时转发面报错 → core 读成 unresolvedSymlink → 守卫策略 deny(成文的 fail-closed 行为)。
|
|
45
16
|
const pathAdjudication = isSandboxPathAdjudicationLane(config.remoteExec?.provider)
|
|
46
17
|
? {
|
|
47
18
|
env: new DeferredSandboxPathEnv({
|
|
@@ -51,8 +22,6 @@ export function createParkedReviveInheritedGate(deps) {
|
|
|
51
22
|
}),
|
|
52
23
|
}
|
|
53
24
|
: { env: createHostAdjudicationEnv(config, localRoot) };
|
|
54
|
-
// 审批基线:durable 轴(问答门 + F4 审批门 + 会话豁免探针)。exempt 锚 = row.rootSessionId
|
|
55
|
-
// ——与 /decide 的 remember grant 同键([1591] 候裁②),重建链上的豁免语义与原链一致。
|
|
56
25
|
const rootSessionId = row.rootSessionId;
|
|
57
26
|
const baseline = createApprovalBaselinePolicy(config, {
|
|
58
27
|
question,
|
|
@@ -63,11 +32,7 @@ export function createParkedReviveInheritedGate(deps) {
|
|
|
63
32
|
}
|
|
64
33
|
: {}),
|
|
65
34
|
});
|
|
66
|
-
// 折叠属主 = applyRuntimeGovernance → core tightenTaskSpec(本腿一条 policy 都不自己合成)。
|
|
67
|
-
// `objective: ""` 只是折叠所需的最小 TaskSpec 座——本腿只取回 toolPolicy,spec 的其余面不出本函数。
|
|
68
35
|
const governed = applyRuntimeGovernance({ objective: "", toolPolicy: baseline }, createDeploymentGovernanceInputs(config, pathAdjudication));
|
|
69
|
-
// 治理段无可施加时 applyRuntimeGovernance 原样返回 base ⇒ 基线本身即为链(恒非 undefined,无需断言)。
|
|
70
|
-
// shellGate 只在治理段真产出档位时出现在载体上(缺席 = 本次没有 live 值可交,core 用 seed 兜底)。
|
|
71
36
|
return {
|
|
72
37
|
parentConstraints: [
|
|
73
38
|
{
|
|
@@ -80,43 +45,6 @@ export function createParkedReviveInheritedGate(deps) {
|
|
|
80
45
|
};
|
|
81
46
|
};
|
|
82
47
|
}
|
|
83
|
-
/**
|
|
84
|
-
* 重建条目的**决议链元数据**(core 5.22.0 F-012)—— 三位的逐字重算,**一次** entitlement 现解喂全三位
|
|
85
|
-
* (第三位与两位 mandate 的 `forceDurableGate` 项读的是同一次 caps,分两次解会开一个「同一条链里两位读到
|
|
86
|
-
* 不同代 entitlement」的窗)。
|
|
87
|
-
*
|
|
88
|
-
* 为什么它承重:5.22.0 把 re-supply 契约从 count 换成 `cpv1:` 内容摘要
|
|
89
|
-
* (`constraintChainDigest`),而摘要 **把这两位卷了进去**。park 时那一层记的是什么,赎回腿就必须供
|
|
90
|
-
* 什么——供多了、供少了都是 `resume.parent_constraint_mismatch` 响亮拒(pre-CAS,checkpoint 留
|
|
91
|
-
* pending)。**不许**为了让摘要对上而回读 checkpoint 里记的那两位再原样回声:那等于把「重算出同一条链」
|
|
92
|
-
* 换成「抄一份自证」,摘要的防篡改语义当场归零。
|
|
93
|
-
*
|
|
94
|
-
* core 的原式(`prepare-task.js` 的 `inheritedGateForChildren`):
|
|
95
|
-
* ```
|
|
96
|
-
* durableMandate = runtimeCaps.forceDurableGate || (spec.durableApproval !== undefined && !isLiveApproverSeat(spec.onAsk ?? deps.onAsk))
|
|
97
|
-
* contentMandate = runtimeCaps.forceDurableGate || (spec.durableApproval !== undefined && !isLiveQuestionFace(spec.onQuestion ?? deps.onQuestion))
|
|
98
|
-
* ```
|
|
99
|
-
* 本仓三项对位:
|
|
100
|
-
* · `spec.durableApproval !== undefined` —— 本工厂**只在** `config.durableApproval` 为真时构造
|
|
101
|
-
* (main.ts 的构造条件逐字),故这一项在本函数射程内恒成立;
|
|
102
|
-
* · 审批席 = `spec.onAsk ?? deps.onAsk` 的**在场性**。本仓两个装配点(deps 级
|
|
103
|
-
* `createRunnerDepsOnAsk`、per-task 级 `routes/tasks.ts` 的 `boundAsk`)受**同一个**条件闸
|
|
104
|
-
* ——`toolApproval` 协调器在不在场——所以这个布尔在两位上恒等,`approverSeat` 在不在场即判据。
|
|
105
|
-
* ⚠️ 判据是**在场性**不是同一只闭包:身份不同不影响摘要(全文见 {@link ParkedReviveGateDeps.approverSeat});
|
|
106
|
-
* · 问答席 = resolve-spec 的 `liveQuestionFace`:在场 ⇒ spec 不 stamp sentinel、`deps.onQuestion` 的
|
|
107
|
-
* 协调器生效(`isLiveQuestionFace` 判 true);缺席 ⇒ spec stamp `QUESTION_AWAITS_RESUME`
|
|
108
|
-
* (该 sentinel 被 `isLiveQuestionFace` 判 false)。两支都归结为 `question` 在不在场。
|
|
109
|
-
*
|
|
110
|
-
* ✅ **原「已披露残余」销账(A-010.1 同车)**:`runtimeCaps.forceDurableGate`(center 逐 principal 的
|
|
111
|
-
* 授权位)此前写着「在本装配点解不出来——resolver 是 async 而重供席位的形是同步 `(row) => gate`」。那条
|
|
112
|
-
* 阻塞是**本文件自设**的,不是结构事实:唯一的消费点(`parked-decide.ts` 的 `decideParkedAgent`)本来
|
|
113
|
-
* 就在 async 里。席位随本件改成 async 之后,该位与 `autoModeArmed` 走同一条 caps 现解腿一并补齐 —— 否则
|
|
114
|
-
* 「该位为真 + 部署装了活体席」这个组合上 park 记 true 而本腿供 false,摘要恒不匹配、这批 principal 的
|
|
115
|
-
* parked 卡同样永不可赎(与 A-010.1 同族同因的第二个总失效面)。
|
|
116
|
-
*
|
|
117
|
-
* ⚠️ 时点语义与 toolPolicy 轴同族:两位都按**当前** entitlement 现解,挂起期间被撤/被授 ⇒ 摘要对不上
|
|
118
|
-
* ⇒ core pre-CAS 响亮拒(带 `parked_resume.startup_failed` 码可观测),绝不静默按新姿势跑。
|
|
119
|
-
*/
|
|
120
48
|
async function chainMetadataOf(deps, row, identity) {
|
|
121
49
|
const caps = await resolveCapsFor(deps, identity);
|
|
122
50
|
const forced = caps?.forceDurableGate === true;
|
|
@@ -126,36 +54,6 @@ async function chainMetadataOf(deps, row, identity) {
|
|
|
126
54
|
...autoModePostureOf(deps, row, caps),
|
|
127
55
|
};
|
|
128
56
|
}
|
|
129
|
-
/**
|
|
130
|
-
* 本行 principal 的 entitlement 现解(三位元数据共用**一次**)。
|
|
131
|
-
*
|
|
132
|
-
* principal 从哪来:**调用方交下来的 {@link ParkedReviveIdentity}**,值 = `decodeCheckpointScope(cp.scope)`。
|
|
133
|
-
* `cp.scope` 由 `boot/resolve-spec.ts` 写成 `encodeCheckpointScope(auth.principal)`(legacy resume 腿反向
|
|
134
|
-
* 读回 `principal: decodeCheckpointScope(cp.scope)` 是同一等式的另一半),所以它就是那条 run 的
|
|
135
|
-
* `spec.principal`,与 core 喂给 `runtimeCapsResolver(spec.principal)` 的**同一个**值 —— 摘要两侧因此
|
|
136
|
-
* 解到同一份 caps。
|
|
137
|
-
*
|
|
138
|
-
* ⚠️ **不要退回去读 `row.scope`**。写行那一侧(core `subagent.js` 的 `ctx.principal ?? opts.background.scope`,
|
|
139
|
-
* 本仓 `capabilities/scenarios.ts` 填字面 `"default"`)用的是 `principal ?? "default"` 这套约定,与
|
|
140
|
-
* `encodeCheckpointScope` 的 `"_"` 哨兵**不同源**:有 principal 时两套折出同一个字符串(encode 只在
|
|
141
|
-
* null/undefined 时才替换),匿名时分别是 `"default"` 与 `"_"`,而且那一列上**匿名与真名叫 `default` 的
|
|
142
|
-
* 租户不可分辨** —— 有损。
|
|
143
|
-
*
|
|
144
|
-
* 🔴 A-057.44(2026-08-19 两半皆修,本注随之改真)—— **匿名** run 上两者分别是 `"default"` 与 `"_"`,
|
|
145
|
-
* 修前分区查询直接落空 ⇒ 本函数在匿名部署上根本到不了(decide 退回 legacy resume 腿,而那条腿
|
|
146
|
-
* `getCtx(子代会话)` 必 null ⇒ 恒 409)。第一半:`findParkedAgentForCheckpoint` 现在按
|
|
147
|
-
* `backgroundScopesForCheckpointScope(cp.scope)` 的**别名集**查(匿名时把 `"default"` 一并纳入),
|
|
148
|
-
* 于是本函数在匿名部署上首次可达。
|
|
149
|
-
*
|
|
150
|
-
* 第二半(codex 对抗复审 medium,验真后采纳)——**principal 不再从 `row.scope` 解**。本注的上一版警告过
|
|
151
|
-
* 「谁哪天弥合那个匿名未命中,必须连本函数一起重看:`decodeCheckpointScope("default")` 会解出字符串
|
|
152
|
-
* `"default"` 并把它当租户名递进 resolver」。那句警告在第一半落地的当天就兑现了:`row.scope` 在
|
|
153
|
-
* `principal ?? "default"` 约定下**结构性有损**(匿名与一个真名叫 `default` 的租户在这一列上同形),
|
|
154
|
-
* 解错的后果不是拒绝而是**解到另一份 caps** ⇒ 与 park 时冻的摘要对不上 ⇒ 刚变得可达的那批卡又赎不回。
|
|
155
|
-
* ⇒ 席位多收一位 {@link ParkedReviveIdentity}:权威 principal 由**调用方**从 `decodeCheckpointScope(cp.scope)`
|
|
156
|
-
* 现算并传下来(`parked-decide.ts` 的 `decideParkedAgent`),该列由 `encodeCheckpointScope(auth?.principal)`
|
|
157
|
-
* 铸、与 core 喂给 `runtimeCapsResolver` 的是同一个值,无损。参数**必填**:漏传是编译错,不是静默回退。
|
|
158
|
-
*/
|
|
159
57
|
async function resolveCapsFor(deps, identity) {
|
|
160
58
|
if (deps.resolveRuntimeCaps === undefined)
|
|
161
59
|
return undefined;
|
|
@@ -163,61 +61,15 @@ async function resolveCapsFor(deps, identity) {
|
|
|
163
61
|
return await deps.resolveRuntimeCaps(identity.principal);
|
|
164
62
|
}
|
|
165
63
|
catch (err) {
|
|
166
|
-
// 留痕是必需的:否则「这批卡为什么突然赎不动」查无痕迹。
|
|
167
64
|
deps.logger.warn("parked_revive_caps_unresolved", { principal: identity.principal ?? null, err: err instanceof Error ? err.message : String(err) });
|
|
168
65
|
return undefined;
|
|
169
66
|
}
|
|
170
67
|
}
|
|
171
|
-
/**
|
|
172
|
-
* A-010.1 —— 重建条目的**第三位**决议链元数据 `autoModeArmed`(core 5.22.0 F-012 与两位 mandate 同车)。
|
|
173
|
-
*
|
|
174
|
-
* ## 病(本函数存在的唯一理由)
|
|
175
|
-
* core 的摘要口(`tool-policy.js` `constraintChainEntryOf`)把**三**位卷进 `cpv1:` 摘要,而判据是
|
|
176
|
-
* 「条目上有没有 `autoMode` 这个键」:park 时 `prepare-task.js` 的 `inheritedGateForChildren` 写
|
|
177
|
-
* `...(autoModeDecider !== undefined ? { autoMode: { decider } } : {})`,赎回时 `runtask.js` 的 pre-CAS
|
|
178
|
-
* 门按 `pc.autoMode !== undefined` 逐字重算。本腿此前只供 policy/onAsk/两位 mandate,**从不供** autoMode
|
|
179
|
-
* ⇒ auto-mode 权益 principal 的每一条跨副本 parked 赎回摘要恒不匹配、`resume.parent_constraint_mismatch`
|
|
180
|
-
* 响亮拒、卡永不可赎(方向 fail-safe,但功能面对这批 principal 是整条失效)。
|
|
181
|
-
*
|
|
182
|
-
* ## core 的原式(逐字对位,不绕过)
|
|
183
|
-
* ```
|
|
184
|
-
* if (runtimeCaps?.autoMode === true && deps.autoMode !== undefined) autoModeDecider = createAutoModeDecider(…)
|
|
185
|
-
* ```
|
|
186
|
-
* 两个半场本仓分别对位:
|
|
187
|
-
* · `deps.autoMode !== undefined` ⇒ {@link ParkedReviveGateDeps.autoModeSeatMounted}(装配面恒挂,见
|
|
188
|
-
* `boot/runner-deps.ts` 的 `autoMode:{onBreakerOpen}`——**信任门**,单挂它武装不了任何东西);
|
|
189
|
-
* · `runtimeCaps.autoMode === true` ⇒ {@link resolveCapsFor} 按**本行的 principal** 现解(时点语义、
|
|
190
|
-
* principal 从哪来、resolver 缺席/抛错怎么判,全在那只函数的头注)。
|
|
191
|
-
*
|
|
192
|
-
* ## ⛔ 已披露残余:decider 的**身份**跨不了进程(P-DEBT,不是等价替换)
|
|
193
|
-
* 摘要只看键在不在,但 core 在赎回后的每一次继承 ask 上会**真的调** `pc.autoMode.decider`
|
|
194
|
-
* (`prepare-task.js` 的继承包装器,顺序:分类器 → 冻结审批席)。而那只 decider 是祖先任务上的活闭包
|
|
195
|
-
* (绑着它自己的 session 转写窗 + brain),跨副本重建不出来 —— 与本文件 `approverSeat` 那格「诚实的降级」
|
|
196
|
-
* 同族。本腿交的是 **core 自己的构造器**铸的一只 decider,其 classify 腿如实拒答 ⇒ core 收到
|
|
197
|
-
* `unavailable`(它自己 `.catch(() => ({kind:"unavailable"}))` 的同一形)⇒ **不产生任何自动裁决**,原样
|
|
198
|
-
* 落到祖先冻结审批席那条链上(本腿的席位又是无 ALS 的降级形 ⇒ `approverUnavailable` ⇒ 再 park 给人)。
|
|
199
|
-
* 方向:分类器本会 `allow` 的调用改成问人(**更严**);本会 `block` 的也改成问人(**不是自动放行**,但
|
|
200
|
-
* 确实比自动拒松一档)。所以它按 P-DEBT 记债而不是当合法兜底 —— tag
|
|
201
|
-
* `server.parked-revive.ancestor-classifier-unreachable`,逐次计数 + 一次性 warn,收口件二选一:core 把
|
|
202
|
-
* 分类器判据持久进链条目,或让祖先 decider 有可跨进程重建的形。
|
|
203
|
-
*/
|
|
204
68
|
function autoModePostureOf(deps, row, caps) {
|
|
205
69
|
if (deps.autoModeSeatMounted !== true || caps?.autoMode !== true)
|
|
206
70
|
return {};
|
|
207
71
|
return { autoMode: { decider: createUnreachableAncestorClassifier(deps, row) } };
|
|
208
72
|
}
|
|
209
|
-
/**
|
|
210
|
-
* 祖先分类器的**跨进程降级形**(全部理由在 {@link autoModePostureOf} 的残余段)。
|
|
211
|
-
*
|
|
212
|
-
* 内核用 core 自己的 `createAutoModeDecider` 铸 —— 超时/熔断/verdict 词表(`unavailable` 这个词本身)
|
|
213
|
-
* 都归 core 单一属主,本仓只提供一条**如实拒答**的 classify 腿,绝不在此手抄 `{kind:"unavailable"}`。
|
|
214
|
-
* `failureThreshold: 1` 让熔断一拍即开:第一次被咨询就把一次性告警喊出来,之后每次 `decide` 在 core 内
|
|
215
|
-
* 早返 `unavailable`(不再进 classify、不再起 15s 定时器)。
|
|
216
|
-
*
|
|
217
|
-
* 🔴 计数**必须**打在外层 `decide` 上、不能打在 `classify` 里:熔断开了以后 core 早返、classify 再也不
|
|
218
|
-
* 被调用,计数打在里面就永远只记 1 —— 而这个 tag 的语义(和普查表里那一行的文字)是「**丢了祖先分类器
|
|
219
|
-
* 判决的继承 ask 次数**」。打在里面等于让遥测读数与它自称的含义不是一回事,债就在账上消失了。
|
|
220
|
-
*/
|
|
221
73
|
function createUnreachableAncestorClassifier(deps, row) {
|
|
222
74
|
const inner = createAutoModeDecider({
|
|
223
75
|
failureThreshold: 1,
|
|
@@ -240,8 +92,6 @@ function createUnreachableAncestorClassifier(deps, row) {
|
|
|
240
92
|
},
|
|
241
93
|
};
|
|
242
94
|
}
|
|
243
|
-
/** host 腿的裁决 env(真 fs;构造是纯字段赋值,不 spawn)。**每次赎回现铸**——与「禁 memoize」同因:
|
|
244
|
-
* cwd 占位读的是活 config 的 `localDataRoot`。 */
|
|
245
95
|
function createHostAdjudicationEnv(config, localRoot) {
|
|
246
96
|
return new NodeExecutionEnv({ cwd: hostGateCwd(config, localRoot) });
|
|
247
97
|
}
|
|
@@ -1,35 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* #203 §3(design/203 v2 §6 F4 的**残余采纳**)—— 默认 ON 的**休眠行审计**。
|
|
3
|
-
*
|
|
4
|
-
* 🔴 这条审计存在的唯一理由:`PERMISSION_RULES_ENABLED` 的默认值在本车从 OFF 翻成 ON,而**旋钮翻转
|
|
5
|
-
* 与规则行的寿命是两条独立的时间线**。三张表自 #154 车二起就随中央 `ensureSchema` 建、并且从来没有被
|
|
6
|
-
* 清过,所以下面这两类部署在升级的那一刻会突然带着**既有**规则行开始放行:
|
|
7
|
-
* · 曾经把旋钮开过一段时间又关掉的部署(行留在库里,只是没人读);
|
|
8
|
-
* · 从旧库恢复/克隆出来的部署(行跟着数据一起来的)。
|
|
9
|
-
* 对运维来说,这是「我什么都没改,worker 却开始少问我了」——一次**放宽面**上的静默变化。审计做的事
|
|
10
|
-
* 很小但是承重:在启动日志里把它说出来,让「少问」是一条能被读到的因果,而不是一次玄学。
|
|
11
|
-
*
|
|
12
|
-
* ── 三条判据,逐条有理由 ────────────────────────────────────────────────────────────────────────
|
|
13
|
-
* ① **店缺席 ⇒ 整条不上场**(零 I/O、零行)。店缺席包括:显式关旋钮、`local` 车道没接 File 店的旧
|
|
14
|
-
* 部署、以及压根没有 backend 的 env-only worker。没有店就没有行,谈不上唤醒。
|
|
15
|
-
* ② **零桶 ⇒ 不打行**。一条「0 条既有规则随默认 ON 激活」的行是纯噪音:它对读日志的人不传递任何
|
|
16
|
-
* 可行动的信息,却让真正有东西被唤醒的那一行变得不显眼。
|
|
17
|
-
* ③ **运维**显式**表过态(`PERMISSION_RULES_ENABLED` 被设成 true 或 false)⇒ 不打行**。那些行本来
|
|
18
|
-
* 就是活的(或者旋钮被显式关着、店根本没装配),默认值翻不翻转对它们零影响 —— 说「随默认 ON
|
|
19
|
-
* 激活」是**假话**,而在启动日志里说假话比不说更坏。判据用 `permissionRulesEnabledExplicit`
|
|
20
|
-
* (config.ts 与 `dbBackendExplicit` 同姿势),不是猜。
|
|
21
|
-
*
|
|
22
|
-
* ── 失败方向 ────────────────────────────────────────────────────────────────────────────────────
|
|
23
|
-
* 数不出来(库抖动 / 文件读不了)⇒ **不拒启、也不编一个 0 出来**:返回 `undefined` + 一条 warn。
|
|
24
|
-
* 这是一条纯诊断面(它不参与任何放行/拒绝判决),所以它的降级方向是「安静地不知道」而不是「谎报
|
|
25
|
-
* 零」——`{ buckets: 0 }` 会被下游读成「确认没有休眠行」,那是把一次读失败伪装成一个结论。
|
|
26
|
-
* 因为它零判决,这条 fail-open 不属于 `docs/FAIL-OPEN-CENSUS.md` 的安全轴 P 类,故不占 `recordFailOpen`
|
|
27
|
-
* 的标签;它的可见性由那条 warn 承担。
|
|
28
|
-
*/
|
|
29
|
-
/** boot 期一次性调用。返回读数(`undefined` = 没店 / 数不出来),绝不抛。 */
|
|
30
1
|
export async function auditDormantPermissionRules(ctx) {
|
|
31
2
|
if (ctx.stores === undefined)
|
|
32
|
-
return undefined;
|
|
3
|
+
return undefined;
|
|
33
4
|
let buckets;
|
|
34
5
|
try {
|
|
35
6
|
buckets = await ctx.stores.countBuckets();
|
|
@@ -42,32 +13,6 @@ export async function auditDormantPermissionRules(ctx) {
|
|
|
42
13
|
return undefined;
|
|
43
14
|
}
|
|
44
15
|
if (buckets > 0 && !ctx.explicit) {
|
|
45
|
-
// ②③ 都不成立才说话。文案给的是**一条可行动的因果**:看到少问了 ⇒ 这里有 N 只既有桶 ⇒ 用
|
|
46
|
-
// `GET /v1/rules` 看、用 `DELETE /v1/rules` 收,或者把旋钮显式关掉。
|
|
47
|
-
//
|
|
48
|
-
// 🔴 **local-owner 桶的现状必须同拍说清**(#203 收官件 / #205 件5,core 5.24.0 提货批):
|
|
49
|
-
// `countBuckets` 数的是**所有**桶,其中可能有一只**身份缺席**的 local-owner 桶(File 后端 =
|
|
50
|
-
// `permission-rules/local-owner.json`,SQL 后端 = owner_key `local-owner` 的行)。而 `GET`/`DELETE
|
|
51
|
-
// /v1/rules` 两口是 **principal 寻址**的(无 principal 一律 401,契约上刻意的边界)—— 对那只桶,
|
|
52
|
-
// 上面那句「inspect with GET / revoke with DELETE」是**兑不出来的承诺**。
|
|
53
|
-
//
|
|
54
|
-
// ⚠️ 文案只说**兑得出来**的话(codex 对抗复审 R1-[medium],验真后改):第一稿在这里写的是
|
|
55
|
-
// 「adopt it into a principal first」——**本仓没有那条路**。收编入口的来源词表逐字只有
|
|
56
|
-
// `{kind:"principal"}`(`adoption/wire.ts` 的 `AdoptionSourceSchema`,`.strict()` 拒 local-owner),
|
|
57
|
-
// core 的 `adoptFilePermissionRuleStore` 在 src/ 下零调用点,SQL 侧连对应原语都没有。指一条走不通
|
|
58
|
-
// 的路比不指更坏:运维会去试,试不通才发现自己被误导。
|
|
59
|
-
// 今天**真能做的**只有两件:①`PERMISSION_RULES_ENABLED=false` 把整条车道关掉(上面已给);
|
|
60
|
-
// ②运维直接动存储。
|
|
61
|
-
// 🔴 第二条的**谓词必须是真的**(codex 对抗复审 R2-[medium],验真后改):第一稿写的是
|
|
62
|
-
// 「owner_key='local-owner'」——那条 SQL **一行都删不到**。`buildRuleOwnerKey`
|
|
63
|
-
// (`plugins/permission-rule-store-sql.ts`)把 owner_key 算成 `sha256("local-owner")` 的十六进制,
|
|
64
|
-
// 字面判别式存在**另一列** `owner_kind` 上。给一条匹配零行的删除语句比不给更坏:它会静默成功,
|
|
65
|
-
// 运维以为收回了权限而规则还在放行。真谓词 = `permission_rule` 表的 `owner_kind='local-owner'`。
|
|
66
|
-
// File 后端那侧是固定文件名,照给。
|
|
67
|
-
// 店层与车道层其实已接通(core 5.24.0 的 `removePersistedRule` 收 `RuleOwner`,本仓
|
|
68
|
-
// `rules-consent.ts` 的 `listRules`/`removeRule` 已能寻址该桶,格见
|
|
69
|
-
// `test/rules-consent-local-owner.test.ts`),缺的只是一个 HTTP 开口 —— 开不开、开在哪条门
|
|
70
|
-
// (operator 面 / run-local 面)属产品面裁定,不在本车擅开。
|
|
71
16
|
ctx.logger.info("permission_rules_activated_by_default", {
|
|
72
17
|
buckets,
|
|
73
18
|
knob: "PERMISSION_RULES_ENABLED",
|