@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
package/out/utils.js
ADDED
|
@@ -0,0 +1,915 @@
|
|
|
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.getAnalyticsScriptsDir = void 0;
|
|
40
|
+
exports.logInfo = logInfo;
|
|
41
|
+
exports.getErrorCode = getErrorCode;
|
|
42
|
+
exports.pathExists = pathExists;
|
|
43
|
+
exports.isDirOrSymlink = isDirOrSymlink;
|
|
44
|
+
exports.ensureRealDirectory = ensureRealDirectory;
|
|
45
|
+
exports.writeFileIfChanged = writeFileIfChanged;
|
|
46
|
+
exports.copyDirRecursive = copyDirRecursive;
|
|
47
|
+
exports.copyDirRecursiveWithTransform = copyDirRecursiveWithTransform;
|
|
48
|
+
exports.symlinkOrCopyFile = symlinkOrCopyFile;
|
|
49
|
+
exports.syncDirByFileLinks = syncDirByFileLinks;
|
|
50
|
+
exports.ensureWorkspaceGitAndGitignore = ensureWorkspaceGitAndGitignore;
|
|
51
|
+
exports.readFileSha256 = readFileSha256;
|
|
52
|
+
exports.getFileStats = getFileStats;
|
|
53
|
+
exports.isCachedHashValid = isCachedHashValid;
|
|
54
|
+
exports.shortSig = shortSig;
|
|
55
|
+
exports.isLocalHttps = isLocalHttps;
|
|
56
|
+
exports.applyLocalTlsBypass = applyLocalTlsBypass;
|
|
57
|
+
exports.getOverrideOpenAIBaseUrl = getOverrideOpenAIBaseUrl;
|
|
58
|
+
exports.resolveApiRouting = resolveApiRouting;
|
|
59
|
+
exports.getExplicitConfigValue = getExplicitConfigValue;
|
|
60
|
+
exports.getAgentideEngineSettings = getAgentideEngineSettings;
|
|
61
|
+
exports.emitStreamEvent = emitStreamEvent;
|
|
62
|
+
exports.createIPCStreamEmitter = createIPCStreamEmitter;
|
|
63
|
+
exports.computeTextDelta = computeTextDelta;
|
|
64
|
+
exports.createDeferred = createDeferred;
|
|
65
|
+
exports.stableAdditionalDirs = stableAdditionalDirs;
|
|
66
|
+
exports.extractFilePaths = extractFilePaths;
|
|
67
|
+
exports.isCreateCommand = isCreateCommand;
|
|
68
|
+
exports.normalizeFileChangeKind = normalizeFileChangeKind;
|
|
69
|
+
exports.isBinaryFile = isBinaryFile;
|
|
70
|
+
const fs_1 = require("fs");
|
|
71
|
+
const child_process_1 = require("child_process");
|
|
72
|
+
const promises_1 = require("stream/promises");
|
|
73
|
+
const util_1 = require("util");
|
|
74
|
+
const path = __importStar(require("path"));
|
|
75
|
+
const crypto = __importStar(require("crypto"));
|
|
76
|
+
const shared_1 = require("./shared");
|
|
77
|
+
const branding_1 = require("./branding");
|
|
78
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
79
|
+
// Lazy-load vscode to allow bundling for CLI/headless mode
|
|
80
|
+
// Use eval to prevent Bun from statically analyzing the require
|
|
81
|
+
let _vscode;
|
|
82
|
+
function getVscode() {
|
|
83
|
+
if (!_vscode) {
|
|
84
|
+
try {
|
|
85
|
+
// eslint-disable-next-line no-eval
|
|
86
|
+
_vscode = eval('require')('vscode');
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
throw new Error('vscode module not available. Use ConfigProvider instead of vscode.workspace.getConfiguration');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return _vscode;
|
|
93
|
+
}
|
|
94
|
+
/** Helper to log a message using whichever method is available */
|
|
95
|
+
function logInfo(logger, msg) {
|
|
96
|
+
if (logger.appendLine) {
|
|
97
|
+
logger.appendLine(msg);
|
|
98
|
+
}
|
|
99
|
+
else if (logger.info) {
|
|
100
|
+
logger.info(msg);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// -----------------------------------------------------------------------------
|
|
104
|
+
// Error Handling
|
|
105
|
+
// -----------------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Extract error code from an unknown error object (e.g., Node.js fs errors).
|
|
108
|
+
*/
|
|
109
|
+
function getErrorCode(e) {
|
|
110
|
+
return e && typeof e === 'object' ? e.code : undefined;
|
|
111
|
+
}
|
|
112
|
+
// -----------------------------------------------------------------------------
|
|
113
|
+
// File System Utilities
|
|
114
|
+
// -----------------------------------------------------------------------------
|
|
115
|
+
async function pathExists(targetPath) {
|
|
116
|
+
try {
|
|
117
|
+
await fs_1.promises.lstat(targetPath);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
if (getErrorCode(e) === 'ENOENT') {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
throw e;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function isDirOrSymlink(targetPath) {
|
|
128
|
+
try {
|
|
129
|
+
const stat = await fs_1.promises.lstat(targetPath);
|
|
130
|
+
return stat.isDirectory() || stat.isSymbolicLink();
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
if (getErrorCode(e) === 'ENOENT') {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
throw e;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function ensureRealDirectory(dirPath) {
|
|
140
|
+
try {
|
|
141
|
+
const st = await fs_1.promises.lstat(dirPath);
|
|
142
|
+
if (st.isSymbolicLink() || !st.isDirectory()) {
|
|
143
|
+
await fs_1.promises.rm(dirPath, { recursive: true, force: true });
|
|
144
|
+
await fs_1.promises.mkdir(dirPath, { recursive: true });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
if (getErrorCode(e) === 'ENOENT') {
|
|
149
|
+
await fs_1.promises.mkdir(dirPath, { recursive: true });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
throw e;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function writeFileIfChanged(targetFile, contents) {
|
|
156
|
+
try {
|
|
157
|
+
const existing = await fs_1.promises.readFile(targetFile, 'utf8');
|
|
158
|
+
if (existing === contents) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
if (getErrorCode(e) !== 'ENOENT') {
|
|
164
|
+
throw e;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
await fs_1.promises.mkdir(path.dirname(targetFile), { recursive: true });
|
|
168
|
+
await fs_1.promises.writeFile(targetFile, contents, 'utf8');
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
async function copyDirRecursive(sourceDir, targetDir) {
|
|
172
|
+
await fs_1.promises.mkdir(targetDir, { recursive: true });
|
|
173
|
+
const entries = await fs_1.promises.readdir(sourceDir, { withFileTypes: true });
|
|
174
|
+
for (const entry of entries) {
|
|
175
|
+
const src = path.join(sourceDir, entry.name);
|
|
176
|
+
const dst = path.join(targetDir, entry.name);
|
|
177
|
+
if (entry.isDirectory()) {
|
|
178
|
+
await copyDirRecursive(src, dst);
|
|
179
|
+
}
|
|
180
|
+
else if (entry.isFile()) {
|
|
181
|
+
await fs_1.promises.copyFile(src, dst);
|
|
182
|
+
}
|
|
183
|
+
else if (entry.isSymbolicLink()) {
|
|
184
|
+
// Best-effort: resolve and copy the link target as a file or directory.
|
|
185
|
+
const resolved = await fs_1.promises.readlink(src);
|
|
186
|
+
const resolvedAbs = path.isAbsolute(resolved)
|
|
187
|
+
? resolved
|
|
188
|
+
: path.resolve(path.dirname(src), resolved);
|
|
189
|
+
const stat = await fs_1.promises.stat(resolvedAbs);
|
|
190
|
+
if (stat.isDirectory()) {
|
|
191
|
+
await copyDirRecursive(resolvedAbs, dst);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
await fs_1.promises.copyFile(resolvedAbs, dst);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Copy a directory recursively, applying a text transform to markdown files.
|
|
201
|
+
* Used for bundled skills that may contain branding tokens.
|
|
202
|
+
*/
|
|
203
|
+
async function copyDirRecursiveWithTransform(sourceDir, targetDir, transformMd) {
|
|
204
|
+
await fs_1.promises.mkdir(targetDir, { recursive: true });
|
|
205
|
+
const entries = await fs_1.promises.readdir(sourceDir, { withFileTypes: true });
|
|
206
|
+
for (const entry of entries) {
|
|
207
|
+
const src = path.join(sourceDir, entry.name);
|
|
208
|
+
const dst = path.join(targetDir, entry.name);
|
|
209
|
+
if (entry.isDirectory()) {
|
|
210
|
+
await copyDirRecursiveWithTransform(src, dst, transformMd);
|
|
211
|
+
}
|
|
212
|
+
else if (entry.isFile()) {
|
|
213
|
+
const lowerName = entry.name.toLowerCase();
|
|
214
|
+
if (lowerName.endsWith('.md')) {
|
|
215
|
+
// Apply transform to markdown files
|
|
216
|
+
const content = await fs_1.promises.readFile(src, 'utf8');
|
|
217
|
+
await fs_1.promises.writeFile(dst, transformMd(content), 'utf8');
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
await fs_1.promises.copyFile(src, dst);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else if (entry.isSymbolicLink()) {
|
|
224
|
+
// Best-effort: resolve and copy the link target as a file or directory.
|
|
225
|
+
const resolved = await fs_1.promises.readlink(src);
|
|
226
|
+
const resolvedAbs = path.isAbsolute(resolved)
|
|
227
|
+
? resolved
|
|
228
|
+
: path.resolve(path.dirname(src), resolved);
|
|
229
|
+
const stat = await fs_1.promises.stat(resolvedAbs);
|
|
230
|
+
if (stat.isDirectory()) {
|
|
231
|
+
await copyDirRecursiveWithTransform(resolvedAbs, dst, transformMd);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
const lowerName = entry.name.toLowerCase();
|
|
235
|
+
if (lowerName.endsWith('.md')) {
|
|
236
|
+
const content = await fs_1.promises.readFile(resolvedAbs, 'utf8');
|
|
237
|
+
await fs_1.promises.writeFile(dst, transformMd(content), 'utf8');
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
await fs_1.promises.copyFile(resolvedAbs, dst);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Create a symlink (or copy as fallback) to a file.
|
|
248
|
+
*
|
|
249
|
+
* @param force - If true, replace any existing file (for derived/managed files).
|
|
250
|
+
* If false, only replace symlinks pointing elsewhere, never clobber non-symlinks (for user files).
|
|
251
|
+
*/
|
|
252
|
+
async function symlinkOrCopyFile(sourceFile, targetFile, logger, label, options) {
|
|
253
|
+
const force = options?.force ?? false;
|
|
254
|
+
// Check existing target
|
|
255
|
+
try {
|
|
256
|
+
const existing = await fs_1.promises.lstat(targetFile);
|
|
257
|
+
if (existing.isSymbolicLink()) {
|
|
258
|
+
// Check if already pointing to correct target
|
|
259
|
+
try {
|
|
260
|
+
const current = await fs_1.promises.readlink(targetFile);
|
|
261
|
+
const currentAbs = path.isAbsolute(current)
|
|
262
|
+
? current
|
|
263
|
+
: path.resolve(path.dirname(targetFile), current);
|
|
264
|
+
if (path.resolve(currentAbs) === path.resolve(sourceFile)) {
|
|
265
|
+
return; // Already correct, nothing to do
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Can't read link, fall through and replace it
|
|
270
|
+
}
|
|
271
|
+
await fs_1.promises.unlink(targetFile);
|
|
272
|
+
}
|
|
273
|
+
else if (force) {
|
|
274
|
+
// Force mode: replace any file type
|
|
275
|
+
await fs_1.promises.rm(targetFile, { recursive: true, force: true });
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// Preserve mode: don't clobber user-managed non-symlink files
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
if (getErrorCode(e) !== 'ENOENT') {
|
|
284
|
+
throw e;
|
|
285
|
+
}
|
|
286
|
+
// File doesn't exist, proceed to create
|
|
287
|
+
}
|
|
288
|
+
await fs_1.promises.mkdir(path.dirname(targetFile), { recursive: true });
|
|
289
|
+
if (path.resolve(sourceFile) === path.resolve(targetFile)) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
await fs_1.promises.symlink(sourceFile, targetFile, 'file');
|
|
294
|
+
logInfo(logger, `[AgentIDE] Linked ${label} (symlink): ${targetFile} -> ${sourceFile}`);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
await fs_1.promises.copyFile(sourceFile, targetFile);
|
|
298
|
+
logInfo(logger, `[AgentIDE] Linked ${label} (copy fallback): ${targetFile}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Mirror a directory by creating **file symlinks** (with copy fallback) rather than directory symlinks.
|
|
303
|
+
* This avoids Git's "pathspec is beyond a symbolic link" failure mode (which triggers on directory symlinks).
|
|
304
|
+
*
|
|
305
|
+
* Notes:
|
|
306
|
+
* - Hidden entries (starting with ".") are ignored.
|
|
307
|
+
* - Non-symlink files in target that don't exist in source are copied back to source (preserves agent-created content).
|
|
308
|
+
* - Only stale symlinks are removed (symlinks pointing to files no longer in source).
|
|
309
|
+
*/
|
|
310
|
+
async function syncDirByFileLinks(sourceDir, targetDir, logger, label) {
|
|
311
|
+
await ensureRealDirectory(targetDir);
|
|
312
|
+
const expectedDirs = new Set();
|
|
313
|
+
const expectedFiles = new Map(); // relPath -> sourceAbs
|
|
314
|
+
const walk = async (absSrc, rel) => {
|
|
315
|
+
let entries;
|
|
316
|
+
try {
|
|
317
|
+
entries = await fs_1.promises.readdir(absSrc, { withFileTypes: true });
|
|
318
|
+
}
|
|
319
|
+
catch (e) {
|
|
320
|
+
if (getErrorCode(e) === 'ENOENT') {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
throw e;
|
|
324
|
+
}
|
|
325
|
+
for (const entry of entries) {
|
|
326
|
+
if (entry.name.startsWith('.')) {
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
const src = path.join(absSrc, entry.name);
|
|
330
|
+
const relPath = rel ? path.join(rel, entry.name) : entry.name;
|
|
331
|
+
if (entry.isDirectory()) {
|
|
332
|
+
expectedDirs.add(relPath);
|
|
333
|
+
await walk(src, relPath);
|
|
334
|
+
}
|
|
335
|
+
else if (entry.isFile()) {
|
|
336
|
+
expectedFiles.set(relPath, src);
|
|
337
|
+
}
|
|
338
|
+
else if (entry.isSymbolicLink()) {
|
|
339
|
+
// Best-effort: resolve and mirror the link target.
|
|
340
|
+
try {
|
|
341
|
+
const resolved = await fs_1.promises.readlink(src);
|
|
342
|
+
const resolvedAbs = path.isAbsolute(resolved)
|
|
343
|
+
? resolved
|
|
344
|
+
: path.resolve(path.dirname(src), resolved);
|
|
345
|
+
const stat = await fs_1.promises.stat(resolvedAbs);
|
|
346
|
+
if (stat.isDirectory()) {
|
|
347
|
+
expectedDirs.add(relPath);
|
|
348
|
+
await walk(resolvedAbs, relPath);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
expectedFiles.set(relPath, resolvedAbs);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
355
|
+
const code = getErrorCode(e);
|
|
356
|
+
if (code === 'ENOENT' || code === 'ELOOP') {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
throw e;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
await walk(sourceDir, '');
|
|
365
|
+
// Ensure all directories exist (parents first).
|
|
366
|
+
const dirsByDepth = Array.from(expectedDirs).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
|
|
367
|
+
for (const relDir of dirsByDepth) {
|
|
368
|
+
await ensureRealDirectory(path.join(targetDir, relDir));
|
|
369
|
+
}
|
|
370
|
+
// Link files (force overwrite; derived dirs are AgentIDE-managed)
|
|
371
|
+
for (const [relFile, srcAbs] of expectedFiles.entries()) {
|
|
372
|
+
await symlinkOrCopyFile(srcAbs, path.join(targetDir, relFile), logger, `${label}/${relFile}`.replace(/\\/g, '/'), { force: true });
|
|
373
|
+
}
|
|
374
|
+
// Copy-back: copy non-symlink files from target to source if they don't exist in source.
|
|
375
|
+
// This preserves agent-created content (scripts, templates, etc.) in the source of truth.
|
|
376
|
+
const expectedFileSet = new Set(expectedFiles.keys());
|
|
377
|
+
const copyBack = async (absDst, relDst) => {
|
|
378
|
+
let entries;
|
|
379
|
+
try {
|
|
380
|
+
entries = await fs_1.promises.readdir(absDst, { withFileTypes: true });
|
|
381
|
+
}
|
|
382
|
+
catch (e) {
|
|
383
|
+
if (getErrorCode(e) === 'ENOENT') {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
throw e;
|
|
387
|
+
}
|
|
388
|
+
for (const entry of entries) {
|
|
389
|
+
if (entry.name.startsWith('.')) {
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
const absDstFile = path.join(absDst, entry.name);
|
|
393
|
+
const relPath = relDst ? path.join(relDst, entry.name) : entry.name;
|
|
394
|
+
const absSrcFile = path.join(sourceDir, relPath);
|
|
395
|
+
if (entry.isDirectory()) {
|
|
396
|
+
await copyBack(absDstFile, relPath);
|
|
397
|
+
}
|
|
398
|
+
else if (entry.isFile() && !entry.isSymbolicLink()) {
|
|
399
|
+
// Real file in target - check if it exists in source
|
|
400
|
+
if (!expectedFileSet.has(relPath)) {
|
|
401
|
+
// File doesn't exist in source - copy it back
|
|
402
|
+
try {
|
|
403
|
+
await fs_1.promises.mkdir(path.dirname(absSrcFile), { recursive: true });
|
|
404
|
+
await fs_1.promises.copyFile(absDstFile, absSrcFile);
|
|
405
|
+
logInfo(logger, `[AgentIDE] Copied new file to source: ${label}/${relPath}`.replace(/\\/g, '/'));
|
|
406
|
+
// Add to expected files so it becomes a symlink on next sync
|
|
407
|
+
expectedFiles.set(relPath, absSrcFile);
|
|
408
|
+
}
|
|
409
|
+
catch (e) {
|
|
410
|
+
logInfo(logger, `[AgentIDE] Warning: failed to copy back ${relPath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
await copyBack(targetDir, '');
|
|
417
|
+
// Re-link any files we just copied back (convert them to symlinks)
|
|
418
|
+
for (const [relFile, srcAbs] of expectedFiles.entries()) {
|
|
419
|
+
const targetFile = path.join(targetDir, relFile);
|
|
420
|
+
try {
|
|
421
|
+
const stat = await fs_1.promises.lstat(targetFile);
|
|
422
|
+
// If it's a regular file (not symlink), replace with symlink
|
|
423
|
+
if (stat.isFile() && !stat.isSymbolicLink()) {
|
|
424
|
+
await fs_1.promises.rm(targetFile, { force: true });
|
|
425
|
+
await symlinkOrCopyFile(srcAbs, targetFile, logger, `${label}/${relFile}`.replace(/\\/g, '/'), { force: true });
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// File doesn't exist, will be created by the link phase
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
// Cleanup: remove unexpected SYMLINK entries in target dir.
|
|
433
|
+
const cleanup = async (absDst, relDst) => {
|
|
434
|
+
let entries;
|
|
435
|
+
try {
|
|
436
|
+
entries = await fs_1.promises.readdir(absDst, { withFileTypes: true });
|
|
437
|
+
}
|
|
438
|
+
catch (e) {
|
|
439
|
+
if (getErrorCode(e) === 'ENOENT') {
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
throw e;
|
|
443
|
+
}
|
|
444
|
+
for (const entry of entries) {
|
|
445
|
+
if (entry.name.startsWith('.')) {
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
const abs = path.join(absDst, entry.name);
|
|
449
|
+
const relPath = relDst ? path.join(relDst, entry.name) : entry.name;
|
|
450
|
+
if (entry.isDirectory()) {
|
|
451
|
+
// Recurse into directories to clean up symlinks inside
|
|
452
|
+
await cleanup(abs, relPath);
|
|
453
|
+
// Don't remove directories - they may contain user-added files
|
|
454
|
+
}
|
|
455
|
+
else if (entry.isSymbolicLink()) {
|
|
456
|
+
// Only remove symlinks that are no longer expected
|
|
457
|
+
if (!expectedFileSet.has(relPath)) {
|
|
458
|
+
await fs_1.promises.rm(abs, { force: true });
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
await cleanup(targetDir, '');
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Ensure workspace root has git initialized and .gitignore entries for agent directories.
|
|
467
|
+
* If the folder is not a git repository, runs `git init`.
|
|
468
|
+
* Adds the agent root, .claude, .codex to the root .gitignore if not already present.
|
|
469
|
+
*/
|
|
470
|
+
async function ensureWorkspaceGitAndGitignore(workspaceRoot, logger) {
|
|
471
|
+
const gitDir = path.join(workspaceRoot, '.git');
|
|
472
|
+
// Check if .git exists
|
|
473
|
+
const gitExists = await pathExists(gitDir);
|
|
474
|
+
if (!gitExists) {
|
|
475
|
+
// Initialize git repository
|
|
476
|
+
try {
|
|
477
|
+
await execFileAsync('git', ['init'], { cwd: workspaceRoot });
|
|
478
|
+
logInfo(logger, `[AgentIDE] Initialized git repository in ${workspaceRoot}`);
|
|
479
|
+
}
|
|
480
|
+
catch (e) {
|
|
481
|
+
logInfo(logger, `[AgentIDE] Note: Could not initialize git in ${workspaceRoot}: ${e instanceof Error ? e.message : String(e)}`);
|
|
482
|
+
// Continue anyway - we still want to create/update .gitignore
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// Ensure root .gitignore has entries for agent directories
|
|
486
|
+
const rootGitignorePath = path.join(workspaceRoot, '.gitignore');
|
|
487
|
+
// Build the list of directories to ignore from AGENT_ENGINES
|
|
488
|
+
const agentideDirs = [
|
|
489
|
+
...Object.values(shared_1.AGENT_ENGINES).map(engine => engine.workspaceDir),
|
|
490
|
+
];
|
|
491
|
+
const managedBlockLines = [
|
|
492
|
+
`# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`,
|
|
493
|
+
`# These directories are managed by ${branding_1.AGENTIDE_BRAND_NAME} and should not be committed.`,
|
|
494
|
+
...agentideDirs,
|
|
495
|
+
];
|
|
496
|
+
let existing = '';
|
|
497
|
+
try {
|
|
498
|
+
existing = await fs_1.promises.readFile(rootGitignorePath, 'utf8');
|
|
499
|
+
}
|
|
500
|
+
catch (e) {
|
|
501
|
+
if (getErrorCode(e) !== 'ENOENT') {
|
|
502
|
+
logInfo(logger, `[AgentIDE] Warning: failed to read root .gitignore: ${e instanceof Error ? e.message : String(e)}`);
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
// Check if all required entries are already present (as standalone lines)
|
|
507
|
+
const existingLines = existing.split('\n').map(l => l.trim());
|
|
508
|
+
const missingDirs = agentideDirs.filter(dir => !existingLines.includes(dir));
|
|
509
|
+
if (missingDirs.length === 0) {
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
// If we have the managed block header but missing some entries, rebuild the block
|
|
513
|
+
// Otherwise, append the full managed block
|
|
514
|
+
const managedHeader = `# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`;
|
|
515
|
+
const legacyHeader = '# AgentIDE (managed)';
|
|
516
|
+
const hasHeader = existing.includes(managedHeader) || existing.includes(legacyHeader);
|
|
517
|
+
let next;
|
|
518
|
+
if (hasHeader) {
|
|
519
|
+
// Replace the managed block with updated entries
|
|
520
|
+
// Find the block and replace it
|
|
521
|
+
const lines = existing.split('\n');
|
|
522
|
+
const newLines = [];
|
|
523
|
+
let inManagedBlock = false;
|
|
524
|
+
for (const line of lines) {
|
|
525
|
+
if (line.trim() === managedHeader || line.trim() === legacyHeader) {
|
|
526
|
+
inManagedBlock = true;
|
|
527
|
+
// Add the new managed block
|
|
528
|
+
newLines.push(...managedBlockLines);
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
if (inManagedBlock) {
|
|
532
|
+
// Skip lines that are part of the managed block (comments or the dirs)
|
|
533
|
+
if (line.trim().startsWith('#') || agentideDirs.includes(line.trim()) || line.trim() === '') {
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
// End of managed block
|
|
537
|
+
inManagedBlock = false;
|
|
538
|
+
}
|
|
539
|
+
newLines.push(line);
|
|
540
|
+
}
|
|
541
|
+
next = newLines.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
// Append the managed block
|
|
545
|
+
next = [
|
|
546
|
+
existing.trimEnd(),
|
|
547
|
+
'',
|
|
548
|
+
managedBlockLines.join('\n'),
|
|
549
|
+
'',
|
|
550
|
+
].join('\n').replace(/^\n+/, '');
|
|
551
|
+
}
|
|
552
|
+
try {
|
|
553
|
+
const changed = await writeFileIfChanged(rootGitignorePath, next);
|
|
554
|
+
if (changed) {
|
|
555
|
+
logInfo(logger, `[AgentIDE] Updated ${rootGitignorePath} to ignore ${branding_1.AGENTIDE_BRAND_NAME} directories`);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
catch (e) {
|
|
559
|
+
logInfo(logger, `[AgentIDE] Warning: failed to write root .gitignore: ${e instanceof Error ? e.message : String(e)}`);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Compute SHA256 hash of a file using streaming to avoid loading large files into memory.
|
|
564
|
+
* Returns the hash along with file stats for caching purposes.
|
|
565
|
+
*/
|
|
566
|
+
async function readFileSha256(filePath) {
|
|
567
|
+
const stat = await fs_1.promises.stat(filePath);
|
|
568
|
+
const hash = crypto.createHash('sha256');
|
|
569
|
+
await (0, promises_1.pipeline)((0, fs_1.createReadStream)(filePath), hash);
|
|
570
|
+
return {
|
|
571
|
+
sha256: hash.digest('hex'),
|
|
572
|
+
size: stat.size,
|
|
573
|
+
mtimeMs: stat.mtimeMs,
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Get file stats for mtime caching (fast path check before hashing).
|
|
578
|
+
*/
|
|
579
|
+
async function getFileStats(filePath) {
|
|
580
|
+
try {
|
|
581
|
+
const stat = await fs_1.promises.stat(filePath);
|
|
582
|
+
return { size: stat.size, mtimeMs: stat.mtimeMs };
|
|
583
|
+
}
|
|
584
|
+
catch (e) {
|
|
585
|
+
if (getErrorCode(e) === 'ENOENT') {
|
|
586
|
+
return undefined;
|
|
587
|
+
}
|
|
588
|
+
throw e;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Check if cached file hash is still valid based on mtime and size.
|
|
593
|
+
* If valid, returns the cached entry; otherwise returns undefined to trigger re-hash.
|
|
594
|
+
*/
|
|
595
|
+
function isCachedHashValid(cached, currentStats) {
|
|
596
|
+
if (!cached || !currentStats) {
|
|
597
|
+
return undefined;
|
|
598
|
+
}
|
|
599
|
+
if (cached.mtimeMs === currentStats.mtimeMs && cached.size === currentStats.size) {
|
|
600
|
+
return cached;
|
|
601
|
+
}
|
|
602
|
+
return undefined;
|
|
603
|
+
}
|
|
604
|
+
function shortSig(input) {
|
|
605
|
+
return crypto.createHash('sha256').update(input).digest('hex').slice(0, 16);
|
|
606
|
+
}
|
|
607
|
+
// -----------------------------------------------------------------------------
|
|
608
|
+
// Environment Utilities
|
|
609
|
+
// -----------------------------------------------------------------------------
|
|
610
|
+
/**
|
|
611
|
+
* Check if a URL is a local HTTPS address (localhost, 127.0.0.1, 0.0.0.0).
|
|
612
|
+
*/
|
|
613
|
+
function isLocalHttps(url) {
|
|
614
|
+
if (!url) {
|
|
615
|
+
return false;
|
|
616
|
+
}
|
|
617
|
+
return url.startsWith('https://') && (url.includes('localhost') || url.includes('127.0.0.1') || url.includes('0.0.0.0'));
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Apply TLS verification bypass for local HTTPS in an environment object.
|
|
621
|
+
* Returns the modified env and whether TLS was disabled.
|
|
622
|
+
*/
|
|
623
|
+
function applyLocalTlsBypass(env, baseUrl) {
|
|
624
|
+
if (isLocalHttps(baseUrl)) {
|
|
625
|
+
env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
|
|
626
|
+
return true;
|
|
627
|
+
}
|
|
628
|
+
return false;
|
|
629
|
+
}
|
|
630
|
+
// -----------------------------------------------------------------------------
|
|
631
|
+
// API Routing
|
|
632
|
+
// -----------------------------------------------------------------------------
|
|
633
|
+
/**
|
|
634
|
+
* Get overrideOpenAIBaseUrl for a baseUrl by looking up custom provider config.
|
|
635
|
+
* Uses the provided ConfigProvider or returns undefined (for headless/CLI).
|
|
636
|
+
*/
|
|
637
|
+
function getOverrideOpenAIBaseUrl(baseUrl, configProvider) {
|
|
638
|
+
// If no ConfigProvider, return undefined (no override in headless/CLI mode)
|
|
639
|
+
if (!configProvider) {
|
|
640
|
+
return undefined;
|
|
641
|
+
}
|
|
642
|
+
const customProviders = configProvider.getCustomProviders();
|
|
643
|
+
const normalizedInput = baseUrl.replace(/\/$/, '');
|
|
644
|
+
for (const providerConfig of Object.values(customProviders)) {
|
|
645
|
+
if (providerConfig.baseUrl) {
|
|
646
|
+
const normalizedProviderUrl = providerConfig.baseUrl.replace(/\/$/, '');
|
|
647
|
+
if (normalizedInput === normalizedProviderUrl && providerConfig.overrideOpenAIBaseUrl) {
|
|
648
|
+
return providerConfig.overrideOpenAIBaseUrl.trim();
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
return undefined;
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* Resolve API key and base URL based on LiteLLM routing configuration.
|
|
656
|
+
* Handles fallback to global litellm* settings when useLiteLLM is true.
|
|
657
|
+
* Returns both baseUrl (for Claude/Anthropic) and openaiBaseUrl (with overrideOpenAIBaseUrl applied for Codex).
|
|
658
|
+
*
|
|
659
|
+
* @param options - Agent request options
|
|
660
|
+
* @param litellmApiKey - Fallback LiteLLM API key
|
|
661
|
+
* @param litellmBaseUrl - Fallback LiteLLM base URL
|
|
662
|
+
* @param configProvider - Optional config provider for resolving overrides
|
|
663
|
+
*/
|
|
664
|
+
function resolveApiRouting(options, litellmApiKey, litellmBaseUrl, configProvider) {
|
|
665
|
+
const useLiteLLM = options.useLiteLLM === true;
|
|
666
|
+
const baseUrl = options.baseUrl || (useLiteLLM ? litellmBaseUrl : undefined);
|
|
667
|
+
const liteLLMResolvedApiKey = options.apiKey || litellmApiKey || 'sk-dummy';
|
|
668
|
+
// For OpenAI-compatible endpoints, check for per-provider overrideOpenAIBaseUrl
|
|
669
|
+
let openaiBaseUrl = baseUrl;
|
|
670
|
+
if (baseUrl) {
|
|
671
|
+
const overrideUrl = getOverrideOpenAIBaseUrl(baseUrl, configProvider);
|
|
672
|
+
if (overrideUrl) {
|
|
673
|
+
openaiBaseUrl = overrideUrl;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
return {
|
|
677
|
+
apiKey: useLiteLLM ? liteLLMResolvedApiKey : (options.apiKey || ''),
|
|
678
|
+
baseUrl,
|
|
679
|
+
openaiBaseUrl,
|
|
680
|
+
useLiteLLM,
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
// -----------------------------------------------------------------------------
|
|
684
|
+
// VS Code Configuration
|
|
685
|
+
// -----------------------------------------------------------------------------
|
|
686
|
+
/**
|
|
687
|
+
* Get explicit config value from VS Code configuration.
|
|
688
|
+
* Note: This function requires VS Code runtime.
|
|
689
|
+
*/
|
|
690
|
+
function getExplicitConfigValue(config, key) {
|
|
691
|
+
const inspect = config.inspect(key);
|
|
692
|
+
if (!inspect) {
|
|
693
|
+
return undefined;
|
|
694
|
+
}
|
|
695
|
+
return (inspect.workspaceFolderValue ?? inspect.workspaceValue ?? inspect.globalValue);
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Get engine settings from configuration.
|
|
699
|
+
* Uses the provided ConfigProvider or returns defaults (for headless/CLI).
|
|
700
|
+
*/
|
|
701
|
+
function getAgentideEngineSettings(configProvider) {
|
|
702
|
+
if (configProvider) {
|
|
703
|
+
return configProvider.getEngineSettings();
|
|
704
|
+
}
|
|
705
|
+
// Return defaults when no ConfigProvider (headless/CLI mode)
|
|
706
|
+
return {
|
|
707
|
+
claudeMaxThinkingTokens: 0,
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
// -----------------------------------------------------------------------------
|
|
711
|
+
// Stream Emitter Factory
|
|
712
|
+
// -----------------------------------------------------------------------------
|
|
713
|
+
/**
|
|
714
|
+
* Send a stream event to the Workbench via command.
|
|
715
|
+
* The Workbench registers 'agentide.streamCallback' to receive these events.
|
|
716
|
+
*/
|
|
717
|
+
async function emitStreamEvent(event) {
|
|
718
|
+
try {
|
|
719
|
+
await getVscode().commands.executeCommand('agentide.streamCallback', event);
|
|
720
|
+
}
|
|
721
|
+
catch (e) {
|
|
722
|
+
console.error('[AgentIDE Extension] Failed to emit stream event:', e);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Create a StreamEmitter for IPC streaming via stream events.
|
|
727
|
+
*/
|
|
728
|
+
const STREAM_COALESCE_WINDOW_MS = 40;
|
|
729
|
+
const STREAM_COALESCE_MIN_CHARS = 120;
|
|
730
|
+
function flushCoalescedBuffers(streamId, state) {
|
|
731
|
+
const emits = [];
|
|
732
|
+
if (state.markdownBuffer) {
|
|
733
|
+
emits.push(emitStreamEvent({ streamId, type: 'markdown', data: state.markdownBuffer }));
|
|
734
|
+
state.markdownBuffer = '';
|
|
735
|
+
}
|
|
736
|
+
if (state.thinkingBuffer) {
|
|
737
|
+
emits.push(emitStreamEvent({ streamId, type: 'thinking', data: state.thinkingBuffer }));
|
|
738
|
+
state.thinkingBuffer = '';
|
|
739
|
+
}
|
|
740
|
+
if (state.flushTimer) {
|
|
741
|
+
clearTimeout(state.flushTimer);
|
|
742
|
+
state.flushTimer = undefined;
|
|
743
|
+
}
|
|
744
|
+
return Promise.all(emits).then(() => undefined);
|
|
745
|
+
}
|
|
746
|
+
function ensureFlushTimer(streamId, state) {
|
|
747
|
+
if (state.flushTimer) {
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
750
|
+
state.flushTimer = setTimeout(() => {
|
|
751
|
+
void flushCoalescedBuffers(streamId, state);
|
|
752
|
+
}, STREAM_COALESCE_WINDOW_MS);
|
|
753
|
+
}
|
|
754
|
+
function createIPCStreamEmitter(streamId) {
|
|
755
|
+
const state = {
|
|
756
|
+
markdownBuffer: '',
|
|
757
|
+
thinkingBuffer: '',
|
|
758
|
+
flushTimer: undefined,
|
|
759
|
+
};
|
|
760
|
+
return {
|
|
761
|
+
async thinking(delta) {
|
|
762
|
+
if (!delta) {
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
765
|
+
state.thinkingBuffer += delta;
|
|
766
|
+
if (state.thinkingBuffer.length >= STREAM_COALESCE_MIN_CHARS) {
|
|
767
|
+
await flushCoalescedBuffers(streamId, state);
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
ensureFlushTimer(streamId, state);
|
|
771
|
+
},
|
|
772
|
+
async text(delta) {
|
|
773
|
+
if (!delta) {
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
state.markdownBuffer += delta;
|
|
777
|
+
if (state.markdownBuffer.length >= STREAM_COALESCE_MIN_CHARS) {
|
|
778
|
+
await flushCoalescedBuffers(streamId, state);
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
781
|
+
ensureFlushTimer(streamId, state);
|
|
782
|
+
},
|
|
783
|
+
async toolStart(toolName, input, toolCallId, metadata) {
|
|
784
|
+
await flushCoalescedBuffers(streamId, state);
|
|
785
|
+
await emitStreamEvent({ streamId, type: 'tool_use', toolName, toolCallId, data: input || '', metadata });
|
|
786
|
+
},
|
|
787
|
+
async toolEnd(toolName, toolCallId, result, isError, metadata) {
|
|
788
|
+
await flushCoalescedBuffers(streamId, state);
|
|
789
|
+
const base = (metadata && typeof metadata === 'object') ? metadata : {};
|
|
790
|
+
await emitStreamEvent({
|
|
791
|
+
streamId,
|
|
792
|
+
type: 'tool_end',
|
|
793
|
+
toolName,
|
|
794
|
+
toolCallId,
|
|
795
|
+
data: result || '',
|
|
796
|
+
metadata: { ...base, isError }
|
|
797
|
+
});
|
|
798
|
+
},
|
|
799
|
+
async progress(message) {
|
|
800
|
+
await flushCoalescedBuffers(streamId, state);
|
|
801
|
+
await emitStreamEvent({ streamId, type: 'progress', data: message });
|
|
802
|
+
},
|
|
803
|
+
async question(payload) {
|
|
804
|
+
await flushCoalescedBuffers(streamId, state);
|
|
805
|
+
await emitStreamEvent({ streamId, type: 'question', metadata: payload });
|
|
806
|
+
return {
|
|
807
|
+
selected: [],
|
|
808
|
+
freeText: null,
|
|
809
|
+
declined: true,
|
|
810
|
+
};
|
|
811
|
+
},
|
|
812
|
+
async error(message) {
|
|
813
|
+
await flushCoalescedBuffers(streamId, state);
|
|
814
|
+
await emitStreamEvent({ streamId, type: 'error', data: message });
|
|
815
|
+
},
|
|
816
|
+
async done() {
|
|
817
|
+
await flushCoalescedBuffers(streamId, state);
|
|
818
|
+
await emitStreamEvent({ streamId, type: 'done' });
|
|
819
|
+
},
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
// -----------------------------------------------------------------------------
|
|
823
|
+
// Text Delta Tracking
|
|
824
|
+
// -----------------------------------------------------------------------------
|
|
825
|
+
/**
|
|
826
|
+
* Helper to compute delta for streaming text (avoids duplicate content).
|
|
827
|
+
* Uses a Map to track last seen text per item ID.
|
|
828
|
+
*/
|
|
829
|
+
function computeTextDelta(itemId, newText, tracker) {
|
|
830
|
+
const prev = tracker.get(itemId) ?? '';
|
|
831
|
+
const delta = newText.startsWith(prev) ? newText.slice(prev.length) : newText;
|
|
832
|
+
tracker.set(itemId, newText);
|
|
833
|
+
return delta;
|
|
834
|
+
}
|
|
835
|
+
function createDeferred() {
|
|
836
|
+
let resolve;
|
|
837
|
+
let reject;
|
|
838
|
+
const promise = new Promise((res, rej) => {
|
|
839
|
+
resolve = res;
|
|
840
|
+
reject = rej;
|
|
841
|
+
});
|
|
842
|
+
return { promise, resolve, reject };
|
|
843
|
+
}
|
|
844
|
+
// -----------------------------------------------------------------------------
|
|
845
|
+
// Stable Helpers
|
|
846
|
+
// -----------------------------------------------------------------------------
|
|
847
|
+
function stableAdditionalDirs(additionalDirectories) {
|
|
848
|
+
return (additionalDirectories ?? []).slice().filter(Boolean).sort();
|
|
849
|
+
}
|
|
850
|
+
// Re-export from utils/paths for extension convenience
|
|
851
|
+
var paths_1 = require("./utils/paths");
|
|
852
|
+
Object.defineProperty(exports, "getAnalyticsScriptsDir", { enumerable: true, get: function () { return paths_1.getAnalyticsScriptsDir; } });
|
|
853
|
+
// -----------------------------------------------------------------------------
|
|
854
|
+
// Shell Command File Path Extraction (for edit tracking)
|
|
855
|
+
// -----------------------------------------------------------------------------
|
|
856
|
+
const CREATE_CMD_PATTERN = /(?:cat\s*>[^>]|echo\s*>[^>]|touch\s+|>\s*[^>]|<<\s*['"]?EOF)/;
|
|
857
|
+
const EXCLUDED_PREFIXES = ['/tmp/', '/var/', '/dev/'];
|
|
858
|
+
const EXCLUDED_SUFFIXES = ['.tmp', '.bak'];
|
|
859
|
+
/** Extract file paths from shell command. Inclusive approach - better to over-track than miss. */
|
|
860
|
+
function extractFilePaths(command, workspaceRoot) {
|
|
861
|
+
// Use matchAll with inline regex to avoid shared state issues
|
|
862
|
+
// Character class includes: whitespace, quotes, backticks, semicolon, pipe, ampersand, parens, equals, and redirects (><)
|
|
863
|
+
const matches = command.matchAll(/(?:^|[\s'"`;|&()=><])([./]*(?:[\w.\-]+\/)*[\w.\-]+\.[\w]+)(?=[\s'"`;|&()=><]|$)/g);
|
|
864
|
+
const paths = new Set();
|
|
865
|
+
for (const m of matches) {
|
|
866
|
+
const p = m[1].replace(/['"]/g, '').trim();
|
|
867
|
+
if (!p || p.startsWith('-') || p.includes('..')) {
|
|
868
|
+
continue;
|
|
869
|
+
}
|
|
870
|
+
if (EXCLUDED_PREFIXES.some(x => p.startsWith(x)) || EXCLUDED_SUFFIXES.some(x => p.endsWith(x))) {
|
|
871
|
+
continue;
|
|
872
|
+
}
|
|
873
|
+
paths.add(p.startsWith('/') ? p : `${workspaceRoot}/${p.replace(/^\.\//, '')}`);
|
|
874
|
+
}
|
|
875
|
+
return [...paths];
|
|
876
|
+
}
|
|
877
|
+
/** Check if command creates new files (vs modifying existing) */
|
|
878
|
+
function isCreateCommand(cmd) {
|
|
879
|
+
return CREATE_CMD_PATTERN.test(cmd);
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Normalize provider-specific file change kinds to AgentIDE's canonical kinds.
|
|
883
|
+
*/
|
|
884
|
+
function normalizeFileChangeKind(kind) {
|
|
885
|
+
switch (kind) {
|
|
886
|
+
case 'add':
|
|
887
|
+
case 'create':
|
|
888
|
+
return 'create';
|
|
889
|
+
case 'update':
|
|
890
|
+
case 'modify':
|
|
891
|
+
return 'modify';
|
|
892
|
+
case 'delete':
|
|
893
|
+
return 'delete';
|
|
894
|
+
default:
|
|
895
|
+
return undefined;
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
/** Binary file extensions that should not be tracked for edit diffs (lowercase) */
|
|
899
|
+
const BINARY_EXTENSIONS = new Set([
|
|
900
|
+
'.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx',
|
|
901
|
+
'.zip', '.tar', '.gz', '.rar', '.7z',
|
|
902
|
+
'.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.webp', '.svg',
|
|
903
|
+
'.mp3', '.mp4', '.wav', '.avi', '.mov', '.mkv',
|
|
904
|
+
'.exe', '.dll', '.so', '.dylib', '.bin',
|
|
905
|
+
'.woff', '.woff2', '.ttf', '.otf', '.eot',
|
|
906
|
+
'.pyc', '.class', '.o', '.a',
|
|
907
|
+
]);
|
|
908
|
+
/** Check if file is a binary file (based on extension). Assumes lowercase extensions. */
|
|
909
|
+
function isBinaryFile(filePath) {
|
|
910
|
+
const dotIdx = filePath.lastIndexOf('.');
|
|
911
|
+
if (dotIdx === -1) {
|
|
912
|
+
return false;
|
|
913
|
+
}
|
|
914
|
+
return BINARY_EXTENSIONS.has(filePath.slice(dotIdx));
|
|
915
|
+
}
|