@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,884 @@
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.getStoreIndex = getStoreIndex;
40
+ exports.searchStore = searchStore;
41
+ exports.listArtifacts = listArtifacts;
42
+ exports.forceRefresh = forceRefresh;
43
+ exports.invalidateLocalIndex = invalidateLocalIndex;
44
+ exports.searchMerged = searchMerged;
45
+ exports.listMergedArtifacts = listMergedArtifacts;
46
+ exports.isStale = isStale;
47
+ exports.isRemoteStoreMetaNewer = isRemoteStoreMetaNewer;
48
+ exports.isRemoteIndexNewerThanCache = isRemoteIndexNewerThanCache;
49
+ exports.getLastSyncTime = getLastSyncTime;
50
+ exports.getIndexMeta = getIndexMeta;
51
+ exports.initializeStoreIndex = initializeStoreIndex;
52
+ /**
53
+ * Orama-based Store Index
54
+ *
55
+ * Provides fast, offline-capable full-text search over the store artifacts.
56
+ * The index is pre-built via GitHub Actions and cached locally.
57
+ *
58
+ * Features:
59
+ * - Background sync on activation (if stale)
60
+ * - Instant local search (no network for queries)
61
+ * - Typo tolerance and fuzzy matching
62
+ * - Agent API for skill scripts
63
+ */
64
+ const vscode = __importStar(require("vscode"));
65
+ const fs_1 = require("fs");
66
+ const path = __importStar(require("path"));
67
+ const orama_1 = require("@orama/orama");
68
+ const github_1 = require("../agentpack/github");
69
+ const paths_1 = require("../agentpack/paths");
70
+ const index_1 = require("../registry/index");
71
+ const install_1 = require("../engines/install");
72
+ const install_2 = require("../spotlight/install");
73
+ // -----------------------------------------------------------------------------
74
+ // Configuration
75
+ // -----------------------------------------------------------------------------
76
+ /** Local store index cache under {@link getAgentideHome} (default ~/.agent-hippo/store-cache). */
77
+ function getStoreCacheDir() {
78
+ return path.join((0, paths_1.getAgentideHome)(), 'store-cache');
79
+ }
80
+ const DEFAULT_STORE_OWNER = 'agenthippoai';
81
+ const DEFAULT_STORE_REPO = 'agenthippo-store';
82
+ function getConfig() {
83
+ const config = vscode.workspace.getConfiguration('agentide');
84
+ const storeRepo = config.get('storeRepo', '');
85
+ const [owner, repo] = storeRepo
86
+ ? storeRepo.split('/')
87
+ : [DEFAULT_STORE_OWNER, DEFAULT_STORE_REPO];
88
+ const indexUrl = config.get('store.indexUrl', '') ||
89
+ `https://${owner}.github.io/${repo}`;
90
+ const syncIntervalHours = config.get('store.syncIntervalHours', 24);
91
+ const checkUpdatesOnStartup = config.get('store.checkUpdatesOnStartup', true);
92
+ return {
93
+ owner,
94
+ repo,
95
+ indexUrl,
96
+ oramaIndexUrl: `${indexUrl}/store-orama.json`,
97
+ metaUrl: `${indexUrl}/store-meta.json`,
98
+ rawIndexUrl: `${indexUrl}/store-index.json`,
99
+ syncIntervalMs: syncIntervalHours * 60 * 60 * 1000,
100
+ checkUpdatesOnStartup,
101
+ };
102
+ }
103
+ function getConfigKey(config) {
104
+ return `${config.owner}/${config.repo}|${config.rawIndexUrl}`;
105
+ }
106
+ // -----------------------------------------------------------------------------
107
+ // Orama Schema
108
+ // -----------------------------------------------------------------------------
109
+ const ORAMA_SCHEMA = {
110
+ id: 'string',
111
+ type: 'enum',
112
+ slug: 'string',
113
+ displayName: 'string',
114
+ description: 'string',
115
+ tags: 'string[]',
116
+ author: 'string',
117
+ latestVersion: 'string',
118
+ };
119
+ // -----------------------------------------------------------------------------
120
+ // State
121
+ // -----------------------------------------------------------------------------
122
+ // Remote store index state
123
+ let cachedDb = null;
124
+ let cachedConfigKey = null;
125
+ let syncInProgress = null;
126
+ let lastSyncAttempt = 0;
127
+ const SYNC_COOLDOWN_MS = 60_000; // Don't retry sync more than once per minute
128
+ /** Minimum interval between remote store-meta.json fetches when cache is time-fresh. */
129
+ const REMOTE_META_CHECK_INTERVAL_MS = 10 * 60 * 1000;
130
+ let lastRemoteMetaCheckAt = 0;
131
+ let lastRemoteMetaConfigKey = null;
132
+ let lastRemoteMetaCached;
133
+ // Local library index state (Option B: separate index for user's installed items)
134
+ let localDb = null;
135
+ let localDbVersion = 0; // Incremented when registry changes
136
+ // -----------------------------------------------------------------------------
137
+ // Public API
138
+ // -----------------------------------------------------------------------------
139
+ /**
140
+ * Get the store index, loading from cache or fetching if needed.
141
+ * This is the main entry point for accessing the index.
142
+ */
143
+ async function getStoreIndex(outputChannel) {
144
+ const config = getConfig();
145
+ const configKey = getConfigKey(config);
146
+ // If config changed, clear in-memory cache so we fetch from the new source
147
+ if (cachedDb && cachedConfigKey && cachedConfigKey !== configKey) {
148
+ outputChannel?.appendLine('[Store Index] Store config changed, clearing in-memory cache');
149
+ cachedDb = null;
150
+ clearRemoteMetaCheckCache();
151
+ }
152
+ if (cachedDb) {
153
+ await maybeRefreshStoreIndex(outputChannel);
154
+ return cachedDb;
155
+ }
156
+ // Try to load from cache first
157
+ const cached = await loadCachedIndex(configKey, outputChannel);
158
+ if (cached) {
159
+ cachedDb = cached;
160
+ await maybeRefreshStoreIndex(outputChannel);
161
+ return cachedDb;
162
+ }
163
+ // No cache, must fetch synchronously
164
+ await refreshIndex(outputChannel);
165
+ if (!cachedDb) {
166
+ // Create empty index as fallback
167
+ cachedDb = await (0, orama_1.create)({ schema: ORAMA_SCHEMA });
168
+ }
169
+ return cachedDb;
170
+ }
171
+ /**
172
+ * Search the store index.
173
+ */
174
+ async function searchStore(query, options, outputChannel) {
175
+ const db = await getStoreIndex(outputChannel);
176
+ const searchOptions = {
177
+ term: query,
178
+ properties: ['displayName', 'description', 'slug', 'tags'],
179
+ limit: options?.limit ?? 20,
180
+ tolerance: 1, // Allow 1 typo
181
+ };
182
+ if (options?.type) {
183
+ searchOptions.where = { type: options.type };
184
+ }
185
+ const results = await (0, orama_1.search)(db, searchOptions);
186
+ return results.hits.map((hit) => ({
187
+ id: hit.document.id,
188
+ type: hit.document.type,
189
+ slug: hit.document.slug,
190
+ displayName: hit.document.displayName,
191
+ description: hit.document.description,
192
+ tags: hit.document.tags,
193
+ author: hit.document.author,
194
+ latestVersion: hit.document.latestVersion,
195
+ score: hit.score,
196
+ }));
197
+ }
198
+ /**
199
+ * Get all artifacts of a specific type.
200
+ */
201
+ async function listArtifacts(type, outputChannel) {
202
+ const db = await getStoreIndex(outputChannel);
203
+ const searchOptions = {
204
+ term: '',
205
+ limit: 1000,
206
+ };
207
+ if (type) {
208
+ searchOptions.where = { type };
209
+ }
210
+ const results = await (0, orama_1.search)(db, searchOptions);
211
+ return results.hits.map((hit) => ({
212
+ id: hit.document.id,
213
+ type: hit.document.type,
214
+ slug: hit.document.slug,
215
+ displayName: hit.document.displayName,
216
+ description: hit.document.description,
217
+ tags: hit.document.tags,
218
+ author: hit.document.author,
219
+ latestVersion: hit.document.latestVersion,
220
+ score: hit.score,
221
+ }));
222
+ }
223
+ /**
224
+ * Force refresh the index from remote.
225
+ */
226
+ async function forceRefresh(outputChannel) {
227
+ await refreshIndex(outputChannel);
228
+ }
229
+ // -----------------------------------------------------------------------------
230
+ // Local Library Index (Option B: Two Indexes)
231
+ // -----------------------------------------------------------------------------
232
+ /**
233
+ * Build or get the local library Orama index from the user's registry.
234
+ * This index contains installed packs, skills, MCP servers, and custom engines.
235
+ */
236
+ async function getLocalIndex(outputChannel) {
237
+ // Check if we need to rebuild (registry might have changed)
238
+ const registry = (0, index_1.getRegistry)();
239
+ const packs = await registry.listPacks();
240
+ const skills = await registry.listSkills();
241
+ const mcps = await registry.listMcp();
242
+ const engines = await listInstalledEngines();
243
+ const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
244
+ const views = await (0, install_2.listInstalledSpotlightViews)(workspaceRoot);
245
+ const totalItems = packs.length + skills.length + mcps.length + engines.length + views.length;
246
+ // Simple version check: if item count changed, rebuild
247
+ if (localDb && localDbVersion === totalItems) {
248
+ return localDb;
249
+ }
250
+ outputChannel?.appendLine(`[Store Index] Building local library index (${totalItems} items)...`);
251
+ const db = await (0, orama_1.create)({ schema: ORAMA_SCHEMA });
252
+ // Insert packs
253
+ for (const pack of packs) {
254
+ await (0, orama_1.insert)(db, {
255
+ id: `pack/${pack.slug}`,
256
+ type: 'pack',
257
+ slug: pack.slug,
258
+ displayName: pack.displayName,
259
+ description: pack.description || '',
260
+ tags: pack.tags || [],
261
+ author: pack.githubOwner || '',
262
+ latestVersion: pack.latestVersion,
263
+ });
264
+ }
265
+ // Insert skills
266
+ for (const skill of skills) {
267
+ await (0, orama_1.insert)(db, {
268
+ id: `skill/${skill.slug}`,
269
+ type: 'skill',
270
+ slug: skill.slug,
271
+ displayName: skill.displayName,
272
+ description: skill.description || '',
273
+ tags: skill.tags || [],
274
+ author: skill.githubOwner || '',
275
+ latestVersion: skill.latestVersion,
276
+ });
277
+ }
278
+ // Insert MCP servers
279
+ for (const mcp of mcps) {
280
+ await (0, orama_1.insert)(db, {
281
+ id: `mcp/${mcp.slug}`,
282
+ type: 'mcp',
283
+ slug: mcp.slug,
284
+ displayName: mcp.displayName,
285
+ description: mcp.description || '',
286
+ tags: mcp.tags || [],
287
+ author: mcp.githubOwner || '',
288
+ latestVersion: mcp.latestVersion,
289
+ });
290
+ }
291
+ // Insert custom engines
292
+ for (const engine of engines) {
293
+ await (0, orama_1.insert)(db, {
294
+ id: `engine/${engine.slug}`,
295
+ type: 'engine',
296
+ slug: engine.slug,
297
+ displayName: engine.displayName,
298
+ description: engine.description || '',
299
+ tags: engine.tags || [],
300
+ author: '',
301
+ latestVersion: engine.latestVersion,
302
+ });
303
+ }
304
+ // Insert installed Spotlight views
305
+ for (const view of views) {
306
+ await (0, orama_1.insert)(db, {
307
+ id: `view/${view.slug}`,
308
+ type: 'view',
309
+ slug: view.slug,
310
+ displayName: view.displayName,
311
+ description: view.description || '',
312
+ tags: view.tags || ['spotlight'],
313
+ author: '',
314
+ latestVersion: view.latestVersion,
315
+ });
316
+ }
317
+ localDb = db;
318
+ localDbVersion = totalItems;
319
+ outputChannel?.appendLine(`[Store Index] Local library index built (${totalItems} items)`);
320
+ return db;
321
+ }
322
+ async function listInstalledEngines() {
323
+ // Use the same install root the engine installer writes to so that
324
+ // AGENT_HOME_DIR / AGENTHIPPO_HOME overrides (and any future relocation)
325
+ // stay consistent between installer and library index.
326
+ const root = (0, install_1.getDefaultCustomEnginesInstallRoot)();
327
+ let entries;
328
+ try {
329
+ entries = await fs_1.promises.readdir(root, { withFileTypes: true });
330
+ }
331
+ catch {
332
+ return [];
333
+ }
334
+ const engines = [];
335
+ for (const entry of entries) {
336
+ if (!entry.isDirectory() || entry.name.startsWith('.')) {
337
+ continue;
338
+ }
339
+ try {
340
+ const manifestPath = path.join(root, entry.name, 'engine.manifest.json');
341
+ const manifest = JSON.parse(await fs_1.promises.readFile(manifestPath, 'utf8'));
342
+ const slug = typeof manifest.id === 'string' && manifest.id.trim()
343
+ ? manifest.id.trim().toLowerCase()
344
+ : entry.name.toLowerCase();
345
+ const displayName = typeof manifest.displayName === 'string' && manifest.displayName.trim()
346
+ ? manifest.displayName.trim()
347
+ : slug;
348
+ const description = typeof manifest.description === 'string' && manifest.description.trim()
349
+ ? manifest.description.trim()
350
+ : undefined;
351
+ const packageJson = await fs_1.promises.readFile(path.join(root, entry.name, 'package.json'), 'utf8')
352
+ .then(raw => JSON.parse(raw))
353
+ .catch(() => undefined);
354
+ const latestVersion = typeof packageJson?.version === 'string' && packageJson.version.trim()
355
+ ? packageJson.version.trim()
356
+ : 'local';
357
+ engines.push({
358
+ slug,
359
+ displayName,
360
+ description,
361
+ tags: ['engine'],
362
+ latestVersion,
363
+ });
364
+ }
365
+ catch {
366
+ engines.push({
367
+ slug: entry.name.toLowerCase(),
368
+ displayName: entry.name,
369
+ tags: ['engine'],
370
+ latestVersion: 'local',
371
+ });
372
+ }
373
+ }
374
+ return engines;
375
+ }
376
+ /**
377
+ * Get a map of installed items for quick lookup.
378
+ * Returns { 'pack/my-pack': { version: '1.0.0', installedTo: [...] }, ... }
379
+ */
380
+ async function getInstalledMap() {
381
+ const registry = (0, index_1.getRegistry)();
382
+ const installed = new Map();
383
+ const packs = await registry.listPacks();
384
+ for (const pack of packs) {
385
+ installed.set(`pack/${pack.slug}`, { version: pack.latestVersion });
386
+ }
387
+ const skills = await registry.listSkills();
388
+ for (const skill of skills) {
389
+ installed.set(`skill/${skill.slug}`, {
390
+ version: skill.latestVersion,
391
+ installedTo: skill.installedTo || [],
392
+ });
393
+ }
394
+ const mcps = await registry.listMcp();
395
+ for (const mcp of mcps) {
396
+ installed.set(`mcp/${mcp.slug}`, {
397
+ version: mcp.latestVersion,
398
+ installedTo: mcp.installedTo || [],
399
+ });
400
+ }
401
+ const engines = await listInstalledEngines();
402
+ for (const engine of engines) {
403
+ installed.set(`engine/${engine.slug}`, {
404
+ version: engine.latestVersion,
405
+ });
406
+ }
407
+ const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
408
+ const views = await (0, install_2.listInstalledSpotlightViews)(workspaceRoot);
409
+ for (const view of views) {
410
+ installed.set(`view/${view.slug}`, {
411
+ version: view.latestVersion,
412
+ });
413
+ }
414
+ return installed;
415
+ }
416
+ /**
417
+ * Invalidate the local library index cache.
418
+ * Call this after installing/uninstalling items.
419
+ */
420
+ function invalidateLocalIndex() {
421
+ localDb = null;
422
+ localDbVersion = 0;
423
+ }
424
+ /**
425
+ * Search both local library and remote store, merging results.
426
+ * Local items appear first and are marked as installed.
427
+ */
428
+ async function searchMerged(query, options, outputChannel) {
429
+ const limit = options?.limit ?? 20;
430
+ // Get both indexes
431
+ const [localIndex, remoteIndex, installedMap] = await Promise.all([
432
+ getLocalIndex(outputChannel),
433
+ getStoreIndex(outputChannel),
434
+ getInstalledMap(),
435
+ ]);
436
+ const searchOptions = {
437
+ term: query,
438
+ properties: ['displayName', 'description', 'slug', 'tags'],
439
+ limit: limit,
440
+ tolerance: 1,
441
+ };
442
+ if (options?.type) {
443
+ searchOptions.where = { type: options.type };
444
+ }
445
+ // Search both indexes in parallel
446
+ const [localResults, remoteResults] = await Promise.all([
447
+ (0, orama_1.search)(localIndex, searchOptions),
448
+ (0, orama_1.search)(remoteIndex, searchOptions),
449
+ ]);
450
+ // Merge: local first, then remote (excluding duplicates)
451
+ const merged = [];
452
+ const seenIds = new Set();
453
+ // Add local results first (marked as installed)
454
+ for (const hit of localResults.hits) {
455
+ const id = hit.document.id;
456
+ seenIds.add(id);
457
+ const info = installedMap.get(id);
458
+ merged.push({
459
+ id,
460
+ type: hit.document.type,
461
+ slug: hit.document.slug,
462
+ displayName: hit.document.displayName,
463
+ description: hit.document.description,
464
+ tags: hit.document.tags,
465
+ author: hit.document.author,
466
+ latestVersion: hit.document.latestVersion,
467
+ score: hit.score,
468
+ source: 'local',
469
+ installed: true,
470
+ installedVersion: info?.version,
471
+ installedTo: info?.installedTo,
472
+ });
473
+ }
474
+ // Add remote results (not already in local)
475
+ for (const hit of remoteResults.hits) {
476
+ const id = hit.document.id;
477
+ if (seenIds.has(id)) {
478
+ continue; // Already added from local
479
+ }
480
+ seenIds.add(id);
481
+ const info = installedMap.get(id);
482
+ merged.push({
483
+ id,
484
+ type: hit.document.type,
485
+ slug: hit.document.slug,
486
+ displayName: hit.document.displayName,
487
+ description: hit.document.description,
488
+ tags: hit.document.tags,
489
+ author: hit.document.author,
490
+ latestVersion: hit.document.latestVersion,
491
+ score: hit.score,
492
+ source: 'remote',
493
+ installed: !!info,
494
+ installedVersion: info?.version,
495
+ installedTo: info?.installedTo,
496
+ });
497
+ }
498
+ return merged.slice(0, limit);
499
+ }
500
+ /**
501
+ * List all artifacts from both local and remote, merged.
502
+ */
503
+ async function listMergedArtifacts(type, outputChannel) {
504
+ const [localIndex, remoteIndex, installedMap] = await Promise.all([
505
+ getLocalIndex(outputChannel),
506
+ getStoreIndex(outputChannel),
507
+ getInstalledMap(),
508
+ ]);
509
+ const searchOptions = {
510
+ term: '',
511
+ limit: 1000,
512
+ };
513
+ if (type) {
514
+ searchOptions.where = { type };
515
+ }
516
+ const [localResults, remoteResults] = await Promise.all([
517
+ (0, orama_1.search)(localIndex, searchOptions),
518
+ (0, orama_1.search)(remoteIndex, searchOptions),
519
+ ]);
520
+ const merged = [];
521
+ const seenIds = new Set();
522
+ // Local items first
523
+ for (const hit of localResults.hits) {
524
+ const id = hit.document.id;
525
+ seenIds.add(id);
526
+ const info = installedMap.get(id);
527
+ merged.push({
528
+ id,
529
+ type: hit.document.type,
530
+ slug: hit.document.slug,
531
+ displayName: hit.document.displayName,
532
+ description: hit.document.description,
533
+ tags: hit.document.tags,
534
+ author: hit.document.author,
535
+ latestVersion: hit.document.latestVersion,
536
+ score: hit.score,
537
+ source: 'local',
538
+ installed: true,
539
+ installedVersion: info?.version,
540
+ installedTo: info?.installedTo,
541
+ });
542
+ }
543
+ // Remote items (not duplicates)
544
+ for (const hit of remoteResults.hits) {
545
+ const id = hit.document.id;
546
+ if (seenIds.has(id)) {
547
+ continue;
548
+ }
549
+ seenIds.add(id);
550
+ const info = installedMap.get(id);
551
+ merged.push({
552
+ id,
553
+ type: hit.document.type,
554
+ slug: hit.document.slug,
555
+ displayName: hit.document.displayName,
556
+ description: hit.document.description,
557
+ tags: hit.document.tags,
558
+ author: hit.document.author,
559
+ latestVersion: hit.document.latestVersion,
560
+ score: hit.score,
561
+ source: 'remote',
562
+ installed: !!info,
563
+ installedVersion: info?.version,
564
+ installedTo: info?.installedTo,
565
+ });
566
+ }
567
+ return merged;
568
+ }
569
+ /**
570
+ * Check if the cached index is stale (time-based).
571
+ */
572
+ async function isStale() {
573
+ try {
574
+ const lastSyncPath = path.join(getStoreCacheDir(), 'last-sync.txt');
575
+ const lastSync = await fs_1.promises.readFile(lastSyncPath, 'utf8');
576
+ const { syncIntervalMs } = getConfig();
577
+ return Date.now() - parseInt(lastSync, 10) > syncIntervalMs;
578
+ }
579
+ catch {
580
+ return true;
581
+ }
582
+ }
583
+ /**
584
+ * Compare local cache metadata with remote store metadata (pure, testable).
585
+ */
586
+ function isRemoteStoreMetaNewer(localMeta, remoteMeta) {
587
+ if (!localMeta?.generatedAt) {
588
+ return true;
589
+ }
590
+ if (!remoteMeta?.generatedAt) {
591
+ return false;
592
+ }
593
+ const localTime = Date.parse(localMeta.generatedAt);
594
+ const remoteTime = Date.parse(remoteMeta.generatedAt);
595
+ if (!Number.isNaN(remoteTime) && !Number.isNaN(localTime) && remoteTime > localTime) {
596
+ return true;
597
+ }
598
+ if (typeof remoteMeta.artifactCount === 'number'
599
+ && typeof localMeta.artifactCount === 'number'
600
+ && remoteMeta.artifactCount !== localMeta.artifactCount) {
601
+ return true;
602
+ }
603
+ return false;
604
+ }
605
+ /**
606
+ * True when GitHub Pages has a newer index than the local cache (e.g. new spotlight views).
607
+ */
608
+ async function isRemoteIndexNewerThanCache(outputChannel) {
609
+ const config = getConfig();
610
+ const configKey = getConfigKey(config);
611
+ const localMeta = await getIndexMeta();
612
+ const remoteMeta = await getRemoteIndexMetaCached(config, configKey, outputChannel);
613
+ const newer = isRemoteStoreMetaNewer(localMeta, remoteMeta ?? undefined);
614
+ if (newer && remoteMeta && localMeta?.generatedAt) {
615
+ const localTime = Date.parse(localMeta.generatedAt);
616
+ const remoteTime = Date.parse(remoteMeta.generatedAt);
617
+ if (!Number.isNaN(remoteTime) && !Number.isNaN(localTime) && remoteTime > localTime) {
618
+ outputChannel?.appendLine(`[Store Index] Remote index is newer (${remoteMeta.generatedAt} > ${localMeta.generatedAt})`);
619
+ }
620
+ else if (typeof remoteMeta.artifactCount === 'number'
621
+ && typeof localMeta.artifactCount === 'number'
622
+ && remoteMeta.artifactCount !== localMeta.artifactCount) {
623
+ outputChannel?.appendLine(`[Store Index] Remote artifact count changed (${localMeta.artifactCount} -> ${remoteMeta.artifactCount})`);
624
+ }
625
+ }
626
+ return newer;
627
+ }
628
+ /**
629
+ * Get the last sync timestamp.
630
+ */
631
+ async function getLastSyncTime() {
632
+ try {
633
+ const lastSyncPath = path.join(getStoreCacheDir(), 'last-sync.txt');
634
+ const lastSync = await fs_1.promises.readFile(lastSyncPath, 'utf8');
635
+ return new Date(parseInt(lastSync, 10));
636
+ }
637
+ catch {
638
+ return null;
639
+ }
640
+ }
641
+ /**
642
+ * Get index metadata.
643
+ */
644
+ async function getIndexMeta() {
645
+ try {
646
+ const metaPath = path.join(getStoreCacheDir(), 'store-meta.json');
647
+ const data = await fs_1.promises.readFile(metaPath, 'utf8');
648
+ return JSON.parse(data);
649
+ }
650
+ catch {
651
+ return null;
652
+ }
653
+ }
654
+ // -----------------------------------------------------------------------------
655
+ // Internal Functions
656
+ // -----------------------------------------------------------------------------
657
+ function clearRemoteMetaCheckCache() {
658
+ lastRemoteMetaCheckAt = 0;
659
+ lastRemoteMetaConfigKey = null;
660
+ lastRemoteMetaCached = undefined;
661
+ }
662
+ async function getRemoteIndexMetaCached(config, configKey, outputChannel) {
663
+ const now = Date.now();
664
+ if (lastRemoteMetaConfigKey === configKey
665
+ && lastRemoteMetaCached !== undefined
666
+ && now - lastRemoteMetaCheckAt < REMOTE_META_CHECK_INTERVAL_MS) {
667
+ return lastRemoteMetaCached;
668
+ }
669
+ lastRemoteMetaConfigKey = configKey;
670
+ lastRemoteMetaCheckAt = now;
671
+ lastRemoteMetaCached = await fetchRemoteIndexMeta(config, outputChannel);
672
+ return lastRemoteMetaCached;
673
+ }
674
+ async function maybeRefreshStoreIndex(outputChannel) {
675
+ if (await isStale()) {
676
+ void refreshIndexBackground(outputChannel);
677
+ return;
678
+ }
679
+ if (await isRemoteIndexNewerThanCache(outputChannel)) {
680
+ outputChannel?.appendLine('[Store Index] Remote catalog updated, refreshing in background...');
681
+ void refreshIndexBackground(outputChannel);
682
+ }
683
+ }
684
+ async function fetchRemoteIndexMeta(config, outputChannel) {
685
+ try {
686
+ const response = await fetch(config.metaUrl, {
687
+ headers: {
688
+ 'Accept': 'application/json',
689
+ 'User-Agent': 'AgentHippo',
690
+ },
691
+ });
692
+ if (response.ok) {
693
+ const meta = await response.json();
694
+ if (typeof meta.generatedAt === 'string' && meta.generatedAt.trim()) {
695
+ return {
696
+ generatedAt: meta.generatedAt,
697
+ artifactCount: typeof meta.artifactCount === 'number' ? meta.artifactCount : 0,
698
+ };
699
+ }
700
+ }
701
+ }
702
+ catch (e) {
703
+ outputChannel?.appendLine(`[Store Index] store-meta.json fetch failed: ${e instanceof Error ? e.message : String(e)}`);
704
+ }
705
+ try {
706
+ const response = await fetch(config.rawIndexUrl, {
707
+ headers: {
708
+ 'Accept': 'application/json',
709
+ 'User-Agent': 'AgentHippo',
710
+ },
711
+ });
712
+ if (response.ok) {
713
+ const index = await response.json();
714
+ if (typeof index.generatedAt === 'string' && index.generatedAt.trim()) {
715
+ return {
716
+ generatedAt: index.generatedAt,
717
+ artifactCount: Array.isArray(index.artifacts) ? index.artifacts.length : 0,
718
+ };
719
+ }
720
+ }
721
+ }
722
+ catch {
723
+ // ignore
724
+ }
725
+ return null;
726
+ }
727
+ async function loadCachedIndex(configKey, outputChannel) {
728
+ try {
729
+ // Validate cached metadata matches current config
730
+ const metaPath = path.join(getStoreCacheDir(), 'store-meta.json');
731
+ const metaRaw = await fs_1.promises.readFile(metaPath, 'utf8');
732
+ const meta = JSON.parse(metaRaw);
733
+ if (!meta.sourceKey || meta.sourceKey !== configKey) {
734
+ outputChannel?.appendLine('[Store Index] Cache source mismatch; ignoring cached index');
735
+ return null;
736
+ }
737
+ const indexPath = path.join(getStoreCacheDir(), 'store-orama.json');
738
+ const data = await fs_1.promises.readFile(indexPath, 'utf8');
739
+ const parsed = JSON.parse(data);
740
+ // Orama's load function restores the index from serialized state
741
+ const db = await (0, orama_1.create)({ schema: ORAMA_SCHEMA });
742
+ // Orama v3 uses a different restore approach - we need to insert records
743
+ if (parsed.artifacts && Array.isArray(parsed.artifacts)) {
744
+ for (const artifact of parsed.artifacts) {
745
+ await (0, orama_1.insert)(db, artifact);
746
+ }
747
+ }
748
+ else if (parsed.docs) {
749
+ // Handle serialized Orama format
750
+ for (const doc of Object.values(parsed.docs)) {
751
+ await (0, orama_1.insert)(db, doc);
752
+ }
753
+ }
754
+ outputChannel?.appendLine(`[Store Index] Loaded ${(await (0, orama_1.search)(db, { term: '', limit: 1 })).count} artifacts from cache`);
755
+ cachedConfigKey = configKey;
756
+ return db;
757
+ }
758
+ catch (e) {
759
+ outputChannel?.appendLine(`[Store Index] Failed to load cache: ${e instanceof Error ? e.message : String(e)}`);
760
+ return null;
761
+ }
762
+ }
763
+ async function refreshIndexBackground(outputChannel) {
764
+ // Debounce: don't spam sync attempts
765
+ if (Date.now() - lastSyncAttempt < SYNC_COOLDOWN_MS) {
766
+ return;
767
+ }
768
+ // Only one sync at a time
769
+ if (syncInProgress) {
770
+ return;
771
+ }
772
+ syncInProgress = refreshIndex(outputChannel).finally(() => {
773
+ syncInProgress = null;
774
+ });
775
+ }
776
+ async function refreshIndex(outputChannel) {
777
+ lastSyncAttempt = Date.now();
778
+ const config = getConfig();
779
+ const configKey = getConfigKey(config);
780
+ outputChannel?.appendLine(`[Store Index] Syncing from ${config.rawIndexUrl}...`);
781
+ try {
782
+ // Try to fetch the index
783
+ const indexData = await fetchIndexWithFallback(config, outputChannel);
784
+ if (!indexData.artifacts || !Array.isArray(indexData.artifacts)) {
785
+ throw new Error('Invalid index format: missing artifacts array');
786
+ }
787
+ // Build Orama index
788
+ const db = await (0, orama_1.create)({ schema: ORAMA_SCHEMA });
789
+ for (const artifact of indexData.artifacts) {
790
+ await (0, orama_1.insert)(db, {
791
+ id: artifact.id,
792
+ type: artifact.type,
793
+ slug: artifact.slug,
794
+ displayName: artifact.displayName,
795
+ description: artifact.description || '',
796
+ tags: artifact.tags || [],
797
+ author: artifact.author || '',
798
+ latestVersion: artifact.latestVersion || '',
799
+ });
800
+ }
801
+ // Cache the index
802
+ const cacheDir = getStoreCacheDir();
803
+ await fs_1.promises.mkdir(cacheDir, { recursive: true });
804
+ // Save raw artifacts for easy reload
805
+ await fs_1.promises.writeFile(path.join(cacheDir, 'store-orama.json'), JSON.stringify({ artifacts: indexData.artifacts }));
806
+ // Save metadata
807
+ await fs_1.promises.writeFile(path.join(cacheDir, 'store-meta.json'), JSON.stringify({
808
+ version: indexData.version,
809
+ generatedAt: indexData.generatedAt,
810
+ artifactCount: indexData.artifacts.length,
811
+ source: {
812
+ owner: config.owner,
813
+ repo: config.repo,
814
+ indexUrl: config.indexUrl,
815
+ rawIndexUrl: config.rawIndexUrl,
816
+ },
817
+ sourceKey: configKey,
818
+ }));
819
+ // Save sync timestamp
820
+ await fs_1.promises.writeFile(path.join(cacheDir, 'last-sync.txt'), Date.now().toString());
821
+ cachedDb = db;
822
+ cachedConfigKey = configKey;
823
+ outputChannel?.appendLine(`[Store Index] Synced ${indexData.artifacts.length} artifacts`);
824
+ }
825
+ catch (e) {
826
+ outputChannel?.appendLine(`[Store Index] Sync failed: ${e instanceof Error ? e.message : String(e)}`);
827
+ // Don't throw - we might have a cached version to fall back to
828
+ }
829
+ }
830
+ /**
831
+ * Fetch the store index, trying GitHub Pages first, then falling back to GitHub API.
832
+ * This allows both public repos (via CDN) and private repos (via API with auth) to work.
833
+ */
834
+ async function fetchIndexWithFallback(config, outputChannel) {
835
+ // Try GitHub Pages first (fast CDN, works for public repos)
836
+ try {
837
+ const response = await fetch(config.rawIndexUrl, {
838
+ headers: {
839
+ 'Accept': 'application/json',
840
+ 'User-Agent': 'AgentHippo',
841
+ },
842
+ });
843
+ if (response.ok) {
844
+ outputChannel?.appendLine(`[Store Index] Fetched from GitHub Pages`);
845
+ return await response.json();
846
+ }
847
+ // If 403/404, might be a private repo - try GitHub API
848
+ if (response.status === 403 || response.status === 404) {
849
+ outputChannel?.appendLine(`[Store Index] GitHub Pages not available (${response.status}), trying GitHub API...`);
850
+ }
851
+ else {
852
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
853
+ }
854
+ }
855
+ catch (e) {
856
+ // Network error or other issue - try GitHub API as fallback
857
+ outputChannel?.appendLine(`[Store Index] GitHub Pages fetch failed, trying GitHub API...`);
858
+ }
859
+ // Fallback: Try GitHub API (works for private repos with VS Code auth)
860
+ if (await (0, github_1.isGitHubAuthenticated)()) {
861
+ const fileContent = await (0, github_1.getFileContent)(config.owner, config.repo, 'dist/store-index.json');
862
+ if (fileContent) {
863
+ outputChannel?.appendLine(`[Store Index] Fetched from GitHub API (private repo)`);
864
+ return JSON.parse(fileContent.content);
865
+ }
866
+ }
867
+ throw new Error('Could not fetch store index from GitHub Pages or GitHub API');
868
+ }
869
+ // -----------------------------------------------------------------------------
870
+ // Initialization
871
+ // -----------------------------------------------------------------------------
872
+ /**
873
+ * Initialize the store index on extension activation.
874
+ * This preloads the cache and triggers a background refresh if stale.
875
+ */
876
+ async function initializeStoreIndex(outputChannel) {
877
+ try {
878
+ await getStoreIndex(outputChannel);
879
+ outputChannel?.appendLine('[Store Index] Initialized');
880
+ }
881
+ catch (e) {
882
+ outputChannel?.appendLine(`[Store Index] Initialization warning: ${e instanceof Error ? e.message : String(e)}`);
883
+ }
884
+ }