pybao-cli 1.3.4 → 1.3.6

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 (191) hide show
  1. package/README.zh-CN.md +35 -35
  2. package/cli-acp.js +3 -3
  3. package/cli.js +4 -4
  4. package/dist/REPL-36K3V4O6.js +42 -0
  5. package/dist/{acp-ZK4PEHBS.js → acp-RFQVH724.js} +43 -43
  6. package/dist/acp-RFQVH724.js.map +7 -0
  7. package/dist/{agentsValidate-CNLZLCPF.js → agentsValidate-4DLL2NVH.js} +15 -15
  8. package/dist/agentsValidate-4DLL2NVH.js.map +7 -0
  9. package/dist/{ask-NQBBFHNS.js → ask-UIDVOYKR.js} +26 -26
  10. package/dist/ask-UIDVOYKR.js.map +7 -0
  11. package/dist/{autoUpdater-7SQ4X6WM.js → autoUpdater-JQKBGYMM.js} +3 -3
  12. package/dist/{chunk-YPIUGZMS.js → chunk-23L7MV2Y.js} +139 -129
  13. package/dist/chunk-23L7MV2Y.js.map +7 -0
  14. package/dist/{chunk-UWYVKM6V.js → chunk-2YGCWRVO.js} +34 -33
  15. package/dist/chunk-2YGCWRVO.js.map +7 -0
  16. package/dist/{chunk-66YCDEA2.js → chunk-4VAP5YEL.js} +11 -11
  17. package/dist/chunk-4VAP5YEL.js.map +7 -0
  18. package/dist/{chunk-EAXM67TE.js → chunk-55R7I54L.js} +12 -12
  19. package/dist/chunk-55R7I54L.js.map +7 -0
  20. package/dist/{chunk-PCXUZ6AT.js → chunk-5AGDLQAW.js} +3 -3
  21. package/dist/chunk-5AGDLQAW.js.map +7 -0
  22. package/dist/{chunk-27GYWUY2.js → chunk-5JHD6MUL.js} +3 -3
  23. package/dist/chunk-5JHD6MUL.js.map +7 -0
  24. package/dist/{chunk-EMMXJ26S.js → chunk-5L2YBNO5.js} +11 -11
  25. package/dist/chunk-5L2YBNO5.js.map +7 -0
  26. package/dist/{chunk-G2IOASOV.js → chunk-6GPWRDBK.js} +1 -1
  27. package/dist/{chunk-G2IOASOV.js.map → chunk-6GPWRDBK.js.map} +1 -1
  28. package/dist/{chunk-QM5NC7TO.js → chunk-6PHKJJUJ.js} +6 -6
  29. package/dist/{chunk-QM5NC7TO.js.map → chunk-6PHKJJUJ.js.map} +2 -2
  30. package/dist/{chunk-VVZQUQB5.js → chunk-7BBVZG5B.js} +25 -25
  31. package/dist/chunk-7BBVZG5B.js.map +7 -0
  32. package/dist/{chunk-T7WZHV42.js → chunk-A3LKXXWG.js} +2 -2
  33. package/dist/{chunk-TM6EL75Y.js → chunk-AJOZ3W4U.js} +4 -4
  34. package/dist/{chunk-T6GVXTNQ.js → chunk-B6IMQJZM.js} +7 -7
  35. package/dist/chunk-B6IMQJZM.js.map +7 -0
  36. package/dist/{chunk-FPLHZKHG.js → chunk-FGKBQAZE.js} +18 -18
  37. package/dist/chunk-FGKBQAZE.js.map +7 -0
  38. package/dist/{chunk-7X3QUKZJ.js → chunk-HRW76ZCA.js} +4 -4
  39. package/dist/chunk-HRW76ZCA.js.map +7 -0
  40. package/dist/{chunk-HIP7XQSM.js → chunk-MSOYRSL6.js} +11 -11
  41. package/dist/chunk-MSOYRSL6.js.map +7 -0
  42. package/dist/{chunk-VRGR4ZTQ.js → chunk-MWPFU2KU.js} +2 -2
  43. package/dist/chunk-MWPFU2KU.js.map +7 -0
  44. package/dist/{chunk-ONRCOGHT.js → chunk-OYSULZG3.js} +6 -6
  45. package/dist/chunk-OYSULZG3.js.map +7 -0
  46. package/dist/{chunk-TCCONYNZ.js → chunk-Q2ULATNS.js} +27 -27
  47. package/dist/chunk-Q2ULATNS.js.map +7 -0
  48. package/dist/{chunk-2QWJPY3A.js → chunk-QOJXMDS7.js} +7 -7
  49. package/dist/chunk-QOJXMDS7.js.map +7 -0
  50. package/dist/{chunk-H5WLCP2Q.js → chunk-QYW4WV3B.js} +9 -9
  51. package/dist/chunk-QYW4WV3B.js.map +7 -0
  52. package/dist/{chunk-EREH4M6C.js → chunk-R6B5QXT3.js} +5 -5
  53. package/dist/chunk-R6B5QXT3.js.map +7 -0
  54. package/dist/{chunk-UEANWPJI.js → chunk-RNVMHRM6.js} +7 -7
  55. package/dist/chunk-RNVMHRM6.js.map +7 -0
  56. package/dist/{chunk-6UHQEJU5.js → chunk-RXEB7A7K.js} +3 -3
  57. package/dist/chunk-RXEB7A7K.js.map +7 -0
  58. package/dist/{chunk-S74HKDFU.js → chunk-SD4T5FIT.js} +4 -4
  59. package/dist/{chunk-S74HKDFU.js.map → chunk-SD4T5FIT.js.map} +1 -1
  60. package/dist/{chunk-JL3N5JHZ.js → chunk-T5LHTEEE.js} +3 -3
  61. package/dist/{chunk-LQH5OITU.js → chunk-V2WGJF5D.js} +3 -3
  62. package/dist/{chunk-QLP2QCPC.js → chunk-VJS3VGKL.js} +5 -5
  63. package/dist/chunk-VJS3VGKL.js.map +7 -0
  64. package/dist/{chunk-CY54GWA4.js → chunk-WTWAFAPK.js} +14 -14
  65. package/dist/chunk-WTWAFAPK.js.map +7 -0
  66. package/dist/chunk-XI4LTVYT.js.map +7 -0
  67. package/dist/{chunk-DS3EM3LE.js → chunk-YILTNJUA.js} +5 -5
  68. package/dist/chunk-YILTNJUA.js.map +7 -0
  69. package/dist/{chunk-Z7YDRXPH.js → chunk-ZFB54AUA.js} +7 -7
  70. package/dist/chunk-ZFB54AUA.js.map +7 -0
  71. package/dist/{cli-ZJ7IBHJY.js → cli-G5SV42ST.js} +119 -119
  72. package/dist/cli-G5SV42ST.js.map +7 -0
  73. package/dist/commands-H7B4G4WE.js +46 -0
  74. package/dist/{config-EUUK7YTG.js → config-LAK62YAE.js} +4 -4
  75. package/dist/{context-MQKNXW2P.js → context-FDF2ICND.js} +5 -5
  76. package/dist/{customCommands-G6OTNNST.js → customCommands-JPYZGAPD.js} +4 -4
  77. package/dist/{env-3A7JSF3L.js → env-RJ42F6F2.js} +8 -8
  78. package/dist/index.js +4 -4
  79. package/dist/index.js.map +1 -1
  80. package/dist/{llm-TFMCL3FJ.js → llm-IUITCXQH.js} +34 -34
  81. package/dist/llm-IUITCXQH.js.map +7 -0
  82. package/dist/{llmLazy-JF4W3ECN.js → llmLazy-O2Y2FTMW.js} +1 -1
  83. package/dist/{loader-E3DJWZ43.js → loader-DKNG527Z.js} +4 -4
  84. package/dist/{mcp-CLIGTX2Y.js → mcp-JE45AJB5.js} +7 -7
  85. package/dist/{mentionProcessor-D44ZKAHF.js → mentionProcessor-CCRLNX5N.js} +5 -5
  86. package/dist/{messages-IFBBCPBX.js → messages-LCIJ5GI6.js} +1 -1
  87. package/dist/{model-KHNUZMSI.js → model-WJ5IN4MT.js} +5 -5
  88. package/dist/{openai-4XFA4KMK.js → openai-C7RHYT6C.js} +5 -5
  89. package/dist/{outputStyles-NUAH4FME.js → outputStyles-XQRKFIMI.js} +4 -4
  90. package/dist/{pluginRuntime-KYFB3F2O.js → pluginRuntime-HXRNF35P.js} +8 -8
  91. package/dist/pluginRuntime-HXRNF35P.js.map +7 -0
  92. package/dist/{pluginValidation-TCIL3PVT.js → pluginValidation-SGVDLOVE.js} +6 -6
  93. package/dist/prompts-ZRXVAHLW.js +48 -0
  94. package/dist/pybAgentSessionId-3HDHCCI5.js +13 -0
  95. package/dist/pybAgentSessionLoad-QAARWCFK.js +18 -0
  96. package/dist/pybAgentSessionResume-MFLYKJKP.js +16 -0
  97. package/dist/{kodeAgentStreamJson-3T26CHCP.js → pybAgentStreamJson-UG22YE4Z.js} +5 -5
  98. package/dist/{kodeAgentStreamJsonSession-E2WXNFYU.js → pybAgentStreamJsonSession-FPPTEZ7F.js} +9 -9
  99. package/dist/pybAgentStreamJsonSession-FPPTEZ7F.js.map +7 -0
  100. package/dist/{kodeAgentStructuredStdio-TNB6U6SP.js → pybAgentStructuredStdio-QDF6UGAJ.js} +3 -3
  101. package/dist/{kodeHooks-KEIFTKSA.js → pybHooks-BXTK4AZR.js} +7 -7
  102. package/dist/query-5HYIZ5QR.js +50 -0
  103. package/dist/{ripgrep-BQTXXOCY.js → ripgrep-DUGXYW5R.js} +3 -3
  104. package/dist/{skillMarketplace-WPLPA36Z.js → skillMarketplace-PZ2OWCJR.js} +3 -3
  105. package/dist/{state-6OLUFGTV.js → state-BORHBKLZ.js} +2 -2
  106. package/dist/{theme-FKIHHDYJ.js → theme-WWGSHY7G.js} +5 -5
  107. package/dist/{toolPermissionSettings-2YSDIYCD.js → toolPermissionSettings-AR5JDEUS.js} +6 -6
  108. package/dist/tools-BPXFPBXM.js +47 -0
  109. package/dist/{userInput-5HJRPHLY.js → userInput-SIOPI4PP.js} +34 -34
  110. package/dist/userInput-SIOPI4PP.js.map +7 -0
  111. package/package.json +1 -1
  112. package/scripts/binary-utils.cjs +8 -8
  113. package/scripts/cli-acp-wrapper.cjs +3 -3
  114. package/scripts/cli-wrapper.cjs +4 -4
  115. package/scripts/postinstall.js +7 -7
  116. package/dist/REPL-DWIFIJDL.js +0 -42
  117. package/dist/acp-ZK4PEHBS.js.map +0 -7
  118. package/dist/agentsValidate-CNLZLCPF.js.map +0 -7
  119. package/dist/ask-NQBBFHNS.js.map +0 -7
  120. package/dist/chunk-27GYWUY2.js.map +0 -7
  121. package/dist/chunk-2QWJPY3A.js.map +0 -7
  122. package/dist/chunk-66YCDEA2.js.map +0 -7
  123. package/dist/chunk-6UHQEJU5.js.map +0 -7
  124. package/dist/chunk-7X3QUKZJ.js.map +0 -7
  125. package/dist/chunk-CY54GWA4.js.map +0 -7
  126. package/dist/chunk-DS3EM3LE.js.map +0 -7
  127. package/dist/chunk-EAXM67TE.js.map +0 -7
  128. package/dist/chunk-EMMXJ26S.js.map +0 -7
  129. package/dist/chunk-EREH4M6C.js.map +0 -7
  130. package/dist/chunk-FPLHZKHG.js.map +0 -7
  131. package/dist/chunk-H5WLCP2Q.js.map +0 -7
  132. package/dist/chunk-HIP7XQSM.js.map +0 -7
  133. package/dist/chunk-M624LT6O.js.map +0 -7
  134. package/dist/chunk-ONRCOGHT.js.map +0 -7
  135. package/dist/chunk-PCXUZ6AT.js.map +0 -7
  136. package/dist/chunk-QLP2QCPC.js.map +0 -7
  137. package/dist/chunk-T6GVXTNQ.js.map +0 -7
  138. package/dist/chunk-TCCONYNZ.js.map +0 -7
  139. package/dist/chunk-UEANWPJI.js.map +0 -7
  140. package/dist/chunk-UWYVKM6V.js.map +0 -7
  141. package/dist/chunk-VRGR4ZTQ.js.map +0 -7
  142. package/dist/chunk-VVZQUQB5.js.map +0 -7
  143. package/dist/chunk-YPIUGZMS.js.map +0 -7
  144. package/dist/chunk-Z7YDRXPH.js.map +0 -7
  145. package/dist/cli-ZJ7IBHJY.js.map +0 -7
  146. package/dist/commands-26Q4GJ7U.js +0 -46
  147. package/dist/kodeAgentSessionId-PROTVRBR.js +0 -13
  148. package/dist/kodeAgentSessionLoad-63BYTKTV.js +0 -18
  149. package/dist/kodeAgentSessionResume-B74VONCU.js +0 -16
  150. package/dist/kodeAgentStreamJsonSession-E2WXNFYU.js.map +0 -7
  151. package/dist/llm-TFMCL3FJ.js.map +0 -7
  152. package/dist/pluginRuntime-KYFB3F2O.js.map +0 -7
  153. package/dist/prompts-JD7BGHKJ.js +0 -48
  154. package/dist/query-J5JOOKFI.js +0 -50
  155. package/dist/tools-S6P5P65H.js +0 -47
  156. package/dist/userInput-5HJRPHLY.js.map +0 -7
  157. /package/dist/{REPL-DWIFIJDL.js.map → REPL-36K3V4O6.js.map} +0 -0
  158. /package/dist/{autoUpdater-7SQ4X6WM.js.map → autoUpdater-JQKBGYMM.js.map} +0 -0
  159. /package/dist/{chunk-T7WZHV42.js.map → chunk-A3LKXXWG.js.map} +0 -0
  160. /package/dist/{chunk-TM6EL75Y.js.map → chunk-AJOZ3W4U.js.map} +0 -0
  161. /package/dist/{chunk-JL3N5JHZ.js.map → chunk-T5LHTEEE.js.map} +0 -0
  162. /package/dist/{chunk-LQH5OITU.js.map → chunk-V2WGJF5D.js.map} +0 -0
  163. /package/dist/{chunk-M624LT6O.js → chunk-XI4LTVYT.js} +0 -0
  164. /package/dist/{commands-26Q4GJ7U.js.map → commands-H7B4G4WE.js.map} +0 -0
  165. /package/dist/{config-EUUK7YTG.js.map → config-LAK62YAE.js.map} +0 -0
  166. /package/dist/{context-MQKNXW2P.js.map → context-FDF2ICND.js.map} +0 -0
  167. /package/dist/{customCommands-G6OTNNST.js.map → customCommands-JPYZGAPD.js.map} +0 -0
  168. /package/dist/{env-3A7JSF3L.js.map → env-RJ42F6F2.js.map} +0 -0
  169. /package/dist/{kodeAgentSessionId-PROTVRBR.js.map → llmLazy-O2Y2FTMW.js.map} +0 -0
  170. /package/dist/{kodeAgentSessionLoad-63BYTKTV.js.map → loader-DKNG527Z.js.map} +0 -0
  171. /package/dist/{kodeAgentSessionResume-B74VONCU.js.map → mcp-JE45AJB5.js.map} +0 -0
  172. /package/dist/{mentionProcessor-D44ZKAHF.js.map → mentionProcessor-CCRLNX5N.js.map} +0 -0
  173. /package/dist/{kodeAgentStreamJson-3T26CHCP.js.map → messages-LCIJ5GI6.js.map} +0 -0
  174. /package/dist/{kodeAgentStructuredStdio-TNB6U6SP.js.map → model-WJ5IN4MT.js.map} +0 -0
  175. /package/dist/{kodeHooks-KEIFTKSA.js.map → openai-C7RHYT6C.js.map} +0 -0
  176. /package/dist/{llmLazy-JF4W3ECN.js.map → outputStyles-XQRKFIMI.js.map} +0 -0
  177. /package/dist/{loader-E3DJWZ43.js.map → pluginValidation-SGVDLOVE.js.map} +0 -0
  178. /package/dist/{mcp-CLIGTX2Y.js.map → prompts-ZRXVAHLW.js.map} +0 -0
  179. /package/dist/{messages-IFBBCPBX.js.map → pybAgentSessionId-3HDHCCI5.js.map} +0 -0
  180. /package/dist/{model-KHNUZMSI.js.map → pybAgentSessionLoad-QAARWCFK.js.map} +0 -0
  181. /package/dist/{openai-4XFA4KMK.js.map → pybAgentSessionResume-MFLYKJKP.js.map} +0 -0
  182. /package/dist/{outputStyles-NUAH4FME.js.map → pybAgentStreamJson-UG22YE4Z.js.map} +0 -0
  183. /package/dist/{pluginValidation-TCIL3PVT.js.map → pybAgentStructuredStdio-QDF6UGAJ.js.map} +0 -0
  184. /package/dist/{prompts-JD7BGHKJ.js.map → pybHooks-BXTK4AZR.js.map} +0 -0
  185. /package/dist/{query-J5JOOKFI.js.map → query-5HYIZ5QR.js.map} +0 -0
  186. /package/dist/{ripgrep-BQTXXOCY.js.map → ripgrep-DUGXYW5R.js.map} +0 -0
  187. /package/dist/{skillMarketplace-WPLPA36Z.js.map → skillMarketplace-PZ2OWCJR.js.map} +0 -0
  188. /package/dist/{state-6OLUFGTV.js.map → state-BORHBKLZ.js.map} +0 -0
  189. /package/dist/{theme-FKIHHDYJ.js.map → theme-WWGSHY7G.js.map} +0 -0
  190. /package/dist/{toolPermissionSettings-2YSDIYCD.js.map → toolPermissionSettings-AR5JDEUS.js.map} +0 -0
  191. /package/dist/{tools-S6P5P65H.js.map → tools-BPXFPBXM.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/utils/messages/core.ts", "../src/services/ai/llmConstants.ts", "../src/utils/messages/index.ts"],
4
- "sourcesContent": ["import { createHash, randomUUID, UUID } from 'crypto'\nimport { AssistantMessage, Message, ProgressMessage, UserMessage } from '@query'\nimport { last, memoize } from 'lodash-es'\nimport type { Tool } from '@tool'\nimport { NO_CONTENT_MESSAGE } from '@services/llmConstants'\nimport {\n ImageBlockParam,\n TextBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n Message as APIMessage,\n ContentBlockParam,\n ContentBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nexport const INTERRUPT_MESSAGE = '[Request interrupted by user]'\nexport const INTERRUPT_MESSAGE_FOR_TOOL_USE =\n '[Request interrupted by user for tool use]'\nexport const CANCEL_MESSAGE =\n \"The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE =\n \"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE_WITH_FEEDBACK_PREFIX = `The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). To tell you how to proceed, the user said:\\n`\nexport const REJECTED_PLAN_PREFIX = `The agent proposed a plan that was rejected by the user. The user chose to stay in plan mode rather than proceed with implementation.\\n\\nRejected plan:\\n`\nexport const NO_RESPONSE_REQUESTED = 'No response requested.'\n\nexport const SYNTHETIC_ASSISTANT_MESSAGES = new Set([\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n NO_RESPONSE_REQUESTED,\n])\n\nfunction stableUuidFromSeed(seed: string): UUID {\n const hex = createHash('sha256').update(seed).digest('hex').slice(0, 32)\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}` as UUID\n}\n\nfunction baseCreateAssistantMessage(\n content: ContentBlock[],\n extra?: Partial<AssistantMessage>,\n): AssistantMessage {\n return {\n type: 'assistant',\n costUSD: 0,\n durationMs: 0,\n uuid: randomUUID(),\n message: {\n id: randomUUID(),\n model: '<synthetic>',\n role: 'assistant',\n stop_reason: 'stop_sequence',\n stop_sequence: '',\n type: 'message',\n usage: {\n input_tokens: 0,\n output_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n },\n content,\n },\n ...extra,\n }\n}\n\nexport function createAssistantMessage(content: string): AssistantMessage {\n return baseCreateAssistantMessage([\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ])\n}\n\nexport function createAssistantAPIErrorMessage(\n content: string,\n): AssistantMessage {\n return baseCreateAssistantMessage(\n [\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ],\n { isApiErrorMessage: true },\n )\n}\n\nexport type FullToolUseResult = {\n data: unknown\n resultForAssistant: ToolResultBlockParam['content']\n newMessages?: Message[]\n contextModifier?: { modifyContext: (ctx: any) => any }\n}\n\nexport function createUserMessage(\n content: string | ContentBlockParam[],\n toolUseResult?: FullToolUseResult,\n): UserMessage {\n const m: UserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content,\n },\n uuid: randomUUID(),\n toolUseResult,\n }\n return m\n}\n\nexport function createProgressMessage(\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n content: AssistantMessage,\n normalizedMessages: NormalizedMessage[],\n tools: Tool[],\n): ProgressMessage {\n return {\n type: 'progress',\n content,\n normalizedMessages,\n siblingToolUseIDs,\n tools,\n toolUseID,\n uuid: randomUUID(),\n }\n}\n\nexport function createToolResultStopMessage(\n toolUseID: string,\n): ToolResultBlockParam {\n return {\n type: 'tool_result',\n content: CANCEL_MESSAGE,\n is_error: true,\n tool_use_id: toolUseID,\n }\n}\n\nexport function extractTagFromMessage(\n message: Message,\n tagName: string,\n): string | null {\n if (message.type === 'progress') {\n return null\n }\n if (typeof message.message.content !== 'string') {\n return null\n }\n return extractTag(message.message.content, tagName)\n}\n\nexport function extractTag(html: string, tagName: string): string | null {\n if (!html.trim() || !tagName.trim()) {\n return null\n }\n\n const escapedTag = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n const pattern = new RegExp(\n `<${escapedTag}(?:\\\\s+[^>]*)?>` + '([\\\\s\\\\S]*?)' + `<\\\\/${escapedTag}>`,\n 'gi',\n )\n\n let match\n let depth = 0\n let lastIndex = 0\n const openingTag = new RegExp(`<${escapedTag}(?:\\\\s+[^>]*?)?>`, 'gi')\n const closingTag = new RegExp(`<\\\\/${escapedTag}>`, 'gi')\n\n while ((match = pattern.exec(html)) !== null) {\n const content = match[1]\n const beforeMatch = html.slice(lastIndex, match.index)\n\n depth = 0\n\n openingTag.lastIndex = 0\n while (openingTag.exec(beforeMatch) !== null) {\n depth++\n }\n\n closingTag.lastIndex = 0\n while (closingTag.exec(beforeMatch) !== null) {\n depth--\n }\n\n if (depth === 0 && content) {\n return content\n }\n\n lastIndex = match.index + match[0].length\n }\n\n return null\n}\n\nexport function isNotEmptyMessage(message: Message): boolean {\n if (message.type === 'progress') {\n return true\n }\n\n if (typeof message.message.content === 'string') {\n return message.message.content.trim().length > 0\n }\n\n if (message.message.content.length === 0) {\n return false\n }\n\n if (message.message.content.length > 1) {\n return true\n }\n\n if (message.message.content[0]!.type !== 'text') {\n return true\n }\n\n return (\n message.message.content[0]!.text.trim().length > 0 &&\n message.message.content[0]!.text !== NO_CONTENT_MESSAGE &&\n message.message.content[0]!.text !== INTERRUPT_MESSAGE_FOR_TOOL_USE\n )\n}\n\ntype NormalizedUserMessage = {\n message: {\n content: [\n | TextBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam,\n ]\n role: 'user'\n }\n type: 'user'\n uuid: UUID\n}\n\nexport type NormalizedMessage =\n | NormalizedUserMessage\n | AssistantMessage\n | ProgressMessage\n\nexport function normalizeMessages(messages: Message[]): NormalizedMessage[] {\n return messages.flatMap(message => {\n if (message.type === 'progress') {\n return [message] as NormalizedMessage[]\n }\n if (typeof message.message.content === 'string') {\n return [message] as NormalizedMessage[]\n }\n const contentBlocks = message.message.content.filter(\n block =>\n !(\n block.type === 'thinking' &&\n (typeof (block as any).thinking !== 'string' ||\n (block as any).thinking.trim().length === 0)\n ),\n )\n\n return contentBlocks.map((block, blockIndex) => {\n switch (message.type) {\n case 'assistant':\n const baseSeed = String(\n (message as any).uuid ??\n (message as any).message?.id ??\n randomUUID(),\n )\n return {\n type: 'assistant',\n uuid: stableUuidFromSeed(`${baseSeed}:${blockIndex}`),\n message: {\n ...message.message,\n content: [block],\n },\n costUSD:\n (message as AssistantMessage).costUSD / contentBlocks.length,\n durationMs: (message as AssistantMessage).durationMs,\n } as NormalizedMessage\n case 'user':\n return message as NormalizedUserMessage\n }\n })\n })\n}\n\ntype ToolUseRequestMessage = AssistantMessage & {\n message: { content: any[] }\n}\n\ntype ToolUseLikeBlockParam = ToolUseBlockParam & {\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\n}\n\nfunction isToolUseLikeBlockParam(block: any): block is ToolUseLikeBlockParam {\n return (\n block &&\n typeof block === 'object' &&\n (block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use') &&\n typeof block.id === 'string'\n )\n}\n\nfunction isToolUseRequestMessage(\n message: Message,\n): message is ToolUseRequestMessage {\n return (\n message.type === 'assistant' &&\n 'costUSD' in message &&\n message.message.content.some(isToolUseLikeBlockParam)\n )\n}\n\nexport function reorderMessages(\n messages: NormalizedMessage[],\n): NormalizedMessage[] {\n const ms: NormalizedMessage[] = []\n const toolUseMessages: ToolUseRequestMessage[] = []\n\n for (const message of messages) {\n if (isToolUseRequestMessage(message)) {\n toolUseMessages.push(message)\n }\n\n if (message.type === 'progress') {\n const existingProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === message.toolUseID,\n )\n if (existingProgressMessage) {\n ms[ms.indexOf(existingProgressMessage)] = message\n continue\n }\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === message.toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content[0]?.type === 'tool_result'\n ) {\n const toolUseID = (message.message.content[0] as ToolResultBlockParam)\n ?.tool_use_id\n\n const lastProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n )\n if (lastProgressMessage) {\n ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message)\n continue\n }\n\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n else {\n ms.push(message)\n }\n }\n\n return ms\n}\n\nconst getToolResultIDs = memoize(\n (normalizedMessages: NormalizedMessage[]): { [toolUseID: string]: boolean } =>\n Object.fromEntries(\n normalizedMessages.flatMap(_ =>\n _.type === 'user' && _.message.content[0]?.type === 'tool_result'\n ? [\n [\n _.message.content[0]!.tool_use_id,\n _.message.content[0]!.is_error ?? false,\n ],\n ]\n : ([] as [string, boolean][]),\n ),\n ),\n)\n\nexport function getUnresolvedToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const toolResults = getToolResultIDs(normalizedMessages)\n return new Set(\n normalizedMessages\n .filter(\n (\n _,\n ): _ is AssistantMessage & {\n message: { content: [ToolUseLikeBlockParam] }\n } =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n !(_.message.content[0].id in toolResults),\n )\n .map(_ => _.message.content[0].id),\n )\n}\n\nexport function getInProgressToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages)\n\n function isQueuedWaitingProgressMessage(message: NormalizedMessage): boolean {\n if (message.type !== 'progress') return false\n const firstBlock = message.content.message.content[0]\n if (!firstBlock || firstBlock.type !== 'text') return false\n const rawText = String(firstBlock.text ?? '')\n const text = rawText.startsWith('<tool-progress>')\n ? (extractTag(rawText, 'tool-progress') ?? rawText)\n : rawText\n return text.trim() === 'Waiting\u2026'\n }\n\n const toolUseIDsThatHaveProgressMessages = new Set(\n normalizedMessages\n .filter(\n (_): _ is ProgressMessage =>\n _.type === 'progress' && !isQueuedWaitingProgressMessage(_),\n )\n .map(_ => _.toolUseID),\n )\n return new Set(\n (\n normalizedMessages.filter(_ => {\n if (_.type !== 'assistant') {\n return false\n }\n const firstBlock = _.message.content[0]\n if (!isToolUseLikeBlockParam(firstBlock)) return false\n const toolUseID = firstBlock.id\n if (toolUseID === unresolvedToolUseIDs.values().next().value) {\n return true\n }\n\n if (\n toolUseIDsThatHaveProgressMessages.has(toolUseID) &&\n unresolvedToolUseIDs.has(toolUseID)\n ) {\n return true\n }\n\n return false\n }) as AssistantMessage[]\n ).map(_ => (_.message.content[0]! as ToolUseBlockParam).id),\n )\n}\n\nexport function getErroredToolUseMessages(\n normalizedMessages: NormalizedMessage[],\n): AssistantMessage[] {\n const toolResults = getToolResultIDs(normalizedMessages)\n return normalizedMessages.filter(\n _ =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n _.message.content[0].id in toolResults &&\n toolResults[_.message.content[0].id],\n ) as AssistantMessage[]\n}\n\nexport function normalizeMessagesForAPI(\n messages: Message[],\n): (UserMessage | AssistantMessage)[] {\n function isSyntheticApiErrorMessage(message: Message): boolean {\n return (\n message.type === 'assistant' &&\n message.isApiErrorMessage === true &&\n message.message.model === '<synthetic>'\n )\n }\n\n function normalizeUserContent(\n content: UserMessage['message']['content'],\n ): ContentBlockParam[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }]\n }\n return content\n }\n\n function toolResultsFirst(content: ContentBlockParam[]): ContentBlockParam[] {\n const toolResults: ContentBlockParam[] = []\n const rest: ContentBlockParam[] = []\n for (const block of content) {\n if (block.type === 'tool_result') {\n toolResults.push(block)\n } else {\n rest.push(block)\n }\n }\n return [...toolResults, ...rest]\n }\n\n function mergeUserMessages(\n base: UserMessage,\n next: UserMessage,\n ): UserMessage {\n const baseBlocks = normalizeUserContent(base.message.content)\n const nextBlocks = normalizeUserContent(next.message.content)\n return {\n ...base,\n message: {\n ...base.message,\n content: toolResultsFirst([...baseBlocks, ...nextBlocks]),\n },\n }\n }\n\n function isUserToolResultMessage(message: Message): message is UserMessage {\n if (message.type !== 'user') return false\n if (!Array.isArray(message.message.content)) return false\n return message.message.content.some(block => block.type === 'tool_result')\n }\n\n const result: (UserMessage | AssistantMessage)[] = []\n for (const message of messages) {\n if (message.type === 'progress') continue\n if (isSyntheticApiErrorMessage(message)) continue\n\n switch (message.type) {\n case 'user': {\n const prev = last(result)\n if (prev?.type === 'user') {\n result[result.indexOf(prev)] = mergeUserMessages(prev, message)\n } else {\n result.push(message)\n }\n break\n }\n case 'assistant': {\n let merged = false\n for (let i = result.length - 1; i >= 0; i--) {\n const prev = result[i]\n if (prev.type !== 'assistant' && !isUserToolResultMessage(prev)) {\n break\n }\n if (prev.type === 'assistant') {\n if (prev.message.id === message.message.id) {\n result[i] = {\n ...prev,\n message: {\n ...prev.message,\n content: [\n ...(Array.isArray(prev.message.content)\n ? prev.message.content\n : []),\n ...(Array.isArray(message.message.content)\n ? message.message.content\n : []),\n ],\n },\n }\n merged = true\n }\n break\n }\n }\n if (!merged) {\n result.push(message)\n }\n break\n }\n }\n }\n\n return result\n}\n\nexport function normalizeContentFromAPI(\n content: APIMessage['content'],\n): APIMessage['content'] {\n const filteredContent = content.filter(\n _ => _.type !== 'text' || _.text.trim().length > 0,\n )\n\n if (filteredContent.length === 0) {\n return [{ type: 'text', text: NO_CONTENT_MESSAGE, citations: [] }]\n }\n\n return filteredContent\n}\n\nexport function isEmptyMessageText(text: string): boolean {\n return (\n stripSystemMessages(text).trim() === '' ||\n text.trim() === NO_CONTENT_MESSAGE\n )\n}\nconst STRIPPED_TAGS = [\n 'commit_analysis',\n 'context',\n 'function_analysis',\n 'pr_analysis',\n]\n\nexport function stripSystemMessages(content: string): string {\n const regex = new RegExp(`<(${STRIPPED_TAGS.join('|')})>.*?</\\\\1>\\n?`, 'gs')\n return content.replace(regex, '').trim()\n}\n\nexport function getToolUseID(message: NormalizedMessage): string | null {\n switch (message.type) {\n case 'assistant':\n return isToolUseLikeBlockParam(message.message.content[0])\n ? message.message.content[0].id\n : null\n case 'user':\n if (message.message.content[0]?.type !== 'tool_result') {\n return null\n }\n return message.message.content[0].tool_use_id\n case 'progress':\n return message.toolUseID\n }\n}\n\nexport function getLastAssistantMessageId(\n messages: Message[],\n): string | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message && message.type === 'assistant') {\n return message.message.id\n }\n }\n return undefined\n}\n", "export const API_ERROR_MESSAGE_PREFIX = 'API Error'\nexport const PROMPT_TOO_LONG_ERROR_MESSAGE = 'Prompt is too long'\nexport const CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE = 'Credit balance is too low'\nexport const INVALID_API_KEY_ERROR_MESSAGE =\n 'Invalid API key \u00B7 Please run /login'\nexport const NO_CONTENT_MESSAGE = '(no content)'\n\nexport const MAIN_QUERY_TEMPERATURE = 1\n", "export * from './core'\n\nimport type { SetToolJSXFn, ToolUseContext } from '@tool'\nimport type { Message } from '@query'\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'prompt' | 'koding',\n setToolJSX: SetToolJSXFn,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n }\n },\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }> | null,\n): Promise<Message[]> {\n const impl = await import('./userInput')\n return impl.processUserInput(input, mode, setToolJSX, context, pastedImages)\n}\n\n"],
4
+ "sourcesContent": ["import { createHash, randomUUID, UUID } from 'crypto'\nimport { AssistantMessage, Message, ProgressMessage, UserMessage } from '@query'\nimport { last, memoize } from 'lodash-es'\nimport type { Tool } from '@tool'\nimport { NO_CONTENT_MESSAGE } from '@services/llmConstants'\nimport {\n ImageBlockParam,\n TextBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n Message as APIMessage,\n ContentBlockParam,\n ContentBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nexport const INTERRUPT_MESSAGE = '[Request interrupted by user]'\nexport const INTERRUPT_MESSAGE_FOR_TOOL_USE =\n '[Request interrupted by user for tool use]'\nexport const CANCEL_MESSAGE =\n \"The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE =\n \"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE_WITH_FEEDBACK_PREFIX = `The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). To tell you how to proceed, the user said:\\n`\nexport const REJECTED_PLAN_PREFIX = `The agent proposed a plan that was rejected by the user. The user chose to stay in plan mode rather than proceed with implementation.\\n\\nRejected plan:\\n`\nexport const NO_RESPONSE_REQUESTED = 'No response requested.'\n\nexport const SYNTHETIC_ASSISTANT_MESSAGES = new Set([\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n NO_RESPONSE_REQUESTED,\n])\n\nfunction stableUuidFromSeed(seed: string): UUID {\n const hex = createHash('sha256').update(seed).digest('hex').slice(0, 32)\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}` as UUID\n}\n\nfunction baseCreateAssistantMessage(\n content: ContentBlock[],\n extra?: Partial<AssistantMessage>,\n): AssistantMessage {\n return {\n type: 'assistant',\n costUSD: 0,\n durationMs: 0,\n uuid: randomUUID(),\n message: {\n id: randomUUID(),\n model: '<synthetic>',\n role: 'assistant',\n stop_reason: 'stop_sequence',\n stop_sequence: '',\n type: 'message',\n usage: {\n input_tokens: 0,\n output_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n },\n content,\n },\n ...extra,\n }\n}\n\nexport function createAssistantMessage(content: string): AssistantMessage {\n return baseCreateAssistantMessage([\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ])\n}\n\nexport function createAssistantAPIErrorMessage(\n content: string,\n): AssistantMessage {\n return baseCreateAssistantMessage(\n [\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ],\n { isApiErrorMessage: true },\n )\n}\n\nexport type FullToolUseResult = {\n data: unknown\n resultForAssistant: ToolResultBlockParam['content']\n newMessages?: Message[]\n contextModifier?: { modifyContext: (ctx: any) => any }\n}\n\nexport function createUserMessage(\n content: string | ContentBlockParam[],\n toolUseResult?: FullToolUseResult,\n): UserMessage {\n const m: UserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content,\n },\n uuid: randomUUID(),\n toolUseResult,\n }\n return m\n}\n\nexport function createProgressMessage(\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n content: AssistantMessage,\n normalizedMessages: NormalizedMessage[],\n tools: Tool[],\n): ProgressMessage {\n return {\n type: 'progress',\n content,\n normalizedMessages,\n siblingToolUseIDs,\n tools,\n toolUseID,\n uuid: randomUUID(),\n }\n}\n\nexport function createToolResultStopMessage(\n toolUseID: string,\n): ToolResultBlockParam {\n return {\n type: 'tool_result',\n content: CANCEL_MESSAGE,\n is_error: true,\n tool_use_id: toolUseID,\n }\n}\n\nexport function extractTagFromMessage(\n message: Message,\n tagName: string,\n): string | null {\n if (message.type === 'progress') {\n return null\n }\n if (typeof message.message.content !== 'string') {\n return null\n }\n return extractTag(message.message.content, tagName)\n}\n\nexport function extractTag(html: string, tagName: string): string | null {\n if (!html.trim() || !tagName.trim()) {\n return null\n }\n\n const escapedTag = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n const pattern = new RegExp(\n `<${escapedTag}(?:\\\\s+[^>]*)?>` + '([\\\\s\\\\S]*?)' + `<\\\\/${escapedTag}>`,\n 'gi',\n )\n\n let match\n let depth = 0\n let lastIndex = 0\n const openingTag = new RegExp(`<${escapedTag}(?:\\\\s+[^>]*?)?>`, 'gi')\n const closingTag = new RegExp(`<\\\\/${escapedTag}>`, 'gi')\n\n while ((match = pattern.exec(html)) !== null) {\n const content = match[1]\n const beforeMatch = html.slice(lastIndex, match.index)\n\n depth = 0\n\n openingTag.lastIndex = 0\n while (openingTag.exec(beforeMatch) !== null) {\n depth++\n }\n\n closingTag.lastIndex = 0\n while (closingTag.exec(beforeMatch) !== null) {\n depth--\n }\n\n if (depth === 0 && content) {\n return content\n }\n\n lastIndex = match.index + match[0].length\n }\n\n return null\n}\n\nexport function isNotEmptyMessage(message: Message): boolean {\n if (message.type === 'progress') {\n return true\n }\n\n if (typeof message.message.content === 'string') {\n return message.message.content.trim().length > 0\n }\n\n if (message.message.content.length === 0) {\n return false\n }\n\n if (message.message.content.length > 1) {\n return true\n }\n\n if (message.message.content[0]!.type !== 'text') {\n return true\n }\n\n return (\n message.message.content[0]!.text.trim().length > 0 &&\n message.message.content[0]!.text !== NO_CONTENT_MESSAGE &&\n message.message.content[0]!.text !== INTERRUPT_MESSAGE_FOR_TOOL_USE\n )\n}\n\ntype NormalizedUserMessage = {\n message: {\n content: [\n | TextBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam,\n ]\n role: 'user'\n }\n type: 'user'\n uuid: UUID\n}\n\nexport type NormalizedMessage =\n | NormalizedUserMessage\n | AssistantMessage\n | ProgressMessage\n\nexport function normalizeMessages(messages: Message[]): NormalizedMessage[] {\n return messages.flatMap(message => {\n if (message.type === 'progress') {\n return [message] as NormalizedMessage[]\n }\n if (typeof message.message.content === 'string') {\n return [message] as NormalizedMessage[]\n }\n const contentBlocks = message.message.content.filter(\n block =>\n !(\n block.type === 'thinking' &&\n (typeof (block as any).thinking !== 'string' ||\n (block as any).thinking.trim().length === 0)\n ),\n )\n\n return contentBlocks.map((block, blockIndex) => {\n switch (message.type) {\n case 'assistant':\n const baseSeed = String(\n (message as any).uuid ??\n (message as any).message?.id ??\n randomUUID(),\n )\n return {\n type: 'assistant',\n uuid: stableUuidFromSeed(`${baseSeed}:${blockIndex}`),\n message: {\n ...message.message,\n content: [block],\n },\n costUSD:\n (message as AssistantMessage).costUSD / contentBlocks.length,\n durationMs: (message as AssistantMessage).durationMs,\n } as NormalizedMessage\n case 'user':\n return message as NormalizedUserMessage\n }\n })\n })\n}\n\ntype ToolUseRequestMessage = AssistantMessage & {\n message: { content: any[] }\n}\n\ntype ToolUseLikeBlockParam = ToolUseBlockParam & {\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\n}\n\nfunction isToolUseLikeBlockParam(block: any): block is ToolUseLikeBlockParam {\n return (\n block &&\n typeof block === 'object' &&\n (block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use') &&\n typeof block.id === 'string'\n )\n}\n\nfunction isToolUseRequestMessage(\n message: Message,\n): message is ToolUseRequestMessage {\n return (\n message.type === 'assistant' &&\n 'costUSD' in message &&\n message.message.content.some(isToolUseLikeBlockParam)\n )\n}\n\nexport function reorderMessages(\n messages: NormalizedMessage[],\n): NormalizedMessage[] {\n const ms: NormalizedMessage[] = []\n const toolUseMessages: ToolUseRequestMessage[] = []\n\n for (const message of messages) {\n if (isToolUseRequestMessage(message)) {\n toolUseMessages.push(message)\n }\n\n if (message.type === 'progress') {\n const existingProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === message.toolUseID,\n )\n if (existingProgressMessage) {\n ms[ms.indexOf(existingProgressMessage)] = message\n continue\n }\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === message.toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content[0]?.type === 'tool_result'\n ) {\n const toolUseID = (message.message.content[0] as ToolResultBlockParam)\n ?.tool_use_id\n\n const lastProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n )\n if (lastProgressMessage) {\n ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message)\n continue\n }\n\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n else {\n ms.push(message)\n }\n }\n\n return ms\n}\n\nconst getToolResultIDs = memoize(\n (normalizedMessages: NormalizedMessage[]): { [toolUseID: string]: boolean } =>\n Object.fromEntries(\n normalizedMessages.flatMap(_ =>\n _.type === 'user' && _.message.content[0]?.type === 'tool_result'\n ? [\n [\n _.message.content[0]!.tool_use_id,\n _.message.content[0]!.is_error ?? false,\n ],\n ]\n : ([] as [string, boolean][]),\n ),\n ),\n)\n\nexport function getUnresolvedToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const toolResults = getToolResultIDs(normalizedMessages)\n return new Set(\n normalizedMessages\n .filter(\n (\n _,\n ): _ is AssistantMessage & {\n message: { content: [ToolUseLikeBlockParam] }\n } =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n !(_.message.content[0].id in toolResults),\n )\n .map(_ => _.message.content[0].id),\n )\n}\n\nexport function getInProgressToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages)\n\n function isQueuedWaitingProgressMessage(message: NormalizedMessage): boolean {\n if (message.type !== 'progress') return false\n const firstBlock = message.content.message.content[0]\n if (!firstBlock || firstBlock.type !== 'text') return false\n const rawText = String(firstBlock.text ?? '')\n const text = rawText.startsWith('<tool-progress>')\n ? (extractTag(rawText, 'tool-progress') ?? rawText)\n : rawText\n return text.trim() === 'Waiting\u2026'\n }\n\n const toolUseIDsThatHaveProgressMessages = new Set(\n normalizedMessages\n .filter(\n (_): _ is ProgressMessage =>\n _.type === 'progress' && !isQueuedWaitingProgressMessage(_),\n )\n .map(_ => _.toolUseID),\n )\n return new Set(\n (\n normalizedMessages.filter(_ => {\n if (_.type !== 'assistant') {\n return false\n }\n const firstBlock = _.message.content[0]\n if (!isToolUseLikeBlockParam(firstBlock)) return false\n const toolUseID = firstBlock.id\n if (toolUseID === unresolvedToolUseIDs.values().next().value) {\n return true\n }\n\n if (\n toolUseIDsThatHaveProgressMessages.has(toolUseID) &&\n unresolvedToolUseIDs.has(toolUseID)\n ) {\n return true\n }\n\n return false\n }) as AssistantMessage[]\n ).map(_ => (_.message.content[0]! as ToolUseBlockParam).id),\n )\n}\n\nexport function getErroredToolUseMessages(\n normalizedMessages: NormalizedMessage[],\n): AssistantMessage[] {\n const toolResults = getToolResultIDs(normalizedMessages)\n return normalizedMessages.filter(\n _ =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n _.message.content[0].id in toolResults &&\n toolResults[_.message.content[0].id],\n ) as AssistantMessage[]\n}\n\nexport function normalizeMessagesForAPI(\n messages: Message[],\n): (UserMessage | AssistantMessage)[] {\n function isSyntheticApiErrorMessage(message: Message): boolean {\n return (\n message.type === 'assistant' &&\n message.isApiErrorMessage === true &&\n message.message.model === '<synthetic>'\n )\n }\n\n function normalizeUserContent(\n content: UserMessage['message']['content'],\n ): ContentBlockParam[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }]\n }\n return content\n }\n\n function toolResultsFirst(content: ContentBlockParam[]): ContentBlockParam[] {\n const toolResults: ContentBlockParam[] = []\n const rest: ContentBlockParam[] = []\n for (const block of content) {\n if (block.type === 'tool_result') {\n toolResults.push(block)\n } else {\n rest.push(block)\n }\n }\n return [...toolResults, ...rest]\n }\n\n function mergeUserMessages(\n base: UserMessage,\n next: UserMessage,\n ): UserMessage {\n const baseBlocks = normalizeUserContent(base.message.content)\n const nextBlocks = normalizeUserContent(next.message.content)\n return {\n ...base,\n message: {\n ...base.message,\n content: toolResultsFirst([...baseBlocks, ...nextBlocks]),\n },\n }\n }\n\n function isUserToolResultMessage(message: Message): message is UserMessage {\n if (message.type !== 'user') return false\n if (!Array.isArray(message.message.content)) return false\n return message.message.content.some(block => block.type === 'tool_result')\n }\n\n const result: (UserMessage | AssistantMessage)[] = []\n for (const message of messages) {\n if (message.type === 'progress') continue\n if (isSyntheticApiErrorMessage(message)) continue\n\n switch (message.type) {\n case 'user': {\n const prev = last(result)\n if (prev?.type === 'user') {\n result[result.indexOf(prev)] = mergeUserMessages(prev, message)\n } else {\n result.push(message)\n }\n break\n }\n case 'assistant': {\n let merged = false\n for (let i = result.length - 1; i >= 0; i--) {\n const prev = result[i]\n if (prev.type !== 'assistant' && !isUserToolResultMessage(prev)) {\n break\n }\n if (prev.type === 'assistant') {\n if (prev.message.id === message.message.id) {\n result[i] = {\n ...prev,\n message: {\n ...prev.message,\n content: [\n ...(Array.isArray(prev.message.content)\n ? prev.message.content\n : []),\n ...(Array.isArray(message.message.content)\n ? message.message.content\n : []),\n ],\n },\n }\n merged = true\n }\n break\n }\n }\n if (!merged) {\n result.push(message)\n }\n break\n }\n }\n }\n\n return result\n}\n\nexport function normalizeContentFromAPI(\n content: APIMessage['content'],\n): APIMessage['content'] {\n const filteredContent = content.filter(\n _ => _.type !== 'text' || _.text.trim().length > 0,\n )\n\n if (filteredContent.length === 0) {\n return [{ type: 'text', text: NO_CONTENT_MESSAGE, citations: [] }]\n }\n\n return filteredContent\n}\n\nexport function isEmptyMessageText(text: string): boolean {\n return (\n stripSystemMessages(text).trim() === '' ||\n text.trim() === NO_CONTENT_MESSAGE\n )\n}\nconst STRIPPED_TAGS = [\n 'commit_analysis',\n 'context',\n 'function_analysis',\n 'pr_analysis',\n]\n\nexport function stripSystemMessages(content: string): string {\n const regex = new RegExp(`<(${STRIPPED_TAGS.join('|')})>.*?</\\\\1>\\n?`, 'gs')\n return content.replace(regex, '').trim()\n}\n\nexport function getToolUseID(message: NormalizedMessage): string | null {\n switch (message.type) {\n case 'assistant':\n return isToolUseLikeBlockParam(message.message.content[0])\n ? message.message.content[0].id\n : null\n case 'user':\n if (message.message.content[0]?.type !== 'tool_result') {\n return null\n }\n return message.message.content[0].tool_use_id\n case 'progress':\n return message.toolUseID\n }\n}\n\nexport function getLastAssistantMessageId(\n messages: Message[],\n): string | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message && message.type === 'assistant') {\n return message.message.id\n }\n }\n return undefined\n}\n", "export const API_ERROR_MESSAGE_PREFIX = 'API Error'\nexport const PROMPT_TOO_LONG_ERROR_MESSAGE = 'Prompt is too long'\nexport const CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE = 'Credit balance is too low'\nexport const INVALID_API_KEY_ERROR_MESSAGE =\n 'Invalid API key \u00B7 Please run /login'\nexport const NO_CONTENT_MESSAGE = '(no content)'\n\nexport const MAIN_QUERY_TEMPERATURE = 1\n", "export * from './core'\n\nimport type { SetToolJSXFn, ToolUseContext } from '@tool'\nimport type { Message } from '@query'\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'prompt' | 'pyb',\n setToolJSX: SetToolJSXFn,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n options?: {\n isPybRequest?: boolean\n pybContext?: string\n }\n },\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }> | null,\n): Promise<Message[]> {\n const impl = await import('./userInput')\n return impl.processUserInput(input, mode, setToolJSX, context, pastedImages)\n}\n\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,13 +2,13 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  MarketplaceManifestSchema
5
- } from "./chunk-CY54GWA4.js";
5
+ } from "./chunk-WTWAFAPK.js";
6
6
  import {
7
7
  parseFrontmatter
8
- } from "./chunk-TCCONYNZ.js";
8
+ } from "./chunk-Q2ULATNS.js";
9
9
  import {
10
10
  getCwd
11
- } from "./chunk-VVZQUQB5.js";
11
+ } from "./chunk-7BBVZG5B.js";
12
12
 
