@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.
Files changed (239) hide show
  1. package/CHANGELOG.json +96 -21
  2. package/backend/dist/adapters/claude-adapter.d.ts +4 -0
  3. package/backend/dist/adapters/claude-adapter.d.ts.map +1 -1
  4. package/backend/dist/adapters/claude-adapter.js +18 -2
  5. package/backend/dist/adapters/claude-adapter.js.map +1 -1
  6. package/backend/dist/adapters/types.d.ts +8 -0
  7. package/backend/dist/adapters/types.d.ts.map +1 -1
  8. package/backend/dist/auth.d.ts.map +0 -0
  9. package/backend/dist/config.d.ts +0 -0
  10. package/backend/dist/config.js +0 -0
  11. package/backend/dist/config.js.map +0 -0
  12. package/backend/dist/hooks-manager.d.ts +0 -1
  13. package/backend/dist/hooks-manager.d.ts.map +1 -1
  14. package/backend/dist/hooks-manager.js +19 -19
  15. package/backend/dist/hooks-manager.js.map +1 -1
  16. package/backend/dist/index.d.ts.map +1 -1
  17. package/backend/dist/index.js +76 -1
  18. package/backend/dist/index.js.map +1 -1
  19. package/backend/dist/logger.d.ts.map +1 -1
  20. package/backend/dist/logger.js +3 -0
  21. package/backend/dist/logger.js.map +1 -1
  22. package/backend/dist/routes/auth.d.ts +0 -0
  23. package/backend/dist/routes/auth.d.ts.map +0 -0
  24. package/backend/dist/routes/auth.js.map +0 -0
  25. package/backend/dist/routes/projects.d.ts.map +0 -0
  26. package/backend/dist/routes/projects.js.map +0 -0
  27. package/backend/dist/session-manager.d.ts +0 -0
  28. package/backend/dist/session-manager.d.ts.map +0 -0
  29. package/backend/dist/session-manager.js +0 -0
  30. package/backend/dist/session-manager.js.map +0 -0
  31. package/backend/dist/terminal-manager.d.ts +10 -1
  32. package/backend/dist/terminal-manager.d.ts.map +1 -1
  33. package/backend/dist/terminal-manager.js +19 -2
  34. package/backend/dist/terminal-manager.js.map +1 -1
  35. package/backend/dist/types.d.ts +0 -0
  36. package/backend/dist/types.d.ts.map +0 -0
  37. package/backend/dist/types.js +0 -0
  38. package/backend/dist/types.js.map +0 -0
  39. package/frontend/dist/assets/{ChatOverlay-Dp1BzsYb.js → ChatOverlay-CymdKeQK.js} +1 -1
  40. package/frontend/dist/assets/{ClaudeMemPage-CpzMjJnb.js → ClaudeMemPage-BZ4UtUoz.js} +1 -1
  41. package/frontend/dist/assets/{GraphPreview-DDY1yVOX.js → GraphPreview-21EwV_e_.js} +1 -1
  42. package/frontend/dist/assets/{MobilePage-BnnE820D.js → MobilePage-99vv9cWh.js} +3 -3
  43. package/frontend/dist/assets/{NotebookPage-BOiYcs-l.js → NotebookPage-B-mcSRJm.js} +1 -1
  44. package/frontend/dist/assets/{OfficePreview-C5N2gr8-.js → OfficePreview-C3rHS2Te.js} +2 -2
  45. package/frontend/dist/assets/{PdfPreview-COG-9AQa.js → PdfPreview-B-toyaoA.js} +1 -1
  46. package/frontend/dist/assets/{ProjectPage-ARPH_J5o.js → ProjectPage-CShqyrUl.js} +4 -4
  47. package/frontend/dist/assets/{ProjectSettingsPage-CMWcT-5r.js → ProjectSettingsPage-FxkEGuUP.js} +1 -1
  48. package/frontend/dist/assets/{SettingsPage-BMrIDtg8.js → SettingsPage-B-bqNp6b.js} +1 -1
  49. package/frontend/dist/assets/{SkillHubPage-Bq93A7Rt.js → SkillHubPage-DN79j9Is.js} +1 -1
  50. package/frontend/dist/assets/{check-circle-2-BGT1eH1f.js → check-circle-2-DRT7EX5I.js} +1 -1
  51. package/frontend/dist/assets/{chevron-down-Bbg11n9i.js → chevron-down-DdtdiM4b.js} +1 -1
  52. package/frontend/dist/assets/{chevron-left-BmStQriC.js → chevron-left-Chv-EE6G.js} +1 -1
  53. package/frontend/dist/assets/{file-text-D9WjmbhK.js → file-text-D3ZDULSr.js} +1 -1
  54. package/frontend/dist/assets/{index-EFhMcMWk.js → index-BIGQ6n-i.js} +2 -2
  55. package/frontend/dist/assets/index-BpdaJxoa.css +1 -0
  56. package/frontend/dist/assets/{index-BRqvDxO6.js → index-CH1oLpmL.js} +1 -1
  57. package/frontend/dist/assets/{index-Bhp9CVTp.js → index-Dbm49BgL.js} +1 -1
  58. package/frontend/dist/assets/{index-COZnAgez.js → index-xJR85RJZ.js} +1 -1
  59. package/frontend/dist/assets/{jszip.min-Dyo__hKc.js → jszip.min-CMcZF4_M.js} +1 -1
  60. package/frontend/dist/assets/{save-CAjdgnp7.js → save-Dhw-I0uF.js} +1 -1
  61. package/frontend/dist/assets/{search-DmWhhICR.js → search-zoOED2R0.js} +1 -1
  62. package/frontend/dist/assets/{select-DAfsBGCS.js → select-B7xEE81_.js} +1 -1
  63. package/frontend/dist/assets/{tabs-zra46FZv.js → tabs-BCHX4LWy.js} +1 -1
  64. package/frontend/dist/assets/{textarea-BG4Tvy0e.js → textarea-CGPmR1Ae.js} +1 -1
  65. package/frontend/dist/index.html +2 -2
  66. package/package.json +36 -10
  67. package/backend/dist/backup/config.d.ts +0 -10
  68. package/backend/dist/backup/config.d.ts.map +0 -1
  69. package/backend/dist/backup/config.js +0 -128
  70. package/backend/dist/backup/config.js.map +0 -1
  71. package/backend/dist/backup/engine.d.ts +0 -22
  72. package/backend/dist/backup/engine.d.ts.map +0 -1
  73. package/backend/dist/backup/engine.js +0 -298
  74. package/backend/dist/backup/engine.js.map +0 -1
  75. package/backend/dist/backup/providers/dropbox.d.ts +0 -25
  76. package/backend/dist/backup/providers/dropbox.d.ts.map +0 -1
  77. package/backend/dist/backup/providers/dropbox.js +0 -320
  78. package/backend/dist/backup/providers/dropbox.js.map +0 -1
  79. package/backend/dist/backup/providers/google-drive.d.ts +0 -29
  80. package/backend/dist/backup/providers/google-drive.d.ts.map +0 -1
  81. package/backend/dist/backup/providers/google-drive.js +0 -303
  82. package/backend/dist/backup/providers/google-drive.js.map +0 -1
  83. package/backend/dist/backup/providers/index.d.ts +0 -3
  84. package/backend/dist/backup/providers/index.d.ts.map +0 -1
  85. package/backend/dist/backup/providers/index.js +0 -19
  86. package/backend/dist/backup/providers/index.js.map +0 -1
  87. package/backend/dist/backup/providers/onedrive.d.ts +0 -29
  88. package/backend/dist/backup/providers/onedrive.d.ts.map +0 -1
  89. package/backend/dist/backup/providers/onedrive.js +0 -317
  90. package/backend/dist/backup/providers/onedrive.js.map +0 -1
  91. package/backend/dist/backup/scheduler.d.ts +0 -6
  92. package/backend/dist/backup/scheduler.d.ts.map +0 -1
  93. package/backend/dist/backup/scheduler.js +0 -55
  94. package/backend/dist/backup/scheduler.js.map +0 -1
  95. package/backend/dist/backup/types.d.ts +0 -73
  96. package/backend/dist/backup/types.d.ts.map +0 -1
  97. package/backend/dist/backup/types.js +0 -4
  98. package/backend/dist/backup/types.js.map +0 -1
  99. package/backend/dist/chat-process-manager.d.ts +0 -45
  100. package/backend/dist/chat-process-manager.d.ts.map +0 -1
  101. package/backend/dist/chat-process-manager.js +0 -258
  102. package/backend/dist/chat-process-manager.js.map +0 -1
  103. package/backend/dist/flows/runner.d.ts +0 -37
  104. package/backend/dist/flows/runner.d.ts.map +0 -1
  105. package/backend/dist/flows/runner.js +0 -660
  106. package/backend/dist/flows/runner.js.map +0 -1
  107. package/backend/dist/flows/store.d.ts +0 -40
  108. package/backend/dist/flows/store.d.ts.map +0 -1
  109. package/backend/dist/flows/store.js +0 -284
  110. package/backend/dist/flows/store.js.map +0 -1
  111. package/backend/dist/flows/types.d.ts +0 -176
  112. package/backend/dist/flows/types.d.ts.map +0 -1
  113. package/backend/dist/flows/types.js +0 -25
  114. package/backend/dist/flows/types.js.map +0 -1
  115. package/backend/dist/information/condenser.d.ts +0 -12
  116. package/backend/dist/information/condenser.d.ts.map +0 -1
  117. package/backend/dist/information/condenser.js +0 -568
  118. package/backend/dist/information/condenser.js.map +0 -1
  119. package/backend/dist/information/conversation-sync.d.ts +0 -22
  120. package/backend/dist/information/conversation-sync.d.ts.map +0 -1
  121. package/backend/dist/information/conversation-sync.js +0 -500
  122. package/backend/dist/information/conversation-sync.js.map +0 -1
  123. package/backend/dist/information/types.d.ts +0 -36
  124. package/backend/dist/information/types.d.ts.map +0 -1
  125. package/backend/dist/information/types.js +0 -4
  126. package/backend/dist/information/types.js.map +0 -1
  127. package/backend/dist/memory-pool/buoyancy.d.ts +0 -2
  128. package/backend/dist/memory-pool/buoyancy.d.ts.map +0 -1
  129. package/backend/dist/memory-pool/buoyancy.js +0 -12
  130. package/backend/dist/memory-pool/buoyancy.js.map +0 -1
  131. package/backend/dist/memory-pool/global-pool-manager.d.ts +0 -12
  132. package/backend/dist/memory-pool/global-pool-manager.d.ts.map +0 -1
  133. package/backend/dist/memory-pool/global-pool-manager.js +0 -295
  134. package/backend/dist/memory-pool/global-pool-manager.js.map +0 -1
  135. package/backend/dist/memory-pool/pool-lock.d.ts +0 -2
  136. package/backend/dist/memory-pool/pool-lock.d.ts.map +0 -1
  137. package/backend/dist/memory-pool/pool-lock.js +0 -31
  138. package/backend/dist/memory-pool/pool-lock.js.map +0 -1
  139. package/backend/dist/memory-pool/pool-manager.d.ts +0 -57
  140. package/backend/dist/memory-pool/pool-manager.d.ts.map +0 -1
  141. package/backend/dist/memory-pool/pool-manager.js +0 -322
  142. package/backend/dist/memory-pool/pool-manager.js.map +0 -1
  143. package/backend/dist/memory-pool/templates.d.ts +0 -5
  144. package/backend/dist/memory-pool/templates.d.ts.map +0 -1
  145. package/backend/dist/memory-pool/templates.js +0 -234
  146. package/backend/dist/memory-pool/templates.js.map +0 -1
  147. package/backend/dist/memory-pool/types.d.ts +0 -61
  148. package/backend/dist/memory-pool/types.d.ts.map +0 -1
  149. package/backend/dist/memory-pool/types.js +0 -4
  150. package/backend/dist/memory-pool/types.js.map +0 -1
  151. package/backend/dist/plan-control/checker.d.ts +0 -3
  152. package/backend/dist/plan-control/checker.d.ts.map +0 -1
  153. package/backend/dist/plan-control/checker.js +0 -103
  154. package/backend/dist/plan-control/checker.js.map +0 -1
  155. package/backend/dist/plan-control/executor.d.ts +0 -93
  156. package/backend/dist/plan-control/executor.d.ts.map +0 -1
  157. package/backend/dist/plan-control/executor.js +0 -955
  158. package/backend/dist/plan-control/executor.js.map +0 -1
  159. package/backend/dist/plan-control/parser.d.ts +0 -12
  160. package/backend/dist/plan-control/parser.d.ts.map +0 -1
  161. package/backend/dist/plan-control/parser.js +0 -216
  162. package/backend/dist/plan-control/parser.js.map +0 -1
  163. package/backend/dist/plan-control/templates.d.ts +0 -4
  164. package/backend/dist/plan-control/templates.d.ts.map +0 -1
  165. package/backend/dist/plan-control/templates.js +0 -271
  166. package/backend/dist/plan-control/templates.js.map +0 -1
  167. package/backend/dist/plan-control/types.d.ts +0 -102
  168. package/backend/dist/plan-control/types.d.ts.map +0 -1
  169. package/backend/dist/plan-control/types.js +0 -12
  170. package/backend/dist/plan-control/types.js.map +0 -1
  171. package/backend/dist/routes/backup.d.ts +0 -4
  172. package/backend/dist/routes/backup.d.ts.map +0 -1
  173. package/backend/dist/routes/backup.js +0 -274
  174. package/backend/dist/routes/backup.js.map +0 -1
  175. package/backend/dist/routes/flows.d.ts +0 -5
  176. package/backend/dist/routes/flows.d.ts.map +0 -1
  177. package/backend/dist/routes/flows.js +0 -457
  178. package/backend/dist/routes/flows.js.map +0 -1
  179. package/backend/dist/routes/global-flows.d.ts +0 -3
  180. package/backend/dist/routes/global-flows.d.ts.map +0 -1
  181. package/backend/dist/routes/global-flows.js +0 -90
  182. package/backend/dist/routes/global-flows.js.map +0 -1
  183. package/backend/dist/routes/information.d.ts +0 -3
  184. package/backend/dist/routes/information.d.ts.map +0 -1
  185. package/backend/dist/routes/information.js +0 -159
  186. package/backend/dist/routes/information.js.map +0 -1
  187. package/backend/dist/routes/memory-pool.d.ts +0 -3
  188. package/backend/dist/routes/memory-pool.d.ts.map +0 -1
  189. package/backend/dist/routes/memory-pool.js +0 -837
  190. package/backend/dist/routes/memory-pool.js.map +0 -1
  191. package/backend/dist/routes/plan-control.d.ts +0 -15
  192. package/backend/dist/routes/plan-control.d.ts.map +0 -1
  193. package/backend/dist/routes/plan-control.js +0 -337
  194. package/backend/dist/routes/plan-control.js.map +0 -1
  195. package/backend/dist/routes/share.d.ts +0 -3
  196. package/backend/dist/routes/share.d.ts.map +0 -1
  197. package/backend/dist/routes/share.js +0 -167
  198. package/backend/dist/routes/share.js.map +0 -1
  199. package/backend/dist/routes/sounds.d.ts +0 -3
  200. package/backend/dist/routes/sounds.d.ts.map +0 -1
  201. package/backend/dist/routes/sounds.js +0 -285
  202. package/backend/dist/routes/sounds.js.map +0 -1
  203. package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts +0 -24
  204. package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts.map +0 -1
  205. package/backend/dist/tracks/__tests__/verify-starter-templates.js +0 -175
  206. package/backend/dist/tracks/__tests__/verify-starter-templates.js.map +0 -1
  207. package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts +0 -23
  208. package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts.map +0 -1
  209. package/backend/dist/tracks/__tests__/verify-track-cancel.js +0 -153
  210. package/backend/dist/tracks/__tests__/verify-track-cancel.js.map +0 -1
  211. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts +0 -11
  212. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts.map +0 -1
  213. package/backend/dist/tracks/__tests__/verify-track-t1.js +0 -293
  214. package/backend/dist/tracks/__tests__/verify-track-t1.js.map +0 -1
  215. package/backend/dist/tracks/__tests__/verify-track.d.ts +0 -20
  216. package/backend/dist/tracks/__tests__/verify-track.d.ts.map +0 -1
  217. package/backend/dist/tracks/__tests__/verify-track.js +0 -187
  218. package/backend/dist/tracks/__tests__/verify-track.js.map +0 -1
  219. package/backend/dist/tracks/registry.d.ts +0 -61
  220. package/backend/dist/tracks/registry.d.ts.map +0 -1
  221. package/backend/dist/tracks/registry.js +0 -202
  222. package/backend/dist/tracks/registry.js.map +0 -1
  223. package/backend/dist/tracks/track-runner.d.ts +0 -69
  224. package/backend/dist/tracks/track-runner.d.ts.map +0 -1
  225. package/backend/dist/tracks/track-runner.js +0 -158
  226. package/backend/dist/tracks/track-runner.js.map +0 -1
  227. package/backend/dist/tracks/train-loader.d.ts +0 -44
  228. package/backend/dist/tracks/train-loader.d.ts.map +0 -1
  229. package/backend/dist/tracks/train-loader.js +0 -32
  230. package/backend/dist/tracks/train-loader.js.map +0 -1
  231. package/backend/dist/tracks/types-train.d.ts +0 -12
  232. package/backend/dist/tracks/types-train.d.ts.map +0 -1
  233. package/backend/dist/tracks/types-train.js +0 -13
  234. package/backend/dist/tracks/types-train.js.map +0 -1
  235. package/backend/dist/usage-terminal.d.ts +0 -18
  236. package/backend/dist/usage-terminal.d.ts.map +0 -1
  237. package/backend/dist/usage-terminal.js +0 -191
  238. package/backend/dist/usage-terminal.js.map +0 -1
  239. package/frontend/dist/assets/index-GfCaMXPO.css +0 -1
@@ -1,3 +0,0 @@
1
- declare const router: import("express-serve-static-core").Router;
2
- export default router;
3
- //# sourceMappingURL=sounds.d.ts.map
@@ -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":"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"}
@@ -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"}