pybao-cli 1.4.39 → 1.4.41

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 (147) hide show
  1. package/dist/REPL-X37QFHMY.js +47 -0
  2. package/dist/{acp-6LBQJVMX.js → acp-YPG3ODYW.js} +29 -29
  3. package/dist/{agentsValidate-SLBW2ESZ.js → agentsValidate-3UWY6SGZ.js} +7 -7
  4. package/dist/{ask-DB4F3WJG.js → ask-KPWV37T5.js} +28 -28
  5. package/dist/{autoUpdater-CYDJVIEC.js → autoUpdater-J45KPDGS.js} +3 -3
  6. package/dist/{chunk-HD4IO3I5.js → chunk-2L67XJY6.js} +60 -66
  7. package/dist/{chunk-HD4IO3I5.js.map → chunk-2L67XJY6.js.map} +2 -2
  8. package/dist/{chunk-3LNPU7WH.js → chunk-3KC257RS.js} +3 -3
  9. package/dist/{chunk-KWPH7MSB.js → chunk-4663HA7W.js} +1 -1
  10. package/dist/{chunk-DLBWS3IW.js → chunk-5AQPEKHM.js} +1 -1
  11. package/dist/{chunk-AI7FJQR4.js → chunk-6K3ESUEV.js} +111 -25
  12. package/dist/chunk-6K3ESUEV.js.map +7 -0
  13. package/dist/{chunk-GD43B2GV.js → chunk-6SRKKJNO.js} +1 -1
  14. package/dist/{chunk-UK4IHZU3.js → chunk-ABCEGXO7.js} +2 -2
  15. package/dist/{chunk-VHTIDAOJ.js → chunk-AOK6U7U7.js} +2 -2
  16. package/dist/{chunk-O5OT26P6.js → chunk-BDM7IINE.js} +1 -1
  17. package/dist/{chunk-TNAAGT3Q.js → chunk-BEP5VFCR.js} +3 -3
  18. package/dist/{chunk-RS2N2KBH.js → chunk-EADYBO22.js} +37 -45
  19. package/dist/{chunk-RS2N2KBH.js.map → chunk-EADYBO22.js.map} +2 -2
  20. package/dist/{chunk-ZGVGFR4C.js → chunk-FJBRBBAE.js} +1 -1
  21. package/dist/{chunk-E5EB22W4.js → chunk-GS2HTCOK.js} +4 -4
  22. package/dist/{chunk-7WCSSH3C.js → chunk-GW3QUBEN.js} +3 -3
  23. package/dist/{chunk-YJ2WXW2J.js → chunk-HC2UA3UA.js} +3 -3
  24. package/dist/{chunk-SBPVAFBQ.js → chunk-HSV2W6ZE.js} +2 -2
  25. package/dist/{chunk-VXQMCAPS.js → chunk-IGU3SZC3.js} +1 -1
  26. package/dist/{chunk-GXHSGPIF.js → chunk-IGYIVSD4.js} +4 -4
  27. package/dist/{chunk-4LXZDGCO.js → chunk-IZJC66JK.js} +3 -3
  28. package/dist/{chunk-6KSM5M7T.js → chunk-JF3APTJS.js} +1 -1
  29. package/dist/{chunk-7TGWBYFN.js → chunk-LQC2XIQ5.js} +4 -4
  30. package/dist/{chunk-GL3ZM7F3.js → chunk-MAQDSC4C.js} +3 -3
  31. package/dist/{chunk-DEYAAT6H.js → chunk-MKPXX4RV.js} +3 -3
  32. package/dist/{chunk-NMJYV37P.js → chunk-MMRONBNC.js} +2 -2
  33. package/dist/{chunk-VFQU3JSH.js → chunk-OS26ZCWF.js} +4 -4
  34. package/dist/{chunk-NNE44UHQ.js → chunk-UAFVGOA7.js} +2 -2
  35. package/dist/{chunk-N4GXGPVA.js → chunk-VCXKB4QH.js} +1 -1
  36. package/dist/{chunk-UUWI4VWU.js → chunk-Y4R6A5ZF.js} +1 -1
  37. package/dist/{chunk-UUWI4VWU.js.map → chunk-Y4R6A5ZF.js.map} +1 -1
  38. package/dist/{chunk-KNLFFHBT.js → chunk-Z7JVH236.js} +2 -2
  39. package/dist/{chunk-SSKQUKI7.js → chunk-ZQQ56UGL.js} +1 -1
  40. package/dist/{cli-FMCSS5QE.js → cli-PGYIYYGL.js} +106 -87
  41. package/dist/cli-PGYIYYGL.js.map +7 -0
  42. package/dist/commands-3QMEPLJI.js +51 -0
  43. package/dist/{config-YRHKZJO6.js → config-SRARC4UV.js} +4 -4
  44. package/dist/{context-ZZO64MRN.js → context-LYZN2WOR.js} +6 -6
  45. package/dist/{customCommands-2S7LYMG7.js → customCommands-G64J6TJU.js} +4 -4
  46. package/dist/{env-PQDRZBAW.js → env-NRGZD37J.js} +2 -2
  47. package/dist/{file-X7BE3MNR.js → file-B7ZHCEOY.js} +4 -4
  48. package/dist/index.js +3 -3
  49. package/dist/{llm-3KCTIVOM.js → llm-FB3ZW3AI.js} +29 -29
  50. package/dist/{llmLazy-HCTXTHRZ.js → llmLazy-DHIZM4VB.js} +1 -1
  51. package/dist/{loader-DKMJSH4V.js → loader-G4RUXY5F.js} +4 -4
  52. package/dist/{lsp-IXEAYT4K.js → lsp-G7G7KQ6Z.js} +6 -6
  53. package/dist/{lspAnchor-FKXOKCQZ.js → lspAnchor-4XUNRJYJ.js} +6 -6
  54. package/dist/{mcp-ZUJD3E4V.js → mcp-GP2OY5CW.js} +7 -7
  55. package/dist/{mentionProcessor-7GXI47P3.js → mentionProcessor-5VND2CWI.js} +6 -6
  56. package/dist/{messages-55HNRTQC.js → messages-DJTPGO5G.js} +1 -1
  57. package/dist/{model-R5X6XP7I.js → model-FY7P6LPI.js} +5 -5
  58. package/dist/{openai-FM7DX3GB.js → openai-R5JKUS7L.js} +5 -5
  59. package/dist/{outputStyles-ZLGIDCCJ.js → outputStyles-XPOEKV5L.js} +4 -4
  60. package/dist/{pluginRuntime-REF3E5F5.js → pluginRuntime-PLWSOKAW.js} +6 -6
  61. package/dist/{pluginValidation-E33USDYW.js → pluginValidation-M57BSDWY.js} +6 -6
  62. package/dist/prompts-V55TE46Y.js +53 -0
  63. package/dist/{pybAgentSessionLoad-PGTH6SZH.js → pybAgentSessionLoad-IDJQMXK3.js} +4 -4
  64. package/dist/{pybAgentSessionResume-IVBY65PN.js → pybAgentSessionResume-U2LJH3AF.js} +4 -4
  65. package/dist/{pybAgentStreamJsonSession-N2Q6LQHX.js → pybAgentStreamJsonSession-F2QIUJBH.js} +1 -1
  66. package/dist/{pybHooks-WIA5KKVN.js → pybHooks-KYHGMDRK.js} +4 -4
  67. package/dist/query-7J3FFRIB.js +55 -0
  68. package/dist/{registry-PT3XVAT6.js → registry-I5LJ4C6T.js} +5 -5
  69. package/dist/{ripgrep-2VWCSPH4.js → ripgrep-7AN4NOC7.js} +3 -3
  70. package/dist/{skillMarketplace-NHPAPZTS.js → skillMarketplace-Z7R6YX7F.js} +3 -3
  71. package/dist/{state-4AIVX6VM.js → state-DEPXOXNL.js} +2 -2
  72. package/dist/{theme-LKZFY5TU.js → theme-HXJ2OXED.js} +5 -5
  73. package/dist/{toolPermissionSettings-OVFT6D3R.js → toolPermissionSettings-4LMPOZYV.js} +6 -6
  74. package/dist/tools-FCGNXBLR.js +52 -0
  75. package/dist/{userInput-RHGZ225B.js → userInput-BYJMHASU.js} +30 -30
  76. package/package.json +1 -1
  77. package/dist/REPL-N62XVC35.js +0 -47
  78. package/dist/chunk-AI7FJQR4.js.map +0 -7
  79. package/dist/cli-FMCSS5QE.js.map +0 -7
  80. package/dist/commands-IJTOU4P3.js +0 -51
  81. package/dist/prompts-W7TUXY74.js +0 -53
  82. package/dist/query-BTG2T7NV.js +0 -55
  83. package/dist/tools-6ONPKOSL.js +0 -52
  84. /package/dist/{REPL-N62XVC35.js.map → REPL-X37QFHMY.js.map} +0 -0
  85. /package/dist/{acp-6LBQJVMX.js.map → acp-YPG3ODYW.js.map} +0 -0
  86. /package/dist/{agentsValidate-SLBW2ESZ.js.map → agentsValidate-3UWY6SGZ.js.map} +0 -0
  87. /package/dist/{ask-DB4F3WJG.js.map → ask-KPWV37T5.js.map} +0 -0
  88. /package/dist/{autoUpdater-CYDJVIEC.js.map → autoUpdater-J45KPDGS.js.map} +0 -0
  89. /package/dist/{chunk-3LNPU7WH.js.map → chunk-3KC257RS.js.map} +0 -0
  90. /package/dist/{chunk-KWPH7MSB.js.map → chunk-4663HA7W.js.map} +0 -0
  91. /package/dist/{chunk-DLBWS3IW.js.map → chunk-5AQPEKHM.js.map} +0 -0
  92. /package/dist/{chunk-GD43B2GV.js.map → chunk-6SRKKJNO.js.map} +0 -0
  93. /package/dist/{chunk-UK4IHZU3.js.map → chunk-ABCEGXO7.js.map} +0 -0
  94. /package/dist/{chunk-VHTIDAOJ.js.map → chunk-AOK6U7U7.js.map} +0 -0
  95. /package/dist/{chunk-O5OT26P6.js.map → chunk-BDM7IINE.js.map} +0 -0
  96. /package/dist/{chunk-TNAAGT3Q.js.map → chunk-BEP5VFCR.js.map} +0 -0
  97. /package/dist/{chunk-ZGVGFR4C.js.map → chunk-FJBRBBAE.js.map} +0 -0
  98. /package/dist/{chunk-E5EB22W4.js.map → chunk-GS2HTCOK.js.map} +0 -0
  99. /package/dist/{chunk-7WCSSH3C.js.map → chunk-GW3QUBEN.js.map} +0 -0
  100. /package/dist/{chunk-YJ2WXW2J.js.map → chunk-HC2UA3UA.js.map} +0 -0
  101. /package/dist/{chunk-SBPVAFBQ.js.map → chunk-HSV2W6ZE.js.map} +0 -0
  102. /package/dist/{chunk-VXQMCAPS.js.map → chunk-IGU3SZC3.js.map} +0 -0
  103. /package/dist/{chunk-GXHSGPIF.js.map → chunk-IGYIVSD4.js.map} +0 -0
  104. /package/dist/{chunk-4LXZDGCO.js.map → chunk-IZJC66JK.js.map} +0 -0
  105. /package/dist/{chunk-6KSM5M7T.js.map → chunk-JF3APTJS.js.map} +0 -0
  106. /package/dist/{chunk-7TGWBYFN.js.map → chunk-LQC2XIQ5.js.map} +0 -0
  107. /package/dist/{chunk-GL3ZM7F3.js.map → chunk-MAQDSC4C.js.map} +0 -0
  108. /package/dist/{chunk-DEYAAT6H.js.map → chunk-MKPXX4RV.js.map} +0 -0
  109. /package/dist/{chunk-NMJYV37P.js.map → chunk-MMRONBNC.js.map} +0 -0
  110. /package/dist/{chunk-VFQU3JSH.js.map → chunk-OS26ZCWF.js.map} +0 -0
  111. /package/dist/{chunk-NNE44UHQ.js.map → chunk-UAFVGOA7.js.map} +0 -0
  112. /package/dist/{chunk-N4GXGPVA.js.map → chunk-VCXKB4QH.js.map} +0 -0
  113. /package/dist/{chunk-KNLFFHBT.js.map → chunk-Z7JVH236.js.map} +0 -0
  114. /package/dist/{chunk-SSKQUKI7.js.map → chunk-ZQQ56UGL.js.map} +0 -0
  115. /package/dist/{commands-IJTOU4P3.js.map → commands-3QMEPLJI.js.map} +0 -0
  116. /package/dist/{config-YRHKZJO6.js.map → config-SRARC4UV.js.map} +0 -0
  117. /package/dist/{context-ZZO64MRN.js.map → context-LYZN2WOR.js.map} +0 -0
  118. /package/dist/{customCommands-2S7LYMG7.js.map → customCommands-G64J6TJU.js.map} +0 -0
  119. /package/dist/{env-PQDRZBAW.js.map → env-NRGZD37J.js.map} +0 -0
  120. /package/dist/{file-X7BE3MNR.js.map → file-B7ZHCEOY.js.map} +0 -0
  121. /package/dist/{llm-3KCTIVOM.js.map → llm-FB3ZW3AI.js.map} +0 -0
  122. /package/dist/{llmLazy-HCTXTHRZ.js.map → llmLazy-DHIZM4VB.js.map} +0 -0
  123. /package/dist/{loader-DKMJSH4V.js.map → loader-G4RUXY5F.js.map} +0 -0
  124. /package/dist/{lsp-IXEAYT4K.js.map → lsp-G7G7KQ6Z.js.map} +0 -0
  125. /package/dist/{lspAnchor-FKXOKCQZ.js.map → lspAnchor-4XUNRJYJ.js.map} +0 -0
  126. /package/dist/{mcp-ZUJD3E4V.js.map → mcp-GP2OY5CW.js.map} +0 -0
  127. /package/dist/{mentionProcessor-7GXI47P3.js.map → mentionProcessor-5VND2CWI.js.map} +0 -0
  128. /package/dist/{messages-55HNRTQC.js.map → messages-DJTPGO5G.js.map} +0 -0
  129. /package/dist/{model-R5X6XP7I.js.map → model-FY7P6LPI.js.map} +0 -0
  130. /package/dist/{openai-FM7DX3GB.js.map → openai-R5JKUS7L.js.map} +0 -0
  131. /package/dist/{outputStyles-ZLGIDCCJ.js.map → outputStyles-XPOEKV5L.js.map} +0 -0
  132. /package/dist/{pluginRuntime-REF3E5F5.js.map → pluginRuntime-PLWSOKAW.js.map} +0 -0
  133. /package/dist/{pluginValidation-E33USDYW.js.map → pluginValidation-M57BSDWY.js.map} +0 -0
  134. /package/dist/{prompts-W7TUXY74.js.map → prompts-V55TE46Y.js.map} +0 -0
  135. /package/dist/{pybAgentSessionLoad-PGTH6SZH.js.map → pybAgentSessionLoad-IDJQMXK3.js.map} +0 -0
  136. /package/dist/{pybAgentSessionResume-IVBY65PN.js.map → pybAgentSessionResume-U2LJH3AF.js.map} +0 -0
  137. /package/dist/{pybAgentStreamJsonSession-N2Q6LQHX.js.map → pybAgentStreamJsonSession-F2QIUJBH.js.map} +0 -0
  138. /package/dist/{pybHooks-WIA5KKVN.js.map → pybHooks-KYHGMDRK.js.map} +0 -0
  139. /package/dist/{query-BTG2T7NV.js.map → query-7J3FFRIB.js.map} +0 -0
  140. /package/dist/{registry-PT3XVAT6.js.map → registry-I5LJ4C6T.js.map} +0 -0
  141. /package/dist/{ripgrep-2VWCSPH4.js.map → ripgrep-7AN4NOC7.js.map} +0 -0
  142. /package/dist/{skillMarketplace-NHPAPZTS.js.map → skillMarketplace-Z7R6YX7F.js.map} +0 -0
  143. /package/dist/{state-4AIVX6VM.js.map → state-DEPXOXNL.js.map} +0 -0
  144. /package/dist/{theme-LKZFY5TU.js.map → theme-HXJ2OXED.js.map} +0 -0
  145. /package/dist/{toolPermissionSettings-OVFT6D3R.js.map → toolPermissionSettings-4LMPOZYV.js.map} +0 -0
  146. /package/dist/{tools-6ONPKOSL.js.map → tools-FCGNXBLR.js.map} +0 -0
  147. /package/dist/{userInput-RHGZ225B.js.map → userInput-BYJMHASU.js.map} +0 -0
