@tea-agent/loop-agent 0.40.0-next.9 → 0.41.0-beta.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 +1 -1
- package/CHANGELOG.md +130 -3
- package/README.md +2 -2
- package/dist/adapters/context-transfer/optional-pi-handoff.js +31 -0
- package/dist/adapters/context-transfer/pi-session.js +61 -0
- package/dist/application/dag/generate-task-dag.js +6 -2
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +21 -5
- package/dist/cli/program.js +61 -4
- package/dist/commands/client-recovery.js +8 -36
- package/dist/commands/dag-artifact.js +284 -0
- package/dist/commands/dag-context.js +184 -0
- package/dist/commands/dag-rerun.js +206 -1
- package/dist/commands/init-model-catalog.js +22 -0
- package/dist/commands/task-advance.js +23 -1
- package/dist/commands/task-source-prepare.js +5 -0
- package/dist/commands/task-status.js +1 -0
- package/dist/executors/dag-pi-executor.js +39 -12
- package/dist/executors/pi-sdk-executor.js +36 -5
- package/dist/executors/shell-executor.js +64 -17
- package/dist/governance/checks.js +1 -0
- package/dist/{worker → infrastructure}/console/app-data.js +4 -0
- package/dist/infrastructure/console/artifact-revision-store.js +430 -0
- package/dist/infrastructure/console/context-export-store.js +160 -0
- package/dist/infrastructure/console/dir-lock.js +132 -0
- package/dist/{worker → infrastructure}/console/operation-store.js +28 -0
- package/dist/infrastructure/harness/artifact-store.js +10 -1
- package/dist/infrastructure/harness/atomic-write.js +12 -2
- package/dist/shared/context-transfer/artifact-revision.js +172 -0
- package/dist/shared/context-transfer.js +418 -0
- package/dist/shared/operator/capabilities.js +23 -1
- package/dist/shared/operator/safe-run-summary.js +1 -0
- package/dist/shared/path-safety.js +93 -0
- package/dist/shared/pi-context-pressure/checkpoint.js +116 -0
- package/dist/shared/pi-context-pressure/compaction-policy.js +151 -0
- package/dist/shared/pi-context-pressure/env.js +58 -0
- package/dist/shared/pi-context-pressure/extension.js +100 -0
- package/dist/shared/pi-context-pressure/index.js +7 -0
- package/dist/shared/pi-context-pressure/overflow.js +252 -0
- package/dist/shared/pi-context-pressure/sift-bridge.js +386 -0
- package/dist/shared/pi-context-pressure/telemetry.js +51 -0
- package/dist/shared/preview.js +28 -4
- package/dist/task/config-types.js +2 -1
- package/dist/task/task-demand-routing.js +3 -0
- package/dist/worker/console/chat/assistant-content.js +7 -0
- package/dist/worker/console/chat/chat-event-store.js +84 -13
- package/dist/worker/console/chat/goal-round-driver.js +72 -0
- package/dist/worker/console/chat/goals.js +300 -0
- package/dist/worker/console/chat/pi-runtime.js +285 -8
- package/dist/worker/console/chat/provider-error.js +2 -1
- package/dist/worker/console/chat/repo-browser.js +94 -12
- package/dist/worker/console/chat/resource-preferences-store.js +1 -1
- package/dist/worker/console/chat/routes.js +487 -30
- package/dist/worker/console/chat/session-catalog.js +48 -0
- package/dist/worker/console/chat/session-stats.js +96 -0
- package/dist/worker/console/chat/session-store.js +28 -19
- package/dist/worker/console/chat/shortcuts.js +7 -0
- package/dist/worker/console/chat/sift-bridge.js +1 -0
- package/dist/worker/console/chat/turn-process.js +32 -3
- package/dist/worker/console/chat/user-questions.js +1 -1
- package/dist/worker/console/console-update-runtime.js +1 -1
- package/dist/worker/console/context-transfer-diagnostics.js +198 -0
- package/dist/worker/console/dag-confirmation.js +1 -1
- package/dist/worker/console/dag-execution-receipt.js +21 -3
- package/dist/worker/console/doctor.js +1 -1
- package/dist/worker/console/draft-store.js +1 -1
- package/dist/worker/console/human-gate-token.js +1 -1
- package/dist/worker/console/index.js +3 -3
- package/dist/worker/console/interview/assessment.js +1 -1
- package/dist/worker/console/interview/session.js +1 -1
- package/dist/worker/console/operation-runner.js +45 -4
- package/dist/worker/console/operation-sse.js +1 -1
- package/dist/worker/console/operation-wait.js +1 -1
- package/dist/worker/console/operator-actions.js +124 -8
- package/dist/worker/console/operator-selection.js +6 -2
- package/dist/worker/console/operator-surface-health.js +1 -1
- package/dist/worker/console/operator-user-error.js +169 -0
- package/dist/worker/console/pi-plugins.catalog.json +73658 -0
- package/dist/worker/console/pi-plugins.js +179 -0
- package/dist/worker/console/routes.js +864 -13
- package/dist/worker/console/security.js +35 -0
- package/dist/worker/console/server.js +177 -44
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Bs-CDAXM.js → abnfDiagram-N423BO3Z-DSVcg1YO.js} +1 -1
- package/dist/worker/console/static/assets/{arc-CAkA3We3.js → arc-BtXhIqui.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-DEmI_zqr.js → architectureDiagram-T3A2C74G-B-nh-ilJ.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-uDHANebE.js → blockDiagram-VBNYF7ZC-BIUSVdZI.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-Bv97b4_B.js → c4Diagram-5PPSVZJV-Cmw3L4qM.js} +1 -1
- package/dist/worker/console/static/assets/channel-BhZFNefx.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-shmQKsFz.js → chunk-2GRJ4B5K-CGpMMjGm.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-BAraNvcN.js → chunk-2Q5K7J3B-BNBkEpEJ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BirhxUop.js → chunk-5RXB4S5H-ubln3eaU.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-C9LgUJpR.js → chunk-5VM5RSS4-_XcBTt1i.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DrU-s-t7.js → chunk-6Q2QTUOP-Ln30Pgrh.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-Tx-H_FA2.js → chunk-GF5L2VYU-ESH3lhSx.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BjLtNFrR.js → chunk-JWPE2WC7-DAJt-qXB.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-UNLVwSsy.js → chunk-KBJHAD2P-Cx10LIcH.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-CBEUX8XD.js → chunk-RYQCIY6F-CENeOxoJ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-WTL7IZOq.js → chunk-XXDRQBXY-DXqK-D38.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Sbv-NJni.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Sbv-NJni.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CkHG6W3s.js → cose-bilkent-JH36ORCC-CE4dmvGY.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BRzFqTaL.js → cynefin-VYW2F7L2-CRacN1zK.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-2_CFp_i7.js → cynefinDiagram-MW4NZA55-Cneukjrt.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BJtsmdkE.js → dagre-VZM6K2ZE-DPFboRoL.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-DNEFFo6w.js → diagram-7IWD3JNH-DIAQgcOP.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-B_IWV7eo.js → diagram-B4RE2ZJO-VrYMKxuy.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DvvRx2dz.js → diagram-LBJQPF4R-CLHvBghn.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-CsibsWLg.js → diagram-Q27KOJAE-DVCWBif8.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-les_djBQ.js → diagram-UB23O5K3-BTMmbBzJ.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BEm2n7qJ.js → ebnfDiagram-BXEA7PRR-BUZsKJ56.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-BI7vHHVm.js → erDiagram-JOGREHBK-BsBZ5NXC.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CUFCERrB.js → flowDiagram-UKHOOZJN-D7fH_kDa.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-wxyLiGWt.js → ganttDiagram-PKOTCBZU-Bza5OohY.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Bt897K8Z.js → gitGraphDiagram-DS77QQ5N-DpkoGR_Y.js} +1 -1
- package/dist/worker/console/static/assets/index-Ius3vxhf.css +1 -0
- package/dist/worker/console/static/assets/index-yASzcbBr.js +451 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DYNx_IPv.js → infoDiagram-6WML65LV-BYm3g6LT.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-CzpLNEu6.js → ishikawaDiagram-WSZJBQD7-C2RS_H4v.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-97f9owNU.js → journeyDiagram-NVQOT4AX-B4slKpCo.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BxM9hyBn.js → kanban-definition-27J2QSJJ-B7orRNpI.js} +1 -1
- package/dist/worker/console/static/assets/{linear-ByuxcHvp.js → linear-D1BeBxLQ.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-DwPGvpCv.js → mermaid.core-0TtMP8k4.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-DCoqG9RT.js → mindmap-definition-FAOFIHXS-XL5EbCtT.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BLSBmBMx.js → pegDiagram-VL7TDLO6-CwF7uas5.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-B0t_0oJW.js → pieDiagram-7S7Q4E2Y-A_Jo-72f.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-sTzDk7Nt.js → quadrantDiagram-CIZ2JOQS-CxOa4gKL.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-B3jRdATC.js → railroadDiagram-AXF67PYL-DoAoswIH.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-D-cTtXEN.js → requirementDiagram-LRYGKXZP-C1Lc1MlD.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-B25igJRE.js → sankeyDiagram-W5VNT64P-DFXOkq0U.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-jW_lM1_D.js → sequenceDiagram-SI44F4Z6-B0ufUCuW.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CrzTgsHE.js → sizeCapture-X5ZJPWSS-iPbW55g3.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-B01MvlqE.js → stateDiagram-OKZ733FA-CHiXzEKP.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BtMgzo_H.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-YcF12FiU.js → swimlanes-SLNWSIFB-LyFs7TpX.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Cb-OVd9Y.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-ClnRcg2s.js → timeline-definition-Z64GVDOM-tNkJnb6z.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-B6gr_z-q.js → vennDiagram-T6HMQDX7-DFm7Oo8o.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-CvSgguGH.js → wardleyDiagram-T6FBY63Y-tpblTp9i.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-23OtSZCb.js → xychartDiagram-ELKLHX3M-BCDLWR_D.js} +1 -1
- package/dist/worker/console/static/index.html +7 -2
- package/dist/worker/console/static-src/app/useOperatorActions.js +3 -2
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +95 -25
- package/dist/worker/console/static-src/operator-chat/compaction-message.js +35 -1
- package/dist/worker/console/static-src/operator-chat/open-preview-in-browser.js +3 -1
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +26 -19
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +0 -11
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +14 -1
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +34 -4
- package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +28 -3
- package/dist/worker/console/static-src/operator-chat/workspace-reorder.js +18 -0
- package/dist/worker/console/static-src/shell/console-update-reload.js +25 -0
- package/dist/worker/console/static-src/shell/useWorkspaces.js +150 -34
- package/dist/worker/console/static-src/shell/workspace-route.js +3 -1
- package/dist/worker/console/workspace-context.js +56 -5
- package/dist/worker/console/workspace-registry.js +335 -62
- package/dist/worker/continuation/worker-continuation.js +278 -0
- package/dist/worker/observe/health.js +1 -1
- package/dist/worker/observe/node-transparency.js +572 -0
- package/dist/worker/observe/routes.js +51 -1
- package/dist/worker/observe/static/api.js +69 -5
- package/dist/worker/observe/static/dag-context-reason-labels.d.ts +9 -0
- package/dist/worker/observe/static/dag-context-reason-labels.js +120 -0
- package/dist/worker/observe/static/inspect-bootstrap.d.ts +8 -0
- package/dist/worker/observe/static/inspect-bootstrap.js +57 -0
- package/dist/worker/observe/static/inspect-workspace.js +54 -10
- package/dist/worker/observe/static/operator-chrome.css +23 -4
- package/dist/worker/observe/static/operator-chrome.js +7 -2
- package/dist/worker/observe/static/state.js +3 -1
- package/dist/worker/observe/static/styles.css +1108 -135
- package/dist/worker/observe/static/views/dag-inspector.js +1257 -59
- package/dist/worker/observe/static/views/dags.js +7 -5
- package/dist/worker/observe/static/views/session-timeline.js +210 -10
- package/dist/worker/outcomes/adapters.js +19 -0
- package/dist/worker/outcomes/types.js +1 -0
- package/dist/worker/pool/attempt-lease.js +97 -66
- package/dist/worker/pool/begin-attempt-with-lease.js +1 -0
- package/dist/worker/pool/reconcile.js +46 -1
- package/dist/worker/pool/run-store.js +2 -0
- package/dist/worker/pool/state-projection.js +2 -0
- package/dist/worker/task-spec/workflow-routing.js +8 -3
- package/dist/workflows/dag/artifact-bindings.js +149 -0
- package/dist/workflows/dag/artifact-revision-schema-registry.js +31 -0
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +162 -8
- package/dist/workflows/dag/backend-test-pytest-collection.js +70 -2
- package/dist/workflows/dag/backend-test-result-contract.js +4 -0
- package/dist/workflows/dag/backend-test-scenario-param.js +339 -53
- package/dist/workflows/dag/backend-test-writer-completeness.js +11 -0
- package/dist/workflows/dag/budget-enforcement.js +10 -0
- package/dist/workflows/dag/context-receipt.js +305 -0
- package/dist/workflows/dag/context-transfer/context-bundle.js +423 -0
- package/dist/workflows/dag/context-transfer/operator-actions.js +61 -0
- package/dist/workflows/dag/context-transfer/renderers.js +93 -0
- package/dist/workflows/dag/frontend-writer-rollback.js +32 -0
- package/dist/workflows/dag/init-hybrid.js +151 -4
- package/dist/workflows/dag/node-execution.js +112 -27
- package/dist/workflows/dag/path-safety.js +1 -0
- package/dist/workflows/dag/prompt.js +29 -4
- package/dist/workflows/dag/rerun-plan.js +555 -1
- package/dist/workflows/dag/rerun-run.js +601 -15
- package/dist/workflows/dag/runner.js +20 -1
- package/dist/workflows/dag/skill-snapshot.js +17 -0
- package/dist/workflows/dag/types.js +183 -7
- package/docs/architecture/runtime-boundaries.md +8 -7
- package/docs/architecture/worker-and-feature.md +1 -1
- package/docs/templates/agent-dag.schema.json +32 -0
- package/docs/templates/backend-test-dag.json +6 -5
- package/docs/templates/init-managed-agents.md +1 -1
- package/docs/templates/product-line/task.yaml +1 -1
- package/package.json +5 -2
- package/skills/loop-agent/references/command-reference.md +21 -1
- package/dist/worker/console/static/assets/channel-amxUpk7o.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-bejwBVIz.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-bejwBVIz.js +0 -1
- package/dist/worker/console/static/assets/index-BHhUOTri.css +0 -1
- package/dist/worker/console/static/assets/index-DqJbO3-p.js +0 -407
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BvFKEtm2.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DIB2eVg-.js +0 -8
- /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
|
@@ -84,6 +84,29 @@ export async function fetchDagNodeInput(runId, nodeId) {
|
|
|
84
84
|
return fetchJsonResult(url);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
export async function fetchDagNodeContext(runId, nodeId, attempt) {
|
|
88
|
+
const params = new URLSearchParams();
|
|
89
|
+
if (attempt != null) params.set("attempt", String(attempt));
|
|
90
|
+
const query = params.toString();
|
|
91
|
+
const url = `/api/dag-runs/${encodeURIComponent(runId)}/nodes/${encodeURIComponent(nodeId)}/context${query ? `?${query}` : ""}`;
|
|
92
|
+
return fetchJsonResult(url);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function fetchDagNodeArtifacts(runId, nodeId) {
|
|
96
|
+
const url = `/api/dag-runs/${encodeURIComponent(runId)}/nodes/${encodeURIComponent(nodeId)}/artifacts`;
|
|
97
|
+
return fetchJsonResult(url);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export async function fetchDagNodeArtifactPreview(runId, nodeId, artifactId) {
|
|
101
|
+
const params = new URLSearchParams({ artifactId: String(artifactId ?? "") });
|
|
102
|
+
const url = `/api/dag-runs/${encodeURIComponent(runId)}/nodes/${encodeURIComponent(nodeId)}/artifacts/preview?${params.toString()}`;
|
|
103
|
+
return fetchJsonResult(url);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export async function fetchDagRunLineage(runId) {
|
|
107
|
+
return fetchJsonResult(`/api/dag-runs/${encodeURIComponent(runId)}/lineage`);
|
|
108
|
+
}
|
|
109
|
+
|
|
87
110
|
export async function fetchDagNodeProcess(runId, nodeId, key) {
|
|
88
111
|
const params = new URLSearchParams();
|
|
89
112
|
if (key) params.set("key", String(key));
|
|
@@ -123,18 +146,28 @@ export function artifactUrl(artifactPath) {
|
|
|
123
146
|
* Experimental (prompt-override rerun only): POST one allowlisted operator
|
|
124
147
|
* action through the Console mutation gate using the SCOPED inspect token
|
|
125
148
|
* (window.__INSPECT_MUTATION_TOKEN__). The server injects it into /inspect
|
|
126
|
-
* HTML
|
|
127
|
-
*
|
|
149
|
+
* HTML and into the Console SPA (which hosts the /inspect workspace) by
|
|
150
|
+
* default; HARNESS_DAG_RERUN_PROMPT_OVERRIDE=0|false|off disables injection.
|
|
151
|
+
* The token only authorizes dagRerunPlan / dagRerun — never general
|
|
128
152
|
* Console mutations.
|
|
129
153
|
* Absent token → the call is not attempted.
|
|
130
154
|
*/
|
|
131
|
-
export async function postOperatorAction(
|
|
155
|
+
export async function postOperatorAction(
|
|
156
|
+
action,
|
|
157
|
+
actionParams = {},
|
|
158
|
+
clientRequestId,
|
|
159
|
+
) {
|
|
132
160
|
const token = globalThis.__INSPECT_MUTATION_TOKEN__;
|
|
133
161
|
if (!token) {
|
|
134
162
|
return {
|
|
135
163
|
ok: false,
|
|
136
164
|
status: 0,
|
|
137
|
-
body: {
|
|
165
|
+
body: {
|
|
166
|
+
error: {
|
|
167
|
+
code: "PROMPT_OVERRIDE_DISABLED",
|
|
168
|
+
message: "提示词重启未启用(服务端未注入确认 token)",
|
|
169
|
+
},
|
|
170
|
+
},
|
|
138
171
|
};
|
|
139
172
|
}
|
|
140
173
|
const workspaceId = workspaceScope();
|
|
@@ -158,7 +191,12 @@ export async function postOperatorAction(action, actionParams = {}) {
|
|
|
158
191
|
"Content-Type": "application/json",
|
|
159
192
|
"x-loop-console-confirmation": token,
|
|
160
193
|
},
|
|
161
|
-
body: JSON.stringify({
|
|
194
|
+
body: JSON.stringify({
|
|
195
|
+
workspaceId,
|
|
196
|
+
action,
|
|
197
|
+
actionParams,
|
|
198
|
+
clientRequestId,
|
|
199
|
+
}),
|
|
162
200
|
});
|
|
163
201
|
let body = null;
|
|
164
202
|
try {
|
|
@@ -172,6 +210,32 @@ export async function postOperatorAction(action, actionParams = {}) {
|
|
|
172
210
|
}
|
|
173
211
|
}
|
|
174
212
|
|
|
213
|
+
export async function downloadContextExport(downloadUrl) {
|
|
214
|
+
const token = globalThis.__INSPECT_MUTATION_TOKEN__;
|
|
215
|
+
if (!token) throw new Error("导出下载能力未启用");
|
|
216
|
+
const res = await fetchWithWorkspaceScope(downloadUrl, {
|
|
217
|
+
method: "GET",
|
|
218
|
+
credentials: "same-origin",
|
|
219
|
+
headers: { "x-loop-console-confirmation": token },
|
|
220
|
+
});
|
|
221
|
+
if (!res.ok) {
|
|
222
|
+
let message = `下载失败:HTTP ${res.status}`;
|
|
223
|
+
try {
|
|
224
|
+
const body = await res.json();
|
|
225
|
+
message = body?.error?.message ?? message;
|
|
226
|
+
} catch {
|
|
227
|
+
// Preserve bounded local fallback copy.
|
|
228
|
+
}
|
|
229
|
+
throw new Error(message);
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
blob: await res.blob(),
|
|
233
|
+
filename:
|
|
234
|
+
/filename="([^"]+)"/.exec(res.headers.get("content-disposition") ?? "")?.[1] ??
|
|
235
|
+
"context-bundle.zip",
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
175
239
|
/** Poll a Console operation snapshot (read-only GET). */
|
|
176
240
|
export async function fetchOperatorOperation(operationId) {
|
|
177
241
|
try {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function contextTransferReasonLabel(
|
|
2
|
+
reasonCode: string | null | undefined,
|
|
3
|
+
): string | null;
|
|
4
|
+
export function formatContextTransferReasonList(
|
|
5
|
+
reasonCodes: readonly (string | null | undefined)[] | null | undefined,
|
|
6
|
+
): string | null;
|
|
7
|
+
export function describeTransferError(
|
|
8
|
+
message: string | null | undefined,
|
|
9
|
+
): string | null;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context transfer / artifact revision 稳定 reason code 的操作者文案映射
|
|
3
|
+
* (Observe UI,exec-plan 2026-08-25-console-node-context-artifact-rerun W1.5)。
|
|
4
|
+
*
|
|
5
|
+
* 表驱动纯函数:已知 code 映射为中文业务术语,未知 code fail-closed 返回
|
|
6
|
+
* null(调用方保留原始 token 展示,不猜测、不解释为成功)。
|
|
7
|
+
* 冻结 code 清单见 src/shared/context-transfer.ts CONTEXT_TRANSFER_REASON_CODES;
|
|
8
|
+
* 附加条目为 Console operation / rerun 执行面会透传到 Inspector 的错误码。
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const CONTEXT_TRANSFER_REASON_LABELS = {
|
|
12
|
+
CONTEXT_RECEIPT_MISSING: "该节点没有执行时上下文回执",
|
|
13
|
+
CONTEXT_COMPONENT_UNAVAILABLE: "部分上下文组件当前不可用",
|
|
14
|
+
CONTEXT_BUNDLE_INEXACT: "导出等级为近似恢复,不是精确重放",
|
|
15
|
+
CONTEXT_BUNDLE_TOO_LARGE: "导出内容超出体积上限",
|
|
16
|
+
RAW_EXPORT_ACKNOWLEDGEMENT_REQUIRED: "原文导出需要显式确认敏感数据风险",
|
|
17
|
+
SECRET_SCAN_CONFIRMATION_REQUIRED: "候选文件疑似包含凭据,需确认后才能继续",
|
|
18
|
+
ARTIFACT_BINDING_UNAVAILABLE: "缺少结构化产物关系",
|
|
19
|
+
ARTIFACT_NOT_REVISION_ELIGIBLE: "该产物不允许修订替换",
|
|
20
|
+
ARTIFACT_IDENTITY_AMBIGUOUS: "产物身份不唯一,无法安全定位",
|
|
21
|
+
ARTIFACT_REVISION_SCHEMA_INVALID: "候选文件不符合声明的数据结构",
|
|
22
|
+
ARTIFACT_REVISION_PATH_INVALID: "候选目标路径无效",
|
|
23
|
+
ARTIFACT_REVISION_EXPIRED: "修订候选已过期,需要重新上传",
|
|
24
|
+
ARTIFACT_REVISION_DRIFT: "候选文件与登记内容不一致",
|
|
25
|
+
ARTIFACT_REVISION_QUOTA_EXCEEDED: "修订暂存区配额已满,请先清理或等待过期回收",
|
|
26
|
+
ARTIFACT_CONSUMER_UNKNOWN: "无法确定受影响的下游节点",
|
|
27
|
+
ARTIFACT_IMPACT_UNSAFE: "影响范围包含不能自动重跑的节点",
|
|
28
|
+
RERUN_PLAN_DRIFT: "继续运行计划与当前事实发生漂移",
|
|
29
|
+
WORKER_MANAGED_CONTINUATION_UNSUPPORTED: "由 Worker 托管的运行暂不支持派生继续",
|
|
30
|
+
WORKER_CONTINUATION_AUTHORITY_MISMATCH: "Worker 派生运行的归属事实不一致",
|
|
31
|
+
WORKER_CONTINUATION_NEEDS_RECONCILE: "Worker 派生运行已存在,需要先恢复核对",
|
|
32
|
+
WORKER_CONTINUATION_LEASE_CONFLICT: "该 Worker Task 已有运行占用",
|
|
33
|
+
INELIGIBLE: "当前不满足继续运行的条件",
|
|
34
|
+
PARENT_IMMUTABILITY_VIOLATION: "父运行事实发生变化,已阻止派生",
|
|
35
|
+
PARENT_LIFECYCLE: "父运行状态不允许派生继续",
|
|
36
|
+
PLAN_DRIFT: "计划与执行前校验不一致",
|
|
37
|
+
REQUEST_ID_REUSE_CONFLICT: "相同请求 ID 已被其他操作占用",
|
|
38
|
+
OPERATION_NEEDS_RECONCILE: "操作记录需要先恢复核对",
|
|
39
|
+
CONTEXT_EXPORT_FAILED: "上下文导出失败",
|
|
40
|
+
CONTEXT_EXPORT_UNAVAILABLE: "导出内容不存在或已过期",
|
|
41
|
+
LEASE_HELD: "资源正被其他操作占用",
|
|
42
|
+
NOT_FOUND: "目标不存在或已过期",
|
|
43
|
+
// Console operation 面会透传的通用错误码。
|
|
44
|
+
INVALID_INPUT: "请求参数不完整或不合法",
|
|
45
|
+
INTERNAL_ERROR: "内部错误,请重试;若持续失败请查看操作诊断",
|
|
46
|
+
OPERATION_NOT_FOUND: "操作不存在或已被清理",
|
|
47
|
+
OPERATION_NOT_TERMINAL: "操作尚未结束,请稍后查询",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// 非 reason-code 形态、但会透传到检查器状态行的运行时错误 → 中文语义。
|
|
51
|
+
const RUNTIME_ERROR_PATTERNS = [
|
|
52
|
+
{
|
|
53
|
+
pattern: /controller identity changed|package fingerprint changed/i,
|
|
54
|
+
copy:
|
|
55
|
+
"控制器版本已变更:Console 启动后代码被重新构建。请重启 Console 进程加载当前构建后重试本操作。",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
pattern:
|
|
59
|
+
/invalid (?:confirmation header |boot capability )?token|mutation requires (?:boot capability cookie|confirmation header token)/i,
|
|
60
|
+
copy:
|
|
61
|
+
"页面凭证已失效(Console 可能已重启,或页面是重启前的旧缓存)。请强制刷新页面(Cmd/Ctrl+Shift+R)后重试。",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
pattern: /context receipt missing/i,
|
|
65
|
+
copy: "该节点没有执行时上下文回执,无法生成交接包。",
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 已知 reason code → 中文业务术语;未知或缺失返回 null(调用方应原样展示
|
|
71
|
+
* 原始 token,保持诚实降级)。
|
|
72
|
+
*/
|
|
73
|
+
export function contextTransferReasonLabel(reasonCode) {
|
|
74
|
+
const key = String(reasonCode ?? "");
|
|
75
|
+
if (!key) return null;
|
|
76
|
+
return CONTEXT_TRANSFER_REASON_LABELS[key] ?? null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* reason code 列表 → 面向操作者的展示串:已知项输出「中文(CODE)」,
|
|
81
|
+
* 未知项原样保留;空输入返回 null 供调用方守卫。
|
|
82
|
+
*/
|
|
83
|
+
export function formatContextTransferReasonList(reasonCodes) {
|
|
84
|
+
const codes = (Array.isArray(reasonCodes) ? reasonCodes : [])
|
|
85
|
+
.map((code) => String(code ?? ""))
|
|
86
|
+
.filter((code) => code.length > 0);
|
|
87
|
+
if (codes.length === 0) return null;
|
|
88
|
+
return codes
|
|
89
|
+
.map((code) => {
|
|
90
|
+
const label = contextTransferReasonLabel(code);
|
|
91
|
+
return label ? `${label}(${code})` : code;
|
|
92
|
+
})
|
|
93
|
+
.join(";");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const REASON_CODE_SCAN_PATTERN = new RegExp(
|
|
97
|
+
`\\b(?:${Object.keys(CONTEXT_TRANSFER_REASON_LABELS).join("|")})\\b`,
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 任意错误信息 → 面向操作者的语义化文案。扫描消息中嵌入的已知 reason
|
|
102
|
+
* code,命中时以中文业务术语开头并保留原码与原始信息;未命中已知 code
|
|
103
|
+
* 返回 null(调用方原样展示,不猜测成功、不编造解释)。
|
|
104
|
+
*/
|
|
105
|
+
export function describeTransferError(message) {
|
|
106
|
+
const raw = String(message ?? "").trim();
|
|
107
|
+
if (!raw) return null;
|
|
108
|
+
for (const entry of RUNTIME_ERROR_PATTERNS) {
|
|
109
|
+
if (entry.pattern.test(raw)) return entry.copy;
|
|
110
|
+
}
|
|
111
|
+
const match = REASON_CODE_SCAN_PATTERN.exec(raw);
|
|
112
|
+
if (!match) return null;
|
|
113
|
+
const label = contextTransferReasonLabel(match[0]);
|
|
114
|
+
if (!label) return null;
|
|
115
|
+
if (raw === match[0]) return `${label}(${match[0]})`;
|
|
116
|
+
const rest = raw.replace(match[0], "").replace(/^[\s::-]+/, "").trim();
|
|
117
|
+
return rest
|
|
118
|
+
? `${label}(${match[0]});原始信息:${rest}`
|
|
119
|
+
: `${label}(${match[0]})`;
|
|
120
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function extractInspectMutationToken(
|
|
2
|
+
html: string | null | undefined,
|
|
3
|
+
): string | null;
|
|
4
|
+
export function applyInspectMutationToken(
|
|
5
|
+
token: string | null | undefined,
|
|
6
|
+
): boolean;
|
|
7
|
+
export function inspectAssetHref(href: string | null | undefined): string | null;
|
|
8
|
+
export function isInspectShellHref(href: string | null | undefined): boolean;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for hosted Inspect bootstrap. Safe to import from Node tests.
|
|
3
|
+
* No DOM, no view modules.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const INSPECT_MUTATION_TOKEN_RE =
|
|
7
|
+
/window\.__INSPECT_MUTATION_TOKEN__\s*=\s*("(?:\\.|[^"\\])*")/;
|
|
8
|
+
|
|
9
|
+
/** Parse the scoped inspect token injected into `/inspect/` HTML. */
|
|
10
|
+
export function extractInspectMutationToken(html) {
|
|
11
|
+
const match = String(html ?? "").match(INSPECT_MUTATION_TOKEN_RE);
|
|
12
|
+
if (!match) return null;
|
|
13
|
+
try {
|
|
14
|
+
const value = JSON.parse(match[1]);
|
|
15
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
16
|
+
} catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function applyInspectMutationToken(token) {
|
|
22
|
+
if (typeof globalThis === "undefined") return false;
|
|
23
|
+
if (typeof token === "string" && token.length > 0) {
|
|
24
|
+
globalThis.__INSPECT_MUTATION_TOKEN__ = token;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
delete globalThis.__INSPECT_MUTATION_TOKEN__;
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Resolve inspect index.html stylesheet hrefs against `/inspect/` on the Console origin. */
|
|
32
|
+
export function inspectAssetHref(href) {
|
|
33
|
+
const raw = String(href ?? "").trim();
|
|
34
|
+
if (!raw) return null;
|
|
35
|
+
if (
|
|
36
|
+
/^[a-z][a-z0-9+.-]*:/i.test(raw) ||
|
|
37
|
+
raw.startsWith("//") ||
|
|
38
|
+
raw.startsWith("/")
|
|
39
|
+
) {
|
|
40
|
+
return raw;
|
|
41
|
+
}
|
|
42
|
+
return `/inspect/${raw.replace(/^\.\//, "")}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function isInspectShellHref(href) {
|
|
46
|
+
const raw = String(href ?? "").trim();
|
|
47
|
+
if (!raw) return false;
|
|
48
|
+
if (raw.startsWith("#/") || raw.startsWith("/#/")) return true;
|
|
49
|
+
if (
|
|
50
|
+
raw === "/inspect" ||
|
|
51
|
+
raw.startsWith("/inspect/") ||
|
|
52
|
+
raw.startsWith("/inspect#")
|
|
53
|
+
) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from "./router.js";
|
|
14
14
|
import {
|
|
15
15
|
isPageVisible,
|
|
16
|
+
isWorkspaceActive,
|
|
16
17
|
pauseForegroundTimers,
|
|
17
18
|
setWorkspaceActive,
|
|
18
19
|
setWorkspaceScope,
|
|
@@ -33,6 +34,12 @@ import { startDagPolling } from "./views/dag.js";
|
|
|
33
34
|
import { renderNightJobs } from "./views/night.js";
|
|
34
35
|
import { closeDagInspectorOnOutsideClick } from "./views/dag-inspector.js";
|
|
35
36
|
import { mountOperatorChrome } from "./operator-chrome.js";
|
|
37
|
+
import {
|
|
38
|
+
applyInspectMutationToken,
|
|
39
|
+
extractInspectMutationToken,
|
|
40
|
+
inspectAssetHref,
|
|
41
|
+
isInspectShellHref,
|
|
42
|
+
} from "./inspect-bootstrap.js";
|
|
36
43
|
|
|
37
44
|
let instance = null;
|
|
38
45
|
let lastInspectHash = "";
|
|
@@ -73,6 +80,31 @@ export function navigateInspectPath(path) {
|
|
|
73
80
|
return href;
|
|
74
81
|
}
|
|
75
82
|
|
|
83
|
+
function onInspectRootClick(event) {
|
|
84
|
+
if (event.defaultPrevented || event.button !== 0) return;
|
|
85
|
+
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
|
|
86
|
+
const target = event.target;
|
|
87
|
+
if (!(target instanceof Element)) return;
|
|
88
|
+
const anchor = target.closest("a[href]");
|
|
89
|
+
if (!anchor) return;
|
|
90
|
+
const href = anchor.getAttribute("href");
|
|
91
|
+
if (!isInspectShellHref(href)) return;
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
navigateInspectPath(href);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function resumeInspectPolling() {
|
|
97
|
+
if (!isPageVisible() || !isWorkspaceActive()) return;
|
|
98
|
+
const r = lastInspectHash
|
|
99
|
+
? parseHashRouteWithFilters(lastInspectHash)
|
|
100
|
+
: parseRoute();
|
|
101
|
+
if (r.view === "dashboard") startDashboardPolling();
|
|
102
|
+
if (r.view === "run") startRunPolling(r.workerRunId, false);
|
|
103
|
+
if (r.view === "dag") startDagPolling(r.dagRunId, false);
|
|
104
|
+
if (r.view === "pool" && uiState.poolAutoRefresh) startPoolView();
|
|
105
|
+
if (r.view === "task") startTaskPolling(r.featureId, r.taskId);
|
|
106
|
+
}
|
|
107
|
+
|
|
76
108
|
function startView(routeValue) {
|
|
77
109
|
if (routeValue.view === "dashboard") {
|
|
78
110
|
startDashboardPolling(routeValue.scrollTo);
|
|
@@ -131,7 +163,12 @@ export async function prepareInspectWorkspace(root) {
|
|
|
131
163
|
throw new Error(`Inspect markup HTTP ${res.status}`);
|
|
132
164
|
}
|
|
133
165
|
const html = await res.text();
|
|
166
|
+
applyInspectMutationToken(extractInspectMutationToken(html));
|
|
134
167
|
const doc = new DOMParser().parseFromString(html, "text/html");
|
|
168
|
+
for (const link of doc.querySelectorAll('link[rel="stylesheet"]')) {
|
|
169
|
+
const resolved = inspectAssetHref(link.getAttribute("href"));
|
|
170
|
+
if (resolved) ensureStylesheet(resolved);
|
|
171
|
+
}
|
|
135
172
|
const app = doc.getElementById("app");
|
|
136
173
|
if (!app) throw new Error("Inspect markup missing #app");
|
|
137
174
|
root.appendChild(document.importNode(app, true));
|
|
@@ -143,15 +180,7 @@ function bindStandaloneListeners() {
|
|
|
143
180
|
window.addEventListener("hashchange", () => route());
|
|
144
181
|
window.addEventListener("load", () => route());
|
|
145
182
|
document.addEventListener("pointerdown", closeDagInspectorOnOutsideClick);
|
|
146
|
-
document.addEventListener("visibilitychange",
|
|
147
|
-
if (!isPageVisible()) return;
|
|
148
|
-
const r = parseRoute();
|
|
149
|
-
if (r.view === "dashboard") startDashboardPolling();
|
|
150
|
-
if (r.view === "run") startRunPolling(r.workerRunId, false);
|
|
151
|
-
if (r.view === "dag") startDagPolling(r.dagRunId, false);
|
|
152
|
-
if (r.view === "pool" && uiState.poolAutoRefresh) startPoolView();
|
|
153
|
-
if (r.view === "task") startTaskPolling(r.featureId, r.taskId);
|
|
154
|
-
});
|
|
183
|
+
document.addEventListener("visibilitychange", resumeInspectPolling);
|
|
155
184
|
}
|
|
156
185
|
|
|
157
186
|
export function startStandaloneInspect() {
|
|
@@ -204,7 +233,6 @@ export function mountInspectWorkspace(root, options = {}) {
|
|
|
204
233
|
// workspaceId via mount options/hash and postMessage updates; every observe
|
|
205
234
|
// GET is then scoped via scopedApiUrl.
|
|
206
235
|
setWorkspaceScope(options.workspaceId ?? workspaceIdFromHash(options.hash));
|
|
207
|
-
window.addEventListener("message", onWorkspaceScopeMessage);
|
|
208
236
|
|
|
209
237
|
const hosted = options.hosted === true || options.hosted !== false;
|
|
210
238
|
const onNavigate =
|
|
@@ -216,6 +244,20 @@ export function mountInspectWorkspace(root, options = {}) {
|
|
|
216
244
|
lastInspectHash = options.hash || (typeof location !== "undefined" ? location.hash : "");
|
|
217
245
|
setWorkspaceActive(options.active !== false);
|
|
218
246
|
|
|
247
|
+
const listenerAbort =
|
|
248
|
+
typeof AbortController !== "undefined" ? new AbortController() : null;
|
|
249
|
+
const listenerOpts = listenerAbort ? { signal: listenerAbort.signal } : undefined;
|
|
250
|
+
window.addEventListener("message", onWorkspaceScopeMessage, listenerOpts);
|
|
251
|
+
if (hosted && typeof document !== "undefined") {
|
|
252
|
+
document.addEventListener(
|
|
253
|
+
"pointerdown",
|
|
254
|
+
closeDagInspectorOnOutsideClick,
|
|
255
|
+
listenerOpts,
|
|
256
|
+
);
|
|
257
|
+
document.addEventListener("visibilitychange", resumeInspectPolling, listenerOpts);
|
|
258
|
+
root.addEventListener("click", onInspectRootClick, listenerOpts);
|
|
259
|
+
}
|
|
260
|
+
|
|
219
261
|
const host = {
|
|
220
262
|
root,
|
|
221
263
|
hosted,
|
|
@@ -250,6 +292,8 @@ export function mountInspectWorkspace(root, options = {}) {
|
|
|
250
292
|
host.destroyed = true;
|
|
251
293
|
pauseForegroundTimers();
|
|
252
294
|
setNavigateHandler(null);
|
|
295
|
+
listenerAbort?.abort();
|
|
296
|
+
if (hosted) applyInspectMutationToken(null);
|
|
253
297
|
if (instance === host) instance = null;
|
|
254
298
|
},
|
|
255
299
|
};
|
|
@@ -49,16 +49,18 @@
|
|
|
49
49
|
.och-inner {
|
|
50
50
|
box-sizing: border-box;
|
|
51
51
|
width: 100%;
|
|
52
|
+
min-width: 0;
|
|
52
53
|
padding-inline: 14px;
|
|
53
54
|
margin: 0 auto;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
/* Band 1 — 全局带:品牌 / 仓库身份 / 模式 /
|
|
57
|
+
/* Band 1 — 全局带:品牌 / 仓库身份 / 模式 / 状态格(对象上下文在下方独立行) */
|
|
57
58
|
.och-global {
|
|
58
59
|
position: relative;
|
|
59
60
|
display: flex;
|
|
60
61
|
align-items: center;
|
|
61
62
|
gap: 12px;
|
|
63
|
+
min-width: 0;
|
|
62
64
|
/* DSH 2026-08-23:约 44px 与内容同色的压缩标题栏。 */
|
|
63
65
|
height: 44px;
|
|
64
66
|
}
|
|
@@ -318,11 +320,21 @@
|
|
|
318
320
|
z-index: 1;
|
|
319
321
|
}
|
|
320
322
|
|
|
321
|
-
/* 对象上下文 chip:跨模式选中连续性 +
|
|
323
|
+
/* 对象上下文 chip:跨模式选中连续性 + 显式返回路径。
|
|
324
|
+
* 不放进 44px 全局带:≥720px 模式开关 position:fixed 居中,长 run id
|
|
325
|
+
* 会从左侧把「返回 恢复」顶进滑块底下。独立一行后按钮始终完整可见。 */
|
|
326
|
+
.och-context-row {
|
|
327
|
+
display: flex;
|
|
328
|
+
align-items: center;
|
|
329
|
+
min-width: 0;
|
|
330
|
+
padding: 0 0 8px;
|
|
331
|
+
}
|
|
322
332
|
.och-context {
|
|
323
333
|
display: inline-flex;
|
|
324
334
|
align-items: center;
|
|
325
335
|
gap: 8px;
|
|
336
|
+
min-width: 0;
|
|
337
|
+
max-width: 100%;
|
|
326
338
|
min-height: 30px;
|
|
327
339
|
padding: 0 6px 0 12px;
|
|
328
340
|
border: 1px solid
|
|
@@ -331,26 +343,29 @@
|
|
|
331
343
|
background: color-mix(in srgb, var(--och-peach) 42%, var(--och-surface));
|
|
332
344
|
font-size: 12px;
|
|
333
345
|
color: var(--och-ink);
|
|
334
|
-
white-space: nowrap;
|
|
335
346
|
}
|
|
336
347
|
.och-context[hidden] {
|
|
337
348
|
display: none;
|
|
338
349
|
}
|
|
339
350
|
.och-context-kind {
|
|
351
|
+
flex-shrink: 0;
|
|
340
352
|
color: var(--och-orange-active);
|
|
341
353
|
font-weight: 700;
|
|
342
354
|
}
|
|
343
355
|
.och-context-id {
|
|
356
|
+
flex: 1 1 auto;
|
|
357
|
+
min-width: 0;
|
|
344
358
|
font-family: var(--och-mono);
|
|
345
359
|
font-size: 11px;
|
|
346
360
|
color: var(--och-body);
|
|
347
|
-
max-width: 260px;
|
|
348
361
|
overflow: hidden;
|
|
349
362
|
text-overflow: ellipsis;
|
|
363
|
+
white-space: nowrap;
|
|
350
364
|
}
|
|
351
365
|
.och-context-return {
|
|
352
366
|
display: inline-flex;
|
|
353
367
|
align-items: center;
|
|
368
|
+
flex-shrink: 0;
|
|
354
369
|
gap: 4px;
|
|
355
370
|
height: 22px;
|
|
356
371
|
padding: 0 9px;
|
|
@@ -360,6 +375,7 @@
|
|
|
360
375
|
font-size: 11px;
|
|
361
376
|
font-weight: 600;
|
|
362
377
|
text-decoration: none;
|
|
378
|
+
white-space: nowrap;
|
|
363
379
|
}
|
|
364
380
|
.och-context-return:hover {
|
|
365
381
|
background: var(--och-orange-active);
|
|
@@ -369,6 +385,7 @@
|
|
|
369
385
|
display: inline-flex;
|
|
370
386
|
align-items: center;
|
|
371
387
|
justify-content: center;
|
|
388
|
+
flex-shrink: 0;
|
|
372
389
|
width: 20px;
|
|
373
390
|
height: 20px;
|
|
374
391
|
padding: 0;
|
|
@@ -401,6 +418,7 @@
|
|
|
401
418
|
font-size: 12px;
|
|
402
419
|
font-variant-numeric: tabular-nums;
|
|
403
420
|
white-space: nowrap;
|
|
421
|
+
flex-shrink: 0;
|
|
404
422
|
}
|
|
405
423
|
.och-fresh-dot {
|
|
406
424
|
width: 7px;
|
|
@@ -425,6 +443,7 @@
|
|
|
425
443
|
color: var(--och-body);
|
|
426
444
|
text-decoration: none;
|
|
427
445
|
white-space: nowrap;
|
|
446
|
+
flex-shrink: 0;
|
|
428
447
|
transition: border-color 0.15s ease;
|
|
429
448
|
}
|
|
430
449
|
.och-pi:hover {
|
|
@@ -17,6 +17,7 @@ export const OPERATE_TABS = Object.freeze([
|
|
|
17
17
|
{ id: "night", label: "夜间", href: "/#/operate/night" },
|
|
18
18
|
{ id: "models", label: "模型与认证", href: "/#/operate/models" },
|
|
19
19
|
{ id: "settings", label: "设置", href: "/#/operate/settings" },
|
|
20
|
+
{ id: "pi-plugins", label: "Pi 插件", href: "/#/operate/pi-plugins" },
|
|
20
21
|
]);
|
|
21
22
|
|
|
22
23
|
export const INSPECT_TABS = Object.freeze([
|
|
@@ -653,7 +654,9 @@ export function mountOperatorChrome(root, config = {}) {
|
|
|
653
654
|
if (model.context) {
|
|
654
655
|
const chip = el("div", "och-context");
|
|
655
656
|
chip.appendChild(el("span", "och-context-kind", model.context.kindLabel));
|
|
656
|
-
|
|
657
|
+
const idEl = el("span", "och-context-id", model.context.id);
|
|
658
|
+
idEl.title = model.context.id;
|
|
659
|
+
chip.appendChild(idEl);
|
|
657
660
|
const back = el("a", "och-context-return");
|
|
658
661
|
back.href = model.context.returnHref;
|
|
659
662
|
back.appendChild(makeIcon("arrowLeft"));
|
|
@@ -675,7 +678,9 @@ export function mountOperatorChrome(root, config = {}) {
|
|
|
675
678
|
render();
|
|
676
679
|
});
|
|
677
680
|
chip.appendChild(close);
|
|
678
|
-
|
|
681
|
+
const row = el("div", "och-context-row");
|
|
682
|
+
row.appendChild(chip);
|
|
683
|
+
inner.appendChild(row);
|
|
679
684
|
}
|
|
680
685
|
|
|
681
686
|
global.appendChild(el("span", "och-spacer"));
|
|
@@ -82,7 +82,9 @@ export const uiState = {
|
|
|
82
82
|
dagNodeExecutionOutputLoading: false,
|
|
83
83
|
dagNodeExecutionOutputError: null,
|
|
84
84
|
dagNodeExecutionOutputKey: null,
|
|
85
|
-
/**
|
|
85
|
+
/** Unified execution-record filter: all model/tool/process facts by default. */
|
|
86
|
+
executionRecordFilter: "all",
|
|
87
|
+
/** When true,「执行记录」展开 message_start/end 原始协议事件。默认隐藏,避免重复淹没语义记录。 */
|
|
86
88
|
sessionTimelineShowProtocol: false,
|
|
87
89
|
/** Open <details> keys restored across timeline re-renders. */
|
|
88
90
|
sessionTimelineOpenDetails: null,
|