pybao-cli 1.4.80 → 1.4.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/REPL-VOJCD6X6.js +49 -0
  2. package/dist/{acp-PA6S5MGT.js → acp-ASRH57AF.js} +79 -32
  3. package/dist/acp-ASRH57AF.js.map +7 -0
  4. package/dist/{agentsValidate-YM6XVDQL.js → agentsValidate-35AHZXNB.js} +7 -9
  5. package/dist/agentsValidate-35AHZXNB.js.map +7 -0
  6. package/dist/ask-TI3ITWN7.js +143 -0
  7. package/dist/ask-TI3ITWN7.js.map +7 -0
  8. package/dist/{autoUpdater-AKRMM25L.js → autoUpdater-MRK5BD2L.js} +3 -3
  9. package/dist/{chunk-CP3HV6YN.js → chunk-2AG4BTRV.js} +1 -1
  10. package/dist/{chunk-OQA7RUJA.js → chunk-2S2V2ZI7.js} +16 -22
  11. package/dist/chunk-2S2V2ZI7.js.map +7 -0
  12. package/dist/{chunk-LLSY2GBI.js → chunk-2WIUQUTU.js} +3 -3
  13. package/dist/{chunk-MIUJHRUY.js → chunk-2YM35XWE.js} +3 -3
  14. package/dist/{chunk-AERD7AWQ.js → chunk-AUGXOUTX.js} +11 -1
  15. package/dist/chunk-AUGXOUTX.js.map +7 -0
  16. package/dist/{chunk-TG7JXSXM.js → chunk-AYVB6VUF.js} +1 -1
  17. package/dist/{chunk-PXEQDOU3.js → chunk-DYJD66YF.js} +1 -1
  18. package/dist/{chunk-744K4I7E.js → chunk-DZTZPEPA.js} +2 -2
  19. package/dist/chunk-F4AXICO7.js +28 -0
  20. package/dist/chunk-F4AXICO7.js.map +7 -0
  21. package/dist/{chunk-BWTCQG4X.js → chunk-GSAG6WNQ.js} +1 -1
  22. package/dist/{chunk-CWZPDQJA.js → chunk-GUTLXPN6.js} +38 -4
  23. package/dist/{chunk-CWZPDQJA.js.map → chunk-GUTLXPN6.js.map} +2 -2
  24. package/dist/{chunk-3WG3WTUV.js → chunk-GZT2DWED.js} +1 -1
  25. package/dist/{chunk-3SFRVXA2.js → chunk-HJWUPFGF.js} +4 -4
  26. package/dist/{chunk-WTRPPL2M.js → chunk-IIVG2SHE.js} +3 -3
  27. package/dist/{chunk-JM762ZDE.js → chunk-JQVZNIKI.js} +4 -4
  28. package/dist/{chunk-KTATOOLL.js → chunk-JT3RE7UH.js} +6 -22
  29. package/dist/{chunk-KTATOOLL.js.map → chunk-JT3RE7UH.js.map} +3 -3
  30. package/dist/{chunk-3CW5FEOJ.js → chunk-KNWW4HGV.js} +2 -2
  31. package/dist/chunk-LM665HND.js +262 -0
  32. package/dist/chunk-LM665HND.js.map +7 -0
  33. package/dist/{chunk-42HW6S7R.js → chunk-NTL5PKCX.js} +3 -3
  34. package/dist/{chunk-7ZNKXJQ6.js → chunk-PXPTGNYH.js} +2 -2
  35. package/dist/{chunk-2QU7ZSUS.js → chunk-QUWUFGZF.js} +4 -4
  36. package/dist/{chunk-I37OY5QI.js → chunk-SZEYDC6A.js} +3 -3
  37. package/dist/{chunk-3PA2KVRH.js → chunk-TWWQYBVK.js} +3 -3
  38. package/dist/{chunk-LMS74RIF.js → chunk-U265OPSO.js} +5 -25
  39. package/dist/chunk-U265OPSO.js.map +7 -0
  40. package/dist/{chunk-F5LYIQAC.js → chunk-UBX7JQR2.js} +2 -2
  41. package/dist/{chunk-VHWL7AZC.js → chunk-UXVOYFKL.js} +2 -2
  42. package/dist/{chunk-FTXFHBBF.js → chunk-VMWEFYQB.js} +1 -1
  43. package/dist/{chunk-QOJN4AXT.js → chunk-WBBMOYXK.js} +1 -1
  44. package/dist/{chunk-QOJN4AXT.js.map → chunk-WBBMOYXK.js.map} +1 -1
  45. package/dist/{chunk-EZ5OXAWM.js → chunk-WVYIFMLG.js} +4 -4
  46. package/dist/chunk-XKYHFZEC.js +68 -0
  47. package/dist/chunk-XKYHFZEC.js.map +7 -0
  48. package/dist/{chunk-XNEBNYWQ.js → chunk-XOOHCC63.js} +996 -1479
  49. package/dist/chunk-XOOHCC63.js.map +7 -0
  50. package/dist/{chunk-455FF5IG.js → chunk-Y5JPSTQ4.js} +1 -1
  51. package/dist/{chunk-JD2LVXSN.js → chunk-ZW25QNXS.js} +3 -3
  52. package/dist/{cli-6XU5K75R.js → cli-ECB4WYUZ.js} +399 -379
  53. package/dist/cli-ECB4WYUZ.js.map +7 -0
  54. package/dist/commands-3B77L2SI.js +53 -0
  55. package/dist/{config-REKPGWPW.js → config-KZHPV37P.js} +4 -4
  56. package/dist/{context-7V2M3ID6.js → context-ZZI53BPM.js} +6 -6
  57. package/dist/conversationTracker-SC6NCQHL.js +17 -0
  58. package/dist/{customCommands-WLOMXCCK.js → customCommands-MX6OENKO.js} +4 -4
  59. package/dist/{env-35CB7KWZ.js → env-76WAAGI6.js} +2 -2
  60. package/dist/{file-TCC75FSO.js → file-LCS77XWE.js} +4 -4
  61. package/dist/index.js +3 -3
  62. package/dist/{llm-C6QFJQ42.js → llm-AR66BS2U.js} +32 -29
  63. package/dist/{llm-C6QFJQ42.js.map → llm-AR66BS2U.js.map} +1 -1
  64. package/dist/{llmLazy-7GZ6NMOQ.js → llmLazy-5W6E5BCB.js} +1 -1
  65. package/dist/{loader-X6LBDHGF.js → loader-OWZ3WD2X.js} +4 -4
  66. package/dist/{lsp-SWPSA5Q7.js → lsp-NLPSJYH4.js} +6 -6
  67. package/dist/{lspAnchor-7DFVRBS2.js → lspAnchor-MWASWGQD.js} +6 -6
  68. package/dist/{mcp-PHB7FETI.js → mcp-T2UB74Y2.js} +7 -7
  69. package/dist/{mentionProcessor-V26NXWYI.js → mentionProcessor-KIBWOHEC.js} +5 -5
  70. package/dist/{messages-WHTP6PI3.js → messages-6BHCXDWR.js} +5 -1
  71. package/dist/{model-5DT4TF4B.js → model-5NDSZPIL.js} +5 -5
  72. package/dist/{openai-737OOCXA.js → openai-7XPWH2G7.js} +6 -5
  73. package/dist/{outputStyles-EPSYXOCH.js → outputStyles-QUE4ALJQ.js} +4 -4
  74. package/dist/{pluginRuntime-NUMYY7SH.js → pluginRuntime-PQ3VZRX7.js} +6 -6
  75. package/dist/{pluginValidation-27NUUYNZ.js → pluginValidation-RQ34XQY3.js} +6 -6
  76. package/dist/prompts-5576MRUX.js +55 -0
  77. package/dist/{pybAgentSessionLoad-QMQTSGQ7.js → pybAgentSessionLoad-5MWAY2A4.js} +4 -4
  78. package/dist/{pybAgentSessionResume-RX3URXYK.js → pybAgentSessionResume-NZGSUGGS.js} +4 -4
  79. package/dist/{pybAgentStreamJsonSession-V2QVHE7Y.js → pybAgentStreamJsonSession-UP4WOINX.js} +3 -3
  80. package/dist/pybAgentStreamJsonSession-UP4WOINX.js.map +7 -0
  81. package/dist/{pybHooks-WR66ZII4.js → pybHooks-HILU7ZB4.js} +4 -4
  82. package/dist/query-LMPE4HBF.js +57 -0
  83. package/dist/{registry-3Z3F4SUL.js → registry-4MWYBUFA.js} +5 -5
  84. package/dist/replSessionBridge-EBXNFUAD.js +10 -0
  85. package/dist/{ripgrep-5FHFS5OM.js → ripgrep-J74GL455.js} +3 -3
  86. package/dist/{skillMarketplace-HC5HJ4MG.js → skillMarketplace-ATLDIEEX.js} +3 -3
  87. package/dist/{state-LXTRD5P4.js → state-Y2Q4MPY5.js} +2 -2
  88. package/dist/{theme-XFUQOISY.js → theme-3L66ZU5Z.js} +5 -5
  89. package/dist/{toolPermissionSettings-Z2IVN6T2.js → toolPermissionSettings-PDGMFGN2.js} +6 -6
  90. package/dist/toolPermissionSettings-PDGMFGN2.js.map +7 -0
  91. package/dist/tools-45UHHM5S.js +54 -0
  92. package/dist/tools-45UHHM5S.js.map +7 -0
  93. package/dist/{userInput-CVQ4TYJZ.js → userInput-GBXOUS4W.js} +40 -36
  94. package/dist/userInput-GBXOUS4W.js.map +7 -0
  95. package/package.json +1 -1
  96. package/dist/REPL-4JXH3XRO.js +0 -46
  97. package/dist/acp-PA6S5MGT.js.map +0 -7
  98. package/dist/agentsValidate-YM6XVDQL.js.map +0 -7
  99. package/dist/ask-TKEZYYAI.js +0 -129
  100. package/dist/ask-TKEZYYAI.js.map +0 -7
  101. package/dist/chunk-AERD7AWQ.js.map +0 -7
  102. package/dist/chunk-LMS74RIF.js.map +0 -7
  103. package/dist/chunk-OQA7RUJA.js.map +0 -7
  104. package/dist/chunk-XNEBNYWQ.js.map +0 -7
  105. package/dist/cli-6XU5K75R.js.map +0 -7
  106. package/dist/commands-LBQTQ6YP.js +0 -50
  107. package/dist/prompts-HHTQ43AP.js +0 -52
  108. package/dist/pybAgentStreamJsonSession-V2QVHE7Y.js.map +0 -7
  109. package/dist/query-LQZ7XTT3.js +0 -54
  110. package/dist/tools-A3ZAFFOB.js +0 -51
  111. package/dist/userInput-CVQ4TYJZ.js.map +0 -7
  112. /package/dist/{REPL-4JXH3XRO.js.map → REPL-VOJCD6X6.js.map} +0 -0
  113. /package/dist/{autoUpdater-AKRMM25L.js.map → autoUpdater-MRK5BD2L.js.map} +0 -0
  114. /package/dist/{chunk-CP3HV6YN.js.map → chunk-2AG4BTRV.js.map} +0 -0
  115. /package/dist/{chunk-LLSY2GBI.js.map → chunk-2WIUQUTU.js.map} +0 -0
  116. /package/dist/{chunk-MIUJHRUY.js.map → chunk-2YM35XWE.js.map} +0 -0
  117. /package/dist/{chunk-TG7JXSXM.js.map → chunk-AYVB6VUF.js.map} +0 -0
  118. /package/dist/{chunk-PXEQDOU3.js.map → chunk-DYJD66YF.js.map} +0 -0
  119. /package/dist/{chunk-744K4I7E.js.map → chunk-DZTZPEPA.js.map} +0 -0
  120. /package/dist/{chunk-BWTCQG4X.js.map → chunk-GSAG6WNQ.js.map} +0 -0
  121. /package/dist/{chunk-3WG3WTUV.js.map → chunk-GZT2DWED.js.map} +0 -0
  122. /package/dist/{chunk-3SFRVXA2.js.map → chunk-HJWUPFGF.js.map} +0 -0
  123. /package/dist/{chunk-WTRPPL2M.js.map → chunk-IIVG2SHE.js.map} +0 -0
  124. /package/dist/{chunk-JM762ZDE.js.map → chunk-JQVZNIKI.js.map} +0 -0
  125. /package/dist/{chunk-3CW5FEOJ.js.map → chunk-KNWW4HGV.js.map} +0 -0
  126. /package/dist/{chunk-42HW6S7R.js.map → chunk-NTL5PKCX.js.map} +0 -0
  127. /package/dist/{chunk-7ZNKXJQ6.js.map → chunk-PXPTGNYH.js.map} +0 -0
  128. /package/dist/{chunk-2QU7ZSUS.js.map → chunk-QUWUFGZF.js.map} +0 -0
  129. /package/dist/{chunk-I37OY5QI.js.map → chunk-SZEYDC6A.js.map} +0 -0
  130. /package/dist/{chunk-3PA2KVRH.js.map → chunk-TWWQYBVK.js.map} +0 -0
  131. /package/dist/{chunk-F5LYIQAC.js.map → chunk-UBX7JQR2.js.map} +0 -0
  132. /package/dist/{chunk-VHWL7AZC.js.map → chunk-UXVOYFKL.js.map} +0 -0
  133. /package/dist/{chunk-FTXFHBBF.js.map → chunk-VMWEFYQB.js.map} +0 -0
  134. /package/dist/{chunk-EZ5OXAWM.js.map → chunk-WVYIFMLG.js.map} +0 -0
  135. /package/dist/{chunk-455FF5IG.js.map → chunk-Y5JPSTQ4.js.map} +0 -0
  136. /package/dist/{chunk-JD2LVXSN.js.map → chunk-ZW25QNXS.js.map} +0 -0
  137. /package/dist/{commands-LBQTQ6YP.js.map → commands-3B77L2SI.js.map} +0 -0
  138. /package/dist/{config-REKPGWPW.js.map → config-KZHPV37P.js.map} +0 -0
  139. /package/dist/{context-7V2M3ID6.js.map → context-ZZI53BPM.js.map} +0 -0
  140. /package/dist/{customCommands-WLOMXCCK.js.map → conversationTracker-SC6NCQHL.js.map} +0 -0
  141. /package/dist/{env-35CB7KWZ.js.map → customCommands-MX6OENKO.js.map} +0 -0
  142. /package/dist/{file-TCC75FSO.js.map → env-76WAAGI6.js.map} +0 -0
  143. /package/dist/{llmLazy-7GZ6NMOQ.js.map → file-LCS77XWE.js.map} +0 -0
  144. /package/dist/{loader-X6LBDHGF.js.map → llmLazy-5W6E5BCB.js.map} +0 -0
  145. /package/dist/{lsp-SWPSA5Q7.js.map → loader-OWZ3WD2X.js.map} +0 -0
  146. /package/dist/{mcp-PHB7FETI.js.map → lsp-NLPSJYH4.js.map} +0 -0
  147. /package/dist/{lspAnchor-7DFVRBS2.js.map → lspAnchor-MWASWGQD.js.map} +0 -0
  148. /package/dist/{messages-WHTP6PI3.js.map → mcp-T2UB74Y2.js.map} +0 -0
  149. /package/dist/{mentionProcessor-V26NXWYI.js.map → mentionProcessor-KIBWOHEC.js.map} +0 -0
  150. /package/dist/{model-5DT4TF4B.js.map → messages-6BHCXDWR.js.map} +0 -0
  151. /package/dist/{openai-737OOCXA.js.map → model-5NDSZPIL.js.map} +0 -0
  152. /package/dist/{outputStyles-EPSYXOCH.js.map → openai-7XPWH2G7.js.map} +0 -0
  153. /package/dist/{pluginValidation-27NUUYNZ.js.map → outputStyles-QUE4ALJQ.js.map} +0 -0
  154. /package/dist/{pluginRuntime-NUMYY7SH.js.map → pluginRuntime-PQ3VZRX7.js.map} +0 -0
  155. /package/dist/{prompts-HHTQ43AP.js.map → pluginValidation-RQ34XQY3.js.map} +0 -0
  156. /package/dist/{pybAgentSessionLoad-QMQTSGQ7.js.map → prompts-5576MRUX.js.map} +0 -0
  157. /package/dist/{pybAgentSessionResume-RX3URXYK.js.map → pybAgentSessionLoad-5MWAY2A4.js.map} +0 -0
  158. /package/dist/{pybHooks-WR66ZII4.js.map → pybAgentSessionResume-NZGSUGGS.js.map} +0 -0
  159. /package/dist/{query-LQZ7XTT3.js.map → pybHooks-HILU7ZB4.js.map} +0 -0
  160. /package/dist/{registry-3Z3F4SUL.js.map → query-LMPE4HBF.js.map} +0 -0
  161. /package/dist/{ripgrep-5FHFS5OM.js.map → registry-4MWYBUFA.js.map} +0 -0
  162. /package/dist/{skillMarketplace-HC5HJ4MG.js.map → replSessionBridge-EBXNFUAD.js.map} +0 -0
  163. /package/dist/{state-LXTRD5P4.js.map → ripgrep-J74GL455.js.map} +0 -0
  164. /package/dist/{theme-XFUQOISY.js.map → skillMarketplace-ATLDIEEX.js.map} +0 -0
  165. /package/dist/{toolPermissionSettings-Z2IVN6T2.js.map → state-Y2Q4MPY5.js.map} +0 -0
  166. /package/dist/{tools-A3ZAFFOB.js.map → theme-3L66ZU5Z.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/session/conversationMessageState.ts", "../src/utils/session/conversationPersistence.ts", "../src/utils/session/conversationTracker.ts"],
4
+ "sourcesContent": ["import type { AssistantMessage, Message, UserMessage } from '@query'\n\nexport type ConversationFinishReason =\n | 'end_turn'\n | 'tool_calls'\n | 'max_tokens'\n | 'pause_turn'\n\nexport function mapFinishReason(rawReason?: string | null): ConversationFinishReason {\n const reason = String(rawReason ?? '')\n .trim()\n .toLowerCase()\n if (!reason) return 'end_turn'\n if (reason === 'tool_use' || reason === 'tool_calls') return 'tool_calls'\n if (reason === 'max_tokens' || reason === 'length') return 'max_tokens'\n if (reason === 'pause_turn') return 'pause_turn'\n if (reason === 'end_turn' || reason === 'stop' || reason === 'stop_sequence') {\n return 'end_turn'\n }\n return 'end_turn'\n}\n\nexport function isFinishComplete(finish: ConversationFinishReason): boolean {\n return finish === 'end_turn'\n}\n\nexport function isToolResultUserMessage(message: UserMessage): boolean {\n if (!Array.isArray(message.message.content)) return false\n return message.message.content.some(\n block => block && typeof block === 'object' && (block as any).type === 'tool_result',\n )\n}\n\nexport function findNaturalUserMessageForParent(\n messages: Message[],\n): UserMessage | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (!msg || msg.type !== 'user') continue\n if (isToolResultUserMessage(msg)) continue\n return msg\n }\n return undefined\n}\n\nexport function appendFinishState(\n assistantMessage: AssistantMessage,\n state: {\n finish: ConversationFinishReason\n parentID: string\n completedAt?: number\n },\n): AssistantMessage {\n return {\n ...assistantMessage,\n finish: state.finish,\n parentID: state.parentID,\n ...(typeof state.completedAt === 'number'\n ? { completedAt: state.completedAt }\n : {}),\n }\n}\n\nexport function isCompactionMessage(message: Message): boolean {\n return (\n message.type === 'assistant' &&\n !!(message as AssistantMessage).compaction &&\n (message as AssistantMessage).compaction?.type === 'compaction'\n )\n}\n\nexport function getCompactedQueryIds(messages: Message[]): string[] {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (!isCompactionMessage(message)) continue\n const ids = (message as AssistantMessage).compaction?.compactedQueryIds\n if (Array.isArray(ids)) return ids\n }\n return []\n}\n", "import {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n unlinkSync,\n writeFileSync,\n} from 'fs'\nimport { join } from 'path'\nimport { logError } from '@utils/log'\n\nexport const PERSISTENCE_VERSION = 1\n\nexport type PersistedCompletedQuery = {\n queryId: string\n userMessageUUID: string\n userQuery: string\n summary: string\n completedAt: number\n finish: 'end_turn' | 'tool_calls' | 'max_tokens' | 'pause_turn'\n}\n\nexport type PersistedConversationState = {\n version: number\n sessionId: string\n completedQueries: PersistedCompletedQuery[]\n lastUpdatedAt: number\n}\n\nexport interface ConversationPersistence {\n saveSync(sessionId: string, state: PersistedConversationState): void\n loadSync(sessionId: string): PersistedConversationState | null\n clearSync(sessionId: string): void\n}\n\nfunction sanitizeSessionId(sessionId: string): string {\n return sessionId.replace(/[^a-zA-Z0-9_-]/g, '_')\n}\n\nfunction isValidPersistedCompletedQuery(value: unknown): value is PersistedCompletedQuery {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n const item = value as PersistedCompletedQuery\n return (\n typeof item.queryId === 'string' &&\n typeof item.userMessageUUID === 'string' &&\n typeof item.userQuery === 'string' &&\n typeof item.summary === 'string' &&\n typeof item.completedAt === 'number' &&\n (item.finish === 'end_turn' ||\n item.finish === 'tool_calls' ||\n item.finish === 'max_tokens' ||\n item.finish === 'pause_turn')\n )\n}\n\nfunction isValidPersistedConversationState(\n value: unknown,\n): value is PersistedConversationState {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n const state = value as PersistedConversationState\n return (\n typeof state.version === 'number' &&\n typeof state.sessionId === 'string' &&\n Array.isArray(state.completedQueries) &&\n state.completedQueries.every(isValidPersistedCompletedQuery) &&\n typeof state.lastUpdatedAt === 'number'\n )\n}\n\nexport class FileSystemConversationPersistence implements ConversationPersistence {\n constructor(private readonly baseDir: string) {}\n\n private getFilePath(sessionId: string): string {\n return join(this.baseDir, `${sanitizeSessionId(sessionId)}.json`)\n }\n\n saveSync(sessionId: string, state: PersistedConversationState): void {\n const filePath = this.getFilePath(sessionId)\n const tempPath = `${filePath}.tmp`\n try {\n mkdirSync(this.baseDir, { recursive: true })\n writeFileSync(tempPath, JSON.stringify(state, null, 2), 'utf8')\n renameSync(tempPath, filePath)\n } catch (error) {\n logError(error)\n try {\n if (existsSync(tempPath)) unlinkSync(tempPath)\n } catch {}\n }\n }\n\n loadSync(sessionId: string): PersistedConversationState | null {\n const filePath = this.getFilePath(sessionId)\n if (!existsSync(filePath)) return null\n try {\n const raw = readFileSync(filePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n if (!isValidPersistedConversationState(parsed)) return null\n return parsed\n } catch {\n return null\n }\n }\n\n clearSync(sessionId: string): void {\n const filePath = this.getFilePath(sessionId)\n try {\n if (existsSync(filePath)) unlinkSync(filePath)\n } catch (error) {\n logError(error)\n }\n }\n}\n", "import type { AssistantMessage, UserMessage } from '@query'\nimport { isToolResultUserMessage } from './conversationMessageState'\nimport {\n type ConversationPersistence,\n type PersistedCompletedQuery,\n type PersistedConversationState,\n PERSISTENCE_VERSION,\n} from './conversationPersistence'\n\nexport type CompletedQuery = {\n queryId: string\n userMessageUUID: string\n userQuery: string\n summary: string\n completedAt: number\n finish: 'end_turn' | 'tool_calls' | 'max_tokens' | 'pause_turn'\n}\n\ntype SummaryOptions = {\n maxEntries?: number\n maxEntryChars?: number\n maxTotalChars?: number\n}\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content.trim()\n if (!Array.isArray(content)) return ''\n return content\n .filter(block => block && typeof block === 'object' && (block as any).type === 'text')\n .map(block => String((block as any).text ?? '').trim())\n .filter(Boolean)\n .join('\\n')\n .trim()\n}\n\nfunction truncate(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text\n return `${text.slice(0, Math.max(0, maxChars - 3))}...`\n}\n\nexport class ConversationTracker {\n private completedQueries = new Map<string, CompletedQuery>()\n private currentQueryId: string | null = null\n private readonly persistence?: ConversationPersistence\n private readonly sessionId?: string\n\n constructor(options?: {\n persistence?: ConversationPersistence\n sessionId?: string\n }) {\n this.persistence = options?.persistence\n this.sessionId = options?.sessionId\n }\n\n startQuery(queryId: string, userMessage: UserMessage): boolean {\n if (!queryId) return false\n if (isToolResultUserMessage(userMessage)) return false\n if (this.completedQueries.has(queryId)) return false\n if (this.currentQueryId === queryId) return true\n this.currentQueryId = queryId\n return true\n }\n\n completeQuery(\n queryId: string,\n assistantMessage: AssistantMessage,\n userMessage: UserMessage,\n ): boolean {\n if (!queryId) return false\n if (this.completedQueries.has(queryId)) return false\n if (assistantMessage.finish !== 'end_turn') return false\n if (assistantMessage.parentID !== userMessage.uuid) return false\n\n const userQuery = extractText(userMessage.message.content)\n const summaryRaw = extractText(assistantMessage.message.content)\n const completedAt =\n typeof assistantMessage.completedAt === 'number'\n ? assistantMessage.completedAt\n : Date.now()\n\n this.completedQueries.set(queryId, {\n queryId,\n userMessageUUID: userMessage.uuid,\n userQuery,\n summary: summaryRaw,\n completedAt,\n finish: assistantMessage.finish,\n })\n if (this.currentQueryId === queryId) {\n this.currentQueryId = null\n }\n return true\n }\n\n isQueryCompleted(queryId: string): boolean {\n return this.completedQueries.has(queryId)\n }\n\n getCurrentQueryId(): string | null {\n return this.currentQueryId\n }\n\n getCompletedQueries(): CompletedQuery[] {\n return Array.from(this.completedQueries.values()).sort(\n (a, b) => a.completedAt - b.completedAt,\n )\n }\n\n generateConversationSummary(options?: SummaryOptions): string {\n const maxEntries = options?.maxEntries ?? 10\n const maxEntryChars = options?.maxEntryChars ?? 80\n const maxTotalChars = options?.maxTotalChars ?? 2000\n const completed = this.getCompletedQueries()\n if (completed.length === 0) return ''\n\n const recent = completed.slice(-maxEntries)\n const lines = recent.map(item => {\n const q = truncate(item.userQuery || '(\u7A7A\u95EE\u9898)', maxEntryChars)\n const a = truncate(item.summary || '(\u7A7A\u56DE\u7B54)', maxEntryChars)\n return `- Q: ${q}\\n A: ${a}`\n })\n const body = `## \u5DF2\u5B8C\u6210\u95EE\u9898\u6458\u8981\\n${lines.join('\\n')}`\n if (body.length <= maxTotalChars) return body\n return truncate(body, maxTotalChars)\n }\n\n persist(): boolean {\n if (!this.persistence || !this.sessionId) return false\n try {\n const state: PersistedConversationState = {\n version: PERSISTENCE_VERSION,\n sessionId: this.sessionId,\n completedQueries: this.getCompletedQueries().map(item => ({\n queryId: item.queryId,\n userMessageUUID: item.userMessageUUID,\n userQuery: item.userQuery,\n summary: item.summary,\n completedAt: item.completedAt,\n finish: item.finish,\n })),\n lastUpdatedAt: Date.now(),\n }\n this.persistence.saveSync(this.sessionId, state)\n return true\n } catch {\n return false\n }\n }\n\n restore(): boolean {\n if (!this.persistence || !this.sessionId) return false\n try {\n const state = this.persistence.loadSync(this.sessionId)\n if (!state || state.version !== PERSISTENCE_VERSION) {\n return false\n }\n this.completedQueries.clear()\n const list = Array.isArray(state.completedQueries)\n ? state.completedQueries\n : []\n for (const item of list) {\n const normalized: CompletedQuery = {\n queryId: String(item.queryId),\n userMessageUUID: String(item.userMessageUUID),\n userQuery: String(item.userQuery ?? ''),\n summary: String(item.summary ?? ''),\n completedAt: Number(item.completedAt ?? Date.now()),\n finish: item.finish as PersistedCompletedQuery['finish'],\n }\n this.completedQueries.set(normalized.queryId, normalized)\n }\n this.currentQueryId = null\n return true\n } catch {\n return false\n }\n }\n\n reset(): void {\n this.completedQueries.clear()\n this.currentQueryId = null\n }\n}\n\nexport const conversationTracker = new ConversationTracker()\n\nexport function getConversationTrackerForContext(context?: {\n conversationTracker?: ConversationTracker\n}): ConversationTracker {\n return context?.conversationTracker ?? new ConversationTracker()\n}\n\nexport function resetConversationTrackerForTests(): void {\n conversationTracker.reset()\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -3,13 +3,13 @@ const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getGlobalConfig,
5
5
  saveGlobalConfig
6
- } from "./chunk-LLSY2GBI.js";
6
+ } from "./chunk-2WIUQUTU.js";
7
7
  import {
8
8
  debug
9
- } from "./chunk-PXEQDOU3.js";
9
+ } from "./chunk-DYJD66YF.js";
10
10
  import {
11
11
  logError
12
- } from "./chunk-LMS74RIF.js";
12
+ } from "./chunk-U265OPSO.js";
13
13
 
