@tea-agent/loop-agent 0.39.0-beta.0 → 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 +534 -178
- package/dist/workflows/dag/frontend-plan-render.js +24 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +371 -393
- 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 -618
- 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 -34
- 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
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allowlist of in-process shell handlers (preset/gate flags on task.shell).
|
|
3
|
+
* Observe projects these names; the executor writes process receipts for them.
|
|
4
|
+
*/
|
|
5
|
+
export const SHELL_NAMED_HANDLER_KEYS = [
|
|
6
|
+
"verdictGate",
|
|
7
|
+
"projectGovernanceGate",
|
|
8
|
+
"requirementCoverageGate",
|
|
9
|
+
"jsonArtifactGate",
|
|
10
|
+
"frontendPrewriteGate",
|
|
11
|
+
"frontendLintBaseline",
|
|
12
|
+
"frontendVerificationBundle",
|
|
13
|
+
"frontendReviewContext",
|
|
14
|
+
"frontendTestCaseChecklist",
|
|
15
|
+
"frontendBrowserToolPreflight",
|
|
16
|
+
"frontendTestStandardScenarios",
|
|
17
|
+
"frontendTestEnvironmentProbe",
|
|
18
|
+
"frontendTestEvidenceValidation",
|
|
19
|
+
"finalWriteSetApprovalGate",
|
|
20
|
+
"frontendTestL5Report",
|
|
21
|
+
"frontendTestHtmlReport",
|
|
22
|
+
"frontendTestCaseManifest",
|
|
23
|
+
"frontendTestResultFinalize",
|
|
24
|
+
"frontendTestReports",
|
|
25
|
+
"backendTestPipeline",
|
|
26
|
+
"jacocoCoverage",
|
|
27
|
+
"verifyEvidence",
|
|
28
|
+
"repairArtifactGate",
|
|
29
|
+
];
|
|
30
|
+
export function namedShellHandlers(shell) {
|
|
31
|
+
if (!shell)
|
|
32
|
+
return [];
|
|
33
|
+
return SHELL_NAMED_HANDLER_KEYS.filter((key) => shell[key] != null);
|
|
34
|
+
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/** Fetch and artifact helpers (Observe UI R5). */
|
|
2
|
+
import {
|
|
3
|
+
fetchWithWorkspaceScope,
|
|
4
|
+
workspaceScope,
|
|
5
|
+
} from "./state.js";
|
|
2
6
|
|
|
3
7
|
export async function fetchJson(url) {
|
|
4
8
|
try {
|
|
5
|
-
const res = await
|
|
9
|
+
const res = await fetchWithWorkspaceScope(url);
|
|
6
10
|
if (!res.ok) return null;
|
|
7
11
|
return await res.json();
|
|
8
12
|
} catch {
|
|
@@ -18,7 +22,10 @@ export async function fetchJson(url) {
|
|
|
18
22
|
export async function fetchJsonResult(url, options = {}) {
|
|
19
23
|
const signal = options?.signal;
|
|
20
24
|
try {
|
|
21
|
-
const res = await
|
|
25
|
+
const res = await fetchWithWorkspaceScope(
|
|
26
|
+
url,
|
|
27
|
+
signal ? { signal } : undefined,
|
|
28
|
+
);
|
|
22
29
|
let body = null;
|
|
23
30
|
try {
|
|
24
31
|
body = await res.json();
|
|
@@ -77,6 +84,14 @@ export async function fetchDagNodeInput(runId, nodeId) {
|
|
|
77
84
|
return fetchJsonResult(url);
|
|
78
85
|
}
|
|
79
86
|
|
|
87
|
+
export async function fetchDagNodeProcess(runId, nodeId, key) {
|
|
88
|
+
const params = new URLSearchParams();
|
|
89
|
+
if (key) params.set("key", String(key));
|
|
90
|
+
const qs = params.toString();
|
|
91
|
+
const url = `/api/dag-runs/${encodeURIComponent(runId)}/nodes/${encodeURIComponent(nodeId)}/process${qs ? `?${qs}` : ""}`;
|
|
92
|
+
return fetchJsonResult(url);
|
|
93
|
+
}
|
|
94
|
+
|
|
80
95
|
/**
|
|
81
96
|
* Fetch a spec-evidence file preview (binding source or successful read).
|
|
82
97
|
* Resolves to the parsed JSON body, or throws an Error carrying the HTTP
|
|
@@ -84,7 +99,7 @@ export async function fetchDagNodeInput(runId, nodeId) {
|
|
|
84
99
|
*/
|
|
85
100
|
export async function fetchSpecEvidenceFile(runId, nodeId, source, relPath) {
|
|
86
101
|
const url = `/api/dag-runs/${encodeURIComponent(runId)}/nodes/${encodeURIComponent(nodeId)}/spec-evidence/file?source=${encodeURIComponent(source)}&path=${encodeURIComponent(relPath)}`;
|
|
87
|
-
const res = await
|
|
102
|
+
const res = await fetchWithWorkspaceScope(url);
|
|
88
103
|
let body = null;
|
|
89
104
|
try {
|
|
90
105
|
body = await res.json();
|
|
@@ -104,6 +119,78 @@ export function artifactUrl(artifactPath) {
|
|
|
104
119
|
return `/api/artifacts?path=${encodeURIComponent(artifactPath)}&tail=200`;
|
|
105
120
|
}
|
|
106
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Experimental (prompt-override rerun only): POST one allowlisted operator
|
|
124
|
+
* action through the Console mutation gate using the SCOPED inspect token
|
|
125
|
+
* (window.__INSPECT_MUTATION_TOKEN__). The server injects it into /inspect
|
|
126
|
+
* HTML by default; HARNESS_DAG_RERUN_PROMPT_OVERRIDE=0|false|off disables
|
|
127
|
+
* injection. The token only authorizes dagRerunPlan / dagRerun — never general
|
|
128
|
+
* Console mutations.
|
|
129
|
+
* Absent token → the call is not attempted.
|
|
130
|
+
*/
|
|
131
|
+
export async function postOperatorAction(action, actionParams = {}) {
|
|
132
|
+
const token = globalThis.__INSPECT_MUTATION_TOKEN__;
|
|
133
|
+
if (!token) {
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
status: 0,
|
|
137
|
+
body: { error: { code: "PROMPT_OVERRIDE_DISABLED", message: "提示词重启未启用(服务端未注入确认 token)" } },
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const workspaceId = workspaceScope();
|
|
141
|
+
if (!workspaceId) {
|
|
142
|
+
return {
|
|
143
|
+
ok: false,
|
|
144
|
+
status: 400,
|
|
145
|
+
body: {
|
|
146
|
+
error: {
|
|
147
|
+
code: "WORKSPACE_REQUIRED",
|
|
148
|
+
message: "workspaceId is required",
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const res = await fetchWithWorkspaceScope("/api/operator/v1/operations", {
|
|
155
|
+
method: "POST",
|
|
156
|
+
credentials: "same-origin",
|
|
157
|
+
headers: {
|
|
158
|
+
"Content-Type": "application/json",
|
|
159
|
+
"x-loop-console-confirmation": token,
|
|
160
|
+
},
|
|
161
|
+
body: JSON.stringify({ workspaceId, action, actionParams }),
|
|
162
|
+
});
|
|
163
|
+
let body = null;
|
|
164
|
+
try {
|
|
165
|
+
body = await res.json();
|
|
166
|
+
} catch {
|
|
167
|
+
body = null;
|
|
168
|
+
}
|
|
169
|
+
return { ok: res.ok, status: res.status, body };
|
|
170
|
+
} catch {
|
|
171
|
+
return { ok: false, status: 0, body: null };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Poll a Console operation snapshot (read-only GET). */
|
|
176
|
+
export async function fetchOperatorOperation(operationId) {
|
|
177
|
+
try {
|
|
178
|
+
const res = await fetchWithWorkspaceScope(
|
|
179
|
+
`/api/operator/v1/operations/${encodeURIComponent(operationId)}`,
|
|
180
|
+
{ credentials: "same-origin" },
|
|
181
|
+
);
|
|
182
|
+
let body = null;
|
|
183
|
+
try {
|
|
184
|
+
body = await res.json();
|
|
185
|
+
} catch {
|
|
186
|
+
body = null;
|
|
187
|
+
}
|
|
188
|
+
return { ok: res.ok, status: res.status, body };
|
|
189
|
+
} catch {
|
|
190
|
+
return { ok: false, status: 0, body: null };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
107
194
|
export function parseArtifactPreviewResponse(text) {
|
|
108
195
|
const parsed = JSON.parse(text);
|
|
109
196
|
if (!parsed || typeof parsed.content !== "string") {
|
|
@@ -114,4 +201,3 @@ export function parseArtifactPreviewResponse(text) {
|
|
|
114
201
|
truncated: parsed.truncated === true,
|
|
115
202
|
};
|
|
116
203
|
}
|
|
117
|
-
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
/** Observe UI bootstrap:
|
|
1
|
+
/** Observe UI bootstrap: standalone compatibility entry + re-exports. */
|
|
2
2
|
import {
|
|
3
3
|
parseHashRoute,
|
|
4
4
|
parseHashRouteWithFilters,
|
|
5
5
|
buildHashPath,
|
|
6
|
-
parseRoute,
|
|
7
6
|
} from "./router.js";
|
|
8
7
|
import { parseArtifactPreviewResponse } from "./api.js";
|
|
9
8
|
import {
|
|
@@ -15,7 +14,6 @@ import {
|
|
|
15
14
|
} from "./relations.js";
|
|
16
15
|
import { copyText, renderRecommendedCommand } from "./copy.js";
|
|
17
16
|
import {
|
|
18
|
-
isPageVisible,
|
|
19
17
|
detailPollDelay,
|
|
20
18
|
updateDagGraphViewportState,
|
|
21
19
|
captureDagGraphViewportState,
|
|
@@ -25,11 +23,9 @@ import {
|
|
|
25
23
|
shouldReuseDagDetailShell,
|
|
26
24
|
shouldPreserveDiagnosticsOpen,
|
|
27
25
|
isInteractiveGestureActive,
|
|
28
|
-
stopTimers,
|
|
29
26
|
renderViewState,
|
|
30
27
|
mountViewState,
|
|
31
28
|
viewStateDescriptor,
|
|
32
|
-
uiState,
|
|
33
29
|
} from "./state.js";
|
|
34
30
|
import { sortPoolTasks, poolStatusCounts } from "./format-pool.js";
|
|
35
31
|
import {
|
|
@@ -45,34 +41,22 @@ import {
|
|
|
45
41
|
dashboardVisibleFeatures,
|
|
46
42
|
findDagForRun,
|
|
47
43
|
} from "./dag-model.js";
|
|
48
|
-
|
|
49
|
-
import { renderFailures } from "./views/failures.js";
|
|
50
|
-
import { startPoolView } from "./views/pool.js";
|
|
51
|
-
import { startDashboardPolling } from "./views/dashboard.js";
|
|
52
|
-
import { startDagsView } from "./views/dags.js";
|
|
53
|
-
import { renderFeatureDetail } from "./views/feature.js";
|
|
54
|
-
import { renderBatch } from "./views/batch.js";
|
|
55
|
-
import { startTaskPolling } from "./views/task.js";
|
|
56
|
-
import { startRunPolling } from "./views/run.js";
|
|
57
|
-
import { startDagPolling } from "./views/dag.js";
|
|
58
44
|
import { renderDagGraph } from "./views/dag-graph.js";
|
|
59
|
-
import { renderNightJobs } from "./views/night.js";
|
|
60
45
|
import {
|
|
61
46
|
selectDagNode,
|
|
62
47
|
closeDagInspector,
|
|
63
|
-
closeDagInspectorOnOutsideClick,
|
|
64
48
|
renderDagInspector,
|
|
65
49
|
} from "./views/dag-inspector.js";
|
|
66
50
|
import {
|
|
67
51
|
mergeSessionEvents,
|
|
68
52
|
renderSessionTimeline,
|
|
69
53
|
} from "./views/session-timeline.js";
|
|
70
|
-
import {
|
|
54
|
+
import {
|
|
55
|
+
route,
|
|
56
|
+
startStandaloneInspect,
|
|
57
|
+
tryCanonicalizeStandaloneInspect,
|
|
58
|
+
} from "./inspect-workspace.js";
|
|
71
59
|
|
|
72
|
-
// Compatibility re-exports for poll-stable UI helpers (owned by state.js / views):
|
|
73
|
-
// reuse-dag-detail-shell, reuse-dag-graph-wrap, existingGraphWrap?.parentNode === ranksEl,
|
|
74
|
-
// existingDetails?.parentNode === metaEl, let pre = existingPre, computeFollowLatest,
|
|
75
|
-
// updateDagOutputViewportState, isInteractiveGestureActive.
|
|
76
60
|
export {
|
|
77
61
|
detailPollDelay,
|
|
78
62
|
parseMarkdownBlocks,
|
|
@@ -114,56 +98,20 @@ export {
|
|
|
114
98
|
renderDagInspector,
|
|
115
99
|
renderSessionTimeline,
|
|
116
100
|
mergeSessionEvents,
|
|
101
|
+
route,
|
|
102
|
+
tryCanonicalizeStandaloneInspect,
|
|
117
103
|
};
|
|
118
104
|
|
|
119
|
-
function route() {
|
|
120
|
-
stopTimers();
|
|
121
|
-
const r = parseRoute();
|
|
122
|
-
if (r.view === "dashboard") {
|
|
123
|
-
startDashboardPolling(r.scrollTo);
|
|
124
|
-
} else if (r.view === "dags") {
|
|
125
|
-
void startDagsView();
|
|
126
|
-
} else if (r.view === "batch") {
|
|
127
|
-
void renderBatch(r.batchRunId);
|
|
128
|
-
} else if (r.view === "run") {
|
|
129
|
-
startRunPolling(r.workerRunId);
|
|
130
|
-
} else if (r.view === "dag") {
|
|
131
|
-
startDagPolling(r.dagRunId);
|
|
132
|
-
} else if (r.view === "failures") {
|
|
133
|
-
void renderFailures();
|
|
134
|
-
} else if (r.view === "pool") {
|
|
135
|
-
startPoolView();
|
|
136
|
-
} else if (r.view === "night") {
|
|
137
|
-
void renderNightJobs(r.scheduleId);
|
|
138
|
-
} else if (r.view === "task") {
|
|
139
|
-
startTaskPolling(r.featureId, r.taskId);
|
|
140
|
-
} else if (r.view === "feature") {
|
|
141
|
-
void renderFeatureDetail(r.featureId);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
105
|
if (typeof window !== "undefined") {
|
|
146
|
-
//
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
106
|
+
// Compatibility listeners remain owned by inspect-workspace.js:
|
|
107
|
+
// window.addEventListener("hashchange", route)
|
|
108
|
+
// window.addEventListener("load", route)
|
|
109
|
+
// document.addEventListener("pointerdown", closeDagInspectorOnOutsideClick)
|
|
110
|
+
// document.addEventListener("visibilitychange", ...)
|
|
111
|
+
// reuse-dag-detail-shell, reuse-dag-graph-wrap, existingGraphWrap?.parentNode === ranksEl,
|
|
112
|
+
// existingDetails?.parentNode === metaEl, let pre = existingPre, computeFollowLatest,
|
|
113
|
+
// updateDagOutputViewportState, isInteractiveGestureActive.
|
|
114
|
+
if (!tryCanonicalizeStandaloneInspect(window.location)) {
|
|
115
|
+
startStandaloneInspect();
|
|
155
116
|
}
|
|
156
|
-
window.addEventListener("hashchange", route);
|
|
157
|
-
window.addEventListener("load", route);
|
|
158
|
-
document.addEventListener("pointerdown", closeDagInspectorOnOutsideClick);
|
|
159
|
-
document.addEventListener("visibilitychange", () => {
|
|
160
|
-
if (!isPageVisible()) return;
|
|
161
|
-
const r = parseRoute();
|
|
162
|
-
if (r.view === "dashboard") startDashboardPolling();
|
|
163
|
-
// History page is manual-refresh only (no 5s dashboard polling).
|
|
164
|
-
if (r.view === "run") startRunPolling(r.workerRunId, false);
|
|
165
|
-
if (r.view === "dag") startDagPolling(r.dagRunId, false);
|
|
166
|
-
if (r.view === "pool" && uiState.poolAutoRefresh) startPoolView();
|
|
167
|
-
if (r.view === "task") startTaskPolling(r.featureId, r.taskId);
|
|
168
|
-
});
|
|
169
117
|
}
|
|
@@ -53,7 +53,14 @@ export const UI_TEXT = {
|
|
|
53
53
|
inputError: "加载节点输入失败。",
|
|
54
54
|
inputFrozenLabel: "冻结 DAG 节点定义",
|
|
55
55
|
inputFingerprintNote: "仅保存 assembled prompt 指纹,全文未持久化",
|
|
56
|
-
noSessionEvents: "
|
|
56
|
+
noSessionEvents: "该 Pi 节点暂无过程日志(可能尚未执行、走 CLI 路径,或为历史 run)",
|
|
57
|
+
noShellProcess: "该 shell 节点尚未留下命令回执。",
|
|
58
|
+
noPresetProcess: "该内部处理器尚未留下过程回执。",
|
|
59
|
+
staticNoProcess: "静态节点没有逐步执行过程,请查看节点输出。",
|
|
60
|
+
processLoading: "正在加载执行过程…",
|
|
61
|
+
processError: "加载执行过程失败。",
|
|
62
|
+
shellCommandsHeading: "Shell 命令",
|
|
63
|
+
shellPresetHeading: "内部处理器",
|
|
57
64
|
noArtifacts: "暂无产物记录。",
|
|
58
65
|
noActiveCommand: "当前没有正在执行的命令。",
|
|
59
66
|
noFailures: "当前没有异常 Task。",
|
|
@@ -14,6 +14,10 @@ const ATTEMPT_FAILURE_LABELS = {
|
|
|
14
14
|
timeout: "执行超时",
|
|
15
15
|
"nonzero-exit": "命令执行失败",
|
|
16
16
|
"invalid-output": "输出格式无效",
|
|
17
|
+
"structured-output-truncated": "结构化输出被截断",
|
|
18
|
+
"output-too-large": "输出超出体积上限",
|
|
19
|
+
"structured-repair-exhausted": "结构化修复耗尽",
|
|
20
|
+
"governance-blocked": "治理规则阻断",
|
|
17
21
|
"empty-output": "输出为空",
|
|
18
22
|
auth: "认证失败",
|
|
19
23
|
quota: "额度或限流",
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Short Chinese purpose copy for DAG node IDs shown in the inspector table.
|
|
3
|
+
* Exact IDs first; then conservative suffixes. Never echo the raw nodeId.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const NODE_PURPOSE_BY_ID = {
|
|
7
|
+
"contract-pi": "只读梳理范围、风险与写入边界,产出实现契约,不改代码。",
|
|
8
|
+
"scout-src": "只读侦察源码结构与现有模式,给后续实现找落点,不改文件。",
|
|
9
|
+
"scout-tests": "只读侦察测试与验证入口,标出可复用的检查方式,不改文件。",
|
|
10
|
+
"plan-pi": "根据契约与侦察结果制定实现计划与 writeSet,仍不改业务代码。",
|
|
11
|
+
"plan-revision-pi": "按审查意见修订实现计划,收窄写入范围,不扩大任务边界。",
|
|
12
|
+
"implement-pi": "在允许路径内按计划改代码,完成本轮主实现。",
|
|
13
|
+
"implement-core": "在允许路径内完成核心实现,不越出约定写入范围。",
|
|
14
|
+
"repair-pi": "只修验证暴露出的可修复问题,不重开需求、不扩大 writeSet。",
|
|
15
|
+
"verify-shell": "跑冻结的验证命令,用退出码证明实现是否达标。",
|
|
16
|
+
"soft-verify-shell": "先做软验证,留下证据供过程监督,不立刻判整单失败。",
|
|
17
|
+
"hard-verify-shell": "硬验证:命令必须通过,作为后续审查与收口的事实。",
|
|
18
|
+
"review-pi": "对照需求与 diff 做只读审查,给出通过或需修订。",
|
|
19
|
+
"review-verdict-recovery-pi": "补齐或纠正审查结论格式,确保门禁能读到明确 VERDICT。",
|
|
20
|
+
"review-gate-shell": "确定性门禁:只有审查结论为通过才放行收口。",
|
|
21
|
+
"decision-pi": "汇总本轮证据,给出继续、修订或停止的决策建议。",
|
|
22
|
+
"closeout-pi": "汇总完成证据与交接说明,宣告本轮交付结束。",
|
|
23
|
+
"write-set-audit-pi": "审查计划中的写入范围是否过宽或重叠,给出初审结论。",
|
|
24
|
+
"write-set-audit-format-repair-pi": "只修复写入范围审查的结论格式,不改计划内容。",
|
|
25
|
+
"write-set-format-gate-shell": "检查写入范围审查格式是否有效,未通过则不能开始改代码。",
|
|
26
|
+
"final-write-set-audit-pi": "终审写入范围:确认最终计划可授权 implement-pi。",
|
|
27
|
+
"final-write-set-audit-format-repair-pi": "只修复终审结论格式,保留原审查发现。",
|
|
28
|
+
"write-set-gate-shell": "写入授权门禁:终审通过后才允许实现节点改文件。",
|
|
29
|
+
"process-supervisor-pi": "只读检查实现过程是否偏离契约与验证,提出Bounded 修复建议。",
|
|
30
|
+
"process-gate-shell": "过程监督门禁:根据监督结论决定是否进入 repair。",
|
|
31
|
+
"authority-surface-audit-pi": "审查谁能写状态、哪些面暴露给模型,防止越权通路。",
|
|
32
|
+
"authority-surface-gate-shell": "权限面门禁:审查未通过则不能进入收口。",
|
|
33
|
+
"task-state-reconcile-shell": "核对任务状态与运行事实是否一致,避免用过期状态收口。",
|
|
34
|
+
"requirement-coverage-shell": "检查实现是否覆盖已编号需求,漏项则不能宣称完成。",
|
|
35
|
+
"static-invariant-shell": "跑静态不变量检查,确认约定结构与约束仍成立。",
|
|
36
|
+
"changeset-impact-shell": "评估本轮 diff 的影响面,标出高风险改动。",
|
|
37
|
+
"closeout-artifact-shell": "收集收口所需的确定性产物与证据路径。",
|
|
38
|
+
"final-verify-shell": "收口前最后一轮冻结验证,作为完成权威。",
|
|
39
|
+
"closeout-summary-pi": "把验证与交付事实写成简短交接摘要。",
|
|
40
|
+
|
|
41
|
+
"frontend-contract-pi": "把前端需求整理成可追踪契约:页面、状态、验收与边界。",
|
|
42
|
+
"frontend-contract-import-shell": "导入并固化前端实现契约,供后续设计、写入与验证节点使用。",
|
|
43
|
+
"frontend-scout-pi": "只读侦察前端结构、组件与接口用法,不改文件。",
|
|
44
|
+
"frontend-plan-pi": "选定实现与 Mock/API 策略,输出可执行的前端实现契约补丁。",
|
|
45
|
+
"frontend-design-policy-shell": "确定前端设计与 Mock/API 策略,冻结后续实现必须遵守的规则。",
|
|
46
|
+
"frontend-design-review-pi": "审查前端计划是否可写:通过则沿用原计划,否则要求修订。",
|
|
47
|
+
"frontend-plan-revision-pi": "按设计审查意见修订前端契约,不扩大范围。",
|
|
48
|
+
"frontend-final-design-review-pi": "复核修订后的前端计划,只有通过才能授权写入。",
|
|
49
|
+
"frontend-prewrite-gate-shell": "写入前门禁:核对契约、覆盖与 Mock 策略,通过才允许改前端。",
|
|
50
|
+
"frontend-writer-admission-shell": "核对契约、设计策略与 writeSet,满足准入条件后才允许 writer 写入。",
|
|
51
|
+
"frontend-lint-baseline-shell": "记录写入前的 lint 基线,供实现后对比,不阻断写入。",
|
|
52
|
+
"frontend-implement-pi": "按已批准契约改前端代码、状态与交互,留在 writeSet 内。",
|
|
53
|
+
"frontend-verify-assess-shell": "跑静态/行为/Mock 验证并评估能否有界修复。",
|
|
54
|
+
"frontend-verify-shell": "执行冻结的前端验证命令,产出可复查的通过或失败证据。",
|
|
55
|
+
"frontend-repair-pi": "只修评估为可修复的前端失败,不重开需求。",
|
|
56
|
+
"frontend-reverify-shell": "修复后用同一套冻结命令复验。",
|
|
57
|
+
"frontend-review-context-shell": "打包真实 diff 与有效验证证据,供审查节点使用。",
|
|
58
|
+
"frontend-review-pi": "对照契约审查前端实现与证据,给出通过或需修订。",
|
|
59
|
+
"frontend-review-gate-shell": "前端审查门禁:结论为通过才进入收口。",
|
|
60
|
+
"frontend-closeout-shell": "汇总实现、验证与遗留事项,形成确定性的前端收口事实。",
|
|
61
|
+
"frontend-closeout-pi": "汇总前端交付状态(含真实联调是否仍待完成)。",
|
|
62
|
+
"frontend-mock-assess-pi": "评估项目是否具备授权的 Mock 验证能力。",
|
|
63
|
+
"frontend-mock-contract-gate-shell": "Mock 契约门禁:策略与验证命令不一致则阻断。",
|
|
64
|
+
"frontend-mock-verify-shell": "执行已授权的 Mock 验证命令。",
|
|
65
|
+
"frontend-mock-blocked-shell": "缺少授权 Mock 命令时给出确定性阻断说明。",
|
|
66
|
+
|
|
67
|
+
"preflight-frontend-browser-tool-shell": "检查浏览器自动化工具是否可用,失败则不进入用例执行。",
|
|
68
|
+
"prepare-frontend-test-package-shell": "准备前端测试包与标准场景资产。",
|
|
69
|
+
"retrieve-frontend-test-context-pi": "检索页面与验收上下文,供生成用例引用。",
|
|
70
|
+
"materialize-frontend-test-execution-shell": "物化前端测试执行清单与路径。",
|
|
71
|
+
"generate-frontend-functional-cases-pi": "按验收标准生成可执行的前端功能用例。",
|
|
72
|
+
"checklist-and-materialize-manifest-shell": "核对清单并物化用例 manifest。",
|
|
73
|
+
"execute-frontend-cases-map": "按用例清单并行跑浏览器步骤,每条用例一个子节点。",
|
|
74
|
+
"select-frontend-rerun-candidates-shell": "挑出可有界重跑的失败/缺失用例。",
|
|
75
|
+
"rerun-frontend-cases-map": "对入选用例再跑一轮浏览器步骤,以最新证据为准。",
|
|
76
|
+
"generate-backend-md-cases-map": "按模块并行写出 Markdown 用例卡片。",
|
|
77
|
+
"generate-backend-pytest-cases-map": "按模块并行写出对应的 pytest 脚本。",
|
|
78
|
+
"patch-backend-md-cases-map": "按缺口计划并行补丁各模块 Markdown 用例。",
|
|
79
|
+
"patch-backend-pytest-cases-map": "按缺口计划并行补丁各模块 pytest 脚本。",
|
|
80
|
+
"finalize-frontend-test-result-shell": "汇总用例结果,写成统一结论。",
|
|
81
|
+
"frontend-test-reports-shell": "生成前端测试 HTML/Markdown 报告。",
|
|
82
|
+
"frontend-test-result-outcome-gate-shell": "前端测试结果门禁:未达标则不能进入复盘收口。",
|
|
83
|
+
"frontend-test-retrospect-pi": "根据真实执行证据写前端测试复盘。",
|
|
84
|
+
|
|
85
|
+
"validate-backend-test-environment-shell": "检查 Python/pytest 与测试布局是否可跑,失败则不消耗模型。",
|
|
86
|
+
"backend-test-analysis-contract-shell": "固化后端测试分析契约与布局。",
|
|
87
|
+
"backend-test-environment-scout-pi": "侦察后端测试环境与入口,不改业务代码。",
|
|
88
|
+
"backend-test-execution-contract-shell": "冻结后端测试如何执行、产物写到哪里。",
|
|
89
|
+
"generate-backend-md-plan-pi": "生成中文模块索引与用例卡片计划。",
|
|
90
|
+
"materialize-backend-md-module-manifest-shell": "把 Markdown 模块清单落到磁盘。",
|
|
91
|
+
"review-and-revise-backend-md-cases-pi": "独立审查并修订 Markdown 用例。",
|
|
92
|
+
"validate-backend-md-cases-shell": "校验用例章节与 Case ID,结果只记录不阻断。",
|
|
93
|
+
"generate-backend-pytest-plan-pi": "把 Markdown 用例转成 pytest 脚本计划。",
|
|
94
|
+
"materialize-backend-pytest-module-manifest-shell": "物化 pytest 模块与脚本映射。",
|
|
95
|
+
"assess-backend-pytest-collection-shell": "试收集 pytest:能修的缺口才进入 repair。",
|
|
96
|
+
"repair-backend-pytest-collection-pi": "只补齐可归因的缺失 mapped 脚本。",
|
|
97
|
+
"effective-backend-pytest-collection-gate-shell": "收集门禁:映射不齐则不跑业务 pytest。",
|
|
98
|
+
"backend-test-traceability-gate-shell": "核对用例、脚本与验收的追踪关系。",
|
|
99
|
+
"backend-test-case-manifest-shell": "写出本轮有效用例清单事实。",
|
|
100
|
+
"execute-backend-pytest-and-html-report-shell": "单次跑业务 pytest 并生成 HTML/事实报告。",
|
|
101
|
+
"backend-test-report-and-l5-pi": "用中文汇总 advisory、执行事实与结论。",
|
|
102
|
+
"backend-test-outcome-gate-shell": "后端测试结果门禁:失败分类决定能否收口。",
|
|
103
|
+
"backend-test-report-shell": "生成后端测试报告产物。",
|
|
104
|
+
|
|
105
|
+
"knowledge-sync-collect-pi": "收集本轮验证与实现中应回写的知识。",
|
|
106
|
+
"knowledge-sync-draft-pi": "起草知识条目,不直接改权威文档。",
|
|
107
|
+
"knowledge-sync-validate-shell": "校验知识草稿结构与路径边界。",
|
|
108
|
+
"knowledge-sync-apply-pi": "把通过校验的知识写入约定文档。",
|
|
109
|
+
"knowledge-sync-pointer-pi": "更新知识索引或指针,方便下次检索。",
|
|
110
|
+
|
|
111
|
+
"kg-bootstrap-preflight-shell": "图谱开荒前检:确认仓库与工具可用。",
|
|
112
|
+
"kg-bootstrap-inventory-shell": "盘点代码与文档,列出待建图谱对象。",
|
|
113
|
+
"kg-bootstrap-propose-pi": "提出知识图谱节点与关系草案。",
|
|
114
|
+
"kg-bootstrap-validate-shell": "校验图谱草案是否可物化。",
|
|
115
|
+
"kg-bootstrap-review-pi": "审查图谱草案质量与边界。",
|
|
116
|
+
"kg-bootstrap-review-gate-shell": "图谱审查门禁:通过才允许物化。",
|
|
117
|
+
"kg-bootstrap-promote-shell": "把审查通过的图谱草案提升为有效输入。",
|
|
118
|
+
"kg-bootstrap-materialize-shell": "把图谱写入约定产物路径。",
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
function normalizeNodeId(nodeId) {
|
|
122
|
+
return String(nodeId ?? "")
|
|
123
|
+
.trim()
|
|
124
|
+
.split(/[/#]/)[0];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const NODE_PURPOSE_BY_PREFIX = [
|
|
128
|
+
[/^execute-frontend-case-\d+$/, "执行单条前端用例的浏览器步骤,并留下证据。"],
|
|
129
|
+
[/^rerun-frontend-case-/, "重跑入选的前端用例,以本轮证据覆盖上一轮结果。"],
|
|
130
|
+
[/^generate-backend-md-case-/, "为单个后端模块写出 Markdown 用例卡片。"],
|
|
131
|
+
[/^generate-backend-pytest-case-/, "为单个后端模块写出对应的 pytest 脚本。"],
|
|
132
|
+
[/^patch-backend-md-case-/, "按缺口计划补丁单个模块的 Markdown 用例。"],
|
|
133
|
+
[/^patch-backend-pytest-case-/, "按缺口计划补丁单个模块的 pytest 脚本。"],
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
function describeFromPattern(nodeId) {
|
|
137
|
+
const id = nodeId.toLowerCase();
|
|
138
|
+
for (const [pattern, text] of NODE_PURPOSE_BY_PREFIX) {
|
|
139
|
+
if (pattern.test(id)) return text;
|
|
140
|
+
}
|
|
141
|
+
if (id.endsWith("-map") || id.includes("-cases-map")) {
|
|
142
|
+
return "按清单并行展开子节点并汇总结果。";
|
|
143
|
+
}
|
|
144
|
+
if (id.includes("-gate-shell")) {
|
|
145
|
+
return "确定性门禁:核验上游结论,通过才放行后续节点。";
|
|
146
|
+
}
|
|
147
|
+
if (id.endsWith("-shell") && id.includes("verify")) {
|
|
148
|
+
return "跑冻结验证命令,留下可复查的通过/失败证据。";
|
|
149
|
+
}
|
|
150
|
+
if (id.endsWith("-shell") && (id.includes("report") || id.includes("manifest"))) {
|
|
151
|
+
return "把本轮证据整理成报告或清单,不改业务代码。";
|
|
152
|
+
}
|
|
153
|
+
if (id.endsWith("-shell")) {
|
|
154
|
+
return "运行确定性命令并留下证据,不靠模型自由发挥。";
|
|
155
|
+
}
|
|
156
|
+
if (id.includes("scout") && id.endsWith("-pi")) {
|
|
157
|
+
return "只读侦察相关代码或测试,整理给下游使用,不改文件。";
|
|
158
|
+
}
|
|
159
|
+
if (id.includes("repair") && id.endsWith("-pi")) {
|
|
160
|
+
return "在原写入范围内做有界修复,不重开需求。";
|
|
161
|
+
}
|
|
162
|
+
if (id.includes("implement") && id.endsWith("-pi")) {
|
|
163
|
+
return "在允许路径内改代码,完成本节点负责的实现。";
|
|
164
|
+
}
|
|
165
|
+
if ((id.includes("review") || id.includes("audit")) && id.endsWith("-pi")) {
|
|
166
|
+
return "只读审查上游产出,给出通过或需修订的结论。";
|
|
167
|
+
}
|
|
168
|
+
if (id.includes("plan") && id.endsWith("-pi")) {
|
|
169
|
+
return "制定或修订计划/契约,仍不直接改业务代码。";
|
|
170
|
+
}
|
|
171
|
+
if (id.includes("closeout") && id.endsWith("-pi")) {
|
|
172
|
+
return "汇总证据并写出交接说明。";
|
|
173
|
+
}
|
|
174
|
+
if (id.includes("contract") && id.endsWith("-pi")) {
|
|
175
|
+
return "把需求收成可执行契约:范围、验收与边界。";
|
|
176
|
+
}
|
|
177
|
+
if (id.endsWith("-pi")) {
|
|
178
|
+
return "由模型完成该步骤的分析或写入,受 writeSet 与验证约束。";
|
|
179
|
+
}
|
|
180
|
+
return "";
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function describeFromExecutor(executor) {
|
|
184
|
+
if (executor === "shell") return "运行确定性命令并留下证据。";
|
|
185
|
+
if (executor === "pi") return "由模型执行该步骤,范围受节点契约约束。";
|
|
186
|
+
if (executor === "static") return "按冻结规则直接给出结果,不调用模型。";
|
|
187
|
+
return "";
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @param {string | null | undefined} nodeId
|
|
192
|
+
* @param {{ executor?: string | null, label?: string | null }} [node]
|
|
193
|
+
*/
|
|
194
|
+
export function describeDagNodePurpose(nodeId, node = {}) {
|
|
195
|
+
const id = normalizeNodeId(nodeId);
|
|
196
|
+
if (!id) return "";
|
|
197
|
+
const exact = NODE_PURPOSE_BY_ID[id];
|
|
198
|
+
if (exact) return exact;
|
|
199
|
+
const patterned = describeFromPattern(id);
|
|
200
|
+
if (patterned) return patterned;
|
|
201
|
+
const label = typeof node.label === "string" ? node.label.trim() : "";
|
|
202
|
+
if (label && label !== id && label.toLowerCase() !== id.toLowerCase()) {
|
|
203
|
+
return label;
|
|
204
|
+
}
|
|
205
|
+
return describeFromExecutor(node.executor) || "";
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export { NODE_PURPOSE_BY_ID };
|
|
@@ -345,3 +345,63 @@ export function formatRepoPathDisplay(repoRoot) {
|
|
|
345
345
|
.replace(/^\/Users\/[^/]+/, "~")
|
|
346
346
|
.replace(/^\/home\/[^/]+/, "~");
|
|
347
347
|
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* If `text` is a complete JSON object or array, return pretty-printed JSON.
|
|
351
|
+
* Primitives, JSONL, truncated/invalid JSON, and markdown return null so
|
|
352
|
+
* callers can fall back to Markdown rendering.
|
|
353
|
+
*/
|
|
354
|
+
export function prettyJsonBlock(text) {
|
|
355
|
+
if (typeof text !== "string") return null;
|
|
356
|
+
const trimmed = text.trim();
|
|
357
|
+
if (trimmed.length < 2) return null;
|
|
358
|
+
const start = trimmed[0];
|
|
359
|
+
const end = trimmed[trimmed.length - 1];
|
|
360
|
+
if (!((start === "{" && end === "}") || (start === "[" && end === "]"))) {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
try {
|
|
364
|
+
const value = JSON.parse(trimmed);
|
|
365
|
+
if (value === null || typeof value !== "object") return null;
|
|
366
|
+
return JSON.stringify(value, null, 2);
|
|
367
|
+
} catch {
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Source fidelity ledger 安全摘要渲染(AC-009/AC-010/AC-HARD-004):计数/状态/
|
|
374
|
+
* failure code + v2 binding 语义(binding=v2 + ledger sha256/inputDigest,仅真实
|
|
375
|
+
* DagSourceBindingV2 时展示;inputDigest ≠ 当前 expectedInputDigest 时标记 stale)+
|
|
376
|
+
* 有界排除理由(fragmentId + 截断 reason),绝不渲染未截断原文。输入即安全摘要对象。
|
|
377
|
+
*/
|
|
378
|
+
export function formatLedgerSummary(summary) {
|
|
379
|
+
if (!summary || summary.present !== true) {
|
|
380
|
+
return "无 source fidelity ledger(任务无引用或 ledger 缺失,不伪造计数)";
|
|
381
|
+
}
|
|
382
|
+
const lines = [
|
|
383
|
+
`fragments=${summary.fragmentCount ?? 0}`,
|
|
384
|
+
`canonical requirements=${summary.canonicalRequirementCount ?? 0}`,
|
|
385
|
+
`context-only=${summary.contextOnlyCount ?? 0}`,
|
|
386
|
+
`duplicate=${summary.duplicateCount ?? 0}`,
|
|
387
|
+
`unresolved=${summary.unresolvedCount ?? 0}`,
|
|
388
|
+
`conflict=${summary.conflictCount ?? 0}`,
|
|
389
|
+
`gate=${summary.gateStatus ?? "unknown"}`,
|
|
390
|
+
];
|
|
391
|
+
if (summary.bindingSchemaVersion === 2) {
|
|
392
|
+
lines.push(
|
|
393
|
+
`binding=v2(受管 ledger 绑定)${summary.stale ? " · STALE(输入漂移)" : ""}`,
|
|
394
|
+
);
|
|
395
|
+
if (summary.ledgerSha256) lines.push(`ledgerSha256=${summary.ledgerSha256}`);
|
|
396
|
+
if (summary.inputDigest) lines.push(`inputDigest=${summary.inputDigest}`);
|
|
397
|
+
}
|
|
398
|
+
if (summary.failureCode) lines.push(`failureCode=${summary.failureCode}`);
|
|
399
|
+
const exclusions = Array.isArray(summary.exclusions) ? summary.exclusions : [];
|
|
400
|
+
if (exclusions.length > 0) {
|
|
401
|
+
lines.push("排除理由(有界摘要):");
|
|
402
|
+
for (const entry of exclusions.slice(0, 20)) {
|
|
403
|
+
lines.push(`- ${entry.fragmentId}: ${truncateText(entry.reason ?? "", 120)}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return lines.join("\n");
|
|
407
|
+
}
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
>
|
|
211
211
|
刷新
|
|
212
212
|
</button>
|
|
213
|
-
<a class="page-action-btn" href="/#/night">在操作台管理 →</a>
|
|
213
|
+
<a class="page-action-btn" href="/#/operate/night">在操作台管理 →</a>
|
|
214
214
|
</div>
|
|
215
215
|
</header>
|
|
216
216
|
<section
|
|
@@ -352,6 +352,11 @@
|
|
|
352
352
|
class="panel panel-table"
|
|
353
353
|
aria-label="运行历史"
|
|
354
354
|
></section>
|
|
355
|
+
<section
|
|
356
|
+
id="task-ledger"
|
|
357
|
+
class="panel panel-table"
|
|
358
|
+
aria-label="Source fidelity ledger"
|
|
359
|
+
></section>
|
|
355
360
|
</section>
|
|
356
361
|
|
|
357
362
|
<section data-view="feature" id="view-feature" class="view" hidden>
|