@stigmer/runner 3.15.1 → 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,285 +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
|
-
import { readFile } from "node:fs/promises";
|
|
25
|
-
import { join } from "node:path";
|
|
26
|
-
import { FileCaptureClass } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
27
|
-
import { approvalCategory } from "./approval-policy.js";
|
|
28
|
-
import { toolIdentity, primaryToken } from "./approval-state.js";
|
|
29
|
-
import { readCasObservations } from "./cas-observations.js";
|
|
30
|
-
import { contentDigest } from "../../shared/file-tools.js";
|
|
31
|
-
import { isToolCallRowHidden, stampFileEditRow } from "../../shared/tool-row.js";
|
|
32
|
-
import { captureBaselineToLedger as sharedCaptureBaselineToLedger, captureCandidateToLedger as sharedCaptureCandidateToLedger, } from "../../shared/filereview/capture.js";
|
|
33
|
-
import { createGitProgressSubstrate, createHybridProgressSubstrate, } from "../../shared/filereview/progress.js";
|
|
34
|
-
import { createCasProgressSubstrate, } from "../../shared/filereview/cas-progress.js";
|
|
35
|
-
import { hasCandidateCaptured } from "../../shared/filereview/events.js";
|
|
36
|
-
import { partitionIgnoredPathsBySecret } from "../../shared/filereview/secret-paths.js";
|
|
37
|
-
/** The harness id the projection reads from the BASELINE payload (load-bearing). */
|
|
38
|
-
const HARNESS_ID = "cursor";
|
|
39
|
-
/**
|
|
40
|
-
* Workspace-relative paths the Cursor gate writes into the repo. They are excluded
|
|
41
|
-
* from capture so a turn's diff never shows the gate's own machinery. (The
|
|
42
|
-
* workspace-scoped gate dir and SDK state live under `~/.stigmer` / the
|
|
43
|
-
* git-excluded `.stigmer`, so they need no exclusion here.)
|
|
44
|
-
*/
|
|
45
|
-
const CURSOR_RUNNER_OWNED_PATHS = [
|
|
46
|
-
".cursor/hooks.json",
|
|
47
|
-
".cursor/rules/stigmer-tool-approval.mdc",
|
|
48
|
-
];
|
|
49
|
-
/**
|
|
50
|
-
* The two facts the runtime's resume-time reconcile needs from this harness
|
|
51
|
-
* (`harness/turn-context.ts` `reconcileReinvocation`): the same id and
|
|
52
|
-
* exclude list the capture functions below stamp and apply, so the baseline a
|
|
53
|
-
* turn authors and the reconcile a resume runs agree by construction.
|
|
54
|
-
*/
|
|
55
|
-
export const CURSOR_FILE_REVIEW_IDENTITY = {
|
|
56
|
-
harnessId: HARNESS_ID,
|
|
57
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
58
|
-
};
|
|
59
|
-
// `deriveCaptureMode` is the single capture-vs-deny-gate decision, now shared by
|
|
60
|
-
// BOTH harnesses from `shared/filereview/capture.ts`. Re-exported here so existing
|
|
61
|
-
// Cursor imports (index.ts, the deny-gate-exact-apply seam test) keep resolving
|
|
62
|
-
// from this adapter.
|
|
63
|
-
export { deriveCaptureMode } from "../../shared/filereview/capture.js";
|
|
64
|
-
/**
|
|
65
|
-
* Turn start: pin the pre-turn working tree behind the baseline ref and author
|
|
66
|
-
* BASELINE_CAPTURED (harnessId "cursor"). Returns the baseline tree sha for the
|
|
67
|
-
* turn-end diff.
|
|
68
|
-
*/
|
|
69
|
-
export function captureBaselineToLedger(opts) {
|
|
70
|
-
return sharedCaptureBaselineToLedger({
|
|
71
|
-
...opts,
|
|
72
|
-
harnessId: HARNESS_ID,
|
|
73
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Turn end: capture the change set + author CANDIDATE_CAPTURED, then stamp the
|
|
78
|
-
* streamed file-edit rows that flowed this turn with the change set id — the
|
|
79
|
-
* rows stay visible in place as observational records while `file_change_sets`
|
|
80
|
-
* remains the single decision surface. The working tree is LEFT applied
|
|
81
|
-
* (Cursor parity).
|
|
82
|
-
*
|
|
83
|
-
* The change set is HYBRID (git tree) or CAS-only (non-git): the hook-staged
|
|
84
|
-
* writes from the cas-observations sidecar this turn ({@link readCasObservations})
|
|
85
|
-
* — the Cursor analog of deep-agent's `buildCasTurnCaptures` — composed with the
|
|
86
|
-
* git-tracked diff when `gitWorkspace`. Non-secret staged paths become
|
|
87
|
-
* `GIT_IGNORED_CAPTURED` (git tree) or `NON_GIT_CAS` (non-git) CAS captures
|
|
88
|
-
* (before-bytes from the sidecar, after-bytes re-read from disk);
|
|
89
|
-
* secret-blocked paths become content-less `DIFF_UNREVIEWABLE` entries. The
|
|
90
|
-
* boundary re-runs {@link partitionIgnoredPathsBySecret} as a fail-closed
|
|
91
|
-
* backstop, so a secret that ever slipped into the captured set still has its
|
|
92
|
-
* bytes withheld from durable storage.
|
|
93
|
-
*
|
|
94
|
-
* `deniedTokens` are the identities the hook gated this turn (shell/MCP, or a
|
|
95
|
-
* secret-like delete — non-secret CAS deletes flow since issue #303). A streamed
|
|
96
|
-
* file-edit row whose identity is in that set is left for the deny-gate
|
|
97
|
-
* reconcile path — it did NOT flow. A flowed gitignored write or delete is NOT
|
|
98
|
-
* in that set (the hook allowed it), so it is stamped like any other flowed
|
|
99
|
-
* edit and its captured delta surfaces as a CAS entry in the set.
|
|
100
|
-
*
|
|
101
|
-
* `hitlDir`/`storage` are omitted only by callers with no artifact storage
|
|
102
|
-
* (captureIgnored off); the CAS half is then skipped and this is a git-only
|
|
103
|
-
* capture exactly as before.
|
|
104
|
-
*
|
|
105
|
-
* Mutates `messages` and `status` in place. Returns the captured git changes.
|
|
106
|
-
*/
|
|
107
|
-
export async function captureTurnToLedger(opts) {
|
|
108
|
-
const { status, gitRoot, executionId, changeSetId, baselineTree, messages, deniedTokens, hitlDir, storage, priorSubAgentToolCallIds, commandProvenance } = opts;
|
|
109
|
-
const gitWorkspace = opts.gitWorkspace ?? true;
|
|
110
|
-
// The CAS substrate class for this turn's staged writes: gitignored paths in a
|
|
111
|
-
// git tree, all touched paths in a non-git workspace.
|
|
112
|
-
const casCaptureClass = gitWorkspace
|
|
113
|
-
? FileCaptureClass.GIT_IGNORED_CAPTURED
|
|
114
|
-
: FileCaptureClass.NON_GIT_CAS;
|
|
115
|
-
const { casCaptures, unreviewablePaths } = await buildCasTurnCaptures(gitRoot, hitlDir, storage, casCaptureClass);
|
|
116
|
-
const changes = await sharedCaptureCandidateToLedger({
|
|
117
|
-
status,
|
|
118
|
-
gitRoot,
|
|
119
|
-
executionId,
|
|
120
|
-
changeSetId,
|
|
121
|
-
baselineTree,
|
|
122
|
-
harnessId: HARNESS_ID,
|
|
123
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
124
|
-
casCaptures,
|
|
125
|
-
storage,
|
|
126
|
-
unreviewablePaths,
|
|
127
|
-
unreviewableCaptureClass: casCaptureClass,
|
|
128
|
-
gitWorkspace,
|
|
129
|
-
commandProvenance,
|
|
130
|
-
});
|
|
131
|
-
// Observational rows: the reviewable diff lives on the file_review ledger
|
|
132
|
-
// (projected to file_change_sets); the streamed file-edit rows that flowed
|
|
133
|
-
// this turn stay visible in place, stamped with the change set id so clients
|
|
134
|
-
// badge them and anchor the decision surface. Denied (gitignored-delete/
|
|
135
|
-
// shell) rows stay on the deny-gate path. Gated on an authored CANDIDATE —
|
|
136
|
-
// a no-op turn (every edit reverted before the boundary) authors no event,
|
|
137
|
-
// and a row must never reference a change set that does not exist.
|
|
138
|
-
if (hasCandidateCaptured(status, changeSetId)) {
|
|
139
|
-
stampFlowedFileEditRows(messages, deniedTokens, changeSetId);
|
|
140
|
-
// Sub-agent edit rows fold their files into the SAME parent turn set, so they
|
|
141
|
-
// carry the same change set id. Walked separately (they live under
|
|
142
|
-
// subAgentExecutions, not the top-level transcript) and scoped to this turn
|
|
143
|
-
// via the pre-turn snapshot of seeded sub-agent tool-call ids.
|
|
144
|
-
for (const sa of status.subAgentExecutions) {
|
|
145
|
-
stampFlowedFileEditRows(sa.messages, deniedTokens, changeSetId, priorSubAgentToolCallIds);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return changes;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Choose the mid-run progress substrate for this turn's workspace shape (DD-32 /
|
|
152
|
-
* DD-33), returning `undefined` when there is nothing to observe (not capture
|
|
153
|
-
* mode, or no workspace). Built ONCE per turn — the substrate owns its own
|
|
154
|
-
* short-circuit cache across the loop's persists; the floor lives in the caller's
|
|
155
|
-
* `ProgressCaptureState`. The live count and the turn-boundary reviewed set agree
|
|
156
|
-
* by construction: the git slice binds the SAME `CURSOR_RUNNER_OWNED_PATHS`
|
|
157
|
-
* exclusion {@link captureTurnToLedger} uses, and the CAS slice reads the SAME
|
|
158
|
-
* hook sidecar ({@link readCasObservations}) the boundary reads.
|
|
159
|
-
*
|
|
160
|
-
* - git tree, no storage -> git substrate only (tracked-file `--numstat`);
|
|
161
|
-
* - git tree, storage (HYBRID) -> git + CAS (the gitignored writes the hook staged);
|
|
162
|
-
* - non-git workspace -> CAS only (every tool-mediated write is CAS-staged).
|
|
163
|
-
*
|
|
164
|
-
* The CAS slice needs the hook sidecar, which exists only when `captureIgnored`
|
|
165
|
-
* is on (storage configured). A non-git capture already required storage
|
|
166
|
-
* (`deriveCaptureMode`), so its sidecar is always present; a git tree with no
|
|
167
|
-
* storage simply gets the git-only substrate (parity with the pre-DD-33 behavior).
|
|
168
|
-
*/
|
|
169
|
-
export function buildCursorProgressSubstrate(opts) {
|
|
170
|
-
const { captureMode, gitWorkspace, workspaceRoot, baselineTree, executionId, hitlDir, storage } = opts;
|
|
171
|
-
if (!captureMode || !workspaceRoot)
|
|
172
|
-
return undefined;
|
|
173
|
-
const casReader = hitlDir && storage ? createSidecarTouchedReader(hitlDir) : undefined;
|
|
174
|
-
if (gitWorkspace) {
|
|
175
|
-
if (!baselineTree)
|
|
176
|
-
return undefined;
|
|
177
|
-
const git = createGitProgressSubstrate({
|
|
178
|
-
workspaceRoot,
|
|
179
|
-
executionId,
|
|
180
|
-
baselineTree,
|
|
181
|
-
excludePaths: CURSOR_RUNNER_OWNED_PATHS,
|
|
182
|
-
});
|
|
183
|
-
return casReader
|
|
184
|
-
? createHybridProgressSubstrate(git, createCasProgressSubstrate({ workspaceRoot, read: casReader }))
|
|
185
|
-
: git;
|
|
186
|
-
}
|
|
187
|
-
// Non-git: every tool-mediated write is CAS-staged; there is no git slice.
|
|
188
|
-
return casReader ? createCasProgressSubstrate({ workspaceRoot, read: casReader }) : undefined;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* A {@link CasTouchedReader} over the Cursor hook's on-disk sidecar. Each capture
|
|
192
|
-
* reads the current observations ({@link readCasObservations}) and maps them to
|
|
193
|
-
* the substrate's snapshot shape. Reads are bounded by the caller's capture floor
|
|
194
|
-
* (default 2s), and the sidecar is small (one small marker + before-blob per
|
|
195
|
-
* touched gitignored path), so re-reading per capture is cheap and always
|
|
196
|
-
* reflects sub-agent writes staged since the last one.
|
|
197
|
-
*/
|
|
198
|
-
function createSidecarTouchedReader(hitlDir) {
|
|
199
|
-
return async () => {
|
|
200
|
-
const { captured, secretPaths } = await readCasObservations(hitlDir);
|
|
201
|
-
const before = new Map();
|
|
202
|
-
for (const c of captured)
|
|
203
|
-
before.set(c.path, c.before);
|
|
204
|
-
return { before, blockedSecretPaths: new Set(secretPaths) };
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Compose this turn's CAS captures from the sidecar the hook staged, mirroring
|
|
209
|
-
* deep-agent's `buildCasTurnCaptures`: for each non-secret observed path, the
|
|
210
|
-
* before-bytes come from the sidecar and the after-bytes are re-read from disk now
|
|
211
|
-
* (`null` = the file was removed after the write). Secret-blocked paths are
|
|
212
|
-
* returned as `unreviewablePaths`. The secret partition is re-run as a
|
|
213
|
-
* fail-closed backstop over the observed set. `captureClass` labels each captured
|
|
214
|
-
* path's provenance (GIT_IGNORED_CAPTURED for a git tree's ignored paths,
|
|
215
|
-
* NON_GIT_CAS for a non-git workspace).
|
|
216
|
-
*
|
|
217
|
-
* Returns empty when the harness has no storage (captureIgnored off) or the
|
|
218
|
-
* sidecar is empty — leaving the shared capture unchanged.
|
|
219
|
-
*/
|
|
220
|
-
async function buildCasTurnCaptures(gitRoot, hitlDir, storage, captureClass) {
|
|
221
|
-
if (!hitlDir || !storage)
|
|
222
|
-
return { casCaptures: [], unreviewablePaths: [] };
|
|
223
|
-
const { captured, secretPaths } = await readCasObservations(hitlDir);
|
|
224
|
-
const beforeByPath = new Map(captured.map((c) => [c.path, c.before]));
|
|
225
|
-
const { capturablePaths, unreviewablePaths } = partitionIgnoredPathsBySecret(beforeByPath.keys(), new Set(secretPaths));
|
|
226
|
-
const casCaptures = [];
|
|
227
|
-
for (const relPath of capturablePaths) {
|
|
228
|
-
const after = await readFileOrNull(join(gitRoot, relPath));
|
|
229
|
-
casCaptures.push({
|
|
230
|
-
path: relPath,
|
|
231
|
-
before: beforeByPath.get(relPath) ?? null,
|
|
232
|
-
after,
|
|
233
|
-
captureClass,
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
return { casCaptures, unreviewablePaths: [...unreviewablePaths] };
|
|
237
|
-
}
|
|
238
|
-
/** Raw bytes of a file, or `null` when it does not exist (an ADD-then-removed). */
|
|
239
|
-
async function readFileOrNull(absolutePath) {
|
|
240
|
-
try {
|
|
241
|
-
return await readFile(absolutePath);
|
|
242
|
-
}
|
|
243
|
-
catch {
|
|
244
|
-
return null;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
// ---------------------------------------------------------------------------
|
|
248
|
-
// Cursor-specific presentation
|
|
249
|
-
// ---------------------------------------------------------------------------
|
|
250
|
-
/**
|
|
251
|
-
* Stamp every streamed file-edit row (category write/delete) that flowed this
|
|
252
|
-
* turn with the change set id, so the row stays visible as an observational
|
|
253
|
-
* record and clients can badge it / anchor the decision surface. Skips:
|
|
254
|
-
* - already-stamped rows — the stamp is the idempotency AND cross-turn guard:
|
|
255
|
-
* a resume seeds prior turns' rows into this transcript, and re-stamping
|
|
256
|
-
* them with this turn's id would mis-attribute them ({@link stampFileEditRow});
|
|
257
|
-
* - legacy hidden rows (sessions persisted before stamping existed) — they
|
|
258
|
-
* belong to an earlier turn's change set, not this one;
|
|
259
|
-
* - denied identities (the deny-gate reconcile path owns those rows);
|
|
260
|
-
* - tool-call ids in `skipToolCallIds` — used for sub-agent rows, which lack
|
|
261
|
-
* the already-stamped/hidden shields the top-level transcript has, to scope
|
|
262
|
-
* the stamp to rows created this turn (the seeded prior sub-agents' ids).
|
|
263
|
-
*/
|
|
264
|
-
function stampFlowedFileEditRows(messages, deniedTokens, changeSetId, skipToolCallIds) {
|
|
265
|
-
for (const msg of messages) {
|
|
266
|
-
for (const tc of msg.toolCalls) {
|
|
267
|
-
if (tc.fileChangeSetId)
|
|
268
|
-
continue;
|
|
269
|
-
if (skipToolCallIds?.has(tc.id))
|
|
270
|
-
continue;
|
|
271
|
-
if (isToolCallRowHidden(tc))
|
|
272
|
-
continue;
|
|
273
|
-
const category = approvalCategory(tc.name);
|
|
274
|
-
if (category !== "write" && category !== "delete")
|
|
275
|
-
continue;
|
|
276
|
-
const args = (tc.args ?? {});
|
|
277
|
-
const id = toolIdentity(tc.name, tc.mcpServerSlug, args);
|
|
278
|
-
const token = primaryToken(id.key, id.salient, contentDigest(args));
|
|
279
|
-
if (deniedTokens.has(token))
|
|
280
|
-
continue; // denied -> reconcile path owns it
|
|
281
|
-
stampFileEditRow(tc, changeSetId);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
//# sourceMappingURL=capture-flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capture-flow.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/capture-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +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
|
-
import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
14
|
-
import type { TurnCommandProvenance } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
15
|
-
export interface CommandProvenanceInputs {
|
|
16
|
-
/**
|
|
17
|
-
* The full transcript at capture time. Turn scoping is positional: messages
|
|
18
|
-
* from index {@link turnStartIndex} onward were produced by THIS turn's
|
|
19
|
-
* stream; everything before was seeded from prior turns. Lease consent rows
|
|
20
|
-
* (APPROVE_ALL) are looked up across the WHOLE transcript — a lease is
|
|
21
|
-
* run-lifetime, its granting row usually lives in a prior turn.
|
|
22
|
-
*/
|
|
23
|
-
readonly messages: readonly AgentMessage[];
|
|
24
|
-
/** Index of the first message created by this turn's stream. */
|
|
25
|
-
readonly turnStartIndex: number;
|
|
26
|
-
/**
|
|
27
|
-
* Identity tokens the hook denied THIS turn (the denial ledger). A denied
|
|
28
|
-
* shell row never executed — it is this turn's pending gate, not a mutation
|
|
29
|
-
* source — so it neither needs consent nor disqualifies.
|
|
30
|
-
*/
|
|
31
|
-
readonly deniedTokens: ReadonlySet<string>;
|
|
32
|
-
/**
|
|
33
|
-
* Grant token → the tool-call id of the approval row that minted the grant
|
|
34
|
-
* (the row carrying the server-authored approval_action). An executed shell
|
|
35
|
-
* command whose identity token is a key here was authorized by that
|
|
36
|
-
* per-command approval.
|
|
37
|
-
*/
|
|
38
|
-
readonly grantTokenToConsentId: ReadonlyMap<string, string>;
|
|
39
|
-
/** True when the pre-armed spec.auto_approve_all bypassed the gate. */
|
|
40
|
-
readonly globalBypass: boolean;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Derive the {@link TurnCommandProvenance} for the turn, or undefined when the
|
|
44
|
-
* turn does not qualify. Scopes this turn's tool calls positionally, resolves
|
|
45
|
-
* consent through the deny-gate grant tokens, and delegates the DD-28 rule to
|
|
46
|
-
* {@link qualifyTurnCommandProvenance}.
|
|
47
|
-
*/
|
|
48
|
-
export declare function deriveTurnCommandProvenance(inputs: CommandProvenanceInputs): TurnCommandProvenance | undefined;
|
|
@@ -1,38 +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
|
-
import { qualifyTurnCommandProvenance } from "../../shared/filereview/command-provenance.js";
|
|
14
|
-
import { toolCallIdentityToken } from "./message-translator.js";
|
|
15
|
-
/**
|
|
16
|
-
* Derive the {@link TurnCommandProvenance} for the turn, or undefined when the
|
|
17
|
-
* turn does not qualify. Scopes this turn's tool calls positionally, resolves
|
|
18
|
-
* consent through the deny-gate grant tokens, and delegates the DD-28 rule to
|
|
19
|
-
* {@link qualifyTurnCommandProvenance}.
|
|
20
|
-
*/
|
|
21
|
-
export function deriveTurnCommandProvenance(inputs) {
|
|
22
|
-
const { messages, turnStartIndex, deniedTokens, grantTokenToConsentId, globalBypass } = inputs;
|
|
23
|
-
// This turn's tool calls are the positional tail from the first message this
|
|
24
|
-
// turn's stream produced; everything before was seeded from prior turns.
|
|
25
|
-
const turnToolCalls = messages.slice(turnStartIndex).flatMap((m) => m.toolCalls);
|
|
26
|
-
return qualifyTurnCommandProvenance({
|
|
27
|
-
turnToolCalls,
|
|
28
|
-
messages,
|
|
29
|
-
// A shell whose identity token is in the denial ledger was denied by the
|
|
30
|
-
// hook — this turn's pending gate, never executed.
|
|
31
|
-
isExecutedCommand: (tc) => !deniedTokens.has(toolCallIdentityToken(tc)),
|
|
32
|
-
// A grant token maps back to the consent row (the row carrying the
|
|
33
|
-
// server-authored approval_action) that authorized this reinvocation.
|
|
34
|
-
resolveDirectConsent: (tc) => grantTokenToConsentId.get(toolCallIdentityToken(tc)),
|
|
35
|
-
globalBypass,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=command-provenance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-provenance.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/command-provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AA8BhE;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAA+B;IAE/B,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE/F,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjF,OAAO,4BAA4B,CAAC;QAClC,aAAa;QACb,QAAQ;QACR,yEAAyE;QACzE,mDAAmD;QACnD,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACvE,mEAAmE;QACnE,sEAAsE;QACtE,oBAAoB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAClF,YAAY;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Attachment injection for deep agent execution.
|
|
3
|
-
*
|
|
4
|
-
* Downloads attachments from artifact storage (cloud) or local filesystem,
|
|
5
|
-
* validates ZIP archives with security guards, and writes files into the
|
|
6
|
-
* workspace via the platform mount namespace (.stigmer/inputs/).
|
|
7
|
-
*
|
|
8
|
-
* Security model: attachments are untrusted user uploads. ZIP archives are
|
|
9
|
-
* parsed from the central directory — the format's authoritative index —
|
|
10
|
-
* via the shared structural layer (@stigmer/zip-structure; issue #567,
|
|
11
|
-
* which killed this module's local-header walk: it silently truncated
|
|
12
|
-
* stored streaming entries and rejected Go-default archives outright).
|
|
13
|
-
* Every entry is validated for path traversal, zip bombs, and format
|
|
14
|
-
* integrity BEFORE any extraction occurs, and because the central
|
|
15
|
-
* directory's sizes are declarations an attacker controls, decompression
|
|
16
|
-
* re-enforces them: an entry whose actual output disagrees with its
|
|
17
|
-
* declared size aborts the injection.
|
|
18
|
-
*
|
|
19
|
-
* Error model: fail-hard. Any attachment failure aborts the entire injection
|
|
20
|
-
* and propagates a descriptive error. Attachments are explicit user inputs —
|
|
21
|
-
* running with partial inputs produces silently incorrect results. This is
|
|
22
|
-
* deliberately the OPPOSITE policy from the skill-artifact reader
|
|
23
|
-
* (shared/zip-extract.ts, non-fatal empty return): skill artifacts were
|
|
24
|
-
* structurally vouched for by the push gates, attachments never are.
|
|
25
|
-
*
|
|
26
|
-
* Duplicate names are NOT a failure (issue #364): a default-derived mount
|
|
27
|
-
* path that collides is renamed with the platform's `stem-2.ext` semantics
|
|
28
|
-
* (shared/attachment-naming.ts) and the rename is disclosed in the prompt's
|
|
29
|
-
* Input Files section. Only two attachments EXPLICITLY pinning the same
|
|
30
|
-
* `mountPath` still abort — that is a user contradiction no rename can
|
|
31
|
-
* honestly resolve.
|
|
32
|
-
*/
|
|
33
|
-
import type { Attachment } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/spec_pb";
|
|
34
|
-
import type { WorkspaceBackend } from "../../shared/workspace/types.js";
|
|
35
|
-
import type { ArtifactStorage } from "../../shared/artifact-storage.js";
|
|
36
|
-
import type { VisionBudget, VisionDegradedReason, VisionImage } from "../../shared/attachment-vision.js";
|
|
37
|
-
declare const MAX_ZIP_FILES = 1000;
|
|
38
|
-
declare const MAX_ZIP_EXTRACTED_SIZE: number;
|
|
39
|
-
export { MAX_ZIP_FILES, MAX_ZIP_EXTRACTED_SIZE };
|
|
40
|
-
export interface InjectedFile {
|
|
41
|
-
/** The final on-disk basename — after any duplicate rename, so it always
|
|
42
|
-
* agrees with {@link path} and with the vision payload's image label. */
|
|
43
|
-
readonly filename: string;
|
|
44
|
-
readonly path: string;
|
|
45
|
-
readonly sizeBytes: number;
|
|
46
|
-
/**
|
|
47
|
-
* The attachment's original filename, present only when a duplicate name
|
|
48
|
-
* was renamed (shared/attachment-naming.ts) — rendered as disclosure in
|
|
49
|
-
* the prompt's Input Files section.
|
|
50
|
-
*/
|
|
51
|
-
readonly renamedFrom?: string;
|
|
52
|
-
/** Present when the attachment was accepted into the turn's vision payload. */
|
|
53
|
-
readonly vision?: VisionImage;
|
|
54
|
-
/**
|
|
55
|
-
* Present when the attachment was plausibly an image but could not ride
|
|
56
|
-
* inline (see {@link VisionDegradedReason}) — disclosed in the system prompt
|
|
57
|
-
* so the agent never silently ignores a photo the user believes it can see.
|
|
58
|
-
* Attachments that were never image-shaped carry neither field.
|
|
59
|
-
*/
|
|
60
|
-
readonly visionDegraded?: VisionDegradedReason;
|
|
61
|
-
/**
|
|
62
|
-
* A download URL for the attachment's stored object, listed in the system
|
|
63
|
-
* prompt's Input Files section so the agent can hand the file to a tool
|
|
64
|
-
* whose backend cannot read the sandbox filesystem (issue #532). Minted
|
|
65
|
-
* whenever the attachment has a `storageKey` and a usable storage; never
|
|
66
|
-
* present on extracted ZIP entries (no attachment-level object). Absent
|
|
67
|
-
* when there is nothing to mint or the mint failed (non-fatal — policy,
|
|
68
|
-
* degrade log, and prompt wording live in
|
|
69
|
-
* shared/attachment-download-urls.ts).
|
|
70
|
-
*/
|
|
71
|
-
readonly downloadUrl?: string;
|
|
72
|
-
}
|
|
73
|
-
export interface InjectAttachmentsOptions {
|
|
74
|
-
readonly backend: WorkspaceBackend;
|
|
75
|
-
readonly attachments: readonly Attachment[];
|
|
76
|
-
/**
|
|
77
|
-
* Artifact storage for cloud-mode attachment download. `undefined` when the
|
|
78
|
-
* runner could not build a store (proxy misconfig). With no attachments this is
|
|
79
|
-
* never touched (the function early-returns); a cloud-mode attachment that
|
|
80
|
-
* genuinely needs storage surfaces a clear {@link AttachmentInjectionError}
|
|
81
|
-
* rather than dereferencing undefined.
|
|
82
|
-
*/
|
|
83
|
-
readonly storage: ArtifactStorage | undefined;
|
|
84
|
-
readonly isLocalMode: boolean;
|
|
85
|
-
/**
|
|
86
|
-
* The turn's vision selector (attachment-vision.ts owns all policy).
|
|
87
|
-
* `undefined` disables inline image delivery; file materialization is
|
|
88
|
-
* identical either way — vision is strictly additive. Archives (`extract`)
|
|
89
|
-
* are never offered: an image inside a ZIP has no attachment-level bytes.
|
|
90
|
-
*/
|
|
91
|
-
readonly visionBudget?: VisionBudget;
|
|
92
|
-
}
|
|
93
|
-
export interface ZipEntryInfo {
|
|
94
|
-
readonly relativePath: string;
|
|
95
|
-
readonly uncompressedSize: number;
|
|
96
|
-
}
|
|
97
|
-
export declare class AttachmentInjectionError extends Error {
|
|
98
|
-
readonly attachmentFilename: string;
|
|
99
|
-
readonly reason: string;
|
|
100
|
-
constructor(attachmentFilename: string, reason: string);
|
|
101
|
-
}
|
|
102
|
-
export declare class AttachmentValidationError extends Error {
|
|
103
|
-
readonly attachmentFilename: string;
|
|
104
|
-
readonly reason: string;
|
|
105
|
-
constructor(attachmentFilename: string, reason: string);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Validate a ZIP archive for safe extraction. Returns the manifest of
|
|
109
|
-
* file entries (directories excluded) if the archive passes all checks.
|
|
110
|
-
*
|
|
111
|
-
* Security checks enforced:
|
|
112
|
-
* 1. Valid ZIP format (readable central directory; fail-hard, see module doc)
|
|
113
|
-
* 2. No absolute paths (entries starting with / or \)
|
|
114
|
-
* 3. No path traversal (.. components)
|
|
115
|
-
* 4. No null bytes in filenames
|
|
116
|
-
* 5. No duplicate entry paths (a contradictory manifest)
|
|
117
|
-
* 6. Only supported compression methods (stored, deflate) — checked here
|
|
118
|
-
* so an unsupported entry can never abort extraction after earlier
|
|
119
|
-
* entries were already written
|
|
120
|
-
* 7. Non-empty archive (at least one file entry)
|
|
121
|
-
* 8. File count within limits (max 1000)
|
|
122
|
-
* 9. Total declared uncompressed size within limits (max 100 MB) —
|
|
123
|
-
* declarations are re-enforced against actual output at decompression
|
|
124
|
-
*/
|
|
125
|
-
export declare function validateZipForExtraction(zipData: Buffer, sourceFilename: string): ZipEntryInfo[];
|
|
126
|
-
/**
|
|
127
|
-
* Download, validate, and inject all attachments into the workspace.
|
|
128
|
-
*
|
|
129
|
-
* Resolves all mount paths before any downloads begin: duplicate
|
|
130
|
-
* default-derived names are renamed (never fatal — see module doc), and an
|
|
131
|
-
* explicit-mountPath contradiction throws before any bytes move.
|
|
132
|
-
* On any failure, throws AttachmentInjectionError with an actionable message.
|
|
133
|
-
*/
|
|
134
|
-
export declare function injectAttachments(opts: InjectAttachmentsOptions): Promise<InjectedFile[]>;
|