14
14
  // src/utils/model/index.ts
15
15
  import { memoize } from "lodash-es";
@@ -2,10 +2,10 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  debug
5
- } from "./chunk-PXEQDOU3.js";
5
+ } from "./chunk-DYJD66YF.js";
6
6
  import {
7
7
  logError
8
- } from "./chunk-LMS74RIF.js";
8
+ } from "./chunk-U265OPSO.js";
9
9
 
10
10
  // src/services/system/systemReminder.ts
11
11
  var SystemReminderService = class {
@@ -3,13 +3,13 @@ const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getSettingsFileCandidates,
5
5
  loadSettingsWithLegacyFallback
6
- } from "./chunk-CP3HV6YN.js";
6
+ } from "./chunk-2AG4BTRV.js";
7
7
  import {
8
8
  getSessionPlugins
9
9
  } from "./chunk-BJSWTHRM.js";
10
10
  import {
11
11
  getTheme
12
- } from "./chunk-455FF5IG.js";
12
+ } from "./chunk-Y5JPSTQ4.js";
13
13
  import {
14
14
  addMcprcServerForTesting,
15
15
  getCurrentProjectConfig,
@@ -19,13 +19,13 @@ import {
19
19
  safeParseJSON,
20
20
  saveCurrentProjectConfig,
21
21
  saveGlobalConfig
22
- } from "./chunk-LLSY2GBI.js";
22
+ } from "./chunk-2WIUQUTU.js";
23
23
  import {
24
24
  PRODUCT_COMMAND,
25
25
  PRODUCT_NAME,
26
26
  getCwd,
27
27
  logMCPError
28
- } from "./chunk-LMS74RIF.js";
28
+ } from "./chunk-U265OPSO.js";
29
29
 
