pybao-cli 1.4.82 → 1.4.84
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-YDQJ4XS3.js +49 -0
- package/dist/{acp-ASRH57AF.js → acp-KR2NIRMP.js} +30 -30
- package/dist/{agentsValidate-35AHZXNB.js → agentsValidate-RP4UMGNT.js} +7 -7
- package/dist/{ask-TI3ITWN7.js → ask-AV47M7DZ.js} +29 -29
- package/dist/{autoUpdater-MRK5BD2L.js → autoUpdater-KY6NLGJN.js} +3 -3
- package/dist/{chunk-DYJD66YF.js → chunk-2OQK4SGM.js} +1 -1
- package/dist/{chunk-DZTZPEPA.js → chunk-2Y6RSLIK.js} +2 -2
- package/dist/{chunk-UXVOYFKL.js → chunk-3JI37ZA6.js} +2 -2
- package/dist/{chunk-UBX7JQR2.js → chunk-4K65XDFQ.js} +2 -2
- package/dist/{chunk-AUGXOUTX.js → chunk-4T65Y47N.js} +1 -1
- package/dist/{chunk-KNWW4HGV.js → chunk-5EJDTTBL.js} +2 -2
- package/dist/{chunk-HJWUPFGF.js → chunk-5LRFEGFP.js} +4 -4
- package/dist/{chunk-Y5JPSTQ4.js → chunk-5Z5ZS7IB.js} +1 -1
- package/dist/{chunk-QUWUFGZF.js → chunk-6IXLNIBX.js} +4 -4
- package/dist/{chunk-LM665HND.js → chunk-APXMGUKA.js} +1 -1
- package/dist/{chunk-U265OPSO.js → chunk-BKU7DKGB.js} +1 -1
- package/dist/{chunk-2YM35XWE.js → chunk-CAPAA2BC.js} +3 -3
- package/dist/{chunk-PXPTGNYH.js → chunk-HS5IAPED.js} +2 -2
- package/dist/{chunk-JT3RE7UH.js → chunk-KELCOTIO.js} +2 -2
- package/dist/{chunk-IIVG2SHE.js → chunk-KXHMHPXD.js} +3 -3
- package/dist/{chunk-WBBMOYXK.js → chunk-LLNPRFDC.js} +3 -1
- package/dist/chunk-LLNPRFDC.js.map +7 -0
- package/dist/{chunk-AYVB6VUF.js → chunk-NIIT2UQA.js} +1 -1
- package/dist/{chunk-2WIUQUTU.js → chunk-QTPKDLLB.js} +3 -3
- package/dist/{chunk-SZEYDC6A.js → chunk-QUQAVKTY.js} +3 -3
- package/dist/{chunk-GUTLXPN6.js → chunk-RIKQVWEQ.js} +2 -2
- package/dist/{chunk-TWWQYBVK.js → chunk-RTLO6X7T.js} +3 -3
- package/dist/{chunk-GZT2DWED.js → chunk-SELNEWOV.js} +1 -1
- package/dist/{chunk-WVYIFMLG.js → chunk-SRT3X6FV.js} +4 -4
- package/dist/{chunk-VMWEFYQB.js → chunk-TTMZXWQN.js} +1 -1
- package/dist/{chunk-2AG4BTRV.js → chunk-UKCYPF74.js} +1 -1
- package/dist/{chunk-2S2V2ZI7.js → chunk-UTQQ6WYY.js} +16 -16
- package/dist/{chunk-ZW25QNXS.js → chunk-UZE4M5OS.js} +3 -3
- package/dist/{chunk-JQVZNIKI.js → chunk-X2MOC5KR.js} +4 -4
- package/dist/{chunk-NTL5PKCX.js → chunk-X36JZMFM.js} +3 -3
- package/dist/{chunk-GSAG6WNQ.js → chunk-ZPTG6OYN.js} +1 -1
- package/dist/{chunk-XOOHCC63.js → chunk-ZTGVZNCE.js} +1291 -158
- package/dist/{chunk-XOOHCC63.js.map → chunk-ZTGVZNCE.js.map} +4 -4
- package/dist/{cli-ECB4WYUZ.js → cli-FHJDO3QF.js} +89 -89
- package/dist/commands-KPY2LIJC.js +53 -0
- package/dist/{config-KZHPV37P.js → config-2K52USGJ.js} +4 -4
- package/dist/{context-ZZI53BPM.js → context-3BRWJN5E.js} +6 -6
- package/dist/{conversationTracker-SC6NCQHL.js → conversationTracker-QH5XBLEU.js} +3 -3
- package/dist/{customCommands-MX6OENKO.js → customCommands-3PVMTJKU.js} +4 -4
- package/dist/{env-76WAAGI6.js → env-O6FTKEEB.js} +2 -2
- package/dist/{file-LCS77XWE.js → file-ULFXIDDG.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-AR66BS2U.js → llm-WAAV3MBX.js} +270 -180
- package/dist/llm-WAAV3MBX.js.map +7 -0
- package/dist/{llmLazy-5W6E5BCB.js → llmLazy-6V6GNLLC.js} +1 -1
- package/dist/{loader-OWZ3WD2X.js → loader-JF4VIAR6.js} +4 -4
- package/dist/{lsp-NLPSJYH4.js → lsp-SANMXODH.js} +6 -6
- package/dist/{lspAnchor-MWASWGQD.js → lspAnchor-A3P4LT3X.js} +6 -6
- package/dist/{mcp-T2UB74Y2.js → mcp-U2WNWDDG.js} +7 -7
- package/dist/{mentionProcessor-KIBWOHEC.js → mentionProcessor-XZUAAVZX.js} +5 -5
- package/dist/{messages-6BHCXDWR.js → messages-JUZVZDYN.js} +1 -1
- package/dist/{model-5NDSZPIL.js → model-JCGDL77F.js} +5 -5
- package/dist/{openai-7XPWH2G7.js → openai-7OC7CIDJ.js} +5 -5
- package/dist/{outputStyles-QUE4ALJQ.js → outputStyles-RWFKRQCE.js} +4 -4
- package/dist/{pluginRuntime-PQ3VZRX7.js → pluginRuntime-BZ3RM5P7.js} +6 -6
- package/dist/{pluginValidation-RQ34XQY3.js → pluginValidation-6DUVMEIK.js} +6 -6
- package/dist/prompts-W5GKJOV4.js +55 -0
- package/dist/{pybAgentSessionLoad-5MWAY2A4.js → pybAgentSessionLoad-ELD4U4GW.js} +4 -4
- package/dist/{pybAgentSessionResume-NZGSUGGS.js → pybAgentSessionResume-B7MQTZPJ.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-UP4WOINX.js → pybAgentStreamJsonSession-R5S6OEAV.js} +1 -1
- package/dist/{pybHooks-HILU7ZB4.js → pybHooks-4Y5UPP2F.js} +4 -4
- package/dist/query-ZA2CGHOR.js +57 -0
- package/dist/{registry-4MWYBUFA.js → registry-TQILT7AJ.js} +5 -5
- package/dist/{ripgrep-J74GL455.js → ripgrep-B6OHNO36.js} +3 -3
- package/dist/{skillMarketplace-ATLDIEEX.js → skillMarketplace-M7LOJ7WU.js} +3 -3
- package/dist/{state-Y2Q4MPY5.js → state-YJAFADHA.js} +2 -2
- package/dist/{theme-3L66ZU5Z.js → theme-W6D4H7FU.js} +5 -5
- package/dist/{toolPermissionSettings-PDGMFGN2.js → toolPermissionSettings-IDD5Z57F.js} +6 -6
- package/dist/tools-BPMG4PXB.js +54 -0
- package/dist/{userInput-GBXOUS4W.js → userInput-PZGDYW45.js} +31 -31
- package/package.json +3 -1
- package/dist/REPL-VOJCD6X6.js +0 -49
- package/dist/chunk-WBBMOYXK.js.map +0 -7
- package/dist/commands-3B77L2SI.js +0 -53
- package/dist/llm-AR66BS2U.js.map +0 -7
- package/dist/prompts-5576MRUX.js +0 -55
- package/dist/query-LMPE4HBF.js +0 -57
- package/dist/tools-45UHHM5S.js +0 -54
- /package/dist/{REPL-VOJCD6X6.js.map → REPL-YDQJ4XS3.js.map} +0 -0
- /package/dist/{acp-ASRH57AF.js.map → acp-KR2NIRMP.js.map} +0 -0
- /package/dist/{agentsValidate-35AHZXNB.js.map → agentsValidate-RP4UMGNT.js.map} +0 -0
- /package/dist/{ask-TI3ITWN7.js.map → ask-AV47M7DZ.js.map} +0 -0
- /package/dist/{autoUpdater-MRK5BD2L.js.map → autoUpdater-KY6NLGJN.js.map} +0 -0
- /package/dist/{chunk-DYJD66YF.js.map → chunk-2OQK4SGM.js.map} +0 -0
- /package/dist/{chunk-DZTZPEPA.js.map → chunk-2Y6RSLIK.js.map} +0 -0
- /package/dist/{chunk-UXVOYFKL.js.map → chunk-3JI37ZA6.js.map} +0 -0
- /package/dist/{chunk-UBX7JQR2.js.map → chunk-4K65XDFQ.js.map} +0 -0
- /package/dist/{chunk-AUGXOUTX.js.map → chunk-4T65Y47N.js.map} +0 -0
- /package/dist/{chunk-KNWW4HGV.js.map → chunk-5EJDTTBL.js.map} +0 -0
- /package/dist/{chunk-HJWUPFGF.js.map → chunk-5LRFEGFP.js.map} +0 -0
- /package/dist/{chunk-Y5JPSTQ4.js.map → chunk-5Z5ZS7IB.js.map} +0 -0
- /package/dist/{chunk-QUWUFGZF.js.map → chunk-6IXLNIBX.js.map} +0 -0
- /package/dist/{chunk-LM665HND.js.map → chunk-APXMGUKA.js.map} +0 -0
- /package/dist/{chunk-U265OPSO.js.map → chunk-BKU7DKGB.js.map} +0 -0
- /package/dist/{chunk-2YM35XWE.js.map → chunk-CAPAA2BC.js.map} +0 -0
- /package/dist/{chunk-PXPTGNYH.js.map → chunk-HS5IAPED.js.map} +0 -0
- /package/dist/{chunk-JT3RE7UH.js.map → chunk-KELCOTIO.js.map} +0 -0
- /package/dist/{chunk-IIVG2SHE.js.map → chunk-KXHMHPXD.js.map} +0 -0
- /package/dist/{chunk-AYVB6VUF.js.map → chunk-NIIT2UQA.js.map} +0 -0
- /package/dist/{chunk-2WIUQUTU.js.map → chunk-QTPKDLLB.js.map} +0 -0
- /package/dist/{chunk-SZEYDC6A.js.map → chunk-QUQAVKTY.js.map} +0 -0
- /package/dist/{chunk-GUTLXPN6.js.map → chunk-RIKQVWEQ.js.map} +0 -0
- /package/dist/{chunk-TWWQYBVK.js.map → chunk-RTLO6X7T.js.map} +0 -0
- /package/dist/{chunk-GZT2DWED.js.map → chunk-SELNEWOV.js.map} +0 -0
- /package/dist/{chunk-WVYIFMLG.js.map → chunk-SRT3X6FV.js.map} +0 -0
- /package/dist/{chunk-VMWEFYQB.js.map → chunk-TTMZXWQN.js.map} +0 -0
- /package/dist/{chunk-2AG4BTRV.js.map → chunk-UKCYPF74.js.map} +0 -0
- /package/dist/{chunk-2S2V2ZI7.js.map → chunk-UTQQ6WYY.js.map} +0 -0
- /package/dist/{chunk-ZW25QNXS.js.map → chunk-UZE4M5OS.js.map} +0 -0
- /package/dist/{chunk-JQVZNIKI.js.map → chunk-X2MOC5KR.js.map} +0 -0
- /package/dist/{chunk-NTL5PKCX.js.map → chunk-X36JZMFM.js.map} +0 -0
- /package/dist/{chunk-GSAG6WNQ.js.map → chunk-ZPTG6OYN.js.map} +0 -0
- /package/dist/{cli-ECB4WYUZ.js.map → cli-FHJDO3QF.js.map} +0 -0
- /package/dist/{commands-3B77L2SI.js.map → commands-KPY2LIJC.js.map} +0 -0
- /package/dist/{config-KZHPV37P.js.map → config-2K52USGJ.js.map} +0 -0
- /package/dist/{context-ZZI53BPM.js.map → context-3BRWJN5E.js.map} +0 -0
- /package/dist/{conversationTracker-SC6NCQHL.js.map → conversationTracker-QH5XBLEU.js.map} +0 -0
- /package/dist/{customCommands-MX6OENKO.js.map → customCommands-3PVMTJKU.js.map} +0 -0
- /package/dist/{env-76WAAGI6.js.map → env-O6FTKEEB.js.map} +0 -0
- /package/dist/{file-LCS77XWE.js.map → file-ULFXIDDG.js.map} +0 -0
- /package/dist/{llmLazy-5W6E5BCB.js.map → llmLazy-6V6GNLLC.js.map} +0 -0
- /package/dist/{loader-OWZ3WD2X.js.map → loader-JF4VIAR6.js.map} +0 -0
- /package/dist/{lsp-NLPSJYH4.js.map → lsp-SANMXODH.js.map} +0 -0
- /package/dist/{lspAnchor-MWASWGQD.js.map → lspAnchor-A3P4LT3X.js.map} +0 -0
- /package/dist/{mcp-T2UB74Y2.js.map → mcp-U2WNWDDG.js.map} +0 -0
- /package/dist/{mentionProcessor-KIBWOHEC.js.map → mentionProcessor-XZUAAVZX.js.map} +0 -0
- /package/dist/{messages-6BHCXDWR.js.map → messages-JUZVZDYN.js.map} +0 -0
- /package/dist/{model-5NDSZPIL.js.map → model-JCGDL77F.js.map} +0 -0
- /package/dist/{openai-7XPWH2G7.js.map → openai-7OC7CIDJ.js.map} +0 -0
- /package/dist/{outputStyles-QUE4ALJQ.js.map → outputStyles-RWFKRQCE.js.map} +0 -0
- /package/dist/{pluginRuntime-PQ3VZRX7.js.map → pluginRuntime-BZ3RM5P7.js.map} +0 -0
- /package/dist/{pluginValidation-RQ34XQY3.js.map → pluginValidation-6DUVMEIK.js.map} +0 -0
- /package/dist/{prompts-5576MRUX.js.map → prompts-W5GKJOV4.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-5MWAY2A4.js.map → pybAgentSessionLoad-ELD4U4GW.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-NZGSUGGS.js.map → pybAgentSessionResume-B7MQTZPJ.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-UP4WOINX.js.map → pybAgentStreamJsonSession-R5S6OEAV.js.map} +0 -0
- /package/dist/{pybHooks-HILU7ZB4.js.map → pybHooks-4Y5UPP2F.js.map} +0 -0
- /package/dist/{query-LMPE4HBF.js.map → query-ZA2CGHOR.js.map} +0 -0
- /package/dist/{registry-4MWYBUFA.js.map → registry-TQILT7AJ.js.map} +0 -0
- /package/dist/{ripgrep-J74GL455.js.map → ripgrep-B6OHNO36.js.map} +0 -0
- /package/dist/{skillMarketplace-ATLDIEEX.js.map → skillMarketplace-M7LOJ7WU.js.map} +0 -0
- /package/dist/{state-Y2Q4MPY5.js.map → state-YJAFADHA.js.map} +0 -0
- /package/dist/{theme-3L66ZU5Z.js.map → theme-W6D4H7FU.js.map} +0 -0
- /package/dist/{toolPermissionSettings-PDGMFGN2.js.map → toolPermissionSettings-IDD5Z57F.js.map} +0 -0
- /package/dist/{tools-45UHHM5S.js.map → tools-BPMG4PXB.js.map} +0 -0
- /package/dist/{userInput-GBXOUS4W.js.map → userInput-PZGDYW45.js.map} +0 -0
|
@@ -2,11 +2,11 @@ import { createRequire as __pybCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __pybCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
listPybAgentSessions
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-SELNEWOV.js";
|
|
6
6
|
import {
|
|
7
7
|
formatValidationResult,
|
|
8
8
|
validatePluginOrMarketplacePath
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-UZE4M5OS.js";
|
|
10
10
|
import {
|
|
11
11
|
ConversationTracker,
|
|
12
12
|
appendFinishState,
|
|
@@ -14,18 +14,18 @@ import {
|
|
|
14
14
|
getConversationTrackerForContext,
|
|
15
15
|
isFinishComplete,
|
|
16
16
|
mapFinishReason
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-APXMGUKA.js";
|
|
18
18
|
import {
|
|
19
19
|
beginReplSessionScope
|
|
20
20
|
} from "./chunk-F4AXICO7.js";
|
|
21
21
|
import {
|
|
22
22
|
loadPybAgentSessionMessages
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-NIIT2UQA.js";
|
|
24
24
|
import {
|
|
25
25
|
appendSessionCustomTitleRecord,
|
|
26
26
|
appendSessionJsonlFromMessage,
|
|
27
27
|
appendSessionTagRecord
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-4K65XDFQ.js";
|
|
29
29
|
import {
|
|
30
30
|
drainHookSystemPromptAdditions,
|
|
31
31
|
getHookTranscriptPath,
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
runStopHooks,
|
|
38
38
|
runUserPromptSubmitHooks,
|
|
39
39
|
updateHookTranscriptForMessages
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-KXHMHPXD.js";
|
|
41
41
|
import {
|
|
42
42
|
DEFAULT_OUTPUT_STYLE,
|
|
43
43
|
getAvailableOutputStyles,
|
|
@@ -46,11 +46,11 @@ import {
|
|
|
46
46
|
getOutputStyleSystemPromptAdditions,
|
|
47
47
|
resolveOutputStyleName,
|
|
48
48
|
setCurrentOutputStyle
|
|
49
|
-
} from "./chunk-
|
|
49
|
+
} from "./chunk-3JI37ZA6.js";
|
|
50
50
|
import {
|
|
51
51
|
fetchCustomModels,
|
|
52
52
|
getModelFeatures
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-KELCOTIO.js";
|
|
54
54
|
import {
|
|
55
55
|
getSessionState
|
|
56
56
|
} from "./chunk-XKYHFZEC.js";
|
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
queryLLM,
|
|
59
59
|
queryQuick,
|
|
60
60
|
verifyApiKey
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-5LRFEGFP.js";
|
|
62
62
|
import {
|
|
63
63
|
DEFAULT_TIMEOUT_MS,
|
|
64
64
|
FallbackToolUseRejectedMessage,
|
|
@@ -72,7 +72,7 @@ import {
|
|
|
72
72
|
listMCPServers,
|
|
73
73
|
loadMergedSettings,
|
|
74
74
|
normalizeSandboxRuntimeConfigFromSettings
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-6IXLNIBX.js";
|
|
76
76
|
import {
|
|
77
77
|
addMarketplace,
|
|
78
78
|
disableSkillPlugin,
|
|
@@ -85,11 +85,11 @@ import {
|
|
|
85
85
|
refreshMarketplaceAsync,
|
|
86
86
|
removeMarketplace,
|
|
87
87
|
uninstallSkillPlugin
|
|
88
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-ZPTG6OYN.js";
|
|
89
89
|
import {
|
|
90
90
|
loadToolPermissionContextFromDisk,
|
|
91
91
|
persistToolPermissionUpdateToDisk
|
|
92
|
-
} from "./chunk-
|
|
92
|
+
} from "./chunk-QUQAVKTY.js";
|
|
93
93
|
import {
|
|
94
94
|
applyToolPermissionContextUpdate,
|
|
95
95
|
applyToolPermissionContextUpdates,
|
|
@@ -100,13 +100,13 @@ import {
|
|
|
100
100
|
generateSystemReminders,
|
|
101
101
|
resetReminderSession,
|
|
102
102
|
systemReminderService
|
|
103
|
-
} from "./chunk-
|
|
103
|
+
} from "./chunk-HS5IAPED.js";
|
|
104
104
|
import {
|
|
105
105
|
clearAgentCache,
|
|
106
106
|
getActiveAgents,
|
|
107
107
|
getAgentByType,
|
|
108
108
|
getAllAgents
|
|
109
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-RIKQVWEQ.js";
|
|
110
110
|
import {
|
|
111
111
|
API_ERROR_MESSAGE_PREFIX,
|
|
112
112
|
CANCEL_MESSAGE,
|
|
@@ -137,7 +137,7 @@ import {
|
|
|
137
137
|
processUserInput,
|
|
138
138
|
reorderMessages,
|
|
139
139
|
stripSystemMessages
|
|
140
|
-
} from "./chunk-
|
|
140
|
+
} from "./chunk-4T65Y47N.js";
|
|
141
141
|
import {
|
|
142
142
|
getRequestStatus,
|
|
143
143
|
setRequestStatus,
|
|
@@ -167,7 +167,7 @@ import {
|
|
|
167
167
|
normalizeFilePath,
|
|
168
168
|
readTextContent,
|
|
169
169
|
writeTextContent
|
|
170
|
-
} from "./chunk-
|
|
170
|
+
} from "./chunk-2Y6RSLIK.js";
|
|
171
171
|
import {
|
|
172
172
|
parseBlockEdits
|
|
173
173
|
} from "./chunk-QWIBSCDN.js";
|
|
@@ -177,18 +177,18 @@ import {
|
|
|
177
177
|
ParserRegistry,
|
|
178
178
|
initParser,
|
|
179
179
|
loadLanguage
|
|
180
|
-
} from "./chunk-
|
|
180
|
+
} from "./chunk-X2MOC5KR.js";
|
|
181
181
|
import {
|
|
182
182
|
getSettingsFileCandidates,
|
|
183
183
|
loadSettingsWithLegacyFallback,
|
|
184
184
|
readSettingsFile
|
|
185
|
-
} from "./chunk-
|
|
185
|
+
} from "./chunk-UKCYPF74.js";
|
|
186
186
|
import {
|
|
187
187
|
getCustomCommandDirectories,
|
|
188
188
|
hasCustomCommands,
|
|
189
189
|
loadCustomCommands,
|
|
190
190
|
reloadCustomCommands
|
|
191
|
-
} from "./chunk-
|
|
191
|
+
} from "./chunk-5EJDTTBL.js";
|
|
192
192
|
import {
|
|
193
193
|
getSessionPlugins
|
|
194
194
|
} from "./chunk-BJSWTHRM.js";
|
|
@@ -196,7 +196,7 @@ import {
|
|
|
196
196
|
ModelManager,
|
|
197
197
|
getModelManager,
|
|
198
198
|
isDefaultSlowAndCapableModel
|
|
199
|
-
} from "./chunk-
|
|
199
|
+
} from "./chunk-X36JZMFM.js";
|
|
200
200
|
import {
|
|
201
201
|
getCodeStyle,
|
|
202
202
|
getContext,
|
|
@@ -204,13 +204,13 @@ import {
|
|
|
204
204
|
getIsGit,
|
|
205
205
|
getProjectDocs,
|
|
206
206
|
getProjectStructureStatisticsBlock
|
|
207
|
-
} from "./chunk-
|
|
207
|
+
} from "./chunk-SRT3X6FV.js";
|
|
208
208
|
import {
|
|
209
209
|
ripGrep
|
|
210
|
-
} from "./chunk-
|
|
210
|
+
} from "./chunk-TTMZXWQN.js";
|
|
211
211
|
import {
|
|
212
212
|
getTheme
|
|
213
|
-
} from "./chunk-
|
|
213
|
+
} from "./chunk-5Z5ZS7IB.js";
|
|
214
214
|
import {
|
|
215
215
|
DEFAULT_GLOBAL_CONFIG,
|
|
216
216
|
enableConfigs,
|
|
@@ -223,7 +223,7 @@ import {
|
|
|
223
223
|
saveGlobalConfig,
|
|
224
224
|
setAllPointersToModel,
|
|
225
225
|
setModelPointer
|
|
226
|
-
} from "./chunk-
|
|
226
|
+
} from "./chunk-QTPKDLLB.js";
|
|
227
227
|
import {
|
|
228
228
|
AbortError
|
|
229
229
|
} from "./chunk-RQVLBMP7.js";
|
|
@@ -232,7 +232,7 @@ import {
|
|
|
232
232
|
getCurrentRequest,
|
|
233
233
|
logUserFriendly,
|
|
234
234
|
markPhase
|
|
235
|
-
} from "./chunk-
|
|
235
|
+
} from "./chunk-2OQK4SGM.js";
|
|
236
236
|
import {
|
|
237
237
|
ASCII_LOGO,
|
|
238
238
|
BunShell,
|
|
@@ -266,15 +266,16 @@ import {
|
|
|
266
266
|
overwriteLog,
|
|
267
267
|
renderBackgroundShellStatusAttachment,
|
|
268
268
|
renderBashNotification,
|
|
269
|
+
resolveXdgCachePath,
|
|
269
270
|
resolveXdgDataPath,
|
|
270
271
|
setActivePlanConversationKey,
|
|
271
272
|
setCwd,
|
|
272
273
|
shouldApplyToolOutputTruncation,
|
|
273
274
|
truncateToolOutput
|
|
274
|
-
} from "./chunk-
|
|
275
|
+
} from "./chunk-BKU7DKGB.js";
|
|
275
276
|
import {
|
|
276
277
|
MACRO
|
|
277
|
-
} from "./chunk-
|
|
278
|
+
} from "./chunk-LLNPRFDC.js";
|
|
278
279
|
import {
|
|
279
280
|
__export
|
|
280
281
|
} from "./chunk-I3J4JYES.js";
|
|
@@ -282,9 +283,9 @@ import {
|
|
|
282
283
|
// src/tools/system/BashTool/BashTool.tsx
|
|
283
284
|
import { statSync as statSync13 } from "fs";
|
|
284
285
|
import { EOL as EOL3 } from "os";
|
|
285
|
-
import { isAbsolute as isAbsolute8, relative as relative12, resolve as
|
|
286
|
+
import { isAbsolute as isAbsolute8, relative as relative12, resolve as resolve11 } from "path";
|
|
286
287
|
import * as React106 from "react";
|
|
287
|
-
import { z as
|
|
288
|
+
import { z as z15 } from "zod";
|
|
288
289
|
|
|
289
290
|
// src/utils/commands/index.ts
|
|
290
291
|
import { memoize } from "lodash-es";
|
|
@@ -455,7 +456,7 @@ var getCommandSubcommandPrefix = memoize(
|
|
|
455
456
|
var getCommandPrefix = memoize(
|
|
456
457
|
async (command4, abortSignal) => {
|
|
457
458
|
const { systemPrompt, userPrompt } = buildBashCommandPrefixDetectionPrompt(command4);
|
|
458
|
-
const { API_ERROR_MESSAGE_PREFIX: API_ERROR_MESSAGE_PREFIX2, queryQuick: queryQuick2 } = await import("./llm-
|
|
459
|
+
const { API_ERROR_MESSAGE_PREFIX: API_ERROR_MESSAGE_PREFIX2, queryQuick: queryQuick2 } = await import("./llm-WAAV3MBX.js");
|
|
459
460
|
const response = await queryQuick2({
|
|
460
461
|
systemPrompt,
|
|
461
462
|
userPrompt,
|
|
@@ -740,8 +741,8 @@ async function shouldAllowNetworkRequest(query2) {
|
|
|
740
741
|
}
|
|
741
742
|
async function serializePermissionPrompt(task) {
|
|
742
743
|
let release = null;
|
|
743
|
-
const next = new Promise((
|
|
744
|
-
release =
|
|
744
|
+
const next = new Promise((resolve12) => {
|
|
745
|
+
release = resolve12;
|
|
745
746
|
});
|
|
746
747
|
const prev = active.permissionPromptChain;
|
|
747
748
|
active.permissionPromptChain = prev.then(() => next);
|
|
@@ -774,18 +775,18 @@ async function cleanupSandboxNetworkInfrastructure() {
|
|
|
774
775
|
active.sessionDeniedHosts.clear();
|
|
775
776
|
active.inflightPermissionRequests.clear();
|
|
776
777
|
await Promise.allSettled([
|
|
777
|
-
httpServer ? new Promise((
|
|
778
|
+
httpServer ? new Promise((resolve12) => {
|
|
778
779
|
try {
|
|
779
|
-
httpServer.close(() =>
|
|
780
|
+
httpServer.close(() => resolve12());
|
|
780
781
|
} catch {
|
|
781
|
-
|
|
782
|
+
resolve12();
|
|
782
783
|
}
|
|
783
784
|
}) : Promise.resolve(),
|
|
784
|
-
socksServer ? new Promise((
|
|
785
|
+
socksServer ? new Promise((resolve12) => {
|
|
785
786
|
try {
|
|
786
|
-
socksServer.close(() =>
|
|
787
|
+
socksServer.close(() => resolve12());
|
|
787
788
|
} catch {
|
|
788
|
-
|
|
789
|
+
resolve12();
|
|
789
790
|
}
|
|
790
791
|
}) : Promise.resolve()
|
|
791
792
|
]);
|
|
@@ -975,7 +976,7 @@ async function startHttpProxy() {
|
|
|
975
976
|
clientSocket.on("data", onData);
|
|
976
977
|
});
|
|
977
978
|
active.httpProxyServer = server;
|
|
978
|
-
return new Promise((
|
|
979
|
+
return new Promise((resolve12, reject) => {
|
|
979
980
|
server.once("error", reject);
|
|
980
981
|
server.once("listening", () => {
|
|
981
982
|
const addr = server.address();
|
|
@@ -984,7 +985,7 @@ async function startHttpProxy() {
|
|
|
984
985
|
return;
|
|
985
986
|
}
|
|
986
987
|
server.unref();
|
|
987
|
-
|
|
988
|
+
resolve12(addr.port);
|
|
988
989
|
});
|
|
989
990
|
server.listen(0, "127.0.0.1");
|
|
990
991
|
});
|
|
@@ -1094,7 +1095,7 @@ async function startSocks5Proxy() {
|
|
|
1094
1095
|
socket.on("data", onData);
|
|
1095
1096
|
});
|
|
1096
1097
|
active.socksProxyServer = server;
|
|
1097
|
-
return new Promise((
|
|
1098
|
+
return new Promise((resolve12, reject) => {
|
|
1098
1099
|
server.once("error", reject);
|
|
1099
1100
|
server.once("listening", () => {
|
|
1100
1101
|
const addr = server.address();
|
|
@@ -1103,7 +1104,7 @@ async function startSocks5Proxy() {
|
|
|
1103
1104
|
return;
|
|
1104
1105
|
}
|
|
1105
1106
|
server.unref();
|
|
1106
|
-
|
|
1107
|
+
resolve12(addr.port);
|
|
1107
1108
|
});
|
|
1108
1109
|
server.listen(0, "127.0.0.1");
|
|
1109
1110
|
});
|
|
@@ -2571,7 +2572,7 @@ function findMatchingBashRules(args) {
|
|
|
2571
2572
|
args.toolPermissionContext,
|
|
2572
2573
|
args.behavior
|
|
2573
2574
|
);
|
|
2574
|
-
const
|
|
2575
|
+
const matches2 = [];
|
|
2575
2576
|
for (const ruleString of rules) {
|
|
2576
2577
|
const parsed = parseToolRuleString(ruleString);
|
|
2577
2578
|
if (!parsed || parsed.toolName !== "Bash" || !parsed.ruleContent) continue;
|
|
@@ -2588,9 +2589,9 @@ function findMatchingBashRules(args) {
|
|
|
2588
2589
|
return candidate.startsWith(`${ruleContent.prefix} `);
|
|
2589
2590
|
}
|
|
2590
2591
|
});
|
|
2591
|
-
if (matched)
|
|
2592
|
+
if (matched) matches2.push(ruleString);
|
|
2592
2593
|
}
|
|
2593
|
-
return
|
|
2594
|
+
return matches2;
|
|
2594
2595
|
}
|
|
2595
2596
|
function buildBashRuleSuggestionExact(command4) {
|
|
2596
2597
|
return [
|
|
@@ -3071,14 +3072,14 @@ function RQ5(command4) {
|
|
|
3071
3072
|
if (!HEREDOC_IN_SUBSTITUTION.test(command4)) return false;
|
|
3072
3073
|
try {
|
|
3073
3074
|
const re = /\$\(cat\s*<<-?\s*(?:'+([A-Za-z_]\w*)'+|\\([A-Za-z_]\w*))/g;
|
|
3074
|
-
const
|
|
3075
|
+
const matches2 = [];
|
|
3075
3076
|
let m;
|
|
3076
3077
|
while ((m = re.exec(command4)) !== null) {
|
|
3077
3078
|
const delimiter = m[1] || m[2];
|
|
3078
|
-
if (delimiter)
|
|
3079
|
+
if (delimiter) matches2.push({ start: m.index, delimiter });
|
|
3079
3080
|
}
|
|
3080
|
-
if (
|
|
3081
|
-
for (const { start, delimiter } of
|
|
3081
|
+
if (matches2.length === 0) return false;
|
|
3082
|
+
for (const { start, delimiter } of matches2) {
|
|
3082
3083
|
const tail = command4.substring(start);
|
|
3083
3084
|
const escaped = delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&");
|
|
3084
3085
|
if (!new RegExp(`(?:\\n|^[^\\\\n]*\\n)${escaped}\\\\s*\\\\)`).test(tail))
|
|
@@ -3089,7 +3090,7 @@ function RQ5(command4) {
|
|
|
3089
3090
|
if (!tail.match(full)) return false;
|
|
3090
3091
|
}
|
|
3091
3092
|
let remaining = command4;
|
|
3092
|
-
for (const { delimiter } of
|
|
3093
|
+
for (const { delimiter } of matches2) {
|
|
3093
3094
|
const escaped = delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&");
|
|
3094
3095
|
const pattern = new RegExp(
|
|
3095
3096
|
`\\\\$\\\\(cat\\\\s*<<-?\\\\s*(?:'+${escaped}'+|\\\\\\\\${escaped})[^\\\\n]*\\\\n(?:[\\\\s\\\\S]*?\\\\n)?${escaped}\\\\s*\\\\)`
|
|
@@ -4257,7 +4258,7 @@ function formatParseError(error) {
|
|
|
4257
4258
|
return error instanceof Error ? error.message : String(error);
|
|
4258
4259
|
}
|
|
4259
4260
|
async function defaultGateQuery(args) {
|
|
4260
|
-
const { API_ERROR_MESSAGE_PREFIX: API_ERROR_MESSAGE_PREFIX2, queryLLM: queryLLM2 } = await import("./llm-
|
|
4261
|
+
const { API_ERROR_MESSAGE_PREFIX: API_ERROR_MESSAGE_PREFIX2, queryLLM: queryLLM2 } = await import("./llm-WAAV3MBX.js");
|
|
4261
4262
|
const queryLLMFn = args.queryLLMOverride ?? queryLLM2;
|
|
4262
4263
|
const messages = [
|
|
4263
4264
|
{
|
|
@@ -6654,7 +6655,7 @@ var FileEditTool = {
|
|
|
6654
6655
|
const originalFileContent = currentFileContent;
|
|
6655
6656
|
let totalPatch = [];
|
|
6656
6657
|
const { SmartEdit } = await import("./smart-edit-AWHJDSU6.js");
|
|
6657
|
-
const { findLspAnchor } = await import("./lspAnchor-
|
|
6658
|
+
const { findLspAnchor } = await import("./lspAnchor-A3P4LT3X.js");
|
|
6658
6659
|
for (const op of editOperations) {
|
|
6659
6660
|
const normalizedSearch = normalizeLineEndings(op.search);
|
|
6660
6661
|
const normalizedReplace = normalizeLineEndings(op.replace);
|
|
@@ -8988,7 +8989,7 @@ var WebSearchTool = {
|
|
|
8988
8989
|
};
|
|
8989
8990
|
|
|
8990
8991
|
// src/tools/interaction/SlashCommandTool/SlashCommandTool.tsx
|
|
8991
|
-
import { z as
|
|
8992
|
+
import { z as z13 } from "zod";
|
|
8992
8993
|
import * as React103 from "react";
|
|
8993
8994
|
|
|
8994
8995
|
// src/ui/components/Bug.tsx
|
|
@@ -10066,9 +10067,9 @@ function setTerminalTitle(title) {
|
|
|
10066
10067
|
}
|
|
10067
10068
|
}
|
|
10068
10069
|
function clearTerminal() {
|
|
10069
|
-
return new Promise((
|
|
10070
|
+
return new Promise((resolve12) => {
|
|
10070
10071
|
process.stdout.write("\x1B[2J\x1B[3J\x1B[H", () => {
|
|
10071
|
-
|
|
10072
|
+
resolve12();
|
|
10072
10073
|
});
|
|
10073
10074
|
});
|
|
10074
10075
|
}
|
|
@@ -11186,8 +11187,8 @@ var OAuthService = class {
|
|
|
11186
11187
|
await authURLHandler(manualUrl);
|
|
11187
11188
|
await openBrowser(autoUrl);
|
|
11188
11189
|
};
|
|
11189
|
-
const { authorizationCode, useManualRedirect } = await new Promise((
|
|
11190
|
-
this.pendingCodePromise = { resolve:
|
|
11190
|
+
const { authorizationCode, useManualRedirect } = await new Promise((resolve12, reject) => {
|
|
11191
|
+
this.pendingCodePromise = { resolve: resolve12, reject };
|
|
11191
11192
|
this.startLocalServer(state, onReady);
|
|
11192
11193
|
});
|
|
11193
11194
|
const {
|
|
@@ -11358,7 +11359,7 @@ async function createAndStoreApiKey(accessToken) {
|
|
|
11358
11359
|
}
|
|
11359
11360
|
saveGlobalConfig(config2);
|
|
11360
11361
|
try {
|
|
11361
|
-
const { resetAnthropicClient } = await import("./llm-
|
|
11362
|
+
const { resetAnthropicClient } = await import("./llm-WAAV3MBX.js");
|
|
11362
11363
|
resetAnthropicClient();
|
|
11363
11364
|
} catch {
|
|
11364
11365
|
}
|
|
@@ -13798,7 +13799,7 @@ function ModelSelector({
|
|
|
13798
13799
|
setModelLoadError(
|
|
13799
13800
|
`Attempt ${attempt}/${MAX_RETRIES}: Retrying model discovery...`
|
|
13800
13801
|
);
|
|
13801
|
-
await new Promise((
|
|
13802
|
+
await new Promise((resolve12) => setTimeout(resolve12, 1e3));
|
|
13802
13803
|
}
|
|
13803
13804
|
try {
|
|
13804
13805
|
const models = await fetchModels();
|
|
@@ -15725,7 +15726,7 @@ async function refreshPluginRuntimeFromInstalls() {
|
|
|
15725
15726
|
const existingRoots = getSessionPlugins().map((p) => p.rootDir);
|
|
15726
15727
|
const dirs = Array.from(/* @__PURE__ */ new Set([...existingRoots, ...installedRoots]));
|
|
15727
15728
|
if (dirs.length === 0) return [];
|
|
15728
|
-
const { configureSessionPlugins } = await import("./pluginRuntime-
|
|
15729
|
+
const { configureSessionPlugins } = await import("./pluginRuntime-BZ3RM5P7.js");
|
|
15729
15730
|
const { errors } = await configureSessionPlugins({ pluginDirs: dirs });
|
|
15730
15731
|
return errors;
|
|
15731
15732
|
}
|
|
@@ -16394,7 +16395,7 @@ async function call(onDone, context) {
|
|
|
16394
16395
|
ModelConfig,
|
|
16395
16396
|
{
|
|
16396
16397
|
onClose: () => {
|
|
16397
|
-
import("./model-
|
|
16398
|
+
import("./model-JCGDL77F.js").then(({ reloadModelManager: reloadModelManager2 }) => {
|
|
16398
16399
|
reloadModelManager2();
|
|
16399
16400
|
triggerModelConfigChange();
|
|
16400
16401
|
onDone();
|
|
@@ -22764,8 +22765,8 @@ function generateMentionSuggestions(args) {
|
|
|
22764
22765
|
});
|
|
22765
22766
|
}
|
|
22766
22767
|
const candidates = allSuggestions.map((s) => s.value);
|
|
22767
|
-
const
|
|
22768
|
-
const fuzzyResults =
|
|
22768
|
+
const matches2 = matchCommands(candidates, prefix);
|
|
22769
|
+
const fuzzyResults = matches2.map((match) => {
|
|
22769
22770
|
const suggestion = allSuggestions.find((s) => s.value === match.command);
|
|
22770
22771
|
return {
|
|
22771
22772
|
...suggestion,
|
|
@@ -23487,8 +23488,8 @@ function generateUnixCommandSuggestions(args) {
|
|
|
23487
23488
|
}
|
|
23488
23489
|
const commonCommands = getCommonSystemCommands(systemCommands);
|
|
23489
23490
|
const uniqueCommands = Array.from(new Set(commonCommands));
|
|
23490
|
-
const
|
|
23491
|
-
const boostedMatches =
|
|
23491
|
+
const matches2 = matchCommands(uniqueCommands, prefix);
|
|
23492
|
+
const boostedMatches = matches2.map((match) => {
|
|
23492
23493
|
const priority = getCommandPriority(match.command);
|
|
23493
23494
|
return {
|
|
23494
23495
|
...match,
|
|
@@ -24140,13 +24141,13 @@ function useUnifiedCompletion({
|
|
|
24140
24141
|
}
|
|
24141
24142
|
if (context.type === "command") {
|
|
24142
24143
|
const fullCommand = `/${suggestion.value}`;
|
|
24143
|
-
const
|
|
24144
|
-
return
|
|
24144
|
+
const matches2 = currentInput === fullCommand;
|
|
24145
|
+
return matches2;
|
|
24145
24146
|
}
|
|
24146
24147
|
if (context.type === "agent") {
|
|
24147
24148
|
const fullAgent = `@${suggestion.value}`;
|
|
24148
|
-
const
|
|
24149
|
-
return
|
|
24149
|
+
const matches2 = currentInput === fullAgent;
|
|
24150
|
+
return matches2;
|
|
24150
24151
|
}
|
|
24151
24152
|
return false;
|
|
24152
24153
|
},
|
|
@@ -24310,7 +24311,7 @@ async function launchExternalEditor(initialText) {
|
|
|
24310
24311
|
}
|
|
24311
24312
|
}
|
|
24312
24313
|
try {
|
|
24313
|
-
await new Promise((
|
|
24314
|
+
await new Promise((resolve12, reject) => {
|
|
24314
24315
|
const child = spawn(
|
|
24315
24316
|
editorCommand.command,
|
|
24316
24317
|
[...editorCommand.args, filePath],
|
|
@@ -24322,7 +24323,7 @@ async function launchExternalEditor(initialText) {
|
|
|
24322
24323
|
child.on("error", reject);
|
|
24323
24324
|
child.on("exit", (code, signal) => {
|
|
24324
24325
|
if (code === 0 || code === null) {
|
|
24325
|
-
|
|
24326
|
+
resolve12();
|
|
24326
24327
|
} else {
|
|
24327
24328
|
reject(
|
|
24328
24329
|
new Error(
|
|
@@ -24598,7 +24599,7 @@ function useStatusLine() {
|
|
|
24598
24599
|
// src/ui/components/PromptInput.tsx
|
|
24599
24600
|
async function interpretHashCommand(input) {
|
|
24600
24601
|
try {
|
|
24601
|
-
const { queryQuick: queryQuick2 } = await import("./llm-
|
|
24602
|
+
const { queryQuick: queryQuick2 } = await import("./llm-WAAV3MBX.js");
|
|
24602
24603
|
const systemPrompt = [
|
|
24603
24604
|
"You're helping the user structure notes that will be added to their PYB.md file.",
|
|
24604
24605
|
"Format the user's input into a well-structured note that will be useful for later reference.",
|
|
@@ -24803,7 +24804,7 @@ function PromptInput({
|
|
|
24803
24804
|
abortController.abort();
|
|
24804
24805
|
}
|
|
24805
24806
|
setIsLoading(false);
|
|
24806
|
-
await new Promise((
|
|
24807
|
+
await new Promise((resolve12) => setTimeout(resolve12, 0));
|
|
24807
24808
|
setIsLoading(true);
|
|
24808
24809
|
let finalInput2 = cleanInput;
|
|
24809
24810
|
for (const { placeholder: placeholder2, text } of pastedTexts) {
|
|
@@ -24911,7 +24912,7 @@ function PromptInput({
|
|
|
24911
24912
|
if (messages2.length) {
|
|
24912
24913
|
if (mode === "bash") {
|
|
24913
24914
|
onQuery(messages2, newAbortController).then(async () => {
|
|
24914
|
-
const { getCwd: getCwd2 } = await import("./state-
|
|
24915
|
+
const { getCwd: getCwd2 } = await import("./state-YJAFADHA.js");
|
|
24915
24916
|
setCurrentPwd(getCwd2());
|
|
24916
24917
|
});
|
|
24917
24918
|
} else {
|
|
@@ -25271,11 +25272,11 @@ import { useCallback as useCallback14 } from "react";
|
|
|
25271
25272
|
function useCanUseTool(setToolUseConfirm) {
|
|
25272
25273
|
return useCallback14(
|
|
25273
25274
|
async (tool, input, toolUseContext, assistantMessage) => {
|
|
25274
|
-
return new Promise((
|
|
25275
|
+
return new Promise((resolve12) => {
|
|
25275
25276
|
function logCancelledEvent() {
|
|
25276
25277
|
}
|
|
25277
25278
|
function resolveWithCancelledAndAbortAllToolCalls(message) {
|
|
25278
|
-
|
|
25279
|
+
resolve12({
|
|
25279
25280
|
result: false,
|
|
25280
25281
|
message: message ? `${REJECT_MESSAGE_WITH_FEEDBACK_PREFIX}${message}` : REJECT_MESSAGE
|
|
25281
25282
|
});
|
|
@@ -25293,12 +25294,12 @@ function useCanUseTool(setToolUseConfirm) {
|
|
|
25293
25294
|
assistantMessage
|
|
25294
25295
|
).then(async (result) => {
|
|
25295
25296
|
if (result.result === true) {
|
|
25296
|
-
|
|
25297
|
+
resolve12({ result: true });
|
|
25297
25298
|
return;
|
|
25298
25299
|
}
|
|
25299
25300
|
const deniedResult = result;
|
|
25300
25301
|
if (deniedResult.shouldPromptUser === false) {
|
|
25301
|
-
|
|
25302
|
+
resolve12({ result: false, message: deniedResult.message });
|
|
25302
25303
|
return;
|
|
25303
25304
|
}
|
|
25304
25305
|
const [description3, commandPrefix] = await Promise.all([
|
|
@@ -25330,7 +25331,7 @@ function useCanUseTool(setToolUseConfirm) {
|
|
|
25330
25331
|
if (type3 === "permanent") {
|
|
25331
25332
|
} else {
|
|
25332
25333
|
}
|
|
25333
|
-
|
|
25334
|
+
resolve12({ result: true });
|
|
25334
25335
|
},
|
|
25335
25336
|
onReject(rejectionMessage) {
|
|
25336
25337
|
resolveWithCancelledAndAbortAllToolCalls(rejectionMessage);
|
|
@@ -25928,6 +25929,794 @@ async function selectAndReadFiles() {
|
|
|
25928
25929
|
return results;
|
|
25929
25930
|
}
|
|
25930
25931
|
|
|
25932
|
+
// src/services/telemetry/eventBus.ts
|
|
25933
|
+
var listeners2 = /* @__PURE__ */ new Map();
|
|
25934
|
+
function registerTelemetryListener(listenerId, listener) {
|
|
25935
|
+
listeners2.set(listenerId, listener);
|
|
25936
|
+
}
|
|
25937
|
+
function emitTelemetryEvent(event) {
|
|
25938
|
+
for (const listener of listeners2.values()) {
|
|
25939
|
+
listener(event);
|
|
25940
|
+
}
|
|
25941
|
+
}
|
|
25942
|
+
|
|
25943
|
+
// src/utils/session/autoCompactMetrics.ts
|
|
25944
|
+
function safeDivide(numerator, denominator) {
|
|
25945
|
+
if (denominator <= 0) return 0;
|
|
25946
|
+
return numerator / denominator;
|
|
25947
|
+
}
|
|
25948
|
+
function computeAutoCompactMetrics(events) {
|
|
25949
|
+
const failedEvents = events.filter((event) => event.phase === "AUTO_COMPACT_FAILED");
|
|
25950
|
+
const retryEvents = events.filter((event) => event.phase === "AUTO_COMPACT_RETRY");
|
|
25951
|
+
const fallbackEvents = events.filter((event) => event.phase === "AUTO_COMPACT_FALLBACK");
|
|
25952
|
+
const invalidShapeFailures = failedEvents.filter(
|
|
25953
|
+
(event) => event.data?.failureType === "invalid_content_shape"
|
|
25954
|
+
).length;
|
|
25955
|
+
const compact_invalid_shape_rate = safeDivide(
|
|
25956
|
+
invalidShapeFailures,
|
|
25957
|
+
failedEvents.length
|
|
25958
|
+
);
|
|
25959
|
+
const retrySuccessSignals = fallbackEvents.length;
|
|
25960
|
+
const compact_retry_success_rate = safeDivide(
|
|
25961
|
+
retrySuccessSignals,
|
|
25962
|
+
retryEvents.length + fallbackEvents.length
|
|
25963
|
+
);
|
|
25964
|
+
const transformAppliedEvents = events.filter(
|
|
25965
|
+
(event) => event.phase === "MESSAGE_TRANSFORM_APPLIED"
|
|
25966
|
+
);
|
|
25967
|
+
const thinkingFirstCount = transformAppliedEvents.filter((event) => {
|
|
25968
|
+
const stats = event.data?.outputBlockStats || {};
|
|
25969
|
+
const thinking = Number(stats.thinking ?? 0);
|
|
25970
|
+
const text = Number(stats.text ?? 0);
|
|
25971
|
+
return thinking > 0 && text > 0;
|
|
25972
|
+
}).length;
|
|
25973
|
+
const thinking_first_ratio = safeDivide(
|
|
25974
|
+
thinkingFirstCount,
|
|
25975
|
+
transformAppliedEvents.length
|
|
25976
|
+
);
|
|
25977
|
+
const crossReplayTagged = events.filter(
|
|
25978
|
+
(event) => event.phase === "AUTO_COMPACT_FAILED" || event.phase === "AUTO_COMPACT_RETRY" || event.phase === "AUTO_COMPACT_FALLBACK"
|
|
25979
|
+
);
|
|
25980
|
+
const crossReplayErrors = crossReplayTagged.filter(
|
|
25981
|
+
(event) => event.data?.crossModelReplay === true && event.phase === "AUTO_COMPACT_FAILED"
|
|
25982
|
+
).length;
|
|
25983
|
+
const crossReplayTotal = crossReplayTagged.filter(
|
|
25984
|
+
(event) => event.data?.crossModelReplay === true
|
|
25985
|
+
).length;
|
|
25986
|
+
const cross_model_replay_error_rate = safeDivide(
|
|
25987
|
+
crossReplayErrors,
|
|
25988
|
+
crossReplayTotal
|
|
25989
|
+
);
|
|
25990
|
+
return {
|
|
25991
|
+
compact_invalid_shape_rate,
|
|
25992
|
+
compact_retry_success_rate,
|
|
25993
|
+
thinking_first_ratio,
|
|
25994
|
+
cross_model_replay_error_rate
|
|
25995
|
+
};
|
|
25996
|
+
}
|
|
25997
|
+
|
|
25998
|
+
// src/utils/session/autoCompactMetricsSink.ts
|
|
25999
|
+
function createAutoCompactMetricsSink() {
|
|
26000
|
+
const events = [];
|
|
26001
|
+
return {
|
|
26002
|
+
push(event) {
|
|
26003
|
+
events.push(event);
|
|
26004
|
+
},
|
|
26005
|
+
snapshot() {
|
|
26006
|
+
return {
|
|
26007
|
+
eventCount: events.length,
|
|
26008
|
+
metrics: computeAutoCompactMetrics(events)
|
|
26009
|
+
};
|
|
26010
|
+
},
|
|
26011
|
+
clear() {
|
|
26012
|
+
events.length = 0;
|
|
26013
|
+
}
|
|
26014
|
+
};
|
|
26015
|
+
}
|
|
26016
|
+
|
|
26017
|
+
// src/services/telemetry/autoCompactTelemetry.ts
|
|
26018
|
+
var AUTO_COMPACT_TELEMETRY_PHASES = /* @__PURE__ */ new Set([
|
|
26019
|
+
"AUTO_COMPACT_FAILED",
|
|
26020
|
+
"AUTO_COMPACT_RETRY",
|
|
26021
|
+
"AUTO_COMPACT_FALLBACK",
|
|
26022
|
+
"MESSAGE_TRANSFORM_APPLIED"
|
|
26023
|
+
]);
|
|
26024
|
+
var AUTO_COMPACT_SINK_LISTENER_ID = "auto-compact-metrics-sink";
|
|
26025
|
+
var autoCompactSink = createAutoCompactMetricsSink();
|
|
26026
|
+
var sinkRegistered = false;
|
|
26027
|
+
function ensureAutoCompactTelemetryRegistered() {
|
|
26028
|
+
if (sinkRegistered) return;
|
|
26029
|
+
registerTelemetryListener(AUTO_COMPACT_SINK_LISTENER_ID, (event) => {
|
|
26030
|
+
if (!AUTO_COMPACT_TELEMETRY_PHASES.has(event.phase)) return;
|
|
26031
|
+
autoCompactSink.push({
|
|
26032
|
+
phase: event.phase,
|
|
26033
|
+
data: event.data
|
|
26034
|
+
});
|
|
26035
|
+
});
|
|
26036
|
+
sinkRegistered = true;
|
|
26037
|
+
}
|
|
26038
|
+
function emitAutoCompactTelemetryEvent(phase, data) {
|
|
26039
|
+
ensureAutoCompactTelemetryRegistered();
|
|
26040
|
+
emitTelemetryEvent({
|
|
26041
|
+
channel: "auto_compact",
|
|
26042
|
+
phase,
|
|
26043
|
+
data,
|
|
26044
|
+
timestamp: Date.now()
|
|
26045
|
+
});
|
|
26046
|
+
}
|
|
26047
|
+
function getAutoCompactMetricsSnapshot() {
|
|
26048
|
+
ensureAutoCompactTelemetryRegistered();
|
|
26049
|
+
return autoCompactSink.snapshot();
|
|
26050
|
+
}
|
|
26051
|
+
function resetAutoCompactTelemetry() {
|
|
26052
|
+
autoCompactSink.clear();
|
|
26053
|
+
}
|
|
26054
|
+
ensureAutoCompactTelemetryRegistered();
|
|
26055
|
+
|
|
26056
|
+
// src/services/ai/canonicalResponse/index.ts
|
|
26057
|
+
function normalizeModelResponseContent(content, context) {
|
|
26058
|
+
const textBlocks = [];
|
|
26059
|
+
const reasoningBlocks = [];
|
|
26060
|
+
const blockTypes = [];
|
|
26061
|
+
if (typeof content === "string") {
|
|
26062
|
+
const normalized = content.trim();
|
|
26063
|
+
if (normalized.length > 0) {
|
|
26064
|
+
textBlocks.push(normalized);
|
|
26065
|
+
blockTypes.push("string");
|
|
26066
|
+
}
|
|
26067
|
+
} else if (Array.isArray(content)) {
|
|
26068
|
+
for (const block of content) {
|
|
26069
|
+
if (!block || typeof block !== "object") {
|
|
26070
|
+
blockTypes.push(typeof block);
|
|
26071
|
+
continue;
|
|
26072
|
+
}
|
|
26073
|
+
const type3 = String(block.type ?? "unknown");
|
|
26074
|
+
blockTypes.push(type3);
|
|
26075
|
+
if (type3 === "text") {
|
|
26076
|
+
const text = String(block.text ?? "").trim();
|
|
26077
|
+
if (text.length > 0) {
|
|
26078
|
+
textBlocks.push(text);
|
|
26079
|
+
}
|
|
26080
|
+
continue;
|
|
26081
|
+
}
|
|
26082
|
+
if (type3 === "thinking" || type3 === "reasoning") {
|
|
26083
|
+
const reasoning = String(
|
|
26084
|
+
block.thinking ?? block.reasoning ?? ""
|
|
26085
|
+
).trim();
|
|
26086
|
+
if (reasoning.length > 0) {
|
|
26087
|
+
reasoningBlocks.push(reasoning);
|
|
26088
|
+
}
|
|
26089
|
+
}
|
|
26090
|
+
}
|
|
26091
|
+
} else {
|
|
26092
|
+
blockTypes.push(typeof content);
|
|
26093
|
+
}
|
|
26094
|
+
const summaryText = textBlocks.length > 0 ? textBlocks.join("\n") : null;
|
|
26095
|
+
const fallbackSummary = summaryText === null && context.reasoningPolicy === "flatten_to_text_fallback" && reasoningBlocks.length > 0 ? reasoningBlocks.join("\n") : null;
|
|
26096
|
+
const finalSummaryText = summaryText ?? fallbackSummary;
|
|
26097
|
+
const result = {
|
|
26098
|
+
isValid: finalSummaryText !== null,
|
|
26099
|
+
summaryText: finalSummaryText,
|
|
26100
|
+
textBlocks,
|
|
26101
|
+
reasoningBlocks,
|
|
26102
|
+
blockTypes,
|
|
26103
|
+
...finalSummaryText === null ? { failureType: "invalid_content_shape" } : {}
|
|
26104
|
+
};
|
|
26105
|
+
const payload = {
|
|
26106
|
+
source: context.source,
|
|
26107
|
+
model: context.model,
|
|
26108
|
+
provider: context.provider ?? "openai",
|
|
26109
|
+
isValid: result.isValid,
|
|
26110
|
+
failureType: result.failureType,
|
|
26111
|
+
reasoningPolicy: context.reasoningPolicy,
|
|
26112
|
+
policySource: context.policySource,
|
|
26113
|
+
textBlockCount: textBlocks.length,
|
|
26114
|
+
reasoningBlockCount: reasoningBlocks.length,
|
|
26115
|
+
blockTypes
|
|
26116
|
+
};
|
|
26117
|
+
debug.state("CANONICAL_RESPONSE_APPLIED", payload);
|
|
26118
|
+
emitTelemetryEvent({
|
|
26119
|
+
channel: "canonical_response",
|
|
26120
|
+
phase: "CANONICAL_RESPONSE_APPLIED",
|
|
26121
|
+
data: payload,
|
|
26122
|
+
timestamp: Date.now()
|
|
26123
|
+
});
|
|
26124
|
+
return result;
|
|
26125
|
+
}
|
|
26126
|
+
|
|
26127
|
+
// src/constants/modelCapabilities.ts
|
|
26128
|
+
var GPT5_CAPABILITIES = {
|
|
26129
|
+
apiArchitecture: {
|
|
26130
|
+
primary: "responses_api",
|
|
26131
|
+
fallback: "chat_completions"
|
|
26132
|
+
},
|
|
26133
|
+
parameters: {
|
|
26134
|
+
maxTokensField: "max_output_tokens",
|
|
26135
|
+
supportsReasoningEffort: true,
|
|
26136
|
+
supportsVerbosity: true,
|
|
26137
|
+
temperatureMode: "fixed_one"
|
|
26138
|
+
},
|
|
26139
|
+
toolCalling: {
|
|
26140
|
+
mode: "custom_tools",
|
|
26141
|
+
supportsFreeform: true,
|
|
26142
|
+
supportsAllowedTools: true,
|
|
26143
|
+
supportsParallelCalls: true
|
|
26144
|
+
},
|
|
26145
|
+
stateManagement: {
|
|
26146
|
+
supportsResponseId: true,
|
|
26147
|
+
supportsConversationChaining: true,
|
|
26148
|
+
supportsPreviousResponseId: true
|
|
26149
|
+
},
|
|
26150
|
+
streaming: {
|
|
26151
|
+
supported: true,
|
|
26152
|
+
includesUsage: true
|
|
26153
|
+
}
|
|
26154
|
+
};
|
|
26155
|
+
var CHAT_COMPLETIONS_CAPABILITIES = {
|
|
26156
|
+
apiArchitecture: {
|
|
26157
|
+
primary: "chat_completions"
|
|
26158
|
+
},
|
|
26159
|
+
parameters: {
|
|
26160
|
+
maxTokensField: "max_tokens",
|
|
26161
|
+
supportsReasoningEffort: false,
|
|
26162
|
+
supportsVerbosity: false,
|
|
26163
|
+
temperatureMode: "flexible"
|
|
26164
|
+
},
|
|
26165
|
+
toolCalling: {
|
|
26166
|
+
mode: "function_calling",
|
|
26167
|
+
supportsFreeform: false,
|
|
26168
|
+
supportsAllowedTools: false,
|
|
26169
|
+
supportsParallelCalls: true
|
|
26170
|
+
},
|
|
26171
|
+
stateManagement: {
|
|
26172
|
+
supportsResponseId: false,
|
|
26173
|
+
supportsConversationChaining: false,
|
|
26174
|
+
supportsPreviousResponseId: false
|
|
26175
|
+
},
|
|
26176
|
+
streaming: {
|
|
26177
|
+
supported: true,
|
|
26178
|
+
includesUsage: true
|
|
26179
|
+
}
|
|
26180
|
+
};
|
|
26181
|
+
var MODEL_CAPABILITIES_REGISTRY = {
|
|
26182
|
+
"gpt-5": GPT5_CAPABILITIES,
|
|
26183
|
+
"gpt-5-mini": GPT5_CAPABILITIES,
|
|
26184
|
+
"gpt-5-nano": GPT5_CAPABILITIES,
|
|
26185
|
+
"gpt-5-chat-latest": GPT5_CAPABILITIES,
|
|
26186
|
+
"gpt-5-codex": GPT5_CAPABILITIES,
|
|
26187
|
+
"gpt-4o": CHAT_COMPLETIONS_CAPABILITIES,
|
|
26188
|
+
"gpt-4o-mini": CHAT_COMPLETIONS_CAPABILITIES,
|
|
26189
|
+
"gpt-4-turbo": CHAT_COMPLETIONS_CAPABILITIES,
|
|
26190
|
+
"gpt-4": CHAT_COMPLETIONS_CAPABILITIES,
|
|
26191
|
+
"claude-3-5-sonnet-20241022": CHAT_COMPLETIONS_CAPABILITIES,
|
|
26192
|
+
"claude-3-5-haiku-20241022": CHAT_COMPLETIONS_CAPABILITIES,
|
|
26193
|
+
"claude-3-opus-20240229": CHAT_COMPLETIONS_CAPABILITIES,
|
|
26194
|
+
o1: {
|
|
26195
|
+
...CHAT_COMPLETIONS_CAPABILITIES,
|
|
26196
|
+
parameters: {
|
|
26197
|
+
...CHAT_COMPLETIONS_CAPABILITIES.parameters,
|
|
26198
|
+
maxTokensField: "max_completion_tokens",
|
|
26199
|
+
temperatureMode: "fixed_one"
|
|
26200
|
+
}
|
|
26201
|
+
},
|
|
26202
|
+
"o1-mini": {
|
|
26203
|
+
...CHAT_COMPLETIONS_CAPABILITIES,
|
|
26204
|
+
parameters: {
|
|
26205
|
+
...CHAT_COMPLETIONS_CAPABILITIES.parameters,
|
|
26206
|
+
maxTokensField: "max_completion_tokens",
|
|
26207
|
+
temperatureMode: "fixed_one"
|
|
26208
|
+
}
|
|
26209
|
+
},
|
|
26210
|
+
"o1-preview": {
|
|
26211
|
+
...CHAT_COMPLETIONS_CAPABILITIES,
|
|
26212
|
+
parameters: {
|
|
26213
|
+
...CHAT_COMPLETIONS_CAPABILITIES.parameters,
|
|
26214
|
+
maxTokensField: "max_completion_tokens",
|
|
26215
|
+
temperatureMode: "fixed_one"
|
|
26216
|
+
}
|
|
26217
|
+
}
|
|
26218
|
+
};
|
|
26219
|
+
function inferModelCapabilities(modelName) {
|
|
26220
|
+
if (!modelName) return null;
|
|
26221
|
+
const lowerName = modelName.toLowerCase();
|
|
26222
|
+
if (lowerName.includes("gpt-5") || lowerName.includes("gpt5")) {
|
|
26223
|
+
return GPT5_CAPABILITIES;
|
|
26224
|
+
}
|
|
26225
|
+
if (lowerName.includes("gpt-6") || lowerName.includes("gpt6")) {
|
|
26226
|
+
return {
|
|
26227
|
+
...GPT5_CAPABILITIES,
|
|
26228
|
+
streaming: { supported: true, includesUsage: true }
|
|
26229
|
+
};
|
|
26230
|
+
}
|
|
26231
|
+
if (lowerName.includes("glm-5") || lowerName.includes("glm5")) {
|
|
26232
|
+
return {
|
|
26233
|
+
...CHAT_COMPLETIONS_CAPABILITIES,
|
|
26234
|
+
toolCalling: {
|
|
26235
|
+
...CHAT_COMPLETIONS_CAPABILITIES.toolCalling,
|
|
26236
|
+
supportsAllowedTools: false
|
|
26237
|
+
}
|
|
26238
|
+
};
|
|
26239
|
+
}
|
|
26240
|
+
if (lowerName.startsWith("o1") || lowerName.includes("o1-")) {
|
|
26241
|
+
return {
|
|
26242
|
+
...CHAT_COMPLETIONS_CAPABILITIES,
|
|
26243
|
+
parameters: {
|
|
26244
|
+
...CHAT_COMPLETIONS_CAPABILITIES.parameters,
|
|
26245
|
+
maxTokensField: "max_completion_tokens",
|
|
26246
|
+
temperatureMode: "fixed_one"
|
|
26247
|
+
}
|
|
26248
|
+
};
|
|
26249
|
+
}
|
|
26250
|
+
return null;
|
|
26251
|
+
}
|
|
26252
|
+
var capabilityCache = /* @__PURE__ */ new Map();
|
|
26253
|
+
function getModelCapabilities(modelName) {
|
|
26254
|
+
if (capabilityCache.has(modelName)) {
|
|
26255
|
+
return capabilityCache.get(modelName);
|
|
26256
|
+
}
|
|
26257
|
+
if (MODEL_CAPABILITIES_REGISTRY[modelName]) {
|
|
26258
|
+
const capabilities = MODEL_CAPABILITIES_REGISTRY[modelName];
|
|
26259
|
+
capabilityCache.set(modelName, capabilities);
|
|
26260
|
+
return capabilities;
|
|
26261
|
+
}
|
|
26262
|
+
const inferred = inferModelCapabilities(modelName);
|
|
26263
|
+
if (inferred) {
|
|
26264
|
+
capabilityCache.set(modelName, inferred);
|
|
26265
|
+
return inferred;
|
|
26266
|
+
}
|
|
26267
|
+
const defaultCapabilities = CHAT_COMPLETIONS_CAPABILITIES;
|
|
26268
|
+
capabilityCache.set(modelName, defaultCapabilities);
|
|
26269
|
+
return defaultCapabilities;
|
|
26270
|
+
}
|
|
26271
|
+
|
|
26272
|
+
// src/services/ai/policyDispatch/policyConfigLoader.ts
|
|
26273
|
+
import { existsSync as existsSync15, readFileSync as readFileSync11 } from "fs";
|
|
26274
|
+
import { join as join12, resolve as resolve9 } from "path";
|
|
26275
|
+
|
|
26276
|
+
// src/services/ai/policyDispatch/policyConfigSchema.ts
|
|
26277
|
+
import { z as z11 } from "zod";
|
|
26278
|
+
var policyConfigSchema = z11.object({
|
|
26279
|
+
version: z11.string().min(1),
|
|
26280
|
+
defaults: z11.object({
|
|
26281
|
+
reasoningPolicy: z11.enum([
|
|
26282
|
+
"preserve_reasoning_blocks",
|
|
26283
|
+
"map_to_provider_options",
|
|
26284
|
+
"flatten_to_text_fallback"
|
|
26285
|
+
]).optional(),
|
|
26286
|
+
normalizeProviderContent: z11.boolean().optional(),
|
|
26287
|
+
trimCrossModelMetadata: z11.boolean().optional()
|
|
26288
|
+
}).optional(),
|
|
26289
|
+
overrides: z11.array(
|
|
26290
|
+
z11.object({
|
|
26291
|
+
model: z11.string().min(1).optional(),
|
|
26292
|
+
modelFamily: z11.string().min(1).optional(),
|
|
26293
|
+
provider: z11.string().min(1).optional(),
|
|
26294
|
+
scenario: z11.enum(["query", "auto_compact", "other"]).optional(),
|
|
26295
|
+
reasoningPolicy: z11.enum([
|
|
26296
|
+
"preserve_reasoning_blocks",
|
|
26297
|
+
"map_to_provider_options",
|
|
26298
|
+
"flatten_to_text_fallback"
|
|
26299
|
+
]).optional(),
|
|
26300
|
+
normalizeProviderContent: z11.boolean().optional(),
|
|
26301
|
+
trimCrossModelMetadata: z11.boolean().optional()
|
|
26302
|
+
})
|
|
26303
|
+
).optional().default([])
|
|
26304
|
+
});
|
|
26305
|
+
|
|
26306
|
+
// src/services/ai/policyDispatch/policyConfigLoader.ts
|
|
26307
|
+
function getModelFamily(model) {
|
|
26308
|
+
const normalized = String(model || "").toLowerCase();
|
|
26309
|
+
if (normalized.startsWith("gpt-5")) return "gpt-5";
|
|
26310
|
+
if (normalized.startsWith("gpt-4o")) return "gpt-4o";
|
|
26311
|
+
if (!normalized) return "unknown";
|
|
26312
|
+
const segments = normalized.split("-");
|
|
26313
|
+
return segments.length >= 2 ? `${segments[0]}-${segments[1]}` : normalized;
|
|
26314
|
+
}
|
|
26315
|
+
function getDefaultPolicyConfigPath() {
|
|
26316
|
+
return resolve9(join12(process.cwd(), "config/auto-compact-policy.config.json"));
|
|
26317
|
+
}
|
|
26318
|
+
function loadAutoCompactPolicyConfig(options) {
|
|
26319
|
+
const filePath = resolve9(options?.filePath ?? getDefaultPolicyConfigPath());
|
|
26320
|
+
if (!existsSync15(filePath)) return null;
|
|
26321
|
+
try {
|
|
26322
|
+
const raw = readFileSync11(filePath, "utf8");
|
|
26323
|
+
const parsed = JSON.parse(raw);
|
|
26324
|
+
return policyConfigSchema.parse(parsed);
|
|
26325
|
+
} catch {
|
|
26326
|
+
return null;
|
|
26327
|
+
}
|
|
26328
|
+
}
|
|
26329
|
+
function matches(input, override) {
|
|
26330
|
+
if (override.model && override.model !== input.model) return false;
|
|
26331
|
+
if (override.modelFamily && override.modelFamily !== getModelFamily(input.model))
|
|
26332
|
+
return false;
|
|
26333
|
+
if (override.provider && override.provider !== input.provider) return false;
|
|
26334
|
+
if (override.scenario && override.scenario !== input.source) return false;
|
|
26335
|
+
return true;
|
|
26336
|
+
}
|
|
26337
|
+
function selectPolicyOverride(input, config2) {
|
|
26338
|
+
const matched = [...config2.overrides ?? []].reverse().find((item) => matches(input, item));
|
|
26339
|
+
if (matched) {
|
|
26340
|
+
return {
|
|
26341
|
+
reasoningPolicy: matched.reasoningPolicy,
|
|
26342
|
+
normalizeProviderContent: matched.normalizeProviderContent,
|
|
26343
|
+
trimCrossModelMetadata: matched.trimCrossModelMetadata
|
|
26344
|
+
};
|
|
26345
|
+
}
|
|
26346
|
+
if (config2.defaults) {
|
|
26347
|
+
return {
|
|
26348
|
+
reasoningPolicy: config2.defaults.reasoningPolicy,
|
|
26349
|
+
normalizeProviderContent: config2.defaults.normalizeProviderContent,
|
|
26350
|
+
trimCrossModelMetadata: config2.defaults.trimCrossModelMetadata
|
|
26351
|
+
};
|
|
26352
|
+
}
|
|
26353
|
+
return null;
|
|
26354
|
+
}
|
|
26355
|
+
|
|
26356
|
+
// src/services/ai/policyDispatch/index.ts
|
|
26357
|
+
function resolveDefaultReasoningPolicy(model) {
|
|
26358
|
+
const capabilities = getModelCapabilities(model);
|
|
26359
|
+
if (capabilities.apiArchitecture.primary === "responses_api") {
|
|
26360
|
+
return "map_to_provider_options";
|
|
26361
|
+
}
|
|
26362
|
+
return "preserve_reasoning_blocks";
|
|
26363
|
+
}
|
|
26364
|
+
function resolveDefaultNormalizeProviderContent(model) {
|
|
26365
|
+
const capabilities = getModelCapabilities(model);
|
|
26366
|
+
return capabilities.apiArchitecture.primary === "responses_api";
|
|
26367
|
+
}
|
|
26368
|
+
function resolveDefaultTrimCrossModelMetadata(model) {
|
|
26369
|
+
const capabilities = getModelCapabilities(model);
|
|
26370
|
+
return capabilities.apiArchitecture.primary === "responses_api";
|
|
26371
|
+
}
|
|
26372
|
+
function resolveCapabilityDefaults(model) {
|
|
26373
|
+
return {
|
|
26374
|
+
reasoningPolicy: resolveDefaultReasoningPolicy(model),
|
|
26375
|
+
normalizeProviderContent: resolveDefaultNormalizeProviderContent(model),
|
|
26376
|
+
trimCrossModelMetadata: resolveDefaultTrimCrossModelMetadata(model)
|
|
26377
|
+
};
|
|
26378
|
+
}
|
|
26379
|
+
function resolveModelResponsePolicy(input) {
|
|
26380
|
+
const defaults = resolveCapabilityDefaults(input.model);
|
|
26381
|
+
const hasOverride = input.reasoningPolicy !== void 0 || input.normalizeProviderContent !== void 0 || input.trimCrossModelMetadata !== void 0;
|
|
26382
|
+
if (hasOverride) {
|
|
26383
|
+
return {
|
|
26384
|
+
reasoningPolicy: input.reasoningPolicy ?? defaults.reasoningPolicy,
|
|
26385
|
+
normalizeProviderContent: input.normalizeProviderContent ?? defaults.normalizeProviderContent,
|
|
26386
|
+
trimCrossModelMetadata: input.trimCrossModelMetadata ?? defaults.trimCrossModelMetadata,
|
|
26387
|
+
policySource: "context_override"
|
|
26388
|
+
};
|
|
26389
|
+
}
|
|
26390
|
+
const config2 = loadAutoCompactPolicyConfig();
|
|
26391
|
+
const selection = config2 ? selectPolicyOverride(input, config2) : null;
|
|
26392
|
+
if (selection && (selection.reasoningPolicy !== void 0 || selection.normalizeProviderContent !== void 0 || selection.trimCrossModelMetadata !== void 0)) {
|
|
26393
|
+
return {
|
|
26394
|
+
reasoningPolicy: selection.reasoningPolicy ?? defaults.reasoningPolicy,
|
|
26395
|
+
normalizeProviderContent: selection.normalizeProviderContent ?? defaults.normalizeProviderContent,
|
|
26396
|
+
trimCrossModelMetadata: selection.trimCrossModelMetadata ?? defaults.trimCrossModelMetadata,
|
|
26397
|
+
policySource: "policy_config"
|
|
26398
|
+
};
|
|
26399
|
+
}
|
|
26400
|
+
return {
|
|
26401
|
+
reasoningPolicy: defaults.reasoningPolicy,
|
|
26402
|
+
normalizeProviderContent: defaults.normalizeProviderContent,
|
|
26403
|
+
trimCrossModelMetadata: defaults.trimCrossModelMetadata,
|
|
26404
|
+
policySource: "model_capabilities"
|
|
26405
|
+
};
|
|
26406
|
+
}
|
|
26407
|
+
|
|
26408
|
+
// src/services/ai/streamTyped/partTypes.ts
|
|
26409
|
+
import { z as z12 } from "zod";
|
|
26410
|
+
var SOURCE_VALUES = ["auto_compact"];
|
|
26411
|
+
var TOOL_STATUS_VALUES = ["pending", "running", "completed", "failed", "interrupted"];
|
|
26412
|
+
var textPayloadSchema = z12.object({
|
|
26413
|
+
text: z12.string().min(1)
|
|
26414
|
+
});
|
|
26415
|
+
var reasoningPayloadSchema = z12.object({
|
|
26416
|
+
text: z12.string().min(1)
|
|
26417
|
+
});
|
|
26418
|
+
var toolPayloadSchema = z12.object({
|
|
26419
|
+
toolName: z12.string().min(1),
|
|
26420
|
+
toolCallId: z12.string().min(1),
|
|
26421
|
+
status: z12.enum(TOOL_STATUS_VALUES),
|
|
26422
|
+
outputText: z12.string().optional()
|
|
26423
|
+
});
|
|
26424
|
+
var streamTypedPartBaseSchema = z12.object({
|
|
26425
|
+
id: z12.string().min(1),
|
|
26426
|
+
requestId: z12.string().min(1),
|
|
26427
|
+
source: z12.enum(SOURCE_VALUES),
|
|
26428
|
+
timestamp: z12.number().int().positive()
|
|
26429
|
+
});
|
|
26430
|
+
var streamTypedPartSchema = z12.discriminatedUnion("partType", [
|
|
26431
|
+
streamTypedPartBaseSchema.extend({
|
|
26432
|
+
partType: z12.literal("text"),
|
|
26433
|
+
payload: textPayloadSchema
|
|
26434
|
+
}),
|
|
26435
|
+
streamTypedPartBaseSchema.extend({
|
|
26436
|
+
partType: z12.literal("reasoning"),
|
|
26437
|
+
payload: reasoningPayloadSchema
|
|
26438
|
+
}),
|
|
26439
|
+
streamTypedPartBaseSchema.extend({
|
|
26440
|
+
partType: z12.literal("tool"),
|
|
26441
|
+
payload: toolPayloadSchema
|
|
26442
|
+
})
|
|
26443
|
+
]);
|
|
26444
|
+
function createId() {
|
|
26445
|
+
return `stp_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
|
26446
|
+
}
|
|
26447
|
+
function createBase(input) {
|
|
26448
|
+
return {
|
|
26449
|
+
id: createId(),
|
|
26450
|
+
requestId: input.requestId,
|
|
26451
|
+
source: "auto_compact",
|
|
26452
|
+
timestamp: Date.now()
|
|
26453
|
+
};
|
|
26454
|
+
}
|
|
26455
|
+
function createTextPart(input) {
|
|
26456
|
+
return streamTypedPartSchema.parse({
|
|
26457
|
+
...createBase(input),
|
|
26458
|
+
partType: "text",
|
|
26459
|
+
payload: {
|
|
26460
|
+
text: input.text.trim()
|
|
26461
|
+
}
|
|
26462
|
+
});
|
|
26463
|
+
}
|
|
26464
|
+
function createReasoningPart(input) {
|
|
26465
|
+
return streamTypedPartSchema.parse({
|
|
26466
|
+
...createBase(input),
|
|
26467
|
+
partType: "reasoning",
|
|
26468
|
+
payload: {
|
|
26469
|
+
text: input.text.trim()
|
|
26470
|
+
}
|
|
26471
|
+
});
|
|
26472
|
+
}
|
|
26473
|
+
function createToolPart(input) {
|
|
26474
|
+
return streamTypedPartSchema.parse({
|
|
26475
|
+
...createBase(input),
|
|
26476
|
+
partType: "tool",
|
|
26477
|
+
payload: {
|
|
26478
|
+
toolName: input.toolName,
|
|
26479
|
+
toolCallId: input.toolCallId,
|
|
26480
|
+
status: input.status,
|
|
26481
|
+
...input.outputText ? { outputText: input.outputText } : {}
|
|
26482
|
+
}
|
|
26483
|
+
});
|
|
26484
|
+
}
|
|
26485
|
+
|
|
26486
|
+
// src/services/ai/streamTyped/eventAssembler.ts
|
|
26487
|
+
function createAssemblerState(requestId) {
|
|
26488
|
+
return {
|
|
26489
|
+
requestId,
|
|
26490
|
+
parts: [],
|
|
26491
|
+
textBuffer: {},
|
|
26492
|
+
reasoningBuffer: {},
|
|
26493
|
+
toolMap: {}
|
|
26494
|
+
};
|
|
26495
|
+
}
|
|
26496
|
+
function onTextStart(event, state) {
|
|
26497
|
+
state.textBuffer[event.textId] = "";
|
|
26498
|
+
}
|
|
26499
|
+
function onTextDelta(event, state) {
|
|
26500
|
+
const current = state.textBuffer[event.textId] ?? "";
|
|
26501
|
+
state.textBuffer[event.textId] = `${current}${event.text}`;
|
|
26502
|
+
}
|
|
26503
|
+
function onTextEnd(event, state) {
|
|
26504
|
+
const text = String(state.textBuffer[event.textId] ?? "").trim();
|
|
26505
|
+
delete state.textBuffer[event.textId];
|
|
26506
|
+
if (!text) return;
|
|
26507
|
+
state.parts.push(
|
|
26508
|
+
createTextPart({
|
|
26509
|
+
requestId: state.requestId,
|
|
26510
|
+
text
|
|
26511
|
+
})
|
|
26512
|
+
);
|
|
26513
|
+
}
|
|
26514
|
+
function onReasoningStart(event, state) {
|
|
26515
|
+
state.reasoningBuffer[event.reasoningId] = "";
|
|
26516
|
+
}
|
|
26517
|
+
function onReasoningDelta(event, state) {
|
|
26518
|
+
const current = state.reasoningBuffer[event.reasoningId] ?? "";
|
|
26519
|
+
state.reasoningBuffer[event.reasoningId] = `${current}${event.text}`;
|
|
26520
|
+
}
|
|
26521
|
+
function onReasoningEnd(event, state) {
|
|
26522
|
+
const text = String(state.reasoningBuffer[event.reasoningId] ?? "").trim();
|
|
26523
|
+
delete state.reasoningBuffer[event.reasoningId];
|
|
26524
|
+
if (!text) return;
|
|
26525
|
+
state.parts.push(
|
|
26526
|
+
createReasoningPart({
|
|
26527
|
+
requestId: state.requestId,
|
|
26528
|
+
text
|
|
26529
|
+
})
|
|
26530
|
+
);
|
|
26531
|
+
}
|
|
26532
|
+
function onToolCall(event, state) {
|
|
26533
|
+
state.toolMap[event.toolCallId] = { toolName: event.toolName };
|
|
26534
|
+
}
|
|
26535
|
+
function onToolResult(event, state) {
|
|
26536
|
+
const toolName = state.toolMap[event.toolCallId]?.toolName ?? "unknown";
|
|
26537
|
+
state.parts.push(
|
|
26538
|
+
createToolPart({
|
|
26539
|
+
requestId: state.requestId,
|
|
26540
|
+
toolName,
|
|
26541
|
+
toolCallId: event.toolCallId,
|
|
26542
|
+
status: event.status,
|
|
26543
|
+
outputText: event.outputText
|
|
26544
|
+
})
|
|
26545
|
+
);
|
|
26546
|
+
delete state.toolMap[event.toolCallId];
|
|
26547
|
+
}
|
|
26548
|
+
function flushTypedParts(state) {
|
|
26549
|
+
const parts = state.parts.slice();
|
|
26550
|
+
state.parts.length = 0;
|
|
26551
|
+
return parts;
|
|
26552
|
+
}
|
|
26553
|
+
|
|
26554
|
+
// src/services/ai/streamTyped/partStore.ts
|
|
26555
|
+
import { appendFileSync, existsSync as existsSync16, mkdirSync as mkdirSync7, readFileSync as readFileSync12 } from "fs";
|
|
26556
|
+
import { dirname as dirname9 } from "path";
|
|
26557
|
+
function getStreamTypedOutputFilePath() {
|
|
26558
|
+
return resolveXdgCachePath("telemetry/stream-typed-parts.jsonl");
|
|
26559
|
+
}
|
|
26560
|
+
function validateTypedPartRecord(record) {
|
|
26561
|
+
return streamTypedPartSchema.safeParse(record).success;
|
|
26562
|
+
}
|
|
26563
|
+
function readAllValidParts(outputFilePath) {
|
|
26564
|
+
if (!existsSync16(outputFilePath)) return [];
|
|
26565
|
+
const raw = readFileSync12(outputFilePath, "utf8");
|
|
26566
|
+
const lines = raw.split("\n").map((line) => line.trim()).filter(Boolean);
|
|
26567
|
+
const parts = [];
|
|
26568
|
+
for (const line of lines) {
|
|
26569
|
+
try {
|
|
26570
|
+
const parsed = JSON.parse(line);
|
|
26571
|
+
if (!validateTypedPartRecord(parsed)) continue;
|
|
26572
|
+
parts.push(parsed);
|
|
26573
|
+
} catch {
|
|
26574
|
+
continue;
|
|
26575
|
+
}
|
|
26576
|
+
}
|
|
26577
|
+
return parts;
|
|
26578
|
+
}
|
|
26579
|
+
function appendTypedParts(options) {
|
|
26580
|
+
if (!Array.isArray(options.parts) || options.parts.length === 0) {
|
|
26581
|
+
return { appended: 0 };
|
|
26582
|
+
}
|
|
26583
|
+
const outputFilePath = options.outputFilePath ?? getStreamTypedOutputFilePath();
|
|
26584
|
+
if (!existsSync16(dirname9(outputFilePath))) {
|
|
26585
|
+
mkdirSync7(dirname9(outputFilePath), { recursive: true });
|
|
26586
|
+
}
|
|
26587
|
+
const existingIds = new Set(readAllValidParts(outputFilePath).map((item) => item.id));
|
|
26588
|
+
const toAppend = options.parts.filter(
|
|
26589
|
+
(item) => validateTypedPartRecord(item) && !existingIds.has(item.id)
|
|
26590
|
+
);
|
|
26591
|
+
if (toAppend.length === 0) return { appended: 0 };
|
|
26592
|
+
appendFileSync(
|
|
26593
|
+
outputFilePath,
|
|
26594
|
+
`${toAppend.map((item) => JSON.stringify(item)).join("\n")}
|
|
26595
|
+
`
|
|
26596
|
+
);
|
|
26597
|
+
return { appended: toAppend.length };
|
|
26598
|
+
}
|
|
26599
|
+
|
|
26600
|
+
// src/services/ai/streamTyped/index.ts
|
|
26601
|
+
var streamTypedBuffer = /* @__PURE__ */ new Map();
|
|
26602
|
+
function emitTypedPart(event) {
|
|
26603
|
+
const requestId = String(event.requestId || "").trim();
|
|
26604
|
+
if (!requestId) return;
|
|
26605
|
+
const current = streamTypedBuffer.get(requestId) ?? [];
|
|
26606
|
+
current.push(event.part);
|
|
26607
|
+
streamTypedBuffer.set(requestId, current);
|
|
26608
|
+
}
|
|
26609
|
+
function flushTypedPartBuffer(options) {
|
|
26610
|
+
const requestId = String(options.requestId || "").trim();
|
|
26611
|
+
if (!requestId) return { appended: 0 };
|
|
26612
|
+
const parts = streamTypedBuffer.get(requestId) ?? [];
|
|
26613
|
+
streamTypedBuffer.delete(requestId);
|
|
26614
|
+
return appendTypedParts({
|
|
26615
|
+
outputFilePath: options.outputFilePath,
|
|
26616
|
+
parts
|
|
26617
|
+
});
|
|
26618
|
+
}
|
|
26619
|
+
|
|
26620
|
+
// src/services/ai/streamTyped/replay.ts
|
|
26621
|
+
function toNonEmptyText(value) {
|
|
26622
|
+
const text = String(value ?? "").trim();
|
|
26623
|
+
return text.length > 0 ? text : null;
|
|
26624
|
+
}
|
|
26625
|
+
function buildSummaryFromTypedParts(parts) {
|
|
26626
|
+
const textBlocks = [];
|
|
26627
|
+
let reasoningPartCount = 0;
|
|
26628
|
+
for (const part of parts) {
|
|
26629
|
+
if (!part || typeof part !== "object") continue;
|
|
26630
|
+
if (part.partType === "reasoning") {
|
|
26631
|
+
reasoningPartCount += 1;
|
|
26632
|
+
continue;
|
|
26633
|
+
}
|
|
26634
|
+
if (part.partType !== "text") continue;
|
|
26635
|
+
const text = toNonEmptyText(part.payload?.text);
|
|
26636
|
+
if (text) textBlocks.push(text);
|
|
26637
|
+
}
|
|
26638
|
+
if (textBlocks.length === 0) {
|
|
26639
|
+
return {
|
|
26640
|
+
isComplete: false,
|
|
26641
|
+
summaryText: null,
|
|
26642
|
+
reason: "no_text_parts",
|
|
26643
|
+
textPartCount: 0,
|
|
26644
|
+
reasoningPartCount
|
|
26645
|
+
};
|
|
26646
|
+
}
|
|
26647
|
+
return {
|
|
26648
|
+
isComplete: true,
|
|
26649
|
+
summaryText: textBlocks.join("\n"),
|
|
26650
|
+
reason: "typed_text_joined",
|
|
26651
|
+
textPartCount: textBlocks.length,
|
|
26652
|
+
reasoningPartCount
|
|
26653
|
+
};
|
|
26654
|
+
}
|
|
26655
|
+
function resolveTypedReplayResult(input) {
|
|
26656
|
+
if (!input.enabled) {
|
|
26657
|
+
return {
|
|
26658
|
+
isComplete: false,
|
|
26659
|
+
summaryText: null,
|
|
26660
|
+
reason: "typed_read_disabled",
|
|
26661
|
+
textPartCount: 0,
|
|
26662
|
+
reasoningPartCount: 0
|
|
26663
|
+
};
|
|
26664
|
+
}
|
|
26665
|
+
return buildSummaryFromTypedParts(input.parts ?? []);
|
|
26666
|
+
}
|
|
26667
|
+
|
|
26668
|
+
// src/utils/session/autoCompactFailurePolicy.ts
|
|
26669
|
+
var AUTO_COMPACT_CLASSIFICATION_VERSION = "c1-v1";
|
|
26670
|
+
function getFailureStatus(error) {
|
|
26671
|
+
const status = error?.status;
|
|
26672
|
+
if (typeof status === "number") return status;
|
|
26673
|
+
return void 0;
|
|
26674
|
+
}
|
|
26675
|
+
function classifyAutoCompactFailure(error) {
|
|
26676
|
+
const message = error instanceof Error ? error.message : String(error ?? "Unknown error");
|
|
26677
|
+
const status = getFailureStatus(error);
|
|
26678
|
+
const lower = message.toLowerCase();
|
|
26679
|
+
if (lower.includes("did not contain valid text content") || lower.includes("invalid content shape")) {
|
|
26680
|
+
return { failureType: "invalid_content_shape", message, status };
|
|
26681
|
+
}
|
|
26682
|
+
if (typeof status === "number" && status >= 500 || /\bhttp\s+5\d\d\b/i.test(message)) {
|
|
26683
|
+
return { failureType: "provider_5xx", message, status };
|
|
26684
|
+
}
|
|
26685
|
+
if (lower.includes("not configured") || lower.includes("misconfigured") || lower.includes("fallback failed")) {
|
|
26686
|
+
return { failureType: "model_misconfigured", message, status };
|
|
26687
|
+
}
|
|
26688
|
+
return { failureType: "unknown", message, status };
|
|
26689
|
+
}
|
|
26690
|
+
function decideAutoCompactRecovery(params) {
|
|
26691
|
+
const hasNextAttempt = params.attempt < params.maxAttempts;
|
|
26692
|
+
if (!hasNextAttempt) return "abort";
|
|
26693
|
+
if (params.failureType === "invalid_content_shape") return "retry_reextract";
|
|
26694
|
+
if (params.failureType === "provider_5xx") return "retry_backoff";
|
|
26695
|
+
if (params.failureType === "model_misconfigured" && params.activeModelPointer === "compact" && params.hasMainModelProfile) {
|
|
26696
|
+
return "fallback_main";
|
|
26697
|
+
}
|
|
26698
|
+
return "abort";
|
|
26699
|
+
}
|
|
26700
|
+
function getStatusBucket(status) {
|
|
26701
|
+
if (typeof status !== "number") return "none";
|
|
26702
|
+
if (status >= 500 && status <= 599) return "5xx";
|
|
26703
|
+
if (status >= 400 && status <= 499) return "4xx";
|
|
26704
|
+
return "other";
|
|
26705
|
+
}
|
|
26706
|
+
function buildAutoCompactAggregationFields(params) {
|
|
26707
|
+
const statusBucket = getStatusBucket(params.status);
|
|
26708
|
+
const modelPointer = params.modelPointer ?? "unknown";
|
|
26709
|
+
return {
|
|
26710
|
+
source: "auto_compact",
|
|
26711
|
+
classificationVersion: AUTO_COMPACT_CLASSIFICATION_VERSION,
|
|
26712
|
+
failureType: params.failureType,
|
|
26713
|
+
status: params.status,
|
|
26714
|
+
statusBucket,
|
|
26715
|
+
modelPointer,
|
|
26716
|
+
aggregateKey: `auto_compact:${params.failureType}:${modelPointer}:${statusBucket}`
|
|
26717
|
+
};
|
|
26718
|
+
}
|
|
26719
|
+
|
|
25931
26720
|
// src/utils/session/autoCompactCore.ts
|
|
25932
26721
|
async function getMainConversationContextLimit() {
|
|
25933
26722
|
try {
|
|
@@ -25977,6 +26766,10 @@ var CONVERSATION_SUMMARY_LIMITS = {
|
|
|
25977
26766
|
maxTotalChars: 2e3
|
|
25978
26767
|
};
|
|
25979
26768
|
var MAX_COMPACTED_QUERY_IDS = 10;
|
|
26769
|
+
var AUTO_COMPACT_CHAIN_RETRY_DELAY_MS = 250;
|
|
26770
|
+
function wait(ms) {
|
|
26771
|
+
return new Promise((resolve12) => setTimeout(resolve12, ms));
|
|
26772
|
+
}
|
|
25980
26773
|
function getMessageText(message) {
|
|
25981
26774
|
if (!message || typeof message !== "object") return null;
|
|
25982
26775
|
if (message.type !== "user" && message.type !== "assistant") return null;
|
|
@@ -26026,6 +26819,117 @@ async function shouldAutoCompact(messages) {
|
|
|
26026
26819
|
const { isAboveAutoCompactThreshold } = await calculateThresholds(tokenCount);
|
|
26027
26820
|
return isAboveAutoCompactThreshold;
|
|
26028
26821
|
}
|
|
26822
|
+
function getSummaryContentDiagnostics(content) {
|
|
26823
|
+
if (typeof content === "string") {
|
|
26824
|
+
return {
|
|
26825
|
+
contentKind: "string",
|
|
26826
|
+
stringLength: content.length,
|
|
26827
|
+
preview: content.slice(0, 120)
|
|
26828
|
+
};
|
|
26829
|
+
}
|
|
26830
|
+
if (Array.isArray(content)) {
|
|
26831
|
+
return {
|
|
26832
|
+
contentKind: "array",
|
|
26833
|
+
blockCount: content.length,
|
|
26834
|
+
blockTypes: content.map(
|
|
26835
|
+
(block) => block && typeof block === "object" ? String(block.type ?? "unknown") : typeof block
|
|
26836
|
+
),
|
|
26837
|
+
firstBlock: content[0]
|
|
26838
|
+
};
|
|
26839
|
+
}
|
|
26840
|
+
return {
|
|
26841
|
+
contentKind: typeof content,
|
|
26842
|
+
value: content
|
|
26843
|
+
};
|
|
26844
|
+
}
|
|
26845
|
+
function extractToolResultText(content) {
|
|
26846
|
+
if (typeof content === "string") return content;
|
|
26847
|
+
if (!Array.isArray(content)) return "";
|
|
26848
|
+
return content.filter((block) => block && typeof block === "object" && block.type === "text").map((block) => String(block.text ?? "")).join("\n");
|
|
26849
|
+
}
|
|
26850
|
+
function parseBooleanFlag(value) {
|
|
26851
|
+
const raw = String(value ?? "").trim().toLowerCase();
|
|
26852
|
+
if (["1", "true", "yes", "on"].includes(raw)) return true;
|
|
26853
|
+
if (["0", "false", "no", "off"].includes(raw)) return false;
|
|
26854
|
+
return null;
|
|
26855
|
+
}
|
|
26856
|
+
function resolveTypedReadPathConfig(toolUseContext) {
|
|
26857
|
+
const envValue = parseBooleanFlag(
|
|
26858
|
+
process.env.PYB_AUTO_COMPACT_TYPED_READ_PATH_ENABLED
|
|
26859
|
+
);
|
|
26860
|
+
if (envValue !== null) {
|
|
26861
|
+
return {
|
|
26862
|
+
enabled: envValue,
|
|
26863
|
+
source: "env"
|
|
26864
|
+
};
|
|
26865
|
+
}
|
|
26866
|
+
if (typeof toolUseContext?.typedPathEnabled === "boolean") {
|
|
26867
|
+
return {
|
|
26868
|
+
enabled: toolUseContext.typedPathEnabled,
|
|
26869
|
+
source: "context"
|
|
26870
|
+
};
|
|
26871
|
+
}
|
|
26872
|
+
return {
|
|
26873
|
+
enabled: false,
|
|
26874
|
+
source: "default"
|
|
26875
|
+
};
|
|
26876
|
+
}
|
|
26877
|
+
function normalizeSummaryForComparison(summary) {
|
|
26878
|
+
return String(summary ?? "").replace(/\r\n/g, "\n").replace(/[ \t]+/g, " ").split("\n").map((line) => line.trim()).join("\n").trim();
|
|
26879
|
+
}
|
|
26880
|
+
function emitStreamTypedPartsFromContent(content, requestId) {
|
|
26881
|
+
const state = createAssemblerState(requestId);
|
|
26882
|
+
if (typeof content === "string") {
|
|
26883
|
+
onTextStart({ textId: "text-0" }, state);
|
|
26884
|
+
onTextDelta({ textId: "text-0", text: content }, state);
|
|
26885
|
+
onTextEnd({ textId: "text-0" }, state);
|
|
26886
|
+
} else if (Array.isArray(content)) {
|
|
26887
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
26888
|
+
const block = content[i];
|
|
26889
|
+
if (!block || typeof block !== "object") continue;
|
|
26890
|
+
const type3 = String(block.type ?? "");
|
|
26891
|
+
if (type3 === "text") {
|
|
26892
|
+
const text = String(block.text ?? "");
|
|
26893
|
+
onTextStart({ textId: `text-${i}` }, state);
|
|
26894
|
+
onTextDelta({ textId: `text-${i}`, text }, state);
|
|
26895
|
+
onTextEnd({ textId: `text-${i}` }, state);
|
|
26896
|
+
continue;
|
|
26897
|
+
}
|
|
26898
|
+
if (type3 === "thinking" || type3 === "reasoning") {
|
|
26899
|
+
const text = String(
|
|
26900
|
+
block.thinking ?? block.reasoning ?? ""
|
|
26901
|
+
);
|
|
26902
|
+
onReasoningStart({ reasoningId: `reasoning-${i}` }, state);
|
|
26903
|
+
onReasoningDelta({ reasoningId: `reasoning-${i}`, text }, state);
|
|
26904
|
+
onReasoningEnd({ reasoningId: `reasoning-${i}` }, state);
|
|
26905
|
+
continue;
|
|
26906
|
+
}
|
|
26907
|
+
if (type3 === "tool_use") {
|
|
26908
|
+
const toolCallId = String(block.id ?? `tool-${i}`);
|
|
26909
|
+
const toolName = String(block.name ?? "unknown");
|
|
26910
|
+
onToolCall({ toolCallId, toolName }, state);
|
|
26911
|
+
continue;
|
|
26912
|
+
}
|
|
26913
|
+
if (type3 === "tool_result") {
|
|
26914
|
+
const toolCallId = String(block.tool_use_id ?? `tool-${i}`);
|
|
26915
|
+
const outputText = extractToolResultText(block.content);
|
|
26916
|
+
onToolResult(
|
|
26917
|
+
{
|
|
26918
|
+
toolCallId,
|
|
26919
|
+
status: block.is_error ? "failed" : "completed",
|
|
26920
|
+
outputText
|
|
26921
|
+
},
|
|
26922
|
+
state
|
|
26923
|
+
);
|
|
26924
|
+
}
|
|
26925
|
+
}
|
|
26926
|
+
}
|
|
26927
|
+
const emittedParts = flushTypedParts(state);
|
|
26928
|
+
for (const part of emittedParts) {
|
|
26929
|
+
emitTypedPart({ requestId, part });
|
|
26930
|
+
}
|
|
26931
|
+
return emittedParts;
|
|
26932
|
+
}
|
|
26029
26933
|
async function checkAutoCompact(messages, toolUseContext) {
|
|
26030
26934
|
if (!await shouldAutoCompact(messages)) {
|
|
26031
26935
|
return { messages, wasCompacted: false };
|
|
@@ -26047,14 +26951,28 @@ async function checkAutoCompact(messages, toolUseContext) {
|
|
|
26047
26951
|
wasCompacted: true
|
|
26048
26952
|
};
|
|
26049
26953
|
} catch (error) {
|
|
26050
|
-
|
|
26051
|
-
|
|
26052
|
-
|
|
26954
|
+
const classified = classifyAutoCompactFailure(error);
|
|
26955
|
+
const aggregation = buildAutoCompactAggregationFields({
|
|
26956
|
+
failureType: classified.failureType,
|
|
26957
|
+
status: classified.status,
|
|
26958
|
+
modelPointer: error?.modelPointer
|
|
26053
26959
|
});
|
|
26960
|
+
const failurePayload = {
|
|
26961
|
+
error: classified.message,
|
|
26962
|
+
failureType: classified.failureType,
|
|
26963
|
+
status: classified.status,
|
|
26964
|
+
modelPointer: error?.modelPointer,
|
|
26965
|
+
attempts: error?.attempts,
|
|
26966
|
+
...aggregation
|
|
26967
|
+
};
|
|
26968
|
+
logError(error);
|
|
26969
|
+
debug.warn("AUTO_COMPACT_FAILED", failurePayload);
|
|
26970
|
+
emitAutoCompactTelemetryEvent("AUTO_COMPACT_FAILED", failurePayload);
|
|
26054
26971
|
return { messages, wasCompacted: false };
|
|
26055
26972
|
}
|
|
26056
26973
|
}
|
|
26057
26974
|
async function executeAutoCompact(messages, toolUseContext, options) {
|
|
26975
|
+
const typedRequestId = `auto_compact_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
|
26058
26976
|
const previousSummary = findLatestAutoCompactSummary(messages);
|
|
26059
26977
|
const summaryRequestContent = previousSummary ? `We already have an existing conversation summary:
|
|
26060
26978
|
|
|
@@ -26090,26 +27008,201 @@ ${COMPRESSION_PROMPT2}` : COMPRESSION_PROMPT2;
|
|
|
26090
27008
|
mainResolution.error || "Compression fallback failed: model pointer 'main' is not configured."
|
|
26091
27009
|
);
|
|
26092
27010
|
}
|
|
26093
|
-
|
|
26094
|
-
|
|
26095
|
-
|
|
26096
|
-
|
|
26097
|
-
|
|
26098
|
-
|
|
26099
|
-
|
|
26100
|
-
|
|
26101
|
-
|
|
26102
|
-
|
|
26103
|
-
|
|
26104
|
-
|
|
27011
|
+
let summaryResponse = null;
|
|
27012
|
+
let attempts = 0;
|
|
27013
|
+
let activeModelPointer = compressionModelPointer;
|
|
27014
|
+
const typedPath = resolveTypedReadPathConfig(toolUseContext);
|
|
27015
|
+
while (attempts < 2) {
|
|
27016
|
+
attempts += 1;
|
|
27017
|
+
try {
|
|
27018
|
+
const summaryCandidate = await queryLLM(
|
|
27019
|
+
normalizeMessagesForAPI([...messagesForSummary, summaryRequest]),
|
|
27020
|
+
[
|
|
27021
|
+
"You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work."
|
|
27022
|
+
],
|
|
27023
|
+
0,
|
|
27024
|
+
[],
|
|
27025
|
+
toolUseContext.abortController.signal,
|
|
27026
|
+
{
|
|
27027
|
+
safeMode: false,
|
|
27028
|
+
model: activeModelPointer,
|
|
27029
|
+
prependCLISysprompt: true,
|
|
27030
|
+
firstMode: toolUseContext?.firstMode
|
|
27031
|
+
}
|
|
27032
|
+
);
|
|
27033
|
+
const content = summaryCandidate.message.content;
|
|
27034
|
+
const activeModelName = activeModelPointer === "compact" ? compactResolution.success && compactResolution.profile ? compactResolution.profile.name : "compact" : mainResolution.success && mainResolution.profile ? mainResolution.profile.name : "main";
|
|
27035
|
+
const resolvedPolicy = resolveModelResponsePolicy({
|
|
27036
|
+
source: "auto_compact",
|
|
27037
|
+
model: activeModelName,
|
|
27038
|
+
provider: "openai"
|
|
27039
|
+
});
|
|
27040
|
+
const canonicalResult = normalizeModelResponseContent(content, {
|
|
27041
|
+
source: "auto_compact",
|
|
27042
|
+
model: activeModelName,
|
|
27043
|
+
provider: "openai",
|
|
27044
|
+
reasoningPolicy: resolvedPolicy.reasoningPolicy,
|
|
27045
|
+
policySource: resolvedPolicy.policySource
|
|
27046
|
+
});
|
|
27047
|
+
let emittedTypedParts = [];
|
|
27048
|
+
try {
|
|
27049
|
+
emittedTypedParts = emitStreamTypedPartsFromContent(content, typedRequestId);
|
|
27050
|
+
} catch {
|
|
27051
|
+
}
|
|
27052
|
+
const typedReplay = resolveTypedReplayResult({
|
|
27053
|
+
enabled: typedPath.enabled,
|
|
27054
|
+
parts: emittedTypedParts
|
|
27055
|
+
});
|
|
27056
|
+
const canonicalSummary = canonicalResult.summaryText;
|
|
27057
|
+
let summary = canonicalSummary;
|
|
27058
|
+
if (typedPath.enabled && typedReplay.isComplete && typedReplay.summaryText) {
|
|
27059
|
+
summary = typedReplay.summaryText;
|
|
27060
|
+
const typedAppliedPayload = {
|
|
27061
|
+
mode: "typed",
|
|
27062
|
+
pathSource: typedPath.source,
|
|
27063
|
+
reason: typedReplay.reason,
|
|
27064
|
+
textPartCount: typedReplay.textPartCount,
|
|
27065
|
+
reasoningPartCount: typedReplay.reasoningPartCount
|
|
27066
|
+
};
|
|
27067
|
+
debug.warn("AUTO_COMPACT_TYPED_PATH_APPLIED", typedAppliedPayload);
|
|
27068
|
+
emitAutoCompactTelemetryEvent(
|
|
27069
|
+
"AUTO_COMPACT_TYPED_PATH_APPLIED",
|
|
27070
|
+
typedAppliedPayload
|
|
27071
|
+
);
|
|
27072
|
+
if (normalizeSummaryForComparison(canonicalSummary) !== normalizeSummaryForComparison(summary)) {
|
|
27073
|
+
const divergencePayload = {
|
|
27074
|
+
canonicalLength: String(canonicalSummary ?? "").length,
|
|
27075
|
+
typedLength: String(summary ?? "").length
|
|
27076
|
+
};
|
|
27077
|
+
debug.warn(
|
|
27078
|
+
"AUTO_COMPACT_TYPED_SUMMARY_DIVERGENCE",
|
|
27079
|
+
divergencePayload
|
|
27080
|
+
);
|
|
27081
|
+
emitAutoCompactTelemetryEvent(
|
|
27082
|
+
"AUTO_COMPACT_TYPED_SUMMARY_DIVERGENCE",
|
|
27083
|
+
divergencePayload
|
|
27084
|
+
);
|
|
27085
|
+
}
|
|
27086
|
+
} else if (typedPath.enabled) {
|
|
27087
|
+
const typedAppliedPayload = {
|
|
27088
|
+
mode: "canonical_fallback",
|
|
27089
|
+
pathSource: typedPath.source,
|
|
27090
|
+
reason: typedReplay.reason,
|
|
27091
|
+
textPartCount: typedReplay.textPartCount,
|
|
27092
|
+
reasoningPartCount: typedReplay.reasoningPartCount
|
|
27093
|
+
};
|
|
27094
|
+
debug.warn("AUTO_COMPACT_TYPED_PATH_APPLIED", typedAppliedPayload);
|
|
27095
|
+
emitAutoCompactTelemetryEvent(
|
|
27096
|
+
"AUTO_COMPACT_TYPED_PATH_APPLIED",
|
|
27097
|
+
typedAppliedPayload
|
|
27098
|
+
);
|
|
27099
|
+
} else {
|
|
27100
|
+
const typedAppliedPayload = {
|
|
27101
|
+
mode: "canonical_disabled",
|
|
27102
|
+
pathSource: typedPath.source
|
|
27103
|
+
};
|
|
27104
|
+
debug.warn("AUTO_COMPACT_TYPED_PATH_APPLIED", typedAppliedPayload);
|
|
27105
|
+
emitAutoCompactTelemetryEvent(
|
|
27106
|
+
"AUTO_COMPACT_TYPED_PATH_APPLIED",
|
|
27107
|
+
typedAppliedPayload
|
|
27108
|
+
);
|
|
27109
|
+
}
|
|
27110
|
+
if (!summary) {
|
|
27111
|
+
debug.warn("AUTO_COMPACT_SUMMARY_CONTENT_INVALID", {
|
|
27112
|
+
model: activeModelPointer,
|
|
27113
|
+
diagnostics: getSummaryContentDiagnostics(content),
|
|
27114
|
+
canonicalDiagnostics: {
|
|
27115
|
+
textBlockCount: canonicalResult.textBlocks.length,
|
|
27116
|
+
reasoningBlockCount: canonicalResult.reasoningBlocks.length,
|
|
27117
|
+
blockTypes: canonicalResult.blockTypes,
|
|
27118
|
+
failureType: canonicalResult.failureType
|
|
27119
|
+
},
|
|
27120
|
+
attempt: attempts
|
|
27121
|
+
});
|
|
27122
|
+
throw new Error(
|
|
27123
|
+
"Failed to generate conversation summary - response did not contain valid text content"
|
|
27124
|
+
);
|
|
27125
|
+
}
|
|
27126
|
+
summaryResponse = summaryCandidate;
|
|
27127
|
+
break;
|
|
27128
|
+
} catch (error) {
|
|
27129
|
+
const classified = classifyAutoCompactFailure(error);
|
|
27130
|
+
const recoveryAction = decideAutoCompactRecovery({
|
|
27131
|
+
failureType: classified.failureType,
|
|
27132
|
+
attempt: attempts,
|
|
27133
|
+
maxAttempts: 2,
|
|
27134
|
+
activeModelPointer,
|
|
27135
|
+
hasMainModelProfile: Boolean(mainResolution.success && mainResolution.profile)
|
|
27136
|
+
});
|
|
27137
|
+
if (recoveryAction === "retry_reextract") {
|
|
27138
|
+
const aggregation = buildAutoCompactAggregationFields({
|
|
27139
|
+
failureType: classified.failureType,
|
|
27140
|
+
status: classified.status,
|
|
27141
|
+
modelPointer: activeModelPointer
|
|
27142
|
+
});
|
|
27143
|
+
const retryPayload = {
|
|
27144
|
+
failureType: classified.failureType,
|
|
27145
|
+
attempt: attempts,
|
|
27146
|
+
strategy: "reextract_once",
|
|
27147
|
+
...aggregation
|
|
27148
|
+
};
|
|
27149
|
+
debug.warn("AUTO_COMPACT_RETRY", retryPayload);
|
|
27150
|
+
emitAutoCompactTelemetryEvent("AUTO_COMPACT_RETRY", retryPayload);
|
|
27151
|
+
continue;
|
|
27152
|
+
}
|
|
27153
|
+
if (recoveryAction === "retry_backoff") {
|
|
27154
|
+
const aggregation = buildAutoCompactAggregationFields({
|
|
27155
|
+
failureType: classified.failureType,
|
|
27156
|
+
status: classified.status,
|
|
27157
|
+
modelPointer: activeModelPointer
|
|
27158
|
+
});
|
|
27159
|
+
const retryPayload = {
|
|
27160
|
+
failureType: classified.failureType,
|
|
27161
|
+
attempt: attempts,
|
|
27162
|
+
status: classified.status,
|
|
27163
|
+
strategy: "retry_with_backoff",
|
|
27164
|
+
...aggregation
|
|
27165
|
+
};
|
|
27166
|
+
debug.warn("AUTO_COMPACT_RETRY", retryPayload);
|
|
27167
|
+
emitAutoCompactTelemetryEvent("AUTO_COMPACT_RETRY", retryPayload);
|
|
27168
|
+
await wait(AUTO_COMPACT_CHAIN_RETRY_DELAY_MS);
|
|
27169
|
+
continue;
|
|
27170
|
+
}
|
|
27171
|
+
if (recoveryAction === "fallback_main") {
|
|
27172
|
+
activeModelPointer = "main";
|
|
27173
|
+
if (!compressionNotice) {
|
|
27174
|
+
compressionNotice = "Compression fallback applied: compact model unavailable, switched to 'main'.";
|
|
27175
|
+
}
|
|
27176
|
+
const aggregation = buildAutoCompactAggregationFields({
|
|
27177
|
+
failureType: classified.failureType,
|
|
27178
|
+
status: classified.status,
|
|
27179
|
+
modelPointer: "compact"
|
|
27180
|
+
});
|
|
27181
|
+
const fallbackPayload = {
|
|
27182
|
+
failureType: classified.failureType,
|
|
27183
|
+
attempt: attempts,
|
|
27184
|
+
fromModel: "compact",
|
|
27185
|
+
toModel: "main",
|
|
27186
|
+
...aggregation
|
|
27187
|
+
};
|
|
27188
|
+
debug.warn("AUTO_COMPACT_FALLBACK", fallbackPayload);
|
|
27189
|
+
emitAutoCompactTelemetryEvent("AUTO_COMPACT_FALLBACK", fallbackPayload);
|
|
27190
|
+
continue;
|
|
27191
|
+
}
|
|
27192
|
+
const toThrow = error instanceof Error ? error : new Error(String(error));
|
|
27193
|
+
toThrow.failureType = classified.failureType;
|
|
27194
|
+
toThrow.status = classified.status;
|
|
27195
|
+
toThrow.attempts = attempts;
|
|
27196
|
+
toThrow.modelPointer = activeModelPointer;
|
|
27197
|
+
throw toThrow;
|
|
26105
27198
|
}
|
|
26106
|
-
|
|
26107
|
-
|
|
26108
|
-
|
|
26109
|
-
|
|
26110
|
-
|
|
26111
|
-
|
|
26112
|
-
|
|
27199
|
+
}
|
|
27200
|
+
if (!summaryResponse) {
|
|
27201
|
+
const exhausted = new Error("Auto compact retries exhausted");
|
|
27202
|
+
exhausted.failureType = "unknown";
|
|
27203
|
+
exhausted.attempts = attempts;
|
|
27204
|
+
exhausted.modelPointer = activeModelPointer;
|
|
27205
|
+
throw exhausted;
|
|
26113
27206
|
}
|
|
26114
27207
|
summaryResponse.message.usage = {
|
|
26115
27208
|
input_tokens: 0,
|
|
@@ -26120,7 +27213,7 @@ ${COMPRESSION_PROMPT2}` : COMPRESSION_PROMPT2;
|
|
|
26120
27213
|
const recoveredFiles = await selectAndReadFiles();
|
|
26121
27214
|
const compactedMessages = [
|
|
26122
27215
|
createUserMessage(
|
|
26123
|
-
compressionNotice ? `Context automatically compressed due to token limit. ${compressionNotice} Using '${
|
|
27216
|
+
compressionNotice ? `Context automatically compressed due to token limit. ${compressionNotice} Using '${activeModelPointer}' for compression.` : `Context automatically compressed due to token limit. Using '${activeModelPointer}' for compression.`
|
|
26124
27217
|
),
|
|
26125
27218
|
summaryResponse
|
|
26126
27219
|
];
|
|
@@ -26163,9 +27256,40 @@ ${contentWithLines}
|
|
|
26163
27256
|
getContext.cache.clear?.();
|
|
26164
27257
|
getCodeStyle.cache.clear?.();
|
|
26165
27258
|
resetFileFreshnessSession();
|
|
27259
|
+
try {
|
|
27260
|
+
flushTypedPartBuffer({ requestId: typedRequestId });
|
|
27261
|
+
} catch {
|
|
27262
|
+
}
|
|
26166
27263
|
return compactedMessages;
|
|
26167
27264
|
}
|
|
26168
27265
|
|
|
27266
|
+
// src/services/telemetry/autoCompactTelemetryPersistence.ts
|
|
27267
|
+
import { appendFileSync as appendFileSync2, existsSync as existsSync17, mkdirSync as mkdirSync8 } from "fs";
|
|
27268
|
+
import { dirname as dirname10 } from "path";
|
|
27269
|
+
function getAutoCompactTelemetryOutputFilePath() {
|
|
27270
|
+
return resolveXdgCachePath("telemetry/auto-compact-metrics.jsonl");
|
|
27271
|
+
}
|
|
27272
|
+
function flushAutoCompactTelemetrySnapshot(options = {}) {
|
|
27273
|
+
const snapshot = getAutoCompactMetricsSnapshot();
|
|
27274
|
+
if (snapshot.eventCount <= 0) return null;
|
|
27275
|
+
const outputFilePath = options.outputFilePath ?? getAutoCompactTelemetryOutputFilePath();
|
|
27276
|
+
const record = {
|
|
27277
|
+
timestamp: Date.now(),
|
|
27278
|
+
requestId: options.requestId,
|
|
27279
|
+
agentId: options.agentId ?? "main",
|
|
27280
|
+
eventCount: snapshot.eventCount,
|
|
27281
|
+
metrics: snapshot.metrics
|
|
27282
|
+
};
|
|
27283
|
+
if (!existsSync17(dirname10(outputFilePath))) {
|
|
27284
|
+
mkdirSync8(dirname10(outputFilePath), { recursive: true });
|
|
27285
|
+
}
|
|
27286
|
+
appendFileSync2(outputFilePath, JSON.stringify(record) + "\n");
|
|
27287
|
+
if (options.resetAfterFlush !== false) {
|
|
27288
|
+
resetAutoCompactTelemetry();
|
|
27289
|
+
}
|
|
27290
|
+
return record;
|
|
27291
|
+
}
|
|
27292
|
+
|
|
26169
27293
|
// src/app/query.ts
|
|
26170
27294
|
function isToolUseLikeBlock(block) {
|
|
26171
27295
|
return block && typeof block === "object" && (block.type === "tool_use" || block.type === "server_tool_use" || block.type === "mcp_tool_use");
|
|
@@ -26392,8 +27516,8 @@ var ToolUseQueue = class {
|
|
|
26392
27516
|
}
|
|
26393
27517
|
if (this.hasExecutingTools() && !this.hasCompletedResults() && !this.hasPendingProgress()) {
|
|
26394
27518
|
const promises = this.tools.filter((t) => t.status === "executing" && t.promise).map((t) => t.promise);
|
|
26395
|
-
const progressPromise = new Promise((
|
|
26396
|
-
this.progressAvailableResolve =
|
|
27519
|
+
const progressPromise = new Promise((resolve12) => {
|
|
27520
|
+
this.progressAvailableResolve = resolve12;
|
|
26397
27521
|
});
|
|
26398
27522
|
if (promises.length > 0) {
|
|
26399
27523
|
await Promise.race([...promises, progressPromise]);
|
|
@@ -26455,6 +27579,7 @@ async function* queryCore(messages, systemPrompt, context, canUseTool, toolUseCo
|
|
|
26455
27579
|
setRequestStatus({ kind: "thinking" });
|
|
26456
27580
|
try {
|
|
26457
27581
|
let getAssistantResponse = function() {
|
|
27582
|
+
const modelPointer = toolUseContext.options.model || "main";
|
|
26458
27583
|
return queryLLM(
|
|
26459
27584
|
normalizeMessagesForAPI(messages),
|
|
26460
27585
|
fullSystemPrompt,
|
|
@@ -26463,7 +27588,7 @@ async function* queryCore(messages, systemPrompt, context, canUseTool, toolUseCo
|
|
|
26463
27588
|
toolUseContext.abortController.signal,
|
|
26464
27589
|
{
|
|
26465
27590
|
safeMode: toolUseContext.options.safeMode ?? false,
|
|
26466
|
-
model:
|
|
27591
|
+
model: modelPointer,
|
|
26467
27592
|
prependCLISysprompt: true,
|
|
26468
27593
|
toolUseContext
|
|
26469
27594
|
}
|
|
@@ -26744,6 +27869,11 @@ async function* queryCore(messages, systemPrompt, context, canUseTool, toolUseCo
|
|
|
26744
27869
|
throw error;
|
|
26745
27870
|
}
|
|
26746
27871
|
} finally {
|
|
27872
|
+
const currentRequest = getCurrentRequest();
|
|
27873
|
+
flushAutoCompactTelemetrySnapshot({
|
|
27874
|
+
requestId: currentRequest?.id,
|
|
27875
|
+
agentId: toolUseContext?.agentId
|
|
27876
|
+
});
|
|
26747
27877
|
setRequestStatus({ kind: "idle" });
|
|
26748
27878
|
}
|
|
26749
27879
|
}
|
|
@@ -27377,7 +28507,7 @@ function BinaryFeedbackView({
|
|
|
27377
28507
|
function BinaryFeedback({
|
|
27378
28508
|
m1,
|
|
27379
28509
|
m2,
|
|
27380
|
-
resolve:
|
|
28510
|
+
resolve: resolve12,
|
|
27381
28511
|
debug: debug2,
|
|
27382
28512
|
erroredToolUseIDs,
|
|
27383
28513
|
inProgressToolUseIDs,
|
|
@@ -27389,9 +28519,9 @@ function BinaryFeedback({
|
|
|
27389
28519
|
const onChoose = useCallback15(
|
|
27390
28520
|
(choice) => {
|
|
27391
28521
|
logBinaryFeedbackEvent(m1, m2, choice);
|
|
27392
|
-
|
|
28522
|
+
resolve12(getBinaryFeedbackResultForChoice(m1, m2, choice));
|
|
27393
28523
|
},
|
|
27394
|
-
[m1, m2,
|
|
28524
|
+
[m1, m2, resolve12]
|
|
27395
28525
|
);
|
|
27396
28526
|
useNotifyAfterTimeout(
|
|
27397
28527
|
`${PRODUCT_NAME} needs your input on a response comparison`
|
|
@@ -28205,7 +29335,7 @@ import React101, { useCallback as useCallback17, useEffect as useEffect26, useMe
|
|
|
28205
29335
|
import { Box as Box74, Text as Text78, useInput as useInput28 } from "ink";
|
|
28206
29336
|
import figures9 from "figures";
|
|
28207
29337
|
import chalk15 from "chalk";
|
|
28208
|
-
import { join as
|
|
29338
|
+
import { join as join14 } from "path";
|
|
28209
29339
|
import { spawn as spawn2 } from "child_process";
|
|
28210
29340
|
|
|
28211
29341
|
// src/commands/agents/tooling.ts
|
|
@@ -28260,19 +29390,19 @@ async function getAvailableTools() {
|
|
|
28260
29390
|
|
|
28261
29391
|
// src/commands/agents/storage.ts
|
|
28262
29392
|
import {
|
|
28263
|
-
existsSync as
|
|
28264
|
-
mkdirSync as
|
|
29393
|
+
existsSync as existsSync18,
|
|
29394
|
+
mkdirSync as mkdirSync9,
|
|
28265
29395
|
renameSync as renameSync3,
|
|
28266
29396
|
unlinkSync as unlinkSync2,
|
|
28267
29397
|
writeFileSync as writeFileSync6
|
|
28268
29398
|
} from "fs";
|
|
28269
|
-
import { join as
|
|
29399
|
+
import { join as join13 } from "path";
|
|
28270
29400
|
import { homedir as homedir8 } from "os";
|
|
28271
29401
|
|
|
28272
29402
|
// src/commands/agents/generation.ts
|
|
28273
29403
|
import { randomUUID as randomUUID6 } from "crypto";
|
|
28274
29404
|
async function generateAgentWithClaude(prompt) {
|
|
28275
|
-
const { queryModel } = await import("./llm-
|
|
29405
|
+
const { queryModel } = await import("./llm-WAAV3MBX.js");
|
|
28276
29406
|
const systemPrompt = `You are an expert at creating AI agent configurations. Based on the user's description, generate a specialized agent configuration.
|
|
28277
29407
|
|
|
28278
29408
|
Return your response as a JSON object with exactly these fields:
|
|
@@ -28456,26 +29586,26 @@ var LEGACY_FOLDER = ".claude";
|
|
|
28456
29586
|
var AGENTS_DIR = "agents";
|
|
28457
29587
|
function getAgentDirectory(location) {
|
|
28458
29588
|
if (location === "user") {
|
|
28459
|
-
return
|
|
29589
|
+
return join13(homedir8(), PRIMARY_FOLDER, AGENTS_DIR);
|
|
28460
29590
|
}
|
|
28461
|
-
return
|
|
29591
|
+
return join13(getCwd(), PRIMARY_FOLDER, AGENTS_DIR);
|
|
28462
29592
|
}
|
|
28463
29593
|
function getLegacyAgentDirectory(location) {
|
|
28464
29594
|
if (location === "user") {
|
|
28465
|
-
return
|
|
29595
|
+
return join13(homedir8(), LEGACY_FOLDER, AGENTS_DIR);
|
|
28466
29596
|
}
|
|
28467
|
-
return
|
|
29597
|
+
return join13(getCwd(), LEGACY_FOLDER, AGENTS_DIR);
|
|
28468
29598
|
}
|
|
28469
29599
|
function getPrimaryAgentFilePath(location, agentType) {
|
|
28470
|
-
return
|
|
29600
|
+
return join13(getAgentDirectory(location), `${agentType}.md`);
|
|
28471
29601
|
}
|
|
28472
29602
|
function getLegacyAgentFilePath(location, agentType) {
|
|
28473
|
-
return
|
|
29603
|
+
return join13(getLegacyAgentDirectory(location), `${agentType}.md`);
|
|
28474
29604
|
}
|
|
28475
29605
|
function ensureDirectoryExists(location) {
|
|
28476
29606
|
const dir = getAgentDirectory(location);
|
|
28477
|
-
if (!
|
|
28478
|
-
|
|
29607
|
+
if (!existsSync18(dir)) {
|
|
29608
|
+
mkdirSync9(dir, { recursive: true });
|
|
28479
29609
|
}
|
|
28480
29610
|
return dir;
|
|
28481
29611
|
}
|
|
@@ -28483,7 +29613,7 @@ async function saveAgent(location, agentType, description3, tools, systemPrompt,
|
|
|
28483
29613
|
ensureDirectoryExists(location);
|
|
28484
29614
|
const filePath = getPrimaryAgentFilePath(location, agentType);
|
|
28485
29615
|
const legacyPath = getLegacyAgentFilePath(location, agentType);
|
|
28486
|
-
if (throwIfExists && (
|
|
29616
|
+
if (throwIfExists && (existsSync18(filePath) || existsSync18(legacyPath))) {
|
|
28487
29617
|
throw new Error(`Agent file already exists: ${filePath}`);
|
|
28488
29618
|
}
|
|
28489
29619
|
const tempFile = `${filePath}.tmp.${Date.now()}.${Math.random().toString(36).substr(2, 9)}`;
|
|
@@ -28498,7 +29628,7 @@ async function saveAgent(location, agentType, description3, tools, systemPrompt,
|
|
|
28498
29628
|
);
|
|
28499
29629
|
try {
|
|
28500
29630
|
writeFileSync6(tempFile, content, { encoding: "utf-8", flag: "wx" });
|
|
28501
|
-
if (throwIfExists && (
|
|
29631
|
+
if (throwIfExists && (existsSync18(filePath) || existsSync18(legacyPath))) {
|
|
28502
29632
|
try {
|
|
28503
29633
|
unlinkSync2(tempFile);
|
|
28504
29634
|
} catch {
|
|
@@ -28508,7 +29638,7 @@ async function saveAgent(location, agentType, description3, tools, systemPrompt,
|
|
|
28508
29638
|
renameSync3(tempFile, filePath);
|
|
28509
29639
|
} catch (error) {
|
|
28510
29640
|
try {
|
|
28511
|
-
if (
|
|
29641
|
+
if (existsSync18(tempFile)) {
|
|
28512
29642
|
unlinkSync2(tempFile);
|
|
28513
29643
|
}
|
|
28514
29644
|
} catch (cleanupError) {
|
|
@@ -28536,7 +29666,7 @@ async function updateAgent(agent, description3, tools, systemPrompt, color, mode
|
|
|
28536
29666
|
const location = agent.location;
|
|
28537
29667
|
const primaryPath = getPrimaryAgentFilePath(location, agent.agentType);
|
|
28538
29668
|
const legacyPath = getLegacyAgentFilePath(location, agent.agentType);
|
|
28539
|
-
const filePath =
|
|
29669
|
+
const filePath = existsSync18(primaryPath) ? primaryPath : existsSync18(legacyPath) ? legacyPath : primaryPath;
|
|
28540
29670
|
ensureDirectoryExists(location);
|
|
28541
29671
|
writeFileSync6(filePath, content, { encoding: "utf-8", flag: "w" });
|
|
28542
29672
|
}
|
|
@@ -28547,10 +29677,10 @@ async function deleteAgent(agent) {
|
|
|
28547
29677
|
const location = agent.location;
|
|
28548
29678
|
const primaryPath = getPrimaryAgentFilePath(location, agent.agentType);
|
|
28549
29679
|
const legacyPath = getLegacyAgentFilePath(location, agent.agentType);
|
|
28550
|
-
if (
|
|
29680
|
+
if (existsSync18(primaryPath)) {
|
|
28551
29681
|
unlinkSync2(primaryPath);
|
|
28552
29682
|
}
|
|
28553
|
-
if (
|
|
29683
|
+
if (existsSync18(legacyPath)) {
|
|
28554
29684
|
unlinkSync2(legacyPath);
|
|
28555
29685
|
}
|
|
28556
29686
|
}
|
|
@@ -28569,7 +29699,7 @@ var COLOR_OPTIONS = [
|
|
|
28569
29699
|
"cyan"
|
|
28570
29700
|
];
|
|
28571
29701
|
function openInEditor(filePath) {
|
|
28572
|
-
return new Promise((
|
|
29702
|
+
return new Promise((resolve12, reject) => {
|
|
28573
29703
|
const platform = process.platform;
|
|
28574
29704
|
let command4;
|
|
28575
29705
|
let args;
|
|
@@ -28592,7 +29722,7 @@ function openInEditor(filePath) {
|
|
|
28592
29722
|
child.on("error", (err) => reject(err));
|
|
28593
29723
|
child.on(
|
|
28594
29724
|
"exit",
|
|
28595
|
-
(code) => code === 0 ?
|
|
29725
|
+
(code) => code === 0 ? resolve12() : reject(new Error(`Editor exited with ${code}`))
|
|
28596
29726
|
);
|
|
28597
29727
|
});
|
|
28598
29728
|
}
|
|
@@ -29568,8 +30698,8 @@ function ViewAgent(props) {
|
|
|
29568
30698
|
if (props.agent.source === "plugin") return `Plugin: ${props.agent.baseDir ?? "Unknown"}`;
|
|
29569
30699
|
const baseDir = props.agent.baseDir;
|
|
29570
30700
|
const file = `${props.agent.filename ?? props.agent.agentType}.md`;
|
|
29571
|
-
if (props.agent.source === "projectSettings") return
|
|
29572
|
-
if (baseDir) return
|
|
30701
|
+
if (props.agent.source === "projectSettings") return join14(".claude", "agents", file);
|
|
30702
|
+
if (baseDir) return join14(baseDir, file);
|
|
29573
30703
|
return props.agent.source;
|
|
29574
30704
|
})();
|
|
29575
30705
|
const toolsSummary = () => {
|
|
@@ -29954,8 +31084,8 @@ function getCommand(commandName, commands) {
|
|
|
29954
31084
|
var TOOL_NAME_FOR_PROMPT7 = "SlashCommand";
|
|
29955
31085
|
|
|
29956
31086
|
// src/tools/interaction/SlashCommandTool/SlashCommandTool.tsx
|
|
29957
|
-
var inputSchema12 =
|
|
29958
|
-
command:
|
|
31087
|
+
var inputSchema12 = z13.strictObject({
|
|
31088
|
+
command: z13.string().describe(
|
|
29959
31089
|
'The slash command to execute with its arguments, e.g., "/review-pr 123"'
|
|
29960
31090
|
)
|
|
29961
31091
|
});
|
|
@@ -30201,7 +31331,7 @@ function parseMcpToolName2(name3) {
|
|
|
30201
31331
|
// src/tools/system/KillShellTool/KillShellTool.tsx
|
|
30202
31332
|
import { Box as Box75, Text as Text79 } from "ink";
|
|
30203
31333
|
import React104 from "react";
|
|
30204
|
-
import { z as
|
|
31334
|
+
import { z as z14 } from "zod";
|
|
30205
31335
|
|
|
30206
31336
|
// src/tools/system/KillShellTool/prompt.ts
|
|
30207
31337
|
var TOOL_NAME_FOR_PROMPT8 = "KillShell";
|
|
@@ -30215,8 +31345,8 @@ var PROMPT7 = `
|
|
|
30215
31345
|
`;
|
|
30216
31346
|
|
|
30217
31347
|
// src/tools/system/KillShellTool/KillShellTool.tsx
|
|
30218
|
-
var inputSchema13 =
|
|
30219
|
-
shell_id:
|
|
31348
|
+
var inputSchema13 = z14.strictObject({
|
|
31349
|
+
shell_id: z14.string().describe("The ID of the background shell to kill")
|
|
30220
31350
|
});
|
|
30221
31351
|
var KillShellTool = {
|
|
30222
31352
|
name: TOOL_NAME_FOR_PROMPT8,
|
|
@@ -31085,7 +32215,7 @@ var BashParser = class {
|
|
|
31085
32215
|
};
|
|
31086
32216
|
|
|
31087
32217
|
// src/utils/bash-parser/validator.ts
|
|
31088
|
-
import { resolve as
|
|
32218
|
+
import { resolve as resolve10 } from "path";
|
|
31089
32219
|
async function validateSafety(script, cwd = process.cwd()) {
|
|
31090
32220
|
const tree = await BashParser.parse(script);
|
|
31091
32221
|
const root = tree.rootNode;
|
|
@@ -31136,7 +32266,7 @@ function checkCommand(node, script, cwd) {
|
|
|
31136
32266
|
const targetsCritical = args.some((arg) => {
|
|
31137
32267
|
if (arg.startsWith("-") || arg.startsWith("$")) return false;
|
|
31138
32268
|
try {
|
|
31139
|
-
const absPath =
|
|
32269
|
+
const absPath = resolve10(cwd, arg).replace(/\\/g, "/");
|
|
31140
32270
|
return criticalPaths.some((critical) => {
|
|
31141
32271
|
const normalizedCritical = critical.endsWith("/") ? critical : critical + "/";
|
|
31142
32272
|
if (absPath === critical || absPath === critical.replace(/\/$/, "")) return true;
|
|
@@ -31154,7 +32284,7 @@ function checkCommand(node, script, cwd) {
|
|
|
31154
32284
|
const targetsRoot = args.some((arg) => {
|
|
31155
32285
|
if (arg.startsWith("-") || arg.startsWith("$")) return false;
|
|
31156
32286
|
try {
|
|
31157
|
-
const absPath =
|
|
32287
|
+
const absPath = resolve10(cwd, arg).replace(/\\/g, "/");
|
|
31158
32288
|
return absPath === "/" || /^[a-z]:\/?$/i.test(absPath);
|
|
31159
32289
|
} catch {
|
|
31160
32290
|
return arg === "/" || /^[a-z]:\/?$/i.test(arg);
|
|
@@ -31198,13 +32328,13 @@ function countNewlines(text) {
|
|
|
31198
32328
|
}
|
|
31199
32329
|
return count;
|
|
31200
32330
|
}
|
|
31201
|
-
var inputSchema11 =
|
|
31202
|
-
command:
|
|
31203
|
-
cwd:
|
|
32331
|
+
var inputSchema11 = z15.strictObject({
|
|
32332
|
+
command: z15.string().describe("The command to execute"),
|
|
32333
|
+
cwd: z15.string().optional().describe(
|
|
31204
32334
|
"The directory to execute the command in. Use absolute path or path relative to the project root."
|
|
31205
32335
|
),
|
|
31206
|
-
timeout:
|
|
31207
|
-
description:
|
|
32336
|
+
timeout: z15.number().optional().describe("Optional timeout in milliseconds (max 600000)"),
|
|
32337
|
+
description: z15.string().optional().describe(
|
|
31208
32338
|
`Clear, concise description of what this command does in 5-10 words, in active voice. Examples:
|
|
31209
32339
|
Input: ls
|
|
31210
32340
|
Output: List files in current directory
|
|
@@ -31218,10 +32348,10 @@ Output: Install package dependencies
|
|
|
31218
32348
|
Input: mkdir foo
|
|
31219
32349
|
Output: Create directory 'foo'`
|
|
31220
32350
|
),
|
|
31221
|
-
run_in_background:
|
|
32351
|
+
run_in_background: z15.boolean().optional().describe(
|
|
31222
32352
|
"Set to true to run this command in the background. Use TaskOutput to read the output later."
|
|
31223
32353
|
),
|
|
31224
|
-
dangerouslyDisableSandbox:
|
|
32354
|
+
dangerouslyDisableSandbox: z15.boolean().optional().describe(
|
|
31225
32355
|
"Set this to true to dangerously override sandbox mode and run commands without sandboxing."
|
|
31226
32356
|
)
|
|
31227
32357
|
});
|
|
@@ -31262,7 +32392,7 @@ var BashTool = {
|
|
|
31262
32392
|
async validateInput({ command: command4, timeout, dangerouslyDisableSandbox, cwd }, context) {
|
|
31263
32393
|
const trimmed = command4.trim();
|
|
31264
32394
|
try {
|
|
31265
|
-
await validateSafety(trimmed, cwd ?
|
|
32395
|
+
await validateSafety(trimmed, cwd ? resolve11(getCwd(), cwd) : getCwd());
|
|
31266
32396
|
} catch (e) {
|
|
31267
32397
|
return {
|
|
31268
32398
|
result: false,
|
|
@@ -31302,7 +32432,7 @@ var BashTool = {
|
|
|
31302
32432
|
};
|
|
31303
32433
|
}
|
|
31304
32434
|
if (cwd) {
|
|
31305
|
-
const fullTargetDir = isAbsolute8(cwd) ? cwd :
|
|
32435
|
+
const fullTargetDir = isAbsolute8(cwd) ? cwd : resolve11(getCwd(), cwd);
|
|
31306
32436
|
if (!isInDirectory(
|
|
31307
32437
|
relative12(getOriginalCwd(), fullTargetDir),
|
|
31308
32438
|
relative12(getCwd(), getOriginalCwd())
|
|
@@ -31322,7 +32452,7 @@ var BashTool = {
|
|
|
31322
32452
|
continue;
|
|
31323
32453
|
}
|
|
31324
32454
|
const targetDir = parts[1].replace(/^['"]|['"]$/g, "");
|
|
31325
|
-
const fullTargetDir = isAbsolute8(targetDir) ? targetDir :
|
|
32455
|
+
const fullTargetDir = isAbsolute8(targetDir) ? targetDir : resolve11(getCwd(), targetDir);
|
|
31326
32456
|
if (!isInDirectory(
|
|
31327
32457
|
relative12(getOriginalCwd(), fullTargetDir),
|
|
31328
32458
|
relative12(getCwd(), getOriginalCwd())
|
|
@@ -31433,7 +32563,7 @@ Did you mean "git ${cmdParts.slice(1).join(" ")}"?`;
|
|
|
31433
32563
|
const safeMode = Boolean(context?.safeMode ?? context?.options?.safeMode);
|
|
31434
32564
|
const userPrompt = typeof context?.options?.lastUserPrompt === "string" ? context.options.lastUserPrompt.trim() : "";
|
|
31435
32565
|
const commandDescription = typeof description3 === "string" ? description3.trim() : "";
|
|
31436
|
-
const effectiveCwd = cwd ? isAbsolute8(cwd) ? cwd :
|
|
32566
|
+
const effectiveCwd = cwd ? isAbsolute8(cwd) ? cwd : resolve11(getCwd(), cwd) : getCwd();
|
|
31437
32567
|
try {
|
|
31438
32568
|
await validateSafety(command4, effectiveCwd);
|
|
31439
32569
|
} catch (error) {
|
|
@@ -31583,7 +32713,7 @@ Did you mean "git ${cmdParts.slice(1).join(" ")}"?`;
|
|
|
31583
32713
|
if (abortController.signal.aborted) return false;
|
|
31584
32714
|
const hostForUrl = host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
|
|
31585
32715
|
const url2 = `http://${hostForUrl}:${port}/`;
|
|
31586
|
-
return await new Promise((
|
|
32716
|
+
return await new Promise((resolve12) => {
|
|
31587
32717
|
const assistantMessage = createAssistantMessage("");
|
|
31588
32718
|
if (context.messageId) {
|
|
31589
32719
|
;
|
|
@@ -31599,13 +32729,13 @@ Did you mean "git ${cmdParts.slice(1).join(" ")}"?`;
|
|
|
31599
32729
|
suggestions: void 0,
|
|
31600
32730
|
riskScore: null,
|
|
31601
32731
|
onAbort() {
|
|
31602
|
-
|
|
32732
|
+
resolve12(false);
|
|
31603
32733
|
},
|
|
31604
32734
|
onAllow() {
|
|
31605
|
-
|
|
32735
|
+
resolve12(true);
|
|
31606
32736
|
},
|
|
31607
32737
|
onReject() {
|
|
31608
|
-
|
|
32738
|
+
resolve12(false);
|
|
31609
32739
|
}
|
|
31610
32740
|
};
|
|
31611
32741
|
setToolJSX({
|
|
@@ -31699,8 +32829,8 @@ Did you mean "git ${cmdParts.slice(1).join(" ")}"?`;
|
|
|
31699
32829
|
);
|
|
31700
32830
|
let backgroundRequested = false;
|
|
31701
32831
|
let resolveBackground = null;
|
|
31702
|
-
const backgroundPromise = new Promise((
|
|
31703
|
-
resolveBackground =
|
|
32832
|
+
const backgroundPromise = new Promise((resolve12) => {
|
|
32833
|
+
resolveBackground = resolve12;
|
|
31704
32834
|
});
|
|
31705
32835
|
const requestBackground = () => {
|
|
31706
32836
|
if (backgroundRequested) return;
|
|
@@ -31743,7 +32873,7 @@ ${footerParts.join(" ")}`;
|
|
|
31743
32873
|
bashId
|
|
31744
32874
|
})),
|
|
31745
32875
|
new Promise(
|
|
31746
|
-
(
|
|
32876
|
+
(resolve12) => setTimeout(() => resolve12({ kind: "tick" }), waitMs)
|
|
31747
32877
|
)
|
|
31748
32878
|
]);
|
|
31749
32879
|
if (race.kind === "background") {
|
|
@@ -31777,7 +32907,7 @@ ${footerParts.join(" ")}`;
|
|
|
31777
32907
|
if (process.env.NODE_ENV !== "test") {
|
|
31778
32908
|
getCommandFilePaths(command4, stdout).then((filePaths) => {
|
|
31779
32909
|
for (const filePath of filePaths) {
|
|
31780
|
-
const fullFilePath = isAbsolute8(filePath) ? filePath :
|
|
32910
|
+
const fullFilePath = isAbsolute8(filePath) ? filePath : resolve11(getCwd(), filePath);
|
|
31781
32911
|
try {
|
|
31782
32912
|
readFileTimestamps[fullFilePath] = statSync13(fullFilePath).mtimeMs;
|
|
31783
32913
|
} catch (e) {
|
|
@@ -32091,6 +33221,7 @@ export {
|
|
|
32091
33221
|
KillShellTool,
|
|
32092
33222
|
hasPermissionsToUseTool,
|
|
32093
33223
|
BashTool,
|
|
33224
|
+
getModelCapabilities,
|
|
32094
33225
|
getCLISyspromptPrefix,
|
|
32095
33226
|
getSystemPrompt,
|
|
32096
33227
|
getEnvInfo,
|
|
@@ -32099,6 +33230,8 @@ export {
|
|
|
32099
33230
|
getReasoningEffort,
|
|
32100
33231
|
generatePybContext,
|
|
32101
33232
|
refreshPybContext,
|
|
33233
|
+
emitTelemetryEvent,
|
|
33234
|
+
resolveModelResponsePolicy,
|
|
32102
33235
|
formatSystemPromptWithContext,
|
|
32103
33236
|
useExitOnCtrlCD,
|
|
32104
33237
|
clearTerminal,
|