@tea-agent/loop-agent 0.41.1 → 0.42.0-next.10
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/AGENTS.md +1 -1
- package/CHANGELOG.md +397 -5
- 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 +75 -19
- package/dist/application/dag/run-dag.js +41 -0
- package/dist/application/task-lifecycle/advance.js +24 -5
- package/dist/application/task-lifecycle/observe.js +171 -17
- package/dist/application/task-lifecycle/plan-transitions.js +42 -7
- package/dist/application/task-lifecycle/recommendations.js +13 -2
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +19 -0
- package/dist/cli/program.js +29 -2
- package/dist/commands/client-recovery.js +3 -0
- package/dist/commands/dag-artifact.js +284 -0
- package/dist/commands/dag-context.js +184 -0
- package/dist/commands/dag-follow-up.js +138 -0
- package/dist/commands/dag-rerun-task.js +2 -0
- package/dist/commands/dag-rerun.js +206 -1
- package/dist/commands/init.js +27 -1
- package/dist/commands/task-advance.js +19 -0
- package/dist/executors/dag-pi-executor.js +4013 -86
- package/dist/executors/pi-executor.js +15 -4
- package/dist/executors/pi-read-budget-policy.js +239 -0
- package/dist/executors/pi-sdk-executor.js +3 -0
- package/dist/executors/shell-executor.js +978 -188
- package/dist/executors/shell-write-guard.js +7 -0
- 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 +417 -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 +12 -0
- package/dist/shared/openspec-spec.js +70 -4
- package/dist/shared/operator/capabilities.js +21 -0
- 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 +107 -6
- package/dist/task/contract/adopt.js +4 -0
- package/dist/task/contract/import-revision.js +4 -0
- package/dist/task/contract/project.js +3 -0
- package/dist/task/contract/schema.js +2 -1
- package/dist/task/frontend-project-capability.js +203 -20
- package/dist/task/runtime.js +5 -2
- package/dist/task/source-prepare/build-draft.js +3 -3
- package/dist/task/source-prepare/fragment-inventory.js +64 -25
- package/dist/task/source-prepare/prepare.js +126 -21
- package/dist/task/source-prepare/semantic-intake.js +6 -2
- package/dist/task/source-references.js +22 -1
- 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/model-resolver.js +7 -4
- package/dist/worker/console/chat/pi-runtime.js +86 -5
- package/dist/worker/console/chat/resource-preferences-store.js +1 -1
- package/dist/worker/console/chat/routes.js +136 -53
- package/dist/worker/console/chat/sdd-data-alignment.js +222 -0
- package/dist/worker/console/chat/session-catalog.js +2 -0
- package/dist/worker/console/chat/session-store.js +43 -1
- package/dist/worker/console/chat/shortcuts.js +18 -2
- 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/frontend-human-decision-adapter.js +19 -0
- package/dist/worker/console/frontend-split-operation-adapter.js +20 -0
- package/dist/worker/console/human-gate-token.js +1 -1
- package/dist/worker/console/index.js +6 -3
- 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 +273 -10
- 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 +57 -0
- package/dist/worker/console/pi-readiness.js +3 -2
- package/dist/worker/console/routes.js +637 -8
- package/dist/worker/console/security.js +35 -0
- package/dist/worker/console/server.js +29 -4
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-D7oU983t.js → abnfDiagram-N423BO3Z-CcS17TBr.js} +1 -1
- package/dist/worker/console/static/assets/{arc-BrKSRdFS.js → arc-COptKq2S.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CiXV7L56.js → architectureDiagram-T3A2C74G-h4LKMHjP.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-D_Hs_gIG.js → blockDiagram-VBNYF7ZC-COA1MOH0.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DbM-Lqqh.js → c4Diagram-5PPSVZJV-DJUf0QPm.js} +1 -1
- package/dist/worker/console/static/assets/channel-DdBCaOJ6.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D1M8uqJw.js → chunk-2GRJ4B5K-mtWfKrUX.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-4D3RFHT6.js → chunk-2Q5K7J3B-B8pXsxDQ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-CdwpY_n9.js → chunk-5RXB4S5H-ipKzByl1.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BLeLZ9PG.js → chunk-5VM5RSS4-DYi3Ald_.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-CeRNEMvc.js → chunk-6Q2QTUOP-DQtGYoty.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CjkHP8Vy.js → chunk-GF5L2VYU-BU0qS2YV.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-B54ZUQY-.js → chunk-JWPE2WC7-DVH9dIGE.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-4bKaMVmx.js → chunk-KBJHAD2P-Dt60SmgM.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-Cyjfznu_.js → chunk-RYQCIY6F-BoaUGuEY.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-CDN-zGFV.js → chunk-XXDRQBXY-_WHFDTp2.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DZFra1GO.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DZFra1GO.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-HxJmz411.js → cose-bilkent-JH36ORCC-BxkbTIRd.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-DtSt5K2w.js → cynefin-VYW2F7L2-Bf2UVnoG.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-VtkSpRmG.js → cynefinDiagram-MW4NZA55-Bo23q1J_.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-Bj4DT4du.js → dagre-VZM6K2ZE-Dd_UU49i.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Bpuk6BmP.js → diagram-7IWD3JNH-ebUa1a9y.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-BHYGv_yO.js → diagram-B4RE2ZJO-BucthU8r.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DEx3WwnT.js → diagram-LBJQPF4R-BgqNpAkm.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-Cj0dS5e8.js → diagram-Q27KOJAE-DC4q5NGa.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-B97h8l21.js → diagram-UB23O5K3-CBqCaMeb.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DMSFAhBd.js → ebnfDiagram-BXEA7PRR-CGtnbQ3-.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DhVOCbt6.js → erDiagram-JOGREHBK-CG3LUao5.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-GlakITWL.js → flowDiagram-UKHOOZJN-D2ZVgoFS.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-VxPpu9eQ.js → ganttDiagram-PKOTCBZU-DoYFZiKt.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Bs_e5DRT.js → gitGraphDiagram-DS77QQ5N-CKoP1s6j.js} +1 -1
- package/dist/worker/console/static/assets/index-CAZ2fC_X.css +1 -0
- package/dist/worker/console/static/assets/index-vbTcFnFs.js +449 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BXYuU4Uw.js → infoDiagram-6WML65LV-Duofv8p2.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-C34erCbU.js → ishikawaDiagram-WSZJBQD7-D2nlCkA1.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DZCAiOU3.js → journeyDiagram-NVQOT4AX-Dd4IHdus.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-C9gaTdUm.js → kanban-definition-27J2QSJJ-Bi20AOdt.js} +1 -1
- package/dist/worker/console/static/assets/{linear-CvI0Z17U.js → linear-D59YJ9kB.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-DMMSIx7j.js → mermaid.core-Bl13LpNa.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-BKKP0EO6.js → mindmap-definition-FAOFIHXS-C6DLP5eY.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-C3LiFbl5.js → pegDiagram-VL7TDLO6-BjO4cy64.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-Bb3Om2Dz.js → pieDiagram-7S7Q4E2Y-D7i2qZTG.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-DNthMjzc.js → quadrantDiagram-CIZ2JOQS-Dx8o_h0y.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-miFsr4Tv.js → railroadDiagram-AXF67PYL-B55orI_t.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-yXUncmn6.js → requirementDiagram-LRYGKXZP-zWaehp6f.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-DLeWKLak.js → sankeyDiagram-W5VNT64P-CcA-pjvD.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-CI3he1R3.js → sequenceDiagram-SI44F4Z6-BOFbzNHI.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-B7jfDkS5.js → sizeCapture-X5ZJPWSS-BjAejah1.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-BmrZod7J.js → stateDiagram-OKZ733FA-DXYwxJwZ.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Clg3V9t1.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-CDOlHVSY.js → swimlanes-SLNWSIFB-OYiOch8n.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DX1dxAAW.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Cz-XX1gy.js → timeline-definition-Z64GVDOM-cZfH3nmU.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-caV4cI8C.js → vennDiagram-T6HMQDX7-BDE7b3E1.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-dImPlnIO.js → wardleyDiagram-T6FBY63Y-kyyGy9WJ.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CtRYVJcn.js → xychartDiagram-ELKLHX3M-CJj6VTog.js} +1 -1
- package/dist/worker/console/static/index.html +7 -2
- package/dist/worker/console/static-src/active-run-badge.js +17 -0
- package/dist/worker/console/static-src/app/useOperatorActions.js +3 -2
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +5 -5
- package/dist/worker/console/static-src/operator-chat/input-history.js +8 -6
- package/dist/worker/console/static-src/operator-chat/runtime-snapshot-store.js +10 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +258 -23
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +112 -4
- package/dist/worker/console/static-src/operator-chat/useComposer.js +13 -4
- package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +29 -6
- package/dist/worker/console/static-src/operator-chat/useRuntimeSnapshot.js +8 -2
- package/dist/worker/console/static-src/shell/console-update-reload.js +52 -0
- package/dist/worker/console/static-src/shell/workspace-route.js +11 -0
- package/dist/worker/console/workspace-context.js +142 -2
- package/dist/worker/console/workspace-registry.js +2 -2
- package/dist/worker/continuation/worker-continuation.js +278 -0
- package/dist/worker/materialize/frontend-split-task-materializer.js +72 -0
- package/dist/worker/observe/health.js +1 -1
- package/dist/worker/observe/node-transparency.js +572 -0
- package/dist/worker/observe/routes.js +55 -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-helpers.js +4 -2
- package/dist/worker/observe/static/dag-node-purpose.js +5 -0
- package/dist/worker/observe/static/inspect-workspace.js +23 -0
- package/dist/worker/observe/static/kpi.js +2 -2
- package/dist/worker/observe/static/operator-chrome.d.ts +10 -2
- package/dist/worker/observe/static/operator-chrome.js +37 -23
- package/dist/worker/observe/static/relations.js +2 -2
- package/dist/worker/observe/static/router.d.ts +12 -1
- package/dist/worker/observe/static/router.js +48 -6
- package/dist/worker/observe/static/run-processing.js +4 -2
- package/dist/worker/observe/static/shell-chrome.js +2 -2
- package/dist/worker/observe/static/state.js +8 -1
- package/dist/worker/observe/static/styles.css +1092 -86
- package/dist/worker/observe/static/views/dag-inspector.js +1228 -64
- package/dist/worker/observe/static/views/dag.js +10 -2
- package/dist/worker/observe/static/views/dags.js +3 -1
- package/dist/worker/observe/static/views/dashboard.js +14 -6
- package/dist/worker/observe/static/views/pool.js +7 -2
- package/dist/worker/observe/static/views/run.js +12 -3
- package/dist/worker/observe/static/views/session-timeline.js +142 -18
- package/dist/worker/observe/static/views/task.js +7 -2
- 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 +215 -28
- package/dist/workflows/dag/backend-test-markdown-workflow.js +13 -1
- package/dist/workflows/dag/backend-test-plan-protocol.js +106 -0
- package/dist/workflows/dag/backend-test-scenario-param.js +172 -25
- package/dist/workflows/dag/backend-test-scenario-partitions.js +62 -1
- package/dist/workflows/dag/backend-test-writer-completeness.js +104 -12
- 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 +1 -2
- package/dist/workflows/dag/dag-retry-schema.js +138 -0
- package/dist/workflows/dag/frontend-closeout.js +221 -0
- package/dist/workflows/dag/frontend-design-policy.js +400 -0
- package/dist/workflows/dag/frontend-human-decision.js +182 -0
- package/dist/workflows/dag/frontend-implementation-contract.js +1237 -192
- package/dist/workflows/dag/frontend-plan-render.js +2 -1
- package/dist/workflows/dag/frontend-prewrite-gate.js +256 -350
- package/dist/workflows/dag/frontend-provider-capability-matrix.js +159 -0
- package/dist/workflows/dag/frontend-recovery-capsule.js +455 -0
- package/dist/workflows/dag/frontend-recovery-controller.js +226 -0
- package/dist/workflows/dag/frontend-recovery-lineage.js +178 -0
- package/dist/workflows/dag/frontend-recovery-plan.js +21 -10
- package/dist/workflows/dag/frontend-recovery-run.js +166 -34
- package/dist/workflows/dag/frontend-repair.js +1 -432
- package/dist/workflows/dag/frontend-review-context.js +261 -15
- package/dist/workflows/dag/frontend-review-findings.js +270 -0
- package/dist/workflows/dag/frontend-shadow-dual-write.js +941 -0
- package/dist/workflows/dag/frontend-shape-capsule-store.js +191 -0
- package/dist/workflows/dag/frontend-shape-facts.js +419 -0
- package/dist/workflows/dag/frontend-shape.js +435 -0
- package/dist/workflows/dag/frontend-source-fidelity-ledger.js +108 -0
- package/dist/workflows/dag/frontend-split-application-service.js +203 -0
- package/dist/workflows/dag/frontend-split-orchestrator.js +899 -0
- package/dist/workflows/dag/frontend-typed-event-store.js +452 -0
- package/dist/workflows/dag/frontend-typed-event-transaction.js +180 -0
- package/dist/workflows/dag/frontend-verification-trace.js +252 -25
- package/dist/workflows/dag/frontend-worktree-diff.js +250 -17
- package/dist/workflows/dag/frontend-writer-admission.js +319 -0
- package/dist/workflows/dag/frontend-writer-rollback.js +32 -0
- package/dist/workflows/dag/frontend-writer-status.js +256 -0
- package/dist/workflows/dag/init-hybrid.js +1174 -562
- package/dist/workflows/dag/interrupt-request.js +7 -0
- package/dist/workflows/dag/node-execution.js +940 -31
- package/dist/workflows/dag/path-safety.js +1 -0
- package/dist/workflows/dag/prompt.js +99 -7
- package/dist/workflows/dag/recovery-lease.js +170 -0
- package/dist/workflows/dag/report.js +37 -1
- package/dist/workflows/dag/rerun-feedback.js +315 -1
- package/dist/workflows/dag/rerun-plan.js +568 -3
- package/dist/workflows/dag/rerun-run.js +642 -18
- package/dist/workflows/dag/rerun-task.js +251 -13
- package/dist/workflows/dag/retry-policy.js +219 -104
- package/dist/workflows/dag/runner.js +596 -121
- package/dist/workflows/dag/scheduler.js +133 -20
- package/dist/workflows/dag/skill-snapshot.js +17 -0
- package/dist/workflows/dag/types.js +426 -22
- package/dist/workflows/dag/validate.js +28 -12
- package/docs/architecture/runtime-boundaries.md +6 -6
- package/docs/architecture/worker-and-feature.md +1 -1
- package/docs/examples/README.md +5 -0
- package/docs/init-surface.manifest.json +30 -12
- package/docs/skills/vetted-skill-registry.md +4 -2
- package/docs/templates/README.md +2 -0
- package/docs/templates/agent-dag-report.schema.json +8 -2
- package/docs/templates/agent-dag.schema.json +33 -1
- package/docs/templates/backend-test-dag.json +23 -20
- package/docs/templates/frontend-implementation-contract.schema.json +4 -1
- package/docs/templates/frontend-implementation-dag.json +89 -0
- package/docs/templates/product-line/task.yaml +1 -1
- package/docs/templates/spec-registry.schema.json +45 -0
- package/harness.json +1 -1
- package/package.json +6 -3
- package/skills/frontend-bounded-implement/SKILL.md +15 -14
- package/skills/frontend-bounded-implement/references/code-standards.md +19 -0
- package/skills/frontend-contract/SKILL.md +23 -0
- package/skills/frontend-contract/references/contract-protocol.md +34 -0
- package/skills/frontend-design-review/SKILL.md +22 -41
- package/skills/frontend-plan/SKILL.md +26 -0
- package/skills/frontend-plan/references/decision-contract.md +37 -0
- package/skills/frontend-plan/references/design-decisions.md +17 -0
- package/skills/frontend-review/SKILL.md +20 -15
- package/skills/frontend-review/references/review-findings.md +6 -7
- package/skills/frontend-scout/SKILL.md +25 -0
- package/skills/frontend-scout/references/design-evidence.md +16 -0
- package/skills/frontend-scout/references/scout-evidence.md +23 -0
- package/skills/frontend-verification/SKILL.md +1 -1
- package/skills/loop-agent/references/command-reference.md +7 -0
- package/skills/loop-agent/references/hybrid-dag.md +2 -2
- package/dist/worker/console/operation-store.js +0 -169
- package/dist/worker/console/static/assets/channel-D1xajGpe.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BmuGTfRr.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BmuGTfRr.js +0 -1
- package/dist/worker/console/static/assets/index-BLzcAykx.js +0 -451
- package/dist/worker/console/static/assets/index-Cs9JUSPs.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-D9ykKEWP.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BvPOXALT.js +0 -8
- package/skills/frontend-implementation/SKILL.md +0 -52
- package/skills/frontend-implementation/references/code-standards.md +0 -33
- package/skills/frontend-implementation/references/design-spec.md +0 -56
- package/skills/frontend-implementation/references/node-contracts.md +0 -31
- /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
|
@@ -19,6 +19,7 @@ export async function beginWorkerAttemptWithLease(input) {
|
|
|
19
19
|
...(input.controllerAnchor
|
|
20
20
|
? { controllerAnchor: input.controllerAnchor }
|
|
21
21
|
: {}),
|
|
22
|
+
...(input.leaseClaimId ? { claimId: input.leaseClaimId } : {}),
|
|
22
23
|
...(input.now ? { now: input.now } : {}),
|
|
23
24
|
});
|
|
24
25
|
const begun = await beginWorkerAttempt(input);
|
|
@@ -3,6 +3,8 @@ import path from "node:path";
|
|
|
3
3
|
import { executeDagReconcileRun } from "../../workflows/dag/reconcile-run.js";
|
|
4
4
|
import { assessDagRunLiveness, assessDagRunRecoveryEligibility, locateDagRun, readDagRunState, } from "../../workflows/dag/lifecycle.js";
|
|
5
5
|
import { appendTaskPoolEvent, findRunByWorkerRunId, getTaskPoolRoot, readTaskPoolState, writeTaskPoolState, } from "./run-store.js";
|
|
6
|
+
import { readRunOwner } from "./run-owner-store.js";
|
|
7
|
+
import { readAttemptLease, releaseAttemptLease } from "./attempt-lease.js";
|
|
6
8
|
const RECOVERABLE_LIVENESS = new Set([
|
|
7
9
|
"active",
|
|
8
10
|
"node-quiet",
|
|
@@ -110,6 +112,17 @@ export async function reconcileTaskPoolAbandon(input) {
|
|
|
110
112
|
idempotent: false,
|
|
111
113
|
evidencePath: operatorRecovery.evidencePath,
|
|
112
114
|
});
|
|
115
|
+
const lease = await readAttemptLease(input.repoRoot, input.featureId, input.taskId);
|
|
116
|
+
if (lease?.workerRunId === input.workerRunId) {
|
|
117
|
+
await releaseAttemptLease({
|
|
118
|
+
repoRoot: input.repoRoot,
|
|
119
|
+
featureId: input.featureId,
|
|
120
|
+
taskId: input.taskId,
|
|
121
|
+
token: lease.token,
|
|
122
|
+
workerRunId: input.workerRunId,
|
|
123
|
+
now: input.now,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
113
126
|
return {
|
|
114
127
|
schemaVersion: 1,
|
|
115
128
|
status: "Failed",
|
|
@@ -201,7 +214,6 @@ export async function markTaskPoolFailed(input) {
|
|
|
201
214
|
};
|
|
202
215
|
}
|
|
203
216
|
async function validateWorkerDagAssociation(input) {
|
|
204
|
-
const run = await validateWorkerRunOwnership(input);
|
|
205
217
|
const dagLocated = await locateDagRun(input.repoRoot, input.dagRunId);
|
|
206
218
|
if (!dagLocated) {
|
|
207
219
|
throw new Error(`dag run not found: ${input.dagRunId}`);
|
|
@@ -210,6 +222,39 @@ async function validateWorkerDagAssociation(input) {
|
|
|
210
222
|
if (dagState.runId !== input.dagRunId) {
|
|
211
223
|
throw new Error(`dag run identity mismatch: expected ${input.dagRunId}, found ${dagState.runId}`);
|
|
212
224
|
}
|
|
225
|
+
let run = await findRunByWorkerRunId(input.repoRoot, input.workerRunId);
|
|
226
|
+
if (!run) {
|
|
227
|
+
const owner = await readRunOwner(input.repoRoot, input.workerRunId);
|
|
228
|
+
const association = dagState.workerAssociation;
|
|
229
|
+
const authority = dagState.continuation?.workerContinuationAuthority;
|
|
230
|
+
if (!owner ||
|
|
231
|
+
owner.featureId !== input.featureId ||
|
|
232
|
+
owner.taskId !== input.taskId ||
|
|
233
|
+
owner.workerRunId !== input.workerRunId ||
|
|
234
|
+
owner.revisionId === undefined ||
|
|
235
|
+
input.dagRunId !== input.workerRunId ||
|
|
236
|
+
association?.workerRunId !== input.workerRunId ||
|
|
237
|
+
association.featureId !== input.featureId ||
|
|
238
|
+
association.taskId !== input.taskId ||
|
|
239
|
+
authority?.childWorkerRunId !== input.workerRunId ||
|
|
240
|
+
authority.parentWorkerRunId === input.workerRunId ||
|
|
241
|
+
authority.revisionId !== owner.revisionId) {
|
|
242
|
+
throw new Error(`worker run not found: ${input.workerRunId}`);
|
|
243
|
+
}
|
|
244
|
+
run = {
|
|
245
|
+
schemaVersion: 1,
|
|
246
|
+
batchRunId: owner.batchRunId,
|
|
247
|
+
workerRunId: owner.workerRunId,
|
|
248
|
+
featureId: owner.featureId,
|
|
249
|
+
taskId: owner.taskId,
|
|
250
|
+
status: "run-error",
|
|
251
|
+
attemptKind: "artifact-continuation",
|
|
252
|
+
recordedAt: owner.registeredAt,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
else if (run.featureId !== input.featureId || run.taskId !== input.taskId) {
|
|
256
|
+
throw new Error(`worker run ownership mismatch: expected ${input.featureId}/${input.taskId}, found ${run.featureId}/${run.taskId}`);
|
|
257
|
+
}
|
|
213
258
|
const linked = await proveWorkerDagLink(input.repoRoot, run, input.workerRunId, input.dagRunId);
|
|
214
259
|
if (!linked) {
|
|
215
260
|
throw new Error(`worker run ${input.workerRunId} is not associated with dag run ${input.dagRunId}`);
|
|
@@ -350,6 +350,8 @@ function eventFromRun(run) {
|
|
|
350
350
|
taskId: run.taskId,
|
|
351
351
|
featureId: run.featureId,
|
|
352
352
|
status: run.status,
|
|
353
|
+
...(run.attemptKind ? { attemptKind: run.attemptKind } : {}),
|
|
354
|
+
...(run.continuation ? { continuation: run.continuation } : {}),
|
|
353
355
|
};
|
|
354
356
|
}
|
|
355
357
|
function isNotFound(error) {
|
|
@@ -47,6 +47,8 @@ export function stateFromRun(run) {
|
|
|
47
47
|
status: projectTaskPoolStatusFromRun(run),
|
|
48
48
|
updatedAt: run.recordedAt,
|
|
49
49
|
workerRunId: run.workerRunId,
|
|
50
|
+
...(run.attemptKind ? { attemptKind: run.attemptKind } : {}),
|
|
51
|
+
...(run.continuation ? { continuation: run.continuation } : {}),
|
|
50
52
|
...(run.runRecordPath ? { lastRunRecordPath: run.runRecordPath } : {}),
|
|
51
53
|
...(run.failure ? { failure: run.failure } : {}),
|
|
52
54
|
...(run.failureV2 ? { failureV2: run.failureV2 } : {}),
|
|
@@ -11,6 +11,7 @@ export const workflowSchema = z.enum([
|
|
|
11
11
|
"agent-dag",
|
|
12
12
|
"frontend-implementation",
|
|
13
13
|
"backend-test",
|
|
14
|
+
"backend-test-analysis",
|
|
14
15
|
"frontend-test",
|
|
15
16
|
]);
|
|
16
17
|
/**
|
|
@@ -23,6 +24,7 @@ export const WORKFLOW_TASK_KIND = {
|
|
|
23
24
|
"agent-dag": "standard",
|
|
24
25
|
"frontend-implementation": "frontend-implementation",
|
|
25
26
|
"backend-test": "backend-test",
|
|
27
|
+
"backend-test-analysis": "backend-test-analysis",
|
|
26
28
|
"frontend-test": "frontend-test",
|
|
27
29
|
};
|
|
28
30
|
/**
|
|
@@ -48,7 +50,7 @@ export function legacyDefaultWorkflow(type) {
|
|
|
48
50
|
}
|
|
49
51
|
/** Migration guidance surfaced whenever a legacy QA type lacks an explicit workflow. */
|
|
50
52
|
export const LEGACY_QA_MIGRATION_GUIDANCE = "Legacy qa-casegen/qa-testcode/qa-execute tasks no longer auto-select a backend or frontend workflow. " +
|
|
51
|
-
"Add `execution.workflow` with one of: agent-dag, frontend-implementation, backend-test, frontend-test. " +
|
|
53
|
+
"Add `execution.workflow` with one of: agent-dag, frontend-implementation, backend-test-analysis, backend-test, frontend-test. " +
|
|
52
54
|
"Use backend-test for backend-only test generation/execution, frontend-test for browser/UI tests, " +
|
|
53
55
|
"or agent-dag when the QA task is a generic agent study.";
|
|
54
56
|
export class WorkflowRoutingError extends Error {
|
|
@@ -120,10 +122,13 @@ export function validateWorkflowCompatibility(taskSpec) {
|
|
|
120
122
|
}
|
|
121
123
|
const issues = [];
|
|
122
124
|
const type = taskSpec.type;
|
|
123
|
-
if (type === "backend-feature" &&
|
|
125
|
+
if (type === "backend-feature" &&
|
|
126
|
+
explicit !== "agent-dag" &&
|
|
127
|
+
explicit !== "backend-test-analysis" &&
|
|
128
|
+
explicit !== "backend-test") {
|
|
124
129
|
issues.push({
|
|
125
130
|
code: "workflow-type-incompatible",
|
|
126
|
-
message: `backend-feature is incompatible with workflow "${explicit}" (expected agent-dag or backend-test)`,
|
|
131
|
+
message: `backend-feature is incompatible with workflow "${explicit}" (expected agent-dag, backend-test-analysis, or backend-test)`,
|
|
127
132
|
path: "execution.workflow",
|
|
128
133
|
});
|
|
129
134
|
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { canonicalSha256 } from "../../shared/context-transfer.js";
|
|
5
|
+
export function buildArtifactBindingGraph(spec) {
|
|
6
|
+
const consumers = new Map();
|
|
7
|
+
for (const task of spec.tasks) {
|
|
8
|
+
for (const binding of task.consumesArtifacts ?? []) {
|
|
9
|
+
const nodeIds = consumers.get(binding.artifactId) ?? [];
|
|
10
|
+
nodeIds.push(task.id);
|
|
11
|
+
consumers.set(binding.artifactId, nodeIds);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const artifacts = spec.tasks
|
|
15
|
+
.flatMap((task) => (task.producesArtifacts ?? []).map((artifact) => ({
|
|
16
|
+
...artifact,
|
|
17
|
+
producerNodeId: task.id,
|
|
18
|
+
directConsumerNodeIds: [...(consumers.get(artifact.artifactId) ?? [])].sort(),
|
|
19
|
+
})))
|
|
20
|
+
.sort((a, b) => a.artifactId.localeCompare(b.artifactId));
|
|
21
|
+
const available = artifacts.length > 0;
|
|
22
|
+
const payload = { schemaVersion: 1, artifacts };
|
|
23
|
+
return {
|
|
24
|
+
...payload,
|
|
25
|
+
available,
|
|
26
|
+
...(available ? {} : { reasonCode: "ARTIFACT_BINDING_UNAVAILABLE" }),
|
|
27
|
+
artifactGraphSha256: canonicalSha256(payload),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function collectDescendants(spec, roots) {
|
|
31
|
+
const children = new Map();
|
|
32
|
+
for (const task of spec.tasks) {
|
|
33
|
+
for (const parent of task.depends_on) {
|
|
34
|
+
const values = children.get(parent) ?? [];
|
|
35
|
+
values.push(task.id);
|
|
36
|
+
children.set(parent, values);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const queue = [...roots];
|
|
40
|
+
const seen = new Set();
|
|
41
|
+
while (queue.length > 0) {
|
|
42
|
+
const nodeId = queue.shift();
|
|
43
|
+
if (seen.has(nodeId))
|
|
44
|
+
continue;
|
|
45
|
+
seen.add(nodeId);
|
|
46
|
+
queue.push(...(children.get(nodeId) ?? []));
|
|
47
|
+
}
|
|
48
|
+
return spec.tasks.map((task) => task.id).filter((nodeId) => seen.has(nodeId));
|
|
49
|
+
}
|
|
50
|
+
export function computeArtifactImpact(spec, artifactId) {
|
|
51
|
+
const graph = buildArtifactBindingGraph(spec);
|
|
52
|
+
const artifact = graph.artifacts.find((entry) => entry.artifactId === artifactId);
|
|
53
|
+
if (!artifact || artifact.directConsumerNodeIds.length === 0)
|
|
54
|
+
return undefined;
|
|
55
|
+
const affectedNodeIds = collectDescendants(spec, artifact.directConsumerNodeIds);
|
|
56
|
+
const affectedSet = new Set(affectedNodeIds);
|
|
57
|
+
const importedNodeIds = spec.tasks
|
|
58
|
+
.map((task) => task.id)
|
|
59
|
+
.filter((nodeId) => !affectedSet.has(nodeId));
|
|
60
|
+
return {
|
|
61
|
+
artifactId,
|
|
62
|
+
producerNodeId: artifact.producerNodeId,
|
|
63
|
+
directConsumerNodeIds: artifact.directConsumerNodeIds,
|
|
64
|
+
effectiveFromNodeId: affectedNodeIds[0],
|
|
65
|
+
affectedNodeIds,
|
|
66
|
+
importedNodeIds,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function runtimeArtifactFields(node, kind) {
|
|
70
|
+
if (kind === "structured") {
|
|
71
|
+
return {
|
|
72
|
+
path: node.structuredArtifactPath,
|
|
73
|
+
sha256: node.structuredArtifactSha256,
|
|
74
|
+
schemaId: node.structuredArtifactSchemaId,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (kind === "assistant") {
|
|
78
|
+
return { path: node.assistantArtifactPath, sha256: node.assistantSha256 };
|
|
79
|
+
}
|
|
80
|
+
return { path: node.stdoutArtifactPath, sha256: node.stdoutSha256 };
|
|
81
|
+
}
|
|
82
|
+
export async function materializeDeclaredArtifactFacts(input) {
|
|
83
|
+
const facts = [];
|
|
84
|
+
for (const declaration of input.task.producesArtifacts ?? []) {
|
|
85
|
+
const runtime = runtimeArtifactFields(input.node, declaration.kind);
|
|
86
|
+
const base = { ...declaration, revisionEligible: false };
|
|
87
|
+
if (!runtime.path || !runtime.sha256) {
|
|
88
|
+
facts.push({
|
|
89
|
+
...base,
|
|
90
|
+
status: "missing",
|
|
91
|
+
reasonCode: "ARTIFACT_NOT_MATERIALIZED",
|
|
92
|
+
});
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const relativePath = path
|
|
96
|
+
.relative(input.runDir, runtime.path)
|
|
97
|
+
.split(path.sep)
|
|
98
|
+
.join("/");
|
|
99
|
+
if (relativePath !== declaration.path) {
|
|
100
|
+
facts.push({
|
|
101
|
+
...base,
|
|
102
|
+
status: "mismatch",
|
|
103
|
+
sha256: runtime.sha256,
|
|
104
|
+
reasonCode: "ARTIFACT_PATH_MISMATCH",
|
|
105
|
+
});
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (declaration.schemaId !== runtime.schemaId) {
|
|
109
|
+
facts.push({
|
|
110
|
+
...base,
|
|
111
|
+
status: "mismatch",
|
|
112
|
+
sha256: runtime.sha256,
|
|
113
|
+
reasonCode: "ARTIFACT_SCHEMA_MISMATCH",
|
|
114
|
+
});
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
let bytes;
|
|
118
|
+
try {
|
|
119
|
+
bytes = await readFile(runtime.path);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
facts.push({
|
|
123
|
+
...base,
|
|
124
|
+
status: "missing",
|
|
125
|
+
reasonCode: "ARTIFACT_NOT_MATERIALIZED",
|
|
126
|
+
});
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const actualSha256 = createHash("sha256").update(bytes).digest("hex");
|
|
130
|
+
if (actualSha256 !== runtime.sha256) {
|
|
131
|
+
facts.push({
|
|
132
|
+
...base,
|
|
133
|
+
status: "mismatch",
|
|
134
|
+
sha256: actualSha256,
|
|
135
|
+
bytes: bytes.byteLength,
|
|
136
|
+
reasonCode: "ARTIFACT_HASH_MISMATCH",
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
facts.push({
|
|
141
|
+
...base,
|
|
142
|
+
status: "materialized",
|
|
143
|
+
sha256: actualSha256,
|
|
144
|
+
bytes: bytes.byteLength,
|
|
145
|
+
revisionEligible: declaration.revisionPolicy === "replace-file",
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return facts;
|
|
149
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { backendPytestCollectionFactsSchema, backendTestExecutionReadinessSchema } from "./backend-test-pytest-collection.js";
|
|
2
|
+
import { backendTestCaseManifestSchema } from "./backend-test-case-manifest.js";
|
|
3
|
+
import { backendTestAnalysisContractSchema } from "./backend-test-analysis-contract.js";
|
|
4
|
+
import { backendTestExecutionContractSchema } from "./backend-test-execution-contract.js";
|
|
5
|
+
import { backendTestCaseCoverageFactsSchema } from "./backend-test-case-coverage-analysis.js";
|
|
6
|
+
import { frontendImplementationContractSchema } from "./frontend-implementation-contract.js";
|
|
7
|
+
/**
|
|
8
|
+
* Standalone artifact revision schema registry (exec-plan
|
|
9
|
+
* 2026-08-25-console-node-context-artifact-rerun W4.3 / M4 exit criteria).
|
|
10
|
+
*
|
|
11
|
+
* Maps a frozen produced-artifact `schemaId` to a deterministic zod validator
|
|
12
|
+
* that can check candidate revision bytes without run context. Declared
|
|
13
|
+
* schemaIds without an entry here are rejected fail-closed with
|
|
14
|
+
* ARTIFACT_REVISION_SCHEMA_INVALID — an artifact cannot be staged until its
|
|
15
|
+
* schema is registered. Never guessed, never silently passed.
|
|
16
|
+
*/
|
|
17
|
+
const ARTIFACT_REVISION_SCHEMAS = Object.freeze({
|
|
18
|
+
"backend-test-pytest-collection-v3": backendPytestCollectionFactsSchema,
|
|
19
|
+
"backend-test-execution-readiness-v2": backendTestExecutionReadinessSchema,
|
|
20
|
+
"backend-test-case-manifest-v1": backendTestCaseManifestSchema,
|
|
21
|
+
"backend-test-analysis-v2": backendTestAnalysisContractSchema,
|
|
22
|
+
"backend-test-execution-v1": backendTestExecutionContractSchema,
|
|
23
|
+
"backend-test-case-coverage-facts-v4": backendTestCaseCoverageFactsSchema,
|
|
24
|
+
"frontend-implementation-contract-v1": frontendImplementationContractSchema,
|
|
25
|
+
});
|
|
26
|
+
export function resolveArtifactRevisionSchema(schemaId) {
|
|
27
|
+
return ARTIFACT_REVISION_SCHEMAS[schemaId];
|
|
28
|
+
}
|
|
29
|
+
export function listArtifactRevisionSchemaIds() {
|
|
30
|
+
return Object.keys(ARTIFACT_REVISION_SCHEMAS).sort();
|
|
31
|
+
}
|