30
30
  // src/services/mcp/client.ts
31
31
  import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
@@ -8,14 +8,14 @@ import {
8
8
  getSettingsFileCandidates,
9
9
  loadSettingsWithLegacyFallback,
10
10
  saveSettingsToPrimaryAndSyncLegacy
11
- } from "./chunk-CP3HV6YN.js";
11
+ } from "./chunk-2AG4BTRV.js";
12
12
  import {
13
13
  getCurrentProjectConfig
14
- } from "./chunk-LLSY2GBI.js";
14
+ } from "./chunk-2WIUQUTU.js";
15
15
  import {
16
16
  getCwd,
17
17
  logError
18
- } from "./chunk-LMS74RIF.js";
18
+ } from "./chunk-U265OPSO.js";
19
19
 
20
20
  // src/utils/permissions/toolPermissionSettings.ts
21
21
  function uniqueStrings(value) {
@@ -4,10 +4,10 @@ import {
4
4
  PRODUCT_NAME,
5
5
  execFileNoThrow,
6
6
  logError
7
- } from "./chunk-LMS74RIF.js";
7
+ } from "./chunk-U265OPSO.js";
8
8
  import {
9
9
  MACRO
10
- } from "./chunk-QOJN4AXT.js";
10
+ } from "./chunk-WBBMOYXK.js";
11
11
 
