pybao-cli 1.4.43 → 1.4.44

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 (145) hide show
  1. package/dist/REPL-EAV5UQFM.js +47 -0
  2. package/dist/{acp-KQ5SYBCC.js → acp-5O7V3YQY.js} +29 -29
  3. package/dist/{agentsValidate-SJFVDKUZ.js → agentsValidate-G5ZQAUR4.js} +7 -7
  4. package/dist/{ask-A6QHZ5U4.js → ask-UAVA6F5R.js} +28 -28
  5. package/dist/{autoUpdater-BBZVYPRI.js → autoUpdater-KKEQ2ULZ.js} +3 -3
  6. package/dist/{chunk-ETXZ5OPA.js → chunk-25W7KIUK.js} +3 -3
  7. package/dist/{chunk-I5KAA66I.js → chunk-3TW4UYVK.js} +3 -3
  8. package/dist/{chunk-YKWQF7PT.js → chunk-4AQYC7BM.js} +1 -1
  9. package/dist/{chunk-UJ76NKSF.js → chunk-5BYVWKN2.js} +3 -3
  10. package/dist/{chunk-VPQZQRSR.js → chunk-AEJORUDW.js} +598 -578
  11. package/dist/{chunk-VPQZQRSR.js.map → chunk-AEJORUDW.js.map} +4 -4
  12. package/dist/{chunk-MU5SIPBA.js → chunk-AYD24IXA.js} +4 -4
  13. package/dist/{chunk-NH7SWX57.js → chunk-C4EW6YOH.js} +3 -3
  14. package/dist/{chunk-WUCVC3QT.js → chunk-C4JMYHEY.js} +152 -67
  15. package/dist/{chunk-WUCVC3QT.js.map → chunk-C4JMYHEY.js.map} +3 -3
  16. package/dist/{chunk-TRYEQHHB.js → chunk-C73YTQE3.js} +2 -2
  17. package/dist/{chunk-ELBWGYTR.js → chunk-CEQJ3UY2.js} +3 -3
  18. package/dist/{chunk-F2TALCDM.js → chunk-CVR5J7HI.js} +1 -1
  19. package/dist/{chunk-2AV6L5GN.js → chunk-CZEV7RNL.js} +1 -1
  20. package/dist/{chunk-6YLH7AMI.js → chunk-CZKMFNDC.js} +4 -4
  21. package/dist/{chunk-ZJXLGVQQ.js → chunk-DYYRGY6Q.js} +3 -3
  22. package/dist/{chunk-BHHF247Q.js → chunk-GSEVRFO7.js} +2 -2
  23. package/dist/{chunk-Z2P4A76S.js → chunk-GXNEEWUV.js} +1 -1
  24. package/dist/{chunk-UTVCNV53.js → chunk-IIGZBH6C.js} +2 -2
  25. package/dist/{chunk-YMF3HIKQ.js → chunk-KUS6C7RQ.js} +1 -1
  26. package/dist/{chunk-YMF3HIKQ.js.map → chunk-KUS6C7RQ.js.map} +1 -1
  27. package/dist/{chunk-BGMXYCEG.js → chunk-L62LBMEY.js} +1 -1
  28. package/dist/{chunk-CGJFRSE7.js → chunk-MUXFNBSK.js} +2 -2
  29. package/dist/{chunk-37RJWRLG.js → chunk-NFQ7DMXQ.js} +2 -2
  30. package/dist/{chunk-VIGMIQJS.js → chunk-PLIISO75.js} +4 -4
  31. package/dist/{chunk-BEQU37HJ.js → chunk-SK2HNWN7.js} +3 -3
  32. package/dist/{chunk-D2YR3LSF.js → chunk-TD7EJUWP.js} +4 -4
  33. package/dist/{chunk-4ZYN5JOV.js → chunk-VZLNH3C6.js} +1 -1
  34. package/dist/{chunk-OIWM647G.js → chunk-WSNCRG6B.js} +1 -1
  35. package/dist/{chunk-I52DKV6I.js → chunk-XPNFLNWB.js} +3 -3
  36. package/dist/{chunk-YQAWSNBK.js → chunk-XTBYYI3V.js} +1 -1
  37. package/dist/{chunk-VTHYZQ4P.js → chunk-YDDEKQZ6.js} +2 -2
  38. package/dist/{chunk-JFGQ5LGD.js → chunk-ZPGYMC3H.js} +1 -1
  39. package/dist/{cli-PAJXMDW5.js → cli-UDRARGLH.js} +87 -87
  40. package/dist/commands-2LY7ZT7W.js +51 -0
  41. package/dist/{config-WDRMJEUV.js → config-3HTSPEEU.js} +4 -4
  42. package/dist/{context-4M45WV6Z.js → context-CL5QF4SK.js} +6 -6
  43. package/dist/{customCommands-2J4CP34P.js → customCommands-T752CSHW.js} +4 -4
  44. package/dist/{env-3BNULBTS.js → env-ARPQQ6L4.js} +2 -2
  45. package/dist/{file-WG4PBI2E.js → file-UC3ZCA6G.js} +4 -4
  46. package/dist/index.js +3 -3
  47. package/dist/{llm-54EXVPB4.js → llm-UIPGZOHF.js} +29 -29
  48. package/dist/{llmLazy-YSFGCQ5F.js → llmLazy-FK7ADSGW.js} +1 -1
  49. package/dist/{loader-2CD5GCGC.js → loader-JOEZL3BT.js} +4 -4
  50. package/dist/{lsp-6ZD5473F.js → lsp-I7AZDBN2.js} +6 -6
  51. package/dist/{lspAnchor-TUWC4LL6.js → lspAnchor-UAEMXDZN.js} +6 -6
  52. package/dist/{mcp-HFVYJYXK.js → mcp-JR3KRFB4.js} +7 -7
  53. package/dist/{mentionProcessor-D2GK5QFP.js → mentionProcessor-J26U7USW.js} +6 -6
  54. package/dist/{messages-BSQOXWT5.js → messages-C2NKIIAV.js} +1 -1
  55. package/dist/{model-563AI4RO.js → model-YEJVMUUS.js} +5 -5
  56. package/dist/{openai-WZQPCVLM.js → openai-VJON73JP.js} +5 -5
  57. package/dist/{outputStyles-K4SQQTC3.js → outputStyles-UC2YD4SH.js} +4 -4
  58. package/dist/{pluginRuntime-JGIUUE5F.js → pluginRuntime-YLQP5EGM.js} +6 -6
  59. package/dist/{pluginValidation-D7WFKFMO.js → pluginValidation-654GWXWV.js} +6 -6
  60. package/dist/prompts-MQY43ADI.js +53 -0
  61. package/dist/{pybAgentSessionLoad-FG7J7G3O.js → pybAgentSessionLoad-KVUVW6ZW.js} +4 -4
  62. package/dist/{pybAgentSessionResume-PRUHVKEY.js → pybAgentSessionResume-HQ6KUK66.js} +4 -4
  63. package/dist/{pybAgentStreamJsonSession-F3DNZDTX.js → pybAgentStreamJsonSession-Z5PLFR57.js} +1 -1
  64. package/dist/{pybHooks-NBIDAWW2.js → pybHooks-MQJSEOFE.js} +4 -4
  65. package/dist/query-A3X6PVWC.js +55 -0
  66. package/dist/{registry-EZF7OENP.js → registry-7BVK7AEO.js} +5 -5
  67. package/dist/{ripgrep-XQV6T7IY.js → ripgrep-D7NQJ7DP.js} +3 -3
  68. package/dist/{skillMarketplace-MC26442G.js → skillMarketplace-TDHQC3PM.js} +3 -3
  69. package/dist/{state-4CMVIHK4.js → state-O52OCOG6.js} +2 -2
  70. package/dist/{theme-PQTQKLCM.js → theme-AJTSKB5E.js} +5 -5
  71. package/dist/{toolPermissionSettings-XB5JDDOK.js → toolPermissionSettings-OSWJYPFQ.js} +6 -6
  72. package/dist/tools-WA3T66NR.js +52 -0
  73. package/dist/{userInput-DYHMKGOR.js → userInput-S2KCTTQT.js} +30 -30
  74. package/package.json +1 -1
  75. package/dist/REPL-YY7ZK4DX.js +0 -47
  76. package/dist/commands-NYISCZQN.js +0 -51
  77. package/dist/prompts-7FVIWVGF.js +0 -53
  78. package/dist/query-A2H7UU7Y.js +0 -55
  79. package/dist/tools-ED7TYE2A.js +0 -52
  80. /package/dist/{REPL-YY7ZK4DX.js.map → REPL-EAV5UQFM.js.map} +0 -0
  81. /package/dist/{acp-KQ5SYBCC.js.map → acp-5O7V3YQY.js.map} +0 -0
  82. /package/dist/{agentsValidate-SJFVDKUZ.js.map → agentsValidate-G5ZQAUR4.js.map} +0 -0
  83. /package/dist/{ask-A6QHZ5U4.js.map → ask-UAVA6F5R.js.map} +0 -0
  84. /package/dist/{autoUpdater-BBZVYPRI.js.map → autoUpdater-KKEQ2ULZ.js.map} +0 -0
  85. /package/dist/{chunk-ETXZ5OPA.js.map → chunk-25W7KIUK.js.map} +0 -0
  86. /package/dist/{chunk-I5KAA66I.js.map → chunk-3TW4UYVK.js.map} +0 -0
  87. /package/dist/{chunk-YKWQF7PT.js.map → chunk-4AQYC7BM.js.map} +0 -0
  88. /package/dist/{chunk-UJ76NKSF.js.map → chunk-5BYVWKN2.js.map} +0 -0
  89. /package/dist/{chunk-MU5SIPBA.js.map → chunk-AYD24IXA.js.map} +0 -0
  90. /package/dist/{chunk-NH7SWX57.js.map → chunk-C4EW6YOH.js.map} +0 -0
  91. /package/dist/{chunk-TRYEQHHB.js.map → chunk-C73YTQE3.js.map} +0 -0
  92. /package/dist/{chunk-ELBWGYTR.js.map → chunk-CEQJ3UY2.js.map} +0 -0
  93. /package/dist/{chunk-F2TALCDM.js.map → chunk-CVR5J7HI.js.map} +0 -0
  94. /package/dist/{chunk-2AV6L5GN.js.map → chunk-CZEV7RNL.js.map} +0 -0
  95. /package/dist/{chunk-6YLH7AMI.js.map → chunk-CZKMFNDC.js.map} +0 -0
  96. /package/dist/{chunk-ZJXLGVQQ.js.map → chunk-DYYRGY6Q.js.map} +0 -0
  97. /package/dist/{chunk-BHHF247Q.js.map → chunk-GSEVRFO7.js.map} +0 -0
  98. /package/dist/{chunk-Z2P4A76S.js.map → chunk-GXNEEWUV.js.map} +0 -0
  99. /package/dist/{chunk-UTVCNV53.js.map → chunk-IIGZBH6C.js.map} +0 -0
  100. /package/dist/{chunk-BGMXYCEG.js.map → chunk-L62LBMEY.js.map} +0 -0
  101. /package/dist/{chunk-CGJFRSE7.js.map → chunk-MUXFNBSK.js.map} +0 -0
  102. /package/dist/{chunk-37RJWRLG.js.map → chunk-NFQ7DMXQ.js.map} +0 -0
  103. /package/dist/{chunk-VIGMIQJS.js.map → chunk-PLIISO75.js.map} +0 -0
  104. /package/dist/{chunk-BEQU37HJ.js.map → chunk-SK2HNWN7.js.map} +0 -0
  105. /package/dist/{chunk-D2YR3LSF.js.map → chunk-TD7EJUWP.js.map} +0 -0
  106. /package/dist/{chunk-4ZYN5JOV.js.map → chunk-VZLNH3C6.js.map} +0 -0
  107. /package/dist/{chunk-OIWM647G.js.map → chunk-WSNCRG6B.js.map} +0 -0
  108. /package/dist/{chunk-I52DKV6I.js.map → chunk-XPNFLNWB.js.map} +0 -0
  109. /package/dist/{chunk-YQAWSNBK.js.map → chunk-XTBYYI3V.js.map} +0 -0
  110. /package/dist/{chunk-VTHYZQ4P.js.map → chunk-YDDEKQZ6.js.map} +0 -0
  111. /package/dist/{chunk-JFGQ5LGD.js.map → chunk-ZPGYMC3H.js.map} +0 -0
  112. /package/dist/{cli-PAJXMDW5.js.map → cli-UDRARGLH.js.map} +0 -0
  113. /package/dist/{commands-NYISCZQN.js.map → commands-2LY7ZT7W.js.map} +0 -0
  114. /package/dist/{config-WDRMJEUV.js.map → config-3HTSPEEU.js.map} +0 -0
  115. /package/dist/{context-4M45WV6Z.js.map → context-CL5QF4SK.js.map} +0 -0
  116. /package/dist/{customCommands-2J4CP34P.js.map → customCommands-T752CSHW.js.map} +0 -0
  117. /package/dist/{env-3BNULBTS.js.map → env-ARPQQ6L4.js.map} +0 -0
  118. /package/dist/{file-WG4PBI2E.js.map → file-UC3ZCA6G.js.map} +0 -0
  119. /package/dist/{llm-54EXVPB4.js.map → llm-UIPGZOHF.js.map} +0 -0
  120. /package/dist/{llmLazy-YSFGCQ5F.js.map → llmLazy-FK7ADSGW.js.map} +0 -0
  121. /package/dist/{loader-2CD5GCGC.js.map → loader-JOEZL3BT.js.map} +0 -0
  122. /package/dist/{lsp-6ZD5473F.js.map → lsp-I7AZDBN2.js.map} +0 -0
  123. /package/dist/{lspAnchor-TUWC4LL6.js.map → lspAnchor-UAEMXDZN.js.map} +0 -0
  124. /package/dist/{mcp-HFVYJYXK.js.map → mcp-JR3KRFB4.js.map} +0 -0
  125. /package/dist/{mentionProcessor-D2GK5QFP.js.map → mentionProcessor-J26U7USW.js.map} +0 -0
  126. /package/dist/{messages-BSQOXWT5.js.map → messages-C2NKIIAV.js.map} +0 -0
  127. /package/dist/{model-563AI4RO.js.map → model-YEJVMUUS.js.map} +0 -0
  128. /package/dist/{openai-WZQPCVLM.js.map → openai-VJON73JP.js.map} +0 -0
  129. /package/dist/{outputStyles-K4SQQTC3.js.map → outputStyles-UC2YD4SH.js.map} +0 -0
  130. /package/dist/{pluginRuntime-JGIUUE5F.js.map → pluginRuntime-YLQP5EGM.js.map} +0 -0
  131. /package/dist/{pluginValidation-D7WFKFMO.js.map → pluginValidation-654GWXWV.js.map} +0 -0
  132. /package/dist/{prompts-7FVIWVGF.js.map → prompts-MQY43ADI.js.map} +0 -0
  133. /package/dist/{pybAgentSessionLoad-FG7J7G3O.js.map → pybAgentSessionLoad-KVUVW6ZW.js.map} +0 -0
  134. /package/dist/{pybAgentSessionResume-PRUHVKEY.js.map → pybAgentSessionResume-HQ6KUK66.js.map} +0 -0
  135. /package/dist/{pybAgentStreamJsonSession-F3DNZDTX.js.map → pybAgentStreamJsonSession-Z5PLFR57.js.map} +0 -0
  136. /package/dist/{pybHooks-NBIDAWW2.js.map → pybHooks-MQJSEOFE.js.map} +0 -0
  137. /package/dist/{query-A2H7UU7Y.js.map → query-A3X6PVWC.js.map} +0 -0
  138. /package/dist/{registry-EZF7OENP.js.map → registry-7BVK7AEO.js.map} +0 -0
  139. /package/dist/{ripgrep-XQV6T7IY.js.map → ripgrep-D7NQJ7DP.js.map} +0 -0
  140. /package/dist/{skillMarketplace-MC26442G.js.map → skillMarketplace-TDHQC3PM.js.map} +0 -0
  141. /package/dist/{state-4CMVIHK4.js.map → state-O52OCOG6.js.map} +0 -0
  142. /package/dist/{theme-PQTQKLCM.js.map → theme-AJTSKB5E.js.map} +0 -0
  143. /package/dist/{toolPermissionSettings-XB5JDDOK.js.map → toolPermissionSettings-OSWJYPFQ.js.map} +0 -0
  144. /package/dist/{tools-ED7TYE2A.js.map → tools-WA3T66NR.js.map} +0 -0
  145. /package/dist/{userInput-DYHMKGOR.js.map → userInput-S2KCTTQT.js.map} +0 -0
