@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,386 +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 { readFile } from "node:fs/promises";
|
|
34
|
-
import { createInflateRaw } from "node:zlib";
|
|
35
|
-
import { posix } from "node:path";
|
|
36
|
-
import { mintAttachmentDownloadUrl } from "../../shared/attachment-download-urls.js";
|
|
37
|
-
import { allocateUniqueName } from "../../shared/attachment-naming.js";
|
|
38
|
-
import { EOCD_MIN_SIZE, parseZipStructure, } from "@stigmer/zip-structure";
|
|
39
|
-
// ── Constants ────────────────────────────────────────────────────────
|
|
40
|
-
const MAX_ZIP_FILES = 1000;
|
|
41
|
-
const MAX_ZIP_EXTRACTED_SIZE = 100 * 1024 * 1024; // 100 MB
|
|
42
|
-
const DEFAULT_INPUTS_PREFIX = ".stigmer/inputs";
|
|
43
|
-
export { MAX_ZIP_FILES, MAX_ZIP_EXTRACTED_SIZE };
|
|
44
|
-
// ── Errors ───────────────────────────────────────────────────────────
|
|
45
|
-
export class AttachmentInjectionError extends Error {
|
|
46
|
-
attachmentFilename;
|
|
47
|
-
reason;
|
|
48
|
-
constructor(attachmentFilename, reason) {
|
|
49
|
-
super(`Attachment '${attachmentFilename}': ${reason}`);
|
|
50
|
-
this.name = "AttachmentInjectionError";
|
|
51
|
-
this.attachmentFilename = attachmentFilename;
|
|
52
|
-
this.reason = reason;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export class AttachmentValidationError extends Error {
|
|
56
|
-
attachmentFilename;
|
|
57
|
-
reason;
|
|
58
|
-
constructor(attachmentFilename, reason) {
|
|
59
|
-
super(`Attachment '${attachmentFilename}': ${reason}`);
|
|
60
|
-
this.name = "AttachmentValidationError";
|
|
61
|
-
this.attachmentFilename = attachmentFilename;
|
|
62
|
-
this.reason = reason;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// ── ZIP Validation (pure functions) ──────────────────────────────────
|
|
66
|
-
/**
|
|
67
|
-
* Validate a ZIP archive for safe extraction. Returns the manifest of
|
|
68
|
-
* file entries (directories excluded) if the archive passes all checks.
|
|
69
|
-
*
|
|
70
|
-
* Security checks enforced:
|
|
71
|
-
* 1. Valid ZIP format (readable central directory; fail-hard, see module doc)
|
|
72
|
-
* 2. No absolute paths (entries starting with / or \)
|
|
73
|
-
* 3. No path traversal (.. components)
|
|
74
|
-
* 4. No null bytes in filenames
|
|
75
|
-
* 5. No duplicate entry paths (a contradictory manifest)
|
|
76
|
-
* 6. Only supported compression methods (stored, deflate) — checked here
|
|
77
|
-
* so an unsupported entry can never abort extraction after earlier
|
|
78
|
-
* entries were already written
|
|
79
|
-
* 7. Non-empty archive (at least one file entry)
|
|
80
|
-
* 8. File count within limits (max 1000)
|
|
81
|
-
* 9. Total declared uncompressed size within limits (max 100 MB) —
|
|
82
|
-
* declarations are re-enforced against actual output at decompression
|
|
83
|
-
*/
|
|
84
|
-
export function validateZipForExtraction(zipData, sourceFilename) {
|
|
85
|
-
return parseAndValidateZip(zipData, sourceFilename).map(({ relativePath, uncompressedSize }) => ({ relativePath, uncompressedSize }));
|
|
86
|
-
}
|
|
87
|
-
function parseAndValidateZip(zipData, sourceFilename) {
|
|
88
|
-
if (zipData.length < EOCD_MIN_SIZE) {
|
|
89
|
-
throw new AttachmentValidationError(sourceFilename, "not a valid ZIP archive (file too small)");
|
|
90
|
-
}
|
|
91
|
-
let structural;
|
|
92
|
-
try {
|
|
93
|
-
structural = parseZipStructure(zipData);
|
|
94
|
-
}
|
|
95
|
-
catch (err) {
|
|
96
|
-
throw new AttachmentValidationError(sourceFilename, `not a valid ZIP archive (${err instanceof Error ? err.message : String(err)})`);
|
|
97
|
-
}
|
|
98
|
-
const entries = [];
|
|
99
|
-
const seenPaths = new Set();
|
|
100
|
-
let totalUncompressed = 0;
|
|
101
|
-
for (const entry of structural) {
|
|
102
|
-
if (entry.name.includes("\u0000")) {
|
|
103
|
-
throw new AttachmentValidationError(sourceFilename, "contains a filename with null bytes and cannot be safely extracted");
|
|
104
|
-
}
|
|
105
|
-
if (entry.isDirectory)
|
|
106
|
-
continue;
|
|
107
|
-
if (entry.name.startsWith("/") || entry.name.startsWith("\\")) {
|
|
108
|
-
throw new AttachmentValidationError(sourceFilename, `contains an absolute path entry and cannot be safely extracted: ${entry.name}`);
|
|
109
|
-
}
|
|
110
|
-
if (hasPathTraversal(entry.name)) {
|
|
111
|
-
throw new AttachmentValidationError(sourceFilename, `contains a path traversal entry and cannot be safely extracted: ${entry.name}`);
|
|
112
|
-
}
|
|
113
|
-
if (seenPaths.has(entry.name)) {
|
|
114
|
-
throw new AttachmentValidationError(sourceFilename, `contains duplicate entry '${entry.name}' and cannot be safely extracted`);
|
|
115
|
-
}
|
|
116
|
-
seenPaths.add(entry.name);
|
|
117
|
-
if (entry.compressionMethod !== 0 && entry.compressionMethod !== 8) {
|
|
118
|
-
throw new AttachmentValidationError(sourceFilename, `entry '${entry.name}' uses unsupported compression method ${entry.compressionMethod}`);
|
|
119
|
-
}
|
|
120
|
-
entries.push({
|
|
121
|
-
relativePath: entry.name,
|
|
122
|
-
uncompressedSize: entry.uncompressedSize,
|
|
123
|
-
compressionMethod: entry.compressionMethod,
|
|
124
|
-
compressedData: entry.compressedData,
|
|
125
|
-
});
|
|
126
|
-
totalUncompressed += entry.uncompressedSize;
|
|
127
|
-
}
|
|
128
|
-
if (entries.length === 0) {
|
|
129
|
-
throw new AttachmentValidationError(sourceFilename, "is an empty ZIP archive (no file entries)");
|
|
130
|
-
}
|
|
131
|
-
if (entries.length > MAX_ZIP_FILES) {
|
|
132
|
-
throw new AttachmentValidationError(sourceFilename, `contains ${entries.length} files (limit: ${MAX_ZIP_FILES})`);
|
|
133
|
-
}
|
|
134
|
-
if (totalUncompressed > MAX_ZIP_EXTRACTED_SIZE) {
|
|
135
|
-
const sizeMb = (totalUncompressed / (1024 * 1024)).toFixed(1);
|
|
136
|
-
const limitMb = (MAX_ZIP_EXTRACTED_SIZE / (1024 * 1024)).toFixed(0);
|
|
137
|
-
throw new AttachmentValidationError(sourceFilename, `would extract to ${sizeMb} MB (limit: ${limitMb} MB)`);
|
|
138
|
-
}
|
|
139
|
-
return entries.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
140
|
-
}
|
|
141
|
-
// ── Attachment Injection ─────────────────────────────────────────────
|
|
142
|
-
/**
|
|
143
|
-
* Download, validate, and inject all attachments into the workspace.
|
|
144
|
-
*
|
|
145
|
-
* Resolves all mount paths before any downloads begin: duplicate
|
|
146
|
-
* default-derived names are renamed (never fatal — see module doc), and an
|
|
147
|
-
* explicit-mountPath contradiction throws before any bytes move.
|
|
148
|
-
* On any failure, throws AttachmentInjectionError with an actionable message.
|
|
149
|
-
*/
|
|
150
|
-
export async function injectAttachments(opts) {
|
|
151
|
-
const { backend, attachments, storage, isLocalMode, visionBudget } = opts;
|
|
152
|
-
if (attachments.length === 0)
|
|
153
|
-
return [];
|
|
154
|
-
// Phase 1: Pre-compute mount paths and detect collisions
|
|
155
|
-
const mountPaths = resolveMountPaths(attachments);
|
|
156
|
-
// Phase 2: Download, validate, and write each attachment
|
|
157
|
-
const injectedFiles = [];
|
|
158
|
-
for (const attachment of attachments) {
|
|
159
|
-
const content = await downloadAttachment(attachment, storage, isLocalMode);
|
|
160
|
-
const { path: mountPath, renamedFrom } = mountPaths.get(attachment);
|
|
161
|
-
if (attachment.extract) {
|
|
162
|
-
const entries = parseAndValidateZip(content, attachment.filename);
|
|
163
|
-
const extracted = await extractZipToWorkspace(entries, mountPath, backend, attachment.filename);
|
|
164
|
-
// A renamed mount DIR is visible through every extracted path; the
|
|
165
|
-
// entries themselves were not renamed, so they carry no renamedFrom
|
|
166
|
-
// (per-file disclosure would misattribute the rename). Extracted
|
|
167
|
-
// entries also carry no downloadUrl: the stored object is the ZIP, not
|
|
168
|
-
// any listed file, and a URL to bytes that differ from the listing
|
|
169
|
-
// would be a false promise.
|
|
170
|
-
injectedFiles.push(...extracted);
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
await backend.writeFileBuffer(mountPath, content);
|
|
174
|
-
// The final basename is the canonical filename: after a duplicate
|
|
175
|
-
// rename the original attachment.filename no longer names the file on
|
|
176
|
-
// disk, and the vision label must match what the prompt lists or the
|
|
177
|
-
// agent sees two images with one indistinguishable name.
|
|
178
|
-
const filename = posix.basename(mountPath);
|
|
179
|
-
// The bytes are already in hand for the workspace write — offer them to
|
|
180
|
-
// the vision budget before they go out of scope (the sniff decides
|
|
181
|
-
// eligibility; the budget owns every size/count rule).
|
|
182
|
-
const vision = visionBudget?.offer(filename, attachment.contentType, content);
|
|
183
|
-
const downloadUrl = await mintAttachmentDownloadUrl(storage, attachment.storageKey, filename);
|
|
184
|
-
injectedFiles.push({
|
|
185
|
-
filename,
|
|
186
|
-
path: mountPath,
|
|
187
|
-
sizeBytes: content.length,
|
|
188
|
-
...(renamedFrom !== undefined ? { renamedFrom } : {}),
|
|
189
|
-
...(vision?.kind === "accepted" ? { vision: vision.image } : {}),
|
|
190
|
-
...(vision?.kind === "degraded" ? { visionDegraded: vision.reason } : {}),
|
|
191
|
-
...(downloadUrl !== undefined ? { downloadUrl } : {}),
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
console.log(`[attachment-injector] Injected ${injectedFiles.length} file(s) into workspace`);
|
|
196
|
-
return injectedFiles;
|
|
197
|
-
}
|
|
198
|
-
function resolveMountPaths(attachments) {
|
|
199
|
-
const result = new Map();
|
|
200
|
-
const pathToAttachment = new Map();
|
|
201
|
-
// Pass 1: explicit mount paths claim their exact targets first. Two
|
|
202
|
-
// attachments explicitly pinning the SAME path is a user contradiction no
|
|
203
|
-
// rename can honestly resolve — keep rejecting with the actionable message.
|
|
204
|
-
for (const attachment of attachments) {
|
|
205
|
-
if (!attachment.mountPath)
|
|
206
|
-
continue;
|
|
207
|
-
const mountPath = resolveExplicitMountPath(attachment);
|
|
208
|
-
const existing = pathToAttachment.get(mountPath);
|
|
209
|
-
if (existing) {
|
|
210
|
-
throw new AttachmentInjectionError(attachment.filename, `mount path '${mountPath}' collides with attachment '${existing.filename}'. ` +
|
|
211
|
-
"Set distinct mountPath values on the attachments to resolve this conflict.");
|
|
212
|
-
}
|
|
213
|
-
pathToAttachment.set(mountPath, attachment);
|
|
214
|
-
result.set(attachment, { path: mountPath });
|
|
215
|
-
}
|
|
216
|
-
// Pass 2: default-derived names (`.stigmer/inputs/{filename}`) uniquify
|
|
217
|
-
// around everything already taken — other defaults AND explicit paths that
|
|
218
|
-
// landed inside the inputs prefix — instead of failing the execution
|
|
219
|
-
// (issue #364). The taken-set is seeded with the basenames the explicit
|
|
220
|
-
// pass claimed directly under the prefix.
|
|
221
|
-
const takenNames = new Set();
|
|
222
|
-
for (const path of pathToAttachment.keys()) {
|
|
223
|
-
if (path.startsWith(`${DEFAULT_INPUTS_PREFIX}/`)) {
|
|
224
|
-
const rest = path.slice(DEFAULT_INPUTS_PREFIX.length + 1);
|
|
225
|
-
if (rest.length > 0 && !rest.includes("/"))
|
|
226
|
-
takenNames.add(rest);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
for (const attachment of attachments) {
|
|
230
|
-
if (attachment.mountPath)
|
|
231
|
-
continue;
|
|
232
|
-
const { name, renamedFrom } = allocateUniqueName(deriveDefaultFilename(attachment), takenNames);
|
|
233
|
-
const path = `${DEFAULT_INPUTS_PREFIX}/${name}`;
|
|
234
|
-
pathToAttachment.set(path, attachment);
|
|
235
|
-
result.set(attachment, renamedFrom !== undefined ? { path, renamedFrom } : { path });
|
|
236
|
-
}
|
|
237
|
-
return result;
|
|
238
|
-
}
|
|
239
|
-
function resolveExplicitMountPath(attachment) {
|
|
240
|
-
const cleaned = attachment.mountPath.replace(/^\/+/, "");
|
|
241
|
-
if (cleaned.length === 0) {
|
|
242
|
-
throw new AttachmentInjectionError(attachment.filename, "mountPath resolves to an empty path after removing leading slashes");
|
|
243
|
-
}
|
|
244
|
-
// A caller-supplied mount path is untrusted. Stripping leading slashes does
|
|
245
|
-
// not stop `..` segments from climbing out of the workspace root on the
|
|
246
|
-
// non-`.stigmer/` branch (the `.stigmer/`-routed branch is already guarded
|
|
247
|
-
// by LocalWorkspaceBackend.resolvePath). Reject any path that normalizes to
|
|
248
|
-
// an escape before it reaches the backend write.
|
|
249
|
-
if (escapesRoot(cleaned)) {
|
|
250
|
-
throw new AttachmentInjectionError(attachment.filename, `mount path '${attachment.mountPath}' escapes the workspace root`);
|
|
251
|
-
}
|
|
252
|
-
return cleaned;
|
|
253
|
-
}
|
|
254
|
-
// Derives the single-component filename an attachment without an explicit
|
|
255
|
-
// mountPath materializes under (the name that pass 2 uniquifies).
|
|
256
|
-
function deriveDefaultFilename(attachment) {
|
|
257
|
-
const rawName = attachment.filename || deriveFilename(attachment.storageKey);
|
|
258
|
-
if (!rawName) {
|
|
259
|
-
throw new AttachmentInjectionError("(unknown)", "attachment has neither filename nor storageKey — cannot determine mount path");
|
|
260
|
-
}
|
|
261
|
-
// The filename is untrusted; reduce it to a single path component so it lands
|
|
262
|
-
// directly under the inputs prefix rather than steering the write elsewhere.
|
|
263
|
-
const filename = posix.basename(rawName);
|
|
264
|
-
if (filename === "" || filename === "." || filename === "..") {
|
|
265
|
-
throw new AttachmentInjectionError(rawName, `filename '${rawName}' does not yield a usable name for materialization`);
|
|
266
|
-
}
|
|
267
|
-
return filename;
|
|
268
|
-
}
|
|
269
|
-
// escapesRoot reports whether a workspace-relative mount path would climb out
|
|
270
|
-
// of the workspace root once normalized. Mount paths are forward-slash,
|
|
271
|
-
// workspace-relative strings, so posix normalization is the correct semantics.
|
|
272
|
-
function escapesRoot(relPath) {
|
|
273
|
-
const normalized = posix.normalize(relPath);
|
|
274
|
-
return (normalized === ".." ||
|
|
275
|
-
normalized.startsWith("../") ||
|
|
276
|
-
posix.isAbsolute(normalized));
|
|
277
|
-
}
|
|
278
|
-
function deriveFilename(storageKey) {
|
|
279
|
-
if (!storageKey)
|
|
280
|
-
return "";
|
|
281
|
-
const parts = storageKey.split("/");
|
|
282
|
-
return parts[parts.length - 1] || "";
|
|
283
|
-
}
|
|
284
|
-
async function downloadAttachment(attachment, storage, isLocalMode) {
|
|
285
|
-
// Local mode fast path: read directly from filesystem
|
|
286
|
-
if (isLocalMode && attachment.localPath) {
|
|
287
|
-
try {
|
|
288
|
-
return await readFile(attachment.localPath);
|
|
289
|
-
}
|
|
290
|
-
catch (err) {
|
|
291
|
-
throw new AttachmentInjectionError(attachment.filename, `failed to read local file '${attachment.localPath}': ${err instanceof Error ? err.message : String(err)}`);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
// Cloud mode: download via artifact storage
|
|
295
|
-
if (!attachment.storageKey) {
|
|
296
|
-
throw new AttachmentInjectionError(attachment.filename, "missing storageKey — cannot download attachment from storage");
|
|
297
|
-
}
|
|
298
|
-
// The attachment must come from storage, but the runner could not build one
|
|
299
|
-
// (proxy misconfig). Fail with an actionable message rather than dereferencing
|
|
300
|
-
// undefined — consistent with the degraded posture, never a silent skip.
|
|
301
|
-
if (!storage) {
|
|
302
|
-
throw new AttachmentInjectionError(attachment.filename, `artifact storage is unavailable, so this attachment (key: ${attachment.storageKey}) cannot be downloaded`);
|
|
303
|
-
}
|
|
304
|
-
try {
|
|
305
|
-
return await storage.download(attachment.storageKey);
|
|
306
|
-
}
|
|
307
|
-
catch (err) {
|
|
308
|
-
if (err instanceof AttachmentInjectionError)
|
|
309
|
-
throw err;
|
|
310
|
-
throw new AttachmentInjectionError(attachment.filename, `failed to download from storage (key: ${attachment.storageKey}): ${err instanceof Error ? err.message : String(err)}`);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
async function extractZipToWorkspace(entries, mountDir, backend, sourceFilename) {
|
|
314
|
-
const cleanMountDir = mountDir.replace(/\/+$/, "");
|
|
315
|
-
const injected = [];
|
|
316
|
-
for (const entry of entries) {
|
|
317
|
-
const content = await decompressEntry(entry, sourceFilename);
|
|
318
|
-
const targetPath = `${cleanMountDir}/${entry.relativePath}`;
|
|
319
|
-
await backend.writeFileBuffer(targetPath, content);
|
|
320
|
-
injected.push({
|
|
321
|
-
filename: posix.basename(entry.relativePath),
|
|
322
|
-
path: targetPath,
|
|
323
|
-
sizeBytes: content.length,
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
return injected;
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Decompress a validated entry, enforcing its declared uncompressed size.
|
|
330
|
-
*
|
|
331
|
-
* The size cap in parseAndValidateZip budgets *declared* sizes, which the
|
|
332
|
-
* archive author controls — a crafted archive can declare 1 KB and inflate
|
|
333
|
-
* to gigabytes. Enforcement is therefore two-sided and fail-hard: inflation
|
|
334
|
-
* aborts the moment output exceeds the declaration, and an undershoot (or a
|
|
335
|
-
* stored payload whose length disagrees) fails too, because a manifest that
|
|
336
|
-
* misdescribes its own contents is exactly the corrupt-input class this
|
|
337
|
-
* module must never extract from.
|
|
338
|
-
*/
|
|
339
|
-
async function decompressEntry(entry, sourceFilename) {
|
|
340
|
-
const declared = entry.uncompressedSize;
|
|
341
|
-
if (entry.compressionMethod === 0) {
|
|
342
|
-
if (entry.compressedData.length !== declared) {
|
|
343
|
-
throw new AttachmentValidationError(sourceFilename, `entry '${entry.relativePath}' payload is ${entry.compressedData.length} bytes ` +
|
|
344
|
-
`but the archive declares ${declared} — corrupt or crafted archive`);
|
|
345
|
-
}
|
|
346
|
-
return Buffer.from(entry.compressedData);
|
|
347
|
-
}
|
|
348
|
-
// Deflate — the only other method parseAndValidateZip admits.
|
|
349
|
-
return new Promise((resolve, reject) => {
|
|
350
|
-
const inflate = createInflateRaw();
|
|
351
|
-
const chunks = [];
|
|
352
|
-
let produced = 0;
|
|
353
|
-
inflate.on("data", (chunk) => {
|
|
354
|
-
produced += chunk.length;
|
|
355
|
-
if (produced > declared) {
|
|
356
|
-
inflate.destroy();
|
|
357
|
-
reject(new AttachmentValidationError(sourceFilename, `entry '${entry.relativePath}' decompresses past its declared size of ` +
|
|
358
|
-
`${declared} bytes — corrupt or crafted archive`));
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
chunks.push(chunk);
|
|
362
|
-
});
|
|
363
|
-
inflate.on("end", () => {
|
|
364
|
-
if (produced !== declared) {
|
|
365
|
-
reject(new AttachmentValidationError(sourceFilename, `entry '${entry.relativePath}' decompressed to ${produced} bytes ` +
|
|
366
|
-
`but the archive declares ${declared} — corrupt or crafted archive`));
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
resolve(Buffer.concat(chunks));
|
|
370
|
-
});
|
|
371
|
-
inflate.on("error", reject);
|
|
372
|
-
inflate.end(Buffer.from(entry.compressedData));
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
function hasPathTraversal(filePath) {
|
|
376
|
-
const normalized = posix.normalize(filePath);
|
|
377
|
-
if (normalized.startsWith("../") || normalized === "..")
|
|
378
|
-
return true;
|
|
379
|
-
const segments = filePath.split(/[/\\]/);
|
|
380
|
-
for (const seg of segments) {
|
|
381
|
-
if (seg === "..")
|
|
382
|
-
return true;
|
|
383
|
-
}
|
|
384
|
-
return false;
|
|
385
|
-
}
|
|
386
|
-
//# sourceMappingURL=attachment-injector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-injector.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/attachment-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Approved-command turn provenance (DD-28) — the DEEP-AGENT (native) harness
|
|
3
|
-
* adapter over the shared qualification rule ({@link qualifyTurnCommandProvenance}).
|
|
4
|
-
*
|
|
5
|
-
* The deep-agent's consent model differs from Cursor's in exactly two ways, and
|
|
6
|
-
* this adapter is precisely those two differences:
|
|
7
|
-
*
|
|
8
|
-
* 1. IDENTITY turn scoping (not positional). Cursor scopes a turn by the message
|
|
9
|
-
* index its stream started at. The deep-agent cannot: an approved command
|
|
10
|
-
* executes IN PLACE at its seeded transcript position (it was proposed in a
|
|
11
|
-
* prior segment, seeded into this segment, and updated to COMPLETED by
|
|
12
|
-
* `StatusBuilder.findResumableSeededToolCall`). So "this turn's calls" are
|
|
13
|
-
* those whose id is absent from a pre-stream {@link collectSettledToolCallIds}
|
|
14
|
-
* snapshot, and "executed" is a COMPLETED status.
|
|
15
|
-
*
|
|
16
|
-
* 2. SAME-ROW direct consent (not a grant token). A gated deep-agent tool pauses
|
|
17
|
-
* on a LangGraph interrupt; SubmitApproval writes `approval_action` onto that
|
|
18
|
-
* same row, and the row keeps its id + `approval_action` when it executes on
|
|
19
|
-
* resume. So the executed command IS its own consent row — cite its own id.
|
|
20
|
-
* (The server's PreserveApprovalFields keeps that `approval_action` on the row
|
|
21
|
-
* across the status write regardless of its new status, so the backend's
|
|
22
|
-
* verification finds it.)
|
|
23
|
-
*
|
|
24
|
-
* A turn that delegated ANY sub-agent fails closed (DD-28 D1: "delegated zero
|
|
25
|
-
* sub-agents"). A sub-agent's writes fold into the parent turn's change set
|
|
26
|
-
* (DD-19) but are not attributable to a consented top-level command. The
|
|
27
|
-
* top-level `task` call (a SUBAGENT kind) already trips the shared rule's
|
|
28
|
-
* `!== SHELL` fail-closed; the explicit sub-agent-novelty guard below also covers
|
|
29
|
-
* the (currently-impossible under the replace-per-turn model) case of a sub-agent
|
|
30
|
-
* that mutates across a turn boundary without a fresh top-level `task` row.
|
|
31
|
-
*
|
|
32
|
-
* (Trust boundary + fail-closed contract: see the shared module.)
|
|
33
|
-
*/
|
|
34
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
35
|
-
import type { TurnCommandProvenance } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
36
|
-
export interface DeepAgentCommandProvenanceInputs {
|
|
37
|
-
/** The status at capture time — top-level messages + sub-agent executions. */
|
|
38
|
-
readonly status: AgentExecutionStatus;
|
|
39
|
-
/**
|
|
40
|
-
* The top-level tool-call ids that had already SETTLED before this turn's
|
|
41
|
-
* stream (from {@link collectSettledToolCallIds}). A top-level call whose id is
|
|
42
|
-
* absent is this-turn's; the shared rule then keeps only the COMPLETED ones.
|
|
43
|
-
*/
|
|
44
|
-
readonly priorSettledToolCallIds: ReadonlySet<string>;
|
|
45
|
-
/**
|
|
46
|
-
* The sub-agent tool-call ids that existed before this turn's stream (from
|
|
47
|
-
* {@link collectSubAgentToolCallIds}). Any growth means a sub-agent acted this
|
|
48
|
-
* turn → fail closed.
|
|
49
|
-
*/
|
|
50
|
-
readonly priorSubAgentToolCallIds: ReadonlySet<string>;
|
|
51
|
-
/** True when the pre-armed spec.auto_approve_all bypassed the gate. */
|
|
52
|
-
readonly globalBypass: boolean;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Derive the {@link TurnCommandProvenance} for a deep-agent turn, or undefined
|
|
56
|
-
* when it does not qualify. Scopes this turn's top-level calls by id-novelty,
|
|
57
|
-
* resolves consent from the row's own server-authored `approval_action`, fails
|
|
58
|
-
* closed on any sub-agent activity, and delegates the DD-28 rule to
|
|
59
|
-
* {@link qualifyTurnCommandProvenance}.
|
|
60
|
-
*/
|
|
61
|
-
export declare function deriveTurnCommandProvenance(inputs: DeepAgentCommandProvenanceInputs): TurnCommandProvenance | undefined;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Approved-command turn provenance (DD-28) — the DEEP-AGENT (native) harness
|
|
3
|
-
* adapter over the shared qualification rule ({@link qualifyTurnCommandProvenance}).
|
|
4
|
-
*
|
|
5
|
-
* The deep-agent's consent model differs from Cursor's in exactly two ways, and
|
|
6
|
-
* this adapter is precisely those two differences:
|
|
7
|
-
*
|
|
8
|
-
* 1. IDENTITY turn scoping (not positional). Cursor scopes a turn by the message
|
|
9
|
-
* index its stream started at. The deep-agent cannot: an approved command
|
|
10
|
-
* executes IN PLACE at its seeded transcript position (it was proposed in a
|
|
11
|
-
* prior segment, seeded into this segment, and updated to COMPLETED by
|
|
12
|
-
* `StatusBuilder.findResumableSeededToolCall`). So "this turn's calls" are
|
|
13
|
-
* those whose id is absent from a pre-stream {@link collectSettledToolCallIds}
|
|
14
|
-
* snapshot, and "executed" is a COMPLETED status.
|
|
15
|
-
*
|
|
16
|
-
* 2. SAME-ROW direct consent (not a grant token). A gated deep-agent tool pauses
|
|
17
|
-
* on a LangGraph interrupt; SubmitApproval writes `approval_action` onto that
|
|
18
|
-
* same row, and the row keeps its id + `approval_action` when it executes on
|
|
19
|
-
* resume. So the executed command IS its own consent row — cite its own id.
|
|
20
|
-
* (The server's PreserveApprovalFields keeps that `approval_action` on the row
|
|
21
|
-
* across the status write regardless of its new status, so the backend's
|
|
22
|
-
* verification finds it.)
|
|
23
|
-
*
|
|
24
|
-
* A turn that delegated ANY sub-agent fails closed (DD-28 D1: "delegated zero
|
|
25
|
-
* sub-agents"). A sub-agent's writes fold into the parent turn's change set
|
|
26
|
-
* (DD-19) but are not attributable to a consented top-level command. The
|
|
27
|
-
* top-level `task` call (a SUBAGENT kind) already trips the shared rule's
|
|
28
|
-
* `!== SHELL` fail-closed; the explicit sub-agent-novelty guard below also covers
|
|
29
|
-
* the (currently-impossible under the replace-per-turn model) case of a sub-agent
|
|
30
|
-
* that mutates across a turn boundary without a fresh top-level `task` row.
|
|
31
|
-
*
|
|
32
|
-
* (Trust boundary + fail-closed contract: see the shared module.)
|
|
33
|
-
*/
|
|
34
|
-
import { ApprovalAction, ToolCallStatus, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
35
|
-
import { qualifyTurnCommandProvenance } from "../../shared/filereview/command-provenance.js";
|
|
36
|
-
import { collectSubAgentToolCallIds } from "../../shared/tool-row.js";
|
|
37
|
-
/**
|
|
38
|
-
* Derive the {@link TurnCommandProvenance} for a deep-agent turn, or undefined
|
|
39
|
-
* when it does not qualify. Scopes this turn's top-level calls by id-novelty,
|
|
40
|
-
* resolves consent from the row's own server-authored `approval_action`, fails
|
|
41
|
-
* closed on any sub-agent activity, and delegates the DD-28 rule to
|
|
42
|
-
* {@link qualifyTurnCommandProvenance}.
|
|
43
|
-
*/
|
|
44
|
-
export function deriveTurnCommandProvenance(inputs) {
|
|
45
|
-
const { status, priorSettledToolCallIds, priorSubAgentToolCallIds, globalBypass } = inputs;
|
|
46
|
-
// DD-28 D1 cond 2: any sub-agent activity this turn disqualifies. A sub-agent
|
|
47
|
-
// that ran this turn contributes at least one tool-call id absent from the
|
|
48
|
-
// pre-stream snapshot.
|
|
49
|
-
for (const id of collectSubAgentToolCallIds(status.subAgentExecutions)) {
|
|
50
|
-
if (!priorSubAgentToolCallIds.has(id))
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
const messages = status.messages;
|
|
54
|
-
// This turn's top-level calls: those not already settled before the stream.
|
|
55
|
-
const turnToolCalls = messages
|
|
56
|
-
.flatMap((m) => m.toolCalls)
|
|
57
|
-
.filter((tc) => !priorSettledToolCallIds.has(tc.id));
|
|
58
|
-
return qualifyTurnCommandProvenance({
|
|
59
|
-
turnToolCalls,
|
|
60
|
-
messages,
|
|
61
|
-
// A deep-agent command executed iff its row reached COMPLETED this turn.
|
|
62
|
-
isExecutedCommand: (tc) => tc.status === ToolCallStatus.TOOL_CALL_COMPLETED,
|
|
63
|
-
// The gated command carries its own server-authored approval_action, written
|
|
64
|
-
// in place by SubmitApproval and preserved when the row executes on resume.
|
|
65
|
-
resolveDirectConsent: (tc) => tc.approvalAction === ApprovalAction.APPROVE ||
|
|
66
|
-
tc.approvalAction === ApprovalAction.APPROVE_ALL
|
|
67
|
-
? tc.id
|
|
68
|
-
: undefined,
|
|
69
|
-
globalBypass,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=command-provenance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-provenance.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/command-provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,GACf,MAAM,8DAA8D,CAAC;AAGtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAqBtE;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAwC;IAExC,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE3F,8EAA8E;IAC9E,2EAA2E;IAC3E,uBAAuB;IACvB,KAAK,MAAM,EAAE,IAAI,0BAA0B,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,SAAS,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,4EAA4E;IAC5E,MAAM,aAAa,GAAG,QAAQ;SAC3B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC3B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvD,OAAO,4BAA4B,CAAC;QAClC,aAAa;QACb,QAAQ;QACR,yEAAyE;QACzE,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,cAAc,CAAC,mBAAmB;QAC3E,6EAA6E;QAC7E,4EAA4E;QAC5E,oBAAoB,EAAE,CAAC,EAAE,EAAE,EAAE,CAC3B,EAAE,CAAC,cAAc,KAAK,cAAc,CAAC,OAAO;YAC5C,EAAE,CAAC,cAAc,KAAK,cAAc,CAAC,WAAW;YAC9C,CAAC,CAAC,EAAE,CAAC,EAAE;YACP,CAAC,CAAC,SAAS;QACf,YAAY;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment variable resolution for deep agent execution.
|
|
3
|
-
*
|
|
4
|
-
* Resolves the merged environment from ExecutionContext — the single
|
|
5
|
-
* source of truth for execution-scoped variables. The workflow injects
|
|
6
|
-
* all resolved variables into ExecutionContext before the activity starts.
|
|
7
|
-
*
|
|
8
|
-
* The returned result separates plaintext keys from secret keys so that
|
|
9
|
-
* downstream consumers (e.g., StatusBuilder in Phase 3b) can redact
|
|
10
|
-
* secret values in user-facing displays.
|
|
11
|
-
*/
|
|
12
|
-
import type { StigmerClient } from "../../client/stigmer-client.js";
|
|
13
|
-
export interface EnvironmentResult {
|
|
14
|
-
readonly mergedEnvVars: Record<string, string>;
|
|
15
|
-
readonly secretKeys: ReadonlySet<string>;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Fetch the ExecutionContext for the given execution and extract the
|
|
19
|
-
* merged environment variables.
|
|
20
|
-
*
|
|
21
|
-
* If no ExecutionContext exists (e.g., the agent has no environment or
|
|
22
|
-
* secrets configured), returns an empty result so execution can proceed.
|
|
23
|
-
*/
|
|
24
|
-
export declare function resolveEnvironment(client: StigmerClient, executionId: string): Promise<EnvironmentResult>;
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment variable resolution for deep agent execution.
|
|
3
|
-
*
|
|
4
|
-
* Resolves the merged environment from ExecutionContext — the single
|
|
5
|
-
* source of truth for execution-scoped variables. The workflow injects
|
|
6
|
-
* all resolved variables into ExecutionContext before the activity starts.
|
|
7
|
-
*
|
|
8
|
-
* The returned result separates plaintext keys from secret keys so that
|
|
9
|
-
* downstream consumers (e.g., StatusBuilder in Phase 3b) can redact
|
|
10
|
-
* secret values in user-facing displays.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Fetch the ExecutionContext for the given execution and extract the
|
|
14
|
-
* merged environment variables.
|
|
15
|
-
*
|
|
16
|
-
* If no ExecutionContext exists (e.g., the agent has no environment or
|
|
17
|
-
* secrets configured), returns an empty result so execution can proceed.
|
|
18
|
-
*/
|
|
19
|
-
export async function resolveEnvironment(client, executionId) {
|
|
20
|
-
// A desktop runner exchanges its bootstrap credential for a token scoped to
|
|
21
|
-
// this execution's session, so cloud's decrypt gate binds the read (#156).
|
|
22
|
-
// No-op for cloud sandbox and OSS runners. A failed exchange throws and
|
|
23
|
-
// fails the activity: the bootstrap credential no longer decrypts
|
|
24
|
-
// (stigmer-cloud#218), so proceeding would resolve redacted placeholders.
|
|
25
|
-
const scopedToken = await client.acquireScopedRunnerToken({
|
|
26
|
-
agentExecutionId: executionId,
|
|
27
|
-
});
|
|
28
|
-
let execCtx;
|
|
29
|
-
try {
|
|
30
|
-
execCtx = await client.getExecutionContextByExecutionId(executionId, scopedToken);
|
|
31
|
-
}
|
|
32
|
-
catch (err) {
|
|
33
|
-
// ConnectError uses numeric Code.NotFound (5); match the pattern
|
|
34
|
-
// from shared/env-resolver.ts.
|
|
35
|
-
const code = err?.code;
|
|
36
|
-
if (code === 5 || code === "not_found" || code === "NOT_FOUND") {
|
|
37
|
-
console.log(`[env] No ExecutionContext found for execution ${executionId} — ` +
|
|
38
|
-
`proceeding with empty environment.`);
|
|
39
|
-
return { mergedEnvVars: {}, secretKeys: new Set() };
|
|
40
|
-
}
|
|
41
|
-
throw err;
|
|
42
|
-
}
|
|
43
|
-
const mergedEnvVars = {};
|
|
44
|
-
const secretKeys = new Set();
|
|
45
|
-
const data = execCtx.spec?.data;
|
|
46
|
-
if (data) {
|
|
47
|
-
for (const [key, execValue] of Object.entries(data)) {
|
|
48
|
-
mergedEnvVars[key] = execValue.value;
|
|
49
|
-
if (execValue.isSecret) {
|
|
50
|
-
secretKeys.add(key);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
console.log(`[env] Resolved environment: env_count=${Object.keys(mergedEnvVars).length}, ` +
|
|
55
|
-
`secret_count=${secretKeys.size}`);
|
|
56
|
-
return { mergedEnvVars, secretKeys };
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=environment.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAqB,EACrB,WAAmB;IAEnB,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,kEAAkE;IAClE,0EAA0E;IAC1E,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC;QACxD,gBAAgB,EAAE,WAAW;KAC9B,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,iEAAiE;QACjE,+BAA+B;QAC/B,MAAM,IAAI,GAAI,GAAkC,EAAE,IAAI,CAAC;QACvD,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CACT,iDAAiD,WAAW,KAAK;gBACjE,oCAAoC,CACrC,CAAC;YACF,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;IAChC,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;YACrC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACvB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,yCAAyC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,IAAI;QAC9E,gBAAgB,UAAU,CAAC,IAAI,EAAE,CAClC,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC"}
|