@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,524 @@
|
|
|
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
|
+
require("mocha");
|
|
40
|
+
const assert = __importStar(require("assert"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const fs_1 = require("fs");
|
|
44
|
+
const base_1 = require("../engines/base");
|
|
45
|
+
const sessionEvents_1 = require("../analytics/sessionEvents");
|
|
46
|
+
async function createUniqueTempDir(prefix) {
|
|
47
|
+
return fs_1.promises.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
48
|
+
}
|
|
49
|
+
async function removeDirWithRetries(dirPath) {
|
|
50
|
+
await fs_1.promises.rm(dirPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 });
|
|
51
|
+
}
|
|
52
|
+
// =============================================================================
|
|
53
|
+
// generateRequestId Tests
|
|
54
|
+
// =============================================================================
|
|
55
|
+
suite('Analytics - generateRequestId', () => {
|
|
56
|
+
test('returns string starting with req- prefix', () => {
|
|
57
|
+
const id = (0, base_1.generateRequestId)();
|
|
58
|
+
assert.ok(id.startsWith('req-'), `Expected req- prefix, got: ${id}`);
|
|
59
|
+
});
|
|
60
|
+
test('returns correct format: req-<8 hex chars>', () => {
|
|
61
|
+
const id = (0, base_1.generateRequestId)();
|
|
62
|
+
assert.match(id, /^req-[0-9a-f]{1,8}$/, `Unexpected format: ${id}`);
|
|
63
|
+
});
|
|
64
|
+
test('generates unique IDs', () => {
|
|
65
|
+
const ids = new Set();
|
|
66
|
+
for (let i = 0; i < 100; i++) {
|
|
67
|
+
ids.add((0, base_1.generateRequestId)());
|
|
68
|
+
}
|
|
69
|
+
// With 8 hex chars, collisions in 100 attempts are extremely unlikely
|
|
70
|
+
assert.ok(ids.size > 95, `Expected near-unique IDs, got ${ids.size} unique out of 100`);
|
|
71
|
+
});
|
|
72
|
+
test('is distinguishable from session IDs (UUIDs)', () => {
|
|
73
|
+
const requestId = (0, base_1.generateRequestId)();
|
|
74
|
+
const sessionId = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890';
|
|
75
|
+
assert.ok(requestId.startsWith('req-'), 'Request ID should start with req-');
|
|
76
|
+
assert.ok(!sessionId.startsWith('req-'), 'Session ID should not start with req-');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// =============================================================================
|
|
80
|
+
// buildLiteLLMMetadataHeaders Tests
|
|
81
|
+
// =============================================================================
|
|
82
|
+
suite('Analytics - buildLiteLLMMetadataHeaders', () => {
|
|
83
|
+
test('returns empty array when useLiteLLM is false', () => {
|
|
84
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(false, {
|
|
85
|
+
sessionId: 'session-1',
|
|
86
|
+
analyticsUserId: 'user-1',
|
|
87
|
+
agentId: 'my-agent',
|
|
88
|
+
});
|
|
89
|
+
assert.deepStrictEqual(headers, []);
|
|
90
|
+
});
|
|
91
|
+
test('returns empty array when metadata is empty', () => {
|
|
92
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, {});
|
|
93
|
+
assert.deepStrictEqual(headers, []);
|
|
94
|
+
});
|
|
95
|
+
test('includes session_id header', () => {
|
|
96
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { sessionId: 'sess-123' });
|
|
97
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-session-id: sess-123'), `Missing session_id header. Headers: ${JSON.stringify(headers)}`);
|
|
98
|
+
});
|
|
99
|
+
test('includes user_id header', () => {
|
|
100
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { analyticsUserId: 'user-42' });
|
|
101
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-user-id: user-42'), `Missing user_id header. Headers: ${JSON.stringify(headers)}`);
|
|
102
|
+
});
|
|
103
|
+
test('includes project_id header', () => {
|
|
104
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { analyticsProjectId: 'agentide-vscode' });
|
|
105
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-project-id: agentide-vscode'), `Missing project_id header. Headers: ${JSON.stringify(headers)}`);
|
|
106
|
+
});
|
|
107
|
+
test('includes agent_id header', () => {
|
|
108
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { agentId: 'code-reviewer' });
|
|
109
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-agent-id: code-reviewer'), `Missing agent_id header. Headers: ${JSON.stringify(headers)}`);
|
|
110
|
+
});
|
|
111
|
+
test('includes agent_version header', () => {
|
|
112
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { agentVersion: '1.2.0' });
|
|
113
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-agent-version: 1.2.0'), `Missing agent_version header. Headers: ${JSON.stringify(headers)}`);
|
|
114
|
+
});
|
|
115
|
+
test('includes source header', () => {
|
|
116
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { source: 'langchain' });
|
|
117
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-source: langchain'), `Missing source header. Headers: ${JSON.stringify(headers)}`);
|
|
118
|
+
});
|
|
119
|
+
test('includes engine header', () => {
|
|
120
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { engine: 'claude' });
|
|
121
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-engine: claude'), `Missing engine header. Headers: ${JSON.stringify(headers)}`);
|
|
122
|
+
});
|
|
123
|
+
test('includes request_id header', () => {
|
|
124
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { requestId: 'req-abcdef12' });
|
|
125
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-request-id: req-abcdef12'), `Missing request_id header. Headers: ${JSON.stringify(headers)}`);
|
|
126
|
+
});
|
|
127
|
+
test('includes langfuse passthrough headers for session_id and user_id', () => {
|
|
128
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, {
|
|
129
|
+
sessionId: 'sess-1',
|
|
130
|
+
analyticsUserId: 'user-1',
|
|
131
|
+
});
|
|
132
|
+
assert.ok(headers.some(h => h === 'langfuse_session_id: sess-1'), 'Should include langfuse_session_id for Langfuse callback compatibility');
|
|
133
|
+
assert.ok(headers.some(h => h === 'langfuse_trace_user_id: user-1'), 'Should include langfuse_trace_user_id for Langfuse callback compatibility');
|
|
134
|
+
});
|
|
135
|
+
// --- Use Case: AgentHippo pack (Mode A) — fully automatic ---
|
|
136
|
+
test('Mode A: AgentHippo pack produces all 10 headers (8 analytics + 2 langfuse)', () => {
|
|
137
|
+
const metadata = {
|
|
138
|
+
sessionId: 'vscode-chat-uuid-1234',
|
|
139
|
+
analyticsUserId: 'dev@example.com',
|
|
140
|
+
analyticsProjectId: 'agentide-vscode',
|
|
141
|
+
agentId: 'code-reviewer',
|
|
142
|
+
agentVersion: '1.2.0',
|
|
143
|
+
source: 'agenthippo',
|
|
144
|
+
engine: 'claude',
|
|
145
|
+
requestId: 'req-abcdef12',
|
|
146
|
+
};
|
|
147
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
148
|
+
// 8 x-litellm-metadata-* headers + langfuse_session_id + langfuse_trace_user_id
|
|
149
|
+
assert.strictEqual(headers.length, 10, `Expected 10 headers, got ${headers.length}: ${JSON.stringify(headers)}`);
|
|
150
|
+
});
|
|
151
|
+
// --- Use Case: AgentHippo default (Mode B) ---
|
|
152
|
+
test('Mode B: AgentHippo default agent produces all 10 headers', () => {
|
|
153
|
+
const metadata = {
|
|
154
|
+
sessionId: 'vscode-chat-uuid-5678',
|
|
155
|
+
analyticsUserId: 'dev@example.com',
|
|
156
|
+
analyticsProjectId: 'agentide-vscode',
|
|
157
|
+
agentId: 'default',
|
|
158
|
+
agentVersion: 'workspace',
|
|
159
|
+
source: 'agenthippo',
|
|
160
|
+
engine: 'codex',
|
|
161
|
+
requestId: 'req-11223344',
|
|
162
|
+
};
|
|
163
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
164
|
+
assert.strictEqual(headers.length, 10);
|
|
165
|
+
assert.ok(headers.some(h => h.includes('agent-id: default')));
|
|
166
|
+
assert.ok(headers.some(h => h.includes('agent-version: workspace')));
|
|
167
|
+
});
|
|
168
|
+
// --- Use Case: LangChain via LiteLLM proxy (Mode C) — developer sets minimum ---
|
|
169
|
+
test('Mode C: LangChain developer sets minimum viable metadata', () => {
|
|
170
|
+
const metadata = {
|
|
171
|
+
sessionId: 'langchain-run-001',
|
|
172
|
+
agentId: 'my-support-bot',
|
|
173
|
+
};
|
|
174
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
175
|
+
// session-id + agent-id + langfuse_session_id = 3
|
|
176
|
+
assert.strictEqual(headers.length, 3);
|
|
177
|
+
assert.ok(headers.some(h => h.includes('session-id: langchain-run-001')));
|
|
178
|
+
assert.ok(headers.some(h => h.includes('agent-id: my-support-bot')));
|
|
179
|
+
});
|
|
180
|
+
// --- Use Case: LangChain developer sets full metadata (Mode C) ---
|
|
181
|
+
test('Mode C: LangChain developer sets full metadata', () => {
|
|
182
|
+
const metadata = {
|
|
183
|
+
sessionId: 'langchain-run-001',
|
|
184
|
+
agentId: 'my-support-bot',
|
|
185
|
+
agentVersion: '0.3.1',
|
|
186
|
+
source: 'langchain',
|
|
187
|
+
};
|
|
188
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
189
|
+
// session-id + agent-id + agent-version + source + langfuse_session_id = 5
|
|
190
|
+
assert.strictEqual(headers.length, 5);
|
|
191
|
+
assert.ok(headers.some(h => h.includes('source: langchain')));
|
|
192
|
+
});
|
|
193
|
+
// --- Use Case: Direct SDK (Mode D) ---
|
|
194
|
+
test('Mode D: Anthropic SDK developer sets metadata', () => {
|
|
195
|
+
const metadata = {
|
|
196
|
+
sessionId: 'exp-42',
|
|
197
|
+
agentId: 'my-tool',
|
|
198
|
+
source: 'anthropic-sdk',
|
|
199
|
+
};
|
|
200
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
201
|
+
// session-id + agent-id + source + langfuse_session_id = 4
|
|
202
|
+
assert.strictEqual(headers.length, 4);
|
|
203
|
+
assert.ok(headers.some(h => h.includes('source: anthropic-sdk')));
|
|
204
|
+
});
|
|
205
|
+
test('trims whitespace from values', () => {
|
|
206
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { sessionId: ' sess-1 ' });
|
|
207
|
+
assert.ok(headers.some(h => h === 'x-litellm-metadata-session-id: sess-1'));
|
|
208
|
+
});
|
|
209
|
+
test('skips empty/whitespace-only values', () => {
|
|
210
|
+
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, {
|
|
211
|
+
sessionId: '',
|
|
212
|
+
agentId: ' ',
|
|
213
|
+
source: 'agenthippo',
|
|
214
|
+
});
|
|
215
|
+
// Only source header (sessionId is empty so no langfuse passthrough either)
|
|
216
|
+
assert.strictEqual(headers.length, 1, `Only non-empty source should produce a header, got: ${JSON.stringify(headers)}`);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
// =============================================================================
|
|
220
|
+
// SessionEventWriter Tests
|
|
221
|
+
// =============================================================================
|
|
222
|
+
suite('Analytics - SessionEventWriter', () => {
|
|
223
|
+
let testDir;
|
|
224
|
+
let writer;
|
|
225
|
+
setup(async () => {
|
|
226
|
+
testDir = await createUniqueTempDir('agentide-analytics-test-');
|
|
227
|
+
writer = new sessionEvents_1.SessionEventWriter(testDir);
|
|
228
|
+
});
|
|
229
|
+
teardown(async () => {
|
|
230
|
+
try {
|
|
231
|
+
await removeDirWithRetries(testDir);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// ignore
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
test('creates sessions directory on first write', async () => {
|
|
238
|
+
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Bash' });
|
|
239
|
+
const stat = await fs_1.promises.stat(testDir);
|
|
240
|
+
assert.ok(stat.isDirectory());
|
|
241
|
+
});
|
|
242
|
+
test('writes JSONL file named by session ID', async () => {
|
|
243
|
+
await writer.append('sess-abc', 'req-1', 'tool_start', { toolName: 'Read' });
|
|
244
|
+
const filePath = path.join(testDir, 'sess-abc.jsonl');
|
|
245
|
+
const stat = await fs_1.promises.stat(filePath);
|
|
246
|
+
assert.ok(stat.isFile());
|
|
247
|
+
});
|
|
248
|
+
test('writes valid JSON per line', async () => {
|
|
249
|
+
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Bash' });
|
|
250
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
251
|
+
const lines = content.trim().split('\n');
|
|
252
|
+
assert.strictEqual(lines.length, 1);
|
|
253
|
+
const event = JSON.parse(lines[0]);
|
|
254
|
+
assert.strictEqual(event.session_id, 'sess-1');
|
|
255
|
+
assert.strictEqual(event.request_id, 'req-1');
|
|
256
|
+
assert.strictEqual(event.event_type, 'tool_start');
|
|
257
|
+
assert.strictEqual(event.payload.toolName, 'Bash');
|
|
258
|
+
assert.ok(typeof event.timestamp === 'number');
|
|
259
|
+
});
|
|
260
|
+
test('appends multiple events to same session file', async () => {
|
|
261
|
+
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Bash', callId: 'c1' });
|
|
262
|
+
await writer.append('sess-1', 'req-1', 'tool_end', { toolName: 'Bash', callId: 'c1', isError: false });
|
|
263
|
+
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Read', callId: 'c2' });
|
|
264
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
265
|
+
const lines = content.trim().split('\n');
|
|
266
|
+
assert.strictEqual(lines.length, 3);
|
|
267
|
+
const events = lines.map(l => JSON.parse(l));
|
|
268
|
+
assert.strictEqual(events[0].event_type, 'tool_start');
|
|
269
|
+
assert.strictEqual(events[0].payload.toolName, 'Bash');
|
|
270
|
+
assert.strictEqual(events[1].event_type, 'tool_end');
|
|
271
|
+
assert.strictEqual(events[2].event_type, 'tool_start');
|
|
272
|
+
assert.strictEqual(events[2].payload.toolName, 'Read');
|
|
273
|
+
});
|
|
274
|
+
test('different sessions write to different files', async () => {
|
|
275
|
+
await writer.append('sess-A', 'req-1', 'turn_start', {});
|
|
276
|
+
await writer.append('sess-B', 'req-2', 'turn_start', {});
|
|
277
|
+
const fileA = await fs_1.promises.stat(path.join(testDir, 'sess-A.jsonl'));
|
|
278
|
+
const fileB = await fs_1.promises.stat(path.join(testDir, 'sess-B.jsonl'));
|
|
279
|
+
assert.ok(fileA.isFile());
|
|
280
|
+
assert.ok(fileB.isFile());
|
|
281
|
+
});
|
|
282
|
+
test('request_id is preserved in events', async () => {
|
|
283
|
+
await writer.append('sess-1', 'req-abc', 'tool_start', { toolName: 'Test' });
|
|
284
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
285
|
+
const event = JSON.parse(content.trim());
|
|
286
|
+
assert.strictEqual(event.request_id, 'req-abc');
|
|
287
|
+
});
|
|
288
|
+
test('timestamps are monotonically increasing', async () => {
|
|
289
|
+
await writer.append('sess-1', 'req-1', 'turn_start', {});
|
|
290
|
+
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'A' });
|
|
291
|
+
await writer.append('sess-1', 'req-1', 'tool_end', { toolName: 'A' });
|
|
292
|
+
await writer.append('sess-1', 'req-1', 'turn_end', { success: true });
|
|
293
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
294
|
+
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
295
|
+
for (let i = 1; i < events.length; i++) {
|
|
296
|
+
assert.ok(events[i].timestamp >= events[i - 1].timestamp, `Timestamps should be monotonic: ${events[i - 1].timestamp} -> ${events[i].timestamp}`);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
test('getSessionsDir returns the base directory', () => {
|
|
300
|
+
assert.strictEqual(writer.getSessionsDir(), testDir);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
// =============================================================================
|
|
304
|
+
// ObservableStreamEmitter Tests
|
|
305
|
+
// =============================================================================
|
|
306
|
+
suite('Analytics - ObservableStreamEmitter', () => {
|
|
307
|
+
let testDir;
|
|
308
|
+
let writer;
|
|
309
|
+
let innerCalls;
|
|
310
|
+
let innerEmitter;
|
|
311
|
+
setup(async () => {
|
|
312
|
+
testDir = await createUniqueTempDir('agentide-emitter-test-');
|
|
313
|
+
writer = new sessionEvents_1.SessionEventWriter(testDir);
|
|
314
|
+
innerCalls = [];
|
|
315
|
+
// Mock inner emitter that records calls
|
|
316
|
+
innerEmitter = {
|
|
317
|
+
async thinking(delta) { innerCalls.push({ method: 'thinking', args: [delta] }); },
|
|
318
|
+
async text(delta) { innerCalls.push({ method: 'text', args: [delta] }); },
|
|
319
|
+
async toolStart(name, input, id, meta) {
|
|
320
|
+
innerCalls.push({ method: 'toolStart', args: [name, input, id, meta] });
|
|
321
|
+
},
|
|
322
|
+
async toolEnd(name, id, result, isError, meta) {
|
|
323
|
+
innerCalls.push({ method: 'toolEnd', args: [name, id, result, isError, meta] });
|
|
324
|
+
},
|
|
325
|
+
async progress(msg) { innerCalls.push({ method: 'progress', args: [msg] }); },
|
|
326
|
+
async question(payload) {
|
|
327
|
+
innerCalls.push({ method: 'question', args: [payload] });
|
|
328
|
+
return { selected: [], freeText: null };
|
|
329
|
+
},
|
|
330
|
+
async error(msg) { innerCalls.push({ method: 'error', args: [msg] }); },
|
|
331
|
+
async done() { innerCalls.push({ method: 'done', args: [] }); },
|
|
332
|
+
};
|
|
333
|
+
});
|
|
334
|
+
teardown(async () => {
|
|
335
|
+
try {
|
|
336
|
+
await removeDirWithRetries(testDir);
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// ignore
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
test('passes through thinking() to inner emitter', async () => {
|
|
343
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
344
|
+
await emitter.thinking('hello');
|
|
345
|
+
assert.strictEqual(innerCalls.length, 1);
|
|
346
|
+
assert.strictEqual(innerCalls[0].method, 'thinking');
|
|
347
|
+
assert.deepStrictEqual(innerCalls[0].args, ['hello']);
|
|
348
|
+
});
|
|
349
|
+
test('passes through text() to inner emitter', async () => {
|
|
350
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
351
|
+
await emitter.text('world');
|
|
352
|
+
assert.strictEqual(innerCalls.length, 1);
|
|
353
|
+
assert.strictEqual(innerCalls[0].method, 'text');
|
|
354
|
+
});
|
|
355
|
+
test('passes through progress() to inner emitter', async () => {
|
|
356
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
357
|
+
await emitter.progress('Thinking...');
|
|
358
|
+
assert.strictEqual(innerCalls.length, 1);
|
|
359
|
+
assert.strictEqual(innerCalls[0].method, 'progress');
|
|
360
|
+
});
|
|
361
|
+
test('passes through done() to inner emitter', async () => {
|
|
362
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
363
|
+
await emitter.done();
|
|
364
|
+
assert.strictEqual(innerCalls.length, 1);
|
|
365
|
+
assert.strictEqual(innerCalls[0].method, 'done');
|
|
366
|
+
});
|
|
367
|
+
test('toolStart writes session event AND passes through', async () => {
|
|
368
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
369
|
+
await emitter.toolStart('Bash', 'ls -la', 'call-1');
|
|
370
|
+
// Inner emitter was called
|
|
371
|
+
assert.strictEqual(innerCalls.length, 1);
|
|
372
|
+
assert.strictEqual(innerCalls[0].method, 'toolStart');
|
|
373
|
+
// Session event was written
|
|
374
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
375
|
+
const event = JSON.parse(content.trim());
|
|
376
|
+
assert.strictEqual(event.event_type, 'tool_start');
|
|
377
|
+
assert.strictEqual(event.payload.toolName, 'Bash');
|
|
378
|
+
assert.strictEqual(event.payload.callId, 'call-1');
|
|
379
|
+
assert.strictEqual(event.payload.inputPreview, 'ls -la');
|
|
380
|
+
assert.strictEqual(event.request_id, 'req-1');
|
|
381
|
+
});
|
|
382
|
+
test('toolEnd writes session event AND passes through', async () => {
|
|
383
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
384
|
+
await emitter.toolEnd('Bash', 'call-1', 'file1.txt\nfile2.txt', false);
|
|
385
|
+
// Inner emitter was called
|
|
386
|
+
assert.strictEqual(innerCalls.length, 1);
|
|
387
|
+
assert.strictEqual(innerCalls[0].method, 'toolEnd');
|
|
388
|
+
// Session event was written
|
|
389
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
390
|
+
const event = JSON.parse(content.trim());
|
|
391
|
+
assert.strictEqual(event.event_type, 'tool_end');
|
|
392
|
+
assert.strictEqual(event.payload.toolName, 'Bash');
|
|
393
|
+
assert.strictEqual(event.payload.isError, false);
|
|
394
|
+
});
|
|
395
|
+
test('toolEnd records errors', async () => {
|
|
396
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
397
|
+
await emitter.toolEnd('Bash', 'call-1', 'command not found', true);
|
|
398
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
399
|
+
const event = JSON.parse(content.trim());
|
|
400
|
+
assert.strictEqual(event.payload.isError, true);
|
|
401
|
+
});
|
|
402
|
+
test('error() writes session event AND passes through', async () => {
|
|
403
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
404
|
+
await emitter.error('Something went wrong');
|
|
405
|
+
assert.strictEqual(innerCalls.length, 1);
|
|
406
|
+
assert.strictEqual(innerCalls[0].method, 'error');
|
|
407
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
408
|
+
const event = JSON.parse(content.trim());
|
|
409
|
+
assert.strictEqual(event.event_type, 'error');
|
|
410
|
+
assert.strictEqual(event.payload.message, 'Something went wrong');
|
|
411
|
+
});
|
|
412
|
+
test('emitTurnStart writes turn_start event', async () => {
|
|
413
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
414
|
+
await emitter.emitTurnStart();
|
|
415
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
416
|
+
const event = JSON.parse(content.trim());
|
|
417
|
+
assert.strictEqual(event.event_type, 'turn_start');
|
|
418
|
+
assert.strictEqual(event.session_id, 'sess-1');
|
|
419
|
+
assert.strictEqual(event.request_id, 'req-1');
|
|
420
|
+
});
|
|
421
|
+
test('emitTurnEnd writes turn_end event with success flag', async () => {
|
|
422
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
423
|
+
await emitter.emitTurnEnd(true);
|
|
424
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
425
|
+
const event = JSON.parse(content.trim());
|
|
426
|
+
assert.strictEqual(event.event_type, 'turn_end');
|
|
427
|
+
assert.strictEqual(event.payload.success, true);
|
|
428
|
+
});
|
|
429
|
+
test('truncates long tool input to 500 chars', async () => {
|
|
430
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
431
|
+
const longInput = 'x'.repeat(1000);
|
|
432
|
+
await emitter.toolStart('Read', longInput, 'call-1');
|
|
433
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
434
|
+
const event = JSON.parse(content.trim());
|
|
435
|
+
assert.strictEqual(event.payload.inputPreview.length, 500);
|
|
436
|
+
});
|
|
437
|
+
test('truncates long tool result to 500 chars', async () => {
|
|
438
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
439
|
+
const longResult = 'y'.repeat(1000);
|
|
440
|
+
await emitter.toolEnd('Read', 'call-1', longResult, false);
|
|
441
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
442
|
+
const event = JSON.parse(content.trim());
|
|
443
|
+
assert.strictEqual(event.payload.resultPreview.length, 500);
|
|
444
|
+
});
|
|
445
|
+
// --- Use Case: Full agent request lifecycle ---
|
|
446
|
+
test('Use Case: full request lifecycle produces correct event sequence', async () => {
|
|
447
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-debug', 'req-42');
|
|
448
|
+
// Simulate a full agent request lifecycle
|
|
449
|
+
await emitter.emitTurnStart();
|
|
450
|
+
await emitter.progress('Thinking...');
|
|
451
|
+
await emitter.thinking('Let me analyze this...');
|
|
452
|
+
await emitter.toolStart('Read', '/path/to/file.ts', 'tool-1');
|
|
453
|
+
await emitter.toolEnd('Read', 'tool-1', 'file contents here', false);
|
|
454
|
+
await emitter.toolStart('Bash', 'npm test', 'tool-2');
|
|
455
|
+
await emitter.toolEnd('Bash', 'tool-2', 'All tests passed', false);
|
|
456
|
+
await emitter.text('I analyzed the code and ran the tests.');
|
|
457
|
+
await emitter.done();
|
|
458
|
+
await emitter.emitTurnEnd(true);
|
|
459
|
+
// Verify inner emitter got all pass-through calls
|
|
460
|
+
const methods = innerCalls.map(c => c.method);
|
|
461
|
+
assert.deepStrictEqual(methods, [
|
|
462
|
+
'progress', 'thinking', 'toolStart', 'toolEnd',
|
|
463
|
+
'toolStart', 'toolEnd', 'text', 'done',
|
|
464
|
+
]);
|
|
465
|
+
// Verify session events (only tool/turn events, not thinking/text/progress)
|
|
466
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-debug.jsonl'), 'utf8');
|
|
467
|
+
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
468
|
+
const eventTypes = events.map((e) => e.event_type);
|
|
469
|
+
assert.deepStrictEqual(eventTypes, [
|
|
470
|
+
'turn_start', 'tool_start', 'tool_end', 'tool_start', 'tool_end', 'turn_end',
|
|
471
|
+
]);
|
|
472
|
+
// All events have correct session_id and request_id
|
|
473
|
+
for (const event of events) {
|
|
474
|
+
assert.strictEqual(event.session_id, 'sess-debug');
|
|
475
|
+
assert.strictEqual(event.request_id, 'req-42');
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
// --- Use Case: Detect tool loop from events ---
|
|
479
|
+
test('Use Case: tool loop detection — 6 calls to same tool', async () => {
|
|
480
|
+
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-loop', 'req-1');
|
|
481
|
+
await emitter.emitTurnStart();
|
|
482
|
+
// Simulate an agent calling read_file 6 times (possible loop)
|
|
483
|
+
for (let i = 0; i < 6; i++) {
|
|
484
|
+
await emitter.toolStart('read_file', `/path/file${i}.ts`, `call-${i}`);
|
|
485
|
+
await emitter.toolEnd('read_file', `call-${i}`, 'contents', false);
|
|
486
|
+
}
|
|
487
|
+
await emitter.emitTurnEnd(true);
|
|
488
|
+
// Read events and count tool_start for read_file
|
|
489
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-loop.jsonl'), 'utf8');
|
|
490
|
+
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
491
|
+
const readFileStarts = events.filter((e) => e.event_type === 'tool_start' && e.payload.toolName === 'read_file');
|
|
492
|
+
assert.strictEqual(readFileStarts.length, 6, 'Should detect 6 read_file calls');
|
|
493
|
+
// This is what --tool-loops query would flag as "POSSIBLE LOOP" (>5 calls)
|
|
494
|
+
});
|
|
495
|
+
// --- Use Case: Multiple requests in same session ---
|
|
496
|
+
test('Use Case: multiple requests in same session have different request_ids', async () => {
|
|
497
|
+
const reqId1 = (0, base_1.generateRequestId)();
|
|
498
|
+
const reqId2 = (0, base_1.generateRequestId)();
|
|
499
|
+
const emitter1 = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-multi', reqId1);
|
|
500
|
+
await emitter1.emitTurnStart();
|
|
501
|
+
await emitter1.toolStart('Bash', 'echo hello', 'c1');
|
|
502
|
+
await emitter1.toolEnd('Bash', 'c1', 'hello', false);
|
|
503
|
+
await emitter1.emitTurnEnd(true);
|
|
504
|
+
const emitter2 = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-multi', reqId2);
|
|
505
|
+
await emitter2.emitTurnStart();
|
|
506
|
+
await emitter2.toolStart('Read', '/file.ts', 'c2');
|
|
507
|
+
await emitter2.toolEnd('Read', 'c2', 'contents', false);
|
|
508
|
+
await emitter2.emitTurnEnd(true);
|
|
509
|
+
// All events in same session file
|
|
510
|
+
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-multi.jsonl'), 'utf8');
|
|
511
|
+
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
512
|
+
assert.strictEqual(events.length, 8); // 2 x (turn_start, tool_start, tool_end, turn_end)
|
|
513
|
+
// First 4 events have reqId1, last 4 have reqId2
|
|
514
|
+
const firstFour = events.slice(0, 4);
|
|
515
|
+
const lastFour = events.slice(4);
|
|
516
|
+
for (const e of firstFour) {
|
|
517
|
+
assert.strictEqual(e.request_id, reqId1);
|
|
518
|
+
}
|
|
519
|
+
for (const e of lastFour) {
|
|
520
|
+
assert.strictEqual(e.request_id, reqId2);
|
|
521
|
+
}
|
|
522
|
+
assert.notStrictEqual(reqId1, reqId2, 'Request IDs should be different');
|
|
523
|
+
});
|
|
524
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
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
|
+
require("mocha");
|
|
40
|
+
const assert = __importStar(require("assert"));
|
|
41
|
+
const bootstrapApply_js_1 = require("../auth/bootstrapApply.js");
|
|
42
|
+
function createMockTarget() {
|
|
43
|
+
const global = new Map();
|
|
44
|
+
const settings = new Map();
|
|
45
|
+
let apiKeyCalls = 0;
|
|
46
|
+
const target = {
|
|
47
|
+
getConfiguration(section) {
|
|
48
|
+
return {
|
|
49
|
+
get(key, defaultValue) {
|
|
50
|
+
const full = `${section}.${key}`;
|
|
51
|
+
return (settings.has(full) ? settings.get(full) : defaultValue);
|
|
52
|
+
},
|
|
53
|
+
async update(key, value) {
|
|
54
|
+
settings.set(`${section}.${key}`, value);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
ConfigurationTarget: { Global: 1 },
|
|
59
|
+
async setParticipantApiKey() {
|
|
60
|
+
apiKeyCalls++;
|
|
61
|
+
},
|
|
62
|
+
async globalStateUpdate(key, value) {
|
|
63
|
+
if (value === undefined) {
|
|
64
|
+
global.delete(key);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
global.set(key, value);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
globalStateGet(key) {
|
|
71
|
+
return global.get(key);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
return { target, settings, global, getApiKeyCalls: () => apiKeyCalls };
|
|
75
|
+
}
|
|
76
|
+
const sampleBootstrap = {
|
|
77
|
+
version: 1,
|
|
78
|
+
user: { id: 'usr_1', email: 'you@acme.com', displayName: 'You' },
|
|
79
|
+
team: { id: 'team_acme', name: 'Acme', role: 'member' },
|
|
80
|
+
store: { repo: 'acme/store', indexUrl: 'https://acme.github.io/store', githubOrg: 'acme' },
|
|
81
|
+
routing: { litellmBaseUrl: 'http://llm.acme', litellmApiKey: 'ahk_123' },
|
|
82
|
+
policy: { byokAllowed: true, teamManagedSettings: ['store', 'routing'] },
|
|
83
|
+
};
|
|
84
|
+
suite('BootstrapApply', () => {
|
|
85
|
+
test('applyIdeBootstrap writes store and routing settings', async () => {
|
|
86
|
+
const { target, settings, global, getApiKeyCalls } = createMockTarget();
|
|
87
|
+
const result = await (0, bootstrapApply_js_1.applyIdeBootstrap)(sampleBootstrap, target);
|
|
88
|
+
assert.deepStrictEqual(result.applied, ['store', 'routing']);
|
|
89
|
+
assert.strictEqual(settings.get('agentide.storeRepo'), 'acme/store');
|
|
90
|
+
assert.strictEqual(settings.get('agentide.providers.litellm.baseUrl'), 'http://llm.acme');
|
|
91
|
+
assert.strictEqual(getApiKeyCalls(), 1);
|
|
92
|
+
assert.strictEqual(global.get('agentide.team.id'), 'team_acme');
|
|
93
|
+
});
|
|
94
|
+
test('revertTeamManagedBootstrap restores defaults', async () => {
|
|
95
|
+
const { target, settings, global } = createMockTarget();
|
|
96
|
+
await (0, bootstrapApply_js_1.applyIdeBootstrap)(sampleBootstrap, target);
|
|
97
|
+
await (0, bootstrapApply_js_1.revertTeamManagedBootstrap)(target);
|
|
98
|
+
assert.strictEqual(settings.get('agentide.storeRepo'), 'agenthippoai/agenthippo-store');
|
|
99
|
+
assert.strictEqual(settings.get('agentide.providers.litellm.baseUrl'), '');
|
|
100
|
+
assert.strictEqual(global.get('agentide.team.id'), undefined);
|
|
101
|
+
});
|
|
102
|
+
});
|