@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
package/README.md
CHANGED
|
@@ -159,7 +159,7 @@ All configuration is environment-driven. Names and defaults below are verified a
|
|
|
159
159
|
| `STIGMER_PROXY_ENDPOINT` | Proxy/cloud | No | _(none)_ | Stigmer proxy endpoint. When set, activates proxy transport: Cursor SDK traffic and artifact uploads are routed through the proxy. |
|
|
160
160
|
| `WORKSPACE_ROOT_DIR` | All | No | `~/.stigmer/workspaces/runner` (fallback) | Root directory for agent workspaces. If unset, the runner warns and creates an isolated fallback directory — it never falls back to the process working directory. |
|
|
161
161
|
| `TEMPORAL_MAX_CONCURRENCY` | All | No | `5` | Maximum concurrent Temporal activity executions (per session Worker in manager mode). |
|
|
162
|
-
| `STIGMER_CHECKPOINTER_TYPE` | All | No | `
|
|
162
|
+
| `STIGMER_CHECKPOINTER_TYPE` | All | No | `sqlite` (local), `http` (cloud) | LangGraph checkpointer backend for the native harness's agent state: `sqlite` (a durable per-session file under the platform dir, so a paused or interrupted run resumes across invocations), `http` (the proxy-backed saver), or `memory` (ephemeral; test runs only — a paused run cannot resume on it). |
|
|
163
163
|
| `STIGMER_CHECKPOINTER_PROXY_ENDPOINT` | `http` checkpointer | No | value of `STIGMER_PROXY_ENDPOINT` | Endpoint for the HTTP checkpointer; falls back to the proxy endpoint. |
|
|
164
164
|
| `STIGMER_PRIMARY_MODEL` | All | No | `gpt-4.1` | Default LLM model identifier. |
|
|
165
165
|
| `STIGMER_CURSOR_CLOUD_MODE_ENABLED` | All | No | `false` | When `true`, enables Cursor cloud (workspace-less) execution mode for the Cursor harness. |
|
|
@@ -223,12 +223,10 @@ These tune internal behavior or support testing. Most operators never set them.
|
|
|
223
223
|
| `STREAMING_MIN_INTERVAL_MS` | `500` | Minimum time between streaming status updates (rate limit). |
|
|
224
224
|
| `STREAMING_MAX_INTERVAL_MS` | `5000` | Maximum time before a forced keepalive status update. Clamped up to the min if set lower. |
|
|
225
225
|
| `STREAMING_BURST_THRESHOLD` | `50` | Event count that triggers an immediate status update (burst protection). |
|
|
226
|
-
| `LANGGRAPH_STREAM_EVENTS_VERSION` | `v3` | Selects the LangGraph streaming events version; `v2` opts into the older path. |
|
|
227
226
|
| `SKIP_MCP_CONNECT_BACKFILL` | `false` | When `true`, skips MCP Connect backfill. |
|
|
228
227
|
| `STIGMER_MCP_PUBLIC_ENDPOINT` | _(none)_ | Public endpoint injected as `STIGMER_SERVER_ADDRESS` into MCP server environments that request it. |
|
|
229
228
|
| `CURSOR_EVENT_RECORD_DIR` | _(none)_ | Directory to record Cursor harness events (debugging/fixtures). |
|
|
230
|
-
| `
|
|
231
|
-
| `V3_EVENT_RECORD_DIR` | _(none)_ | Directory to record deep-agent v3 streaming events. |
|
|
229
|
+
| `V3_EVENT_RECORD_DIR` | _(none)_ | Directory to record deep-agent harness events (debugging/fixtures). |
|
|
232
230
|
| `RECORD_FIXTURES` | `0` | When `1`, records HTTP fixtures for replay-based tests. |
|
|
233
231
|
|
|
234
232
|
## Related documentation
|
package/dist/.build-fingerprint
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"hash":"
|
|
1
|
+
{"hash":"672a3b424dba85d8","builtAt":"2026-09-13T22:38:59.150Z","fileCount":325}
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* tests use the defaults. Ids are fixed so goldens are readable and
|
|
12
12
|
* byte-stable.
|
|
13
13
|
*/
|
|
14
|
+
import { type JsonObject } from "@bufbuild/protobuf";
|
|
14
15
|
import type { WorkspaceEntry } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
|
|
16
|
+
import { type SubAgent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb";
|
|
15
17
|
import { ExecutionRecord, type ExecutionRecordInput } from "./hermetic-activity.js";
|
|
16
18
|
/** The ids a record's four resources carry. */
|
|
17
19
|
export interface ExecutionRecordIds {
|
|
@@ -40,6 +42,18 @@ export interface ExecutionRecordOptions {
|
|
|
40
42
|
* a scenario can state its overrun exactly (600 000 input tokens = $0.60).
|
|
41
43
|
*/
|
|
42
44
|
readonly maxCostUsd?: number;
|
|
45
|
+
/**
|
|
46
|
+
* `ExecutionConfig.max_tool_rounds`: the hard tool-round budget the engine
|
|
47
|
+
* enforces (native: LangGraph's `recursionLimit`, `shared/tool-rounds.ts`).
|
|
48
|
+
* Omitted or 0 = unlimited, the proto's default. Clamped to the floor of 10
|
|
49
|
+
* by the runner, so a scenario that wants the limit reached scripts a model
|
|
50
|
+
* that keeps calling tools (`repeatLast`).
|
|
51
|
+
*/
|
|
52
|
+
readonly maxToolRounds?: number;
|
|
53
|
+
/** `ExecutionConfig.structured_output_schema`: a JSON schema the agent's answer must match. */
|
|
54
|
+
readonly structuredOutputSchema?: JsonObject;
|
|
55
|
+
/** The agent's declared sub-agents (`AgentSpec.sub_agents`). */
|
|
56
|
+
readonly subAgents?: SubAgent[];
|
|
43
57
|
/** The control plane's STOP lever; see `ExecutionRecordInput.controlSignal`. */
|
|
44
58
|
readonly controlSignal?: ExecutionRecordInput["controlSignal"];
|
|
45
59
|
readonly ids?: ExecutionRecordIds;
|
|
@@ -42,6 +42,9 @@ export function executionRecordFixture(options) {
|
|
|
42
42
|
executionConfig: create(ExecutionConfigSchema, {
|
|
43
43
|
modelName: options.modelName ?? FIXTURE_MODEL,
|
|
44
44
|
maxCostUsd: options.maxCostUsd ?? 0,
|
|
45
|
+
maxToolRounds: options.maxToolRounds ?? 0,
|
|
46
|
+
// A `google.protobuf.Struct` field is a plain `JsonObject` in protobuf-es.
|
|
47
|
+
structuredOutputSchema: options.structuredOutputSchema,
|
|
45
48
|
}),
|
|
46
49
|
}),
|
|
47
50
|
});
|
|
@@ -61,6 +64,7 @@ export function executionRecordFixture(options) {
|
|
|
61
64
|
spec: create(AgentSpecSchema, {
|
|
62
65
|
description: "Hermetic fixture agent",
|
|
63
66
|
instructions: options.instructions ?? "You are the hermetic fixture agent. Answer briefly.",
|
|
67
|
+
subAgents: options.subAgents ?? [],
|
|
64
68
|
}),
|
|
65
69
|
});
|
|
66
70
|
return new ExecutionRecord({ execution, session, agentInstance, agent, controlSignal: options.controlSignal });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-record-fixture.js","sourceRoot":"","sources":["../../src/__test-utils__/execution-record-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"execution-record-fixture.js","sourceRoot":"","sources":["../../src/__test-utils__/execution-record-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The server's `file_change_sets` projection, mirrored for the hermetic
|
|
3
|
+
* record — the ONE place a runner test stands in for the control plane's
|
|
4
|
+
* fold of the file-review ledger.
|
|
5
|
+
*
|
|
6
|
+
* Production: the runner authors BASELINE_CAPTURED and CANDIDATE_CAPTURED
|
|
7
|
+
* onto `status.file_review_event_stream`; the server folds the stream into
|
|
8
|
+
* `status.file_change_sets` (`stigmer-server/src/domain/agentexecution/
|
|
9
|
+
* filereview/project.ts` `applyEvent` and `deriveStatusAfterCandidate`);
|
|
10
|
+
* `SubmitFileDecision` appends FILE_DECIDED events and re-folds; the runtime's
|
|
11
|
+
* reinvocation reads the DECIDED sets back and reconciles the tree
|
|
12
|
+
* (`harness/turn-context.ts` `reconcileReinvocation`). The hermetic
|
|
13
|
+
* `ExecutionRecord` is the server here, so it must fold the same way — and
|
|
14
|
+
* only for the fields the reconcile reads: `id`, `status`, `decisions`,
|
|
15
|
+
* `changes` (their `id`, `beforeSha256`, `afterSha256`), `candidateSnapshot`.
|
|
16
|
+
*
|
|
17
|
+
* Mirrored, not imported: the runner is a standalone package and cannot
|
|
18
|
+
* reach the server's source. If `project.ts` changes the fold, THIS file is
|
|
19
|
+
* the one to change beside it; the conformance suite's file-review files
|
|
20
|
+
* (`test/conformance/src/suites-execution/agentexecution-file-review*`) are
|
|
21
|
+
* the arbiter that the two still agree, through the real server.
|
|
22
|
+
*/
|
|
23
|
+
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
24
|
+
import { type FileChangeSet, type FileReviewEvent } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
25
|
+
/** Fold the ledger into change sets, in first-seen order (`project.ts` `projectFileChangeSets`). */
|
|
26
|
+
export declare function projectFileChangeSets(events: readonly FileReviewEvent[]): FileChangeSet[];
|
|
27
|
+
/** The paths a reviewer decides, by workspace-relative path (the change's `path_after || path_before`). */
|
|
28
|
+
export interface FileReviewVerdicts {
|
|
29
|
+
readonly approve?: readonly string[];
|
|
30
|
+
readonly reject?: readonly string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* What the server's `SubmitFileDecision` leaves on the status once every
|
|
34
|
+
* change of every captured set has a per-file verdict: the sets projected
|
|
35
|
+
* from the ledger the runner persisted, each DECIDED, with one FILE-scoped
|
|
36
|
+
* decision per change. A path in neither list is a test bug and throws
|
|
37
|
+
* (the reconcile treats an undecided change as rejected, which would hide
|
|
38
|
+
* the mistake). Returns the number of decisions written.
|
|
39
|
+
*/
|
|
40
|
+
export declare function decideCapturedFileChanges(status: AgentExecutionStatus, verdicts: FileReviewVerdicts, decidedAt: string): number;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The server's `file_change_sets` projection, mirrored for the hermetic
|
|
3
|
+
* record — the ONE place a runner test stands in for the control plane's
|
|
4
|
+
* fold of the file-review ledger.
|
|
5
|
+
*
|
|
6
|
+
* Production: the runner authors BASELINE_CAPTURED and CANDIDATE_CAPTURED
|
|
7
|
+
* onto `status.file_review_event_stream`; the server folds the stream into
|
|
8
|
+
* `status.file_change_sets` (`stigmer-server/src/domain/agentexecution/
|
|
9
|
+
* filereview/project.ts` `applyEvent` and `deriveStatusAfterCandidate`);
|
|
10
|
+
* `SubmitFileDecision` appends FILE_DECIDED events and re-folds; the runtime's
|
|
11
|
+
* reinvocation reads the DECIDED sets back and reconciles the tree
|
|
12
|
+
* (`harness/turn-context.ts` `reconcileReinvocation`). The hermetic
|
|
13
|
+
* `ExecutionRecord` is the server here, so it must fold the same way — and
|
|
14
|
+
* only for the fields the reconcile reads: `id`, `status`, `decisions`,
|
|
15
|
+
* `changes` (their `id`, `beforeSha256`, `afterSha256`), `candidateSnapshot`.
|
|
16
|
+
*
|
|
17
|
+
* Mirrored, not imported: the runner is a standalone package and cannot
|
|
18
|
+
* reach the server's source. If `project.ts` changes the fold, THIS file is
|
|
19
|
+
* the one to change beside it; the conformance suite's file-review files
|
|
20
|
+
* (`test/conformance/src/suites-execution/agentexecution-file-review*`) are
|
|
21
|
+
* the arbiter that the two still agree, through the real server.
|
|
22
|
+
*/
|
|
23
|
+
import { create } from "@bufbuild/protobuf";
|
|
24
|
+
import { FileChangeSetStatus, FileDecisionAction, FileDecisionOrigin, FileDecisionScope, FileReviewEventType, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
25
|
+
import { FileChangeSetSchema, FileDecisionSchema, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
26
|
+
/** Fold the ledger into change sets, in first-seen order (`project.ts` `projectFileChangeSets`). */
|
|
27
|
+
export function projectFileChangeSets(events) {
|
|
28
|
+
const order = [];
|
|
29
|
+
const byId = new Map();
|
|
30
|
+
for (const ev of events) {
|
|
31
|
+
if (ev.changeSetId === "")
|
|
32
|
+
continue;
|
|
33
|
+
let cs = byId.get(ev.changeSetId);
|
|
34
|
+
if (!cs) {
|
|
35
|
+
cs = create(FileChangeSetSchema, { id: ev.changeSetId });
|
|
36
|
+
byId.set(ev.changeSetId, cs);
|
|
37
|
+
order.push(ev.changeSetId);
|
|
38
|
+
}
|
|
39
|
+
applyEvent(cs, ev);
|
|
40
|
+
}
|
|
41
|
+
return order.map((id) => byId.get(id));
|
|
42
|
+
}
|
|
43
|
+
/** One event into one set (`project.ts` `applyEvent`); terminal statuses are never downgraded. */
|
|
44
|
+
function applyEvent(cs, ev) {
|
|
45
|
+
switch (ev.eventType) {
|
|
46
|
+
case FileReviewEventType.BASELINE_CAPTURED:
|
|
47
|
+
if (ev.payload.case === "baselineCaptured") {
|
|
48
|
+
cs.turnId = ev.payload.value.turnId;
|
|
49
|
+
cs.harnessId = ev.payload.value.harnessId;
|
|
50
|
+
cs.baselineSnapshot = ev.payload.value.baselineSnapshot;
|
|
51
|
+
}
|
|
52
|
+
cs.status = FileChangeSetStatus.CAPTURING;
|
|
53
|
+
break;
|
|
54
|
+
case FileReviewEventType.CANDIDATE_CAPTURED:
|
|
55
|
+
if (ev.payload.case === "candidateCaptured") {
|
|
56
|
+
cs.candidateSnapshot = ev.payload.value.candidateSnapshot;
|
|
57
|
+
cs.changes = ev.payload.value.changes;
|
|
58
|
+
cs.aggregateDigest = ev.payload.value.aggregateDigest;
|
|
59
|
+
cs.diffCompleteness = ev.payload.value.diffCompleteness;
|
|
60
|
+
}
|
|
61
|
+
cs.status = deriveStatusAfterCandidate(cs);
|
|
62
|
+
break;
|
|
63
|
+
case FileReviewEventType.FILE_DECIDED:
|
|
64
|
+
if (ev.payload.case === "fileDecided")
|
|
65
|
+
cs.decisions.push(ev.payload.value);
|
|
66
|
+
cs.status = deriveStatusAfterCandidate(cs);
|
|
67
|
+
break;
|
|
68
|
+
case FileReviewEventType.RECONCILED:
|
|
69
|
+
if (ev.payload.case === "reconciled")
|
|
70
|
+
cs.approvedSnapshot = ev.payload.value.approvedSnapshot;
|
|
71
|
+
cs.status = FileChangeSetStatus.RECONCILED;
|
|
72
|
+
break;
|
|
73
|
+
case FileReviewEventType.FAILED:
|
|
74
|
+
cs.status = FileChangeSetStatus.FAILED;
|
|
75
|
+
break;
|
|
76
|
+
default:
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function deriveStatusAfterCandidate(cs) {
|
|
81
|
+
if (cs.status === FileChangeSetStatus.RECONCILED || cs.status === FileChangeSetStatus.FAILED)
|
|
82
|
+
return cs.status;
|
|
83
|
+
return isFullyDecided(cs) ? FileChangeSetStatus.DECIDED : FileChangeSetStatus.AWAITING_REVIEW;
|
|
84
|
+
}
|
|
85
|
+
function isFullyDecided(cs) {
|
|
86
|
+
if (cs.changes.length === 0)
|
|
87
|
+
return false;
|
|
88
|
+
const decided = new Set();
|
|
89
|
+
for (const d of cs.decisions) {
|
|
90
|
+
if (d.scope === FileDecisionScope.CHANGE_SET)
|
|
91
|
+
return true;
|
|
92
|
+
if (d.scope === FileDecisionScope.FILE)
|
|
93
|
+
decided.add(d.fileChangeId);
|
|
94
|
+
}
|
|
95
|
+
return cs.changes.every((c) => decided.has(c.id));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* What the server's `SubmitFileDecision` leaves on the status once every
|
|
99
|
+
* change of every captured set has a per-file verdict: the sets projected
|
|
100
|
+
* from the ledger the runner persisted, each DECIDED, with one FILE-scoped
|
|
101
|
+
* decision per change. A path in neither list is a test bug and throws
|
|
102
|
+
* (the reconcile treats an undecided change as rejected, which would hide
|
|
103
|
+
* the mistake). Returns the number of decisions written.
|
|
104
|
+
*/
|
|
105
|
+
export function decideCapturedFileChanges(status, verdicts, decidedAt) {
|
|
106
|
+
const approve = new Set(verdicts.approve ?? []);
|
|
107
|
+
const reject = new Set(verdicts.reject ?? []);
|
|
108
|
+
const sets = projectFileChangeSets(status.fileReviewEventStream?.events ?? []);
|
|
109
|
+
let decisions = 0;
|
|
110
|
+
for (const cs of sets) {
|
|
111
|
+
if (cs.status !== FileChangeSetStatus.AWAITING_REVIEW)
|
|
112
|
+
continue;
|
|
113
|
+
for (const change of cs.changes) {
|
|
114
|
+
const path = change.pathAfter || change.pathBefore;
|
|
115
|
+
const action = approve.has(path) ? FileDecisionAction.APPROVE : reject.has(path) ? FileDecisionAction.REJECT : undefined;
|
|
116
|
+
if (action === undefined)
|
|
117
|
+
throw new Error(`decideCapturedFileChanges: no verdict for '${path}' in change set '${cs.id}' (test bug)`);
|
|
118
|
+
cs.decisions.push(create(FileDecisionSchema, {
|
|
119
|
+
id: `${cs.id}:decision:${decisions}`,
|
|
120
|
+
changeSetId: cs.id,
|
|
121
|
+
scope: FileDecisionScope.FILE,
|
|
122
|
+
fileChangeId: change.id,
|
|
123
|
+
action,
|
|
124
|
+
expectedDigest: change.fileDigest,
|
|
125
|
+
reviewerId: "kit-reviewer",
|
|
126
|
+
decidedAt,
|
|
127
|
+
origin: FileDecisionOrigin.USER,
|
|
128
|
+
}));
|
|
129
|
+
decisions += 1;
|
|
130
|
+
}
|
|
131
|
+
cs.status = deriveStatusAfterCandidate(cs);
|
|
132
|
+
}
|
|
133
|
+
status.fileChangeSets = sets;
|
|
134
|
+
return decisions;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=file-review-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-review-projection.js","sourceRoot":"","sources":["../../src/__test-utils__/file-review-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,7 +53,15 @@ import type { TurnInputFixtureOverrides } from "../turn-input-fixture.js";
|
|
|
53
53
|
* ends `failed` on the given surface (`engine` unless the scenario says
|
|
54
54
|
* otherwise — the runtime's three failure copies are its own invariant).
|
|
55
55
|
* - `cancelled`: the engine ends its own run cancelled with nothing to
|
|
56
|
-
* wait for (an SDK-side cancel); the turn ends `cancelled`.
|
|
56
|
+
* wait for (an SDK-side cancel); the turn ends `cancelled`. Not every
|
|
57
|
+
* engine can end itself (a LangGraph run is stopped only by the runtime's
|
|
58
|
+
* signal and settles `interrupted`), so a subject that cannot produce it
|
|
59
|
+
* says so and the runtime arm is reported SKIPPED there.
|
|
60
|
+
* - `limit`: the engine exhausts the tool-round budget the execution set and
|
|
61
|
+
* stops at a step boundary with its work checkpointed; the turn ends
|
|
62
|
+
* `tool_call_limit`. Not every engine has such a budget (Cursor's SDK does
|
|
63
|
+
* not), so a subject that cannot produce it says so and the runtime arm
|
|
64
|
+
* is reported SKIPPED there.
|
|
57
65
|
*/
|
|
58
66
|
export type ScenarioStep = {
|
|
59
67
|
readonly kind: "say";
|
|
@@ -62,6 +70,7 @@ export type ScenarioStep = {
|
|
|
62
70
|
readonly kind: "propose";
|
|
63
71
|
readonly toolCallId: string;
|
|
64
72
|
readonly action: ProposedAction;
|
|
73
|
+
readonly flows?: boolean;
|
|
65
74
|
} | {
|
|
66
75
|
readonly kind: "read";
|
|
67
76
|
readonly toolCallId: string;
|
|
@@ -77,6 +86,8 @@ export type ScenarioStep = {
|
|
|
77
86
|
readonly surface: FailureSurface;
|
|
78
87
|
} | {
|
|
79
88
|
readonly kind: "cancelled";
|
|
89
|
+
} | {
|
|
90
|
+
readonly kind: "limit";
|
|
80
91
|
};
|
|
81
92
|
/** One turn's worth of engine behaviour. */
|
|
82
93
|
export type TurnScenario = readonly ScenarioStep[];
|
|
@@ -84,11 +95,22 @@ export type TurnScenario = readonly ScenarioStep[];
|
|
|
84
95
|
export declare const scenario: {
|
|
85
96
|
readonly say: (text: string) => ScenarioStep;
|
|
86
97
|
readonly propose: (toolCallId: string, action: ProposedAction) => ScenarioStep;
|
|
98
|
+
/**
|
|
99
|
+
* A `write` the arm EXPECTS to flow under apply-then-review capture (a git
|
|
100
|
+
* work tree, or artifact storage): the engine performs it at once, the row
|
|
101
|
+
* completes, and the RUNTIME captures it for review after the turn
|
|
102
|
+
* (`harness/capture.ts`). The arm states the posture rather than the
|
|
103
|
+
* subject inferring it, so a subject that gates a flowing write is caught,
|
|
104
|
+
* not accommodated. The bytes written are the engine's own; the arm
|
|
105
|
+
* asserts the captured PATH and the reconcile's effect, never the content.
|
|
106
|
+
*/
|
|
107
|
+
readonly flowingWrite: (toolCallId: string, path: string) => ScenarioStep;
|
|
87
108
|
readonly read: (toolCallId: string, path: string) => ScenarioStep;
|
|
88
109
|
readonly usage: (delta: UsageDelta) => ScenarioStep;
|
|
89
110
|
readonly hang: () => ScenarioStep;
|
|
90
111
|
readonly fail: (message: string, surface?: FailureSurface) => ScenarioStep;
|
|
91
112
|
readonly cancelled: () => ScenarioStep;
|
|
113
|
+
readonly limit: () => ScenarioStep;
|
|
92
114
|
};
|
|
93
115
|
/**
|
|
94
116
|
* What the engine can know about the turn it is about to play, handed to the
|
|
@@ -30,6 +30,18 @@ export const scenario = {
|
|
|
30
30
|
propose(toolCallId, action) {
|
|
31
31
|
return { kind: "propose", toolCallId, action };
|
|
32
32
|
},
|
|
33
|
+
/**
|
|
34
|
+
* A `write` the arm EXPECTS to flow under apply-then-review capture (a git
|
|
35
|
+
* work tree, or artifact storage): the engine performs it at once, the row
|
|
36
|
+
* completes, and the RUNTIME captures it for review after the turn
|
|
37
|
+
* (`harness/capture.ts`). The arm states the posture rather than the
|
|
38
|
+
* subject inferring it, so a subject that gates a flowing write is caught,
|
|
39
|
+
* not accommodated. The bytes written are the engine's own; the arm
|
|
40
|
+
* asserts the captured PATH and the reconcile's effect, never the content.
|
|
41
|
+
*/
|
|
42
|
+
flowingWrite(toolCallId, path) {
|
|
43
|
+
return { kind: "propose", toolCallId, action: { kind: "write", resource: path }, flows: true };
|
|
44
|
+
},
|
|
33
45
|
read(toolCallId, path) {
|
|
34
46
|
return { kind: "read", toolCallId, path };
|
|
35
47
|
},
|
|
@@ -45,5 +57,8 @@ export const scenario = {
|
|
|
45
57
|
cancelled() {
|
|
46
58
|
return { kind: "cancelled" };
|
|
47
59
|
},
|
|
60
|
+
limit() {
|
|
61
|
+
return { kind: "limit" };
|
|
62
|
+
},
|
|
48
63
|
};
|
|
49
64
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/__test-utils__/harness-contract/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/__test-utils__/harness-contract/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA0DH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,CAAC,IAAY;QACd,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,UAAkB,EAAE,MAAsB;QAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACjD,CAAC;IACD;;;;;;;;OAQG;IACH,YAAY,CAAC,UAAkB,EAAE,IAAY;QAC3C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACjG,CAAC;IACD,IAAI,CAAC,UAAkB,EAAE,IAAY;QACnC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IACD,KAAK,CAAC,KAAiB;QACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IACD,IAAI;QACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,UAA0B,QAAQ;QACtD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;IACD,SAAS;QACP,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IACD,KAAK;QACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;CACO,CAAC"}
|
|
@@ -7,11 +7,15 @@
|
|
|
7
7
|
* are the wire contract the control plane's workflow keys on — the phases they
|
|
8
8
|
* persist, the copy they write, whether they RETURN a slim status or THROW
|
|
9
9
|
* `CancelledFailure`. Refactoring them safely needs goldens recorded through the
|
|
10
|
-
* activity whole, not through its modules one at a time. The native harness
|
|
11
|
-
* tests
|
|
12
|
-
* boundary
|
|
13
|
-
* this module is that convention made reusable, harness-agnostic,
|
|
14
|
-
* the framework's own activity environment
|
|
10
|
+
* activity whole, not through its modules one at a time. The native harness's
|
|
11
|
+
* earlier activity tests ran their activity hermetically by mocking three
|
|
12
|
+
* modules at the boundary with a hand-written `Context` stand-in and a scripted
|
|
13
|
+
* graph object; this module is that convention made reusable, harness-agnostic,
|
|
14
|
+
* and driven by the framework's own activity environment. Both harnesses now
|
|
15
|
+
* run on it (`execute-cursor/__test-utils__/hermetic-cursor.ts`,
|
|
16
|
+
* `execute-deep-agent/__test-utils__/hermetic-deep-agent.ts`), and the earlier
|
|
17
|
+
* native tests were re-homed onto the native driver (S3 M0), their assertions
|
|
18
|
+
* carried into `execute-deep-agent/__tests__/hermetic/`.
|
|
15
19
|
*
|
|
16
20
|
* What is generic here and what is not: everything an activity touches that is
|
|
17
21
|
* NOT the vendor SDK — the Temporal `Context`, the control-plane client, the
|
|
@@ -68,6 +72,7 @@ import { type Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_
|
|
|
68
72
|
import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
69
73
|
import type { AgentInstance } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/api_pb";
|
|
70
74
|
import type { StigmerClient } from "../client/stigmer-client.js";
|
|
75
|
+
import { type FileReviewVerdicts } from "./file-review-projection.js";
|
|
71
76
|
/**
|
|
72
77
|
* The four resources the activity's blueprint chain reads
|
|
73
78
|
* (`execution.spec.sessionId -> session.spec.agentInstanceId ->
|
|
@@ -147,6 +152,15 @@ export declare class ExecutionRecord {
|
|
|
147
152
|
* resumed turn runs the tool, exactly as in production.
|
|
148
153
|
*/
|
|
149
154
|
decideWaitingToolCalls(action: ApprovalAction, decidedAt: string): number;
|
|
155
|
+
/**
|
|
156
|
+
* What the server's `SubmitFileDecision` and its projection do between
|
|
157
|
+
* invocations: every change of every AWAITING_REVIEW set the runner captured
|
|
158
|
+
* gets a per-file verdict, and `status.file_change_sets` is re-folded from
|
|
159
|
+
* the ledger (`file-review-projection.ts` mirrors the server's fold). The
|
|
160
|
+
* runner authors the ledger; the server owns the sets — so this is the ONE
|
|
161
|
+
* place a test writes them. Returns how many decisions were written.
|
|
162
|
+
*/
|
|
163
|
+
decideCapturedFileChanges(verdicts: FileReviewVerdicts, decidedAt: string): number;
|
|
150
164
|
/**
|
|
151
165
|
* Apply one `UpdateStatus` write and answer the control signal the server
|
|
152
166
|
* would. A setup-progress report never carries a signal (the runner ignores
|
|
@@ -201,12 +215,30 @@ export interface HermeticEnvironment {
|
|
|
201
215
|
*/
|
|
202
216
|
export declare function createHermeticEnvironment(): HermeticEnvironment;
|
|
203
217
|
/**
|
|
204
|
-
* A deterministic, TICKING `Date
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* the
|
|
209
|
-
*
|
|
218
|
+
* A deterministic, TICKING clock: `Date` AND `performance` are faked and
|
|
219
|
+
* advance together; timers stay real (the periodic heartbeat, the stall
|
|
220
|
+
* watchdog, `withTimeout` all need them). The harness double calls
|
|
221
|
+
* {@link ScriptedClock.tick} once per script step, so every clock-based
|
|
222
|
+
* decision on the activity path — status timestamps, the enricher's persist
|
|
223
|
+
* debounce, cache TTLs (`Date`); the streaming scheduler's persist cadence
|
|
224
|
+
* (`performance.now()`) — sees the same instants run after run and runs the
|
|
225
|
+
* same branches production runs.
|
|
226
|
+
*
|
|
227
|
+
* Why both (S3 M5, Q-M5-7; F-M2a-20): until M5 only `Date` was faked, so the
|
|
228
|
+
* scheduler paced persists on REAL elapsed time and `fileChangeProgress`,
|
|
229
|
+
* which rides persists, could gain or lose a capture under load — a golden
|
|
230
|
+
* flake seen twice across S3. One clock, two faces: `tick` advances through
|
|
231
|
+
* the fake clock's own `tick` (`vi.advanceTimersByTime`), which moves both
|
|
232
|
+
* `Date` and `performance.now()`; `vi.setSystemTime` would move `Date` alone
|
|
233
|
+
* (fake-timers keeps `performance` monotonic across a system-time jump), so
|
|
234
|
+
* only {@link reset} uses it — rewinding `Date` to the epoch for a second
|
|
235
|
+
* scenario while `performance` stays monotonic, which is harmless because
|
|
236
|
+
* every turn constructs its scheduler fresh and measures from its own start.
|
|
237
|
+
*
|
|
238
|
+
* Faking `performance` replaces the whole global (`now`, a `timeOrigin` at
|
|
239
|
+
* the epoch, every other method a no-op); nothing on the activity path reads
|
|
240
|
+
* more than `now`, and a module importing from `node:perf_hooks` would bypass
|
|
241
|
+
* the fake (none under `src/` does).
|
|
210
242
|
*/
|
|
211
243
|
export declare class ScriptedClock {
|
|
212
244
|
/** A fixed epoch: 2026-01-01T00:00:00.000Z. Chosen for readability in goldens. */
|
|
@@ -216,7 +248,7 @@ export declare class ScriptedClock {
|
|
|
216
248
|
private nowMs;
|
|
217
249
|
install(): void;
|
|
218
250
|
tick(ms?: number): void;
|
|
219
|
-
/** Back to the epoch — for a second scenario in the same file. */
|
|
251
|
+
/** Back to the epoch — for a second scenario in the same file. `Date` rewinds; `performance` stays monotonic (see the header). */
|
|
220
252
|
reset(): void;
|
|
221
253
|
uninstall(): void;
|
|
222
254
|
}
|
|
@@ -7,11 +7,15 @@
|
|
|
7
7
|
* are the wire contract the control plane's workflow keys on — the phases they
|
|
8
8
|
* persist, the copy they write, whether they RETURN a slim status or THROW
|
|
9
9
|
* `CancelledFailure`. Refactoring them safely needs goldens recorded through the
|
|
10
|
-
* activity whole, not through its modules one at a time. The native harness
|
|
11
|
-
* tests
|
|
12
|
-
* boundary
|
|
13
|
-
* this module is that convention made reusable, harness-agnostic,
|
|
14
|
-
* the framework's own activity environment
|
|
10
|
+
* activity whole, not through its modules one at a time. The native harness's
|
|
11
|
+
* earlier activity tests ran their activity hermetically by mocking three
|
|
12
|
+
* modules at the boundary with a hand-written `Context` stand-in and a scripted
|
|
13
|
+
* graph object; this module is that convention made reusable, harness-agnostic,
|
|
14
|
+
* and driven by the framework's own activity environment. Both harnesses now
|
|
15
|
+
* run on it (`execute-cursor/__test-utils__/hermetic-cursor.ts`,
|
|
16
|
+
* `execute-deep-agent/__test-utils__/hermetic-deep-agent.ts`), and the earlier
|
|
17
|
+
* native tests were re-homed onto the native driver (S3 M0), their assertions
|
|
18
|
+
* carried into `execute-deep-agent/__tests__/hermetic/`.
|
|
15
19
|
*
|
|
16
20
|
* What is generic here and what is not: everything an activity touches that is
|
|
17
21
|
* NOT the vendor SDK — the Temporal `Context`, the control-plane client, the
|
|
@@ -73,6 +77,7 @@ import { ExecutionControlSignal, ExecutionPhase, ToolCallStatus, } from "@stigme
|
|
|
73
77
|
import { UpdateStatusResponseSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/io_pb";
|
|
74
78
|
import { SessionSchema } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
|
|
75
79
|
import { registerWorkerShutdownSignal, signalWorkerShutdown, unregisterWorkerShutdownSignal, } from "../shared/worker-shutdown.js";
|
|
80
|
+
import { decideCapturedFileChanges } from "./file-review-projection.js";
|
|
76
81
|
import { mockStigmerClient } from "./mock-client.js";
|
|
77
82
|
/**
|
|
78
83
|
* An in-memory stand-in for the server's execution row, with the TWO merge
|
|
@@ -170,6 +175,19 @@ export class ExecutionRecord {
|
|
|
170
175
|
}
|
|
171
176
|
return waiting.length;
|
|
172
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* What the server's `SubmitFileDecision` and its projection do between
|
|
180
|
+
* invocations: every change of every AWAITING_REVIEW set the runner captured
|
|
181
|
+
* gets a per-file verdict, and `status.file_change_sets` is re-folded from
|
|
182
|
+
* the ledger (`file-review-projection.ts` mirrors the server's fold). The
|
|
183
|
+
* runner authors the ledger; the server owns the sets — so this is the ONE
|
|
184
|
+
* place a test writes them. Returns how many decisions were written.
|
|
185
|
+
*/
|
|
186
|
+
decideCapturedFileChanges(verdicts, decidedAt) {
|
|
187
|
+
if (!this.execution.status)
|
|
188
|
+
throw new Error("ExecutionRecord: no status to decide file changes on (test bug)");
|
|
189
|
+
return decideCapturedFileChanges(this.execution.status, verdicts, decidedAt);
|
|
190
|
+
}
|
|
173
191
|
/**
|
|
174
192
|
* Apply one `UpdateStatus` write and answer the control signal the server
|
|
175
193
|
* would. A setup-progress report never carries a signal (the runner ignores
|
|
@@ -320,12 +338,30 @@ export function createHermeticEnvironment() {
|
|
|
320
338
|
// The clock
|
|
321
339
|
// ---------------------------------------------------------------------------
|
|
322
340
|
/**
|
|
323
|
-
* A deterministic, TICKING `Date
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
* the
|
|
328
|
-
*
|
|
341
|
+
* A deterministic, TICKING clock: `Date` AND `performance` are faked and
|
|
342
|
+
* advance together; timers stay real (the periodic heartbeat, the stall
|
|
343
|
+
* watchdog, `withTimeout` all need them). The harness double calls
|
|
344
|
+
* {@link ScriptedClock.tick} once per script step, so every clock-based
|
|
345
|
+
* decision on the activity path — status timestamps, the enricher's persist
|
|
346
|
+
* debounce, cache TTLs (`Date`); the streaming scheduler's persist cadence
|
|
347
|
+
* (`performance.now()`) — sees the same instants run after run and runs the
|
|
348
|
+
* same branches production runs.
|
|
349
|
+
*
|
|
350
|
+
* Why both (S3 M5, Q-M5-7; F-M2a-20): until M5 only `Date` was faked, so the
|
|
351
|
+
* scheduler paced persists on REAL elapsed time and `fileChangeProgress`,
|
|
352
|
+
* which rides persists, could gain or lose a capture under load — a golden
|
|
353
|
+
* flake seen twice across S3. One clock, two faces: `tick` advances through
|
|
354
|
+
* the fake clock's own `tick` (`vi.advanceTimersByTime`), which moves both
|
|
355
|
+
* `Date` and `performance.now()`; `vi.setSystemTime` would move `Date` alone
|
|
356
|
+
* (fake-timers keeps `performance` monotonic across a system-time jump), so
|
|
357
|
+
* only {@link reset} uses it — rewinding `Date` to the epoch for a second
|
|
358
|
+
* scenario while `performance` stays monotonic, which is harmless because
|
|
359
|
+
* every turn constructs its scheduler fresh and measures from its own start.
|
|
360
|
+
*
|
|
361
|
+
* Faking `performance` replaces the whole global (`now`, a `timeOrigin` at
|
|
362
|
+
* the epoch, every other method a no-op); nothing on the activity path reads
|
|
363
|
+
* more than `now`, and a module importing from `node:perf_hooks` would bypass
|
|
364
|
+
* the fake (none under `src/` does).
|
|
329
365
|
*/
|
|
330
366
|
export class ScriptedClock {
|
|
331
367
|
/** A fixed epoch: 2026-01-01T00:00:00.000Z. Chosen for readability in goldens. */
|
|
@@ -334,13 +370,15 @@ export class ScriptedClock {
|
|
|
334
370
|
static STEP_MS = 1_000;
|
|
335
371
|
nowMs = ScriptedClock.EPOCH_MS;
|
|
336
372
|
install() {
|
|
337
|
-
vi.useFakeTimers({ toFake: ["Date"], now: this.nowMs });
|
|
373
|
+
vi.useFakeTimers({ toFake: ["Date", "performance"], now: this.nowMs });
|
|
338
374
|
}
|
|
339
375
|
tick(ms = ScriptedClock.STEP_MS) {
|
|
340
376
|
this.nowMs += ms;
|
|
341
|
-
|
|
377
|
+
// Through the fake clock's own tick, so `performance.now()` advances with
|
|
378
|
+
// `Date`; with no timers faked there is nothing for it to fire.
|
|
379
|
+
vi.advanceTimersByTime(ms);
|
|
342
380
|
}
|
|
343
|
-
/** Back to the epoch — for a second scenario in the same file. */
|
|
381
|
+
/** Back to the epoch — for a second scenario in the same file. `Date` rewinds; `performance` stays monotonic (see the header). */
|
|
344
382
|
reset() {
|
|
345
383
|
this.nowMs = ScriptedClock.EPOCH_MS;
|
|
346
384
|
vi.setSystemTime(this.nowMs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermetic-activity.js","sourceRoot":"","sources":["../../src/__test-utils__/hermetic-activity.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hermetic-activity.js","sourceRoot":"","sources":["../../src/__test-utils__/hermetic-activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAG3B,MAAM,6DAA6D,CAAC;AACrE,OAAO,EAEL,sBAAsB,EACtB,cAAc,EACd,cAAc,GACf,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4DAA4D,CAAC;AAExG,OAAO,EAAE,aAAa,EAAgB,MAAM,sDAAsD,CAAC;AAInG,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAA2B,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA2BrD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,eAAe;IACjB,SAAS,CAAiB;IAC1B,OAAO,CAAU;IACjB,aAAa,CAAgB;IAC7B,KAAK,CAAQ;IACL,aAAa,CAA2D;IACzF,yEAAyE;IAChE,SAAS,GAA2B,EAAE,CAAC;IAChD,0EAA0E;IACjE,aAAa,GAAa,EAAE,CAAC;IACtC;;;;OAIG;IACM,cAAc,GAAc,EAAE,CAAC;IAExC,YAAY,KAA2B;QACrC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,gFAAgF;IAChF,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,0EAA0E;IAC1E,IAAI,cAAc;QAChB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,2BAA2B;gBAAE,OAAO,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,IAAI,eAAe;QACjB,MAAM,GAAG,GAAqB,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,2BAA2B;gBAAE,SAAS;YACrE,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,6EAA6E;IAC7E,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC3E,CAAC;IAED,sDAAsD;IACtD,gBAAgB;QACd,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAClG,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB,CAAC,MAAsB,EAAE,SAAiB;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,EAAE,CAAC,cAAc,GAAG,MAAM,CAAC;YAC3B,EAAE,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACH,yBAAyB,CAAC,QAA4B,EAAE,SAAiB;QACvE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAC/G,OAAO,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAA4B;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,QAAQ,CAAC,KAAK,KAAK,cAAc,CAAC,2BAA2B,EAAE,CAAC;YAClE,IAAI,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;gBACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,sBAAsB,CAAC,WAAW,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,YAAoC,EAAE;QAC3C,OAAO,iBAAiB,CAAC;YACvB,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5E,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3C,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC;YACvD,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,MAA4B,EAAE,EAAE;gBACtE,qEAAqE;gBACrE,OAAO,MAAM,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC,CAAC;YACF,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;gBAC9C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;YACF,gCAAgC,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACjD,MAAM,IAAI,YAAY,CAAC,6BAA6B,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvE,CAAC,CAAC;YACF,GAAG,SAAS;SACa,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,IAAI,WAAsC,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,WAAW,GAAG,MAAM,CAAC;AACvB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,aAAa,EAAE;YACb;gBACE,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CACb,uFAAuF;wBACrF,oCAAoC,CACvC,CAAC;gBACJ,CAAC;gBACD,OAAO,WAAW,CAAC;YACrB,CAAC;SACoC;KACxC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,GAAG;IACjB,qBAAqB,EAAE,OAAO;IAC9B,0BAA0B,EAAE,kDAAkD;CACtE,CAAC;AAEX,MAAM,WAAW,GAAG,CAAC,yBAAyB,EAAE,wBAAwB,EAAE,uBAAuB,CAAU,CAAC;AAa5G;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,KAAyB,EAAQ,EAAE;QAC3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;YAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC,CAAC;IACF,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClB,GAAG,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;IACzC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,WAAW;QAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAE/C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACL,IAAI;QACJ,gBAAgB;QAChB,YAAY;QACZ,OAAO;YACL,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;oBACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,aAAa;IACxB,kFAAkF;IAClF,MAAM,CAAU,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,mEAAmE;IACnE,MAAM,CAAU,OAAO,GAAG,KAAK,CAAC;IAExB,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC;IAEvC,OAAO;QACL,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,KAAa,aAAa,CAAC,OAAO;QACrC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACjB,0EAA0E;QAC1E,gEAAgE;QAChE,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,kIAAkI;IAClI,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC;QACpC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;QACP,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC;;AAyCH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAA0C,EAC1C,IAAO,EACP,UAA8B,EAAE;IAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,qBAAqB,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,MAAM,UAAU,GAAc,EAAE,CAAC;IACjC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpE,4EAA4E;IAC5E,wEAAwE;IACxE,4BAA4B,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;QAC1B,oBAAoB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC;KAC5D,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACtE,CAAC;YAAS,CAAC;QACT,8BAA8B,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB,CAAC,OAAwB;IAC5D,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,YAAY,gBAAgB,CAAC;AAC/E,CAAC"}
|