@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,539 @@
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.createAuthBrokerServer = createAuthBrokerServer;
40
+ exports.startAuthBrokerServer = startAuthBrokerServer;
41
+ const http = __importStar(require("http"));
42
+ const crypto = __importStar(require("crypto"));
43
+ const url_1 = require("url");
44
+ const path = __importStar(require("path"));
45
+ const config_js_1 = require("./config.js");
46
+ const store_js_1 = require("./store.js");
47
+ const pkce_js_1 = require("./pkce.js");
48
+ const jwt_js_1 = require("./jwt.js");
49
+ const types_js_1 = require("../auth/types.js");
50
+ const serve_hardening_js_1 = require("../cli/serve-hardening.js");
51
+ function sendJson(res, status, body) {
52
+ res.writeHead(status, { 'Content-Type': 'application/json' });
53
+ res.end(JSON.stringify(body));
54
+ }
55
+ /** Mask the local-part of an email for logs: `n***@example.com` (domain kept for debugging). */
56
+ function maskEmail(value) {
57
+ const at = value.indexOf('@');
58
+ if (at <= 0) {
59
+ return value;
60
+ }
61
+ return `${value[0]}***@${value.slice(at + 1)}`;
62
+ }
63
+ /** Auth request bodies (PKCE codes, emails, form fields) are always tiny. */
64
+ const MAX_BODY_BYTES = 64 * 1024;
65
+ async function readBody(req) {
66
+ const chunks = [];
67
+ let size = 0;
68
+ for await (const chunk of req) {
69
+ const buf = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
70
+ size += buf.length;
71
+ if (size > MAX_BODY_BYTES) {
72
+ const err = new Error('Request body too large');
73
+ err.status = 413;
74
+ throw err;
75
+ }
76
+ chunks.push(buf);
77
+ }
78
+ return Buffer.concat(chunks).toString('utf8');
79
+ }
80
+ function parseFormBody(raw) {
81
+ const params = new URLSearchParams(raw);
82
+ const out = {};
83
+ for (const [key, value] of params.entries()) {
84
+ out[key] = value;
85
+ }
86
+ return out;
87
+ }
88
+ /** Read a named cookie from the Cookie header. */
89
+ function extractCookieToken(cookieHeader, name) {
90
+ if (!cookieHeader?.trim()) {
91
+ return undefined;
92
+ }
93
+ for (const part of cookieHeader.split(';')) {
94
+ const eq = part.indexOf('=');
95
+ if (eq <= 0) {
96
+ continue;
97
+ }
98
+ const key = part.slice(0, eq).trim();
99
+ if (key === name) {
100
+ const val = part.slice(eq + 1).trim();
101
+ if (val) {
102
+ return val;
103
+ }
104
+ }
105
+ }
106
+ return undefined;
107
+ }
108
+ /**
109
+ * Federated SSO (A′): validate a `return_to` redirect target for the browser-login endpoint.
110
+ * The target host must live under the configured `cookieDomain` (e.g. `.agenthippo.ai`) so the
111
+ * shared cookie we're about to set will actually be sent back to it. With no cookie domain
112
+ * configured (dev), allow same-host / localhost.
113
+ */
114
+ function safeReturnTo(rawReturnTo, cookieDomain, fallback) {
115
+ try {
116
+ const target = new url_1.URL(rawReturnTo);
117
+ if (cookieDomain) {
118
+ const parent = cookieDomain.replace(/^\./, '').toLowerCase();
119
+ if (target.hostname.toLowerCase() === parent || target.hostname.toLowerCase().endsWith('.' + parent)) {
120
+ return target.toString();
121
+ }
122
+ }
123
+ else if (target.hostname === '127.0.0.1' || target.hostname === 'localhost') {
124
+ return target.toString();
125
+ }
126
+ }
127
+ catch {
128
+ // fall through
129
+ }
130
+ return fallback;
131
+ }
132
+ function createAuthBrokerServer(config) {
133
+ const resolved = config ?? (0, config_js_1.loadAuthBrokerConfig)();
134
+ // Fail-closed: a known-default secret makes JWT forgery trivial.
135
+ if (!resolved.devMode && resolved.jwtSecret === config_js_1.DEFAULT_JWT_SECRET) {
136
+ throw new Error('AGENTHIPPO_AUTH_JWT_SECRET must be set to a strong secret in production. ' +
137
+ 'Generate one with: openssl rand -hex 32');
138
+ }
139
+ // Warn when no domain restriction is configured: any SSO-authenticated email can sign in.
140
+ if (!resolved.devMode && resolved.allowedEmailDomains.length === 0) {
141
+ console.warn('[auth-broker] Warning: AGENTHIPPO_AUTH_ALLOWED_DOMAINS is not set — ' +
142
+ 'any upstream-SSO-authenticated email can receive a token. ' +
143
+ 'Set it to restrict sign-in (e.g. "example.com").');
144
+ }
145
+ const persistPath = resolved.dataDir
146
+ ? path.join(resolved.dataDir, 'auth-store.json')
147
+ : undefined;
148
+ const store = new store_js_1.AuthBrokerStore(resolved, persistPath);
149
+ // Per-client-IP cap on the credential-issuing endpoints (authorize/token/dev-login) so a
150
+ // direct caller can't brute-force or hammer them. /api/ide/me is deliberately exempt: Caddy
151
+ // forward_auth calls it on every IDE request and it's already cheap + cached.
152
+ const authLimiter = new serve_hardening_js_1.RateLimiter(resolved.rateLimitPerMin);
153
+ /** Structured auth-event audit log; emails masked unless AGENTHIPPO_AUTH_LOG_PII=1. */
154
+ const audit = (event, fields = {}) => {
155
+ const parts = Object.entries(fields)
156
+ .filter(([, v]) => v !== undefined && v !== '')
157
+ .map(([k, v]) => {
158
+ const masked = !resolved.logPii && typeof v === 'string' && v.includes('@') ? maskEmail(v) : v;
159
+ return `${k}=${masked}`;
160
+ })
161
+ .join(' ');
162
+ console.log(`[auth-broker] ${event}${parts ? ' ' + parts : ''}`);
163
+ };
164
+ // Short-lived positive cache for /api/ide/me (Caddy forward_auth calls it on every IDE
165
+ // /v1/* request). Access tokens are short-lived JWTs with no server-side revocation, so
166
+ // trusting a verified token for a few seconds is safe and avoids a verifyJwt+getUser
167
+ // round-trip on every chat turn. Keyed by token hash; capped + pruned.
168
+ const ME_CACHE_TTL_MS = 10_000;
169
+ const ME_CACHE_MAX = 2048;
170
+ const meCache = new Map();
171
+ // Throttle the per-turn /me 401 audit so an expired-token burst doesn't spam the log.
172
+ const ME_UNAUTHORIZED_LOG_INTERVAL_MS = 5_000;
173
+ let lastMeUnauthorizedLogMs = 0;
174
+ function resolveAuthedUser(req) {
175
+ // Bearer (IDE) first; fall back to the federated `.agenthippo.ai` cookie (browser).
176
+ const bearer = (0, jwt_js_1.extractBearerToken)(req.headers.authorization)
177
+ || extractCookieToken(req.headers.cookie, resolved.cookieName);
178
+ if (!bearer) {
179
+ return undefined;
180
+ }
181
+ const key = crypto.createHash('sha256').update(bearer).digest('hex');
182
+ const cached = meCache.get(key);
183
+ if (cached) {
184
+ if (cached.exp > Date.now()) {
185
+ return cached.user;
186
+ }
187
+ meCache.delete(key);
188
+ }
189
+ const payload = (0, jwt_js_1.verifyJwt)(bearer, resolved.jwtSecret);
190
+ if (!payload?.sub || !payload.email) {
191
+ return undefined;
192
+ }
193
+ let user = store.getUser(String(payload.sub));
194
+ // Federated trust (A′): a token signed with our shared AGENTHIPPO_AUTH_JWT_SECRET is
195
+ // authoritative even when the issuing user record lives in the central IdP's store, not
196
+ // this broker's local store (which is an empty ephemeral volume on distributed edge
197
+ // services). The IdP vouches for sub/email/name; the HMAC signature is the proof. The
198
+ // IdP's own broker still hits getUser for its locally-created users, so this fallback is
199
+ // a no-op there.
200
+ if (!user) {
201
+ user = {
202
+ id: String(payload.sub),
203
+ email: String(payload.email),
204
+ displayName: typeof payload.name === 'string' && payload.name ? payload.name : String(payload.email),
205
+ teamId: typeof payload.team_id === 'string' && payload.team_id ? payload.team_id : resolved.team.id,
206
+ };
207
+ }
208
+ if (payload.exp) {
209
+ const exp = Math.min(payload.exp * 1000, Date.now() + ME_CACHE_TTL_MS);
210
+ if (meCache.size >= ME_CACHE_MAX) {
211
+ const now = Date.now();
212
+ for (const [k, v] of meCache) {
213
+ if (v.exp < now) {
214
+ meCache.delete(k);
215
+ }
216
+ }
217
+ if (meCache.size >= ME_CACHE_MAX) {
218
+ meCache.clear();
219
+ }
220
+ }
221
+ meCache.set(key, { user, exp });
222
+ }
223
+ return user;
224
+ }
225
+ const server = http.createServer(async (req, res) => {
226
+ try {
227
+ const host = req.headers.host || `127.0.0.1:${resolved.port}`;
228
+ const url = new url_1.URL(req.url || '/', `http://${host}`);
229
+ const pathname = url.pathname;
230
+ // Gate on the credential-issuing endpoints only (see authLimiter note above).
231
+ const ip = (0, serve_hardening_js_1.clientIp)(req);
232
+ const rateLimited = () => {
233
+ if (authLimiter.tryConsume(ip)) {
234
+ return false;
235
+ }
236
+ audit('rate_limited', { ip, path: pathname });
237
+ res.writeHead(429, { 'Content-Type': 'application/json', 'Retry-After': String(authLimiter.retryAfterSeconds(ip)) });
238
+ res.end(JSON.stringify({ error: 'rate_limited' }));
239
+ return true;
240
+ };
241
+ if (req.method === 'GET' && (pathname === '/health' || pathname === '/api/ide/health')) {
242
+ sendJson(res, 200, { status: 'ok', service: 'auth-broker' });
243
+ return;
244
+ }
245
+ if (req.method === 'GET' && pathname === '/oauth/authorize') {
246
+ if (rateLimited()) {
247
+ return;
248
+ }
249
+ const clientId = url.searchParams.get('client_id') || '';
250
+ const redirectUri = url.searchParams.get('redirect_uri') || '';
251
+ const codeChallenge = url.searchParams.get('code_challenge') || '';
252
+ const state = url.searchParams.get('state') || '';
253
+ const loginHint = url.searchParams.get('login_hint') || url.searchParams.get('email') || '';
254
+ if (clientId !== types_js_1.AUTH_CLIENT_ID || !redirectUri || !codeChallenge) {
255
+ audit('authorize.invalid_request', { client_id: clientId });
256
+ sendJson(res, 400, { error: 'invalid_request' });
257
+ return;
258
+ }
259
+ // Dev mode with explicit login_hint: auto-authenticate (backward compat for tests).
260
+ if (resolved.devMode && loginHint) {
261
+ const user = store.upsertUser(loginHint);
262
+ const code = store.createAuthCode({ userId: user.id, clientId, redirectUri, codeChallenge });
263
+ audit('authorize.dev', { user: user.email });
264
+ const redirect = new url_1.URL(redirectUri);
265
+ redirect.searchParams.set('code', code);
266
+ if (state) {
267
+ redirect.searchParams.set('state', state);
268
+ }
269
+ res.writeHead(302, { Location: redirect.toString() });
270
+ res.end();
271
+ return;
272
+ }
273
+ // Caddy forward_auth (via oauth2-proxy) sets X-Auth-Request-Email after the user
274
+ // logs in with Google. The authorize endpoint is gated behind forward_auth in the
275
+ // Caddyfile so this header is always present when the request reaches the broker.
276
+ const userEmail = (req.headers['x-auth-request-email'] || '').trim().toLowerCase();
277
+ if (!userEmail) {
278
+ sendJson(res, 401, { error: 'unauthorized', error_description: 'No authenticated user (missing X-Auth-Request-Email)' });
279
+ return;
280
+ }
281
+ const user = store.upsertUser(userEmail);
282
+ const code = store.createAuthCode({ userId: user.id, clientId, redirectUri, codeChallenge });
283
+ audit('authorize.signin', { user: user.email });
284
+ const redirect = new url_1.URL(redirectUri);
285
+ redirect.searchParams.set('code', code);
286
+ if (state) {
287
+ redirect.searchParams.set('state', state);
288
+ }
289
+ res.writeHead(302, { Location: redirect.toString() });
290
+ res.end();
291
+ return;
292
+ }
293
+ if (req.method === 'GET' && pathname === '/oauth/browser-login') {
294
+ if (rateLimited()) {
295
+ return;
296
+ }
297
+ // Federated SSO (A′): the central IdP (auth.agenthippo.ai) stamps the shared
298
+ // `.agenthippo.ai` cookie after Google SSO. Gated behind oauth2-proxy forward_auth
299
+ // (same as /oauth/authorize) — X-Auth-Request-Email is only set once Google login
300
+ // completes. Federated agent services never hit this path (they have no oauth2-proxy),
301
+ // so it 401s there, which is correct.
302
+ const userEmail = (req.headers['x-auth-request-email'] || '').trim().toLowerCase();
303
+ if (!userEmail) {
304
+ sendJson(res, 401, { error: 'unauthorized', error_description: 'No authenticated user (missing X-Auth-Request-Email)' });
305
+ return;
306
+ }
307
+ const user = store.upsertUser(userEmail);
308
+ const tokens = store.issueTokens(user, types_js_1.AUTH_CLIENT_ID, 'openid profile email agenthippo:ide');
309
+ audit('browser.login', { user: user.email });
310
+ const secure = resolved.publicBaseUrl.startsWith('https');
311
+ const cookieParts = [
312
+ `${resolved.cookieName}=${tokens.accessToken}`,
313
+ 'Path=/',
314
+ 'HttpOnly',
315
+ 'SameSite=Lax',
316
+ ...(secure ? ['Secure'] : []),
317
+ ...(resolved.cookieDomain ? [`Domain=${resolved.cookieDomain}`] : []),
318
+ `Max-Age=${tokens.expiresIn}`,
319
+ ];
320
+ const returnTo = safeReturnTo(url.searchParams.get('return_to') || '', resolved.cookieDomain, resolved.publicBaseUrl || '/');
321
+ res.writeHead(302, { 'Set-Cookie': cookieParts.join('; '), Location: returnTo });
322
+ res.end();
323
+ return;
324
+ }
325
+ if (req.method === 'POST' && pathname === '/oauth/dev/login') {
326
+ if (rateLimited()) {
327
+ return;
328
+ }
329
+ if (!resolved.devMode) {
330
+ sendJson(res, 404, { error: 'not_found' });
331
+ return;
332
+ }
333
+ const raw = await readBody(req);
334
+ const body = raw.trim().startsWith('{')
335
+ ? JSON.parse(raw)
336
+ : parseFormBody(raw);
337
+ const email = body.email?.trim();
338
+ const codeChallenge = body.code_challenge?.trim();
339
+ const redirectUri = body.redirect_uri?.trim();
340
+ const clientId = body.client_id?.trim() || types_js_1.AUTH_CLIENT_ID;
341
+ if (!email || !codeChallenge || !redirectUri) {
342
+ sendJson(res, 400, { error: 'invalid_request' });
343
+ return;
344
+ }
345
+ const user = store.upsertUser(email);
346
+ const code = store.createAuthCode({
347
+ userId: user.id,
348
+ clientId,
349
+ redirectUri,
350
+ codeChallenge,
351
+ });
352
+ audit('dev.login', { user: user.email });
353
+ sendJson(res, 200, { code });
354
+ return;
355
+ }
356
+ if (req.method === 'POST' && pathname === '/oauth/token') {
357
+ if (rateLimited()) {
358
+ return;
359
+ }
360
+ const raw = await readBody(req);
361
+ const body = parseFormBody(raw);
362
+ const grantType = body.grant_type;
363
+ const clientId = body.client_id || types_js_1.AUTH_CLIENT_ID;
364
+ const scope = body.scope || 'openid profile email agenthippo:ide';
365
+ if (grantType === 'authorization_code') {
366
+ const code = body.code;
367
+ const codeVerifier = body.code_verifier;
368
+ const redirectUri = body.redirect_uri;
369
+ if (!code || !codeVerifier || !redirectUri) {
370
+ sendJson(res, 400, { error: 'invalid_request' });
371
+ return;
372
+ }
373
+ const authCode = store.consumeAuthCode(code);
374
+ if (!authCode || authCode.clientId !== clientId || authCode.redirectUri !== redirectUri) {
375
+ sendJson(res, 400, { error: 'invalid_grant' });
376
+ return;
377
+ }
378
+ if (!(0, pkce_js_1.verifyPkceChallenge)(codeVerifier, authCode.codeChallenge)) {
379
+ sendJson(res, 400, { error: 'invalid_grant', error_description: 'PKCE verification failed' });
380
+ return;
381
+ }
382
+ const user = store.getUser(authCode.userId);
383
+ if (!user) {
384
+ sendJson(res, 400, { error: 'invalid_grant' });
385
+ return;
386
+ }
387
+ const tokens = store.issueTokens(user, clientId, scope);
388
+ audit('token.signin', { user: user.email, client_id: clientId });
389
+ sendJson(res, 200, {
390
+ access_token: tokens.accessToken,
391
+ refresh_token: tokens.refreshToken,
392
+ token_type: 'Bearer',
393
+ expires_in: tokens.expiresIn,
394
+ scope,
395
+ });
396
+ return;
397
+ }
398
+ if (grantType === 'refresh_token') {
399
+ const refreshToken = body.refresh_token;
400
+ if (!refreshToken) {
401
+ sendJson(res, 400, { error: 'invalid_request' });
402
+ return;
403
+ }
404
+ const record = store.consumeRefreshToken(refreshToken);
405
+ if (!record || record.clientId !== clientId) {
406
+ audit('token.refresh.invalid_grant');
407
+ sendJson(res, 400, { error: 'invalid_grant' });
408
+ return;
409
+ }
410
+ const user = store.getUser(record.userId);
411
+ if (!user) {
412
+ sendJson(res, 400, { error: 'invalid_grant' });
413
+ return;
414
+ }
415
+ const tokens = store.issueTokens(user, clientId, scope);
416
+ audit('token.refresh', { user: user.email });
417
+ sendJson(res, 200, {
418
+ access_token: tokens.accessToken,
419
+ refresh_token: tokens.refreshToken,
420
+ token_type: 'Bearer',
421
+ expires_in: tokens.expiresIn,
422
+ scope,
423
+ });
424
+ return;
425
+ }
426
+ sendJson(res, 400, { error: 'unsupported_grant_type' });
427
+ return;
428
+ }
429
+ if (req.method === 'POST' && pathname === '/oauth/introspect') {
430
+ // RFC 7662: introspect must be protected. Require a valid bearer (any live JWT)
431
+ // so an anonymous caller can't probe arbitrary tokens for user claims.
432
+ if (!resolveAuthedUser(req)) {
433
+ audit('introspect.unauthorized');
434
+ sendJson(res, 401, { error: 'unauthorized' });
435
+ return;
436
+ }
437
+ const raw = await readBody(req);
438
+ const body = parseFormBody(raw);
439
+ const token = body.token;
440
+ if (!token) {
441
+ sendJson(res, 400, { error: 'invalid_request' });
442
+ return;
443
+ }
444
+ const payload = (0, jwt_js_1.verifyJwt)(token, resolved.jwtSecret);
445
+ if (!payload?.sub) {
446
+ sendJson(res, 200, { active: false });
447
+ return;
448
+ }
449
+ sendJson(res, 200, {
450
+ active: true,
451
+ sub: payload.sub,
452
+ email: payload.email,
453
+ team_id: payload.team_id,
454
+ scope: payload.scope,
455
+ exp: payload.exp,
456
+ });
457
+ return;
458
+ }
459
+ const user = resolveAuthedUser(req);
460
+ if (req.method === 'GET' && pathname === '/api/ide/me') {
461
+ if (!user) {
462
+ // /me is called per IDE turn via Caddy forward_auth; an expired-token burst
463
+ // would spam this log, so throttle to one line per few seconds.
464
+ const now = Date.now();
465
+ if (now - lastMeUnauthorizedLogMs > ME_UNAUTHORIZED_LOG_INTERVAL_MS) {
466
+ lastMeUnauthorizedLogMs = now;
467
+ audit('me.unauthorized');
468
+ }
469
+ sendJson(res, 401, { error: 'unauthorized' });
470
+ return;
471
+ }
472
+ // Set X-Agent-User so Caddy's forward_auth can copy the validated identity
473
+ // into the upstream request without serve needing its own JWT validation.
474
+ res.setHeader('X-Agent-User', user.email || user.id);
475
+ sendJson(res, 200, store.buildMe(user));
476
+ return;
477
+ }
478
+ if (req.method === 'GET' && pathname === '/api/ide/bootstrap') {
479
+ if (!user) {
480
+ sendJson(res, 401, { error: 'unauthorized' });
481
+ return;
482
+ }
483
+ sendJson(res, 200, store.buildBootstrap(user));
484
+ return;
485
+ }
486
+ if (req.method === 'POST' && pathname === '/api/ide/bootstrap/refresh') {
487
+ if (!user) {
488
+ sendJson(res, 401, { error: 'unauthorized' });
489
+ return;
490
+ }
491
+ const routing = store.refreshRoutingCredentials();
492
+ sendJson(res, 200, {
493
+ routing: {
494
+ litellmBaseUrl: resolved.team.litellmBaseUrl,
495
+ ...routing,
496
+ },
497
+ });
498
+ return;
499
+ }
500
+ if (req.method === 'POST' && pathname === '/api/ide/signout') {
501
+ if (user) {
502
+ store.revokeRefreshTokensForUser(user.id);
503
+ audit('signout', { user: user.email });
504
+ }
505
+ sendJson(res, 200, { ok: true });
506
+ return;
507
+ }
508
+ sendJson(res, 404, { error: 'not_found' });
509
+ }
510
+ catch (err) {
511
+ if (err.status === 413) {
512
+ sendJson(res, 413, { error: 'request_entity_too_large' });
513
+ return;
514
+ }
515
+ // Log the real error internally; return a generic message so clients don't see
516
+ // stack fragments / internal paths in the 500 body.
517
+ console.error('[auth-broker] internal error', err);
518
+ sendJson(res, 500, { error: 'server_error' });
519
+ }
520
+ });
521
+ return {
522
+ server,
523
+ baseUrl: resolved.publicBaseUrl,
524
+ store,
525
+ config: resolved,
526
+ close: () => new Promise((resolve, reject) => {
527
+ server.close((err) => (err ? reject(err) : resolve()));
528
+ }),
529
+ };
530
+ }
531
+ async function startAuthBrokerServer(config) {
532
+ const broker = createAuthBrokerServer(config);
533
+ const bind = process.env.AGENTHIPPO_AUTH_BIND?.trim() || '0.0.0.0';
534
+ await new Promise((resolve, reject) => {
535
+ broker.server.listen(broker.config.port, bind, () => resolve());
536
+ broker.server.once('error', reject);
537
+ });
538
+ return broker;
539
+ }