pybao-cli 1.4.50 → 1.4.51

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 (148) hide show
  1. package/dist/REPL-6YEOSMEP.js +47 -0
  2. package/dist/{acp-KK2TTZQY.js → acp-2C774HUW.js} +31 -31
  3. package/dist/{agentsValidate-QLHEEXIH.js → agentsValidate-RCXZBOU3.js} +7 -7
  4. package/dist/{ask-QPP4RXLN.js → ask-EIO3Q6ED.js} +30 -30
  5. package/dist/{autoUpdater-4TO2D7ST.js → autoUpdater-IIJMDPJE.js} +3 -3
  6. package/dist/{chunk-O57TU7BN.js → chunk-5RX62PWR.js} +1 -1
  7. package/dist/{chunk-QMS564WP.js → chunk-6MFZG46W.js} +1 -1
  8. package/dist/{chunk-OOKJ3YEP.js → chunk-DCSAQNHW.js} +4 -4
  9. package/dist/{chunk-7FPCY7TP.js → chunk-ESKTQXW6.js} +27 -3
  10. package/dist/chunk-ESKTQXW6.js.map +7 -0
  11. package/dist/{chunk-XPPMTVLO.js → chunk-G2FI43IB.js} +2 -2
  12. package/dist/{chunk-E3U4MTTG.js → chunk-GLS3ZXCS.js} +3 -3
  13. package/dist/{chunk-VRJYDMPZ.js → chunk-GTP62T63.js} +3 -3
  14. package/dist/{chunk-XY7UAZHR.js → chunk-HJDETBB6.js} +1 -1
  15. package/dist/{chunk-F4YDJQRG.js → chunk-HY24VLOS.js} +1 -1
  16. package/dist/{chunk-THDYF2NK.js → chunk-KDKXQODT.js} +2 -2
  17. package/dist/{chunk-XCXUN4XC.js → chunk-KNOCJVE6.js} +1 -1
  18. package/dist/{chunk-INTHXBZY.js → chunk-L2FQX7IL.js} +419 -244
  19. package/dist/chunk-L2FQX7IL.js.map +7 -0
  20. package/dist/{chunk-RW4ITNVB.js → chunk-LAFEZLTD.js} +307 -211
  21. package/dist/chunk-LAFEZLTD.js.map +7 -0
  22. package/dist/{chunk-K7HQMRMK.js → chunk-LAQQRRQR.js} +4 -4
  23. package/dist/{chunk-JS7GLW6B.js → chunk-LEQNJ73H.js} +3 -3
  24. package/dist/{chunk-5DMG6XJO.js → chunk-MZ6UJROW.js} +4 -4
  25. package/dist/{chunk-IMUE6ZJT.js → chunk-N6DXTYLR.js} +3 -3
  26. package/dist/{chunk-6WBYGMWM.js → chunk-OBFMPMGW.js} +2 -2
  27. package/dist/{chunk-VB7G5DP7.js → chunk-OYCMMRZV.js} +1 -1
  28. package/dist/{chunk-DY6LXTDU.js → chunk-PKAVBIO7.js} +1 -1
  29. package/dist/{chunk-AC5SOSXY.js → chunk-SNKLRBWT.js} +2 -2
  30. package/dist/{chunk-2QE4GPBW.js → chunk-SQJJRPIY.js} +5 -5
  31. package/dist/{chunk-FN7TY3BC.js → chunk-TMFNSMVV.js} +6 -6
  32. package/dist/{chunk-EJEYT52K.js → chunk-U7MPXQO4.js} +3 -3
  33. package/dist/{chunk-7NJIEGSZ.js → chunk-VUILI5ED.js} +2 -2
  34. package/dist/{chunk-XLBYKCIE.js → chunk-WCKPMAYX.js} +1 -1
  35. package/dist/{chunk-SKHJKLQU.js → chunk-WSN5UCPE.js} +1 -1
  36. package/dist/{chunk-AB22WTOW.js → chunk-YNVGW5VZ.js} +7 -7
  37. package/dist/{chunk-6JSMWPVG.js → chunk-YTUV273Y.js} +50 -122
  38. package/dist/{chunk-6JSMWPVG.js.map → chunk-YTUV273Y.js.map} +2 -2
  39. package/dist/{chunk-S4ZD6CIB.js → chunk-ZQAKMVXR.js} +3 -3
  40. package/dist/{cli-Q6CUQXUW.js → cli-JPS6PPHH.js} +91 -89
  41. package/dist/{cli-Q6CUQXUW.js.map → cli-JPS6PPHH.js.map} +2 -2
  42. package/dist/commands-3IJYY2KF.js +51 -0
  43. package/dist/{config-VXOZS327.js → config-7RFJBYCF.js} +4 -4
  44. package/dist/{context-45BMQQBI.js → context-L6IDU4ZF.js} +6 -6
  45. package/dist/{customCommands-YJKDWVLN.js → customCommands-2ZLDKEPS.js} +4 -4
  46. package/dist/{env-6I7ZEE2U.js → env-KKHHZ47D.js} +2 -2
  47. package/dist/{file-E5DNNSWV.js → file-QGJRLWJ7.js} +4 -4
  48. package/dist/index.js +3 -3
  49. package/dist/{llm-XKWTYXNE.js → llm-HHSKS5JE.js} +31 -31
  50. package/dist/{llmLazy-VHV6V3FH.js → llmLazy-YV33JO4W.js} +1 -1
  51. package/dist/{loader-L7DYSPCI.js → loader-YCEP5CYE.js} +4 -4
  52. package/dist/{lsp-AQZ4MHRE.js → lsp-TG3EZZOU.js} +6 -6
  53. package/dist/{lspAnchor-VVWRVWR6.js → lspAnchor-T3544E7J.js} +6 -6
  54. package/dist/{mcp-R47AVTKX.js → mcp-SWYFI5FF.js} +7 -7
  55. package/dist/{mentionProcessor-AAB567RH.js → mentionProcessor-IP6FAEXL.js} +7 -6
  56. package/dist/{mentionProcessor-AAB567RH.js.map → mentionProcessor-IP6FAEXL.js.map} +1 -1
  57. package/dist/{messages-6RZPVGYV.js → messages-3B2ZJJKW.js} +1 -1
  58. package/dist/{model-XS54COOK.js → model-HDJXCBKD.js} +5 -5
  59. package/dist/{openai-36NGQ6WH.js → openai-DF2BQT7X.js} +5 -5
  60. package/dist/{outputStyles-4Q6RXLFD.js → outputStyles-GWUBSKDY.js} +4 -4
  61. package/dist/{pluginRuntime-X6X2WUUY.js → pluginRuntime-LKAAMJH2.js} +6 -6
  62. package/dist/{pluginValidation-L7QBW3EG.js → pluginValidation-7GJA32YV.js} +6 -6
  63. package/dist/prompts-DB772NLS.js +53 -0
  64. package/dist/{pybAgentSessionLoad-OQZ4472Q.js → pybAgentSessionLoad-BGIX7L4O.js} +4 -4
  65. package/dist/{pybAgentSessionResume-F5USKNP6.js → pybAgentSessionResume-VKK6VZSA.js} +4 -4
  66. package/dist/{pybAgentStreamJsonSession-3STGT5U7.js → pybAgentStreamJsonSession-HDXJ4F5W.js} +1 -1
  67. package/dist/{pybHooks-ZRWKBZYR.js → pybHooks-LEIAZ7D6.js} +5 -5
  68. package/dist/query-LVPGQYDL.js +55 -0
  69. package/dist/{registry-KLVCZCUO.js → registry-C4V5AZ6N.js} +5 -5
  70. package/dist/{ripgrep-MYJ7I7AT.js → ripgrep-PWIRRS2Q.js} +3 -3
  71. package/dist/{skillMarketplace-RUUAPJSB.js → skillMarketplace-GZN6RWUY.js} +3 -3
  72. package/dist/{state-XDFG3NGH.js → state-T7WQKFBG.js} +2 -2
  73. package/dist/{theme-6NH5WLGE.js → theme-CLYLDSCI.js} +5 -5
  74. package/dist/{toolPermissionSettings-6YFH2NEA.js → toolPermissionSettings-UYHSUTC5.js} +6 -6
  75. package/dist/tools-SEWCFM5P.js +52 -0
  76. package/dist/{userInput-XNKXJX2C.js → userInput-KZXH5O7V.js} +32 -32
  77. package/package.json +27 -3
  78. package/dist/REPL-VW5R4TZU.js +0 -47
  79. package/dist/chunk-7FPCY7TP.js.map +0 -7
  80. package/dist/chunk-INTHXBZY.js.map +0 -7
  81. package/dist/chunk-RW4ITNVB.js.map +0 -7
  82. package/dist/commands-FSZDEWK7.js +0 -51
  83. package/dist/prompts-FVZABM4B.js +0 -53
  84. package/dist/query-W3ZWVYMU.js +0 -55
  85. package/dist/tools-T6FWIKGI.js +0 -52
  86. /package/dist/{REPL-VW5R4TZU.js.map → REPL-6YEOSMEP.js.map} +0 -0
  87. /package/dist/{acp-KK2TTZQY.js.map → acp-2C774HUW.js.map} +0 -0
  88. /package/dist/{agentsValidate-QLHEEXIH.js.map → agentsValidate-RCXZBOU3.js.map} +0 -0
  89. /package/dist/{ask-QPP4RXLN.js.map → ask-EIO3Q6ED.js.map} +0 -0
  90. /package/dist/{autoUpdater-4TO2D7ST.js.map → autoUpdater-IIJMDPJE.js.map} +0 -0
  91. /package/dist/{chunk-O57TU7BN.js.map → chunk-5RX62PWR.js.map} +0 -0
  92. /package/dist/{chunk-QMS564WP.js.map → chunk-6MFZG46W.js.map} +0 -0
  93. /package/dist/{chunk-OOKJ3YEP.js.map → chunk-DCSAQNHW.js.map} +0 -0
  94. /package/dist/{chunk-XPPMTVLO.js.map → chunk-G2FI43IB.js.map} +0 -0
  95. /package/dist/{chunk-E3U4MTTG.js.map → chunk-GLS3ZXCS.js.map} +0 -0
  96. /package/dist/{chunk-VRJYDMPZ.js.map → chunk-GTP62T63.js.map} +0 -0
  97. /package/dist/{chunk-XY7UAZHR.js.map → chunk-HJDETBB6.js.map} +0 -0
  98. /package/dist/{chunk-F4YDJQRG.js.map → chunk-HY24VLOS.js.map} +0 -0
  99. /package/dist/{chunk-THDYF2NK.js.map → chunk-KDKXQODT.js.map} +0 -0
  100. /package/dist/{chunk-XCXUN4XC.js.map → chunk-KNOCJVE6.js.map} +0 -0
  101. /package/dist/{chunk-K7HQMRMK.js.map → chunk-LAQQRRQR.js.map} +0 -0
  102. /package/dist/{chunk-JS7GLW6B.js.map → chunk-LEQNJ73H.js.map} +0 -0
  103. /package/dist/{chunk-5DMG6XJO.js.map → chunk-MZ6UJROW.js.map} +0 -0
  104. /package/dist/{chunk-IMUE6ZJT.js.map → chunk-N6DXTYLR.js.map} +0 -0
  105. /package/dist/{chunk-6WBYGMWM.js.map → chunk-OBFMPMGW.js.map} +0 -0
  106. /package/dist/{chunk-VB7G5DP7.js.map → chunk-OYCMMRZV.js.map} +0 -0
  107. /package/dist/{chunk-DY6LXTDU.js.map → chunk-PKAVBIO7.js.map} +0 -0
  108. /package/dist/{chunk-AC5SOSXY.js.map → chunk-SNKLRBWT.js.map} +0 -0
  109. /package/dist/{chunk-2QE4GPBW.js.map → chunk-SQJJRPIY.js.map} +0 -0
  110. /package/dist/{chunk-FN7TY3BC.js.map → chunk-TMFNSMVV.js.map} +0 -0
  111. /package/dist/{chunk-EJEYT52K.js.map → chunk-U7MPXQO4.js.map} +0 -0
  112. /package/dist/{chunk-7NJIEGSZ.js.map → chunk-VUILI5ED.js.map} +0 -0
  113. /package/dist/{chunk-XLBYKCIE.js.map → chunk-WCKPMAYX.js.map} +0 -0
  114. /package/dist/{chunk-SKHJKLQU.js.map → chunk-WSN5UCPE.js.map} +0 -0
  115. /package/dist/{chunk-AB22WTOW.js.map → chunk-YNVGW5VZ.js.map} +0 -0
  116. /package/dist/{chunk-S4ZD6CIB.js.map → chunk-ZQAKMVXR.js.map} +0 -0
  117. /package/dist/{commands-FSZDEWK7.js.map → commands-3IJYY2KF.js.map} +0 -0
  118. /package/dist/{config-VXOZS327.js.map → config-7RFJBYCF.js.map} +0 -0
  119. /package/dist/{context-45BMQQBI.js.map → context-L6IDU4ZF.js.map} +0 -0
  120. /package/dist/{customCommands-YJKDWVLN.js.map → customCommands-2ZLDKEPS.js.map} +0 -0
  121. /package/dist/{env-6I7ZEE2U.js.map → env-KKHHZ47D.js.map} +0 -0
  122. /package/dist/{file-E5DNNSWV.js.map → file-QGJRLWJ7.js.map} +0 -0
  123. /package/dist/{llm-XKWTYXNE.js.map → llm-HHSKS5JE.js.map} +0 -0
  124. /package/dist/{llmLazy-VHV6V3FH.js.map → llmLazy-YV33JO4W.js.map} +0 -0
  125. /package/dist/{loader-L7DYSPCI.js.map → loader-YCEP5CYE.js.map} +0 -0
  126. /package/dist/{lsp-AQZ4MHRE.js.map → lsp-TG3EZZOU.js.map} +0 -0
  127. /package/dist/{lspAnchor-VVWRVWR6.js.map → lspAnchor-T3544E7J.js.map} +0 -0
  128. /package/dist/{mcp-R47AVTKX.js.map → mcp-SWYFI5FF.js.map} +0 -0
  129. /package/dist/{messages-6RZPVGYV.js.map → messages-3B2ZJJKW.js.map} +0 -0
  130. /package/dist/{model-XS54COOK.js.map → model-HDJXCBKD.js.map} +0 -0
  131. /package/dist/{openai-36NGQ6WH.js.map → openai-DF2BQT7X.js.map} +0 -0
  132. /package/dist/{outputStyles-4Q6RXLFD.js.map → outputStyles-GWUBSKDY.js.map} +0 -0
  133. /package/dist/{pluginRuntime-X6X2WUUY.js.map → pluginRuntime-LKAAMJH2.js.map} +0 -0
  134. /package/dist/{pluginValidation-L7QBW3EG.js.map → pluginValidation-7GJA32YV.js.map} +0 -0
  135. /package/dist/{prompts-FVZABM4B.js.map → prompts-DB772NLS.js.map} +0 -0
  136. /package/dist/{pybAgentSessionLoad-OQZ4472Q.js.map → pybAgentSessionLoad-BGIX7L4O.js.map} +0 -0
  137. /package/dist/{pybAgentSessionResume-F5USKNP6.js.map → pybAgentSessionResume-VKK6VZSA.js.map} +0 -0
  138. /package/dist/{pybAgentStreamJsonSession-3STGT5U7.js.map → pybAgentStreamJsonSession-HDXJ4F5W.js.map} +0 -0
  139. /package/dist/{pybHooks-ZRWKBZYR.js.map → pybHooks-LEIAZ7D6.js.map} +0 -0
  140. /package/dist/{query-W3ZWVYMU.js.map → query-LVPGQYDL.js.map} +0 -0
  141. /package/dist/{registry-KLVCZCUO.js.map → registry-C4V5AZ6N.js.map} +0 -0
  142. /package/dist/{ripgrep-MYJ7I7AT.js.map → ripgrep-PWIRRS2Q.js.map} +0 -0
  143. /package/dist/{skillMarketplace-RUUAPJSB.js.map → skillMarketplace-GZN6RWUY.js.map} +0 -0
  144. /package/dist/{state-XDFG3NGH.js.map → state-T7WQKFBG.js.map} +0 -0
  145. /package/dist/{theme-6NH5WLGE.js.map → theme-CLYLDSCI.js.map} +0 -0
  146. /package/dist/{toolPermissionSettings-6YFH2NEA.js.map → toolPermissionSettings-UYHSUTC5.js.map} +0 -0
  147. /package/dist/{tools-T6FWIKGI.js.map → tools-SEWCFM5P.js.map} +0 -0
  148. /package/dist/{userInput-XNKXJX2C.js.map → userInput-KZXH5O7V.js.map} +0 -0