13
13
  // src/services/plugins/pluginValidation.ts
14
14
  import { existsSync, lstatSync, readFileSync } from "node:fs";
@@ -409,8 +409,8 @@ function validatePluginOrMarketplacePath(path) {
409
409
  const stat = lstatSync(abs);
410
410
  let filePath = abs;
411
411
  if (stat.isDirectory()) {
412
- const marketplace = join(abs, ".kode-plugin", "marketplace.json");
413
- const plugin = join(abs, ".kode-plugin", "plugin.json");
412
+ const marketplace = join(abs, ".pyb-plugin", "marketplace.json");
413
+ const plugin = join(abs, ".pyb-plugin", "plugin.json");
414
414
  const legacyMarketplace = join(abs, ".claude-plugin", "marketplace.json");
415
415
  const legacyPlugin = join(abs, ".claude-plugin", "plugin.json");
416
416
  if (existsSync(marketplace)) filePath = marketplace;
@@ -425,7 +425,7 @@ function validatePluginOrMarketplacePath(path) {
425
425
  errors: [
426
426
  {
427
427
  path: "directory",
428
- message: "No manifest found in directory. Expected .kode-plugin/marketplace.json or .kode-plugin/plugin.json (legacy .claude-plugin/* is also supported)"
428
+ message: "No manifest found in directory. Expected .pyb-plugin/marketplace.json or .pyb-plugin/plugin.json (legacy .claude-plugin/* is also supported)"
429
429
  }
430
430
  ],
431
431
  warnings: []
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/services/plugins/pluginValidation.ts"],
4
- "sourcesContent": ["import { existsSync, lstatSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve, sep } from 'node:path'\nimport figures from 'figures'\nimport { z } from 'zod'\nimport { getCwd } from '@utils/state'\nimport { parseFrontmatter } from '@services/customCommands'\nimport { MarketplaceManifestSchema } from '@services/skillMarketplace'\n\nexport type ValidationIssue = {\n path: string\n message: string\n}\n\nexport type ValidationResult = {\n success: boolean\n fileType: 'plugin' | 'marketplace'\n filePath: string\n errors: ValidationIssue[]\n warnings: ValidationIssue[]\n}\n\nconst PluginManifestSchema = z\n .strictObject({\n name: z.string().min(1),\n version: z.string().optional(),\n description: z.string().optional(),\n author: z.unknown().optional(),\n homepage: z.string().optional(),\n repository: z.unknown().optional(),\n license: z.string().optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),\n mcpServers: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n })\n .passthrough()\n\nfunction resolveFromAgentCwd(input: string): string {\n const trimmed = input.trim()\n if (!trimmed) return trimmed\n if (trimmed.startsWith('~')) {\n return trimmed\n }\n if (trimmed.startsWith(sep)) return trimmed\n return resolve(getCwd(), trimmed)\n}\n\nfunction validateRelativePath(path: string): string | null {\n if (!path.startsWith('./')) return 'must start with \"./\"'\n if (path.split('/').includes('..')) return 'must not contain \"..\"'\n if (path.includes('\\\\')) return 'must use forward slashes'\n return null\n}\n\nfunction safeResolveWithin(baseDir: string, rel: string): string | null {\n const normalized = rel.replace(/\\\\/g, '/')\n if (!normalized.startsWith('./') || normalized.split('/').includes('..'))\n return null\n const abs = resolve(baseDir, normalized.split('/').join(sep))\n const base = resolve(baseDir)\n if (!abs.startsWith(base + sep) && abs !== base) return null\n return abs\n}\n\nfunction validateSkillDir(skillDir: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n const name = skillDir.split(sep).pop() || ''\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name) || name.length > 64) {\n issues.push({\n path: `skills/${name}`,\n message:\n 'Invalid skill directory name (must be lowercase kebab-case, 1\u201364 chars)',\n })\n return issues\n }\n\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) {\n issues.push({\n path: `skills/${name}`,\n message: 'Missing SKILL.md (or skill.md)',\n })\n return issues\n }\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter } = parseFrontmatter(raw)\n const declared =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n if (!declared) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'Missing required frontmatter field: name',\n })\n } else if (declared !== name) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: `Frontmatter name must match directory name (dir=${name}, name=${declared})`,\n })\n }\n\n const description =\n typeof (frontmatter as any).description === 'string'\n ? String((frontmatter as any).description).trim()\n : ''\n if (!description) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'Missing required frontmatter field: description',\n })\n } else if (description.length > 1024) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'description must be <= 1024 characters',\n })\n }\n } catch (err) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: `Failed to parse SKILL.md: ${err instanceof Error ? err.message : String(err)}`,\n })\n }\n\n return issues\n}\n\nfunction validateMarketplaceJson(filePath: string): ValidationResult {\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n let raw: string\n try {\n raw = readFileSync(filePath, 'utf8')\n } catch (err) {\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors: [\n { path: 'file', message: `Failed to read file: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors: [\n { path: 'json', message: `Invalid JSON syntax: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n const parsed = MarketplaceManifestSchema.safeParse(json)\n if (!parsed.success) {\n errors.push(\n ...parsed.error.issues.map(i => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n )\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors,\n warnings,\n }\n }\n\n const data = parsed.data\n const topLevelDescription =\n typeof (data as any).description === 'string'\n ? String((data as any).description).trim()\n : ''\n const metadataDescription =\n typeof (data.metadata as any)?.description === 'string'\n ? String((data.metadata as any).description).trim()\n : ''\n if (!topLevelDescription && !metadataDescription) {\n warnings.push({\n path: 'description',\n message:\n 'No marketplace description provided. Adding a description helps users understand what this marketplace offers',\n })\n }\n if (!data.plugins || data.plugins.length === 0) {\n warnings.push({\n path: 'plugins',\n message: 'Marketplace has no plugins defined',\n })\n }\n\n const pluginNames = new Set<string>()\n for (const [index, plugin] of data.plugins.entries()) {\n if (pluginNames.has(plugin.name)) {\n errors.push({\n path: `plugins[${index}].name`,\n message: `Duplicate plugin name \"${plugin.name}\"`,\n })\n }\n pluginNames.add(plugin.name)\n\n const source = plugin.source ?? './'\n const sourceErr = validateRelativePath(source)\n if (sourceErr)\n errors.push({ path: `plugins[${index}].source`, message: sourceErr })\n\n const marketplaceRoot = dirname(dirname(filePath))\n const pluginBase = safeResolveWithin(marketplaceRoot, source)\n if (!pluginBase) {\n errors.push({\n path: `plugins[${index}].source`,\n message: 'Invalid source path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(pluginBase) || !lstatSync(pluginBase).isDirectory()) {\n errors.push({\n path: `plugins[${index}].source`,\n message: `Source path not found: ${source}`,\n })\n continue\n }\n\n const skillPaths = plugin.skills ?? []\n for (const [j, rel] of skillPaths.entries()) {\n const err = validateRelativePath(rel)\n if (err) {\n errors.push({ path: `plugins[${index}].skills[${j}]`, message: err })\n continue\n }\n const abs = safeResolveWithin(pluginBase, rel)\n if (!abs) {\n errors.push({\n path: `plugins[${index}].skills[${j}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {\n errors.push({\n path: `plugins[${index}].skills[${j}]`,\n message: `Skill directory not found: ${rel}`,\n })\n continue\n }\n errors.push(\n ...validateSkillDir(abs).map(e => ({\n ...e,\n path: `plugins[${index}].skills[${j}]: ${e.path}`,\n })),\n )\n }\n\n const commandPaths = plugin.commands ?? []\n for (const [j, rel] of commandPaths.entries()) {\n const err = validateRelativePath(rel)\n if (err) {\n errors.push({ path: `plugins[${index}].commands[${j}]`, message: err })\n continue\n }\n const abs = safeResolveWithin(pluginBase, rel)\n if (!abs) {\n errors.push({\n path: `plugins[${index}].commands[${j}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {\n errors.push({\n path: `plugins[${index}].commands[${j}]`,\n message: `Command directory not found: ${rel}`,\n })\n }\n }\n }\n\n return {\n success: errors.length === 0,\n fileType: 'marketplace',\n filePath,\n errors,\n warnings,\n }\n}\n\nfunction validatePluginJson(filePath: string): ValidationResult {\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n let raw: string\n try {\n raw = readFileSync(filePath, 'utf8')\n } catch (err) {\n return {\n success: false,\n fileType: 'plugin',\n filePath,\n errors: [\n { path: 'file', message: `Failed to read file: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n return {\n success: false,\n fileType: 'plugin',\n filePath,\n errors: [\n { path: 'json', message: `Invalid JSON syntax: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n const parsed = PluginManifestSchema.safeParse(json)\n if (!parsed.success) {\n errors.push(\n ...parsed.error.issues.map(i => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n )\n return { success: false, fileType: 'plugin', filePath, errors, warnings }\n }\n\n const data = parsed.data\n\n if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(data.name)) {\n errors.push({\n path: 'name',\n message: 'Must be kebab-case and start with a letter',\n })\n }\n if (\n data.version &&\n !/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/.test(\n data.version,\n )\n ) {\n errors.push({\n path: 'version',\n message: 'Invalid semantic version (expected MAJOR.MINOR.PATCH)',\n })\n }\n if (data.homepage) {\n try {\n // eslint-disable-next-line no-new\n new URL(data.homepage)\n } catch {\n errors.push({ path: 'homepage', message: 'Invalid URL' })\n }\n }\n if (typeof data.repository === 'string') {\n try {\n // eslint-disable-next-line no-new\n new URL(data.repository)\n } catch {\n errors.push({ path: 'repository', message: 'Invalid URL' })\n }\n }\n if (!data.version) {\n warnings.push({\n path: 'version',\n message:\n 'No version specified. Consider adding a version following semver (e.g., \"1.0.0\")',\n })\n }\n if (!data.description) {\n warnings.push({\n path: 'description',\n message:\n 'No description provided. Adding a description helps users understand what your plugin does',\n })\n }\n if (!data.author) {\n warnings.push({\n path: 'author',\n message:\n 'No author information provided. Consider adding author details for plugin attribution',\n })\n }\n\n const pluginRoot = dirname(dirname(filePath))\n\n const validatePathList = (field: string, value: unknown) => {\n if (!value) return\n const values = Array.isArray(value) ? value : [value]\n for (const [idx, p] of values.entries()) {\n if (typeof p !== 'string') continue\n const err = validateRelativePath(p)\n if (err) errors.push({ path: `${field}[${idx}]`, message: err })\n const abs = safeResolveWithin(pluginRoot, p)\n if (!abs) {\n errors.push({\n path: `${field}[${idx}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n } else if (!existsSync(abs)) {\n errors.push({\n path: `${field}[${idx}]`,\n message: `Path not found: ${p}`,\n })\n }\n }\n }\n\n validatePathList('commands', data.commands)\n validatePathList('agents', data.agents)\n validatePathList('skills', data.skills)\n\n if (typeof data.hooks === 'string') validatePathList('hooks', data.hooks)\n if (typeof data.mcpServers === 'string')\n validatePathList('mcpServers', data.mcpServers)\n\n return {\n success: errors.length === 0,\n fileType: 'plugin',\n filePath,\n errors,\n warnings,\n }\n}\n\nexport function validatePluginOrMarketplacePath(\n path: string,\n): ValidationResult {\n const abs = resolveFromAgentCwd(path)\n if (!abs) {\n return {\n success: false,\n fileType: 'plugin',\n filePath: '',\n errors: [{ path: 'path', message: 'Path is required' }],\n warnings: [],\n }\n }\n if (!existsSync(abs)) {\n return {\n success: false,\n fileType: 'plugin',\n filePath: abs,\n errors: [{ path: 'file', message: `Path not found: ${abs}` }],\n warnings: [],\n }\n }\n\n const stat = lstatSync(abs)\n let filePath = abs\n if (stat.isDirectory()) {\n const marketplace = join(abs, '.kode-plugin', 'marketplace.json')\n const plugin = join(abs, '.kode-plugin', 'plugin.json')\n const legacyMarketplace = join(abs, '.claude-plugin', 'marketplace.json')\n const legacyPlugin = join(abs, '.claude-plugin', 'plugin.json')\n if (existsSync(marketplace)) filePath = marketplace\n else if (existsSync(plugin)) filePath = plugin\n else if (existsSync(legacyMarketplace)) filePath = legacyMarketplace\n else if (existsSync(legacyPlugin)) filePath = legacyPlugin\n else {\n return {\n success: false,\n fileType: 'plugin',\n filePath: abs,\n errors: [\n {\n path: 'directory',\n message:\n 'No manifest found in directory. Expected .kode-plugin/marketplace.json or .kode-plugin/plugin.json (legacy .claude-plugin/* is also supported)',\n },\n ],\n warnings: [],\n }\n }\n }\n\n if (filePath.endsWith('marketplace.json'))\n return validateMarketplaceJson(filePath)\n if (filePath.endsWith('plugin.json')) return validatePluginJson(filePath)\n\n try {\n const raw = readFileSync(filePath, 'utf8')\n const json = JSON.parse(raw)\n if (\n json &&\n typeof json === 'object' &&\n Array.isArray((json as any).plugins)\n ) {\n return validateMarketplaceJson(filePath)\n }\n } catch {}\n return validatePluginJson(filePath)\n}\n\nexport function formatValidationResult(result: ValidationResult): string {\n const lines: string[] = []\n for (const err of result.errors) {\n lines.push(` ${figures.pointer} ${err.path}: ${err.message}`)\n }\n for (const warn of result.warnings) {\n lines.push(` ${figures.pointer} ${warn.path}: ${warn.message}`)\n }\n\n lines.push('')\n\n if (result.success) {\n if (result.warnings.length > 0) {\n lines.push(`${figures.tick} Validation passed with warnings`)\n } else {\n lines.push(`${figures.tick} Validation passed`)\n }\n } else {\n lines.push(`${figures.cross} Validation failed`)\n }\n\n return lines.join('\\n')\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { existsSync, lstatSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve, sep } from 'node:path'\nimport figures from 'figures'\nimport { z } from 'zod'\nimport { getCwd } from '@utils/state'\nimport { parseFrontmatter } from '@services/customCommands'\nimport { MarketplaceManifestSchema } from '@services/skillMarketplace'\n\nexport type ValidationIssue = {\n path: string\n message: string\n}\n\nexport type ValidationResult = {\n success: boolean\n fileType: 'plugin' | 'marketplace'\n filePath: string\n errors: ValidationIssue[]\n warnings: ValidationIssue[]\n}\n\nconst PluginManifestSchema = z\n .strictObject({\n name: z.string().min(1),\n version: z.string().optional(),\n description: z.string().optional(),\n author: z.unknown().optional(),\n homepage: z.string().optional(),\n repository: z.unknown().optional(),\n license: z.string().optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),\n mcpServers: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n })\n .passthrough()\n\nfunction resolveFromAgentCwd(input: string): string {\n const trimmed = input.trim()\n if (!trimmed) return trimmed\n if (trimmed.startsWith('~')) {\n return trimmed\n }\n if (trimmed.startsWith(sep)) return trimmed\n return resolve(getCwd(), trimmed)\n}\n\nfunction validateRelativePath(path: string): string | null {\n if (!path.startsWith('./')) return 'must start with \"./\"'\n if (path.split('/').includes('..')) return 'must not contain \"..\"'\n if (path.includes('\\\\')) return 'must use forward slashes'\n return null\n}\n\nfunction safeResolveWithin(baseDir: string, rel: string): string | null {\n const normalized = rel.replace(/\\\\/g, '/')\n if (!normalized.startsWith('./') || normalized.split('/').includes('..'))\n return null\n const abs = resolve(baseDir, normalized.split('/').join(sep))\n const base = resolve(baseDir)\n if (!abs.startsWith(base + sep) && abs !== base) return null\n return abs\n}\n\nfunction validateSkillDir(skillDir: string): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n const name = skillDir.split(sep).pop() || ''\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name) || name.length > 64) {\n issues.push({\n path: `skills/${name}`,\n message:\n 'Invalid skill directory name (must be lowercase kebab-case, 1\u201364 chars)',\n })\n return issues\n }\n\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) {\n issues.push({\n path: `skills/${name}`,\n message: 'Missing SKILL.md (or skill.md)',\n })\n return issues\n }\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter } = parseFrontmatter(raw)\n const declared =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n if (!declared) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'Missing required frontmatter field: name',\n })\n } else if (declared !== name) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: `Frontmatter name must match directory name (dir=${name}, name=${declared})`,\n })\n }\n\n const description =\n typeof (frontmatter as any).description === 'string'\n ? String((frontmatter as any).description).trim()\n : ''\n if (!description) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'Missing required frontmatter field: description',\n })\n } else if (description.length > 1024) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: 'description must be <= 1024 characters',\n })\n }\n } catch (err) {\n issues.push({\n path: `${name}/SKILL.md`,\n message: `Failed to parse SKILL.md: ${err instanceof Error ? err.message : String(err)}`,\n })\n }\n\n return issues\n}\n\nfunction validateMarketplaceJson(filePath: string): ValidationResult {\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n let raw: string\n try {\n raw = readFileSync(filePath, 'utf8')\n } catch (err) {\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors: [\n { path: 'file', message: `Failed to read file: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors: [\n { path: 'json', message: `Invalid JSON syntax: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n const parsed = MarketplaceManifestSchema.safeParse(json)\n if (!parsed.success) {\n errors.push(\n ...parsed.error.issues.map(i => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n )\n return {\n success: false,\n fileType: 'marketplace',\n filePath,\n errors,\n warnings,\n }\n }\n\n const data = parsed.data\n const topLevelDescription =\n typeof (data as any).description === 'string'\n ? String((data as any).description).trim()\n : ''\n const metadataDescription =\n typeof (data.metadata as any)?.description === 'string'\n ? String((data.metadata as any).description).trim()\n : ''\n if (!topLevelDescription && !metadataDescription) {\n warnings.push({\n path: 'description',\n message:\n 'No marketplace description provided. Adding a description helps users understand what this marketplace offers',\n })\n }\n if (!data.plugins || data.plugins.length === 0) {\n warnings.push({\n path: 'plugins',\n message: 'Marketplace has no plugins defined',\n })\n }\n\n const pluginNames = new Set<string>()\n for (const [index, plugin] of data.plugins.entries()) {\n if (pluginNames.has(plugin.name)) {\n errors.push({\n path: `plugins[${index}].name`,\n message: `Duplicate plugin name \"${plugin.name}\"`,\n })\n }\n pluginNames.add(plugin.name)\n\n const source = plugin.source ?? './'\n const sourceErr = validateRelativePath(source)\n if (sourceErr)\n errors.push({ path: `plugins[${index}].source`, message: sourceErr })\n\n const marketplaceRoot = dirname(dirname(filePath))\n const pluginBase = safeResolveWithin(marketplaceRoot, source)\n if (!pluginBase) {\n errors.push({\n path: `plugins[${index}].source`,\n message: 'Invalid source path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(pluginBase) || !lstatSync(pluginBase).isDirectory()) {\n errors.push({\n path: `plugins[${index}].source`,\n message: `Source path not found: ${source}`,\n })\n continue\n }\n\n const skillPaths = plugin.skills ?? []\n for (const [j, rel] of skillPaths.entries()) {\n const err = validateRelativePath(rel)\n if (err) {\n errors.push({ path: `plugins[${index}].skills[${j}]`, message: err })\n continue\n }\n const abs = safeResolveWithin(pluginBase, rel)\n if (!abs) {\n errors.push({\n path: `plugins[${index}].skills[${j}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {\n errors.push({\n path: `plugins[${index}].skills[${j}]`,\n message: `Skill directory not found: ${rel}`,\n })\n continue\n }\n errors.push(\n ...validateSkillDir(abs).map(e => ({\n ...e,\n path: `plugins[${index}].skills[${j}]: ${e.path}`,\n })),\n )\n }\n\n const commandPaths = plugin.commands ?? []\n for (const [j, rel] of commandPaths.entries()) {\n const err = validateRelativePath(rel)\n if (err) {\n errors.push({ path: `plugins[${index}].commands[${j}]`, message: err })\n continue\n }\n const abs = safeResolveWithin(pluginBase, rel)\n if (!abs) {\n errors.push({\n path: `plugins[${index}].commands[${j}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n continue\n }\n if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {\n errors.push({\n path: `plugins[${index}].commands[${j}]`,\n message: `Command directory not found: ${rel}`,\n })\n }\n }\n }\n\n return {\n success: errors.length === 0,\n fileType: 'marketplace',\n filePath,\n errors,\n warnings,\n }\n}\n\nfunction validatePluginJson(filePath: string): ValidationResult {\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n let raw: string\n try {\n raw = readFileSync(filePath, 'utf8')\n } catch (err) {\n return {\n success: false,\n fileType: 'plugin',\n filePath,\n errors: [\n { path: 'file', message: `Failed to read file: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n return {\n success: false,\n fileType: 'plugin',\n filePath,\n errors: [\n { path: 'json', message: `Invalid JSON syntax: ${String(err)}` },\n ],\n warnings: [],\n }\n }\n\n const parsed = PluginManifestSchema.safeParse(json)\n if (!parsed.success) {\n errors.push(\n ...parsed.error.issues.map(i => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n )\n return { success: false, fileType: 'plugin', filePath, errors, warnings }\n }\n\n const data = parsed.data\n\n if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(data.name)) {\n errors.push({\n path: 'name',\n message: 'Must be kebab-case and start with a letter',\n })\n }\n if (\n data.version &&\n !/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/.test(\n data.version,\n )\n ) {\n errors.push({\n path: 'version',\n message: 'Invalid semantic version (expected MAJOR.MINOR.PATCH)',\n })\n }\n if (data.homepage) {\n try {\n // eslint-disable-next-line no-new\n new URL(data.homepage)\n } catch {\n errors.push({ path: 'homepage', message: 'Invalid URL' })\n }\n }\n if (typeof data.repository === 'string') {\n try {\n // eslint-disable-next-line no-new\n new URL(data.repository)\n } catch {\n errors.push({ path: 'repository', message: 'Invalid URL' })\n }\n }\n if (!data.version) {\n warnings.push({\n path: 'version',\n message:\n 'No version specified. Consider adding a version following semver (e.g., \"1.0.0\")',\n })\n }\n if (!data.description) {\n warnings.push({\n path: 'description',\n message:\n 'No description provided. Adding a description helps users understand what your plugin does',\n })\n }\n if (!data.author) {\n warnings.push({\n path: 'author',\n message:\n 'No author information provided. Consider adding author details for plugin attribution',\n })\n }\n\n const pluginRoot = dirname(dirname(filePath))\n\n const validatePathList = (field: string, value: unknown) => {\n if (!value) return\n const values = Array.isArray(value) ? value : [value]\n for (const [idx, p] of values.entries()) {\n if (typeof p !== 'string') continue\n const err = validateRelativePath(p)\n if (err) errors.push({ path: `${field}[${idx}]`, message: err })\n const abs = safeResolveWithin(pluginRoot, p)\n if (!abs) {\n errors.push({\n path: `${field}[${idx}]`,\n message: 'Invalid path (must be ./..., no .., forward slashes)',\n })\n } else if (!existsSync(abs)) {\n errors.push({\n path: `${field}[${idx}]`,\n message: `Path not found: ${p}`,\n })\n }\n }\n }\n\n validatePathList('commands', data.commands)\n validatePathList('agents', data.agents)\n validatePathList('skills', data.skills)\n\n if (typeof data.hooks === 'string') validatePathList('hooks', data.hooks)\n if (typeof data.mcpServers === 'string')\n validatePathList('mcpServers', data.mcpServers)\n\n return {\n success: errors.length === 0,\n fileType: 'plugin',\n filePath,\n errors,\n warnings,\n }\n}\n\nexport function validatePluginOrMarketplacePath(\n path: string,\n): ValidationResult {\n const abs = resolveFromAgentCwd(path)\n if (!abs) {\n return {\n success: false,\n fileType: 'plugin',\n filePath: '',\n errors: [{ path: 'path', message: 'Path is required' }],\n warnings: [],\n }\n }\n if (!existsSync(abs)) {\n return {\n success: false,\n fileType: 'plugin',\n filePath: abs,\n errors: [{ path: 'file', message: `Path not found: ${abs}` }],\n warnings: [],\n }\n }\n\n const stat = lstatSync(abs)\n let filePath = abs\n if (stat.isDirectory()) {\n const marketplace = join(abs, '.pyb-plugin', 'marketplace.json')\n const plugin = join(abs, '.pyb-plugin', 'plugin.json')\n const legacyMarketplace = join(abs, '.claude-plugin', 'marketplace.json')\n const legacyPlugin = join(abs, '.claude-plugin', 'plugin.json')\n if (existsSync(marketplace)) filePath = marketplace\n else if (existsSync(plugin)) filePath = plugin\n else if (existsSync(legacyMarketplace)) filePath = legacyMarketplace\n else if (existsSync(legacyPlugin)) filePath = legacyPlugin\n else {\n return {\n success: false,\n fileType: 'plugin',\n filePath: abs,\n errors: [\n {\n path: 'directory',\n message:\n 'No manifest found in directory. Expected .pyb-plugin/marketplace.json or .pyb-plugin/plugin.json (legacy .claude-plugin/* is also supported)',\n },\n ],\n warnings: [],\n }\n }\n }\n\n if (filePath.endsWith('marketplace.json'))\n return validateMarketplaceJson(filePath)\n if (filePath.endsWith('plugin.json')) return validatePluginJson(filePath)\n\n try {\n const raw = readFileSync(filePath, 'utf8')\n const json = JSON.parse(raw)\n if (\n json &&\n typeof json === 'object' &&\n Array.isArray((json as any).plugins)\n ) {\n return validateMarketplaceJson(filePath)\n }\n } catch {}\n return validatePluginJson(filePath)\n}\n\nexport function formatValidationResult(result: ValidationResult): string {\n const lines: string[] = []\n for (const err of result.errors) {\n lines.push(` ${figures.pointer} ${err.path}: ${err.message}`)\n }\n for (const warn of result.warnings) {\n lines.push(` ${figures.pointer} ${warn.path}: ${warn.message}`)\n }\n\n lines.push('')\n\n if (result.success) {\n if (result.warnings.length > 0) {\n lines.push(`${figures.tick} Validation passed with warnings`)\n } else {\n lines.push(`${figures.tick} Validation passed`)\n }\n } else {\n lines.push(`${figures.cross} Validation failed`)\n }\n\n return lines.join('\\n')\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -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-S74HKDFU.js";
5
+ } from "./chunk-SD4T5FIT.js";
6
6
 
7
7
  // src/utils/state/index.ts
8
8
  import { cwd } from "process";
@@ -106,16 +106,16 @@ function execFileNoThrow(file, args, abortSignal, timeout = 10 * SECONDS_IN_MINU
106
106
  import { memoize } from "lodash-es";
107
107
  import { join } from "path";
108
108
  import { homedir } from "os";
109
- function getKodeBaseDir() {
110
- return process.env.KODE_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), CONFIG_BASE_DIR);
109
+ function getPybBaseDir() {
110
+ return process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), CONFIG_BASE_DIR);
111
111
  }
112
112
  function getGlobalConfigFilePath() {
113
- return process.env.KODE_CONFIG_DIR || process.env.CLAUDE_CONFIG_DIR ? join(getKodeBaseDir(), "config.json") : join(homedir(), CONFIG_FILE);
113
+ return process.env.PYB_CONFIG_DIR || process.env.CLAUDE_CONFIG_DIR ? join(getPybBaseDir(), "config.json") : join(homedir(), CONFIG_FILE);
114
114
  }
115
115
  function getMemoryDir() {
116
- return join(getKodeBaseDir(), "memory");
116
+ return join(getPybBaseDir(), "memory");
117
117
  }
118
- var KODE_BASE_DIR = getKodeBaseDir();
118
+ var PYB_BASE_DIR = getPybBaseDir();
119
119
  var GLOBAL_CONFIG_FILE = getGlobalConfigFilePath();
120
120
  var MEMORY_DIR = getMemoryDir();
121
121
  var getIsDocker = memoize(async () => {
@@ -126,7 +126,7 @@ var getIsDocker = memoize(async () => {
126
126
  return process.platform === "linux";
127
127
  });
128
128
  var hasInternetAccess = memoize(async () => {
129
- const offline = process.env.KODE_OFFLINE ?? process.env.OFFLINE ?? process.env.NO_NETWORK ?? "";
129
+ const offline = process.env.PYB_OFFLINE ?? process.env.OFFLINE ?? process.env.NO_NETWORK ?? "";
130
130
  const normalized = String(offline).trim().toLowerCase();
131
131
  if (["1", "true", "yes", "on"].includes(normalized)) return false;
132
132
  return true;
@@ -1182,7 +1182,7 @@ function hydratePlanSlugFromMessages(messages, context) {
1182
1182
  return false;
1183
1183
  }
1184
1184
  function getPlanDirectory() {
1185
- const dir = join2(getKodeBaseDir(), "plans");
1185
+ const dir = join2(getPybBaseDir(), "plans");
1186
1186
  if (!existsSync(dir)) {
1187
1187
  mkdirSync(dir, { recursive: true });
1188
1188
  }
@@ -1257,10 +1257,10 @@ function getProjectDir(cwd2) {
1257
1257
  return cwd2.replace(/[^a-zA-Z0-9]/g, "-");
1258
1258
  }
1259
1259
  function getLegacyCacheRoot() {
1260
- return process.env.KODE_LEGACY_CACHE_ROOT ?? paths.cache;
1260
+ return process.env.PYB_LEGACY_CACHE_ROOT ?? paths.cache;
1261
1261
  }
1262
1262
  function getNewLogRoot() {
1263
- return process.env.KODE_LOG_ROOT ?? getKodeBaseDir();
1263
+ return process.env.PYB_LOG_ROOT ?? join3(getPybBaseDir(), "logs");
1264
1264
  }
1265
1265
  var CACHE_PATHS = {
1266
1266
  errors: () => join3(getNewLogRoot(), getProjectDir(process.cwd()), "errors"),
@@ -1586,7 +1586,7 @@ function getProjectDir2(cwd2) {
1586
1586
  }
1587
1587
  var PROJECT_ROOT = process.cwd();
1588
1588
  function getTaskOutputsDir() {
1589
- return join4(getKodeBaseDir(), getProjectDir2(PROJECT_ROOT), "tasks");
1589
+ return join4(getPybBaseDir(), getProjectDir2(PROJECT_ROOT), "tasks");
1590
1590
  }
1591
1591
  function getTaskOutputFilePath(taskId) {
1592
1592
  return join4(getTaskOutputsDir(), `${taskId}.output`);
@@ -1655,12 +1655,12 @@ function maybeAnnotateMacosSandboxStderr(stderr, sandbox) {
1655
1655
  if (platform !== "darwin") return stderr;
1656
1656
  if (stderr.includes("[sandbox]")) return stderr;
1657
1657
  const lower = stderr.toLowerCase();
1658
- const looksLikeSandboxViolation = stderr.includes("KODE_SANDBOX") || lower.includes("sandbox-exec") && (lower.includes("deny") || lower.includes("operation not permitted")) || lower.includes("operation not permitted") && lower.includes("sandbox");
1658
+ const looksLikeSandboxViolation = stderr.includes("PYB_SANDBOX") || stderr.includes("KODE_SANDBOX") || lower.includes("sandbox-exec") && (lower.includes("deny") || lower.includes("operation not permitted")) || lower.includes("operation not permitted") && lower.includes("sandbox");
1659
1659
  if (!looksLikeSandboxViolation) return stderr;
1660
1660
  return [
1661
1661
  stderr.trimEnd(),
1662
1662
  "",
1663
- "[sandbox] This failure looks like a macOS sandbox denial. Adjust sandbox settings (e.g. /sandbox or .kode/settings.json) to grant the minimal required access."
1663
+ "[sandbox] This failure looks like a macOS sandbox denial. Adjust sandbox settings (e.g. /sandbox or .pyb/settings.json) to grant the minimal required access."
1664
1664
  ].join("\n");
1665
1665
  }
1666
1666
  function hasGlobPattern(value) {
@@ -1702,9 +1702,9 @@ function buildLinuxBwrapFilesystemArgs(options) {
1702
1702
  if (writeConfig) {
1703
1703
  args.push("--ro-bind", "/", "/");
1704
1704
  const allowedRoots = [];
1705
- if (existsSync4("/tmp/kode")) {
1706
- args.push("--bind", "/tmp/kode", "/tmp/kode");
1707
- allowedRoots.push("/tmp/kode");
1705
+ if (existsSync4("/tmp/pyb")) {
1706
+ args.push("--bind", "/tmp/pyb", "/tmp/pyb");
1707
+ allowedRoots.push("/tmp/pyb");
1708
1708
  }
1709
1709
  for (const raw of writeConfig.allowOnly ?? []) {
1710
1710
  const resolved = normalizeLinuxSandboxPath(raw, { cwd: cwd2, homeDir });
@@ -1768,7 +1768,7 @@ function buildLinuxBwrapCommand(options) {
1768
1768
  "1",
1769
1769
  "--setenv",
1770
1770
  "TMPDIR",
1771
- "/tmp/kode"
1771
+ "/tmp/pyb"
1772
1772
  );
1773
1773
  if (!options.enableWeakerNestedSandbox) args.push("--proc", "/proc");
1774
1774
  args.push("--", options.binShellPath, "-c", options.command);
@@ -1778,7 +1778,7 @@ function buildSandboxEnvAssignments(options) {
1778
1778
  const httpProxyPort = options?.httpProxyPort;
1779
1779
  const socksProxyPort = options?.socksProxyPort;
1780
1780
  const platform = options?.platform ?? process.platform;
1781
- const env2 = ["SANDBOX_RUNTIME=1", "TMPDIR=/tmp/kode"];
1781
+ const env2 = ["SANDBOX_RUNTIME=1", "TMPDIR=/tmp/pyb"];
1782
1782
  if (!httpProxyPort && !socksProxyPort) return env2;
1783
1783
  const noProxy = [
1784
1784
  "localhost",
@@ -1954,12 +1954,12 @@ function buildMacosSandboxFileWriteRules(writeConfig, logTag) {
1954
1954
  return lines;
1955
1955
  }
1956
1956
  function buildMacosSandboxExecCommand(options) {
1957
- const logTag = "KODE_SANDBOX";
1957
+ const logTag = "PYB_SANDBOX";
1958
1958
  const profileLines = [
1959
1959
  "(version 1)",
1960
1960
  `(deny default (with message "${logTag}"))`,
1961
1961
  "",
1962
- "; Kode sandbox-exec profile (reference CLI compatible)",
1962
+ "; Pyb sandbox-exec profile (reference CLI compatible)",
1963
1963
  "",
1964
1964
  "(allow process*)",
1965
1965
  "(allow sysctl-read)",
@@ -2120,7 +2120,7 @@ var BunShell = class _BunShell {
2120
2120
  return null;
2121
2121
  }
2122
2122
  try {
2123
- mkdirSync4("/tmp/kode", { recursive: true });
2123
+ mkdirSync4("/tmp/pyb", { recursive: true });
2124
2124
  } catch {
2125
2125
  }
2126
2126
  const cmd = buildLinuxBwrapCommand({
@@ -2141,11 +2141,11 @@ var BunShell = class _BunShell {
2141
2141
  return null;
2142
2142
  }
2143
2143
  try {
2144
- mkdirSync4("/tmp/kode", { recursive: true });
2144
+ mkdirSync4("/tmp/pyb", { recursive: true });
2145
2145
  } catch {
2146
2146
  }
2147
2147
  try {
2148
- mkdirSync4("/private/tmp/kode", { recursive: true });
2148
+ mkdirSync4("/private/tmp/pyb", { recursive: true });
2149
2149
  } catch {
2150
2150
  }
2151
2151
  return {
@@ -2899,10 +2899,10 @@ export {
2899
2899
  getOriginalCwd,
2900
2900
  getCwd,
2901
2901
  execFileNoThrow,
2902
- getKodeBaseDir,
2902
+ getPybBaseDir,
2903
2903
  getGlobalConfigFilePath,
2904
2904
  getMemoryDir,
2905
- KODE_BASE_DIR,
2905
+ PYB_BASE_DIR,
2906
2906
  GLOBAL_CONFIG_FILE,
2907
2907
  MEMORY_DIR,
2908
2908
  env,