@tom2012/cc-web 2026.5.18-c → 2026.5.18-e
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/README.md +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +7 -0
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/_flow-injector.d.ts +4 -0
- package/backend/dist/routes/_flow-injector.d.ts.map +1 -0
- package/backend/dist/routes/_flow-injector.js +17 -0
- package/backend/dist/routes/_flow-injector.js.map +1 -0
- package/backend/dist/routes/track-flows.d.ts +12 -0
- package/backend/dist/routes/track-flows.d.ts.map +1 -0
- package/backend/dist/routes/track-flows.js +225 -0
- package/backend/dist/routes/track-flows.js.map +1 -0
- package/backend/dist/terminal-manager-singleton.d.ts +9 -0
- package/backend/dist/terminal-manager-singleton.d.ts.map +1 -0
- package/backend/dist/terminal-manager-singleton.js +6 -0
- package/backend/dist/terminal-manager-singleton.js.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js +65 -0
- package/backend/dist/track-flow/__tests__/if-expr-evaluator.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.js +76 -0
- package/backend/dist/track-flow/__tests__/if-expr-parser.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.js +59 -0
- package/backend/dist/track-flow/__tests__/prompt-translator.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.js +54 -0
- package/backend/dist/track-flow/__tests__/run-registry.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.js +93 -0
- package/backend/dist/track-flow/__tests__/train-json-sync.test.js.map +1 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts +2 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.d.ts.map +1 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.js +177 -0
- package/backend/dist/track-flow/__tests__/verify-flow-v3.js.map +1 -0
- package/backend/dist/track-flow/audit-log.d.ts +22 -0
- package/backend/dist/track-flow/audit-log.d.ts.map +1 -0
- package/backend/dist/track-flow/audit-log.js +56 -0
- package/backend/dist/track-flow/audit-log.js.map +1 -0
- package/backend/dist/track-flow/if-expr-evaluator.d.ts +14 -0
- package/backend/dist/track-flow/if-expr-evaluator.d.ts.map +1 -0
- package/backend/dist/track-flow/if-expr-evaluator.js +73 -0
- package/backend/dist/track-flow/if-expr-evaluator.js.map +1 -0
- package/backend/dist/track-flow/if-expr-parser.d.ts +34 -0
- package/backend/dist/track-flow/if-expr-parser.d.ts.map +1 -0
- package/backend/dist/track-flow/if-expr-parser.js +176 -0
- package/backend/dist/track-flow/if-expr-parser.js.map +1 -0
- package/backend/dist/track-flow/index.d.ts +10 -0
- package/backend/dist/track-flow/index.d.ts.map +1 -0
- package/backend/dist/track-flow/index.js +26 -0
- package/backend/dist/track-flow/index.js.map +1 -0
- package/backend/dist/track-flow/llm-dispatcher.d.ts +36 -0
- package/backend/dist/track-flow/llm-dispatcher.d.ts.map +1 -0
- package/backend/dist/track-flow/llm-dispatcher.js +145 -0
- package/backend/dist/track-flow/llm-dispatcher.js.map +1 -0
- package/backend/dist/track-flow/prompt-translator.d.ts +19 -0
- package/backend/dist/track-flow/prompt-translator.d.ts.map +1 -0
- package/backend/dist/track-flow/prompt-translator.js +60 -0
- package/backend/dist/track-flow/prompt-translator.js.map +1 -0
- package/backend/dist/track-flow/run-id.d.ts +2 -0
- package/backend/dist/track-flow/run-id.d.ts.map +1 -0
- package/backend/dist/track-flow/run-id.js +7 -0
- package/backend/dist/track-flow/run-id.js.map +1 -0
- package/backend/dist/track-flow/run-registry.d.ts +77 -0
- package/backend/dist/track-flow/run-registry.d.ts.map +1 -0
- package/backend/dist/track-flow/run-registry.js +148 -0
- package/backend/dist/track-flow/run-registry.js.map +1 -0
- package/backend/dist/track-flow/runtime.d.ts +59 -0
- package/backend/dist/track-flow/runtime.d.ts.map +1 -0
- package/backend/dist/track-flow/runtime.js +204 -0
- package/backend/dist/track-flow/runtime.js.map +1 -0
- package/backend/dist/track-flow/store.d.ts +20 -0
- package/backend/dist/track-flow/store.d.ts.map +1 -0
- package/backend/dist/track-flow/store.js +158 -0
- package/backend/dist/track-flow/store.js.map +1 -0
- package/backend/dist/track-flow/train-json-sync.d.ts +31 -0
- package/backend/dist/track-flow/train-json-sync.d.ts.map +1 -0
- package/backend/dist/track-flow/train-json-sync.js +130 -0
- package/backend/dist/track-flow/train-json-sync.js.map +1 -0
- package/backend/dist/track-flow-ws.d.ts +5 -0
- package/backend/dist/track-flow-ws.d.ts.map +1 -0
- package/backend/dist/track-flow-ws.js +14 -0
- package/backend/dist/track-flow-ws.js.map +1 -0
- package/backend/package-lock.json +2071 -66
- package/backend/package.json +7 -2
- package/frontend/dist/assets/{ChatOverlay-i8gy2y-T.js → ChatOverlay-BsozN13k.js} +1 -1
- package/frontend/dist/assets/{GraphPreview-CoOHeDk0.js → GraphPreview-Bagqaatf.js} +2 -2
- package/frontend/dist/assets/{MobilePage-ZYuVSqIu.js → MobilePage-BTKA6Dxj.js} +3 -3
- package/frontend/dist/assets/{OfficePreview-BP_FVyDv.js → OfficePreview-CMRAt1Qb.js} +2 -2
- package/frontend/dist/assets/{PdfPreview-B_Is_82c.js → PdfPreview-DM7Lq8lA.js} +1 -1
- package/frontend/dist/assets/ProjectPage-3rERYJYF.js +26 -0
- package/frontend/dist/assets/ProjectPage-DFCEXprr.css +32 -0
- package/frontend/dist/assets/{SettingsPage-DlqnuIy1.js → SettingsPage-CA9PjfJR.js} +2 -2
- package/frontend/dist/assets/{SkillHubPage-FFefLcmN.js → SkillHubPage-DLt5DGX6.js} +2 -2
- package/frontend/dist/assets/{chevron-down-DqAoFpmS.js → chevron-down-D7HR2Yyz.js} +1 -1
- package/frontend/dist/assets/{index-Bj-uhUZY.js → index-fIUNz576.js} +1 -1
- package/frontend/dist/assets/{index-B5mDtgD1.js → index-k0ydgbQO.js} +7 -7
- package/frontend/dist/assets/{index-DzYZJMgp.js → index-tE28G1ot.js} +1 -1
- package/frontend/dist/assets/index-tSU3-nNc.css +1 -0
- package/frontend/dist/assets/{jszip.min-DW73pE0J.js → jszip.min-BDxK042T.js} +1 -1
- package/frontend/dist/assets/{select-HgZm25ew.js → select-C6nWxQ7S.js} +2 -2
- package/frontend/dist/assets/{user-BOTyiGCj.js → user-DbW3r9c3.js} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/ProjectPage-9CEnUXvW.css +0 -32
- package/frontend/dist/assets/ProjectPage-Bi7P0xvD.js +0 -26
- package/frontend/dist/assets/index-mxYmpvtf.css +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.sanitizeFlowFilename = sanitizeFlowFilename;
|
|
37
|
+
exports.listFlows = listFlows;
|
|
38
|
+
exports.loadFlow = loadFlow;
|
|
39
|
+
exports.loadTrainJson = loadTrainJson;
|
|
40
|
+
exports.saveFlow = saveFlow;
|
|
41
|
+
exports.saveTrainJson = saveTrainJson;
|
|
42
|
+
exports.deleteFlow = deleteFlow;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
/**
|
|
46
|
+
* Sanitize filename — same rules as backend/src/tracks/store.ts sanitizeTrackFilename,
|
|
47
|
+
* but expects `.flow` suffix.
|
|
48
|
+
*
|
|
49
|
+
* Returns sanitized basename WITHOUT extension on success, null on invalid input.
|
|
50
|
+
*/
|
|
51
|
+
function sanitizeFlowFilename(raw) {
|
|
52
|
+
if (typeof raw !== 'string')
|
|
53
|
+
return null;
|
|
54
|
+
const stripped = raw.replace(/\.flow$/i, '');
|
|
55
|
+
if (stripped.length === 0 || stripped.length > 100)
|
|
56
|
+
return null;
|
|
57
|
+
if (!/^[a-zA-Z0-9_一-龥-ヿ-]+$/.test(stripped))
|
|
58
|
+
return null;
|
|
59
|
+
if (stripped.startsWith('.'))
|
|
60
|
+
return null;
|
|
61
|
+
return stripped;
|
|
62
|
+
}
|
|
63
|
+
function flowDir(projectFolder) {
|
|
64
|
+
return path.join(projectFolder, '.ccweb', 'tracks');
|
|
65
|
+
}
|
|
66
|
+
function flowPath(projectFolder, basename) {
|
|
67
|
+
return path.join(flowDir(projectFolder), `${basename}.flow`);
|
|
68
|
+
}
|
|
69
|
+
function trainJsonPath(projectFolder, basename) {
|
|
70
|
+
return path.join(flowDir(projectFolder), `${basename}.train.json`);
|
|
71
|
+
}
|
|
72
|
+
function listFlows(projectFolder) {
|
|
73
|
+
const dir = flowDir(projectFolder);
|
|
74
|
+
try {
|
|
75
|
+
if (!fs.existsSync(dir))
|
|
76
|
+
return [];
|
|
77
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
78
|
+
return entries
|
|
79
|
+
.filter((e) => e.isFile() && e.name.endsWith('.flow'))
|
|
80
|
+
.map((e) => {
|
|
81
|
+
const full = path.join(dir, e.name);
|
|
82
|
+
const stat = fs.statSync(full);
|
|
83
|
+
return {
|
|
84
|
+
filename: e.name,
|
|
85
|
+
basename: e.name.replace(/\.flow$/, ''),
|
|
86
|
+
size: stat.size,
|
|
87
|
+
mtimeMs: stat.mtimeMs,
|
|
88
|
+
};
|
|
89
|
+
})
|
|
90
|
+
.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function loadFlow(projectFolder, basename) {
|
|
97
|
+
const p = flowPath(projectFolder, basename);
|
|
98
|
+
try {
|
|
99
|
+
if (!fs.existsSync(p))
|
|
100
|
+
return null;
|
|
101
|
+
const raw = fs.readFileSync(p, 'utf8');
|
|
102
|
+
return JSON.parse(raw);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function loadTrainJson(projectFolder, basename) {
|
|
109
|
+
const p = trainJsonPath(projectFolder, basename);
|
|
110
|
+
try {
|
|
111
|
+
if (!fs.existsSync(p))
|
|
112
|
+
return null;
|
|
113
|
+
const raw = fs.readFileSync(p, 'utf8');
|
|
114
|
+
const parsed = JSON.parse(raw);
|
|
115
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
116
|
+
return parsed;
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Atomic write: temp file + rename. */
|
|
125
|
+
function atomicWriteJson(target, value) {
|
|
126
|
+
const dir = path.dirname(target);
|
|
127
|
+
try {
|
|
128
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
129
|
+
const tmp = `${target}.tmp.${process.pid}.${Date.now()}`;
|
|
130
|
+
fs.writeFileSync(tmp, JSON.stringify(value, null, 2), 'utf8');
|
|
131
|
+
fs.renameSync(tmp, target);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function saveFlow(projectFolder, basename, flow) {
|
|
139
|
+
return atomicWriteJson(flowPath(projectFolder, basename), flow);
|
|
140
|
+
}
|
|
141
|
+
function saveTrainJson(projectFolder, basename, trainJson) {
|
|
142
|
+
return atomicWriteJson(trainJsonPath(projectFolder, basename), trainJson);
|
|
143
|
+
}
|
|
144
|
+
function deleteFlow(projectFolder, basename) {
|
|
145
|
+
try {
|
|
146
|
+
const p = flowPath(projectFolder, basename);
|
|
147
|
+
const tp = trainJsonPath(projectFolder, basename);
|
|
148
|
+
if (fs.existsSync(p))
|
|
149
|
+
fs.unlinkSync(p);
|
|
150
|
+
if (fs.existsSync(tp))
|
|
151
|
+
fs.unlinkSync(tp);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/track-flow/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy a snapshot to the project cwd as both `train.json` (v3 canonical)
|
|
3
|
+
* and `workflow_data.json` (legacy alias for adapter compat).
|
|
4
|
+
*/
|
|
5
|
+
export declare function copyToProjectCwd(projectFolder: string, snapshot: Record<string, unknown>): boolean;
|
|
6
|
+
export interface ReloadResult {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
data?: Record<string, unknown>;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Reload train.json after LLM call. Wait 200ms for OS buffer flush, then
|
|
13
|
+
* try parsing. On failure (e.g. half-written file), wait another 500ms
|
|
14
|
+
* and retry once.
|
|
15
|
+
*
|
|
16
|
+
* spec §8.2.
|
|
17
|
+
*/
|
|
18
|
+
export declare function reloadFromProjectCwd(projectFolder: string): Promise<ReloadResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Delete cwd train.json + workflow_data.json. Idempotent.
|
|
21
|
+
*/
|
|
22
|
+
export declare function cleanupProjectCwd(projectFolder: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Filter a possibly LLM-mutated train.json content by the declared
|
|
25
|
+
* whitelist of variable keys. Missing keys are filled with null.
|
|
26
|
+
* Extra (non-whitelist) keys are discarded.
|
|
27
|
+
*
|
|
28
|
+
* spec §6.2 step 7 / §8.2.
|
|
29
|
+
*/
|
|
30
|
+
export declare function filterByWhitelist(data: Record<string, unknown>, whitelist: string[]): Record<string, unknown>;
|
|
31
|
+
//# sourceMappingURL=train-json-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"train-json-sync.d.ts","sourceRoot":"","sources":["../../src/track-flow/train-json-sync.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAIT;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAOvF;AAgBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAQ7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,EAAE,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.copyToProjectCwd = copyToProjectCwd;
|
|
37
|
+
exports.reloadFromProjectCwd = reloadFromProjectCwd;
|
|
38
|
+
exports.cleanupProjectCwd = cleanupProjectCwd;
|
|
39
|
+
exports.filterByWhitelist = filterByWhitelist;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const TRAIN_JSON_NAME = 'train.json';
|
|
43
|
+
const WORKFLOW_DATA_NAME = 'workflow_data.json'; // legacy alias for adapter compat
|
|
44
|
+
/**
|
|
45
|
+
* Atomic write: write to .tmp.<pid>.<ts> then rename to target.
|
|
46
|
+
* Returns true on success, false on any IO error.
|
|
47
|
+
*/
|
|
48
|
+
function atomicWriteJson(target, value) {
|
|
49
|
+
try {
|
|
50
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
51
|
+
const tmp = `${target}.tmp.${process.pid}.${Date.now()}`;
|
|
52
|
+
fs.writeFileSync(tmp, JSON.stringify(value, null, 2), 'utf8');
|
|
53
|
+
fs.renameSync(tmp, target);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Copy a snapshot to the project cwd as both `train.json` (v3 canonical)
|
|
62
|
+
* and `workflow_data.json` (legacy alias for adapter compat).
|
|
63
|
+
*/
|
|
64
|
+
function copyToProjectCwd(projectFolder, snapshot) {
|
|
65
|
+
const ok1 = atomicWriteJson(path.join(projectFolder, TRAIN_JSON_NAME), snapshot);
|
|
66
|
+
const ok2 = atomicWriteJson(path.join(projectFolder, WORKFLOW_DATA_NAME), snapshot);
|
|
67
|
+
return ok1 && ok2;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Reload train.json after LLM call. Wait 200ms for OS buffer flush, then
|
|
71
|
+
* try parsing. On failure (e.g. half-written file), wait another 500ms
|
|
72
|
+
* and retry once.
|
|
73
|
+
*
|
|
74
|
+
* spec §8.2.
|
|
75
|
+
*/
|
|
76
|
+
async function reloadFromProjectCwd(projectFolder) {
|
|
77
|
+
const target = path.join(projectFolder, TRAIN_JSON_NAME);
|
|
78
|
+
await sleep(200);
|
|
79
|
+
const attempt = tryReadJson(target);
|
|
80
|
+
if (attempt.ok)
|
|
81
|
+
return attempt;
|
|
82
|
+
await sleep(500);
|
|
83
|
+
return tryReadJson(target);
|
|
84
|
+
}
|
|
85
|
+
function tryReadJson(target) {
|
|
86
|
+
try {
|
|
87
|
+
if (!fs.existsSync(target))
|
|
88
|
+
return { ok: false, error: 'train.json not found' };
|
|
89
|
+
const raw = fs.readFileSync(target, 'utf8');
|
|
90
|
+
const parsed = JSON.parse(raw);
|
|
91
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
92
|
+
return { ok: false, error: 'train.json must be an object' };
|
|
93
|
+
}
|
|
94
|
+
return { ok: true, data: parsed };
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
return { ok: false, error: `JSON parse failed: ${e.message}` };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Delete cwd train.json + workflow_data.json. Idempotent.
|
|
102
|
+
*/
|
|
103
|
+
function cleanupProjectCwd(projectFolder) {
|
|
104
|
+
for (const name of [TRAIN_JSON_NAME, WORKFLOW_DATA_NAME]) {
|
|
105
|
+
try {
|
|
106
|
+
fs.unlinkSync(path.join(projectFolder, name));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
/* ignore */
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Filter a possibly LLM-mutated train.json content by the declared
|
|
115
|
+
* whitelist of variable keys. Missing keys are filled with null.
|
|
116
|
+
* Extra (non-whitelist) keys are discarded.
|
|
117
|
+
*
|
|
118
|
+
* spec §6.2 step 7 / §8.2.
|
|
119
|
+
*/
|
|
120
|
+
function filterByWhitelist(data, whitelist) {
|
|
121
|
+
const out = {};
|
|
122
|
+
for (const key of whitelist) {
|
|
123
|
+
out[key] = key in data ? data[key] : null;
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
function sleep(ms) {
|
|
128
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=train-json-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"train-json-sync.js","sourceRoot":"","sources":["../../src/track-flow/train-json-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type BroadcastFn = (projectId: string, msg: Record<string, unknown>) => void;
|
|
2
|
+
export declare function setBroadcast(fn: BroadcastFn): void;
|
|
3
|
+
export declare function broadcastFlowEvent(projectId: string, event: string, payload: Record<string, unknown>): void;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=track-flow-ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-flow-ws.d.ts","sourceRoot":"","sources":["../src/track-flow-ws.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;AAI5E,wBAAgB,YAAY,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAElD;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAGN"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setBroadcast = setBroadcast;
|
|
4
|
+
exports.broadcastFlowEvent = broadcastFlowEvent;
|
|
5
|
+
let _broadcast = null;
|
|
6
|
+
function setBroadcast(fn) {
|
|
7
|
+
_broadcast = fn;
|
|
8
|
+
}
|
|
9
|
+
function broadcastFlowEvent(projectId, event, payload) {
|
|
10
|
+
if (!_broadcast)
|
|
11
|
+
return;
|
|
12
|
+
_broadcast(projectId, { type: event, ...payload });
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=track-flow-ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-flow-ws.js","sourceRoot":"","sources":["../src/track-flow-ws.ts"],"names":[],"mappings":";;AAIA,oCAEC;AAED,gDAOC;AAbD,IAAI,UAAU,GAAuB,IAAI,CAAA;AAEzC,SAAgB,YAAY,CAAC,EAAe;IAC1C,UAAU,GAAG,EAAE,CAAA;AACjB,CAAC;AAED,SAAgB,kBAAkB,CAChC,SAAiB,EACjB,KAAa,EACb,OAAgC;IAEhC,IAAI,CAAC,UAAU;QAAE,OAAM;IACvB,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AACpD,CAAC"}
|