@@ -2,13 +2,13 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  ripGrepWithStatus
5
- } from "./chunk-Z2P4A76S.js";
5
+ } from "./chunk-GXNEEWUV.js";
6
6
  import {
7
7
  getCurrentProjectConfig,
8
8
  getGlobalConfig,
9
9
  getOrCreateUserID,
10
10
  saveCurrentProjectConfig
11
- } from "./chunk-I5KAA66I.js";
11
+ } from "./chunk-3TW4UYVK.js";
12
12
  import {
13
13
  SESSION_ID,
14
14
  env,
@@ -16,10 +16,10 @@ import {
16
16
  getCwd,
17
17
  isContextScanDisabled,
18
18
  logError
19
- } from "./chunk-JFGQ5LGD.js";
19
+ } from "./chunk-ZPGYMC3H.js";
20
20
  import {
21
21
  MACRO
22
- } from "./chunk-YMF3HIKQ.js";
22
+ } from "./chunk-KUS6C7RQ.js";
23
23
  import {
24
24
  __require
25
25
  } from "./chunk-I3J4JYES.js";
@@ -4,10 +4,10 @@ import {
4
4
  PRODUCT_NAME,
5
5
  execFileNoThrow,
6
6
  logError
7
- } from "./chunk-JFGQ5LGD.js";
7
+ } from "./chunk-ZPGYMC3H.js";
8
8
  import {
9
9
  MACRO
10
- } from "./chunk-YMF3HIKQ.js";
10
+ } from "./chunk-KUS6C7RQ.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-WDRMJEUV.js"), import("./env-3BNULBTS.js")]);
85
+ ] = await Promise.all([import("./config-3HTSPEEU.js"), import("./env-ARPQQ6L4.js")]);
86
86
  if (await isAutoUpdaterDisabled()) return;
