@stigmer/runner 3.15.0 → 3.15.2-dev.20260913223433
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/README.md +2 -4
- package/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/execution-record-fixture.d.ts +14 -0
- package/dist/__test-utils__/execution-record-fixture.js +4 -0
- package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
- package/dist/__test-utils__/file-review-projection.d.ts +40 -0
- package/dist/__test-utils__/file-review-projection.js +136 -0
- package/dist/__test-utils__/file-review-projection.js.map +1 -0
- package/dist/__test-utils__/harness-contract/types.d.ts +23 -1
- package/dist/__test-utils__/harness-contract/types.js +15 -0
- package/dist/__test-utils__/harness-contract/types.js.map +1 -1
- package/dist/__test-utils__/hermetic-activity.d.ts +44 -12
- package/dist/__test-utils__/hermetic-activity.js +52 -14
- package/dist/__test-utils__/hermetic-activity.js.map +1 -1
- package/dist/__test-utils__/model-registry-fixture.d.ts +32 -7
- package/dist/__test-utils__/model-registry-fixture.js +31 -7
- package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
- package/dist/__test-utils__/turn-input-fixture.d.ts +1 -1
- package/dist/__test-utils__/turn-input-fixture.js +1 -1
- package/dist/__test-utils__/turn-input-fixture.js.map +1 -1
- package/dist/activities/call-agent.js +2 -2
- package/dist/activities/call-agent.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +45 -3
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +0 -9
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +2 -41
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +7 -5
- package/dist/activities/execute-cursor/adapter.js +7 -5
- package/dist/activities/execute-cursor/adapter.js.map +1 -1
- package/dist/activities/execute-cursor/approval-policy.d.ts +5 -2
- package/dist/activities/execute-cursor/approval-policy.js +5 -2
- package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +16 -8
- package/dist/activities/execute-cursor/approval-state.js +6 -3
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/cas-observations.d.ts +14 -2
- package/dist/activities/execute-cursor/cas-observations.js +19 -2
- package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
- package/dist/activities/execute-cursor/cursor-capabilities.d.ts +8 -4
- package/dist/activities/execute-cursor/cursor-capabilities.js +21 -4
- package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -1
- package/dist/activities/execute-cursor/message-translator.d.ts +12 -20
- package/dist/activities/execute-cursor/message-translator.js +19 -32
- package/dist/activities/execute-cursor/message-translator.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +48 -58
- package/dist/activities/execute-cursor/prompt-builder.js +76 -95
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/turn-boundary.d.ts +27 -55
- package/dist/activities/execute-cursor/turn-boundary.js +30 -90
- package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
- package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
- package/dist/activities/execute-cursor/turn-settle.js +37 -49
- package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
- package/dist/activities/execute-cursor/turn-setup.d.ts +16 -24
- package/dist/activities/execute-cursor/turn-setup.js +29 -59
- package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
- package/dist/activities/execute-cursor/turn-stream.d.ts +3 -8
- package/dist/activities/execute-cursor/turn-stream.js +9 -22
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/turn.js +5 -1
- package/dist/activities/execute-cursor/turn.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +93 -0
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +348 -0
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +170 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +225 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.d.ts +24 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +41 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +54 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +72 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +187 -23
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +238 -27
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
- package/dist/activities/execute-deep-agent/adapter.d.ts +41 -0
- package/dist/activities/execute-deep-agent/adapter.js +78 -0
- package/dist/activities/execute-deep-agent/adapter.js.map +1 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +8 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.js +9 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -1
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +31 -0
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +40 -0
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.js.map +1 -0
- package/dist/activities/execute-deep-agent/execution-state.d.ts +4 -11
- package/dist/activities/execute-deep-agent/execution-state.js +4 -12
- package/dist/activities/execute-deep-agent/execution-state.js.map +1 -1
- package/dist/activities/execute-deep-agent/hitl.d.ts +49 -47
- package/dist/activities/execute-deep-agent/hitl.js +77 -103
- package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
- package/dist/activities/execute-deep-agent/prompt-builder.d.ts +51 -23
- package/dist/activities/execute-deep-agent/prompt-builder.js +115 -76
- package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +18 -32
- package/dist/activities/execute-deep-agent/status-builder-shared.js +10 -65
- package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
- package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +10 -8
- package/dist/activities/execute-deep-agent/streaming-side-effects.js +12 -14
- package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +36 -13
- package/dist/activities/execute-deep-agent/subagent-tracker.js +76 -39
- package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -28
- package/dist/activities/execute-deep-agent/subagent-transformer.js +29 -82
- package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +3 -2
- package/dist/activities/execute-deep-agent/subagent-wiring.js +2 -2
- package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn-settle.d.ts +42 -0
- package/dist/activities/execute-deep-agent/turn-settle.js +146 -0
- package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn-setup.d.ts +212 -0
- package/dist/activities/execute-deep-agent/turn-setup.js +430 -0
- package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn-stream.d.ts +97 -0
- package/dist/activities/execute-deep-agent/turn-stream.js +242 -0
- package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn.d.ts +42 -0
- package/dist/activities/execute-deep-agent/turn.js +116 -0
- package/dist/activities/execute-deep-agent/turn.js.map +1 -0
- package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +6 -5
- package/dist/activities/execute-deep-agent/v3-event-recorder.js +6 -5
- package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -1
- package/dist/activities/execute-deep-agent/v3-events.d.ts +1 -1
- package/dist/activities/execute-deep-agent/v3-events.js +1 -1
- package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +60 -17
- package/dist/activities/execute-deep-agent/v3-status-builder.js +72 -57
- package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
- package/dist/harness/approval-decisions.d.ts +61 -0
- package/dist/harness/approval-decisions.js +102 -0
- package/dist/harness/approval-decisions.js.map +1 -0
- package/dist/harness/capabilities.d.ts +16 -5
- package/dist/harness/capabilities.js +9 -0
- package/dist/harness/capabilities.js.map +1 -1
- package/dist/harness/capture.d.ts +144 -0
- package/dist/harness/capture.js +219 -0
- package/dist/harness/capture.js.map +1 -0
- package/dist/harness/persist-chokepoint.d.ts +19 -4
- package/dist/harness/persist-chokepoint.js +17 -4
- package/dist/harness/persist-chokepoint.js.map +1 -1
- package/dist/harness/run-turn.js +115 -29
- package/dist/harness/run-turn.js.map +1 -1
- package/dist/harness/terminal-table.d.ts +40 -11
- package/dist/harness/terminal-table.js +58 -19
- package/dist/harness/terminal-table.js.map +1 -1
- package/dist/harness/turn-context.d.ts +141 -76
- package/dist/harness/turn-context.js +194 -99
- package/dist/harness/turn-context.js.map +1 -1
- package/dist/harness/types.d.ts +65 -12
- package/dist/harness/types.js +8 -2
- package/dist/harness/types.js.map +1 -1
- package/dist/harness-adapters.d.ts +12 -8
- package/dist/harness-adapters.js +17 -9
- package/dist/harness-adapters.js.map +1 -1
- package/dist/middleware/approval-gate.d.ts +1 -1
- package/dist/middleware/approval-gate.js +1 -1
- package/dist/middleware/approval-gate.js.map +1 -1
- package/dist/middleware/cost-advisory.d.ts +39 -0
- package/dist/middleware/{cost-cap.js → cost-advisory.js} +37 -55
- package/dist/middleware/cost-advisory.js.map +1 -0
- package/dist/middleware/index.d.ts +23 -12
- package/dist/middleware/index.js +26 -18
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/types.d.ts +3 -2
- package/dist/runner-manager.js +1 -5
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.js +1 -5
- package/dist/runner.js.map +1 -1
- package/dist/shared/attachment-resolver.d.ts +41 -18
- package/dist/shared/attachment-resolver.js +178 -46
- package/dist/shared/attachment-resolver.js.map +1 -1
- package/dist/shared/attachment-zip.d.ts +85 -0
- package/dist/shared/attachment-zip.js +185 -0
- package/dist/shared/attachment-zip.js.map +1 -0
- package/dist/shared/connect-backfill.js +5 -4
- package/dist/shared/connect-backfill.js.map +1 -1
- package/dist/shared/cost-guard.d.ts +3 -3
- package/dist/shared/cost-guard.js +3 -3
- package/dist/shared/execution-status-writer.d.ts +5 -5
- package/dist/shared/execution-status-writer.js +5 -5
- package/dist/shared/extract-structured-output.d.ts +8 -7
- package/dist/shared/extract-structured-output.js +8 -7
- package/dist/shared/extract-structured-output.js.map +1 -1
- package/dist/shared/filereview/cas-progress.d.ts +1 -18
- package/dist/shared/filereview/cas-progress.js +4 -0
- package/dist/shared/filereview/cas-progress.js.map +1 -1
- package/dist/shared/filereview/cas-touched.d.ts +56 -0
- package/dist/shared/filereview/cas-touched.js +63 -0
- package/dist/shared/filereview/cas-touched.js.map +1 -0
- package/dist/shared/filereview/index.d.ts +2 -1
- package/dist/shared/filereview/index.js +2 -1
- package/dist/shared/filereview/index.js.map +1 -1
- package/dist/shared/mcp-resolver.d.ts +4 -5
- package/dist/shared/mcp-resolver.js +4 -5
- package/dist/shared/mcp-resolver.js.map +1 -1
- package/dist/shared/persist-decision.d.ts +3 -4
- package/dist/shared/persist-decision.js +3 -4
- package/dist/shared/persist-decision.js.map +1 -1
- package/dist/shared/plan-mode-permissions.d.ts +2 -2
- package/dist/shared/plan-mode-permissions.js +2 -2
- package/dist/shared/plan-mode-prompt.d.ts +1 -1
- package/dist/shared/plan-mode-prompt.js +1 -1
- package/dist/shared/prompt-sections.d.ts +163 -0
- package/dist/shared/prompt-sections.js +164 -0
- package/dist/shared/prompt-sections.js.map +1 -0
- package/dist/shared/skill-resolver.d.ts +4 -2
- package/dist/shared/skill-resolver.js +4 -2
- package/dist/shared/skill-resolver.js.map +1 -1
- package/dist/shared/tool-rounds.d.ts +32 -0
- package/dist/shared/tool-rounds.js +43 -0
- package/dist/shared/tool-rounds.js.map +1 -1
- package/dist/shared/tool-row.d.ts +34 -0
- package/dist/shared/tool-row.js +52 -0
- package/dist/shared/tool-row.js.map +1 -1
- package/dist/shared/workspace/session-provision.d.ts +3 -3
- package/dist/shared/workspace/session-provision.js +3 -3
- package/dist/shared/workspace/stigmer-link.d.ts +3 -3
- package/dist/shared/workspace/stigmer-link.js +3 -3
- package/dist/shared/workspace/writeback-coordinator.d.ts +15 -22
- package/dist/shared/workspace/writeback-coordinator.js +16 -53
- package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.js +1 -1
- package/package.json +4 -4
- package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +1 -0
- package/src/__test-utils__/execution-record-fixture.ts +18 -2
- package/src/__test-utils__/file-review-projection.ts +156 -0
- package/src/__test-utils__/git-workspace-fixture.ts +58 -0
- package/src/__test-utils__/harness-boot-order-child.ts +7 -2
- package/src/__test-utils__/harness-contract/contract.ts +33 -20
- package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
- package/src/__test-utils__/harness-contract/runtime-contract.ts +328 -10
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +38 -6
- package/src/__test-utils__/harness-contract/types.ts +27 -3
- package/src/__test-utils__/hermetic-activity.ts +52 -14
- package/src/__test-utils__/model-registry-fixture.ts +32 -7
- package/src/__test-utils__/module-specifiers.ts +24 -0
- package/src/__test-utils__/turn-input-fixture.ts +2 -2
- package/src/__tests__/harness-boot-order.test.ts +9 -2
- package/src/activities/call-agent.ts +2 -2
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +47 -3
- package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +2 -48
- package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +6 -1
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +52 -27
- package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +25 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.everything.prompt.md +166 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.plan-mode.prompt.md +186 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.recovery.prompt.md +191 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.reinvocation.prompt.md +13 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.prefixed.prompt.md +32 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.raw.prompt.md +1 -0
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -2
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +4 -0
- package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +24 -4
- package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +6 -5
- package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +9 -0
- package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +11 -8
- package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +229 -0
- package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +3 -3
- package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +2 -2
- package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +78 -234
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +1 -26
- package/src/activities/execute-cursor/adapter.ts +7 -5
- package/src/activities/execute-cursor/approval-policy.ts +5 -2
- package/src/activities/execute-cursor/approval-state.ts +16 -8
- package/src/activities/execute-cursor/cas-observations.ts +20 -2
- package/src/activities/execute-cursor/cursor-capabilities.ts +24 -5
- package/src/activities/execute-cursor/message-translator.ts +29 -41
- package/src/activities/execute-cursor/prompt-builder.ts +99 -157
- package/src/activities/execute-cursor/turn-boundary.ts +34 -140
- package/src/activities/execute-cursor/turn-settle.ts +37 -51
- package/src/activities/execute-cursor/turn-setup.ts +30 -70
- package/src/activities/execute-cursor/turn-stream.ts +8 -31
- package/src/activities/execute-cursor/turn.ts +5 -1
- package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +391 -0
- package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +313 -0
- package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +48 -0
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +85 -0
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +383 -36
- package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +76 -0
- package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +47 -0
- package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +80 -0
- package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -2
- package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -3
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +172 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +167 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.minimal.prompt.md +36 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +178 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +158 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +210 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +74 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +104 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +78 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +138 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +68 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +154 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +116 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +69 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +67 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/plain-turn.status.json +47 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +68 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +280 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +77 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +99 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +109 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +76 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.text-fallback.status.json +51 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tier2.status.json +51 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tool-strategy.status.json +56 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +90 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +70 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +71 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +144 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +184 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +203 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +170 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +175 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +206 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +142 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +126 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +139 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +122 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +236 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +161 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +157 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +152 -0
- package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +50 -122
- package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +8 -6
- package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +2 -2
- package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +35 -35
- package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +247 -0
- package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +329 -0
- package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +1 -20
- package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +78 -0
- package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +2 -2
- package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +57 -31
- package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +19 -79
- package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +15 -15
- package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +391 -0
- package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +343 -38
- package/src/activities/execute-deep-agent/__tests__/vision-input.test.ts +5 -5
- package/src/activities/execute-deep-agent/adapter.ts +94 -0
- package/src/activities/execute-deep-agent/cas-capture-observer.ts +11 -0
- package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +43 -0
- package/src/activities/execute-deep-agent/execution-state.ts +4 -13
- package/src/activities/execute-deep-agent/hitl.ts +100 -123
- package/src/activities/execute-deep-agent/prompt-builder.ts +141 -115
- package/src/activities/execute-deep-agent/status-builder-shared.ts +21 -84
- package/src/activities/execute-deep-agent/streaming-side-effects.ts +13 -19
- package/src/activities/execute-deep-agent/subagent-tracker.ts +77 -42
- package/src/activities/execute-deep-agent/subagent-transformer.ts +46 -105
- package/src/activities/execute-deep-agent/subagent-wiring.ts +5 -4
- package/src/activities/execute-deep-agent/turn-settle.ts +164 -0
- package/src/activities/execute-deep-agent/turn-setup.ts +541 -0
- package/src/activities/execute-deep-agent/turn-stream.ts +313 -0
- package/src/activities/execute-deep-agent/turn.ts +131 -0
- package/src/activities/execute-deep-agent/v3-event-recorder.ts +6 -5
- package/src/activities/execute-deep-agent/v3-events.ts +1 -1
- package/src/activities/execute-deep-agent/v3-status-builder.ts +84 -63
- package/src/harness/__tests__/approval-decisions.test.ts +116 -0
- package/src/harness/__tests__/capture.test.ts +268 -0
- package/src/harness/__tests__/mount-skills.test.ts +169 -0
- package/src/harness/__tests__/persist-chokepoint.test.ts +38 -2
- package/src/harness/__tests__/run-turn-deterministic.test.ts +94 -0
- package/src/harness/__tests__/run-turn.test.ts +39 -23
- package/src/harness/__tests__/turn-attachments-vision.test.ts +80 -0
- package/src/harness/__tests__/turn-context.test.ts +73 -26
- package/src/harness/approval-decisions.ts +104 -0
- package/src/harness/capabilities.ts +16 -5
- package/src/harness/capture.ts +301 -0
- package/src/harness/persist-chokepoint.ts +24 -4
- package/src/harness/run-turn.ts +120 -29
- package/src/harness/terminal-table.ts +61 -20
- package/src/harness/turn-context.ts +208 -111
- package/src/harness/types.ts +66 -12
- package/src/harness-adapters.ts +17 -9
- package/src/middleware/__tests__/approval-gate.test.ts +1 -1
- package/src/middleware/__tests__/cost-advisory.test.ts +113 -0
- package/src/middleware/approval-gate.ts +2 -2
- package/src/middleware/{cost-cap.ts → cost-advisory.ts} +40 -70
- package/src/middleware/index.ts +29 -29
- package/src/middleware/types.ts +3 -2
- package/src/runner-manager.ts +0 -8
- package/src/runner.ts +0 -8
- package/src/shared/__tests__/attachment-naming.test.ts +6 -19
- package/src/shared/__tests__/attachment-resolver.test.ts +158 -8
- package/src/shared/__tests__/attachment-zip.test.ts +236 -0
- package/src/shared/__tests__/bedrock-adapter.test.ts +1 -1
- package/src/shared/__tests__/blueprint-resolver.test.ts +43 -0
- package/src/shared/__tests__/cost-guard.test.ts +3 -3
- package/src/shared/__tests__/prompt-sections.test.ts +167 -0
- package/src/shared/__tests__/secret-leak-scan.test.ts +2 -2
- package/src/{activities/execute-deep-agent → shared}/__tests__/stamp-flowed-rows.test.ts +33 -10
- package/src/shared/__tests__/vertex-adapter.test.ts +1 -1
- package/src/shared/attachment-resolver.ts +218 -55
- package/src/shared/attachment-zip.ts +281 -0
- package/src/shared/connect-backfill.ts +9 -11
- package/src/shared/cost-guard.ts +3 -3
- package/src/shared/execution-status-writer.ts +5 -5
- package/src/shared/extract-structured-output.ts +8 -7
- package/src/shared/filereview/__tests__/capture.test.ts +86 -4
- package/src/shared/filereview/__tests__/cas-progress.test.ts +2 -1
- package/src/shared/filereview/cas-progress.ts +5 -19
- package/src/shared/filereview/cas-touched.ts +89 -0
- package/src/shared/filereview/index.ts +4 -2
- package/src/shared/mcp-resolver.ts +4 -5
- package/src/shared/persist-decision.ts +3 -4
- package/src/shared/plan-mode-permissions.ts +2 -2
- package/src/shared/plan-mode-prompt.ts +1 -1
- package/src/shared/prompt-sections.ts +256 -0
- package/src/shared/skill-resolver.ts +4 -2
- package/src/shared/tool-rounds.ts +48 -0
- package/src/shared/tool-row.ts +61 -0
- package/src/shared/workspace/__tests__/stigmer-link.test.ts +7 -22
- package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +20 -61
- package/src/shared/workspace/session-provision.ts +3 -3
- package/src/shared/workspace/stigmer-link.ts +3 -3
- package/src/shared/workspace/writeback-coordinator.ts +16 -64
- package/src/tools/index.ts +1 -1
- package/dist/activities/execute-cursor/capture-flow.d.ts +0 -142
- package/dist/activities/execute-cursor/capture-flow.js +0 -285
- package/dist/activities/execute-cursor/capture-flow.js.map +0 -1
- package/dist/activities/execute-cursor/command-provenance.d.ts +0 -48
- package/dist/activities/execute-cursor/command-provenance.js +0 -38
- package/dist/activities/execute-cursor/command-provenance.js.map +0 -1
- package/dist/activities/execute-deep-agent/attachment-injector.d.ts +0 -134
- package/dist/activities/execute-deep-agent/attachment-injector.js +0 -386
- package/dist/activities/execute-deep-agent/attachment-injector.js.map +0 -1
- package/dist/activities/execute-deep-agent/command-provenance.d.ts +0 -61
- package/dist/activities/execute-deep-agent/command-provenance.js +0 -72
- package/dist/activities/execute-deep-agent/command-provenance.js.map +0 -1
- package/dist/activities/execute-deep-agent/environment.d.ts +0 -24
- package/dist/activities/execute-deep-agent/environment.js +0 -58
- package/dist/activities/execute-deep-agent/environment.js.map +0 -1
- package/dist/activities/execute-deep-agent/event-recorder.d.ts +0 -21
- package/dist/activities/execute-deep-agent/event-recorder.js +0 -67
- package/dist/activities/execute-deep-agent/event-recorder.js.map +0 -1
- package/dist/activities/execute-deep-agent/index.d.ts +0 -15
- package/dist/activities/execute-deep-agent/index.js +0 -918
- package/dist/activities/execute-deep-agent/index.js.map +0 -1
- package/dist/activities/execute-deep-agent/mcp-gate.d.ts +0 -28
- package/dist/activities/execute-deep-agent/mcp-gate.js +0 -22
- package/dist/activities/execute-deep-agent/mcp-gate.js.map +0 -1
- package/dist/activities/execute-deep-agent/post-stream.d.ts +0 -23
- package/dist/activities/execute-deep-agent/post-stream.js +0 -71
- package/dist/activities/execute-deep-agent/post-stream.js.map +0 -1
- package/dist/activities/execute-deep-agent/setup.d.ts +0 -136
- package/dist/activities/execute-deep-agent/setup.js +0 -767
- package/dist/activities/execute-deep-agent/setup.js.map +0 -1
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +0 -36
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +0 -56
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +0 -1
- package/dist/activities/execute-deep-agent/status-builder.d.ts +0 -93
- package/dist/activities/execute-deep-agent/status-builder.js +0 -365
- package/dist/activities/execute-deep-agent/status-builder.js.map +0 -1
- package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +0 -21
- package/dist/activities/execute-deep-agent/streaming-terminal.js +0 -80
- package/dist/activities/execute-deep-agent/streaming-terminal.js.map +0 -1
- package/dist/activities/execute-deep-agent/streaming-v3.d.ts +0 -13
- package/dist/activities/execute-deep-agent/streaming-v3.js +0 -174
- package/dist/activities/execute-deep-agent/streaming-v3.js.map +0 -1
- package/dist/activities/execute-deep-agent/streaming.d.ts +0 -81
- package/dist/activities/execute-deep-agent/streaming.js +0 -160
- package/dist/activities/execute-deep-agent/streaming.js.map +0 -1
- package/dist/middleware/cost-cap.d.ts +0 -22
- package/dist/middleware/cost-cap.js.map +0 -1
- package/dist/middleware/graceful-stop.d.ts +0 -17
- package/dist/middleware/graceful-stop.js +0 -63
- package/dist/middleware/graceful-stop.js.map +0 -1
- package/dist/shared/skill-writer.d.ts +0 -75
- package/dist/shared/skill-writer.js +0 -207
- package/dist/shared/skill-writer.js.map +0 -1
- package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +0 -1032
- package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +0 -240
- package/src/activities/execute-cursor/__tests__/progress-substrate.test.ts +0 -169
- package/src/activities/execute-cursor/capture-flow.ts +0 -379
- package/src/activities/execute-cursor/command-provenance.ts +0 -73
- package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +0 -1161
- package/src/activities/execute-deep-agent/__tests__/command-provenance.test.ts +0 -252
- package/src/activities/execute-deep-agent/__tests__/environment.test.ts +0 -108
- package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +0 -150
- package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +0 -226
- package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +0 -318
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +0 -351
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +0 -293
- package/src/activities/execute-deep-agent/__tests__/index.test.ts +0 -99
- package/src/activities/execute-deep-agent/__tests__/mcp-gate.test.ts +0 -44
- package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +0 -112
- package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +0 -358
- package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +0 -1933
- package/src/activities/execute-deep-agent/__tests__/streaming-terminal.test.ts +0 -40
- package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +0 -597
- package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +0 -508
- package/src/activities/execute-deep-agent/attachment-injector.ts +0 -627
- package/src/activities/execute-deep-agent/command-provenance.ts +0 -102
- package/src/activities/execute-deep-agent/environment.ts +0 -76
- package/src/activities/execute-deep-agent/event-recorder.ts +0 -95
- package/src/activities/execute-deep-agent/index.ts +0 -1072
- package/src/activities/execute-deep-agent/mcp-gate.ts +0 -37
- package/src/activities/execute-deep-agent/post-stream.ts +0 -109
- package/src/activities/execute-deep-agent/setup.ts +0 -1081
- package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +0 -64
- package/src/activities/execute-deep-agent/status-builder.ts +0 -481
- package/src/activities/execute-deep-agent/streaming-terminal.ts +0 -106
- package/src/activities/execute-deep-agent/streaming-v3.ts +0 -277
- package/src/activities/execute-deep-agent/streaming.ts +0 -313
- package/src/middleware/__tests__/cost-cap.test.ts +0 -192
- package/src/middleware/__tests__/graceful-stop.test.ts +0 -105
- package/src/middleware/graceful-stop.ts +0 -86
- package/src/shared/__tests__/skill-writer.test.ts +0 -372
- package/src/shared/skill-writer.ts +0 -266
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor adapter over the harness-agnostic capture-mode orchestration
|
|
3
|
-
* ({@link ../../shared/filereview/capture.js}).
|
|
4
|
-
*
|
|
5
|
-
* The substrate (git snapshot/restore) and the orchestration (baseline/candidate/
|
|
6
|
-
* reconcile authoring) live in `shared/filereview/` so the Cursor and deep-agent
|
|
7
|
-
* harnesses author IDENTICAL ledger entries. This adapter binds the Cursor
|
|
8
|
-
* specifics:
|
|
9
|
-
* - `harnessId = "cursor"` (stamped on the BASELINE payload the projection reads);
|
|
10
|
-
* - the Cursor gate files written into the workspace, excluded from the captured
|
|
11
|
-
* diff (`CURSOR_RUNNER_OWNED_PATHS`);
|
|
12
|
-
* - stamping the streamed file-edit transcript rows that flowed this turn with
|
|
13
|
-
* the change set id (`stampFlowedFileEditRows`) — the rows stay visible as
|
|
14
|
-
* observational/audit records at their transcript positions, while
|
|
15
|
-
* `file_change_sets` remains the single DECISION surface.
|
|
16
|
-
*
|
|
17
|
-
* The resume-time reconcile is NOT here since S2 M2: the turn runtime's
|
|
18
|
-
* `reconcileReinvocation` (`harness/turn-context.ts`) calls the shared
|
|
19
|
-
* reconcile directly under {@link CURSOR_FILE_REVIEW_IDENTITY}, the one
|
|
20
|
-
* export that carries the two Cursor facts it needs. The two capture
|
|
21
|
-
* functions keep their original signatures so the activity wiring (index.ts)
|
|
22
|
-
* and the cutover tests are unchanged.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import { readFile } from "node:fs/promises";
|
|
26
|
-
import { join } from "node:path";
|
|
27
|
-
import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
28
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
29
|
-
import type { FileChangeSet, TurnCommandProvenance } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
30
|
-
import { FileCaptureClass } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
31
|
-
import { approvalCategory } from "./approval-policy.js";
|
|
32
|
-
import { toolIdentity, primaryToken } from "./approval-state.js";
|
|
33
|
-
import { readCasObservations } from "./cas-observations.js";
|
|
34
|
-
import { contentDigest } from "../../shared/file-tools.js";
|
|
35
|
-
import { isToolCallRowHidden, stampFileEditRow } from "../../shared/tool-row.js";
|
|
36
|
-
import {
|
|
37
|
-
captureBaselineToLedger as sharedCaptureBaselineToLedger,
|
|
38
|
-
captureCandidateToLedger as sharedCaptureCandidateToLedger,
|
|
39
|
-
} from "../../shared/filereview/capture.js";
|
|
40
|
-
import {
|
|
41
|
-
createGitProgressSubstrate,
|
|
42
|
-
createHybridProgressSubstrate,
|
|
43
|
-
type ProgressSubstrate,
|
|
44
|
-
} from "../../shared/filereview/progress.js";
|
|
45
|
-
import {
|
|
46
|
-
createCasProgressSubstrate,
|
|
47
|
-
type CasTouchedReader,
|
|
48
|
-
type CasTouchedSnapshot,
|
|
49
|
-
} from "../../shared/filereview/cas-progress.js";
|
|
50
|
-
import { hasCandidateCaptured } from "../../shared/filereview/events.js";
|
|
51
|
-
import { partitionIgnoredPathsBySecret } from "../../shared/filereview/secret-paths.js";
|
|
52
|
-
import { casBlobReader, type CasPathCapture } from "../../shared/filereview/cas-substrate.js";
|
|
53
|
-
import type { GitSubstrateChange as GitCapturedChange } from "../../shared/filereview/git-substrate.js";
|
|
54
|
-
import type { ArtifactStorage } from "../../shared/artifact-storage.js";
|
|
55
|
-
import type { FileReviewIdentity } from "../../harness/capabilities.js";
|
|
56
|
-
|
|
57
|
-
/** The harness id the projection reads from the BASELINE payload (load-bearing). */
|
|
58
|
-
const HARNESS_ID = "cursor";
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Workspace-relative paths the Cursor gate writes into the repo. They are excluded
|
|
62
|
-
* from capture so a turn's diff never shows the gate's own machinery. (The
|
|
63
|
-
* workspace-scoped gate dir and SDK state live under `~/.stigmer` / the
|
|
64
|
-
* git-excluded `.stigmer`, so they need no exclusion here.)
|
|
65
|
-
*/
|
|
66
|
-
const CURSOR_RUNNER_OWNED_PATHS: readonly string[] = [
|
|
67
|
-
".cursor/hooks.json",
|
|
68
|
-
".cursor/rules/stigmer-tool-approval.mdc",
|
|
69
|
-
];
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* The two facts the runtime's resume-time reconcile needs from this harness
|
|
73
|
-
* (`harness/turn-context.ts` `reconcileReinvocation`): the same id and
|
|
74
|
-
* exclude list the capture functions below stamp and apply, so the baseline a
|
|
75
|
-
* turn authors and the reconcile a resume runs agree by construction.
|
|
76
|
-
*/
|
|
77
|
-
export const CURSOR_FILE_REVIEW_IDENTITY: FileReviewIdentity = {
|
|
78
|
-
harnessId: HARNESS_ID,
|
|
79
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
// `deriveCaptureMode` is the single capture-vs-deny-gate decision, now shared by
|
|
83
|
-
// BOTH harnesses from `shared/filereview/capture.ts`. Re-exported here so existing
|
|
84
|
-
// Cursor imports (index.ts, the deny-gate-exact-apply seam test) keep resolving
|
|
85
|
-
// from this adapter.
|
|
86
|
-
export { deriveCaptureMode } from "../../shared/filereview/capture.js";
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Turn start: pin the pre-turn working tree behind the baseline ref and author
|
|
90
|
-
* BASELINE_CAPTURED (harnessId "cursor"). Returns the baseline tree sha for the
|
|
91
|
-
* turn-end diff.
|
|
92
|
-
*/
|
|
93
|
-
export function captureBaselineToLedger(opts: {
|
|
94
|
-
readonly status: AgentExecutionStatus;
|
|
95
|
-
readonly gitRoot: string;
|
|
96
|
-
readonly executionId: string;
|
|
97
|
-
readonly changeSetId: string;
|
|
98
|
-
/** True (default) for a git work tree; false for a CAS-only non-git workspace. */
|
|
99
|
-
readonly gitWorkspace?: boolean;
|
|
100
|
-
}): Promise<string> {
|
|
101
|
-
return sharedCaptureBaselineToLedger({
|
|
102
|
-
...opts,
|
|
103
|
-
harnessId: HARNESS_ID,
|
|
104
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Turn end: capture the change set + author CANDIDATE_CAPTURED, then stamp the
|
|
110
|
-
* streamed file-edit rows that flowed this turn with the change set id — the
|
|
111
|
-
* rows stay visible in place as observational records while `file_change_sets`
|
|
112
|
-
* remains the single decision surface. The working tree is LEFT applied
|
|
113
|
-
* (Cursor parity).
|
|
114
|
-
*
|
|
115
|
-
* The change set is HYBRID (git tree) or CAS-only (non-git): the hook-staged
|
|
116
|
-
* writes from the cas-observations sidecar this turn ({@link readCasObservations})
|
|
117
|
-
* — the Cursor analog of deep-agent's `buildCasTurnCaptures` — composed with the
|
|
118
|
-
* git-tracked diff when `gitWorkspace`. Non-secret staged paths become
|
|
119
|
-
* `GIT_IGNORED_CAPTURED` (git tree) or `NON_GIT_CAS` (non-git) CAS captures
|
|
120
|
-
* (before-bytes from the sidecar, after-bytes re-read from disk);
|
|
121
|
-
* secret-blocked paths become content-less `DIFF_UNREVIEWABLE` entries. The
|
|
122
|
-
* boundary re-runs {@link partitionIgnoredPathsBySecret} as a fail-closed
|
|
123
|
-
* backstop, so a secret that ever slipped into the captured set still has its
|
|
124
|
-
* bytes withheld from durable storage.
|
|
125
|
-
*
|
|
126
|
-
* `deniedTokens` are the identities the hook gated this turn (shell/MCP, or a
|
|
127
|
-
* secret-like delete — non-secret CAS deletes flow since issue #303). A streamed
|
|
128
|
-
* file-edit row whose identity is in that set is left for the deny-gate
|
|
129
|
-
* reconcile path — it did NOT flow. A flowed gitignored write or delete is NOT
|
|
130
|
-
* in that set (the hook allowed it), so it is stamped like any other flowed
|
|
131
|
-
* edit and its captured delta surfaces as a CAS entry in the set.
|
|
132
|
-
*
|
|
133
|
-
* `hitlDir`/`storage` are omitted only by callers with no artifact storage
|
|
134
|
-
* (captureIgnored off); the CAS half is then skipped and this is a git-only
|
|
135
|
-
* capture exactly as before.
|
|
136
|
-
*
|
|
137
|
-
* Mutates `messages` and `status` in place. Returns the captured git changes.
|
|
138
|
-
*/
|
|
139
|
-
export async function captureTurnToLedger(opts: {
|
|
140
|
-
readonly status: AgentExecutionStatus;
|
|
141
|
-
readonly gitRoot: string;
|
|
142
|
-
readonly executionId: string;
|
|
143
|
-
readonly changeSetId: string;
|
|
144
|
-
readonly baselineTree: string;
|
|
145
|
-
readonly messages: AgentMessage[];
|
|
146
|
-
readonly deniedTokens: ReadonlySet<string>;
|
|
147
|
-
readonly hitlDir?: string;
|
|
148
|
-
readonly storage?: ArtifactStorage;
|
|
149
|
-
/**
|
|
150
|
-
* Sub-agent tool-call ids that existed BEFORE this turn's stream (the seeded
|
|
151
|
-
* prior sub-agents). Sub-agent edit rows created this turn are stamped with the
|
|
152
|
-
* parent change set id; rows in this set are skipped so a resume never
|
|
153
|
-
* re-stamps a prior turn's sub-agent rows. Omit when there are no prior
|
|
154
|
-
* sub-agents.
|
|
155
|
-
*/
|
|
156
|
-
readonly priorSubAgentToolCallIds?: ReadonlySet<string>;
|
|
157
|
-
/**
|
|
158
|
-
* True (default) for a git work tree — the candidate is the git diff composed
|
|
159
|
-
* with the gitignored CAS captures (`GIT_IGNORED_CAPTURED`). False for a non-git
|
|
160
|
-
* workspace (Slice 2c): there is no git diff, so the whole change set is the CAS
|
|
161
|
-
* captures the hook staged for EVERY touched path (`NON_GIT_CAS`).
|
|
162
|
-
*/
|
|
163
|
-
readonly gitWorkspace?: boolean;
|
|
164
|
-
/**
|
|
165
|
-
* The approved-command turn facts (DD-28), derived by the caller from the
|
|
166
|
-
* turn's tool calls ({@link ../command-provenance.js}). Present only when the
|
|
167
|
-
* turn qualifies; carried verbatim to the CANDIDATE event.
|
|
168
|
-
*/
|
|
169
|
-
readonly commandProvenance?: TurnCommandProvenance;
|
|
170
|
-
}): Promise<readonly GitCapturedChange[]> {
|
|
171
|
-
const { status, gitRoot, executionId, changeSetId, baselineTree, messages, deniedTokens, hitlDir, storage, priorSubAgentToolCallIds, commandProvenance } = opts;
|
|
172
|
-
const gitWorkspace = opts.gitWorkspace ?? true;
|
|
173
|
-
|
|
174
|
-
// The CAS substrate class for this turn's staged writes: gitignored paths in a
|
|
175
|
-
// git tree, all touched paths in a non-git workspace.
|
|
176
|
-
const casCaptureClass = gitWorkspace
|
|
177
|
-
? FileCaptureClass.GIT_IGNORED_CAPTURED
|
|
178
|
-
: FileCaptureClass.NON_GIT_CAS;
|
|
179
|
-
const { casCaptures, unreviewablePaths } = await buildCasTurnCaptures(
|
|
180
|
-
gitRoot,
|
|
181
|
-
hitlDir,
|
|
182
|
-
storage,
|
|
183
|
-
casCaptureClass,
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
const changes = await sharedCaptureCandidateToLedger({
|
|
187
|
-
status,
|
|
188
|
-
gitRoot,
|
|
189
|
-
executionId,
|
|
190
|
-
changeSetId,
|
|
191
|
-
baselineTree,
|
|
192
|
-
harnessId: HARNESS_ID,
|
|
193
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
194
|
-
casCaptures,
|
|
195
|
-
storage,
|
|
196
|
-
unreviewablePaths,
|
|
197
|
-
unreviewableCaptureClass: casCaptureClass,
|
|
198
|
-
gitWorkspace,
|
|
199
|
-
commandProvenance,
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
// Observational rows: the reviewable diff lives on the file_review ledger
|
|
203
|
-
// (projected to file_change_sets); the streamed file-edit rows that flowed
|
|
204
|
-
// this turn stay visible in place, stamped with the change set id so clients
|
|
205
|
-
// badge them and anchor the decision surface. Denied (gitignored-delete/
|
|
206
|
-
// shell) rows stay on the deny-gate path. Gated on an authored CANDIDATE —
|
|
207
|
-
// a no-op turn (every edit reverted before the boundary) authors no event,
|
|
208
|
-
// and a row must never reference a change set that does not exist.
|
|
209
|
-
if (hasCandidateCaptured(status, changeSetId)) {
|
|
210
|
-
stampFlowedFileEditRows(messages, deniedTokens, changeSetId);
|
|
211
|
-
// Sub-agent edit rows fold their files into the SAME parent turn set, so they
|
|
212
|
-
// carry the same change set id. Walked separately (they live under
|
|
213
|
-
// subAgentExecutions, not the top-level transcript) and scoped to this turn
|
|
214
|
-
// via the pre-turn snapshot of seeded sub-agent tool-call ids.
|
|
215
|
-
for (const sa of status.subAgentExecutions) {
|
|
216
|
-
stampFlowedFileEditRows(sa.messages, deniedTokens, changeSetId, priorSubAgentToolCallIds);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
return changes;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Choose the mid-run progress substrate for this turn's workspace shape (DD-32 /
|
|
225
|
-
* DD-33), returning `undefined` when there is nothing to observe (not capture
|
|
226
|
-
* mode, or no workspace). Built ONCE per turn — the substrate owns its own
|
|
227
|
-
* short-circuit cache across the loop's persists; the floor lives in the caller's
|
|
228
|
-
* `ProgressCaptureState`. The live count and the turn-boundary reviewed set agree
|
|
229
|
-
* by construction: the git slice binds the SAME `CURSOR_RUNNER_OWNED_PATHS`
|
|
230
|
-
* exclusion {@link captureTurnToLedger} uses, and the CAS slice reads the SAME
|
|
231
|
-
* hook sidecar ({@link readCasObservations}) the boundary reads.
|
|
232
|
-
*
|
|
233
|
-
* - git tree, no storage -> git substrate only (tracked-file `--numstat`);
|
|
234
|
-
* - git tree, storage (HYBRID) -> git + CAS (the gitignored writes the hook staged);
|
|
235
|
-
* - non-git workspace -> CAS only (every tool-mediated write is CAS-staged).
|
|
236
|
-
*
|
|
237
|
-
* The CAS slice needs the hook sidecar, which exists only when `captureIgnored`
|
|
238
|
-
* is on (storage configured). A non-git capture already required storage
|
|
239
|
-
* (`deriveCaptureMode`), so its sidecar is always present; a git tree with no
|
|
240
|
-
* storage simply gets the git-only substrate (parity with the pre-DD-33 behavior).
|
|
241
|
-
*/
|
|
242
|
-
export function buildCursorProgressSubstrate(opts: {
|
|
243
|
-
readonly captureMode: boolean;
|
|
244
|
-
readonly gitWorkspace: boolean;
|
|
245
|
-
readonly workspaceRoot: string | undefined;
|
|
246
|
-
readonly baselineTree: string | undefined;
|
|
247
|
-
readonly executionId: string;
|
|
248
|
-
readonly hitlDir: string | undefined;
|
|
249
|
-
readonly storage: ArtifactStorage | undefined;
|
|
250
|
-
}): ProgressSubstrate | undefined {
|
|
251
|
-
const { captureMode, gitWorkspace, workspaceRoot, baselineTree, executionId, hitlDir, storage } = opts;
|
|
252
|
-
if (!captureMode || !workspaceRoot) return undefined;
|
|
253
|
-
|
|
254
|
-
const casReader: CasTouchedReader | undefined =
|
|
255
|
-
hitlDir && storage ? createSidecarTouchedReader(hitlDir) : undefined;
|
|
256
|
-
|
|
257
|
-
if (gitWorkspace) {
|
|
258
|
-
if (!baselineTree) return undefined;
|
|
259
|
-
const git = createGitProgressSubstrate({
|
|
260
|
-
workspaceRoot,
|
|
261
|
-
executionId,
|
|
262
|
-
baselineTree,
|
|
263
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
264
|
-
});
|
|
265
|
-
return casReader
|
|
266
|
-
? createHybridProgressSubstrate(git, createCasProgressSubstrate({ workspaceRoot, read: casReader }))
|
|
267
|
-
: git;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// Non-git: every tool-mediated write is CAS-staged; there is no git slice.
|
|
271
|
-
return casReader ? createCasProgressSubstrate({ workspaceRoot, read: casReader }) : undefined;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/**
|
|
275
|
-
* A {@link CasTouchedReader} over the Cursor hook's on-disk sidecar. Each capture
|
|
276
|
-
* reads the current observations ({@link readCasObservations}) and maps them to
|
|
277
|
-
* the substrate's snapshot shape. Reads are bounded by the caller's capture floor
|
|
278
|
-
* (default 2s), and the sidecar is small (one small marker + before-blob per
|
|
279
|
-
* touched gitignored path), so re-reading per capture is cheap and always
|
|
280
|
-
* reflects sub-agent writes staged since the last one.
|
|
281
|
-
*/
|
|
282
|
-
function createSidecarTouchedReader(hitlDir: string): CasTouchedReader {
|
|
283
|
-
return async (): Promise<CasTouchedSnapshot> => {
|
|
284
|
-
const { captured, secretPaths } = await readCasObservations(hitlDir);
|
|
285
|
-
const before = new Map<string, Uint8Array | null>();
|
|
286
|
-
for (const c of captured) before.set(c.path, c.before);
|
|
287
|
-
return { before, blockedSecretPaths: new Set(secretPaths) };
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* Compose this turn's CAS captures from the sidecar the hook staged, mirroring
|
|
293
|
-
* deep-agent's `buildCasTurnCaptures`: for each non-secret observed path, the
|
|
294
|
-
* before-bytes come from the sidecar and the after-bytes are re-read from disk now
|
|
295
|
-
* (`null` = the file was removed after the write). Secret-blocked paths are
|
|
296
|
-
* returned as `unreviewablePaths`. The secret partition is re-run as a
|
|
297
|
-
* fail-closed backstop over the observed set. `captureClass` labels each captured
|
|
298
|
-
* path's provenance (GIT_IGNORED_CAPTURED for a git tree's ignored paths,
|
|
299
|
-
* NON_GIT_CAS for a non-git workspace).
|
|
300
|
-
*
|
|
301
|
-
* Returns empty when the harness has no storage (captureIgnored off) or the
|
|
302
|
-
* sidecar is empty — leaving the shared capture unchanged.
|
|
303
|
-
*/
|
|
304
|
-
async function buildCasTurnCaptures(
|
|
305
|
-
gitRoot: string,
|
|
306
|
-
hitlDir: string | undefined,
|
|
307
|
-
storage: ArtifactStorage | undefined,
|
|
308
|
-
captureClass: FileCaptureClass,
|
|
309
|
-
): Promise<{ casCaptures: CasPathCapture[]; unreviewablePaths: string[] }> {
|
|
310
|
-
if (!hitlDir || !storage) return { casCaptures: [], unreviewablePaths: [] };
|
|
311
|
-
|
|
312
|
-
const { captured, secretPaths } = await readCasObservations(hitlDir);
|
|
313
|
-
const beforeByPath = new Map(captured.map((c) => [c.path, c.before] as const));
|
|
314
|
-
const { capturablePaths, unreviewablePaths } = partitionIgnoredPathsBySecret(
|
|
315
|
-
beforeByPath.keys(),
|
|
316
|
-
new Set(secretPaths),
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
const casCaptures: CasPathCapture[] = [];
|
|
320
|
-
for (const relPath of capturablePaths) {
|
|
321
|
-
const after = await readFileOrNull(join(gitRoot, relPath));
|
|
322
|
-
casCaptures.push({
|
|
323
|
-
path: relPath,
|
|
324
|
-
before: beforeByPath.get(relPath) ?? null,
|
|
325
|
-
after,
|
|
326
|
-
captureClass,
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
return { casCaptures, unreviewablePaths: [...unreviewablePaths] };
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/** Raw bytes of a file, or `null` when it does not exist (an ADD-then-removed). */
|
|
333
|
-
async function readFileOrNull(absolutePath: string): Promise<Uint8Array | null> {
|
|
334
|
-
try {
|
|
335
|
-
return await readFile(absolutePath);
|
|
336
|
-
} catch {
|
|
337
|
-
return null;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// ---------------------------------------------------------------------------
|
|
342
|
-
// Cursor-specific presentation
|
|
343
|
-
// ---------------------------------------------------------------------------
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Stamp every streamed file-edit row (category write/delete) that flowed this
|
|
347
|
-
* turn with the change set id, so the row stays visible as an observational
|
|
348
|
-
* record and clients can badge it / anchor the decision surface. Skips:
|
|
349
|
-
* - already-stamped rows — the stamp is the idempotency AND cross-turn guard:
|
|
350
|
-
* a resume seeds prior turns' rows into this transcript, and re-stamping
|
|
351
|
-
* them with this turn's id would mis-attribute them ({@link stampFileEditRow});
|
|
352
|
-
* - legacy hidden rows (sessions persisted before stamping existed) — they
|
|
353
|
-
* belong to an earlier turn's change set, not this one;
|
|
354
|
-
* - denied identities (the deny-gate reconcile path owns those rows);
|
|
355
|
-
* - tool-call ids in `skipToolCallIds` — used for sub-agent rows, which lack
|
|
356
|
-
* the already-stamped/hidden shields the top-level transcript has, to scope
|
|
357
|
-
* the stamp to rows created this turn (the seeded prior sub-agents' ids).
|
|
358
|
-
*/
|
|
359
|
-
function stampFlowedFileEditRows(
|
|
360
|
-
messages: readonly AgentMessage[],
|
|
361
|
-
deniedTokens: ReadonlySet<string>,
|
|
362
|
-
changeSetId: string,
|
|
363
|
-
skipToolCallIds?: ReadonlySet<string>,
|
|
364
|
-
): void {
|
|
365
|
-
for (const msg of messages) {
|
|
366
|
-
for (const tc of msg.toolCalls) {
|
|
367
|
-
if (tc.fileChangeSetId) continue;
|
|
368
|
-
if (skipToolCallIds?.has(tc.id)) continue;
|
|
369
|
-
if (isToolCallRowHidden(tc)) continue;
|
|
370
|
-
const category = approvalCategory(tc.name);
|
|
371
|
-
if (category !== "write" && category !== "delete") continue;
|
|
372
|
-
const args = (tc.args ?? {}) as Record<string, unknown>;
|
|
373
|
-
const id = toolIdentity(tc.name, tc.mcpServerSlug, args);
|
|
374
|
-
const token = primaryToken(id.key, id.salient, contentDigest(args));
|
|
375
|
-
if (deniedTokens.has(token)) continue; // denied -> reconcile path owns it
|
|
376
|
-
stampFileEditRow(tc, changeSetId);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Approved-command turn provenance (DD-28) — the CURSOR harness adapter over the
|
|
3
|
-
* shared qualification rule ({@link qualifyTurnCommandProvenance}).
|
|
4
|
-
*
|
|
5
|
-
* The Cursor harness scopes a turn POSITIONALLY (messages from the turn's first
|
|
6
|
-
* streamed index onward) and maps an executed command to its consent row through
|
|
7
|
-
* the reinvocation grant tokens the deny-gate minted. Both mappings are Cursor's
|
|
8
|
-
* own; the DD-28 rule they feed lives in `shared/filereview/command-provenance.ts`
|
|
9
|
-
* so the Cursor and deep-agent qualifications cannot drift.
|
|
10
|
-
*
|
|
11
|
-
* (Trust boundary + fail-closed contract: see the shared module.)
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
15
|
-
import type { TurnCommandProvenance } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
16
|
-
import { qualifyTurnCommandProvenance } from "../../shared/filereview/command-provenance.js";
|
|
17
|
-
import { toolCallIdentityToken } from "./message-translator.js";
|
|
18
|
-
|
|
19
|
-
export interface CommandProvenanceInputs {
|
|
20
|
-
/**
|
|
21
|
-
* The full transcript at capture time. Turn scoping is positional: messages
|
|
22
|
-
* from index {@link turnStartIndex} onward were produced by THIS turn's
|
|
23
|
-
* stream; everything before was seeded from prior turns. Lease consent rows
|
|
24
|
-
* (APPROVE_ALL) are looked up across the WHOLE transcript — a lease is
|
|
25
|
-
* run-lifetime, its granting row usually lives in a prior turn.
|
|
26
|
-
*/
|
|
27
|
-
readonly messages: readonly AgentMessage[];
|
|
28
|
-
/** Index of the first message created by this turn's stream. */
|
|
29
|
-
readonly turnStartIndex: number;
|
|
30
|
-
/**
|
|
31
|
-
* Identity tokens the hook denied THIS turn (the denial ledger). A denied
|
|
32
|
-
* shell row never executed — it is this turn's pending gate, not a mutation
|
|
33
|
-
* source — so it neither needs consent nor disqualifies.
|
|
34
|
-
*/
|
|
35
|
-
readonly deniedTokens: ReadonlySet<string>;
|
|
36
|
-
/**
|
|
37
|
-
* Grant token → the tool-call id of the approval row that minted the grant
|
|
38
|
-
* (the row carrying the server-authored approval_action). An executed shell
|
|
39
|
-
* command whose identity token is a key here was authorized by that
|
|
40
|
-
* per-command approval.
|
|
41
|
-
*/
|
|
42
|
-
readonly grantTokenToConsentId: ReadonlyMap<string, string>;
|
|
43
|
-
/** True when the pre-armed spec.auto_approve_all bypassed the gate. */
|
|
44
|
-
readonly globalBypass: boolean;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Derive the {@link TurnCommandProvenance} for the turn, or undefined when the
|
|
49
|
-
* turn does not qualify. Scopes this turn's tool calls positionally, resolves
|
|
50
|
-
* consent through the deny-gate grant tokens, and delegates the DD-28 rule to
|
|
51
|
-
* {@link qualifyTurnCommandProvenance}.
|
|
52
|
-
*/
|
|
53
|
-
export function deriveTurnCommandProvenance(
|
|
54
|
-
inputs: CommandProvenanceInputs,
|
|
55
|
-
): TurnCommandProvenance | undefined {
|
|
56
|
-
const { messages, turnStartIndex, deniedTokens, grantTokenToConsentId, globalBypass } = inputs;
|
|
57
|
-
|
|
58
|
-
// This turn's tool calls are the positional tail from the first message this
|
|
59
|
-
// turn's stream produced; everything before was seeded from prior turns.
|
|
60
|
-
const turnToolCalls = messages.slice(turnStartIndex).flatMap((m) => m.toolCalls);
|
|
61
|
-
|
|
62
|
-
return qualifyTurnCommandProvenance({
|
|
63
|
-
turnToolCalls,
|
|
64
|
-
messages,
|
|
65
|
-
// A shell whose identity token is in the denial ledger was denied by the
|
|
66
|
-
// hook — this turn's pending gate, never executed.
|
|
67
|
-
isExecutedCommand: (tc) => !deniedTokens.has(toolCallIdentityToken(tc)),
|
|
68
|
-
// A grant token maps back to the consent row (the row carrying the
|
|
69
|
-
// server-authored approval_action) that authorized this reinvocation.
|
|
70
|
-
resolveDirectConsent: (tc) => grantTokenToConsentId.get(toolCallIdentityToken(tc)),
|
|
71
|
-
globalBypass,
|
|
72
|
-
});
|
|
73
|
-
}
|