@@ -20,7 +20,6 @@ import {
20
20
  WebSearchTool,
21
21
  applyMarkdown,
22
22
  buildTaskGraph,
23
- calculateReadyBlocked,
24
23
  countTokens,
25
24
  findTaskCycles,
26
25
  getAgentPrompt,
@@ -29,64 +28,67 @@ import {
29
28
  hasReadPermission,
30
29
  hasWritePermission,
31
30
  query
32
- } from "./chunk-6JSMWPVG.js";
31
+ } from "./chunk-YTUV273Y.js";
33
32
  import {
34
33
  queryLLM
35
- } from "./chunk-K7HQMRMK.js";
34
+ } from "./chunk-LAQQRRQR.js";
36
35
  import {
37
36
  FallbackToolUseRejectedMessage,
38
37
  MCPTool,
39
38
  getClients,
40
39
  getMCPTools
41
- } from "./chunk-AB22WTOW.js";
40
+ } from "./chunk-YNVGW5VZ.js";
42
41
  import {
43
42
  TaskStoreConflictError,
44
43
  createTask,
45
44
  emitReminderEvent,
46
45
  generateAgentId,
46
+ generateTaskListId,
47
47
  getTask,
48
48
  getTaskListPaths,
49
49
  listTasks,
50
+ runWithTaskListEnv,
51
+ runWithTaskListId,
50
52
  updateTask
51
- } from "./chunk-INTHXBZY.js";
53
+ } from "./chunk-L2FQX7IL.js";
52
54
  import {
53
55
  getActiveAgents,
54
56
  getAgentByType,
55
57
  getAvailableAgentTypes
56
- } from "./chunk-THDYF2NK.js";
58
+ } from "./chunk-KDKXQODT.js";
57
59
  import {
58
60
  INTERRUPT_MESSAGE,
59
61
  createAssistantMessage,
60
62
  createUserMessage,
61
63
  getLastAssistantMessageId
62
- } from "./chunk-O57TU7BN.js";
64
+ } from "./chunk-5RX62PWR.js";
63
65
  import {
64
66
  formatDuration,
65
67
  formatNumber
66
68
  } from "./chunk-OUXHGDLH.js";