12
12
  // src/utils/session/autoUpdater.ts
13
13
  async function getSemver() {
@@ -82,7 +82,7 @@ async function checkAndNotifyUpdate() {
82
82
  const [
83
83
  { isAutoUpdaterDisabled, getGlobalConfig, saveGlobalConfig },
84
84
  { env }
85
- ] = await Promise.all([import("./config-REKPGWPW.js"), import("./env-35CB7KWZ.js")]);
85
+ ] = await Promise.all([import("./config-KZHPV37P.js"), import("./env-76WAAGI6.js")]);
86
86
  if (await isAutoUpdaterDisabled()) return;
87
87
  if (await env.getIsDocker()) return;
88
88
  if (!await env.hasInternetAccess()) return;
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  MACRO
5
- } from "./chunk-QOJN4AXT.js";
5
+ } from "./chunk-WBBMOYXK.js";
6
6
 
7
7
  // src/utils/state/index.ts
8
8
  import { cwd } from "process";
@@ -1104,7 +1104,6 @@ function buildPlanModeMainReminder(args) {
1104
1104
  const askUserToolName = "AskUserQuestion";
1105
1105
  const exploreAgentType = "Explore";
1106
1106
  const planAgentType = "Plan";
1107
- const exitPlanModeToolName = "ExitPlanMode";
1108
1107
  return `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. This supercedes any other instructions you have received.
1109
1108
 
1110
1109
  ## Plan File Info:
@@ -1166,9 +1165,9 @@ Goal: Write your final plan to the plan file (the only file you can edit).
1166
1165
  - Ensure that the plan file is concise enough to scan quickly, but detailed enough to execute effectively
1167
1166
  - Include the paths of critical files to be modified
1168
1167
 
1169
- ### Phase 5: Call ${exitPlanModeToolName}
1170
- At the very end of your turn, once you have asked the user questions and are happy with your final plan file - you should always call ${exitPlanModeToolName} to indicate to the user that you are done planning.
1171
- This is critical - your turn should only end with either asking the user a question or calling ${exitPlanModeToolName}. Do not stop unless it's for these 2 reasons.
1168
+ ### Phase 5: Wait for User
1169
+ When you have finished planning, inform the user that your plan is ready. The user will review your plan and decide when to exit plan mode (using the keyboard shortcut shift+tab or alt+m).
1170
+ Once plan mode is exited, you will be able to start implementing the plan.
1172
1171
 
1173
1172
  NOTE: At any point in time through this workflow you should feel free to ask the user questions or clarifications. Don't make large assumptions about user intent. The goal is to present a well researched plan to the user, and tie any loose ends before implementation begins.`;
1174
1173
  }
