@tea-agent/loop-agent 0.41.1-beta.0 → 0.42.0-next.2
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/CHANGELOG.md +78 -206
- package/dist/adapters/context-transfer/optional-pi-handoff.js +31 -0
- package/dist/adapters/context-transfer/pi-session.js +61 -0
- package/dist/application/dag/generate-task-dag.js +19 -75
- package/dist/application/task-lifecycle/advance.js +5 -24
- package/dist/application/task-lifecycle/observe.js +17 -171
- package/dist/application/task-lifecycle/plan-transitions.js +7 -42
- package/dist/application/task-lifecycle/recommendations.js +2 -13
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +12 -7
- package/dist/cli/program.js +23 -6
- package/dist/commands/client-recovery.js +0 -3
- package/dist/commands/dag-artifact.js +284 -0
- package/dist/commands/dag-context.js +184 -0
- package/dist/commands/dag-rerun.js +206 -1
- package/dist/commands/init.js +1 -27
- package/dist/commands/task-advance.js +0 -19
- package/dist/executors/dag-pi-executor.js +266 -3792
- package/dist/executors/pi-executor.js +4 -15
- package/dist/executors/pi-sdk-executor.js +3 -0
- package/dist/executors/shell-executor.js +217 -945
- package/dist/executors/shell-write-guard.js +0 -7
- package/dist/{worker → infrastructure}/console/app-data.js +4 -0
- package/dist/infrastructure/console/artifact-revision-store.js +430 -0
- package/dist/infrastructure/console/context-export-store.js +160 -0
- package/dist/infrastructure/console/dir-lock.js +132 -0
- package/dist/infrastructure/console/operation-store.js +197 -0
- package/dist/infrastructure/harness/artifact-store.js +10 -1
- package/dist/infrastructure/harness/atomic-write.js +12 -2
- package/dist/shared/context-transfer/artifact-revision.js +172 -0
- package/dist/shared/context-transfer.js +418 -0
- package/dist/shared/dag-failure-category.js +0 -12
- package/dist/shared/openspec-spec.js +4 -70
- package/dist/shared/operator/capabilities.js +14 -7
- package/dist/shared/operator/safe-run-summary.js +1 -0
- package/dist/shared/path-safety.js +93 -0
- package/dist/shared/preview.js +28 -4
- package/dist/task/config-types.js +80 -35
- package/dist/task/contract/adopt.js +0 -4
- package/dist/task/contract/import-revision.js +0 -4
- package/dist/task/contract/project.js +0 -3
- package/dist/task/contract/schema.js +1 -2
- package/dist/task/frontend-project-capability.js +20 -203
- package/dist/task/runtime.js +2 -5
- package/dist/task/source-prepare/build-draft.js +3 -3
- package/dist/task/source-prepare/fragment-inventory.js +9 -15
- package/dist/task/source-prepare/prepare.js +1 -89
- package/dist/task/source-prepare/semantic-intake.js +2 -6
- package/dist/task/source-references.js +1 -22
- package/dist/task/task-demand-routing.js +3 -0
- package/dist/worker/console/chat/chat-event-store.js +2 -2
- package/dist/worker/console/chat/pi-runtime.js +3 -2
- package/dist/worker/console/chat/resource-preferences-store.js +1 -1
- package/dist/worker/console/chat/routes.js +13 -4
- package/dist/worker/console/chat/semantic-activity.js +12 -11
- package/dist/worker/console/chat/session-stats.js +96 -0
- package/dist/worker/console/chat/session-store.js +1 -1
- package/dist/worker/console/chat/turn-process.js +28 -4
- package/dist/worker/console/chat/user-questions.js +1 -1
- package/dist/worker/console/console-update-runtime.js +1 -1
- package/dist/worker/console/context-transfer-diagnostics.js +198 -0
- package/dist/worker/console/dag-confirmation.js +1 -1
- package/dist/worker/console/dag-execution-receipt.js +1 -1
- package/dist/worker/console/doctor.js +1 -1
- package/dist/worker/console/draft-store.js +1 -1
- package/dist/worker/console/human-gate-token.js +1 -1
- package/dist/worker/console/index.js +3 -6
- package/dist/worker/console/interview/assessment.js +1 -1
- package/dist/worker/console/interview/session.js +1 -1
- package/dist/worker/console/operation-runner.js +45 -4
- package/dist/worker/console/operation-sse.js +1 -1
- package/dist/worker/console/operation-wait.js +1 -1
- package/dist/worker/console/operator-actions.js +107 -168
- package/dist/worker/console/operator-surface-health.js +1 -1
- package/dist/worker/console/operator-user-error.js +169 -0
- package/dist/worker/console/pi-plugins.js +60 -1
- package/dist/worker/console/routes.js +637 -8
- package/dist/worker/console/security.js +35 -0
- package/dist/worker/console/server.js +6 -6
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Bho4we4c.js → abnfDiagram-N423BO3Z-DZZ8m3PO.js} +1 -1
- package/dist/worker/console/static/assets/{arc-TBDkTeK0.js → arc-D6PvaVd-.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-BF_fZrn2.js → architectureDiagram-T3A2C74G-B_OTOiI8.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-CCnPgUe2.js → blockDiagram-VBNYF7ZC-Bv6rqHBg.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BCYZJLAT.js → c4Diagram-5PPSVZJV-B8eHr0oz.js} +1 -1
- package/dist/worker/console/static/assets/channel-BU5gOilw.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D8K6adhU.js → chunk-2GRJ4B5K-DYwR0im2.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DkT1Q78b.js → chunk-2Q5K7J3B-D2WPGqXt.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DuhvpIr7.js → chunk-5RXB4S5H-CQISJ_I7.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BnK6dC49.js → chunk-5VM5RSS4-C0o2Du1e.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DPz__z7r.js → chunk-6Q2QTUOP-4f8kr-U7.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-0kkppM2j.js → chunk-GF5L2VYU-D_OWvXzX.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BB41iK5t.js → chunk-JWPE2WC7-CasdPz5X.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-CiVrxKHU.js → chunk-KBJHAD2P-Cj8lRrla.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-C2h9Xje1.js → chunk-RYQCIY6F-CUvD1FSd.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-3iOSHdbM.js → chunk-XXDRQBXY-CqLw_eqB.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DIzKJGHr.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DIzKJGHr.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BN3A7tkk.js → cose-bilkent-JH36ORCC-ku-WqJPx.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-CTuBy0Or.js → cynefin-VYW2F7L2-Bq_PYDhl.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-wb6tUlMN.js → cynefinDiagram-MW4NZA55-BiGZV641.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-GP1Ivx8B.js → dagre-VZM6K2ZE-C4JRlglF.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-ejrcK6L0.js → diagram-7IWD3JNH-B0dNeWYG.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-YFkCCvUU.js → diagram-B4RE2ZJO-Cj35YvYM.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-B4rrvIaL.js → diagram-LBJQPF4R-uzQoJ2-8.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-C-YIZcUf.js → diagram-Q27KOJAE-D1a-Buoz.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-BPF5wcL1.js → diagram-UB23O5K3-XjRrLRSs.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CU5SzXjO.js → ebnfDiagram-BXEA7PRR-Da_O24cW.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-CpL414DE.js → erDiagram-JOGREHBK-BLJ8jrYU.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-MrhLzNau.js → flowDiagram-UKHOOZJN-B9GrLjM0.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Bg4qFuUo.js → ganttDiagram-PKOTCBZU-CeJ0TqiK.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-ColxSXLR.js → gitGraphDiagram-DS77QQ5N-Bm2eNNFX.js} +1 -1
- package/dist/worker/console/static/assets/index-H9rFJiGL.css +1 -0
- package/dist/worker/console/static/assets/index-xwu9GxEc.js +451 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-Czvtm6gc.js → infoDiagram-6WML65LV-DB26i3d8.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-B7Xp8HyJ.js → ishikawaDiagram-WSZJBQD7-BOGRyeZT.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DWYZcvph.js → journeyDiagram-NVQOT4AX-CZRoBO_6.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-KTLZRUjx.js → kanban-definition-27J2QSJJ-qlWhJyoB.js} +1 -1
- package/dist/worker/console/static/assets/{linear-_Exn7bfl.js → linear-CfUiDDB3.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-Cxg8kX8V.js → mermaid.core-BQe6fpqj.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-oKrlo2Bt.js → mindmap-definition-FAOFIHXS-zFzWHw64.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-XAeteiNd.js → pegDiagram-VL7TDLO6-DFGUqjZO.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-BTf1K-lp.js → pieDiagram-7S7Q4E2Y-BB5i0l8Z.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-C0IlY0Jf.js → quadrantDiagram-CIZ2JOQS-obbVZ_X5.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BVbKtZhW.js → railroadDiagram-AXF67PYL-BwdaNzc1.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-C5e4JFcr.js → requirementDiagram-LRYGKXZP-CkTJaugh.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Cz30hc29.js → sankeyDiagram-W5VNT64P-BwJ-hIgq.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DS33n6d0.js → sequenceDiagram-SI44F4Z6-BzSgmm7w.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-46w7v-9T.js → sizeCapture-X5ZJPWSS-Bn3oj5Q1.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-pbcD5SsZ.js → stateDiagram-OKZ733FA-dxhGtL8K.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Cld2qK9v.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DuivYBSj.js → swimlanes-SLNWSIFB-BLpEInya.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-TIHpiT7w.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Cb9VZVIl.js → timeline-definition-Z64GVDOM-ChJGYcXy.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-D2-mfOgR.js → vennDiagram-T6HMQDX7-DK-qjRer.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DeS2aC76.js → wardleyDiagram-T6FBY63Y-3qeaWAg-.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-WGsrFjxH.js → xychartDiagram-ELKLHX3M-CootlyP9.js} +1 -1
- package/dist/worker/console/static/index.html +7 -2
- package/dist/worker/console/static-src/app/useOperatorActions.js +3 -2
- package/dist/worker/console/static-src/app/useRunProgress.js +9 -2
- package/dist/worker/console/static-src/operator-chat/dag-progress-link.js +22 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +2 -0
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +6 -0
- package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +28 -3
- package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +106 -0
- package/dist/worker/console/static-src/shell/console-update-reload.js +25 -0
- package/dist/worker/console/workspace-context.js +28 -112
- package/dist/worker/console/workspace-registry.js +2 -2
- package/dist/worker/continuation/worker-continuation.js +278 -0
- package/dist/worker/observability/read-model.js +4 -0
- package/dist/worker/observe/health.js +1 -1
- package/dist/worker/observe/node-transparency.js +572 -0
- package/dist/worker/observe/routes.js +51 -1
- package/dist/worker/observe/static/api.js +69 -5
- package/dist/worker/observe/static/dag-context-reason-labels.d.ts +9 -0
- package/dist/worker/observe/static/dag-context-reason-labels.js +120 -0
- package/dist/worker/observe/static/dag-node-purpose.js +0 -5
- package/dist/worker/observe/static/state.js +3 -1
- package/dist/worker/observe/static/styles.css +1037 -126
- package/dist/worker/observe/static/views/dag-inspector.js +1217 -65
- package/dist/worker/observe/static/views/session-timeline.js +121 -25
- package/dist/worker/outcomes/adapters.js +19 -0
- package/dist/worker/outcomes/types.js +1 -0
- package/dist/worker/pool/attempt-lease.js +97 -66
- package/dist/worker/pool/begin-attempt-with-lease.js +1 -0
- package/dist/worker/pool/reconcile.js +46 -1
- package/dist/worker/pool/run-store.js +2 -0
- package/dist/worker/pool/state-projection.js +2 -0
- package/dist/worker/task-spec/workflow-routing.js +8 -3
- package/dist/workflows/dag/artifact-bindings.js +149 -0
- package/dist/workflows/dag/artifact-revision-schema-registry.js +31 -0
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +99 -4
- package/dist/workflows/dag/backend-test-markdown-workflow.js +13 -1
- package/dist/workflows/dag/backend-test-result-contract.js +1 -1
- package/dist/workflows/dag/backend-test-writer-completeness.js +45 -3
- package/dist/workflows/dag/budget-enforcement.js +10 -0
- package/dist/workflows/dag/context-receipt.js +305 -0
- package/dist/workflows/dag/context-transfer/context-bundle.js +423 -0
- package/dist/workflows/dag/context-transfer/operator-actions.js +61 -0
- package/dist/workflows/dag/context-transfer/renderers.js +93 -0
- package/dist/workflows/dag/contract-validator-registrations.js +2 -1
- package/dist/workflows/dag/frontend-implementation-contract.js +162 -932
- package/dist/workflows/dag/frontend-plan-render.js +1 -2
- package/dist/workflows/dag/frontend-prewrite-gate.js +349 -255
- package/dist/workflows/dag/frontend-recovery-plan.js +10 -17
- package/dist/workflows/dag/frontend-recovery-run.js +20 -33
- package/dist/workflows/dag/frontend-repair.js +432 -1
- package/dist/workflows/dag/frontend-review-context.js +15 -261
- package/dist/workflows/dag/frontend-verification-trace.js +24 -249
- package/dist/workflows/dag/frontend-worktree-diff.js +17 -250
- package/dist/workflows/dag/frontend-writer-rollback.js +32 -0
- package/dist/workflows/dag/init-hybrid.js +740 -718
- package/dist/workflows/dag/interrupt-request.js +0 -7
- package/dist/workflows/dag/node-execution.js +136 -759
- package/dist/workflows/dag/path-safety.js +1 -0
- package/dist/workflows/dag/prompt.js +30 -38
- package/dist/workflows/dag/report.js +1 -37
- package/dist/workflows/dag/rerun-feedback.js +1 -256
- package/dist/workflows/dag/rerun-plan.js +557 -11
- package/dist/workflows/dag/rerun-run.js +601 -38
- package/dist/workflows/dag/rerun-task.js +0 -29
- package/dist/workflows/dag/retry-policy.js +109 -214
- package/dist/workflows/dag/runner.js +142 -430
- package/dist/workflows/dag/scheduler.js +16 -114
- package/dist/workflows/dag/skill-snapshot.js +17 -0
- package/dist/workflows/dag/types.js +195 -246
- package/dist/workflows/dag/validate.js +12 -28
- package/docs/architecture/runtime-boundaries.md +6 -6
- package/docs/architecture/worker-and-feature.md +1 -1
- package/docs/init-surface.manifest.json +12 -30
- package/docs/skills/vetted-skill-registry.md +2 -4
- package/docs/templates/README.md +0 -2
- package/docs/templates/agent-dag-report.schema.json +2 -8
- package/docs/templates/agent-dag.schema.json +33 -1
- package/docs/templates/backend-test-dag.json +18 -18
- package/docs/templates/frontend-implementation-contract.schema.json +1 -4
- package/docs/templates/product-line/task.yaml +1 -1
- package/harness.json +3 -3
- package/package.json +3 -1
- package/skills/frontend-bounded-implement/SKILL.md +14 -15
- package/skills/frontend-design-review/SKILL.md +41 -22
- package/skills/frontend-implementation/SKILL.md +52 -0
- package/skills/frontend-implementation/references/code-standards.md +33 -0
- package/skills/frontend-implementation/references/design-spec.md +56 -0
- package/skills/frontend-implementation/references/node-contracts.md +31 -0
- package/skills/frontend-review/SKILL.md +15 -20
- package/skills/frontend-review/references/review-findings.md +7 -6
- package/skills/frontend-verification/SKILL.md +1 -1
- package/skills/loop-agent/references/command-reference.md +6 -1
- package/skills/loop-agent/references/hybrid-dag.md +2 -2
- package/dist/commands/dag-follow-up.js +0 -138
- package/dist/executors/pi-read-budget-policy.js +0 -239
- package/dist/worker/console/frontend-human-decision-adapter.js +0 -19
- package/dist/worker/console/frontend-split-operation-adapter.js +0 -20
- package/dist/worker/console/operation-store.js +0 -389
- package/dist/worker/console/static/assets/channel-bnXW0U3C.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-rZpq_twR.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-rZpq_twR.js +0 -1
- package/dist/worker/console/static/assets/index-D3CC4eUz.css +0 -1
- package/dist/worker/console/static/assets/index-DLt4ZFvD.js +0 -437
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-zBMYiUyi.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-d_rms-5i.js +0 -8
- package/dist/worker/console/static-src/active-run-badge.js +0 -17
- package/dist/worker/materialize/frontend-split-task-materializer.js +0 -72
- package/dist/workflows/dag/dag-retry-schema.js +0 -138
- package/dist/workflows/dag/frontend-closeout.js +0 -221
- package/dist/workflows/dag/frontend-design-policy.js +0 -400
- package/dist/workflows/dag/frontend-human-decision.js +0 -182
- package/dist/workflows/dag/frontend-provider-capability-matrix.js +0 -159
- package/dist/workflows/dag/frontend-read-budgets.js +0 -12
- package/dist/workflows/dag/frontend-recovery-capsule.js +0 -455
- package/dist/workflows/dag/frontend-recovery-controller.js +0 -202
- package/dist/workflows/dag/frontend-recovery-lineage.js +0 -178
- package/dist/workflows/dag/frontend-review-findings.js +0 -270
- package/dist/workflows/dag/frontend-shadow-dual-write.js +0 -914
- package/dist/workflows/dag/frontend-shape-capsule-store.js +0 -191
- package/dist/workflows/dag/frontend-shape-facts.js +0 -409
- package/dist/workflows/dag/frontend-shape.js +0 -427
- package/dist/workflows/dag/frontend-source-fidelity-ledger.js +0 -108
- package/dist/workflows/dag/frontend-split-application-service.js +0 -203
- package/dist/workflows/dag/frontend-split-orchestrator.js +0 -899
- package/dist/workflows/dag/frontend-typed-event-store.js +0 -452
- package/dist/workflows/dag/frontend-typed-event-transaction.js +0 -180
- package/dist/workflows/dag/frontend-writer-admission.js +0 -285
- package/dist/workflows/dag/frontend-writer-status.js +0 -256
- package/dist/workflows/dag/recovery-lease.js +0 -80
- package/docs/templates/frontend-implementation-dag.json +0 -89
- package/docs/templates/spec-registry.schema.json +0 -45
- package/skills/frontend-bounded-implement/references/code-standards.md +0 -19
- package/skills/frontend-contract/SKILL.md +0 -23
- package/skills/frontend-contract/references/contract-protocol.md +0 -34
- package/skills/frontend-plan/SKILL.md +0 -26
- package/skills/frontend-plan/references/decision-contract.md +0 -37
- package/skills/frontend-plan/references/design-decisions.md +0 -17
- package/skills/frontend-scout/SKILL.md +0 -25
- package/skills/frontend-scout/references/design-evidence.md +0 -16
- package/skills/frontend-scout/references/scout-evidence.md +0 -23
- /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
|
@@ -3,8 +3,7 @@ import path from "node:path";
|
|
|
3
3
|
import { isPauseOnHumanDecisionGate } from "./decision-envelope.js";
|
|
4
4
|
import { evaluateConditionExpression } from "./dynamic-runtime/condition.js";
|
|
5
5
|
import { sha256Hex } from "./frontend-implementation-contract.js";
|
|
6
|
-
import {
|
|
7
|
-
import { FRONTEND_WRITER_ADMISSION_RESULT_ARTIFACT, frontendWriterAdmissionResultV1Schema, } from "./frontend-writer-admission.js";
|
|
6
|
+
import { frontendPrewriteResultV1Schema, FRONTEND_PREWRITE_RESULT_ARTIFACT_NAME, } from "./frontend-prewrite-gate.js";
|
|
8
7
|
import { FRONTEND_RECOVERY_IMPORT_MANIFEST_REL_PATH, FRONTEND_RECOVERY_INTENT_REL_DIR, } from "./frontend-recovery-plan.js";
|
|
9
8
|
export function isConditionSkippedReason(reason) {
|
|
10
9
|
return Boolean(reason?.startsWith("condition "));
|
|
@@ -112,25 +111,16 @@ async function mapConcurrent(items, limit, fn) {
|
|
|
112
111
|
}
|
|
113
112
|
export const FRONTEND_WRITER_NODE_IDS = [
|
|
114
113
|
"frontend-implement-pi",
|
|
114
|
+
"frontend-repair-pi",
|
|
115
115
|
];
|
|
116
|
+
/** Run-relative artifact location written by the prewrite gate generator. */
|
|
117
|
+
export const FRONTEND_PREWRITE_RESULT_SOURCE_ARTIFACT = path.posix.join("contracts", FRONTEND_PREWRITE_RESULT_ARTIFACT_NAME);
|
|
116
118
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* frontend-writer-admission-result.json artifact (written by the
|
|
120
|
-
* frontend-writer-admission-shell); the exported name is retained because
|
|
121
|
-
* runner.ts / node-execution.ts reference it as the admission evidence source.
|
|
122
|
-
*/
|
|
123
|
-
export const FRONTEND_PREWRITE_RESULT_SOURCE_ARTIFACT = FRONTEND_WRITER_ADMISSION_RESULT_ARTIFACT;
|
|
124
|
-
export { FRONTEND_WRITER_ADMISSION_RESULT_ARTIFACT };
|
|
125
|
-
/**
|
|
126
|
-
* Read and validate the writer admission result artifact.
|
|
127
|
-
* Fail-closed: a missing file or invalid payload returns ok:false and never
|
|
128
|
-
* throws. This is the M8 write authorization source (replaces the legacy
|
|
129
|
-
* frontend-prewrite-result-v1 for dispatch; the legacy artifact remains
|
|
130
|
-
* produced only by the shadow `runFrontendPrewriteGate` library export).
|
|
119
|
+
* Read and validate the frontend-prewrite-result-v1 artifact. Fail-closed:
|
|
120
|
+
* a missing file or invalid payload returns ok:false and never throws.
|
|
131
121
|
*/
|
|
132
122
|
export async function readFrontendPrewriteResult(runDir) {
|
|
133
|
-
const artifactPath = path.join(runDir,
|
|
123
|
+
const artifactPath = path.join(runDir, "contracts", FRONTEND_PREWRITE_RESULT_ARTIFACT_NAME);
|
|
134
124
|
let raw;
|
|
135
125
|
try {
|
|
136
126
|
raw = await readFile(artifactPath, "utf8");
|
|
@@ -139,7 +129,7 @@ export async function readFrontendPrewriteResult(runDir) {
|
|
|
139
129
|
if (error.code === "ENOENT") {
|
|
140
130
|
return {
|
|
141
131
|
ok: false,
|
|
142
|
-
reason: `frontend
|
|
132
|
+
reason: `frontend prewrite result artifact missing: ${artifactPath}`,
|
|
143
133
|
};
|
|
144
134
|
}
|
|
145
135
|
throw error;
|
|
@@ -152,30 +142,22 @@ export async function readFrontendPrewriteResult(runDir) {
|
|
|
152
142
|
catch (error) {
|
|
153
143
|
return {
|
|
154
144
|
ok: false,
|
|
155
|
-
reason: `frontend
|
|
145
|
+
reason: `frontend prewrite result artifact is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,
|
|
156
146
|
};
|
|
157
147
|
}
|
|
158
|
-
const result =
|
|
148
|
+
const result = frontendPrewriteResultV1Schema.safeParse(parsed);
|
|
159
149
|
if (!result.success) {
|
|
160
150
|
return {
|
|
161
151
|
ok: false,
|
|
162
|
-
reason: "frontend
|
|
152
|
+
reason: "frontend prewrite result artifact failed schema validation",
|
|
163
153
|
};
|
|
164
154
|
}
|
|
165
155
|
return { ok: true, result: result.data, artifactHash };
|
|
166
156
|
}
|
|
167
|
-
/**
|
|
168
|
-
* M8 alias: read the writer admission result artifact under the explicit name.
|
|
169
|
-
* Same fail-closed semantics as `readFrontendPrewriteResult`.
|
|
170
|
-
*/
|
|
171
|
-
export async function readFrontendWriterAdmissionResult(runDir) {
|
|
172
|
-
return readFrontendPrewriteResult(runDir);
|
|
173
|
-
}
|
|
174
|
-
/** Authorize only the `accepted` classification (four-state admission).
|
|
175
|
-
* `requires-human-approval`, `blocked`, and `stale` are all denied. */
|
|
157
|
+
/** Authorize only accepted / accepted-normalized classifications. */
|
|
176
158
|
export function isFrontendWriterAuthorized(result) {
|
|
177
159
|
return result.classification === "accepted" ||
|
|
178
|
-
result.classification === "
|
|
160
|
+
result.classification === "accepted-normalized"
|
|
179
161
|
? "authorized"
|
|
180
162
|
: "denied";
|
|
181
163
|
}
|
|
@@ -440,86 +422,6 @@ export async function executeDagRanksOnce(input) {
|
|
|
440
422
|
}
|
|
441
423
|
const frontendAdmissionSkippedSet = new Set(frontendAdmissionSettled);
|
|
442
424
|
const runnableAfterAdmission = actuallyRunnable.filter((id) => !frontendAdmissionSkippedSet.has(id));
|
|
443
|
-
// Shape boundaries are rank gates: evaluate every protected candidate
|
|
444
|
-
// before creating an executor or starting any sibling in the rank.
|
|
445
|
-
const shapeBlocked = new Set();
|
|
446
|
-
const checkedBoundaries = new Set();
|
|
447
|
-
let shapeTerminalCommitted = false;
|
|
448
|
-
for (const id of runnableAfterAdmission) {
|
|
449
|
-
const mapping = boundaryForTargetNode(id);
|
|
450
|
-
if (!mapping || checkedBoundaries.has(mapping.boundary))
|
|
451
|
-
continue;
|
|
452
|
-
checkedBoundaries.add(mapping.boundary);
|
|
453
|
-
const sourceNode = input.state.nodes[mapping.sourceNodeId];
|
|
454
|
-
const fact = input.state.frontendShapeState?.committedFacts[mapping.boundary];
|
|
455
|
-
const outcome = evaluateFrontendShapeBoundary({
|
|
456
|
-
boundary: mapping.boundary,
|
|
457
|
-
sourceNode: sourceNode
|
|
458
|
-
? { status: sourceNode.status, digest: computeFrontendShapeNodeDigest(sourceNode) }
|
|
459
|
-
: undefined,
|
|
460
|
-
fact,
|
|
461
|
-
});
|
|
462
|
-
if (outcome.kind === "continue") {
|
|
463
|
-
if (input.state.frontendShapeState) {
|
|
464
|
-
input.state.frontendShapeState.lastBoundary = mapping.boundary;
|
|
465
|
-
input.state.frontendShapeState.lastOutcome = outcome.kind;
|
|
466
|
-
await input.persistState();
|
|
467
|
-
}
|
|
468
|
-
continue;
|
|
469
|
-
}
|
|
470
|
-
if (outcome.kind === "blocked") {
|
|
471
|
-
if (input.state.frontendShapeState) {
|
|
472
|
-
input.state.frontendShapeState.lastBoundary = mapping.boundary;
|
|
473
|
-
input.state.frontendShapeState.lastOutcome = outcome.kind;
|
|
474
|
-
}
|
|
475
|
-
const finishedAt = new Date().toISOString();
|
|
476
|
-
for (const targetId of mapping.targetNodeIds) {
|
|
477
|
-
if (!runnableAfterAdmission.includes(targetId))
|
|
478
|
-
continue;
|
|
479
|
-
const node = input.state.nodes[targetId];
|
|
480
|
-
if (!node || node.status !== "PENDING")
|
|
481
|
-
continue;
|
|
482
|
-
node.status = "SKIPPED";
|
|
483
|
-
node.skippedReason = outcome.reason;
|
|
484
|
-
node.finishedAt = finishedAt;
|
|
485
|
-
shapeBlocked.add(targetId);
|
|
486
|
-
}
|
|
487
|
-
await input.persistState();
|
|
488
|
-
continue;
|
|
489
|
-
}
|
|
490
|
-
if (!fact || !input.commitFrontendShapeTransition) {
|
|
491
|
-
const finishedAt = new Date().toISOString();
|
|
492
|
-
for (const targetId of mapping.targetNodeIds) {
|
|
493
|
-
const node = input.state.nodes[targetId];
|
|
494
|
-
if (!node || node.status !== "PENDING")
|
|
495
|
-
continue;
|
|
496
|
-
node.status = "SKIPPED";
|
|
497
|
-
node.skippedReason = "frontend-shape-transition-cas-unavailable";
|
|
498
|
-
node.finishedAt = finishedAt;
|
|
499
|
-
shapeBlocked.add(targetId);
|
|
500
|
-
}
|
|
501
|
-
await input.persistState();
|
|
502
|
-
continue;
|
|
503
|
-
}
|
|
504
|
-
const committed = await input.commitFrontendShapeTransition({
|
|
505
|
-
boundary: mapping.boundary,
|
|
506
|
-
outcome: outcome.kind,
|
|
507
|
-
reason: outcome.reason,
|
|
508
|
-
expectedRevision: input.state.frontendShapeState?.revision ?? 0,
|
|
509
|
-
fact,
|
|
510
|
-
});
|
|
511
|
-
if (committed.ok) {
|
|
512
|
-
shapeTerminalCommitted = true;
|
|
513
|
-
break;
|
|
514
|
-
}
|
|
515
|
-
// A failed transition CAS must remain zero-write. Stop the controller
|
|
516
|
-
// before any executor starts; never compensate with a capsule-less
|
|
517
|
-
// terminal state or mutate pending descendants.
|
|
518
|
-
throw new Error(`frontend shape transition CAS failed at ${mapping.boundary}: ${committed.reason}`);
|
|
519
|
-
}
|
|
520
|
-
if (shapeTerminalCommitted)
|
|
521
|
-
break;
|
|
522
|
-
const runnableAfterShape = runnableAfterAdmission.filter((id) => !shapeBlocked.has(id));
|
|
523
425
|
const blocked = pending.filter((id) => {
|
|
524
426
|
const task = input.tasksById.get(id);
|
|
525
427
|
return (dependencyReadiness(task, input.state.nodes, input.tasksById) === "skip");
|
|
@@ -534,12 +436,12 @@ export async function executeDagRanksOnce(input) {
|
|
|
534
436
|
if (blocked.length > 0) {
|
|
535
437
|
await input.persistState();
|
|
536
438
|
}
|
|
537
|
-
const pauseGateRunnable =
|
|
439
|
+
const pauseGateRunnable = runnableAfterAdmission.filter((id) => {
|
|
538
440
|
const task = input.tasksById.get(id);
|
|
539
441
|
return isPauseOnHumanDecisionGate(task);
|
|
540
442
|
});
|
|
541
|
-
const regularRunnable =
|
|
542
|
-
const rankWriterNodeIds =
|
|
443
|
+
const regularRunnable = runnableAfterAdmission.filter((id) => !pauseGateRunnable.includes(id));
|
|
444
|
+
const rankWriterNodeIds = runnableAfterAdmission.filter((id) => {
|
|
543
445
|
const task = input.tasksById.get(id);
|
|
544
446
|
return (task?.executor === "pi" &&
|
|
545
447
|
task.toolProfile === "write" &&
|
|
@@ -333,11 +333,27 @@ function parseSnapshot(value) {
|
|
|
333
333
|
export async function cloneParentSkillSnapshotForContinuation(input) {
|
|
334
334
|
const parentSnapshot = await readSkillSnapshot(input.parentRunDir, input.parentRef, { expectedRunId: input.parentRunId });
|
|
335
335
|
const parentSnapshotSha256 = hashSkillSnapshot(parentSnapshot);
|
|
336
|
+
const initialTaskIds = input.spec
|
|
337
|
+
? input.spec.tasks.map((task) => task.id)
|
|
338
|
+
: parentSnapshot.initialTaskIds;
|
|
339
|
+
const bindings = input.spec
|
|
340
|
+
? collectDagSkillSnapshotBindings(input.spec, initialTaskIds)
|
|
341
|
+
: parentSnapshot.bindings;
|
|
342
|
+
const boundProfileIds = new Set(bindings.map((binding) => binding.profileId));
|
|
343
|
+
const profiles = parentSnapshot.profiles.filter((profile) => boundProfileIds.has(profile.id));
|
|
344
|
+
for (const profileId of boundProfileIds) {
|
|
345
|
+
if (!profiles.some((profile) => profile.id === profileId)) {
|
|
346
|
+
throw new DagSkillSnapshotIntegrityError(`continuation run spec requires profile missing from parent snapshot: ${profileId}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
336
349
|
const cloned = {
|
|
337
350
|
...structuredClone(parentSnapshot),
|
|
338
351
|
runId: input.newRunId,
|
|
339
352
|
createdAt: (input.now ?? new Date()).toISOString(),
|
|
340
353
|
mode: "continuation-from-parent",
|
|
354
|
+
initialTaskIds,
|
|
355
|
+
bindings,
|
|
356
|
+
profiles,
|
|
341
357
|
};
|
|
342
358
|
const ref = await writeSkillSnapshot(input.newRunDir, cloned);
|
|
343
359
|
await writeJsonAtomic(path.join(input.newRunDir, ...SKILL_SNAPSHOT_CONTINUATION_REL_PATH.split("/")), {
|
|
@@ -540,6 +556,7 @@ export function buildNodePromptFromSnapshot(input) {
|
|
|
540
556
|
spec: input.spec,
|
|
541
557
|
task: input.task,
|
|
542
558
|
upstream: input.upstream,
|
|
559
|
+
runDir: input.runDir,
|
|
543
560
|
resolvedSkills: skillNames,
|
|
544
561
|
resolvedSkillInstructions,
|
|
545
562
|
maxUpstreamChars: policy.resolveMaxUpstreamChars(input.task),
|