87
87
  if (await env.getIsDocker()) return;
88
88
  if (!await env.hasInternetAccess()) return;
@@ -15,6 +15,7 @@ import {
15
15
  NotebookEditTool,
16
16
  SkillTool,
17
17
  SlashCommandTool,
18
+ TaskList,
18
19
  WebFetchTool,
19
20
  WebSearchTool,
20
21
  applyMarkdown,
@@ -28,16 +29,16 @@ import {
28
29
  hasReadPermission,
29
30
  hasWritePermission,
30
31
  query
31
- } from "./chunk-VPQZQRSR.js";
32
+ } from "./chunk-AEJORUDW.js";
32
33
  import {
33
34
  queryLLM
34
- } from "./chunk-6YLH7AMI.js";
35
+ } from "./chunk-CZKMFNDC.js";
35
36
  import {
36
37
  FallbackToolUseRejectedMessage,
37
38
  MCPTool,
38
39
  getClients,
39
40
  getMCPTools
40
- } from "./chunk-VIGMIQJS.js";
41
+ } from "./chunk-PLIISO75.js";
41
42
  import {
42
43
  TaskStoreConflictError,
43
44
  createTask,
@@ -48,45 +49,45 @@ import {
48
49
  getTaskNextId,
49
50
  listTasks,
50
51
  updateTask
51
- } from "./chunk-ETXZ5OPA.js";
52
+ } from "./chunk-25W7KIUK.js";
52
53
  import {
53
54
  getActiveAgents,
54
55
  getAgentByType,
55
56
  getAvailableAgentTypes
56
- } from "./chunk-BHHF247Q.js";
57
+ } from "./chunk-GSEVRFO7.js";
57
58
  import {
58
59
  INTERRUPT_MESSAGE,
59
60
  createAssistantMessage,
60
61
  createUserMessage,
61
62
  getLastAssistantMessageId
62
- } from "./chunk-BGMXYCEG.js";
63
+ } from "./chunk-L62LBMEY.js";
63
64
  import {
64
65
  formatDuration,
65
66
  formatNumber
66
67
  } from "./chunk-OUXHGDLH.js";
