@tea-agent/loop-agent 0.44.0-next.5 → 0.44.0-next.6
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/CHANGELOG.md +23 -0
- package/dist/build-stamp.json +3 -3
- package/dist/executors/pi-sdk-executor.js +7 -7
- package/dist/infrastructure/console/operation-store.js +46 -14
- package/dist/shared/wizard-local-telemetry.js +2 -1
- package/dist/worker/console/chat/pi-runtime.js +217 -18
- package/dist/worker/console/chat/repo-browser.js +49 -0
- package/dist/worker/console/chat/routes.js +77 -57
- package/dist/worker/console/console-update-runtime.js +2 -2
- package/dist/worker/console/operator-user-error.js +28 -1
- package/dist/worker/console/pi-readiness.js +4 -4
- package/dist/worker/console/recovery-cta.js +14 -14
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-BHuhGM1e.js → abnfDiagram-N423BO3Z-Brn2sPzL.js} +1 -1
- package/dist/worker/console/static/assets/{arc-CKh5E_sr.js → arc-BIMNTG0W.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-DizhiBEv.js → architectureDiagram-T3A2C74G--WtcgR_A.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-3Neea-Z-.js → blockDiagram-VBNYF7ZC-BT_Ztog1.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BCP_Qrgi.js → c4Diagram-5PPSVZJV-C5hbVr-l.js} +1 -1
- package/dist/worker/console/static/assets/channel-DNWB4hpR.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-C_wydftK.js → chunk-2GRJ4B5K-BKKnyR9Z.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-jRPXZbzx.js → chunk-2Q5K7J3B-BHs6biqA.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BLQf2OYO.js → chunk-5RXB4S5H-BdSFy_vP.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-0qRq64rI.js → chunk-5VM5RSS4-BpJIdTKV.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-ClMg8xmV.js → chunk-6Q2QTUOP-C_iWJhkT.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-Coop2FlL.js → chunk-GF5L2VYU-BTbmx3-k.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-CDdO-jPJ.js → chunk-JWPE2WC7-D4Ee6DmP.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-D8Gkppjl.js → chunk-KBJHAD2P-B487SORR.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DA9HIySf.js → chunk-RYQCIY6F-BKYHjNrr.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DZNDRX1k.js → chunk-XXDRQBXY-DrTdoYZG.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-COhFgJji.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-COhFgJji.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CZ1zGyjq.js → cose-bilkent-JH36ORCC-CttUY_Jo.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-B8u1_FtM.js → cynefin-VYW2F7L2-B4Rm5gnR.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-CPBB6lfo.js → cynefinDiagram-MW4NZA55-ByxHBq_S.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CG3Eov3E.js → dagre-VZM6K2ZE-DGrfNFA0.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-ycI-dOjh.js → diagram-7IWD3JNH-KjrUPquv.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Bx_GyQ7Y.js → diagram-B4RE2ZJO-VS4mlm75.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-m0G6mP4d.js → diagram-LBJQPF4R-BLXYmFTM.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-DTDJkqcJ.js → diagram-Q27KOJAE-C6xoFAqH.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-BCfFrG-p.js → diagram-UB23O5K3-C478dCe7.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BIkTNPpp.js → ebnfDiagram-BXEA7PRR-DHEpW5zN.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DTcMWrd2.js → erDiagram-JOGREHBK-CA5GKfo9.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BqzDaNQ7.js → flowDiagram-UKHOOZJN-zysi0Fl-.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-BSl_vGFe.js → ganttDiagram-PKOTCBZU-DGzcKA8Y.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-DCA5HXM6.js → gitGraphDiagram-DS77QQ5N-CHsuIG1w.js} +1 -1
- package/dist/worker/console/static/assets/{index-wKEJUaP5.js → index-CJh6pVLm.js} +97 -97
- package/dist/worker/console/static/assets/index-C_kvKmFM.css +1 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DvqT18ge.js → infoDiagram-6WML65LV-BexZHPCp.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-B6zGKrQ3.js → ishikawaDiagram-WSZJBQD7-Gkx8q-DB.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-BpLQPI9C.js → journeyDiagram-NVQOT4AX-XDW3qrJ7.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CzIz_-Lt.js → kanban-definition-27J2QSJJ-DJ07eEaN.js} +1 -1
- package/dist/worker/console/static/assets/{linear-CMQ8Jpp-.js → linear-DL-zeqOn.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-BdAMrTf7.js → mermaid.core-C0HdXtOf.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-hSwF6sOq.js → mindmap-definition-FAOFIHXS-CqRX0lrt.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DZdv509B.js → pegDiagram-VL7TDLO6-BVM9JZ2H.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-CmD4-b0K.js → pieDiagram-7S7Q4E2Y-BA3ozdKk.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-DtKxNxlS.js → quadrantDiagram-CIZ2JOQS-B-0_p9_4.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-D48iIoiS.js → railroadDiagram-AXF67PYL-DHRzPWFc.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-C3N0K-2p.js → requirementDiagram-LRYGKXZP-9BEC_PcW.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-CACWR-Xs.js → sankeyDiagram-W5VNT64P-DMxeW4rN.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-g_QgugvZ.js → sequenceDiagram-SI44F4Z6-DixP6LIU.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-DqLoRPGK.js → sizeCapture-X5ZJPWSS-B_EifJBo.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-ES59VgMG.js → stateDiagram-OKZ733FA-BwikwWbX.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-S2ZHMo1c.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-fjyLVNWo.js → swimlanes-SLNWSIFB-C162l9o1.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BZm4ByfV.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Cd5-biKv.js → timeline-definition-Z64GVDOM-mpe_u1i4.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-CZTu6mPf.js → vennDiagram-T6HMQDX7-DyUk54HX.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DR01jjbe.js → wardleyDiagram-T6FBY63Y-HYyMkzfm.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-iZcuGVGa.js → xychartDiagram-ELKLHX3M-DRoh7skR.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/console-types.js +9 -1
- package/dist/worker/console/static-src/operator-chat/details-rail-surfaces.js +98 -0
- package/dist/worker/console/static-src/operator-chat/file-palette-nav.js +81 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +4 -2
- package/dist/worker/console/static-src/operator-chat/useComposer.js +80 -6
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +8 -1
- package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +36 -17
- package/dist/worker/console/static-src/operator-chat/useRuntimeSnapshot.js +18 -0
- package/dist/worker/console/static-src/operator-chat/useWorkspaceBrowserGate.js +4 -0
- package/dist/worker/console/static-src/shell/console-update-reload.js +1 -1
- package/dist/worker/console/workspace-initialization.js +3 -3
- package/dist/worker/observability/read-model.js +23 -2
- package/docs/templates/backend-test-dag.json +1 -0
- package/package.json +4 -4
- package/dist/worker/console/static/assets/channel-DxgzA1GF.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BZcm7fs6.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BZcm7fs6.js +0 -1
- package/dist/worker/console/static/assets/index-BAEDjTbD.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DyCIq6jx.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CsKtO34q.js +0 -8
|
@@ -24,9 +24,8 @@ import { projectDeferredTurnSummary, projectDeferredTurnSummaries, } from "./def
|
|
|
24
24
|
import { THINKING_LEVELS, RuntimeSnapshotUnavailableError, } from "./pi-runtime.js";
|
|
25
25
|
import { ResourcePreferencesError, setSkillAutoInvocationPreference, } from "./resource-preferences-store.js";
|
|
26
26
|
import { ComposerDraftStore } from "./composer-draft-store.js";
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import { listRepoDirectory, matchRepoHtmlPreviewRoute, readRepoHtmlAsset, readRepoPreview, RepoBrowserError, } from "./repo-browser.js";
|
|
27
|
+
import { scrubSecrets } from "./explore-tools.js";
|
|
28
|
+
import { listChatFilePalette, listRepoDirectory, matchRepoHtmlPreviewRoute, readRepoHtmlAsset, readRepoPreview, RepoBrowserError, } from "./repo-browser.js";
|
|
30
29
|
import { projectRuntimeContext } from "./runtime-context.js";
|
|
31
30
|
import { patchModelsConfig, readModelsConfig, readPackageInventory, } from "./pi-console-config.js";
|
|
32
31
|
import { ChatInterviewAdapter, projectChatInterviewState, } from "./interview-adapter.js";
|
|
@@ -66,6 +65,14 @@ function reopenInitFromRecord(record) {
|
|
|
66
65
|
sessionMode: record.sessionMode,
|
|
67
66
|
};
|
|
68
67
|
}
|
|
68
|
+
function workspaceProjectionFromRecord(record) {
|
|
69
|
+
return {
|
|
70
|
+
sessionMode: record.sessionMode,
|
|
71
|
+
...(record.modelProvider ? { modelProvider: record.modelProvider } : {}),
|
|
72
|
+
...(record.modelId ? { modelId: record.modelId } : {}),
|
|
73
|
+
...(record.thinkingLevel ? { thinkingLevel: record.thinkingLevel } : {}),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
69
76
|
async function readChatSessionMode(deps, sessionId) {
|
|
70
77
|
let record;
|
|
71
78
|
try {
|
|
@@ -3021,28 +3028,8 @@ async function handlePiConfig(req, res, deps, resource) {
|
|
|
3021
3028
|
async function handleChatFiles(res, deps, sessionId, query) {
|
|
3022
3029
|
if (!(await requireChatSession(res, deps, sessionId)))
|
|
3023
3030
|
return;
|
|
3024
|
-
const
|
|
3025
|
-
|
|
3026
|
-
skipSensitive: true,
|
|
3027
|
-
maxFiles: 5000,
|
|
3028
|
-
includeDirs: true,
|
|
3029
|
-
});
|
|
3030
|
-
const entries = walked
|
|
3031
|
-
.filter((entry) => !isSensitivePath(entry.repoRelative) &&
|
|
3032
|
-
(!q || entry.repoRelative.toLowerCase().includes(q)))
|
|
3033
|
-
.sort((a, b) => {
|
|
3034
|
-
const aDir = a.repoRelative.endsWith("/");
|
|
3035
|
-
const bDir = b.repoRelative.endsWith("/");
|
|
3036
|
-
if (aDir !== bDir)
|
|
3037
|
-
return aDir ? -1 : 1;
|
|
3038
|
-
return a.repoRelative.localeCompare(b.repoRelative);
|
|
3039
|
-
})
|
|
3040
|
-
.slice(0, 50)
|
|
3041
|
-
.map((entry) => ({
|
|
3042
|
-
path: entry.repoRelative,
|
|
3043
|
-
isDir: entry.repoRelative.endsWith("/"),
|
|
3044
|
-
}));
|
|
3045
|
-
sendJson(res, 200, { ok: true, files: entries });
|
|
3031
|
+
const files = await listChatFilePalette(deps.appData.repoRoot, query);
|
|
3032
|
+
sendJson(res, 200, { ok: true, files });
|
|
3046
3033
|
}
|
|
3047
3034
|
export async function handleChatCommands(res, deps, sessionId) {
|
|
3048
3035
|
try {
|
|
@@ -3146,20 +3133,25 @@ async function handleSddBingo(req, res, deps, sessionId) {
|
|
|
3146
3133
|
}
|
|
3147
3134
|
}
|
|
3148
3135
|
export async function handleRuntimeContext(res, deps, sessionId) {
|
|
3149
|
-
const
|
|
3150
|
-
if (!
|
|
3151
|
-
sendJson(res,
|
|
3136
|
+
const record = await deps.store.get(sessionId);
|
|
3137
|
+
if (!record) {
|
|
3138
|
+
sendJson(res, 404, {
|
|
3139
|
+
ok: false,
|
|
3140
|
+
error: {
|
|
3141
|
+
code: "PI_SESSION_NOT_FOUND",
|
|
3142
|
+
message: `chat session not found: ${sessionId}`,
|
|
3143
|
+
},
|
|
3144
|
+
});
|
|
3152
3145
|
return;
|
|
3153
3146
|
}
|
|
3154
|
-
//
|
|
3155
|
-
//
|
|
3156
|
-
//
|
|
3157
|
-
// length-limited projection. RF-02: a critical projection failure is 503
|
|
3158
|
-
// PI_RUNTIME_UNAVAILABLE — never a 500 leak or a fake-empty context.
|
|
3147
|
+
// Live Agent is preferred. Cold inspect uses workspace ResourceLoader /
|
|
3148
|
+
// ModelRuntime without SessionManager.open(jsonl); prompt still reopens.
|
|
3149
|
+
// RF-02: a critical projection failure is 503 PI_RUNTIME_UNAVAILABLE.
|
|
3159
3150
|
let snapshot;
|
|
3160
3151
|
try {
|
|
3161
3152
|
snapshot = await deps.runtime.getRuntimeSnapshot(sessionId, {
|
|
3162
3153
|
includeRaw: true,
|
|
3154
|
+
workspaceProjection: workspaceProjectionFromRecord(record),
|
|
3163
3155
|
});
|
|
3164
3156
|
}
|
|
3165
3157
|
catch (error) {
|
|
@@ -3234,6 +3226,7 @@ export async function handleContextInsights(res, deps, sessionId) {
|
|
|
3234
3226
|
try {
|
|
3235
3227
|
const runtimeSnapshot = await deps.runtime.getRuntimeSnapshot(sessionId, {
|
|
3236
3228
|
includeRaw: true,
|
|
3229
|
+
workspaceProjection: workspaceProjectionFromRecord(record),
|
|
3237
3230
|
});
|
|
3238
3231
|
if (runtimeSnapshot) {
|
|
3239
3232
|
systemPromptChars = runtimeSnapshot.systemPrompt.characters;
|
|
@@ -3279,16 +3272,23 @@ export async function handleContextInsights(res, deps, sessionId) {
|
|
|
3279
3272
|
// Exported for the direct handler-boundary tests (trace binding for
|
|
3280
3273
|
// vt-route-model-errors); router dispatch behavior is unchanged.
|
|
3281
3274
|
export async function handleModels(req, res, deps, sessionId) {
|
|
3282
|
-
// AC-01/AC-06: models (and model/thinking mutation) requests reuse the same
|
|
3283
|
-
// activation path. A missing/reopen-failed runtime is a STRUCTURED error —
|
|
3284
|
-
// never a fabricated empty model list.
|
|
3285
|
-
const ensured = await ensureActiveSession(deps, sessionId);
|
|
3286
|
-
if (!ensured.ok) {
|
|
3287
|
-
sendJson(res, ensured.status, { ok: false, error: { code: ensured.code, message: ensured.message } });
|
|
3288
|
-
return;
|
|
3289
|
-
}
|
|
3290
3275
|
try {
|
|
3291
3276
|
if ((req.method ?? "GET").toUpperCase() === "GET") {
|
|
3277
|
+
// Catalog is workspace-scoped (models.json / ModelRuntime). Do not wait
|
|
3278
|
+
// for Pi conversation reopen and do not start it here — prompt / reload
|
|
3279
|
+
// / model mutation still reopen, and concurrent reopen would stall this
|
|
3280
|
+
// cheap list on the single Node thread.
|
|
3281
|
+
const record = await deps.store.get(sessionId);
|
|
3282
|
+
if (!record) {
|
|
3283
|
+
sendJson(res, 404, {
|
|
3284
|
+
ok: false,
|
|
3285
|
+
error: {
|
|
3286
|
+
code: "PI_SESSION_NOT_FOUND",
|
|
3287
|
+
message: `chat session not found: ${sessionId}`,
|
|
3288
|
+
},
|
|
3289
|
+
});
|
|
3290
|
+
return;
|
|
3291
|
+
}
|
|
3292
3292
|
let models;
|
|
3293
3293
|
try {
|
|
3294
3294
|
models = await deps.runtime.listModels(sessionId);
|
|
@@ -3317,6 +3317,11 @@ export async function handleModels(req, res, deps, sessionId) {
|
|
|
3317
3317
|
});
|
|
3318
3318
|
return;
|
|
3319
3319
|
}
|
|
3320
|
+
const ensured = await ensureActiveSession(deps, sessionId);
|
|
3321
|
+
if (!ensured.ok) {
|
|
3322
|
+
sendJson(res, ensured.status, { ok: false, error: { code: ensured.code, message: ensured.message } });
|
|
3323
|
+
return;
|
|
3324
|
+
}
|
|
3320
3325
|
const gate = gateMutation(req, deps);
|
|
3321
3326
|
if (!gate.ok) {
|
|
3322
3327
|
sendJson(res, gate.status, { ok: false, error: { code: gate.code, message: gate.message } });
|
|
@@ -3372,18 +3377,24 @@ async function requireChatSession(res, deps, sessionId) {
|
|
|
3372
3377
|
});
|
|
3373
3378
|
return false;
|
|
3374
3379
|
}
|
|
3375
|
-
|
|
3376
|
-
* Unified session activation (design §2.1 / AC-01): models, runtime snapshot,
|
|
3377
|
-
* reload and model/thinking mutation requests all flow through this path.
|
|
3378
|
-
*
|
|
3379
|
-
* - runtime already holds the session → ok;
|
|
3380
|
-
* - only a persisted record exists → reopen from record.sessionFile;
|
|
3381
|
-
* - no record / missing session file → 404 PI_SESSION_NOT_FOUND;
|
|
3382
|
-
* - SDK reopen failure → 503 PI_RUNTIME_UNAVAILABLE.
|
|
3383
|
-
*
|
|
3384
|
-
* Never fabricates a fresh session or an empty model list.
|
|
3385
|
-
*/
|
|
3380
|
+
const ensureActiveSessionInFlight = new WeakMap();
|
|
3386
3381
|
export async function ensureActiveSession(deps, sessionId) {
|
|
3382
|
+
let bySession = ensureActiveSessionInFlight.get(deps);
|
|
3383
|
+
if (!bySession) {
|
|
3384
|
+
bySession = new Map();
|
|
3385
|
+
ensureActiveSessionInFlight.set(deps, bySession);
|
|
3386
|
+
}
|
|
3387
|
+
const existing = bySession.get(sessionId);
|
|
3388
|
+
if (existing)
|
|
3389
|
+
return existing;
|
|
3390
|
+
const pending = runEnsureActiveSession(deps, sessionId).finally(() => {
|
|
3391
|
+
if (bySession.get(sessionId) === pending)
|
|
3392
|
+
bySession.delete(sessionId);
|
|
3393
|
+
});
|
|
3394
|
+
bySession.set(sessionId, pending);
|
|
3395
|
+
return pending;
|
|
3396
|
+
}
|
|
3397
|
+
async function runEnsureActiveSession(deps, sessionId) {
|
|
3387
3398
|
// Wait for create-path materialization before treating the session as missing.
|
|
3388
3399
|
if (typeof deps.runtime.ensureSessionReady === "function") {
|
|
3389
3400
|
try {
|
|
@@ -3629,19 +3640,28 @@ export async function handleReloadSession(req, res, deps, sessionId) {
|
|
|
3629
3640
|
});
|
|
3630
3641
|
}
|
|
3631
3642
|
/**
|
|
3632
|
-
* GET /sessions/:id/runtime-snapshot (AC-01):
|
|
3643
|
+
* GET /sessions/:id/runtime-snapshot (AC-01): live Agent when present,
|
|
3644
|
+
* otherwise workspace ResourceLoader projection (no JSONL reopen).
|
|
3633
3645
|
*/
|
|
3634
3646
|
export async function handleRuntimeSnapshot(_res, res, deps, sessionId) {
|
|
3635
|
-
const
|
|
3636
|
-
if (!
|
|
3637
|
-
sendJson(res,
|
|
3647
|
+
const record = await deps.store.get(sessionId);
|
|
3648
|
+
if (!record) {
|
|
3649
|
+
sendJson(res, 404, {
|
|
3650
|
+
ok: false,
|
|
3651
|
+
error: {
|
|
3652
|
+
code: "PI_SESSION_NOT_FOUND",
|
|
3653
|
+
message: `chat session not found: ${sessionId}`,
|
|
3654
|
+
},
|
|
3655
|
+
});
|
|
3638
3656
|
return;
|
|
3639
3657
|
}
|
|
3640
3658
|
// RF-02: a critical snapshot projection failure is 503 PI_RUNTIME_UNAVAILABLE
|
|
3641
3659
|
// — never a 200 fake-empty snapshot.
|
|
3642
3660
|
let snapshot;
|
|
3643
3661
|
try {
|
|
3644
|
-
snapshot = await deps.runtime.getRuntimeSnapshot(sessionId
|
|
3662
|
+
snapshot = await deps.runtime.getRuntimeSnapshot(sessionId, {
|
|
3663
|
+
workspaceProjection: workspaceProjectionFromRecord(record),
|
|
3664
|
+
});
|
|
3645
3665
|
}
|
|
3646
3666
|
catch (error) {
|
|
3647
3667
|
if (sendRuntimeUnavailable(res, error))
|
|
@@ -4,7 +4,7 @@ import { createNpmUpdateClient } from "../../shared/update/npm-client.js";
|
|
|
4
4
|
import { acquireUpdateLock, updateLockPath } from "../../shared/update/state.js";
|
|
5
5
|
import { readInitRuntimeActivity } from "../observability/init-runtime-activity.js";
|
|
6
6
|
import { performConsoleUpdateAndInit, } from "./console-update-and-init.js";
|
|
7
|
-
import {
|
|
7
|
+
import { isOperationOccupied, } from "../../infrastructure/console/operation-store.js";
|
|
8
8
|
export function createConsoleUpdateExecutor(input) {
|
|
9
9
|
return async (channel) => {
|
|
10
10
|
const currentVersion = readPackageVersion(input.packageRoot);
|
|
@@ -49,7 +49,7 @@ export function createConsoleUpdateExecutor(input) {
|
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
const liveOtherOperation = operations.some((operation) => operation.action !== "consoleUpdateAndInit" &&
|
|
52
|
-
|
|
52
|
+
isOperationOccupied(operation.state));
|
|
53
53
|
return liveOtherOperation
|
|
54
54
|
? {
|
|
55
55
|
ok: false,
|
|
@@ -114,7 +114,7 @@ const CONTEXT_TRANSFER_CODE_COPY = [
|
|
|
114
114
|
},
|
|
115
115
|
{
|
|
116
116
|
pattern: /\bOPERATION_NEEDS_RECONCILE\b/,
|
|
117
|
-
copy: "
|
|
117
|
+
copy: "当前操作的执行结果尚未确认,需要先核对(OPERATION_NEEDS_RECONCILE)。请查看操作记录和相关任务状态,核对实际执行结果后再决定后续操作;确认前请勿重复提交。",
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
120
|
pattern: /\bCONTEXT_EXPORT_FAILED\b/,
|
|
@@ -169,6 +169,33 @@ const CONTEXT_TRANSFER_CODE_COPY = [
|
|
|
169
169
|
pattern: /\bINVALID_VERSION\b/,
|
|
170
170
|
copy: "安装版本或渠道版本号无法解析(INVALID_VERSION),请重试;若持续出现请反馈。",
|
|
171
171
|
},
|
|
172
|
+
// 源绑定漂移(dag-confirmation.ts / dag-execution-receipt.ts 的英文原文)
|
|
173
|
+
// 与 frontend split CAS 冲突(operator-actions.ts)原本会原样透传到操作者
|
|
174
|
+
// 横幅,这里给出可执行的中文说明。
|
|
175
|
+
{
|
|
176
|
+
pattern: /\bBINDING_DRIFT\b|\bbinding drift\b|\bbinding drifted\b/i,
|
|
177
|
+
copy: "这次确认所依据的内容已经变了(任务契约、源文件、程序版本或校验结果在确认之后被修改),因此旧确认不能再使用。这是保护措施,不是故障:请回到任务页重新生成确认,然后重新开始运行。",
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
pattern: /frontend split CAS conflict/i,
|
|
181
|
+
copy: "前端拆分任务的状态在你操作期间被其他操作改过了(通常是另一个标签页或并发操作),为避免覆盖对方的结果,本次修改没有生效。请刷新页面,确认当前状态后重试。",
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
pattern: /\bCONFIRMATION_EXPIRED\b/,
|
|
185
|
+
copy: "这次确认已经超时失效。请回到任务页重新生成确认后再继续。",
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
pattern: /\bCONFIRMATION_STALE\b/,
|
|
189
|
+
copy: "这次确认对应的是改动之前的内容,已经过期作废。请回到任务页重新生成确认后再继续。",
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
pattern: /\bCONFIRMATION_CONSUMED\b/,
|
|
193
|
+
copy: "这次确认已经被使用过了,不能重复提交。如需再次执行,请重新生成确认。",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
pattern: /\bHUMAN_CONFIRMATION_REQUIRED\b/,
|
|
197
|
+
copy: "这一步需要你先在页面上确认一次才能继续。请按提示完成确认后再重试。",
|
|
198
|
+
},
|
|
172
199
|
];
|
|
173
200
|
/** Map internal spawn/controller errors to actionable Chinese copy. */
|
|
174
201
|
export function formatOperatorUserError(message) {
|
|
@@ -85,7 +85,7 @@ function hasProviderConfig(snapshot) {
|
|
|
85
85
|
/**
|
|
86
86
|
* Discover live Pi SDK / auth / model readiness via ModelRuntime.
|
|
87
87
|
* Kept inside worker/console (dynamic import) so Worker does not depend on
|
|
88
|
-
* executors; contract matches pi-sdk-executor 0.
|
|
88
|
+
* executors; contract matches pi-sdk-executor 0.84.4.
|
|
89
89
|
*/
|
|
90
90
|
export async function discoverPiReadinessProbe(options) {
|
|
91
91
|
const repoRoot = options?.repoRoot ?? process.cwd();
|
|
@@ -118,7 +118,7 @@ export async function discoverPiReadinessProbe(options) {
|
|
|
118
118
|
modelsAvailable: false,
|
|
119
119
|
interviewSessionOk: false,
|
|
120
120
|
details: {
|
|
121
|
-
sdkMessage: "Pi SDK incompatible: requires createAgentSession, getAgentDir, and ModelRuntime.create (0.
|
|
121
|
+
sdkMessage: "Pi SDK incompatible: requires createAgentSession, getAgentDir, and ModelRuntime.create (0.84.4)",
|
|
122
122
|
authMessage: "skipped (sdk incompatible)",
|
|
123
123
|
modelsMessage: "skipped (sdk incompatible)",
|
|
124
124
|
sessionMessage: "skipped (sdk incompatible)",
|
|
@@ -159,7 +159,7 @@ export async function discoverPiReadinessProbe(options) {
|
|
|
159
159
|
modelsAvailable: false,
|
|
160
160
|
interviewSessionOk: false,
|
|
161
161
|
details: {
|
|
162
|
-
sdkMessage: "Pi SDK 0.
|
|
162
|
+
sdkMessage: "Pi SDK 0.84.4 contract available",
|
|
163
163
|
authMessage: `ModelRuntime.create failed: ${message}`,
|
|
164
164
|
modelsMessage: "skipped (runtime init failed)",
|
|
165
165
|
sessionMessage: "skipped (runtime init failed)",
|
|
@@ -225,7 +225,7 @@ export async function discoverPiReadinessProbe(options) {
|
|
|
225
225
|
interviewSessionOk,
|
|
226
226
|
piAvailableModels: availableModels,
|
|
227
227
|
details: {
|
|
228
|
-
sdkMessage: `Pi SDK 0.
|
|
228
|
+
sdkMessage: `Pi SDK 0.84.4 contract available (agentDir=${agentDir})`,
|
|
229
229
|
authMessage: authReady
|
|
230
230
|
? `credentials/providers ready (available=${availableCount}, providerConfig=${providerConfigured})`
|
|
231
231
|
: "no available models and no stored/configured provider credentials (set Pi auth or provider API keys)",
|
|
@@ -13,40 +13,40 @@ const CTA = {
|
|
|
13
13
|
},
|
|
14
14
|
doctor: {
|
|
15
15
|
id: "doctor",
|
|
16
|
-
label: "
|
|
16
|
+
label: "体检诊断",
|
|
17
17
|
action: "doctor",
|
|
18
18
|
lane: "dag",
|
|
19
|
-
guide: "
|
|
19
|
+
guide: "只做检查、不改动任何东西:看看 Console、模型服务和仓库是否正常。重跑之前先跑它,能省很多试错。",
|
|
20
20
|
commandHint: "agent-worker console doctor --repo .",
|
|
21
21
|
},
|
|
22
22
|
decision: {
|
|
23
23
|
id: "decision",
|
|
24
24
|
label: "人工决策",
|
|
25
25
|
lane: "dag",
|
|
26
|
-
guide: "
|
|
26
|
+
guide: "运行停下来等你拍板时用:先点「体检诊断」看清现状,再决定继续还是调整(需要走命令行)。",
|
|
27
27
|
commandHint: "loop-agent dag doctor --run-id <run-id> --markdown",
|
|
28
28
|
},
|
|
29
29
|
resume: {
|
|
30
30
|
id: "resume",
|
|
31
|
-
label: "
|
|
31
|
+
label: "继续运行",
|
|
32
32
|
lane: "dag",
|
|
33
|
-
guide: "
|
|
33
|
+
guide: "只在确认这次运行还能安全接着跑时使用;不确定就先点「体检诊断」(需要走命令行)。",
|
|
34
34
|
commandHint: "loop-agent task advance <task-id> --json",
|
|
35
35
|
},
|
|
36
36
|
reconcile: {
|
|
37
37
|
id: "reconcile",
|
|
38
|
-
label: "
|
|
38
|
+
label: "核对并归档中断的运行",
|
|
39
39
|
requiresReason: true,
|
|
40
40
|
action: "dagReconcileRun",
|
|
41
41
|
lane: "dag",
|
|
42
|
-
guide: "
|
|
42
|
+
guide: "运行被中断或找不到归属时,用它把这次运行标记为「已归档」,之后才能重新发起。如果运行其实还在跑,请不要用这个动作,否则会打断它。",
|
|
43
43
|
commandHint: "loop-agent dag reconcile-run --run-id <run-id> --action supersede --reason <structured-reason>",
|
|
44
44
|
},
|
|
45
45
|
regenerate: {
|
|
46
46
|
id: "regenerate",
|
|
47
47
|
label: "重新生成契约/计划",
|
|
48
48
|
lane: "dag",
|
|
49
|
-
guide: "
|
|
49
|
+
guide: "任务契约或计划已经过期时用:回任务页重新生成,或走命令行重跑一次 task advance。本页只是提示,按钮在任务页。",
|
|
50
50
|
commandHint: "loop-agent task advance <task-id> --json",
|
|
51
51
|
},
|
|
52
52
|
observeLink: {
|
|
@@ -54,16 +54,16 @@ const CTA = {
|
|
|
54
54
|
label: "全屏观测",
|
|
55
55
|
action: "observeLink",
|
|
56
56
|
lane: "dag",
|
|
57
|
-
guide: "
|
|
57
|
+
guide: "打开完整的过程视图;顶栏可以回到操作台。",
|
|
58
58
|
commandHint: "agent-worker console --repo . --port 8790",
|
|
59
59
|
},
|
|
60
60
|
dagRerun: {
|
|
61
61
|
id: "dagRerun",
|
|
62
|
-
label: "
|
|
62
|
+
label: "从失败节点继续",
|
|
63
63
|
requiresReason: true,
|
|
64
64
|
action: "dagRerun",
|
|
65
65
|
lane: "dag",
|
|
66
|
-
guide: "
|
|
66
|
+
guide: "失败原因跟代码无关时(模型服务报错、网络、限流、超时)首选这个:系统会先判断哪些步骤可以安全跳过,再从出错前的那一步接着跑,不用从头再来,也不需要人工审批。以下几种情况不能这样跑:这次运行是 Worker 队列发起的、仓库或程序版本在这次运行后被改过、或者后续步骤里有会执行命令的验证环节——遇到这些请改用「带反馈重新执行任务」。",
|
|
67
67
|
commandHint: "loop-agent dag rerun --run-id <run-id> --from-node <node-id> --plan",
|
|
68
68
|
},
|
|
69
69
|
standaloneTaskRerun: {
|
|
@@ -72,7 +72,7 @@ const CTA = {
|
|
|
72
72
|
requiresReason: true,
|
|
73
73
|
action: "standaloneTaskRerun",
|
|
74
74
|
lane: "dag",
|
|
75
|
-
guide: "
|
|
75
|
+
guide: "不能从中间某一步接着跑时用这个:会把整个任务从头重新执行一遍,并自动带上上一轮还没解决的验证/评审意见,不用人工审批。如果没有可以继承的意见,会明确告诉你。注意:Worker 队列发起的任务请用下方「重新排队 Worker Task」。",
|
|
76
76
|
commandHint: "loop-agent dag rerun-task --run-id <run-id> --reason <text> --json",
|
|
77
77
|
},
|
|
78
78
|
workerTaskRetry: {
|
|
@@ -81,7 +81,7 @@ const CTA = {
|
|
|
81
81
|
requiresReason: true,
|
|
82
82
|
action: "workerTaskRetry",
|
|
83
83
|
lane: "worker",
|
|
84
|
-
guide: "
|
|
84
|
+
guide: "只用于 Worker 队列里失败的任务:服务端会先确认它确实处于失败状态再重新入队,不需要人工审批。不要和上面的「带反馈重新执行任务」混用。",
|
|
85
85
|
commandHint: "agent-worker task retry <task-id> --feature-id <feature-id> --repo . --reason <reason>",
|
|
86
86
|
},
|
|
87
87
|
interrupt: {
|
|
@@ -90,7 +90,7 @@ const CTA = {
|
|
|
90
90
|
requiresReason: true,
|
|
91
91
|
action: "dagRequestInterrupt",
|
|
92
92
|
lane: "dag",
|
|
93
|
-
guide: "
|
|
93
|
+
guide: "只对这台 Console 正在跑的运行有效:提交后需要你在浏览器里确认一次,然后等当前步骤安全跑完,不会立刻杀掉进程。",
|
|
94
94
|
commandHint: "loop-agent dag request-interrupt --run-id <run-id> --reason-code operator-request --reason <structured-reason>",
|
|
95
95
|
},
|
|
96
96
|
};
|
|
@@ -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-C_iWJhkT.js";import{p as f}from"./chunk-JWPE2WC7-D4Ee6DmP.js";import{_ as n,l as o}from"./mermaid.core-C0HdXtOf.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-B4Rm5gnR.js";import"./index-CJh6pVLm.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-C0HdXtOf.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};
|