@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,320 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PersistentEngineWorkerPool = void 0;
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_readline_1 = require("node:readline");
|
|
9
|
+
const customEngineIpc_1 = require("./customEngineIpc");
|
|
10
|
+
/** Idle worker is shut down after this long with no turns (matches custom session TTL). */
|
|
11
|
+
const WORKER_IDLE_TTL_MS = 1000 * 60 * 30;
|
|
12
|
+
/** Safety cap: force-kill a retired worker that never drains its in-flight turns. */
|
|
13
|
+
const RETIRE_DRAIN_TIMEOUT_MS = 1000 * 60;
|
|
14
|
+
/**
|
|
15
|
+
* A worker must emit `ready` (engine module imported) within this long after spawn. A hung import
|
|
16
|
+
* (network I/O at module load, an unresolved top-level await, a wedged native dep) would otherwise
|
|
17
|
+
* leave every turn for that engine awaiting `ensureStarted()` forever, so we time it out, kill the
|
|
18
|
+
* child, and let the next turn spawn fresh.
|
|
19
|
+
*/
|
|
20
|
+
const WORKER_STARTUP_TIMEOUT_MS = 1000 * 30;
|
|
21
|
+
/**
|
|
22
|
+
* After a turn is aborted we ask the child to stop and wait for it to settle, but an engine that
|
|
23
|
+
* ignores its AbortSignal would never send `result`/`failed`, leaking the pending run forever. Give
|
|
24
|
+
* the child this long to acknowledge, then settle the host-side promise ourselves.
|
|
25
|
+
*/
|
|
26
|
+
const ABORT_SETTLE_TIMEOUT_MS = 1000 * 10;
|
|
27
|
+
/**
|
|
28
|
+
* One long-lived runner child per engine. The SDK stays warm across turns, so there is no
|
|
29
|
+
* per-turn process spawn or session-resume cost. On a turn failure the worker is "retired":
|
|
30
|
+
* no new turns are routed to it and it is killed once its in-flight turns drain, so the next
|
|
31
|
+
* turn gets a fresh child (the targeted equivalent of an extension-host reload).
|
|
32
|
+
*/
|
|
33
|
+
class EngineWorker {
|
|
34
|
+
opts;
|
|
35
|
+
child;
|
|
36
|
+
readyPromise;
|
|
37
|
+
readyResolve;
|
|
38
|
+
readyReject;
|
|
39
|
+
pending = new Map();
|
|
40
|
+
/**
|
|
41
|
+
* Per-run line chains. Each turn's stdout messages are serialized (so streamed events stay in
|
|
42
|
+
* order and the terminal result/failed lands after them), but turns are independent — a slow or
|
|
43
|
+
* stalled emitter on one chat session no longer blocks streaming for every other session sharing
|
|
44
|
+
* this worker.
|
|
45
|
+
*/
|
|
46
|
+
lineChains = new Map();
|
|
47
|
+
seq = 0;
|
|
48
|
+
stderr = '';
|
|
49
|
+
retired = false;
|
|
50
|
+
retireTimer;
|
|
51
|
+
readyTimer;
|
|
52
|
+
lastUsedAt = Date.now();
|
|
53
|
+
constructor(opts) {
|
|
54
|
+
this.opts = opts;
|
|
55
|
+
}
|
|
56
|
+
/** A worker is reusable only while it has a live child and has not been retired. */
|
|
57
|
+
isUsable() {
|
|
58
|
+
return !this.retired && this.child !== undefined && this.child.exitCode === null && !this.child.killed;
|
|
59
|
+
}
|
|
60
|
+
ensureStarted() {
|
|
61
|
+
if (this.readyPromise) {
|
|
62
|
+
return this.readyPromise;
|
|
63
|
+
}
|
|
64
|
+
this.readyPromise = new Promise((resolve, reject) => {
|
|
65
|
+
this.readyResolve = resolve;
|
|
66
|
+
this.readyReject = reject;
|
|
67
|
+
});
|
|
68
|
+
const child = (0, node_child_process_1.spawn)(this.opts.nodeBin, [this.opts.runnerPath], {
|
|
69
|
+
cwd: this.opts.cwd,
|
|
70
|
+
env: this.opts.spawnEnv,
|
|
71
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
72
|
+
});
|
|
73
|
+
this.child = child;
|
|
74
|
+
this.opts.logger.info(`[AgentIDE] Persistent engine worker started (${this.opts.label}, pid=${child.pid})`);
|
|
75
|
+
const startupTimeoutMs = this.opts.startupTimeoutMs ?? WORKER_STARTUP_TIMEOUT_MS;
|
|
76
|
+
this.readyTimer = setTimeout(() => {
|
|
77
|
+
this.opts.logger.warn(`[AgentIDE] Persistent engine worker (${this.opts.label}) did not signal ready within ${startupTimeoutMs}ms; terminating`);
|
|
78
|
+
this.handleExit(`worker did not become ready within ${startupTimeoutMs}ms`);
|
|
79
|
+
}, startupTimeoutMs);
|
|
80
|
+
this.readyTimer.unref?.();
|
|
81
|
+
const stdoutRl = (0, node_readline_1.createInterface)({ input: child.stdout });
|
|
82
|
+
stdoutRl.on('line', line => this.routeLine(line));
|
|
83
|
+
child.stderr?.on('data', chunk => {
|
|
84
|
+
this.stderr += String(chunk);
|
|
85
|
+
if (this.stderr.length > 16_384) {
|
|
86
|
+
this.stderr = this.stderr.slice(-16_384);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
child.on('error', err => this.handleExit(err.message));
|
|
90
|
+
child.on('close', code => {
|
|
91
|
+
stdoutRl.close();
|
|
92
|
+
this.handleExit(this.stderr.trim() || `worker exited with code ${code}`);
|
|
93
|
+
});
|
|
94
|
+
return this.readyPromise;
|
|
95
|
+
}
|
|
96
|
+
/** Parse a stdout line and dispatch it: `ready` is handled inline; everything else is a
|
|
97
|
+
* per-run message routed onto that run's own ordering chain. */
|
|
98
|
+
routeLine(line) {
|
|
99
|
+
const msg = (0, customEngineIpc_1.parseWorkerOutbound)(line);
|
|
100
|
+
if (!msg) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if ('type' in msg && msg.type === 'ready') {
|
|
104
|
+
// Startup signal — the engine module loaded successfully.
|
|
105
|
+
this.markReady();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Every non-ready message carries an id (control result/failed, or a streamed event).
|
|
109
|
+
const id = 'id' in msg ? msg.id : undefined;
|
|
110
|
+
if (id === undefined) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const prev = this.lineChains.get(id) ?? Promise.resolve();
|
|
114
|
+
const next = prev.then(() => this.handleMessage(msg)).catch(() => undefined);
|
|
115
|
+
this.lineChains.set(id, next);
|
|
116
|
+
void next.then(() => {
|
|
117
|
+
if (this.lineChains.get(id) === next) {
|
|
118
|
+
this.lineChains.delete(id);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
async handleMessage(msg) {
|
|
123
|
+
if ('type' in msg) {
|
|
124
|
+
if (msg.type === 'ready') {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const run = this.pending.get(msg.id);
|
|
128
|
+
if (!run) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (msg.type === 'result') {
|
|
132
|
+
this.finishRun(msg.id, run);
|
|
133
|
+
run.resolve({ nativeSessionId: msg.nativeSessionId });
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.finishRun(msg.id, run);
|
|
137
|
+
run.reject(new Error(msg.message));
|
|
138
|
+
// A thrown turn means the warm SDK may be poisoned — retire unless the user aborted.
|
|
139
|
+
if (!run.aborted) {
|
|
140
|
+
this.retire('turn error');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Streamed RunnerEvent for an in-flight turn.
|
|
146
|
+
const run = this.pending.get(msg.id);
|
|
147
|
+
if (run) {
|
|
148
|
+
await (0, customEngineIpc_1.applyParsedRunnerEvent)(run.emitter, msg.event);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
markReady() {
|
|
152
|
+
if (this.readyTimer) {
|
|
153
|
+
clearTimeout(this.readyTimer);
|
|
154
|
+
this.readyTimer = undefined;
|
|
155
|
+
}
|
|
156
|
+
this.readyResolve?.();
|
|
157
|
+
}
|
|
158
|
+
/** Clear a run's abort timer and signal listener (called when the run settles or the worker dies). */
|
|
159
|
+
cleanupRun(run) {
|
|
160
|
+
if (run.abortTimer) {
|
|
161
|
+
clearTimeout(run.abortTimer);
|
|
162
|
+
run.abortTimer = undefined;
|
|
163
|
+
}
|
|
164
|
+
if (run.signal && run.onAbort) {
|
|
165
|
+
run.signal.removeEventListener('abort', run.onAbort);
|
|
166
|
+
run.onAbort = undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
finishRun(id, run) {
|
|
170
|
+
this.cleanupRun(run);
|
|
171
|
+
this.pending.delete(id);
|
|
172
|
+
if (this.retired && this.pending.size === 0) {
|
|
173
|
+
this.kill();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
handleExit(reason) {
|
|
177
|
+
if (this.retireTimer) {
|
|
178
|
+
clearTimeout(this.retireTimer);
|
|
179
|
+
this.retireTimer = undefined;
|
|
180
|
+
}
|
|
181
|
+
if (this.readyTimer) {
|
|
182
|
+
clearTimeout(this.readyTimer);
|
|
183
|
+
this.readyTimer = undefined;
|
|
184
|
+
}
|
|
185
|
+
const child = this.child;
|
|
186
|
+
this.child = undefined;
|
|
187
|
+
this.retired = true;
|
|
188
|
+
// If the child is still alive (e.g. startup timeout fired on a hung import), terminate it.
|
|
189
|
+
if (child && child.exitCode === null && !child.killed) {
|
|
190
|
+
try {
|
|
191
|
+
child.kill('SIGKILL');
|
|
192
|
+
}
|
|
193
|
+
catch { /* already gone */ }
|
|
194
|
+
}
|
|
195
|
+
this.readyReject?.(new Error(`Persistent engine worker failed to start (${this.opts.label}): ${reason}`));
|
|
196
|
+
const pendingRuns = [...this.pending.entries()];
|
|
197
|
+
this.pending.clear();
|
|
198
|
+
for (const [, run] of pendingRuns) {
|
|
199
|
+
this.cleanupRun(run);
|
|
200
|
+
run.reject(new Error(`Custom engine worker exited (${this.opts.label}): ${reason}`));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** Stop reusing this worker; kill once in-flight turns drain (or after a safety timeout). */
|
|
204
|
+
retire(reason) {
|
|
205
|
+
if (this.retired) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this.retired = true;
|
|
209
|
+
this.opts.logger.info(`[AgentIDE] Retiring persistent engine worker (${this.opts.label}): ${reason}`);
|
|
210
|
+
if (this.pending.size === 0) {
|
|
211
|
+
this.kill();
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
this.retireTimer = setTimeout(() => this.kill(), RETIRE_DRAIN_TIMEOUT_MS);
|
|
215
|
+
this.retireTimer.unref?.();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
kill() {
|
|
219
|
+
if (this.retireTimer) {
|
|
220
|
+
clearTimeout(this.retireTimer);
|
|
221
|
+
this.retireTimer = undefined;
|
|
222
|
+
}
|
|
223
|
+
if (this.readyTimer) {
|
|
224
|
+
clearTimeout(this.readyTimer);
|
|
225
|
+
this.readyTimer = undefined;
|
|
226
|
+
}
|
|
227
|
+
const child = this.child;
|
|
228
|
+
this.child = undefined;
|
|
229
|
+
this.retired = true;
|
|
230
|
+
if (!child || child.exitCode !== null || child.killed) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
// SIGTERM closes the child's stdin readline, whose `close` handler aborts in-flight turns and
|
|
234
|
+
// exits(0). The child installs no SIGTERM handler, so signalling directly is enough — no
|
|
235
|
+
// separate `shutdown` line is needed (it would race the signal and never be read).
|
|
236
|
+
child.kill('SIGTERM');
|
|
237
|
+
}
|
|
238
|
+
send(req) {
|
|
239
|
+
this.child?.stdin?.write((0, customEngineIpc_1.encodeWorkerRequest)(req));
|
|
240
|
+
}
|
|
241
|
+
async run(runEnv, emitter, signal) {
|
|
242
|
+
await this.ensureStarted();
|
|
243
|
+
this.lastUsedAt = Date.now();
|
|
244
|
+
const id = String(++this.seq);
|
|
245
|
+
return new Promise((resolve, reject) => {
|
|
246
|
+
const run = { emitter, resolve, reject, aborted: false, signal };
|
|
247
|
+
const onAbort = () => {
|
|
248
|
+
run.aborted = true;
|
|
249
|
+
this.send({ type: 'abort', id });
|
|
250
|
+
// Don't wait on the child indefinitely: if the engine ignores its AbortSignal and never
|
|
251
|
+
// sends result/failed, settle the host promise ourselves so the turn doesn't leak.
|
|
252
|
+
run.abortTimer = setTimeout(() => {
|
|
253
|
+
const pendingRun = this.pending.get(id);
|
|
254
|
+
if (!pendingRun) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
this.finishRun(id, pendingRun);
|
|
258
|
+
pendingRun.reject(new Error('Custom engine turn aborted'));
|
|
259
|
+
}, this.opts.abortSettleTimeoutMs ?? ABORT_SETTLE_TIMEOUT_MS);
|
|
260
|
+
run.abortTimer.unref?.();
|
|
261
|
+
};
|
|
262
|
+
if (signal) {
|
|
263
|
+
run.onAbort = onAbort;
|
|
264
|
+
if (signal.aborted) {
|
|
265
|
+
onAbort();
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
this.pending.set(id, run);
|
|
272
|
+
this.send({ type: 'run', id, env: runEnv });
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
isIdle(now) {
|
|
276
|
+
return this.pending.size === 0 && now - this.lastUsedAt > (this.opts.idleTtlMs ?? WORKER_IDLE_TTL_MS);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/** Pool of persistent engine workers, keyed by engine cacheKey (id + entry mtimes). */
|
|
280
|
+
class PersistentEngineWorkerPool {
|
|
281
|
+
workers = new Map();
|
|
282
|
+
async run(opts, runEnv, emitter, signal) {
|
|
283
|
+
let worker = this.workers.get(opts.cacheKey);
|
|
284
|
+
if (!worker || !worker.isUsable()) {
|
|
285
|
+
worker?.retire('stale or dead');
|
|
286
|
+
worker = new EngineWorker(opts);
|
|
287
|
+
this.workers.set(opts.cacheKey, worker);
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
return await worker.run(runEnv, emitter, signal);
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
// A failed/exited worker must not be reused for the next turn.
|
|
294
|
+
if (this.workers.get(opts.cacheKey) === worker && !worker.isUsable()) {
|
|
295
|
+
this.workers.delete(opts.cacheKey);
|
|
296
|
+
}
|
|
297
|
+
throw err;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
onMaintenance() {
|
|
301
|
+
const now = Date.now();
|
|
302
|
+
for (const [key, worker] of this.workers.entries()) {
|
|
303
|
+
if (worker.isIdle(now)) {
|
|
304
|
+
worker.kill();
|
|
305
|
+
this.workers.delete(key);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
disposeAll() {
|
|
310
|
+
for (const worker of this.workers.values()) {
|
|
311
|
+
worker.kill();
|
|
312
|
+
}
|
|
313
|
+
this.workers.clear();
|
|
314
|
+
}
|
|
315
|
+
/** Test-only: number of live workers currently tracked by the pool. */
|
|
316
|
+
_workerCountForTest() {
|
|
317
|
+
return this.workers.size;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
exports.PersistentEngineWorkerPool = PersistentEngineWorkerPool;
|
|
@@ -0,0 +1,341 @@
|
|
|
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.discoverPublishableEngines = discoverPublishableEngines;
|
|
40
|
+
exports.resolveEngineSourceDir = resolveEngineSourceDir;
|
|
41
|
+
exports.validateEngineForPublish = validateEngineForPublish;
|
|
42
|
+
exports.collectEngineFiles = collectEngineFiles;
|
|
43
|
+
exports.isValidPublishVersion = isValidPublishVersion;
|
|
44
|
+
const child_process_1 = require("child_process");
|
|
45
|
+
const fs_1 = require("fs");
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const util_1 = require("util");
|
|
48
|
+
const branding_1 = require("../branding");
|
|
49
|
+
const utils_1 = require("../utils");
|
|
50
|
+
const install_1 = require("./install");
|
|
51
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
52
|
+
const ENGINE_MANIFEST_NAME = 'engine.manifest.json';
|
|
53
|
+
const EXCLUDED_NAMES = new Set([
|
|
54
|
+
'.git',
|
|
55
|
+
'.hg',
|
|
56
|
+
'.svn',
|
|
57
|
+
'.DS_Store',
|
|
58
|
+
'node_modules',
|
|
59
|
+
'dist',
|
|
60
|
+
'coverage',
|
|
61
|
+
'.turbo',
|
|
62
|
+
'.cache',
|
|
63
|
+
'.pnpm-store',
|
|
64
|
+
'Thumbs.db',
|
|
65
|
+
]);
|
|
66
|
+
const SECRET_PATTERNS = [
|
|
67
|
+
['private key', /-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/],
|
|
68
|
+
['OpenAI-style key', /\bsk-(?!dummy\b|ant-)[A-Za-z0-9_-]{20,}\b/],
|
|
69
|
+
['Anthropic key', /\bsk-ant-[A-Za-z0-9_-]{20,}\b/],
|
|
70
|
+
['Google API key', /\bAIza[0-9A-Za-z_-]{30,}\b/],
|
|
71
|
+
['GitHub token', /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/],
|
|
72
|
+
['Atlassian API token', /\bATATT[A-Za-z0-9_=+/\-]{20,}\b/],
|
|
73
|
+
['AWS access key', /\bAKIA[0-9A-Z]{16}\b/],
|
|
74
|
+
['JWT', /\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/],
|
|
75
|
+
];
|
|
76
|
+
function shouldExclude(name) {
|
|
77
|
+
if (EXCLUDED_NAMES.has(name)) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
if (/^\.env(?:\.|$)/.test(name)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if (/\.log$/i.test(name)) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
function normalizeArchivePath(rawPath) {
|
|
89
|
+
const normalized = rawPath.replace(/\\/g, '/').trim().replace(/^\.\//, '');
|
|
90
|
+
if (!normalized || normalized === '.' || normalized === '..') {
|
|
91
|
+
throw new Error('must be a non-empty relative path');
|
|
92
|
+
}
|
|
93
|
+
if (normalized.includes('\0') || path.posix.isAbsolute(normalized) || /^[A-Za-z]:[\\/]/.test(normalized)) {
|
|
94
|
+
throw new Error(`must be a safe relative path: ${rawPath}`);
|
|
95
|
+
}
|
|
96
|
+
for (const segment of normalized.split('/')) {
|
|
97
|
+
if (!segment || segment === '.' || segment === '..') {
|
|
98
|
+
throw new Error(`must not contain empty, "." or ".." segments: ${rawPath}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return normalized;
|
|
102
|
+
}
|
|
103
|
+
async function readEngineManifest(engineDir) {
|
|
104
|
+
const manifestPath = path.join(engineDir, ENGINE_MANIFEST_NAME);
|
|
105
|
+
const raw = await fs_1.promises.readFile(manifestPath, 'utf-8');
|
|
106
|
+
const manifest = JSON.parse(raw);
|
|
107
|
+
if (!manifest || typeof manifest !== 'object' || Array.isArray(manifest)) {
|
|
108
|
+
throw new Error(`${manifestPath} must contain a JSON object`);
|
|
109
|
+
}
|
|
110
|
+
if (manifest.version !== 2) {
|
|
111
|
+
throw new Error(`${manifestPath} must use custom engine manifest version 2`);
|
|
112
|
+
}
|
|
113
|
+
if (typeof manifest.id !== 'string' || !/^[a-z0-9][a-z0-9._-]*$/.test(manifest.id)) {
|
|
114
|
+
throw new Error(`${manifestPath} has invalid id: ${String(manifest.id)}`);
|
|
115
|
+
}
|
|
116
|
+
if (typeof manifest.entry !== 'string') {
|
|
117
|
+
throw new Error(`${manifestPath} must define string entry`);
|
|
118
|
+
}
|
|
119
|
+
const entryRel = normalizeArchivePath(manifest.entry);
|
|
120
|
+
const entryPath = path.join(engineDir, entryRel);
|
|
121
|
+
if (!(await (0, utils_1.pathExists)(entryPath))) {
|
|
122
|
+
throw new Error(`${manifestPath} entry does not exist: ${entryRel}`);
|
|
123
|
+
}
|
|
124
|
+
if (manifest.workspaceSync && typeof manifest.workspaceSync === 'object') {
|
|
125
|
+
const ws = manifest.workspaceSync;
|
|
126
|
+
if (ws.enabled) {
|
|
127
|
+
if (typeof ws.dir === 'string') {
|
|
128
|
+
normalizeArchivePath(ws.dir);
|
|
129
|
+
}
|
|
130
|
+
if (typeof ws.rulesFile === 'string') {
|
|
131
|
+
normalizeArchivePath(ws.rulesFile);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { manifest, manifestPath, entryPath };
|
|
136
|
+
}
|
|
137
|
+
async function collectRawFiles(root, dir = '') {
|
|
138
|
+
const absDir = path.join(root, dir);
|
|
139
|
+
const entries = await fs_1.promises.readdir(absDir, { withFileTypes: true });
|
|
140
|
+
const files = [];
|
|
141
|
+
for (const entry of entries) {
|
|
142
|
+
if (shouldExclude(entry.name)) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const rel = dir ? path.join(dir, entry.name) : entry.name;
|
|
146
|
+
const abs = path.join(root, rel);
|
|
147
|
+
if (entry.isDirectory()) {
|
|
148
|
+
files.push(...await collectRawFiles(root, rel));
|
|
149
|
+
}
|
|
150
|
+
else if (entry.isFile()) {
|
|
151
|
+
files.push({ rel: rel.replace(/\\/g, '/'), abs });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return files;
|
|
155
|
+
}
|
|
156
|
+
async function scanForSecrets(files) {
|
|
157
|
+
const findings = [];
|
|
158
|
+
for (const file of files) {
|
|
159
|
+
const stats = await fs_1.promises.stat(file.abs);
|
|
160
|
+
if (stats.size > 5 * 1024 * 1024) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const buffer = await fs_1.promises.readFile(file.abs);
|
|
164
|
+
if (buffer.includes(0)) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const text = buffer.toString('utf8');
|
|
168
|
+
for (const [label, pattern] of SECRET_PATTERNS) {
|
|
169
|
+
if (pattern.test(text)) {
|
|
170
|
+
findings.push(`${file.rel}: ${label}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return findings;
|
|
175
|
+
}
|
|
176
|
+
async function readSuggestedVersion(engineDir) {
|
|
177
|
+
const packageJsonPath = path.join(engineDir, 'package.json');
|
|
178
|
+
if (!(await (0, utils_1.pathExists)(packageJsonPath))) {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
const parsed = JSON.parse(await fs_1.promises.readFile(packageJsonPath, 'utf-8'));
|
|
183
|
+
if (parsed.version && /^\d+\.\d+\.\d+/.test(parsed.version)) {
|
|
184
|
+
return parsed.version;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Discover custom engines available to publish from workspace and home install roots.
|
|
194
|
+
*/
|
|
195
|
+
async function discoverPublishableEngines(workspaceRoot) {
|
|
196
|
+
const candidates = [];
|
|
197
|
+
if (workspaceRoot?.trim()) {
|
|
198
|
+
candidates.push({
|
|
199
|
+
root: path.join(path.resolve(workspaceRoot), branding_1.AGENTIDE_DIR_NAME, 'engines'),
|
|
200
|
+
label: 'workspace',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
candidates.push({
|
|
204
|
+
root: (0, install_1.getDefaultCustomEnginesInstallRoot)(),
|
|
205
|
+
label: 'home',
|
|
206
|
+
});
|
|
207
|
+
const byId = new Map();
|
|
208
|
+
for (const { root, label } of candidates) {
|
|
209
|
+
if (!(await (0, utils_1.pathExists)(root))) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const entries = await fs_1.promises.readdir(root, { withFileTypes: true });
|
|
213
|
+
for (const entry of entries) {
|
|
214
|
+
if (!entry.isDirectory() || shouldExclude(entry.name)) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const sourceDir = path.join(root, entry.name);
|
|
218
|
+
const manifestPath = path.join(sourceDir, ENGINE_MANIFEST_NAME);
|
|
219
|
+
if (!(await (0, utils_1.pathExists)(manifestPath))) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const { manifest } = await readEngineManifest(sourceDir);
|
|
224
|
+
const id = manifest.id;
|
|
225
|
+
if (byId.has(id)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
byId.set(id, {
|
|
229
|
+
id,
|
|
230
|
+
displayName: typeof manifest.displayName === 'string'
|
|
231
|
+
? manifest.displayName
|
|
232
|
+
: id,
|
|
233
|
+
sourceDir,
|
|
234
|
+
sourceLabel: label,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Skip malformed engine folders.
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Resolve an engine source directory by id from workspace or home roots.
|
|
246
|
+
*/
|
|
247
|
+
async function resolveEngineSourceDir(engineId, workspaceRoot) {
|
|
248
|
+
const discovered = await discoverPublishableEngines(workspaceRoot);
|
|
249
|
+
return discovered.find(engine => engine.id === engineId)?.sourceDir;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Validate a custom engine before publishing to the store.
|
|
253
|
+
*/
|
|
254
|
+
async function validateEngineForPublish(engineDir, expectedId) {
|
|
255
|
+
const errors = [];
|
|
256
|
+
const warnings = [];
|
|
257
|
+
if (!(await (0, utils_1.pathExists)(engineDir))) {
|
|
258
|
+
return {
|
|
259
|
+
valid: false,
|
|
260
|
+
errors: [`Engine directory not found: ${engineDir}`],
|
|
261
|
+
warnings,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
let manifest;
|
|
265
|
+
let entryPath;
|
|
266
|
+
try {
|
|
267
|
+
({ manifest, entryPath } = await readEngineManifest(engineDir));
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
271
|
+
return { valid: false, errors: [message], warnings };
|
|
272
|
+
}
|
|
273
|
+
const id = manifest.id;
|
|
274
|
+
if (expectedId && expectedId !== id) {
|
|
275
|
+
errors.push(`Engine folder id "${expectedId}" does not match manifest id "${id}"`);
|
|
276
|
+
}
|
|
277
|
+
const packageJsonPath = path.join(engineDir, 'package.json');
|
|
278
|
+
if (await (0, utils_1.pathExists)(packageJsonPath) && !(await (0, utils_1.pathExists)(path.join(engineDir, 'package-lock.json')))) {
|
|
279
|
+
errors.push('package.json present but package-lock.json is missing');
|
|
280
|
+
}
|
|
281
|
+
const rawFiles = await collectRawFiles(engineDir);
|
|
282
|
+
if (!rawFiles.some(file => file.rel === ENGINE_MANIFEST_NAME)) {
|
|
283
|
+
errors.push(`Missing ${ENGINE_MANIFEST_NAME} in publishable files`);
|
|
284
|
+
}
|
|
285
|
+
const secretFindings = await scanForSecrets(rawFiles);
|
|
286
|
+
if (secretFindings.length > 0) {
|
|
287
|
+
errors.push(`Possible secrets found:\n${secretFindings.map(f => ` - ${f}`).join('\n')}`);
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
await execFileAsync(process.execPath, ['--check', entryPath], { windowsHide: true });
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
294
|
+
errors.push(`engine entry failed node --check: ${message}`);
|
|
295
|
+
}
|
|
296
|
+
if (!manifest.description) {
|
|
297
|
+
warnings.push('Consider adding description to engine.manifest.json');
|
|
298
|
+
}
|
|
299
|
+
const suggestedVersion = await readSuggestedVersion(engineDir);
|
|
300
|
+
if (!suggestedVersion) {
|
|
301
|
+
warnings.push('No package.json version found; you will be prompted for a publish version');
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
valid: errors.length === 0,
|
|
305
|
+
errors,
|
|
306
|
+
warnings,
|
|
307
|
+
metadata: errors.length === 0
|
|
308
|
+
? {
|
|
309
|
+
id,
|
|
310
|
+
displayName: typeof manifest.displayName === 'string' ? manifest.displayName : id,
|
|
311
|
+
description: typeof manifest.description === 'string' ? manifest.description : undefined,
|
|
312
|
+
suggestedVersion,
|
|
313
|
+
}
|
|
314
|
+
: undefined,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Collect publishable engine files (text) for fork + PR upload.
|
|
319
|
+
*/
|
|
320
|
+
async function collectEngineFiles(engineDir) {
|
|
321
|
+
const rawFiles = await collectRawFiles(engineDir);
|
|
322
|
+
const files = [];
|
|
323
|
+
for (const file of rawFiles) {
|
|
324
|
+
const stats = await fs_1.promises.stat(file.abs);
|
|
325
|
+
if (stats.size > 5 * 1024 * 1024) {
|
|
326
|
+
throw new Error(`File too large to publish (>5MB): ${file.rel}`);
|
|
327
|
+
}
|
|
328
|
+
const buffer = await fs_1.promises.readFile(file.abs);
|
|
329
|
+
if (buffer.includes(0)) {
|
|
330
|
+
throw new Error(`Binary file cannot be published as text: ${file.rel}`);
|
|
331
|
+
}
|
|
332
|
+
files.push({
|
|
333
|
+
path: file.rel,
|
|
334
|
+
content: buffer.toString('utf8'),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return files;
|
|
338
|
+
}
|
|
339
|
+
function isValidPublishVersion(version) {
|
|
340
|
+
return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version.trim());
|
|
341
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getEngineForModel = exports.getProviderForModel = exports.getEnginesCompatibleWithProvider = exports.getAgentEngine = exports.getModel = exports.getProvider = exports.AGENT_ENGINES = exports.BUILTIN_MODELS = exports.PROVIDERS = void 0;
|
|
7
|
+
// Re-export shared types
|
|
8
|
+
var shared_1 = require("../shared");
|
|
9
|
+
Object.defineProperty(exports, "PROVIDERS", { enumerable: true, get: function () { return shared_1.PROVIDERS; } });
|
|
10
|
+
Object.defineProperty(exports, "BUILTIN_MODELS", { enumerable: true, get: function () { return shared_1.BUILTIN_MODELS; } });
|
|
11
|
+
Object.defineProperty(exports, "AGENT_ENGINES", { enumerable: true, get: function () { return shared_1.AGENT_ENGINES; } });
|
|
12
|
+
Object.defineProperty(exports, "getProvider", { enumerable: true, get: function () { return shared_1.getProvider; } });
|
|
13
|
+
Object.defineProperty(exports, "getModel", { enumerable: true, get: function () { return shared_1.getModel; } });
|
|
14
|
+
Object.defineProperty(exports, "getAgentEngine", { enumerable: true, get: function () { return shared_1.getAgentEngine; } });
|
|
15
|
+
Object.defineProperty(exports, "getEnginesCompatibleWithProvider", { enumerable: true, get: function () { return shared_1.getEnginesCompatibleWithProvider; } });
|
|
16
|
+
Object.defineProperty(exports, "getProviderForModel", { enumerable: true, get: function () { return shared_1.getProviderForModel; } });
|
|
17
|
+
Object.defineProperty(exports, "getEngineForModel", { enumerable: true, get: function () { return shared_1.getEngineForModel; } });
|