@tom2012/cc-web 2026.6.17-a → 2026.9.6-b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/CHANGELOG.json +92 -20
  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.map +1 -1
  13. package/backend/dist/hooks-manager.js +19 -3
  14. package/backend/dist/hooks-manager.js.map +1 -1
  15. package/backend/dist/index.d.ts.map +1 -1
  16. package/backend/dist/index.js +53 -1
  17. package/backend/dist/index.js.map +1 -1
  18. package/backend/dist/routes/auth.d.ts +0 -0
  19. package/backend/dist/routes/auth.d.ts.map +0 -0
  20. package/backend/dist/routes/auth.js.map +0 -0
  21. package/backend/dist/routes/projects.d.ts.map +0 -0
  22. package/backend/dist/routes/projects.js.map +0 -0
  23. package/backend/dist/session-manager.d.ts +0 -0
  24. package/backend/dist/session-manager.d.ts.map +0 -0
  25. package/backend/dist/session-manager.js +0 -0
  26. package/backend/dist/session-manager.js.map +0 -0
  27. package/backend/dist/terminal-manager.d.ts +10 -1
  28. package/backend/dist/terminal-manager.d.ts.map +1 -1
  29. package/backend/dist/terminal-manager.js +19 -2
  30. package/backend/dist/terminal-manager.js.map +1 -1
  31. package/backend/dist/types.d.ts +0 -0
  32. package/backend/dist/types.d.ts.map +0 -0
  33. package/backend/dist/types.js +0 -0
  34. package/backend/dist/types.js.map +0 -0
  35. package/bin/ccweb.js +1 -2
  36. package/frontend/dist/assets/{ChatOverlay-Jcso3jnE.js → ChatOverlay-BoPckOLq.js} +1 -1
  37. package/frontend/dist/assets/{ClaudeMemPage-egGwexFX.js → ClaudeMemPage-CeaZSvKE.js} +1 -1
  38. package/frontend/dist/assets/{GraphPreview-CYBEhXG-.js → GraphPreview-Ch6KZFsK.js} +2 -2
  39. package/frontend/dist/assets/{MobilePage-tc43L2Lz.js → MobilePage-JiqI8CSK.js} +3 -3
  40. package/frontend/dist/assets/NotebookPage-Ci_tsAYM.js +13 -0
  41. package/frontend/dist/assets/{OfficePreview-DtFr2tIA.js → OfficePreview-76Lw49uc.js} +2 -2
  42. package/frontend/dist/assets/{PdfPreview-jE4EtPVP.js → PdfPreview-DEsqK0ec.js} +1 -1
  43. package/frontend/dist/assets/{ProjectPage-BURCf2Do.js → ProjectPage-v7j0VJzB.js} +5 -5
  44. package/frontend/dist/assets/{ProjectSettingsPage-BSS5ICpz.js → ProjectSettingsPage-BlxBcXB4.js} +1 -1
  45. package/frontend/dist/assets/{SettingsPage-Bg1PltuQ.js → SettingsPage-eRuTffii.js} +1 -1
  46. package/frontend/dist/assets/{SkillHubPage-Dkfphglo.js → SkillHubPage-DTTbUlQD.js} +1 -1
  47. package/frontend/dist/assets/{check-circle-2-D4xZVklI.js → check-circle-2-CuGGbYqq.js} +1 -1
  48. package/frontend/dist/assets/{chevron-down-Bzyofau8.js → chevron-down-DqJlk-z-.js} +1 -1
  49. package/frontend/dist/assets/chevron-left-ADs1oMLf.js +7 -0
  50. package/frontend/dist/assets/{file-text-eaaujWBr.js → file-text-0i5NEvQ3.js} +1 -1
  51. package/frontend/dist/assets/{index-BRZSUCNz.js → index-BcTWKUVp.js} +1 -1
  52. package/frontend/dist/assets/{index-BXMeGbDt.js → index-BicNGyh6.js} +1 -1
  53. package/frontend/dist/assets/{index-BN_T0UV9.js → index-Bni5vqf8.js} +1 -1
  54. package/frontend/dist/assets/index-BpdaJxoa.css +1 -0
  55. package/frontend/dist/assets/{index-DXjluyd1.js → index-D5jbTY4Z.js} +3 -3
  56. package/frontend/dist/assets/{jszip.min-DPhtdqr8.js → jszip.min-CXhYhQvA.js} +1 -1
  57. package/frontend/dist/assets/{save-B8Uv2Egn.js → save-BFBfbWoK.js} +1 -1
  58. package/frontend/dist/assets/{search-Duax5rfs.js → search-DUINGkQd.js} +1 -1
  59. package/frontend/dist/assets/{select-CbDg1CtL.js → select-DxHj2qKT.js} +1 -1
  60. package/frontend/dist/assets/{tabs-8Bm08Uka.js → tabs-6zanHiRL.js} +1 -1
  61. package/frontend/dist/assets/{textarea-CpK1BCh-.js → textarea-DdVP5OsI.js} +1 -1
  62. package/frontend/dist/index.html +2 -2
  63. package/package.json +36 -10
  64. package/backend/dist/backup/config.d.ts +0 -10
  65. package/backend/dist/backup/config.d.ts.map +0 -1
  66. package/backend/dist/backup/config.js +0 -128
  67. package/backend/dist/backup/config.js.map +0 -1
  68. package/backend/dist/backup/engine.d.ts +0 -22
  69. package/backend/dist/backup/engine.d.ts.map +0 -1
  70. package/backend/dist/backup/engine.js +0 -298
  71. package/backend/dist/backup/engine.js.map +0 -1
  72. package/backend/dist/backup/providers/dropbox.d.ts +0 -25
  73. package/backend/dist/backup/providers/dropbox.d.ts.map +0 -1
  74. package/backend/dist/backup/providers/dropbox.js +0 -320
  75. package/backend/dist/backup/providers/dropbox.js.map +0 -1
  76. package/backend/dist/backup/providers/google-drive.d.ts +0 -29
  77. package/backend/dist/backup/providers/google-drive.d.ts.map +0 -1
  78. package/backend/dist/backup/providers/google-drive.js +0 -303
  79. package/backend/dist/backup/providers/google-drive.js.map +0 -1
  80. package/backend/dist/backup/providers/index.d.ts +0 -3
  81. package/backend/dist/backup/providers/index.d.ts.map +0 -1
  82. package/backend/dist/backup/providers/index.js +0 -19
  83. package/backend/dist/backup/providers/index.js.map +0 -1
  84. package/backend/dist/backup/providers/onedrive.d.ts +0 -29
  85. package/backend/dist/backup/providers/onedrive.d.ts.map +0 -1
  86. package/backend/dist/backup/providers/onedrive.js +0 -317
  87. package/backend/dist/backup/providers/onedrive.js.map +0 -1
  88. package/backend/dist/backup/scheduler.d.ts +0 -6
  89. package/backend/dist/backup/scheduler.d.ts.map +0 -1
  90. package/backend/dist/backup/scheduler.js +0 -55
  91. package/backend/dist/backup/scheduler.js.map +0 -1
  92. package/backend/dist/backup/types.d.ts +0 -73
  93. package/backend/dist/backup/types.d.ts.map +0 -1
  94. package/backend/dist/backup/types.js +0 -4
  95. package/backend/dist/backup/types.js.map +0 -1
  96. package/backend/dist/chat-process-manager.d.ts +0 -45
  97. package/backend/dist/chat-process-manager.d.ts.map +0 -1
  98. package/backend/dist/chat-process-manager.js +0 -258
  99. package/backend/dist/chat-process-manager.js.map +0 -1
  100. package/backend/dist/flows/runner.d.ts +0 -37
  101. package/backend/dist/flows/runner.d.ts.map +0 -1
  102. package/backend/dist/flows/runner.js +0 -660
  103. package/backend/dist/flows/runner.js.map +0 -1
  104. package/backend/dist/flows/store.d.ts +0 -40
  105. package/backend/dist/flows/store.d.ts.map +0 -1
  106. package/backend/dist/flows/store.js +0 -284
  107. package/backend/dist/flows/store.js.map +0 -1
  108. package/backend/dist/flows/types.d.ts +0 -176
  109. package/backend/dist/flows/types.d.ts.map +0 -1
  110. package/backend/dist/flows/types.js +0 -25
  111. package/backend/dist/flows/types.js.map +0 -1
  112. package/backend/dist/information/condenser.d.ts +0 -12
  113. package/backend/dist/information/condenser.d.ts.map +0 -1
  114. package/backend/dist/information/condenser.js +0 -568
  115. package/backend/dist/information/condenser.js.map +0 -1
  116. package/backend/dist/information/conversation-sync.d.ts +0 -22
  117. package/backend/dist/information/conversation-sync.d.ts.map +0 -1
  118. package/backend/dist/information/conversation-sync.js +0 -500
  119. package/backend/dist/information/conversation-sync.js.map +0 -1
  120. package/backend/dist/information/types.d.ts +0 -36
  121. package/backend/dist/information/types.d.ts.map +0 -1
  122. package/backend/dist/information/types.js +0 -4
  123. package/backend/dist/information/types.js.map +0 -1
  124. package/backend/dist/memory-pool/buoyancy.d.ts +0 -2
  125. package/backend/dist/memory-pool/buoyancy.d.ts.map +0 -1
  126. package/backend/dist/memory-pool/buoyancy.js +0 -12
  127. package/backend/dist/memory-pool/buoyancy.js.map +0 -1
  128. package/backend/dist/memory-pool/global-pool-manager.d.ts +0 -12
  129. package/backend/dist/memory-pool/global-pool-manager.d.ts.map +0 -1
  130. package/backend/dist/memory-pool/global-pool-manager.js +0 -295
  131. package/backend/dist/memory-pool/global-pool-manager.js.map +0 -1
  132. package/backend/dist/memory-pool/pool-lock.d.ts +0 -2
  133. package/backend/dist/memory-pool/pool-lock.d.ts.map +0 -1
  134. package/backend/dist/memory-pool/pool-lock.js +0 -31
  135. package/backend/dist/memory-pool/pool-lock.js.map +0 -1
  136. package/backend/dist/memory-pool/pool-manager.d.ts +0 -57
  137. package/backend/dist/memory-pool/pool-manager.d.ts.map +0 -1
  138. package/backend/dist/memory-pool/pool-manager.js +0 -322
  139. package/backend/dist/memory-pool/pool-manager.js.map +0 -1
  140. package/backend/dist/memory-pool/templates.d.ts +0 -5
  141. package/backend/dist/memory-pool/templates.d.ts.map +0 -1
  142. package/backend/dist/memory-pool/templates.js +0 -234
  143. package/backend/dist/memory-pool/templates.js.map +0 -1
  144. package/backend/dist/memory-pool/types.d.ts +0 -61
  145. package/backend/dist/memory-pool/types.d.ts.map +0 -1
  146. package/backend/dist/memory-pool/types.js +0 -4
  147. package/backend/dist/memory-pool/types.js.map +0 -1
  148. package/backend/dist/plan-control/checker.d.ts +0 -3
  149. package/backend/dist/plan-control/checker.d.ts.map +0 -1
  150. package/backend/dist/plan-control/checker.js +0 -103
  151. package/backend/dist/plan-control/checker.js.map +0 -1
  152. package/backend/dist/plan-control/executor.d.ts +0 -93
  153. package/backend/dist/plan-control/executor.d.ts.map +0 -1
  154. package/backend/dist/plan-control/executor.js +0 -955
  155. package/backend/dist/plan-control/executor.js.map +0 -1
  156. package/backend/dist/plan-control/parser.d.ts +0 -12
  157. package/backend/dist/plan-control/parser.d.ts.map +0 -1
  158. package/backend/dist/plan-control/parser.js +0 -216
  159. package/backend/dist/plan-control/parser.js.map +0 -1
  160. package/backend/dist/plan-control/templates.d.ts +0 -4
  161. package/backend/dist/plan-control/templates.d.ts.map +0 -1
  162. package/backend/dist/plan-control/templates.js +0 -271
  163. package/backend/dist/plan-control/templates.js.map +0 -1
  164. package/backend/dist/plan-control/types.d.ts +0 -102
  165. package/backend/dist/plan-control/types.d.ts.map +0 -1
  166. package/backend/dist/plan-control/types.js +0 -12
  167. package/backend/dist/plan-control/types.js.map +0 -1
  168. package/backend/dist/routes/backup.d.ts +0 -4
  169. package/backend/dist/routes/backup.d.ts.map +0 -1
  170. package/backend/dist/routes/backup.js +0 -274
  171. package/backend/dist/routes/backup.js.map +0 -1
  172. package/backend/dist/routes/flows.d.ts +0 -5
  173. package/backend/dist/routes/flows.d.ts.map +0 -1
  174. package/backend/dist/routes/flows.js +0 -457
  175. package/backend/dist/routes/flows.js.map +0 -1
  176. package/backend/dist/routes/global-flows.d.ts +0 -3
  177. package/backend/dist/routes/global-flows.d.ts.map +0 -1
  178. package/backend/dist/routes/global-flows.js +0 -90
  179. package/backend/dist/routes/global-flows.js.map +0 -1
  180. package/backend/dist/routes/information.d.ts +0 -3
  181. package/backend/dist/routes/information.d.ts.map +0 -1
  182. package/backend/dist/routes/information.js +0 -159
  183. package/backend/dist/routes/information.js.map +0 -1
  184. package/backend/dist/routes/memory-pool.d.ts +0 -3
  185. package/backend/dist/routes/memory-pool.d.ts.map +0 -1
  186. package/backend/dist/routes/memory-pool.js +0 -837
  187. package/backend/dist/routes/memory-pool.js.map +0 -1
  188. package/backend/dist/routes/plan-control.d.ts +0 -15
  189. package/backend/dist/routes/plan-control.d.ts.map +0 -1
  190. package/backend/dist/routes/plan-control.js +0 -337
  191. package/backend/dist/routes/plan-control.js.map +0 -1
  192. package/backend/dist/routes/share.d.ts +0 -3
  193. package/backend/dist/routes/share.d.ts.map +0 -1
  194. package/backend/dist/routes/share.js +0 -167
  195. package/backend/dist/routes/share.js.map +0 -1
  196. package/backend/dist/routes/sounds.d.ts +0 -3
  197. package/backend/dist/routes/sounds.d.ts.map +0 -1
  198. package/backend/dist/routes/sounds.js +0 -285
  199. package/backend/dist/routes/sounds.js.map +0 -1
  200. package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts +0 -24
  201. package/backend/dist/tracks/__tests__/verify-starter-templates.d.ts.map +0 -1
  202. package/backend/dist/tracks/__tests__/verify-starter-templates.js +0 -175
  203. package/backend/dist/tracks/__tests__/verify-starter-templates.js.map +0 -1
  204. package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts +0 -23
  205. package/backend/dist/tracks/__tests__/verify-track-cancel.d.ts.map +0 -1
  206. package/backend/dist/tracks/__tests__/verify-track-cancel.js +0 -153
  207. package/backend/dist/tracks/__tests__/verify-track-cancel.js.map +0 -1
  208. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts +0 -11
  209. package/backend/dist/tracks/__tests__/verify-track-t1.d.ts.map +0 -1
  210. package/backend/dist/tracks/__tests__/verify-track-t1.js +0 -293
  211. package/backend/dist/tracks/__tests__/verify-track-t1.js.map +0 -1
  212. package/backend/dist/tracks/__tests__/verify-track.d.ts +0 -20
  213. package/backend/dist/tracks/__tests__/verify-track.d.ts.map +0 -1
  214. package/backend/dist/tracks/__tests__/verify-track.js +0 -187
  215. package/backend/dist/tracks/__tests__/verify-track.js.map +0 -1
  216. package/backend/dist/tracks/registry.d.ts +0 -61
  217. package/backend/dist/tracks/registry.d.ts.map +0 -1
  218. package/backend/dist/tracks/registry.js +0 -202
  219. package/backend/dist/tracks/registry.js.map +0 -1
  220. package/backend/dist/tracks/track-runner.d.ts +0 -69
  221. package/backend/dist/tracks/track-runner.d.ts.map +0 -1
  222. package/backend/dist/tracks/track-runner.js +0 -158
  223. package/backend/dist/tracks/track-runner.js.map +0 -1
  224. package/backend/dist/tracks/train-loader.d.ts +0 -44
  225. package/backend/dist/tracks/train-loader.d.ts.map +0 -1
  226. package/backend/dist/tracks/train-loader.js +0 -32
  227. package/backend/dist/tracks/train-loader.js.map +0 -1
  228. package/backend/dist/tracks/types-train.d.ts +0 -12
  229. package/backend/dist/tracks/types-train.d.ts.map +0 -1
  230. package/backend/dist/tracks/types-train.js +0 -13
  231. package/backend/dist/tracks/types-train.js.map +0 -1
  232. package/backend/dist/usage-terminal.d.ts +0 -18
  233. package/backend/dist/usage-terminal.d.ts.map +0 -1
  234. package/backend/dist/usage-terminal.js +0 -191
  235. package/backend/dist/usage-terminal.js.map +0 -1
  236. package/frontend/dist/assets/NotebookPage-Dy1fFqcp.js +0 -13
  237. package/frontend/dist/assets/index-CgRMBOJu.css +0 -1
