@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,805 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.GatewayBridge = void 0;
|
|
10
|
+
exports.isIdeThreadCompositeRouteKey = isIdeThreadCompositeRouteKey;
|
|
11
|
+
exports.parseIdeThreadIdFromCompositeRouteKey = parseIdeThreadIdFromCompositeRouteKey;
|
|
12
|
+
exports.buildIdeSessionRouteKey = buildIdeSessionRouteKey;
|
|
13
|
+
exports.extractRouteLabelFromGatewaySessionKey = extractRouteLabelFromGatewaySessionKey;
|
|
14
|
+
exports.looksLikeGatewayChannelRouteKey = looksLikeGatewayChannelRouteKey;
|
|
15
|
+
exports.createGatewayBridge = createGatewayBridge;
|
|
16
|
+
/* eslint-disable local/code-no-unexternalized-strings */
|
|
17
|
+
/**
|
|
18
|
+
* Gateway Bridge - Connects AgentIDE agents to OpenClaw Gateway
|
|
19
|
+
*
|
|
20
|
+
* This allows IDE agents to receive messages from messaging channels
|
|
21
|
+
* (WhatsApp, Telegram, Discord, etc.) via the OpenClaw Gateway.
|
|
22
|
+
*
|
|
23
|
+
* The bridge's responsibility is to:
|
|
24
|
+
* 1. Maintain a WebSocket connection to the Gateway
|
|
25
|
+
* 2. Forward incoming messages to the existing chat system
|
|
26
|
+
* 3. Stream responses back to the Gateway
|
|
27
|
+
*
|
|
28
|
+
* It does NOT handle API keys or run agents directly - that's the chat system's job.
|
|
29
|
+
*/
|
|
30
|
+
const events_1 = require("events");
|
|
31
|
+
const client_js_1 = require("./client.js");
|
|
32
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
33
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
34
|
+
const outboundHandles_js_1 = require("./outboundHandles.js");
|
|
35
|
+
const outboundPaths_js_1 = require("./outboundPaths.js");
|
|
36
|
+
/**
|
|
37
|
+
* Key for {@link GatewayService} session map. When the gateway sends the same `sessionKey` for
|
|
38
|
+
* an agent main session but different `sessionId` values (e.g. CLI `--session-id`), combine them
|
|
39
|
+
* so each logical thread gets its own VS Code chat.
|
|
40
|
+
*/
|
|
41
|
+
const IDE_THREAD_ROUTE_MARKER = "::sid:";
|
|
42
|
+
/** True when {@link buildIdeSessionRouteKey} combined gateway `sessionKey` + `sessionId` (e.g. CLI `--session-id`). */
|
|
43
|
+
function isIdeThreadCompositeRouteKey(routeKey) {
|
|
44
|
+
return Boolean(routeKey?.includes(IDE_THREAD_ROUTE_MARKER));
|
|
45
|
+
}
|
|
46
|
+
/** Extract the `sessionId` segment from a composite route key (`...::sid:<id>`). */
|
|
47
|
+
function parseIdeThreadIdFromCompositeRouteKey(routeKey) {
|
|
48
|
+
if (!routeKey || !isIdeThreadCompositeRouteKey(routeKey)) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const idx = routeKey.lastIndexOf(IDE_THREAD_ROUTE_MARKER);
|
|
52
|
+
const id = routeKey.slice(idx + IDE_THREAD_ROUTE_MARKER.length).trim();
|
|
53
|
+
return id.length > 0 ? id : undefined;
|
|
54
|
+
}
|
|
55
|
+
function buildIdeSessionRouteKey(sessionKey, sessionId) {
|
|
56
|
+
const sk = sessionKey?.trim();
|
|
57
|
+
const sid = sessionId?.trim();
|
|
58
|
+
if (sk && sid) {
|
|
59
|
+
return `${sk}${IDE_THREAD_ROUTE_MARKER}${sid}`;
|
|
60
|
+
}
|
|
61
|
+
return sk || sid;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Tail of `agent:<agentId>:<route-label>` used for channel/dm/thread peer routing.
|
|
65
|
+
* CLI `openclaw agent --session-id <label>` uses the same shape (see OpenClaw `toAgentStoreSessionKey`).
|
|
66
|
+
*/
|
|
67
|
+
function extractRouteLabelFromGatewaySessionKey(gatewaySessionKey) {
|
|
68
|
+
const trimmed = gatewaySessionKey.trim();
|
|
69
|
+
const prefix = "agent:";
|
|
70
|
+
if (!trimmed.toLowerCase().startsWith(prefix)) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const without = trimmed.slice(prefix.length);
|
|
74
|
+
const firstColon = without.indexOf(":");
|
|
75
|
+
if (firstColon < 0) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const rest = without.slice(firstColon + 1).trim();
|
|
79
|
+
return rest.length > 0 ? rest : undefined;
|
|
80
|
+
}
|
|
81
|
+
/** True when the gateway session key encodes a distinct messaging peer (Slack channel, DM, thread, etc.). */
|
|
82
|
+
function looksLikeGatewayChannelRouteKey(routeKey) {
|
|
83
|
+
const baseKey = routeKey && routeKey.includes(IDE_THREAD_ROUTE_MARKER)
|
|
84
|
+
? routeKey.slice(0, routeKey.lastIndexOf(IDE_THREAD_ROUTE_MARKER))
|
|
85
|
+
: routeKey;
|
|
86
|
+
const label = baseKey ? (extractRouteLabelFromGatewaySessionKey(baseKey) ?? baseKey) : undefined;
|
|
87
|
+
const parts = label?.split(":").filter(Boolean) ?? [];
|
|
88
|
+
if (parts.length < 2) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return ["channel", "chat", "dm", "group", "thread", "user"].includes(parts[1].trim().toLowerCase());
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Bridge that connects AgentIDE agents to OpenClaw Gateway.
|
|
95
|
+
*
|
|
96
|
+
* Usage:
|
|
97
|
+
* 1. Create bridge with Gateway URL
|
|
98
|
+
* 2. Connect to Gateway
|
|
99
|
+
* 3. Register agents with their HeadlessRunner instances
|
|
100
|
+
* 4. Gateway will route incoming messages to registered agents
|
|
101
|
+
*/
|
|
102
|
+
class GatewayBridge extends events_1.EventEmitter {
|
|
103
|
+
options;
|
|
104
|
+
client;
|
|
105
|
+
clientInfo;
|
|
106
|
+
agents = new Map();
|
|
107
|
+
serverConnId = null;
|
|
108
|
+
/**
|
|
109
|
+
* Some OpenClaw builds don't expose remote agent management RPCs.
|
|
110
|
+
* When absent, keep a local registry and continue in compatibility mode.
|
|
111
|
+
*/
|
|
112
|
+
supportsAgentRegistration = null;
|
|
113
|
+
isUnknownMethodError(err) {
|
|
114
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
115
|
+
return message.toLowerCase().includes("unknown method");
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Ensure the gateway runtime external-agent registry has this agent (CLI `agent` / `chat.send`
|
|
119
|
+
* use `isExternalAgent`). OpenClaw also registers on `agents.create` / `agents.update`, but
|
|
120
|
+
* calling `agents.register` here keeps older/partial gateway builds and reconnect races aligned.
|
|
121
|
+
*/
|
|
122
|
+
async ensureGatewayRuntimeRegistration(agent, workspaceDir) {
|
|
123
|
+
try {
|
|
124
|
+
await this.client.request("agents.register", {
|
|
125
|
+
agent: {
|
|
126
|
+
id: agent.id,
|
|
127
|
+
name: agent.name ?? agent.id,
|
|
128
|
+
workspace: workspaceDir,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (this.isUnknownMethodError(err)) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.log(`agents.register follow-up failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
constructor(options) {
|
|
140
|
+
super();
|
|
141
|
+
this.options = options;
|
|
142
|
+
// Avoid process crash when socket errors propagate and no consumer listens on the bridge.
|
|
143
|
+
this.on("error", () => undefined);
|
|
144
|
+
const { client, clientInfo } = (0, client_js_1.createAgentIDEGatewayClient)(options.gatewayUrl, options.token, options.version);
|
|
145
|
+
this.client = client;
|
|
146
|
+
this.clientInfo = clientInfo;
|
|
147
|
+
this.setupEventHandlers();
|
|
148
|
+
}
|
|
149
|
+
setupEventHandlers() {
|
|
150
|
+
this.client.on("connected", async (hello) => {
|
|
151
|
+
this.serverConnId = hello.server.connId;
|
|
152
|
+
this.log(`Connected to Gateway (connId=${this.serverConnId})`);
|
|
153
|
+
this.emit("connected", hello);
|
|
154
|
+
// Re-register agents after reconnect
|
|
155
|
+
if (this.agents.size > 0) {
|
|
156
|
+
await this.reregisterAllAgents();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
this.client.on("disconnected", () => {
|
|
160
|
+
this.log("Disconnected from Gateway");
|
|
161
|
+
this.emit("disconnected");
|
|
162
|
+
});
|
|
163
|
+
this.client.on("error", (err) => {
|
|
164
|
+
this.log(`Gateway error: ${err.message}`);
|
|
165
|
+
this.emit("error", err);
|
|
166
|
+
});
|
|
167
|
+
this.client.on("reconnecting", (attempt) => {
|
|
168
|
+
this.log(`Reconnecting to Gateway (attempt ${attempt})...`);
|
|
169
|
+
this.emit("reconnecting", attempt);
|
|
170
|
+
});
|
|
171
|
+
// Handle server-initiated requests (e.g., agent.run)
|
|
172
|
+
this.client.on("request", (frame) => {
|
|
173
|
+
this.handleServerRequest(frame);
|
|
174
|
+
});
|
|
175
|
+
// Handle events from Gateway
|
|
176
|
+
this.client.on("event:agents.updated", (payload) => {
|
|
177
|
+
this.emit("agents.updated", payload);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Connect to the OpenClaw Gateway
|
|
182
|
+
*/
|
|
183
|
+
async connect() {
|
|
184
|
+
this.log(`Connecting to Gateway at ${this.options.gatewayUrl}...`);
|
|
185
|
+
return this.client.connect(this.clientInfo);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Register an agent with the Gateway.
|
|
189
|
+
* The agent will receive messages routed to its ID.
|
|
190
|
+
*/
|
|
191
|
+
async registerAgent(agent) {
|
|
192
|
+
if (this.agents.has(agent.id)) {
|
|
193
|
+
throw new Error(`Agent ${agent.id} is already registered`);
|
|
194
|
+
}
|
|
195
|
+
// `agents.create` / `agents.update` require a filesystem `workspace` directory.
|
|
196
|
+
// The IDE's VS Code workspace path is not what OpenClaw isolated-agent runners expect.
|
|
197
|
+
const workspaceDir = (agent.workspace ?? this.resolveOpenClawWorkspaceDir(agent.id)).trim();
|
|
198
|
+
const syncConfigAgent = agent.syncOpenClawConfigAgent !== false;
|
|
199
|
+
if (!syncConfigAgent) {
|
|
200
|
+
await this.ensureGatewayRuntimeRegistration(agent, workspaceDir);
|
|
201
|
+
}
|
|
202
|
+
else if (this.supportsAgentRegistration === false) {
|
|
203
|
+
this.log(`Gateway remote agent management unavailable; using local registration for ${agent.id}`);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
try {
|
|
207
|
+
await this.client.request("agents.create", {
|
|
208
|
+
name: agent.id,
|
|
209
|
+
workspace: workspaceDir,
|
|
210
|
+
});
|
|
211
|
+
this.supportsAgentRegistration = true;
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
215
|
+
if (this.isUnknownMethodError(err)) {
|
|
216
|
+
this.supportsAgentRegistration = false;
|
|
217
|
+
this.log(`Gateway remote agent management rejected (unknown method); using local registration for ${agent.id}`);
|
|
218
|
+
}
|
|
219
|
+
else if (message.toLowerCase().includes("already exists")) {
|
|
220
|
+
// Make registration idempotent across reconnects.
|
|
221
|
+
await this.client.request("agents.update", {
|
|
222
|
+
agentId: agent.id,
|
|
223
|
+
workspace: workspaceDir,
|
|
224
|
+
name: agent.name ?? agent.id,
|
|
225
|
+
});
|
|
226
|
+
this.supportsAgentRegistration = true;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
throw err;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
await this.ensureGatewayRuntimeRegistration(agent, workspaceDir);
|
|
233
|
+
}
|
|
234
|
+
this.agents.set(agent.id, agent);
|
|
235
|
+
this.log(`Registered agent: ${agent.id}`);
|
|
236
|
+
this.emit("agent.registered", agent.id, { needsBinding: true });
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Re-register all agents after reconnection
|
|
240
|
+
*/
|
|
241
|
+
async reregisterAllAgents() {
|
|
242
|
+
this.log(`Re-registering ${this.agents.size} agent(s) after reconnect...`);
|
|
243
|
+
for (const agent of this.agents.values()) {
|
|
244
|
+
try {
|
|
245
|
+
if (agent.syncOpenClawConfigAgent === false) {
|
|
246
|
+
const workspaceDir = (agent.workspace ?? this.resolveOpenClawWorkspaceDir(agent.id)).trim();
|
|
247
|
+
await this.ensureGatewayRuntimeRegistration(agent, workspaceDir);
|
|
248
|
+
this.log(`Re-registered runtime agent: ${agent.id}`);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (this.supportsAgentRegistration === false) {
|
|
252
|
+
this.log(`Skipping remote re-register for ${agent.id} (gateway compatibility mode)`);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const workspaceDir = (agent.workspace ?? this.resolveOpenClawWorkspaceDir(agent.id)).trim();
|
|
256
|
+
try {
|
|
257
|
+
await this.client.request("agents.create", { name: agent.id, workspace: workspaceDir });
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
261
|
+
if (message.toLowerCase().includes("already exists")) {
|
|
262
|
+
await this.client.request("agents.update", {
|
|
263
|
+
agentId: agent.id,
|
|
264
|
+
workspace: workspaceDir,
|
|
265
|
+
name: agent.name ?? agent.id,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
throw err;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
await this.ensureGatewayRuntimeRegistration(agent, workspaceDir);
|
|
273
|
+
this.supportsAgentRegistration = true;
|
|
274
|
+
this.log(`Re-registered agent: ${agent.id}`);
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
if (this.isUnknownMethodError(err)) {
|
|
278
|
+
this.supportsAgentRegistration = false;
|
|
279
|
+
this.log(`Gateway rejected remote agent management during reconnect (unknown method); keeping local registration for ${agent.id}`);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
this.log(`Failed to re-register agent ${agent.id}: ${err}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (this.supportsAgentRegistration === false) {
|
|
286
|
+
this.log("Gateway compatibility mode active: inbound routing relies on plugin/session bridge, not agents.register.");
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Unregister an agent from the Gateway
|
|
291
|
+
*/
|
|
292
|
+
async unregisterAgent(agentId) {
|
|
293
|
+
const agent = this.agents.get(agentId);
|
|
294
|
+
if (!agent) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
if (this.supportsAgentRegistration === false) {
|
|
299
|
+
this.agents.delete(agentId);
|
|
300
|
+
this.log(`Unregistered local agent: ${agentId} (gateway compatibility mode)`);
|
|
301
|
+
this.emit("agent.unregistered", agentId);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
await this.client.request("agents.delete", { agentId, deleteFiles: false }, 30_000);
|
|
305
|
+
this.agents.delete(agentId);
|
|
306
|
+
this.log(`Unregistered agent: ${agentId}`);
|
|
307
|
+
this.emit("agent.unregistered", agentId);
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
if (this.isUnknownMethodError(err)) {
|
|
311
|
+
this.supportsAgentRegistration = false;
|
|
312
|
+
this.agents.delete(agentId);
|
|
313
|
+
this.log(`Gateway rejected remote agent management delete (unknown method); removed local agent ${agentId} instead`);
|
|
314
|
+
this.emit("agent.unregistered", agentId);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
this.log(`Failed to unregister agent ${agentId}: ${err}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
isGatewayCompatMode() {
|
|
321
|
+
return this.supportsAgentRegistration === false;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* OpenClaw isolated agent workspace layout:
|
|
325
|
+
* - `main` uses `~/.openclaw/workspace`
|
|
326
|
+
* - other agents use `~/.openclaw/workspace-<agentId>`
|
|
327
|
+
*/
|
|
328
|
+
resolveOpenClawWorkspaceDir(agentId) {
|
|
329
|
+
const root = node_path_1.default.join(node_os_1.default.homedir(), ".openclaw");
|
|
330
|
+
return agentId === "main" ? node_path_1.default.join(root, "workspace") : node_path_1.default.join(root, `workspace-${agentId}`);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Handle server-initiated requests
|
|
334
|
+
*/
|
|
335
|
+
async handleServerRequest(frame) {
|
|
336
|
+
if (frame.method === "agent.run") {
|
|
337
|
+
await this.handleAgentRun(frame);
|
|
338
|
+
}
|
|
339
|
+
else if (frame.method === "session.new") {
|
|
340
|
+
await this.handleSessionNew(frame);
|
|
341
|
+
}
|
|
342
|
+
else if (frame.method === "agent.cancel") {
|
|
343
|
+
this.handleAgentCancel(frame);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
// Unknown method
|
|
347
|
+
this.client.respond(frame.id, undefined, false, { code: "UNKNOWN_METHOD", message: `Unknown method: ${frame.method}` });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Handle agent.cancel request from Gateway.
|
|
352
|
+
* Emits an event for the service to cancel the current generation.
|
|
353
|
+
*/
|
|
354
|
+
handleAgentCancel(frame) {
|
|
355
|
+
const params = frame.params;
|
|
356
|
+
this.log(`Received agent.cancel (agentId=${params?.agentId}, sessionKey=${params?.sessionKey})`);
|
|
357
|
+
this.emit("agent.cancel", params);
|
|
358
|
+
// Respond immediately - cancel is best-effort
|
|
359
|
+
this.client.respond(frame.id, { success: true }, true);
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Handle session.new request from Gateway.
|
|
363
|
+
* Emits an event for the service to handle creating a new chat session.
|
|
364
|
+
*/
|
|
365
|
+
async handleSessionNew(frame) {
|
|
366
|
+
const params = frame.params;
|
|
367
|
+
this.log(`Received session.new request from ${params?.requestedBy ?? "unknown"}`);
|
|
368
|
+
// Emit event for the service to handle
|
|
369
|
+
// The service will create a new session and register it
|
|
370
|
+
this.emit("session.new.request", {
|
|
371
|
+
requestId: frame.id,
|
|
372
|
+
params: params ?? {},
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Respond to a session.new request.
|
|
377
|
+
* Called by the service after it has created (or failed to create) the session.
|
|
378
|
+
*/
|
|
379
|
+
respondSessionNew(requestId, result) {
|
|
380
|
+
this.client.respond(requestId, result, result.success, result.success ? undefined : {
|
|
381
|
+
code: "SESSION_CREATE_ERROR",
|
|
382
|
+
message: result.error ?? "Failed to create session",
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
persistHeadlessGatewayOutbound(agent, agentId, params, runId, routeKey) {
|
|
386
|
+
const workspaceRoot = agent.workspace?.trim();
|
|
387
|
+
if (!workspaceRoot) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const gatewaySessionKey = params.sessionKey?.trim() || routeKey;
|
|
391
|
+
const sessionDirId = (0, outboundPaths_js_1.resolveGatewaySessionDirId)({ gatewaySessionKey });
|
|
392
|
+
if (!sessionDirId) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const storePath = (0, outboundPaths_js_1.getGatewayOutboundFilePath)(workspaceRoot, sessionDirId);
|
|
396
|
+
const storeAgentId = agent.agentId?.trim() || agentId;
|
|
397
|
+
void (0, outboundHandles_js_1.upsertGatewayOutboundHandle)(storePath, storeAgentId, params, runId, { gatewayAgentId: agentId })
|
|
398
|
+
.then((handle) => {
|
|
399
|
+
if (handle) {
|
|
400
|
+
this.log(`Gateway outbound routes: ${storePath}`);
|
|
401
|
+
}
|
|
402
|
+
})
|
|
403
|
+
.catch((err) => {
|
|
404
|
+
this.log(`Failed to persist outbound handle: ${err instanceof Error ? err.message : String(err)}`);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Handle agent.run request from Gateway
|
|
409
|
+
*/
|
|
410
|
+
async handleAgentRun(frame) {
|
|
411
|
+
const params = frame.params;
|
|
412
|
+
if (!params?.message) {
|
|
413
|
+
this.client.respond(frame.id, undefined, false, { code: "INVALID_PARAMS", message: "message is required" });
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
const agentId = params.agentId || this.getDefaultAgentId();
|
|
417
|
+
if (!agentId) {
|
|
418
|
+
this.client.respond(frame.id, undefined, false, { code: "NO_AGENT", message: "No agent available" });
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
const agent = this.agents.get(agentId);
|
|
422
|
+
if (!agent) {
|
|
423
|
+
this.client.respond(frame.id, undefined, false, { code: "AGENT_NOT_FOUND", message: `Agent ${agentId} not found` });
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
this.log(`Running agent ${agentId} for message: ${params.message.slice(0, 50)}...`);
|
|
427
|
+
// Emit event so UI can show the incoming message
|
|
428
|
+
const routeKey = buildIdeSessionRouteKey(params.sessionKey, params.sessionId);
|
|
429
|
+
const runId = params.idempotencyKey || `${agentId}-${Date.now()}`;
|
|
430
|
+
this.emit("agent.message", {
|
|
431
|
+
agentId,
|
|
432
|
+
message: params.message,
|
|
433
|
+
channel: params.channel,
|
|
434
|
+
sessionKey: params.sessionKey,
|
|
435
|
+
sessionId: params.sessionId,
|
|
436
|
+
routeKey,
|
|
437
|
+
});
|
|
438
|
+
try {
|
|
439
|
+
// runId assigned above for outbound handle persistence
|
|
440
|
+
// When useChatUI is true, route to Chat UI handler exclusively.
|
|
441
|
+
// The gateway is purely a transport layer - it doesn't care about model IDs.
|
|
442
|
+
const shouldUseChatUI = Boolean(agent.useChatUI && agent.chatUIHandler);
|
|
443
|
+
if (shouldUseChatUI) {
|
|
444
|
+
this.log(`Routing gateway message to Chat UI for agent ${agentId} (routeKey=${routeKey ?? "none"})`);
|
|
445
|
+
await this.handleAgentRunViaChatUI(frame, agent, params, runId, routeKey);
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
// Fallback: use direct message handler (requires engine/model config)
|
|
449
|
+
const engineId = agent.engineId || "claude";
|
|
450
|
+
// Check if we have a message handler
|
|
451
|
+
if (!agent.messageHandler) {
|
|
452
|
+
throw new Error("No message handler configured for agent");
|
|
453
|
+
}
|
|
454
|
+
this.log(`Agent ${agentId} processing message via direct handler, engine=${engineId}`);
|
|
455
|
+
this.persistHeadlessGatewayOutbound(agent, agentId, params, runId, routeKey);
|
|
456
|
+
// Capture client for use in emitter callbacks
|
|
457
|
+
const client = this.client;
|
|
458
|
+
let fullText = "";
|
|
459
|
+
let lastSentText = "";
|
|
460
|
+
let lastStreamTime = 0;
|
|
461
|
+
let inThinking = false;
|
|
462
|
+
const STREAM_THROTTLE_MS = 150;
|
|
463
|
+
const streamSessionKey = routeKey;
|
|
464
|
+
// Send accumulated text when it changed since the last delta (bypasses throttle).
|
|
465
|
+
// Called before block boundaries so OpenClaw block/final dedupe sees current text.
|
|
466
|
+
const flushStreamDelta = () => {
|
|
467
|
+
if (fullText === lastSentText) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
lastSentText = fullText;
|
|
471
|
+
lastStreamTime = Date.now();
|
|
472
|
+
client.sendEvent("agent.stream", {
|
|
473
|
+
runId,
|
|
474
|
+
agentId,
|
|
475
|
+
sessionKey: streamSessionKey,
|
|
476
|
+
state: "delta",
|
|
477
|
+
text: fullText,
|
|
478
|
+
});
|
|
479
|
+
};
|
|
480
|
+
// Create emitter that streams to Gateway
|
|
481
|
+
const emitter = {
|
|
482
|
+
async thinking() {
|
|
483
|
+
// Signal thinking start so the gateway can emit accumulated text
|
|
484
|
+
// as a block reply (natural break between text and thinking).
|
|
485
|
+
// Only send once per text→thinking transition to avoid flooding.
|
|
486
|
+
if (!inThinking) {
|
|
487
|
+
flushStreamDelta();
|
|
488
|
+
inThinking = true;
|
|
489
|
+
client.sendEvent("agent.stream", {
|
|
490
|
+
runId,
|
|
491
|
+
agentId,
|
|
492
|
+
sessionKey: streamSessionKey,
|
|
493
|
+
state: "thinking",
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
async text(delta) {
|
|
498
|
+
inThinking = false;
|
|
499
|
+
fullText += delta;
|
|
500
|
+
// Throttle streaming to Gateway
|
|
501
|
+
const now = Date.now();
|
|
502
|
+
if (now - lastStreamTime >= STREAM_THROTTLE_MS) {
|
|
503
|
+
flushStreamDelta();
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
async toolStart(name) {
|
|
507
|
+
flushStreamDelta();
|
|
508
|
+
client.sendEvent("agent.stream", {
|
|
509
|
+
runId,
|
|
510
|
+
agentId,
|
|
511
|
+
sessionKey: streamSessionKey,
|
|
512
|
+
state: "tool",
|
|
513
|
+
toolName: name,
|
|
514
|
+
toolState: "start",
|
|
515
|
+
});
|
|
516
|
+
},
|
|
517
|
+
async toolEnd(name) {
|
|
518
|
+
client.sendEvent("agent.stream", {
|
|
519
|
+
runId,
|
|
520
|
+
agentId,
|
|
521
|
+
sessionKey: streamSessionKey,
|
|
522
|
+
state: "tool",
|
|
523
|
+
toolName: name,
|
|
524
|
+
toolState: "end",
|
|
525
|
+
});
|
|
526
|
+
},
|
|
527
|
+
async progress(msg) {
|
|
528
|
+
client.sendEvent("agent.stream", {
|
|
529
|
+
runId,
|
|
530
|
+
agentId,
|
|
531
|
+
sessionKey: streamSessionKey,
|
|
532
|
+
state: "progress",
|
|
533
|
+
message: msg,
|
|
534
|
+
});
|
|
535
|
+
},
|
|
536
|
+
async question(payload) {
|
|
537
|
+
client.sendEvent("agent.stream", {
|
|
538
|
+
runId,
|
|
539
|
+
agentId,
|
|
540
|
+
sessionKey: streamSessionKey,
|
|
541
|
+
state: "progress",
|
|
542
|
+
message: `Question: ${payload.prompt}`,
|
|
543
|
+
});
|
|
544
|
+
return {
|
|
545
|
+
selected: [],
|
|
546
|
+
freeText: null,
|
|
547
|
+
declined: true,
|
|
548
|
+
};
|
|
549
|
+
},
|
|
550
|
+
async error(msg) {
|
|
551
|
+
fullText += `\n[Error: ${msg}]`;
|
|
552
|
+
client.sendEvent("agent.stream", {
|
|
553
|
+
runId,
|
|
554
|
+
agentId,
|
|
555
|
+
sessionKey: streamSessionKey,
|
|
556
|
+
state: "error",
|
|
557
|
+
message: msg,
|
|
558
|
+
});
|
|
559
|
+
},
|
|
560
|
+
async done() { },
|
|
561
|
+
};
|
|
562
|
+
// Call the message handler (goes through the chat system with API keys, sessions, etc.)
|
|
563
|
+
const result = await agent.messageHandler(params.message, {
|
|
564
|
+
engineId,
|
|
565
|
+
sessionId: routeKey,
|
|
566
|
+
gatewaySessionKey: params.sessionKey,
|
|
567
|
+
workspaceRoot: agent.workspace,
|
|
568
|
+
emitter,
|
|
569
|
+
// Forward the channel sender so serve can map it to a per-user user_id (serve-v3 #4).
|
|
570
|
+
peerInfo: (params.senderUsername || params.senderName || params.senderId || params.channel)
|
|
571
|
+
? { senderUsername: params.senderUsername, senderName: params.senderName, senderId: params.senderId, channel: params.channel }
|
|
572
|
+
: undefined,
|
|
573
|
+
});
|
|
574
|
+
if (!result.success && result.error) {
|
|
575
|
+
throw new Error(result.error);
|
|
576
|
+
}
|
|
577
|
+
this.log(`Agent ${agentId} completed: fullText.len=${fullText?.length || 0}`);
|
|
578
|
+
if (!fullText) {
|
|
579
|
+
this.log(`WARNING: Agent ${agentId} produced empty response!`);
|
|
580
|
+
}
|
|
581
|
+
flushStreamDelta();
|
|
582
|
+
const response = {
|
|
583
|
+
text: fullText,
|
|
584
|
+
runId: params.idempotencyKey,
|
|
585
|
+
};
|
|
586
|
+
this.client.respond(frame.id, response, true);
|
|
587
|
+
this.log(`Agent ${agentId} completed successfully, response length=${fullText.length}`);
|
|
588
|
+
// Emit event with response for UI
|
|
589
|
+
this.emit("agent.response", {
|
|
590
|
+
agentId,
|
|
591
|
+
message: params.message,
|
|
592
|
+
response: fullText,
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
catch (err) {
|
|
596
|
+
this.client.respond(frame.id, undefined, false, {
|
|
597
|
+
code: "AGENT_ERROR",
|
|
598
|
+
message: err instanceof Error ? err.message : String(err),
|
|
599
|
+
});
|
|
600
|
+
this.log(`Agent ${agentId} failed: ${err}`);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Handle agent.run via Chat UI - routes message to VS Code chat panel
|
|
605
|
+
* and captures the response to send back to Gateway.
|
|
606
|
+
*
|
|
607
|
+
* This is the pure transport mode: gateway doesn't care about model IDs,
|
|
608
|
+
* the Chat UI handles everything.
|
|
609
|
+
*/
|
|
610
|
+
async handleAgentRunViaChatUI(frame, agent, params, runId, sessionKey) {
|
|
611
|
+
const agentId = agent.id;
|
|
612
|
+
const client = this.client;
|
|
613
|
+
this.log(`handleAgentRunViaChatUI: agentId=${agentId}, message="${params.message.slice(0, 50)}...", runId=${runId}`);
|
|
614
|
+
// Create emitter that streams to Gateway - NO THROTTLE for real-time streaming
|
|
615
|
+
// Accumulate text because Control UI expects accumulated text per chunk (not deltas)
|
|
616
|
+
let fullText = "";
|
|
617
|
+
let inThinking = false;
|
|
618
|
+
const emitter = {
|
|
619
|
+
async thinking() {
|
|
620
|
+
// Signal thinking start so the gateway can emit accumulated text
|
|
621
|
+
// as a block reply. Only send once per text→thinking transition.
|
|
622
|
+
if (!inThinking) {
|
|
623
|
+
inThinking = true;
|
|
624
|
+
client.sendEvent("agent.stream", {
|
|
625
|
+
runId,
|
|
626
|
+
agentId,
|
|
627
|
+
sessionKey,
|
|
628
|
+
state: "thinking",
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
},
|
|
632
|
+
async text(delta) {
|
|
633
|
+
inThinking = false;
|
|
634
|
+
fullText += delta;
|
|
635
|
+
// Stream accumulated text - Control UI expects full text per chunk
|
|
636
|
+
client.sendEvent("agent.stream", {
|
|
637
|
+
runId,
|
|
638
|
+
agentId,
|
|
639
|
+
sessionKey,
|
|
640
|
+
state: "delta",
|
|
641
|
+
text: fullText, // Send accumulated, not delta
|
|
642
|
+
});
|
|
643
|
+
},
|
|
644
|
+
async toolStart(name) {
|
|
645
|
+
client.sendEvent("agent.stream", {
|
|
646
|
+
runId,
|
|
647
|
+
agentId,
|
|
648
|
+
sessionKey,
|
|
649
|
+
state: "tool",
|
|
650
|
+
toolName: name,
|
|
651
|
+
toolState: "start",
|
|
652
|
+
});
|
|
653
|
+
},
|
|
654
|
+
async toolEnd(name) {
|
|
655
|
+
client.sendEvent("agent.stream", {
|
|
656
|
+
runId,
|
|
657
|
+
agentId,
|
|
658
|
+
sessionKey,
|
|
659
|
+
state: "tool",
|
|
660
|
+
toolName: name,
|
|
661
|
+
toolState: "end",
|
|
662
|
+
});
|
|
663
|
+
},
|
|
664
|
+
async progress(msg) {
|
|
665
|
+
client.sendEvent("agent.stream", {
|
|
666
|
+
runId,
|
|
667
|
+
agentId,
|
|
668
|
+
sessionKey,
|
|
669
|
+
state: "progress",
|
|
670
|
+
message: msg,
|
|
671
|
+
});
|
|
672
|
+
},
|
|
673
|
+
async question(payload) {
|
|
674
|
+
client.sendEvent("agent.stream", {
|
|
675
|
+
runId,
|
|
676
|
+
agentId,
|
|
677
|
+
sessionKey,
|
|
678
|
+
state: "progress",
|
|
679
|
+
message: `Question: ${payload.prompt}`,
|
|
680
|
+
});
|
|
681
|
+
return {
|
|
682
|
+
selected: [],
|
|
683
|
+
freeText: null,
|
|
684
|
+
declined: true,
|
|
685
|
+
};
|
|
686
|
+
},
|
|
687
|
+
async error(msg) {
|
|
688
|
+
fullText += `\n[Error: ${msg}]`;
|
|
689
|
+
client.sendEvent("agent.stream", {
|
|
690
|
+
runId,
|
|
691
|
+
agentId,
|
|
692
|
+
sessionKey,
|
|
693
|
+
state: "error",
|
|
694
|
+
message: msg,
|
|
695
|
+
});
|
|
696
|
+
},
|
|
697
|
+
async done() {
|
|
698
|
+
// Final flush - send completion signal
|
|
699
|
+
client.sendEvent("agent.stream", {
|
|
700
|
+
runId,
|
|
701
|
+
agentId,
|
|
702
|
+
sessionKey,
|
|
703
|
+
state: "done",
|
|
704
|
+
});
|
|
705
|
+
},
|
|
706
|
+
};
|
|
707
|
+
try {
|
|
708
|
+
// Build peer info from params
|
|
709
|
+
const peerInfo = (params.senderUsername || params.senderName || params.senderId || params.channel)
|
|
710
|
+
? {
|
|
711
|
+
senderUsername: params.senderUsername,
|
|
712
|
+
senderName: params.senderName,
|
|
713
|
+
senderId: params.senderId,
|
|
714
|
+
channel: params.channel,
|
|
715
|
+
}
|
|
716
|
+
: undefined;
|
|
717
|
+
// Route to Chat UI and wait for response
|
|
718
|
+
const responseText = await agent.chatUIHandler(params.message, sessionKey, peerInfo, emitter, { params, runId, agentId });
|
|
719
|
+
// Prefer the accumulated streamed text so the final reply is byte-identical
|
|
720
|
+
// to the text streamed as blocks. The gateway's block/final dedup slices the
|
|
721
|
+
// final by prefix-matching the last emitted block; using a separately-assembled
|
|
722
|
+
// responseText (markdown-part join) diverges on whitespace/normalization and
|
|
723
|
+
// makes that prefix match fail, causing already-streamed text to be re-sent
|
|
724
|
+
// (duplicate messages on tool-call turns). Fall back to responseText only when
|
|
725
|
+
// nothing was streamed.
|
|
726
|
+
const finalText = fullText || responseText;
|
|
727
|
+
this.log(`Agent ${agentId} (Chat UI) completed: response.len=${finalText.length}`);
|
|
728
|
+
if (!finalText) {
|
|
729
|
+
this.log(`WARNING: Agent ${agentId} (Chat UI) produced empty response!`);
|
|
730
|
+
}
|
|
731
|
+
const response = {
|
|
732
|
+
text: finalText,
|
|
733
|
+
runId: params.idempotencyKey,
|
|
734
|
+
};
|
|
735
|
+
this.client.respond(frame.id, response, true);
|
|
736
|
+
// Emit event with response for UI
|
|
737
|
+
this.emit("agent.response", {
|
|
738
|
+
agentId,
|
|
739
|
+
message: params.message,
|
|
740
|
+
response: finalText,
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
catch (err) {
|
|
744
|
+
this.client.respond(frame.id, undefined, false, {
|
|
745
|
+
code: "CHAT_UI_ERROR",
|
|
746
|
+
message: err instanceof Error ? err.message : String(err),
|
|
747
|
+
});
|
|
748
|
+
this.log(`Agent ${agentId} (Chat UI) failed: ${err}`);
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
getDefaultAgentId() {
|
|
752
|
+
if (this.agents.size === 1) {
|
|
753
|
+
const first = this.agents.keys().next();
|
|
754
|
+
return first.done ? undefined : first.value;
|
|
755
|
+
}
|
|
756
|
+
return undefined;
|
|
757
|
+
}
|
|
758
|
+
log(message) {
|
|
759
|
+
const logLine = `[GatewayBridge] ${message}`;
|
|
760
|
+
if (this.options.outputChannel) {
|
|
761
|
+
this.options.outputChannel.appendLine(logLine);
|
|
762
|
+
}
|
|
763
|
+
this.emit("log", logLine);
|
|
764
|
+
}
|
|
765
|
+
/**
|
|
766
|
+
* Disconnect from Gateway and cleanup
|
|
767
|
+
*/
|
|
768
|
+
async disconnect() {
|
|
769
|
+
// Unregister all agents
|
|
770
|
+
for (const agentId of this.agents.keys()) {
|
|
771
|
+
await this.unregisterAgent(agentId);
|
|
772
|
+
}
|
|
773
|
+
this.client.close();
|
|
774
|
+
this.log("Disconnected from Gateway");
|
|
775
|
+
}
|
|
776
|
+
get isConnected() {
|
|
777
|
+
return this.client.isConnected;
|
|
778
|
+
}
|
|
779
|
+
get connId() {
|
|
780
|
+
return this.serverConnId;
|
|
781
|
+
}
|
|
782
|
+
get registeredAgents() {
|
|
783
|
+
return Array.from(this.agents.keys());
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* Force reconnection to Gateway
|
|
787
|
+
*/
|
|
788
|
+
async reconnect() {
|
|
789
|
+
this.log("Force reconnecting to Gateway...");
|
|
790
|
+
await this.client.reconnect();
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Send a request to Gateway (for health checks, etc.)
|
|
794
|
+
*/
|
|
795
|
+
async request(method, params) {
|
|
796
|
+
return this.client.request(method, params);
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
exports.GatewayBridge = GatewayBridge;
|
|
800
|
+
/**
|
|
801
|
+
* Create a GatewayBridge instance
|
|
802
|
+
*/
|
|
803
|
+
function createGatewayBridge(options) {
|
|
804
|
+
return new GatewayBridge(options);
|
|
805
|
+
}
|