@sema-agent/server 1.322.0 → 2.0.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/dist/approval-hmac.d.ts +40 -0
- package/dist/approval-hmac.js +67 -0
- package/dist/approval.d.ts +31 -0
- package/dist/approval.js +72 -4
- package/dist/audit.d.ts +26 -0
- package/dist/audit.js +40 -1
- package/dist/auth-bridge.d.ts +10 -0
- package/dist/auth-bridge.js +47 -4
- package/dist/auth-keys.d.ts +19 -0
- package/dist/auth-keys.js +13 -0
- package/dist/bake-runner/main.d.ts +5 -0
- package/dist/bake-runner/main.js +43 -4
- package/dist/bake-runner/protocol.d.ts +57 -0
- package/dist/bake-runner/protocol.js +58 -3
- package/dist/bake-runner/runner.d.ts +54 -0
- package/dist/bake-runner/runner.js +87 -5
- package/dist/bench/l8/artifact.d.ts +63 -0
- package/dist/bench/l8/artifact.js +61 -2
- package/dist/bench/l8/escape.d.ts +36 -0
- package/dist/bench/l8/escape.js +25 -0
- package/dist/bench/l8/index.d.ts +14 -0
- package/dist/bench/l8/index.js +14 -0
- package/dist/bench/l8/probes.d.ts +74 -0
- package/dist/bench/l8/probes.js +60 -0
- package/dist/bench/l8/run-probes.d.ts +43 -0
- package/dist/bench/l8/run-probes.js +45 -2
- package/dist/bench/s1/arms.d.ts +126 -0
- package/dist/bench/s1/arms.js +188 -13
- package/dist/bench/s1/live-deps.d.ts +66 -0
- package/dist/bench/s1/live-deps.js +249 -11
- package/dist/bench/s1/oracle.d.ts +49 -0
- package/dist/bench/s1/oracle.js +36 -1
- package/dist/bench/s1/repair-oracle-adapter.d.ts +33 -0
- package/dist/bench/s1/repair-oracle-adapter.js +30 -0
- package/dist/bench/s1/reviewer.d.ts +38 -0
- package/dist/bench/s1/reviewer.js +34 -0
- package/dist/bench/s1/row.d.ts +77 -0
- package/dist/bench/s1/row.js +62 -0
- package/dist/bench/s1/run-firm.d.ts +47 -0
- package/dist/bench/s1/run-firm.js +70 -4
- package/dist/bench/s1/runner-ctx.d.ts +71 -0
- package/dist/bench/s1/runner-ctx.js +36 -0
- package/dist/bench/s1/tasks.d.ts +108 -0
- package/dist/bench/s1/tasks.js +115 -0
- package/dist/boot-reclaim.d.ts +19 -0
- package/dist/boot-reclaim.js +20 -0
- package/dist/brain.d.ts +25 -0
- package/dist/brain.js +61 -1
- package/dist/budget.d.ts +66 -0
- package/dist/budget.js +128 -4
- package/dist/capabilities/builtin-tools.d.ts +3 -0
- package/dist/capabilities/builtin-tools.js +3 -0
- package/dist/capabilities/center-plugins.d.ts +17 -1
- package/dist/capabilities/center-plugins.js +45 -4
- package/dist/capabilities/center-prompts.d.ts +46 -0
- package/dist/capabilities/center-prompts.js +57 -3
- package/dist/capabilities/code-review-council.d.ts +28 -0
- package/dist/capabilities/code-review-council.js +40 -7
- package/dist/capabilities/collab-wire.d.ts +2 -0
- package/dist/capabilities/collab-workflows.d.ts +7 -0
- package/dist/capabilities/collab-workflows.js +44 -1
- package/dist/capabilities/oa-tools.d.ts +6 -0
- package/dist/capabilities/oa-tools.js +10 -0
- package/dist/capabilities/prompt.d.ts +14 -0
- package/dist/capabilities/prompt.js +14 -0
- package/dist/capabilities/prompts/code-review.d.ts +14 -0
- package/dist/capabilities/prompts/code-review.js +14 -0
- package/dist/capabilities/prompts/identity.d.ts +6 -0
- package/dist/capabilities/prompts/identity.js +6 -0
- package/dist/capabilities/prompts/team.d.ts +4 -0
- package/dist/capabilities/prompts/team.js +4 -0
- package/dist/capabilities/repo-tools.d.ts +11 -0
- package/dist/capabilities/repo-tools.js +8 -0
- package/dist/capabilities/sandbox-file-send.d.ts +95 -0
- package/dist/capabilities/sandbox-file-send.js +91 -3
- package/dist/capabilities/scenarios.d.ts +130 -0
- package/dist/capabilities/scenarios.js +180 -7
- package/dist/capabilities/select-environment-tool.d.ts +7 -0
- package/dist/capabilities/select-environment-tool.js +30 -0
- package/dist/capabilities/send-user-file-tool.d.ts +33 -0
- package/dist/capabilities/send-user-file-tool.js +65 -1
- package/dist/capabilities/skills.d.ts +29 -0
- package/dist/capabilities/skills.js +13 -2
- package/dist/capabilities/team.d.ts +22 -0
- package/dist/capabilities/team.js +22 -2
- package/dist/capabilities/tool-defer.d.ts +26 -0
- package/dist/capabilities/tool-defer.js +3 -0
- package/dist/config-center/apply-effective.d.ts +65 -0
- package/dist/config-center/apply-effective.js +204 -12
- package/dist/config-center/http-client.d.ts +34 -0
- package/dist/config-center/http-client.js +68 -0
- package/dist/config-center/restart-signal.d.ts +22 -0
- package/dist/config-center/restart-signal.js +39 -0
- package/dist/config-center/skills-mcp.d.ts +20 -1
- package/dist/config-center/skills-mcp.js +42 -7
- package/dist/config-center/types.d.ts +92 -1
- package/dist/config-lkg.d.ts +12 -0
- package/dist/config-lkg.js +41 -0
- package/dist/config-provider.d.ts +78 -0
- package/dist/config-provider.js +165 -2
- package/dist/config-types.d.ts +546 -0
- package/dist/config.d.ts +64 -0
- package/dist/config.js +455 -60
- package/dist/degenerate-instrument.d.ts +38 -0
- package/dist/degenerate-instrument.js +55 -3
- package/dist/elicitation.d.ts +39 -0
- package/dist/elicitation.js +87 -3
- package/dist/env-facts.d.ts +61 -0
- package/dist/env-facts.js +73 -7
- package/dist/fleet/fleet-bus.d.ts +185 -0
- package/dist/fleet/fleet-bus.js +333 -27
- package/dist/fleet/subagent-tail-bus.d.ts +11 -0
- package/dist/fleet/subagent-tail-bus.js +33 -2
- package/dist/fleet-client.d.ts +38 -0
- package/dist/fleet-client.js +44 -9
- package/dist/fleet-lease.d.ts +46 -0
- package/dist/fleet-lease.js +73 -5
- package/dist/hooks/branch-transcript.d.ts +8 -0
- package/dist/hooks/branch-transcript.js +33 -0
- package/dist/hooks/cc-stop-prompt.d.ts +42 -0
- package/dist/hooks/cc-stop-prompt.js +43 -1
- package/dist/hooks/hook-llm.d.ts +15 -0
- package/dist/hooks/hook-llm.js +47 -0
- package/dist/hooks/hook-runner.d.ts +89 -0
- package/dist/hooks/hook-runner.js +327 -18
- package/dist/http/idempotency.d.ts +31 -0
- package/dist/http/idempotency.js +34 -0
- package/dist/http/principal-gate.d.ts +17 -0
- package/dist/http/principal-gate.js +35 -3
- package/dist/http/route-ctx.d.ts +36 -0
- package/dist/http/routes/approvals-assistant.d.ts +25 -0
- package/dist/http/routes/approvals-assistant.js +253 -23
- package/dist/http/routes/attachments.js +22 -4
- package/dist/http/routes/capabilities.d.ts +7 -0
- package/dist/http/routes/capabilities.js +202 -1
- package/dist/http/routes/fleet.d.ts +6 -0
- package/dist/http/routes/fleet.js +94 -5
- package/dist/http/routes/images.d.ts +17 -0
- package/dist/http/routes/images.js +222 -14
- package/dist/http/routes/leader.d.ts +7 -0
- package/dist/http/routes/leader.js +10 -0
- package/dist/http/routes/memory-policy.d.ts +6 -0
- package/dist/http/routes/memory-policy.js +38 -6
- package/dist/http/routes/notify-wake.d.ts +10 -0
- package/dist/http/routes/notify-wake.js +19 -3
- package/dist/http/routes/observability.d.ts +6 -0
- package/dist/http/routes/observability.js +19 -2
- package/dist/http/routes/runs.d.ts +15 -0
- package/dist/http/routes/runs.js +464 -41
- package/dist/http/routes/session-sync.d.ts +15 -0
- package/dist/http/routes/session-sync.js +229 -19
- package/dist/http/routes/sessions-list.d.ts +6 -0
- package/dist/http/routes/sessions-list.js +35 -4
- package/dist/http/routes/sessions.d.ts +14 -0
- package/dist/http/routes/sessions.js +176 -31
- package/dist/http/routes/side-query.d.ts +8 -0
- package/dist/http/routes/side-query.js +26 -1
- package/dist/http/routes/tasks.d.ts +18 -0
- package/dist/http/routes/tasks.js +501 -38
- package/dist/http/routes/trace-usage.d.ts +10 -0
- package/dist/http/routes/trace-usage.js +66 -14
- package/dist/http/routes/workflows.d.ts +12 -0
- package/dist/http/routes/workflows.js +180 -19
- package/dist/http/run-meta.d.ts +11 -0
- package/dist/http/run-meta.js +6 -0
- package/dist/http/send.d.ts +19 -0
- package/dist/http/send.js +11 -0
- package/dist/http/server.d.ts +255 -0
- package/dist/http/server.js +921 -75
- package/dist/http/sse-log.d.ts +15 -0
- package/dist/http/sse-log.js +16 -0
- package/dist/http/tar.d.ts +9 -0
- package/dist/http/tar.js +21 -5
- package/dist/http/wire-gate.d.ts +9 -0
- package/dist/http/wire-gate.js +9 -0
- package/dist/http/wire-types.d.ts +187 -0
- package/dist/http/workspace-content.d.ts +8 -0
- package/dist/http/workspace-content.js +10 -0
- package/dist/images/bake-validate.d.ts +63 -0
- package/dist/images/bake-validate.js +71 -1
- package/dist/images/manifest.d.ts +19 -0
- package/dist/images/manifest.js +6 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.js +10 -5
- package/dist/key-resolver.d.ts +23 -0
- package/dist/key-resolver.js +27 -2
- package/dist/leader/diffout.d.ts +23 -0
- package/dist/leader/diffout.js +8 -1
- package/dist/leader/diffup.d.ts +32 -0
- package/dist/leader/diffup.js +43 -0
- package/dist/leader/endpoint.d.ts +20 -0
- package/dist/leader/endpoint.js +25 -2
- package/dist/leader/fanout.d.ts +60 -0
- package/dist/leader/fanout.js +29 -3
- package/dist/leader/grader-env-factory.d.ts +74 -0
- package/dist/leader/grader-env-factory.js +62 -3
- package/dist/leader/leader.d.ts +97 -0
- package/dist/leader/leader.js +151 -4
- package/dist/leader/merge.d.ts +94 -0
- package/dist/leader/merge.js +112 -9
- package/dist/leader/planner.d.ts +52 -0
- package/dist/leader/planner.js +47 -3
- package/dist/leader/repair-oracle.d.ts +61 -0
- package/dist/leader/repair-oracle.js +59 -1
- package/dist/leader/repair-wire.d.ts +78 -0
- package/dist/leader/repair-wire.js +79 -2
- package/dist/leader/wire.d.ts +79 -0
- package/dist/leader/wire.js +255 -8
- package/dist/lsp/e2b-bridge.d.ts +16 -0
- package/dist/lsp/e2b-bridge.js +32 -4
- package/dist/lsp/e2b-manager.d.ts +10 -0
- package/dist/lsp/e2b-manager.js +18 -2
- package/dist/lsp/lsp-frames.d.ts +12 -0
- package/dist/lsp/lsp-frames.js +12 -0
- package/dist/lsp/manager.d.ts +12 -0
- package/dist/lsp/manager.js +35 -2
- package/dist/lsp/types.d.ts +10 -0
- package/dist/lsp/ws-transport.d.ts +12 -0
- package/dist/lsp/ws-transport.js +53 -5
- package/dist/lsp-evict.d.ts +14 -0
- package/dist/lsp-evict.js +15 -1
- package/dist/main.js +2132 -96
- package/dist/memory-export.d.ts +1 -0
- package/dist/memory-export.js +4 -0
- package/dist/memory-scope.d.ts +49 -0
- package/dist/memory-scope.js +87 -4
- package/dist/memory-sync-client.d.ts +24 -0
- package/dist/memory-sync-client.js +41 -2
- package/dist/memory-sync.d.ts +23 -0
- package/dist/memory-sync.js +70 -1
- package/dist/model-select.d.ts +39 -0
- package/dist/model-select.js +42 -1
- package/dist/observability/cost-quota.d.ts +20 -0
- package/dist/observability/cost-quota.js +4 -0
- package/dist/observability/cost-taxonomy.d.ts +45 -0
- package/dist/observability/cost-taxonomy.js +34 -0
- package/dist/observability/logger.d.ts +1 -0
- package/dist/observability/logger.js +6 -0
- package/dist/observability/metrics.d.ts +13 -0
- package/dist/observability/metrics.js +63 -0
- package/dist/observability/otel-exporter.d.ts +9 -0
- package/dist/observability/otel-exporter.js +11 -3
- package/dist/observability/principal-context.d.ts +9 -0
- package/dist/observability/principal-context.js +9 -0
- package/dist/observability/prompt-manifest.d.ts +37 -0
- package/dist/observability/prompt-manifest.js +35 -1
- package/dist/observability/rate-limit.d.ts +10 -0
- package/dist/observability/rate-limit.js +1 -0
- package/dist/observability/tool-trace.d.ts +24 -0
- package/dist/observability/tool-trace.js +41 -1
- package/dist/orchestration/hardened-vm-runner.d.ts +107 -0
- package/dist/orchestration/hardened-vm-runner.js +119 -4
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +14 -0
- package/dist/orchestration/hardened-vm-worker-runner.js +26 -1
- package/dist/orchestration/hardened-vm-worker.js +27 -0
- package/dist/orchestration/subagent-steer.d.ts +44 -0
- package/dist/orchestration/subagent-steer.js +45 -1
- package/dist/orchestration/workflow-agent-steer.d.ts +54 -0
- package/dist/orchestration/workflow-agent-steer.js +80 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +189 -2
- package/dist/orchestration/workflow-completion-inbox.js +283 -32
- package/dist/orchestration/workflow-notify-journal.d.ts +132 -1
- package/dist/orchestration/workflow-notify-journal.js +187 -13
- package/dist/parked-decide.d.ts +61 -0
- package/dist/parked-decide.js +58 -1
- package/dist/per-task-image.d.ts +54 -0
- package/dist/per-task-image.js +41 -0
- package/dist/plan-cache-probe.d.ts +35 -0
- package/dist/plan-cache-probe.js +18 -3
- package/dist/plugins/approval-exemption-store.d.ts +7 -0
- package/dist/plugins/approval-exemption-store.js +28 -2
- package/dist/plugins/approval-store-sql.d.ts +64 -0
- package/dist/plugins/approval-store-sql.js +32 -0
- package/dist/plugins/background-agent-store-sql.d.ts +55 -0
- package/dist/plugins/background-agent-store-sql.js +91 -4
- package/dist/plugins/background-shell-support.d.ts +98 -0
- package/dist/plugins/background-shell-support.js +117 -13
- package/dist/plugins/blob-backend.d.ts +104 -0
- package/dist/plugins/blob-backend.js +163 -6
- package/dist/plugins/breaker-state-sql.d.ts +65 -1
- package/dist/plugins/breaker-state-sql.js +46 -8
- package/dist/plugins/caching-session-store.d.ts +42 -0
- package/dist/plugins/caching-session-store.js +63 -3
- package/dist/plugins/checkpoint-store-sql.d.ts +179 -0
- package/dist/plugins/checkpoint-store-sql.js +239 -11
- package/dist/plugins/file-outcome-sink.d.ts +4 -0
- package/dist/plugins/file-outcome-sink.js +9 -0
- package/dist/plugins/file-resume-anchor-store.d.ts +20 -0
- package/dist/plugins/file-resume-anchor-store.js +43 -4
- package/dist/plugins/file-run-store.d.ts +90 -0
- package/dist/plugins/file-run-store.js +145 -13
- package/dist/plugins/file-snapshot-store-sql.d.ts +133 -1
- package/dist/plugins/file-snapshot-store-sql.js +178 -10
- package/dist/plugins/file-workflow-journal-store.d.ts +10 -0
- package/dist/plugins/file-workflow-journal-store.js +10 -0
- package/dist/plugins/fork-routing-session-store.d.ts +47 -0
- package/dist/plugins/fork-routing-session-store.js +51 -3
- package/dist/plugins/host-platform.d.ts +69 -0
- package/dist/plugins/host-platform.js +81 -2
- package/dist/plugins/image-bake-store-sql.d.ts +136 -1
- package/dist/plugins/image-bake-store-sql.js +241 -7
- package/dist/plugins/image-index-sql.d.ts +46 -0
- package/dist/plugins/image-index-sql.js +113 -4
- package/dist/plugins/k8s-bg-scripts.d.ts +34 -0
- package/dist/plugins/k8s-bg-scripts.js +88 -4
- package/dist/plugins/k8s-exec-protocol.d.ts +33 -0
- package/dist/plugins/k8s-exec-protocol.js +41 -0
- package/dist/plugins/local-checkpoint-store.d.ts +40 -0
- package/dist/plugins/local-checkpoint-store.js +86 -7
- package/dist/plugins/local-session-store.d.ts +157 -0
- package/dist/plugins/local-session-store.js +289 -34
- package/dist/plugins/local-task-attachment-store.js +14 -2
- package/dist/plugins/mailbox-store-sql.d.ts +38 -0
- package/dist/plugins/mailbox-store-sql.js +39 -6
- package/dist/plugins/memory-engine-pg.d.ts +30 -0
- package/dist/plugins/memory-engine-pg.js +122 -4
- package/dist/plugins/memory-engine-tidb.d.ts +26 -0
- package/dist/plugins/memory-engine-tidb.js +115 -5
- package/dist/plugins/memory-engine-vector-util.d.ts +5 -0
- package/dist/plugins/memory-engine-vector-util.js +5 -0
- package/dist/plugins/memory-resume-anchor-store.d.ts +8 -0
- package/dist/plugins/memory-resume-anchor-store.js +17 -0
- package/dist/plugins/memory-run-store.d.ts +63 -0
- package/dist/plugins/memory-run-store.js +73 -8
- package/dist/plugins/memory-session-policy-store.d.ts +17 -0
- package/dist/plugins/memory-session-policy-store.js +17 -0
- package/dist/plugins/memory-sync-store-pg.d.ts +42 -0
- package/dist/plugins/memory-sync-store-pg.js +45 -2
- package/dist/plugins/memory-sync-store-tidb.d.ts +9 -0
- package/dist/plugins/memory-sync-store-tidb.js +31 -1
- package/dist/plugins/outcome-ledger-sql.d.ts +63 -0
- package/dist/plugins/outcome-ledger-sql.js +97 -3
- package/dist/plugins/pg-approval-store.d.ts +7 -0
- package/dist/plugins/pg-approval-store.js +7 -0
- package/dist/plugins/pg-breaker-state.d.ts +6 -0
- package/dist/plugins/pg-breaker-state.js +6 -0
- package/dist/plugins/pg-checkpoint-store.d.ts +8 -0
- package/dist/plugins/pg-checkpoint-store.js +8 -0
- package/dist/plugins/pg-cost-quota.d.ts +17 -0
- package/dist/plugins/pg-cost-quota.js +6 -0
- package/dist/plugins/pg-file-snapshot-store.d.ts +6 -0
- package/dist/plugins/pg-file-snapshot-store.js +6 -0
- package/dist/plugins/pg-image-bake.d.ts +9 -0
- package/dist/plugins/pg-image-bake.js +9 -0
- package/dist/plugins/pg-image-index.d.ts +9 -0
- package/dist/plugins/pg-image-index.js +9 -0
- package/dist/plugins/pg-outcome-ledger.d.ts +9 -0
- package/dist/plugins/pg-outcome-ledger.js +9 -0
- package/dist/plugins/pg-pool.d.ts +50 -0
- package/dist/plugins/pg-pool.js +78 -0
- package/dist/plugins/pg-query.d.ts +11 -0
- package/dist/plugins/pg-rate-limiter.d.ts +23 -0
- package/dist/plugins/pg-rate-limiter.js +12 -2
- package/dist/plugins/pg-resume-anchor-store.d.ts +5 -0
- package/dist/plugins/pg-resume-anchor-store.js +5 -0
- package/dist/plugins/pg-run-store.d.ts +7 -0
- package/dist/plugins/pg-run-store.js +7 -0
- package/dist/plugins/pg-safe-json.d.ts +13 -0
- package/dist/plugins/pg-safe-json.js +40 -4
- package/dist/plugins/pg-session-policy-store.d.ts +5 -0
- package/dist/plugins/pg-session-policy-store.js +5 -0
- package/dist/plugins/pg-session-storage.d.ts +72 -0
- package/dist/plugins/pg-session-storage.js +152 -20
- package/dist/plugins/pg-session-store.d.ts +10 -0
- package/dist/plugins/pg-session-store.js +10 -0
- package/dist/plugins/pg-tool-result-store.d.ts +7 -0
- package/dist/plugins/pg-tool-result-store.js +7 -0
- package/dist/plugins/pg-workflow-journal-store.d.ts +7 -0
- package/dist/plugins/pg-workflow-journal-store.js +7 -0
- package/dist/plugins/pg-workflow-run-store.d.ts +7 -0
- package/dist/plugins/pg-workflow-run-store.js +7 -0
- package/dist/plugins/posix-shell-fs.d.ts +3 -0
- package/dist/plugins/posix-shell-fs.js +31 -1
- package/dist/plugins/remote-env-adb.d.ts +25 -0
- package/dist/plugins/remote-env-adb.js +95 -12
- package/dist/plugins/remote-env-e2b.d.ts +146 -0
- package/dist/plugins/remote-env-e2b.js +371 -40
- package/dist/plugins/remote-env-file-error.d.ts +34 -0
- package/dist/plugins/remote-env-file-error.js +37 -0
- package/dist/plugins/remote-env-host.d.ts +151 -0
- package/dist/plugins/remote-env-host.js +468 -70
- package/dist/plugins/remote-env-k8s.d.ts +135 -0
- package/dist/plugins/remote-env-k8s.js +318 -32
- package/dist/plugins/remote-env-local-docker.d.ts +65 -0
- package/dist/plugins/remote-env-local-docker.js +149 -24
- package/dist/plugins/remote-env-ssh.d.ts +35 -0
- package/dist/plugins/remote-env-ssh.js +117 -20
- package/dist/plugins/remote-scratchpad.d.ts +38 -0
- package/dist/plugins/remote-scratchpad.js +32 -2
- package/dist/plugins/remote-shell.d.ts +22 -0
- package/dist/plugins/remote-shell.js +27 -1
- package/dist/plugins/resume-anchor-store-sql.d.ts +28 -0
- package/dist/plugins/resume-anchor-store-sql.js +11 -0
- package/dist/plugins/roster-store-sql.d.ts +27 -0
- package/dist/plugins/roster-store-sql.js +54 -0
- package/dist/plugins/run-store-sql.d.ts +194 -0
- package/dist/plugins/run-store-sql.js +210 -9
- package/dist/plugins/s3-presign.d.ts +20 -0
- package/dist/plugins/s3-presign.js +49 -2
- package/dist/plugins/scheduler-support.d.ts +12 -0
- package/dist/plugins/scheduler-support.js +75 -3
- package/dist/plugins/send-file-ledger.d.ts +15 -0
- package/dist/plugins/send-file-ledger.js +53 -4
- package/dist/plugins/send-user-file.d.ts +77 -0
- package/dist/plugins/send-user-file.js +92 -4
- package/dist/plugins/session-policy-store-sql.d.ts +15 -0
- package/dist/plugins/session-policy-store-sql.js +75 -3
- package/dist/plugins/session-store.d.ts +45 -0
- package/dist/plugins/session-store.js +51 -0
- package/dist/plugins/sql-driver.d.ts +77 -0
- package/dist/plugins/sql-driver.js +4 -0
- package/dist/plugins/sql-escape.d.ts +8 -0
- package/dist/plugins/sql-escape.js +8 -0
- package/dist/plugins/sql-row-helpers.d.ts +25 -0
- package/dist/plugins/sql-row-helpers.js +25 -0
- package/dist/plugins/store-backend.d.ts +103 -0
- package/dist/plugins/store-backend.js +120 -27
- package/dist/plugins/store-contracts.d.ts +62 -0
- package/dist/plugins/store-contracts.js +3 -0
- package/dist/plugins/task-attachment-store.d.ts +60 -0
- package/dist/plugins/task-attachment-store.js +49 -3
- package/dist/plugins/task-list-store-sql.d.ts +25 -0
- package/dist/plugins/task-list-store-sql.js +21 -0
- package/dist/plugins/tidb-approval-store.d.ts +6 -0
- package/dist/plugins/tidb-approval-store.js +6 -0
- package/dist/plugins/tidb-breaker-state.d.ts +5 -0
- package/dist/plugins/tidb-breaker-state.js +5 -0
- package/dist/plugins/tidb-checkpoint-store.d.ts +7 -0
- package/dist/plugins/tidb-checkpoint-store.js +7 -0
- package/dist/plugins/tidb-cost-quota.d.ts +6 -0
- package/dist/plugins/tidb-cost-quota.js +1 -0
- package/dist/plugins/tidb-file-snapshot-store.d.ts +6 -0
- package/dist/plugins/tidb-file-snapshot-store.js +6 -0
- package/dist/plugins/tidb-image-bake.d.ts +8 -0
- package/dist/plugins/tidb-image-bake.js +8 -0
- package/dist/plugins/tidb-image-index.d.ts +8 -0
- package/dist/plugins/tidb-image-index.js +8 -0
- package/dist/plugins/tidb-outcome-ledger.d.ts +10 -0
- package/dist/plugins/tidb-outcome-ledger.js +10 -0
- package/dist/plugins/tidb-pool.d.ts +56 -0
- package/dist/plugins/tidb-pool.js +181 -1
- package/dist/plugins/tidb-rate-limiter.d.ts +11 -0
- package/dist/plugins/tidb-rate-limiter.js +5 -2
- package/dist/plugins/tidb-resume-anchor-store.d.ts +5 -0
- package/dist/plugins/tidb-resume-anchor-store.js +5 -0
- package/dist/plugins/tidb-run-store.d.ts +7 -0
- package/dist/plugins/tidb-run-store.js +7 -0
- package/dist/plugins/tidb-session-policy-store.d.ts +5 -0
- package/dist/plugins/tidb-session-policy-store.js +5 -0
- package/dist/plugins/tidb-session-storage.d.ts +43 -0
- package/dist/plugins/tidb-session-storage.js +62 -3
- package/dist/plugins/tidb-session-store.d.ts +142 -0
- package/dist/plugins/tidb-session-store.js +264 -16
- package/dist/plugins/tidb-tool-result-store.d.ts +5 -0
- package/dist/plugins/tidb-tool-result-store.js +7 -0
- package/dist/plugins/tidb-workflow-journal-store.d.ts +7 -0
- package/dist/plugins/tidb-workflow-journal-store.js +7 -0
- package/dist/plugins/tidb-workflow-run-store.d.ts +8 -0
- package/dist/plugins/tidb-workflow-run-store.js +8 -0
- package/dist/plugins/tool-result-store-sql.d.ts +58 -0
- package/dist/plugins/tool-result-store-sql.js +38 -2
- package/dist/plugins/web-search.d.ts +35 -0
- package/dist/plugins/web-search.js +45 -9
- package/dist/plugins/workflow-journal-limits.d.ts +10 -0
- package/dist/plugins/workflow-journal-limits.js +10 -0
- package/dist/plugins/workflow-journal-store-sql.d.ts +78 -0
- package/dist/plugins/workflow-journal-store-sql.js +59 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +84 -0
- package/dist/plugins/workflow-run-store-sql.js +84 -6
- package/dist/plugins/worktree-isolation.d.ts +45 -0
- package/dist/plugins/worktree-isolation.js +105 -6
- package/dist/plugins/write-behind-counter.d.ts +56 -1
- package/dist/plugins/write-behind-counter.js +53 -14
- package/dist/principal-jwt.d.ts +24 -0
- package/dist/principal-jwt.js +60 -5
- package/dist/project-memory.d.ts +22 -0
- package/dist/project-memory.js +144 -15
- package/dist/prompts-domain-validate.d.ts +28 -0
- package/dist/prompts-domain-validate.js +42 -1
- package/dist/question.d.ts +33 -0
- package/dist/question.js +69 -2
- package/dist/resource-suspend.d.ts +21 -0
- package/dist/resource-suspend.js +16 -0
- package/dist/router/route-orchestration.d.ts +78 -0
- package/dist/router/route-orchestration.js +77 -0
- package/dist/run-local.d.ts +32 -0
- package/dist/run-local.js +172 -8
- package/dist/runs.d.ts +189 -4
- package/dist/runs.js +465 -24
- package/dist/runtime-caps-resolver.d.ts +106 -0
- package/dist/runtime-caps-resolver.js +89 -4
- package/dist/runtime-governance.d.ts +84 -0
- package/dist/runtime-governance.js +127 -1
- package/dist/sandbox-pkg-source.d.ts +23 -0
- package/dist/sandbox-pkg-source.js +37 -0
- package/dist/sealed-key.d.ts +54 -0
- package/dist/sealed-key.js +68 -3
- package/dist/security.d.ts +108 -0
- package/dist/security.js +145 -6
- package/dist/sema-registry.d.ts +21 -0
- package/dist/sema-registry.js +21 -0
- package/dist/session-leaf-bus.d.ts +31 -0
- package/dist/session-leaf-bus.js +32 -0
- package/dist/session-sync-content.d.ts +46 -0
- package/dist/session-sync-content.js +47 -1
- package/dist/session-sync-kernel.d.ts +89 -0
- package/dist/session-sync-kernel.js +48 -3
- package/dist/session-sync.d.ts +125 -0
- package/dist/session-sync.js +181 -8
- package/dist/session-titler.d.ts +26 -0
- package/dist/session-titler.js +41 -7
- package/dist/session-watch.d.ts +53 -1
- package/dist/session-watch.js +73 -9
- package/dist/sighup-idle.d.ts +30 -0
- package/dist/sighup-idle.js +12 -1
- package/dist/spec-fields.d.ts +91 -3
- package/dist/spec-fields.js +116 -4
- package/dist/task-cwd.d.ts +50 -0
- package/dist/task-cwd.js +68 -1
- package/dist/task-mcp.d.ts +47 -0
- package/dist/task-mcp.js +29 -0
- package/dist/task-settings.d.ts +175 -0
- package/dist/task-settings.js +226 -11
- package/dist/task-workflow.d.ts +67 -0
- package/dist/task-workflow.js +75 -8
- package/dist/tool-approval.d.ts +91 -0
- package/dist/tool-approval.js +215 -0
- package/dist/trace/artifacts.d.ts +9 -0
- package/dist/trace/artifacts.js +30 -5
- package/dist/trace/core-keyset-guard.d.ts +18 -0
- package/dist/trace/ledger-sink.d.ts +43 -0
- package/dist/trace/ledger-sink.js +64 -5
- package/dist/trace/project.d.ts +133 -0
- package/dist/trace/project.js +189 -2
- package/dist/trace/redact.d.ts +19 -0
- package/dist/trace/redact.js +66 -9
- package/dist/usage-analytics.d.ts +26 -0
- package/dist/usage-analytics.js +26 -3
- package/package.json +1 -1
|
@@ -4,6 +4,17 @@ import { toIso } from "./sql-row-helpers.js";
|
|
|
4
4
|
function isDupKey(err) {
|
|
5
5
|
return Boolean(err) && err.code === "ER_DUP_ENTRY";
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* TiDB-backed {@link BaseSessionStorage} — the durable L1 event log for one session.
|
|
9
|
+
*
|
|
10
|
+
* - `appendEntry` / `setLeafId` persist with an **atomic compare-and-set** on `leaf_seq` + `leaf_id`
|
|
11
|
+
* (core's F2 optimistic-lock seam): a write only lands if the branch leaf is still what the entry
|
|
12
|
+
* was built against. Two stateless runners that both woke the same session can't silently fork —
|
|
13
|
+
* the loser gets `SessionError("conflict")` (catch with `isSessionConflict`).
|
|
14
|
+
* - The in-memory base tree is the wake-time snapshot; every write is also mirrored into it so the
|
|
15
|
+
* live harness keeps reading a consistent view. Wake is **bounded** to `[floor .. leaf]` (F3,
|
|
16
|
+
* core 1.6.0 branch-floor seam); older history is covered by the last compaction's summary.
|
|
17
|
+
*/
|
|
7
18
|
export class TiDBSessionStorage extends BaseSessionStorage {
|
|
8
19
|
pool;
|
|
9
20
|
sessionId;
|
|
@@ -16,14 +27,29 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
16
27
|
this.leafSeq = leafSeq;
|
|
17
28
|
this.floorSeq = floorSeq;
|
|
18
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* [976] S3 RB-14 pull seam — `SessionStorage.getEpochAnchor?()`: the nearest epoch carrier BELOW the
|
|
32
|
+
* bounded-wake floor. core's `Session.getPromptEpoch()` (≥1.305) calls this only when the in-window
|
|
33
|
+
* branch walk finds no carrier — i.e. a rewind/resumeAt cut inside the kept tail, where the compaction
|
|
34
|
+
* restatement is a DESCENDANT of the cut and the root pin sits under the floor. Semantics per core's
|
|
35
|
+
* ruling: highest-seq valid carrier below the floor (not an ancestor-chain walk — fallback of last
|
|
36
|
+
* resort); malformed rows are skipped (#13: fall back to the older valid pin — the write gate refuses
|
|
37
|
+
* malformed carriers, so these only exist via out-of-band writes); none ⇒ undefined = a genuine
|
|
38
|
+
* pre-epoch session (core mints legacy_migration, the correct meaning). core re-normalizes whatever we
|
|
39
|
+
* return, so this stays honest even if the two sides ever disagree on strictness.
|
|
40
|
+
*/
|
|
19
41
|
async getEpochAnchor() {
|
|
20
42
|
if (this.floorSeq <= 0)
|
|
21
|
-
return undefined;
|
|
43
|
+
return undefined; // full load — the walk already reaches the root pin
|
|
44
|
+
// Keyset-paged scan to EXHAUSTION (codex HIGH): a long-lived session upgraded across the epoch
|
|
45
|
+
// release carries 100+ pre-epoch compactions with NO restatement between the floor and the older
|
|
46
|
+
// valid pin — a bounded LIMIT would run dry on them and return undefined, which here specifically
|
|
47
|
+
// means "genuinely pre-epoch" and would let the caller mint a migration epoch over a durable anchor.
|
|
22
48
|
let cursor = this.floorSeq;
|
|
23
49
|
for (;;) {
|
|
24
50
|
const [rows] = await this.pool.query("SELECT seq, payload FROM session_event WHERE session_id = ? AND seq < ? AND type IN ('prompt_epoch','compaction') ORDER BY seq DESC LIMIT 100", [this.sessionId, cursor]);
|
|
25
51
|
if (rows.length === 0)
|
|
26
|
-
return undefined;
|
|
52
|
+
return undefined; // exhausted — a genuine pre-epoch session
|
|
27
53
|
for (const r of rows) {
|
|
28
54
|
const e = (typeof r.payload === "string" ? JSON.parse(r.payload) : r.payload);
|
|
29
55
|
const d = e.type === "prompt_epoch" ? normalizePromptEpoch(e) : normalizePromptEpoch(e.details?.promptEpoch);
|
|
@@ -33,7 +59,27 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
33
59
|
cursor = Number(rows[rows.length - 1].seq);
|
|
34
60
|
}
|
|
35
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Rebuild a session from its event log (= wake). Returns null if the session does not exist.
|
|
64
|
+
*
|
|
65
|
+
* F3 bounded load: only `[floor .. leaf]` is read, where floor = the last compaction's
|
|
66
|
+
* `firstKeptEntryId` (everything older is represented by that compaction's summary, so it never
|
|
67
|
+
* enters context). No compaction yet → floor=null → full load (the session is still short).
|
|
68
|
+
*
|
|
69
|
+
* This is the durable, bounded-READ equivalent of core's `boundedTail(pathEntries)` (1.42.0): that
|
|
70
|
+
* helper trims a FULL-loaded path in memory, whereas we compute the floor seq first and only `SELECT
|
|
71
|
+
* seq >= floorSeq` — so the head never leaves cold storage. Our sessions are LINEAR (no fork), so
|
|
72
|
+
* seq-order == root→leaf path-order and our `seq >= floorSeq` tail is byte-identical to
|
|
73
|
+
* `boundedTail(path).tail`; the resulting floored `BaseSessionStorage.buildContext()` matches a
|
|
74
|
+
* full-tree wake (core's `session-floor.test.ts`). If branching is ever added, switch to `boundedTail`.
|
|
75
|
+
*/
|
|
36
76
|
static async wake(pool, sessionId) {
|
|
77
|
+
// KNOWN/ACCEPTED (audit B): meta + floor + events are three queries, not one snapshot — a writer
|
|
78
|
+
// appending between them can make this wake see MORE events than the meta row described (never
|
|
79
|
+
// fewer: seq is append-only and `seq >= floorSeq` reads the tail). That's only reachable when two
|
|
80
|
+
// actors drive the same session concurrently, which the task_active session lock already
|
|
81
|
+
// serializes; the persist path then re-CASes leaf_id/leaf_seq, so a stale wake loses cleanly there. A
|
|
82
|
+
// single-snapshot read would need a repeatable-read txn per wake — not worth it for this guard rail.
|
|
37
83
|
const [metaRows] = await pool.query("SELECT created_at, leaf_id, leaf_seq FROM session_meta WHERE session_id = ?", [sessionId]);
|
|
38
84
|
const meta = metaRows[0];
|
|
39
85
|
if (!meta)
|
|
@@ -44,6 +90,7 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
44
90
|
const metadata = { id: sessionId, createdAt: toIso(meta.created_at) };
|
|
45
91
|
return new TiDBSessionStorage(pool, sessionId, metadata, entries, meta.leaf_id ?? null, Number(meta.leaf_seq), floorEntryId, floorSeq);
|
|
46
92
|
}
|
|
93
|
+
/** The bounded-window floor = last compaction's firstKeptEntryId (and its seq). */
|
|
47
94
|
static async computeFloor(pool, sessionId) {
|
|
48
95
|
const [compRows] = await pool.query("SELECT payload FROM session_event WHERE session_id = ? AND type = 'compaction' ORDER BY seq DESC LIMIT 1", [sessionId]);
|
|
49
96
|
if (!compRows[0])
|
|
@@ -53,10 +100,12 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
53
100
|
if (!fk)
|
|
54
101
|
return { floorEntryId: null, floorSeq: 0 };
|
|
55
102
|
const [seqRows] = await pool.query("SELECT seq FROM session_event WHERE session_id = ? AND entry_id = ?", [sessionId, fk]);
|
|
103
|
+
// firstKeptEntryId missing from the log (shouldn't happen) → degrade to full load.
|
|
56
104
|
if (!seqRows[0])
|
|
57
105
|
return { floorEntryId: null, floorSeq: 0 };
|
|
58
106
|
return { floorEntryId: fk, floorSeq: Number(seqRows[0].seq) };
|
|
59
107
|
}
|
|
108
|
+
/** Sub-floor lookups (e.g. a label target) aren't in the loaded tail — fall back to the durable log. */
|
|
60
109
|
async getEntry(id) {
|
|
61
110
|
const inMem = await super.getEntry(id);
|
|
62
111
|
if (inMem)
|
|
@@ -72,10 +121,16 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
72
121
|
this.recordEntry(entry);
|
|
73
122
|
}
|
|
74
123
|
async setLeafId(leafId, opts) {
|
|
124
|
+
// A leaf move is itself a persisted `leaf` entry whose parent is the current leaf.
|
|
75
125
|
const leafEntry = this.createLeafEntry(leafId);
|
|
76
126
|
await this.persist(leafEntry, opts);
|
|
77
127
|
this.recordEntry(leafEntry);
|
|
78
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Atomically: CAS the meta leaf (+bump leaf_seq), then append the event at the new seq.
|
|
131
|
+
* The `(session_id, seq)` primary key is the backstop — a racing writer that grabbed the same
|
|
132
|
+
* seq makes our INSERT fail with a duplicate-key, which we translate to a conflict too.
|
|
133
|
+
*/
|
|
79
134
|
async persist(entry, opts) {
|
|
80
135
|
const newLeaf = leafIdAfterEntry(entry);
|
|
81
136
|
const conditional = opts !== undefined && opts.expectedLeafId !== undefined;
|
|
@@ -92,17 +147,21 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
92
147
|
}
|
|
93
148
|
const [seqRows] = await conn.query("SELECT leaf_seq, owner FROM session_meta WHERE session_id = ?", [this.sessionId]);
|
|
94
149
|
const seq = Number(seqRows[0].leaf_seq);
|
|
150
|
+
// codex-2(S2 批):S2 发射的 owner 必须取**本事务当前行**——wake 快照在「wake 后被 delete+reclaim」
|
|
151
|
+
// 窗口里是陈旧 A,而旧 A 条目仍在=假匹配,新租户 leaf 泄进旧流。事务内同 SELECT 捎带=commit 时刻
|
|
152
|
+
// 真 owner,零额外查询;reclaim 后=B ⇒ notifyLocal 对 A 条目 drop(围栏真闭合)。
|
|
95
153
|
const commitOwner = seqRows[0].owner ?? null;
|
|
96
154
|
await conn.query("INSERT INTO session_event (session_id, seq, entry_id, parent_id, type, payload, ts) VALUES (?,?,?,?,?,?,?)", [this.sessionId, seq, entry.id, entry.parentId ?? null, entry.type, JSON.stringify(entry), new Date(entry.timestamp)]);
|
|
97
155
|
await conn.commit();
|
|
98
156
|
this.leafSeq = seq;
|
|
99
|
-
emitLeafAdvance(this.sessionId, newLeaf, commitOwner, seq);
|
|
157
|
+
emitLeafAdvance(this.sessionId, newLeaf, commitOwner, seq); // S2 fast path — post-commit only, fire-and-forget (session-leaf-bus 契约)
|
|
100
158
|
}
|
|
101
159
|
catch (err) {
|
|
102
160
|
try {
|
|
103
161
|
await conn.rollback();
|
|
104
162
|
}
|
|
105
163
|
catch {
|
|
164
|
+
/* ignore rollback error */
|
|
106
165
|
}
|
|
107
166
|
if (err instanceof SessionError)
|
|
108
167
|
throw err;
|
|
@@ -1,24 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TiDB-backed Session event-log center (L1) — the durable "persistence center".
|
|
3
|
+
*
|
|
4
|
+
* Implements core's `SessionStore`. `acquire` rebuilds a session from its append-only event log
|
|
5
|
+
* (= wake/resume), so any stateless runner instance can continue it. Cross-instance write safety is
|
|
6
|
+
* enforced by the storage layer's compare-and-set (core's F2 seam); crash consistency (orphan
|
|
7
|
+
* tool-call after a mid-turn crash) is handled by the Runner calling `reconcileInterruptedSession`
|
|
8
|
+
* on acquire (core's F1).
|
|
9
|
+
*
|
|
10
|
+
* Persistence only. **Tenant authorization (who may wake which session) lives in the service layer**
|
|
11
|
+
* (`src/security.ts`), which uses `ownerOf` / `register` below. The store does not infer identity.
|
|
12
|
+
*/
|
|
1
13
|
import { type AcquiredSession, type SessionStore, type SessionTreeEntry } from "@sema-agent/core";
|
|
2
14
|
import type { Pool } from "mysql2/promise";
|
|
3
15
|
import type { SessionSummary } from "./store-contracts.js";
|
|
4
16
|
import { type StagingHandle } from "../session-sync-kernel.js";
|
|
5
17
|
export declare class TiDBSessionStore implements SessionStore {
|
|
6
18
|
private readonly pool;
|
|
19
|
+
/** In-flight acquisitions keyed by id, so concurrent acquire(sameId) in one process share one. */
|
|
7
20
|
private readonly pending;
|
|
8
21
|
constructor(pool: Pool);
|
|
9
22
|
acquire(sessionId?: string, opts?: {
|
|
10
23
|
requireExisting?: boolean;
|
|
11
24
|
}): Promise<AcquiredSession>;
|
|
12
25
|
private load;
|
|
26
|
+
/** Idempotently create a session_meta row with an owner. Existing owner is never overwritten. */
|
|
13
27
|
register(sessionId: string, owner: string | null): Promise<void>;
|
|
28
|
+
/** Owner principal of a session, `null` if registered ownerless, `undefined` if no such session. */
|
|
14
29
|
ownerOf(sessionId: string): Promise<string | null | undefined>;
|
|
15
30
|
touch(sessionId: string): Promise<void>;
|
|
31
|
+
/** E18 — the session's current leaf `SessionTreeEntry.id` (`session_meta.leaf_id`, set transactionally on every
|
|
32
|
+
* persist). A single SELECT, NO acquire/lock/CAS — safe to call mid-run (write-safety is the append-time CAS, not
|
|
33
|
+
* an acquire lease) and cache-bypassing (the resume-at turn-capture reads it without touching the warm session).
|
|
34
|
+
* Returns the leaf id, or null when the session has none / no such session. */
|
|
16
35
|
getLeafId(sessionId: string): Promise<string | null>;
|
|
36
|
+
/** [1196] 六轮复审:owner+leafId **单行原子快照**(SSE watch 探针的租户围栏读)——两独立 SELECT 在
|
|
37
|
+
* delete/reclaim 缝里可拼出「旧 owner+新 leaf」混世代组合;单 SELECT 单行=天然一致。undefined=无此会话。 */
|
|
17
38
|
getHead(sessionId: string): Promise<{
|
|
18
39
|
owner: string | null;
|
|
19
40
|
leafId: string | null;
|
|
20
41
|
} | undefined>;
|
|
42
|
+
/** Durable history is retained; just drop any in-flight cache entry. */
|
|
21
43
|
release(sessionId: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* E16 — list the caller's sessions (CC /resume picker), keyset-paginated newest-first by last activity.
|
|
46
|
+
* Session IDENTITY/enumeration comes from `session_meta` (owner-filtered on the service's OWN owner column);
|
|
47
|
+
* a LEFT JOIN onto the `task_run` runs ledger supplies run-level PREVIEW (latest run's objective/status,
|
|
48
|
+
* run count) but never gates which sessions exist — a session with zero runs still lists (preview null/0).
|
|
49
|
+
* Keyset on `(updated_at, session_id)`; `updated_at` is the session's last-activity marker (touch on every
|
|
50
|
+
* run/append). The shipped {@link SessionSummary} shape is preserved (additive): `lastActivityAt` =
|
|
51
|
+
* `session_meta.updated_at`, `firstActivityAt` = `session_meta.created_at`.
|
|
52
|
+
*/
|
|
22
53
|
listSessions(opts: {
|
|
23
54
|
owner?: string;
|
|
24
55
|
cursor?: {
|
|
@@ -28,21 +59,132 @@ export declare class TiDBSessionStore implements SessionStore {
|
|
|
28
59
|
limit: number;
|
|
29
60
|
q?: string;
|
|
30
61
|
}): Promise<SessionSummary[]>;
|
|
62
|
+
/** Cheap pre-LLM probe: "none" = session_meta row not yet REGISTERED (createRun fires
|
|
63
|
+
* before the Runner's session acquire — the titler retries), "untitled" / "titled" as read. */
|
|
31
64
|
probeTitle(sessionId: string): Promise<"none" | "untitled" | "titled">;
|
|
65
|
+
/** Write-once auto-title: lands ONLY when title IS NULL (a concurrent/prior title wins;
|
|
66
|
+
* the user-facing rename layer is BFF-side). Returns whether this call set it. */
|
|
32
67
|
setTitleIfNull(sessionId: string, title: string): Promise<boolean>;
|
|
68
|
+
/**
|
|
69
|
+
* E17 — fork a session: copy its WHOLE durable history to a NEW uuidv7 session owned by `owner`, mirroring
|
|
70
|
+
* core's `PgSessionRepo.fork`. Entry ids / parent links are per-session and copy VERBATIM; only `seq` is
|
|
71
|
+
* re-densified from 0 in the new session. The new leaf = the source leaf (session_meta.leaf_id).
|
|
72
|
+
* Returns the new sessionId, or null if the source does not exist (the route maps that to 404).
|
|
73
|
+
*
|
|
74
|
+
* 🔴 FULL history, NOT `wake().getEntries()` (adversarial-review MEDIUM): `wake` loads only the bounded tail
|
|
75
|
+
* `[floor..leaf]` from the latest compaction floor (F3), so forking via it would copy only the active tail of a
|
|
76
|
+
* COMPACTED session and SILENTLY LOSE all pre-compaction history (contradicting the whole-history-copy intent).
|
|
77
|
+
* We instead SELECT the entire `session_event` log ordered by seq — every durable entry, compaction floor
|
|
78
|
+
* bypassed — and re-seq it dense from 0 into the new session, ids/parents/payload byte-verbatim.
|
|
79
|
+
*/
|
|
33
80
|
fork(sourceId: string, owner: string | null): Promise<string | null>;
|
|
81
|
+
/**
|
|
82
|
+
* 2c session-sync — EXPORT a session's full durable entry log for cross-backend migration. This is the
|
|
83
|
+
* READ half of {@link fork}, surfaced as the core `SessionRepo.exportEntries` seam: the WHOLE `session_event` log,
|
|
84
|
+
* oldest-first, ids/parents/payload/ts VERBATIM, with the compaction floor BYPASSED (NOT `wake().getEntries()`,
|
|
85
|
+
* which returns only the bounded `[floor..leaf]` tail and would silently truncate pre-floor history — see fork's
|
|
86
|
+
* note at :149-152). Returns `null` if the source does not exist (no `session_meta` row), mirroring fork's null
|
|
87
|
+
* semantics; an existing-but-empty session returns `[]`. The owner is NOT exported — import re-stamps it (§9).
|
|
88
|
+
*/
|
|
34
89
|
exportEntries(sessionId: string): Promise<SessionTreeEntry[] | null>;
|
|
90
|
+
/**
|
|
91
|
+
* 2c session-sync P1d-α (PULL streaming) — the IDS-ONLY projection of {@link exportEntries}: the entry ids of the
|
|
92
|
+
* WHOLE durable log, oldest-first (`SELECT entry_id … ORDER BY seq ASC`), with no payloads. Small even for a huge
|
|
93
|
+
* session, so the PULL `GET /sync/manifest` can carry it (and feed it to `classifySyncRelationshipByIds`) instead of
|
|
94
|
+
* the entries. Returns `null` if the source does not exist (no `session_meta` row), mirroring {@link exportEntries}.
|
|
95
|
+
*/
|
|
35
96
|
listEntryIds(sessionId: string): Promise<string[] | null>;
|
|
97
|
+
/**
|
|
98
|
+
* 2c session-sync P1d-α (PULL streaming) — STREAM the WHOLE durable log (compaction floor bypassed), oldest-first,
|
|
99
|
+
* as an async generator that KEYSET-PAGES the `session_event` table: mysql2 buffers a plain SELECT, so a 1M-row
|
|
100
|
+
* session would OOM if read in one shot. Instead the generator loops `… WHERE seq > cursor ORDER BY seq ASC LIMIT K`
|
|
101
|
+
* (K = `opts.batchSize ?? 500`), advancing the cursor to the last `seq` of each batch, until a SHORT page (fewer than
|
|
102
|
+
* K rows) ends the stream. Each batch is its OWN `pool.query` (a pooled connection acquired + released per batch), so
|
|
103
|
+
* a slow NDJSON consumer can NEVER pin one connection across the whole stream (the clay-mandated concurrency
|
|
104
|
+
* discipline). Start cursor = `opts.afterSeq ?? -1` (seq is 0-based dense, so `> -1` = from seq 0).
|
|
105
|
+
*
|
|
106
|
+
* Resolves to `null` (NOT an empty async-iterable) when the session does not exist — checked via `session_meta`
|
|
107
|
+
* EAGERLY here (before returning the iterable), exactly like {@link exportEntries}, so a missing session is distinct
|
|
108
|
+
* from a real-but-empty one (an empty stream). payload is parsed like {@link exportEntries} (string → JSON.parse,
|
|
109
|
+
* object passthrough). The check is eager (the method is async) because a generator body is lazy — it can't decide
|
|
110
|
+
* `null` vs. iterable on its own first pull.
|
|
111
|
+
*/
|
|
36
112
|
exportEntriesStream(sessionId: string, opts?: {
|
|
37
113
|
afterSeq?: number;
|
|
38
114
|
batchSize?: number;
|
|
39
115
|
}): Promise<AsyncIterable<SessionTreeEntry> | null>;
|
|
116
|
+
/**
|
|
117
|
+
* 2c session-sync — IMPORT a verbatim entry log (from another backend's {@link exportEntries}) into a
|
|
118
|
+
* (typically NEW) `sessionId`. This is the WRITE half of {@link fork}, surfaced as `SessionRepo.importEntries`,
|
|
119
|
+
* with two 2c-mandated differences from fork:
|
|
120
|
+
* (a) OWNER RE-STAMP (§9): `owner` is the AUTHENTICATED importing principal passed by the caller; the bundle's
|
|
121
|
+
* own owner is NEVER trusted (a local push is always owner=null → would become an ownerless cloud session
|
|
122
|
+
* any anonymous caller could attach to). Mirrors the fork route's server-side `scope.gateOwner`.
|
|
123
|
+
* (b) the single INVARIANT GATE is core's {@link validateEntriesForImport} (unique ids / parent-before-child /
|
|
124
|
+
* exactly-one-root / leaf-resolvable / structural refs present) — we persist its VERBATIM output and do NOT
|
|
125
|
+
* re-implement any of those checks in SQL ([[core-service-boundary]]; the same discipline fork's hand-SQL
|
|
126
|
+
* was warned about). A violation throws `SessionError("invalid_session")` and NOTHING is written.
|
|
127
|
+
* The write itself mirrors fork: re-seq dense from 0, entry_id/parent_id/payload/ts verbatim, in ONE txn with
|
|
128
|
+
* `session_meta` LAST as the commit point (a mid-import crash leaves orphan events with no meta = invisible to
|
|
129
|
+
* wake, never a half-session). The leaf is the replayed leaf (core's `leafIdAfterEntry`), matching core's import.
|
|
130
|
+
*/
|
|
40
131
|
importEntries(sessionId: string, owner: string | null, entries: SessionTreeEntry[]): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* 2c session-sync (§7/§8) — IDEMPOTENT REPLACE: purge any existing conversation log for `sessionId` then re-import
|
|
134
|
+
* `entries` verbatim under `owner`, ALL in ONE txn. Unlike {@link importEntries} (a plain INSERT that crashes on a
|
|
135
|
+
* duplicate PK when the session already exists at the destination), replace is safe to run OVER an existing session
|
|
136
|
+
* — the §7 fast-forward path and a §8 retry-to-completion both land on it. The validate gate runs FIRST (fail-closed,
|
|
137
|
+
* before any write), then DELETE events + the OWNER-GUARDED meta delete (defense-in-depth, mirrors {@link deleteSession}
|
|
138
|
+
* — a wrong-owner caller can never replace another tenant's session), then the SAME shared insert body importEntries
|
|
139
|
+
* uses (so there is ONE source of the insert logic, no copy-paste drift). session_meta is still written LAST = commit
|
|
140
|
+
* point, so a mid-replace crash (post-delete, pre-insert) leaves orphan-free state (no meta = invisible to wake).
|
|
141
|
+
*/
|
|
41
142
|
replaceEntries(sessionId: string, owner: string | null, entries: SessionTreeEntry[]): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* Shared insert half of {@link importEntries} / {@link replaceEntries} (ONE source of the insert logic, no drift):
|
|
145
|
+
* write the validated entries re-seq dense from 0 (entry_id/parent_id/type/ts verbatim), THEN session_meta LAST as
|
|
146
|
+
* the commit point. Runs inside the caller's open transaction (`conn`) so the caller owns begin/commit/rollback.
|
|
147
|
+
* `validated` is the OUTPUT of {@link validateEntriesForImport} (the caller runs the gate before opening the txn).
|
|
148
|
+
*/
|
|
42
149
|
private insertValidatedLog;
|
|
150
|
+
/**
|
|
151
|
+
* 2c session-sync P1d-β (PUSH streaming, §15) — begin a STAGED import into `realSessionId` under the shadow id
|
|
152
|
+
* `${realSessionId}#stg-${token}`. The route mints the uuidv7 `token` (the store never calls uuidv7/Date.now itself
|
|
153
|
+
* → the staging id is deterministic + the route owns the lease key). Returns a {@link TiDBStagingHandle} the route
|
|
154
|
+
* streams entry batches into ({@link StagingHandle.appendBatch}) then commits ({@link StagingHandle.commit}, the
|
|
155
|
+
* atomic swap) or aborts. No row is touched here — the handle is a stateless cursor over this pool.
|
|
156
|
+
*/
|
|
43
157
|
beginImportStaging(realSessionId: string, token: string): StagingHandle;
|
|
158
|
+
/**
|
|
159
|
+
* 2c session-sync P1d-β (staged-row inspection) — read the rows STAGED under `stagingId` (NO session_meta probe — a
|
|
160
|
+
* staging id has no meta row by construction, so {@link exportEntries} would return null), oldest-first. The Phase-B
|
|
161
|
+
* import gate is now the per-line {@link StreamingImportValidator} (core 1.143.0) run during the stream, so this
|
|
162
|
+
* is no longer the validation path; it remains the staged-row inspection seam (tests/diagnostics). Returns `[]` for an
|
|
163
|
+
* empty/unknown staging id.
|
|
164
|
+
*/
|
|
44
165
|
readStagedEntries(stagingId: string): Promise<SessionTreeEntry[]>;
|
|
166
|
+
/**
|
|
167
|
+
* 2c session-sync P1d-β (§4) — reaper for ABANDONED staging sessions: DELETE session_event rows under a staging id
|
|
168
|
+
* (`session_id LIKE '%#stg-%'`) that has NO session_meta (never committed → invisible orphans) AND whose OLDEST
|
|
169
|
+
* staged row is older than the grace window (an IN-FLIGHT stream keeps appending fresh `ts` rows → its MIN(ts) is
|
|
170
|
+
* recent → it is NOT reaped, exactly like sweepOrphanBlobs' created_at grace). Per-staging-id, so a slow but live
|
|
171
|
+
* stream is never reaped while another abandoned one is. Returns the affected row count. Driven by main.ts's reaper.
|
|
172
|
+
*/
|
|
45
173
|
sweepStagingSessions(): Promise<number>;
|
|
174
|
+
/**
|
|
175
|
+
* E21 — purge a session's CONVERSATION HISTORY (session_meta + session_event). Idempotent: a missing
|
|
176
|
+
* session is a no-op (returns false). The service's OWN run-ledger / checkpoint / tool-result rows are
|
|
177
|
+
* purged separately by the route's `purgeSession` coordinator — this method owns only the session
|
|
178
|
+
* abstraction's tables (the `SessionRepo.delete` half).
|
|
179
|
+
*
|
|
180
|
+
* `owner` is the single-DB-fleet null-safe SQL owner guard on `session_meta.owner` (defense-in-depth — the
|
|
181
|
+
* route already owner-gates; `<=>` so a legacy null-owner session matches owner=null). session_event carries
|
|
182
|
+
* no owner column, so its purge is GATED on the owner-matched meta delete: if the meta DELETE matched 0 rows
|
|
183
|
+
* (wrong owner / already gone) we skip the event delete — so a wrong-owner caller can never strand-delete
|
|
184
|
+
* another tenant's events. Meta is deleted FIRST (mirrors core BUG-2: once it's gone, wake is `null`
|
|
185
|
+
* regardless of leftover events; if a crash interleaves, orphan events with NO meta are invisible, never a
|
|
186
|
+
* half-session), and the event purge only runs after that owner-matched commit point.
|
|
187
|
+
*/
|
|
46
188
|
deleteSession(sessionId: string, owner: string | null): Promise<boolean>;
|
|
47
189
|
get size(): number;
|
|
48
190
|
dispose(): void;
|