67
69
  import {
68
70
  getAbsolutePath
69
- } from "./chunk-XPPMTVLO.js";
71
+ } from "./chunk-G2FI43IB.js";
70
72
  import {
71
73
  LspFacade,
72
74
  formatDiagnosticsPretty
73
- } from "./chunk-OOKJ3YEP.js";
75
+ } from "./chunk-DCSAQNHW.js";
74
76
  import {
75
77
  getModelManager
76
- } from "./chunk-S4ZD6CIB.js";
78
+ } from "./chunk-ZQAKMVXR.js";
77
79
  import {
78
80
  getContext
79
- } from "./chunk-5DMG6XJO.js";
81
+ } from "./chunk-MZ6UJROW.js";
80
82
  import {
81
83
  filesToTree,
82
84
  ripGrepWithStatus
83
- } from "./chunk-DY6LXTDU.js";
85
+ } from "./chunk-PKAVBIO7.js";
84
86
  import {
85
87
  getTheme
86
- } from "./chunk-F4YDJQRG.js";
88
+ } from "./chunk-HY24VLOS.js";
87
89
  import {
88
90
  debug
89
- } from "./chunk-QMS564WP.js";
91
+ } from "./chunk-6MFZG46W.js";
90
92
  import {
91
93
  BunShell,
92
94
  getCwd,
@@ -97,7 +99,7 @@ import {
97
99
  overwriteLog,
98
100
  readTaskOutput,
99
101
  resolveXdgDataPath
100
- } from "./chunk-XY7UAZHR.js";
102
+ } from "./chunk-HJDETBB6.js";
101
103
 
102
104
  // src/tools/index.ts
103
105
  import { memoize as memoize2 } from "lodash-es";
