@agenthippo-ai/agenthippo 0.1.0

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 (480) hide show
  1. package/LICENSE +21 -0
  2. package/bin/agenthippo.js +2 -0
  3. package/out/agentpack/github.js +547 -0
  4. package/out/agentpack/index.js +66 -0
  5. package/out/agentpack/install.js +297 -0
  6. package/out/agentpack/manager.js +441 -0
  7. package/out/agentpack/manifest.js +135 -0
  8. package/out/agentpack/paths.js +475 -0
  9. package/out/agentpack/publish.js +248 -0
  10. package/out/agentpack/stores.js +554 -0
  11. package/out/agentpack/types.js +5 -0
  12. package/out/analytics/dashboard/artifactManager.js +439 -0
  13. package/out/analytics/dashboard/fleetDisplayUtils.js +159 -0
  14. package/out/analytics/dashboard/fleetOrchestrator.js +142 -0
  15. package/out/analytics/dashboard/fleetRegistry.js +79 -0
  16. package/out/analytics/dashboard/fleetRowDefaults.js +87 -0
  17. package/out/analytics/dashboard/fleetScriptAdapter.js +146 -0
  18. package/out/analytics/dashboard/fleetStatusUtils.js +30 -0
  19. package/out/analytics/dashboard/fleetTitleUtils.js +68 -0
  20. package/out/analytics/dashboard/fleetTypes.js +29 -0
  21. package/out/analytics/dashboard/index.js +17 -0
  22. package/out/analytics/dashboard/indexingService.js +422 -0
  23. package/out/analytics/dashboard/localFleetAdapter.js +222 -0
  24. package/out/analytics/dashboard/performanceMonitor.js +76 -0
  25. package/out/analytics/dashboard/processManager.js +209 -0
  26. package/out/analytics/dashboard/provider.js +3885 -0
  27. package/out/analytics/dashboard/queryRunner.js +994 -0
  28. package/out/analytics/dashboard/refreshPolicy.js +16 -0
  29. package/out/analytics/dashboard/scheduledFleetFingerprint.js +22 -0
  30. package/out/analytics/dashboard/scheduledFleetStorage.js +241 -0
  31. package/out/analytics/dashboard/scheduledFleetUtils.js +22 -0
  32. package/out/analytics/dashboard/sessionEventFleetStats.js +118 -0
  33. package/out/analytics/dashboard/sessionJsonlFleet.js +204 -0
  34. package/out/analytics/dashboard/teamViewDiscovery.js +106 -0
  35. package/out/analytics/dashboard/viewsConfigMerge.js +221 -0
  36. package/out/analytics/dashboard/webview/analytics-panel.html +155 -0
  37. package/out/analytics/dashboard/webview/codicon.ttf +0 -0
  38. package/out/analytics/dashboard/webview/index.html +78 -0
  39. package/out/analytics/dashboard/webview/panel.js +2295 -0
  40. package/out/analytics/dashboard/webview/runtime-bridge.js +82 -0
  41. package/out/analytics/dashboard/webview/styles.css +1009 -0
  42. package/out/analytics/lifecycle.js +43 -0
  43. package/out/analytics/service.js +1279 -0
  44. package/out/analytics/sessionEvents.js +231 -0
  45. package/out/auth/bootstrapApply.js +72 -0
  46. package/out/auth/brokerClient.js +126 -0
  47. package/out/auth/callbackUri.js +59 -0
  48. package/out/auth/callbackUriParse.js +59 -0
  49. package/out/auth/githubStoreGate.js +70 -0
  50. package/out/auth/loopbackAuthServer.js +165 -0
  51. package/out/auth/pkce.js +9 -0
  52. package/out/auth/provider.js +239 -0
  53. package/out/auth/sessionStore.js +193 -0
  54. package/out/auth/signInFlow.js +182 -0
  55. package/out/auth/types.js +12 -0
  56. package/out/auth-broker/config.js +62 -0
  57. package/out/auth-broker/jwt.js +105 -0
  58. package/out/auth-broker/pkce.js +57 -0
  59. package/out/auth-broker/server.js +539 -0
  60. package/out/auth-broker/store.js +273 -0
  61. package/out/base-prompts/gateway/openclaw-starter.json5 +144 -0
  62. package/out/base-prompts/gateway/slack-socket-mode-minimal.manifest.json +44 -0
  63. package/out/base-prompts/mcp-servers/.mcp.json +13 -0
  64. package/out/base-prompts/mcp-servers/langfuse-analytics/README.md +142 -0
  65. package/out/base-prompts/mcp-servers/langfuse-analytics/mcp.json +13 -0
  66. package/out/base-prompts/mcp-servers/langfuse-analytics/package-lock.json +1192 -0
  67. package/out/base-prompts/mcp-servers/langfuse-analytics/package.json +23 -0
  68. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/run-with-env.sh +12 -0
  69. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/sdk-test.js +102 -0
  70. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/simple-test.js +137 -0
  71. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-client.js +118 -0
  72. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-server.js +209 -0
  73. package/out/base-prompts/mcp-servers/langfuse-analytics/src/client.ts +431 -0
  74. package/out/base-prompts/mcp-servers/langfuse-analytics/src/index.ts +270 -0
  75. package/out/base-prompts/mcp-servers/langfuse-analytics/tsconfig.json +18 -0
  76. package/out/base-prompts/rules/AGENTS.md +204 -0
  77. package/out/base-prompts/skills/agent-browser/SKILL.md +102 -0
  78. package/out/base-prompts/skills/agent-builder/SKILL.md +73 -0
  79. package/out/base-prompts/skills/agent-builder/references/agent-pack.md +63 -0
  80. package/out/base-prompts/skills/agent-builder/references/crewai.md +66 -0
  81. package/out/base-prompts/skills/agent-builder/references/langchain.md +60 -0
  82. package/out/base-prompts/skills/agent-builder/references/raw-sdk.md +73 -0
  83. package/out/base-prompts/skills/agent-engine-creator/SKILL.md +586 -0
  84. package/out/base-prompts/skills/agent-engine-installer/SKILL.md +106 -0
  85. package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.mjs +259 -0
  86. package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.ps1 +189 -0
  87. package/out/base-prompts/skills/agenthippo-cli/SKILL.md +69 -0
  88. package/out/base-prompts/skills/agenthippo-cli/scripts/install.sh +63 -0
  89. package/out/base-prompts/skills/agentpack-creator/SKILL.md +375 -0
  90. package/out/base-prompts/skills/agentpack-creator/references/agent-templates.md +261 -0
  91. package/out/base-prompts/skills/agentpack-creator/references/agents-md-guide.md +195 -0
  92. package/out/base-prompts/skills/agentpack-creator/scripts/init_pack.py +391 -0
  93. package/out/base-prompts/skills/agentpack-creator/scripts/init_pack_test.py +294 -0
  94. package/out/base-prompts/skills/agentpack-testbench/SKILL.md +135 -0
  95. package/out/base-prompts/skills/algorithmic-art/LICENSE.txt +202 -0
  96. package/out/base-prompts/skills/algorithmic-art/SKILL.md +405 -0
  97. package/out/base-prompts/skills/algorithmic-art/templates/generator_template.js +223 -0
  98. package/out/base-prompts/skills/algorithmic-art/templates/viewer.html +599 -0
  99. package/out/base-prompts/skills/debug-agent/SKILL.md +83 -0
  100. package/out/base-prompts/skills/desktop-automation/SKILL.md +166 -0
  101. package/out/base-prompts/skills/desktop-automation/references/agenthippo-ui-recipes.md +441 -0
  102. package/out/base-prompts/skills/desktop-automation/scripts/windows-desktop-uia.psm1 +280 -0
  103. package/out/base-prompts/skills/docx/LICENSE.txt +30 -0
  104. package/out/base-prompts/skills/docx/SKILL.md +197 -0
  105. package/out/base-prompts/skills/docx/docx-js.md +350 -0
  106. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  107. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  108. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  109. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  110. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  111. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  112. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  113. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  114. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  115. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  116. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  117. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  118. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  119. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  120. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  121. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  122. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  123. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  124. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  125. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  126. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  127. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  128. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  129. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  130. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  131. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  132. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  133. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  134. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  135. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  136. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  137. package/out/base-prompts/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  138. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  139. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  140. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  141. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  142. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  143. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  144. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  145. package/out/base-prompts/skills/docx/ooxml/scripts/pack.py +159 -0
  146. package/out/base-prompts/skills/docx/ooxml/scripts/unpack.py +29 -0
  147. package/out/base-prompts/skills/docx/ooxml/scripts/validate.py +69 -0
  148. package/out/base-prompts/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  149. package/out/base-prompts/skills/docx/ooxml/scripts/validation/base.py +951 -0
  150. package/out/base-prompts/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  151. package/out/base-prompts/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  152. package/out/base-prompts/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  153. package/out/base-prompts/skills/docx/ooxml.md +610 -0
  154. package/out/base-prompts/skills/docx/scripts/__init__.py +1 -0
  155. package/out/base-prompts/skills/docx/scripts/document.py +1276 -0
  156. package/out/base-prompts/skills/docx/scripts/templates/comments.xml +3 -0
  157. package/out/base-prompts/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  158. package/out/base-prompts/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  159. package/out/base-prompts/skills/docx/scripts/templates/commentsIds.xml +3 -0
  160. package/out/base-prompts/skills/docx/scripts/templates/people.xml +3 -0
  161. package/out/base-prompts/skills/docx/scripts/utilities.py +374 -0
  162. package/out/base-prompts/skills/gateway-outbound/SKILL.md +136 -0
  163. package/out/base-prompts/skills/mcp-builder/LICENSE.txt +202 -0
  164. package/out/base-prompts/skills/mcp-builder/SKILL.md +328 -0
  165. package/out/base-prompts/skills/mcp-builder/reference/evaluation.md +602 -0
  166. package/out/base-prompts/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  167. package/out/base-prompts/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  168. package/out/base-prompts/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  169. package/out/base-prompts/skills/mcp-builder/scripts/connections.py +151 -0
  170. package/out/base-prompts/skills/mcp-builder/scripts/evaluation.py +373 -0
  171. package/out/base-prompts/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  172. package/out/base-prompts/skills/mcp-builder/scripts/requirements.txt +2 -0
  173. package/out/base-prompts/skills/openclaw/SKILL.md +406 -0
  174. package/out/base-prompts/skills/openclaw/scripts/run-smoke.sh +61 -0
  175. package/out/base-prompts/skills/pdf/LICENSE.txt +30 -0
  176. package/out/base-prompts/skills/pdf/SKILL.md +294 -0
  177. package/out/base-prompts/skills/pdf/forms.md +205 -0
  178. package/out/base-prompts/skills/pdf/reference.md +612 -0
  179. package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  180. package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  181. package/out/base-prompts/skills/pdf/scripts/check_fillable_fields.py +12 -0
  182. package/out/base-prompts/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  183. package/out/base-prompts/skills/pdf/scripts/create_validation_image.py +41 -0
  184. package/out/base-prompts/skills/pdf/scripts/extract_form_field_info.py +152 -0
  185. package/out/base-prompts/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  186. package/out/base-prompts/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  187. package/out/base-prompts/skills/pptx/LICENSE.txt +30 -0
  188. package/out/base-prompts/skills/pptx/SKILL.md +484 -0
  189. package/out/base-prompts/skills/pptx/html2pptx.md +625 -0
  190. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  191. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  192. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  193. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  194. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  195. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  196. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  197. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  198. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  199. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  200. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  201. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  202. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  203. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  204. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  205. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  206. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  207. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  208. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  209. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  210. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  211. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  212. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  213. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  214. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  215. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  216. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  217. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  218. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  219. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  220. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  221. package/out/base-prompts/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  222. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  223. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  224. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  225. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  226. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  227. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  228. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  229. package/out/base-prompts/skills/pptx/ooxml/scripts/pack.py +159 -0
  230. package/out/base-prompts/skills/pptx/ooxml/scripts/unpack.py +29 -0
  231. package/out/base-prompts/skills/pptx/ooxml/scripts/validate.py +69 -0
  232. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  233. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  234. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  235. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  236. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  237. package/out/base-prompts/skills/pptx/ooxml.md +427 -0
  238. package/out/base-prompts/skills/pptx/scripts/html2pptx.js +984 -0
  239. package/out/base-prompts/skills/pptx/scripts/inventory.py +1020 -0
  240. package/out/base-prompts/skills/pptx/scripts/rearrange.py +231 -0
  241. package/out/base-prompts/skills/pptx/scripts/replace.py +385 -0
  242. package/out/base-prompts/skills/pptx/scripts/thumbnail.py +450 -0
  243. package/out/base-prompts/skills/prompt-lab/SKILL.md +149 -0
  244. package/out/base-prompts/skills/prompt-lab/scripts/query-analytics.sh +2551 -0
  245. package/out/base-prompts/skills/skill-creator/LICENSE.txt +202 -0
  246. package/out/base-prompts/skills/skill-creator/SKILL.md +371 -0
  247. package/out/base-prompts/skills/skill-creator/references/output-patterns.md +82 -0
  248. package/out/base-prompts/skills/skill-creator/references/workflows.md +28 -0
  249. package/out/base-prompts/skills/skill-creator/scripts/init_skill.py +303 -0
  250. package/out/base-prompts/skills/skill-creator/scripts/package_skill.py +110 -0
  251. package/out/base-prompts/skills/skill-creator/scripts/quick_validate.py +95 -0
  252. package/out/base-prompts/skills/skill-installer/SKILL.md +251 -0
  253. package/out/base-prompts/skills/skill-installer/references/store-api.md +219 -0
  254. package/out/base-prompts/skills/spotlight-dashboard/SKILL.md +83 -0
  255. package/out/base-prompts/skills/spotlight-insights/SKILL.md +101 -0
  256. package/out/base-prompts/skills/spotlight-optimize/SKILL.md +93 -0
  257. package/out/base-prompts/skills/spotlight-optimize/scripts/query-analytics.sh +2551 -0
  258. package/out/base-prompts/skills/spotlight-query/SKILL.md +314 -0
  259. package/out/base-prompts/skills/spotlight-query/references/otel-schema.md +163 -0
  260. package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.sh +2551 -0
  261. package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.test.sh +744 -0
  262. package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/sessions/sess-test-1.jsonl +14 -0
  263. package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/.duckdb-index.json +7 -0
  264. package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/sample.jsonl +5 -0
  265. package/out/base-prompts/skills/spotlight-report/SKILL.md +86 -0
  266. package/out/base-prompts/skills/spotlight-visualize/SKILL.md +92 -0
  267. package/out/base-prompts/skills/spotlight-visualize/scripts/query-analytics.sh +2551 -0
  268. package/out/base-prompts/skills/xlsx/LICENSE.txt +30 -0
  269. package/out/base-prompts/skills/xlsx/SKILL.md +289 -0
  270. package/out/base-prompts/skills/xlsx/recalc.py +178 -0
  271. package/out/branding.js +23 -0
  272. package/out/cli/commands/anywhere.js +66 -0
  273. package/out/cli/commands/ask.js +243 -0
  274. package/out/cli/commands/auth-broker.js +24 -0
  275. package/out/cli/commands/auth.js +219 -0
  276. package/out/cli/commands/chat.js +354 -0
  277. package/out/cli/commands/deploy.js +223 -0
  278. package/out/cli/commands/gateway.js +160 -0
  279. package/out/cli/commands/pack.js +220 -0
  280. package/out/cli/commands/probe-custom-engine.js +82 -0
  281. package/out/cli/commands/serve.js +583 -0
  282. package/out/cli/commands/store.js +919 -0
  283. package/out/cli/credential-context.js +113 -0
  284. package/out/cli/deploy-init.js +2087 -0
  285. package/out/cli/deps.js +238 -0
  286. package/out/cli/index.js +390 -0
  287. package/out/cli/pack-loader.js +376 -0
  288. package/out/cli/run-custom-engine-runner.js +318 -0
  289. package/out/cli/runtime.js +409 -0
  290. package/out/cli/serve-hardening.js +325 -0
  291. package/out/cli/state-sync.js +135 -0
  292. package/out/cli/utils.js +220 -0
  293. package/out/cli/vscode-shim.js +86 -0
  294. package/out/engines/base.js +159 -0
  295. package/out/engines/claude.js +1215 -0
  296. package/out/engines/codex.js +759 -0
  297. package/out/engines/custom.js +632 -0
  298. package/out/engines/customEngineIpc.js +95 -0
  299. package/out/engines/customEngineRunnerEmbed.js +107 -0
  300. package/out/engines/customRegistry.js +274 -0
  301. package/out/engines/embeddedCustomEngineRunner.generated.js +9 -0
  302. package/out/engines/engineApiKey.js +138 -0
  303. package/out/engines/factory.js +45 -0
  304. package/out/engines/install.js +372 -0
  305. package/out/engines/persistentEngineWorker.js +320 -0
  306. package/out/engines/publish.js +341 -0
  307. package/out/engines/types.js +17 -0
  308. package/out/examples/run-headless-repl.js +291 -0
  309. package/out/examples/run-headless.js +187 -0
  310. package/out/extension.js +4472 -0
  311. package/out/gateway/bridge.js +805 -0
  312. package/out/gateway/cli-agent-id.js +36 -0
  313. package/out/gateway/client.js +303 -0
  314. package/out/gateway/client.test.js +395 -0
  315. package/out/gateway/gateway-scope-errors.js +14 -0
  316. package/out/gateway/gatewayBackup.js +76 -0
  317. package/out/gateway/gatewayRouteIndex.js +371 -0
  318. package/out/gateway/gatewaySessionStore.js +243 -0
  319. package/out/gateway/index.js +31 -0
  320. package/out/gateway/lifecycle.js +3056 -0
  321. package/out/gateway/openclaw-channel-routing.js +317 -0
  322. package/out/gateway/outboundHandles.js +373 -0
  323. package/out/gateway/outboundPaths.js +72 -0
  324. package/out/gateway/outboundSend.js +254 -0
  325. package/out/gateway/protocol.js +48 -0
  326. package/out/gateway/resetMappings.js +52 -0
  327. package/out/gateway/service.js +1244 -0
  328. package/out/gateway/sessionRouting.js +77 -0
  329. package/out/headless/index.js +505 -0
  330. package/out/headless/sync.js +473 -0
  331. package/out/mcp/publish.js +143 -0
  332. package/out/mcp.js +597 -0
  333. package/out/permissions.js +108 -0
  334. package/out/permissions.mapping.yaml +68 -0
  335. package/out/registry/index.js +332 -0
  336. package/out/remote/handleRemoteChat.js +122 -0
  337. package/out/remote/remotePackStatusBar.js +103 -0
  338. package/out/remote/serveClient.js +216 -0
  339. package/out/remoteSkills.js +191 -0
  340. package/out/runtime/index.js +32 -0
  341. package/out/runtime/interfaces/config-provider.js +32 -0
  342. package/out/runtime/interfaces/edit-tracker.js +22 -0
  343. package/out/runtime/interfaces/index.js +29 -0
  344. package/out/runtime/interfaces/logger.js +40 -0
  345. package/out/runtime/interfaces/permission-handler.js +66 -0
  346. package/out/runtime/interfaces/session-store.js +342 -0
  347. package/out/runtime/vscode/index.js +20 -0
  348. package/out/runtime/vscode/vscode-config-provider.js +77 -0
  349. package/out/runtime/vscode/vscode-edit-tracker.js +120 -0
  350. package/out/runtime/vscode/vscode-logger.js +30 -0
  351. package/out/runtime/vscode/vscode-permission-handler.js +72 -0
  352. package/out/runtime/vscode/vscode-session-store.js +22 -0
  353. package/out/scripts/agentide-litellm.ps1 +501 -0
  354. package/out/scripts/agentide-litellm.sh +700 -0
  355. package/out/scripts/agentide_litellm_hooks_v1.py +604 -0
  356. package/out/scripts/analytics/agent-fleet-widget.js +954 -0
  357. package/out/scripts/analytics/agentide-litellm-otel.config.yaml +160 -0
  358. package/out/scripts/analytics/default-seed-scripts.json +12 -0
  359. package/out/scripts/analytics/duckdbLocator.js +29 -0
  360. package/out/scripts/analytics/fleet-local-adapter.js +246 -0
  361. package/out/scripts/analytics/fleet-workflow.sh +263 -0
  362. package/out/scripts/analytics/generate-default-charts.py +685 -0
  363. package/out/scripts/analytics/hotspot-analysis-widget.js +909 -0
  364. package/out/scripts/analytics/index-traces.py +1394 -0
  365. package/out/scripts/analytics/install-analytics.sh +286 -0
  366. package/out/scripts/analytics/live-fleet-4-collector.cjs +315 -0
  367. package/out/scripts/analytics/live-fleet-4-daemon.mjs +134 -0
  368. package/out/scripts/analytics/live-fleet-4-widget.cjs +433 -0
  369. package/out/scripts/analytics/otel-collector.yaml +55 -0
  370. package/out/scripts/analytics/query-analytics.ps1 +396 -0
  371. package/out/scripts/analytics/query-analytics.sh +2551 -0
  372. package/out/scripts/analytics/session-comparison-widget.js +1468 -0
  373. package/out/scripts/analytics/session-timeline-widget.js +2137 -0
  374. package/out/scripts/analytics/setup-analytics.ps1 +432 -0
  375. package/out/scripts/analytics/setup-analytics.sh +854 -0
  376. package/out/scripts/analytics/start-analytics.ps1 +169 -0
  377. package/out/scripts/analytics/start-analytics.sh +323 -0
  378. package/out/scripts/analytics/token-cost-flamegraph-widget.js +954 -0
  379. package/out/scripts/analytics/token-cost-trend-widget.js +1062 -0
  380. package/out/scripts/analytics/workflows-collector.cjs +315 -0
  381. package/out/scripts/analytics/workflows-daemon.mjs +186 -0
  382. package/out/scripts/analytics/workflows-widget.cjs +433 -0
  383. package/out/scripts/analytics/wow-model-widget.js +191 -0
  384. package/out/scripts/gateway/Dockerfile.serve +45 -0
  385. package/out/scripts/gateway/docker-serve.sh +248 -0
  386. package/out/scripts/gateway/setup-gateway-server.ps1 +953 -0
  387. package/out/scripts/gateway/setup-gateway-server.sh +935 -0
  388. package/out/scripts/gateway/setup-gateway.ps1 +1813 -0
  389. package/out/scripts/gateway/setup-gateway.sh +1541 -0
  390. package/out/scripts/setup-cli.ps1 +86 -0
  391. package/out/scripts/setup-cli.sh +117 -0
  392. package/out/scripts/tools-manifest.json +83 -0
  393. package/out/scripts/vendor-tools.mjs +234 -0
  394. package/out/session.js +272 -0
  395. package/out/shared/agentEngines.js +170 -0
  396. package/out/shared/index.js +109 -0
  397. package/out/shared/models.js +235 -0
  398. package/out/shared/providers.js +202 -0
  399. package/out/skills/publish.js +178 -0
  400. package/out/spotlight/install.js +339 -0
  401. package/out/spotlight/publish.js +544 -0
  402. package/out/spotlight/yaml.js +31 -0
  403. package/out/store/github/setup.js +235 -0
  404. package/out/store/github/templates/build-index.ts +339 -0
  405. package/out/store/github/templates/build-index.yml +97 -0
  406. package/out/store/github/templates/package.json +11 -0
  407. package/out/store/index.js +755 -0
  408. package/out/store/oramaIndex.js +884 -0
  409. package/out/store/shared.js +241 -0
  410. package/out/sync.js +1827 -0
  411. package/out/terminalLogger.js +358 -0
  412. package/out/test/agentEnvFile.test.js +97 -0
  413. package/out/test/agentYaml.test.js +373 -0
  414. package/out/test/agentpack.test.js +639 -0
  415. package/out/test/analytics-lifecycle.test.js +174 -0
  416. package/out/test/analytics.test.js +524 -0
  417. package/out/test/auth-bootstrapApply.test.js +102 -0
  418. package/out/test/auth-broker.test.js +434 -0
  419. package/out/test/auth-callback.test.js +62 -0
  420. package/out/test/branding.test.js +229 -0
  421. package/out/test/cli-agent-id.test.js +55 -0
  422. package/out/test/credential-context.test.js +105 -0
  423. package/out/test/customEngineInstall.test.js +100 -0
  424. package/out/test/customRegistry.test.js +122 -0
  425. package/out/test/deploy-init.test.js +532 -0
  426. package/out/test/deps-auto-install.test.js +81 -0
  427. package/out/test/engine-integration.test.js +297 -0
  428. package/out/test/enginePaths.test.js +195 -0
  429. package/out/test/enginePublish.test.js +82 -0
  430. package/out/test/fleetDisplayUtils.test.js +96 -0
  431. package/out/test/gateway-client.test.js +381 -0
  432. package/out/test/gateway-lifecycle.test.js +608 -0
  433. package/out/test/gateway-outbound.test.js +531 -0
  434. package/out/test/gateway-reset-mappings.test.js +221 -0
  435. package/out/test/gateway-route-index.test.js +235 -0
  436. package/out/test/gateway-session-routing.test.js +47 -0
  437. package/out/test/gateway-session-store.test.js +216 -0
  438. package/out/test/github.test.js +232 -0
  439. package/out/test/headless-sync.test.js +279 -0
  440. package/out/test/helpers/manifest-fixtures.js +27 -0
  441. package/out/test/mcp-obo.test.js +82 -0
  442. package/out/test/mcp.test.js +307 -0
  443. package/out/test/openclaw-channel-routing.test.js +191 -0
  444. package/out/test/pathSafety.test.js +63 -0
  445. package/out/test/permissions.test.js +175 -0
  446. package/out/test/persistent-engine-worker.test.js +220 -0
  447. package/out/test/refreshPolicy.test.js +60 -0
  448. package/out/test/registry.test.js +351 -0
  449. package/out/test/runtime.test.js +349 -0
  450. package/out/test/scheduledFleetStorage.test.js +72 -0
  451. package/out/test/serve-hardening.test.js +192 -0
  452. package/out/test/serveClient.test.js +173 -0
  453. package/out/test/sessionJsonlFleet.test.js +78 -0
  454. package/out/test/shared.test.js +173 -0
  455. package/out/test/skills-mcp.test.js +299 -0
  456. package/out/test/spotlightPublish.test.js +299 -0
  457. package/out/test/spotlightYaml.test.js +58 -0
  458. package/out/test/state-sync-peer.test.js +74 -0
  459. package/out/test/store.test.js +331 -0
  460. package/out/test/stores.test.js +504 -0
  461. package/out/test/sync-switch.test.js +251 -0
  462. package/out/test/teamViewDiscovery.test.js +90 -0
  463. package/out/test/toolPath.test.js +120 -0
  464. package/out/test/utils.test.js +308 -0
  465. package/out/test/viewsConfigMerge.test.js +180 -0
  466. package/out/test/windows-command-line.test.js +75 -0
  467. package/out/utils/agentEnvFile.js +131 -0
  468. package/out/utils/binary.js +175 -0
  469. package/out/utils/index.js +37 -0
  470. package/out/utils/network.js +74 -0
  471. package/out/utils/pathSafety.js +60 -0
  472. package/out/utils/paths.js +116 -0
  473. package/out/utils/pid.js +180 -0
  474. package/out/utils/pythonRunner.js +258 -0
  475. package/out/utils/resolveNodeBinary.js +168 -0
  476. package/out/utils/toolPath.js +83 -0
  477. package/out/utils/windowsCommandLine.js +29 -0
  478. package/out/utils.js +915 -0
  479. package/out/workspaceFolders.js +59 -0
  480. package/package.json +41 -0