67
68
  import {
68
69
  getAbsolutePath
69
- } from "./chunk-CGJFRSE7.js";
70
+ } from "./chunk-MUXFNBSK.js";
70
71
  import {
71
72
  LspFacade,
72
73
  formatDiagnosticsPretty
73
- } from "./chunk-D2YR3LSF.js";
74
+ } from "./chunk-TD7EJUWP.js";
74
75
  import {
75
76
  getModelManager
76
- } from "./chunk-UJ76NKSF.js";
77
+ } from "./chunk-5BYVWKN2.js";
77
78
  import {
78
79
  getContext
79
- } from "./chunk-MU5SIPBA.js";
80
+ } from "./chunk-AYD24IXA.js";
80
81
  import {
81
82
  filesToTree,
82
83
  ripGrepWithStatus
83
- } from "./chunk-Z2P4A76S.js";
84
+ } from "./chunk-GXNEEWUV.js";
84
85
  import {
85
86
  getTheme
86
- } from "./chunk-2AV6L5GN.js";
87
+ } from "./chunk-CZEV7RNL.js";
87
88
  import {
88
89
  debug
89
- } from "./chunk-4ZYN5JOV.js";
90
+ } from "./chunk-VZLNH3C6.js";
90
91
  import {
91
92
  BunShell,
92
93
  getCwd,
@@ -97,7 +98,7 @@ import {
97
98
  overwriteLog,
98
99
  readTaskOutput,
99
100
  resolveXdgDataPath
100
- } from "./chunk-JFGQ5LGD.js";
101
+ } from "./chunk-ZPGYMC3H.js";
101
102
 