@@ -776,7 +778,7 @@ async function analyzeOutputWithLsp(output, exitCode) {
776
778
  if (exitCode !== 0 || errorCount > 0 || warningCount > 0) {
777
779
  try {
778
780
  const { isAbsolute: isAbsolute3, resolve: resolve4 } = await import("path");
779
- const { getSessionRoot: getSessionRoot2 } = await import("./state-XDFG3NGH.js");
781
+ const { getSessionRoot: getSessionRoot2 } = await import("./state-T7WQKFBG.js");
780
782
  const lines = output.split("\n");
781
783
  const uniqueFiles = /* @__PURE__ */ new Set();
782
784
  const lspSuggestions = [];
@@ -1149,7 +1151,7 @@ var DeleteTool = {
1149
1151
  }
1150
1152
  if (!force) {
1151
1153
  try {
1152
- const { LspFacade: LspFacade2 } = await import("./lsp-AQZ4MHRE.js");
1154
+ const { LspFacade: LspFacade2 } = await import("./lsp-TG3EZZOU.js");
1153
1155
  const referenceDetail = await LspFacade2.checkFileReferences(fullPath);
1154
1156
  if (referenceDetail) {
1155
1157
  failedItems.push(
@@ -2728,6 +2730,7 @@ var TaskTool = {
2728
2730
  tools = tools.filter((t) => !disallowedToolNames.has(t.name));
2729
2731
  }
2730
2732
  const agentId = input.resume || generateAgentId();
2733
+ const taskListId = generateTaskListId();
2731
2734
  const baseTranscript = input.resume ? getAgentTranscript(input.resume)?.filter((m) => m.type !== "progress") ?? null : [];
2732
2735
  if (input.resume && baseTranscript === null) {
2733
2736
  throw Error(`No transcript found for agent ID: ${input.resume}`);
@@ -2787,47 +2790,54 @@ var TaskTool = {
2787
2790
  done: Promise.resolve()
2788
2791
  };
2789
2792
  taskRecord.done = (async () => {
2790
- try {
2791
- const bgMessages = [...messagesForQuery];
2792
- const bgTranscriptMessages = [...transcriptMessages];
2793
- for await (const msg of queryFn(
2794
- bgMessages,
2795
- systemPrompt,
2796
- context,
2797
- hasPermissionsToUseTool,
2798
- {
2799
- abortController: bgAbortController,
2800
- options: queryOptions,
2801
- messageId: getLastAssistantMessageId(bgMessages),
2802
- agentId,
2803
- readFileTimestamps,
2804
- setToolJSX: () => {
2793
+ return runWithTaskListId(taskListId, async () => {
2794
+ return runWithTaskListEnv(
2795
+ { ...process.env, PYB_TASK_LIST_ID: taskListId },
2796
+ async () => {
2797
+ try {
2798
+ const bgMessages = [...messagesForQuery];
2799
+ const bgTranscriptMessages = [...transcriptMessages];
2800
+ for await (const msg of queryFn(
2801
+ bgMessages,
2802
+ systemPrompt,
2803
+ context,
2804
+ hasPermissionsToUseTool,
2805
+ {
2806
+ abortController: bgAbortController,
2807
+ options: queryOptions,
2808
+ messageId: getLastAssistantMessageId(bgMessages),
2809
+ agentId,
2810
+ readFileTimestamps,
2811
+ setToolJSX: () => {
2812
+ }
2813
+ }
2814
+ )) {
2815
+ bgMessages.push(msg);
2816
+ bgTranscriptMessages.push(msg);
2817
+ taskRecord.messages = [...bgTranscriptMessages];
2818
+ upsertBackgroundAgentTask(taskRecord);
2819
+ }
2820
+ const lastAssistant2 = last(
2821
+ bgTranscriptMessages.filter((m) => m.type === "assistant")
2822
+ );
2823
+ const content2 = lastAssistant2?.message?.content?.filter(
2824
+ (b) => b.type === "text"
2825
+ );
2826
+ taskRecord.status = "completed";
2827
+ taskRecord.completedAt = Date.now();
2828
+ taskRecord.resultText = (content2 || []).map((b) => b.text).join("\n");
2829
+ taskRecord.messages = [...bgTranscriptMessages];
2830
+ upsertBackgroundAgentTask(taskRecord);
2831
+ saveAgentTranscript(agentId, bgTranscriptMessages);
2832
+ } catch (e) {
2833
+ taskRecord.status = "failed";
2834
+ taskRecord.completedAt = Date.now();
2835
+ taskRecord.error = e instanceof Error ? e.message : String(e);
2836
+ upsertBackgroundAgentTask(taskRecord);
2805
2837
  }
2806
2838
  }
2807
- )) {
2808
- bgMessages.push(msg);
2809
- bgTranscriptMessages.push(msg);
2810
- taskRecord.messages = [...bgTranscriptMessages];
2811
- upsertBackgroundAgentTask(taskRecord);
2812
- }
2813
- const lastAssistant2 = last(
2814
- bgTranscriptMessages.filter((m) => m.type === "assistant")
2815
2839
  );
2816
- const content2 = lastAssistant2?.message?.content?.filter(
2817
- (b) => b.type === "text"
2818
- );
2819
- taskRecord.status = "completed";
2820
- taskRecord.completedAt = Date.now();
2821
- taskRecord.resultText = (content2 || []).map((b) => b.text).join("\n");
2822
- taskRecord.messages = [...bgTranscriptMessages];
2823
- upsertBackgroundAgentTask(taskRecord);
2824
- saveAgentTranscript(agentId, bgTranscriptMessages);
2825
- } catch (e) {
2826
- taskRecord.status = "failed";
2827
- taskRecord.completedAt = Date.now();
2828
- taskRecord.error = e instanceof Error ? e.message : String(e);
2829
- upsertBackgroundAgentTask(taskRecord);
2830
- }
2840
+ });
2831
2841
  })();
2832
2842
  upsertBackgroundAgentTask(taskRecord);
2833
2843
  const output2 = {
@@ -2918,21 +2928,28 @@ var TaskTool = {
2918
2928
  };
2919
2929
  lastProgressEmitAt = Date.now();
2920
2930
  let toolUseCount = 0;
2921
- for await (const message of queryFn(
2922
- messagesForQuery,
2923
- systemPrompt,
2924
- context,
2925
- hasPermissionsToUseTool,
2926
- {
2927
- abortController,
2928
- options: queryOptions,
2929
- messageId: getLastAssistantMessageId(messagesForQuery),
2930
- agentId,
2931
- readFileTimestamps,
2932
- setToolJSX: () => {
2933
- }
2934
- }
2935
- )) {
2931
+ const queryStream = runWithTaskListId(
2932
+ taskListId,
2933
+ () => runWithTaskListEnv(
2934
+ { ...process.env, PYB_TASK_LIST_ID: taskListId },
2935
+ () => queryFn(
2936
+ messagesForQuery,
2937
+ systemPrompt,
2938
+ context,
2939
+ hasPermissionsToUseTool,
2940
+ {
2941
+ abortController,
2942
+ options: queryOptions,
2943
+ messageId: getLastAssistantMessageId(messagesForQuery),
2944
+ agentId,
2945
+ readFileTimestamps,
2946
+ setToolJSX: () => {
2947
+ }
2948
+ }
2949
+ )
2950
+ )
2951
+ );
2952
+ for await (const message of queryStream) {
2936
2953
  messagesForQuery.push(message);
2937
2954
  transcriptMessages.push(message);
2938
2955
  overwriteLog(
@@ -3000,14 +3017,31 @@ var TaskTool = {
3000
3017
 
3001
3018
  // src/tools/interaction/TaskCreateTool/TaskCreateTool.tsx
3002
3019
  import React9 from "react";
3003
- import { z as z9 } from "zod";
3020
+ import { z as z10 } from "zod";
3004
3021
 
3005
3022
  // src/utils/session/taskToolUtils.ts
3023
+ import { z as z9 } from "zod";
3024
+ var jsonValueSchema = z9.lazy(
3025
+ () => z9.union([
3026
+ z9.string(),
3027
+ z9.number(),
3028
+ z9.boolean(),
3029
+ z9.null(),
3030
+ z9.array(jsonValueSchema),
3031
+ z9.record(jsonValueSchema)
3032
+ ])
3033
+ );
3034
+ var metadataSchema = z9.record(jsonValueSchema);
3035
+ function mapStatusToOutput(status) {
3036
+ if (status === "done" || status === "archived") return "completed";
3037
+ if (status === "blocked") return "pending";
3038
+ return status;
3039
+ }
3006
3040
  function toTaskListItem(task) {
3007
3041
  return {
3008
3042
  id: task.id,
3009
3043
  subject: task.subject,
3010
- status: task.status,
3044
+ status: mapStatusToOutput(task.status),
3011
3045
  owner: task.assignee,
3012
3046
  blockedBy: task.blockedBy ?? []
3013
3047
  };
@@ -3018,7 +3052,7 @@ function toTaskDetail(task) {
3018
3052
  subject: task.subject,
3019
3053
  description: task.description,
3020
3054
  activeForm: task.activeForm,
3021
- status: task.status,
3055
+ status: mapStatusToOutput(task.status),
3022
3056
  tags: task.tags,
3023
3057
  assignee: task.assignee,
3024
3058
  metadata: task.metadata,
@@ -3030,6 +3064,15 @@ function toTaskDetail(task) {
3030
3064
  legacyTodoId: task.legacyTodoId
3031
3065
  };
3032
3066
  }
3067
+ function toTaskGetDetail(task) {
3068
+ return {
3069
+ subject: task.subject,
3070
+ description: task.description,
3071
+ status: mapStatusToOutput(task.status),
3072
+ blocks: task.blocks ?? [],
3073
+ blockedBy: task.blockedBy ?? []
3074
+ };
3075
+ }
3033
3076
  function createTaskToolError(params) {
3034
3077
  return {
3035
3078
  error: {
@@ -3042,23 +3085,28 @@ function createTaskToolError(params) {
3042
3085
  }
3043
3086
 
3044
3087
  // src/tools/interaction/TaskCreateTool/prompt.ts
3045
- var DESCRIPTION6 = "Create a new task in the task list with optional status.";
3088
+ var DESCRIPTION6 = "Initialize new tasks with hierarchy and dependencies";
3046
3089
  var PROMPT6 = `Use this tool to create a new task in the current task list. It is the entry point for planning multi-step work.
3047
3090
 
3048
3091
  ## When to Use This Tool
3092
+
3049
3093
  Use this tool proactively in these scenarios:
3050
- 1. You need to add a task with structured fields (subject, status, tags).
3051
- 2. You want to seed a plan for multi-step work before implementation starts.
3052
- 3. You want to create a plan first and add dependencies later.
3053
- 4. You need to align with a user request to create a task list or plan.
3094
+
3095
+ 1. **Complex multi-step tasks** - When a task requires 3 or more distinct steps or actions
3096
+ 2. **Non-trivial and complex tasks** - Tasks that require careful planning or multiple operations
3097
+ 3. **User explicitly requests task list** - When the user directly asks you to use the task list
3098
+ 4. **User provides multiple tasks** - When users provide a list of things to be done (numbered or comma-separated)
3099
+ 5. **After receiving new instructions** - Immediately capture user requirements as structured a task list or plan with structured fields
3054
3100
 
3055
3101
  ## When NOT to Use This Tool
3056
- - You need to modify an existing task (use TaskUpdate).
3102
+
3057
3103
  Skip using this tool when:
3058
- 1. You only need to read task data (use TaskGet or TaskList).
3059
- 2. You need to modify an existing task (use TaskUpdate).
3060
- 3. You are only reporting progress without changing any task fields.
3061
- - subject is required.
3104
+
3105
+ 1. There is only a single, straightforward task
3106
+ 2. The task is trivial and tracking it provides no organizational benefit
3107
+ 3. The task can be completed in less than 3 trivial steps
3108
+ 4. The task is purely conversational or informational
3109
+
3062
3110
  NOTE that you should not use this tool if you are only updating status or details of an existing task.
3063
3111
 
3064
3112
  ## Input Notes
@@ -3132,19 +3180,11 @@ Assistant: I'll create a single task.
3132
3180
  `;
3133
3181
 
3134
3182
  // src/tools/interaction/TaskCreateTool/TaskCreateTool.tsx
3135
- var inputSchema9 = z9.strictObject({
3136
- listId: z9.string().optional(),
3137
- subject: z9.string().min(1),
3138
- description: z9.string().optional(),
3139
- activeForm: z9.string({ required_error: "activeForm is required" }).min(1),
3140
- status: z9.enum(["pending", "in_progress", "blocked", "done", "archived"]).optional(),
3141
- tags: z9.array(z9.string()).optional(),
3142
- assignee: z9.string().optional(),
3143
- metadata: z9.record(z9.string()).optional(),
3144
- archived: z9.boolean().optional(),
3145
- parent: z9.string().optional(),
3146
- related: z9.array(z9.string()).optional(),
3147
- legacyTodoId: z9.string().optional()
3183
+ var inputSchema9 = z10.strictObject({
3184
+ subject: z10.string().min(1),
3185
+ description: z10.string().min(1),
3186
+ activeForm: z10.string().min(1).optional(),
3187
+ metadata: metadataSchema.optional()
3148
3188
  });
3149
3189
  var TaskCreateTool = {
3150
3190
  name: "TaskCreate",
@@ -3186,23 +3226,13 @@ var TaskCreateTool = {
3186
3226
  async *call(input) {
3187
3227
  try {
3188
3228
  const subject = input.subject;
3189
- const task = createTask(
3190
- {
3191
- subject,
3192
- description: input.description,
3193
- activeForm: input.activeForm,
3194
- status: input.status,
3195
- tags: input.tags,
3196
- assignee: input.assignee,
3197
- metadata: input.metadata,
3198
- archived: input.archived,
3199
- parent: input.parent,
3200
- related: input.related,
3201
- legacyTodoId: input.legacyTodoId
3202
- },
3203
- { listId: input.listId }
3204
- );
3205
- const { listId } = getTaskListPaths(input.listId);
3229
+ const task = createTask({
3230
+ subject,
3231
+ description: input.description,
3232
+ activeForm: input.activeForm,
3233
+ metadata: input.metadata
3234
+ });
3235
+ const { listId } = getTaskListPaths();
3206
3236
  emitReminderEvent("task.created", {
3207
3237
  listId,
3208
3238
  taskId: task.id,
@@ -3230,10 +3260,10 @@ var TaskCreateTool = {
3230
3260
  };
3231
3261
 
3232
3262
  // src/tools/interaction/TaskGetTool/TaskGetTool.tsx
3233
- import { z as z10 } from "zod";
3263
+ import { z as z11 } from "zod";
3234
3264
 
3235
3265
  // src/tools/interaction/TaskGetTool/prompt.ts
3236
- var DESCRIPTION7 = "Fetch a single task by id from the task list.";
3266
+ var DESCRIPTION7 = "Retrieve individual task details";
3237
3267
  var PROMPT7 = `Use this tool to fetch a single task by id.
3238
3268
 
3239
3269
  ## When to Use This Tool
@@ -3264,9 +3294,8 @@ Assistant: I'll fetch the task details first.
3264
3294
  `;
3265
3295
 
3266
3296
  // src/tools/interaction/TaskGetTool/TaskGetTool.tsx
3267
- var inputSchema10 = z10.strictObject({
3268
- listId: z10.string().optional(),
3269
- taskId: z10.string().min(1)
3297
+ var inputSchema10 = z11.strictObject({
3298
+ taskId: z11.string().min(1)
3270
3299
  });
3271
3300
  var TaskGetTool = {
3272
3301
  name: "TaskGet",
@@ -3300,8 +3329,8 @@ var TaskGetTool = {
3300
3329
  return null;
3301
3330
  },
3302
3331
  async *call(input) {
3303
- const { listId } = getTaskListPaths(input.listId);
3304
- const task = getTask(input.taskId, { listId: input.listId });
3332
+ const { listId } = getTaskListPaths();
3333
+ const task = getTask(input.taskId);
3305
3334
  if (!task) {
3306
3335
  yield {
3307
3336
  type: "result",
@@ -3318,17 +3347,17 @@ var TaskGetTool = {
3318
3347
  type: "result",
3319
3348
  data: {
3320
3349
  listId,
3321
- item: toTaskDetail(task)
3350
+ item: toTaskGetDetail(task)
3322
3351
  }
3323
3352
  };
3324
3353
  }
3325
3354
  };
3326
3355
 
3327
3356
  // src/tools/interaction/TaskListTool/TaskListTool.tsx
3328
- import { z as z11 } from "zod";
3357
+ import { z as z12 } from "zod";
3329
3358
 
3330
3359
  // src/tools/interaction/TaskListTool/prompt.ts
3331
- var DESCRIPTION8 = "List tasks in a task list, optionally filtered by status with ready/blocked breakdown.";
3360
+ var DESCRIPTION8 = "List all tasks in current task list.";
3332
3361
  var PROMPT8 = `Use this tool to list tasks and understand readiness. It returns ready and blocked groupings to help prioritize work. TaskList only returns id/subject/status/owner/blockedBy for summaries; use TaskGet for details.
3333
3362
 
3334
3363
  ## When to Use This Tool
@@ -3348,9 +3377,7 @@ Skip using this tool when:
3348
3377
  NOTE that TaskList is for summaries and readiness; use TaskGet for details.
3349
3378
 
3350
3379
  ## Input Notes
3351
- - listId is optional; omit to use the default list.
3352
3380
  - status filters the returned items; omit to exclude archived tasks by default.
3353
- - includeBlocked=false returns only ready items.
3354
3381
  - blockedBy may be empty early in planning and will appear as dependencies are added.
3355
3382
 
3356
3383
  ## Examples of When to Use TaskList
@@ -3375,10 +3402,8 @@ Assistant: I'll list tasks to show the updated ready/blocked breakdown.
3375
3402
  `;
3376
3403
 
3377
3404
  // src/tools/interaction/TaskListTool/TaskListTool.tsx
3378
- var inputSchema11 = z11.strictObject({
3379
- listId: z11.string().optional(),
3380
- status: z11.array(z11.enum(["pending", "in_progress", "blocked", "done", "archived"])).optional(),
3381
- includeBlocked: z11.boolean().optional()
3405
+ var inputSchema11 = z12.strictObject({
3406
+ status: z12.enum(["pending", "in_progress", "completed"]).optional()
3382
3407
  });
3383
3408
  var filterByStatus = (tasks, statuses) => {
3384
3409
  if (!statuses || statuses.length === 0) {
@@ -3387,6 +3412,12 @@ var filterByStatus = (tasks, statuses) => {
3387
3412
  const allowed = new Set(statuses);
3388
3413
  return tasks.filter((item) => allowed.has(item.status));
3389
3414
  };
3415
+ var mapStatusFilterInput = (input) => {
3416
+ if (!input) return void 0;
3417
+ if (input === "completed") return ["done", "archived"];
3418
+ if (input === "pending") return ["pending"];
3419
+ return ["in_progress"];
3420
+ };
3390
3421
  var TaskListTool = {
3391
3422
  name: "TaskList",
3392
3423
  cachedDescription: DESCRIPTION8,
@@ -3420,21 +3451,15 @@ var TaskListTool = {
3420
3451
  },
3421
3452
  async *call(input) {
3422
3453
  try {
3423
- const { listId } = getTaskListPaths(input.listId);
3424
- const tasks = listTasks({ listId: input.listId });
3425
- const filtered = filterByStatus(tasks, input.status);
3426
- const readyBlocked = calculateReadyBlocked(filtered);
3427
- const ready = readyBlocked.ready.map(toTaskListItem);
3428
- const blocked = readyBlocked.blocked.map(toTaskListItem);
3429
- const includeBlocked = input.includeBlocked !== false;
3430
- const items = includeBlocked ? filtered.map(toTaskListItem) : filtered.filter((item) => ready.some((entry) => entry.id === item.id)).map(toTaskListItem);
3454
+ const { listId } = getTaskListPaths();
3455
+ const tasks = listTasks();
3456
+ const filtered = filterByStatus(tasks, mapStatusFilterInput(input.status));
3457
+ const items = filtered.map(toTaskListItem);
3431
3458
  yield {
3432
3459
  type: "result",
3433
3460
  data: {
3434
3461
  listId,
3435
- items,
3436
- ready,
3437
- blocked: includeBlocked ? blocked : []
3462
+ items
3438
3463
  }
3439
3464
  };
3440
3465
  } catch (error) {
@@ -3452,10 +3477,10 @@ var TaskListTool = {
3452
3477
 
3453
3478
  // src/tools/interaction/TaskUpdateTool/TaskUpdateTool.tsx
3454
3479
  import React10 from "react";
3455
- import { z as z12 } from "zod";
3480
+ import { z as z13 } from "zod";
3456
3481
 
3457
3482
  // src/tools/interaction/TaskUpdateTool/prompt.ts
3458
- var DESCRIPTION9 = "Update an existing task, including status, metadata, and dependencies with conflict checks.";
3483
+ var DESCRIPTION9 = "Modify task status, metadata, and dependencies";
3459
3484
  var PROMPT9 = `Use this tool to update an existing task. It is the primary way to track progress and adjust task details.
3460
3485
 
3461
3486
  ## When to Use This Tool
@@ -3526,10 +3551,38 @@ Assistant: I'll refetch the task and retry the update.
3526
3551
  // src/tools/interaction/TaskUpdateTool/TaskUpdateTool.tsx
3527
3552
  var isCompletedStatus = (status) => status === "done" || status === "archived";
3528
3553
  var normalizeDeps = (items) => [...items ?? []].filter(Boolean).sort();
3529
- var normalizeBlockedBy = (items) => {
3530
- if (!items) return void 0;
3531
- const filtered = items.filter(Boolean);
3532
- return Array.from(new Set(filtered));
3554
+ var mergeDeps = (current, additions) => {
3555
+ const merged = [];
3556
+ const seen = /* @__PURE__ */ new Set();
3557
+ for (const id of current ?? []) {
3558
+ if (!id || seen.has(id)) continue;
3559
+ seen.add(id);
3560
+ merged.push(id);
3561
+ }
3562
+ for (const id of additions ?? []) {
3563
+ if (!id || seen.has(id)) continue;
3564
+ seen.add(id);
3565
+ merged.push(id);
3566
+ }
3567
+ return merged;
3568
+ };
3569
+ var mergeMetadata = (existing, updates) => {
3570
+ if (!updates) return existing;
3571
+ const next = { ...existing ?? {} };
3572
+ for (const [key, value] of Object.entries(updates)) {
3573
+ if (value === null) {
3574
+ delete next[key];
3575
+ } else {
3576
+ next[key] = value;
3577
+ }
3578
+ }
3579
+ return Object.keys(next).length > 0 ? next : void 0;
3580
+ };
3581
+ var mapStatusInput = (status) => {
3582
+ if (!status) return void 0;
3583
+ if (status === "completed") return "done";
3584
+ if (status === "deleted") return "archived";
3585
+ return status;
3533
3586
  };
3534
3587
  var depsChanged = (prev, next) => {
3535
3588
  if (prev.parent !== next.parent) return true;
@@ -3539,6 +3592,12 @@ var depsChanged = (prev, next) => {
3539
3592
  for (let i = 0; i < prevBlockedBy.length; i += 1) {
3540
3593
  if (prevBlockedBy[i] !== nextBlockedBy[i]) return true;
3541
3594
  }
3595
+ const prevBlocks = normalizeDeps(prev.blocks);
3596
+ const nextBlocks = normalizeDeps(next.blocks);
3597
+ if (prevBlocks.length !== nextBlocks.length) return true;
3598
+ for (let i = 0; i < prevBlocks.length; i += 1) {
3599
+ if (prevBlocks[i] !== nextBlocks[i]) return true;
3600
+ }
3542
3601
  const prevRelated = normalizeDeps(prev.related);
3543
3602
  const nextRelated = normalizeDeps(next.related);
3544
3603
  if (prevRelated.length !== nextRelated.length) return true;
@@ -3554,7 +3613,10 @@ var getDepsSnapshot = (task) => ({
3554
3613
  related: task.related ?? []
3555
3614
  });
3556
3615
  var getMissingBlockedBy = (blockedBy, ids) => (blockedBy ?? []).filter((id) => !ids.has(id));
3557
- var isPlanFinalized = (metadata) => metadata?.planFinalized === "true";
3616
+ var isPlanFinalized = (metadata) => {
3617
+ const value = metadata?.planFinalized;
3618
+ return value === true || value === "true";
3619
+ };
3558
3620
  var compareTaskId = (left, right) => {
3559
3621
  const leftValue = Number(left.id);
3560
3622
  const rightValue = Number(right.id);
@@ -3565,25 +3627,16 @@ var compareTaskId = (left, right) => {
3565
3627
  if (rightIsNumber) return 1;
3566
3628
  return left.id.localeCompare(right.id);
3567
3629
  };
3568
- var inputSchema12 = z12.strictObject({
3569
- listId: z12.string().optional(),
3570
- taskId: z12.string().min(1),
3571
- subject: z12.string().optional(),
3572
- description: z12.string().optional(),
3573
- activeForm: z12.string().optional(),
3574
- status: z12.enum(["pending", "in_progress", "blocked", "done", "archived"]).optional(),
3575
- tags: z12.array(z12.string()).optional(),
3576
- assignee: z12.string().optional(),
3577
- metadata: z12.record(z12.string()).optional(),
3578
- archived: z12.boolean().optional(),
3579
- blocks: z12.array(z12.string()).optional(),
3580
- blockedBy: z12.array(z12.string()).optional(),
3581
- parent: z12.string().optional(),
3582
- related: z12.array(z12.string()).optional(),
3583
- baseVersion: z12.number().optional(),
3584
- version: z12.number().optional(),
3585
- allowMerge: z12.boolean().optional(),
3586
- legacyTodoId: z12.string().optional()
3630
+ var inputSchema12 = z13.strictObject({
3631
+ taskId: z13.string().min(1),
3632
+ subject: z13.string().optional(),
3633
+ description: z13.string().optional(),
3634
+ activeForm: z13.string().optional(),
3635
+ status: z13.enum(["pending", "in_progress", "completed", "deleted"]).optional(),
3636
+ owner: z13.string().optional(),
3637
+ metadata: metadataSchema.optional(),
3638
+ addBlockedBy: z13.array(z13.string()).optional(),
3639
+ addBlocks: z13.array(z13.string()).optional()
3587
3640
  });
3588
3641
  var TaskUpdateTool = {
3589
3642
  name: "TaskUpdate",
@@ -3623,8 +3676,8 @@ var TaskUpdateTool = {
3623
3676
  return null;
3624
3677
  },
3625
3678
  async *call(input) {
3626
- const { listId } = getTaskListPaths(input.listId);
3627
- const existing = getTask(input.taskId, { listId: input.listId });
3679
+ const { listId } = getTaskListPaths();
3680
+ const existing = getTask(input.taskId);
3628
3681
  if (!existing) {
3629
3682
  yield {
3630
3683
  type: "result",
@@ -3637,27 +3690,37 @@ var TaskUpdateTool = {
3637
3690
  };
3638
3691
  return;
3639
3692
  }
3640
- const tasks = listTasks({ listId: input.listId });
3693
+ const tasks = listTasks();
3641
3694
  const subject = input.subject ?? existing.subject;
3642
- const nextBlockedBy = normalizeBlockedBy(input.blockedBy);
3695
+ const mergedBlockedBy = mergeDeps(existing.blockedBy, input.addBlockedBy);
3696
+ const mappedStatus = mapStatusInput(input.status);
3697
+ const mergedMetadata = mergeMetadata(existing.metadata, input.metadata);
3698
+ const metadataUpdate = input.metadata;
3699
+ const addBlocksTargets = new Set(
3700
+ (input.addBlocks ?? []).filter((id) => id && id !== existing.id)
3701
+ );
3643
3702
  const updatedTask = {
3644
3703
  ...existing,
3645
3704
  subject,
3646
3705
  description: input.description ?? existing.description,
3647
3706
  activeForm: input.activeForm ?? existing.activeForm,
3648
- status: input.status ?? existing.status,
3649
- tags: input.tags ?? existing.tags,
3650
- assignee: input.assignee ?? existing.assignee,
3651
- metadata: input.metadata ?? existing.metadata,
3652
- archived: input.archived ?? existing.archived,
3653
- blockedBy: nextBlockedBy ?? existing.blockedBy,
3654
- parent: input.parent ?? existing.parent,
3655
- related: input.related ?? existing.related,
3656
- legacyTodoId: input.legacyTodoId ?? existing.legacyTodoId
3707
+ status: mappedStatus ?? existing.status,
3708
+ assignee: input.owner ?? existing.assignee,
3709
+ metadata: mergedMetadata ?? existing.metadata,
3710
+ blockedBy: mergedBlockedBy
3657
3711
  };
3658
- const candidateTasks = tasks.map(
3659
- (task) => task.id === existing.id ? updatedTask : task
3660
- );
3712
+ const candidateTasks = tasks.map((task) => {
3713
+ if (task.id === existing.id) {
3714
+ return updatedTask;
3715
+ }
3716
+ if (addBlocksTargets.has(task.id)) {
3717
+ return {
3718
+ ...task,
3719
+ blockedBy: mergeDeps(task.blockedBy, [existing.id])
3720
+ };
3721
+ }
3722
+ return task;
3723
+ });
3661
3724
  const candidateIds = new Set(candidateTasks.map((task) => task.id));
3662
3725
  if (tasks.length > 1 && tasks[0]?.id !== updatedTask.id && (updatedTask.blockedBy?.length ?? 0) === 0) {
3663
3726
  emitReminderEvent("task.dependency_chain_missing", {
@@ -3667,20 +3730,44 @@ var TaskUpdateTool = {
3667
3730
  timestamp: Date.now()
3668
3731
  });
3669
3732
  }
3670
- if (input.blockedBy) {
3671
- const missing = getMissingBlockedBy(updatedTask.blockedBy, candidateIds);
3672
- if (missing.length > 0) {
3673
- yield {
3674
- type: "result",
3675
- data: createTaskToolError({
3676
- type: "validation",
3677
- code: "TASK_BLOCKEDBY_NOT_FOUND",
3678
- message: "BlockedBy tasks must exist in the same list",
3679
- details: { taskId: updatedTask.id, listId, missingBlockedBy: missing }
3680
- })
3681
- };
3682
- return;
3683
- }
3733
+ const missingBlockedBy = getMissingBlockedBy(
3734
+ updatedTask.blockedBy,
3735
+ candidateIds
3736
+ );
3737
+ if (missingBlockedBy.length > 0) {
3738
+ yield {
3739
+ type: "result",
3740
+ data: createTaskToolError({
3741
+ type: "validation",
3742
+ code: "TASK_BLOCKEDBY_NOT_FOUND",
3743
+ message: "BlockedBy tasks must exist in the same list",
3744
+ details: {
3745
+ taskId: updatedTask.id,
3746
+ listId,
3747
+ missingBlockedBy
3748
+ }
3749
+ })
3750
+ };
3751
+ return;
3752
+ }
3753
+ const missingBlocks = (input.addBlocks ?? []).filter(
3754
+ (id) => id && !candidateIds.has(id)
3755
+ );
3756
+ if (missingBlocks.length > 0) {
3757
+ yield {
3758
+ type: "result",
3759
+ data: createTaskToolError({
3760
+ type: "validation",
3761
+ code: "TASK_BLOCKEDBY_NOT_FOUND",
3762
+ message: "Blocked tasks must exist in the same list",
3763
+ details: {
3764
+ taskId: updatedTask.id,
3765
+ listId,
3766
+ missingBlocks
3767
+ }
3768
+ })
3769
+ };
3770
+ return;
3684
3771
  }
3685
3772
  const cycles = findTaskCycles(buildTaskGraph(candidateTasks));
3686
3773
  if (cycles.length > 0) {
@@ -3695,7 +3782,7 @@ var TaskUpdateTool = {
3695
3782
  };
3696
3783
  return;
3697
3784
  }
3698
- const nextMetadata = input.metadata ?? existing.metadata;
3785
+ const nextMetadata = mergedMetadata ?? existing.metadata;
3699
3786
  if (isPlanFinalized(nextMetadata) && !isPlanFinalized(existing.metadata)) {
3700
3787
  const activeTasks = candidateTasks.filter((task) => task.status !== "archived");
3701
3788
  const ordered = [...activeTasks].sort(compareTaskId);
@@ -3728,7 +3815,7 @@ var TaskUpdateTool = {
3728
3815
  }
3729
3816
  }
3730
3817
  }
3731
- if (input.status && isCompletedStatus(input.status)) {
3818
+ if (mappedStatus && isCompletedStatus(mappedStatus)) {
3732
3819
  const parentId = updatedTask.parent;
3733
3820
  if (parentId) {
3734
3821
  const parentTask = tasks.find((task) => task.id === parentId);
@@ -3750,25 +3837,34 @@ var TaskUpdateTool = {
3750
3837
  }
3751
3838
  }
3752
3839
  try {
3753
- const baseVersion = input.baseVersion ?? input.version;
3840
+ for (const task of tasks) {
3841
+ if (!addBlocksTargets.has(task.id)) continue;
3842
+ const merged = mergeDeps(task.blockedBy, [existing.id]);
3843
+ const current = normalizeDeps(task.blockedBy);
3844
+ const next = normalizeDeps(merged);
3845
+ let same = current.length === next.length;
3846
+ if (same) {
3847
+ for (let i = 0; i < current.length; i += 1) {
3848
+ if (current[i] !== next[i]) {
3849
+ same = false;
3850
+ break;
3851
+ }
3852
+ }
3853
+ }
3854
+ if (same) continue;
3855
+ updateTask(task.id, { blockedBy: merged });
3856
+ }
3754
3857
  const result = updateTask(
3755
3858
  input.taskId,
3756
3859
  {
3757
3860
  subject: input.subject,
3758
3861
  description: input.description,
3759
3862
  activeForm: input.activeForm,
3760
- status: input.status,
3761
- tags: input.tags,
3762
- assignee: input.assignee,
3763
- metadata: input.metadata,
3764
- archived: input.archived,
3765
- blockedBy: nextBlockedBy,
3766
- parent: input.parent,
3767
- related: input.related,
3768
- baseVersion,
3769
- legacyTodoId: input.legacyTodoId
3770
- },
3771
- { listId: input.listId, allowMerge: input.allowMerge }
3863
+ status: mappedStatus,
3864
+ assignee: input.owner,
3865
+ metadata: metadataUpdate,
3866
+ blockedBy: mergedBlockedBy
3867
+ }
3772
3868
  );
3773
3869
  const didDepsChange = depsChanged(existing, result.task);
3774
3870
  emitReminderEvent("task.updated", {