pybao-cli 1.4.49 → 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-FGRNDOS5.js → acp-2C774HUW.js} +31 -31
  3. package/dist/{agentsValidate-7CRDPNQ6.js → agentsValidate-RCXZBOU3.js} +7 -7
  4. package/dist/{ask-IR5W5M66.js → ask-EIO3Q6ED.js} +30 -30
  5. package/dist/{autoUpdater-MAEQZPST.js → autoUpdater-IIJMDPJE.js} +3 -3
  6. package/dist/{chunk-SHIPHOMT.js → chunk-5RX62PWR.js} +1 -1
  7. package/dist/{chunk-XHGUMYRL.js → chunk-6MFZG46W.js} +1 -1
  8. package/dist/{chunk-IQ3KORSP.js → chunk-DCSAQNHW.js} +4 -4
  9. package/dist/{chunk-YFBIVUDT.js → chunk-ESKTQXW6.js} +27 -3
  10. package/dist/chunk-ESKTQXW6.js.map +7 -0
  11. package/dist/{chunk-QW4VX3FW.js → chunk-G2FI43IB.js} +2 -2
  12. package/dist/{chunk-4Z6CCSED.js → chunk-GLS3ZXCS.js} +3 -3
  13. package/dist/{chunk-DEQQW4H6.js → chunk-GTP62T63.js} +3 -3
  14. package/dist/{chunk-UUGWQSET.js → chunk-HJDETBB6.js} +1 -1
  15. package/dist/{chunk-55QJI7OQ.js → chunk-HY24VLOS.js} +1 -1
  16. package/dist/{chunk-LZT5LZKG.js → chunk-KDKXQODT.js} +2 -2
  17. package/dist/{chunk-HFL2SOFQ.js → chunk-KNOCJVE6.js} +1 -1
  18. package/dist/{chunk-MCP52ZSD.js → chunk-L2FQX7IL.js} +419 -244
  19. package/dist/chunk-L2FQX7IL.js.map +7 -0
  20. package/dist/{chunk-6Y4OSP3J.js → chunk-LAFEZLTD.js} +307 -218
  21. package/dist/chunk-LAFEZLTD.js.map +7 -0
  22. package/dist/{chunk-EXEPX5H2.js → chunk-LAQQRRQR.js} +4 -4
  23. package/dist/{chunk-2U747SA5.js → chunk-LEQNJ73H.js} +3 -3
  24. package/dist/{chunk-NZTVG7YS.js → chunk-MZ6UJROW.js} +4 -4
  25. package/dist/{chunk-MLCISJKM.js → chunk-N6DXTYLR.js} +3 -3
  26. package/dist/{chunk-JF4AMPKU.js → chunk-OBFMPMGW.js} +2 -2
  27. package/dist/{chunk-A7VN6YXZ.js → chunk-OYCMMRZV.js} +1 -1
  28. package/dist/{chunk-XZNXY65J.js → chunk-PKAVBIO7.js} +1 -1
  29. package/dist/{chunk-S2AJAM6R.js → chunk-SNKLRBWT.js} +2 -2
  30. package/dist/{chunk-6GOKZQDV.js → chunk-SQJJRPIY.js} +5 -5
  31. package/dist/{chunk-72SGZIMD.js → chunk-TMFNSMVV.js} +6 -6
  32. package/dist/{chunk-D3Q32IUW.js → chunk-U7MPXQO4.js} +3 -3
  33. package/dist/{chunk-3P2EGWMK.js → chunk-VUILI5ED.js} +2 -2
  34. package/dist/{chunk-7FNDFUQH.js → chunk-WCKPMAYX.js} +1 -1
  35. package/dist/{chunk-PSI4PJ2H.js → chunk-WSN5UCPE.js} +1 -1
  36. package/dist/{chunk-AWML3QPK.js → chunk-YNVGW5VZ.js} +7 -7
  37. package/dist/{chunk-I5H5PGD5.js → chunk-YTUV273Y.js} +50 -122
  38. package/dist/{chunk-I5H5PGD5.js.map → chunk-YTUV273Y.js.map} +2 -2
  39. package/dist/{chunk-GFDV6FUG.js → chunk-ZQAKMVXR.js} +3 -3
  40. package/dist/{cli-PCLH664O.js → cli-JPS6PPHH.js} +91 -89
  41. package/dist/{cli-PCLH664O.js.map → cli-JPS6PPHH.js.map} +2 -2
  42. package/dist/commands-3IJYY2KF.js +51 -0
  43. package/dist/{config-EBW7GI65.js → config-7RFJBYCF.js} +4 -4
  44. package/dist/{context-4BILE3LL.js → context-L6IDU4ZF.js} +6 -6
  45. package/dist/{customCommands-GDDHYRJR.js → customCommands-2ZLDKEPS.js} +4 -4
  46. package/dist/{env-7V57CD26.js → env-KKHHZ47D.js} +2 -2
  47. package/dist/{file-3W4M7RXM.js → file-QGJRLWJ7.js} +4 -4
  48. package/dist/index.js +3 -3
  49. package/dist/{llm-PIRKDSMO.js → llm-HHSKS5JE.js} +31 -31
  50. package/dist/{llmLazy-HWKMKZ5M.js → llmLazy-YV33JO4W.js} +1 -1
  51. package/dist/{loader-GYFX3MOO.js → loader-YCEP5CYE.js} +4 -4
  52. package/dist/{lsp-BDQVEVFK.js → lsp-TG3EZZOU.js} +6 -6
  53. package/dist/{lspAnchor-S45W3FAI.js → lspAnchor-T3544E7J.js} +6 -6
  54. package/dist/{mcp-ZHLSRCM5.js → mcp-SWYFI5FF.js} +7 -7
  55. package/dist/{mentionProcessor-GOS6BB64.js → mentionProcessor-IP6FAEXL.js} +7 -6
  56. package/dist/{mentionProcessor-GOS6BB64.js.map → mentionProcessor-IP6FAEXL.js.map} +1 -1
  57. package/dist/{messages-AX4MWPK5.js → messages-3B2ZJJKW.js} +1 -1
  58. package/dist/{model-QDQAUOQ6.js → model-HDJXCBKD.js} +5 -5
  59. package/dist/{openai-IBJPYBTX.js → openai-DF2BQT7X.js} +5 -5
  60. package/dist/{outputStyles-UNAE3KVB.js → outputStyles-GWUBSKDY.js} +4 -4
  61. package/dist/{pluginRuntime-QP6HTJ6Y.js → pluginRuntime-LKAAMJH2.js} +6 -6
  62. package/dist/{pluginValidation-C66MGV4E.js → pluginValidation-7GJA32YV.js} +6 -6
  63. package/dist/prompts-DB772NLS.js +53 -0
  64. package/dist/{pybAgentSessionLoad-GJQQFHVS.js → pybAgentSessionLoad-BGIX7L4O.js} +4 -4
  65. package/dist/{pybAgentSessionResume-2ZNOOEVX.js → pybAgentSessionResume-VKK6VZSA.js} +4 -4
  66. package/dist/{pybAgentStreamJsonSession-PE2K75QJ.js → pybAgentStreamJsonSession-HDXJ4F5W.js} +1 -1
  67. package/dist/{pybHooks-22R4DOTT.js → pybHooks-LEIAZ7D6.js} +5 -5
  68. package/dist/query-LVPGQYDL.js +55 -0
  69. package/dist/{registry-ES4KTNF7.js → registry-C4V5AZ6N.js} +5 -5
  70. package/dist/{ripgrep-7BPG53S4.js → ripgrep-PWIRRS2Q.js} +3 -3
  71. package/dist/{skillMarketplace-O5TAM4G6.js → skillMarketplace-GZN6RWUY.js} +3 -3
  72. package/dist/{state-3OM3WWZ2.js → state-T7WQKFBG.js} +2 -2
  73. package/dist/{theme-7MFSQQ5Z.js → theme-CLYLDSCI.js} +5 -5
  74. package/dist/{toolPermissionSettings-KKMWAVTJ.js → toolPermissionSettings-UYHSUTC5.js} +6 -6
  75. package/dist/tools-SEWCFM5P.js +52 -0
  76. package/dist/{userInput-3BYMTC52.js → userInput-KZXH5O7V.js} +32 -32
  77. package/package.json +27 -3
  78. package/dist/REPL-PRQAXE32.js +0 -47
  79. package/dist/chunk-6Y4OSP3J.js.map +0 -7
  80. package/dist/chunk-MCP52ZSD.js.map +0 -7
  81. package/dist/chunk-YFBIVUDT.js.map +0 -7
  82. package/dist/commands-Y7GVRV66.js +0 -51
  83. package/dist/prompts-LNJ2SJQ7.js +0 -53
  84. package/dist/query-2ZFLZTV6.js +0 -55
  85. package/dist/tools-ME4EX5CM.js +0 -52
  86. /package/dist/{REPL-PRQAXE32.js.map → REPL-6YEOSMEP.js.map} +0 -0
  87. /package/dist/{acp-FGRNDOS5.js.map → acp-2C774HUW.js.map} +0 -0
  88. /package/dist/{agentsValidate-7CRDPNQ6.js.map → agentsValidate-RCXZBOU3.js.map} +0 -0
  89. /package/dist/{ask-IR5W5M66.js.map → ask-EIO3Q6ED.js.map} +0 -0
  90. /package/dist/{autoUpdater-MAEQZPST.js.map → autoUpdater-IIJMDPJE.js.map} +0 -0
  91. /package/dist/{chunk-SHIPHOMT.js.map → chunk-5RX62PWR.js.map} +0 -0
  92. /package/dist/{chunk-XHGUMYRL.js.map → chunk-6MFZG46W.js.map} +0 -0
  93. /package/dist/{chunk-IQ3KORSP.js.map → chunk-DCSAQNHW.js.map} +0 -0
  94. /package/dist/{chunk-QW4VX3FW.js.map → chunk-G2FI43IB.js.map} +0 -0
  95. /package/dist/{chunk-4Z6CCSED.js.map → chunk-GLS3ZXCS.js.map} +0 -0
  96. /package/dist/{chunk-DEQQW4H6.js.map → chunk-GTP62T63.js.map} +0 -0
  97. /package/dist/{chunk-UUGWQSET.js.map → chunk-HJDETBB6.js.map} +0 -0
  98. /package/dist/{chunk-55QJI7OQ.js.map → chunk-HY24VLOS.js.map} +0 -0
  99. /package/dist/{chunk-LZT5LZKG.js.map → chunk-KDKXQODT.js.map} +0 -0
  100. /package/dist/{chunk-HFL2SOFQ.js.map → chunk-KNOCJVE6.js.map} +0 -0
  101. /package/dist/{chunk-EXEPX5H2.js.map → chunk-LAQQRRQR.js.map} +0 -0
  102. /package/dist/{chunk-2U747SA5.js.map → chunk-LEQNJ73H.js.map} +0 -0
  103. /package/dist/{chunk-NZTVG7YS.js.map → chunk-MZ6UJROW.js.map} +0 -0
  104. /package/dist/{chunk-MLCISJKM.js.map → chunk-N6DXTYLR.js.map} +0 -0
  105. /package/dist/{chunk-JF4AMPKU.js.map → chunk-OBFMPMGW.js.map} +0 -0
  106. /package/dist/{chunk-A7VN6YXZ.js.map → chunk-OYCMMRZV.js.map} +0 -0
  107. /package/dist/{chunk-XZNXY65J.js.map → chunk-PKAVBIO7.js.map} +0 -0
  108. /package/dist/{chunk-S2AJAM6R.js.map → chunk-SNKLRBWT.js.map} +0 -0
  109. /package/dist/{chunk-6GOKZQDV.js.map → chunk-SQJJRPIY.js.map} +0 -0
  110. /package/dist/{chunk-72SGZIMD.js.map → chunk-TMFNSMVV.js.map} +0 -0
  111. /package/dist/{chunk-D3Q32IUW.js.map → chunk-U7MPXQO4.js.map} +0 -0
  112. /package/dist/{chunk-3P2EGWMK.js.map → chunk-VUILI5ED.js.map} +0 -0
  113. /package/dist/{chunk-7FNDFUQH.js.map → chunk-WCKPMAYX.js.map} +0 -0
  114. /package/dist/{chunk-PSI4PJ2H.js.map → chunk-WSN5UCPE.js.map} +0 -0
  115. /package/dist/{chunk-AWML3QPK.js.map → chunk-YNVGW5VZ.js.map} +0 -0
  116. /package/dist/{chunk-GFDV6FUG.js.map → chunk-ZQAKMVXR.js.map} +0 -0
  117. /package/dist/{commands-Y7GVRV66.js.map → commands-3IJYY2KF.js.map} +0 -0
  118. /package/dist/{config-EBW7GI65.js.map → config-7RFJBYCF.js.map} +0 -0
  119. /package/dist/{context-4BILE3LL.js.map → context-L6IDU4ZF.js.map} +0 -0
  120. /package/dist/{customCommands-GDDHYRJR.js.map → customCommands-2ZLDKEPS.js.map} +0 -0
  121. /package/dist/{env-7V57CD26.js.map → env-KKHHZ47D.js.map} +0 -0
  122. /package/dist/{file-3W4M7RXM.js.map → file-QGJRLWJ7.js.map} +0 -0
  123. /package/dist/{llm-PIRKDSMO.js.map → llm-HHSKS5JE.js.map} +0 -0
  124. /package/dist/{llmLazy-HWKMKZ5M.js.map → llmLazy-YV33JO4W.js.map} +0 -0
  125. /package/dist/{loader-GYFX3MOO.js.map → loader-YCEP5CYE.js.map} +0 -0
  126. /package/dist/{lsp-BDQVEVFK.js.map → lsp-TG3EZZOU.js.map} +0 -0
  127. /package/dist/{lspAnchor-S45W3FAI.js.map → lspAnchor-T3544E7J.js.map} +0 -0
  128. /package/dist/{mcp-ZHLSRCM5.js.map → mcp-SWYFI5FF.js.map} +0 -0
  129. /package/dist/{messages-AX4MWPK5.js.map → messages-3B2ZJJKW.js.map} +0 -0
  130. /package/dist/{model-QDQAUOQ6.js.map → model-HDJXCBKD.js.map} +0 -0
  131. /package/dist/{openai-IBJPYBTX.js.map → openai-DF2BQT7X.js.map} +0 -0
  132. /package/dist/{outputStyles-UNAE3KVB.js.map → outputStyles-GWUBSKDY.js.map} +0 -0
  133. /package/dist/{pluginRuntime-QP6HTJ6Y.js.map → pluginRuntime-LKAAMJH2.js.map} +0 -0
  134. /package/dist/{pluginValidation-C66MGV4E.js.map → pluginValidation-7GJA32YV.js.map} +0 -0
  135. /package/dist/{prompts-LNJ2SJQ7.js.map → prompts-DB772NLS.js.map} +0 -0
  136. /package/dist/{pybAgentSessionLoad-GJQQFHVS.js.map → pybAgentSessionLoad-BGIX7L4O.js.map} +0 -0
  137. /package/dist/{pybAgentSessionResume-2ZNOOEVX.js.map → pybAgentSessionResume-VKK6VZSA.js.map} +0 -0
  138. /package/dist/{pybAgentStreamJsonSession-PE2K75QJ.js.map → pybAgentStreamJsonSession-HDXJ4F5W.js.map} +0 -0
  139. /package/dist/{pybHooks-22R4DOTT.js.map → pybHooks-LEIAZ7D6.js.map} +0 -0
  140. /package/dist/{query-2ZFLZTV6.js.map → query-LVPGQYDL.js.map} +0 -0
  141. /package/dist/{registry-ES4KTNF7.js.map → registry-C4V5AZ6N.js.map} +0 -0
  142. /package/dist/{ripgrep-7BPG53S4.js.map → ripgrep-PWIRRS2Q.js.map} +0 -0
  143. /package/dist/{skillMarketplace-O5TAM4G6.js.map → skillMarketplace-GZN6RWUY.js.map} +0 -0
  144. /package/dist/{state-3OM3WWZ2.js.map → state-T7WQKFBG.js.map} +0 -0
  145. /package/dist/{theme-7MFSQQ5Z.js.map → theme-CLYLDSCI.js.map} +0 -0
  146. /package/dist/{toolPermissionSettings-KKMWAVTJ.js.map → toolPermissionSettings-UYHSUTC5.js.map} +0 -0
  147. /package/dist/{tools-ME4EX5CM.js.map → tools-SEWCFM5P.js.map} +0 -0
  148. /package/dist/{userInput-3BYMTC52.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-I5H5PGD5.js";
31
+ } from "./chunk-YTUV273Y.js";
33
32
  import {
34
33
  queryLLM
35
- } from "./chunk-EXEPX5H2.js";
34
+ } from "./chunk-LAQQRRQR.js";
36
35
  import {
37
36
  FallbackToolUseRejectedMessage,
38
37
  MCPTool,
39
38
  getClients,
40
39
  getMCPTools
41
- } from "./chunk-AWML3QPK.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-MCP52ZSD.js";
53
+ } from "./chunk-L2FQX7IL.js";
52
54
  import {
53
55
  getActiveAgents,
54
56
  getAgentByType,
55
57
  getAvailableAgentTypes
56
- } from "./chunk-LZT5LZKG.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-SHIPHOMT.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-QW4VX3FW.js";
71
+ } from "./chunk-G2FI43IB.js";
70
72
  import {
71
73
  LspFacade,
72
74
  formatDiagnosticsPretty
73
- } from "./chunk-IQ3KORSP.js";
75
+ } from "./chunk-DCSAQNHW.js";
74
76
  import {
75
77
  getModelManager
76
- } from "./chunk-GFDV6FUG.js";
78
+ } from "./chunk-ZQAKMVXR.js";
77
79
  import {
78
80
  getContext
79
- } from "./chunk-NZTVG7YS.js";
81
+ } from "./chunk-MZ6UJROW.js";
80
82
  import {
81
83
  filesToTree,
82
84
  ripGrepWithStatus
83
- } from "./chunk-XZNXY65J.js";
85
+ } from "./chunk-PKAVBIO7.js";
84
86
  import {
85
87
  getTheme
86
- } from "./chunk-55QJI7OQ.js";
88
+ } from "./chunk-HY24VLOS.js";
87
89
  import {
88
90
  debug
89
- } from "./chunk-XHGUMYRL.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-UUGWQSET.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-3OM3WWZ2.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-BDQVEVFK.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
- );
2816
- const content2 = lastAssistant2?.message?.content?.filter(
2817
- (b) => b.type === "text"
2818
2839
  );
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,26 +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()
3148
- }).superRefine((value, ctx) => {
3149
- if (value.activeForm === value.subject) {
3150
- ctx.addIssue({
3151
- code: z9.ZodIssueCode.custom,
3152
- message: "activeForm \u4E0D\u5F97\u4E0E subject \u76F8\u540C"
3153
- });
3154
- }
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()
3155
3188
  });
