@tea-agent/loop-agent 0.39.0-next.9 → 0.39.1
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 +269 -69
- package/README.md +11 -5
- package/bin/loop-agent.js +7 -3
- package/dist/application/dag/generate-task-dag.js +9 -0
- package/dist/application/task-lifecycle/advance.js +16 -0
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +16 -5
- package/dist/cli/program.js +16 -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/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 +428 -27
- package/dist/commands/inspect-next.js +8 -0
- package/dist/commands/task-advance.js +31 -0
- package/dist/executors/dag-pi-executor.js +124 -18
- package/dist/executors/pi-event-serializer.js +42 -1
- package/dist/executors/pi-executor.js +51 -0
- package/dist/executors/pi-extension-resolver.js +233 -0
- package/dist/executors/pi-playwright-cli-tool.js +74 -28
- package/dist/executors/pi-sdk-executor.js +187 -59
- package/dist/executors/shell-executor.js +555 -34
- package/dist/executors/shell-write-guard.js +7 -0
- package/dist/shared/dag-failure-category.js +138 -0
- package/dist/shared/dag-prompt-override.js +27 -0
- package/dist/shared/operator/capabilities.js +181 -27
- 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 +28 -0
- package/dist/task/contract/apply.js +11 -1
- package/dist/task/contract/constants.js +3 -0
- package/dist/task/contract/diff.js +26 -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 +20 -1
- package/dist/task/contract/schema.js +8 -1
- package/dist/task/contract/transaction.js +12 -0
- package/dist/task/source-prepare/build-draft.js +15 -0
- package/dist/task/source-prepare/completeness.js +188 -0
- package/dist/task/source-prepare/fragment-inventory.js +474 -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 +262 -1
- package/dist/task/source-prepare/semantic-intake.js +19 -3
- package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
- package/dist/task/source-prepare/types.js +22 -0
- package/dist/worker/cli.js +18 -2
- package/dist/worker/console/chat/deferred-turn.js +91 -0
- package/dist/worker/console/chat/mcp-inventory.js +221 -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 +165 -83
- package/dist/worker/console/chat/repo-walk.js +10 -1
- package/dist/worker/console/chat/routes.js +480 -55
- package/dist/worker/console/chat/semantic-activity.js +20 -8
- package/dist/worker/console/chat/session-store.js +146 -2
- package/dist/worker/console/chat/turn-process.js +10 -10
- 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/inspect-split.js +18 -0
- package/dist/worker/console/operation-run-facts.js +19 -3
- package/dist/worker/console/operation-store.js +1 -1
- package/dist/worker/console/operator-actions.js +320 -4
- package/dist/worker/console/operator-surface-health.js +1 -0
- package/dist/worker/console/operator-user-error.js +2 -2
- package/dist/worker/console/pi-readiness.js +5 -4
- package/dist/worker/console/prd-intake-bridge.js +13 -0
- package/dist/worker/console/recovery-cta.js +4 -4
- package/dist/worker/console/recovery-error-copy.js +4 -4
- package/dist/worker/console/routes.js +46 -2
- package/dist/worker/console/security.js +63 -9
- package/dist/worker/console/server.js +111 -7
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-BLXFe4qI.js → abnfDiagram-N423BO3Z-CTx1TrNa.js} +1 -1
- package/dist/worker/console/static/assets/{arc-7iOJeqho.js → arc-B4i9cVxX.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CYoyj5K7.js → architectureDiagram-T3A2C74G-BAXE8_Rl.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-fK01JNlR.js → blockDiagram-VBNYF7ZC-C5Xh59at.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-bzbw5D_Z.js → c4Diagram-5PPSVZJV-B_asOzAu.js} +1 -1
- package/dist/worker/console/static/assets/channel-Dj_4Moei.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-Cf6hJFFG.js → chunk-2GRJ4B5K-wRO_iRNc.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DSFXR-et.js → chunk-2Q5K7J3B-ByOaSh_G.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BagJechl.js → chunk-5RXB4S5H-DjLzudan.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-E7QNMFaW.js → chunk-5VM5RSS4-JCNGkXYT.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-BG_eOBrC.js → chunk-6Q2QTUOP-BhrPXXMZ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-Bo42dqol.js → chunk-GF5L2VYU-TJ5JuEBT.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-dibM-87v.js → chunk-JWPE2WC7-VVthn_mD.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-Bytrp3Oe.js → chunk-KBJHAD2P-D60-Mny4.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DBABILrr.js → chunk-RYQCIY6F-zXv7aVye.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DCUk5Pf9.js → chunk-XXDRQBXY-By9VQoi1.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C0YYAyCa.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C0YYAyCa.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BlGE9v6E.js → cose-bilkent-JH36ORCC-C4zQLe-M.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-DGl5ewph.js → cynefin-VYW2F7L2-wh5N2ReN.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-DsJ_SVH_.js → cynefinDiagram-MW4NZA55-Dlu5wIqs.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BIhjFdzv.js → dagre-VZM6K2ZE-CrDgthc6.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Dmy1ctTb.js → diagram-7IWD3JNH-zN1clg27.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-DYCtWUF3.js → diagram-B4RE2ZJO-BN-o7J7-.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-BMZFHVd2.js → diagram-LBJQPF4R-C8SuPt0d.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-b_U8gfaO.js → diagram-Q27KOJAE-BoizuHbZ.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-Dzy_bn-I.js → diagram-UB23O5K3-BzUzXixG.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DJCiMNEI.js → ebnfDiagram-BXEA7PRR-Ev3lA4Cf.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-28lD016B.js → erDiagram-JOGREHBK-GALUzRbs.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DGyHJmIw.js → flowDiagram-UKHOOZJN-CZJN65Sb.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CzdwUjrO.js → ganttDiagram-PKOTCBZU-JLB9OESl.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-D9bGwuo8.js → gitGraphDiagram-DS77QQ5N-CcvCr4GD.js} +1 -1
- package/dist/worker/console/static/assets/index-CW88Fjbw.js +406 -0
- package/dist/worker/console/static/assets/index-DP0ZJl39.css +1 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-LJgJUQFC.js → infoDiagram-6WML65LV-HG5z7aVg.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-98LaB8zb.js → ishikawaDiagram-WSZJBQD7-BHEu9chR.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-D-ISzwlQ.js → journeyDiagram-NVQOT4AX-Cp_Up8-a.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-gfYOI-EL.js → kanban-definition-27J2QSJJ-DvVeY-em.js} +1 -1
- package/dist/worker/console/static/assets/{linear-CyntZgKV.js → linear-aGmcjgTn.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-BBOR7dg0.js → mermaid.core-Biyo-tqA.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CQAgwPMk.js → mindmap-definition-FAOFIHXS-DyxY2pIb.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DkMiZFuV.js → pegDiagram-VL7TDLO6-CkdGuc50.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DLNXa_0J.js → pieDiagram-7S7Q4E2Y-NNQI9xVR.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-Dc7bdzjm.js → quadrantDiagram-CIZ2JOQS-PAJkuz_G.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BxMB0QqW.js → railroadDiagram-AXF67PYL-ZwrQod0O.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-FjumoKn4.js → requirementDiagram-LRYGKXZP-D3ZfrzM2.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-CkhKc_E3.js → sankeyDiagram-W5VNT64P-DDGFmWk5.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DoBWqTTH.js → sequenceDiagram-SI44F4Z6-DO6mmXTA.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CQeh_YeE.js → sizeCapture-X5ZJPWSS-DMbCQiJt.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-LuHmFW-I.js → stateDiagram-OKZ733FA-Di_YUEfC.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DrdDvela.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-CHwbDctY.js → swimlanes-SLNWSIFB-Bn2PphNJ.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DPkEAULl.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CoMngk0X.js → timeline-definition-Z64GVDOM-DPh8pRsp.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-CURYbtbO.js → vennDiagram-T6HMQDX7-GMfl26pW.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-BdqSECjU.js → wardleyDiagram-T6FBY63Y-DTlmVrmF.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-DbMUYuAg.js → xychartDiagram-ELKLHX3M-YGBjKAS5.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/console-types.js +40 -1
- package/dist/worker/console/static-src/app/useOperatorActions.js +6 -1
- package/dist/worker/console/static-src/app/useRecoveryActions.js +2 -2
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +38 -2
- package/dist/worker/console/static-src/app/useRunProgress.js +46 -0
- package/dist/worker/console/static-src/app/useTaskWizard.js +73 -1
- 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 +74 -26
- 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/open-preview-in-browser.js +328 -0
- package/dist/worker/console/static-src/operator-chat/resource-diagnostics.js +204 -0
- package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +8 -1
- package/dist/worker/console/static-src/operator-chat/turn-submission.js +54 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +3 -0
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +237 -11
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +50 -22
- package/dist/worker/console/static-src/operator-chat/useComposer.js +32 -0
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +26 -1
- 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/loop-agent/loop-agent-client.js +7 -3
- 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/shell-handler-keys.js +34 -0
- package/dist/worker/observe/static/api.js +67 -1
- 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/format.js +60 -0
- package/dist/worker/observe/static/index.html +5 -0
- package/dist/worker/observe/static/markdown-render.js +20 -1
- package/dist/worker/observe/static/operator-chrome.js +4 -0
- 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/state.js +13 -2
- package/dist/worker/observe/static/styles.css +85 -0
- package/dist/worker/observe/static/views/dag-inspector.js +912 -8
- package/dist/worker/observe/static/views/dag.js +8 -1
- package/dist/worker/observe/static/views/failures.js +5 -2
- package/dist/worker/observe/static/views/session-timeline.js +78 -9
- package/dist/worker/observe/static/views/task.js +55 -0
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +856 -54
- package/dist/workflows/dag/backend-test-case-manifest.js +4 -0
- package/dist/workflows/dag/backend-test-execution-contract.js +18 -9
- package/dist/workflows/dag/backend-test-gap-fill.js +205 -0
- package/dist/workflows/dag/backend-test-intake-context.js +32 -0
- package/dist/workflows/dag/backend-test-layout.js +133 -0
- package/dist/workflows/dag/backend-test-markdown-workflow.js +343 -33
- package/dist/workflows/dag/backend-test-module-stem.js +5 -0
- package/dist/workflows/dag/backend-test-pytest-collection.js +454 -36
- package/dist/workflows/dag/backend-test-result-contract.js +1 -1
- package/dist/workflows/dag/backend-test-scenario-param.js +884 -140
- package/dist/workflows/dag/backend-test-scenario-partitions.js +321 -0
- package/dist/workflows/dag/backend-test-writer-completeness.js +110 -61
- package/dist/workflows/dag/contract-output-registry.js +15 -0
- package/dist/workflows/dag/contract-validator-registrations.js +3 -1
- package/dist/workflows/dag/convergence/controller.js +141 -0
- package/dist/workflows/dag/dynamic-runtime/loop-until.js +1 -1
- package/dist/workflows/dag/dynamic-runtime/map.js +25 -9
- package/dist/workflows/dag/dynamic-runtime/shared.js +1 -1
- package/dist/workflows/dag/failure-category.js +7 -116
- package/dist/workflows/dag/frontend-implementation-contract.js +465 -6
- package/dist/workflows/dag/frontend-plan-render.js +24 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +293 -84
- package/dist/workflows/dag/frontend-repair.js +14 -0
- package/dist/workflows/dag/frontend-review-context.js +92 -10
- package/dist/workflows/dag/frontend-risk.js +15 -2
- 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-verification-trace.js +29 -4
- package/dist/workflows/dag/init-hybrid.js +1019 -209
- package/dist/workflows/dag/node-execution.js +228 -15
- package/dist/workflows/dag/prompt.js +60 -1
- package/dist/workflows/dag/rerun-feedback.js +212 -0
- package/dist/workflows/dag/rerun-plan.js +224 -27
- package/dist/workflows/dag/rerun-run.js +61 -6
- package/dist/workflows/dag/rerun-task.js +61 -2
- package/dist/workflows/dag/retry-policy.js +109 -0
- package/dist/workflows/dag/structured-output-repair.js +712 -0
- package/dist/workflows/dag/types.js +185 -12
- package/dist/workflows/dag/validate.js +64 -20
- package/docs/README.md +1 -0
- package/docs/architecture/evolution.md +45 -0
- package/docs/init-surface.manifest.json +6 -0
- package/docs/operations/README.md +1 -1
- package/docs/operations/local-development-environment.md +1 -5
- package/docs/skills/vetted-skill-registry.md +14 -0
- package/docs/templates/README.md +2 -2
- package/docs/templates/agent-dag.schema.json +44 -0
- package/docs/templates/backend-test-dag.json +60 -35
- package/docs/templates/frontend-implementation-contract.schema.json +681 -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/harness.json +6 -4
- package/package.json +12 -4
- 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/analyze-product-requirements/SKILL.md +8 -5
- package/skills/analyze-product-requirements/references/acceptance-criteria.md +1 -1
- package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +10 -6
- package/skills/analyze-product-requirements/references/example.md +50 -0
- package/skills/analyze-product-requirements/references/forward-test-cases.md +11 -7
- package/skills/analyze-product-requirements/references/kb-integration.md +5 -5
- package/skills/analyze-product-requirements/references/product-analysis-schema.md +8 -4
- package/skills/analyze-product-requirements/references/product-requirement-schema.md +2 -2
- package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +1 -1
- package/skills/analyze-product-requirements/scripts/test-validators.mjs +11 -1
- package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +20 -1
- package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +9 -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-implementation/references/node-contracts.md +2 -2
- package/skills/improve-codebase-architecture/SKILL.md +81 -0
- package/skills/improve-codebase-architecture/deepening.md +37 -0
- package/skills/improve-codebase-architecture/html-report.md +123 -0
- package/skills/improve-codebase-architecture/interface-design.md +44 -0
- package/skills/improve-codebase-architecture/language.md +53 -0
- package/skills/loop-agent/references/command-reference.md +11 -4
- package/skills/loop-agent/references/hybrid-dag.md +7 -0
- 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-BBOTJHvD.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Cm8Yf8tD.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Cm8Yf8tD.js +0 -1
- package/dist/worker/console/static/assets/index-B-qWGThd.js +0 -325
- package/dist/worker/console/static/assets/index-C-xRgY_0.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DZihfdKc.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CKnXCjHX.js +0 -8
|
@@ -67,6 +67,7 @@ export async function handleConsoleHealthRequest(_req, res, ctx) {
|
|
|
67
67
|
piReadiness: ctx.operator?.getReadiness().state ?? "setup-required",
|
|
68
68
|
inspectReady: ctx.inspect.ready,
|
|
69
69
|
routes: ROUTES,
|
|
70
|
+
consoleInstanceId: ctx.consoleInstanceId,
|
|
70
71
|
}));
|
|
71
72
|
}
|
|
72
73
|
catch {
|
|
@@ -77,6 +78,7 @@ export async function handleConsoleHealthRequest(_req, res, ctx) {
|
|
|
77
78
|
repoFingerprint: "unavailable",
|
|
78
79
|
packageName: "unknown",
|
|
79
80
|
packageVersion: "0.0.0",
|
|
81
|
+
consoleInstanceId: ctx.consoleInstanceId,
|
|
80
82
|
piReadiness: ctx.operator?.getReadiness().state ?? "setup-required",
|
|
81
83
|
inspect: {
|
|
82
84
|
ready: ctx.inspect.ready,
|
|
@@ -116,6 +118,7 @@ async function handleRecoveryCandidates(_req, res, ctx, url) {
|
|
|
116
118
|
}
|
|
117
119
|
async function handleSessionPing(req, res, ctx) {
|
|
118
120
|
const failure = evaluateMutationGate(req, {
|
|
121
|
+
cookieName: ctx.bootToken.cookieName,
|
|
119
122
|
bootToken: ctx.bootToken.value,
|
|
120
123
|
confirmationToken: ctx.bootToken.confirmationToken,
|
|
121
124
|
consoleOrigin: ctx.getConsoleOrigin(),
|
|
@@ -130,6 +133,16 @@ async function handleSessionPing(req, res, ctx) {
|
|
|
130
133
|
}
|
|
131
134
|
sendJson(res, 200, { ok: true, pong: true });
|
|
132
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Actions the inspect-scoped mutation token may dispatch. Deliberately
|
|
138
|
+
* minimal: the experimental prompt-override rerun tab needs plan preflight +
|
|
139
|
+
* execution only. Everything else (task creation, runDag, reconcile, chat,
|
|
140
|
+
* worker actions…) requires the general Console token.
|
|
141
|
+
*/
|
|
142
|
+
export const INSPECT_MUTATION_ALLOWED_ACTIONS = new Set([
|
|
143
|
+
"dagRerunPlan",
|
|
144
|
+
"dagRerun",
|
|
145
|
+
]);
|
|
133
146
|
async function handleCreateOperation(req, res, ctx) {
|
|
134
147
|
if (!ctx.operator) {
|
|
135
148
|
sendJson(res, 503, {
|
|
@@ -141,12 +154,31 @@ async function handleCreateOperation(req, res, ctx) {
|
|
|
141
154
|
});
|
|
142
155
|
return;
|
|
143
156
|
}
|
|
144
|
-
const
|
|
157
|
+
const generalGateContext = {
|
|
158
|
+
cookieName: ctx.bootToken.cookieName,
|
|
145
159
|
bootToken: ctx.bootToken.value,
|
|
146
160
|
confirmationToken: ctx.bootToken.confirmationToken,
|
|
147
161
|
consoleOrigin: ctx.getConsoleOrigin(),
|
|
148
162
|
allowNonLoopbackAccess: ctx.allowNonLoopbackAccess === true,
|
|
149
|
-
}
|
|
163
|
+
};
|
|
164
|
+
let failure = evaluateMutationGate(req, generalGateContext);
|
|
165
|
+
let inspectScoped = false;
|
|
166
|
+
if (failure && ctx.inspectBootToken) {
|
|
167
|
+
// Scoped /inspect credentials: try the inspect gate before failing. The
|
|
168
|
+
// general gate already rejected, so passing here only ever yields the
|
|
169
|
+
// allowlisted actions below — never general write capability.
|
|
170
|
+
const scopedFailure = evaluateMutationGate(req, {
|
|
171
|
+
cookieName: ctx.inspectBootToken.cookieName,
|
|
172
|
+
bootToken: ctx.inspectBootToken.value,
|
|
173
|
+
confirmationToken: ctx.inspectBootToken.confirmationToken,
|
|
174
|
+
consoleOrigin: ctx.getConsoleOrigin(),
|
|
175
|
+
allowNonLoopbackAccess: ctx.allowNonLoopbackAccess === true,
|
|
176
|
+
});
|
|
177
|
+
if (!scopedFailure) {
|
|
178
|
+
inspectScoped = true;
|
|
179
|
+
failure = undefined;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
150
182
|
if (failure) {
|
|
151
183
|
sendJson(res, failure.status, {
|
|
152
184
|
ok: false,
|
|
@@ -173,10 +205,21 @@ async function handleCreateOperation(req, res, ctx) {
|
|
|
173
205
|
? body.actionParams
|
|
174
206
|
: {};
|
|
175
207
|
const clientRequestId = typeof body.clientRequestId === "string" ? body.clientRequestId : undefined;
|
|
208
|
+
if (inspectScoped && !INSPECT_MUTATION_ALLOWED_ACTIONS.has(action)) {
|
|
209
|
+
sendJson(res, 403, {
|
|
210
|
+
ok: false,
|
|
211
|
+
error: {
|
|
212
|
+
code: "ACTION_NOT_IN_INSPECT_SCOPE",
|
|
213
|
+
message: `inspect-scoped token only allows: ${[...INSPECT_MUTATION_ALLOWED_ACTIONS].join(", ")}`,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
176
218
|
const result = await dispatchOperatorAction(ctx.operator.actionContext, {
|
|
177
219
|
action,
|
|
178
220
|
actionParams,
|
|
179
221
|
clientRequestId,
|
|
222
|
+
source: "human-ui",
|
|
180
223
|
});
|
|
181
224
|
sendJson(res, result.status, result.body);
|
|
182
225
|
}
|
|
@@ -428,6 +471,7 @@ export async function handleConsoleOperatorRequest(req, res, ctx) {
|
|
|
428
471
|
}
|
|
429
472
|
if (isMutationMethod(method)) {
|
|
430
473
|
const failure = evaluateMutationGate(req, {
|
|
474
|
+
cookieName: ctx.bootToken.cookieName,
|
|
431
475
|
bootToken: ctx.bootToken.value,
|
|
432
476
|
confirmationToken: ctx.bootToken.confirmationToken,
|
|
433
477
|
consoleOrigin: ctx.getConsoleOrigin(),
|
|
@@ -1,24 +1,78 @@
|
|
|
1
|
-
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
1
|
+
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
2
|
import { isLoopbackHost } from "./loopback.js";
|
|
3
|
+
/** Prefix for instance-scoped Cookie names; not a lookup name. */
|
|
3
4
|
export const BOOT_CAPABILITY_COOKIE = "loop_console_capability";
|
|
4
5
|
/** Custom mutation confirmation header (design §9). JS-readable; not the HttpOnly boot cookie. */
|
|
5
6
|
export const CONFIRMATION_TOKEN_HEADER = "x-loop-console-confirmation";
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
function normalizeInstanceScope(scope) {
|
|
8
|
+
const repoFingerprint = scope.repoFingerprint.trim();
|
|
9
|
+
if (!repoFingerprint) {
|
|
10
|
+
throw new Error("console instance scope requires a non-empty repoFingerprint");
|
|
11
|
+
}
|
|
12
|
+
const bindHost = scope.bindHost.trim();
|
|
13
|
+
if (!bindHost) {
|
|
14
|
+
throw new Error("console instance scope requires a non-empty bindHost");
|
|
15
|
+
}
|
|
16
|
+
if (!Number.isInteger(scope.configuredPort) || scope.configuredPort < 0) {
|
|
17
|
+
throw new Error(`console instance scope configuredPort must be an integer >= 0, got ${String(scope.configuredPort)}`);
|
|
18
|
+
}
|
|
19
|
+
const instanceNonce = scope.instanceNonce?.trim();
|
|
20
|
+
if (scope.configuredPort === 0) {
|
|
21
|
+
if (!instanceNonce) {
|
|
22
|
+
throw new Error("console instance scope requires a non-empty instanceNonce when configuredPort is 0");
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
repoFingerprint,
|
|
26
|
+
bindHost,
|
|
27
|
+
configuredPort: 0,
|
|
28
|
+
instanceNonce,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
repoFingerprint,
|
|
33
|
+
bindHost,
|
|
34
|
+
configuredPort: scope.configuredPort,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Deterministic Cookie name for one Console instance; never includes repo path or token. */
|
|
38
|
+
export function deriveBootCapabilityCookieName(scope, variant) {
|
|
39
|
+
const normalized = normalizeInstanceScope(scope);
|
|
40
|
+
const digest = createHash("sha256")
|
|
41
|
+
.update("loop-console-capability-v1\0", "utf8")
|
|
42
|
+
.update(normalized.repoFingerprint, "utf8")
|
|
43
|
+
.update("\0", "utf8")
|
|
44
|
+
.update(normalized.bindHost, "utf8")
|
|
45
|
+
.update("\0", "utf8")
|
|
46
|
+
.update(String(normalized.configuredPort), "utf8")
|
|
47
|
+
.update("\0", "utf8")
|
|
48
|
+
.update(normalized.instanceNonce ?? "", "utf8")
|
|
49
|
+
.update("\0", "utf8")
|
|
50
|
+
.update(variant ?? "", "utf8")
|
|
51
|
+
.digest("hex")
|
|
52
|
+
.slice(0, 32);
|
|
53
|
+
return `${BOOT_CAPABILITY_COOKIE}_${digest}`;
|
|
54
|
+
}
|
|
55
|
+
/** Issue per-process unguessable boot capability + confirmation tokens.
|
|
56
|
+
* `variant` (e.g. "inspect") derives a separate cookie name so scoped
|
|
57
|
+
* credentials cannot be replayed against the general mutation surface. */
|
|
58
|
+
export function issueBootCapabilityToken(scope, options = {}) {
|
|
59
|
+
const cookieName = deriveBootCapabilityCookieName(scope, options.variant);
|
|
8
60
|
const value = randomBytes(32).toString("base64url");
|
|
9
61
|
const confirmationToken = randomBytes(32).toString("base64url");
|
|
10
62
|
const setCookieHeader = [
|
|
11
|
-
`${
|
|
63
|
+
`${cookieName}=${value}`,
|
|
12
64
|
"HttpOnly",
|
|
13
65
|
"SameSite=Strict",
|
|
14
66
|
"Path=/",
|
|
15
67
|
].join("; ");
|
|
16
|
-
return { value, setCookieHeader, confirmationToken };
|
|
68
|
+
return { cookieName, value, setCookieHeader, confirmationToken };
|
|
17
69
|
}
|
|
18
|
-
/** Inject confirmation token into HTML so the SPA can send the mutation
|
|
19
|
-
|
|
70
|
+
/** Inject confirmation token into HTML so the SPA can send the mutation
|
|
71
|
+
* header. `varName` separates the general Console token from the scoped
|
|
72
|
+
* inspect token on the read-only /inspect surface. */
|
|
73
|
+
export function injectConfirmationTokenScript(html, confirmationToken, varName = "__CONSOLE_CONFIRMATION_TOKEN__") {
|
|
20
74
|
const source = typeof html === "string" ? html : html.toString("utf8");
|
|
21
|
-
const script = `<script>window
|
|
75
|
+
const script = `<script>window.${varName}=${JSON.stringify(confirmationToken)};</script>`;
|
|
22
76
|
if (source.includes("</head>")) {
|
|
23
77
|
return Buffer.from(source.replace("</head>", `${script}</head>`), "utf8");
|
|
24
78
|
}
|
|
@@ -74,7 +128,7 @@ function loopbackOriginMatches(origin, consoleOrigin) {
|
|
|
74
128
|
return originKey !== null && consoleKey !== null && originKey === consoleKey;
|
|
75
129
|
}
|
|
76
130
|
export function evaluateMutationGate(req, ctx) {
|
|
77
|
-
const cookieToken = parseCookieHeader(req.headers.cookie,
|
|
131
|
+
const cookieToken = parseCookieHeader(req.headers.cookie, ctx.cookieName);
|
|
78
132
|
if (!cookieToken) {
|
|
79
133
|
return {
|
|
80
134
|
status: 403,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
2
3
|
import { existsSync } from "node:fs";
|
|
3
4
|
import { createServer } from "node:http";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
6
7
|
import { LoopAgentClient } from "../loop-agent/loop-agent-client.js";
|
|
8
|
+
import { readPackageVersion } from "../../shared/package-metadata.js";
|
|
7
9
|
import { DAG_ABSOLUTE_MAX_WALL_CLOCK_MS } from "../../shared/timeout-policy.js";
|
|
8
10
|
import { openConsoleAppData } from "./app-data.js";
|
|
9
11
|
import { DagConfirmationStore } from "./dag-confirmation.js";
|
|
@@ -16,16 +18,19 @@ import { ChatSessionStore } from "./chat/session-store.js";
|
|
|
16
18
|
import { createChatEventStore, createChatOperationLinker, } from "./chat/chat-event-store.js";
|
|
17
19
|
import { createChatTurnExecutionRegistry } from "./chat/turn-execution-registry.js";
|
|
18
20
|
import { ConsolePiRuntime } from "./chat/pi-runtime.js";
|
|
19
|
-
import { handleChatRequest } from "./chat/routes.js";
|
|
21
|
+
import { handleChatRequest, recoverDeferredTurns, } from "./chat/routes.js";
|
|
20
22
|
import { createOperationEventStore, } from "./operation-sse.js";
|
|
21
23
|
import { OperationStore } from "./operation-store.js";
|
|
22
24
|
import { probePiReadiness, } from "./pi-readiness.js";
|
|
23
25
|
import { handleConsoleHealthRequest, handleConsoleOperatorRequest, sendJson, serveConsoleStatic, } from "./routes.js";
|
|
24
|
-
import { issueBootCapabilityToken } from "./security.js";
|
|
25
|
-
import { resolveSiblingLoopAgentBin } from "./sibling-controller.js";
|
|
26
|
+
import { issueBootCapabilityToken, injectConfirmationTokenScript, } from "./security.js";
|
|
27
|
+
import { resolvePackageRootFromConsole, resolveSiblingLoopAgentBin, } from "./sibling-controller.js";
|
|
28
|
+
import { isDagRerunPromptOverrideEnabled } from "../../shared/dag-prompt-override.js";
|
|
26
29
|
import { NightAuxTicker } from "./night-aux-ticker.js";
|
|
27
30
|
import { deriveObserveRouteCapabilities } from "../observe/health.js";
|
|
28
31
|
import { createObserveRouteContext, defaultObserveStaticDir, handleMatchedObserveRoute, matchObserveGetRoute, ROUTES, serveObserveStatic, } from "../observe/routes.js";
|
|
32
|
+
import { createConsoleUpdateExecutor } from "./console-update-runtime.js";
|
|
33
|
+
import { createConsoleHandoff } from "./console-handoff.js";
|
|
29
34
|
/**
|
|
30
35
|
* Default hard timeout for the Console-owned LoopAgentClient.
|
|
31
36
|
*
|
|
@@ -66,7 +71,7 @@ export async function createConsoleServer(options) {
|
|
|
66
71
|
process.stderr.write(`console: binding non-loopback host ${host} (Operator mutations enabled; no network auth — expose only on trusted networks)\n`);
|
|
67
72
|
}
|
|
68
73
|
const repoRoot = path.resolve(options.repoRoot);
|
|
69
|
-
const
|
|
74
|
+
const configuredPort = options.port ?? 8790;
|
|
70
75
|
const debug = options.debug === true;
|
|
71
76
|
const keepAliveTimeoutMs = options.keepAliveTimeoutMs ?? 65_000;
|
|
72
77
|
const staticDir = options.staticDir ?? defaultConsoleStaticDir();
|
|
@@ -74,12 +79,28 @@ export async function createConsoleServer(options) {
|
|
|
74
79
|
const observeRouteContext = createObserveRouteContext(repoRoot, {
|
|
75
80
|
staticDir: inspectStaticDir,
|
|
76
81
|
});
|
|
77
|
-
const bootToken = issueBootCapabilityToken();
|
|
78
82
|
const operatorSessionId = `sess_${randomBytes(16).toString("hex")}`;
|
|
83
|
+
const consoleInstanceId = options.consoleInstanceId ?? `console_${randomBytes(16).toString("hex")}`;
|
|
79
84
|
const appData = openConsoleAppData({
|
|
80
85
|
repoRoot,
|
|
81
86
|
appDataRoot: options.appDataRoot,
|
|
82
87
|
});
|
|
88
|
+
const instanceNonce = configuredPort === 0 ? randomBytes(16).toString("hex") : undefined;
|
|
89
|
+
const bootToken = issueBootCapabilityToken({
|
|
90
|
+
repoFingerprint: appData.fingerprint,
|
|
91
|
+
bindHost: host,
|
|
92
|
+
configuredPort,
|
|
93
|
+
...(instanceNonce ? { instanceNonce } : {}),
|
|
94
|
+
});
|
|
95
|
+
// Scoped credentials for the experimental /inspect prompt-override rerun:
|
|
96
|
+
// separate cookie name + confirmation token so the read-only inspect page
|
|
97
|
+
// can never replay them against the general Console mutation surface.
|
|
98
|
+
const inspectBootToken = issueBootCapabilityToken({
|
|
99
|
+
repoFingerprint: appData.fingerprint,
|
|
100
|
+
bindHost: host,
|
|
101
|
+
configuredPort,
|
|
102
|
+
...(instanceNonce ? { instanceNonce } : {}),
|
|
103
|
+
}, { variant: "inspect" });
|
|
83
104
|
const operations = new OperationStore(appData);
|
|
84
105
|
const events = createOperationEventStore({
|
|
85
106
|
persistenceDir: path.join(appData.operations, "events"),
|
|
@@ -134,10 +155,11 @@ export async function createConsoleServer(options) {
|
|
|
134
155
|
refreshReadiness,
|
|
135
156
|
observeBaseUrl: options.observeBaseUrl,
|
|
136
157
|
fetchImpl: options.fetchImpl,
|
|
158
|
+
consoleUpdateExecutor: options.consoleUpdateExecutor,
|
|
137
159
|
getConsoleOrigin: () => `http://${boundHost}:${boundPort}`,
|
|
138
160
|
};
|
|
139
161
|
let boundHost = host;
|
|
140
|
-
let boundPort =
|
|
162
|
+
let boundPort = configuredPort;
|
|
141
163
|
const getConsoleOrigin = () => `http://${boundHost}:${boundPort}`;
|
|
142
164
|
// Phase 4: General Operator Chat runtime. The actionContext is forwarded so
|
|
143
165
|
// custom-tool execute() calls dispatch into the operator action layer (Gate 3).
|
|
@@ -149,6 +171,68 @@ export async function createConsoleServer(options) {
|
|
|
149
171
|
const chatEventEpoch = randomBytes(12).toString("hex");
|
|
150
172
|
const chatEvents = createChatEventStore({ appData, epoch: chatEventEpoch });
|
|
151
173
|
const chatTurnExecutions = createChatTurnExecutionRegistry();
|
|
174
|
+
const requestConsoleHandoff = async (targetVersion) => {
|
|
175
|
+
// The maintenance preflight proves this running Console was loaded from
|
|
176
|
+
// the global package. npm replaces that package in place, so resolve the
|
|
177
|
+
// replacement worker from that same package root rather than trusting the
|
|
178
|
+
// ambient PATH (which could point at another installation).
|
|
179
|
+
const packageRoot = resolvePackageRootFromConsole();
|
|
180
|
+
const agentWorkerBin = path.join(packageRoot, "bin", "agent-worker.js");
|
|
181
|
+
if (readPackageVersion(packageRoot) !== targetVersion ||
|
|
182
|
+
!existsSync(agentWorkerBin)) {
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
message: "verified global package no longer contains the target Console worker",
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const { handoff, env } = createConsoleHandoff({
|
|
189
|
+
oldPid: process.pid,
|
|
190
|
+
repoRoot,
|
|
191
|
+
host: boundHost,
|
|
192
|
+
port: boundPort,
|
|
193
|
+
...(options.appDataRoot ? { appDataRoot: options.appDataRoot } : {}),
|
|
194
|
+
targetVersion,
|
|
195
|
+
});
|
|
196
|
+
try {
|
|
197
|
+
const child = spawn(process.execPath, [
|
|
198
|
+
agentWorkerBin,
|
|
199
|
+
"console",
|
|
200
|
+
"--repo",
|
|
201
|
+
repoRoot,
|
|
202
|
+
"--host",
|
|
203
|
+
boundHost,
|
|
204
|
+
"--port",
|
|
205
|
+
String(boundPort),
|
|
206
|
+
...(options.appDataRoot
|
|
207
|
+
? ["--app-data", options.appDataRoot]
|
|
208
|
+
: []),
|
|
209
|
+
"--no-open",
|
|
210
|
+
], { detached: true, stdio: "ignore", env: { ...process.env, ...env } });
|
|
211
|
+
await new Promise((resolve, reject) => {
|
|
212
|
+
child.once("spawn", resolve);
|
|
213
|
+
child.once("error", reject);
|
|
214
|
+
});
|
|
215
|
+
child.unref();
|
|
216
|
+
setTimeout(() => process.kill(process.pid, "SIGTERM"), 100).unref();
|
|
217
|
+
return { ok: true, consoleInstanceId: handoff.consoleInstanceId };
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return {
|
|
221
|
+
ok: false,
|
|
222
|
+
message: error instanceof Error ? error.message : String(error),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
actionContext.consoleUpdateExecutor =
|
|
227
|
+
options.consoleUpdateExecutor ??
|
|
228
|
+
createConsoleUpdateExecutor({
|
|
229
|
+
repoRoot,
|
|
230
|
+
packageRoot: resolvePackageRootFromConsole(),
|
|
231
|
+
client,
|
|
232
|
+
operations,
|
|
233
|
+
activeChatTurnCount: () => chatTurnExecutions.size(),
|
|
234
|
+
requestHandoff: requestConsoleHandoff,
|
|
235
|
+
});
|
|
152
236
|
const chatOperationLinker = createChatOperationLinker({
|
|
153
237
|
chatEvents,
|
|
154
238
|
operations,
|
|
@@ -175,6 +259,11 @@ export async function createConsoleServer(options) {
|
|
|
175
259
|
getConsoleOrigin,
|
|
176
260
|
allowNonLoopbackAccess: !loopbackBind,
|
|
177
261
|
};
|
|
262
|
+
// Durable single-slot follow-ups are server-owned. Recover them at boot even
|
|
263
|
+
// when no browser currently has the Session open.
|
|
264
|
+
void recoverDeferredTurns(chatRouteDeps).catch((error) => {
|
|
265
|
+
console.error(`[console] deferred Turn recovery failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
266
|
+
});
|
|
178
267
|
const nightAuxTicker = new NightAuxTicker({
|
|
179
268
|
repoRoot,
|
|
180
269
|
client,
|
|
@@ -183,12 +272,14 @@ export async function createConsoleServer(options) {
|
|
|
183
272
|
repoRoot,
|
|
184
273
|
staticDir,
|
|
185
274
|
bootToken,
|
|
275
|
+
inspectBootToken,
|
|
186
276
|
getConsoleOrigin,
|
|
187
277
|
allowNonLoopbackAccess: !loopbackBind,
|
|
188
278
|
inspect: {
|
|
189
279
|
ready: existsSync(path.join(inspectStaticDir, "index.html")),
|
|
190
280
|
routeCapabilities: deriveObserveRouteCapabilities(ROUTES),
|
|
191
281
|
},
|
|
282
|
+
consoleInstanceId,
|
|
192
283
|
operator: {
|
|
193
284
|
actionContext,
|
|
194
285
|
operations,
|
|
@@ -272,8 +363,21 @@ export async function createConsoleServer(options) {
|
|
|
272
363
|
}
|
|
273
364
|
}
|
|
274
365
|
if (pathname.startsWith("/inspect")) {
|
|
366
|
+
// Prompt-override rerun is enabled by default. Unless the emergency
|
|
367
|
+
// kill switch disables it, hand the inspect page SCOPED mutation
|
|
368
|
+
// credentials (separate cookie + token, only strong enough for
|
|
369
|
+
// INSPECT_MUTATION_ALLOWED_ACTIONS — see routes.ts).
|
|
370
|
+
const htmlEnhancer = isDagRerunPromptOverrideEnabled()
|
|
371
|
+
? (html) => ({
|
|
372
|
+
content: injectConfirmationTokenScript(html, routeContext.inspectBootToken?.confirmationToken ??
|
|
373
|
+
routeContext.bootToken.confirmationToken, "__INSPECT_MUTATION_TOKEN__"),
|
|
374
|
+
setCookie: routeContext.inspectBootToken?.setCookieHeader ??
|
|
375
|
+
routeContext.bootToken.setCookieHeader,
|
|
376
|
+
})
|
|
377
|
+
: undefined;
|
|
275
378
|
await serveObserveStatic(req, res, inspectStaticDir, {
|
|
276
379
|
urlPrefix: "/inspect",
|
|
380
|
+
...(htmlEnhancer ? { htmlEnhancer } : {}),
|
|
277
381
|
});
|
|
278
382
|
return;
|
|
279
383
|
}
|
|
@@ -284,7 +388,7 @@ export async function createConsoleServer(options) {
|
|
|
284
388
|
await serveConsoleStatic(req, res, routeContext);
|
|
285
389
|
}
|
|
286
390
|
server.on("error", reject);
|
|
287
|
-
server.listen(
|
|
391
|
+
server.listen(configuredPort, host, () => {
|
|
288
392
|
const addr = server.address();
|
|
289
393
|
if (!addr || typeof addr === "string") {
|
|
290
394
|
reject(new Error("Failed to get console server address"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-BhrPXXMZ.js";import{p as f}from"./chunk-JWPE2WC7-VVthn_mD.js";import{_ as n,l as o}from"./mermaid.core-Biyo-tqA.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-wh5N2ReN.js";import"./index-CW88Fjbw.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-
|
|
1
|
+
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-Biyo-tqA.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|