@tom2012/cc-web 2026.6.17-b → 2026.9.6-c
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 +96 -21
- 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 +0 -1
- package/backend/dist/hooks-manager.d.ts.map +1 -1
- package/backend/dist/hooks-manager.js +19 -19
- package/backend/dist/hooks-manager.js.map +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +76 -1
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/logger.d.ts.map +1 -1
- package/backend/dist/logger.js +3 -0
- package/backend/dist/logger.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/frontend/dist/assets/{ChatOverlay-Dp1BzsYb.js → ChatOverlay-CymdKeQK.js} +1 -1
- package/frontend/dist/assets/{ClaudeMemPage-CpzMjJnb.js → ClaudeMemPage-BZ4UtUoz.js} +1 -1
- package/frontend/dist/assets/{GraphPreview-DDY1yVOX.js → GraphPreview-21EwV_e_.js} +1 -1
- package/frontend/dist/assets/{MobilePage-BnnE820D.js → MobilePage-99vv9cWh.js} +3 -3
- package/frontend/dist/assets/{NotebookPage-BOiYcs-l.js → NotebookPage-B-mcSRJm.js} +1 -1
- package/frontend/dist/assets/{OfficePreview-C5N2gr8-.js → OfficePreview-C3rHS2Te.js} +2 -2
- package/frontend/dist/assets/{PdfPreview-COG-9AQa.js → PdfPreview-B-toyaoA.js} +1 -1
- package/frontend/dist/assets/{ProjectPage-ARPH_J5o.js → ProjectPage-CShqyrUl.js} +4 -4
- package/frontend/dist/assets/{ProjectSettingsPage-CMWcT-5r.js → ProjectSettingsPage-FxkEGuUP.js} +1 -1
- package/frontend/dist/assets/{SettingsPage-BMrIDtg8.js → SettingsPage-B-bqNp6b.js} +1 -1
- package/frontend/dist/assets/{SkillHubPage-Bq93A7Rt.js → SkillHubPage-DN79j9Is.js} +1 -1
- package/frontend/dist/assets/{check-circle-2-BGT1eH1f.js → check-circle-2-DRT7EX5I.js} +1 -1
- package/frontend/dist/assets/{chevron-down-Bbg11n9i.js → chevron-down-DdtdiM4b.js} +1 -1
- package/frontend/dist/assets/{chevron-left-BmStQriC.js → chevron-left-Chv-EE6G.js} +1 -1
- package/frontend/dist/assets/{file-text-D9WjmbhK.js → file-text-D3ZDULSr.js} +1 -1
- package/frontend/dist/assets/{index-EFhMcMWk.js → index-BIGQ6n-i.js} +2 -2
- package/frontend/dist/assets/index-BpdaJxoa.css +1 -0
- package/frontend/dist/assets/{index-BRqvDxO6.js → index-CH1oLpmL.js} +1 -1
- package/frontend/dist/assets/{index-Bhp9CVTp.js → index-Dbm49BgL.js} +1 -1
- package/frontend/dist/assets/{index-COZnAgez.js → index-xJR85RJZ.js} +1 -1
- package/frontend/dist/assets/{jszip.min-Dyo__hKc.js → jszip.min-CMcZF4_M.js} +1 -1
- package/frontend/dist/assets/{save-CAjdgnp7.js → save-Dhw-I0uF.js} +1 -1
- package/frontend/dist/assets/{search-DmWhhICR.js → search-zoOED2R0.js} +1 -1
- package/frontend/dist/assets/{select-DAfsBGCS.js → select-B7xEE81_.js} +1 -1
- package/frontend/dist/assets/{tabs-zra46FZv.js → tabs-BCHX4LWy.js} +1 -1
- package/frontend/dist/assets/{textarea-BG4Tvy0e.js → textarea-CGPmR1Ae.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/index-GfCaMXPO.css +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sounds.d.ts","sourceRoot":"","sources":["../../src/routes/sounds.ts"],"names":[],"mappings":"AASA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsRxB,eAAe,MAAM,CAAC"}
|
|
@@ -1,285 +0,0 @@
|
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const express_1 = require("express");
|
|
40
|
-
const fs = __importStar(require("fs"));
|
|
41
|
-
const path = __importStar(require("path"));
|
|
42
|
-
const https = __importStar(require("https"));
|
|
43
|
-
const http = __importStar(require("http"));
|
|
44
|
-
const multer_1 = __importDefault(require("multer"));
|
|
45
|
-
const config_1 = require("../config");
|
|
46
|
-
const router = (0, express_1.Router)();
|
|
47
|
-
const PRESETS = [
|
|
48
|
-
{ id: 'singing-bowl', name: '颂钵', type: 'strike', defaultMode: 'interval' },
|
|
49
|
-
{ id: 'water-drops', name: '水滴', type: 'strike', defaultMode: 'interval' },
|
|
50
|
-
{ id: 'wind', name: '风声', type: 'ambient', defaultMode: 'loop' },
|
|
51
|
-
{ id: 'rain', name: '雨声', type: 'ambient', defaultMode: 'loop' },
|
|
52
|
-
{ id: 'keyboard', name: '键盘声', type: 'ambient', defaultMode: 'loop' },
|
|
53
|
-
{ id: 'stream', name: '溪流', type: 'ambient', defaultMode: 'loop' },
|
|
54
|
-
];
|
|
55
|
-
const GITHUB_SOUND_URL = 'https://github.com/zbc0315/cc-web/releases/download/sounds';
|
|
56
|
-
const PRESETS_DIR = path.join(config_1.DATA_DIR, 'sounds', 'presets');
|
|
57
|
-
const GLOBAL_SOUNDS_DIR = path.join(config_1.DATA_DIR, 'sounds', 'custom');
|
|
58
|
-
// Ensure directories exist
|
|
59
|
-
function ensureSoundDirs() {
|
|
60
|
-
fs.mkdirSync(PRESETS_DIR, { recursive: true });
|
|
61
|
-
fs.mkdirSync(GLOBAL_SOUNDS_DIR, { recursive: true });
|
|
62
|
-
}
|
|
63
|
-
// multer config: 10MB max, mp3/ogg only, dest /tmp/ccweb-uploads
|
|
64
|
-
const upload = (0, multer_1.default)({
|
|
65
|
-
dest: '/tmp/ccweb-uploads',
|
|
66
|
-
limits: { fileSize: 10 * 1024 * 1024 },
|
|
67
|
-
fileFilter: (_req, file, cb) => {
|
|
68
|
-
const allowed = ['audio/mpeg', 'audio/ogg', 'audio/mp3'];
|
|
69
|
-
const extAllowed = ['.mp3', '.ogg'];
|
|
70
|
-
const ext = path.extname(file.originalname).toLowerCase();
|
|
71
|
-
if (allowed.includes(file.mimetype) || extAllowed.includes(ext)) {
|
|
72
|
-
cb(null, true);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
cb(new Error('Only mp3 and ogg files are allowed'));
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
/** Download a URL to a destination file path, following redirects up to maxRedirects times */
|
|
80
|
-
function downloadFile(url, dest, maxRedirects = 5) {
|
|
81
|
-
return new Promise((resolve, reject) => {
|
|
82
|
-
function doGet(currentUrl, redirectsLeft) {
|
|
83
|
-
const lib = currentUrl.startsWith('https://') ? https : http;
|
|
84
|
-
lib.get(currentUrl, (res) => {
|
|
85
|
-
if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
86
|
-
if (redirectsLeft <= 0) {
|
|
87
|
-
reject(new Error('Too many redirects'));
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
// Follow redirect
|
|
91
|
-
const location = res.headers.location;
|
|
92
|
-
const nextUrl = location.startsWith('http') ? location : new URL(location, currentUrl).href;
|
|
93
|
-
res.resume(); // drain the response
|
|
94
|
-
doGet(nextUrl, redirectsLeft - 1);
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
if (res.statusCode !== 200) {
|
|
98
|
-
reject(new Error(`HTTP ${res.statusCode} for ${currentUrl}`));
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
102
|
-
const fileStream = fs.createWriteStream(dest);
|
|
103
|
-
res.pipe(fileStream);
|
|
104
|
-
fileStream.on('finish', () => {
|
|
105
|
-
fileStream.close();
|
|
106
|
-
resolve();
|
|
107
|
-
});
|
|
108
|
-
fileStream.on('error', (err) => {
|
|
109
|
-
fs.unlink(dest, () => { });
|
|
110
|
-
reject(err);
|
|
111
|
-
});
|
|
112
|
-
}).on('error', reject);
|
|
113
|
-
}
|
|
114
|
-
doGet(url, maxRedirects);
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
/** Get project by id */
|
|
118
|
-
function getProject(projectId) {
|
|
119
|
-
return (0, config_1.getProjects)().find((p) => p.id === projectId) || null;
|
|
120
|
-
}
|
|
121
|
-
// GET /api/sounds/presets — list presets with downloaded status
|
|
122
|
-
router.get('/presets', (_req, res) => {
|
|
123
|
-
ensureSoundDirs();
|
|
124
|
-
const presetsWithStatus = PRESETS.map((preset) => {
|
|
125
|
-
const filePath = path.join(PRESETS_DIR, `${preset.id}.mp3`);
|
|
126
|
-
const downloaded = fs.existsSync(filePath);
|
|
127
|
-
return { ...preset, downloaded };
|
|
128
|
-
});
|
|
129
|
-
res.json(presetsWithStatus);
|
|
130
|
-
});
|
|
131
|
-
// POST /api/sounds/download/:id — download preset MP3 from GitHub Release
|
|
132
|
-
router.post('/download/:id', async (req, res) => {
|
|
133
|
-
const { id } = req.params;
|
|
134
|
-
const preset = PRESETS.find((p) => p.id === id);
|
|
135
|
-
if (!preset) {
|
|
136
|
-
res.status(404).json({ error: 'Preset not found' });
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
ensureSoundDirs();
|
|
140
|
-
const dest = path.join(PRESETS_DIR, `${preset.id}.mp3`);
|
|
141
|
-
if (fs.existsSync(dest)) {
|
|
142
|
-
res.json({ success: true, message: 'Already downloaded' });
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
const url = `${GITHUB_SOUND_URL}/${preset.id}.mp3`;
|
|
146
|
-
try {
|
|
147
|
-
await downloadFile(url, dest, 5);
|
|
148
|
-
res.json({ success: true });
|
|
149
|
-
}
|
|
150
|
-
catch (err) {
|
|
151
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
152
|
-
res.status(500).json({ error: `Download failed: ${message}` });
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
// GET /api/sounds/file/:name — serve sound file (presets first, then custom)
|
|
156
|
-
router.get('/file/:name', (req, res) => {
|
|
157
|
-
const { name } = req.params;
|
|
158
|
-
// Sanitize filename to prevent path traversal
|
|
159
|
-
const safeName = path.basename(name);
|
|
160
|
-
const presetPath = path.join(PRESETS_DIR, safeName);
|
|
161
|
-
if (fs.existsSync(presetPath)) {
|
|
162
|
-
res.sendFile(presetPath);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
const customPath = path.join(GLOBAL_SOUNDS_DIR, safeName);
|
|
166
|
-
if (fs.existsSync(customPath)) {
|
|
167
|
-
res.sendFile(customPath);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
res.status(404).json({ error: 'File not found' });
|
|
171
|
-
});
|
|
172
|
-
// GET /api/sounds/project/:projectId/:name — serve project sound file
|
|
173
|
-
router.get('/project/:projectId/:name', (req, res) => {
|
|
174
|
-
const { projectId, name } = req.params;
|
|
175
|
-
const project = getProject(projectId);
|
|
176
|
-
if (!project) {
|
|
177
|
-
res.status(404).json({ error: 'Project not found' });
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const safeName = path.basename(name);
|
|
181
|
-
const soundPath = path.join(project.folderPath, '.ccweb', 'sounds', safeName);
|
|
182
|
-
if (!fs.existsSync(soundPath)) {
|
|
183
|
-
res.status(404).json({ error: 'File not found' });
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
res.sendFile(soundPath);
|
|
187
|
-
});
|
|
188
|
-
// POST /api/sounds/upload — upload custom sound
|
|
189
|
-
router.post('/upload', upload.single('file'), (req, res) => {
|
|
190
|
-
if (!req.file) {
|
|
191
|
-
res.status(400).json({ error: 'No file uploaded' });
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
const { scope, projectId } = req.body;
|
|
195
|
-
ensureSoundDirs();
|
|
196
|
-
let destDir;
|
|
197
|
-
if (scope === 'project' && projectId) {
|
|
198
|
-
const project = getProject(projectId);
|
|
199
|
-
if (!project) {
|
|
200
|
-
// Clean up temp file
|
|
201
|
-
fs.unlink(req.file.path, () => { });
|
|
202
|
-
res.status(404).json({ error: 'Project not found' });
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
destDir = path.join(project.folderPath, '.ccweb', 'sounds');
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
destDir = GLOBAL_SOUNDS_DIR;
|
|
209
|
-
}
|
|
210
|
-
fs.mkdirSync(destDir, { recursive: true });
|
|
211
|
-
const originalName = path.basename(req.file.originalname);
|
|
212
|
-
const destPath = path.join(destDir, originalName);
|
|
213
|
-
fs.rename(req.file.path, destPath, (err) => {
|
|
214
|
-
if (err) {
|
|
215
|
-
// Try copy + delete if rename fails (cross-device link)
|
|
216
|
-
try {
|
|
217
|
-
fs.copyFileSync(req.file.path, destPath);
|
|
218
|
-
fs.unlinkSync(req.file.path);
|
|
219
|
-
res.json({ success: true, filename: originalName });
|
|
220
|
-
}
|
|
221
|
-
catch (copyErr) {
|
|
222
|
-
const message = copyErr instanceof Error ? copyErr.message : String(copyErr);
|
|
223
|
-
res.status(500).json({ error: `Upload failed: ${message}` });
|
|
224
|
-
}
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
res.json({ success: true, filename: originalName });
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
// GET /api/sounds/list — list all available sounds
|
|
231
|
-
router.get('/list', (req, res) => {
|
|
232
|
-
ensureSoundDirs();
|
|
233
|
-
const { projectId } = req.query;
|
|
234
|
-
// Downloaded presets
|
|
235
|
-
const downloadedPresets = PRESETS.filter((p) => fs.existsSync(path.join(PRESETS_DIR, `${p.id}.mp3`))).map((p) => ({
|
|
236
|
-
id: p.id,
|
|
237
|
-
name: p.name,
|
|
238
|
-
type: p.type,
|
|
239
|
-
defaultMode: p.defaultMode,
|
|
240
|
-
source: 'preset',
|
|
241
|
-
url: `/api/sounds/file/${p.id}.mp3`,
|
|
242
|
-
}));
|
|
243
|
-
// Global custom sounds
|
|
244
|
-
const globalCustoms = fs.existsSync(GLOBAL_SOUNDS_DIR)
|
|
245
|
-
? fs.readdirSync(GLOBAL_SOUNDS_DIR)
|
|
246
|
-
.filter((f) => /\.(mp3|ogg)$/i.test(f))
|
|
247
|
-
.map((f) => ({
|
|
248
|
-
id: f,
|
|
249
|
-
name: path.basename(f, path.extname(f)),
|
|
250
|
-
type: 'ambient',
|
|
251
|
-
defaultMode: 'loop',
|
|
252
|
-
source: 'custom',
|
|
253
|
-
url: `/api/sounds/file/${f}`,
|
|
254
|
-
}))
|
|
255
|
-
: [];
|
|
256
|
-
// Project sounds (if projectId provided)
|
|
257
|
-
let projectSounds = [];
|
|
258
|
-
if (projectId) {
|
|
259
|
-
const project = getProject(projectId);
|
|
260
|
-
if (project) {
|
|
261
|
-
const projectSoundsDir = path.join(project.folderPath, '.ccweb', 'sounds');
|
|
262
|
-
if (fs.existsSync(projectSoundsDir)) {
|
|
263
|
-
projectSounds = fs.readdirSync(projectSoundsDir)
|
|
264
|
-
.filter((f) => /\.(mp3|ogg)$/i.test(f))
|
|
265
|
-
.map((f) => ({
|
|
266
|
-
id: f,
|
|
267
|
-
name: path.basename(f, path.extname(f)),
|
|
268
|
-
type: 'ambient',
|
|
269
|
-
defaultMode: 'loop',
|
|
270
|
-
source: 'project',
|
|
271
|
-
url: `/api/sounds/project/${projectId}/${f}`,
|
|
272
|
-
}));
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
// Return flat array with source strings matching frontend format (e.g. "preset:rain", "global:file.mp3", "project:file.mp3")
|
|
277
|
-
const all = [
|
|
278
|
-
...downloadedPresets.map((p) => ({ ...p, source: `preset:${p.id}` })),
|
|
279
|
-
...globalCustoms.map((g) => ({ ...g, source: `global:${g.id}` })),
|
|
280
|
-
...projectSounds.map((ps) => ({ ...ps, source: `project:${ps.id}` })),
|
|
281
|
-
];
|
|
282
|
-
res.json(all);
|
|
283
|
-
});
|
|
284
|
-
exports.default = router;
|
|
285
|
-
//# sourceMappingURL=sounds.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sounds.js","sourceRoot":"","sources":["../../src/routes/sounds.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAoD;AACpD,uCAAyB;AACzB,2CAA6B;AAC7B,6CAA+B;AAC/B,2CAA6B;AAC7B,oDAA4B;AAE5B,sCAAkD;AAElD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AASxB,MAAM,OAAO,GAAa;IACxB,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;IAC3E,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;IAC1E,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE;IAChE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE;IAChE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE;IACrE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE;CACnE,CAAC;AAEF,MAAM,gBAAgB,GAAG,4DAA4D,CAAC;AAEtF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC7D,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAElE,2BAA2B;AAC3B,SAAS,eAAe;IACtB,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,iEAAiE;AACjE,MAAM,MAAM,GAAG,IAAA,gBAAM,EAAC;IACpB,IAAI,EAAE,oBAAoB;IAC1B,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;IACtC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,8FAA8F;AAC9F,SAAS,YAAY,CAAC,GAAW,EAAE,IAAY,EAAE,YAAY,GAAG,CAAC;IAC/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,SAAS,KAAK,CAAC,UAAkB,EAAE,aAAqB;YACtD,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC1B,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC5F,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;wBACvB,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;wBACxC,OAAO;oBACT,CAAC;oBACD,kBAAkB;oBAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC;oBAC5F,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,qBAAqB;oBACnC,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;oBAClC,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,UAAU,QAAQ,UAAU,EAAE,CAAC,CAAC,CAAC;oBAC9D,OAAO;gBACT,CAAC;gBACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM,UAAU,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC9C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wBAAwB;AACxB,SAAS,UAAU,CAAC,SAAiB;IACnC,OAAO,IAAA,oBAAW,GAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAiB,EAAE,GAAa,EAAQ,EAAE;IAChE,eAAe,EAAE,CAAC;IAClB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,0EAA0E;AAC1E,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAa,EAAiB,EAAE;IACpF,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,eAAe,EAAE,CAAC;IAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAExD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,gBAAgB,IAAI,MAAM,CAAC,EAAE,MAAM,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,OAAO,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAC7E,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAgB,EAAE,GAAa,EAAQ,EAAE;IAClE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,CAAC,GAAgB,EAAE,GAAa,EAAQ,EAAE;IAChF,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE9E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;IAClF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAA8C,CAAC;IAChF,eAAe,EAAE,CAAC;IAElB,IAAI,OAAe,CAAC;IACpB,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,qBAAqB;YACrB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,iBAAiB,CAAC;IAC9B,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAElD,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QACzC,IAAI,GAAG,EAAE,CAAC;YACR,wDAAwD;YACxD,IAAI,CAAC;gBACH,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC1C,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,OAAgB,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC7E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,mDAAmD;AACnD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAgB,EAAE,GAAa,EAAQ,EAAE;IAC5D,eAAe,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,KAA+B,CAAC;IAE1D,qBAAqB;IACrB,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CACrD,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACZ,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,MAAM,EAAE,QAAiB;QACzB,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,MAAM;KACpC,CAAC,CAAC,CAAC;IAEJ,uBAAuB;IACvB,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACpD,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,EAAE,SAAkB;YACxB,WAAW,EAAE,MAAe;YAC5B,MAAM,EAAE,QAAiB;YACzB,GAAG,EAAE,oBAAoB,CAAC,EAAE;SAC7B,CAAC,CAAC;QACP,CAAC,CAAC,EAAE,CAAC;IAEP,yCAAyC;IACzC,IAAI,aAAa,GAGZ,EAAE,CAAC;IACR,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3E,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC;qBAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACX,EAAE,EAAE,CAAC;oBACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACvC,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,MAAe;oBAC5B,MAAM,EAAE,SAAkB;oBAC1B,GAAG,EAAE,uBAAuB,SAAS,IAAI,CAAC,EAAE;iBAC7C,CAAC,CAAC,CAAC;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,6HAA6H;IAC7H,MAAM,GAAG,GAAG;QACV,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;KACtE,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sanity check: the starter .tr templates that the frontend renders into
|
|
3
|
-
* the TracksListDialog (STARTER_BASIC / STARTER_ASK_USER) must:
|
|
4
|
-
*
|
|
5
|
-
* 1. Parse cleanly under @tom2012/train-core (no lex/parse errors).
|
|
6
|
-
* 2. Declare `main` with ZERO parameters. ccweb's run button posts
|
|
7
|
-
* args=[] (there's no UI to supply arguments), so a starter whose
|
|
8
|
-
* main takes args fails at runtime with "main() expects N arg(s),
|
|
9
|
-
* got 0" — exactly the v-15-e bug that wasted user time.
|
|
10
|
-
* 3. For STARTER_BASIC (no __ccweb_ask_user dependency): run main()
|
|
11
|
-
* end-to-end through a mock LLM adapter and assert ok=true. This
|
|
12
|
-
* is the strong check — anything that compiles+resolves but
|
|
13
|
-
* explodes at runtime gets caught here.
|
|
14
|
-
* 4. For STARTER_ASK_USER: parse + main-is-zero-arg only; running it
|
|
15
|
-
* requires the ccweb-specific __ccweb_ask_user builtin which
|
|
16
|
-
* train-core doesn't ship.
|
|
17
|
-
*
|
|
18
|
-
* Extracts STARTER_* template literals from TracksListDialog.tsx
|
|
19
|
-
* (single source of truth — do not duplicate the text here).
|
|
20
|
-
*
|
|
21
|
-
* Run: cd backend && npx tsx src/tracks/__tests__/verify-starter-templates.ts
|
|
22
|
-
*/
|
|
23
|
-
export {};
|
|
24
|
-
//# sourceMappingURL=verify-starter-templates.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-starter-templates.d.ts","sourceRoot":"","sources":["../../../src/tracks/__tests__/verify-starter-templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Sanity check: the starter .tr templates that the frontend renders into
|
|
4
|
-
* the TracksListDialog (STARTER_BASIC / STARTER_ASK_USER) must:
|
|
5
|
-
*
|
|
6
|
-
* 1. Parse cleanly under @tom2012/train-core (no lex/parse errors).
|
|
7
|
-
* 2. Declare `main` with ZERO parameters. ccweb's run button posts
|
|
8
|
-
* args=[] (there's no UI to supply arguments), so a starter whose
|
|
9
|
-
* main takes args fails at runtime with "main() expects N arg(s),
|
|
10
|
-
* got 0" — exactly the v-15-e bug that wasted user time.
|
|
11
|
-
* 3. For STARTER_BASIC (no __ccweb_ask_user dependency): run main()
|
|
12
|
-
* end-to-end through a mock LLM adapter and assert ok=true. This
|
|
13
|
-
* is the strong check — anything that compiles+resolves but
|
|
14
|
-
* explodes at runtime gets caught here.
|
|
15
|
-
* 4. For STARTER_ASK_USER: parse + main-is-zero-arg only; running it
|
|
16
|
-
* requires the ccweb-specific __ccweb_ask_user builtin which
|
|
17
|
-
* train-core doesn't ship.
|
|
18
|
-
*
|
|
19
|
-
* Extracts STARTER_* template literals from TracksListDialog.tsx
|
|
20
|
-
* (single source of truth — do not duplicate the text here).
|
|
21
|
-
*
|
|
22
|
-
* Run: cd backend && npx tsx src/tracks/__tests__/verify-starter-templates.ts
|
|
23
|
-
*/
|
|
24
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
-
if (k2 === undefined) k2 = k;
|
|
26
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
-
}
|
|
30
|
-
Object.defineProperty(o, k2, desc);
|
|
31
|
-
}) : (function(o, m, k, k2) {
|
|
32
|
-
if (k2 === undefined) k2 = k;
|
|
33
|
-
o[k2] = m[k];
|
|
34
|
-
}));
|
|
35
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
-
}) : function(o, v) {
|
|
38
|
-
o["default"] = v;
|
|
39
|
-
});
|
|
40
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
-
var ownKeys = function(o) {
|
|
42
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
-
var ar = [];
|
|
44
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
-
return ar;
|
|
46
|
-
};
|
|
47
|
-
return ownKeys(o);
|
|
48
|
-
};
|
|
49
|
-
return function (mod) {
|
|
50
|
-
if (mod && mod.__esModule) return mod;
|
|
51
|
-
var result = {};
|
|
52
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
-
__setModuleDefault(result, mod);
|
|
54
|
-
return result;
|
|
55
|
-
};
|
|
56
|
-
})();
|
|
57
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
-
const fs = __importStar(require("fs"));
|
|
59
|
-
const path = __importStar(require("path"));
|
|
60
|
-
// Dynamic imports via `new Function` so tsc/tsx don't rewrite to require()
|
|
61
|
-
// — @tom2012/train-* are ESM-only and CJS require() of their subpath
|
|
62
|
-
// exports fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
|
|
63
|
-
const dynamicImport = new Function('p', 'return import(p)');
|
|
64
|
-
const DIALOG_PATH = path.resolve(__dirname, '../../../../frontend/src/components/tracks/TracksListDialog.tsx');
|
|
65
|
-
function extractTemplate(source, name) {
|
|
66
|
-
const re = new RegExp(`const\\s+${name}\\s*=\\s*\`([\\s\\S]*?)\``);
|
|
67
|
-
const m = source.match(re);
|
|
68
|
-
if (!m)
|
|
69
|
-
throw new Error(`template ${name} not found in ${DIALOG_PATH}`);
|
|
70
|
-
return m[1];
|
|
71
|
-
}
|
|
72
|
-
let failed = 0;
|
|
73
|
-
function ok(name) {
|
|
74
|
-
console.log(` ✓ ${name}`);
|
|
75
|
-
}
|
|
76
|
-
function fail(name, msg) {
|
|
77
|
-
failed++;
|
|
78
|
-
console.error(` ✗ ${name}${msg ? ': ' + msg : ''}`);
|
|
79
|
-
}
|
|
80
|
-
async function main() {
|
|
81
|
-
console.log('Verifying starter .tr templates...');
|
|
82
|
-
const parser = await dynamicImport('@tom2012/train-core/parser');
|
|
83
|
-
const core = await dynamicImport('@tom2012/train-core');
|
|
84
|
-
const dialogSrc = fs.readFileSync(DIALOG_PATH, 'utf8');
|
|
85
|
-
// Helper: parse + assert main is 0-arg
|
|
86
|
-
function checkParseAndMainSignature(name, body) {
|
|
87
|
-
const parsed = parser.parse(body);
|
|
88
|
-
const errCount = parsed.lexErrors.length + parsed.parseErrors.length;
|
|
89
|
-
if (errCount > 0) {
|
|
90
|
-
fail(`${name} parses`, `${errCount} error(s)`);
|
|
91
|
-
for (const e of parsed.parseErrors)
|
|
92
|
-
console.error(` parse: ${e.message}`);
|
|
93
|
-
for (const e of parsed.lexErrors)
|
|
94
|
-
console.error(` lex: ${e.message}`);
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
ok(`${name} parses`);
|
|
98
|
-
// Find main decl and verify zero params. buildAst returns a typed
|
|
99
|
-
// AST; we look for a FunctionDecl named 'main' (or whatever the
|
|
100
|
-
// export aliases). Conservatively just check the source matches
|
|
101
|
-
// `func main(` followed by `)` with only whitespace between —
|
|
102
|
-
// train-lang grammar uses a paren list, so this is the literal
|
|
103
|
-
// signature.
|
|
104
|
-
if (!/func\s+main\s*\(\s*\)/.test(body)) {
|
|
105
|
-
fail(`${name} main is 0-arg`, 'starter must be runnable with zero args (ccweb run button posts args=[]). Use __ccweb_ask_user to collect input.');
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
ok(`${name} main is 0-arg`);
|
|
109
|
-
// Export must be exactly `export main` (no `as <alias>`). ccweb's
|
|
110
|
-
// TrackRunner calls train.runFile without an explicit entry, which
|
|
111
|
-
// defaults to 'main' in train-core. Aliasing to anything else
|
|
112
|
-
// (e.g. `export main as literature_search`) makes the entry name
|
|
113
|
-
// unreachable and the run fails with `no export named 'main' found`.
|
|
114
|
-
if (!/^\s*export\s+main\s*$/m.test(body)) {
|
|
115
|
-
fail(`${name} exports 'main' (no alias)`, "must be exactly `export main` — ccweb's default entry is 'main'; aliasing makes it unreachable");
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
|
-
ok(`${name} exports 'main' (no alias)`);
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
// STARTER_BASIC: full end-to-end run through an inline mock adapter.
|
|
122
|
-
// Inlined (not imported from @tom2012/train-adapter-mock) so this
|
|
123
|
-
// script has zero runtime dependencies beyond train-core itself.
|
|
124
|
-
const basic = extractTemplate(dialogSrc, 'STARTER_BASIC');
|
|
125
|
-
if (checkParseAndMainSignature('STARTER_BASIC', basic)) {
|
|
126
|
-
const adapter = {
|
|
127
|
-
name: 'inline-mock',
|
|
128
|
-
version: '0.0.0',
|
|
129
|
-
capabilities: {
|
|
130
|
-
parallel: true,
|
|
131
|
-
cancellation: true,
|
|
132
|
-
writesWorkflowData: false,
|
|
133
|
-
},
|
|
134
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
135
|
-
async call(_req) {
|
|
136
|
-
return {
|
|
137
|
-
kind: 'success',
|
|
138
|
-
outputs: {
|
|
139
|
-
message: '工作轨是 ccweb 中的可视化任务编排子系统。',
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
const result = await core.runSource(basic, { adapter, args: [] });
|
|
145
|
-
if (!result.ok) {
|
|
146
|
-
fail('STARTER_BASIC runs with mock adapter', result.error
|
|
147
|
-
? `${result.error.errorType ?? 'Error'}: ${result.error.message}`
|
|
148
|
-
: 'unknown failure');
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
ok('STARTER_BASIC runs with mock adapter');
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// STARTER_ASK_USER: parse + signature only (needs __ccweb_ask_user).
|
|
155
|
-
const askUser = extractTemplate(dialogSrc, 'STARTER_ASK_USER');
|
|
156
|
-
checkParseAndMainSignature('STARTER_ASK_USER', askUser);
|
|
157
|
-
// Quick existence check that the template uses __ccweb_ask_user
|
|
158
|
-
// intentionally — otherwise it should be runnable in this script too.
|
|
159
|
-
if (!askUser.includes('__ccweb_ask_user')) {
|
|
160
|
-
fail('STARTER_ASK_USER uses __ccweb_ask_user', 'template named ASK_USER but does not call it');
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
ok('STARTER_ASK_USER uses __ccweb_ask_user');
|
|
164
|
-
}
|
|
165
|
-
if (failed > 0) {
|
|
166
|
-
console.error(`\n${failed} check(s) failed`);
|
|
167
|
-
process.exit(1);
|
|
168
|
-
}
|
|
169
|
-
console.log('\nAll starter template checks passed.');
|
|
170
|
-
}
|
|
171
|
-
main().catch((e) => {
|
|
172
|
-
console.error(e);
|
|
173
|
-
process.exit(1);
|
|
174
|
-
});
|
|
175
|
-
//# sourceMappingURL=verify-starter-templates.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-starter-templates.js","sourceRoot":"","sources":["../../../src/tracks/__tests__/verify-starter-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for the v-15-f/g daemon-crash bug:
|
|
3
|
-
*
|
|
4
|
-
* POST /tracks/abort while a track is suspended in __ccweb_ask_user
|
|
5
|
-
* used to bubble the reject up through bridge.requestInput →
|
|
6
|
-
* builtin → train.runFile → runner.run → registry.start's `void
|
|
7
|
-
* runner.run(...).then(...)`. Because that .then had no .catch, the
|
|
8
|
-
* rejection escaped as `unhandledRejection`, and the global fatal
|
|
9
|
-
* handler in logger.ts called process.exit(1) — ccweb daemon died.
|
|
10
|
-
*
|
|
11
|
-
* This script:
|
|
12
|
-
* 1. Installs an unhandledRejection listener that flips a flag.
|
|
13
|
-
* 2. Starts a registry-driven track that blocks on __ccweb_ask_user.
|
|
14
|
-
* 3. Calls registry.abort() once the ask_user push fires.
|
|
15
|
-
* 4. Verifies:
|
|
16
|
-
* - flag stays false (no escaping promise)
|
|
17
|
-
* - registry.getState() reports status === 'cancelled'
|
|
18
|
-
* - track_run_complete broadcast has ok=false, errorType=UserCancelError
|
|
19
|
-
*
|
|
20
|
-
* Run: cd backend && npx ts-node src/tracks/__tests__/verify-track-cancel.ts
|
|
21
|
-
*/
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=verify-track-cancel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-track-cancel.d.ts","sourceRoot":"","sources":["../../../src/tracks/__tests__/verify-track-cancel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|