3156
3189
  var TaskCreateTool = {
3157
3190
  name: "TaskCreate",
@@ -3193,23 +3226,13 @@ var TaskCreateTool = {
3193
3226
  async *call(input) {
3194
3227
  try {
3195
3228
  const subject = input.subject;
3196
- const task = createTask(
3197
- {
3198
- subject,
3199
- description: input.description,
3200
- activeForm: input.activeForm,
3201
- status: input.status,
3202
- tags: input.tags,
3203
- assignee: input.assignee,
3204
- metadata: input.metadata,
3205
- archived: input.archived,
3206
- parent: input.parent,
3207
- related: input.related,
3208
- legacyTodoId: input.legacyTodoId
3209
- },
3210
- { listId: input.listId }
3211
- );
3212
- 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();
3213
3236
  emitReminderEvent("task.created", {
3214
3237
  listId,
3215
3238
  taskId: task.id,
@@ -3237,10 +3260,10 @@ var TaskCreateTool = {
3237
3260
  };
3238
3261
 
3239
3262
  // src/tools/interaction/TaskGetTool/TaskGetTool.tsx
3240
- import { z as z10 } from "zod";
3263
+ import { z as z11 } from "zod";
3241
3264
 
3242
3265
  // src/tools/interaction/TaskGetTool/prompt.ts
3243
- var DESCRIPTION7 = "Fetch a single task by id from the task list.";
3266
+ var DESCRIPTION7 = "Retrieve individual task details";
3244
3267
  var PROMPT7 = `Use this tool to fetch a single task by id.
3245
3268
 
3246
3269
  ## When to Use This Tool
@@ -3271,9 +3294,8 @@ Assistant: I'll fetch the task details first.
3271
3294
  `;
3272
3295
 
3273
3296
  // src/tools/interaction/TaskGetTool/TaskGetTool.tsx
3274
- var inputSchema10 = z10.strictObject({
3275
- listId: z10.string().optional(),
3276
- taskId: z10.string().min(1)
3297
+ var inputSchema10 = z11.strictObject({
3298
+ taskId: z11.string().min(1)
3277
3299
  });
3278
3300
  var TaskGetTool = {
3279
3301
  name: "TaskGet",
@@ -3307,8 +3329,8 @@ var TaskGetTool = {
3307
3329
  return null;
3308
3330
  },
3309
3331
  async *call(input) {
3310
- const { listId } = getTaskListPaths(input.listId);
3311
- const task = getTask(input.taskId, { listId: input.listId });
3332
+ const { listId } = getTaskListPaths();
3333
+ const task = getTask(input.taskId);
3312
3334
  if (!task) {
3313
3335
  yield {
3314
3336
  type: "result",
@@ -3325,17 +3347,17 @@ var TaskGetTool = {
3325
3347
  type: "result",
3326
3348
  data: {
3327
3349
  listId,
3328
- item: toTaskDetail(task)
3350
+ item: toTaskGetDetail(task)
3329
3351
  }
3330
3352
  };
3331
3353
  }
3332
3354
  };
3333
3355
 
3334
3356
  // src/tools/interaction/TaskListTool/TaskListTool.tsx
3335
- import { z as z11 } from "zod";
3357
+ import { z as z12 } from "zod";
3336
3358
 
3337
3359
  // src/tools/interaction/TaskListTool/prompt.ts
3338
- 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.";
3339
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.
3340
3362
 
3341
3363
  ## When to Use This Tool
@@ -3355,9 +3377,7 @@ Skip using this tool when:
3355
3377
  NOTE that TaskList is for summaries and readiness; use TaskGet for details.
3356
3378
 
3357
3379
  ## Input Notes
3358
- - listId is optional; omit to use the default list.
3359
3380
  - status filters the returned items; omit to exclude archived tasks by default.
3360
- - includeBlocked=false returns only ready items.
3361
3381
  - blockedBy may be empty early in planning and will appear as dependencies are added.
3362
3382
 
3363
3383
  ## Examples of When to Use TaskList
@@ -3382,10 +3402,8 @@ Assistant: I'll list tasks to show the updated ready/blocked breakdown.
3382
3402
  `;
3383
3403
 
3384
3404
  // src/tools/interaction/TaskListTool/TaskListTool.tsx
3385
- var inputSchema11 = z11.strictObject({
3386
- listId: z11.string().optional(),
3387
- status: z11.array(z11.enum(["pending", "in_progress", "blocked", "done", "archived"])).optional(),
3388
- includeBlocked: z11.boolean().optional()
3405
+ var inputSchema11 = z12.strictObject({
3406
+ status: z12.enum(["pending", "in_progress", "completed"]).optional()
3389
3407
  });
3390
3408
  var filterByStatus = (tasks, statuses) => {
3391
3409
  if (!statuses || statuses.length === 0) {
@@ -3394,6 +3412,12 @@ var filterByStatus = (tasks, statuses) => {
3394
3412
  const allowed = new Set(statuses);
3395
3413
  return tasks.filter((item) => allowed.has(item.status));
3396
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
+ };
3397
3421
  var TaskListTool = {
3398
3422
  name: "TaskList",
3399
3423
  cachedDescription: DESCRIPTION8,
@@ -3427,21 +3451,15 @@ var TaskListTool = {
3427
3451
  },
3428
3452
  async *call(input) {
3429
3453
  try {
3430
- const { listId } = getTaskListPaths(input.listId);
3431
- const tasks = listTasks({ listId: input.listId });
3432
- const filtered = filterByStatus(tasks, input.status);
3433
- const readyBlocked = calculateReadyBlocked(filtered);
3434
- const ready = readyBlocked.ready.map(toTaskListItem);
3435
- const blocked = readyBlocked.blocked.map(toTaskListItem);
3436
- const includeBlocked = input.includeBlocked !== false;
3437
- 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);
3438
3458
  yield {
3439
3459
  type: "result",
3440
3460
  data: {
3441
3461
  listId,
3442
- items,
3443
- ready,
3444
- blocked: includeBlocked ? blocked : []
3462
+ items
3445
3463
  }
3446
3464
  };
3447
3465
  } catch (error) {
@@ -3459,10 +3477,10 @@ var TaskListTool = {
3459
3477
 
3460
3478
  // src/tools/interaction/TaskUpdateTool/TaskUpdateTool.tsx
3461
3479
  import React10 from "react";
3462
- import { z as z12 } from "zod";
3480
+ import { z as z13 } from "zod";
3463
3481
 
3464
3482
  // src/tools/interaction/TaskUpdateTool/prompt.ts
3465
- var DESCRIPTION9 = "Update an existing task, including status, metadata, and dependencies with conflict checks.";
3483
+ var DESCRIPTION9 = "Modify task status, metadata, and dependencies";
3466
3484
  var PROMPT9 = `Use this tool to update an existing task. It is the primary way to track progress and adjust task details.
3467
3485
 
3468
3486
  ## When to Use This Tool
@@ -3533,10 +3551,38 @@ Assistant: I'll refetch the task and retry the update.
3533
3551
  // src/tools/interaction/TaskUpdateTool/TaskUpdateTool.tsx
3534
3552
  var isCompletedStatus = (status) => status === "done" || status === "archived";
3535
3553
  var normalizeDeps = (items) => [...items ?? []].filter(Boolean).sort();
3536
- var normalizeBlockedBy = (items) => {
3537
- if (!items) return void 0;
3538
- const filtered = items.filter(Boolean);
3539
- 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;
3540
3586
  };
3541
3587
  var depsChanged = (prev, next) => {
3542
3588
  if (prev.parent !== next.parent) return true;
@@ -3546,6 +3592,12 @@ var depsChanged = (prev, next) => {
3546
3592
  for (let i = 0; i < prevBlockedBy.length; i += 1) {
3547
3593
  if (prevBlockedBy[i] !== nextBlockedBy[i]) return true;
3548
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
+ }
3549
3601
  const prevRelated = normalizeDeps(prev.related);
3550
3602
  const nextRelated = normalizeDeps(next.related);
3551
3603
  if (prevRelated.length !== nextRelated.length) return true;
@@ -3561,7 +3613,10 @@ var getDepsSnapshot = (task) => ({
3561
3613
  related: task.related ?? []
3562
3614
  });
3563
3615
  var getMissingBlockedBy = (blockedBy, ids) => (blockedBy ?? []).filter((id) => !ids.has(id));
3564
- var isPlanFinalized = (metadata) => metadata?.planFinalized === "true";
3616
+ var isPlanFinalized = (metadata) => {
3617
+ const value = metadata?.planFinalized;
3618
+ return value === true || value === "true";
3619
+ };
3565
3620
  var compareTaskId = (left, right) => {
3566
3621
  const leftValue = Number(left.id);
3567
3622
  const rightValue = Number(right.id);
@@ -3572,25 +3627,16 @@ var compareTaskId = (left, right) => {
3572
3627
  if (rightIsNumber) return 1;
3573
3628
  return left.id.localeCompare(right.id);
3574
3629
  };
3575
- var inputSchema12 = z12.strictObject({
3576
- listId: z12.string().optional(),
3577
- taskId: z12.string().min(1),
3578
- subject: z12.string().optional(),
3579
- description: z12.string().optional(),
3580
- activeForm: z12.string().optional(),
3581
- status: z12.enum(["pending", "in_progress", "blocked", "done", "archived"]).optional(),
3582
- tags: z12.array(z12.string()).optional(),
3583
- assignee: z12.string().optional(),
3584
- metadata: z12.record(z12.string()).optional(),
3585
- archived: z12.boolean().optional(),
3586
- blocks: z12.array(z12.string()).optional(),
3587
- blockedBy: z12.array(z12.string()).optional(),
3588
- parent: z12.string().optional(),
3589
- related: z12.array(z12.string()).optional(),
3590
- baseVersion: z12.number().optional(),
3591
- version: z12.number().optional(),
3592
- allowMerge: z12.boolean().optional(),
3593
- 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()
3594
3640
  });
3595
3641
  var TaskUpdateTool = {
3596
3642
  name: "TaskUpdate",
@@ -3630,8 +3676,8 @@ var TaskUpdateTool = {
3630
3676
  return null;
3631
3677
  },
3632
3678
  async *call(input) {
3633
- const { listId } = getTaskListPaths(input.listId);
3634
- const existing = getTask(input.taskId, { listId: input.listId });
3679
+ const { listId } = getTaskListPaths();
3680
+ const existing = getTask(input.taskId);
3635
3681
  if (!existing) {
3636
3682
  yield {
3637
3683
  type: "result",
@@ -3644,27 +3690,37 @@ var TaskUpdateTool = {
3644
3690
  };
3645
3691
  return;
3646
3692
  }
3647
- const tasks = listTasks({ listId: input.listId });
3693
+ const tasks = listTasks();
3648
3694
  const subject = input.subject ?? existing.subject;
3649
- 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
+ );
3650
3702
  const updatedTask = {
3651
3703
  ...existing,
3652
3704
  subject,
3653
3705
  description: input.description ?? existing.description,
3654
3706
  activeForm: input.activeForm ?? existing.activeForm,
3655
- status: input.status ?? existing.status,
3656
- tags: input.tags ?? existing.tags,
3657
- assignee: input.assignee ?? existing.assignee,
3658
- metadata: input.metadata ?? existing.metadata,
3659
- archived: input.archived ?? existing.archived,
3660
- blockedBy: nextBlockedBy ?? existing.blockedBy,
3661
- parent: input.parent ?? existing.parent,
3662
- related: input.related ?? existing.related,
3663
- legacyTodoId: input.legacyTodoId ?? existing.legacyTodoId
3707
+ status: mappedStatus ?? existing.status,
3708
+ assignee: input.owner ?? existing.assignee,
3709
+ metadata: mergedMetadata ?? existing.metadata,
3710
+ blockedBy: mergedBlockedBy
3664
3711
  };
3665
- const candidateTasks = tasks.map(
3666
- (task) => task.id === existing.id ? updatedTask : task
3667
- );
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
+ });
3668
3724
  const candidateIds = new Set(candidateTasks.map((task) => task.id));
3669
3725
  if (tasks.length > 1 && tasks[0]?.id !== updatedTask.id && (updatedTask.blockedBy?.length ?? 0) === 0) {
3670
3726
  emitReminderEvent("task.dependency_chain_missing", {
@@ -3674,20 +3730,44 @@ var TaskUpdateTool = {
3674
3730
  timestamp: Date.now()
3675
3731
  });
3676
3732
  }
3677
- if (input.blockedBy) {
3678
- const missing = getMissingBlockedBy(updatedTask.blockedBy, candidateIds);
3679
- if (missing.length > 0) {
3680
- yield {
3681
- type: "result",
3682
- data: createTaskToolError({
3683
- type: "validation",
3684
- code: "TASK_BLOCKEDBY_NOT_FOUND",
3685
- message: "BlockedBy tasks must exist in the same list",
3686
- details: { taskId: updatedTask.id, listId, missingBlockedBy: missing }
3687
- })
3688
- };
3689
- return;
3690
- }
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;
3691
3771
  }
3692
3772
  const cycles = findTaskCycles(buildTaskGraph(candidateTasks));
3693
3773
  if (cycles.length > 0) {
@@ -3702,7 +3782,7 @@ var TaskUpdateTool = {
3702
3782
  };
3703
3783
  return;
3704
3784
  }
3705
- const nextMetadata = input.metadata ?? existing.metadata;
3785
+ const nextMetadata = mergedMetadata ?? existing.metadata;
3706
3786
  if (isPlanFinalized(nextMetadata) && !isPlanFinalized(existing.metadata)) {
3707
3787
  const activeTasks = candidateTasks.filter((task) => task.status !== "archived");
3708
3788
  const ordered = [...activeTasks].sort(compareTaskId);
@@ -3735,7 +3815,7 @@ var TaskUpdateTool = {
3735
3815
  }
3736
3816
  }
3737
3817
  }
3738
- if (input.status && isCompletedStatus(input.status)) {
3818
+ if (mappedStatus && isCompletedStatus(mappedStatus)) {
3739
3819
  const parentId = updatedTask.parent;
3740
3820
  if (parentId) {
3741
3821
  const parentTask = tasks.find((task) => task.id === parentId);
@@ -3757,25 +3837,34 @@ var TaskUpdateTool = {
3757
3837
  }
3758
3838
  }
3759
3839
  try {
3760
- 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
+ }
3761
3857
  const result = updateTask(
3762
3858
  input.taskId,
3763
3859
  {
3764
3860
  subject: input.subject,
3765
3861
  description: input.description,
3766
3862
  activeForm: input.activeForm,
3767
- status: input.status,
3768
- tags: input.tags,
3769
- assignee: input.assignee,
3770
- metadata: input.metadata,
3771
- archived: input.archived,
3772
- blockedBy: nextBlockedBy,
3773
- parent: input.parent,
3774
- related: input.related,
3775
- baseVersion,
3776
- legacyTodoId: input.legacyTodoId
3777
- },
3778
- { listId: input.listId, allowMerge: input.allowMerge }
3863
+ status: mappedStatus,
3864
+ assignee: input.owner,
3865
+ metadata: metadataUpdate,
3866
+ blockedBy: mergedBlockedBy
3867
+ }
3779
3868
  );
3780
3869
  const didDepsChange = depsChanged(existing, result.task);
3781
3870
  emitReminderEvent("task.updated", {