@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.
- package/LICENSE +21 -0
- package/bin/agenthippo.js +2 -0
- package/out/agentpack/github.js +547 -0
- package/out/agentpack/index.js +66 -0
- package/out/agentpack/install.js +297 -0
- package/out/agentpack/manager.js +441 -0
- package/out/agentpack/manifest.js +135 -0
- package/out/agentpack/paths.js +475 -0
- package/out/agentpack/publish.js +248 -0
- package/out/agentpack/stores.js +554 -0
- package/out/agentpack/types.js +5 -0
- package/out/analytics/dashboard/artifactManager.js +439 -0
- package/out/analytics/dashboard/fleetDisplayUtils.js +159 -0
- package/out/analytics/dashboard/fleetOrchestrator.js +142 -0
- package/out/analytics/dashboard/fleetRegistry.js +79 -0
- package/out/analytics/dashboard/fleetRowDefaults.js +87 -0
- package/out/analytics/dashboard/fleetScriptAdapter.js +146 -0
- package/out/analytics/dashboard/fleetStatusUtils.js +30 -0
- package/out/analytics/dashboard/fleetTitleUtils.js +68 -0
- package/out/analytics/dashboard/fleetTypes.js +29 -0
- package/out/analytics/dashboard/index.js +17 -0
- package/out/analytics/dashboard/indexingService.js +422 -0
- package/out/analytics/dashboard/localFleetAdapter.js +222 -0
- package/out/analytics/dashboard/performanceMonitor.js +76 -0
- package/out/analytics/dashboard/processManager.js +209 -0
- package/out/analytics/dashboard/provider.js +3885 -0
- package/out/analytics/dashboard/queryRunner.js +994 -0
- package/out/analytics/dashboard/refreshPolicy.js +16 -0
- package/out/analytics/dashboard/scheduledFleetFingerprint.js +22 -0
- package/out/analytics/dashboard/scheduledFleetStorage.js +241 -0
- package/out/analytics/dashboard/scheduledFleetUtils.js +22 -0
- package/out/analytics/dashboard/sessionEventFleetStats.js +118 -0
- package/out/analytics/dashboard/sessionJsonlFleet.js +204 -0
- package/out/analytics/dashboard/teamViewDiscovery.js +106 -0
- package/out/analytics/dashboard/viewsConfigMerge.js +221 -0
- package/out/analytics/dashboard/webview/analytics-panel.html +155 -0
- package/out/analytics/dashboard/webview/codicon.ttf +0 -0
- package/out/analytics/dashboard/webview/index.html +78 -0
- package/out/analytics/dashboard/webview/panel.js +2295 -0
- package/out/analytics/dashboard/webview/runtime-bridge.js +82 -0
- package/out/analytics/dashboard/webview/styles.css +1009 -0
- package/out/analytics/lifecycle.js +43 -0
- package/out/analytics/service.js +1279 -0
- package/out/analytics/sessionEvents.js +231 -0
- package/out/auth/bootstrapApply.js +72 -0
- package/out/auth/brokerClient.js +126 -0
- package/out/auth/callbackUri.js +59 -0
- package/out/auth/callbackUriParse.js +59 -0
- package/out/auth/githubStoreGate.js +70 -0
- package/out/auth/loopbackAuthServer.js +165 -0
- package/out/auth/pkce.js +9 -0
- package/out/auth/provider.js +239 -0
- package/out/auth/sessionStore.js +193 -0
- package/out/auth/signInFlow.js +182 -0
- package/out/auth/types.js +12 -0
- package/out/auth-broker/config.js +62 -0
- package/out/auth-broker/jwt.js +105 -0
- package/out/auth-broker/pkce.js +57 -0
- package/out/auth-broker/server.js +539 -0
- package/out/auth-broker/store.js +273 -0
- package/out/base-prompts/gateway/openclaw-starter.json5 +144 -0
- package/out/base-prompts/gateway/slack-socket-mode-minimal.manifest.json +44 -0
- package/out/base-prompts/mcp-servers/.mcp.json +13 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/README.md +142 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/mcp.json +13 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/package-lock.json +1192 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/package.json +23 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/run-with-env.sh +12 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/sdk-test.js +102 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/simple-test.js +137 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-client.js +118 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-server.js +209 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/src/client.ts +431 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/src/index.ts +270 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/tsconfig.json +18 -0
- package/out/base-prompts/rules/AGENTS.md +204 -0
- package/out/base-prompts/skills/agent-browser/SKILL.md +102 -0
- package/out/base-prompts/skills/agent-builder/SKILL.md +73 -0
- package/out/base-prompts/skills/agent-builder/references/agent-pack.md +63 -0
- package/out/base-prompts/skills/agent-builder/references/crewai.md +66 -0
- package/out/base-prompts/skills/agent-builder/references/langchain.md +60 -0
- package/out/base-prompts/skills/agent-builder/references/raw-sdk.md +73 -0
- package/out/base-prompts/skills/agent-engine-creator/SKILL.md +586 -0
- package/out/base-prompts/skills/agent-engine-installer/SKILL.md +106 -0
- package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.mjs +259 -0
- package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.ps1 +189 -0
- package/out/base-prompts/skills/agenthippo-cli/SKILL.md +69 -0
- package/out/base-prompts/skills/agenthippo-cli/scripts/install.sh +63 -0
- package/out/base-prompts/skills/agentpack-creator/SKILL.md +375 -0
- package/out/base-prompts/skills/agentpack-creator/references/agent-templates.md +261 -0
- package/out/base-prompts/skills/agentpack-creator/references/agents-md-guide.md +195 -0
- package/out/base-prompts/skills/agentpack-creator/scripts/init_pack.py +391 -0
- package/out/base-prompts/skills/agentpack-creator/scripts/init_pack_test.py +294 -0
- package/out/base-prompts/skills/agentpack-testbench/SKILL.md +135 -0
- package/out/base-prompts/skills/algorithmic-art/LICENSE.txt +202 -0
- package/out/base-prompts/skills/algorithmic-art/SKILL.md +405 -0
- package/out/base-prompts/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/out/base-prompts/skills/algorithmic-art/templates/viewer.html +599 -0
- package/out/base-prompts/skills/debug-agent/SKILL.md +83 -0
- package/out/base-prompts/skills/desktop-automation/SKILL.md +166 -0
- package/out/base-prompts/skills/desktop-automation/references/agenthippo-ui-recipes.md +441 -0
- package/out/base-prompts/skills/desktop-automation/scripts/windows-desktop-uia.psm1 +280 -0
- package/out/base-prompts/skills/docx/LICENSE.txt +30 -0
- package/out/base-prompts/skills/docx/SKILL.md +197 -0
- package/out/base-prompts/skills/docx/docx-js.md +350 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/pack.py +159 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validate.py +69 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/out/base-prompts/skills/docx/ooxml.md +610 -0
- package/out/base-prompts/skills/docx/scripts/__init__.py +1 -0
- package/out/base-prompts/skills/docx/scripts/document.py +1276 -0
- package/out/base-prompts/skills/docx/scripts/templates/comments.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/people.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/utilities.py +374 -0
- package/out/base-prompts/skills/gateway-outbound/SKILL.md +136 -0
- package/out/base-prompts/skills/mcp-builder/LICENSE.txt +202 -0
- package/out/base-prompts/skills/mcp-builder/SKILL.md +328 -0
- package/out/base-prompts/skills/mcp-builder/reference/evaluation.md +602 -0
- package/out/base-prompts/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/out/base-prompts/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/out/base-prompts/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/out/base-prompts/skills/mcp-builder/scripts/connections.py +151 -0
- package/out/base-prompts/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/out/base-prompts/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/out/base-prompts/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/out/base-prompts/skills/openclaw/SKILL.md +406 -0
- package/out/base-prompts/skills/openclaw/scripts/run-smoke.sh +61 -0
- package/out/base-prompts/skills/pdf/LICENSE.txt +30 -0
- package/out/base-prompts/skills/pdf/SKILL.md +294 -0
- package/out/base-prompts/skills/pdf/forms.md +205 -0
- package/out/base-prompts/skills/pdf/reference.md +612 -0
- package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/out/base-prompts/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/out/base-prompts/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/out/base-prompts/skills/pdf/scripts/create_validation_image.py +41 -0
- package/out/base-prompts/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/out/base-prompts/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/out/base-prompts/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/out/base-prompts/skills/pptx/LICENSE.txt +30 -0
- package/out/base-prompts/skills/pptx/SKILL.md +484 -0
- package/out/base-prompts/skills/pptx/html2pptx.md +625 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/out/base-prompts/skills/pptx/ooxml.md +427 -0
- package/out/base-prompts/skills/pptx/scripts/html2pptx.js +984 -0
- package/out/base-prompts/skills/pptx/scripts/inventory.py +1020 -0
- package/out/base-prompts/skills/pptx/scripts/rearrange.py +231 -0
- package/out/base-prompts/skills/pptx/scripts/replace.py +385 -0
- package/out/base-prompts/skills/pptx/scripts/thumbnail.py +450 -0
- package/out/base-prompts/skills/prompt-lab/SKILL.md +149 -0
- package/out/base-prompts/skills/prompt-lab/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/skill-creator/LICENSE.txt +202 -0
- package/out/base-prompts/skills/skill-creator/SKILL.md +371 -0
- package/out/base-prompts/skills/skill-creator/references/output-patterns.md +82 -0
- package/out/base-prompts/skills/skill-creator/references/workflows.md +28 -0
- package/out/base-prompts/skills/skill-creator/scripts/init_skill.py +303 -0
- package/out/base-prompts/skills/skill-creator/scripts/package_skill.py +110 -0
- package/out/base-prompts/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/out/base-prompts/skills/skill-installer/SKILL.md +251 -0
- package/out/base-prompts/skills/skill-installer/references/store-api.md +219 -0
- package/out/base-prompts/skills/spotlight-dashboard/SKILL.md +83 -0
- package/out/base-prompts/skills/spotlight-insights/SKILL.md +101 -0
- package/out/base-prompts/skills/spotlight-optimize/SKILL.md +93 -0
- package/out/base-prompts/skills/spotlight-optimize/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/spotlight-query/SKILL.md +314 -0
- package/out/base-prompts/skills/spotlight-query/references/otel-schema.md +163 -0
- package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.test.sh +744 -0
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/sessions/sess-test-1.jsonl +14 -0
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/.duckdb-index.json +7 -0
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/sample.jsonl +5 -0
- package/out/base-prompts/skills/spotlight-report/SKILL.md +86 -0
- package/out/base-prompts/skills/spotlight-visualize/SKILL.md +92 -0
- package/out/base-prompts/skills/spotlight-visualize/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/xlsx/LICENSE.txt +30 -0
- package/out/base-prompts/skills/xlsx/SKILL.md +289 -0
- package/out/base-prompts/skills/xlsx/recalc.py +178 -0
- package/out/branding.js +23 -0
- package/out/cli/commands/anywhere.js +66 -0
- package/out/cli/commands/ask.js +243 -0
- package/out/cli/commands/auth-broker.js +24 -0
- package/out/cli/commands/auth.js +219 -0
- package/out/cli/commands/chat.js +354 -0
- package/out/cli/commands/deploy.js +223 -0
- package/out/cli/commands/gateway.js +160 -0
- package/out/cli/commands/pack.js +220 -0
- package/out/cli/commands/probe-custom-engine.js +82 -0
- package/out/cli/commands/serve.js +583 -0
- package/out/cli/commands/store.js +919 -0
- package/out/cli/credential-context.js +113 -0
- package/out/cli/deploy-init.js +2087 -0
- package/out/cli/deps.js +238 -0
- package/out/cli/index.js +390 -0
- package/out/cli/pack-loader.js +376 -0
- package/out/cli/run-custom-engine-runner.js +318 -0
- package/out/cli/runtime.js +409 -0
- package/out/cli/serve-hardening.js +325 -0
- package/out/cli/state-sync.js +135 -0
- package/out/cli/utils.js +220 -0
- package/out/cli/vscode-shim.js +86 -0
- package/out/engines/base.js +159 -0
- package/out/engines/claude.js +1215 -0
- package/out/engines/codex.js +759 -0
- package/out/engines/custom.js +632 -0
- package/out/engines/customEngineIpc.js +95 -0
- package/out/engines/customEngineRunnerEmbed.js +107 -0
- package/out/engines/customRegistry.js +274 -0
- package/out/engines/embeddedCustomEngineRunner.generated.js +9 -0
- package/out/engines/engineApiKey.js +138 -0
- package/out/engines/factory.js +45 -0
- package/out/engines/install.js +372 -0
- package/out/engines/persistentEngineWorker.js +320 -0
- package/out/engines/publish.js +341 -0
- package/out/engines/types.js +17 -0
- package/out/examples/run-headless-repl.js +291 -0
- package/out/examples/run-headless.js +187 -0
- package/out/extension.js +4472 -0
- package/out/gateway/bridge.js +805 -0
- package/out/gateway/cli-agent-id.js +36 -0
- package/out/gateway/client.js +303 -0
- package/out/gateway/client.test.js +395 -0
- package/out/gateway/gateway-scope-errors.js +14 -0
- package/out/gateway/gatewayBackup.js +76 -0
- package/out/gateway/gatewayRouteIndex.js +371 -0
- package/out/gateway/gatewaySessionStore.js +243 -0
- package/out/gateway/index.js +31 -0
- package/out/gateway/lifecycle.js +3056 -0
- package/out/gateway/openclaw-channel-routing.js +317 -0
- package/out/gateway/outboundHandles.js +373 -0
- package/out/gateway/outboundPaths.js +72 -0
- package/out/gateway/outboundSend.js +254 -0
- package/out/gateway/protocol.js +48 -0
- package/out/gateway/resetMappings.js +52 -0
- package/out/gateway/service.js +1244 -0
- package/out/gateway/sessionRouting.js +77 -0
- package/out/headless/index.js +505 -0
- package/out/headless/sync.js +473 -0
- package/out/mcp/publish.js +143 -0
- package/out/mcp.js +597 -0
- package/out/permissions.js +108 -0
- package/out/permissions.mapping.yaml +68 -0
- package/out/registry/index.js +332 -0
- package/out/remote/handleRemoteChat.js +122 -0
- package/out/remote/remotePackStatusBar.js +103 -0
- package/out/remote/serveClient.js +216 -0
- package/out/remoteSkills.js +191 -0
- package/out/runtime/index.js +32 -0
- package/out/runtime/interfaces/config-provider.js +32 -0
- package/out/runtime/interfaces/edit-tracker.js +22 -0
- package/out/runtime/interfaces/index.js +29 -0
- package/out/runtime/interfaces/logger.js +40 -0
- package/out/runtime/interfaces/permission-handler.js +66 -0
- package/out/runtime/interfaces/session-store.js +342 -0
- package/out/runtime/vscode/index.js +20 -0
- package/out/runtime/vscode/vscode-config-provider.js +77 -0
- package/out/runtime/vscode/vscode-edit-tracker.js +120 -0
- package/out/runtime/vscode/vscode-logger.js +30 -0
- package/out/runtime/vscode/vscode-permission-handler.js +72 -0
- package/out/runtime/vscode/vscode-session-store.js +22 -0
- package/out/scripts/agentide-litellm.ps1 +501 -0
- package/out/scripts/agentide-litellm.sh +700 -0
- package/out/scripts/agentide_litellm_hooks_v1.py +604 -0
- package/out/scripts/analytics/agent-fleet-widget.js +954 -0
- package/out/scripts/analytics/agentide-litellm-otel.config.yaml +160 -0
- package/out/scripts/analytics/default-seed-scripts.json +12 -0
- package/out/scripts/analytics/duckdbLocator.js +29 -0
- package/out/scripts/analytics/fleet-local-adapter.js +246 -0
- package/out/scripts/analytics/fleet-workflow.sh +263 -0
- package/out/scripts/analytics/generate-default-charts.py +685 -0
- package/out/scripts/analytics/hotspot-analysis-widget.js +909 -0
- package/out/scripts/analytics/index-traces.py +1394 -0
- package/out/scripts/analytics/install-analytics.sh +286 -0
- package/out/scripts/analytics/live-fleet-4-collector.cjs +315 -0
- package/out/scripts/analytics/live-fleet-4-daemon.mjs +134 -0
- package/out/scripts/analytics/live-fleet-4-widget.cjs +433 -0
- package/out/scripts/analytics/otel-collector.yaml +55 -0
- package/out/scripts/analytics/query-analytics.ps1 +396 -0
- package/out/scripts/analytics/query-analytics.sh +2551 -0
- package/out/scripts/analytics/session-comparison-widget.js +1468 -0
- package/out/scripts/analytics/session-timeline-widget.js +2137 -0
- package/out/scripts/analytics/setup-analytics.ps1 +432 -0
- package/out/scripts/analytics/setup-analytics.sh +854 -0
- package/out/scripts/analytics/start-analytics.ps1 +169 -0
- package/out/scripts/analytics/start-analytics.sh +323 -0
- package/out/scripts/analytics/token-cost-flamegraph-widget.js +954 -0
- package/out/scripts/analytics/token-cost-trend-widget.js +1062 -0
- package/out/scripts/analytics/workflows-collector.cjs +315 -0
- package/out/scripts/analytics/workflows-daemon.mjs +186 -0
- package/out/scripts/analytics/workflows-widget.cjs +433 -0
- package/out/scripts/analytics/wow-model-widget.js +191 -0
- package/out/scripts/gateway/Dockerfile.serve +45 -0
- package/out/scripts/gateway/docker-serve.sh +248 -0
- package/out/scripts/gateway/setup-gateway-server.ps1 +953 -0
- package/out/scripts/gateway/setup-gateway-server.sh +935 -0
- package/out/scripts/gateway/setup-gateway.ps1 +1813 -0
- package/out/scripts/gateway/setup-gateway.sh +1541 -0
- package/out/scripts/setup-cli.ps1 +86 -0
- package/out/scripts/setup-cli.sh +117 -0
- package/out/scripts/tools-manifest.json +83 -0
- package/out/scripts/vendor-tools.mjs +234 -0
- package/out/session.js +272 -0
- package/out/shared/agentEngines.js +170 -0
- package/out/shared/index.js +109 -0
- package/out/shared/models.js +235 -0
- package/out/shared/providers.js +202 -0
- package/out/skills/publish.js +178 -0
- package/out/spotlight/install.js +339 -0
- package/out/spotlight/publish.js +544 -0
- package/out/spotlight/yaml.js +31 -0
- package/out/store/github/setup.js +235 -0
- package/out/store/github/templates/build-index.ts +339 -0
- package/out/store/github/templates/build-index.yml +97 -0
- package/out/store/github/templates/package.json +11 -0
- package/out/store/index.js +755 -0
- package/out/store/oramaIndex.js +884 -0
- package/out/store/shared.js +241 -0
- package/out/sync.js +1827 -0
- package/out/terminalLogger.js +358 -0
- package/out/test/agentEnvFile.test.js +97 -0
- package/out/test/agentYaml.test.js +373 -0
- package/out/test/agentpack.test.js +639 -0
- package/out/test/analytics-lifecycle.test.js +174 -0
- package/out/test/analytics.test.js +524 -0
- package/out/test/auth-bootstrapApply.test.js +102 -0
- package/out/test/auth-broker.test.js +434 -0
- package/out/test/auth-callback.test.js +62 -0
- package/out/test/branding.test.js +229 -0
- package/out/test/cli-agent-id.test.js +55 -0
- package/out/test/credential-context.test.js +105 -0
- package/out/test/customEngineInstall.test.js +100 -0
- package/out/test/customRegistry.test.js +122 -0
- package/out/test/deploy-init.test.js +532 -0
- package/out/test/deps-auto-install.test.js +81 -0
- package/out/test/engine-integration.test.js +297 -0
- package/out/test/enginePaths.test.js +195 -0
- package/out/test/enginePublish.test.js +82 -0
- package/out/test/fleetDisplayUtils.test.js +96 -0
- package/out/test/gateway-client.test.js +381 -0
- package/out/test/gateway-lifecycle.test.js +608 -0
- package/out/test/gateway-outbound.test.js +531 -0
- package/out/test/gateway-reset-mappings.test.js +221 -0
- package/out/test/gateway-route-index.test.js +235 -0
- package/out/test/gateway-session-routing.test.js +47 -0
- package/out/test/gateway-session-store.test.js +216 -0
- package/out/test/github.test.js +232 -0
- package/out/test/headless-sync.test.js +279 -0
- package/out/test/helpers/manifest-fixtures.js +27 -0
- package/out/test/mcp-obo.test.js +82 -0
- package/out/test/mcp.test.js +307 -0
- package/out/test/openclaw-channel-routing.test.js +191 -0
- package/out/test/pathSafety.test.js +63 -0
- package/out/test/permissions.test.js +175 -0
- package/out/test/persistent-engine-worker.test.js +220 -0
- package/out/test/refreshPolicy.test.js +60 -0
- package/out/test/registry.test.js +351 -0
- package/out/test/runtime.test.js +349 -0
- package/out/test/scheduledFleetStorage.test.js +72 -0
- package/out/test/serve-hardening.test.js +192 -0
- package/out/test/serveClient.test.js +173 -0
- package/out/test/sessionJsonlFleet.test.js +78 -0
- package/out/test/shared.test.js +173 -0
- package/out/test/skills-mcp.test.js +299 -0
- package/out/test/spotlightPublish.test.js +299 -0
- package/out/test/spotlightYaml.test.js +58 -0
- package/out/test/state-sync-peer.test.js +74 -0
- package/out/test/store.test.js +331 -0
- package/out/test/stores.test.js +504 -0
- package/out/test/sync-switch.test.js +251 -0
- package/out/test/teamViewDiscovery.test.js +90 -0
- package/out/test/toolPath.test.js +120 -0
- package/out/test/utils.test.js +308 -0
- package/out/test/viewsConfigMerge.test.js +180 -0
- package/out/test/windows-command-line.test.js +75 -0
- package/out/utils/agentEnvFile.js +131 -0
- package/out/utils/binary.js +175 -0
- package/out/utils/index.js +37 -0
- package/out/utils/network.js +74 -0
- package/out/utils/pathSafety.js +60 -0
- package/out/utils/paths.js +116 -0
- package/out/utils/pid.js +180 -0
- package/out/utils/pythonRunner.js +258 -0
- package/out/utils/resolveNodeBinary.js +168 -0
- package/out/utils/toolPath.js +83 -0
- package/out/utils/windowsCommandLine.js +29 -0
- package/out/utils.js +915 -0
- package/out/workspaceFolders.js +59 -0
- 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
|
+
}
|