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.
- package/dist/REPL-6YEOSMEP.js +47 -0
- package/dist/{acp-KK2TTZQY.js → acp-2C774HUW.js} +31 -31
- package/dist/{agentsValidate-QLHEEXIH.js → agentsValidate-RCXZBOU3.js} +7 -7
- package/dist/{ask-QPP4RXLN.js → ask-EIO3Q6ED.js} +30 -30
- package/dist/{autoUpdater-4TO2D7ST.js → autoUpdater-IIJMDPJE.js} +3 -3
- package/dist/{chunk-O57TU7BN.js → chunk-5RX62PWR.js} +1 -1
- package/dist/{chunk-QMS564WP.js → chunk-6MFZG46W.js} +1 -1
- package/dist/{chunk-OOKJ3YEP.js → chunk-DCSAQNHW.js} +4 -4
- package/dist/{chunk-7FPCY7TP.js → chunk-ESKTQXW6.js} +27 -3
- package/dist/chunk-ESKTQXW6.js.map +7 -0
- package/dist/{chunk-XPPMTVLO.js → chunk-G2FI43IB.js} +2 -2
- package/dist/{chunk-E3U4MTTG.js → chunk-GLS3ZXCS.js} +3 -3
- package/dist/{chunk-VRJYDMPZ.js → chunk-GTP62T63.js} +3 -3
- package/dist/{chunk-XY7UAZHR.js → chunk-HJDETBB6.js} +1 -1
- package/dist/{chunk-F4YDJQRG.js → chunk-HY24VLOS.js} +1 -1
- package/dist/{chunk-THDYF2NK.js → chunk-KDKXQODT.js} +2 -2
- package/dist/{chunk-XCXUN4XC.js → chunk-KNOCJVE6.js} +1 -1
- package/dist/{chunk-INTHXBZY.js → chunk-L2FQX7IL.js} +419 -244
- package/dist/chunk-L2FQX7IL.js.map +7 -0
- package/dist/{chunk-RW4ITNVB.js → chunk-LAFEZLTD.js} +307 -211
- package/dist/chunk-LAFEZLTD.js.map +7 -0
- package/dist/{chunk-K7HQMRMK.js → chunk-LAQQRRQR.js} +4 -4
- package/dist/{chunk-JS7GLW6B.js → chunk-LEQNJ73H.js} +3 -3
- package/dist/{chunk-5DMG6XJO.js → chunk-MZ6UJROW.js} +4 -4
- package/dist/{chunk-IMUE6ZJT.js → chunk-N6DXTYLR.js} +3 -3
- package/dist/{chunk-6WBYGMWM.js → chunk-OBFMPMGW.js} +2 -2
- package/dist/{chunk-VB7G5DP7.js → chunk-OYCMMRZV.js} +1 -1
- package/dist/{chunk-DY6LXTDU.js → chunk-PKAVBIO7.js} +1 -1
- package/dist/{chunk-AC5SOSXY.js → chunk-SNKLRBWT.js} +2 -2
- package/dist/{chunk-2QE4GPBW.js → chunk-SQJJRPIY.js} +5 -5
- package/dist/{chunk-FN7TY3BC.js → chunk-TMFNSMVV.js} +6 -6
- package/dist/{chunk-EJEYT52K.js → chunk-U7MPXQO4.js} +3 -3
- package/dist/{chunk-7NJIEGSZ.js → chunk-VUILI5ED.js} +2 -2
- package/dist/{chunk-XLBYKCIE.js → chunk-WCKPMAYX.js} +1 -1
- package/dist/{chunk-SKHJKLQU.js → chunk-WSN5UCPE.js} +1 -1
- package/dist/{chunk-AB22WTOW.js → chunk-YNVGW5VZ.js} +7 -7
- package/dist/{chunk-6JSMWPVG.js → chunk-YTUV273Y.js} +50 -122
- package/dist/{chunk-6JSMWPVG.js.map → chunk-YTUV273Y.js.map} +2 -2
- package/dist/{chunk-S4ZD6CIB.js → chunk-ZQAKMVXR.js} +3 -3
- package/dist/{cli-Q6CUQXUW.js → cli-JPS6PPHH.js} +91 -89
- package/dist/{cli-Q6CUQXUW.js.map → cli-JPS6PPHH.js.map} +2 -2
- package/dist/commands-3IJYY2KF.js +51 -0
- package/dist/{config-VXOZS327.js → config-7RFJBYCF.js} +4 -4
- package/dist/{context-45BMQQBI.js → context-L6IDU4ZF.js} +6 -6
- package/dist/{customCommands-YJKDWVLN.js → customCommands-2ZLDKEPS.js} +4 -4
- package/dist/{env-6I7ZEE2U.js → env-KKHHZ47D.js} +2 -2
- package/dist/{file-E5DNNSWV.js → file-QGJRLWJ7.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-XKWTYXNE.js → llm-HHSKS5JE.js} +31 -31
- package/dist/{llmLazy-VHV6V3FH.js → llmLazy-YV33JO4W.js} +1 -1
- package/dist/{loader-L7DYSPCI.js → loader-YCEP5CYE.js} +4 -4
- package/dist/{lsp-AQZ4MHRE.js → lsp-TG3EZZOU.js} +6 -6
- package/dist/{lspAnchor-VVWRVWR6.js → lspAnchor-T3544E7J.js} +6 -6
- package/dist/{mcp-R47AVTKX.js → mcp-SWYFI5FF.js} +7 -7
- package/dist/{mentionProcessor-AAB567RH.js → mentionProcessor-IP6FAEXL.js} +7 -6
- package/dist/{mentionProcessor-AAB567RH.js.map → mentionProcessor-IP6FAEXL.js.map} +1 -1
- package/dist/{messages-6RZPVGYV.js → messages-3B2ZJJKW.js} +1 -1
- package/dist/{model-XS54COOK.js → model-HDJXCBKD.js} +5 -5
- package/dist/{openai-36NGQ6WH.js → openai-DF2BQT7X.js} +5 -5
- package/dist/{outputStyles-4Q6RXLFD.js → outputStyles-GWUBSKDY.js} +4 -4
- package/dist/{pluginRuntime-X6X2WUUY.js → pluginRuntime-LKAAMJH2.js} +6 -6
- package/dist/{pluginValidation-L7QBW3EG.js → pluginValidation-7GJA32YV.js} +6 -6
- package/dist/prompts-DB772NLS.js +53 -0
- package/dist/{pybAgentSessionLoad-OQZ4472Q.js → pybAgentSessionLoad-BGIX7L4O.js} +4 -4
- package/dist/{pybAgentSessionResume-F5USKNP6.js → pybAgentSessionResume-VKK6VZSA.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-3STGT5U7.js → pybAgentStreamJsonSession-HDXJ4F5W.js} +1 -1
- package/dist/{pybHooks-ZRWKBZYR.js → pybHooks-LEIAZ7D6.js} +5 -5
- package/dist/query-LVPGQYDL.js +55 -0
- package/dist/{registry-KLVCZCUO.js → registry-C4V5AZ6N.js} +5 -5
- package/dist/{ripgrep-MYJ7I7AT.js → ripgrep-PWIRRS2Q.js} +3 -3
- package/dist/{skillMarketplace-RUUAPJSB.js → skillMarketplace-GZN6RWUY.js} +3 -3
- package/dist/{state-XDFG3NGH.js → state-T7WQKFBG.js} +2 -2
- package/dist/{theme-6NH5WLGE.js → theme-CLYLDSCI.js} +5 -5
- package/dist/{toolPermissionSettings-6YFH2NEA.js → toolPermissionSettings-UYHSUTC5.js} +6 -6
- package/dist/tools-SEWCFM5P.js +52 -0
- package/dist/{userInput-XNKXJX2C.js → userInput-KZXH5O7V.js} +32 -32
- package/package.json +27 -3
- package/dist/REPL-VW5R4TZU.js +0 -47
- package/dist/chunk-7FPCY7TP.js.map +0 -7
- package/dist/chunk-INTHXBZY.js.map +0 -7
- package/dist/chunk-RW4ITNVB.js.map +0 -7
- package/dist/commands-FSZDEWK7.js +0 -51
- package/dist/prompts-FVZABM4B.js +0 -53
- package/dist/query-W3ZWVYMU.js +0 -55
- package/dist/tools-T6FWIKGI.js +0 -52
- /package/dist/{REPL-VW5R4TZU.js.map → REPL-6YEOSMEP.js.map} +0 -0
- /package/dist/{acp-KK2TTZQY.js.map → acp-2C774HUW.js.map} +0 -0
- /package/dist/{agentsValidate-QLHEEXIH.js.map → agentsValidate-RCXZBOU3.js.map} +0 -0
- /package/dist/{ask-QPP4RXLN.js.map → ask-EIO3Q6ED.js.map} +0 -0
- /package/dist/{autoUpdater-4TO2D7ST.js.map → autoUpdater-IIJMDPJE.js.map} +0 -0
- /package/dist/{chunk-O57TU7BN.js.map → chunk-5RX62PWR.js.map} +0 -0
- /package/dist/{chunk-QMS564WP.js.map → chunk-6MFZG46W.js.map} +0 -0
- /package/dist/{chunk-OOKJ3YEP.js.map → chunk-DCSAQNHW.js.map} +0 -0
- /package/dist/{chunk-XPPMTVLO.js.map → chunk-G2FI43IB.js.map} +0 -0
- /package/dist/{chunk-E3U4MTTG.js.map → chunk-GLS3ZXCS.js.map} +0 -0
- /package/dist/{chunk-VRJYDMPZ.js.map → chunk-GTP62T63.js.map} +0 -0
- /package/dist/{chunk-XY7UAZHR.js.map → chunk-HJDETBB6.js.map} +0 -0
- /package/dist/{chunk-F4YDJQRG.js.map → chunk-HY24VLOS.js.map} +0 -0
- /package/dist/{chunk-THDYF2NK.js.map → chunk-KDKXQODT.js.map} +0 -0
- /package/dist/{chunk-XCXUN4XC.js.map → chunk-KNOCJVE6.js.map} +0 -0
- /package/dist/{chunk-K7HQMRMK.js.map → chunk-LAQQRRQR.js.map} +0 -0
- /package/dist/{chunk-JS7GLW6B.js.map → chunk-LEQNJ73H.js.map} +0 -0
- /package/dist/{chunk-5DMG6XJO.js.map → chunk-MZ6UJROW.js.map} +0 -0
- /package/dist/{chunk-IMUE6ZJT.js.map → chunk-N6DXTYLR.js.map} +0 -0
- /package/dist/{chunk-6WBYGMWM.js.map → chunk-OBFMPMGW.js.map} +0 -0
- /package/dist/{chunk-VB7G5DP7.js.map → chunk-OYCMMRZV.js.map} +0 -0
- /package/dist/{chunk-DY6LXTDU.js.map → chunk-PKAVBIO7.js.map} +0 -0
- /package/dist/{chunk-AC5SOSXY.js.map → chunk-SNKLRBWT.js.map} +0 -0
- /package/dist/{chunk-2QE4GPBW.js.map → chunk-SQJJRPIY.js.map} +0 -0
- /package/dist/{chunk-FN7TY3BC.js.map → chunk-TMFNSMVV.js.map} +0 -0
- /package/dist/{chunk-EJEYT52K.js.map → chunk-U7MPXQO4.js.map} +0 -0
- /package/dist/{chunk-7NJIEGSZ.js.map → chunk-VUILI5ED.js.map} +0 -0
- /package/dist/{chunk-XLBYKCIE.js.map → chunk-WCKPMAYX.js.map} +0 -0
- /package/dist/{chunk-SKHJKLQU.js.map → chunk-WSN5UCPE.js.map} +0 -0
- /package/dist/{chunk-AB22WTOW.js.map → chunk-YNVGW5VZ.js.map} +0 -0
- /package/dist/{chunk-S4ZD6CIB.js.map → chunk-ZQAKMVXR.js.map} +0 -0
- /package/dist/{commands-FSZDEWK7.js.map → commands-3IJYY2KF.js.map} +0 -0
- /package/dist/{config-VXOZS327.js.map → config-7RFJBYCF.js.map} +0 -0
- /package/dist/{context-45BMQQBI.js.map → context-L6IDU4ZF.js.map} +0 -0
- /package/dist/{customCommands-YJKDWVLN.js.map → customCommands-2ZLDKEPS.js.map} +0 -0
- /package/dist/{env-6I7ZEE2U.js.map → env-KKHHZ47D.js.map} +0 -0
- /package/dist/{file-E5DNNSWV.js.map → file-QGJRLWJ7.js.map} +0 -0
- /package/dist/{llm-XKWTYXNE.js.map → llm-HHSKS5JE.js.map} +0 -0
- /package/dist/{llmLazy-VHV6V3FH.js.map → llmLazy-YV33JO4W.js.map} +0 -0
- /package/dist/{loader-L7DYSPCI.js.map → loader-YCEP5CYE.js.map} +0 -0
- /package/dist/{lsp-AQZ4MHRE.js.map → lsp-TG3EZZOU.js.map} +0 -0
- /package/dist/{lspAnchor-VVWRVWR6.js.map → lspAnchor-T3544E7J.js.map} +0 -0
- /package/dist/{mcp-R47AVTKX.js.map → mcp-SWYFI5FF.js.map} +0 -0
- /package/dist/{messages-6RZPVGYV.js.map → messages-3B2ZJJKW.js.map} +0 -0
- /package/dist/{model-XS54COOK.js.map → model-HDJXCBKD.js.map} +0 -0
- /package/dist/{openai-36NGQ6WH.js.map → openai-DF2BQT7X.js.map} +0 -0
- /package/dist/{outputStyles-4Q6RXLFD.js.map → outputStyles-GWUBSKDY.js.map} +0 -0
- /package/dist/{pluginRuntime-X6X2WUUY.js.map → pluginRuntime-LKAAMJH2.js.map} +0 -0
- /package/dist/{pluginValidation-L7QBW3EG.js.map → pluginValidation-7GJA32YV.js.map} +0 -0
- /package/dist/{prompts-FVZABM4B.js.map → prompts-DB772NLS.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-OQZ4472Q.js.map → pybAgentSessionLoad-BGIX7L4O.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-F5USKNP6.js.map → pybAgentSessionResume-VKK6VZSA.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-3STGT5U7.js.map → pybAgentStreamJsonSession-HDXJ4F5W.js.map} +0 -0
- /package/dist/{pybHooks-ZRWKBZYR.js.map → pybHooks-LEIAZ7D6.js.map} +0 -0
- /package/dist/{query-W3ZWVYMU.js.map → query-LVPGQYDL.js.map} +0 -0
- /package/dist/{registry-KLVCZCUO.js.map → registry-C4V5AZ6N.js.map} +0 -0
- /package/dist/{ripgrep-MYJ7I7AT.js.map → ripgrep-PWIRRS2Q.js.map} +0 -0
- /package/dist/{skillMarketplace-RUUAPJSB.js.map → skillMarketplace-GZN6RWUY.js.map} +0 -0
- /package/dist/{state-XDFG3NGH.js.map → state-T7WQKFBG.js.map} +0 -0
- /package/dist/{theme-6NH5WLGE.js.map → theme-CLYLDSCI.js.map} +0 -0
- /package/dist/{toolPermissionSettings-6YFH2NEA.js.map → toolPermissionSettings-UYHSUTC5.js.map} +0 -0
- /package/dist/{tools-T6FWIKGI.js.map → tools-SEWCFM5P.js.map} +0 -0
- /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-
|
|
31
|
+
} from "./chunk-YTUV273Y.js";
|
|
33
32
|
import {
|
|
34
33
|
queryLLM
|
|
35
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-LAQQRRQR.js";
|
|
36
35
|
import {
|
|
37
36
|
FallbackToolUseRejectedMessage,
|
|
38
37
|
MCPTool,
|
|
39
38
|
getClients,
|
|
40
39
|
getMCPTools
|
|
41
|
-
} from "./chunk-
|
|
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-
|
|
53
|
+
} from "./chunk-L2FQX7IL.js";
|
|
52
54
|
import {
|
|
53
55
|
getActiveAgents,
|
|
54
56
|
getAgentByType,
|
|
55
57
|
getAvailableAgentTypes
|
|
56
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-KDKXQODT.js";
|
|
57
59
|
import {
|
|
58
60
|
INTERRUPT_MESSAGE,
|
|
59
61
|
createAssistantMessage,
|
|
60
62
|
createUserMessage,
|
|
61
63
|
getLastAssistantMessageId
|
|
62
|
-
} from "./chunk-
|
|
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-
|
|
71
|
+
} from "./chunk-G2FI43IB.js";
|
|
70
72
|
import {
|
|
71
73
|
LspFacade,
|
|
72
74
|
formatDiagnosticsPretty
|
|
73
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-DCSAQNHW.js";
|
|
74
76
|
import {
|
|
75
77
|
getModelManager
|
|
76
|
-
} from "./chunk-
|
|
78
|
+
} from "./chunk-ZQAKMVXR.js";
|
|
77
79
|
import {
|
|
78
80
|
getContext
|
|
79
|
-
} from "./chunk-
|
|
81
|
+
} from "./chunk-MZ6UJROW.js";
|
|
80
82
|
import {
|
|
81
83
|
filesToTree,
|
|
82
84
|
ripGrepWithStatus
|
|
83
|
-
} from "./chunk-
|
|
85
|
+
} from "./chunk-PKAVBIO7.js";
|
|
84
86
|
import {
|
|
85
87
|
getTheme
|
|
86
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-HY24VLOS.js";
|
|
87
89
|
import {
|
|
88
90
|
debug
|
|
89
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
2791
|
-
|
|
2792
|
-
|
|
2793
|
-
|
|
2794
|
-
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
|
|
2804
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
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
|
|
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 = "
|
|
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
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
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
|
-
|
|
3102
|
+
|
|
3057
3103
|
Skip using this tool when:
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
|
|
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 =
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
|
|
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
|
-
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
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
|
|
3263
|
+
import { z as z11 } from "zod";
|
|
3234
3264
|
|
|
3235
3265
|
// src/tools/interaction/TaskGetTool/prompt.ts
|
|
3236
|
-
var DESCRIPTION7 = "
|
|
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 =
|
|
3268
|
-
|
|
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(
|
|
3304
|
-
const task = getTask(input.taskId
|
|
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:
|
|
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
|
|
3357
|
+
import { z as z12 } from "zod";
|
|
3329
3358
|
|
|
3330
3359
|
// src/tools/interaction/TaskListTool/prompt.ts
|
|
3331
|
-
var DESCRIPTION8 = "List tasks in
|
|
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 =
|
|
3379
|
-
|
|
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(
|
|
3424
|
-
const tasks = listTasks(
|
|
3425
|
-
const filtered = filterByStatus(tasks, input.status);
|
|
3426
|
-
const
|
|
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
|
|
3480
|
+
import { z as z13 } from "zod";
|
|
3456
3481
|
|
|
3457
3482
|
// src/tools/interaction/TaskUpdateTool/prompt.ts
|
|
3458
|
-
var DESCRIPTION9 = "
|
|
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
|
|
3530
|
-
|
|
3531
|
-
const
|
|
3532
|
-
|
|
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) =>
|
|
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 =
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
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(
|
|
3627
|
-
const existing = getTask(input.taskId
|
|
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(
|
|
3693
|
+
const tasks = listTasks();
|
|
3641
3694
|
const subject = input.subject ?? existing.subject;
|
|
3642
|
-
const
|
|
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:
|
|
3649
|
-
|
|
3650
|
-
|
|
3651
|
-
|
|
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
|
|
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
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
|
|
3677
|
-
|
|
3678
|
-
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
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 =
|
|
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 (
|
|
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
|
|
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:
|
|
3761
|
-
|
|
3762
|
-
|
|
3763
|
-
|
|
3764
|
-
|
|
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", {
|