@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,755 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
/*---------------------------------------------------------------------------------------------
|
|
6
|
+
* Store - Publish and install from a configurable GitHub repo.
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Default repo: github.com/agenthippoai/agenthippo-store (configurable via setting)
|
|
10
|
+
* - Structure: agent-packs/, skills/, mcp/, engines/
|
|
11
|
+
* - Versioning: Path-prefixed tags (e.g., agent-packs/code-review/v1.0.0)
|
|
12
|
+
* - Publishing: Fork → Branch → PR workflow
|
|
13
|
+
* - Auth: Only required for publishing (PR submission)
|
|
14
|
+
*--------------------------------------------------------------------------------------------*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.formatStoreUrl = exports.parseStoreUrl = exports.STORE_CONFIG = exports.getRegistry = exports.formatStorePullRequestError = exports.isForkOfStoreRepo = exports.getTagsApiUrl = exports.getStoreIndexUrl = exports.getStorePath = exports.DEFAULT_STORE_BRANCH = exports.DEFAULT_STORE_REPO = exports.DEFAULT_STORE_OWNER = exports.STORE_PATHS = exports.STORE_ICONS = void 0;
|
|
17
|
+
exports.listStoreVersions = listStoreVersions;
|
|
18
|
+
exports.getLatestStoreVersion = getLatestStoreVersion;
|
|
19
|
+
exports.downloadFromStore = downloadFromStore;
|
|
20
|
+
exports.downloadFromExternalGitHub = downloadFromExternalGitHub;
|
|
21
|
+
exports.canPublishDirectlyToStore = canPublishDirectlyToStore;
|
|
22
|
+
exports.publishToStore = publishToStore;
|
|
23
|
+
exports.parseGitHubUrl = parseGitHubUrl;
|
|
24
|
+
exports.detectArtifactType = detectArtifactType;
|
|
25
|
+
exports.isStoreUrl = isStoreUrl;
|
|
26
|
+
exports.listStoreIndex = listStoreIndex;
|
|
27
|
+
const utils_1 = require("../utils");
|
|
28
|
+
const github_1 = require("../agentpack/github");
|
|
29
|
+
// Import shared types and utilities for local use
|
|
30
|
+
const shared_1 = require("./shared");
|
|
31
|
+
// Re-export shared types and utilities for consumers of this module
|
|
32
|
+
// Note: parseStoreUrl, parseGitHubUrl, isStoreUrl, formatStoreUrl are defined locally as wrappers
|
|
33
|
+
var shared_2 = require("./shared");
|
|
34
|
+
Object.defineProperty(exports, "STORE_ICONS", { enumerable: true, get: function () { return shared_2.STORE_ICONS; } });
|
|
35
|
+
Object.defineProperty(exports, "STORE_PATHS", { enumerable: true, get: function () { return shared_2.STORE_PATHS; } });
|
|
36
|
+
Object.defineProperty(exports, "DEFAULT_STORE_OWNER", { enumerable: true, get: function () { return shared_2.DEFAULT_STORE_OWNER; } });
|
|
37
|
+
Object.defineProperty(exports, "DEFAULT_STORE_REPO", { enumerable: true, get: function () { return shared_2.DEFAULT_STORE_REPO; } });
|
|
38
|
+
Object.defineProperty(exports, "DEFAULT_STORE_BRANCH", { enumerable: true, get: function () { return shared_2.DEFAULT_STORE_BRANCH; } });
|
|
39
|
+
Object.defineProperty(exports, "getStorePath", { enumerable: true, get: function () { return shared_2.getStorePath; } });
|
|
40
|
+
Object.defineProperty(exports, "getStoreIndexUrl", { enumerable: true, get: function () { return shared_2.getStoreIndexUrl; } });
|
|
41
|
+
Object.defineProperty(exports, "getTagsApiUrl", { enumerable: true, get: function () { return shared_2.getTagsApiUrl; } });
|
|
42
|
+
Object.defineProperty(exports, "isForkOfStoreRepo", { enumerable: true, get: function () { return shared_2.isForkOfStoreRepo; } });
|
|
43
|
+
Object.defineProperty(exports, "formatStorePullRequestError", { enumerable: true, get: function () { return shared_2.formatStorePullRequestError; } });
|
|
44
|
+
// Re-export registry for convenience
|
|
45
|
+
var index_1 = require("../registry/index");
|
|
46
|
+
Object.defineProperty(exports, "getRegistry", { enumerable: true, get: function () { return index_1.getRegistry; } });
|
|
47
|
+
// -----------------------------------------------------------------------------
|
|
48
|
+
// Configuration (VS Code-specific: reads from settings)
|
|
49
|
+
// -----------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Get the configured store repo. Reads from VS Code settings if available.
|
|
52
|
+
*/
|
|
53
|
+
function getStoreRepo() {
|
|
54
|
+
const repoEnv = process.env.AGENTHIPPO_STORE_REPO?.trim();
|
|
55
|
+
if (repoEnv) {
|
|
56
|
+
const match = repoEnv.match(/^(?:https?:\/\/github\.com\/)?([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
57
|
+
if (match) {
|
|
58
|
+
return { owner: match[1], repo: match[2] };
|
|
59
|
+
}
|
|
60
|
+
const parts = repoEnv.split('/').filter(Boolean);
|
|
61
|
+
if (parts.length === 2) {
|
|
62
|
+
return { owner: parts[0], repo: parts[1] };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
// Try to read from VS Code settings (lazy load to avoid bundling issues)
|
|
67
|
+
// eslint-disable-next-line no-eval
|
|
68
|
+
const vscode = eval('require')('vscode');
|
|
69
|
+
const config = vscode.workspace.getConfiguration('agentide');
|
|
70
|
+
const storeUrl = config.get('storeRepo');
|
|
71
|
+
if (storeUrl) {
|
|
72
|
+
// Parse owner/repo format
|
|
73
|
+
const match = storeUrl.match(/^(?:https?:\/\/github\.com\/)?([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
74
|
+
if (match) {
|
|
75
|
+
return { owner: match[1], repo: match[2] };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Not in VS Code context, use default
|
|
81
|
+
}
|
|
82
|
+
return { owner: shared_1.DEFAULT_STORE_OWNER, repo: shared_1.DEFAULT_STORE_REPO };
|
|
83
|
+
}
|
|
84
|
+
exports.STORE_CONFIG = {
|
|
85
|
+
get owner() { return getStoreRepo().owner; },
|
|
86
|
+
get repo() { return getStoreRepo().repo; },
|
|
87
|
+
defaultBranch: shared_1.DEFAULT_STORE_BRANCH,
|
|
88
|
+
paths: shared_1.STORE_PATHS,
|
|
89
|
+
};
|
|
90
|
+
// StoreVersion is re-exported from shared.ts
|
|
91
|
+
// -----------------------------------------------------------------------------
|
|
92
|
+
// Version Management
|
|
93
|
+
// -----------------------------------------------------------------------------
|
|
94
|
+
/**
|
|
95
|
+
* List available versions for an artifact in the store.
|
|
96
|
+
* Tries unauthenticated first, prompts for auth only if needed.
|
|
97
|
+
*/
|
|
98
|
+
async function listStoreVersions(type, slug) {
|
|
99
|
+
const prefix = `${(0, shared_1.getStorePath)(type)}/${slug}/v`;
|
|
100
|
+
const url = `https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/git/refs/tags`;
|
|
101
|
+
// Try unauthenticated first
|
|
102
|
+
let response = await fetch(url, {
|
|
103
|
+
headers: {
|
|
104
|
+
Accept: 'application/vnd.github.v3+json',
|
|
105
|
+
'User-Agent': 'AgentIDE',
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
// If failed, try with auth
|
|
109
|
+
if (!response.ok && (response.status === 401 || response.status === 403 || response.status === 429)) {
|
|
110
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
111
|
+
response = await fetch(url, {
|
|
112
|
+
headers: {
|
|
113
|
+
Authorization: `Bearer ${token}`,
|
|
114
|
+
Accept: 'application/vnd.github.v3+json',
|
|
115
|
+
'User-Agent': 'AgentIDE',
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
if (response.status === 404) {
|
|
121
|
+
return []; // No tags yet
|
|
122
|
+
}
|
|
123
|
+
throw new Error(`Failed to list tags: ${response.statusText}`);
|
|
124
|
+
}
|
|
125
|
+
const refs = (await response.json());
|
|
126
|
+
// Filter and parse versions
|
|
127
|
+
const versions = [];
|
|
128
|
+
for (const { ref } of refs) {
|
|
129
|
+
const tagName = ref.replace('refs/tags/', '');
|
|
130
|
+
if (tagName.startsWith(prefix)) {
|
|
131
|
+
const version = tagName.slice(prefix.length - 1); // Keep the 'v'
|
|
132
|
+
versions.push({
|
|
133
|
+
version: version.replace(/^v/, ''),
|
|
134
|
+
tagName,
|
|
135
|
+
isPrerelease: /-(alpha|beta|rc|pre)/.test(version),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Sort by version (newest first)
|
|
140
|
+
return versions.sort((a, b) => {
|
|
141
|
+
// Simple semver comparison (could use semver library for proper comparison)
|
|
142
|
+
return b.version.localeCompare(a.version, undefined, { numeric: true });
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the latest version for an artifact.
|
|
147
|
+
*/
|
|
148
|
+
async function getLatestStoreVersion(type, slug, includePrerelease = false) {
|
|
149
|
+
const versions = await listStoreVersions(type, slug);
|
|
150
|
+
if (includePrerelease) {
|
|
151
|
+
return versions[0] || null;
|
|
152
|
+
}
|
|
153
|
+
return versions.find(v => !v.isPrerelease) || null;
|
|
154
|
+
}
|
|
155
|
+
// -----------------------------------------------------------------------------
|
|
156
|
+
// Install from Store (Tarball, Unauthenticated First)
|
|
157
|
+
// -----------------------------------------------------------------------------
|
|
158
|
+
const zlib_1 = require("zlib");
|
|
159
|
+
/**
|
|
160
|
+
* Parse a tar archive into a map of path → content.
|
|
161
|
+
*/
|
|
162
|
+
function parseTar(data) {
|
|
163
|
+
const files = new Map();
|
|
164
|
+
let offset = 0;
|
|
165
|
+
while (offset < data.length - 512) {
|
|
166
|
+
const header = data.subarray(offset, offset + 512);
|
|
167
|
+
if (header.every(b => b === 0)) {
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
const name = header.subarray(0, 100).toString('utf-8').replace(/\0/g, '').trim();
|
|
171
|
+
const sizeOctal = header.subarray(124, 136).toString('utf-8').replace(/\0/g, '').trim();
|
|
172
|
+
const typeFlag = header[156];
|
|
173
|
+
if (!name) {
|
|
174
|
+
offset += 512;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const size = parseInt(sizeOctal, 8) || 0;
|
|
178
|
+
offset += 512;
|
|
179
|
+
if (typeFlag === 0 || typeFlag === 48) {
|
|
180
|
+
files.set(name, Buffer.from(data.subarray(offset, offset + size)));
|
|
181
|
+
}
|
|
182
|
+
offset += Math.ceil(size / 512) * 512;
|
|
183
|
+
}
|
|
184
|
+
return files;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Download files for an artifact from the store.
|
|
188
|
+
* Uses tarball download, tries unauthenticated first.
|
|
189
|
+
*/
|
|
190
|
+
async function downloadFromStore(options, outputChannel) {
|
|
191
|
+
const { type, slug, version, includePrerelease } = options;
|
|
192
|
+
const typePath = (0, shared_1.getStorePath)(type);
|
|
193
|
+
// Resolve version
|
|
194
|
+
let targetRef;
|
|
195
|
+
if (version === 'main' || version === 'latest') {
|
|
196
|
+
// Explicit main branch request
|
|
197
|
+
targetRef = exports.STORE_CONFIG.defaultBranch;
|
|
198
|
+
if (outputChannel) {
|
|
199
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Using ${targetRef} branch (latest)`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (version) {
|
|
203
|
+
targetRef = `${typePath}/${slug}/v${version.replace(/^v/, '')}`;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const latest = await getLatestStoreVersion(type, slug, includePrerelease);
|
|
207
|
+
if (latest) {
|
|
208
|
+
targetRef = latest.tagName;
|
|
209
|
+
if (outputChannel) {
|
|
210
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Using latest version: ${latest.version}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// No tags found - try to download from main branch
|
|
215
|
+
targetRef = exports.STORE_CONFIG.defaultBranch;
|
|
216
|
+
if (outputChannel) {
|
|
217
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] No version tags found, using ${targetRef} branch`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (outputChannel) {
|
|
222
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Downloading ${type}/${slug} at ${targetRef}`);
|
|
223
|
+
}
|
|
224
|
+
// Download tarball (unauthenticated first)
|
|
225
|
+
const encodedRef = encodeURIComponent(targetRef);
|
|
226
|
+
const url = `https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/tarball/${encodedRef}`;
|
|
227
|
+
let response = await fetch(url, {
|
|
228
|
+
headers: {
|
|
229
|
+
'User-Agent': 'AgentIDE',
|
|
230
|
+
Accept: 'application/vnd.github.v3+json',
|
|
231
|
+
},
|
|
232
|
+
redirect: 'follow',
|
|
233
|
+
});
|
|
234
|
+
// If failed, try with auth
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
if (response.status === 401 || response.status === 403 || response.status === 404 || response.status === 429) {
|
|
237
|
+
if (outputChannel) {
|
|
238
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Requires authentication, signing in...`);
|
|
239
|
+
}
|
|
240
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
241
|
+
response = await fetch(url, {
|
|
242
|
+
headers: {
|
|
243
|
+
'User-Agent': 'AgentIDE',
|
|
244
|
+
Accept: 'application/vnd.github.v3+json',
|
|
245
|
+
Authorization: `Bearer ${token}`,
|
|
246
|
+
},
|
|
247
|
+
redirect: 'follow',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (!response.ok) {
|
|
251
|
+
throw new Error(`Version ${version || 'latest'} not found for ${type} "${slug}"`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Download and decompress
|
|
255
|
+
const gzipped = Buffer.from(await response.arrayBuffer());
|
|
256
|
+
const tarData = (0, zlib_1.gunzipSync)(gzipped);
|
|
257
|
+
const allFiles = parseTar(tarData);
|
|
258
|
+
// Filter to files in our artifact's folder
|
|
259
|
+
const artifactPath = `${typePath}/${slug}/`;
|
|
260
|
+
const result = [];
|
|
261
|
+
for (const [fullPath, content] of allFiles) {
|
|
262
|
+
// Strip top-level directory (e.g., "repo-commit/")
|
|
263
|
+
const slashIndex = fullPath.indexOf('/');
|
|
264
|
+
if (slashIndex === -1) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const relativePath = fullPath.slice(slashIndex + 1);
|
|
268
|
+
if (relativePath.startsWith(artifactPath)) {
|
|
269
|
+
const artifactRelativePath = relativePath.slice(artifactPath.length);
|
|
270
|
+
if (artifactRelativePath) {
|
|
271
|
+
result.push({ path: artifactRelativePath, content });
|
|
272
|
+
if (outputChannel) {
|
|
273
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] ↓ ${artifactRelativePath}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return result;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Download files from any GitHub repository.
|
|
282
|
+
* Used for installing from external sources like anthropics/skills.
|
|
283
|
+
*/
|
|
284
|
+
async function downloadFromExternalGitHub(options, outputChannel) {
|
|
285
|
+
const { owner, repo, ref = 'main', path } = options;
|
|
286
|
+
if (outputChannel) {
|
|
287
|
+
(0, utils_1.logInfo)(outputChannel, `[GitHub] Downloading ${owner}/${repo}${path ? `/${path}` : ''} at ${ref}`);
|
|
288
|
+
}
|
|
289
|
+
// Download tarball
|
|
290
|
+
const encodedRef = encodeURIComponent(ref);
|
|
291
|
+
const url = `https://api.github.com/repos/${owner}/${repo}/tarball/${encodedRef}`;
|
|
292
|
+
let response = await fetch(url, {
|
|
293
|
+
headers: {
|
|
294
|
+
'User-Agent': 'AgentIDE',
|
|
295
|
+
Accept: 'application/vnd.github.v3+json',
|
|
296
|
+
},
|
|
297
|
+
redirect: 'follow',
|
|
298
|
+
});
|
|
299
|
+
// If failed, try with auth
|
|
300
|
+
if (!response.ok) {
|
|
301
|
+
if (response.status === 401 || response.status === 403 || response.status === 404 || response.status === 429) {
|
|
302
|
+
if (outputChannel) {
|
|
303
|
+
(0, utils_1.logInfo)(outputChannel, `[GitHub] Requires authentication, signing in...`);
|
|
304
|
+
}
|
|
305
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
306
|
+
response = await fetch(url, {
|
|
307
|
+
headers: {
|
|
308
|
+
'User-Agent': 'AgentIDE',
|
|
309
|
+
Accept: 'application/vnd.github.v3+json',
|
|
310
|
+
Authorization: `Bearer ${token}`,
|
|
311
|
+
},
|
|
312
|
+
redirect: 'follow',
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
if (!response.ok) {
|
|
316
|
+
throw new Error(`Failed to download from ${owner}/${repo}@${ref}: ${response.statusText}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
320
|
+
const decompressed = (0, zlib_1.gunzipSync)(buffer);
|
|
321
|
+
const tarFiles = parseTar(decompressed);
|
|
322
|
+
// Find root directory in tarball (GitHub adds prefix like "repo-sha/")
|
|
323
|
+
let rootPrefix = '';
|
|
324
|
+
for (const name of tarFiles.keys()) {
|
|
325
|
+
if (name.includes('/')) {
|
|
326
|
+
rootPrefix = name.split('/')[0] + '/';
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// If path specified, filter to only files in that path
|
|
331
|
+
const pathPrefix = path ? `${rootPrefix}${path}/` : rootPrefix;
|
|
332
|
+
const result = [];
|
|
333
|
+
for (const [name, content] of tarFiles) {
|
|
334
|
+
if (name.startsWith(pathPrefix)) {
|
|
335
|
+
const relativePath = name.slice(pathPrefix.length);
|
|
336
|
+
if (relativePath && !relativePath.endsWith('/')) {
|
|
337
|
+
result.push({
|
|
338
|
+
path: relativePath,
|
|
339
|
+
content: content.toString('utf-8'),
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (result.length === 0) {
|
|
345
|
+
throw new Error(`No files found in ${owner}/${repo}${path ? `/${path}` : ''} at ${ref}`);
|
|
346
|
+
}
|
|
347
|
+
if (outputChannel) {
|
|
348
|
+
(0, utils_1.logInfo)(outputChannel, `[GitHub] Downloaded ${result.length} files`);
|
|
349
|
+
}
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
async function getRepoForkMetadata(owner, repo) {
|
|
353
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
354
|
+
const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {
|
|
355
|
+
headers: {
|
|
356
|
+
Authorization: `Bearer ${token}`,
|
|
357
|
+
Accept: 'application/vnd.github.v3+json',
|
|
358
|
+
'User-Agent': 'AgentIDE',
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
if (response.status === 404) {
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
if (!response.ok) {
|
|
365
|
+
throw new Error(`Failed to inspect repo ${owner}/${repo}: ${response.statusText}`);
|
|
366
|
+
}
|
|
367
|
+
const data = await response.json();
|
|
368
|
+
return {
|
|
369
|
+
fork: data.fork === true,
|
|
370
|
+
parentFullName: data.parent?.full_name,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function assertStoreFork(owner, repo, metadata) {
|
|
374
|
+
if ((0, shared_1.isForkOfStoreRepo)(metadata, exports.STORE_CONFIG.owner, exports.STORE_CONFIG.repo)) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
throw new Error(`Your GitHub repo ${owner}/${repo} is not a fork of ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}.\n\n` +
|
|
378
|
+
`Publishing requires a fork of the store repository. Either delete or rename ${owner}/${repo} ` +
|
|
379
|
+
`and retry (AgentIDE will create a proper fork), or fork ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo} on GitHub.`);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Sync the fork's default branch with upstream when possible.
|
|
383
|
+
*/
|
|
384
|
+
async function syncForkWithUpstream(forkOwner, forkRepo) {
|
|
385
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
386
|
+
const response = await fetch(`https://api.github.com/repos/${forkOwner}/${forkRepo}/merge-upstream`, {
|
|
387
|
+
method: 'POST',
|
|
388
|
+
headers: {
|
|
389
|
+
Authorization: `Bearer ${token}`,
|
|
390
|
+
Accept: 'application/vnd.github.v3+json',
|
|
391
|
+
'User-Agent': 'AgentIDE',
|
|
392
|
+
'Content-Type': 'application/json',
|
|
393
|
+
},
|
|
394
|
+
body: JSON.stringify({ branch: exports.STORE_CONFIG.defaultBranch }),
|
|
395
|
+
});
|
|
396
|
+
// Best-effort: publish branches from upstream SHA even if sync fails.
|
|
397
|
+
if (response.ok || response.status === 409) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
// Log but don't throw — the publish branch will be based on upstream SHA directly.
|
|
401
|
+
const errorBody = await response.text().catch(() => '');
|
|
402
|
+
console.warn(`[Store] Warning: fork sync returned ${response.status}: ${errorBody.slice(0, 200)}`);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Fork the central store repo if not already forked.
|
|
406
|
+
*/
|
|
407
|
+
async function ensureFork() {
|
|
408
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
409
|
+
const user = await (0, github_1.getGitHubUser)();
|
|
410
|
+
// Check if fork already exists
|
|
411
|
+
const existingFork = await (0, github_1.getRepo)(user.login, exports.STORE_CONFIG.repo);
|
|
412
|
+
if (existingFork) {
|
|
413
|
+
const metadata = await getRepoForkMetadata(user.login, exports.STORE_CONFIG.repo);
|
|
414
|
+
if (!metadata) {
|
|
415
|
+
throw new Error(`Fork repo not found: ${user.login}/${exports.STORE_CONFIG.repo}`);
|
|
416
|
+
}
|
|
417
|
+
assertStoreFork(user.login, exports.STORE_CONFIG.repo, metadata);
|
|
418
|
+
return existingFork;
|
|
419
|
+
}
|
|
420
|
+
// Check if source repo exists
|
|
421
|
+
const sourceRepo = await (0, github_1.getRepo)(exports.STORE_CONFIG.owner, exports.STORE_CONFIG.repo);
|
|
422
|
+
if (!sourceRepo) {
|
|
423
|
+
throw new Error(`Store repo not found: ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}\n\n` +
|
|
424
|
+
`If using a custom store, ensure the repo exists and is accessible.\n` +
|
|
425
|
+
`Setting: agentide.storeRepo`);
|
|
426
|
+
}
|
|
427
|
+
// Create fork
|
|
428
|
+
const response = await fetch(`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/forks`, {
|
|
429
|
+
method: 'POST',
|
|
430
|
+
headers: {
|
|
431
|
+
Authorization: `Bearer ${token}`,
|
|
432
|
+
Accept: 'application/vnd.github.v3+json',
|
|
433
|
+
'User-Agent': 'AgentIDE',
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
if (!response.ok) {
|
|
437
|
+
const errorBody = await response.text().catch(() => '');
|
|
438
|
+
if (response.status === 403) {
|
|
439
|
+
throw new Error(`Cannot fork store: Permission denied.\n\n` +
|
|
440
|
+
`Ensure your GitHub token has the 'repo' scope.\n` +
|
|
441
|
+
`Try: Sign out and sign in again with GitHub.`);
|
|
442
|
+
}
|
|
443
|
+
if (response.status === 404) {
|
|
444
|
+
throw new Error(`Store repo not found: ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}\n\n` +
|
|
445
|
+
`The repository may be private or doesn't exist.`);
|
|
446
|
+
}
|
|
447
|
+
throw new Error(`Failed to fork store: ${response.status} ${response.statusText}\n${errorBody}`);
|
|
448
|
+
}
|
|
449
|
+
const fork = (await response.json());
|
|
450
|
+
// Wait for fork to be ready (GitHub needs a moment)
|
|
451
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
452
|
+
return fork;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Create (or reset) a publish branch on the fork from upstream's default branch.
|
|
456
|
+
*/
|
|
457
|
+
async function ensurePublishBranch(forkOwner, forkRepo, branchName) {
|
|
458
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
459
|
+
const baseSha = await (0, github_1.getBranchSha)(exports.STORE_CONFIG.owner, exports.STORE_CONFIG.repo, exports.STORE_CONFIG.defaultBranch);
|
|
460
|
+
const headers = {
|
|
461
|
+
Authorization: `Bearer ${token}`,
|
|
462
|
+
Accept: 'application/vnd.github.v3+json',
|
|
463
|
+
'User-Agent': 'AgentIDE',
|
|
464
|
+
'Content-Type': 'application/json',
|
|
465
|
+
};
|
|
466
|
+
const createResponse = await fetch(`https://api.github.com/repos/${forkOwner}/${forkRepo}/git/refs`, {
|
|
467
|
+
method: 'POST',
|
|
468
|
+
headers,
|
|
469
|
+
body: JSON.stringify({
|
|
470
|
+
ref: `refs/heads/${branchName}`,
|
|
471
|
+
sha: baseSha,
|
|
472
|
+
}),
|
|
473
|
+
});
|
|
474
|
+
if (createResponse.ok) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
if (createResponse.status === 422) {
|
|
478
|
+
const patchResponse = await fetch(`https://api.github.com/repos/${forkOwner}/${forkRepo}/git/refs/heads/${encodeURIComponent(branchName)}`, {
|
|
479
|
+
method: 'PATCH',
|
|
480
|
+
headers,
|
|
481
|
+
body: JSON.stringify({ sha: baseSha, force: true }),
|
|
482
|
+
});
|
|
483
|
+
if (patchResponse.ok) {
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
const patchError = await patchResponse.text();
|
|
487
|
+
throw new Error(`Failed to reset publish branch: ${patchResponse.status} ${patchError}`);
|
|
488
|
+
}
|
|
489
|
+
const error = await createResponse.text();
|
|
490
|
+
if (createResponse.status === 403 && error.includes('personal access token')) {
|
|
491
|
+
const orgHint = forkOwner === exports.STORE_CONFIG.owner
|
|
492
|
+
? `\n\nIf this is an organization repo, authorize the token for SSO: GitHub → Settings → Developer settings → Personal access tokens → your token → Configure SSO → Authorize ${exports.STORE_CONFIG.owner}.`
|
|
493
|
+
: '';
|
|
494
|
+
throw new Error(`Failed to create publish branch: token cannot write to ${forkOwner}/${forkRepo}.${orgHint}`);
|
|
495
|
+
}
|
|
496
|
+
throw new Error(`Failed to create publish branch: ${createResponse.status} ${error}`);
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Check whether the token has push access to a repo via the GitHub API permissions field.
|
|
500
|
+
*/
|
|
501
|
+
async function verifyGitWriteAccess(owner, repo) {
|
|
502
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
503
|
+
const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {
|
|
504
|
+
headers: {
|
|
505
|
+
Authorization: `Bearer ${token}`,
|
|
506
|
+
Accept: 'application/vnd.github.v3+json',
|
|
507
|
+
'User-Agent': 'AgentIDE',
|
|
508
|
+
},
|
|
509
|
+
});
|
|
510
|
+
if (!response.ok) {
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
const data = await response.json();
|
|
514
|
+
return data.permissions?.push === true || data.permissions?.admin === true;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Whether the authenticated user can push directly to the configured store repo.
|
|
518
|
+
*/
|
|
519
|
+
async function canPublishDirectlyToStore() {
|
|
520
|
+
return verifyGitWriteAccess(exports.STORE_CONFIG.owner, exports.STORE_CONFIG.repo);
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Create a pull request into the store repo.
|
|
524
|
+
* @param head Branch name for same-repo PRs, or `owner:branch` for cross-repo PRs.
|
|
525
|
+
*/
|
|
526
|
+
async function createPullRequest(head, title, body, forkOwnerForErrors) {
|
|
527
|
+
const token = await (0, github_1.getGitHubToken)();
|
|
528
|
+
const response = await fetch(`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/pulls`, {
|
|
529
|
+
method: 'POST',
|
|
530
|
+
headers: {
|
|
531
|
+
Authorization: `Bearer ${token}`,
|
|
532
|
+
Accept: 'application/vnd.github.v3+json',
|
|
533
|
+
'User-Agent': 'AgentIDE',
|
|
534
|
+
'Content-Type': 'application/json',
|
|
535
|
+
},
|
|
536
|
+
body: JSON.stringify({
|
|
537
|
+
title,
|
|
538
|
+
body,
|
|
539
|
+
head,
|
|
540
|
+
base: exports.STORE_CONFIG.defaultBranch,
|
|
541
|
+
}),
|
|
542
|
+
});
|
|
543
|
+
if (!response.ok) {
|
|
544
|
+
const error = await response.text();
|
|
545
|
+
throw new Error((0, shared_1.formatStorePullRequestError)(error, exports.STORE_CONFIG.owner, exports.STORE_CONFIG.repo, forkOwnerForErrors));
|
|
546
|
+
}
|
|
547
|
+
const pr = (await response.json());
|
|
548
|
+
return { url: pr.html_url, number: pr.number };
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Publish an artifact to the store.
|
|
552
|
+
* Maintainers with push access publish directly to the store repo; others use fork + PR.
|
|
553
|
+
*/
|
|
554
|
+
async function publishToStore(options, outputChannel) {
|
|
555
|
+
const { type, slug, version, files, changelog } = options;
|
|
556
|
+
const typePath = (0, shared_1.getStorePath)(type);
|
|
557
|
+
const tagName = `${typePath}/${slug}/v${version}`;
|
|
558
|
+
const branchName = `publish-${type}-${slug}-v${version}`;
|
|
559
|
+
if (outputChannel) {
|
|
560
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Publishing ${type} "${slug}" v${version}...`);
|
|
561
|
+
}
|
|
562
|
+
const publishDirect = await canPublishDirectlyToStore();
|
|
563
|
+
let targetOwner;
|
|
564
|
+
let targetRepo;
|
|
565
|
+
let prHead;
|
|
566
|
+
let forkOwnerForErrors;
|
|
567
|
+
if (publishDirect) {
|
|
568
|
+
targetOwner = exports.STORE_CONFIG.owner;
|
|
569
|
+
targetRepo = exports.STORE_CONFIG.repo;
|
|
570
|
+
prHead = branchName;
|
|
571
|
+
if (outputChannel) {
|
|
572
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Publishing directly to ${targetOwner}/${targetRepo}...`);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
if (outputChannel) {
|
|
577
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Ensuring fork exists...`);
|
|
578
|
+
}
|
|
579
|
+
const fork = await ensureFork();
|
|
580
|
+
targetOwner = fork.owner.login;
|
|
581
|
+
targetRepo = fork.name;
|
|
582
|
+
prHead = `${fork.owner.login}:${branchName}`;
|
|
583
|
+
forkOwnerForErrors = fork.owner.login;
|
|
584
|
+
if (outputChannel) {
|
|
585
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Syncing fork with upstream...`);
|
|
586
|
+
}
|
|
587
|
+
await syncForkWithUpstream(fork.owner.login, fork.name);
|
|
588
|
+
}
|
|
589
|
+
if (outputChannel) {
|
|
590
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Creating branch: ${branchName}`);
|
|
591
|
+
}
|
|
592
|
+
await ensurePublishBranch(targetOwner, targetRepo, branchName);
|
|
593
|
+
if (outputChannel) {
|
|
594
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Committing ${files.length} files...`);
|
|
595
|
+
}
|
|
596
|
+
const filesToCommit = files.map(file => ({
|
|
597
|
+
path: `${typePath}/${slug}/${file.path}`,
|
|
598
|
+
content: file.content,
|
|
599
|
+
}));
|
|
600
|
+
await (0, github_1.commitMultipleFiles)(targetOwner, targetRepo, branchName, filesToCommit, `Add ${type}/${slug} v${version}`);
|
|
601
|
+
if (outputChannel) {
|
|
602
|
+
for (const file of files) {
|
|
603
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] ✓ ${file.path}`);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
if (outputChannel) {
|
|
607
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Creating pull request...`);
|
|
608
|
+
}
|
|
609
|
+
const prBody = `
|
|
610
|
+
## New ${type}: ${slug} v${version}
|
|
611
|
+
|
|
612
|
+
${changelog || 'No changelog provided.'}
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
*Submitted via AgentIDE*
|
|
616
|
+
`;
|
|
617
|
+
const pr = await createPullRequest(prHead, `[${type}] Add ${slug} v${version}`, prBody, forkOwnerForErrors);
|
|
618
|
+
if (outputChannel) {
|
|
619
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] OK Created PR: ${pr.url}`);
|
|
620
|
+
}
|
|
621
|
+
return {
|
|
622
|
+
prUrl: pr.url,
|
|
623
|
+
prNumber: pr.number,
|
|
624
|
+
tagName,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
// -----------------------------------------------------------------------------
|
|
628
|
+
// URL Parsing
|
|
629
|
+
// -----------------------------------------------------------------------------
|
|
630
|
+
// -----------------------------------------------------------------------------
|
|
631
|
+
// URL Parsing and Type Detection
|
|
632
|
+
// -----------------------------------------------------------------------------
|
|
633
|
+
/**
|
|
634
|
+
* Parse any GitHub URL into components.
|
|
635
|
+
* Uses STORE_CONFIG to determine if URL points to the configured store repo.
|
|
636
|
+
*/
|
|
637
|
+
function parseGitHubUrl(url) {
|
|
638
|
+
return (0, shared_1.parseGitHubUrl)(url, exports.STORE_CONFIG.owner, exports.STORE_CONFIG.repo);
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Detect artifact type from a GitHub repo by checking for marker files.
|
|
642
|
+
* - agent.yaml → pack
|
|
643
|
+
* - SKILL.md → skill
|
|
644
|
+
* - .mcp.json or mcp.json → mcp
|
|
645
|
+
* - engine.manifest.json → engine
|
|
646
|
+
*/
|
|
647
|
+
async function detectArtifactType(owner, repo, ref, path, outputChannel) {
|
|
648
|
+
const basePath = path ? `${path}/` : '';
|
|
649
|
+
const baseRef = ref || 'main';
|
|
650
|
+
const checkFile = async (filePath) => {
|
|
651
|
+
const url = `https://api.github.com/repos/${owner}/${repo}/contents/${basePath}${filePath}?ref=${baseRef}`;
|
|
652
|
+
try {
|
|
653
|
+
const response = await fetch(url, {
|
|
654
|
+
headers: {
|
|
655
|
+
Accept: 'application/vnd.github.v3+json',
|
|
656
|
+
'User-Agent': 'AgentIDE',
|
|
657
|
+
},
|
|
658
|
+
});
|
|
659
|
+
return response.ok;
|
|
660
|
+
}
|
|
661
|
+
catch {
|
|
662
|
+
return false;
|
|
663
|
+
}
|
|
664
|
+
};
|
|
665
|
+
if (outputChannel) {
|
|
666
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Detecting artifact type for ${owner}/${repo}/${basePath}...`);
|
|
667
|
+
}
|
|
668
|
+
// Check in order of specificity
|
|
669
|
+
if (await checkFile('agent.yaml')) {
|
|
670
|
+
return 'pack';
|
|
671
|
+
}
|
|
672
|
+
if (await checkFile('SKILL.md')) {
|
|
673
|
+
return 'skill';
|
|
674
|
+
}
|
|
675
|
+
if (await checkFile('.mcp.json') || await checkFile('mcp.json')) {
|
|
676
|
+
return 'mcp';
|
|
677
|
+
}
|
|
678
|
+
if (await checkFile('engine.manifest.json')) {
|
|
679
|
+
return 'engine';
|
|
680
|
+
}
|
|
681
|
+
if (await checkFile('view.yaml') && await checkFile('panel-entry.yaml')) {
|
|
682
|
+
return 'view';
|
|
683
|
+
}
|
|
684
|
+
throw new Error(`Cannot detect artifact type in ${owner}/${repo}${path ? `/${path}` : ''}. Expected agent.yaml, SKILL.md, .mcp.json, engine.manifest.json, or view.yaml with panel-entry.yaml`);
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Parse a store URL into components.
|
|
688
|
+
* Re-exports shared parseStoreUrl.
|
|
689
|
+
*/
|
|
690
|
+
exports.parseStoreUrl = shared_1.parseStoreUrl;
|
|
691
|
+
/**
|
|
692
|
+
* Check if a URL looks like a store URL.
|
|
693
|
+
* Uses STORE_CONFIG to determine if URL points to the configured store repo.
|
|
694
|
+
*/
|
|
695
|
+
function isStoreUrl(url) {
|
|
696
|
+
return (0, shared_1.isStoreUrl)(url, exports.STORE_CONFIG.owner, exports.STORE_CONFIG.repo);
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* List all artifacts available in the store.
|
|
700
|
+
*/
|
|
701
|
+
async function listStoreIndex(type, outputChannel) {
|
|
702
|
+
const items = [];
|
|
703
|
+
// Fetch directory listing from GitHub
|
|
704
|
+
const typePaths = type
|
|
705
|
+
? [(0, shared_1.getStorePath)(type)]
|
|
706
|
+
: [
|
|
707
|
+
exports.STORE_CONFIG.paths.packs,
|
|
708
|
+
exports.STORE_CONFIG.paths.skills,
|
|
709
|
+
exports.STORE_CONFIG.paths.mcp,
|
|
710
|
+
exports.STORE_CONFIG.paths.engines,
|
|
711
|
+
exports.STORE_CONFIG.paths.spotlightViews,
|
|
712
|
+
];
|
|
713
|
+
for (const typePath of typePaths) {
|
|
714
|
+
const url = `https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/contents/${typePath}`;
|
|
715
|
+
try {
|
|
716
|
+
const response = await fetch(url, {
|
|
717
|
+
headers: {
|
|
718
|
+
Accept: 'application/vnd.github.v3+json',
|
|
719
|
+
'User-Agent': 'AgentIDE',
|
|
720
|
+
},
|
|
721
|
+
});
|
|
722
|
+
if (!response.ok) {
|
|
723
|
+
if (outputChannel) {
|
|
724
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] No ${typePath} directory found`);
|
|
725
|
+
}
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
const entries = (await response.json());
|
|
729
|
+
for (const entry of entries) {
|
|
730
|
+
if (entry.type === 'dir') {
|
|
731
|
+
const artifactType = typePath === exports.STORE_CONFIG.paths.packs ? 'pack' :
|
|
732
|
+
typePath === exports.STORE_CONFIG.paths.skills ? 'skill' :
|
|
733
|
+
typePath === exports.STORE_CONFIG.paths.mcp ? 'mcp' :
|
|
734
|
+
typePath === exports.STORE_CONFIG.paths.engines ? 'engine' : 'view';
|
|
735
|
+
items.push({
|
|
736
|
+
type: artifactType,
|
|
737
|
+
slug: entry.name,
|
|
738
|
+
path: entry.path,
|
|
739
|
+
});
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
catch (e) {
|
|
744
|
+
if (outputChannel) {
|
|
745
|
+
(0, utils_1.logInfo)(outputChannel, `[Store] Error listing ${typePath}: ${e}`);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
return items;
|
|
750
|
+
}
|
|
751
|
+
/**
|
|
752
|
+
* Format a store URL.
|
|
753
|
+
* Re-exports shared formatStoreUrl.
|
|
754
|
+
*/
|
|
755
|
+
exports.formatStoreUrl = shared_1.formatStoreUrl;
|