@@ -1185,7 +1184,6 @@ You should build your plan incrementally by writing to or editing this file. NOT
1185
1184
  Answer the user's query comprehensively, using the ${askUserToolName} tool if you need to ask the user clarifying questions. If you do use the ${askUserToolName}, make sure to ask all clarifying questions you need to fully understand the user's intent before proceeding.`;
1186
1185
  }
1187
1186
  function buildPlanModeReentryReminder(planFilePath) {
1188
- const exitPlanModeToolName = "ExitPlanMode";
1189
1187
  return `## Re-entering Plan Mode
1190
1188
 
1191
1189
  You are returning to plan mode after having previously exited it. A plan file exists at ${planFilePath} from your previous planning session.
@@ -1196,7 +1194,7 @@ You are returning to plan mode after having previously exited it. A plan file ex
1196
1194
  3. Decide how to proceed:
1197
1195
  - **Different task**: If the user's request is for a different task\u2014even if it's similar or related\u2014start fresh by overwriting the existing plan
1198
1196
  - **Same task, continuing**: If this is explicitly a continuation or refinement of the exact same task, modify the existing plan while cleaning up outdated or irrelevant sections
1199
- 4. Continue on with the plan process and most importantly you should always edit the plan file one way or the other before calling ${exitPlanModeToolName}
1197
+ 4. Continue on with the plan process and most importantly you should always edit the plan file to reflect your updated understanding
1200
1198
 