@@ -4,10 +4,10 @@ import {
4
4
  PRODUCT_NAME,
5
5
  execFileNoThrow,
6
6
  logError
7
- } from "./chunk-ZGVGFR4C.js";
7
+ } from "./chunk-FJBRBBAE.js";
8
8
  import {
9
9
  MACRO
10
- } from "./chunk-UUWI4VWU.js";
10
+ } from "./chunk-Y4R6A5ZF.js";
11
11
 
12
12
  // src/utils/session/autoUpdater.ts
13
13
  async function getSemver() {
@@ -82,7 +82,7 @@ async function checkAndNotifyUpdate() {
82
82
  const [
83
83
  { isAutoUpdaterDisabled, getGlobalConfig, saveGlobalConfig },
84
84
  { env }
85
- ] = await Promise.all([import("./config-YRHKZJO6.js"), import("./env-PQDRZBAW.js")]);
85
+ ] = await Promise.all([import("./config-SRARC4UV.js"), import("./env-NRGZD37J.js")]);
86
86
  if (await isAutoUpdaterDisabled()) return;
87
87
  if (await env.getIsDocker()) return;
88
88
  if (!await env.hasInternetAccess()) return;
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getSessionProjectDir
5
- } from "./chunk-NNE44UHQ.js";
5
+ } from "./chunk-UAFVGOA7.js";
6
6
  import {
7
7
  isUuid
8
8
  } from "./chunk-5P7HBXTD.js";
@@ -448,7 +448,7 @@ function getLastAssistantMessageId(messages) {
448
448
 
449
449
  // src/utils/messages/index.ts
450
450
  async function processUserInput(input, mode, setToolJSX, context, pastedImages) {
451
- const impl = await import("./userInput-RHGZ225B.js");
451
+ const impl = await import("./userInput-BYJMHASU.js");
452
452
  return impl.processUserInput(input, mode, setToolJSX, context, pastedImages);
453
453
  }
454
454
 
@@ -7,15 +7,15 @@ import {
7
7
  import {
8
8
  getCurrentProjectConfig,
9
9
  getGlobalConfig
10
- } from "./chunk-TNAAGT3Q.js";
10
+ } from "./chunk-BEP5VFCR.js";
11
11
  import {
12
12
  debug
13
- } from "./chunk-O5OT26P6.js";
13
+ } from "./chunk-BDM7IINE.js";
14
14
  import {
15
15
  getCwd,
16
16
  logError,
17
17
  resolveXdgDataPath
18
- } from "./chunk-ZGVGFR4C.js";
18
+ } from "./chunk-FJBRBBAE.js";
19
19
 
20
20
  // src/utils/agent/storage.ts
21
21
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
@@ -282,27 +282,100 @@ function readTaskFile(path) {
282
282
  return null;
283
283
  }
284
284
  const subject = data.subject ?? data.title;
285
- const title = subject;
286
285
  const activeForm = data.activeForm ?? buildActiveForm(subject);
287
286
  const baseVersion = typeof data.baseVersion === "number" ? data.baseVersion : typeof data.version === "number" ? data.version : 1;
288
287
  const version = typeof data.version === "number" ? data.version : baseVersion;
289
288
  const createdAt = typeof data.createdAt === "number" ? data.createdAt : Date.now();
290
289
  const updatedAt = typeof data.updatedAt === "number" ? data.updatedAt : createdAt;
291
290
  const normalized = {
292
- ...data,
291
+ id: data.id,
293
292
  subject,
294
- title,
293
+ description: data.description,
295
294
  activeForm,
295
+ status: data.status,
296
+ tags: data.tags,
297
+ assignee: data.assignee,
298
+ metadata: data.metadata,
299
+ archived: data.archived,
296
300
  blocks: data.blocks ?? [],
297
301
  blockedBy: data.blockedBy ?? [],
302
+ parent: data.parent,
303
+ related: data.related ?? [],
298
304
  createdAt,
299
305
  updatedAt,
300
306
  baseVersion,
301
- version
307
+ version,
308
+ legacyTodoId: data.legacyTodoId
302
309
  };
303
310
  delete normalized.priority;
304
311
  return normalized;
305
312
  }
