@tea-agent/loop-agent 0.39.0-beta.1 → 0.39.0-beta.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 +4 -1
- package/CHANGELOG.md +248 -95
- package/README.md +9 -5
- package/bin/loop-agent.js +7 -3
- package/dist/application/task-lifecycle/advance.js +12 -0
- package/dist/application/task-lifecycle/recommendations.js +13 -2
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +23 -5
- package/dist/cli/program.js +21 -2
- package/dist/cli/update/notifier.js +2 -2
- package/dist/cli/update/runtime-activity.js +1 -29
- package/dist/cli.js +2 -1
- package/dist/commands/client-recovery.js +3 -0
- package/dist/commands/dag-follow-up.js +138 -0
- package/dist/commands/dag-rerun.js +55 -1
- package/dist/commands/init-model-catalog.js +464 -0
- package/dist/commands/init-upgrade.js +265 -97
- package/dist/commands/init.js +455 -28
- package/dist/commands/inspect-next.js +8 -0
- package/dist/commands/task-advance.js +19 -0
- package/dist/executors/dag-pi-executor.js +2306 -61
- package/dist/executors/pi-executor.js +7 -0
- package/dist/executors/pi-extension-resolver.js +233 -0
- package/dist/executors/pi-playwright-cli-tool.js +74 -28
- package/dist/executors/pi-read-budget-policy.js +239 -0
- package/dist/executors/pi-sdk-executor.js +180 -33
- package/dist/executors/shell-executor.js +1249 -224
- package/dist/executors/shell-write-guard.js +14 -0
- package/dist/executors/workspace-write-snapshot.js +68 -0
- package/dist/infrastructure/harness/atomic-write.js +23 -0
- package/dist/shared/dag-failure-category.js +150 -0
- package/dist/shared/dag-prompt-override.js +27 -0
- package/dist/shared/openspec-spec.js +70 -4
- package/dist/shared/operator/capabilities.js +39 -0
- package/dist/shared/playwright-cli-command-policy.js +15 -0
- package/dist/shared/update/console-notifier.js +100 -0
- package/dist/{cli → shared}/update/npm-client.js +70 -15
- package/dist/{cli → shared}/update/state.js +41 -13
- package/dist/task/config-types.js +50 -5
- package/dist/task/contract/apply.js +11 -1
- package/dist/task/contract/constants.js +2 -0
- package/dist/task/contract/hash.js +3 -0
- package/dist/task/contract/observe.js +25 -4
- package/dist/task/contract/paths.js +2 -1
- package/dist/task/contract/project.js +18 -1
- package/dist/task/contract/schema.js +4 -1
- package/dist/task/contract/transaction.js +12 -0
- package/dist/task/frontend-project-capability.js +199 -18
- package/dist/task/source-prepare/completeness.js +188 -0
- package/dist/task/source-prepare/fragment-inventory.js +477 -0
- package/dist/task/source-prepare/index.js +3 -0
- package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
- package/dist/task/source-prepare/ledger-review.js +214 -0
- package/dist/task/source-prepare/ledger.js +545 -0
- package/dist/task/source-prepare/parse-intent.js +24 -4
- package/dist/task/source-prepare/prepare.js +298 -1
- package/dist/task/source-prepare/semantic-intake.js +25 -5
- package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
- package/dist/task/source-prepare/types.js +22 -0
- package/dist/task/source-references.js +22 -1
- package/dist/worker/cli.js +18 -2
- package/dist/worker/console/chat/chat-event-store.js +62 -4
- package/dist/worker/console/chat/context-panel.js +7 -0
- package/dist/worker/console/chat/deferred-turn.js +12 -0
- package/dist/worker/console/chat/operation-card.js +8 -1
- package/dist/worker/console/chat/pi-console-config.js +81 -10
- package/dist/worker/console/chat/pi-runtime.js +264 -16
- package/dist/worker/console/chat/provider-error.js +98 -0
- package/dist/worker/console/chat/routes.js +298 -32
- package/dist/worker/console/chat/session-stats.js +179 -0
- package/dist/worker/console/chat/session-store.js +93 -63
- package/dist/worker/console/chat/todos.js +115 -0
- package/dist/worker/console/chat/tool-preview.js +42 -0
- package/dist/worker/console/chat/turn-process.js +20 -55
- package/dist/worker/console/chat/user-questions.js +266 -0
- package/dist/worker/console/chat/workspace-landing.js +14 -0
- package/dist/worker/console/console-handoff.js +82 -0
- package/dist/worker/console/console-update-and-init.js +115 -0
- package/dist/worker/console/console-update-runtime.js +84 -0
- package/dist/worker/console/dag-execution-receipt.js +33 -0
- package/dist/worker/console/draft-store.js +49 -0
- 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/index.js +3 -0
- package/dist/worker/console/inspect-split.js +18 -0
- package/dist/worker/console/native-directory-picker.js +13 -0
- package/dist/worker/console/operation-run-facts.js +19 -3
- package/dist/worker/console/operation-store.js +227 -7
- package/dist/worker/console/operator-actions.js +388 -0
- package/dist/worker/console/operator-surface-health.js +1 -0
- package/dist/worker/console/operator-user-error.js +2 -2
- package/dist/worker/console/prd-intake-bridge.js +13 -0
- package/dist/worker/console/routes.js +355 -3
- package/dist/worker/console/security.js +67 -13
- package/dist/worker/console/server.js +609 -164
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C4kVYweA.js → abnfDiagram-N423BO3Z-BAsjg7ew.js} +1 -1
- package/dist/worker/console/static/assets/{arc-Bj2M8iO5.js → arc-CyIlrwZw.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CLlXe4-6.js → architectureDiagram-T3A2C74G-Bo4tobhH.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-psEp5xH0.js → blockDiagram-VBNYF7ZC-Dfpow9gu.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DeKcOCGJ.js → c4Diagram-5PPSVZJV-DPmzG_B4.js} +1 -1
- package/dist/worker/console/static/assets/channel-DSrJAn0-.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-K0C744p1.js → chunk-2GRJ4B5K-pKQpB1UW.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-xbNw4J9-.js → chunk-2Q5K7J3B-5n9YYquZ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DjLaSDUO.js → chunk-5RXB4S5H-DP3CtA2a.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CtiPlKel.js → chunk-5VM5RSS4-DYxMJPUy.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DZtolir7.js → chunk-6Q2QTUOP-CS3D50Io.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CPcdNeew.js → chunk-GF5L2VYU-gSdDfo5_.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-NgHc6V37.js → chunk-JWPE2WC7-A48q0ZNt.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DQ_T-hg8.js → chunk-KBJHAD2P-ow8Mm3DY.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DgLsxcVP.js → chunk-RYQCIY6F-CMKfLWYE.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-UrVoM9z1.js → chunk-XXDRQBXY-BiTBdQPX.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DeMmPl0_.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DeMmPl0_.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CLkYvTb3.js → cose-bilkent-JH36ORCC-Cm7exRz_.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BwT_xKrE.js → cynefin-VYW2F7L2-D9O5qGOu.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Bi9tuzif.js → cynefinDiagram-MW4NZA55-CkvQnako.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BCIqkWBV.js → dagre-VZM6K2ZE-B1rzp7CB.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Dip6l9_Z.js → diagram-7IWD3JNH-BP07Ipcc.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-B-xkh_wK.js → diagram-B4RE2ZJO-BlPzweQb.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DZO0kTt_.js → diagram-LBJQPF4R-CxPa7n0S.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-D6ZplNbZ.js → diagram-Q27KOJAE-CMTZs53A.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-BPekbhoS.js → diagram-UB23O5K3-CxG_X52r.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BtmaJpK5.js → ebnfDiagram-BXEA7PRR-D8axtJM0.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-6DS0Xc44.js → erDiagram-JOGREHBK-DIsGzn7b.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CihnROSm.js → flowDiagram-UKHOOZJN-CU9zkDG0.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CZC4zOE2.js → ganttDiagram-PKOTCBZU-DCjTmz5P.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Dq1fhzGN.js → gitGraphDiagram-DS77QQ5N-BksdmFzg.js} +1 -1
- package/dist/worker/console/static/assets/index-B-O5ChYq.css +1 -0
- package/dist/worker/console/static/assets/index-CfnY8AQx.js +407 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DlSl4BGx.js → infoDiagram-6WML65LV-CGzzzJtL.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-snnzFl_U.js → ishikawaDiagram-WSZJBQD7-BdseB80N.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-BDE7qpMx.js → journeyDiagram-NVQOT4AX-DM9gsgha.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CD2Ci04G.js → kanban-definition-27J2QSJJ-3q-_9R2b.js} +1 -1
- package/dist/worker/console/static/assets/{linear-DdnapKIH.js → linear-B8N-Mxsd.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-BVjAT9b8.js → mermaid.core-EPIHUUsu.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-D0yJk-zA.js → mindmap-definition-FAOFIHXS-CxwO12aa.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BVo9tFP-.js → pegDiagram-VL7TDLO6-bPqbVX6Y.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DnOV-mZ_.js → pieDiagram-7S7Q4E2Y-KzqIvzeX.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CzUJo58i.js → quadrantDiagram-CIZ2JOQS-CyofpWiV.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-Bvikrolh.js → railroadDiagram-AXF67PYL-cTWJvLTP.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-DtaSVCap.js → requirementDiagram-LRYGKXZP-BK--q27B.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-C2c9A0wW.js → sankeyDiagram-W5VNT64P-C0SDOHXK.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DmXJcU7r.js → sequenceDiagram-SI44F4Z6-Cong6YIo.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-B4GUFW92.js → sizeCapture-X5ZJPWSS-DUVkgZx8.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-Dsad2MXf.js → stateDiagram-OKZ733FA-C7XgxuZg.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Dzbnd5oX.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DGq48Fbi.js → swimlanes-SLNWSIFB-D9Ayvwcy.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BY0hHk6G.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CSSi6OFf.js → timeline-definition-Z64GVDOM-Byb000cH.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BqyzPrWv.js → vennDiagram-T6HMQDX7-DMLegPt4.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DlznVb6S.js → wardleyDiagram-T6FBY63Y-ChMMeOsP.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CfBcgJ_K.js → xychartDiagram-ELKLHX3M-bEMEPisW.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/active-run-badge.js +17 -0
- package/dist/worker/console/static-src/app/console-types.js +68 -4
- package/dist/worker/console/static-src/app/useConsoleShell.js +30 -12
- package/dist/worker/console/static-src/app/useOperatorActions.js +41 -6
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +45 -10
- package/dist/worker/console/static-src/app/useRunProgress.js +47 -0
- package/dist/worker/console/static-src/app/useTaskWizard.js +74 -2
- package/dist/worker/console/static-src/night/useNightBoard.js +8 -5
- package/dist/worker/console/static-src/operator-chat/cards/failure-category-advice.js +25 -0
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +140 -8
- package/dist/worker/console/static-src/operator-chat/details-dag-actions.js +122 -0
- package/dist/worker/console/static-src/operator-chat/input-history.js +76 -0
- package/dist/worker/console/static-src/operator-chat/mutation-gate.js +1 -1
- package/dist/worker/console/static-src/operator-chat/refs.js +3 -0
- package/dist/worker/console/static-src/operator-chat/runtime-selection-labels.js +27 -0
- package/dist/worker/console/static-src/operator-chat/turn-submission.js +16 -3
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +168 -72
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +102 -21
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +184 -4
- package/dist/worker/console/static-src/operator-chat/useComposer.js +32 -0
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +63 -9
- package/dist/worker/console/static-src/operator-chat/useWorkspaceBrowserGate.js +4 -0
- package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +3 -3
- package/dist/worker/console/static-src/pages/tasks/run-id-resolution.js +79 -0
- package/dist/worker/console/static-src/pages/tasks/run-ownership-verify.js +23 -0
- package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +110 -0
- package/dist/worker/console/static-src/shell/useWorkspaces.js +299 -0
- package/dist/worker/console/static-src/shell/workspace-route.js +337 -0
- package/dist/worker/console/workspace-context.js +344 -0
- package/dist/worker/console/workspace-registry.js +214 -0
- package/dist/worker/loop-agent/loop-agent-client.js +7 -3
- package/dist/worker/materialize/frontend-split-task-materializer.js +72 -0
- package/dist/worker/materialize/harness-task-lineage.js +5 -2
- package/dist/worker/observability/init-runtime-activity.js +26 -0
- package/dist/worker/observability/read-model.js +22 -0
- package/dist/worker/observe/node-input.js +160 -3
- package/dist/worker/observe/node-process.js +377 -0
- package/dist/worker/observe/routes.js +224 -3
- package/dist/worker/observe/server.js +4 -0
- package/dist/worker/observe/shell-handler-keys.js +34 -0
- package/dist/worker/observe/static/api.js +90 -4
- package/dist/worker/observe/static/app.js +18 -70
- package/dist/worker/observe/static/constants.js +8 -1
- package/dist/worker/observe/static/dag-history-labels.js +4 -0
- package/dist/worker/observe/static/dag-node-purpose.d.ts +6 -0
- package/dist/worker/observe/static/dag-node-purpose.js +208 -0
- package/dist/worker/observe/static/format.js +60 -0
- package/dist/worker/observe/static/index.html +6 -1
- package/dist/worker/observe/static/inspect-workspace.js +307 -0
- package/dist/worker/observe/static/markdown-render.js +20 -1
- package/dist/worker/observe/static/operator-chrome.css +145 -20
- package/dist/worker/observe/static/operator-chrome.d.ts +20 -3
- package/dist/worker/observe/static/operator-chrome.js +330 -96
- package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
- package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
- package/dist/worker/observe/static/router.d.ts +46 -0
- package/dist/worker/observe/static/router.js +25 -1
- package/dist/worker/observe/static/state.d.ts +50 -0
- package/dist/worker/observe/static/state.js +184 -1
- package/dist/worker/observe/static/styles.css +395 -0
- package/dist/worker/observe/static/views/dag-graph.js +4 -2
- package/dist/worker/observe/static/views/dag-inspector.js +1067 -9
- package/dist/worker/observe/static/views/dag.d.ts +13 -0
- package/dist/worker/observe/static/views/dag.js +14 -5
- package/dist/worker/observe/static/views/dashboard.js +6 -4
- package/dist/worker/observe/static/views/failures.js +5 -2
- package/dist/worker/observe/static/views/night.js +2 -2
- package/dist/worker/observe/static/views/pool.js +1 -0
- package/dist/worker/observe/static/views/run.js +3 -1
- package/dist/worker/observe/static/views/session-timeline.js +78 -9
- package/dist/worker/observe/static/views/task.js +56 -1
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +49 -3
- package/dist/workflows/dag/backend-test-markdown-workflow.js +176 -1
- package/dist/workflows/dag/backend-test-pytest-collection.js +98 -14
- package/dist/workflows/dag/backend-test-writer-completeness.js +10 -5
- package/dist/workflows/dag/contract-output-registry.js +15 -0
- package/dist/workflows/dag/contract-validator-registrations.js +1 -2
- package/dist/workflows/dag/dynamic-runtime/loop-until.js +1 -1
- package/dist/workflows/dag/dynamic-runtime/map.js +1 -1
- package/dist/workflows/dag/failure-category.js +7 -116
- 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 +538 -166
- package/dist/workflows/dag/frontend-plan-render.js +24 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +388 -392
- 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 +202 -0
- package/dist/workflows/dag/frontend-recovery-lineage.js +178 -0
- package/dist/workflows/dag/frontend-recovery-plan.js +17 -10
- package/dist/workflows/dag/frontend-recovery-run.js +33 -20
- package/dist/workflows/dag/frontend-repair.js +7 -424
- package/dist/workflows/dag/frontend-review-context.js +288 -14
- package/dist/workflows/dag/frontend-review-findings.js +270 -0
- package/dist/workflows/dag/frontend-risk.js +15 -2
- package/dist/workflows/dag/frontend-shadow-dual-write.js +814 -0
- package/dist/workflows/dag/frontend-shape-capsule-store.js +191 -0
- package/dist/workflows/dag/frontend-shape-facts.js +409 -0
- package/dist/workflows/dag/frontend-shape.js +427 -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-test-case-checklist.js +30 -4
- package/dist/workflows/dag/frontend-test-case-manifest.js +11 -4
- package/dist/workflows/dag/frontend-test-case-quality.js +11 -16
- package/dist/workflows/dag/frontend-test-environment-probe.js +230 -0
- package/dist/workflows/dag/frontend-test-html-report.js +3 -1
- package/dist/workflows/dag/frontend-test-l5-report.js +3 -1
- package/dist/workflows/dag/frontend-test-layout.js +159 -0
- package/dist/workflows/dag/frontend-test-markdown.js +61 -0
- package/dist/workflows/dag/frontend-test-result-contract.js +188 -42
- package/dist/workflows/dag/frontend-test-standard-scenarios.js +70 -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 +52 -17
- package/dist/workflows/dag/frontend-worktree-diff.js +250 -17
- package/dist/workflows/dag/frontend-writer-admission.js +272 -0
- package/dist/workflows/dag/frontend-writer-status.js +244 -0
- package/dist/workflows/dag/init-hybrid.js +984 -613
- package/dist/workflows/dag/interrupt-request.js +10 -3
- package/dist/workflows/dag/lifecycle.js +3 -3
- package/dist/workflows/dag/node-execution.js +468 -58
- package/dist/workflows/dag/prompt.js +44 -19
- package/dist/workflows/dag/recovery-lease.js +80 -0
- package/dist/workflows/dag/report.js +37 -1
- package/dist/workflows/dag/rerun-feedback.js +124 -1
- package/dist/workflows/dag/rerun-plan.js +144 -5
- package/dist/workflows/dag/rerun-run.js +81 -6
- package/dist/workflows/dag/rerun-task.js +29 -0
- package/dist/workflows/dag/retry-policy.js +318 -8
- package/dist/workflows/dag/runner.js +429 -122
- package/dist/workflows/dag/scheduler.js +114 -16
- package/dist/workflows/dag/structured-output-repair.js +712 -0
- package/dist/workflows/dag/types.js +321 -31
- package/dist/workflows/dag/upstream-artifacts.js +0 -4
- package/dist/workflows/dag/validate.js +92 -32
- package/docs/README.md +2 -0
- package/docs/architecture/evolution.md +45 -0
- package/docs/init-surface.manifest.json +9 -0
- package/docs/operations/README.md +1 -1
- package/docs/operations/local-development-environment.md +21 -0
- package/docs/templates/README.md +2 -1
- package/docs/templates/agent-dag-report.schema.json +8 -2
- package/docs/templates/agent-dag.schema.json +45 -1
- package/docs/templates/frontend-implementation-contract.schema.json +684 -24
- package/docs/templates/frontend-test-case-checklist.md +2 -2
- package/docs/templates/frontend-test-dag.json +8 -10
- package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +1 -1
- package/docs/templates/init-managed-agents.md +13 -3
- package/docs/templates/spec-registry.schema.json +45 -0
- package/harness.json +3 -3
- package/package.json +7 -1
- package/scripts/next-info.mjs +356 -0
- package/scripts/next-publish-gate.mjs +238 -0
- package/scripts/release-source-binding.mjs +251 -0
- package/skills/codebase-scout/SKILL.md +1 -1
- package/skills/fe-test-ui-scout/SKILL.md +65 -0
- package/skills/fe-test-ui-scout/references/ledger-schema.md +62 -0
- package/skills/fe-test-ui-scout/references/recon-protocol.md +54 -0
- package/skills/frontend-bounded-implement/SKILL.md +8 -14
- package/skills/frontend-design-review/SKILL.md +20 -41
- package/skills/frontend-implementation/SKILL.md +3 -4
- package/skills/frontend-implementation/references/design-spec.md +15 -10
- package/skills/frontend-implementation/references/node-contracts.md +23 -13
- package/skills/frontend-review/SKILL.md +22 -14
- package/skills/frontend-review/references/review-findings.md +6 -7
- package/skills/loop-agent/references/command-reference.md +12 -4
- package/skills/loop-agent/references/hybrid-dag.md +8 -1
- package/skills/playwright-cli/SKILL.md +23 -1
- package/skills/playwright-cli-case-generator/SKILL.md +29 -8
- package/dist/worker/console/static/assets/channel-CPF4N7pf.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C2DwA_Y1.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C2DwA_Y1.js +0 -1
- package/dist/worker/console/static/assets/index-DTZOKgAn.js +0 -404
- package/dist/worker/console/static/assets/index-Ya5FE7cD.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-B8FB_cNk.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CrZYaWfx.js +0 -8
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { access, readFile } from "node:fs/promises";
|
|
2
2
|
import { buildOperatorCapabilitiesDocument, OFFICIAL_TAIL_ACTION_IDS, } from "../../shared/operator/capabilities.js";
|
|
3
|
+
import { DAG_RERUN_PROMPT_OVERRIDE_ENV, isDagRerunPromptOverrideEnabled, MAX_DAG_RERUN_PROMPT_OVERRIDE_CHARS, } from "../../shared/dag-prompt-override.js";
|
|
3
4
|
import { buildOperatorResult, operatorFailed, operatorSucceeded, } from "../../shared/operator/envelope.js";
|
|
4
5
|
import { CANONICAL_TASK_ID_PATTERN, formatLocalBusinessDate, getTaskPaths, loadTaskConfig, } from "../../task/runtime.js";
|
|
5
6
|
import { diffTaskContract, validateDraftForTask, } from "../../task/contract/index.js";
|
|
@@ -401,6 +402,85 @@ async function runReadCli(ctx, args, command) {
|
|
|
401
402
|
});
|
|
402
403
|
}
|
|
403
404
|
}
|
|
405
|
+
/**
|
|
406
|
+
* Parse and bound the experimental promptOverrides action param. The env
|
|
407
|
+
* switch is checked separately so disabled deployments fail closed before any
|
|
408
|
+
* staging happens. `mode` defaults to "replace"; "append" keeps the frozen
|
|
409
|
+
* base prompt and only appends the operator text as a marked addendum.
|
|
410
|
+
*/
|
|
411
|
+
function parsePromptOverrideParams(raw) {
|
|
412
|
+
if (raw === undefined || raw === null)
|
|
413
|
+
return { kind: "ok", overrides: [] };
|
|
414
|
+
if (!Array.isArray(raw)) {
|
|
415
|
+
return {
|
|
416
|
+
kind: "error",
|
|
417
|
+
message: "promptOverrides must be an array of {nodeId, prompt, mode?}",
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
if (raw.length === 0)
|
|
421
|
+
return { kind: "ok", overrides: [] };
|
|
422
|
+
if (raw.length > 8) {
|
|
423
|
+
return { kind: "error", message: "promptOverrides supports at most 8 nodes" };
|
|
424
|
+
}
|
|
425
|
+
const overrides = [];
|
|
426
|
+
const seen = new Set();
|
|
427
|
+
for (const item of raw) {
|
|
428
|
+
if (!item || typeof item !== "object") {
|
|
429
|
+
return {
|
|
430
|
+
kind: "error",
|
|
431
|
+
message: "promptOverrides entries must be objects {nodeId, prompt, mode?}",
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
const record = item;
|
|
435
|
+
const nodeId = typeof record.nodeId === "string" ? record.nodeId.trim() : "";
|
|
436
|
+
const prompt = typeof record.prompt === "string" ? record.prompt : "";
|
|
437
|
+
const mode = record.mode === undefined || record.mode === null
|
|
438
|
+
? undefined
|
|
439
|
+
: typeof record.mode === "string"
|
|
440
|
+
? record.mode
|
|
441
|
+
: "invalid";
|
|
442
|
+
if (!nodeId) {
|
|
443
|
+
return { kind: "error", message: "promptOverrides nodeId is required" };
|
|
444
|
+
}
|
|
445
|
+
if (seen.has(nodeId)) {
|
|
446
|
+
return {
|
|
447
|
+
kind: "error",
|
|
448
|
+
message: `promptOverrides contains duplicate nodeId: ${nodeId}`,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
seen.add(nodeId);
|
|
452
|
+
if (mode !== undefined && mode !== "append" && mode !== "replace") {
|
|
453
|
+
return {
|
|
454
|
+
kind: "error",
|
|
455
|
+
message: `promptOverrides mode for ${nodeId} must be append or replace`,
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
if (!prompt.trim() || prompt.length > MAX_DAG_RERUN_PROMPT_OVERRIDE_CHARS) {
|
|
459
|
+
return {
|
|
460
|
+
kind: "error",
|
|
461
|
+
message: `promptOverrides prompt for ${nodeId} must be 1-${MAX_DAG_RERUN_PROMPT_OVERRIDE_CHARS} characters`,
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
overrides.push(mode === undefined ? { nodeId, prompt } : { nodeId, prompt, mode });
|
|
465
|
+
}
|
|
466
|
+
return { kind: "ok", overrides };
|
|
467
|
+
}
|
|
468
|
+
/** Stage override bodies under app-data and build `--prompt-override` CLI
|
|
469
|
+
* args. The flag carries the mode: `--prompt-override-append` for append. */
|
|
470
|
+
async function buildPromptOverrideCliArgs(ctx, overrides) {
|
|
471
|
+
const args = [];
|
|
472
|
+
for (const override of overrides) {
|
|
473
|
+
const staged = await stageUtf8Text(ctx.appData, override.prompt, {
|
|
474
|
+
extension: ".md",
|
|
475
|
+
label: `prompt-override-${override.nodeId}`,
|
|
476
|
+
});
|
|
477
|
+
const flag = override.mode === "append"
|
|
478
|
+
? "--prompt-override-append"
|
|
479
|
+
: "--prompt-override";
|
|
480
|
+
args.push(flag, `${override.nodeId}@${staged.path}`);
|
|
481
|
+
}
|
|
482
|
+
return args;
|
|
483
|
+
}
|
|
404
484
|
async function acceptOperation(ctx, input) {
|
|
405
485
|
const created = await ctx.operations.create({
|
|
406
486
|
clientRequestId: input.clientRequestId,
|
|
@@ -456,6 +536,184 @@ async function acceptOperation(ctx, input) {
|
|
|
456
536
|
},
|
|
457
537
|
};
|
|
458
538
|
}
|
|
539
|
+
function splitRuntimeMissing(action) {
|
|
540
|
+
return {
|
|
541
|
+
kind: "error",
|
|
542
|
+
status: 503,
|
|
543
|
+
body: operatorFailed({
|
|
544
|
+
command: action,
|
|
545
|
+
outcome: "blocked",
|
|
546
|
+
code: "INTERNAL_ERROR",
|
|
547
|
+
message: `${action} is unavailable: frontend split runtime is not wired`,
|
|
548
|
+
}),
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
function numOf(v) {
|
|
552
|
+
return typeof v === "number" ? v : Number(v);
|
|
553
|
+
}
|
|
554
|
+
function splitCommandBase(p) {
|
|
555
|
+
return {
|
|
556
|
+
operationId: str(p.operationId) ?? "",
|
|
557
|
+
expectedRevision: numOf(p.expectedRevision),
|
|
558
|
+
expectedParentDigest: str(p.expectedParentDigest) ?? "",
|
|
559
|
+
expectedManifestDigest: str(p.expectedManifestDigest) ?? "",
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
function splitCommandDispatch(action, result) {
|
|
563
|
+
if (result.outcome === "conflict") {
|
|
564
|
+
return {
|
|
565
|
+
kind: "error",
|
|
566
|
+
status: 409,
|
|
567
|
+
body: operatorFailed({
|
|
568
|
+
command: action,
|
|
569
|
+
outcome: "conflict",
|
|
570
|
+
code: "CONFLICT",
|
|
571
|
+
message: "frontend split CAS conflict (stale revision or binding)",
|
|
572
|
+
}),
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
return { kind: "sync", status: 200, body: operatorSucceeded(action, result) };
|
|
576
|
+
}
|
|
577
|
+
async function runSplitAction(action, run) {
|
|
578
|
+
try {
|
|
579
|
+
const result = await run();
|
|
580
|
+
if (result && typeof result === "object" && "outcome" in result) {
|
|
581
|
+
return splitCommandDispatch(action, result);
|
|
582
|
+
}
|
|
583
|
+
return {
|
|
584
|
+
kind: "sync",
|
|
585
|
+
status: 200,
|
|
586
|
+
body: operatorSucceeded(action, result),
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
catch (error) {
|
|
590
|
+
return invalid(action, error instanceof Error ? error.message : String(error));
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
function humanDecisionDispatch(action, result) {
|
|
594
|
+
if (result.outcome === "rejected") {
|
|
595
|
+
return {
|
|
596
|
+
kind: "error",
|
|
597
|
+
status: 409,
|
|
598
|
+
body: operatorFailed({
|
|
599
|
+
command: action,
|
|
600
|
+
outcome: "conflict",
|
|
601
|
+
code: "CONFLICT",
|
|
602
|
+
message: result.reason,
|
|
603
|
+
details: { projection: result.projection },
|
|
604
|
+
}),
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
return { kind: "sync", status: 200, body: operatorSucceeded(action, result) };
|
|
608
|
+
}
|
|
609
|
+
async function runHumanDecisionAction(action, run) {
|
|
610
|
+
try {
|
|
611
|
+
return humanDecisionDispatch(action, await run());
|
|
612
|
+
}
|
|
613
|
+
catch (error) {
|
|
614
|
+
return invalid(action, error instanceof Error ? error.message : String(error));
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
async function acceptConsoleUpdateAndInit(ctx, clientRequestId, channel) {
|
|
618
|
+
if (!ctx.consoleUpdateExecutor) {
|
|
619
|
+
return {
|
|
620
|
+
kind: "error",
|
|
621
|
+
status: 503,
|
|
622
|
+
body: operatorFailed({
|
|
623
|
+
command: "consoleUpdateAndInit",
|
|
624
|
+
outcome: "blocked",
|
|
625
|
+
code: "CONSOLE_UPDATE_UNAVAILABLE",
|
|
626
|
+
message: "Console update runtime is unavailable",
|
|
627
|
+
}),
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
const created = await ctx.operations.create({
|
|
631
|
+
clientRequestId,
|
|
632
|
+
action: "consoleUpdateAndInit",
|
|
633
|
+
actionParams: { channel },
|
|
634
|
+
});
|
|
635
|
+
if (created.kind === "conflict") {
|
|
636
|
+
return {
|
|
637
|
+
kind: "error",
|
|
638
|
+
status: 409,
|
|
639
|
+
body: operatorFailed({
|
|
640
|
+
command: "consoleUpdateAndInit",
|
|
641
|
+
outcome: "conflict",
|
|
642
|
+
code: "REQUEST_ID_REUSE_CONFLICT",
|
|
643
|
+
message: created.message,
|
|
644
|
+
}),
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
if (created.kind === "idempotent") {
|
|
648
|
+
return {
|
|
649
|
+
kind: "accepted",
|
|
650
|
+
status: 202,
|
|
651
|
+
body: {
|
|
652
|
+
operationId: created.operation.operationId,
|
|
653
|
+
state: created.operation.state,
|
|
654
|
+
clientRequestId: created.operation.clientRequestId,
|
|
655
|
+
action: created.operation.action,
|
|
656
|
+
},
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
queueMicrotask(() => {
|
|
660
|
+
void (async () => {
|
|
661
|
+
const operationId = created.operation.operationId;
|
|
662
|
+
await ctx.operations.update(operationId, {
|
|
663
|
+
state: "running",
|
|
664
|
+
startedAt: new Date().toISOString(),
|
|
665
|
+
});
|
|
666
|
+
ctx.events.append(operationId, {
|
|
667
|
+
at: new Date().toISOString(),
|
|
668
|
+
kind: "state",
|
|
669
|
+
state: "running",
|
|
670
|
+
message: `checking runtime, npm ${channel}, and safe initialization`,
|
|
671
|
+
});
|
|
672
|
+
try {
|
|
673
|
+
const result = await ctx.consoleUpdateExecutor(channel);
|
|
674
|
+
const state = result.state;
|
|
675
|
+
const next = await ctx.operations.update(operationId, {
|
|
676
|
+
state,
|
|
677
|
+
finishedAt: new Date().toISOString(),
|
|
678
|
+
result: result,
|
|
679
|
+
...(result.errorCode ? { errorCode: result.errorCode } : {}),
|
|
680
|
+
...(result.errorMessage ? { errorMessage: result.errorMessage } : {}),
|
|
681
|
+
});
|
|
682
|
+
ctx.events.append(operationId, {
|
|
683
|
+
at: new Date().toISOString(),
|
|
684
|
+
kind: "state",
|
|
685
|
+
state: next.state,
|
|
686
|
+
message: result.errorMessage ?? `console maintenance ${next.state}`,
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
catch (error) {
|
|
690
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
691
|
+
const next = await ctx.operations.update(operationId, {
|
|
692
|
+
state: "needs-reconcile",
|
|
693
|
+
finishedAt: new Date().toISOString(),
|
|
694
|
+
errorCode: "CONSOLE_UPDATE_EXCEPTION",
|
|
695
|
+
errorMessage: message,
|
|
696
|
+
});
|
|
697
|
+
ctx.events.append(operationId, {
|
|
698
|
+
at: new Date().toISOString(),
|
|
699
|
+
kind: "error",
|
|
700
|
+
state: next.state,
|
|
701
|
+
message,
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
})();
|
|
705
|
+
});
|
|
706
|
+
return {
|
|
707
|
+
kind: "accepted",
|
|
708
|
+
status: 202,
|
|
709
|
+
body: {
|
|
710
|
+
operationId: created.operation.operationId,
|
|
711
|
+
state: created.operation.state,
|
|
712
|
+
clientRequestId: created.operation.clientRequestId,
|
|
713
|
+
action: created.operation.action,
|
|
714
|
+
},
|
|
715
|
+
};
|
|
716
|
+
}
|
|
459
717
|
export async function dispatchOperatorAction(ctx, req) {
|
|
460
718
|
const action = req.action?.trim();
|
|
461
719
|
if (!action) {
|
|
@@ -486,6 +744,31 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
486
744
|
};
|
|
487
745
|
}
|
|
488
746
|
const p = paramsOf(req);
|
|
747
|
+
if (action === "consoleUpdateAndInit") {
|
|
748
|
+
if (req.source !== "human-ui") {
|
|
749
|
+
return {
|
|
750
|
+
kind: "error",
|
|
751
|
+
status: 403,
|
|
752
|
+
body: operatorFailed({
|
|
753
|
+
command: action,
|
|
754
|
+
outcome: "blocked",
|
|
755
|
+
code: "HUMAN_UI_REQUIRED",
|
|
756
|
+
message: "consoleUpdateAndInit is available only from the Operate UI",
|
|
757
|
+
}),
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
if (!req.clientRequestId?.trim()) {
|
|
761
|
+
return invalid(action, "clientRequestId is required");
|
|
762
|
+
}
|
|
763
|
+
if (Object.keys(p).some((key) => key !== "channel")) {
|
|
764
|
+
return invalid(action, "only channel may be provided");
|
|
765
|
+
}
|
|
766
|
+
const channel = p.channel ?? "latest";
|
|
767
|
+
if (channel !== "latest" && channel !== "next") {
|
|
768
|
+
return invalid(action, "channel must be latest or next");
|
|
769
|
+
}
|
|
770
|
+
return acceptConsoleUpdateAndInit(ctx, req.clientRequestId, channel);
|
|
771
|
+
}
|
|
489
772
|
switch (action) {
|
|
490
773
|
case "operatorCapabilities": {
|
|
491
774
|
const doc = buildOperatorCapabilitiesDocument();
|
|
@@ -2078,12 +2361,35 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2078
2361
|
}
|
|
2079
2362
|
return accepted;
|
|
2080
2363
|
}
|
|
2364
|
+
case "dagPromptOverrideConfig": {
|
|
2365
|
+
// The prompt-edit entry is visible by default. The internal environment
|
|
2366
|
+
// switch remains an emergency kill switch and is reflected here.
|
|
2367
|
+
return {
|
|
2368
|
+
kind: "sync",
|
|
2369
|
+
status: 200,
|
|
2370
|
+
body: operatorSucceeded(action, {
|
|
2371
|
+
enabled: isDagRerunPromptOverrideEnabled(),
|
|
2372
|
+
envVar: DAG_RERUN_PROMPT_OVERRIDE_ENV,
|
|
2373
|
+
}),
|
|
2374
|
+
};
|
|
2375
|
+
}
|
|
2081
2376
|
case "dagRerunPlan": {
|
|
2082
2377
|
const runId = str(p.runId);
|
|
2083
2378
|
const fromNode = str(p.fromNode);
|
|
2084
2379
|
if (!runId || !fromNode) {
|
|
2085
2380
|
return invalid(action, "runId and fromNode are required");
|
|
2086
2381
|
}
|
|
2382
|
+
const parsedOverrides = parsePromptOverrideParams(p.promptOverrides);
|
|
2383
|
+
if (parsedOverrides.kind === "error") {
|
|
2384
|
+
return invalid(action, parsedOverrides.message);
|
|
2385
|
+
}
|
|
2386
|
+
if (parsedOverrides.overrides.length > 0 &&
|
|
2387
|
+
!isDagRerunPromptOverrideEnabled()) {
|
|
2388
|
+
return invalid(action, `prompt override rerun is disabled by ${DAG_RERUN_PROMPT_OVERRIDE_ENV}; unset it or use a value other than 0, false, or off to enable this experimental capability`);
|
|
2389
|
+
}
|
|
2390
|
+
const overrideArgs = parsedOverrides.overrides.length > 0
|
|
2391
|
+
? await buildPromptOverrideCliArgs(ctx, parsedOverrides.overrides)
|
|
2392
|
+
: [];
|
|
2087
2393
|
const body = await runReadCli(ctx, [
|
|
2088
2394
|
"dag",
|
|
2089
2395
|
"rerun",
|
|
@@ -2092,6 +2398,7 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2092
2398
|
"--from-node",
|
|
2093
2399
|
fromNode,
|
|
2094
2400
|
"--plan",
|
|
2401
|
+
...overrideArgs,
|
|
2095
2402
|
"--json",
|
|
2096
2403
|
], "dag rerun plan");
|
|
2097
2404
|
return { kind: "sync", status: body.ok ? 200 : 400, body };
|
|
@@ -2105,6 +2412,17 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2105
2412
|
if (!runId || !fromNode || !planHash || !reason || !clientRequestId) {
|
|
2106
2413
|
return invalid(action, "runId, fromNode, planHash, reason, and clientRequestId are required");
|
|
2107
2414
|
}
|
|
2415
|
+
const parsedOverrides = parsePromptOverrideParams(p.promptOverrides);
|
|
2416
|
+
if (parsedOverrides.kind === "error") {
|
|
2417
|
+
return invalid(action, parsedOverrides.message);
|
|
2418
|
+
}
|
|
2419
|
+
if (parsedOverrides.overrides.length > 0 &&
|
|
2420
|
+
!isDagRerunPromptOverrideEnabled()) {
|
|
2421
|
+
return invalid(action, `prompt override rerun is disabled by ${DAG_RERUN_PROMPT_OVERRIDE_ENV}; unset it or use a value other than 0, false, or off to enable this experimental capability`);
|
|
2422
|
+
}
|
|
2423
|
+
const overrideArgs = parsedOverrides.overrides.length > 0
|
|
2424
|
+
? await buildPromptOverrideCliArgs(ctx, parsedOverrides.overrides)
|
|
2425
|
+
: [];
|
|
2108
2426
|
return acceptOperation(ctx, {
|
|
2109
2427
|
action,
|
|
2110
2428
|
actionParams: p,
|
|
@@ -2122,6 +2440,7 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2122
2440
|
clientRequestId,
|
|
2123
2441
|
"--reason",
|
|
2124
2442
|
reason,
|
|
2443
|
+
...overrideArgs,
|
|
2125
2444
|
"--json",
|
|
2126
2445
|
],
|
|
2127
2446
|
});
|
|
@@ -2606,6 +2925,75 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2606
2925
|
}),
|
|
2607
2926
|
};
|
|
2608
2927
|
}
|
|
2928
|
+
case "frontendSplitWakeup": {
|
|
2929
|
+
if (!ctx.splitOrchestrator)
|
|
2930
|
+
return splitRuntimeMissing(action);
|
|
2931
|
+
return runSplitAction(action, () => ctx.splitOrchestrator.wakeupChildren(splitCommandBase(p)));
|
|
2932
|
+
}
|
|
2933
|
+
case "frontendSplitChildCallback": {
|
|
2934
|
+
if (!ctx.splitOrchestrator)
|
|
2935
|
+
return splitRuntimeMissing(action);
|
|
2936
|
+
return runSplitAction(action, () => ctx.splitOrchestrator.childCallback({
|
|
2937
|
+
...splitCommandBase(p),
|
|
2938
|
+
observation: p.observation,
|
|
2939
|
+
}));
|
|
2940
|
+
}
|
|
2941
|
+
case "frontendSplitWakeupIntegration": {
|
|
2942
|
+
if (!ctx.splitOrchestrator)
|
|
2943
|
+
return splitRuntimeMissing(action);
|
|
2944
|
+
return runSplitAction(action, () => ctx.splitOrchestrator.wakeupIntegration(splitCommandBase(p)));
|
|
2945
|
+
}
|
|
2946
|
+
case "frontendSplitIntegrationCallback": {
|
|
2947
|
+
if (!ctx.splitOrchestrator)
|
|
2948
|
+
return splitRuntimeMissing(action);
|
|
2949
|
+
return runSplitAction(action, () => ctx.splitOrchestrator.integrationCallback({
|
|
2950
|
+
...splitCommandBase(p),
|
|
2951
|
+
completion: p.completion,
|
|
2952
|
+
}));
|
|
2953
|
+
}
|
|
2954
|
+
case "frontendSplitFinalize": {
|
|
2955
|
+
if (!ctx.splitOrchestrator)
|
|
2956
|
+
return splitRuntimeMissing(action);
|
|
2957
|
+
return runSplitAction(action, () => ctx.splitOrchestrator.finalize(splitCommandBase(p)));
|
|
2958
|
+
}
|
|
2959
|
+
case "frontendHumanDecisionMaterialize": {
|
|
2960
|
+
if (!ctx.humanDecisionAdapter)
|
|
2961
|
+
return splitRuntimeMissing(action);
|
|
2962
|
+
return runHumanDecisionAction(action, () => ctx.humanDecisionAdapter.materialize({
|
|
2963
|
+
operationId: str(p.operationId) ?? "",
|
|
2964
|
+
expectedRecordRevision: numOf(p.expectedRecordRevision),
|
|
2965
|
+
expectedProjectionDigest: str(p.expectedProjectionDigest) ?? "",
|
|
2966
|
+
envelope: p.envelope,
|
|
2967
|
+
}));
|
|
2968
|
+
}
|
|
2969
|
+
case "frontendHumanDecisionApprove": {
|
|
2970
|
+
if (!ctx.humanDecisionAdapter)
|
|
2971
|
+
return splitRuntimeMissing(action);
|
|
2972
|
+
return runHumanDecisionAction(action, () => ctx.humanDecisionAdapter.consume({
|
|
2973
|
+
operationId: str(p.operationId) ?? "",
|
|
2974
|
+
expectedRecordRevision: numOf(p.expectedRecordRevision),
|
|
2975
|
+
expectedProjectionDigest: str(p.expectedProjectionDigest) ?? "",
|
|
2976
|
+
receipt: p.receipt,
|
|
2977
|
+
currentTargetDigest: str(p.currentTargetDigest) ?? "",
|
|
2978
|
+
now: str(p.now) ?? new Date().toISOString(),
|
|
2979
|
+
}));
|
|
2980
|
+
}
|
|
2981
|
+
case "frontendSplitInitialize": {
|
|
2982
|
+
if (!ctx.humanDecisionAdapter)
|
|
2983
|
+
return splitRuntimeMissing(action);
|
|
2984
|
+
return runHumanDecisionAction(action, () => ctx.humanDecisionAdapter.initializeSplit({
|
|
2985
|
+
operationId: str(p.operationId) ?? "",
|
|
2986
|
+
expectedRecordRevision: numOf(p.expectedRecordRevision),
|
|
2987
|
+
expectedProjectionDigest: str(p.expectedProjectionDigest) ?? "",
|
|
2988
|
+
execution: p.execution,
|
|
2989
|
+
manifest: p.manifest,
|
|
2990
|
+
receipt: p.receipt,
|
|
2991
|
+
currentTargetDigest: str(p.currentTargetDigest) ?? "",
|
|
2992
|
+
now: str(p.now) ?? new Date().toISOString(),
|
|
2993
|
+
activeWriterOperationId: str(p.activeWriterOperationId) ?? null,
|
|
2994
|
+
activeProviderOperationId: str(p.activeProviderOperationId) ?? null,
|
|
2995
|
+
}));
|
|
2996
|
+
}
|
|
2609
2997
|
default: {
|
|
2610
2998
|
// M5 official-command coverage uses one generic tail for newly registered
|
|
2611
2999
|
// CLI actions. It remains inside dispatchOperatorAction (the sole dispatch
|
|
@@ -12,6 +12,7 @@ export function buildOperatorSurfaceHealthV1(input) {
|
|
|
12
12
|
repoName: input.repoRoot.split(/[\\/]/).filter(Boolean).pop() ?? "repository",
|
|
13
13
|
packageName,
|
|
14
14
|
packageVersion,
|
|
15
|
+
consoleInstanceId: input.consoleInstanceId,
|
|
15
16
|
piReadiness: input.piReadiness,
|
|
16
17
|
inspect: {
|
|
17
18
|
ready: input.inspectReady,
|
|
@@ -3,7 +3,7 @@ import { rewriteRecoveryOperatorError } from "./recovery-error-copy.js";
|
|
|
3
3
|
const MUTATION_GATE_COPY = [
|
|
4
4
|
{
|
|
5
5
|
pattern: /invalid (boot capability|confirmation header) token/i,
|
|
6
|
-
copy: "
|
|
6
|
+
copy: "页面凭证已失效(控制台可能已重启),请刷新页面(F5)后重试。",
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
pattern: /mutation requires boot capability cookie|mutation requires confirmation header token/i,
|
|
@@ -23,7 +23,7 @@ export function formatOperatorUserError(message) {
|
|
|
23
23
|
if (recovery)
|
|
24
24
|
return recovery;
|
|
25
25
|
if (/controller identity changed|package fingerprint changed|entry binary sha256 changed/i.test(raw)) {
|
|
26
|
-
return "控制器版本已变更(Console
|
|
26
|
+
return "控制器版本已变更(Console 启动后代码被重新编译,或提交了 package.json / bin / dist / skills 等指纹范围文件)。请重启 Console 进程使其重新加载当前构建后再重试本操作;一次会话中途不要重建控制器。";
|
|
27
27
|
}
|
|
28
28
|
if (/Pi session file missing or not openable|cannot reopen chat session .* no persisted Pi session file/i.test(raw)) {
|
|
29
29
|
return "该对话的 Pi 会话文件已丢失,无法恢复上下文。请新建对话继续(历史记录无法重开)。";
|
|
@@ -9,6 +9,7 @@ import { getTaskPaths } from "../../task/runtime.js";
|
|
|
9
9
|
import { SEMANTIC_INTAKE_ARTIFACT_REL, } from "../../task/source-prepare/semantic-intake.js";
|
|
10
10
|
import { extractRequirementFactsFromMarkdown } from "../../task/source-prepare/parse-intent.js";
|
|
11
11
|
import { filterPlaceholderPaths, isNonPlaceholderPath, } from "../../task/source-prepare/placeholder-paths.js";
|
|
12
|
+
import { summarizeLedgerPayload, } from "./draft-store.js";
|
|
12
13
|
import { emptyDraft } from "./interview/grill-me.js";
|
|
13
14
|
import { normalizeConsoleWorkflowKind } from "./workflow-kinds.js";
|
|
14
15
|
function asStringList(value) {
|
|
@@ -219,6 +220,15 @@ export async function buildDraftFromTaskIntake(input) {
|
|
|
219
220
|
const paths = getTaskPaths(input.repoRoot, input.taskId);
|
|
220
221
|
const warnings = warningList(input.advanceJson);
|
|
221
222
|
const lifecycleState = lifecycleFromAdvanceJson(input.advanceJson);
|
|
223
|
+
// Source fidelity ledger 安全摘要透传(AC-009):来自 advance/prepare 结果,
|
|
224
|
+
// 未知形状安全丢弃,绝不携带未截断原文。
|
|
225
|
+
const advanceRoot = input.advanceJson && typeof input.advanceJson === "object"
|
|
226
|
+
? input.advanceJson
|
|
227
|
+
: {};
|
|
228
|
+
const ledgerSummary = summarizeLedgerPayload(advanceRoot.ledgerSummary) ??
|
|
229
|
+
summarizeLedgerPayload(advanceRoot.result && typeof advanceRoot.result === "object"
|
|
230
|
+
? advanceRoot.result.ledgerSummary
|
|
231
|
+
: undefined);
|
|
222
232
|
const semanticApplied = warnings.some((w) => w.code === "SEMANTIC_INTAKE_APPLIED");
|
|
223
233
|
const semanticFailed = warnings.find((w) => w.code === "SEMANTIC_INTAKE_PI_FAILED" ||
|
|
224
234
|
w.code === "SEMANTIC_INTAKE_INVALID_OUTPUT" ||
|
|
@@ -427,11 +437,14 @@ export async function buildDraftFromTaskIntake(input) {
|
|
|
427
437
|
if (input.engineering) {
|
|
428
438
|
draft = applyEngineeringBoundaryToDraft(draft, input.engineering);
|
|
429
439
|
}
|
|
440
|
+
// AC-BLOCK-002:摘要仅经响应返回 UI 视图模型,不写入 draft(防止 strict
|
|
441
|
+
// taskContractDraftSchema 因未知 ledgerSummary 键拒绝 canonical draft)。
|
|
430
442
|
return {
|
|
431
443
|
draft,
|
|
432
444
|
parseStatus,
|
|
433
445
|
semanticIntake,
|
|
434
446
|
gaps,
|
|
447
|
+
...(ledgerSummary ? { ledgerSummary } : {}),
|
|
435
448
|
lifecycleState,
|
|
436
449
|
};
|
|
437
450
|
}
|