102
103
  // src/tools/index.ts
103
104
  import { memoize as memoize2 } from "lodash-es";
@@ -776,7 +777,7 @@ async function analyzeOutputWithLsp(output, exitCode) {
776
777
  if (exitCode !== 0 || errorCount > 0 || warningCount > 0) {
777
778
  try {
778
779
  const { isAbsolute: isAbsolute3, resolve: resolve4 } = await import("path");
779
- const { getSessionRoot: getSessionRoot2 } = await import("./state-4CMVIHK4.js");
780
+ const { getSessionRoot: getSessionRoot2 } = await import("./state-O52OCOG6.js");
780
781
  const lines = output.split("\n");
781
782
  const uniqueFiles = /* @__PURE__ */ new Set();
782
783
  const lspSuggestions = [];
@@ -1149,7 +1150,7 @@ var DeleteTool = {
1149
1150
  }
1150
1151
  if (!force) {
1151
1152
  try {
1152
- const { LspFacade: LspFacade2 } = await import("./lsp-6ZD5473F.js");
1153
+ const { LspFacade: LspFacade2 } = await import("./lsp-I7AZDBN2.js");
1153
1154
  const referenceDetail = await LspFacade2.checkFileReferences(fullPath);
1154
1155
  if (referenceDetail) {
1155
1156
  failedItems.push(
@@ -2999,6 +3000,7 @@ var TaskTool = {
2999
3000
  };
3000
3001
 
3001
3002
  // src/tools/interaction/TaskCreateTool/TaskCreateTool.tsx
3003
+ import React9 from "react";
3002
3004
  import { z as z9 } from "zod";
3003
3005
 
3004
3006
  // src/utils/session/taskToolUtils.ts
@@ -3048,7 +3050,7 @@ var PROMPT6 = `Use this tool to create a new task in the current task list. It i
3048
3050
  Use this tool proactively in these scenarios:
3049
3051
  1. You need to add a task with structured fields (subject, status, tags).
3050
3052
  2. You want to seed a plan for multi-step work before implementation starts.
3051
- 3. You need to define dependencies (blockedBy, parent, related) at creation time.
3053
+ 3. You want to create a plan first and add dependencies later.
3052
3054
  4. You need to align with a user request to create a task list or plan.
3053
3055
 
3054
3056
  ## When NOT to Use This Tool
@@ -3064,12 +3066,13 @@ NOTE that you should not use this tool if you are only updating status or detail
3064
3066
  - subject is required.
3065
3067
  - listId is optional; omit to use the default list.
3066
3068
  - Dependencies are validated for cycles; invalid cycles will be rejected.
3067
- - For multi-step plans, you MUST create a blockedBy dependency chain (at least linear).
3069
+ - For multi-step plans, you need to create structured task list without blockedBy and add dependencies later via TaskUpdate.
3068
3070
  - status can be open, in_progress, blocked, done, or archived.
3069
3071
  - activeForm will be generated from subject if omitted.
3070
3072
  - blockedBy is always stored as an array (empty when not used).
3071
3073
  - description and blockedBy are kept separate in JSON; any joining is only for terminal rendering.
3072
3074
  - Task ordering relies on task id; do not use priority fields.
3075
+ - Use metadata.planFinalized="true" in TaskUpdate when dependencies are ready to be validated globally.
3073
3076
 
3074
3077
  ## Batch Input Notes
3075
3078
  - Use tasks: [...] to create multiple tasks in one call.
@@ -3133,6 +3136,12 @@ Assistant: I'll create tasks in batch and keep your blockedBy values.
3133
3136
  *Creates tasks with tasks array and explicit blockedBy fields*
3134
3137
  </example>
3135
3138
 
3139
+ <example>
3140
+ User: Let's sketch the task list first and add dependencies later.
3141
+ Assistant: I'll create the tasks now and we can add blockedBy with TaskUpdate afterward.
3142
+ *Creates tasks without blockedBy*
3143
+ </example>
3144
+
3136
3145
  <example>
3137
3146
  User: Create just one task.
3138
3147
  Assistant: I'll create a single task.
@@ -3141,15 +3150,11 @@ Assistant: I'll create a single task.
3141
3150
  `;
3142
3151
 
3143
3152
  // src/tools/interaction/TaskCreateTool/TaskCreateTool.tsx
3144
- var shouldEnforceDependencyChain = () => {
3145
- const value = process.env.PYB_TASK_DEPENDENCY_ENFORCE?.toLowerCase();
3146
- if (!value) return true;
3147
- return value !== "false" && value !== "0";
3148
- };
3149
3153
  var shouldAutoChainDependencies = () => {
3150
3154
  const value = process.env.PYB_TASK_AUTOCHAIN?.toLowerCase();
3151
3155
  return value === "true" || value === "1";
3152
3156
  };
3157
+ var getMissingBlockedBy = (blockedBy, ids) => (blockedBy ?? []).filter((id) => !ids.has(id));
3153
3158
  var taskInputSchema = z9.strictObject({
3154
3159
  subject: z9.string().min(1),
3155
3160
  description: z9.string().optional(),
@@ -3251,6 +3256,12 @@ var TaskCreateTool = {
3251
3256
  renderResultForAssistant(output) {
3252
3257
  return JSON.stringify(output, null, 2);
3253
3258
  },
3259
+ renderToolResultMessage(output) {
3260
+ if ("error" in output) {
3261
+ return null;
3262
+ }
3263
+ return /* @__PURE__ */ React9.createElement(TaskList, { listId: output.listId });
3264
+ },
3254
3265
  renderToolUseMessage() {
3255
3266
  return null;
3256
3267
  },
@@ -3296,18 +3307,22 @@ var TaskCreateTool = {
3296
3307
  blockedBy: candidateBatch[index].blockedBy ?? [],
3297
3308
  timestamp: Date.now()
3298
3309
  });
3299
- if (shouldEnforceDependencyChain()) {
3300
- yield {
3301
- type: "result",
3302
- data: createTaskToolError({
3303
- type: "validation",
3304
- code: "TASK_DEPENDENCY_CHAIN_REQUIRED",
3305
- message: "Task dependency chain required for multi-step plans",
3306
- details: { taskId: candidateBatch[index].id, listId: listId2 }
3307
- })
3308
- };
3309
- return;
3310
- }
3310
+ }
3311
+ }
3312
+ const candidateIds2 = new Set(candidateTasks2.map((task2) => task2.id));
3313
+ for (const task2 of candidateBatch) {
3314
+ const missing2 = getMissingBlockedBy(task2.blockedBy, candidateIds2);
3315
+ if (missing2.length > 0) {
3316
+ yield {
3317
+ type: "result",
3318
+ data: createTaskToolError({
3319
+ type: "validation",
3320
+ code: "TASK_BLOCKEDBY_NOT_FOUND",
3321
+ message: "BlockedBy tasks must exist in the same list",
3322
+ details: { taskId: task2.id, listId: listId2, missingBlockedBy: missing2 }
3323
+ })
3324
+ };
3325
+ return;
3311
3326
  }
3312
3327
  }
3313
3328
  const cycles2 = findTaskCycles(buildTaskGraph(candidateTasks2));
@@ -3394,20 +3409,23 @@ var TaskCreateTool = {
3394
3409
  blockedBy: candidateTask.blockedBy ?? [],
3395
3410
  timestamp: Date.now()
3396
3411
  });
3397
- if (shouldEnforceDependencyChain()) {
3398
- yield {
3399
- type: "result",
3400
- data: createTaskToolError({
3401
- type: "validation",
3402
- code: "TASK_DEPENDENCY_CHAIN_REQUIRED",
3403
- message: "Task dependency chain required for multi-step plans",
3404
- details: { taskId: candidateTask.id, listId: listId2 }
3405
- })
3406
- };
3407
- return;
3408
- }
3409
3412
  }
3410
3413
  const candidateTasks = [...tasks, candidateTask];
3414
+ const candidateIds = new Set(candidateTasks.map((task2) => task2.id));
3415
+ const missing = getMissingBlockedBy(candidateTask.blockedBy, candidateIds);
3416
+ if (missing.length > 0) {
3417
+ const { listId: listId2 } = getTaskListPaths(input.listId);
3418
+ yield {
3419
+ type: "result",
3420
+ data: createTaskToolError({
3421
+ type: "validation",
3422
+ code: "TASK_BLOCKEDBY_NOT_FOUND",
3423
+ message: "BlockedBy tasks must exist in the same list",
3424
+ details: { taskId: candidateTask.id, listId: listId2, missingBlockedBy: missing }
3425
+ })
3426
+ };
3427
+ return;
3428
+ }
3411
3429
  const cycles = findTaskCycles(buildTaskGraph(candidateTasks));
3412
3430
  if (cycles.length > 0) {
3413
3431
  yield {
@@ -3587,6 +3605,7 @@ NOTE that TaskList is for summaries and readiness; use TaskGet for details.
3587
3605
  - listId is optional; omit to use the default list.
3588
3606
  - status filters the returned items; omit to exclude archived tasks by default.
3589
3607
  - includeBlocked=false returns only ready items.
3608
+ - blockedBy may be empty early in planning and will appear as dependencies are added.
3590
3609
 
3591
3610
  ## Examples of When to Use TaskList
3592
3611
 
@@ -3601,6 +3620,12 @@ User: Show only in-progress items.
3601
3620
  Assistant: I'll list tasks filtered by status.
3602
3621
  *Lists tasks with status filter*
3603
3622
  </example>
3623
+
3624
+ <example>
3625
+ User: We just added dependencies, can we see what's blocked now?
3626
+ Assistant: I'll list tasks to show the updated ready/blocked breakdown.
3627
+ *Lists tasks with ready/blocked breakdown*
3628
+ </example>
3604
3629
  `;
3605
3630
 
3606
3631
  // src/tools/interaction/TaskListTool/TaskListTool.tsx
@@ -3680,6 +3705,7 @@ var TaskListTool = {
3680
3705
  };
3681
3706
 
3682
3707
  // src/tools/interaction/TaskUpdateTool/TaskUpdateTool.tsx
3708
+ import React10 from "react";
3683
3709
  import { z as z12 } from "zod";
3684
3710
 
3685
3711
  // src/tools/interaction/TaskUpdateTool/prompt.ts
@@ -3707,7 +3733,8 @@ NOTE that TaskUpdate should be used when you need to persist task changes.
3707
3733
  - listId is optional; omit to use the default list.
3708
3734
  - If you provide status=done/archived and a parent exists, parent must already be completed.
3709
3735
  - Dependencies are validated for cycles; invalid cycles will be rejected.
3710
- - For multi-step plans, you MUST keep a blockedBy dependency chain (at least linear).
3736
+ - Use TaskUpdate to add blockedBy after tasks are created.
3737
+ - You can set metadata.planFinalized="true" to trigger a full dependency validation pass.
3711
3738
  - If an update fails due to a conflict, refetch the task and retry.
3712
3739
  - activeForm will be generated from subject if omitted.
3713
3740
  - blockedBy is always stored as an array (empty when not used).
@@ -3734,26 +3761,26 @@ Assistant: I'll update dependencies.
3734
3761
  </example>
3735
3762
 
3736
3763
  <example>
3737
- User: The task update failed due to a conflict.
3738
- Assistant: I'll refetch the task and retry the update.
3739
- *Fetches task, then updates again*
3764
+ User: We've finished adding dependencies and want to finalize the plan.
3765
+ Assistant: I'll set metadata.planFinalized to trigger the global validation.
3766
+ *Updates metadata.planFinalized to "true"*
3740
3767
  </example>
3741
3768
 
3742
3769
  <example>
3743
- User: Clear blockedBy for the second task in a multi-step plan.
3744
- Assistant: I can't clear blockedBy for a non-first task. I'll keep the dependency chain intact.
3745
- *Keeps blockedBy and updates other fields if needed*
3770
+ User: The task update failed due to a conflict.
3771
+ Assistant: I'll refetch the task and retry the update.
3772
+ *Fetches task, then updates again*
3746
3773
  </example>
3747
3774
  `;
3748
3775
 
3749
3776
  // src/tools/interaction/TaskUpdateTool/TaskUpdateTool.tsx
3750
- var shouldEnforceDependencyChain2 = () => {
3751
- const value = process.env.PYB_TASK_DEPENDENCY_ENFORCE?.toLowerCase();
3752
- if (!value) return true;
3753
- return value !== "false" && value !== "0";
3754
- };
3755
3777
  var isCompletedStatus = (status) => status === "done" || status === "archived";
3756
3778
  var normalizeDeps = (items) => [...items ?? []].filter(Boolean).sort();
3779
+ var normalizeBlockedBy = (items) => {
3780
+ if (!items) return void 0;
3781
+ const filtered = items.filter(Boolean);
3782
+ return Array.from(new Set(filtered));
3783
+ };
3757
3784
  var depsChanged = (prev, next) => {
3758
3785
  if (prev.parent !== next.parent) return true;
3759
3786
  const prevBlockedBy = normalizeDeps(prev.blockedBy);
@@ -3776,6 +3803,18 @@ var getDepsSnapshot = (task) => ({
3776
3803
  parent: task.parent,
3777
3804
  related: task.related ?? []
3778
3805
  });
3806
+ var getMissingBlockedBy2 = (blockedBy, ids) => (blockedBy ?? []).filter((id) => !ids.has(id));
3807
+ var isPlanFinalized = (metadata) => metadata?.planFinalized === "true";
3808
+ var compareTaskId = (left, right) => {
3809
+ const leftValue = Number(left.id);
3810
+ const rightValue = Number(right.id);
3811
+ const leftIsNumber = !Number.isNaN(leftValue);
3812
+ const rightIsNumber = !Number.isNaN(rightValue);
3813
+ if (leftIsNumber && rightIsNumber) return leftValue - rightValue;
3814
+ if (leftIsNumber) return -1;
3815
+ if (rightIsNumber) return 1;
3816
+ return left.id.localeCompare(right.id);
3817
+ };
3779
3818
  var inputSchema12 = z12.strictObject({
3780
3819
  listId: z12.string().optional(),
3781
3820
  taskId: z12.string().min(1),
@@ -3824,6 +3863,12 @@ var TaskUpdateTool = {
3824
3863
  renderResultForAssistant(output) {
3825
3864
  return JSON.stringify(output, null, 2);
3826
3865
  },
3866
+ renderToolResultMessage(output) {
3867
+ if ("error" in output || !output.depsChanged) {
3868
+ return null;
3869
+ }
3870
+ return /* @__PURE__ */ React10.createElement(TaskList, { listId: output.listId });
3871
+ },
3827
3872
  renderToolUseMessage() {
3828
3873
  return null;
3829
3874
  },
@@ -3844,6 +3889,7 @@ var TaskUpdateTool = {
3844
3889
  }
3845
3890
  const tasks = listTasks({ listId: input.listId });
3846
3891
  const subject = input.subject ?? existing.subject;
3892
+ const nextBlockedBy = normalizeBlockedBy(input.blockedBy);
3847
3893
  const updatedTask = {
3848
3894
  ...existing,
3849
3895
  subject,
@@ -3854,7 +3900,7 @@ var TaskUpdateTool = {
3854
3900
  assignee: input.assignee ?? existing.assignee,
3855
3901
  metadata: input.metadata ?? existing.metadata,
3856
3902
  archived: input.archived ?? existing.archived,
3857
- blockedBy: input.blockedBy ?? existing.blockedBy,
3903
+ blockedBy: nextBlockedBy ?? existing.blockedBy,
3858
3904
  parent: input.parent ?? existing.parent,
3859
3905
  related: input.related ?? existing.related,
3860
3906
  legacyTodoId: input.legacyTodoId ?? existing.legacyTodoId
@@ -3862,6 +3908,7 @@ var TaskUpdateTool = {
3862
3908
  const candidateTasks = tasks.map(
3863
3909
  (task) => task.id === existing.id ? updatedTask : task
3864
3910
  );
3911
+ const candidateIds = new Set(candidateTasks.map((task) => task.id));
3865
3912
  if (tasks.length > 1 && tasks[0]?.id !== updatedTask.id && (updatedTask.blockedBy?.length ?? 0) === 0) {
3866
3913
  emitReminderEvent("task.dependency_chain_missing", {
3867
3914
  listId,
@@ -3869,14 +3916,17 @@ var TaskUpdateTool = {
3869
3916
  blockedBy: updatedTask.blockedBy ?? [],
3870
3917
  timestamp: Date.now()
3871
3918
  });
3872
- if (shouldEnforceDependencyChain2()) {
3919
+ }
3920
+ if (input.blockedBy) {
3921
+ const missing = getMissingBlockedBy2(updatedTask.blockedBy, candidateIds);
3922
+ if (missing.length > 0) {
3873
3923
  yield {
3874
3924
  type: "result",
3875
3925
  data: createTaskToolError({
3876
3926
  type: "validation",
3877
- code: "TASK_DEPENDENCY_CHAIN_REQUIRED",
3878
- message: "Task dependency chain required for multi-step plans",
3879
- details: { taskId: updatedTask.id, listId }
3927
+ code: "TASK_BLOCKEDBY_NOT_FOUND",
3928
+ message: "BlockedBy tasks must exist in the same list",
3929
+ details: { taskId: updatedTask.id, listId, missingBlockedBy: missing }
3880
3930
  })
3881
3931
  };
3882
3932
  return;
@@ -3895,6 +3945,39 @@ var TaskUpdateTool = {
3895
3945
  };
3896
3946
  return;
3897
3947
  }
3948
+ const nextMetadata = input.metadata ?? existing.metadata;
3949
+ if (isPlanFinalized(nextMetadata) && !isPlanFinalized(existing.metadata)) {
3950
+ const activeTasks = candidateTasks.filter((task) => task.status !== "archived");
3951
+ const ordered = [...activeTasks].sort(compareTaskId);
3952
+ const firstTaskId = ordered[0]?.id;
3953
+ for (const task of activeTasks) {
3954
+ const missing = getMissingBlockedBy2(task.blockedBy, candidateIds);
3955
+ if (missing.length > 0) {
3956
+ yield {
3957
+ type: "result",
3958
+ data: createTaskToolError({
3959
+ type: "validation",
3960
+ code: "TASK_BLOCKEDBY_NOT_FOUND",
3961
+ message: "BlockedBy tasks must exist in the same list",
3962
+ details: { taskId: task.id, listId, missingBlockedBy: missing }
3963
+ })
3964
+ };
3965
+ return;
3966
+ }
3967
+ if (task.id !== firstTaskId && (task.blockedBy?.length ?? 0) === 0) {
3968
+ yield {
3969
+ type: "result",
3970
+ data: createTaskToolError({
3971
+ type: "validation",
3972
+ code: "TASK_DEPENDENCY_FINALIZE_REQUIRED",
3973
+ message: "Task dependency chain required before planFinalized",
3974
+ details: { taskId: task.id, listId }
3975
+ })
3976
+ };
3977
+ return;
3978
+ }
3979
+ }
3980
+ }
3898
3981
  if (input.status && isCompletedStatus(input.status)) {
3899
3982
  const parentId = updatedTask.parent;
3900
3983
  if (parentId) {
@@ -3929,7 +4012,7 @@ var TaskUpdateTool = {
3929
4012
  assignee: input.assignee,
3930
4013
  metadata: input.metadata,
3931
4014
  archived: input.archived,
3932
- blockedBy: input.blockedBy,
4015
+ blockedBy: nextBlockedBy,
3933
4016
  parent: input.parent,
3934
4017
  related: input.related,
3935
4018
  baseVersion,
@@ -3937,6 +4020,7 @@ var TaskUpdateTool = {
3937
4020
  },
3938
4021
  { listId: input.listId, allowMerge: input.allowMerge }
3939
4022
  );
4023
+ const didDepsChange = depsChanged(existing, result.task);
3940
4024
  emitReminderEvent("task.updated", {
3941
4025
  listId,
3942
4026
  taskId: result.task.id,
@@ -3952,7 +4036,7 @@ var TaskUpdateTool = {
3952
4036
  timestamp: Date.now()
3953
4037
  });
3954
4038
  }
3955
- if (depsChanged(existing, result.task)) {
4039
+ if (didDepsChange) {
3956
4040
  emitReminderEvent("task.deps_changed", {
3957
4041
  listId,
3958
4042
  taskId: result.task.id,
@@ -3965,7 +4049,8 @@ var TaskUpdateTool = {
3965
4049
  type: "result",
3966
4050
  data: {
3967
4051
  listId,
3968
- item: toTaskDetail(result.task)
4052
+ item: toTaskDetail(result.task),
4053
+ depsChanged: didDepsChange
3969
4054
  }
3970
4055
  };
3971
4056
  } catch (error) {