@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
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) AgentHippo.ai. All rights reserved.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /**
7
+ * Engine Integration Tests
8
+ *
9
+ * These tests actually run the engines with real API calls.
10
+ * They verify that agent-scoped config directories are used correctly.
11
+ *
12
+ * Requirements:
13
+ * - AGENTHIPPO_INTEGRATION_TEST=1 to enable (legacy: AGENTIDE_INTEGRATION_TEST)
14
+ * - ANTHROPIC_API_KEY or CLAUDE_API_KEY for Claude tests
15
+ * - OPENAI_API_KEY for Codex tests
16
+ *
17
+ * Run with:
18
+ * cd extensions/agentide && npm run compile && \
19
+ * AGENTHIPPO_INTEGRATION_TEST=1 ANTHROPIC_API_KEY=sk-... \
20
+ * node ../../node_modules/mocha/bin/mocha ./out/test/engine-integration.test.js --timeout 120000
21
+ */
22
+ require("mocha");
23
+ const branding_1 = require("../branding");
24
+ const INTEGRATION_ENABLED = process.env.AGENTHIPPO_INTEGRATION_TEST === '1' ||
25
+ process.env.AGENTIDE_INTEGRATION_TEST === '1';
26
+ // Only register tests when integration testing is enabled
27
+ // This avoids "pending" noise in normal test runs
28
+ if (INTEGRATION_ENABLED) {
29
+ const assert = require('assert');
30
+ const fs = require('fs');
31
+ const path = require('path');
32
+ const os = require('os');
33
+ // Shim vscode for engine modules that import it
34
+ const Module = require('module');
35
+ const originalRequire = Module.prototype.require;
36
+ const fakeVscode = {
37
+ window: {
38
+ showInformationMessage: () => undefined,
39
+ showErrorMessage: () => undefined,
40
+ },
41
+ workspace: {
42
+ getConfiguration: () => ({
43
+ get: (_key, defaultValue) => defaultValue,
44
+ inspect: (_key) => undefined,
45
+ }),
46
+ },
47
+ commands: {
48
+ executeCommand: async () => undefined,
49
+ },
50
+ };
51
+ Module.prototype.require = function (request) {
52
+ if (request === 'vscode') {
53
+ return fakeVscode;
54
+ }
55
+ return originalRequire.apply(this, arguments);
56
+ };
57
+ // Dynamic imports after stubbing vscode
58
+ const { ClaudeEngine } = require('../engines/claude');
59
+ const { CodexEngine } = require('../engines/codex');
60
+ const { resolveAgentRuntimePaths } = require('../agentpack/paths');
61
+ const { createTestAgentYaml } = require('./helpers/manifest-fixtures');
62
+ const CLAUDE_API_KEY = process.env.ANTHROPIC_API_KEY ||
63
+ process.env.CLAUDE_API_KEY ||
64
+ process.env.AGENTHIPPO_LITELLM_API_KEY ||
65
+ process.env.AGENTIDE_LITELLM_API_KEY;
66
+ const OPENAI_API_KEY = process.env.OPENAI_API_KEY ||
67
+ process.env.AGENTHIPPO_LITELLM_API_KEY ||
68
+ process.env.AGENTIDE_LITELLM_API_KEY;
69
+ const LITELLM_BASE_URL = process.env.AGENTHIPPO_LITELLM_BASE_URL ||
70
+ process.env.AGENTIDE_LITELLM_BASE_URL ||
71
+ 'https://localhost:4443';
72
+ // -------------------------------------------------------------------------
73
+ // Helper Functions
74
+ // -------------------------------------------------------------------------
75
+ function makeTempWorkspace() {
76
+ return fs.mkdtempSync(path.join(os.tmpdir(), `${branding_1.AGENTIDE_CLI_NAME}-integration-`));
77
+ }
78
+ function makeAgent(workspaceRoot, agentId, engine, modelId) {
79
+ const runtimePaths = resolveAgentRuntimePaths(workspaceRoot, workspaceRoot, agentId);
80
+ const agentRoot = runtimePaths.agentRoot;
81
+ fs.mkdirSync(agentRoot, { recursive: true });
82
+ fs.writeFileSync(path.join(agentRoot, 'AGENTS.md'), `# ${agentId} Agent\n\nA test agent for integration testing.\n`, 'utf8');
83
+ const agentYaml = createTestAgentYaml({
84
+ name: agentId,
85
+ version: '0.1.0',
86
+ engine,
87
+ model: modelId,
88
+ includeSkills: true,
89
+ fileAccess: 'workspace-write',
90
+ visibility: 'internal',
91
+ });
92
+ fs.writeFileSync(path.join(agentRoot, 'agent.yaml'), agentYaml, 'utf8');
93
+ return {
94
+ agentRoot,
95
+ claudeConfigDir: runtimePaths.claudeConfigDir,
96
+ codexHome: runtimePaths.codexHome,
97
+ };
98
+ }
99
+ function createOutputChannel() {
100
+ const lines = [];
101
+ return {
102
+ lines,
103
+ appendLine: (msg) => {
104
+ lines.push(msg);
105
+ if (process.env.DEBUG_INTEGRATION) {
106
+ console.log(msg);
107
+ }
108
+ },
109
+ show: () => { },
110
+ };
111
+ }
112
+ function createRuntimeContext(output) {
113
+ return {
114
+ logger: {
115
+ debug: (msg) => output.appendLine(msg),
116
+ info: (msg) => output.appendLine(msg),
117
+ warn: (msg) => output.appendLine(`Warning: ${msg}`),
118
+ error: (msg, err) => output.appendLine(`Error: ${msg}${err ? `: ${err.message}` : ''}`),
119
+ },
120
+ editTracker: undefined,
121
+ configProvider: undefined,
122
+ };
123
+ }
124
+ function createStreamEmitter() {
125
+ const chunks = [];
126
+ const emitter = {
127
+ progress: async (msg) => { chunks.push({ type: 'progress', content: msg }); },
128
+ thinking: async (msg) => { chunks.push({ type: 'thinking', content: msg }); },
129
+ message: async (msg) => { chunks.push({ type: 'message', content: msg }); },
130
+ error: async (msg) => { chunks.push({ type: 'error', content: msg }); },
131
+ done: async () => { chunks.push({ type: 'done', content: '' }); },
132
+ text: async (msg) => { chunks.push({ type: 'text', content: msg }); },
133
+ markdown: async (msg) => { chunks.push({ type: 'markdown', content: msg }); },
134
+ toolStart: async (name, input, id) => {
135
+ chunks.push({ type: 'toolStart', content: `${name}:${input || ''}:${id || ''}` });
136
+ },
137
+ };
138
+ return { emitter, chunks };
139
+ }
140
+ // -------------------------------------------------------------------------
141
+ // Claude Engine Integration Tests
142
+ // -------------------------------------------------------------------------
143
+ suite('Claude Engine Integration', function () {
144
+ this.timeout(120000);
145
+ if (!CLAUDE_API_KEY) {
146
+ console.log('[Claude tests] Skipped: no ANTHROPIC_API_KEY or CLAUDE_API_KEY');
147
+ return;
148
+ }
149
+ test('sends prompt and uses agent-scoped CLAUDE_CONFIG_DIR', async () => {
150
+ const workspaceRoot = makeTempWorkspace();
151
+ const agentId = 'integration-test-claude';
152
+ const { claudeConfigDir } = makeAgent(workspaceRoot, agentId, 'claude', 'claude-sonnet-4-5-20250929');
153
+ const workspaceClaude = path.join(workspaceRoot, '.claude');
154
+ if (fs.existsSync(workspaceClaude)) {
155
+ fs.rmSync(workspaceClaude, { recursive: true, force: true });
156
+ }
157
+ const output = createOutputChannel();
158
+ const { emitter, chunks } = createStreamEmitter();
159
+ const engine = new ClaudeEngine({ storagePath: workspaceRoot, codexHome: undefined, claudeConfigDir: undefined, litellmApiKey: CLAUDE_API_KEY, litellmBaseUrl: LITELLM_BASE_URL }, async () => 'integration-test-signature', () => undefined);
160
+ const opts = {
161
+ agentPackId: agentId,
162
+ workspaceRoot,
163
+ additionalDirectories: [],
164
+ modelId: 'claude-sonnet-4-5-20250929',
165
+ sessionId: `integration-${Date.now()}`,
166
+ apiKey: CLAUDE_API_KEY,
167
+ useLiteLLM: true,
168
+ };
169
+ await engine.stream('Reply with exactly: INTEGRATION_TEST_OK', opts, emitter, createRuntimeContext(output), new AbortController().signal);
170
+ assert.ok(fs.existsSync(claudeConfigDir), `Agent CLAUDE_CONFIG_DIR should exist: ${claudeConfigDir}`);
171
+ const hasAgentDirLog = output.lines.some((line) => line.includes('CLAUDE_CONFIG_DIR') && line.includes(agentId));
172
+ assert.ok(hasAgentDirLog, 'Output should log agent-scoped CLAUDE_CONFIG_DIR');
173
+ const textChunks = chunks.filter((c) => c.type === 'text');
174
+ assert.ok(textChunks.length > 0, 'Should receive text response from Claude');
175
+ const fullResponse = textChunks.map((c) => c.content).join('');
176
+ assert.ok(fullResponse.includes('INTEGRATION_TEST_OK'), `Response should contain INTEGRATION_TEST_OK, got: ${fullResponse.slice(0, 200)}`);
177
+ // Cleanup: dispose engine to close SDK sessions
178
+ engine.dispose();
179
+ try {
180
+ fs.rmSync(workspaceRoot, { recursive: true, force: true });
181
+ }
182
+ catch { /* ignore */ }
183
+ });
184
+ test('default agent uses default-scoped directory', async () => {
185
+ const workspaceRoot = makeTempWorkspace();
186
+ const defaultPaths = resolveAgentRuntimePaths(workspaceRoot, workspaceRoot, 'default');
187
+ const output = createOutputChannel();
188
+ const { emitter, chunks } = createStreamEmitter();
189
+ const engine = new ClaudeEngine({ storagePath: workspaceRoot, codexHome: undefined, claudeConfigDir: undefined, litellmApiKey: CLAUDE_API_KEY, litellmBaseUrl: LITELLM_BASE_URL }, async () => 'integration-test-signature', () => undefined);
190
+ const opts = {
191
+ workspaceRoot,
192
+ additionalDirectories: [],
193
+ modelId: 'claude-sonnet-4-5-20250929',
194
+ sessionId: `integration-default-${Date.now()}`,
195
+ apiKey: CLAUDE_API_KEY,
196
+ useLiteLLM: true,
197
+ };
198
+ await engine.stream('Reply with exactly: DEFAULT_MODE_OK', opts, emitter, createRuntimeContext(output), new AbortController().signal);
199
+ assert.ok(fs.existsSync(defaultPaths.claudeConfigDir), `Default CLAUDE_CONFIG_DIR should exist: ${defaultPaths.claudeConfigDir}`);
200
+ const textChunks = chunks.filter((c) => c.type === 'text');
201
+ const fullResponse = textChunks.map((c) => c.content).join('');
202
+ assert.ok(fullResponse.includes('DEFAULT_MODE_OK'), `Response should contain DEFAULT_MODE_OK, got: ${fullResponse.slice(0, 200)}`);
203
+ // Cleanup: dispose engine to close SDK sessions
204
+ engine.dispose();
205
+ try {
206
+ fs.rmSync(workspaceRoot, { recursive: true, force: true });
207
+ }
208
+ catch { /* ignore */ }
209
+ });
210
+ });
211
+ // -------------------------------------------------------------------------
212
+ // Codex Engine Integration Tests
213
+ // -------------------------------------------------------------------------
214
+ suite('Codex Engine Integration', function () {
215
+ this.timeout(120000);
216
+ if (!OPENAI_API_KEY) {
217
+ console.log('[Codex tests] Skipped: no OPENAI_API_KEY');
218
+ return;
219
+ }
220
+ test('writes config into agent-scoped CODEX_HOME', async () => {
221
+ const workspaceRoot = makeTempWorkspace();
222
+ const agentId = 'integration-test-codex';
223
+ const { codexHome } = makeAgent(workspaceRoot, agentId, 'codex', 'gpt-4o');
224
+ const workspaceCodex = path.join(workspaceRoot, '.codex');
225
+ if (fs.existsSync(workspaceCodex)) {
226
+ fs.rmSync(workspaceCodex, { recursive: true, force: true });
227
+ }
228
+ const output = createOutputChannel();
229
+ const engine = new CodexEngine({ storagePath: workspaceRoot, codexHome: undefined, claudeConfigDir: undefined, litellmApiKey: CLAUDE_API_KEY, litellmBaseUrl: LITELLM_BASE_URL }, () => undefined, () => undefined);
230
+ await engine.ensureCodexConfig(false, undefined, 'gpt-4o', workspaceRoot, [], output, codexHome, agentId);
231
+ const configPath = path.join(codexHome, 'config.toml');
232
+ assert.ok(fs.existsSync(configPath), `config.toml should exist in agent CODEX_HOME: ${codexHome}`);
233
+ const configContent = fs.readFileSync(configPath, 'utf8');
234
+ const instructionsMatch = configContent.match(/model_instructions_file\s*=\s*"([^"]+)"/);
235
+ assert.ok(instructionsMatch, `config.toml should include model_instructions_file, got:\n${configContent}`);
236
+ const instructionsPath = instructionsMatch?.[1];
237
+ assert.ok(instructionsPath && fs.existsSync(instructionsPath), `model_instructions_file should exist: ${instructionsPath ?? 'missing'}`);
238
+ const instructionsContent = fs.readFileSync(instructionsPath, 'utf8');
239
+ assert.ok(instructionsContent.includes(`# ${agentId} Agent`), 'Instructions file should include AGENTS.md content');
240
+ try {
241
+ fs.rmSync(workspaceRoot, { recursive: true, force: true });
242
+ }
243
+ catch { /* ignore */ }
244
+ });
245
+ });
246
+ // -------------------------------------------------------------------------
247
+ // Multi-Agent Isolation Tests
248
+ // -------------------------------------------------------------------------
249
+ suite('Multi-Agent Isolation', function () {
250
+ this.timeout(180000);
251
+ if (!CLAUDE_API_KEY) {
252
+ console.log('[Multi-Agent tests] Skipped: no ANTHROPIC_API_KEY or CLAUDE_API_KEY');
253
+ return;
254
+ }
255
+ test('different agents use isolated config directories', async () => {
256
+ const workspaceRoot = makeTempWorkspace();
257
+ const agentA = makeAgent(workspaceRoot, 'agent-alpha', 'claude', 'claude-sonnet-4-5-20250929');
258
+ const agentB = makeAgent(workspaceRoot, 'agent-beta', 'claude', 'claude-sonnet-4-5-20250929');
259
+ const engine = new ClaudeEngine({ storagePath: workspaceRoot, codexHome: undefined, claudeConfigDir: undefined, litellmApiKey: CLAUDE_API_KEY, litellmBaseUrl: LITELLM_BASE_URL }, async () => 'integration-test-signature', () => undefined);
260
+ const outputA = createOutputChannel();
261
+ const { emitter: emitterA } = createStreamEmitter();
262
+ await engine.stream('Reply: AGENT_ALPHA', {
263
+ agentPackId: 'agent-alpha',
264
+ workspaceRoot,
265
+ additionalDirectories: [],
266
+ modelId: 'claude-sonnet-4-5-20250929',
267
+ sessionId: `agent-alpha-${Date.now()}`,
268
+ apiKey: CLAUDE_API_KEY,
269
+ useLiteLLM: true,
270
+ }, emitterA, createRuntimeContext(outputA), new AbortController().signal);
271
+ const outputB = createOutputChannel();
272
+ const { emitter: emitterB } = createStreamEmitter();
273
+ await engine.stream('Reply: AGENT_BETA', {
274
+ agentPackId: 'agent-beta',
275
+ workspaceRoot,
276
+ additionalDirectories: [],
277
+ modelId: 'claude-sonnet-4-5-20250929',
278
+ sessionId: `agent-beta-${Date.now()}`,
279
+ apiKey: CLAUDE_API_KEY,
280
+ useLiteLLM: true,
281
+ }, emitterB, createRuntimeContext(outputB), new AbortController().signal);
282
+ assert.ok(fs.existsSync(agentA.claudeConfigDir), `Agent alpha CLAUDE_CONFIG_DIR should exist`);
283
+ assert.ok(fs.existsSync(agentB.claudeConfigDir), `Agent beta CLAUDE_CONFIG_DIR should exist`);
284
+ assert.notStrictEqual(agentA.claudeConfigDir, agentB.claudeConfigDir, 'Agent config dirs should be different');
285
+ const hasAgentALog = outputA.lines.some((line) => line.includes('CLAUDE_CONFIG_DIR') && line.includes('agent-alpha'));
286
+ const hasAgentBLog = outputB.lines.some((line) => line.includes('CLAUDE_CONFIG_DIR') && line.includes('agent-beta'));
287
+ assert.ok(hasAgentALog, 'Agent alpha output should log its config dir');
288
+ assert.ok(hasAgentBLog, 'Agent beta output should log its config dir');
289
+ // Cleanup: dispose engine to close SDK sessions
290
+ engine.dispose();
291
+ try {
292
+ fs.rmSync(workspaceRoot, { recursive: true, force: true });
293
+ }
294
+ catch { /* ignore */ }
295
+ });
296
+ });
297
+ } // end if (INTEGRATION_ENABLED)
@@ -0,0 +1,195 @@
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
+ /**
40
+ * Engine Paths Unit Tests
41
+ *
42
+ * Tests the path resolution logic for engine config directories.
43
+ * These are pure unit tests that don't require API keys or network access.
44
+ *
45
+ * For integration tests that actually run engines, see engine-integration.test.ts
46
+ */
47
+ require("mocha");
48
+ const assert = __importStar(require("assert"));
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const os = __importStar(require("os"));
52
+ // Shim vscode for engine modules that import it
53
+ const Module = require('module');
54
+ const originalRequire = Module.prototype.require;
55
+ const fakeVscode = {
56
+ window: {
57
+ showInformationMessage: () => undefined,
58
+ showErrorMessage: () => undefined,
59
+ },
60
+ workspace: {
61
+ getConfiguration: () => ({
62
+ get: (_key, defaultValue) => defaultValue,
63
+ inspect: (_key) => undefined,
64
+ }),
65
+ },
66
+ commands: {
67
+ executeCommand: async () => undefined,
68
+ },
69
+ };
70
+ Module.prototype.require = function (request) {
71
+ if (request === 'vscode') {
72
+ return fakeVscode;
73
+ }
74
+ // Stub SDK to prevent accidental real calls
75
+ if (request.includes('@anthropic-ai/claude-agent-sdk')) {
76
+ return {
77
+ Client: class {
78
+ constructor(_opts) { }
79
+ },
80
+ query: () => { throw new Error('SDK should not be called in unit tests'); },
81
+ };
82
+ }
83
+ return originalRequire.apply(this, arguments);
84
+ };
85
+ // Import after stubbing vscode
86
+ const codex_1 = require("../engines/codex");
87
+ const paths_1 = require("../agentpack/paths");
88
+ const logger_1 = require("../runtime/interfaces/logger");
89
+ // -----------------------------------------------------------------------------
90
+ // Helper Functions
91
+ // -----------------------------------------------------------------------------
92
+ const tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'agentide-engine-paths-'));
93
+ function makeTempWorkspace() {
94
+ return fs.mkdtempSync(path.join(tmpRoot, 'ws-'));
95
+ }
96
+ function makeSkill(dir, name) {
97
+ const skillDir = path.join(dir, 'skills', name);
98
+ fs.mkdirSync(skillDir, { recursive: true });
99
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), '# test skill', 'utf8');
100
+ }
101
+ // -----------------------------------------------------------------------------
102
+ // Path Resolution Tests
103
+ // -----------------------------------------------------------------------------
104
+ suite('Engine Path Resolution', () => {
105
+ test('agent paths resolve claudeConfigDir isolated per agent', () => {
106
+ const workspaceRoot = '/Users/test/project';
107
+ const storageUri = '/Users/test/.vscode/storage';
108
+ const agentId = 'my-agent';
109
+ const paths = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, agentId);
110
+ assert.ok(paths.claudeConfigDir.includes(agentId), `claudeConfigDir should contain agentId: ${paths.claudeConfigDir}`);
111
+ assert.ok(paths.claudeConfigDir.includes(paths_1.AGENT_CONSTANTS.AGENTS_DIR), `claudeConfigDir should be under agents dir: ${paths.claudeConfigDir}`);
112
+ });
113
+ test('agent paths resolve codexHome isolated per agent', () => {
114
+ const workspaceRoot = '/Users/test/project';
115
+ const storageUri = '/Users/test/.vscode/storage';
116
+ const agentId = 'my-agent';
117
+ const paths = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, agentId);
118
+ assert.ok(paths.codexHome.includes(agentId), `codexHome should contain agentId: ${paths.codexHome}`);
119
+ assert.ok(paths.codexHome.includes(paths_1.AGENT_CONSTANTS.AGENTS_DIR), `codexHome should be under agents dir: ${paths.codexHome}`);
120
+ });
121
+ test('default agent uses agents/default path', () => {
122
+ const workspaceRoot = '/Users/test/project';
123
+ const storageUri = '/Users/test/.vscode/storage';
124
+ const paths = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, 'default');
125
+ assert.ok(paths.claudeConfigDir.includes('default'), `claudeConfigDir should include 'default': ${paths.claudeConfigDir}`);
126
+ assert.ok(paths.codexHome.includes('default'), `codexHome should include 'default': ${paths.codexHome}`);
127
+ assert.ok(paths.agentRoot.includes('agents/default') || paths.agentRoot.includes('agents\\default'), `agentRoot should be under agents/default: ${paths.agentRoot}`);
128
+ });
129
+ test('different agents have isolated config directories', () => {
130
+ const workspaceRoot = '/Users/test/project';
131
+ const storageUri = '/Users/test/.vscode/storage';
132
+ const agentA = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, 'agent-a');
133
+ const agentB = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, 'agent-b');
134
+ assert.notStrictEqual(agentA.claudeConfigDir, agentB.claudeConfigDir, 'Different agents should have different claudeConfigDir');
135
+ assert.notStrictEqual(agentA.codexHome, agentB.codexHome, 'Different agents should have different codexHome');
136
+ });
137
+ test('derived dirs are at workspace root for all agents', () => {
138
+ const workspaceRoot = '/Users/test/project';
139
+ const storageUri = '/Users/test/.vscode/storage';
140
+ const agentPaths = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, 'my-agent');
141
+ const defaultPaths = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, 'default');
142
+ // All agents share the same derived dirs at workspace root
143
+ assert.strictEqual(agentPaths.codexDerivedDir, defaultPaths.codexDerivedDir, 'All agents should share the same codexDerivedDir');
144
+ assert.strictEqual(agentPaths.claudeDerivedDir, defaultPaths.claudeDerivedDir, 'All agents should share the same claudeDerivedDir');
145
+ assert.strictEqual(agentPaths.codexDerivedDir, path.join(workspaceRoot, '.codex'), 'codexDerivedDir should be at workspace root');
146
+ assert.strictEqual(agentPaths.claudeDerivedDir, path.join(workspaceRoot, '.claude'), 'claudeDerivedDir should be at workspace root');
147
+ });
148
+ test('agent content dirs are under AGENTIDE_DIR/agents/<agentId>', () => {
149
+ const workspaceRoot = '/Users/test/project';
150
+ const storageUri = '/Users/test/.vscode/storage';
151
+ const paths = (0, paths_1.resolveAgentRuntimePaths)(workspaceRoot, storageUri, 'test-agent');
152
+ assert.strictEqual(paths.agentRoot, path.join(workspaceRoot, paths_1.AGENT_CONSTANTS.AGENTIDE_DIR_NAME, 'agents', 'test-agent'), 'agentRoot should be under AGENTIDE_DIR/agents/test-agent');
153
+ assert.strictEqual(paths.rulesDir, path.join(workspaceRoot, paths_1.AGENT_CONSTANTS.AGENTIDE_DIR_NAME, 'agents', 'test-agent', 'rules'), 'rulesDir should be under agentRoot/rules');
154
+ assert.strictEqual(paths.skillsDir, path.join(workspaceRoot, paths_1.AGENT_CONSTANTS.AGENTIDE_DIR_NAME, 'agents', 'test-agent', 'skills'), 'skillsDir should be under agentRoot/skills');
155
+ });
156
+ });
157
+ // -----------------------------------------------------------------------------
158
+ // CodexEngine Config Tests (No API required)
159
+ // -----------------------------------------------------------------------------
160
+ suite('CodexEngine Config Paths', () => {
161
+ test('ensureCodexConfig writes to explicit CODEX_HOME', async () => {
162
+ const workspaceRoot = makeTempWorkspace();
163
+ const agentRoot = path.join(workspaceRoot, paths_1.AGENT_CONSTANTS.AGENTIDE_DIR_NAME, 'agents', 'agent-a');
164
+ const codexHome = path.join(workspaceRoot, paths_1.AGENT_CONSTANTS.AGENTIDE_DIR_NAME, 'agents', 'agent-a', 'codex-storage');
165
+ fs.mkdirSync(agentRoot, { recursive: true });
166
+ makeSkill(agentRoot, 's1');
167
+ const engine = new codex_1.CodexEngine({ storagePath: workspaceRoot, codexHome: undefined, claudeConfigDir: undefined }, () => undefined, () => undefined);
168
+ const logger = new logger_1.NoOpLogger();
169
+ const engineWithConfig = engine;
170
+ await engineWithConfig.ensureCodexConfig(false, // useLiteLLM
171
+ undefined, // customBaseUrl
172
+ undefined, // modelId
173
+ workspaceRoot, [], // additionalDirectories
174
+ logger, codexHome);
175
+ // Config files should be written into agent-local CODEX_HOME
176
+ assert.ok(fs.existsSync(path.join(codexHome, 'config.toml')), 'config.toml should be in agent CODEX_HOME');
177
+ // Workspace root .codex should NOT be created for config
178
+ // (derived dir may exist but shouldn't have config.toml)
179
+ const workspaceCodexConfig = path.join(workspaceRoot, '.codex', 'config.toml');
180
+ assert.ok(!fs.existsSync(workspaceCodexConfig), 'workspace .codex/config.toml should not be created');
181
+ });
182
+ test('ensureCodexConfig respects additionalDirectories', async () => {
183
+ const workspaceRoot = makeTempWorkspace();
184
+ const additionalDir = makeTempWorkspace();
185
+ const codexHome = path.join(workspaceRoot, paths_1.AGENT_CONSTANTS.AGENTIDE_DIR_NAME, 'agents', 'default', 'codex-storage');
186
+ // Create skills in additional directory
187
+ makeSkill(additionalDir, 'extra-skill');
188
+ const engine = new codex_1.CodexEngine({ storagePath: workspaceRoot, codexHome: undefined, claudeConfigDir: undefined }, () => undefined, () => undefined);
189
+ const logger = new logger_1.NoOpLogger();
190
+ const engineWithConfig = engine;
191
+ await engineWithConfig.ensureCodexConfig(false, undefined, undefined, workspaceRoot, [additionalDir], logger, codexHome);
192
+ // Config should be created
193
+ assert.ok(fs.existsSync(path.join(codexHome, 'config.toml')), 'config.toml should exist');
194
+ });
195
+ });
@@ -0,0 +1,82 @@
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
+ require("mocha");
40
+ const assert = __importStar(require("assert"));
41
+ const fs_1 = require("fs");
42
+ const os = __importStar(require("os"));
43
+ const path = __importStar(require("path"));
44
+ const publish_1 = require("../engines/publish");
45
+ suite('enginePublish', () => {
46
+ let tempDir;
47
+ suiteSetup(async () => {
48
+ tempDir = await fs_1.promises.mkdtemp(path.join(os.tmpdir(), 'agentide-engine-publish-'));
49
+ });
50
+ suiteTeardown(async () => {
51
+ await fs_1.promises.rm(tempDir, { recursive: true, force: true });
52
+ });
53
+ test('isValidPublishVersion accepts semver', () => {
54
+ assert.strictEqual((0, publish_1.isValidPublishVersion)('1.0.0'), true);
55
+ assert.strictEqual((0, publish_1.isValidPublishVersion)('2.1.3-beta.1'), true);
56
+ assert.strictEqual((0, publish_1.isValidPublishVersion)('latest'), false);
57
+ });
58
+ test('validateEngineForPublish rejects missing manifest', async () => {
59
+ const engineDir = path.join(tempDir, 'broken');
60
+ await fs_1.promises.mkdir(engineDir, { recursive: true });
61
+ const result = await (0, publish_1.validateEngineForPublish)(engineDir, 'broken');
62
+ assert.strictEqual(result.valid, false);
63
+ assert.ok(result.errors.some(error => error.includes('engine.manifest.json')));
64
+ });
65
+ test('validateEngineForPublish accepts minimal engine', async () => {
66
+ const engineDir = path.join(tempDir, 'demo');
67
+ await fs_1.promises.mkdir(engineDir, { recursive: true });
68
+ await fs_1.promises.writeFile(path.join(engineDir, 'engine.manifest.json'), `${JSON.stringify({
69
+ version: 2,
70
+ id: 'demo',
71
+ displayName: 'Demo',
72
+ entry: './engine.mjs',
73
+ promptInjection: { mode: 'message-suffix' },
74
+ }, null, 2)}\n`, 'utf-8');
75
+ await fs_1.promises.writeFile(path.join(engineDir, 'engine.mjs'), 'export class DemoEngine { async run() {} }\n', 'utf-8');
76
+ const result = await (0, publish_1.validateEngineForPublish)(engineDir, 'demo');
77
+ assert.strictEqual(result.valid, true, result.errors.join('; '));
78
+ const files = await (0, publish_1.collectEngineFiles)(engineDir);
79
+ assert.ok(files.some(file => file.path === 'engine.manifest.json'));
80
+ assert.ok(files.some(file => file.path === 'engine.mjs'));
81
+ });
82
+ });