@tom2012/cc-web 2026.6.17-a → 2026.9.6-b
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.json +92 -20
- package/backend/dist/adapters/claude-adapter.d.ts +4 -0
- package/backend/dist/adapters/claude-adapter.d.ts.map +1 -1
- package/backend/dist/adapters/claude-adapter.js +18 -2
- package/backend/dist/adapters/claude-adapter.js.map +1 -1
- package/backend/dist/adapters/types.d.ts +8 -0
- package/backend/dist/adapters/types.d.ts.map +1 -1
- package/backend/dist/auth.d.ts.map +0 -0
- package/backend/dist/config.d.ts +0 -0
- package/backend/dist/config.js +0 -0
- package/backend/dist/config.js.map +0 -0
- package/backend/dist/hooks-manager.d.ts.map +1 -1
- package/backend/dist/hooks-manager.js +19 -3
- package/backend/dist/hooks-manager.js.map +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +53 -1
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/auth.d.ts +0 -0
- package/backend/dist/routes/auth.d.ts.map +0 -0
- package/backend/dist/routes/auth.js.map +0 -0
- package/backend/dist/routes/projects.d.ts.map +0 -0
- package/backend/dist/routes/projects.js.map +0 -0
- package/backend/dist/session-manager.d.ts +0 -0
- package/backend/dist/session-manager.d.ts.map +0 -0
- package/backend/dist/session-manager.js +0 -0
- package/backend/dist/session-manager.js.map +0 -0
- package/backend/dist/terminal-manager.d.ts +10 -1
- package/backend/dist/terminal-manager.d.ts.map +1 -1
- package/backend/dist/terminal-manager.js +19 -2
- package/backend/dist/terminal-manager.js.map +1 -1
- package/backend/dist/types.d.ts +0 -0
- package/backend/dist/types.d.ts.map +0 -0
- package/backend/dist/types.js +0 -0
- package/backend/dist/types.js.map +0 -0
- package/bin/ccweb.js +1 -2
- package/frontend/dist/assets/{ChatOverlay-Jcso3jnE.js → ChatOverlay-BoPckOLq.js} +1 -1
- package/frontend/dist/assets/{ClaudeMemPage-egGwexFX.js → ClaudeMemPage-CeaZSvKE.js} +1 -1
- package/frontend/dist/assets/{GraphPreview-CYBEhXG-.js → GraphPreview-Ch6KZFsK.js} +2 -2
- package/frontend/dist/assets/{MobilePage-tc43L2Lz.js → MobilePage-JiqI8CSK.js} +3 -3
- package/frontend/dist/assets/NotebookPage-Ci_tsAYM.js +13 -0
- package/frontend/dist/assets/{OfficePreview-DtFr2tIA.js → OfficePreview-76Lw49uc.js} +2 -2
- package/frontend/dist/assets/{PdfPreview-jE4EtPVP.js → PdfPreview-DEsqK0ec.js} +1 -1
- package/frontend/dist/assets/{ProjectPage-BURCf2Do.js → ProjectPage-v7j0VJzB.js} +5 -5
- package/frontend/dist/assets/{ProjectSettingsPage-BSS5ICpz.js → ProjectSettingsPage-BlxBcXB4.js} +1 -1
- package/frontend/dist/assets/{SettingsPage-Bg1PltuQ.js → SettingsPage-eRuTffii.js} +1 -1
- package/frontend/dist/assets/{SkillHubPage-Dkfphglo.js → SkillHubPage-DTTbUlQD.js} +1 -1
- package/frontend/dist/assets/{check-circle-2-D4xZVklI.js → check-circle-2-CuGGbYqq.js} +1 -1
- package/frontend/dist/assets/{chevron-down-Bzyofau8.js → chevron-down-DqJlk-z-.js} +1 -1
- package/frontend/dist/assets/chevron-left-ADs1oMLf.js +7 -0
- package/frontend/dist/assets/{file-text-eaaujWBr.js → file-text-0i5NEvQ3.js} +1 -1
- package/frontend/dist/assets/{index-BRZSUCNz.js → index-BcTWKUVp.js} +1 -1
- package/frontend/dist/assets/{index-BXMeGbDt.js → index-BicNGyh6.js} +1 -1
- package/frontend/dist/assets/{index-BN_T0UV9.js → index-Bni5vqf8.js} +1 -1
- package/frontend/dist/assets/index-BpdaJxoa.css +1 -0
- package/frontend/dist/assets/{index-DXjluyd1.js → index-D5jbTY4Z.js} +3 -3
- package/frontend/dist/assets/{jszip.min-DPhtdqr8.js → jszip.min-CXhYhQvA.js} +1 -1
- package/frontend/dist/assets/{save-B8Uv2Egn.js → save-BFBfbWoK.js} +1 -1
- package/frontend/dist/assets/{search-Duax5rfs.js → search-DUINGkQd.js} +1 -1
- package/frontend/dist/assets/{select-CbDg1CtL.js → select-DxHj2qKT.js} +1 -1
- package/frontend/dist/assets/{tabs-8Bm08Uka.js → tabs-6zanHiRL.js} +1 -1
- package/frontend/dist/assets/{textarea-CpK1BCh-.js → textarea-DdVP5OsI.js} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +36 -10
- package/backend/dist/backup/config.d.ts +0 -10
- package/backend/dist/backup/config.d.ts.map +0 -1
- package/backend/dist/backup/config.js +0 -128
- package/backend/dist/backup/config.js.map +0 -1
- package/backend/dist/backup/engine.d.ts +0 -22
- package/backend/dist/backup/engine.d.ts.map +0 -1
- package/backend/dist/backup/engine.js +0 -298
- package/backend/dist/backup/engine.js.map +0 -1
- package/backend/dist/backup/providers/dropbox.d.ts +0 -25
- package/backend/dist/backup/providers/dropbox.d.ts.map +0 -1
- package/backend/dist/backup/providers/dropbox.js +0 -320
- package/backend/dist/backup/providers/dropbox.js.map +0 -1
- package/backend/dist/backup/providers/google-drive.d.ts +0 -29
- package/backend/dist/backup/providers/google-drive.d.ts.map +0 -1
- package/backend/dist/backup/providers/google-drive.js +0 -303
- package/backend/dist/backup/providers/google-drive.js.map +0 -1
- package/backend/dist/backup/providers/index.d.ts +0 -3
- package/backend/dist/backup/providers/index.d.ts.map +0 -1
- package/backend/dist/backup/providers/index.js +0 -19
- package/backend/dist/backup/providers/index.js.map +0 -1
- package/backend/dist/backup/providers/onedrive.d.ts +0 -29
- package/backend/dist/backup/providers/onedrive.d.ts.map +0 -1
- package/backend/dist/backup/providers/onedrive.js +0 -317
- package/backend/dist/backup/providers/onedrive.js.map +0 -1
- package/backend/dist/backup/scheduler.d.ts +0 -6
- package/backend/dist/backup/scheduler.d.ts.map +0 -1
- package/backend/dist/backup/scheduler.js +0 -55
- package/backend/dist/backup/scheduler.js.map +0 -1
- package/backend/dist/backup/types.d.ts +0 -73
- package/backend/dist/backup/types.d.ts.map +0 -1
- package/backend/dist/backup/types.js +0 -4
- package/backend/dist/backup/types.js.map +0 -1
- package/backend/dist/chat-process-manager.d.ts +0 -45
- package/backend/dist/chat-process-manager.d.ts.map +0 -1
- package/backend/dist/chat-process-manager.js +0 -258
- package/backend/dist/chat-process-manager.js.map +0 -1
- package/backend/dist/flows/runner.d.ts +0 -37
- package/backend/dist/flows/runner.d.ts.map +0 -1
- package/backend/dist/flows/runner.js +0 -660
- package/backend/dist/flows/runner.js.map +0 -1
- package/backend/dist/flows/store.d.ts +0 -40
- package/backend/dist/flows/store.d.ts.map +0 -1
- package/backend/dist/flows/store.js +0 -284
- package/backend/dist/flows/store.js.map +0 -1
- package/backend/dist/flows/types.d.ts +0 -176
- package/backend/dist/flows/types.d.ts.map +0 -1
- package/backend/dist/flows/types.js +0 -25
- package/backend/dist/flows/types.js.map +0 -1
- package/backend/dist/information/condenser.d.ts +0 -12
- package/backend/dist/information/condenser.d.ts.map +0 -1
- package/backend/dist/information/condenser.js +0 -568
- package/backend/dist/information/condenser.js.map +0 -1
- package/backend/dist/information/conversation-sync.d.ts +0 -22
- package/backend/dist/information/conversation-sync.d.ts.map +0 -1
- package/backend/dist/information/conversation-sync.js +0 -500
- package/backend/dist/information/conversation-sync.js.map +0 -1
- package/backend/dist/information/types.d.ts +0 -36
- package/backend/dist/information/types.d.ts.map +0 -1
- package/backend/dist/information/types.js +0 -4
- package/backend/dist/information/types.js.map +0 -1
- package/backend/dist/memory-pool/buoyancy.d.ts +0 -2
- package/backend/dist/memory-pool/buoyancy.d.ts.map +0 -1
- package/backend/dist/memory-pool/buoyancy.js +0 -12
- package/backend/dist/memory-pool/buoyancy.js.map +0 -1
- package/backend/dist/memory-pool/global-pool-manager.d.ts +0 -12
- package/backend/dist/memory-pool/global-pool-manager.d.ts.map +0 -1
- package/backend/dist/memory-pool/global-pool-manager.js +0 -295
- package/backend/dist/memory-pool/global-pool-manager.js.map +0 -1
- package/backend/dist/memory-pool/pool-lock.d.ts +0 -2
- package/backend/dist/memory-pool/pool-lock.d.ts.map +0 -1
- package/backend/dist/memory-pool/pool-lock.js +0 -31
- package/backend/dist/memory-pool/pool-lock.js.map +0 -1
- package/backend/dist/memory-pool/pool-manager.d.ts +0 -57
- package/backend/dist/memory-pool/pool-manager.d.ts.map +0 -1
- package/backend/dist/memory-pool/pool-manager.js +0 -322
- package/backend/dist/memory-pool/pool-manager.js.map +0 -1
- package/backend/dist/memory-pool/templates.d.ts +0 -5
- package/backend/dist/memory-pool/templates.d.ts.map +0 -1
- package/backend/dist/memory-pool/templates.js +0 -234
- package/backend/dist/memory-pool/templates.js.map +0 -1
- package/backend/dist/memory-pool/types.d.ts +0 -61
- package/backend/dist/memory-pool/types.d.ts.map +0 -1
- package/backend/dist/memory-pool/types.js +0 -4
- package/backend/dist/memory-pool/types.js.map +0 -1
- package/backend/dist/plan-control/checker.d.ts +0 -3
- package/backend/dist/plan-control/checker.d.ts.map +0 -1
- package/backend/dist/plan-control/checker.js +0 -103
- package/backend/dist/plan-control/checker.js.map +0 -1
- package/backend/dist/plan-control/executor.d.ts +0 -93
- package/backend/dist/plan-control/executor.d.ts.map +0 -1
- package/backend/dist/plan-control/executor.js +0 -955
- package/backend/dist/plan-control/executor.js.map +0 -1
- package/backend/dist/plan-control/parser.d.ts +0 -12
- package/backend/dist/plan-control/parser.d.ts.map +0 -1
- package/backend/dist/plan-control/parser.js +0 -216
- package/backend/dist/plan-control/parser.js.map +0 -1
- package/backend/dist/plan-control/templates.d.ts +0 -4
- package/backend/dist/plan-control/templates.d.ts.map +0 -1
- package/backend/dist/plan-control/templates.js +0 -271
- package/backend/dist/plan-control/templates.js.map +0 -1
- package/backend/dist/plan-control/types.d.ts +0 -102
- package/backend/dist/plan-control/types.d.ts.map +0 -1
- package/backend/dist/plan-control/types.js +0 -12
- package/backend/dist/plan-control/types.js.map +0 -1
- package/backend/dist/routes/backup.d.ts +0 -4
- package/backend/dist/routes/backup.d.ts.map +0 -1
- package/backend/dist/routes/backup.js +0 -274
- package/backend/dist/routes/backup.js.map +0 -1
- package/backend/dist/routes/flows.d.ts +0 -5
- package/backend/dist/routes/flows.d.ts.map +0 -1
- package/backend/dist/routes/flows.js +0 -457
- package/backend/dist/routes/flows.js.map +0 -1
- package/backend/dist/routes/global-flows.d.ts +0 -3
- package/backend/dist/routes/global-flows.d.ts.map +0 -1
- package/backend/dist/routes/global-flows.js +0 -90
- package/backend/dist/routes/global-flows.js.map +0 -1
- package/backend/dist/routes/information.d.ts +0 -3
- package/backend/dist/routes/information.d.ts.map +0 -1
- package/backend/dist/routes/information.js +0 -159
- package/backend/dist/routes/information.js.map +0 -1
- package/backend/dist/routes/memory-pool.d.ts +0 -3
- package/backend/dist/routes/memory-pool.d.ts.map +0 -1
- package/backend/dist/routes/memory-pool.js +0 -837
- package/backend/dist/routes/memory-pool.js.map +0 -1
- package/backend/dist/routes/plan-control.d.ts +0 -15
- package/backend/dist/routes/plan-control.d.ts.map +0 -1
- package/backend/dist/routes/plan-control.js +0 -337
- package/backend/dist/routes/plan-control.js.map +0 -1
- package/backend/dist/routes/share.d.ts +0 -3
- package/backend/dist/routes/share.d.ts.map +0 -1
- package/backend/dist/routes/share.js +0 -167
- package/backend/dist/routes/share.js.map +0 -1
- package/backend/dist/routes/sounds.d.ts +0 -3
- package/backend/dist/routes/sounds.d.ts.map +0 -1
- package/backend/dist/routes/sounds.js +0 -285
- package/backend/dist/routes/sounds.js.map +0 -1
- package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts +0 -24
- package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts.map +0 -1
- package/backend/dist/tracks/__tests__/verify-starter-templates.js +0 -175
- package/backend/dist/tracks/__tests__/verify-starter-templates.js.map +0 -1
- package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts +0 -23
- package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts.map +0 -1
- package/backend/dist/tracks/__tests__/verify-track-cancel.js +0 -153
- package/backend/dist/tracks/__tests__/verify-track-cancel.js.map +0 -1
- package/backend/dist/tracks/__tests__/verify-track-t1.d.ts +0 -11
- package/backend/dist/tracks/__tests__/verify-track-t1.d.ts.map +0 -1
- package/backend/dist/tracks/__tests__/verify-track-t1.js +0 -293
- package/backend/dist/tracks/__tests__/verify-track-t1.js.map +0 -1
- package/backend/dist/tracks/__tests__/verify-track.d.ts +0 -20
- package/backend/dist/tracks/__tests__/verify-track.d.ts.map +0 -1
- package/backend/dist/tracks/__tests__/verify-track.js +0 -187
- package/backend/dist/tracks/__tests__/verify-track.js.map +0 -1
- package/backend/dist/tracks/registry.d.ts +0 -61
- package/backend/dist/tracks/registry.d.ts.map +0 -1
- package/backend/dist/tracks/registry.js +0 -202
- package/backend/dist/tracks/registry.js.map +0 -1
- package/backend/dist/tracks/track-runner.d.ts +0 -69
- package/backend/dist/tracks/track-runner.d.ts.map +0 -1
- package/backend/dist/tracks/track-runner.js +0 -158
- package/backend/dist/tracks/track-runner.js.map +0 -1
- package/backend/dist/tracks/train-loader.d.ts +0 -44
- package/backend/dist/tracks/train-loader.d.ts.map +0 -1
- package/backend/dist/tracks/train-loader.js +0 -32
- package/backend/dist/tracks/train-loader.js.map +0 -1
- package/backend/dist/tracks/types-train.d.ts +0 -12
- package/backend/dist/tracks/types-train.d.ts.map +0 -1
- package/backend/dist/tracks/types-train.js +0 -13
- package/backend/dist/tracks/types-train.js.map +0 -1
- package/backend/dist/usage-terminal.d.ts +0 -18
- package/backend/dist/usage-terminal.d.ts.map +0 -1
- package/backend/dist/usage-terminal.js +0 -191
- package/backend/dist/usage-terminal.js.map +0 -1
- package/frontend/dist/assets/NotebookPage-Dy1fFqcp.js +0 -13
- package/frontend/dist/assets/index-CgRMBOJu.css +0 -1
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* T0 verification script for the Track subsystem.
|
|
4
|
-
*
|
|
5
|
-
* NOT a vitest/jest test — ccweb backend has no test framework yet.
|
|
6
|
-
* Runs as a standalone Node script to verify end-to-end:
|
|
7
|
-
*
|
|
8
|
-
* 1. TrackRunner can load a .tr file
|
|
9
|
-
* 2. train-lang composes prompt + calls CcwebTrainAdapter
|
|
10
|
-
* 3. CcwebTrainAdapter injects prompt (capture into a mock buffer)
|
|
11
|
-
* 4. We programmatically simulate the LLM writing outputs by editing
|
|
12
|
-
* workflow_data.json + setting task_progress[].finish = true
|
|
13
|
-
* 5. WorkflowDataWatcher detects the finish signal
|
|
14
|
-
* 6. Adapter reads variables.<name> → returns FaiResult.success
|
|
15
|
-
* 7. train continues execution → main() returns
|
|
16
|
-
* 8. TrackRunner reports ok=true with the returned value
|
|
17
|
-
*
|
|
18
|
-
* Run: cd backend && npx ts-node src/tracks/__tests__/verify-track.ts
|
|
19
|
-
*/
|
|
20
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
-
if (k2 === undefined) k2 = k;
|
|
22
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
-
}
|
|
26
|
-
Object.defineProperty(o, k2, desc);
|
|
27
|
-
}) : (function(o, m, k, k2) {
|
|
28
|
-
if (k2 === undefined) k2 = k;
|
|
29
|
-
o[k2] = m[k];
|
|
30
|
-
}));
|
|
31
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
-
}) : function(o, v) {
|
|
34
|
-
o["default"] = v;
|
|
35
|
-
});
|
|
36
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
-
var ownKeys = function(o) {
|
|
38
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
-
var ar = [];
|
|
40
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
-
return ar;
|
|
42
|
-
};
|
|
43
|
-
return ownKeys(o);
|
|
44
|
-
};
|
|
45
|
-
return function (mod) {
|
|
46
|
-
if (mod && mod.__esModule) return mod;
|
|
47
|
-
var result = {};
|
|
48
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
-
__setModuleDefault(result, mod);
|
|
50
|
-
return result;
|
|
51
|
-
};
|
|
52
|
-
})();
|
|
53
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
-
const fs = __importStar(require("fs/promises"));
|
|
55
|
-
const os = __importStar(require("os"));
|
|
56
|
-
const path = __importStar(require("path"));
|
|
57
|
-
const __1 = require("..");
|
|
58
|
-
let failed = 0;
|
|
59
|
-
function check(name, cond, msg) {
|
|
60
|
-
if (cond) {
|
|
61
|
-
console.log(` ✓ ${name}`);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
failed++;
|
|
65
|
-
console.error(` ✗ ${name}${msg ? ': ' + msg : ''}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const DEMO_TR = `
|
|
69
|
-
fai analyze(file_path: string, prompt: prompt) -> rating: int 0-10, comment: string maxLen=500 { }
|
|
70
|
-
|
|
71
|
-
func main(input_path: string) -> string {
|
|
72
|
-
let r = analyze(input_path, "评分 0-10")
|
|
73
|
-
return r.comment
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export main
|
|
77
|
-
`;
|
|
78
|
-
async function readWf(p) {
|
|
79
|
-
const text = await fs.readFile(p, 'utf8');
|
|
80
|
-
return JSON.parse(text);
|
|
81
|
-
}
|
|
82
|
-
async function writeWf(p, w) {
|
|
83
|
-
await fs.writeFile(p, JSON.stringify(w, null, 2), 'utf8');
|
|
84
|
-
}
|
|
85
|
-
async function main() {
|
|
86
|
-
console.log('=== Track T0 verification ===\n');
|
|
87
|
-
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ccweb-track-t0-'));
|
|
88
|
-
console.log(`tmpDir = ${tmpDir}`);
|
|
89
|
-
const trackPath = path.join(tmpDir, 'demo.tr');
|
|
90
|
-
const wfPath = path.join(tmpDir, 'workflow_data.json');
|
|
91
|
-
await fs.writeFile(trackPath, DEMO_TR, 'utf8');
|
|
92
|
-
await writeWf(wfPath, {
|
|
93
|
-
constants: {},
|
|
94
|
-
variables: {},
|
|
95
|
-
task_progress: [],
|
|
96
|
-
});
|
|
97
|
-
const watcher = (0, __1.createWorkflowDataWatcher)(wfPath);
|
|
98
|
-
// Capture prompts injected by adapter
|
|
99
|
-
const promptsInjected = [];
|
|
100
|
-
// Mock injector: instead of writing to a PTY, it parses the
|
|
101
|
-
// [Required outputs] section from the prompt, fabricates legal
|
|
102
|
-
// values, and writes them to workflow_data.json after a short
|
|
103
|
-
// delay (simulating LLM round-trip latency).
|
|
104
|
-
const injector = async (text) => {
|
|
105
|
-
promptsInjected.push(text);
|
|
106
|
-
// Extract taskIndex from the ccweb header (first 3 lines)
|
|
107
|
-
const m = text.match(/taskIndex = (\d+)/);
|
|
108
|
-
if (!m)
|
|
109
|
-
throw new Error('no taskIndex in prompt — adapter contract broken');
|
|
110
|
-
const taskIndex = Number(m[1]);
|
|
111
|
-
// Simulate LLM writing outputs after 30ms
|
|
112
|
-
setTimeout(async () => {
|
|
113
|
-
const wf = await readWf(wfPath);
|
|
114
|
-
// Pretend the LLM gave rating=8 + comment="OK"
|
|
115
|
-
wf.variables.rating = 8;
|
|
116
|
-
wf.variables.comment = 'OK';
|
|
117
|
-
wf.task_progress.push({
|
|
118
|
-
nodeId: taskIndex,
|
|
119
|
-
name: 'analyze',
|
|
120
|
-
finish: true,
|
|
121
|
-
startedAt: Date.now() - 10,
|
|
122
|
-
finishedAt: Date.now(),
|
|
123
|
-
});
|
|
124
|
-
await writeWf(wfPath, wf);
|
|
125
|
-
}, 30);
|
|
126
|
-
};
|
|
127
|
-
const runner = (0, __1.createTrackRunner)({
|
|
128
|
-
projectId: 'demo-proj',
|
|
129
|
-
injector,
|
|
130
|
-
watcher,
|
|
131
|
-
maxFaiAttempts: 2,
|
|
132
|
-
defaultFaiTimeoutMs: 5000,
|
|
133
|
-
});
|
|
134
|
-
const result = await runner.run(trackPath, ['src/foo.ts']);
|
|
135
|
-
// Assertions
|
|
136
|
-
check('result.ok is true', result.ok, JSON.stringify(result.error));
|
|
137
|
-
check('result.value is the LLM-supplied comment ("OK")', result.value === 'OK', `got: ${JSON.stringify(result.value)}`);
|
|
138
|
-
check('injector called exactly once', promptsInjected.length === 1);
|
|
139
|
-
check('prompt contains writeProtocolHint marker', promptsInjected[0]?.includes('[Write outputs to .ccweb/workflow_data.json') ?? false);
|
|
140
|
-
check('prompt does NOT contain stale train default hint', !(promptsInjected[0]?.includes('stack[<callId>]') ?? false));
|
|
141
|
-
check('prompt contains ccweb track context header (taskIndex)', promptsInjected[0]?.includes('taskIndex = ') ?? false);
|
|
142
|
-
check('final workflow_data.task_progress has 1 finished entry', (await readWf(wfPath)).task_progress.length === 1);
|
|
143
|
-
// Verify cancellation path
|
|
144
|
-
console.log('\n--- cancellation path ---');
|
|
145
|
-
await writeWf(wfPath, {
|
|
146
|
-
constants: {},
|
|
147
|
-
variables: {},
|
|
148
|
-
task_progress: [],
|
|
149
|
-
});
|
|
150
|
-
// Use an injector that never resolves the finish signal
|
|
151
|
-
const slowPromptsInjected = [];
|
|
152
|
-
const slowInjector = async (text) => {
|
|
153
|
-
slowPromptsInjected.push(text);
|
|
154
|
-
// Don't write anything — simulate LLM hung
|
|
155
|
-
};
|
|
156
|
-
const watcher2 = (0, __1.createWorkflowDataWatcher)(wfPath);
|
|
157
|
-
const cancelRunner = (0, __1.createTrackRunner)({
|
|
158
|
-
projectId: 'demo-proj',
|
|
159
|
-
injector: slowInjector,
|
|
160
|
-
watcher: watcher2,
|
|
161
|
-
maxFaiAttempts: 1,
|
|
162
|
-
defaultFaiTimeoutMs: 60000, // long timeout — we'll cancel before this
|
|
163
|
-
});
|
|
164
|
-
// Cancel after 100ms
|
|
165
|
-
const cancelTimer = setTimeout(() => cancelRunner.cancel(), 100);
|
|
166
|
-
const cancelResult = await cancelRunner.run(trackPath, ['src/foo.ts']);
|
|
167
|
-
clearTimeout(cancelTimer);
|
|
168
|
-
check('cancel: ok is false', !cancelResult.ok);
|
|
169
|
-
check('cancel: error is UserCancelError-like', /cancel/i.test(cancelResult.error?.errorType ?? '') ||
|
|
170
|
-
/cancel/i.test(cancelResult.error?.message ?? ''), `got: ${JSON.stringify(cancelResult.error)}`);
|
|
171
|
-
// Verify writeProtocolHint factory shape (smoke test)
|
|
172
|
-
console.log('\n--- buildCcwebWriteProtocolHint shape ---');
|
|
173
|
-
const hint = (0, __1.buildCcwebWriteProtocolHint)();
|
|
174
|
-
check('hint mentions workflow_data.json', hint.includes('workflow_data.json'));
|
|
175
|
-
check('hint mentions variables', hint.includes('variables.<name>'));
|
|
176
|
-
check('hint mentions task_progress', hint.includes('task_progress'));
|
|
177
|
-
check('hint mentions finish: true', hint.includes('finish: true'));
|
|
178
|
-
// Cleanup
|
|
179
|
-
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
180
|
-
console.log(`\n${failed === 0 ? '✅ ALL CHECKS PASSED' : `❌ ${failed} CHECK(S) FAILED`}`);
|
|
181
|
-
process.exit(failed === 0 ? 0 : 1);
|
|
182
|
-
}
|
|
183
|
-
main().catch((e) => {
|
|
184
|
-
console.error('verify-track crashed:', e);
|
|
185
|
-
process.exit(2);
|
|
186
|
-
});
|
|
187
|
-
//# sourceMappingURL=verify-track.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-track.js","sourceRoot":"","sources":["../../../src/tracks/__tests__/verify-track.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TrackRunnerRegistry — per-project TrackRunner accounting.
|
|
3
|
-
*
|
|
4
|
-
* Singleton owned by backend/src/index.ts. Wraps creation of a runner
|
|
5
|
-
* (with the project's PTY injector + workflow_data path) and exposes
|
|
6
|
-
* lifecycle calls used by the HTTP route handlers.
|
|
7
|
-
*
|
|
8
|
-
* One project can have at most one in-flight track run; starting a
|
|
9
|
-
* new one while another is running rejects with 'busy'.
|
|
10
|
-
*/
|
|
11
|
-
import { type AskUserFieldSpec } from './ask-user-bridge';
|
|
12
|
-
import type { TrackRunState } from './types';
|
|
13
|
-
export interface TrackRegistryDeps {
|
|
14
|
-
/** Look up the absolute project folder path by projectId. */
|
|
15
|
-
getProjectFolder: (projectId: string) => string | null;
|
|
16
|
-
/** Inject text into the project's active CLI PTY. */
|
|
17
|
-
injectIntoPty: (projectId: string, text: string) => Promise<void> | void;
|
|
18
|
-
/** Push a JSON message to all WS clients subscribed to this project. */
|
|
19
|
-
broadcast: (projectId: string, message: Record<string, unknown>) => void;
|
|
20
|
-
/** Pino-compatible logger. */
|
|
21
|
-
logger?: {
|
|
22
|
-
debug?: PinoLogFn;
|
|
23
|
-
info?: PinoLogFn;
|
|
24
|
-
warn?: PinoLogFn;
|
|
25
|
-
error?: PinoLogFn;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
interface PinoLogFn {
|
|
29
|
-
(obj: object, msg?: string): void;
|
|
30
|
-
(msg: string, ...args: unknown[]): void;
|
|
31
|
-
}
|
|
32
|
-
export interface TrackRegistry {
|
|
33
|
-
/** Start a track run. */
|
|
34
|
-
start(projectId: string, absTrackPath: string, trackFilename: string, args?: unknown[]): Promise<{
|
|
35
|
-
ok: true;
|
|
36
|
-
runId: string;
|
|
37
|
-
} | {
|
|
38
|
-
ok: false;
|
|
39
|
-
reason: string;
|
|
40
|
-
}>;
|
|
41
|
-
/** Cancel the in-flight run for a project. */
|
|
42
|
-
abort(projectId: string): boolean;
|
|
43
|
-
/** Submit user input for a pending ask_user request. */
|
|
44
|
-
submitInput(projectId: string, requestId: string, data: Record<string, unknown>): {
|
|
45
|
-
ok: boolean;
|
|
46
|
-
message?: string;
|
|
47
|
-
};
|
|
48
|
-
/** Get the latest state for a project (running or last finished). */
|
|
49
|
-
getState(projectId: string): TrackRunState | null;
|
|
50
|
-
/** True if a run is in flight (status === running or paused). */
|
|
51
|
-
isRunning(projectId: string): boolean;
|
|
52
|
-
/** Get the pending ask_user request if any. */
|
|
53
|
-
getPendingAskUser(projectId: string): {
|
|
54
|
-
runId: string;
|
|
55
|
-
requestId: string;
|
|
56
|
-
fields: AskUserFieldSpec[];
|
|
57
|
-
} | null;
|
|
58
|
-
}
|
|
59
|
-
export declare function createTrackRegistry(deps: TrackRegistryDeps): TrackRegistry;
|
|
60
|
-
export {};
|
|
61
|
-
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tracks/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAA2C,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAClG,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,SAAS,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACtD,qDAAqD;IACrD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxE,wEAAwE;IACxE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACxE,8BAA8B;IAC9B,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,SAAS,CAAA;QACjB,IAAI,CAAC,EAAE,SAAS,CAAA;QAChB,IAAI,CAAC,EAAE,SAAS,CAAA;QAChB,KAAK,CAAC,EAAE,SAAS,CAAA;KAClB,CAAA;CACF;AAMD,UAAU,SAAS;IACjB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACxC;AAkBD,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,EAAE,GACf,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEvE,8CAA8C;IAC9C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAEjC,wDAAwD;IACxD,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAEpC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAA;IAEjD,iEAAiE;IACjE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAErC,+CAA+C;IAC/C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;QACpC,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,gBAAgB,EAAE,CAAA;KAC3B,GAAG,IAAI,CAAA;CACT;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAoK1E"}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* TrackRunnerRegistry — per-project TrackRunner accounting.
|
|
4
|
-
*
|
|
5
|
-
* Singleton owned by backend/src/index.ts. Wraps creation of a runner
|
|
6
|
-
* (with the project's PTY injector + workflow_data path) and exposes
|
|
7
|
-
* lifecycle calls used by the HTTP route handlers.
|
|
8
|
-
*
|
|
9
|
-
* One project can have at most one in-flight track run; starting a
|
|
10
|
-
* new one while another is running rejects with 'busy'.
|
|
11
|
-
*/
|
|
12
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
-
}
|
|
18
|
-
Object.defineProperty(o, k2, desc);
|
|
19
|
-
}) : (function(o, m, k, k2) {
|
|
20
|
-
if (k2 === undefined) k2 = k;
|
|
21
|
-
o[k2] = m[k];
|
|
22
|
-
}));
|
|
23
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
-
}) : function(o, v) {
|
|
26
|
-
o["default"] = v;
|
|
27
|
-
});
|
|
28
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
-
var ownKeys = function(o) {
|
|
30
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
-
var ar = [];
|
|
32
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
-
return ar;
|
|
34
|
-
};
|
|
35
|
-
return ownKeys(o);
|
|
36
|
-
};
|
|
37
|
-
return function (mod) {
|
|
38
|
-
if (mod && mod.__esModule) return mod;
|
|
39
|
-
var result = {};
|
|
40
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
-
__setModuleDefault(result, mod);
|
|
42
|
-
return result;
|
|
43
|
-
};
|
|
44
|
-
})();
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.createTrackRegistry = createTrackRegistry;
|
|
47
|
-
const path = __importStar(require("path"));
|
|
48
|
-
const track_runner_1 = require("./track-runner");
|
|
49
|
-
const workflow_data_watcher_1 = require("./workflow-data-watcher");
|
|
50
|
-
const ask_user_bridge_1 = require("./ask-user-bridge");
|
|
51
|
-
function createTrackRegistry(deps) {
|
|
52
|
-
const projects = new Map();
|
|
53
|
-
function emit(projectId, kind, payload) {
|
|
54
|
-
deps.broadcast(projectId, { type: kind, ...payload });
|
|
55
|
-
}
|
|
56
|
-
return {
|
|
57
|
-
async start(projectId, absTrackPath, trackFilename, args = []) {
|
|
58
|
-
// Synchronous in-flight gate — set BEFORE any await to close the
|
|
59
|
-
// race window between two concurrent start() calls.
|
|
60
|
-
const existing = projects.get(projectId);
|
|
61
|
-
if (existing && (existing.inFlight || existing.lastState?.status === 'running')) {
|
|
62
|
-
return { ok: false, reason: 'a track is already running for this project' };
|
|
63
|
-
}
|
|
64
|
-
const projectFolder = deps.getProjectFolder(projectId);
|
|
65
|
-
if (!projectFolder) {
|
|
66
|
-
return { ok: false, reason: 'project not found' };
|
|
67
|
-
}
|
|
68
|
-
const runId = `track-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
69
|
-
const workflowDataPath = path.join(projectFolder, '.ccweb', 'workflow_data.json');
|
|
70
|
-
const watcher = (0, workflow_data_watcher_1.createWorkflowDataWatcher)(workflowDataPath);
|
|
71
|
-
const bridge = (0, ask_user_bridge_1.createAskUserBridge)((event) => {
|
|
72
|
-
emit(projectId, 'track_ask_user', event);
|
|
73
|
-
});
|
|
74
|
-
const runner = (0, track_runner_1.createTrackRunner)({
|
|
75
|
-
projectId,
|
|
76
|
-
injector: (text) => deps.injectIntoPty(projectId, text),
|
|
77
|
-
watcher,
|
|
78
|
-
logger: deps.logger,
|
|
79
|
-
askUserBridge: bridge,
|
|
80
|
-
// Pin the runner's runId to the one registry hands out, so
|
|
81
|
-
// bridge.pending keys, registry.entry.runId, the runId returned
|
|
82
|
-
// to the route, and state.runId all match. Pre-fix mismatch
|
|
83
|
-
// made getPendingAskUser/submitInput/cancelAllForRun no-ops
|
|
84
|
-
// since they looked up the wrong key.
|
|
85
|
-
runId,
|
|
86
|
-
onState: (state) => {
|
|
87
|
-
// Ignore late callbacks from a previous run — only the run
|
|
88
|
-
// whose runId matches the entry's current runId is allowed
|
|
89
|
-
// to overwrite lastState. (Defense against runner finishing
|
|
90
|
-
// after the entry has been replaced.)
|
|
91
|
-
const e = projects.get(projectId);
|
|
92
|
-
if (!e || e.runId !== runId)
|
|
93
|
-
return;
|
|
94
|
-
e.lastState = state;
|
|
95
|
-
emit(projectId, 'track_status_change', {
|
|
96
|
-
state: state,
|
|
97
|
-
});
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
const entry = {
|
|
101
|
-
runner,
|
|
102
|
-
bridge,
|
|
103
|
-
lastState: null,
|
|
104
|
-
trackFilename,
|
|
105
|
-
inFlight: true,
|
|
106
|
-
runId,
|
|
107
|
-
};
|
|
108
|
-
projects.set(projectId, entry);
|
|
109
|
-
// Fire and forget — the run resolves later; route returns immediately.
|
|
110
|
-
//
|
|
111
|
-
// The .catch is defense-in-depth: track-runner converts its own
|
|
112
|
-
// exceptions to TrackRunResult, so .then's callback handles every
|
|
113
|
-
// expected outcome. But if track-runner ever throws (host bug, OOM,
|
|
114
|
-
// future refactor), there's no .catch to break a rejected promise
|
|
115
|
-
// chain — it escapes to logger.ts's unhandledRejection handler
|
|
116
|
-
// which process.exit(1)s the entire daemon. The .catch keeps that
|
|
117
|
-
// class of bug from killing ccweb.
|
|
118
|
-
void runner
|
|
119
|
-
.run(absTrackPath, args)
|
|
120
|
-
.then((result) => {
|
|
121
|
-
const e = projects.get(projectId);
|
|
122
|
-
if (e && e.runId === runId) {
|
|
123
|
-
e.inFlight = false;
|
|
124
|
-
}
|
|
125
|
-
deps.logger?.info?.({ projectId, runId, ok: result.ok, error: result.error }, '[TrackRegistry] run finished');
|
|
126
|
-
emit(projectId, 'track_run_complete', {
|
|
127
|
-
ok: result.ok,
|
|
128
|
-
value: result.value,
|
|
129
|
-
error: result.error,
|
|
130
|
-
});
|
|
131
|
-
})
|
|
132
|
-
.catch((err) => {
|
|
133
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
134
|
-
deps.logger?.error?.({ projectId, runId, err: message }, '[TrackRegistry] run threw — converted to failed event');
|
|
135
|
-
// Synthesize a terminal state so isRunning() returns false and
|
|
136
|
-
// the frontend's track_status_change consumers see a definite
|
|
137
|
-
// end-of-run, not a stuck 'running'. Without this, runner-level
|
|
138
|
-
// bugs that future-broke runner's NEVER-THROW contract would
|
|
139
|
-
// leave the project stuck (entry.lastState would stay null/running).
|
|
140
|
-
const e = projects.get(projectId);
|
|
141
|
-
const failedState = {
|
|
142
|
-
runId,
|
|
143
|
-
trackFilename: e?.trackFilename ?? '',
|
|
144
|
-
startedAt: e?.lastState?.startedAt ?? Date.now(),
|
|
145
|
-
status: 'failed',
|
|
146
|
-
endedAt: Date.now(),
|
|
147
|
-
error: { errorType: 'RunnerThrew', message },
|
|
148
|
-
};
|
|
149
|
-
if (e && e.runId === runId) {
|
|
150
|
-
e.inFlight = false;
|
|
151
|
-
e.lastState = failedState;
|
|
152
|
-
}
|
|
153
|
-
emit(projectId, 'track_status_change', {
|
|
154
|
-
state: failedState,
|
|
155
|
-
});
|
|
156
|
-
emit(projectId, 'track_run_complete', {
|
|
157
|
-
ok: false,
|
|
158
|
-
value: null,
|
|
159
|
-
error: { errorType: 'RunnerThrew', message },
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
return { ok: true, runId };
|
|
163
|
-
},
|
|
164
|
-
abort(projectId) {
|
|
165
|
-
const entry = projects.get(projectId);
|
|
166
|
-
if (!entry)
|
|
167
|
-
return false;
|
|
168
|
-
entry.runner.cancel();
|
|
169
|
-
entry.bridge.cancelAllForRun(entry.runId, 'aborted');
|
|
170
|
-
return true;
|
|
171
|
-
},
|
|
172
|
-
submitInput(projectId, requestId, data) {
|
|
173
|
-
const entry = projects.get(projectId);
|
|
174
|
-
if (!entry)
|
|
175
|
-
return { ok: false, message: 'no track running for project' };
|
|
176
|
-
// Pass values straight through — bridge.submitInput does per-field
|
|
177
|
-
// type validation (text/number/bool/enum).
|
|
178
|
-
return entry.bridge.submitInput(entry.runId, requestId, data);
|
|
179
|
-
},
|
|
180
|
-
getState(projectId) {
|
|
181
|
-
return projects.get(projectId)?.lastState ?? null;
|
|
182
|
-
},
|
|
183
|
-
isRunning(projectId) {
|
|
184
|
-
const entry = projects.get(projectId);
|
|
185
|
-
if (!entry)
|
|
186
|
-
return false;
|
|
187
|
-
// Window 1: inFlight true during start() pre-state phase.
|
|
188
|
-
// Window 2: lastState.status running/paused after first onState fires.
|
|
189
|
-
if (entry.inFlight)
|
|
190
|
-
return true;
|
|
191
|
-
const running = ['running', 'paused'];
|
|
192
|
-
return entry.lastState ? running.includes(entry.lastState.status) : false;
|
|
193
|
-
},
|
|
194
|
-
getPendingAskUser(projectId) {
|
|
195
|
-
const entry = projects.get(projectId);
|
|
196
|
-
if (!entry)
|
|
197
|
-
return null;
|
|
198
|
-
return entry.bridge.getPending(entry.runId);
|
|
199
|
-
},
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tracks/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TrackRunner — thin wrapper around train-lang's runFile that wires
|
|
3
|
-
* the CcwebTrainAdapter + WorkflowDataWatcher + writeProtocolHint into
|
|
4
|
-
* a single ergonomic API for the rest of the ccweb backend.
|
|
5
|
-
*
|
|
6
|
-
* Lifecycle:
|
|
7
|
-
* const runner = createTrackRunner({ ... deps ... })
|
|
8
|
-
* const result = await runner.run(absTrackPath)
|
|
9
|
-
* // result.ok / result.value / result.error
|
|
10
|
-
*
|
|
11
|
-
* Cancel mid-run: runner.cancel() → AbortController fires → train
|
|
12
|
-
* short-circuits next fai dispatch + adapter reports FaiCancelled.
|
|
13
|
-
*
|
|
14
|
-
* train-lang is ESM and ccweb backend is CommonJS, so we use a
|
|
15
|
-
* dynamic import (cached at first call). This is the standard
|
|
16
|
-
* CJS→ESM interop pattern.
|
|
17
|
-
*
|
|
18
|
-
* 详见 ~/Obsidian/Base/cc-web/工作轨重构规划.md §9 T0。
|
|
19
|
-
*/
|
|
20
|
-
import { type CcwebAdapterDeps } from './ccweb-train-adapter';
|
|
21
|
-
import type { WorkflowDataWatcher } from './workflow-data-watcher';
|
|
22
|
-
import type { TrackRunState } from './types';
|
|
23
|
-
import { type AskUserBridge } from './ask-user-bridge';
|
|
24
|
-
export interface TrackRunnerDeps {
|
|
25
|
-
projectId: string;
|
|
26
|
-
injector: CcwebAdapterDeps['injector'];
|
|
27
|
-
watcher: WorkflowDataWatcher;
|
|
28
|
-
/** Total fai attempts per call. Default 3. */
|
|
29
|
-
maxFaiAttempts?: number;
|
|
30
|
-
/** Per-fai-call timeout (ms). Default 600_000. */
|
|
31
|
-
defaultFaiTimeoutMs?: number;
|
|
32
|
-
/** Logger (pino). */
|
|
33
|
-
logger?: CcwebAdapterDeps['logger'];
|
|
34
|
-
/** Optional extra trace listener for UI progress. */
|
|
35
|
-
onState?: (state: TrackRunState) => void;
|
|
36
|
-
/**
|
|
37
|
-
* Bridge for __ccweb_ask_user builtin. When provided, .tr code can
|
|
38
|
-
* call __ccweb_ask_user({fields:[...]}) to suspend on user input.
|
|
39
|
-
* Without a bridge, the builtin is not registered; calls fail with
|
|
40
|
-
* "Undefined identifier '__ccweb_ask_user'".
|
|
41
|
-
*/
|
|
42
|
-
askUserBridge?: AskUserBridge;
|
|
43
|
-
/**
|
|
44
|
-
* Pre-allocated runId. The caller (registry) needs to know the runId
|
|
45
|
-
* synchronously before run() awaits, so it can route submitInput /
|
|
46
|
-
* getPendingAskUser to the right bridge entry. If omitted, runner
|
|
47
|
-
* generates one. Used so registry.entry.runId === bridge pending key.
|
|
48
|
-
*/
|
|
49
|
-
runId?: string;
|
|
50
|
-
}
|
|
51
|
-
export interface TrackRunResult {
|
|
52
|
-
ok: boolean;
|
|
53
|
-
value: unknown;
|
|
54
|
-
error?: {
|
|
55
|
-
errorType: string;
|
|
56
|
-
message: string;
|
|
57
|
-
code?: string;
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
export interface TrackRunner {
|
|
61
|
-
/** Run a .tr file. Resolves when the track terminates (success/fail/cancel). */
|
|
62
|
-
run(absTrackPath: string, args?: unknown[]): Promise<TrackRunResult>;
|
|
63
|
-
/** Cancel an in-flight run. */
|
|
64
|
-
cancel(): void;
|
|
65
|
-
/** Current state snapshot. */
|
|
66
|
-
getState(): TrackRunState | null;
|
|
67
|
-
}
|
|
68
|
-
export declare function createTrackRunner(deps: TrackRunnerDeps): TrackRunner;
|
|
69
|
-
//# sourceMappingURL=track-runner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"track-runner.d.ts","sourceRoot":"","sources":["../../src/tracks/track-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAA;IACtC,OAAO,EAAE,mBAAmB,CAAA;IAC5B,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,qBAAqB;IACrB,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACnC,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACxC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9D;AAyBD,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IACpE,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,8BAA8B;IAC9B,QAAQ,IAAI,aAAa,GAAG,IAAI,CAAA;CACjC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CA4IpE"}
|