313
+ function deriveBlocks(tasks) {
314
+ const map = /* @__PURE__ */ new Map();
315
+ for (const task of tasks) {
316
+ map.set(task.id, []);
317
+ }
318
+ for (const task of tasks) {
319
+ const blockers = task.blockedBy ?? [];
320
+ for (const blockerId of blockers) {
321
+ const list = map.get(blockerId);
322
+ if (list) {
323
+ list.push(task.id);
324
+ } else {
325
+ map.set(blockerId, [task.id]);
326
+ }
327
+ }
328
+ }
329
+ for (const [key, list] of map.entries()) {
330
+ map.set(
331
+ key,
332
+ list.sort((a, b) => Number(a) - Number(b))
333
+ );
334
+ }
335
+ return map;
336
+ }
337
+ function areBlocksEqual(a, b) {
338
+ const left = a ?? [];
339
+ const right = b ?? [];
340
+ if (left.length !== right.length) return false;
341
+ for (let i = 0; i < left.length; i += 1) {
342
+ if (left[i] !== right[i]) return false;
343
+ }
344
+ return true;
345
+ }
346
+ function readTasksFromDisk(paths) {
347
+ const files = readdirSync(paths.tasksDir).filter((file) => file.endsWith(".json"));
348
+ return files.map((file) => readTaskFile(join2(paths.tasksDir, file))).filter(Boolean);
349
+ }
350
+ function applyBlocksMap(tasks, map) {
351
+ return tasks.map((task) => ({
352
+ ...task,
353
+ blocks: map.get(task.id) ?? []
354
+ }));
355
+ }
356
+ function persistBlocksMap(paths, map) {
357
+ ensureTaskListDirs(paths);
358
+ const files = readdirSync(paths.tasksDir).filter((file) => file.endsWith(".json"));
359
+ let updated = 0;
360
+ for (const file of files) {
361
+ const path = join2(paths.tasksDir, file);
362
+ const raw = readJson(path);
363
+ if (!raw || !raw.id) continue;
364
+ const nextBlocks = map.get(raw.id) ?? [];
365
+ const currentBlocks = Array.isArray(raw.blocks) ? raw.blocks : [];
366
+ if (areBlocksEqual(currentBlocks, nextBlocks)) continue;
367
+ raw.blocks = nextBlocks;
368
+ writeJson(path, raw);
369
+ updated += 1;
370
+ }
371
+ return updated;
372
+ }
373
+ function rebuildBlocksForPaths(paths) {
374
+ const tasks = readTasksFromDisk(paths);
375
+ const map = deriveBlocks(tasks);
376
+ const updated = persistBlocksMap(paths, map);
377
+ return { tasks: applyBlocksMap(tasks, map), updated };
378
+ }
306
379
  function recoverIndex(paths) {
307
380
  ensureTaskListDirs(paths);
308
381
  const files = readdirSync(paths.tasksDir).filter((file) => file.endsWith(".json"));
@@ -380,14 +453,11 @@ function withTaskListLock(paths, handler) {
380
453
  function applyTaskUpdates(task, updates, nextBaseVersion) {
381
454
  const now = updates.updatedAt ?? Date.now();
382
455
  const subject = updates.subject ?? task.subject;
383
- const title = subject;
384
456
  const activeForm = updates.activeForm ?? (updates.subject ? buildActiveForm(subject) : task.activeForm ?? buildActiveForm(subject));
385
- const blocks = updates.blocks ?? task.blocks ?? [];
386
457
  const blockedBy = updates.blockedBy ?? task.blockedBy ?? [];
387
458
  return {
388
459
  ...task,
389
460
  subject,
390
- title,
391
461
  description: updates.description ?? task.description,
392
462
  activeForm,
393
463
  status: updates.status ?? task.status,
@@ -395,7 +465,7 @@ function applyTaskUpdates(task, updates, nextBaseVersion) {
395
465
  assignee: updates.assignee ?? task.assignee,
396
466
  metadata: updates.metadata ?? task.metadata,
397
467
  archived: updates.archived ?? task.archived,
398
- blocks,
468
+ blocks: task.blocks ?? [],
399
469
  blockedBy,
400
470
  parent: updates.parent ?? task.parent,
401
471
  related: updates.related ?? task.related,
@@ -416,12 +486,10 @@ function createTask(input, options) {
416
486
  if (!subject) {
417
487
  throw new Error("Task subject is required");
418
488
  }
419
- const title = subject;
420
489
  const activeForm = input.activeForm ?? buildActiveForm(subject);
421
490
  const record = {
422
491
  id,
423
492
  subject,
424
- title,
425
493
  description: input.description,
426
494
  activeForm,
427
495
  status: input.status ?? "open",
@@ -429,7 +497,7 @@ function createTask(input, options) {
429
497
  assignee: input.assignee,
430
498
  metadata: input.metadata,
431
499
  archived: input.archived,
432
- blocks: input.blocks ?? [],
500
+ blocks: [],
433
501
  blockedBy: input.blockedBy ?? [],
434
502
  parent: input.parent,
435
503
  related: input.related,
@@ -454,22 +522,28 @@ function createTask(input, options) {
454
522
  type: "task.created",
455
523
  timestamp: Date.now()
456
524
  });
457
- return record;
525
+ const { tasks } = rebuildBlocksForPaths(paths);
526
+ const refreshed = tasks.find((task) => task.id === record.id);
527
+ return refreshed ?? record;
458
528
  });
459
529
  }
460
530
  function getTask(id, options) {
461
- const paths = getTaskListPaths(options?.listId);
462
- const record = readTaskFile(join2(paths.tasksDir, `${id}.json`));
463
- if (!record) return null;
464
- return record;
531
+ const tasks = listTasks(options);
532
+ return tasks.find((task) => task.id === id) ?? null;
465
533
  }
466
534
  function listTasks(options) {
467
535
  const paths = getTaskListPaths(options?.listId);
468
536
  readIndex(paths);
469
537
  ensureTaskListDirs(paths);
470
- const files = readdirSync(paths.tasksDir).filter((file) => file.endsWith(".json"));
471
- const tasks = files.map((file) => readTaskFile(join2(paths.tasksDir, file))).filter(Boolean);
472
- return tasks.sort((a, b) => Number(a.id) - Number(b.id));
538
+ const tasks = readTasksFromDisk(paths);
539
+ const map = deriveBlocks(tasks);
540
+ const derived = applyBlocksMap(tasks, map);
541
+ const needsPersist = tasks.some((task) => {
542
+ const nextBlocks = map.get(task.id) ?? [];
543
+ return !areBlocksEqual(task.blocks, nextBlocks);
544
+ });
545
+ const ready = needsPersist ? withTaskListLock(paths, () => rebuildBlocksForPaths(paths).tasks) : derived;
546
+ return ready.sort((a, b) => Number(a.id) - Number(b.id));
473
547
  }
474
548
  function updateTask(id, updates, options) {
475
549
  const paths = getTaskListPaths(options?.listId);
@@ -515,7 +589,18 @@ function updateTask(id, updates, options) {
515
589
  type: "task.updated",
516
590
  timestamp: Date.now()
517
591
  });
518
- return { task: updated, conflict: hasConflict };
592
+ const { tasks } = rebuildBlocksForPaths(paths);
593
+ const refreshed = tasks.find((task) => task.id === updated.id);
594
+ return { task: refreshed ?? updated, conflict: hasConflict };
595
+ });
596
+ }
597
+ function rebuildTaskBlocks(options) {
598
+ const paths = getTaskListPaths(options?.listId);
599
+ return withTaskListLock(paths, () => {
600
+ readIndex(paths);
601
+ ensureTaskListDirs(paths);
602
+ const { tasks, updated } = rebuildBlocksForPaths(paths);
603
+ return { updated, total: tasks.length };
519
604
  });
520
605
  }
521
606
  function getTaskListMeta(options) {
@@ -977,7 +1062,7 @@ ${content}
977
1062
  const reminderKey = `task_created_${listId}_${taskId}`;
978
1063
  if (this.sessionState.remindersSent.has(reminderKey)) return null;
979
1064
  this.sessionState.remindersSent.add(reminderKey);
980
- const subject = task?.title || task?.subject || taskId;
1065
+ const subject = task?.subject || taskId;
981
1066
  return this.createReminderMessage(
982
1067
  "task_created",
983
1068
  "task",
@@ -992,7 +1077,7 @@ ${content}
992
1077
  const reminderKey = `task_updated_${listId}_${taskId}_${task?.baseVersion ?? ""}`;
993
1078
  if (this.sessionState.remindersSent.has(reminderKey)) return null;
994
1079
  this.sessionState.remindersSent.add(reminderKey);
995
- const subject = task?.title || task?.subject || taskId;
1080
+ const subject = task?.subject || taskId;
996
1081
  return this.createReminderMessage(
997
1082
  "task_updated",
998
1083
  "task",
@@ -1250,6 +1335,7 @@ export {
1250
1335
  getTask,
1251
1336
  listTasks,
1252
1337
  updateTask,
1338
+ rebuildTaskBlocks,
1253
1339
  isTodoCompatEnabled,
1254
1340
  syncTodosToTasks,
1255
1341
  migrateTodosToTasks,
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/agent/storage.ts", "../src/utils/session/taskStore.ts", "../src/utils/session/todoStorage.ts", "../src/services/system/systemReminder.ts"],
4
+ "sourcesContent": ["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { randomUUID } from 'crypto'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { resolveXdgDataPath } from '@utils/config/env'\n\n\nfunction getConfigDirectory(): string {\n const override = process.env.ANYKODE_CONFIG_DIR?.trim()\n if (override) return override\n return resolveXdgDataPath('agents')\n}\n\nfunction getSessionId(): string {\n return process.env.ANYKODE_SESSION_ID ?? 'default-session'\n}\n\nexport function getAgentFilePath(agentId: string): string {\n const sessionId = getSessionId()\n const filename = `${sessionId}-agent-${agentId}.json`\n const configDir = getConfigDirectory()\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true })\n }\n\n return join(configDir, filename)\n}\n\nexport function readAgentData<T = any>(agentId: string): T | null {\n const filePath = getAgentFilePath(agentId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as T\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_READ_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n}\n\nexport function writeAgentData<T = any>(agentId: string, data: T): void {\n const filePath = getAgentFilePath(agentId)\n\n try {\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8')\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_WRITE_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\nexport function getDefaultAgentId(): string {\n return 'default'\n}\n\nexport function resolveAgentId(agentId?: string): string {\n return agentId || getDefaultAgentId()\n}\n\nexport function generateAgentId(): string {\n return randomUUID()\n}\n", "import {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n writeFileSync,\n} from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { createHash } from 'crypto'\nimport type { GlobalConfig, ProjectConfig } from '@utils/config'\nimport { getCurrentProjectConfig, getGlobalConfig } from '@utils/config'\nimport { resolveXdgDataPath } from '@utils/config/env'\nimport { getCwd } from '@utils/state'\n\nexport type TaskStatus = 'open' | 'in_progress' | 'blocked' | 'done' | 'archived'\n\nexport type TaskRecord = {\n id: string\n subject: string\n description?: string\n activeForm?: string\n status: TaskStatus\n tags?: string[]\n assignee?: string\n metadata?: Record<string, string>\n archived?: boolean\n blocks?: string[]\n blockedBy?: string[]\n parent?: string\n related?: string[]\n createdAt: number\n updatedAt: number\n baseVersion: number\n version: number\n legacyTodoId?: string\n}\n\nexport type TaskCreateInput = {\n subject?: string\n description?: string\n activeForm?: string\n status?: TaskStatus\n tags?: string[]\n assignee?: string\n metadata?: Record<string, string>\n archived?: boolean\n blocks?: string[]\n blockedBy?: string[]\n parent?: string\n related?: string[]\n legacyTodoId?: string\n}\n\nexport type TaskUpdateInput = Partial<TaskCreateInput> & {\n baseVersion?: number\n updatedAt?: number\n}\n\nexport type TaskUpdateResult = {\n task: TaskRecord\n conflict: boolean\n}\n\ntype TaskListScope = 'project' | 'global'\n\ntype TaskListContext = {\n listId: string\n scope: TaskListScope\n source: 'env' | 'global' | 'project' | 'default' | 'input'\n}\n\ntype TaskIndex = {\n nextId: number\n total: number\n byStatus: Record<TaskStatus, number>\n lastUpdated: number\n}\n\ntype TaskListMeta = {\n listId: string\n createdAt: number\n updatedAt: number\n todoMigration?: {\n completedAt: number\n sourceCount: number\n }\n}\n\nconst DEFAULT_LOCK_TTL_MS = 60000\n\nfunction buildActiveForm(subject: string): string {\n return `Working on ${subject}`\n}\n\nexport class TaskStoreLockError extends Error {\n code = 'TASK_STORE_LOCKED'\n constructor(message: string) {\n super(message)\n this.name = 'TaskStoreLockError'\n }\n}\n\nexport class TaskStoreConflictError extends Error {\n code = 'TASK_STORE_CONFLICT'\n taskId: string\n expectedBaseVersion: number\n actualBaseVersion: number\n constructor(params: { taskId: string; expected: number; actual: number }) {\n super(\n `Task ${params.taskId} baseVersion ${params.actual} does not match expected ${params.expected}`,\n )\n this.name = 'TaskStoreConflictError'\n this.taskId = params.taskId\n this.expectedBaseVersion = params.expected\n this.actualBaseVersion = params.actual\n }\n}\n\nexport function getDefaultTaskListId(cwd: string): string {\n return createHash('sha256').update(cwd).digest('hex').slice(0, 12)\n}\n\nfunction resolveGlobalTaskRootDir(): string {\n const override = process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR\n if (override) return override\n const home = homedir()\n const pybDir = join(home, '.pyb')\n if (existsSync(pybDir)) return pybDir\n const claudeDir = join(home, '.claude')\n if (existsSync(claudeDir)) return claudeDir\n return pybDir\n}\n\nfunction findBaseDirWithList(\n listId: string,\n candidates: string[],\n): string | null {\n for (const candidate of candidates) {\n if (existsSync(join(candidate, listId))) return candidate\n }\n return null\n}\n\nfunction getTaskListContext(options?: {\n listId?: string\n cwd?: string\n env?: NodeJS.ProcessEnv\n projectConfig?: ProjectConfig | null\n globalConfig?: GlobalConfig | null\n}): TaskListContext {\n const env = options?.env ?? process.env\n const globalConfig = options?.globalConfig ?? getGlobalConfig()\n const projectConfig = options?.projectConfig ?? getCurrentProjectConfig()\n const cwd = options?.cwd ?? getCwd()\n const defaultId = getDefaultTaskListId(cwd)\n const inputListId = options?.listId?.trim()\n\n const envId =\n env.PYB_TASK_LIST_ID?.trim() || env.CLAUDE_CODE_TASK_LIST_ID?.trim()\n const globalId = globalConfig?.taskListId?.trim()\n const projectId = projectConfig?.taskListId?.trim()\n\n if (inputListId) {\n if (inputListId === projectId || inputListId === defaultId) {\n return { listId: inputListId, scope: 'project', source: 'input' }\n }\n if (inputListId === globalId || inputListId === envId) {\n return { listId: inputListId, scope: 'global', source: 'input' }\n }\n return { listId: inputListId, scope: 'project', source: 'input' }\n }\n\n if (envId) return { listId: envId, scope: 'global', source: 'env' }\n if (globalId) return { listId: globalId, scope: 'global', source: 'global' }\n if (projectId) return { listId: projectId, scope: 'project', source: 'project' }\n\n return { listId: defaultId, scope: 'project', source: 'default' }\n}\n\nexport function getTaskListId(options?: {\n cwd?: string\n env?: NodeJS.ProcessEnv\n projectConfig?: ProjectConfig | null\n globalConfig?: GlobalConfig | null\n}): string {\n return getTaskListContext(options).listId\n}\n\nfunction resolveTaskBaseDir(context: TaskListContext, cwd: string): string {\n if (context.scope === 'project') {\n const pybDir = join(cwd, '.pyb')\n const claudeDir = join(cwd, '.claude')\n const hasProjectPyb = existsSync(pybDir)\n const hasProjectClaude = existsSync(claudeDir)\n const projectRoot = hasProjectPyb ? pybDir : hasProjectClaude ? claudeDir : pybDir\n const override = process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR\n const defaultBaseDir =\n !hasProjectPyb && !hasProjectClaude && override\n ? join(override, 'tasks')\n : join(projectRoot, 'tasks')\n const candidates = [\n join(cwd, '.pyb', 'tasks'),\n join(cwd, '.claude', 'tasks'),\n ...(override ? [join(override, 'tasks')] : []),\n resolveXdgDataPath('tasks'),\n ]\n return findBaseDirWithList(context.listId, candidates) ?? defaultBaseDir\n }\n\n const override = process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR\n const globalCandidates = override\n ? [join(override, 'tasks')]\n : [\n join(homedir(), '.pyb', 'tasks'),\n join(homedir(), '.claude', 'tasks'),\n ]\n const defaultBaseDir = join(resolveGlobalTaskRootDir(), 'tasks')\n const candidates = [...globalCandidates, resolveXdgDataPath('tasks')]\n return findBaseDirWithList(context.listId, candidates) ?? defaultBaseDir\n}\n\nexport function getTaskListPaths(listId?: string): {\n listId: string\n baseDir: string\n listDir: string\n tasksDir: string\n indexPath: string\n metaPath: string\n lockPath: string\n eventsPath: string\n} {\n const context = getTaskListContext({ listId })\n const cwd = getCwd()\n const baseDir = resolveTaskBaseDir(context, cwd)\n const listDir = join(baseDir, context.listId)\n return {\n listId: context.listId,\n baseDir,\n listDir,\n tasksDir: listDir,\n indexPath: join(listDir, 'index.json'),\n metaPath: join(listDir, 'meta.json'),\n lockPath: join(listDir, '.lock'),\n eventsPath: join(listDir, 'events.jsonl'),\n }\n}\n\nfunction ensureTaskListDirs(paths: ReturnType<typeof getTaskListPaths>): void {\n mkdirSync(paths.listDir, { recursive: true })\n}\n\nfunction defaultIndex(): TaskIndex {\n return {\n nextId: 1,\n total: 0,\n byStatus: {\n open: 0,\n in_progress: 0,\n blocked: 0,\n done: 0,\n archived: 0,\n },\n lastUpdated: Date.now(),\n }\n}\n\nfunction readJson<T>(path: string): T | null {\n if (!existsSync(path)) return null\n try {\n const raw = readFileSync(path, 'utf8')\n return JSON.parse(raw) as T\n } catch {\n return null\n }\n}\n\nfunction writeJson(path: string, value: unknown): void {\n writeFileSync(path, JSON.stringify(value, null, 2), 'utf8')\n}\n\nexport type TaskEventRecord = {\n listId: string\n taskId: string\n type: 'task.created' | 'task.updated'\n timestamp: number\n}\n\nfunction appendTaskEvent(\n paths: ReturnType<typeof getTaskListPaths>,\n event: TaskEventRecord,\n): void {\n ensureTaskListDirs(paths)\n writeFileSync(paths.eventsPath, `${JSON.stringify(event)}\\n`, {\n encoding: 'utf8',\n flag: 'a',\n })\n}\n\nexport function readTaskEventLog(\n listId?: string,\n offset: number = 0,\n): { events: TaskEventRecord[]; nextOffset: number } {\n const paths = getTaskListPaths(listId)\n if (!existsSync(paths.eventsPath)) {\n return { events: [], nextOffset: 0 }\n }\n const buffer = readFileSync(paths.eventsPath)\n const nextOffset = buffer.length\n if (offset >= nextOffset) {\n return { events: [], nextOffset }\n }\n const chunk = buffer.toString('utf8', offset)\n const events: TaskEventRecord[] = []\n for (const line of chunk.split('\\n')) {\n if (!line.trim()) continue\n try {\n const parsed = JSON.parse(line) as TaskEventRecord\n if (parsed.listId && parsed.taskId && parsed.type && parsed.timestamp) {\n events.push(parsed)\n }\n } catch {\n continue\n }\n }\n return { events, nextOffset }\n}\n\nfunction readIndex(paths: ReturnType<typeof getTaskListPaths>): TaskIndex {\n const index = readJson<TaskIndex>(paths.indexPath)\n if (index && index.nextId >= 1) return index\n return recoverIndex(paths)\n}\n\nfunction writeIndex(paths: ReturnType<typeof getTaskListPaths>, index: TaskIndex) {\n writeJson(paths.indexPath, index)\n}\n\nfunction readMeta(paths: ReturnType<typeof getTaskListPaths>): TaskListMeta {\n ensureTaskListDirs(paths)\n const meta = readJson<TaskListMeta>(paths.metaPath)\n if (meta && meta.listId) return meta\n const now = Date.now()\n const created: TaskListMeta = {\n listId: paths.listId,\n createdAt: now,\n updatedAt: now,\n }\n writeJson(paths.metaPath, created)\n return created\n}\n\nfunction writeMeta(\n paths: ReturnType<typeof getTaskListPaths>,\n meta: TaskListMeta,\n): void {\n ensureTaskListDirs(paths)\n writeJson(paths.metaPath, meta)\n}\n\nfunction readTaskFile(path: string): TaskRecord | null {\n const data = readJson<Partial<TaskRecord> & { title?: string; version?: number }>(\n path,\n )\n if (!data || !data.id || (!data.subject && !data.title) || !data.status) {\n return null\n }\n const subject = data.subject ?? data.title\n const activeForm = data.activeForm ?? buildActiveForm(subject)\n const baseVersion =\n typeof data.baseVersion === 'number'\n ? data.baseVersion\n : typeof data.version === 'number'\n ? data.version\n : 1\n const version = typeof data.version === 'number' ? data.version : baseVersion\n const createdAt =\n typeof data.createdAt === 'number' ? data.createdAt : Date.now()\n const updatedAt =\n typeof data.updatedAt === 'number' ? data.updatedAt : createdAt\n const normalized: TaskRecord = {\n id: data.id,\n subject,\n description: data.description,\n activeForm,\n status: data.status,\n tags: data.tags,\n assignee: data.assignee,\n metadata: data.metadata,\n archived: data.archived,\n blocks: data.blocks ?? [],\n blockedBy: data.blockedBy ?? [],\n parent: data.parent,\n related: data.related ?? [],\n createdAt,\n updatedAt,\n baseVersion,\n version,\n legacyTodoId: data.legacyTodoId,\n }\n delete (normalized as any).priority\n return normalized\n}\n\nfunction deriveBlocks(tasks: TaskRecord[]): Map<string, string[]> {\n const map = new Map<string, string[]>()\n for (const task of tasks) {\n map.set(task.id, [])\n }\n for (const task of tasks) {\n const blockers = task.blockedBy ?? []\n for (const blockerId of blockers) {\n const list = map.get(blockerId)\n if (list) {\n list.push(task.id)\n } else {\n map.set(blockerId, [task.id])\n }\n }\n }\n for (const [key, list] of map.entries()) {\n map.set(\n key,\n list.sort((a, b) => Number(a) - Number(b)),\n )\n }\n return map\n}\n\nfunction areBlocksEqual(a: string[] | undefined, b: string[] | undefined): boolean {\n const left = a ?? []\n const right = b ?? []\n if (left.length !== right.length) return false\n for (let i = 0; i < left.length; i += 1) {\n if (left[i] !== right[i]) return false\n }\n return true\n}\n\nfunction readTasksFromDisk(paths: ReturnType<typeof getTaskListPaths>): TaskRecord[] {\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n return files\n .map(file => readTaskFile(join(paths.tasksDir, file)))\n .filter(Boolean) as TaskRecord[]\n}\n\nfunction applyBlocksMap(\n tasks: TaskRecord[],\n map: Map<string, string[]>,\n): TaskRecord[] {\n return tasks.map(task => ({\n ...task,\n blocks: map.get(task.id) ?? [],\n }))\n}\n\nfunction persistBlocksMap(\n paths: ReturnType<typeof getTaskListPaths>,\n map: Map<string, string[]>,\n): number {\n ensureTaskListDirs(paths)\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n let updated = 0\n for (const file of files) {\n const path = join(paths.tasksDir, file)\n const raw = readJson<Partial<TaskRecord>>(path)\n if (!raw || !raw.id) continue\n const nextBlocks = map.get(raw.id) ?? []\n const currentBlocks = Array.isArray(raw.blocks) ? raw.blocks : []\n if (areBlocksEqual(currentBlocks, nextBlocks)) continue\n raw.blocks = nextBlocks\n writeJson(path, raw)\n updated += 1\n }\n return updated\n}\n\nfunction rebuildBlocksForPaths(paths: ReturnType<typeof getTaskListPaths>): {\n tasks: TaskRecord[]\n updated: number\n} {\n const tasks = readTasksFromDisk(paths)\n const map = deriveBlocks(tasks)\n const updated = persistBlocksMap(paths, map)\n return { tasks: applyBlocksMap(tasks, map), updated }\n}\n\nfunction recoverIndex(paths: ReturnType<typeof getTaskListPaths>): TaskIndex {\n ensureTaskListDirs(paths)\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n const tasks = files\n .map(file => readTaskFile(join(paths.tasksDir, file)))\n .filter(Boolean) as TaskRecord[]\n const byStatus = {\n open: 0,\n in_progress: 0,\n blocked: 0,\n done: 0,\n archived: 0,\n }\n let maxId = 0\n for (const task of tasks) {\n byStatus[task.status] += 1\n const numericId = Number(task.id)\n if (!Number.isNaN(numericId)) {\n maxId = Math.max(maxId, numericId)\n }\n }\n const index: TaskIndex = {\n nextId: Math.max(1, maxId + 1),\n total: tasks.length,\n byStatus,\n lastUpdated: Date.now(),\n }\n writeIndex(paths, index)\n return index\n}\n\nfunction readLock(\n path: string,\n): { createdAt: number; expiresAt: number } | null {\n const lock = readJson<{ createdAt: number; expiresAt: number }>(path)\n if (!lock || !lock.createdAt || !lock.expiresAt) return null\n return lock\n}\n\nfunction isLockExpired(lock: { expiresAt: number }): boolean {\n return lock.expiresAt <= Date.now()\n}\n\nfunction acquireLock(paths: ReturnType<typeof getTaskListPaths>): void {\n ensureTaskListDirs(paths)\n const lock = readLock(paths.lockPath)\n if (lock && !isLockExpired(lock)) {\n throw new TaskStoreLockError('Task list is locked')\n }\n if (lock && isLockExpired(lock)) {\n rmSync(paths.lockPath, { force: true })\n }\n const now = Date.now()\n try {\n writeFileSync(\n paths.lockPath,\n JSON.stringify(\n {\n createdAt: now,\n expiresAt: now + DEFAULT_LOCK_TTL_MS,\n },\n null,\n 2,\n ),\n { encoding: 'utf8', flag: 'wx' },\n )\n } catch {\n throw new TaskStoreLockError('Task list is locked')\n }\n}\n\nfunction releaseLock(paths: ReturnType<typeof getTaskListPaths>): void {\n rmSync(paths.lockPath, { force: true })\n}\n\nfunction withTaskListLock<T>(\n paths: ReturnType<typeof getTaskListPaths>,\n handler: () => T,\n): T {\n acquireLock(paths)\n try {\n return handler()\n } finally {\n releaseLock(paths)\n }\n}\n\nfunction applyTaskUpdates(\n task: TaskRecord,\n updates: TaskUpdateInput,\n nextBaseVersion: number,\n): TaskRecord {\n const now = updates.updatedAt ?? Date.now()\n const subject = updates.subject ?? task.subject\n const activeForm =\n updates.activeForm ??\n (updates.subject\n ? buildActiveForm(subject)\n : task.activeForm ?? buildActiveForm(subject))\n const blockedBy = updates.blockedBy ?? task.blockedBy ?? []\n return {\n ...task,\n subject,\n description: updates.description ?? task.description,\n activeForm,\n status: updates.status ?? task.status,\n tags: updates.tags ?? task.tags,\n assignee: updates.assignee ?? task.assignee,\n metadata: updates.metadata ?? task.metadata,\n archived: updates.archived ?? task.archived,\n blocks: task.blocks ?? [],\n blockedBy,\n parent: updates.parent ?? task.parent,\n related: updates.related ?? task.related,\n updatedAt: now,\n baseVersion: nextBaseVersion,\n version: nextBaseVersion,\n legacyTodoId: updates.legacyTodoId ?? task.legacyTodoId,\n }\n}\n\nexport function createTask(\n input: TaskCreateInput,\n options?: { listId?: string },\n): TaskRecord {\n const paths = getTaskListPaths(options?.listId)\n return withTaskListLock(paths, () => {\n ensureTaskListDirs(paths)\n const index = readIndex(paths)\n const id = String(index.nextId)\n const now = Date.now()\n const subject = input.subject\n if (!subject) {\n throw new Error('Task subject is required')\n }\n const activeForm = input.activeForm ?? buildActiveForm(subject)\n const record: TaskRecord = {\n id,\n subject,\n description: input.description,\n activeForm,\n status: input.status ?? 'open',\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blocks: [],\n blockedBy: input.blockedBy ?? [],\n parent: input.parent,\n related: input.related,\n createdAt: now,\n updatedAt: now,\n baseVersion: 1,\n version: 1,\n legacyTodoId: input.legacyTodoId,\n }\n writeJson(join(paths.tasksDir, `${id}.json`), record)\n index.nextId += 1\n index.total += 1\n index.byStatus[record.status] += 1\n index.lastUpdated = Date.now()\n writeIndex(paths, index)\n const meta = readMeta(paths)\n meta.updatedAt = Date.now()\n writeMeta(paths, meta)\n appendTaskEvent(paths, {\n listId: paths.listId,\n taskId: record.id,\n type: 'task.created',\n timestamp: Date.now(),\n })\n const { tasks } = rebuildBlocksForPaths(paths)\n const refreshed = tasks.find(task => task.id === record.id)\n return refreshed ?? record\n })\n}\n\nexport function getTask(\n id: string,\n options?: { listId?: string },\n): TaskRecord | null {\n const tasks = listTasks(options)\n return tasks.find(task => task.id === id) ?? null\n}\n\nexport function listTasks(options?: { listId?: string }): TaskRecord[] {\n const paths = getTaskListPaths(options?.listId)\n readIndex(paths)\n ensureTaskListDirs(paths)\n const tasks = readTasksFromDisk(paths)\n const map = deriveBlocks(tasks)\n const derived = applyBlocksMap(tasks, map)\n const needsPersist = tasks.some(task => {\n const nextBlocks = map.get(task.id) ?? []\n return !areBlocksEqual(task.blocks, nextBlocks)\n })\n const ready = needsPersist\n ? withTaskListLock(paths, () => rebuildBlocksForPaths(paths).tasks)\n : derived\n return ready.sort((a, b) => Number(a.id) - Number(b.id))\n}\n\nexport function updateTask(\n id: string,\n updates: TaskUpdateInput,\n options?: { listId?: string; allowMerge?: boolean },\n): TaskUpdateResult {\n const paths = getTaskListPaths(options?.listId)\n return withTaskListLock(paths, () => {\n const existing = readTaskFile(join(paths.tasksDir, `${id}.json`))\n if (!existing) {\n throw new Error(`Task ${id} not found`)\n }\n const requestedBase = updates.baseVersion\n const hasConflict =\n typeof requestedBase === 'number' &&\n requestedBase !== existing.baseVersion\n if (hasConflict && !options?.allowMerge) {\n throw new TaskStoreConflictError({\n taskId: id,\n expected: requestedBase,\n actual: existing.baseVersion,\n })\n }\n if (hasConflict && options?.allowMerge) {\n const updateTimestamp = updates.updatedAt ?? Date.now()\n if (updateTimestamp <= existing.updatedAt) {\n return { task: existing, conflict: true }\n }\n }\n const nextBaseVersion = existing.baseVersion + 1\n const updated = applyTaskUpdates(existing, updates, nextBaseVersion)\n writeJson(join(paths.tasksDir, `${id}.json`), updated)\n const index = readIndex(paths)\n if (updated.status !== existing.status) {\n index.byStatus[existing.status] = Math.max(\n 0,\n index.byStatus[existing.status] - 1,\n )\n index.byStatus[updated.status] += 1\n }\n index.lastUpdated = Date.now()\n writeIndex(paths, index)\n const meta = readMeta(paths)\n meta.updatedAt = Date.now()\n writeMeta(paths, meta)\n appendTaskEvent(paths, {\n listId: paths.listId,\n taskId: updated.id,\n type: 'task.updated',\n timestamp: Date.now(),\n })\n const { tasks } = rebuildBlocksForPaths(paths)\n const refreshed = tasks.find(task => task.id === updated.id)\n return { task: refreshed ?? updated, conflict: hasConflict }\n })\n}\n\nexport function rebuildTaskBlocks(options?: { listId?: string }): {\n updated: number\n total: number\n} {\n const paths = getTaskListPaths(options?.listId)\n return withTaskListLock(paths, () => {\n readIndex(paths)\n ensureTaskListDirs(paths)\n const { tasks, updated } = rebuildBlocksForPaths(paths)\n return { updated, total: tasks.length }\n })\n}\n\nexport function getTaskListMeta(options?: { listId?: string }): TaskListMeta {\n const paths = getTaskListPaths(options?.listId)\n return readMeta(paths)\n}\n\nexport function updateTaskListMeta(\n meta: TaskListMeta,\n options?: { listId?: string },\n): TaskListMeta {\n const paths = getTaskListPaths(options?.listId)\n const updated = { ...meta, updatedAt: Date.now() }\n writeMeta(paths, updated)\n return updated\n}\n", "import { setSessionState, getSessionState } from './sessionState'\nimport { readAgentData, writeAgentData, resolveAgentId } from '@utils/agent/storage'\nimport {\n createTask,\n getTaskListMeta,\n getTaskListPaths,\n listTasks,\n TaskStatus,\n updateTask,\n updateTaskListMeta,\n} from './taskStore'\n\nexport interface TodoItem {\n id: string\n content: string\n status: 'pending' | 'in_progress' | 'completed'\n activeForm: string\n priority: 'high' | 'medium' | 'low'\n createdAt?: number\n updatedAt?: number\n tags?: string[]\n estimatedHours?: number\n previousStatus?: 'pending' | 'in_progress' | 'completed'\n}\n\nexport interface TodoQuery {\n status?: TodoItem['status'][]\n priority?: TodoItem['priority'][]\n contentMatch?: string\n tags?: string[]\n dateRange?: { from?: Date; to?: Date }\n}\n\nexport interface TodoStorageConfig {\n maxTodos: number\n autoArchiveCompleted: boolean\n sortBy: 'createdAt' | 'updatedAt' | 'priority' | 'status'\n sortOrder: 'asc' | 'desc'\n}\n\nconst TODO_STORAGE_KEY = 'todos'\nconst TODO_CONFIG_KEY = 'todoConfig'\nconst TODO_CACHE_KEY = 'todoCache'\n\nconst DEFAULT_CONFIG: TodoStorageConfig = {\n maxTodos: 100,\n autoArchiveCompleted: false,\n sortBy: 'status',\n sortOrder: 'desc',\n}\n\nlet todoCache: TodoItem[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL = 5000\n\nexport function isTodoCompatEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n const raw = String(\n env.PYB_TODO_COMPAT ?? env.CLAUDE_CODE_TODO_COMPAT ?? '',\n )\n .trim()\n .toLowerCase()\n if (!raw) return false\n if (['0', 'false', 'no', 'off'].includes(raw)) return false\n if (['1', 'true', 'yes', 'on'].includes(raw)) return true\n return true\n}\n\nfunction toTaskStatus(status: TodoItem['status']): TaskStatus {\n if (status === 'completed') return 'done'\n if (status === 'in_progress') return 'in_progress'\n return 'open'\n}\n\nexport function syncTodosToTasks(\n todos: TodoItem[],\n options?: { listId?: string },\n): { listId: string; created: number; updated: number } {\n const { listId } = getTaskListPaths(options?.listId)\n const tasks = listTasks({ listId })\n const byLegacyId = new Map(\n tasks\n .filter(task => task.legacyTodoId)\n .map(task => [task.legacyTodoId as string, task]),\n )\n let created = 0\n let updated = 0\n for (const todo of todos) {\n const existing = byLegacyId.get(todo.id)\n if (!existing) {\n createTask(\n {\n subject: todo.content,\n description: todo.content,\n activeForm: todo.activeForm,\n status: toTaskStatus(todo.status),\n legacyTodoId: todo.id,\n },\n { listId },\n )\n created += 1\n } else {\n updateTask(\n existing.id,\n {\n subject: todo.content,\n description: todo.content,\n activeForm: todo.activeForm,\n status: toTaskStatus(todo.status),\n legacyTodoId: todo.id,\n },\n { listId, allowMerge: true },\n )\n updated += 1\n }\n }\n return { listId, created, updated }\n}\n\nexport function migrateTodosToTasks(options?: {\n listId?: string\n agentId?: string\n}): { listId: string; migrated: boolean; created: number } {\n const { listId } = getTaskListPaths(options?.listId)\n const meta = getTaskListMeta({ listId })\n if (meta.todoMigration?.completedAt) {\n return { listId, migrated: false, created: 0 }\n }\n const todos = getTodos(options?.agentId)\n const result = syncTodosToTasks(todos, { listId })\n updateTaskListMeta(\n {\n ...meta,\n todoMigration: {\n completedAt: Date.now(),\n sourceCount: todos.length,\n },\n },\n { listId },\n )\n return { listId, migrated: true, created: result.created }\n}\n\nexport function getTodoCompatSnapshot(options?: {\n listId?: string\n agentId?: string\n}): { listId: string; todos: TodoItem[]; tasks: ReturnType<typeof listTasks> } {\n const { listId } = getTaskListPaths(options?.listId)\n return {\n listId,\n todos: getTodos(options?.agentId),\n tasks: listTasks({ listId }),\n }\n}\n\nexport interface TodoMetrics {\n totalOperations: number\n cacheHits: number\n cacheMisses: number\n lastOperation: number\n}\n\nfunction invalidateCache(): void {\n todoCache = null\n cacheTimestamp = 0\n}\n\nfunction updateMetrics(operation: string, cacheHit: boolean = false): void {\n const sessionState = getSessionState() as any\n const metrics = sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n\n metrics.totalOperations++\n metrics.lastOperation = Date.now()\n\n if (cacheHit) {\n metrics.cacheHits++\n } else {\n metrics.cacheMisses++\n }\n\n setSessionState({\n ...sessionState,\n todoMetrics: metrics,\n })\n}\n\nexport function getTodoMetrics(): TodoMetrics {\n const sessionState = getSessionState() as any\n return (\n sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n )\n}\n\nexport function getTodos(agentId?: string): TodoItem[] {\n const resolvedAgentId = resolveAgentId(agentId)\n const now = Date.now()\n\n if (agentId) {\n updateMetrics('getTodos', false)\n const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []\n\n const agentCacheKey = `todoCache_${resolvedAgentId}`\n\n return agentTodos.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n if (todoCache && now - cacheTimestamp < CACHE_TTL) {\n updateMetrics('getTodos', true)\n return todoCache.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n updateMetrics('getTodos', false)\n const sessionState = getSessionState()\n const todos = (sessionState as any)[TODO_STORAGE_KEY] || []\n\n todoCache = [...todos].map((todo: TodoItem) => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n cacheTimestamp = now\n\n return todoCache\n}\n\nexport function setTodos(todos: TodoItem[], agentId?: string): void {\n const resolvedAgentId = resolveAgentId(agentId)\n const config = getTodoConfig()\n const existingTodos = getTodos(agentId)\n\n if (agentId) {\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(\n existing => existing.id === todo.id,\n )\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n writeAgentData(resolvedAgentId, updatedTodos)\n updateMetrics('setTodos')\n return\n }\n\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(existing => existing.id === todo.id)\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: updatedTodos,\n } as any)\n\n invalidateCache()\n updateMetrics('setTodos')\n}\n\nexport function getTodoConfig(): TodoStorageConfig {\n const sessionState = getSessionState() as any\n return { ...DEFAULT_CONFIG, ...(sessionState[TODO_CONFIG_KEY] || {}) }\n}\n\nexport function setTodoConfig(config: Partial<TodoStorageConfig>): void {\n const currentConfig = getTodoConfig()\n const newConfig = { ...currentConfig, ...config }\n\n setSessionState({\n ...getSessionState(),\n [TODO_CONFIG_KEY]: newConfig,\n } as any)\n\n if (config.sortBy || config.sortOrder) {\n const todos = getTodos()\n setTodos(todos)\n }\n}\n\nexport function addTodo(\n todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,\n): TodoItem[] {\n const todos = getTodos()\n\n if (todos.some(existing => existing.id === todo.id)) {\n throw new Error(`Todo with ID '${todo.id}' already exists`)\n }\n\n const newTodo: TodoItem = {\n ...todo,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }\n\n const updatedTodos = [...todos, newTodo]\n setTodos(updatedTodos)\n updateMetrics('addTodo')\n return updatedTodos\n}\n\nexport function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {\n const todos = getTodos()\n const existingTodo = todos.find(todo => todo.id === id)\n\n if (!existingTodo) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.map(todo =>\n todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,\n )\n\n setTodos(updatedTodos)\n updateMetrics('updateTodo')\n return updatedTodos\n}\n\nexport function deleteTodo(id: string): TodoItem[] {\n const todos = getTodos()\n const todoExists = todos.some(todo => todo.id === id)\n\n if (!todoExists) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.filter(todo => todo.id !== id)\n setTodos(updatedTodos)\n updateMetrics('deleteTodo')\n return updatedTodos\n}\n\nexport function clearTodos(): void {\n setTodos([])\n updateMetrics('clearTodos')\n}\n\nexport function getTodoById(id: string): TodoItem | undefined {\n const todos = getTodos()\n updateMetrics('getTodoById')\n return todos.find(todo => todo.id === id)\n}\n\nexport function getTodosByStatus(status: TodoItem['status']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByStatus')\n return todos.filter(todo => todo.status === status)\n}\n\nexport function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByPriority')\n return todos.filter(todo => todo.priority === priority)\n}\n\nexport function queryTodos(query: TodoQuery): TodoItem[] {\n const todos = getTodos()\n updateMetrics('queryTodos')\n\n return todos.filter(todo => {\n if (query.status && !query.status.includes(todo.status)) {\n return false\n }\n\n if (query.priority && !query.priority.includes(todo.priority)) {\n return false\n }\n\n if (\n query.contentMatch &&\n !todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())\n ) {\n return false\n }\n\n if (query.tags && todo.tags) {\n const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))\n if (!hasMatchingTag) return false\n }\n\n if (query.dateRange) {\n const todoDate = new Date(todo.createdAt || 0)\n if (query.dateRange.from && todoDate < query.dateRange.from) return false\n if (query.dateRange.to && todoDate > query.dateRange.to) return false\n }\n\n return true\n })\n}\n\nexport function getTodoStatistics() {\n const todos = getTodos()\n const metrics = getTodoMetrics()\n\n return {\n total: todos.length,\n byStatus: {\n pending: todos.filter(t => t.status === 'pending').length,\n in_progress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n },\n byPriority: {\n high: todos.filter(t => t.priority === 'high').length,\n medium: todos.filter(t => t.priority === 'medium').length,\n low: todos.filter(t => t.priority === 'low').length,\n },\n metrics,\n cacheEfficiency:\n metrics.totalOperations > 0\n ? Math.round((metrics.cacheHits / metrics.totalOperations) * 100)\n : 0,\n }\n}\n\nexport function optimizeTodoStorage(): void {\n invalidateCache()\n\n const todos = getTodos()\n const validTodos = todos.filter(\n todo =>\n todo.id &&\n todo.content &&\n todo.activeForm &&\n ['pending', 'in_progress', 'completed'].includes(todo.status) &&\n ['high', 'medium', 'low'].includes(todo.priority),\n )\n\n if (validTodos.length !== todos.length) {\n setTodos(validTodos)\n }\n\n updateMetrics('optimizeTodoStorage')\n}\n", "import { getTodos, TodoItem } from '@utils/session/todoStorage'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\n\nexport interface ReminderMessage {\n role: 'system'\n content: string\n isMeta: boolean\n timestamp: number\n type: string\n priority: 'low' | 'medium' | 'high'\n category: 'task' | 'security' | 'performance' | 'general'\n}\n\ninterface ReminderConfig {\n todoEmptyReminder: boolean\n securityReminder: boolean\n performanceReminder: boolean\n maxRemindersPerSession: number\n}\n\ninterface SessionReminderState {\n lastTodoUpdate: number\n lastFileAccess: number\n lastTaskUpdate: number\n sessionStartTime: number\n remindersSent: Set<string>\n contextPresent: boolean\n reminderCount: number\n taskEventTimestamps: Map<string, number>\n config: ReminderConfig\n}\n\nclass SystemReminderService {\n private sessionState: SessionReminderState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n lastTaskUpdate: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n taskEventTimestamps: new Map(),\n config: {\n todoEmptyReminder: true,\n securityReminder: true,\n performanceReminder: true,\n maxRemindersPerSession: 10,\n },\n }\n\n private eventDispatcher = new Map<string, Array<(context: any) => void>>()\n private reminderCache = new Map<string, ReminderMessage>()\n\n constructor() {\n this.setupEventDispatcher()\n }\n\n public generateReminders(\n hasContext: boolean = false,\n agentId?: string,\n ): ReminderMessage[] {\n this.sessionState.contextPresent = hasContext\n\n if (!hasContext) {\n return []\n }\n\n if (\n this.sessionState.reminderCount >=\n this.sessionState.config.maxRemindersPerSession\n ) {\n return []\n }\n\n const reminders: ReminderMessage[] = []\n const currentTime = Date.now()\n\n const reminderGenerators = [\n () => this.dispatchTodoEvent(agentId),\n () => this.dispatchSecurityEvent(),\n () => this.dispatchPerformanceEvent(),\n () => this.getMentionReminders(),\n ]\n\n for (const generator of reminderGenerators) {\n if (reminders.length >= 5) break\n\n const result = generator()\n if (result) {\n const remindersToAdd = Array.isArray(result) ? result : [result]\n reminders.push(...remindersToAdd)\n this.sessionState.reminderCount += remindersToAdd.length\n }\n }\n\n return reminders\n }\n\n private dispatchTodoEvent(agentId?: string): ReminderMessage | null {\n if (!this.sessionState.config.todoEmptyReminder) return null\n\n const todos = getTodos(agentId)\n const currentTime = Date.now()\n const agentKey = agentId || 'default'\n\n if (\n todos.length === 0 &&\n !this.sessionState.remindersSent.has(`todo_empty_${agentKey}`)\n ) {\n this.sessionState.remindersSent.add(`todo_empty_${agentKey}`)\n return this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n 'This is a reminder that your task list is currently empty. DO NOT mention this to the user explicitly because they are already aware. If you are working on tasks that would benefit from a structured plan, use TaskCreate to seed tasks and TaskUpdate to track progress. Use TaskList to review readiness. If not, please feel free to ignore. Again do not mention this message to the user.',\n currentTime,\n )\n }\n\n if (todos.length > 0) {\n const reminderKey = `todo_updated_${agentKey}_${todos.length}_${this.getTodoStateHash(todos)}`\n\n if (this.reminderCache.has(reminderKey)) {\n return this.reminderCache.get(reminderKey)!\n }\n\n if (!this.sessionState.remindersSent.has(reminderKey)) {\n this.sessionState.remindersSent.add(reminderKey)\n this.clearTodoReminders(agentKey)\n\n const todoContent = JSON.stringify(\n todos.map(todo => ({\n content:\n todo.content.length > 100\n ? todo.content.substring(0, 100) + '...'\n : todo.content,\n status: todo.status,\n activeForm:\n todo.activeForm && todo.activeForm.length > 100\n ? todo.activeForm.substring(0, 100) + '...'\n : todo.activeForm || todo.content,\n })),\n )\n\n const reminder = this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n `Your task items have changed. DO NOT mention this explicitly to the user. Here are the latest contents of your tracked items:\\n\\n${todoContent}. Use TaskList to review readiness and TaskUpdate to adjust status if needed.`,\n currentTime,\n )\n\n this.reminderCache.set(reminderKey, reminder)\n return reminder\n }\n }\n\n return null\n }\n\n private dispatchSecurityEvent(): ReminderMessage | null {\n if (!this.sessionState.config.securityReminder) return null\n\n const currentTime = Date.now()\n\n if (\n this.sessionState.lastFileAccess > 0 &&\n !this.sessionState.remindersSent.has('file_security')\n ) {\n this.sessionState.remindersSent.add('file_security')\n return this.createReminderMessage(\n 'security',\n 'security',\n 'high',\n 'Whenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.',\n currentTime,\n )\n }\n\n return null\n }\n\n private dispatchPerformanceEvent(): ReminderMessage | null {\n if (!this.sessionState.config.performanceReminder) return null\n\n const currentTime = Date.now()\n const sessionDuration = currentTime - this.sessionState.sessionStartTime\n\n if (\n sessionDuration > 30 * 60 * 1000 &&\n !this.sessionState.remindersSent.has('performance_long_session')\n ) {\n this.sessionState.remindersSent.add('performance_long_session')\n return this.createReminderMessage(\n 'performance',\n 'performance',\n 'low',\n 'Long session detected. Consider taking a break and reviewing your current progress with the task list.',\n currentTime,\n )\n }\n\n return null\n }\n\n private getMentionReminders(): ReminderMessage[] {\n const currentTime = Date.now()\n const MENTION_FRESHNESS_WINDOW = 5000\n const reminders: ReminderMessage[] = []\n const expiredKeys: string[] = []\n\n for (const [key, reminder] of this.reminderCache.entries()) {\n if (this.isMentionReminder(reminder)) {\n const age = currentTime - reminder.timestamp\n if (age <= MENTION_FRESHNESS_WINDOW) {\n reminders.push(reminder)\n } else {\n expiredKeys.push(key)\n }\n }\n }\n\n expiredKeys.forEach(key => this.reminderCache.delete(key))\n\n return reminders\n }\n\n private isMentionReminder(reminder: ReminderMessage): boolean {\n const mentionTypes = ['agent_mention', 'file_mention', 'ask_model_mention']\n return mentionTypes.includes(reminder.type)\n }\n\n public generateFileChangeReminder(context: any): ReminderMessage | null {\n const { agentId, filePath, reminder } = context\n\n if (!reminder) {\n return null\n }\n\n const currentTime = Date.now()\n const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`\n\n if (this.sessionState.remindersSent.has(reminderKey)) {\n return null\n }\n\n this.sessionState.remindersSent.add(reminderKey)\n\n return this.createReminderMessage(\n 'file_changed',\n 'general',\n 'medium',\n reminder,\n currentTime,\n )\n }\n\n private createReminderMessage(\n type: string,\n category: ReminderMessage['category'],\n priority: ReminderMessage['priority'],\n content: string,\n timestamp: number,\n ): ReminderMessage {\n return {\n role: 'system',\n content: `<system-reminder>\\n${content}\\n</system-reminder>`,\n isMeta: true,\n timestamp,\n type,\n priority,\n category,\n }\n }\n\n private getTodoStateHash(todos: TodoItem[]): string {\n return todos\n .map(t => `${t.content}:${t.status}:${t.activeForm || t.content}`)\n .sort()\n .join('|')\n }\n\n private clearTodoReminders(agentId?: string): void {\n const agentKey = agentId || 'default'\n for (const key of this.sessionState.remindersSent) {\n if (key.startsWith(`todo_updated_${agentKey}_`)) {\n this.sessionState.remindersSent.delete(key)\n }\n }\n }\n\n private shouldEmitTaskReminder(key: string, throttleMs: number): boolean {\n const now = Date.now()\n const last = this.sessionState.taskEventTimestamps.get(key) ?? 0\n if (now - last < throttleMs) {\n return false\n }\n this.sessionState.taskEventTimestamps.set(key, now)\n return true\n }\n\n private createTaskListReminder(context: any): ReminderMessage | null {\n const { listId, summary } = context\n if (!summary || !listId) return null\n const reminderKey = `task_list_${listId}_${summary.total}_${summary.ready}_${summary.blocked}_${summary.inProgress}_${summary.open}_${summary.done}_${summary.archived}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_list_changed',\n 'task',\n 'medium',\n `Your task list changed. Ready: ${summary.ready}, Blocked: ${summary.blocked}, In progress: ${summary.inProgress}, Open: ${summary.open}, Done: ${summary.done}, Archived: ${summary.archived}.`,\n Date.now(),\n )\n }\n\n private createTaskReadyReminder(context: any): ReminderMessage | null {\n const { listId, readyIds } = context\n if (!listId || !Array.isArray(readyIds)) return null\n const limited = readyIds.slice(0, 5).join(', ')\n const reminderKey = `task_ready_${listId}_${readyIds.length}_${limited}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_ready_changed',\n 'task',\n 'medium',\n `Task readiness changed. Ready count: ${readyIds.length}. Ready ids: ${limited || 'none'}.`,\n Date.now(),\n )\n }\n\n private createTaskConflictReminder(context: any): ReminderMessage | null {\n const { listId, taskId } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_conflict_${listId}_${taskId}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_conflict',\n 'task',\n 'high',\n `Task update conflict detected for ${taskId}. Refresh task data and retry updates with the latest baseVersion.`,\n Date.now(),\n )\n }\n\n private createTaskCreatedReminder(context: any): ReminderMessage | null {\n const { listId, taskId, task } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_created_${listId}_${taskId}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n const subject = task?.subject || taskId\n return this.createReminderMessage(\n 'task_created',\n 'task',\n 'medium',\n `Task created: ${subject} (${taskId}). Review details and adjust status if needed.`,\n Date.now(),\n )\n }\n\n private createTaskUpdatedReminder(context: any): ReminderMessage | null {\n const { listId, taskId, task } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_updated_${listId}_${taskId}_${task?.baseVersion ?? ''}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n const subject = task?.subject || taskId\n return this.createReminderMessage(\n 'task_updated',\n 'task',\n 'medium',\n `Task updated: ${subject} (${taskId}). Confirm dependencies and status are correct.`,\n Date.now(),\n )\n }\n\n private createTaskStatusReminder(context: any): ReminderMessage | null {\n const { listId, taskId, previousStatus, status } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_status_${listId}_${taskId}_${previousStatus}_${status}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_status_changed',\n 'task',\n 'medium',\n `Task status changed for ${taskId}: ${previousStatus} \u2192 ${status}. Review dependent tasks if needed.`,\n Date.now(),\n )\n }\n\n private createTaskDepsReminder(context: any): ReminderMessage | null {\n const { listId, taskId, deps } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_deps_${listId}_${taskId}_${JSON.stringify(deps ?? {})}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_deps_changed',\n 'task',\n 'medium',\n `Task dependencies changed for ${taskId}. Recheck readiness and blockers.`,\n Date.now(),\n )\n }\n\n private setupEventDispatcher(): void {\n this.addEventListener('session:startup', context => {\n this.resetSession()\n\n this.sessionState.sessionStartTime = Date.now()\n this.sessionState.contextPresent =\n Object.keys(context.context || {}).length > 0\n })\n\n this.addEventListener('todo:changed', context => {\n this.sessionState.lastTodoUpdate = Date.now()\n this.clearTodoReminders(context.agentId)\n })\n\n this.addEventListener('todo:file_changed', context => {\n const agentId = context.agentId || 'default'\n this.clearTodoReminders(agentId)\n this.sessionState.lastTodoUpdate = Date.now()\n\n const reminder = this.generateFileChangeReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n agentId,\n type: 'file_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task:list_changed', context => {\n const key = `task_list_${context.listId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n this.sessionState.lastTaskUpdate = Date.now()\n const reminder = this.createTaskListReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: 'task_list_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task:ready_changed', context => {\n const key = `task_ready_${context.listId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskReadyReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: 'task_ready_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task:conflict_detected', context => {\n const key = `task_conflict_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskConflictReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: 'task_conflict',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task.created', context => {\n const key = `task_created_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskCreatedReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('task.updated', context => {\n const key = `task_updated_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskUpdatedReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('task.status_changed', context => {\n const key = `task_status_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskStatusReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('task.deps_changed', context => {\n const key = `task_deps_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskDepsReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('file:read', context => {\n this.sessionState.lastFileAccess = Date.now()\n })\n\n this.addEventListener('file:edited', context => {\n })\n\n this.addEventListener('agent:mentioned', context => {\n this.createMentionReminder({\n type: 'agent_mention',\n key: `agent_mention_${context.agentType}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST use the Task tool with subagent_type=\"${context.agentType}\" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${context.agentType} agent to execute.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('file:mentioned', context => {\n this.createMentionReminder({\n type: 'file_mention',\n key: `file_mention_${context.filePath}_${context.timestamp}`,\n category: 'general',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST read the entire content of the file at path: ${context.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('ask-model:mentioned', context => {\n this.createMentionReminder({\n type: 'ask_model_mention',\n key: `ask_model_mention_${context.modelName}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${context.modelName}.`,\n timestamp: context.timestamp,\n })\n })\n }\n\n public addEventListener(\n event: string,\n callback: (context: any) => void,\n ): void {\n if (!this.eventDispatcher.has(event)) {\n this.eventDispatcher.set(event, [])\n }\n this.eventDispatcher.get(event)!.push(callback)\n }\n\n public emitEvent(event: string, context: any): void {\n const listeners = this.eventDispatcher.get(event) || []\n listeners.forEach(callback => {\n try {\n callback(context)\n } catch (error) {\n logError(error)\n debugLogger.warn('SYSTEM_REMINDER_LISTENER_ERROR', {\n event,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n })\n }\n\n private createMentionReminder(params: {\n type: string\n key: string\n category: ReminderMessage['category']\n priority: ReminderMessage['priority']\n content: string\n timestamp: number\n }): void {\n if (!this.sessionState.remindersSent.has(params.key)) {\n this.sessionState.remindersSent.add(params.key)\n\n const reminder = this.createReminderMessage(\n params.type,\n params.category,\n params.priority,\n params.content,\n params.timestamp,\n )\n\n this.reminderCache.set(params.key, reminder)\n }\n }\n\n public resetSession(): void {\n this.sessionState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n lastTaskUpdate: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n taskEventTimestamps: new Map(),\n config: { ...this.sessionState.config },\n }\n this.reminderCache.clear()\n }\n\n public updateConfig(config: Partial<ReminderConfig>): void {\n this.sessionState.config = { ...this.sessionState.config, ...config }\n }\n\n public getSessionState(): SessionReminderState {\n return { ...this.sessionState }\n }\n}\n\nexport const systemReminderService = new SystemReminderService()\n\nexport const generateSystemReminders = (\n hasContext: boolean = false,\n agentId?: string,\n) => systemReminderService.generateReminders(hasContext, agentId)\n\nexport const generateFileChangeReminder = (context: any) =>\n systemReminderService.generateFileChangeReminder(context)\n\nexport const emitReminderEvent = (event: string, context: any) =>\n systemReminderService.emitEvent(event, context)\n\nexport const resetReminderSession = () => systemReminderService.resetSession()\nexport const getReminderSessionState = () =>\n systemReminderService.getSessionState()\n"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "mkdirSync", "readFileSync", "writeFileSync", "join", "join", "existsSync", "join", "existsSync", "override", "defaultBaseDir", "candidates", "mkdirSync", "existsSync", "readFileSync", "writeFileSync", "join", "processedTodos", "updatedTodos"]
7
+ }
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getGlobalConfig
5
- } from "./chunk-TNAAGT3Q.js";
5
+ } from "./chunk-BEP5VFCR.js";
6
6
 
7
7
  // src/utils/theme/index.ts
8
8
  var lightTheme = {
@@ -6,12 +6,12 @@ import {
6
6
  } from "./chunk-ERMQRV55.js";
7
7
  import {
8
8
  getGlobalConfig
9
- } from "./chunk-TNAAGT3Q.js";
9
+ } from "./chunk-BEP5VFCR.js";
10
10
  import {
11
11
  debug,
12
12
  getCurrentRequest,
13
13
  logAPIError
14
- } from "./chunk-O5OT26P6.js";
14
+ } from "./chunk-BDM7IINE.js";
15
15
 
16
16
  // src/services/ai/openai.ts
17
17
  import { ProxyAgent, fetch } from "undici";
@@ -7,14 +7,14 @@ import {
7
7
  getSettingsFileCandidates,
8
8
  loadSettingsWithLegacyFallback,
9
9
  saveSettingsToPrimaryAndSyncLegacy
10
- } from "./chunk-N4GXGPVA.js";
10
+ } from "./chunk-VCXKB4QH.js";
11
11
  import {
12
12
  getSessionPlugins
13
13
  } from "./chunk-BJSWTHRM.js";