@@ -1,158 +0,0 @@
1
- "use strict";
2
- /**
3
- * TrackRunner — thin wrapper around train-lang's runFile that wires
4
- * the CcwebTrainAdapter + WorkflowDataWatcher + writeProtocolHint into
5
- * a single ergonomic API for the rest of the ccweb backend.
6
- *
7
- * Lifecycle:
8
- * const runner = createTrackRunner({ ... deps ... })
9
- * const result = await runner.run(absTrackPath)
10
- * // result.ok / result.value / result.error
11
- *
12
- * Cancel mid-run: runner.cancel() → AbortController fires → train
13
- * short-circuits next fai dispatch + adapter reports FaiCancelled.
14
- *
15
- * train-lang is ESM and ccweb backend is CommonJS, so we use a
16
- * dynamic import (cached at first call). This is the standard
17
- * CJS→ESM interop pattern.
18
- *
19
- * 详见 ~/Obsidian/Base/cc-web/工作轨重构规划.md §9 T0。
20
- */
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.createTrackRunner = createTrackRunner;
23
- const ccweb_train_adapter_1 = require("./ccweb-train-adapter");
24
- const ask_user_bridge_1 = require("./ask-user-bridge");
25
- const train_loader_1 = require("./train-loader");
26
- async function loadTrain() {
27
- // Reuse the shared cache in train-loader.ts so multiple consumers
28
- // (TrackRunner, AskUserBuiltin factory, any future host extension)
29
- // get the same module instance — avoids ESM module-graph duplication
30
- // and removes the double-cache foot-gun.
31
- return (0, train_loader_1.loadTrainCore)();
32
- }
33
- function createTrackRunner(deps) {
34
- let state = null;
35
- let abortController = null;
36
- let taskIndexCounter = 0;
37
- function updateState(patch) {
38
- if (!state)
39
- return;
40
- state = { ...state, ...patch };
41
- deps.onState?.(state);
42
- }
43
- return {
44
- async run(absTrackPath, args = []) {
45
- const train = await loadTrain();
46
- const runId = deps.runId ?? `track-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
47
- state = {
48
- runId,
49
- trackFilename: absTrackPath.split('/').pop() ?? absTrackPath,
50
- startedAt: Date.now(),
51
- status: 'running',
52
- };
53
- deps.onState?.(state);
54
- abortController = new AbortController();
55
- // Start watcher just before run begins
56
- deps.watcher.start();
57
- const adapter = (0, ccweb_train_adapter_1.createCcwebTrainAdapter)({
58
- projectId: deps.projectId,
59
- runId,
60
- injector: deps.injector,
61
- watcher: deps.watcher,
62
- nextTaskIndex: () => {
63
- const i = taskIndexCounter++;
64
- updateState({ currentTaskIndex: i });
65
- return i;
66
- },
67
- logger: deps.logger,
68
- });
69
- // Build extraBuiltins map (currently: __ccweb_ask_user if bridge provided)
70
- const extraBuiltins = new Map();
71
- if (deps.askUserBridge) {
72
- const askUserFn = await (0, ask_user_bridge_1.createAskUserBuiltin)(deps.askUserBridge, runId, abortController.signal);
73
- extraBuiltins.set('__ccweb_ask_user', askUserFn);
74
- }
75
- try {
76
- const result = await train.runFile(absTrackPath, {
77
- args,
78
- adapter,
79
- maxFaiAttempts: deps.maxFaiAttempts ?? 3,
80
- defaultFaiTimeoutMs: deps.defaultFaiTimeoutMs ?? 600000,
81
- writeProtocolHint: (0, ccweb_train_adapter_1.buildCcwebWriteProtocolHint)(),
82
- signal: abortController.signal,
83
- extraBuiltins,
84
- });
85
- if (result.lexErrors.length > 0 || result.parseErrors.length > 0) {
86
- const message = `parse errors in ${absTrackPath} (${result.lexErrors.length + result.parseErrors.length})`;
87
- updateState({
88
- status: 'failed',
89
- endedAt: Date.now(),
90
- error: { errorType: 'ParseError', message },
91
- });
92
- return { ok: false, value: null, error: { errorType: 'ParseError', message } };
93
- }
94
- if (!result.ok) {
95
- const exc = result.error;
96
- const errObj = exc
97
- ? {
98
- errorType: exc.errorType ?? 'RuntimeError',
99
- message: exc.message,
100
- code: exc.code,
101
- }
102
- : { errorType: 'RuntimeError', message: 'unknown failure' };
103
- const finalStatus = errObj.errorType === 'UserCancelError' ? 'cancelled' : 'failed';
104
- updateState({ status: finalStatus, endedAt: Date.now(), error: errObj });
105
- return { ok: false, value: null, error: errObj };
106
- }
107
- updateState({
108
- status: 'completed',
109
- endedAt: Date.now(),
110
- result: result.value,
111
- });
112
- return { ok: true, value: result.value };
113
- }
114
- catch (err) {
115
- // NEVER-THROW contract: runFile / builtin / adapter throws (incl.
116
- // ask_user reject during abort) MUST be converted into TrackRunResult.
117
- // Without this catch the throw escapes runner.run, registry.ts's
118
- // `void runner.run(...).then(...)` has no .catch, and the global
119
- // unhandledRejection handler (logger.ts) calls process.exit(1).
120
- // → entire ccweb daemon dies whenever a track with pending ask_user
121
- // is aborted. (Repro: v-15-f / v-15-g logs, 2026-05-16 07:35 / 07:36.)
122
- const aborted = abortController?.signal.aborted ?? false;
123
- const e = err;
124
- const errObj = aborted
125
- ? {
126
- errorType: 'UserCancelError',
127
- message: e?.message ?? 'cancelled',
128
- }
129
- : {
130
- errorType: e?.errorType ?? 'RuntimeError',
131
- message: e?.message ?? String(err),
132
- code: e?.code,
133
- };
134
- const finalStatus = aborted ? 'cancelled' : 'failed';
135
- updateState({ status: finalStatus, endedAt: Date.now(), error: errObj });
136
- return { ok: false, value: null, error: errObj };
137
- }
138
- finally {
139
- deps.watcher.stop();
140
- if (deps.askUserBridge && state) {
141
- // Drain any pending ask_user that the bridge still holds.
142
- deps.askUserBridge.cancelAllForRun(state.runId, 'run ended');
143
- }
144
- abortController = null;
145
- }
146
- },
147
- cancel() {
148
- if (abortController) {
149
- abortController.abort();
150
- deps.logger?.info?.('[TrackRunner] cancel requested');
151
- }
152
- },
153
- getState() {
154
- return state;
155
- },
156
- };
157
- }
158
- //# sourceMappingURL=track-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"track-runner.js","sourceRoot":"","sources":["../../src/tracks/track-runner.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- /**
2
- * Dynamic loader for train-lang (ESM) from ccweb backend (CommonJS).
3
- *
4
- * `import('@tom2012/train-core')` is rewritten by ts-node/tsc as `require()`
5
- * which fails because train-lang is ESM-only. Wrapping the expression in
6
- * `new Function(...)` defers it past the TS compiler, leaving a native
7
- * dynamic import at runtime.
8
- *
9
- * Single cache for the whole process. Idempotent.
10
- */
11
- import type { Value, BuiltinFunction } from './types-train';
12
- /**
13
- * Minimal facade over @tom2012/train-core. Only the entry points we use
14
- * from CJS code are listed; keep the type narrow so we don't leak ESM
15
- * types across the boundary and so changes to train-lang surface here
16
- * loudly.
17
- */
18
- export interface TrainCoreModule {
19
- makeBuiltin: (name: string, call: (args: Value[]) => Value | Promise<Value>) => BuiltinFunction;
20
- runFile: (absPath: string, opts: unknown) => Promise<{
21
- ok: boolean;
22
- value: unknown;
23
- error?: {
24
- errorType?: string;
25
- message: string;
26
- code?: string;
27
- };
28
- lexErrors: ReadonlyArray<unknown>;
29
- parseErrors: ReadonlyArray<unknown>;
30
- }>;
31
- TrainException: new (...args: unknown[]) => Error & {
32
- errorType: string;
33
- message: string;
34
- code?: string;
35
- };
36
- }
37
- export declare function loadTrainCore(): Promise<TrainCoreModule>;
38
- /**
39
- * Async wrapper for makeBuiltin — loads train-lang on first call and
40
- * forwards the rest. Use whenever you need to construct a BuiltinFunction
41
- * from CommonJS code.
42
- */
43
- export declare function makeBuiltinDynamic(name: string, call: (args: Value[]) => Value | Promise<Value>): Promise<BuiltinFunction>;
44
- //# sourceMappingURL=train-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"train-loader.d.ts","sourceRoot":"","sources":["../../src/tracks/train-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAO3D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAC5C,eAAe,CAAA;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;QACnD,EAAE,EAAE,OAAO,CAAA;QACX,KAAK,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE;YACN,SAAS,CAAC,EAAE,MAAM,CAAA;YAClB,OAAO,EAAE,MAAM,CAAA;YACf,IAAI,CAAC,EAAE,MAAM,CAAA;SACd,CAAA;QACD,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;QACjC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;KACpC,CAAC,CAAA;IACF,cAAc,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,KAAK,GAAG;QAClD,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAID,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAK9D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAC9C,OAAO,CAAC,eAAe,CAAC,CAG1B"}
@@ -1,32 +0,0 @@
1
- "use strict";
2
- /**
3
- * Dynamic loader for train-lang (ESM) from ccweb backend (CommonJS).
4
- *
5
- * `import('@tom2012/train-core')` is rewritten by ts-node/tsc as `require()`
6
- * which fails because train-lang is ESM-only. Wrapping the expression in
7
- * `new Function(...)` defers it past the TS compiler, leaving a native
8
- * dynamic import at runtime.
9
- *
10
- * Single cache for the whole process. Idempotent.
11
- */
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.loadTrainCore = loadTrainCore;
14
- exports.makeBuiltinDynamic = makeBuiltinDynamic;
15
- const dynamicImport = new Function('p', 'return import(p)');
16
- let modPromise = null;
17
- async function loadTrainCore() {
18
- if (!modPromise) {
19
- modPromise = dynamicImport('@tom2012/train-core');
20
- }
21
- return modPromise;
22
- }
23
- /**
24
- * Async wrapper for makeBuiltin — loads train-lang on first call and
25
- * forwards the rest. Use whenever you need to construct a BuiltinFunction
26
- * from CommonJS code.
27
- */
28
- async function makeBuiltinDynamic(name, call) {
29
- const train = await loadTrainCore();
30
- return train.makeBuiltin(name, call);
31
- }
32
- //# sourceMappingURL=train-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"train-loader.js","sourceRoot":"","sources":["../../src/tracks/train-loader.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAwCH,sCAKC;AAOD,gDAMC;AAtDD,MAAM,aAAa,GAAG,IAAI,QAAQ,CAChC,GAAG,EACH,kBAAkB,CACgB,CAAA;AA+BpC,IAAI,UAAU,GAAoC,IAAI,CAAA;AAE/C,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,aAAa,CAAC,qBAAqB,CAA6B,CAAA;IAC/E,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,IAA+C;IAE/C,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAA;IACnC,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Re-export train-lang types for CommonJS consumers.
3
- *
4
- * train-lang is ESM-only, so direct `import { Value } from '@tom2012/train-core'`
5
- * in ts-node CJS mode is risky (TS sometimes resolves types fine, but
6
- * isolatedModules / module resolution corner cases can break it).
7
- *
8
- * Using `import type` here is purely a compile-time alias — the import
9
- * is fully erased at JS emit, so no runtime require() is generated.
10
- */
11
- export type { Value, BuiltinFunction, TrainException, RuntimeContext, } from '@tom2012/train-core';
12
- //# sourceMappingURL=types-train.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-train.d.ts","sourceRoot":"","sources":["../../src/tracks/types-train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EACV,KAAK,EACL,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAA"}
@@ -1,13 +0,0 @@
1
- "use strict";
2
- /**
3
- * Re-export train-lang types for CommonJS consumers.
4
- *
5
- * train-lang is ESM-only, so direct `import { Value } from '@tom2012/train-core'`
6
- * in ts-node CJS mode is risky (TS sometimes resolves types fine, but
7
- * isolatedModules / module resolution corner cases can break it).
8
- *
9
- * Using `import type` here is purely a compile-time alias — the import
10
- * is fully erased at JS emit, so no runtime require() is generated.
11
- */
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- //# sourceMappingURL=types-train.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-train.js","sourceRoot":"","sources":["../../src/tracks/types-train.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
@@ -1,18 +0,0 @@
1
- export interface UsageBucket {
2
- utilization?: number;
3
- resetAt?: string;
4
- }
5
- export interface UsageInfo {
6
- planName?: string;
7
- fiveHour?: UsageBucket;
8
- sevenDay?: UsageBucket;
9
- sevenDaySonnet?: UsageBucket;
10
- sevenDayOpus?: UsageBucket;
11
- }
12
- export declare function queryUsage(): Promise<UsageInfo>;
13
- export declare function clearUsageCache(): void;
14
- export declare const usageTerminal: {
15
- queryUsage: typeof queryUsage;
16
- clearUsageCache: typeof clearUsageCache;
17
- };
18
- //# sourceMappingURL=usage-terminal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage-terminal.d.ts","sourceRoot":"","sources":["../src/usage-terminal.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAoJD,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAMrD;AAiCD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAGD,eAAO,MAAM,aAAa;;;CAAkC,CAAC"}
@@ -1,191 +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
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.usageTerminal = void 0;
37
- exports.queryUsage = queryUsage;
38
- exports.clearUsageCache = clearUsageCache;
39
- const https = __importStar(require("https"));
40
- const os = __importStar(require("os"));
41
- const fs = __importStar(require("fs"));
42
- const path = __importStar(require("path"));
43
- const crypto = __importStar(require("crypto"));
44
- const child_process_1 = require("child_process");
45
- const logger_1 = require("./logger");
46
- const log = (0, logger_1.modLogger)('adapter');
47
- const CACHE_TTL_MS = 5 * 60000;
48
- let memCache = null;
49
- function getHashedServiceName(homeDir) {
50
- const configDir = path.join(homeDir, '.claude');
51
- const normalized = configDir.replace(/\\/g, '/').toLowerCase();
52
- const hash = crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 8);
53
- return `Claude Code-credentials-${hash}`;
54
- }
55
- function tryKeychainService(serviceName) {
56
- try {
57
- const raw = (0, child_process_1.execFileSync)('/usr/bin/security', ['find-generic-password', '-s', serviceName, '-w'], { timeout: 3000, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
58
- if (!raw)
59
- return null;
60
- const data = JSON.parse(raw);
61
- const token = data.claudeAiOauth?.accessToken;
62
- if (!token)
63
- return null;
64
- const expiresAt = data.claudeAiOauth?.expiresAt;
65
- if (expiresAt && expiresAt < Date.now())
66
- return null;
67
- return { accessToken: token, subscriptionType: data.claudeAiOauth?.subscriptionType };
68
- }
69
- catch {
70
- return null;
71
- }
72
- }
73
- function readCredentials() {
74
- const homeDir = os.homedir();
75
- // Try hashed service name (Claude Code 2.x)
76
- const hashed = tryKeychainService(getHashedServiceName(homeDir));
77
- if (hashed)
78
- return hashed;
79
- // Try legacy service name
80
- const legacy = tryKeychainService('Claude Code-credentials');
81
- if (legacy)
82
- return legacy;
83
- // Fall back to .credentials.json
84
- try {
85
- const credPath = path.join(homeDir, '.claude', '.credentials.json');
86
- const data = JSON.parse(fs.readFileSync(credPath, 'utf-8'));
87
- const token = data.claudeAiOauth?.accessToken;
88
- if (!token)
89
- return null;
90
- return { accessToken: token, subscriptionType: data.claudeAiOauth?.subscriptionType };
91
- }
92
- catch {
93
- return null;
94
- }
95
- }
96
- function fetchApi(accessToken) {
97
- return new Promise((resolve, reject) => {
98
- const req = https.request({
99
- hostname: 'api.anthropic.com',
100
- path: '/api/oauth/usage',
101
- method: 'GET',
102
- headers: {
103
- 'Authorization': `Bearer ${accessToken}`,
104
- 'anthropic-beta': 'oauth-2025-04-20',
105
- 'User-Agent': 'claude-code/2.1',
106
- },
107
- }, (res) => {
108
- let body = '';
109
- res.on('data', (chunk) => { body += chunk.toString(); });
110
- res.on('end', () => {
111
- if (res.statusCode !== 200) {
112
- reject(new Error(`HTTP ${res.statusCode}: ${body}`));
113
- return;
114
- }
115
- try {
116
- resolve(JSON.parse(body));
117
- }
118
- catch {
119
- reject(new Error('Invalid JSON response'));
120
- }
121
- });
122
- });
123
- req.setTimeout(15000, () => { req.destroy(); reject(new Error('Timeout')); });
124
- req.on('error', reject);
125
- req.end();
126
- });
127
- }
128
- const PLAN_NAMES = {
129
- pro: 'Pro',
130
- max: 'Max',
131
- max_5x: 'Max 5×',
132
- max_20x: 'Max 20×',
133
- claude_max: 'Max',
134
- free: 'Free',
135
- };
136
- function getPlanName(subscriptionType) {
137
- if (!subscriptionType)
138
- return undefined;
139
- const key = subscriptionType.toLowerCase();
140
- return PLAN_NAMES[key] ?? (subscriptionType.charAt(0).toUpperCase() + subscriptionType.slice(1));
141
- }
142
- function clamp(v) {
143
- if (v == null || !Number.isFinite(v))
144
- return undefined;
145
- return Math.round(Math.max(0, Math.min(100, v)));
146
- }
147
- // ── Public API ──────────────────────────────────────────────────────────────
148
- let queryInProgress = null;
149
- async function queryUsage() {
150
- if (memCache && Date.now() - memCache.at < CACHE_TTL_MS)
151
- return memCache.data;
152
- if (queryInProgress)
153
- return queryInProgress;
154
- queryInProgress = _fetch().finally(() => { queryInProgress = null; });
155
- return queryInProgress;
156
- }
157
- async function _fetch() {
158
- const creds = readCredentials();
159
- if (!creds) {
160
- log.warn({ api: 'usage' }, 'no claude credentials found');
161
- return {};
162
- }
163
- try {
164
- const resp = await fetchApi(creds.accessToken);
165
- function toBucket(b) {
166
- if (!b || b.utilization == null)
167
- return undefined;
168
- return { utilization: clamp(b.utilization), resetAt: b.resets_at ?? undefined };
169
- }
170
- const info = {
171
- planName: getPlanName(creds.subscriptionType),
172
- fiveHour: toBucket(resp.five_hour),
173
- sevenDay: toBucket(resp.seven_day),
174
- sevenDaySonnet: toBucket(resp.seven_day_sonnet),
175
- sevenDayOpus: toBucket(resp.seven_day_opus),
176
- };
177
- memCache = { data: info, at: Date.now() };
178
- log.debug({ api: 'usage', planName: info.planName }, 'usage fetched');
179
- return info;
180
- }
181
- catch (err) {
182
- log.warn({ err, api: 'usage' }, 'usage fetch failed');
183
- return {};
184
- }
185
- }
186
- function clearUsageCache() {
187
- memCache = null;
188
- }
189
- // Legacy export for compatibility
190
- exports.usageTerminal = { queryUsage, clearUsageCache };
191
- //# sourceMappingURL=usage-terminal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage-terminal.js","sourceRoot":"","sources":["../src/usage-terminal.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import{c as e,aO as t,u as s,r as a,bH as r,j as n,G as o,m as d,d as l,x as i,n as c,H as x,bI as u,t as m,P as p,T as h,bJ as g,bK as j,aP as b,aK as f,bL as v,bM as y}from"./index-DXjluyd1.js";import{T as N}from"./textarea-CpK1BCh-.js";import{C as k}from"./chevron-down-Bzyofau8.js";import{M as w,r as C,a as S,C as I,L as _}from"./index-BRZSUCNz.js";import{C as $}from"./check-circle-2-D4xZVklI.js";
2
- /**
3
- * @license lucide-react v0.309.0 - ISC
4
- *
5
- * This source code is licensed under the ISC license.
6
- * See the LICENSE file in the root directory of this source tree.
7
- */const M=e("CalendarCheck",[["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",ry:"2",key:"eu3xkr"}],["line",{x1:"16",x2:"16",y1:"2",y2:"6",key:"m3sa8f"}],["line",{x1:"8",x2:"8",y1:"2",y2:"6",key:"18kwsl"}],["line",{x1:"3",x2:"21",y1:"10",y2:"10",key:"xt86sb"}],["path",{d:"m9 16 2 2 4-4",key:"19s6y9"}]]),D=e("CalendarClock",[["path",{d:"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5",key:"1osxxc"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M3 10h5",key:"r794hk"}],["path",{d:"M17.5 17.5 16 16.25V14",key:"re2vv1"}],["path",{d:"M22 16a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z",key:"ame013"}]]),z=e("CircleDot",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}]]),L=e("CornerDownRight",[["polyline",{points:"15 10 20 15 15 20",key:"1q7qjw"}],["path",{d:"M4 4v7a4 4 0 0 0 4 4h12",key:"z08zvw"}]]),P={todo:"doing",doing:"done",done:"todo"},H={todo:S,doing:z,done:$},T={todo:"text-muted-foreground",doing:"text-amber-500",done:"text-green-500"};
8
- /**
9
- * @license lucide-react v0.309.0 - ISC
10
- *
11
- * This source code is licensed under the ISC license.
12
- * See the LICENSE file in the root directory of this source tree.
13
- */function q({initial:e,saving:s,onSave:r,onCancel:d}){const{t:i}=t(),[c,x]=a.useState((null==e?void 0:e.title)??""),[u,m]=a.useState((null==e?void 0:e.description)??""),[p,h]=a.useState((null==e?void 0:e.status)??"todo"),[g,j]=a.useState((null==e?void 0:e.plannedDate)??""),[b,f]=a.useState((null==e?void 0:e.actualDate)??""),[v,y]=a.useState(!1);return n.jsxs("div",{className:"rounded-lg border border-border bg-muted/30 p-3 space-y-2",children:[n.jsx("input",{autoFocus:!0,value:c,onChange:e=>x(e.target.value),placeholder:i("todo.title_ph"),className:"w-full bg-background border border-border rounded px-2 py-1 text-sm outline-none focus:ring-1 focus:ring-ring"}),n.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-xs text-muted-foreground",children:[n.jsxs("label",{className:"flex items-center gap-1",children:[i("todo.status"),n.jsxs("select",{value:p,onChange:e=>h(e.target.value),className:"bg-background border border-border rounded px-1.5 py-0.5 text-foreground",children:[n.jsx("option",{value:"todo",children:i("todo.status_todo")}),n.jsx("option",{value:"doing",children:i("todo.status_doing")}),n.jsx("option",{value:"done",children:i("todo.status_done")})]})]}),n.jsxs("label",{className:"flex items-center gap-1",children:[i("todo.planned"),n.jsx("input",{type:"date",value:g??"",onChange:e=>j(e.target.value),className:"bg-background border border-border rounded px-1.5 py-0.5 text-foreground"})]}),n.jsxs("label",{className:"flex items-center gap-1",children:[i("todo.actual"),n.jsx("input",{type:"date",value:b??"",onChange:e=>f(e.target.value),className:"bg-background border border-border rounded px-1.5 py-0.5 text-foreground"})]})]}),n.jsxs("div",{children:[n.jsxs("div",{className:"flex gap-1 mb-1",children:[n.jsx("button",{onClick:()=>y(!1),className:l("px-2 py-0.5 text-xs rounded",v?"text-muted-foreground":"bg-primary text-primary-foreground"),children:i("todo.write")}),n.jsx("button",{onClick:()=>y(!0),className:l("px-2 py-0.5 text-xs rounded",v?"bg-primary text-primary-foreground":"text-muted-foreground"),children:i("todo.preview")})]}),v?n.jsx("div",{className:"prose prose-sm dark:prose-invert max-w-none border border-border rounded p-2 min-h-[80px]",children:n.jsx(w,{remarkPlugins:[C],children:u||`_${i("todo.empty_desc")}_`})}):n.jsx(N,{value:u,onChange:e=>m(e.target.value),rows:5,spellCheck:!1,placeholder:i("todo.desc_ph"),className:"font-mono text-xs"})]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsx(o,{size:"sm",onClick:()=>{c.trim()&&r({title:c,description:u,status:p,plannedDate:g||null,actualDate:b||null})},disabled:s||!c.trim(),children:i("todo.save")}),n.jsx(o,{size:"sm",variant:"ghost",onClick:d,disabled:s,children:i("todo.cancel")})]})]})}function E(){const{t:e}=t(),b=s(),[f,v]=a.useState(null),[y,N]=a.useState(!1),[S,I]=a.useState(!1),[_,$]=a.useState(new Set),[z,E]=a.useState(new Set),[F,K]=a.useState(null),[V,G]=a.useState(null),J=function(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}(),O=a.useCallback(async()=>{N(!0);try{v(await r())}catch{v([])}finally{N(!1)}},[]);a.useEffect(()=>{O()},[O]);const R=(e,t)=>e(e=>{const s=new Set(e);return s.has(t)?s.delete(t):s.add(t),s}),W=async e=>{try{await g(e.id,e.projectId,{status:P[e.status]}),await O()}catch(t){m.error(t.message)}},Y=async e=>{if(V){I(!0);try{await u({projectId:V.projectId,parentId:V.parentId,...e}),G(null),await O()}catch(t){m.error(t.message)}finally{I(!1)}}},Z=async(e,t)=>{I(!0);try{await g(e.id,e.projectId,t),K(null),await O()}catch(s){m.error(s.message)}finally{I(!1)}},A=async t=>{if(await b({title:e("todo.confirm_delete_title"),description:e("todo.confirm_delete_desc"),destructive:!0,confirmLabel:e("todo.delete")}))try{await j(t.id,t.projectId),await O()}catch(s){m.error(s.message)}},B=t=>{const s=new Set(t.todos.map(e=>e.id)),a=new Map;for(const e of t.todos){const t=e.parentId&&s.has(e.parentId)?e.parentId:null,r=a.get(t);r?r.push(e):a.set(t,[e])}const r=(s,o)=>{const d=[];for(const c of a.get(s)??[]){const s=a.get(c.id)??[],x=z.has(c.id),u=H[c.status],m=!!c.plannedDate&&"done"!==c.status&&c.plannedDate<J;d.push(n.jsxs("div",{children:[n.jsxs("div",{className:"group flex items-center gap-1.5 py-1 rounded hover:bg-accent/40",style:{paddingLeft:18*o+4},children:[n.jsx("button",{className:"w-4 shrink-0 text-muted-foreground",onClick:()=>s.length&&R(E,c.id),children:s.length>0&&(x?n.jsx(i,{className:"h-3.5 w-3.5"}):n.jsx(k,{className:"h-3.5 w-3.5"}))}),n.jsx("button",{onClick:()=>{W(c)},title:e(`todo.status_${c.status}`),className:"shrink-0",children:n.jsx(u,{className:l("h-4 w-4",T[c.status])})}),n.jsx("button",{onClick:()=>K(e=>e===c.id?null:c.id),className:l("flex-1 min-w-0 truncate text-left text-sm","done"===c.status&&"line-through text-muted-foreground"),children:c.title}),c.plannedDate&&n.jsxs("span",{className:l("shrink-0 hidden sm:flex items-center gap-1 text-xs",m?"text-red-500":"text-muted-foreground"),children:[n.jsx(D,{className:"h-3 w-3"}),c.plannedDate]}),c.actualDate&&n.jsxs("span",{className:"shrink-0 hidden sm:flex items-center gap-1 text-xs text-green-600 dark:text-green-400",children:[n.jsx(M,{className:"h-3 w-3"}),c.actualDate]}),n.jsxs("div",{className:"shrink-0 flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity",children:[n.jsx("button",{className:"p-1 rounded hover:bg-accent text-muted-foreground",title:e("todo.add_sub"),onClick:()=>{G({projectId:t.projectId,parentId:c.id}),E(e=>{const t=new Set(e);return t.delete(c.id),t})},children:n.jsx(L,{className:"h-3.5 w-3.5"})}),n.jsx("button",{className:"p-1 rounded hover:bg-accent text-muted-foreground",title:e("todo.edit"),onClick:()=>K(e=>e===c.id?null:c.id),children:n.jsx(p,{className:"h-3.5 w-3.5"})}),n.jsx("button",{className:"p-1 rounded hover:bg-destructive/80 hover:text-destructive-foreground text-muted-foreground",title:e("todo.delete"),onClick:()=>{A(c)},children:n.jsx(h,{className:"h-3.5 w-3.5"})})]})]}),F===c.id&&n.jsx("div",{style:{paddingLeft:18*o+22},className:"py-1",children:n.jsx(q,{initial:c,saving:S,onSave:e=>{Z(c,e)},onCancel:()=>K(null)})}),!x&&F!==c.id&&c.description&&n.jsx("div",{style:{paddingLeft:18*o+26},className:"prose prose-sm dark:prose-invert max-w-none text-muted-foreground pr-2 pb-1",children:n.jsx(w,{remarkPlugins:[C],children:c.description})}),!x&&r(c.id,o+1),V&&V.parentId===c.id&&n.jsx("div",{style:{paddingLeft:18*(o+1)+22},className:"py-1",children:n.jsx(q,{saving:S,onSave:Y,onCancel:()=>G(null)})})]},c.id))}return d};return r(null,0)};return f?0===f.length?n.jsx("div",{className:"text-center py-16 text-muted-foreground text-sm",children:e("todo.no_projects")}):n.jsxs("div",{className:"space-y-3",children:[n.jsx("div",{className:"flex justify-end",children:n.jsx(o,{variant:"outline",size:"icon",onClick:()=>{O()},title:e("todo.refresh"),children:n.jsx(d,{className:l("h-4 w-4",y&&"animate-spin")})})}),f.map(t=>{const s=_.has(t.projectId),a=t.todos.length,r=t.todos.filter(e=>"done"===e.status).length;return n.jsxs("div",{className:"rounded-xl border border-border bg-card",children:[n.jsxs("div",{className:"flex items-center gap-2 px-3 py-2 border-b border-border",children:[n.jsx("button",{className:"text-muted-foreground",onClick:()=>R($,t.projectId),children:s?n.jsx(i,{className:"h-4 w-4"}):n.jsx(k,{className:"h-4 w-4"})}),n.jsx(c,{className:"h-4 w-4 text-blue-400 shrink-0"}),n.jsx("span",{className:"font-medium truncate flex-1",children:t.projectName}),n.jsxs("span",{className:"shrink-0 text-xs text-muted-foreground",children:[r,"/",a]}),n.jsxs("button",{className:"shrink-0 flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground",onClick:()=>{G({projectId:t.projectId,parentId:null}),$(e=>{const s=new Set(e);return s.delete(t.projectId),s})},children:[n.jsx(x,{className:"h-3.5 w-3.5"}),e("todo.add")]})]}),!s&&n.jsxs("div",{className:"p-2",children:[0===a&&!(V&&V.projectId===t.projectId&&null===V.parentId)&&n.jsx("div",{className:"text-xs text-muted-foreground px-2 py-3",children:e("todo.empty")}),B(t),V&&V.projectId===t.projectId&&null===V.parentId&&n.jsx("div",{className:"py-1 px-1",children:n.jsx(q,{saving:S,onSave:Y,onCancel:()=>G(null)})})]})]},t.projectId)})]}):n.jsx("div",{className:"text-sm text-muted-foreground py-8 text-center",children:y?"…":""})}const F=window.matchMedia("(pointer: coarse)").matches&&window.innerWidth<768;function K(){const{t:e}=t(),s=function(){const{t:e}=t();return t=>{if(t<60)return`${t}${e("notebook.u_s")}`;const s=Math.floor(t/60);if(s<60)return`${s}${e("notebook.u_m")}`;const a=Math.floor(s/60),r=s%60;return r?`${a}${e("notebook.u_h")}${r}${e("notebook.u_m")}`:`${a}${e("notebook.u_h")}`}}(),[r,i]=a.useState("day"),[c,x]=a.useState(null),[u,m]=a.useState(!1),p=a.useCallback(async e=>{m(!0);try{x(await y(e))}catch{x(null)}finally{m(!1)}},[]);a.useEffect(()=>{p(r)},[r,p]);const h=e(`notebook.current_${r}`),g=c?c.buckets.map((e,t)=>c.projects.reduce((e,s)=>e+s.values[t],0)):[],j=g.length?g[g.length-1]:0,b=Math.max(1,...g),f=Math.max(1,...(null==c?void 0:c.projects.flatMap(e=>e.values))??[]);return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-2 mb-5",children:[n.jsx("div",{className:"flex rounded-lg border border-border p-0.5",children:["day","week","month"].map(t=>n.jsx("button",{onClick:()=>i(t),className:l("px-3 py-1 text-sm rounded-md transition-colors",r===t?"bg-primary text-primary-foreground font-medium":"text-muted-foreground hover:text-foreground"),children:e(`notebook.period_${t}`)},t))}),n.jsx(o,{variant:"outline",size:"icon",onClick:()=>{p(r)},title:e("notebook.refresh"),children:n.jsx(d,{className:l("h-4 w-4",u&&"animate-spin")})})]}),n.jsxs("div",{className:"rounded-xl border border-border bg-card p-4 mb-4",children:[n.jsx("div",{className:"text-xs text-muted-foreground",children:h}),n.jsx("div",{className:"mt-1 text-2xl font-semibold",children:s(j)}),n.jsx("div",{className:"mt-4 flex items-end gap-1 h-16",children:null==c?void 0:c.buckets.map((e,t)=>n.jsx("div",{className:"flex-1 flex flex-col items-center justify-end h-full",title:`${e.label}: ${s(g[t])}`,children:n.jsx("div",{className:"w-full rounded-sm bg-primary/70",style:{height:g[t]/b*100+"%"}})},e.key))}),n.jsx("div",{className:"mt-1 flex gap-1",children:null==c?void 0:c.buckets.map(e=>n.jsx("div",{className:"flex-1 text-center text-[10px] text-muted-foreground truncate",children:e.label},e.key))})]}),n.jsx("div",{className:"space-y-2",children:null==c?void 0:c.projects.map(e=>n.jsxs("div",{className:"rounded-lg border border-border bg-card p-3",children:[n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[n.jsx("span",{className:"font-medium truncate",children:e.projectName}),n.jsx("span",{className:"shrink-0 text-sm text-muted-foreground",children:s(e.total)})]}),n.jsx("div",{className:"mt-2 flex items-end gap-0.5 h-8",children:e.values.map((e,t)=>n.jsx("div",{className:"flex-1 rounded-sm bg-primary/40",style:{height:`${Math.max(2,e/f*100)}%`},title:`${c.buckets[t].label}: ${s(e)}`},t))})]},e.projectId))}),c&&0===c.projects.length&&!u&&n.jsx("div",{className:"text-center py-16 text-muted-foreground text-sm",children:e("notebook.empty")})]})}function V(){const{t:e}=t(),s=b(),[r,d]=a.useState("devtime");return n.jsxs("div",{className:"min-h-screen bg-background",children:[n.jsxs("header",{className:"border-b sticky top-0 bg-background z-10",style:F?{paddingTop:"env(safe-area-inset-top)"}:void 0,children:[n.jsxs("div",{className:"w-full px-4 sm:px-6 h-14 flex items-center gap-3",children:[n.jsxs(o,{variant:"ghost",size:"sm",onClick:()=>s(F?"/mobile":"/"),children:[n.jsx(f,{className:"h-4 w-4 mr-1"}),e("notebook.back")]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(v,{className:"h-5 w-5"}),n.jsx("span",{className:"font-semibold text-lg",children:e("notebook.title")})]})]}),n.jsxs("div",{className:"w-full px-4 sm:px-6 flex gap-1 border-t border-border/60",children:[n.jsxs("button",{onClick:()=>d("devtime"),className:l("-mb-px border-b-2 px-3 py-2 text-sm font-medium flex items-center gap-1.5","devtime"===r?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),children:[n.jsx(I,{className:"h-3.5 w-3.5"}),e("notebook.tab_devtime")]}),n.jsxs("button",{onClick:()=>d("todos"),className:l("-mb-px border-b-2 px-3 py-2 text-sm font-medium flex items-center gap-1.5","todos"===r?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),children:[n.jsx(_,{className:"h-3.5 w-3.5"}),e("notebook.tab_todos")]})]})]}),n.jsxs("main",{className:"max-w-3xl mx-auto px-4 py-6",children:["devtime"===r&&n.jsx(K,{}),"todos"===r&&n.jsx(E,{})]})]})}export{V as NotebookPage};