package/out/utils.js ADDED
@@ -0,0 +1,915 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) AgentHippo.ai. All rights reserved.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getAnalyticsScriptsDir = void 0;
40
+ exports.logInfo = logInfo;
41
+ exports.getErrorCode = getErrorCode;
42
+ exports.pathExists = pathExists;
43
+ exports.isDirOrSymlink = isDirOrSymlink;
44
+ exports.ensureRealDirectory = ensureRealDirectory;
45
+ exports.writeFileIfChanged = writeFileIfChanged;
46
+ exports.copyDirRecursive = copyDirRecursive;
47
+ exports.copyDirRecursiveWithTransform = copyDirRecursiveWithTransform;
48
+ exports.symlinkOrCopyFile = symlinkOrCopyFile;
49
+ exports.syncDirByFileLinks = syncDirByFileLinks;
50
+ exports.ensureWorkspaceGitAndGitignore = ensureWorkspaceGitAndGitignore;
51
+ exports.readFileSha256 = readFileSha256;
52
+ exports.getFileStats = getFileStats;
53
+ exports.isCachedHashValid = isCachedHashValid;
54
+ exports.shortSig = shortSig;
55
+ exports.isLocalHttps = isLocalHttps;
56
+ exports.applyLocalTlsBypass = applyLocalTlsBypass;
57
+ exports.getOverrideOpenAIBaseUrl = getOverrideOpenAIBaseUrl;
58
+ exports.resolveApiRouting = resolveApiRouting;
59
+ exports.getExplicitConfigValue = getExplicitConfigValue;
60
+ exports.getAgentideEngineSettings = getAgentideEngineSettings;
61
+ exports.emitStreamEvent = emitStreamEvent;
62
+ exports.createIPCStreamEmitter = createIPCStreamEmitter;
63
+ exports.computeTextDelta = computeTextDelta;
64
+ exports.createDeferred = createDeferred;
65
+ exports.stableAdditionalDirs = stableAdditionalDirs;
66
+ exports.extractFilePaths = extractFilePaths;
67
+ exports.isCreateCommand = isCreateCommand;
68
+ exports.normalizeFileChangeKind = normalizeFileChangeKind;
69
+ exports.isBinaryFile = isBinaryFile;
70
+ const fs_1 = require("fs");
71
+ const child_process_1 = require("child_process");
72
+ const promises_1 = require("stream/promises");
73
+ const util_1 = require("util");
74
+ const path = __importStar(require("path"));
75
+ const crypto = __importStar(require("crypto"));
76
+ const shared_1 = require("./shared");
77
+ const branding_1 = require("./branding");
78
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
79
+ // Lazy-load vscode to allow bundling for CLI/headless mode
80
+ // Use eval to prevent Bun from statically analyzing the require
81
+ let _vscode;
82
+ function getVscode() {
83
+ if (!_vscode) {
84
+ try {
85
+ // eslint-disable-next-line no-eval
86
+ _vscode = eval('require')('vscode');
87
+ }
88
+ catch {
89
+ throw new Error('vscode module not available. Use ConfigProvider instead of vscode.workspace.getConfiguration');
90
+ }
91
+ }
92
+ return _vscode;
93
+ }
94
+ /** Helper to log a message using whichever method is available */
95
+ function logInfo(logger, msg) {
96
+ if (logger.appendLine) {
97
+ logger.appendLine(msg);
98
+ }
99
+ else if (logger.info) {
100
+ logger.info(msg);
101
+ }
102
+ }
103
+ // -----------------------------------------------------------------------------
104
+ // Error Handling
105
+ // -----------------------------------------------------------------------------
106
+ /**
107
+ * Extract error code from an unknown error object (e.g., Node.js fs errors).
108
+ */
109
+ function getErrorCode(e) {
110
+ return e && typeof e === 'object' ? e.code : undefined;
111
+ }
112
+ // -----------------------------------------------------------------------------
113
+ // File System Utilities
114
+ // -----------------------------------------------------------------------------
115
+ async function pathExists(targetPath) {
116
+ try {
117
+ await fs_1.promises.lstat(targetPath);
118
+ return true;
119
+ }
120
+ catch (e) {
121
+ if (getErrorCode(e) === 'ENOENT') {
122
+ return false;
123
+ }
124
+ throw e;
125
+ }
126
+ }
127
+ async function isDirOrSymlink(targetPath) {
128
+ try {
129
+ const stat = await fs_1.promises.lstat(targetPath);
130
+ return stat.isDirectory() || stat.isSymbolicLink();
131
+ }
132
+ catch (e) {
133
+ if (getErrorCode(e) === 'ENOENT') {
134
+ return false;
135
+ }
136
+ throw e;
137
+ }
138
+ }
139
+ async function ensureRealDirectory(dirPath) {
140
+ try {
141
+ const st = await fs_1.promises.lstat(dirPath);
142
+ if (st.isSymbolicLink() || !st.isDirectory()) {
143
+ await fs_1.promises.rm(dirPath, { recursive: true, force: true });
144
+ await fs_1.promises.mkdir(dirPath, { recursive: true });
145
+ }
146
+ }
147
+ catch (e) {
148
+ if (getErrorCode(e) === 'ENOENT') {
149
+ await fs_1.promises.mkdir(dirPath, { recursive: true });
150
+ return;
151
+ }
152
+ throw e;
153
+ }
154
+ }
155
+ async function writeFileIfChanged(targetFile, contents) {
156
+ try {
157
+ const existing = await fs_1.promises.readFile(targetFile, 'utf8');
158
+ if (existing === contents) {
159
+ return false;
160
+ }
161
+ }
162
+ catch (e) {
163
+ if (getErrorCode(e) !== 'ENOENT') {
164
+ throw e;
165
+ }
166
+ }
167
+ await fs_1.promises.mkdir(path.dirname(targetFile), { recursive: true });
168
+ await fs_1.promises.writeFile(targetFile, contents, 'utf8');
169
+ return true;
170
+ }
171
+ async function copyDirRecursive(sourceDir, targetDir) {
172
+ await fs_1.promises.mkdir(targetDir, { recursive: true });
173
+ const entries = await fs_1.promises.readdir(sourceDir, { withFileTypes: true });
174
+ for (const entry of entries) {
175
+ const src = path.join(sourceDir, entry.name);
176
+ const dst = path.join(targetDir, entry.name);
177
+ if (entry.isDirectory()) {
178
+ await copyDirRecursive(src, dst);
179
+ }
180
+ else if (entry.isFile()) {
181
+ await fs_1.promises.copyFile(src, dst);
182
+ }
183
+ else if (entry.isSymbolicLink()) {
184
+ // Best-effort: resolve and copy the link target as a file or directory.
185
+ const resolved = await fs_1.promises.readlink(src);
186
+ const resolvedAbs = path.isAbsolute(resolved)
187
+ ? resolved
188
+ : path.resolve(path.dirname(src), resolved);
189
+ const stat = await fs_1.promises.stat(resolvedAbs);
190
+ if (stat.isDirectory()) {
191
+ await copyDirRecursive(resolvedAbs, dst);
192
+ }
193
+ else {
194
+ await fs_1.promises.copyFile(resolvedAbs, dst);
195
+ }
196
+ }
197
+ }
198
+ }
199
+ /**
200
+ * Copy a directory recursively, applying a text transform to markdown files.
201
+ * Used for bundled skills that may contain branding tokens.
202
+ */
203
+ async function copyDirRecursiveWithTransform(sourceDir, targetDir, transformMd) {
204
+ await fs_1.promises.mkdir(targetDir, { recursive: true });
205
+ const entries = await fs_1.promises.readdir(sourceDir, { withFileTypes: true });
206
+ for (const entry of entries) {
207
+ const src = path.join(sourceDir, entry.name);
208
+ const dst = path.join(targetDir, entry.name);
209
+ if (entry.isDirectory()) {
210
+ await copyDirRecursiveWithTransform(src, dst, transformMd);
211
+ }
212
+ else if (entry.isFile()) {
213
+ const lowerName = entry.name.toLowerCase();
214
+ if (lowerName.endsWith('.md')) {
215
+ // Apply transform to markdown files
216
+ const content = await fs_1.promises.readFile(src, 'utf8');
217
+ await fs_1.promises.writeFile(dst, transformMd(content), 'utf8');
218
+ }
219
+ else {
220
+ await fs_1.promises.copyFile(src, dst);
221
+ }
222
+ }
223
+ else if (entry.isSymbolicLink()) {
224
+ // Best-effort: resolve and copy the link target as a file or directory.
225
+ const resolved = await fs_1.promises.readlink(src);
226
+ const resolvedAbs = path.isAbsolute(resolved)
227
+ ? resolved
228
+ : path.resolve(path.dirname(src), resolved);
229
+ const stat = await fs_1.promises.stat(resolvedAbs);
230
+ if (stat.isDirectory()) {
231
+ await copyDirRecursiveWithTransform(resolvedAbs, dst, transformMd);
232
+ }
233
+ else {
234
+ const lowerName = entry.name.toLowerCase();
235
+ if (lowerName.endsWith('.md')) {
236
+ const content = await fs_1.promises.readFile(resolvedAbs, 'utf8');
237
+ await fs_1.promises.writeFile(dst, transformMd(content), 'utf8');
238
+ }
239
+ else {
240
+ await fs_1.promises.copyFile(resolvedAbs, dst);
241
+ }
242
+ }
243
+ }
244
+ }
245
+ }
246
+ /**
247
+ * Create a symlink (or copy as fallback) to a file.
248
+ *
249
+ * @param force - If true, replace any existing file (for derived/managed files).
250
+ * If false, only replace symlinks pointing elsewhere, never clobber non-symlinks (for user files).
251
+ */
252
+ async function symlinkOrCopyFile(sourceFile, targetFile, logger, label, options) {
253
+ const force = options?.force ?? false;
254
+ // Check existing target
255
+ try {
256
+ const existing = await fs_1.promises.lstat(targetFile);
257
+ if (existing.isSymbolicLink()) {
258
+ // Check if already pointing to correct target
259
+ try {
260
+ const current = await fs_1.promises.readlink(targetFile);
261
+ const currentAbs = path.isAbsolute(current)
262
+ ? current
263
+ : path.resolve(path.dirname(targetFile), current);
264
+ if (path.resolve(currentAbs) === path.resolve(sourceFile)) {
265
+ return; // Already correct, nothing to do
266
+ }
267
+ }
268
+ catch {
269
+ // Can't read link, fall through and replace it
270
+ }
271
+ await fs_1.promises.unlink(targetFile);
272
+ }
273
+ else if (force) {
274
+ // Force mode: replace any file type
275
+ await fs_1.promises.rm(targetFile, { recursive: true, force: true });
276
+ }
277
+ else {
278
+ // Preserve mode: don't clobber user-managed non-symlink files
279
+ return;
280
+ }
281
+ }
282
+ catch (e) {
283
+ if (getErrorCode(e) !== 'ENOENT') {
284
+ throw e;
285
+ }
286
+ // File doesn't exist, proceed to create
287
+ }
288
+ await fs_1.promises.mkdir(path.dirname(targetFile), { recursive: true });
289
+ if (path.resolve(sourceFile) === path.resolve(targetFile)) {
290
+ return;
291
+ }
292
+ try {
293
+ await fs_1.promises.symlink(sourceFile, targetFile, 'file');
294
+ logInfo(logger, `[AgentIDE] Linked ${label} (symlink): ${targetFile} -> ${sourceFile}`);
295
+ }
296
+ catch {
297
+ await fs_1.promises.copyFile(sourceFile, targetFile);
298
+ logInfo(logger, `[AgentIDE] Linked ${label} (copy fallback): ${targetFile}`);
299
+ }
300
+ }
301
+ /**
302
+ * Mirror a directory by creating **file symlinks** (with copy fallback) rather than directory symlinks.
303
+ * This avoids Git's "pathspec is beyond a symbolic link" failure mode (which triggers on directory symlinks).
304
+ *
305
+ * Notes:
306
+ * - Hidden entries (starting with ".") are ignored.
307
+ * - Non-symlink files in target that don't exist in source are copied back to source (preserves agent-created content).
308
+ * - Only stale symlinks are removed (symlinks pointing to files no longer in source).
309
+ */
310
+ async function syncDirByFileLinks(sourceDir, targetDir, logger, label) {
311
+ await ensureRealDirectory(targetDir);
312
+ const expectedDirs = new Set();
313
+ const expectedFiles = new Map(); // relPath -> sourceAbs
314
+ const walk = async (absSrc, rel) => {
315
+ let entries;
316
+ try {
317
+ entries = await fs_1.promises.readdir(absSrc, { withFileTypes: true });
318
+ }
319
+ catch (e) {
320
+ if (getErrorCode(e) === 'ENOENT') {
321
+ return;
322
+ }
323
+ throw e;
324
+ }
325
+ for (const entry of entries) {
326
+ if (entry.name.startsWith('.')) {
327
+ continue;
328
+ }
329
+ const src = path.join(absSrc, entry.name);
330
+ const relPath = rel ? path.join(rel, entry.name) : entry.name;
331
+ if (entry.isDirectory()) {
332
+ expectedDirs.add(relPath);
333
+ await walk(src, relPath);
334
+ }
335
+ else if (entry.isFile()) {
336
+ expectedFiles.set(relPath, src);
337
+ }
338
+ else if (entry.isSymbolicLink()) {
339
+ // Best-effort: resolve and mirror the link target.
340
+ try {
341
+ const resolved = await fs_1.promises.readlink(src);
342
+ const resolvedAbs = path.isAbsolute(resolved)
343
+ ? resolved
344
+ : path.resolve(path.dirname(src), resolved);
345
+ const stat = await fs_1.promises.stat(resolvedAbs);
346
+ if (stat.isDirectory()) {
347
+ expectedDirs.add(relPath);
348
+ await walk(resolvedAbs, relPath);
349
+ }
350
+ else {
351
+ expectedFiles.set(relPath, resolvedAbs);
352
+ }
353
+ }
354
+ catch (e) {
355
+ const code = getErrorCode(e);
356
+ if (code === 'ENOENT' || code === 'ELOOP') {
357
+ continue;
358
+ }
359
+ throw e;
360
+ }
361
+ }
362
+ }
363
+ };
364
+ await walk(sourceDir, '');
365
+ // Ensure all directories exist (parents first).
366
+ const dirsByDepth = Array.from(expectedDirs).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
367
+ for (const relDir of dirsByDepth) {
368
+ await ensureRealDirectory(path.join(targetDir, relDir));
369
+ }
370
+ // Link files (force overwrite; derived dirs are AgentIDE-managed)
371
+ for (const [relFile, srcAbs] of expectedFiles.entries()) {
372
+ await symlinkOrCopyFile(srcAbs, path.join(targetDir, relFile), logger, `${label}/${relFile}`.replace(/\\/g, '/'), { force: true });
373
+ }
374
+ // Copy-back: copy non-symlink files from target to source if they don't exist in source.
375
+ // This preserves agent-created content (scripts, templates, etc.) in the source of truth.
376
+ const expectedFileSet = new Set(expectedFiles.keys());
377
+ const copyBack = async (absDst, relDst) => {
378
+ let entries;
379
+ try {
380
+ entries = await fs_1.promises.readdir(absDst, { withFileTypes: true });
381
+ }
382
+ catch (e) {
383
+ if (getErrorCode(e) === 'ENOENT') {
384
+ return;
385
+ }
386
+ throw e;
387
+ }
388
+ for (const entry of entries) {
389
+ if (entry.name.startsWith('.')) {
390
+ continue;
391
+ }
392
+ const absDstFile = path.join(absDst, entry.name);
393
+ const relPath = relDst ? path.join(relDst, entry.name) : entry.name;
394
+ const absSrcFile = path.join(sourceDir, relPath);
395
+ if (entry.isDirectory()) {
396
+ await copyBack(absDstFile, relPath);
397
+ }
398
+ else if (entry.isFile() && !entry.isSymbolicLink()) {
399
+ // Real file in target - check if it exists in source
400
+ if (!expectedFileSet.has(relPath)) {
401
+ // File doesn't exist in source - copy it back
402
+ try {
403
+ await fs_1.promises.mkdir(path.dirname(absSrcFile), { recursive: true });
404
+ await fs_1.promises.copyFile(absDstFile, absSrcFile);
405
+ logInfo(logger, `[AgentIDE] Copied new file to source: ${label}/${relPath}`.replace(/\\/g, '/'));
406
+ // Add to expected files so it becomes a symlink on next sync
407
+ expectedFiles.set(relPath, absSrcFile);
408
+ }
409
+ catch (e) {
410
+ logInfo(logger, `[AgentIDE] Warning: failed to copy back ${relPath}: ${e instanceof Error ? e.message : String(e)}`);
411
+ }
412
+ }
413
+ }
414
+ }
415
+ };
416
+ await copyBack(targetDir, '');
417
+ // Re-link any files we just copied back (convert them to symlinks)
418
+ for (const [relFile, srcAbs] of expectedFiles.entries()) {
419
+ const targetFile = path.join(targetDir, relFile);
420
+ try {
421
+ const stat = await fs_1.promises.lstat(targetFile);
422
+ // If it's a regular file (not symlink), replace with symlink
423
+ if (stat.isFile() && !stat.isSymbolicLink()) {
424
+ await fs_1.promises.rm(targetFile, { force: true });
425
+ await symlinkOrCopyFile(srcAbs, targetFile, logger, `${label}/${relFile}`.replace(/\\/g, '/'), { force: true });
426
+ }
427
+ }
428
+ catch {
429
+ // File doesn't exist, will be created by the link phase
430
+ }
431
+ }
432
+ // Cleanup: remove unexpected SYMLINK entries in target dir.
433
+ const cleanup = async (absDst, relDst) => {
434
+ let entries;
435
+ try {
436
+ entries = await fs_1.promises.readdir(absDst, { withFileTypes: true });
437
+ }
438
+ catch (e) {
439
+ if (getErrorCode(e) === 'ENOENT') {
440
+ return;
441
+ }
442
+ throw e;
443
+ }
444
+ for (const entry of entries) {
445
+ if (entry.name.startsWith('.')) {
446
+ continue;
447
+ }
448
+ const abs = path.join(absDst, entry.name);
449
+ const relPath = relDst ? path.join(relDst, entry.name) : entry.name;
450
+ if (entry.isDirectory()) {
451
+ // Recurse into directories to clean up symlinks inside
452
+ await cleanup(abs, relPath);
453
+ // Don't remove directories - they may contain user-added files
454
+ }
455
+ else if (entry.isSymbolicLink()) {
456
+ // Only remove symlinks that are no longer expected
457
+ if (!expectedFileSet.has(relPath)) {
458
+ await fs_1.promises.rm(abs, { force: true });
459
+ }
460
+ }
461
+ }
462
+ };
463
+ await cleanup(targetDir, '');
464
+ }
465
+ /**
466
+ * Ensure workspace root has git initialized and .gitignore entries for agent directories.
467
+ * If the folder is not a git repository, runs `git init`.
468
+ * Adds the agent root, .claude, .codex to the root .gitignore if not already present.
469
+ */
470
+ async function ensureWorkspaceGitAndGitignore(workspaceRoot, logger) {
471
+ const gitDir = path.join(workspaceRoot, '.git');
472
+ // Check if .git exists
473
+ const gitExists = await pathExists(gitDir);
474
+ if (!gitExists) {
475
+ // Initialize git repository
476
+ try {
477
+ await execFileAsync('git', ['init'], { cwd: workspaceRoot });
478
+ logInfo(logger, `[AgentIDE] Initialized git repository in ${workspaceRoot}`);
479
+ }
480
+ catch (e) {
481
+ logInfo(logger, `[AgentIDE] Note: Could not initialize git in ${workspaceRoot}: ${e instanceof Error ? e.message : String(e)}`);
482
+ // Continue anyway - we still want to create/update .gitignore
483
+ }
484
+ }
485
+ // Ensure root .gitignore has entries for agent directories
486
+ const rootGitignorePath = path.join(workspaceRoot, '.gitignore');
487
+ // Build the list of directories to ignore from AGENT_ENGINES
488
+ const agentideDirs = [
489
+ ...Object.values(shared_1.AGENT_ENGINES).map(engine => engine.workspaceDir),
490
+ ];
491
+ const managedBlockLines = [
492
+ `# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`,
493
+ `# These directories are managed by ${branding_1.AGENTIDE_BRAND_NAME} and should not be committed.`,
494
+ ...agentideDirs,
495
+ ];
496
+ let existing = '';
497
+ try {
498
+ existing = await fs_1.promises.readFile(rootGitignorePath, 'utf8');
499
+ }
500
+ catch (e) {
501
+ if (getErrorCode(e) !== 'ENOENT') {
502
+ logInfo(logger, `[AgentIDE] Warning: failed to read root .gitignore: ${e instanceof Error ? e.message : String(e)}`);
503
+ return;
504
+ }
505
+ }
506
+ // Check if all required entries are already present (as standalone lines)
507
+ const existingLines = existing.split('\n').map(l => l.trim());
508
+ const missingDirs = agentideDirs.filter(dir => !existingLines.includes(dir));
509
+ if (missingDirs.length === 0) {
510
+ return;
511
+ }
512
+ // If we have the managed block header but missing some entries, rebuild the block
513
+ // Otherwise, append the full managed block
514
+ const managedHeader = `# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`;
515
+ const legacyHeader = '# AgentIDE (managed)';
516
+ const hasHeader = existing.includes(managedHeader) || existing.includes(legacyHeader);
517
+ let next;
518
+ if (hasHeader) {
519
+ // Replace the managed block with updated entries
520
+ // Find the block and replace it
521
+ const lines = existing.split('\n');
522
+ const newLines = [];
523
+ let inManagedBlock = false;
524
+ for (const line of lines) {
525
+ if (line.trim() === managedHeader || line.trim() === legacyHeader) {
526
+ inManagedBlock = true;
527
+ // Add the new managed block
528
+ newLines.push(...managedBlockLines);
529
+ continue;
530
+ }
531
+ if (inManagedBlock) {
532
+ // Skip lines that are part of the managed block (comments or the dirs)
533
+ if (line.trim().startsWith('#') || agentideDirs.includes(line.trim()) || line.trim() === '') {
534
+ continue;
535
+ }
536
+ // End of managed block
537
+ inManagedBlock = false;
538
+ }
539
+ newLines.push(line);
540
+ }
541
+ next = newLines.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
542
+ }
543
+ else {
544
+ // Append the managed block
545
+ next = [
546
+ existing.trimEnd(),
547
+ '',
548
+ managedBlockLines.join('\n'),
549
+ '',
550
+ ].join('\n').replace(/^\n+/, '');
551
+ }
552
+ try {
553
+ const changed = await writeFileIfChanged(rootGitignorePath, next);
554
+ if (changed) {
555
+ logInfo(logger, `[AgentIDE] Updated ${rootGitignorePath} to ignore ${branding_1.AGENTIDE_BRAND_NAME} directories`);
556
+ }
557
+ }
558
+ catch (e) {
559
+ logInfo(logger, `[AgentIDE] Warning: failed to write root .gitignore: ${e instanceof Error ? e.message : String(e)}`);
560
+ }
561
+ }
562
+ /**
563
+ * Compute SHA256 hash of a file using streaming to avoid loading large files into memory.
564
+ * Returns the hash along with file stats for caching purposes.
565
+ */
566
+ async function readFileSha256(filePath) {
567
+ const stat = await fs_1.promises.stat(filePath);
568
+ const hash = crypto.createHash('sha256');
569
+ await (0, promises_1.pipeline)((0, fs_1.createReadStream)(filePath), hash);
570
+ return {
571
+ sha256: hash.digest('hex'),
572
+ size: stat.size,
573
+ mtimeMs: stat.mtimeMs,
574
+ };
575
+ }
576
+ /**
577
+ * Get file stats for mtime caching (fast path check before hashing).
578
+ */
579
+ async function getFileStats(filePath) {
580
+ try {
581
+ const stat = await fs_1.promises.stat(filePath);
582
+ return { size: stat.size, mtimeMs: stat.mtimeMs };
583
+ }
584
+ catch (e) {
585
+ if (getErrorCode(e) === 'ENOENT') {
586
+ return undefined;
587
+ }
588
+ throw e;
589
+ }
590
+ }
591
+ /**
592
+ * Check if cached file hash is still valid based on mtime and size.
593
+ * If valid, returns the cached entry; otherwise returns undefined to trigger re-hash.
594
+ */
595
+ function isCachedHashValid(cached, currentStats) {
596
+ if (!cached || !currentStats) {
597
+ return undefined;
598
+ }
599
+ if (cached.mtimeMs === currentStats.mtimeMs && cached.size === currentStats.size) {
600
+ return cached;
601
+ }
602
+ return undefined;
603
+ }
604
+ function shortSig(input) {
605
+ return crypto.createHash('sha256').update(input).digest('hex').slice(0, 16);
606
+ }
607
+ // -----------------------------------------------------------------------------
608
+ // Environment Utilities
609
+ // -----------------------------------------------------------------------------
610
+ /**
611
+ * Check if a URL is a local HTTPS address (localhost, 127.0.0.1, 0.0.0.0).
612
+ */
613
+ function isLocalHttps(url) {
614
+ if (!url) {
615
+ return false;
616
+ }
617
+ return url.startsWith('https://') && (url.includes('localhost') || url.includes('127.0.0.1') || url.includes('0.0.0.0'));
618
+ }
619
+ /**
620
+ * Apply TLS verification bypass for local HTTPS in an environment object.
621
+ * Returns the modified env and whether TLS was disabled.
622
+ */
623
+ function applyLocalTlsBypass(env, baseUrl) {
624
+ if (isLocalHttps(baseUrl)) {
625
+ env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
626
+ return true;
627
+ }
628
+ return false;
629
+ }
630
+ // -----------------------------------------------------------------------------
631
+ // API Routing
632
+ // -----------------------------------------------------------------------------
633
+ /**
634
+ * Get overrideOpenAIBaseUrl for a baseUrl by looking up custom provider config.
635
+ * Uses the provided ConfigProvider or returns undefined (for headless/CLI).
636
+ */
637
+ function getOverrideOpenAIBaseUrl(baseUrl, configProvider) {
638
+ // If no ConfigProvider, return undefined (no override in headless/CLI mode)
639
+ if (!configProvider) {
640
+ return undefined;
641
+ }
642
+ const customProviders = configProvider.getCustomProviders();
643
+ const normalizedInput = baseUrl.replace(/\/$/, '');
644
+ for (const providerConfig of Object.values(customProviders)) {
645
+ if (providerConfig.baseUrl) {
646
+ const normalizedProviderUrl = providerConfig.baseUrl.replace(/\/$/, '');
647
+ if (normalizedInput === normalizedProviderUrl && providerConfig.overrideOpenAIBaseUrl) {
648
+ return providerConfig.overrideOpenAIBaseUrl.trim();
649
+ }
650
+ }
651
+ }
652
+ return undefined;
653
+ }
654
+ /**
655
+ * Resolve API key and base URL based on LiteLLM routing configuration.
656
+ * Handles fallback to global litellm* settings when useLiteLLM is true.
657
+ * Returns both baseUrl (for Claude/Anthropic) and openaiBaseUrl (with overrideOpenAIBaseUrl applied for Codex).
658
+ *
659
+ * @param options - Agent request options
660
+ * @param litellmApiKey - Fallback LiteLLM API key
661
+ * @param litellmBaseUrl - Fallback LiteLLM base URL
662
+ * @param configProvider - Optional config provider for resolving overrides
663
+ */
664
+ function resolveApiRouting(options, litellmApiKey, litellmBaseUrl, configProvider) {
665
+ const useLiteLLM = options.useLiteLLM === true;
666
+ const baseUrl = options.baseUrl || (useLiteLLM ? litellmBaseUrl : undefined);
667
+ const liteLLMResolvedApiKey = options.apiKey || litellmApiKey || 'sk-dummy';
668
+ // For OpenAI-compatible endpoints, check for per-provider overrideOpenAIBaseUrl
669
+ let openaiBaseUrl = baseUrl;
670
+ if (baseUrl) {
671
+ const overrideUrl = getOverrideOpenAIBaseUrl(baseUrl, configProvider);
672
+ if (overrideUrl) {
673
+ openaiBaseUrl = overrideUrl;
674
+ }
675
+ }
676
+ return {
677
+ apiKey: useLiteLLM ? liteLLMResolvedApiKey : (options.apiKey || ''),
678
+ baseUrl,
679
+ openaiBaseUrl,
680
+ useLiteLLM,
681
+ };
682
+ }
683
+ // -----------------------------------------------------------------------------
684
+ // VS Code Configuration
685
+ // -----------------------------------------------------------------------------
686
+ /**
687
+ * Get explicit config value from VS Code configuration.
688
+ * Note: This function requires VS Code runtime.
689
+ */
690
+ function getExplicitConfigValue(config, key) {
691
+ const inspect = config.inspect(key);
692
+ if (!inspect) {
693
+ return undefined;
694
+ }
695
+ return (inspect.workspaceFolderValue ?? inspect.workspaceValue ?? inspect.globalValue);
696
+ }
697
+ /**
698
+ * Get engine settings from configuration.
699
+ * Uses the provided ConfigProvider or returns defaults (for headless/CLI).
700
+ */
701
+ function getAgentideEngineSettings(configProvider) {
702
+ if (configProvider) {
703
+ return configProvider.getEngineSettings();
704
+ }
705
+ // Return defaults when no ConfigProvider (headless/CLI mode)
706
+ return {
707
+ claudeMaxThinkingTokens: 0,
708
+ };
709
+ }
710
+ // -----------------------------------------------------------------------------
711
+ // Stream Emitter Factory
712
+ // -----------------------------------------------------------------------------
713
+ /**
714
+ * Send a stream event to the Workbench via command.
715
+ * The Workbench registers 'agentide.streamCallback' to receive these events.
716
+ */
717
+ async function emitStreamEvent(event) {
718
+ try {
719
+ await getVscode().commands.executeCommand('agentide.streamCallback', event);
720
+ }
721
+ catch (e) {
722
+ console.error('[AgentIDE Extension] Failed to emit stream event:', e);
723
+ }
724
+ }
725
+ /**
726
+ * Create a StreamEmitter for IPC streaming via stream events.
727
+ */
728
+ const STREAM_COALESCE_WINDOW_MS = 40;
729
+ const STREAM_COALESCE_MIN_CHARS = 120;
730
+ function flushCoalescedBuffers(streamId, state) {
731
+ const emits = [];
732
+ if (state.markdownBuffer) {
733
+ emits.push(emitStreamEvent({ streamId, type: 'markdown', data: state.markdownBuffer }));
734
+ state.markdownBuffer = '';
735
+ }
736
+ if (state.thinkingBuffer) {
737
+ emits.push(emitStreamEvent({ streamId, type: 'thinking', data: state.thinkingBuffer }));
738
+ state.thinkingBuffer = '';
739
+ }
740
+ if (state.flushTimer) {
741
+ clearTimeout(state.flushTimer);
742
+ state.flushTimer = undefined;
743
+ }
744
+ return Promise.all(emits).then(() => undefined);
745
+ }
746
+ function ensureFlushTimer(streamId, state) {
747
+ if (state.flushTimer) {
748
+ return;
749
+ }
750
+ state.flushTimer = setTimeout(() => {
751
+ void flushCoalescedBuffers(streamId, state);
752
+ }, STREAM_COALESCE_WINDOW_MS);
753
+ }
754
+ function createIPCStreamEmitter(streamId) {
755
+ const state = {
756
+ markdownBuffer: '',
757
+ thinkingBuffer: '',
758
+ flushTimer: undefined,
759
+ };
760
+ return {
761
+ async thinking(delta) {
762
+ if (!delta) {
763
+ return;
764
+ }
765
+ state.thinkingBuffer += delta;
766
+ if (state.thinkingBuffer.length >= STREAM_COALESCE_MIN_CHARS) {
767
+ await flushCoalescedBuffers(streamId, state);
768
+ return;
769
+ }
770
+ ensureFlushTimer(streamId, state);
771
+ },
772
+ async text(delta) {
773
+ if (!delta) {
774
+ return;
775
+ }
776
+ state.markdownBuffer += delta;
777
+ if (state.markdownBuffer.length >= STREAM_COALESCE_MIN_CHARS) {
778
+ await flushCoalescedBuffers(streamId, state);
779
+ return;
780
+ }
781
+ ensureFlushTimer(streamId, state);
782
+ },
783
+ async toolStart(toolName, input, toolCallId, metadata) {
784
+ await flushCoalescedBuffers(streamId, state);
785
+ await emitStreamEvent({ streamId, type: 'tool_use', toolName, toolCallId, data: input || '', metadata });
786
+ },
787
+ async toolEnd(toolName, toolCallId, result, isError, metadata) {
788
+ await flushCoalescedBuffers(streamId, state);
789
+ const base = (metadata && typeof metadata === 'object') ? metadata : {};
790
+ await emitStreamEvent({
791
+ streamId,
792
+ type: 'tool_end',
793
+ toolName,
794
+ toolCallId,
795
+ data: result || '',
796
+ metadata: { ...base, isError }
797
+ });
798
+ },
799
+ async progress(message) {
800
+ await flushCoalescedBuffers(streamId, state);
801
+ await emitStreamEvent({ streamId, type: 'progress', data: message });
802
+ },
803
+ async question(payload) {
804
+ await flushCoalescedBuffers(streamId, state);
805
+ await emitStreamEvent({ streamId, type: 'question', metadata: payload });
806
+ return {
807
+ selected: [],
808
+ freeText: null,
809
+ declined: true,
810
+ };
811
+ },
812
+ async error(message) {
813
+ await flushCoalescedBuffers(streamId, state);
814
+ await emitStreamEvent({ streamId, type: 'error', data: message });
815
+ },
816
+ async done() {
817
+ await flushCoalescedBuffers(streamId, state);
818
+ await emitStreamEvent({ streamId, type: 'done' });
819
+ },
820
+ };
821
+ }
822
+ // -----------------------------------------------------------------------------
823
+ // Text Delta Tracking
824
+ // -----------------------------------------------------------------------------
825
+ /**
826
+ * Helper to compute delta for streaming text (avoids duplicate content).
827
+ * Uses a Map to track last seen text per item ID.
828
+ */
829
+ function computeTextDelta(itemId, newText, tracker) {
830
+ const prev = tracker.get(itemId) ?? '';
831
+ const delta = newText.startsWith(prev) ? newText.slice(prev.length) : newText;
832
+ tracker.set(itemId, newText);
833
+ return delta;
834
+ }
835
+ function createDeferred() {
836
+ let resolve;
837
+ let reject;
838
+ const promise = new Promise((res, rej) => {
839
+ resolve = res;
840
+ reject = rej;
841
+ });
842
+ return { promise, resolve, reject };
843
+ }
844
+ // -----------------------------------------------------------------------------
845
+ // Stable Helpers
846
+ // -----------------------------------------------------------------------------
847
+ function stableAdditionalDirs(additionalDirectories) {
848
+ return (additionalDirectories ?? []).slice().filter(Boolean).sort();
849
+ }
850
+ // Re-export from utils/paths for extension convenience
851
+ var paths_1 = require("./utils/paths");
852
+ Object.defineProperty(exports, "getAnalyticsScriptsDir", { enumerable: true, get: function () { return paths_1.getAnalyticsScriptsDir; } });
853
+ // -----------------------------------------------------------------------------
854
+ // Shell Command File Path Extraction (for edit tracking)
855
+ // -----------------------------------------------------------------------------
856
+ const CREATE_CMD_PATTERN = /(?:cat\s*>[^>]|echo\s*>[^>]|touch\s+|>\s*[^>]|<<\s*['"]?EOF)/;
857
+ const EXCLUDED_PREFIXES = ['/tmp/', '/var/', '/dev/'];
858
+ const EXCLUDED_SUFFIXES = ['.tmp', '.bak'];
859
+ /** Extract file paths from shell command. Inclusive approach - better to over-track than miss. */
860
+ function extractFilePaths(command, workspaceRoot) {
861
+ // Use matchAll with inline regex to avoid shared state issues
862
+ // Character class includes: whitespace, quotes, backticks, semicolon, pipe, ampersand, parens, equals, and redirects (><)
863
+ const matches = command.matchAll(/(?:^|[\s'"`;|&()=><])([./]*(?:[\w.\-]+\/)*[\w.\-]+\.[\w]+)(?=[\s'"`;|&()=><]|$)/g);
864
+ const paths = new Set();
865
+ for (const m of matches) {
866
+ const p = m[1].replace(/['"]/g, '').trim();
867
+ if (!p || p.startsWith('-') || p.includes('..')) {
868
+ continue;
869
+ }
870
+ if (EXCLUDED_PREFIXES.some(x => p.startsWith(x)) || EXCLUDED_SUFFIXES.some(x => p.endsWith(x))) {
871
+ continue;
872
+ }
873
+ paths.add(p.startsWith('/') ? p : `${workspaceRoot}/${p.replace(/^\.\//, '')}`);
874
+ }
875
+ return [...paths];
876
+ }
877
+ /** Check if command creates new files (vs modifying existing) */
878
+ function isCreateCommand(cmd) {
879
+ return CREATE_CMD_PATTERN.test(cmd);
880
+ }
881
+ /**
882
+ * Normalize provider-specific file change kinds to AgentIDE's canonical kinds.
883
+ */
884
+ function normalizeFileChangeKind(kind) {
885
+ switch (kind) {
886
+ case 'add':
887
+ case 'create':
888
+ return 'create';
889
+ case 'update':
890
+ case 'modify':
891
+ return 'modify';
892
+ case 'delete':
893
+ return 'delete';
894
+ default:
895
+ return undefined;
896
+ }
897
+ }
898
+ /** Binary file extensions that should not be tracked for edit diffs (lowercase) */
899
+ const BINARY_EXTENSIONS = new Set([
900
+ '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx',
901
+ '.zip', '.tar', '.gz', '.rar', '.7z',
902
+ '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.webp', '.svg',
903
+ '.mp3', '.mp4', '.wav', '.avi', '.mov', '.mkv',
904
+ '.exe', '.dll', '.so', '.dylib', '.bin',
905
+ '.woff', '.woff2', '.ttf', '.otf', '.eot',
906
+ '.pyc', '.class', '.o', '.a',
907
+ ]);
908
+ /** Check if file is a binary file (based on extension). Assumes lowercase extensions. */
909
+ function isBinaryFile(filePath) {
910
+ const dotIdx = filePath.lastIndexOf('.');
911
+ if (dotIdx === -1) {
912
+ return false;
913
+ }
914
+ return BINARY_EXTENSIONS.has(filePath.slice(dotIdx));
915
+ }