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.
- package/dist/REPL-6YEOSMEP.js +47 -0
- package/dist/{acp-FGRNDOS5.js → acp-2C774HUW.js} +31 -31
- package/dist/{agentsValidate-7CRDPNQ6.js → agentsValidate-RCXZBOU3.js} +7 -7
- package/dist/{ask-IR5W5M66.js → ask-EIO3Q6ED.js} +30 -30
- package/dist/{autoUpdater-MAEQZPST.js → autoUpdater-IIJMDPJE.js} +3 -3
- package/dist/{chunk-SHIPHOMT.js → chunk-5RX62PWR.js} +1 -1
- package/dist/{chunk-XHGUMYRL.js → chunk-6MFZG46W.js} +1 -1
- package/dist/{chunk-IQ3KORSP.js → chunk-DCSAQNHW.js} +4 -4
- package/dist/{chunk-YFBIVUDT.js → chunk-ESKTQXW6.js} +27 -3
- package/dist/chunk-ESKTQXW6.js.map +7 -0
- package/dist/{chunk-QW4VX3FW.js → chunk-G2FI43IB.js} +2 -2
- package/dist/{chunk-4Z6CCSED.js → chunk-GLS3ZXCS.js} +3 -3
- package/dist/{chunk-DEQQW4H6.js → chunk-GTP62T63.js} +3 -3
- package/dist/{chunk-UUGWQSET.js → chunk-HJDETBB6.js} +1 -1
- package/dist/{chunk-55QJI7OQ.js → chunk-HY24VLOS.js} +1 -1
- package/dist/{chunk-LZT5LZKG.js → chunk-KDKXQODT.js} +2 -2
- package/dist/{chunk-HFL2SOFQ.js → chunk-KNOCJVE6.js} +1 -1
- package/dist/{chunk-MCP52ZSD.js → chunk-L2FQX7IL.js} +419 -244
- package/dist/chunk-L2FQX7IL.js.map +7 -0
- package/dist/{chunk-6Y4OSP3J.js → chunk-LAFEZLTD.js} +307 -218
- package/dist/chunk-LAFEZLTD.js.map +7 -0
- package/dist/{chunk-EXEPX5H2.js → chunk-LAQQRRQR.js} +4 -4
- package/dist/{chunk-2U747SA5.js → chunk-LEQNJ73H.js} +3 -3
- package/dist/{chunk-NZTVG7YS.js → chunk-MZ6UJROW.js} +4 -4
- package/dist/{chunk-MLCISJKM.js → chunk-N6DXTYLR.js} +3 -3
- package/dist/{chunk-JF4AMPKU.js → chunk-OBFMPMGW.js} +2 -2
- package/dist/{chunk-A7VN6YXZ.js → chunk-OYCMMRZV.js} +1 -1
- package/dist/{chunk-XZNXY65J.js → chunk-PKAVBIO7.js} +1 -1
- package/dist/{chunk-S2AJAM6R.js → chunk-SNKLRBWT.js} +2 -2
- package/dist/{chunk-6GOKZQDV.js → chunk-SQJJRPIY.js} +5 -5
- package/dist/{chunk-72SGZIMD.js → chunk-TMFNSMVV.js} +6 -6
- package/dist/{chunk-D3Q32IUW.js → chunk-U7MPXQO4.js} +3 -3
- package/dist/{chunk-3P2EGWMK.js → chunk-VUILI5ED.js} +2 -2
- package/dist/{chunk-7FNDFUQH.js → chunk-WCKPMAYX.js} +1 -1
- package/dist/{chunk-PSI4PJ2H.js → chunk-WSN5UCPE.js} +1 -1
- package/dist/{chunk-AWML3QPK.js → chunk-YNVGW5VZ.js} +7 -7
- package/dist/{chunk-I5H5PGD5.js → chunk-YTUV273Y.js} +50 -122
- package/dist/{chunk-I5H5PGD5.js.map → chunk-YTUV273Y.js.map} +2 -2
- package/dist/{chunk-GFDV6FUG.js → chunk-ZQAKMVXR.js} +3 -3
- package/dist/{cli-PCLH664O.js → cli-JPS6PPHH.js} +91 -89
- package/dist/{cli-PCLH664O.js.map → cli-JPS6PPHH.js.map} +2 -2
- package/dist/commands-3IJYY2KF.js +51 -0
- package/dist/{config-EBW7GI65.js → config-7RFJBYCF.js} +4 -4
- package/dist/{context-4BILE3LL.js → context-L6IDU4ZF.js} +6 -6
- package/dist/{customCommands-GDDHYRJR.js → customCommands-2ZLDKEPS.js} +4 -4
- package/dist/{env-7V57CD26.js → env-KKHHZ47D.js} +2 -2
- package/dist/{file-3W4M7RXM.js → file-QGJRLWJ7.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-PIRKDSMO.js → llm-HHSKS5JE.js} +31 -31
- package/dist/{llmLazy-HWKMKZ5M.js → llmLazy-YV33JO4W.js} +1 -1
- package/dist/{loader-GYFX3MOO.js → loader-YCEP5CYE.js} +4 -4
- package/dist/{lsp-BDQVEVFK.js → lsp-TG3EZZOU.js} +6 -6
- package/dist/{lspAnchor-S45W3FAI.js → lspAnchor-T3544E7J.js} +6 -6
- package/dist/{mcp-ZHLSRCM5.js → mcp-SWYFI5FF.js} +7 -7
- package/dist/{mentionProcessor-GOS6BB64.js → mentionProcessor-IP6FAEXL.js} +7 -6
- package/dist/{mentionProcessor-GOS6BB64.js.map → mentionProcessor-IP6FAEXL.js.map} +1 -1
- package/dist/{messages-AX4MWPK5.js → messages-3B2ZJJKW.js} +1 -1
- package/dist/{model-QDQAUOQ6.js → model-HDJXCBKD.js} +5 -5
- package/dist/{openai-IBJPYBTX.js → openai-DF2BQT7X.js} +5 -5
- package/dist/{outputStyles-UNAE3KVB.js → outputStyles-GWUBSKDY.js} +4 -4
- package/dist/{pluginRuntime-QP6HTJ6Y.js → pluginRuntime-LKAAMJH2.js} +6 -6
- package/dist/{pluginValidation-C66MGV4E.js → pluginValidation-7GJA32YV.js} +6 -6
- package/dist/prompts-DB772NLS.js +53 -0
- package/dist/{pybAgentSessionLoad-GJQQFHVS.js → pybAgentSessionLoad-BGIX7L4O.js} +4 -4
- package/dist/{pybAgentSessionResume-2ZNOOEVX.js → pybAgentSessionResume-VKK6VZSA.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-PE2K75QJ.js → pybAgentStreamJsonSession-HDXJ4F5W.js} +1 -1
- package/dist/{pybHooks-22R4DOTT.js → pybHooks-LEIAZ7D6.js} +5 -5
- package/dist/query-LVPGQYDL.js +55 -0
- package/dist/{registry-ES4KTNF7.js → registry-C4V5AZ6N.js} +5 -5
- package/dist/{ripgrep-7BPG53S4.js → ripgrep-PWIRRS2Q.js} +3 -3
- package/dist/{skillMarketplace-O5TAM4G6.js → skillMarketplace-GZN6RWUY.js} +3 -3
- package/dist/{state-3OM3WWZ2.js → state-T7WQKFBG.js} +2 -2
- package/dist/{theme-7MFSQQ5Z.js → theme-CLYLDSCI.js} +5 -5
- package/dist/{toolPermissionSettings-KKMWAVTJ.js → toolPermissionSettings-UYHSUTC5.js} +6 -6
- package/dist/tools-SEWCFM5P.js +52 -0
- package/dist/{userInput-3BYMTC52.js → userInput-KZXH5O7V.js} +32 -32
- package/package.json +27 -3
- package/dist/REPL-PRQAXE32.js +0 -47
- package/dist/chunk-6Y4OSP3J.js.map +0 -7
- package/dist/chunk-MCP52ZSD.js.map +0 -7
- package/dist/chunk-YFBIVUDT.js.map +0 -7
- package/dist/commands-Y7GVRV66.js +0 -51
- package/dist/prompts-LNJ2SJQ7.js +0 -53
- package/dist/query-2ZFLZTV6.js +0 -55
- package/dist/tools-ME4EX5CM.js +0 -52
- /package/dist/{REPL-PRQAXE32.js.map → REPL-6YEOSMEP.js.map} +0 -0
- /package/dist/{acp-FGRNDOS5.js.map → acp-2C774HUW.js.map} +0 -0
- /package/dist/{agentsValidate-7CRDPNQ6.js.map → agentsValidate-RCXZBOU3.js.map} +0 -0
- /package/dist/{ask-IR5W5M66.js.map → ask-EIO3Q6ED.js.map} +0 -0
- /package/dist/{autoUpdater-MAEQZPST.js.map → autoUpdater-IIJMDPJE.js.map} +0 -0
- /package/dist/{chunk-SHIPHOMT.js.map → chunk-5RX62PWR.js.map} +0 -0
- /package/dist/{chunk-XHGUMYRL.js.map → chunk-6MFZG46W.js.map} +0 -0
- /package/dist/{chunk-IQ3KORSP.js.map → chunk-DCSAQNHW.js.map} +0 -0
- /package/dist/{chunk-QW4VX3FW.js.map → chunk-G2FI43IB.js.map} +0 -0
- /package/dist/{chunk-4Z6CCSED.js.map → chunk-GLS3ZXCS.js.map} +0 -0
- /package/dist/{chunk-DEQQW4H6.js.map → chunk-GTP62T63.js.map} +0 -0
- /package/dist/{chunk-UUGWQSET.js.map → chunk-HJDETBB6.js.map} +0 -0
- /package/dist/{chunk-55QJI7OQ.js.map → chunk-HY24VLOS.js.map} +0 -0
- /package/dist/{chunk-LZT5LZKG.js.map → chunk-KDKXQODT.js.map} +0 -0
- /package/dist/{chunk-HFL2SOFQ.js.map → chunk-KNOCJVE6.js.map} +0 -0
- /package/dist/{chunk-EXEPX5H2.js.map → chunk-LAQQRRQR.js.map} +0 -0
- /package/dist/{chunk-2U747SA5.js.map → chunk-LEQNJ73H.js.map} +0 -0
- /package/dist/{chunk-NZTVG7YS.js.map → chunk-MZ6UJROW.js.map} +0 -0
- /package/dist/{chunk-MLCISJKM.js.map → chunk-N6DXTYLR.js.map} +0 -0
- /package/dist/{chunk-JF4AMPKU.js.map → chunk-OBFMPMGW.js.map} +0 -0
- /package/dist/{chunk-A7VN6YXZ.js.map → chunk-OYCMMRZV.js.map} +0 -0
- /package/dist/{chunk-XZNXY65J.js.map → chunk-PKAVBIO7.js.map} +0 -0
- /package/dist/{chunk-S2AJAM6R.js.map → chunk-SNKLRBWT.js.map} +0 -0
- /package/dist/{chunk-6GOKZQDV.js.map → chunk-SQJJRPIY.js.map} +0 -0
- /package/dist/{chunk-72SGZIMD.js.map → chunk-TMFNSMVV.js.map} +0 -0
- /package/dist/{chunk-D3Q32IUW.js.map → chunk-U7MPXQO4.js.map} +0 -0
- /package/dist/{chunk-3P2EGWMK.js.map → chunk-VUILI5ED.js.map} +0 -0
- /package/dist/{chunk-7FNDFUQH.js.map → chunk-WCKPMAYX.js.map} +0 -0
- /package/dist/{chunk-PSI4PJ2H.js.map → chunk-WSN5UCPE.js.map} +0 -0
- /package/dist/{chunk-AWML3QPK.js.map → chunk-YNVGW5VZ.js.map} +0 -0
- /package/dist/{chunk-GFDV6FUG.js.map → chunk-ZQAKMVXR.js.map} +0 -0
- /package/dist/{commands-Y7GVRV66.js.map → commands-3IJYY2KF.js.map} +0 -0
- /package/dist/{config-EBW7GI65.js.map → config-7RFJBYCF.js.map} +0 -0
- /package/dist/{context-4BILE3LL.js.map → context-L6IDU4ZF.js.map} +0 -0
- /package/dist/{customCommands-GDDHYRJR.js.map → customCommands-2ZLDKEPS.js.map} +0 -0
- /package/dist/{env-7V57CD26.js.map → env-KKHHZ47D.js.map} +0 -0
- /package/dist/{file-3W4M7RXM.js.map → file-QGJRLWJ7.js.map} +0 -0
- /package/dist/{llm-PIRKDSMO.js.map → llm-HHSKS5JE.js.map} +0 -0
- /package/dist/{llmLazy-HWKMKZ5M.js.map → llmLazy-YV33JO4W.js.map} +0 -0
- /package/dist/{loader-GYFX3MOO.js.map → loader-YCEP5CYE.js.map} +0 -0
- /package/dist/{lsp-BDQVEVFK.js.map → lsp-TG3EZZOU.js.map} +0 -0
- /package/dist/{lspAnchor-S45W3FAI.js.map → lspAnchor-T3544E7J.js.map} +0 -0
- /package/dist/{mcp-ZHLSRCM5.js.map → mcp-SWYFI5FF.js.map} +0 -0
- /package/dist/{messages-AX4MWPK5.js.map → messages-3B2ZJJKW.js.map} +0 -0
- /package/dist/{model-QDQAUOQ6.js.map → model-HDJXCBKD.js.map} +0 -0
- /package/dist/{openai-IBJPYBTX.js.map → openai-DF2BQT7X.js.map} +0 -0
- /package/dist/{outputStyles-UNAE3KVB.js.map → outputStyles-GWUBSKDY.js.map} +0 -0
- /package/dist/{pluginRuntime-QP6HTJ6Y.js.map → pluginRuntime-LKAAMJH2.js.map} +0 -0
- /package/dist/{pluginValidation-C66MGV4E.js.map → pluginValidation-7GJA32YV.js.map} +0 -0
- /package/dist/{prompts-LNJ2SJQ7.js.map → prompts-DB772NLS.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-GJQQFHVS.js.map → pybAgentSessionLoad-BGIX7L4O.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-2ZNOOEVX.js.map → pybAgentSessionResume-VKK6VZSA.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-PE2K75QJ.js.map → pybAgentStreamJsonSession-HDXJ4F5W.js.map} +0 -0
- /package/dist/{pybHooks-22R4DOTT.js.map → pybHooks-LEIAZ7D6.js.map} +0 -0
- /package/dist/{query-2ZFLZTV6.js.map → query-LVPGQYDL.js.map} +0 -0
- /package/dist/{registry-ES4KTNF7.js.map → registry-C4V5AZ6N.js.map} +0 -0
- /package/dist/{ripgrep-7BPG53S4.js.map → ripgrep-PWIRRS2Q.js.map} +0 -0
- /package/dist/{skillMarketplace-O5TAM4G6.js.map → skillMarketplace-GZN6RWUY.js.map} +0 -0
- /package/dist/{state-3OM3WWZ2.js.map → state-T7WQKFBG.js.map} +0 -0
- /package/dist/{theme-7MFSQQ5Z.js.map → theme-CLYLDSCI.js.map} +0 -0
- /package/dist/{toolPermissionSettings-KKMWAVTJ.js.map → toolPermissionSettings-UYHSUTC5.js.map} +0 -0
- /package/dist/{tools-ME4EX5CM.js.map → tools-SEWCFM5P.js.map} +0 -0
- /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-
|
|
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
|
-
);
|
|
2816
|
-
const content2 = lastAssistant2?.message?.content?.filter(
|
|
2817
|
-
(b) => b.type === "text"
|
|
2818
2839
|
);
|
|
2819
|
-
|
|
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,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 =
|
|
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()
|
|
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
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
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
|
|
3263
|
+
import { z as z11 } from "zod";
|
|
3241
3264
|
|
|
3242
3265
|
// src/tools/interaction/TaskGetTool/prompt.ts
|
|
3243
|
-
var DESCRIPTION7 = "
|
|
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 =
|
|
3275
|
-
|
|
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(
|
|
3311
|
-
const task = getTask(input.taskId
|
|
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:
|
|
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
|
|
3357
|
+
import { z as z12 } from "zod";
|
|
3336
3358
|
|
|
3337
3359
|
// src/tools/interaction/TaskListTool/prompt.ts
|
|
3338
|
-
var DESCRIPTION8 = "List tasks in
|
|
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 =
|
|
3386
|
-
|
|
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(
|
|
3431
|
-
const tasks = listTasks(
|
|
3432
|
-
const filtered = filterByStatus(tasks, input.status);
|
|
3433
|
-
const
|
|
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
|
|
3480
|
+
import { z as z13 } from "zod";
|
|
3463
3481
|
|
|
3464
3482
|
// src/tools/interaction/TaskUpdateTool/prompt.ts
|
|
3465
|
-
var DESCRIPTION9 = "
|
|
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
|
|
3537
|
-
|
|
3538
|
-
const
|
|
3539
|
-
|
|
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) =>
|
|
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 =
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3581
|
-
|
|
3582
|
-
|
|
3583
|
-
|
|
3584
|
-
|
|
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(
|
|
3634
|
-
const existing = getTask(input.taskId
|
|
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(
|
|
3693
|
+
const tasks = listTasks();
|
|
3648
3694
|
const subject = input.subject ?? existing.subject;
|
|
3649
|
-
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
|
+
);
|
|
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:
|
|
3656
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
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
|
|
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
|
-
|
|
3678
|
-
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
|
|
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 =
|
|
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 (
|
|
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
|
|
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:
|
|
3768
|
-
|
|
3769
|
-
|
|
3770
|
-
|
|
3771
|
-
|
|
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", {
|