14
14
  import {
15
15
  getCwd,
16
16
  getXdgConfigDir
17
- } from "./chunk-ZGVGFR4C.js";
17
+ } from "./chunk-FJBRBBAE.js";
18
18
 
19
19
  // src/services/ui/outputStyles.ts
20
20
  import figures from "figures";
@@ -3,7 +3,7 @@ const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  SESSION_ID,
5
5
  resolveXdgCachePath
6
- } from "./chunk-ZGVGFR4C.js";
6
+ } from "./chunk-FJBRBBAE.js";
7
7
 
8
8
  // src/utils/log/debugLogger.ts
9
9
  import { existsSync, mkdirSync, appendFileSync } from "fs";
@@ -5,13 +5,13 @@ import {
5
5
  } from "./chunk-RQVLBMP7.js";
6
6
  import {
7
7
  debug
8
- } from "./chunk-O5OT26P6.js";
8
+ } from "./chunk-BDM7IINE.js";
9
9
  import {
10
10
  getCwd,
11
11
  getGlobalConfigFilePath,
12
12
  getLegacyGlobalConfigFilePath,
13
13
  logError
14
- } from "./chunk-ZGVGFR4C.js";
14
+ } from "./chunk-FJBRBBAE.js";
15
15
 
16
16
  // src/core/config/schema.ts
17
17
  function isAutoUpdaterStatus(value) {
@@ -688,7 +688,7 @@ function setModelPointer(pointer, modelName) {
688
688
  }
689
689
  };
690
690
  saveGlobalConfig(updatedConfig);
691
- import("./model-R5X6XP7I.js").then(({ reloadModelManager }) => {
691
+ import("./model-FY7P6LPI.js").then(({ reloadModelManager }) => {
692
692
  reloadModelManager();
693
693
  });
694
694
  }