1201
1199
  Treat this as a fresh planning session. Do not assume the existing plan is relevant without evaluating it first.`;
1202
1200
  }
@@ -1262,11 +1260,6 @@ function isPlanModeEnabled(context) {
1262
1260
  const key = getConversationKey(context);
1263
1261
  return planModeEnabledByConversationKey.get(key) ?? false;
1264
1262
  }
1265
- function enterPlanMode(context) {
1266
- const key = getConversationKey(context);
1267
- planModeEnabledByConversationKey.set(key, true);
1268
- return { planFilePath: getPlanFilePath(context?.agentId, key) };
1269
- }
1270
1263
  function enterPlanModeForConversationKey(conversationKey) {
1271
1264
  planModeEnabledByConversationKey.set(conversationKey, true);
1272
1265
  }
@@ -1329,17 +1322,6 @@ function isMainPlanFilePathForActiveConversation(path) {
1329
1322
  const target = resolveExistingPath(path);
1330
1323
  return target === expected;
1331
1324
  }
1332
- function readPlanFile(agentId, conversationKey) {
1333
- const planFilePath = getPlanFilePath(agentId, conversationKey);
1334
- if (!existsSync2(planFilePath)) {
1335
- return { content: "", exists: false, planFilePath };
1336
- }
1337
- return {
1338
- content: readFileSync(planFilePath, "utf8"),
1339
- exists: true,
1340
- planFilePath
1341
- };
1342
- }
1343
1325
 
1344
1326
  // src/utils/log/index.ts
1345
1327
  var IN_MEMORY_ERROR_LOG = [];
@@ -3267,13 +3249,11 @@ export {
3267
3249
  getPlanConversationKey,
3268
3250
  setActivePlanConversationKey,
3269
3251
  getPlanModeSystemPromptAdditions,
3270
- enterPlanMode,
3271
3252
  enterPlanModeForConversationKey,
3272
3253
  exitPlanModeForConversationKey,
3273
3254
  hydratePlanSlugFromMessages,
3274
3255
  getPlanFilePath,
3275
3256
  isMainPlanFilePathForActiveConversation,
3276
- readPlanFile,
3277
3257
  SESSION_ID,
3278
3258
  CACHE_PATHS,
3279
3259
  dateToFilename,