@agenthippo-ai/agenthippo 1.110.9 → 1.110.19
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/out/agentpack/types.js +2 -5
- package/out/analytics/dashboard/artifactManager.js +2 -439
- package/out/analytics/dashboard/fleetDisplayUtils.js +2 -162
- package/out/analytics/dashboard/fleetOrchestrator.js +3 -142
- package/out/analytics/dashboard/fleetRegistry.js +2 -79
- package/out/analytics/dashboard/fleetRowDefaults.js +2 -87
- package/out/analytics/dashboard/fleetScriptAdapter.js +2 -146
- package/out/analytics/dashboard/fleetTypes.js +2 -29
- package/out/analytics/dashboard/index.js +2 -17
- package/out/analytics/dashboard/indexingService.js +2 -422
- package/out/analytics/dashboard/localFleetAdapter.js +2 -222
- package/out/analytics/dashboard/performanceMonitor.js +5 -76
- package/out/analytics/dashboard/processManager.js +2 -209
- package/out/analytics/dashboard/provider.js +38 -3817
- package/out/analytics/dashboard/queryRunner.js +62 -750
- package/out/analytics/dashboard/scheduledFleetStorage.js +2 -241
- package/out/analytics/dashboard/sessionJsonlFleet.js +3 -204
- package/out/analytics/dashboard/teamViewDiscovery.js +2 -106
- package/out/analytics/dashboard/webview/panel.js +34 -2318
- package/out/analytics/dashboard/webview/runtime-bridge.js +2 -82
- package/out/analytics/lifecycle.js +2 -43
- package/out/analytics/service.js +8 -1277
- package/out/auth/authBaseUrl.js +2 -59
- package/out/auth/bootstrapApply.js +2 -71
- package/out/auth/brokerClient.js +2 -160
- package/out/auth/callbackUri.js +2 -59
- package/out/auth/githubStoreGate.js +2 -70
- package/out/auth/loopbackAuthServer.js +4 -159
- package/out/auth/onboardingPrompt.js +2 -112
- package/out/auth/pkce.js +2 -9
- package/out/auth/provider.js +2 -226
- package/out/auth/sessionStore.js +2 -156
- package/out/auth/signInFlow.js +2 -183
- package/out/cli/index.js +619 -551
- package/out/cli/run-custom-engine-runner.js +3 -318
- package/out/cli/vscode-shim.js +2 -86
- package/out/engines/factory.js +2 -45
- package/out/engines/types.js +2 -17
- package/out/examples/run-headless-repl.js +6 -286
- package/out/examples/run-headless.js +2 -187
- package/out/extension.js +32 -4473
- package/out/gateway/gatewayRouteIndex.js +6 -371
- package/out/gateway/gatewaySessionStore.js +3 -243
- package/out/gateway/index.js +2 -31
- package/out/gateway/resetMappings.js +2 -52
- package/out/gateway/service.js +5 -1249
- package/out/mcp/publish.js +2 -143
- package/out/remote/handleRemoteChat.js +2 -169
- package/out/remote/remotePackStatusBar.js +3 -103
- package/out/remote/remoteTrust.js +6 -277
- package/out/remote/serveClient.js +4 -277
- package/out/remoteSkills.js +3 -191
- package/out/runtime/index.js +2 -32
- package/out/runtime/vscode/index.js +2 -20
- package/out/runtime/vscode/vscode-config-provider.js +2 -77
- package/out/runtime/vscode/vscode-edit-tracker.js +2 -122
- package/out/runtime/vscode/vscode-logger.js +2 -30
- package/out/runtime/vscode/vscode-permission-handler.js +2 -72
- package/out/scripts/agentide-litellm.sh +0 -1
- package/out/scripts/agentide_litellm_hooks_v1.py +170 -418
- package/out/scripts/analytics/agent-fleet-widget.js +18 -257
- package/out/scripts/analytics/agentide-litellm-otel.config.yaml +4 -4
- package/out/scripts/analytics/duckdbLocator.js +2 -28
- package/out/scripts/analytics/generate-default-charts.py +43 -323
- package/out/scripts/analytics/hotspot-analysis-widget.js +4 -430
- package/out/scripts/analytics/index-traces.py +78 -1036
- package/out/scripts/analytics/session-comparison-widget.js +26 -472
- package/out/scripts/analytics/session-timeline-widget.js +25 -846
- package/out/scripts/analytics/setup-analytics.ps1 +8 -1
- package/out/scripts/analytics/setup-analytics.sh +13 -2
- package/out/scripts/analytics/token-cost-flamegraph-widget.js +4 -461
- package/out/scripts/analytics/token-cost-trend-widget.js +4 -534
- package/out/scripts/analytics/workflows-collector.cjs +4 -314
- package/out/scripts/analytics/workflows-daemon.mjs +9 -185
- package/out/scripts/analytics/workflows-widget.cjs +15 -159
- package/out/scripts/analytics/wow-model-widget.js +10 -120
- package/out/scripts/vendor-tools.mjs +2 -233
- package/out/skills/publish.js +3 -178
- package/out/store/github/setup.js +7 -212
- package/out/store/oramaIndex.js +2 -884
- package/out/sync.js +26 -1829
- package/out/terminalLogger.js +5 -358
- package/out/utils/pathSafety.js +2 -60
- package/out/utils/pythonRunner.js +4 -258
- package/out/utils/toolPath.js +2 -83
- package/out/workspaceFolders.js +2 -59
- package/package.json +1 -1
- package/out/agentpack/github.js +0 -547
- package/out/agentpack/index.js +0 -67
- package/out/agentpack/install.js +0 -297
- package/out/agentpack/manager.js +0 -441
- package/out/agentpack/manifest.js +0 -135
- package/out/agentpack/paths.js +0 -498
- package/out/agentpack/publish.js +0 -248
- package/out/agentpack/stores.js +0 -554
- package/out/analytics/dashboard/fleetStatusUtils.js +0 -30
- package/out/analytics/dashboard/fleetTitleUtils.js +0 -68
- package/out/analytics/dashboard/refreshPolicy.js +0 -16
- package/out/analytics/dashboard/scheduledFleetFingerprint.js +0 -22
- package/out/analytics/dashboard/scheduledFleetUtils.js +0 -22
- package/out/analytics/dashboard/sessionEventFleetStats.js +0 -118
- package/out/analytics/dashboard/viewsConfigMerge.js +0 -221
- package/out/analytics/dashboard/webview/codicon.ttf +0 -0
- package/out/analytics/identity.js +0 -0
- package/out/analytics/sessionEvents.js +0 -323
- package/out/auth/callbackUriParse.js +0 -59
- package/out/auth/types.js +0 -12
- package/out/auth-broker/config.js +0 -112
- package/out/auth-broker/jwt.js +0 -105
- package/out/auth-broker/pkce.js +0 -59
- package/out/auth-broker/server.js +0 -677
- package/out/auth-broker/store.js +0 -275
- package/out/authority/warrant.js +0 -206
- package/out/base-prompts/mcp-servers/.mcp.json +0 -13
- package/out/base-prompts/mcp-servers/langfuse-analytics/README.md +0 -142
- package/out/base-prompts/mcp-servers/langfuse-analytics/mcp.json +0 -13
- package/out/base-prompts/mcp-servers/langfuse-analytics/package-lock.json +0 -1192
- package/out/base-prompts/mcp-servers/langfuse-analytics/package.json +0 -23
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/run-with-env.sh +0 -12
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/sdk-test.js +0 -102
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/simple-test.js +0 -137
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-client.js +0 -118
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-server.js +0 -209
- package/out/base-prompts/mcp-servers/langfuse-analytics/src/client.ts +0 -431
- package/out/base-prompts/mcp-servers/langfuse-analytics/src/index.ts +0 -270
- package/out/base-prompts/mcp-servers/langfuse-analytics/tsconfig.json +0 -18
- package/out/base-prompts/rules/AGENTS.md +0 -204
- package/out/base-prompts/skills/agent-browser/SKILL.md +0 -102
- package/out/base-prompts/skills/agent-builder/SKILL.md +0 -73
- package/out/base-prompts/skills/agent-builder/references/agent-pack.md +0 -63
- package/out/base-prompts/skills/agent-builder/references/crewai.md +0 -66
- package/out/base-prompts/skills/agent-builder/references/langchain.md +0 -60
- package/out/base-prompts/skills/agent-builder/references/raw-sdk.md +0 -73
- package/out/base-prompts/skills/agent-engine-creator/SKILL.md +0 -586
- package/out/base-prompts/skills/agent-engine-installer/SKILL.md +0 -106
- package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.mjs +0 -259
- package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.ps1 +0 -189
- package/out/base-prompts/skills/agenthippo-cli/SKILL.md +0 -69
- package/out/base-prompts/skills/agenthippo-cli/scripts/install.sh +0 -63
- package/out/base-prompts/skills/agentpack-creator/SKILL.md +0 -375
- package/out/base-prompts/skills/agentpack-creator/references/agent-templates.md +0 -261
- package/out/base-prompts/skills/agentpack-creator/references/agents-md-guide.md +0 -195
- package/out/base-prompts/skills/agentpack-creator/scripts/init_pack.py +0 -391
- package/out/base-prompts/skills/agentpack-creator/scripts/init_pack_test.py +0 -294
- package/out/base-prompts/skills/agentpack-testbench/SKILL.md +0 -135
- package/out/base-prompts/skills/algorithmic-art/LICENSE.txt +0 -202
- package/out/base-prompts/skills/algorithmic-art/SKILL.md +0 -405
- package/out/base-prompts/skills/algorithmic-art/templates/generator_template.js +0 -223
- package/out/base-prompts/skills/algorithmic-art/templates/viewer.html +0 -599
- package/out/base-prompts/skills/debug-agent/SKILL.md +0 -83
- package/out/base-prompts/skills/desktop-automation/SKILL.md +0 -166
- package/out/base-prompts/skills/desktop-automation/references/agenthippo-ui-recipes.md +0 -441
- package/out/base-prompts/skills/desktop-automation/scripts/windows-desktop-uia.psm1 +0 -280
- package/out/base-prompts/skills/docx/LICENSE.txt +0 -30
- package/out/base-prompts/skills/docx/SKILL.md +0 -197
- package/out/base-prompts/skills/docx/docx-js.md +0 -350
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/out/base-prompts/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/out/base-prompts/skills/docx/ooxml/scripts/pack.py +0 -159
- package/out/base-prompts/skills/docx/ooxml/scripts/unpack.py +0 -29
- package/out/base-prompts/skills/docx/ooxml/scripts/validate.py +0 -69
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/base.py +0 -951
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/docx.py +0 -274
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
- package/out/base-prompts/skills/docx/ooxml.md +0 -610
- package/out/base-prompts/skills/docx/scripts/__init__.py +0 -1
- package/out/base-prompts/skills/docx/scripts/document.py +0 -1276
- package/out/base-prompts/skills/docx/scripts/templates/comments.xml +0 -3
- package/out/base-prompts/skills/docx/scripts/templates/commentsExtended.xml +0 -3
- package/out/base-prompts/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/out/base-prompts/skills/docx/scripts/templates/commentsIds.xml +0 -3
- package/out/base-prompts/skills/docx/scripts/templates/people.xml +0 -3
- package/out/base-prompts/skills/docx/scripts/utilities.py +0 -374
- package/out/base-prompts/skills/gateway-outbound/SKILL.md +0 -136
- package/out/base-prompts/skills/mcp-builder/LICENSE.txt +0 -202
- package/out/base-prompts/skills/mcp-builder/SKILL.md +0 -328
- package/out/base-prompts/skills/mcp-builder/reference/evaluation.md +0 -602
- package/out/base-prompts/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
- package/out/base-prompts/skills/mcp-builder/reference/node_mcp_server.md +0 -970
- package/out/base-prompts/skills/mcp-builder/reference/python_mcp_server.md +0 -719
- package/out/base-prompts/skills/mcp-builder/scripts/connections.py +0 -151
- package/out/base-prompts/skills/mcp-builder/scripts/evaluation.py +0 -373
- package/out/base-prompts/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
- package/out/base-prompts/skills/mcp-builder/scripts/requirements.txt +0 -2
- package/out/base-prompts/skills/openclaw/SKILL.md +0 -406
- package/out/base-prompts/skills/openclaw/scripts/run-smoke.sh +0 -61
- package/out/base-prompts/skills/pdf/LICENSE.txt +0 -30
- package/out/base-prompts/skills/pdf/SKILL.md +0 -294
- package/out/base-prompts/skills/pdf/forms.md +0 -205
- package/out/base-prompts/skills/pdf/reference.md +0 -612
- package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes.py +0 -70
- package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
- package/out/base-prompts/skills/pdf/scripts/check_fillable_fields.py +0 -12
- package/out/base-prompts/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
- package/out/base-prompts/skills/pdf/scripts/create_validation_image.py +0 -41
- package/out/base-prompts/skills/pdf/scripts/extract_form_field_info.py +0 -152
- package/out/base-prompts/skills/pdf/scripts/fill_fillable_fields.py +0 -114
- package/out/base-prompts/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
- package/out/base-prompts/skills/pptx/LICENSE.txt +0 -30
- package/out/base-prompts/skills/pptx/SKILL.md +0 -484
- package/out/base-prompts/skills/pptx/html2pptx.md +0 -625
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/out/base-prompts/skills/pptx/ooxml/schemas/mce/mc.xsd +0 -75
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/out/base-prompts/skills/pptx/ooxml/scripts/pack.py +0 -159
- package/out/base-prompts/skills/pptx/ooxml/scripts/unpack.py +0 -29
- package/out/base-prompts/skills/pptx/ooxml/scripts/validate.py +0 -69
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/__init__.py +0 -15
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/base.py +0 -951
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/docx.py +0 -274
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/pptx.py +0 -315
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/redlining.py +0 -279
- package/out/base-prompts/skills/pptx/ooxml.md +0 -427
- package/out/base-prompts/skills/pptx/scripts/html2pptx.js +0 -984
- package/out/base-prompts/skills/pptx/scripts/inventory.py +0 -1020
- package/out/base-prompts/skills/pptx/scripts/rearrange.py +0 -231
- package/out/base-prompts/skills/pptx/scripts/replace.py +0 -385
- package/out/base-prompts/skills/pptx/scripts/thumbnail.py +0 -450
- package/out/base-prompts/skills/prompt-lab/SKILL.md +0 -149
- package/out/base-prompts/skills/prompt-lab/scripts/query-analytics.sh +0 -2551
- package/out/base-prompts/skills/skill-creator/LICENSE.txt +0 -202
- package/out/base-prompts/skills/skill-creator/SKILL.md +0 -371
- package/out/base-prompts/skills/skill-creator/references/output-patterns.md +0 -82
- package/out/base-prompts/skills/skill-creator/references/workflows.md +0 -28
- package/out/base-prompts/skills/skill-creator/scripts/init_skill.py +0 -303
- package/out/base-prompts/skills/skill-creator/scripts/package_skill.py +0 -110
- package/out/base-prompts/skills/skill-creator/scripts/quick_validate.py +0 -95
- package/out/base-prompts/skills/skill-installer/SKILL.md +0 -251
- package/out/base-prompts/skills/skill-installer/references/store-api.md +0 -219
- package/out/base-prompts/skills/spotlight-dashboard/SKILL.md +0 -83
- package/out/base-prompts/skills/spotlight-insights/SKILL.md +0 -101
- package/out/base-prompts/skills/spotlight-optimize/SKILL.md +0 -93
- package/out/base-prompts/skills/spotlight-optimize/scripts/query-analytics.sh +0 -2551
- package/out/base-prompts/skills/spotlight-query/SKILL.md +0 -314
- package/out/base-prompts/skills/spotlight-query/references/otel-schema.md +0 -163
- package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.sh +0 -2551
- package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.test.sh +0 -744
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/sessions/sess-test-1.jsonl +0 -14
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/.duckdb-index.json +0 -7
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/sample.jsonl +0 -5
- package/out/base-prompts/skills/spotlight-report/SKILL.md +0 -86
- package/out/base-prompts/skills/spotlight-visualize/SKILL.md +0 -92
- package/out/base-prompts/skills/spotlight-visualize/scripts/query-analytics.sh +0 -2551
- package/out/base-prompts/skills/xlsx/LICENSE.txt +0 -30
- package/out/base-prompts/skills/xlsx/SKILL.md +0 -289
- package/out/base-prompts/skills/xlsx/recalc.py +0 -178
- package/out/branding.js +0 -49
- package/out/cli/commands/anywhere.js +0 -66
- package/out/cli/commands/ask.js +0 -246
- package/out/cli/commands/auth-broker.js +0 -24
- package/out/cli/commands/auth.js +0 -219
- package/out/cli/commands/chat.js +0 -357
- package/out/cli/commands/conformance.js +0 -249
- package/out/cli/commands/data-plane.js +0 -67
- package/out/cli/commands/deploy.js +0 -263
- package/out/cli/commands/gateway.js +0 -218
- package/out/cli/commands/idp.js +0 -85
- package/out/cli/commands/pack.js +0 -399
- package/out/cli/commands/probe-custom-engine.js +0 -82
- package/out/cli/commands/sandbox.js +0 -332
- package/out/cli/commands/serve.js +0 -1758
- package/out/cli/commands/store.js +0 -927
- package/out/cli/credential-context.js +0 -91
- package/out/cli/data-plane/broker.js +0 -78
- package/out/cli/data-plane/connector-host.js +0 -121
- package/out/cli/data-plane/egress.js +0 -189
- package/out/cli/data-plane/gateway.js +0 -218
- package/out/cli/data-plane/index.js +0 -152
- package/out/cli/data-plane/registry.js +0 -89
- package/out/cli/data-plane/remote.js +0 -106
- package/out/cli/data-plane/sidecar.js +0 -161
- package/out/cli/deploy/blueprints/registry.js +0 -84
- package/out/cli/deploy/layers/identity.js +0 -172
- package/out/cli/deploy-init.js +0 -3023
- package/out/cli/deps.js +0 -342
- package/out/cli/idp-init.js +0 -338
- package/out/cli/pack-install-ref.js +0 -15
- package/out/cli/pack-loader.js +0 -418
- package/out/cli/pack-runtime.js +0 -61
- package/out/cli/runtime.js +0 -450
- package/out/cli/serve-hardening.js +0 -607
- package/out/cli/state-sync.js +0 -424
- package/out/cli/utils.js +0 -231
- package/out/engines/base.js +0 -188
- package/out/engines/claude.js +0 -1254
- package/out/engines/codex.js +0 -862
- package/out/engines/custom.js +0 -674
- package/out/engines/customEngineIpc.js +0 -95
- package/out/engines/customEngineRunnerEmbed.js +0 -107
- package/out/engines/customRegistry.js +0 -274
- package/out/engines/embeddedCustomEngineRunner.generated.js +0 -9
- package/out/engines/engineApiKey.js +0 -138
- package/out/engines/install.js +0 -372
- package/out/engines/persistentEngineWorker.js +0 -320
- package/out/engines/publish.js +0 -341
- package/out/evidence/sessionShip.js +0 -610
- package/out/gateway/bridge.js +0 -843
- package/out/gateway/cli-agent-id.js +0 -36
- package/out/gateway/client.js +0 -336
- package/out/gateway/client.test.js +0 -395
- package/out/gateway/gateway-scope-errors.js +0 -14
- package/out/gateway/gatewayBackup.js +0 -76
- package/out/gateway/installSource.js +0 -68
- package/out/gateway/lifecycle.js +0 -3190
- package/out/gateway/openclaw-channel-routing.js +0 -317
- package/out/gateway/outboundHandles.js +0 -373
- package/out/gateway/outboundPaths.js +0 -75
- package/out/gateway/outboundSend.js +0 -254
- package/out/gateway/protocol.js +0 -48
- package/out/gateway/secretsPreflight.js +0 -90
- package/out/gateway/sessionRouting.js +0 -77
- package/out/headless/index.js +0 -539
- package/out/headless/sync.js +0 -473
- package/out/live-e2e/mcp-demo/server.mjs +0 -32
- package/out/live-probe/connector.mjs +0 -8
- package/out/live-probe/env-report.mjs +0 -8
- package/out/mcp.js +0 -654
- package/out/pack/caps.js +0 -271
- package/out/pack/governor.js +0 -309
- package/out/pack/lease-schema.js +0 -270
- package/out/pack/lease.js +0 -640
- package/out/pack/reconcile.js +0 -217
- package/out/pack/signature.js +0 -839
- package/out/permissions.js +0 -108
- package/out/permissions.mapping.yaml +0 -68
- package/out/registry/index.js +0 -332
- package/out/runner/host.js +0 -131
- package/out/runner/protocol.js +0 -108
- package/out/runner/remoteEngine.js +0 -130
- package/out/runtime/interfaces/config-provider.js +0 -32
- package/out/runtime/interfaces/edit-tracker.js +0 -24
- package/out/runtime/interfaces/index.js +0 -29
- package/out/runtime/interfaces/logger.js +0 -40
- package/out/runtime/interfaces/permission-handler.js +0 -66
- package/out/runtime/interfaces/session-store.js +0 -342
- package/out/runtime/vscode/vscode-session-store.js +0 -22
- package/out/sandbox/containerDriver.js +0 -570
- package/out/sandbox/processDriver.js +0 -315
- package/out/sandbox/sandboxRunner.js +0 -191
- package/out/sandbox/support.js +0 -301
- package/out/sandbox/types.js +0 -55
- package/out/scripts/analytics/fleet-local-adapter.js +0 -246
- package/out/scripts/analytics/live-fleet-4-collector.cjs +0 -315
- package/out/scripts/analytics/live-fleet-4-daemon.mjs +0 -134
- package/out/scripts/analytics/live-fleet-4-widget.cjs +0 -433
- package/out/scripts/gateway/Dockerfile.serve +0 -45
- package/out/scripts/gateway/docker-serve.sh +0 -248
- package/out/scripts/gateway/setup-gateway-server.ps1 +0 -953
- package/out/scripts/gateway/setup-gateway-server.sh +0 -935
- package/out/session.js +0 -272
- package/out/shared/agentEngines.js +0 -170
- package/out/shared/index.js +0 -109
- package/out/shared/models.js +0 -136
- package/out/shared/providers.js +0 -205
- package/out/spotlight/install.js +0 -345
- package/out/spotlight/publish.js +0 -544
- package/out/spotlight/yaml.js +0 -31
- package/out/store/index.js +0 -786
- package/out/store/shared.js +0 -241
- package/out/test/agentEnvFile.test.js +0 -97
- package/out/test/agentYaml.test.js +0 -373
- package/out/test/agentpack.test.js +0 -639
- package/out/test/analytics-lifecycle.test.js +0 -174
- package/out/test/analytics.test.js +0 -756
- package/out/test/auth-baseurl.test.js +0 -132
- package/out/test/auth-bootstrapApply.test.js +0 -123
- package/out/test/auth-broker-hardening.test.js +0 -227
- package/out/test/auth-broker.test.js +0 -541
- package/out/test/auth-callback.test.js +0 -62
- package/out/test/blueprint-registry.test.js +0 -105
- package/out/test/branding.test.js +0 -242
- package/out/test/caps-governor.test.js +0 -455
- package/out/test/cli-agent-id.test.js +0 -55
- package/out/test/codex-new-file-survival.test.js +0 -119
- package/out/test/configuration-scopes.test.js +0 -131
- package/out/test/credential-context.test.js +0 -160
- package/out/test/custom-env-layering.test.js +0 -151
- package/out/test/customEngineInstall.test.js +0 -100
- package/out/test/customRegistry.test.js +0 -122
- package/out/test/data-plane-engine-wiring.test.js +0 -250
- package/out/test/data-plane.test.js +0 -311
- package/out/test/deploy-init.test.js +0 -854
- package/out/test/deps-auto-install.test.js +0 -81
- package/out/test/egress-broker.test.js +0 -172
- package/out/test/engine-integration.test.js +0 -297
- package/out/test/enginePaths.test.js +0 -195
- package/out/test/enginePublish.test.js +0 -82
- package/out/test/fleetDisplayUtils.test.js +0 -100
- package/out/test/gateway-client.test.js +0 -409
- package/out/test/gateway-install-source.test.js +0 -111
- package/out/test/gateway-lifecycle.test.js +0 -608
- package/out/test/gateway-outbound.test.js +0 -538
- package/out/test/gateway-reset-mappings.test.js +0 -221
- package/out/test/gateway-route-index.test.js +0 -235
- package/out/test/gateway-secrets-preflight.test.js +0 -127
- package/out/test/gateway-session-routing.test.js +0 -65
- package/out/test/gateway-session-store.test.js +0 -216
- package/out/test/github.test.js +0 -232
- package/out/test/governor-hardening.test.js +0 -217
- package/out/test/headless-sync.test.js +0 -301
- package/out/test/helpers/manifest-fixtures.js +0 -27
- package/out/test/idp-init.test.js +0 -151
- package/out/test/lease-signature.test.js +0 -357
- package/out/test/lease-trust-root.test.js +0 -273
- package/out/test/lease-validation.test.js +0 -169
- package/out/test/lease.test.js +0 -114
- package/out/test/mcp-obo.test.js +0 -107
- package/out/test/mcp.test.js +0 -389
- package/out/test/model-routing.test.js +0 -133
- package/out/test/openclaw-channel-routing.test.js +0 -191
- package/out/test/pack-admission.test.js +0 -216
- package/out/test/pack-digest-parity.test.js +0 -140
- package/out/test/pack-reconcile.test.js +0 -183
- package/out/test/pack-signature-artifact.test.js +0 -103
- package/out/test/pack-signature.test.js +0 -176
- package/out/test/pack-trust-root.test.js +0 -202
- package/out/test/pathSafety.test.js +0 -63
- package/out/test/permissions.test.js +0 -175
- package/out/test/persistent-engine-worker.test.js +0 -220
- package/out/test/refreshPolicy.test.js +0 -60
- package/out/test/registry.test.js +0 -351
- package/out/test/remote-trust.test.js +0 -242
- package/out/test/runner-protocol.test.js +0 -249
- package/out/test/runtime.test.js +0 -349
- package/out/test/sandbox-driver.test.js +0 -553
- package/out/test/sandbox-hardening.test.js +0 -395
- package/out/test/sandbox-runner.test.js +0 -343
- package/out/test/scheduledFleetStorage.test.js +0 -72
- package/out/test/serve-gateway-turn.test.js +0 -267
- package/out/test/serve-hardening.test.js +0 -418
- package/out/test/serveClient.test.js +0 -209
- package/out/test/sessionJsonlFleet.test.js +0 -78
- package/out/test/sessionShip.test.js +0 -560
- package/out/test/shared.test.js +0 -173
- package/out/test/skills-mcp.test.js +0 -299
- package/out/test/spotlightPublish.test.js +0 -327
- package/out/test/spotlightYaml.test.js +0 -58
- package/out/test/state-sync-peer.test.js +0 -156
- package/out/test/store-install-safe.test.js +0 -69
- package/out/test/store.test.js +0 -331
- package/out/test/stores.test.js +0 -504
- package/out/test/sync-switch.test.js +0 -251
- package/out/test/teamViewDiscovery.test.js +0 -90
- package/out/test/tls-bypass.test.js +0 -90
- package/out/test/toolPath.test.js +0 -120
- package/out/test/utils.test.js +0 -308
- package/out/test/viewsConfigMerge.test.js +0 -180
- package/out/test/warrant.test.js +0 -138
- package/out/test/windows-command-line.test.js +0 -75
- package/out/utils/agentEnvFile.js +0 -131
- package/out/utils/binary.js +0 -175
- package/out/utils/index.js +0 -37
- package/out/utils/network.js +0 -74
- package/out/utils/paths.js +0 -116
- package/out/utils/pid.js +0 -180
- package/out/utils/resolveNodeBinary.js +0 -168
- package/out/utils/windowsCommandLine.js +0 -29
- package/out/utils.js +0 -968
package/out/engines/install.js
DELETED
|
@@ -1,372 +0,0 @@
|
|
|
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.getDefaultCustomEnginesInstallRoot = getDefaultCustomEnginesInstallRoot;
|
|
40
|
-
exports.installCustomEngineFromFiles = installCustomEngineFromFiles;
|
|
41
|
-
exports.listInstalledCustomEngines = listInstalledCustomEngines;
|
|
42
|
-
exports.uninstallCustomEngine = uninstallCustomEngine;
|
|
43
|
-
const child_process_1 = require("child_process");
|
|
44
|
-
const fs_1 = require("fs");
|
|
45
|
-
const os = __importStar(require("os"));
|
|
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 execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
51
|
-
const ENGINE_MANIFEST_NAME = 'engine.manifest.json';
|
|
52
|
-
function getDefaultCustomEnginesInstallRoot() {
|
|
53
|
-
return path.join(process.env.AGENT_HOME_DIR || process.env.AGENTHIPPO_HOME || path.join(os.homedir(), branding_1.AGENTIDE_DIR_NAME), 'engines');
|
|
54
|
-
}
|
|
55
|
-
function normalizeArchivePath(rawPath) {
|
|
56
|
-
const normalized = rawPath.replace(/\\/g, '/').trim().replace(/^\.\//, '');
|
|
57
|
-
if (!normalized || normalized.includes('\0')) {
|
|
58
|
-
throw new Error(`Invalid engine package path: ${rawPath}`);
|
|
59
|
-
}
|
|
60
|
-
if (normalized.startsWith('/') || /^[A-Za-z]:/.test(normalized)) {
|
|
61
|
-
throw new Error(`Engine package path must be relative: ${rawPath}`);
|
|
62
|
-
}
|
|
63
|
-
const parts = normalized.split('/').filter(Boolean);
|
|
64
|
-
if (parts.length === 0 || parts.some(part => part === '.' || part === '..')) {
|
|
65
|
-
throw new Error(`Engine package path must not contain "." or "..": ${rawPath}`);
|
|
66
|
-
}
|
|
67
|
-
return parts.join('/');
|
|
68
|
-
}
|
|
69
|
-
function normalizeSafeRelativePath(rawPath, label) {
|
|
70
|
-
try {
|
|
71
|
-
return normalizeArchivePath(rawPath).replace(/\//g, path.sep);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
-
throw new Error(`${label}: ${message}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function assertPathInside(parentDir, candidatePath, label) {
|
|
79
|
-
const parent = path.resolve(parentDir);
|
|
80
|
-
const candidate = path.resolve(candidatePath);
|
|
81
|
-
const rel = path.relative(parent, candidate);
|
|
82
|
-
if (rel && (rel.startsWith('..') || path.isAbsolute(rel))) {
|
|
83
|
-
throw new Error(`${label} must stay inside ${parentDir}: ${candidatePath}`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
async function pathExists(targetPath) {
|
|
87
|
-
try {
|
|
88
|
-
await fs_1.promises.access(targetPath);
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function readJsonObject(content, label) {
|
|
96
|
-
const parsed = JSON.parse(content);
|
|
97
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
98
|
-
throw new Error(`${label} must be a JSON object`);
|
|
99
|
-
}
|
|
100
|
-
return parsed;
|
|
101
|
-
}
|
|
102
|
-
function getStringField(obj, key, label) {
|
|
103
|
-
const value = obj[key];
|
|
104
|
-
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
105
|
-
throw new Error(`${label} missing required string field "${key}"`);
|
|
106
|
-
}
|
|
107
|
-
return value.trim();
|
|
108
|
-
}
|
|
109
|
-
function normalizeEngineId(rawId) {
|
|
110
|
-
const id = rawId.trim().toLowerCase();
|
|
111
|
-
if (!/^[a-z0-9][a-z0-9._-]*$/.test(id)) {
|
|
112
|
-
throw new Error(`Custom engine id must contain only lowercase letters, numbers, ".", "_", or "-": ${rawId}`);
|
|
113
|
-
}
|
|
114
|
-
return id;
|
|
115
|
-
}
|
|
116
|
-
function validateWorkspaceSyncConfig(raw, label) {
|
|
117
|
-
if (!raw) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
if (typeof raw !== 'object' || Array.isArray(raw)) {
|
|
121
|
-
throw new Error(`${label} workspaceSync must be an object`);
|
|
122
|
-
}
|
|
123
|
-
const config = raw;
|
|
124
|
-
if (config.enabled !== true) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
const dir = getStringField(config, 'dir', `${label} workspaceSync`);
|
|
128
|
-
const rulesFile = getStringField(config, 'rulesFile', `${label} workspaceSync`);
|
|
129
|
-
normalizeSafeRelativePath(dir, 'workspaceSync.dir');
|
|
130
|
-
normalizeSafeRelativePath(rulesFile, 'workspaceSync.rulesFile');
|
|
131
|
-
}
|
|
132
|
-
async function readAndValidateManifest(stageDir) {
|
|
133
|
-
const manifestPath = path.join(stageDir, ENGINE_MANIFEST_NAME);
|
|
134
|
-
let raw;
|
|
135
|
-
try {
|
|
136
|
-
raw = await fs_1.promises.readFile(manifestPath, 'utf8');
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
throw new Error(`Custom engine package is missing ${ENGINE_MANIFEST_NAME}`);
|
|
140
|
-
}
|
|
141
|
-
const parsed = readJsonObject(raw, ENGINE_MANIFEST_NAME);
|
|
142
|
-
const id = getStringField(parsed, 'id', ENGINE_MANIFEST_NAME);
|
|
143
|
-
const manifest = {
|
|
144
|
-
version: parsed.version,
|
|
145
|
-
id,
|
|
146
|
-
displayName: typeof parsed.displayName === 'string' && parsed.displayName.trim()
|
|
147
|
-
? parsed.displayName.trim()
|
|
148
|
-
: undefined,
|
|
149
|
-
description: typeof parsed.description === 'string' && parsed.description.trim()
|
|
150
|
-
? parsed.description.trim()
|
|
151
|
-
: undefined,
|
|
152
|
-
entry: getStringField(parsed, 'entry', ENGINE_MANIFEST_NAME),
|
|
153
|
-
workspaceSync: parsed.workspaceSync,
|
|
154
|
-
};
|
|
155
|
-
if (manifest.version !== 2) {
|
|
156
|
-
throw new Error(`${ENGINE_MANIFEST_NAME} must declare version 2`);
|
|
157
|
-
}
|
|
158
|
-
if (manifest.id !== manifest.id.toLowerCase() || !/^[a-z0-9][a-z0-9._-]*$/.test(manifest.id)) {
|
|
159
|
-
throw new Error(`${ENGINE_MANIFEST_NAME} id must contain only lowercase letters, numbers, ".", "_", or "-"`);
|
|
160
|
-
}
|
|
161
|
-
validateWorkspaceSyncConfig(manifest.workspaceSync, ENGINE_MANIFEST_NAME);
|
|
162
|
-
const entryRel = normalizeSafeRelativePath(manifest.entry, 'entry');
|
|
163
|
-
const entryPath = path.join(stageDir, entryRel);
|
|
164
|
-
assertPathInside(stageDir, entryPath, 'Engine entry');
|
|
165
|
-
if (!await pathExists(entryPath)) {
|
|
166
|
-
throw new Error(`${ENGINE_MANIFEST_NAME} entry not found: ${manifest.entry}`);
|
|
167
|
-
}
|
|
168
|
-
return manifest;
|
|
169
|
-
}
|
|
170
|
-
async function writePackageFiles(stageDir, files) {
|
|
171
|
-
const seen = new Set();
|
|
172
|
-
for (const file of files) {
|
|
173
|
-
const rel = normalizeArchivePath(file.path);
|
|
174
|
-
if (seen.has(rel)) {
|
|
175
|
-
throw new Error(`Duplicate engine package path: ${file.path}`);
|
|
176
|
-
}
|
|
177
|
-
seen.add(rel);
|
|
178
|
-
const filePath = path.join(stageDir, ...rel.split('/'));
|
|
179
|
-
assertPathInside(stageDir, filePath, 'Engine package file');
|
|
180
|
-
await fs_1.promises.mkdir(path.dirname(filePath), { recursive: true });
|
|
181
|
-
await fs_1.promises.writeFile(filePath, file.content);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
async function runCommand(command, args, cwd) {
|
|
185
|
-
try {
|
|
186
|
-
await execFileAsync(command, args, {
|
|
187
|
-
cwd,
|
|
188
|
-
maxBuffer: 10 * 1024 * 1024,
|
|
189
|
-
windowsHide: true,
|
|
190
|
-
shell: process.platform === 'win32' && /\.(?:cmd|bat)$/i.test(command),
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
194
|
-
const stderr = typeof error.stderr === 'string'
|
|
195
|
-
? error.stderr.trim()
|
|
196
|
-
: '';
|
|
197
|
-
const stdout = typeof error.stdout === 'string'
|
|
198
|
-
? error.stdout.trim()
|
|
199
|
-
: '';
|
|
200
|
-
const detail = stderr || stdout || (error instanceof Error ? error.message : String(error));
|
|
201
|
-
throw new Error(`${command} ${args.join(' ')} failed: ${detail}`);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
async function maybeInstallDependencies(stageDir, runNpmCi, logger) {
|
|
205
|
-
const packageJsonPath = path.join(stageDir, 'package.json');
|
|
206
|
-
if (!await pathExists(packageJsonPath)) {
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
const lockfilePath = path.join(stageDir, 'package-lock.json');
|
|
210
|
-
if (!await pathExists(lockfilePath)) {
|
|
211
|
-
throw new Error('Custom engine packages with package.json must include package-lock.json');
|
|
212
|
-
}
|
|
213
|
-
if (!runNpmCi) {
|
|
214
|
-
return false;
|
|
215
|
-
}
|
|
216
|
-
const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
217
|
-
if (logger) {
|
|
218
|
-
(0, utils_1.logInfo)(logger, `[Store] Running npm ci --omit=dev for custom engine`);
|
|
219
|
-
}
|
|
220
|
-
await runCommand(npmCommand, ['ci', '--omit=dev'], stageDir);
|
|
221
|
-
return true;
|
|
222
|
-
}
|
|
223
|
-
async function validateEntrySyntax(stageDir, manifest, logger) {
|
|
224
|
-
const entryRel = normalizeSafeRelativePath(manifest.entry, 'entry');
|
|
225
|
-
const entryPath = path.join(stageDir, entryRel);
|
|
226
|
-
if (logger) {
|
|
227
|
-
(0, utils_1.logInfo)(logger, `[Store] Validating custom engine entry: ${manifest.entry}`);
|
|
228
|
-
}
|
|
229
|
-
await runCommand('node', ['--check', entryPath], stageDir);
|
|
230
|
-
return entryPath;
|
|
231
|
-
}
|
|
232
|
-
async function replaceInstalledEngine(stageDir, installRoot, engineId, overwrite) {
|
|
233
|
-
await fs_1.promises.mkdir(installRoot, { recursive: true });
|
|
234
|
-
const targetDir = path.join(installRoot, engineId);
|
|
235
|
-
assertPathInside(installRoot, targetDir, 'Custom engine install target');
|
|
236
|
-
const targetExists = await pathExists(targetDir);
|
|
237
|
-
if (targetExists && !overwrite) {
|
|
238
|
-
throw new Error(`Custom engine "${engineId}" already exists at ${targetDir}`);
|
|
239
|
-
}
|
|
240
|
-
if (!targetExists) {
|
|
241
|
-
await fs_1.promises.rename(stageDir, targetDir);
|
|
242
|
-
return targetDir;
|
|
243
|
-
}
|
|
244
|
-
const backupRoot = path.join(installRoot, '.tmp');
|
|
245
|
-
await fs_1.promises.mkdir(backupRoot, { recursive: true });
|
|
246
|
-
const backupDir = path.join(backupRoot, `${engineId}.previous-${Date.now()}`);
|
|
247
|
-
assertPathInside(installRoot, backupDir, 'Custom engine backup target');
|
|
248
|
-
await fs_1.promises.rm(backupDir, { recursive: true, force: true });
|
|
249
|
-
await fs_1.promises.rename(targetDir, backupDir);
|
|
250
|
-
try {
|
|
251
|
-
await fs_1.promises.rename(stageDir, targetDir);
|
|
252
|
-
await fs_1.promises.rm(backupDir, { recursive: true, force: true });
|
|
253
|
-
return targetDir;
|
|
254
|
-
}
|
|
255
|
-
catch (error) {
|
|
256
|
-
await fs_1.promises.rm(targetDir, { recursive: true, force: true }).catch(() => undefined);
|
|
257
|
-
await fs_1.promises.rename(backupDir, targetDir).catch(() => undefined);
|
|
258
|
-
throw error;
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
async function installCustomEngineFromFiles(files, options = {}) {
|
|
262
|
-
if (files.length === 0) {
|
|
263
|
-
throw new Error('Custom engine package is empty');
|
|
264
|
-
}
|
|
265
|
-
const installRoot = path.resolve(options.installRoot ?? getDefaultCustomEnginesInstallRoot());
|
|
266
|
-
const runNpmCi = options.runNpmCi !== false;
|
|
267
|
-
const overwrite = options.overwrite !== false;
|
|
268
|
-
const tempRoot = path.join(installRoot, '.tmp');
|
|
269
|
-
await fs_1.promises.mkdir(tempRoot, { recursive: true });
|
|
270
|
-
const stageDir = await fs_1.promises.mkdtemp(path.join(tempRoot, `${options.slug || 'engine'}-`));
|
|
271
|
-
assertPathInside(tempRoot, stageDir, 'Custom engine staging directory');
|
|
272
|
-
let stageOwned = true;
|
|
273
|
-
try {
|
|
274
|
-
await writePackageFiles(stageDir, files);
|
|
275
|
-
const manifest = await readAndValidateManifest(stageDir);
|
|
276
|
-
const npmInstalled = await maybeInstallDependencies(stageDir, runNpmCi, options.logger);
|
|
277
|
-
const stagedEntryPath = await validateEntrySyntax(stageDir, manifest, options.logger);
|
|
278
|
-
const installDir = await replaceInstalledEngine(stageDir, installRoot, manifest.id, overwrite);
|
|
279
|
-
stageOwned = false;
|
|
280
|
-
const entryPath = path.join(installDir, path.relative(stageDir, stagedEntryPath));
|
|
281
|
-
const result = {
|
|
282
|
-
id: manifest.id,
|
|
283
|
-
displayName: manifest.displayName || manifest.id,
|
|
284
|
-
version: manifest.version,
|
|
285
|
-
manifestPath: path.join(installDir, ENGINE_MANIFEST_NAME),
|
|
286
|
-
installDir,
|
|
287
|
-
entryPath,
|
|
288
|
-
npmInstalled,
|
|
289
|
-
};
|
|
290
|
-
if (options.logger) {
|
|
291
|
-
const source = options.sourceUrl ? ` from ${options.sourceUrl}` : '';
|
|
292
|
-
(0, utils_1.logInfo)(options.logger, `[Store] Installed custom engine ${result.id}${source} to ${installDir}`);
|
|
293
|
-
}
|
|
294
|
-
return result;
|
|
295
|
-
}
|
|
296
|
-
finally {
|
|
297
|
-
if (stageOwned) {
|
|
298
|
-
await fs_1.promises.rm(stageDir, { recursive: true, force: true }).catch(() => undefined);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
async function listInstalledCustomEngines(options = {}) {
|
|
303
|
-
const installRoot = path.resolve(options.installRoot ?? getDefaultCustomEnginesInstallRoot());
|
|
304
|
-
let entries;
|
|
305
|
-
try {
|
|
306
|
-
entries = await fs_1.promises.readdir(installRoot, { withFileTypes: true });
|
|
307
|
-
}
|
|
308
|
-
catch {
|
|
309
|
-
return [];
|
|
310
|
-
}
|
|
311
|
-
const engines = [];
|
|
312
|
-
for (const entry of entries) {
|
|
313
|
-
if (!entry.isDirectory() || entry.name.startsWith('.')) {
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
|
-
const installDir = path.join(installRoot, entry.name);
|
|
317
|
-
assertPathInside(installRoot, installDir, 'Custom engine install target');
|
|
318
|
-
const manifestPath = path.join(installDir, ENGINE_MANIFEST_NAME);
|
|
319
|
-
let id = entry.name;
|
|
320
|
-
let displayName = entry.name;
|
|
321
|
-
try {
|
|
322
|
-
const manifest = readJsonObject(await fs_1.promises.readFile(manifestPath, 'utf8'), manifestPath);
|
|
323
|
-
if (typeof manifest.id === 'string' && manifest.id.trim()) {
|
|
324
|
-
id = normalizeEngineId(manifest.id);
|
|
325
|
-
}
|
|
326
|
-
if (typeof manifest.displayName === 'string' && manifest.displayName.trim()) {
|
|
327
|
-
displayName = manifest.displayName.trim();
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
displayName = id;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
catch {
|
|
334
|
-
// Keep broken/manual installs visible by directory name so they can be removed.
|
|
335
|
-
}
|
|
336
|
-
engines.push({ id, displayName, manifestPath, installDir });
|
|
337
|
-
}
|
|
338
|
-
return engines.sort((a, b) => a.id.localeCompare(b.id));
|
|
339
|
-
}
|
|
340
|
-
async function uninstallCustomEngine(id, options = {}) {
|
|
341
|
-
const engineId = normalizeEngineId(id);
|
|
342
|
-
const installRoot = path.resolve(options.installRoot ?? getDefaultCustomEnginesInstallRoot());
|
|
343
|
-
const installDir = path.join(installRoot, engineId);
|
|
344
|
-
assertPathInside(installRoot, installDir, 'Custom engine uninstall target');
|
|
345
|
-
let displayName;
|
|
346
|
-
try {
|
|
347
|
-
const stat = await fs_1.promises.lstat(installDir);
|
|
348
|
-
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
349
|
-
throw new Error(`Custom engine install target is not a normal directory: ${installDir}`);
|
|
350
|
-
}
|
|
351
|
-
try {
|
|
352
|
-
const manifest = readJsonObject(await fs_1.promises.readFile(path.join(installDir, ENGINE_MANIFEST_NAME), 'utf8'), ENGINE_MANIFEST_NAME);
|
|
353
|
-
displayName = typeof manifest.displayName === 'string' && manifest.displayName.trim()
|
|
354
|
-
? manifest.displayName.trim()
|
|
355
|
-
: undefined;
|
|
356
|
-
}
|
|
357
|
-
catch {
|
|
358
|
-
// Missing or invalid manifests should not block removing the install directory.
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
catch (error) {
|
|
362
|
-
if (error?.code === 'ENOENT') {
|
|
363
|
-
return { id: engineId, installDir, removed: false };
|
|
364
|
-
}
|
|
365
|
-
throw error;
|
|
366
|
-
}
|
|
367
|
-
await fs_1.promises.rm(installDir, { recursive: true, force: true });
|
|
368
|
-
if (options.logger) {
|
|
369
|
-
(0, utils_1.logInfo)(options.logger, `[Store] Uninstalled custom engine ${engineId} from ${installDir}`);
|
|
370
|
-
}
|
|
371
|
-
return { id: engineId, displayName, installDir, removed: true };
|
|
372
|
-
}
|
|
@@ -1,320 +0,0 @@
|
|
|
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;
|