@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
|
@@ -1,756 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
-
* Licensed under the MIT License. See LICENSE.txt in the project root for license information.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
-
if (k2 === undefined) k2 = k;
|
|
8
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
-
}
|
|
12
|
-
Object.defineProperty(o, k2, desc);
|
|
13
|
-
}) : (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
require("mocha");
|
|
41
|
-
const assert = __importStar(require("assert"));
|
|
42
|
-
const path = __importStar(require("path"));
|
|
43
|
-
const os = __importStar(require("os"));
|
|
44
|
-
const fs_1 = require("fs");
|
|
45
|
-
const base_1 = require("../engines/base");
|
|
46
|
-
const sessionEvents_1 = require("../analytics/sessionEvents");
|
|
47
|
-
const identity_1 = require("../analytics/identity");
|
|
48
|
-
/**
|
|
49
|
-
* Run `fn` with prompt/tool content capture opted in.
|
|
50
|
-
*
|
|
51
|
-
* Content capture is off by default now (PLAN/compliance-req.md §6), so the tests that assert on
|
|
52
|
-
* previews have to say out loud that they are testing the opt-in path.
|
|
53
|
-
*/
|
|
54
|
-
async function withContentCapture(fn) {
|
|
55
|
-
const previous = process.env[identity_1.CONTENT_CAPTURE_ENV];
|
|
56
|
-
process.env[identity_1.CONTENT_CAPTURE_ENV] = '1';
|
|
57
|
-
try {
|
|
58
|
-
return await fn();
|
|
59
|
-
}
|
|
60
|
-
finally {
|
|
61
|
-
if (previous === undefined) {
|
|
62
|
-
delete process.env[identity_1.CONTENT_CAPTURE_ENV];
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
process.env[identity_1.CONTENT_CAPTURE_ENV] = previous;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async function createUniqueTempDir(prefix) {
|
|
70
|
-
return fs_1.promises.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
71
|
-
}
|
|
72
|
-
async function removeDirWithRetries(dirPath) {
|
|
73
|
-
await fs_1.promises.rm(dirPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 });
|
|
74
|
-
}
|
|
75
|
-
// =============================================================================
|
|
76
|
-
// generateRequestId Tests
|
|
77
|
-
// =============================================================================
|
|
78
|
-
suite('Analytics - generateRequestId', () => {
|
|
79
|
-
test('returns string starting with req- prefix', () => {
|
|
80
|
-
const id = (0, base_1.generateRequestId)();
|
|
81
|
-
assert.ok(id.startsWith('req-'), `Expected req- prefix, got: ${id}`);
|
|
82
|
-
});
|
|
83
|
-
test('returns correct format: req-<8 hex chars>', () => {
|
|
84
|
-
const id = (0, base_1.generateRequestId)();
|
|
85
|
-
assert.match(id, /^req-[0-9a-f]{1,8}$/, `Unexpected format: ${id}`);
|
|
86
|
-
});
|
|
87
|
-
test('generates unique IDs', () => {
|
|
88
|
-
const ids = new Set();
|
|
89
|
-
for (let i = 0; i < 100; i++) {
|
|
90
|
-
ids.add((0, base_1.generateRequestId)());
|
|
91
|
-
}
|
|
92
|
-
// With 8 hex chars, collisions in 100 attempts are extremely unlikely
|
|
93
|
-
assert.ok(ids.size > 95, `Expected near-unique IDs, got ${ids.size} unique out of 100`);
|
|
94
|
-
});
|
|
95
|
-
test('is distinguishable from session IDs (UUIDs)', () => {
|
|
96
|
-
const requestId = (0, base_1.generateRequestId)();
|
|
97
|
-
const sessionId = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890';
|
|
98
|
-
assert.ok(requestId.startsWith('req-'), 'Request ID should start with req-');
|
|
99
|
-
assert.ok(!sessionId.startsWith('req-'), 'Session ID should not start with req-');
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
// =============================================================================
|
|
103
|
-
// buildLiteLLMMetadataHeaders Tests
|
|
104
|
-
// =============================================================================
|
|
105
|
-
suite('Analytics - buildLiteLLMMetadataHeaders', () => {
|
|
106
|
-
test('returns empty array when useLiteLLM is false', () => {
|
|
107
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(false, {
|
|
108
|
-
sessionId: 'session-1',
|
|
109
|
-
analyticsUserId: 'user-1',
|
|
110
|
-
agentId: 'my-agent',
|
|
111
|
-
});
|
|
112
|
-
assert.deepStrictEqual(headers, []);
|
|
113
|
-
});
|
|
114
|
-
test('returns empty array when metadata is empty', () => {
|
|
115
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, {});
|
|
116
|
-
assert.deepStrictEqual(headers, []);
|
|
117
|
-
});
|
|
118
|
-
test('includes session_id header', () => {
|
|
119
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { sessionId: 'sess-123' });
|
|
120
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-session-id: sess-123'), `Missing session_id header. Headers: ${JSON.stringify(headers)}`);
|
|
121
|
-
});
|
|
122
|
-
test('includes user_id header, hashed', () => {
|
|
123
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { analyticsUserId: 'user-42' });
|
|
124
|
-
assert.ok(headers.some(h => h === `x-litellm-metadata-user-id: ${(0, identity_1.hashIdentity)('user-42')}`), `Missing user_id header. Headers: ${JSON.stringify(headers)}`);
|
|
125
|
-
});
|
|
126
|
-
test('the raw user id never leaves the process on a header', () => {
|
|
127
|
-
// The proxy logs every request and may forward to a third-party observability backend, so
|
|
128
|
-
// a raw address here is a directory of who works at the customer.
|
|
129
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { analyticsUserId: 'priya@meridian.com' });
|
|
130
|
-
assert.ok(!headers.some(h => h.includes('priya@meridian.com')), JSON.stringify(headers));
|
|
131
|
-
assert.ok(headers.some(h => h.startsWith('x-litellm-metadata-user-id: anon_')));
|
|
132
|
-
assert.ok(headers.some(h => h.startsWith('langfuse_trace_user_id: anon_')));
|
|
133
|
-
});
|
|
134
|
-
test('includes project_id header', () => {
|
|
135
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { analyticsProjectId: 'agentide-vscode' });
|
|
136
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-project-id: agentide-vscode'), `Missing project_id header. Headers: ${JSON.stringify(headers)}`);
|
|
137
|
-
});
|
|
138
|
-
test('includes agent_id header', () => {
|
|
139
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { agentId: 'code-reviewer' });
|
|
140
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-agent-id: code-reviewer'), `Missing agent_id header. Headers: ${JSON.stringify(headers)}`);
|
|
141
|
-
});
|
|
142
|
-
test('includes agent_version header', () => {
|
|
143
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { agentVersion: '1.2.0' });
|
|
144
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-agent-version: 1.2.0'), `Missing agent_version header. Headers: ${JSON.stringify(headers)}`);
|
|
145
|
-
});
|
|
146
|
-
test('includes source header', () => {
|
|
147
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { source: 'langchain' });
|
|
148
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-source: langchain'), `Missing source header. Headers: ${JSON.stringify(headers)}`);
|
|
149
|
-
});
|
|
150
|
-
test('includes engine header', () => {
|
|
151
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { engine: 'claude' });
|
|
152
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-engine: claude'), `Missing engine header. Headers: ${JSON.stringify(headers)}`);
|
|
153
|
-
});
|
|
154
|
-
test('includes request_id header', () => {
|
|
155
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { requestId: 'req-abcdef12' });
|
|
156
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-request-id: req-abcdef12'), `Missing request_id header. Headers: ${JSON.stringify(headers)}`);
|
|
157
|
-
});
|
|
158
|
-
test('includes langfuse passthrough headers for session_id and user_id', () => {
|
|
159
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, {
|
|
160
|
-
sessionId: 'sess-1',
|
|
161
|
-
analyticsUserId: 'user-1',
|
|
162
|
-
});
|
|
163
|
-
assert.ok(headers.some(h => h === 'langfuse_session_id: sess-1'), 'Should include langfuse_session_id for Langfuse callback compatibility');
|
|
164
|
-
assert.ok(headers.some(h => h === `langfuse_trace_user_id: ${(0, identity_1.hashIdentity)('user-1')}`), 'Should include langfuse_trace_user_id for Langfuse callback compatibility');
|
|
165
|
-
});
|
|
166
|
-
// --- Use Case: AgentHippo pack (Mode A) — fully automatic ---
|
|
167
|
-
test('Mode A: AgentHippo pack produces all 10 headers (8 analytics + 2 langfuse)', () => {
|
|
168
|
-
const metadata = {
|
|
169
|
-
sessionId: 'vscode-chat-uuid-1234',
|
|
170
|
-
analyticsUserId: 'dev@example.com',
|
|
171
|
-
analyticsProjectId: 'agentide-vscode',
|
|
172
|
-
agentId: 'code-reviewer',
|
|
173
|
-
agentVersion: '1.2.0',
|
|
174
|
-
source: 'agenthippo',
|
|
175
|
-
engine: 'claude',
|
|
176
|
-
requestId: 'req-abcdef12',
|
|
177
|
-
};
|
|
178
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
179
|
-
// 8 x-litellm-metadata-* headers + langfuse_session_id + langfuse_trace_user_id
|
|
180
|
-
assert.strictEqual(headers.length, 10, `Expected 10 headers, got ${headers.length}: ${JSON.stringify(headers)}`);
|
|
181
|
-
});
|
|
182
|
-
// --- Use Case: AgentHippo default (Mode B) ---
|
|
183
|
-
test('Mode B: AgentHippo default agent produces all 10 headers', () => {
|
|
184
|
-
const metadata = {
|
|
185
|
-
sessionId: 'vscode-chat-uuid-5678',
|
|
186
|
-
analyticsUserId: 'dev@example.com',
|
|
187
|
-
analyticsProjectId: 'agentide-vscode',
|
|
188
|
-
agentId: 'default',
|
|
189
|
-
agentVersion: 'workspace',
|
|
190
|
-
source: 'agenthippo',
|
|
191
|
-
engine: 'codex',
|
|
192
|
-
requestId: 'req-11223344',
|
|
193
|
-
};
|
|
194
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
195
|
-
assert.strictEqual(headers.length, 10);
|
|
196
|
-
assert.ok(headers.some(h => h.includes('agent-id: default')));
|
|
197
|
-
assert.ok(headers.some(h => h.includes('agent-version: workspace')));
|
|
198
|
-
});
|
|
199
|
-
// --- Use Case: LangChain via LiteLLM proxy (Mode C) — developer sets minimum ---
|
|
200
|
-
test('Mode C: LangChain developer sets minimum viable metadata', () => {
|
|
201
|
-
const metadata = {
|
|
202
|
-
sessionId: 'langchain-run-001',
|
|
203
|
-
agentId: 'my-support-bot',
|
|
204
|
-
};
|
|
205
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
206
|
-
// session-id + agent-id + langfuse_session_id = 3
|
|
207
|
-
assert.strictEqual(headers.length, 3);
|
|
208
|
-
assert.ok(headers.some(h => h.includes('session-id: langchain-run-001')));
|
|
209
|
-
assert.ok(headers.some(h => h.includes('agent-id: my-support-bot')));
|
|
210
|
-
});
|
|
211
|
-
// --- Use Case: LangChain developer sets full metadata (Mode C) ---
|
|
212
|
-
test('Mode C: LangChain developer sets full metadata', () => {
|
|
213
|
-
const metadata = {
|
|
214
|
-
sessionId: 'langchain-run-001',
|
|
215
|
-
agentId: 'my-support-bot',
|
|
216
|
-
agentVersion: '0.3.1',
|
|
217
|
-
source: 'langchain',
|
|
218
|
-
};
|
|
219
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
220
|
-
// session-id + agent-id + agent-version + source + langfuse_session_id = 5
|
|
221
|
-
assert.strictEqual(headers.length, 5);
|
|
222
|
-
assert.ok(headers.some(h => h.includes('source: langchain')));
|
|
223
|
-
});
|
|
224
|
-
// --- Use Case: Direct SDK (Mode D) ---
|
|
225
|
-
test('Mode D: Anthropic SDK developer sets metadata', () => {
|
|
226
|
-
const metadata = {
|
|
227
|
-
sessionId: 'exp-42',
|
|
228
|
-
agentId: 'my-tool',
|
|
229
|
-
source: 'anthropic-sdk',
|
|
230
|
-
};
|
|
231
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, metadata);
|
|
232
|
-
// session-id + agent-id + source + langfuse_session_id = 4
|
|
233
|
-
assert.strictEqual(headers.length, 4);
|
|
234
|
-
assert.ok(headers.some(h => h.includes('source: anthropic-sdk')));
|
|
235
|
-
});
|
|
236
|
-
test('trims whitespace from values', () => {
|
|
237
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, { sessionId: ' sess-1 ' });
|
|
238
|
-
assert.ok(headers.some(h => h === 'x-litellm-metadata-session-id: sess-1'));
|
|
239
|
-
});
|
|
240
|
-
test('skips empty/whitespace-only values', () => {
|
|
241
|
-
const headers = (0, base_1.buildLiteLLMMetadataHeaders)(true, {
|
|
242
|
-
sessionId: '',
|
|
243
|
-
agentId: ' ',
|
|
244
|
-
source: 'agenthippo',
|
|
245
|
-
});
|
|
246
|
-
// Only source header (sessionId is empty so no langfuse passthrough either)
|
|
247
|
-
assert.strictEqual(headers.length, 1, `Only non-empty source should produce a header, got: ${JSON.stringify(headers)}`);
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
// =============================================================================
|
|
251
|
-
// SessionEventWriter Tests
|
|
252
|
-
// =============================================================================
|
|
253
|
-
suite('Analytics - SessionEventWriter', () => {
|
|
254
|
-
let testDir;
|
|
255
|
-
let writer;
|
|
256
|
-
setup(async () => {
|
|
257
|
-
testDir = await createUniqueTempDir('agentide-analytics-test-');
|
|
258
|
-
writer = new sessionEvents_1.SessionEventWriter(testDir);
|
|
259
|
-
});
|
|
260
|
-
teardown(async () => {
|
|
261
|
-
try {
|
|
262
|
-
await removeDirWithRetries(testDir);
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
// ignore
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
test('creates sessions directory on first write', async () => {
|
|
269
|
-
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Bash' });
|
|
270
|
-
const stat = await fs_1.promises.stat(testDir);
|
|
271
|
-
assert.ok(stat.isDirectory());
|
|
272
|
-
});
|
|
273
|
-
test('writes JSONL file named by session ID', async () => {
|
|
274
|
-
await writer.append('sess-abc', 'req-1', 'tool_start', { toolName: 'Read' });
|
|
275
|
-
const filePath = path.join(testDir, 'sess-abc.jsonl');
|
|
276
|
-
const stat = await fs_1.promises.stat(filePath);
|
|
277
|
-
assert.ok(stat.isFile());
|
|
278
|
-
});
|
|
279
|
-
test('writes valid JSON per line', async () => {
|
|
280
|
-
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Bash' });
|
|
281
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
282
|
-
const lines = content.trim().split('\n');
|
|
283
|
-
assert.strictEqual(lines.length, 1);
|
|
284
|
-
const event = JSON.parse(lines[0]);
|
|
285
|
-
assert.strictEqual(event.session_id, 'sess-1');
|
|
286
|
-
assert.strictEqual(event.request_id, 'req-1');
|
|
287
|
-
assert.strictEqual(event.event_type, 'tool_start');
|
|
288
|
-
assert.strictEqual(event.payload.toolName, 'Bash');
|
|
289
|
-
assert.ok(typeof event.timestamp === 'number');
|
|
290
|
-
});
|
|
291
|
-
test('appends multiple events to same session file', async () => {
|
|
292
|
-
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Bash', callId: 'c1' });
|
|
293
|
-
await writer.append('sess-1', 'req-1', 'tool_end', { toolName: 'Bash', callId: 'c1', isError: false });
|
|
294
|
-
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'Read', callId: 'c2' });
|
|
295
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
296
|
-
const lines = content.trim().split('\n');
|
|
297
|
-
assert.strictEqual(lines.length, 3);
|
|
298
|
-
const events = lines.map(l => JSON.parse(l));
|
|
299
|
-
assert.strictEqual(events[0].event_type, 'tool_start');
|
|
300
|
-
assert.strictEqual(events[0].payload.toolName, 'Bash');
|
|
301
|
-
assert.strictEqual(events[1].event_type, 'tool_end');
|
|
302
|
-
assert.strictEqual(events[2].event_type, 'tool_start');
|
|
303
|
-
assert.strictEqual(events[2].payload.toolName, 'Read');
|
|
304
|
-
});
|
|
305
|
-
test('different sessions write to different files', async () => {
|
|
306
|
-
await writer.append('sess-A', 'req-1', 'turn_start', {});
|
|
307
|
-
await writer.append('sess-B', 'req-2', 'turn_start', {});
|
|
308
|
-
const fileA = await fs_1.promises.stat(path.join(testDir, 'sess-A.jsonl'));
|
|
309
|
-
const fileB = await fs_1.promises.stat(path.join(testDir, 'sess-B.jsonl'));
|
|
310
|
-
assert.ok(fileA.isFile());
|
|
311
|
-
assert.ok(fileB.isFile());
|
|
312
|
-
});
|
|
313
|
-
test('request_id is preserved in events', async () => {
|
|
314
|
-
await writer.append('sess-1', 'req-abc', 'tool_start', { toolName: 'Test' });
|
|
315
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
316
|
-
const event = JSON.parse(content.trim());
|
|
317
|
-
assert.strictEqual(event.request_id, 'req-abc');
|
|
318
|
-
});
|
|
319
|
-
test('timestamps are monotonically increasing', async () => {
|
|
320
|
-
await writer.append('sess-1', 'req-1', 'turn_start', {});
|
|
321
|
-
await writer.append('sess-1', 'req-1', 'tool_start', { toolName: 'A' });
|
|
322
|
-
await writer.append('sess-1', 'req-1', 'tool_end', { toolName: 'A' });
|
|
323
|
-
await writer.append('sess-1', 'req-1', 'turn_end', { success: true });
|
|
324
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
325
|
-
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
326
|
-
for (let i = 1; i < events.length; i++) {
|
|
327
|
-
assert.ok(events[i].timestamp >= events[i - 1].timestamp, `Timestamps should be monotonic: ${events[i - 1].timestamp} -> ${events[i].timestamp}`);
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
test('getSessionsDir returns the base directory', () => {
|
|
331
|
-
assert.strictEqual(writer.getSessionsDir(), testDir);
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
// =============================================================================
|
|
335
|
-
// ObservableStreamEmitter Tests
|
|
336
|
-
// =============================================================================
|
|
337
|
-
suite('Analytics - ObservableStreamEmitter', () => {
|
|
338
|
-
let testDir;
|
|
339
|
-
let writer;
|
|
340
|
-
let innerCalls;
|
|
341
|
-
let innerEmitter;
|
|
342
|
-
setup(async () => {
|
|
343
|
-
testDir = await createUniqueTempDir('agentide-emitter-test-');
|
|
344
|
-
writer = new sessionEvents_1.SessionEventWriter(testDir);
|
|
345
|
-
innerCalls = [];
|
|
346
|
-
// Mock inner emitter that records calls
|
|
347
|
-
innerEmitter = {
|
|
348
|
-
async thinking(delta) { innerCalls.push({ method: 'thinking', args: [delta] }); },
|
|
349
|
-
async text(delta) { innerCalls.push({ method: 'text', args: [delta] }); },
|
|
350
|
-
async toolStart(name, input, id, meta) {
|
|
351
|
-
innerCalls.push({ method: 'toolStart', args: [name, input, id, meta] });
|
|
352
|
-
},
|
|
353
|
-
async toolEnd(name, id, result, isError, meta) {
|
|
354
|
-
innerCalls.push({ method: 'toolEnd', args: [name, id, result, isError, meta] });
|
|
355
|
-
},
|
|
356
|
-
async progress(msg) { innerCalls.push({ method: 'progress', args: [msg] }); },
|
|
357
|
-
async question(payload) {
|
|
358
|
-
innerCalls.push({ method: 'question', args: [payload] });
|
|
359
|
-
return { selected: [], freeText: null };
|
|
360
|
-
},
|
|
361
|
-
async error(msg) { innerCalls.push({ method: 'error', args: [msg] }); },
|
|
362
|
-
async done() { innerCalls.push({ method: 'done', args: [] }); },
|
|
363
|
-
};
|
|
364
|
-
});
|
|
365
|
-
teardown(async () => {
|
|
366
|
-
try {
|
|
367
|
-
await removeDirWithRetries(testDir);
|
|
368
|
-
}
|
|
369
|
-
catch {
|
|
370
|
-
// ignore
|
|
371
|
-
}
|
|
372
|
-
});
|
|
373
|
-
test('passes through thinking() to inner emitter', async () => {
|
|
374
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
375
|
-
await emitter.thinking('hello');
|
|
376
|
-
assert.strictEqual(innerCalls.length, 1);
|
|
377
|
-
assert.strictEqual(innerCalls[0].method, 'thinking');
|
|
378
|
-
assert.deepStrictEqual(innerCalls[0].args, ['hello']);
|
|
379
|
-
});
|
|
380
|
-
test('passes through text() to inner emitter', async () => {
|
|
381
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
382
|
-
await emitter.text('world');
|
|
383
|
-
assert.strictEqual(innerCalls.length, 1);
|
|
384
|
-
assert.strictEqual(innerCalls[0].method, 'text');
|
|
385
|
-
});
|
|
386
|
-
test('passes through progress() to inner emitter', async () => {
|
|
387
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
388
|
-
await emitter.progress('Thinking...');
|
|
389
|
-
assert.strictEqual(innerCalls.length, 1);
|
|
390
|
-
assert.strictEqual(innerCalls[0].method, 'progress');
|
|
391
|
-
});
|
|
392
|
-
test('passes through done() to inner emitter', async () => {
|
|
393
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
394
|
-
await emitter.done();
|
|
395
|
-
assert.strictEqual(innerCalls.length, 1);
|
|
396
|
-
assert.strictEqual(innerCalls[0].method, 'done');
|
|
397
|
-
});
|
|
398
|
-
test('toolStart writes session event AND passes through', async () => {
|
|
399
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
400
|
-
await emitter.toolStart('Bash', 'ls -la', 'call-1');
|
|
401
|
-
// Inner emitter was called
|
|
402
|
-
assert.strictEqual(innerCalls.length, 1);
|
|
403
|
-
assert.strictEqual(innerCalls[0].method, 'toolStart');
|
|
404
|
-
// Session event was written
|
|
405
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
406
|
-
const event = JSON.parse(content.trim());
|
|
407
|
-
assert.strictEqual(event.event_type, 'tool_start');
|
|
408
|
-
assert.strictEqual(event.payload.toolName, 'Bash');
|
|
409
|
-
assert.strictEqual(event.payload.callId, 'call-1');
|
|
410
|
-
assert.strictEqual(event.request_id, 'req-1');
|
|
411
|
-
// Tool arguments are content: digest by default, no preview.
|
|
412
|
-
assert.strictEqual(event.payload.inputPreview, undefined);
|
|
413
|
-
assert.strictEqual(event.payload.input_length, 6);
|
|
414
|
-
assert.strictEqual(typeof event.payload.input_sha256, 'string');
|
|
415
|
-
});
|
|
416
|
-
test('tool input preview appears only under the content-capture opt-in', async () => {
|
|
417
|
-
await withContentCapture(async () => {
|
|
418
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-optin', 'req-1');
|
|
419
|
-
await emitter.toolStart('Bash', 'ls -la', 'call-1');
|
|
420
|
-
});
|
|
421
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-optin.jsonl'), 'utf8');
|
|
422
|
-
const event = JSON.parse(content.trim());
|
|
423
|
-
assert.strictEqual(event.payload.inputPreview, 'ls -la');
|
|
424
|
-
// The digest is present in both modes, so a query written against it never breaks.
|
|
425
|
-
assert.strictEqual(typeof event.payload.input_sha256, 'string');
|
|
426
|
-
});
|
|
427
|
-
test('tool result content is a digest, not a preview, by default', async () => {
|
|
428
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-nores', 'req-1');
|
|
429
|
-
await emitter.toolEnd('Read', 'call-1', 'CUSTOMER SECRET', false);
|
|
430
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-nores.jsonl'), 'utf8');
|
|
431
|
-
assert.ok(!content.includes('CUSTOMER SECRET'), 'raw tool output must not reach the JSONL');
|
|
432
|
-
const event = JSON.parse(content.trim());
|
|
433
|
-
assert.strictEqual(event.payload.resultPreview, undefined);
|
|
434
|
-
assert.strictEqual(event.payload.result_length, 15);
|
|
435
|
-
});
|
|
436
|
-
test('toolEnd writes session event AND passes through', async () => {
|
|
437
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
438
|
-
await emitter.toolEnd('Bash', 'call-1', 'file1.txt\nfile2.txt', false);
|
|
439
|
-
// Inner emitter was called
|
|
440
|
-
assert.strictEqual(innerCalls.length, 1);
|
|
441
|
-
assert.strictEqual(innerCalls[0].method, 'toolEnd');
|
|
442
|
-
// Session event was written
|
|
443
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
444
|
-
const event = JSON.parse(content.trim());
|
|
445
|
-
assert.strictEqual(event.event_type, 'tool_end');
|
|
446
|
-
assert.strictEqual(event.payload.toolName, 'Bash');
|
|
447
|
-
assert.strictEqual(event.payload.isError, false);
|
|
448
|
-
});
|
|
449
|
-
test('toolEnd records errors', async () => {
|
|
450
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
451
|
-
await emitter.toolEnd('Bash', 'call-1', 'command not found', true);
|
|
452
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
453
|
-
const event = JSON.parse(content.trim());
|
|
454
|
-
assert.strictEqual(event.payload.isError, true);
|
|
455
|
-
});
|
|
456
|
-
test('error() writes session event AND passes through', async () => {
|
|
457
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
458
|
-
await emitter.error('Something went wrong');
|
|
459
|
-
assert.strictEqual(innerCalls.length, 1);
|
|
460
|
-
assert.strictEqual(innerCalls[0].method, 'error');
|
|
461
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
462
|
-
const event = JSON.parse(content.trim());
|
|
463
|
-
assert.strictEqual(event.event_type, 'error');
|
|
464
|
-
assert.strictEqual(event.payload.message, 'Something went wrong');
|
|
465
|
-
});
|
|
466
|
-
test('emitTurnStart writes turn_start event', async () => {
|
|
467
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
468
|
-
await emitter.emitTurnStart();
|
|
469
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
470
|
-
const event = JSON.parse(content.trim());
|
|
471
|
-
assert.strictEqual(event.event_type, 'turn_start');
|
|
472
|
-
assert.strictEqual(event.session_id, 'sess-1');
|
|
473
|
-
assert.strictEqual(event.request_id, 'req-1');
|
|
474
|
-
});
|
|
475
|
-
test('emitTurnEnd writes turn_end event with success flag', async () => {
|
|
476
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
477
|
-
await emitter.emitTurnEnd(true);
|
|
478
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
479
|
-
const event = JSON.parse(content.trim());
|
|
480
|
-
assert.strictEqual(event.event_type, 'turn_end');
|
|
481
|
-
assert.strictEqual(event.payload.success, true);
|
|
482
|
-
});
|
|
483
|
-
test('truncates long tool input to 500 chars (content-capture opt-in)', async () => {
|
|
484
|
-
await withContentCapture(async () => {
|
|
485
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
486
|
-
const longInput = 'x'.repeat(1000);
|
|
487
|
-
await emitter.toolStart('Read', longInput, 'call-1');
|
|
488
|
-
});
|
|
489
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
490
|
-
const event = JSON.parse(content.trim());
|
|
491
|
-
assert.strictEqual(event.payload.inputPreview.length, 500);
|
|
492
|
-
// The digest covers the WHOLE input, not the truncated preview.
|
|
493
|
-
assert.strictEqual(event.payload.input_length, 1000);
|
|
494
|
-
});
|
|
495
|
-
test('truncates long tool result to 500 chars (content-capture opt-in)', async () => {
|
|
496
|
-
await withContentCapture(async () => {
|
|
497
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-1', 'req-1');
|
|
498
|
-
const longResult = 'y'.repeat(1000);
|
|
499
|
-
await emitter.toolEnd('Read', 'call-1', longResult, false);
|
|
500
|
-
});
|
|
501
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-1.jsonl'), 'utf8');
|
|
502
|
-
const event = JSON.parse(content.trim());
|
|
503
|
-
assert.strictEqual(event.payload.resultPreview.length, 500);
|
|
504
|
-
assert.strictEqual(event.payload.result_length, 1000);
|
|
505
|
-
});
|
|
506
|
-
// --- Use Case: Full agent request lifecycle ---
|
|
507
|
-
test('Use Case: full request lifecycle produces correct event sequence', async () => {
|
|
508
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-debug', 'req-42');
|
|
509
|
-
// Simulate a full agent request lifecycle
|
|
510
|
-
await emitter.emitTurnStart();
|
|
511
|
-
await emitter.progress('Thinking...');
|
|
512
|
-
await emitter.thinking('Let me analyze this...');
|
|
513
|
-
await emitter.toolStart('Read', '/path/to/file.ts', 'tool-1');
|
|
514
|
-
await emitter.toolEnd('Read', 'tool-1', 'file contents here', false);
|
|
515
|
-
await emitter.toolStart('Bash', 'npm test', 'tool-2');
|
|
516
|
-
await emitter.toolEnd('Bash', 'tool-2', 'All tests passed', false);
|
|
517
|
-
await emitter.text('I analyzed the code and ran the tests.');
|
|
518
|
-
await emitter.done();
|
|
519
|
-
await emitter.emitTurnEnd(true);
|
|
520
|
-
// Verify inner emitter got all pass-through calls
|
|
521
|
-
const methods = innerCalls.map(c => c.method);
|
|
522
|
-
assert.deepStrictEqual(methods, [
|
|
523
|
-
'progress', 'thinking', 'toolStart', 'toolEnd',
|
|
524
|
-
'toolStart', 'toolEnd', 'text', 'done',
|
|
525
|
-
]);
|
|
526
|
-
// Verify session events (only tool/turn events, not thinking/text/progress)
|
|
527
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-debug.jsonl'), 'utf8');
|
|
528
|
-
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
529
|
-
const eventTypes = events.map((e) => e.event_type);
|
|
530
|
-
assert.deepStrictEqual(eventTypes, [
|
|
531
|
-
'turn_start', 'tool_start', 'tool_end', 'tool_start', 'tool_end', 'turn_end',
|
|
532
|
-
]);
|
|
533
|
-
// All events have correct session_id and request_id
|
|
534
|
-
for (const event of events) {
|
|
535
|
-
assert.strictEqual(event.session_id, 'sess-debug');
|
|
536
|
-
assert.strictEqual(event.request_id, 'req-42');
|
|
537
|
-
}
|
|
538
|
-
});
|
|
539
|
-
// --- Use Case: Detect tool loop from events ---
|
|
540
|
-
test('Use Case: tool loop detection — 6 calls to same tool', async () => {
|
|
541
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-loop', 'req-1');
|
|
542
|
-
await emitter.emitTurnStart();
|
|
543
|
-
// Simulate an agent calling read_file 6 times (possible loop)
|
|
544
|
-
for (let i = 0; i < 6; i++) {
|
|
545
|
-
await emitter.toolStart('read_file', `/path/file${i}.ts`, `call-${i}`);
|
|
546
|
-
await emitter.toolEnd('read_file', `call-${i}`, 'contents', false);
|
|
547
|
-
}
|
|
548
|
-
await emitter.emitTurnEnd(true);
|
|
549
|
-
// Read events and count tool_start for read_file
|
|
550
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-loop.jsonl'), 'utf8');
|
|
551
|
-
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
552
|
-
const readFileStarts = events.filter((e) => e.event_type === 'tool_start' && e.payload.toolName === 'read_file');
|
|
553
|
-
assert.strictEqual(readFileStarts.length, 6, 'Should detect 6 read_file calls');
|
|
554
|
-
// This is what --tool-loops query would flag as "POSSIBLE LOOP" (>5 calls)
|
|
555
|
-
});
|
|
556
|
-
// --- Use Case: Multiple requests in same session ---
|
|
557
|
-
test('Use Case: multiple requests in same session have different request_ids', async () => {
|
|
558
|
-
const reqId1 = (0, base_1.generateRequestId)();
|
|
559
|
-
const reqId2 = (0, base_1.generateRequestId)();
|
|
560
|
-
const emitter1 = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-multi', reqId1);
|
|
561
|
-
await emitter1.emitTurnStart();
|
|
562
|
-
await emitter1.toolStart('Bash', 'echo hello', 'c1');
|
|
563
|
-
await emitter1.toolEnd('Bash', 'c1', 'hello', false);
|
|
564
|
-
await emitter1.emitTurnEnd(true);
|
|
565
|
-
const emitter2 = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-multi', reqId2);
|
|
566
|
-
await emitter2.emitTurnStart();
|
|
567
|
-
await emitter2.toolStart('Read', '/file.ts', 'c2');
|
|
568
|
-
await emitter2.toolEnd('Read', 'c2', 'contents', false);
|
|
569
|
-
await emitter2.emitTurnEnd(true);
|
|
570
|
-
// All events in same session file
|
|
571
|
-
const content = await fs_1.promises.readFile(path.join(testDir, 'sess-multi.jsonl'), 'utf8');
|
|
572
|
-
const events = content.trim().split('\n').map(l => JSON.parse(l));
|
|
573
|
-
assert.strictEqual(events.length, 8); // 2 x (turn_start, tool_start, tool_end, turn_end)
|
|
574
|
-
// First 4 events have reqId1, last 4 have reqId2
|
|
575
|
-
const firstFour = events.slice(0, 4);
|
|
576
|
-
const lastFour = events.slice(4);
|
|
577
|
-
for (const e of firstFour) {
|
|
578
|
-
assert.strictEqual(e.request_id, reqId1);
|
|
579
|
-
}
|
|
580
|
-
for (const e of lastFour) {
|
|
581
|
-
assert.strictEqual(e.request_id, reqId2);
|
|
582
|
-
}
|
|
583
|
-
assert.notStrictEqual(reqId1, reqId2, 'Request IDs should be different');
|
|
584
|
-
});
|
|
585
|
-
});
|
|
586
|
-
// =============================================================================
|
|
587
|
-
// ObservableStreamEmitter warrant audit trail (constructor-captured userId)
|
|
588
|
-
// =============================================================================
|
|
589
|
-
suite('Analytics - ObservableStreamEmitter records the acting user (the warrant)', () => {
|
|
590
|
-
let testDir;
|
|
591
|
-
let writer;
|
|
592
|
-
let innerEmitter;
|
|
593
|
-
setup(async () => {
|
|
594
|
-
testDir = await createUniqueTempDir('agentide-warrant-test-');
|
|
595
|
-
writer = new sessionEvents_1.SessionEventWriter(testDir);
|
|
596
|
-
innerEmitter = {
|
|
597
|
-
async thinking() { },
|
|
598
|
-
async text() { },
|
|
599
|
-
async toolStart() { },
|
|
600
|
-
async toolEnd() { },
|
|
601
|
-
async progress() { },
|
|
602
|
-
async question() { return { selected: [], freeText: null }; },
|
|
603
|
-
async error() { },
|
|
604
|
-
async done() { },
|
|
605
|
-
};
|
|
606
|
-
});
|
|
607
|
-
teardown(async () => {
|
|
608
|
-
try {
|
|
609
|
-
await removeDirWithRetries(testDir);
|
|
610
|
-
}
|
|
611
|
-
catch {
|
|
612
|
-
// ignore
|
|
613
|
-
}
|
|
614
|
-
});
|
|
615
|
-
async function readEvents(sessionId) {
|
|
616
|
-
const content = await fs_1.promises.readFile(path.join(testDir, `${sessionId}.jsonl`), 'utf8');
|
|
617
|
-
return content.trim().split('\n').map((l) => JSON.parse(l));
|
|
618
|
-
}
|
|
619
|
-
test('toolStart/toolEnd record the userId passed at wrap, as a salted hash', async () => {
|
|
620
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-warrant-1', 'req-1', 'priya@meridian.com');
|
|
621
|
-
await emitter.toolStart('Bash', 'echo hi', 'c1');
|
|
622
|
-
await emitter.toolEnd('Bash', 'c1', 'hi', false);
|
|
623
|
-
const events = await readEvents('sess-warrant-1');
|
|
624
|
-
assert.strictEqual(events.length, 2);
|
|
625
|
-
const expected = (0, identity_1.hashIdentity)('priya@meridian.com');
|
|
626
|
-
assert.strictEqual(events[0].payload.userId, expected);
|
|
627
|
-
assert.strictEqual(events[1].payload.userId, expected);
|
|
628
|
-
// Attribution is preserved; the address itself is not.
|
|
629
|
-
assert.ok(String(expected).startsWith('anon_'));
|
|
630
|
-
});
|
|
631
|
-
test('the raw address never reaches the evidence file', async () => {
|
|
632
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-warrant-raw', 'req-1', 'priya@meridian.com');
|
|
633
|
-
await emitter.emitTurnStart();
|
|
634
|
-
const raw = await fs_1.promises.readFile(path.join(testDir, 'sess-warrant-raw.jsonl'), 'utf8');
|
|
635
|
-
assert.ok(!raw.includes('priya@meridian.com'), 'raw user id must not be written to evidence');
|
|
636
|
-
assert.ok(!raw.includes('meridian.com'), 'not even the domain');
|
|
637
|
-
});
|
|
638
|
-
test('toolStart records no userId when wrap omitted it (IDE-local usage)', async () => {
|
|
639
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-warrant-2', 'req-1');
|
|
640
|
-
await emitter.toolStart('Bash', 'echo hi', 'c1');
|
|
641
|
-
const events = await readEvents('sess-warrant-2');
|
|
642
|
-
assert.strictEqual(events[0].payload.userId, undefined);
|
|
643
|
-
});
|
|
644
|
-
test('two emitters never attribute a tool call to the wrong user', async () => {
|
|
645
|
-
const alice = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-warrant-3', 'req-a', 'alice@acme.com');
|
|
646
|
-
const bob = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-warrant-3', 'req-b', 'bob@acme.com');
|
|
647
|
-
await Promise.all([
|
|
648
|
-
(async () => {
|
|
649
|
-
await new Promise((r) => setTimeout(r, 5));
|
|
650
|
-
await alice.toolStart('Bash', 'a', 'a1');
|
|
651
|
-
})(),
|
|
652
|
-
bob.toolStart('Bash', 'b', 'b1'),
|
|
653
|
-
]);
|
|
654
|
-
const events = await readEvents('sess-warrant-3');
|
|
655
|
-
const byCallId = Object.fromEntries(events.map((e) => [e.payload.callId, e.payload.userId]));
|
|
656
|
-
assert.strictEqual(byCallId['a1'], (0, identity_1.hashIdentity)('alice@acme.com'));
|
|
657
|
-
assert.strictEqual(byCallId['b1'], (0, identity_1.hashIdentity)('bob@acme.com'));
|
|
658
|
-
assert.notStrictEqual(byCallId['a1'], byCallId['b1'], 'distinct users must stay distinguishable');
|
|
659
|
-
});
|
|
660
|
-
test('toolStart/toolEnd keep wrap-time userId even when called outside any credential scope', async () => {
|
|
661
|
-
// Simulates the custom-engine persistent-worker path: wrap captures identity on the
|
|
662
|
-
// request continuation, then tool events fire later on a detached IPC callback with
|
|
663
|
-
// no ambient runWithCredential (or a sticky wrong one). Attribution must not depend
|
|
664
|
-
// on ambient AsyncLocalStorage at emit time.
|
|
665
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-warrant-4', 'req-1', 'alice@acme.com');
|
|
666
|
-
await emitter.toolStart('Bash', 'echo hi', 'c1');
|
|
667
|
-
await emitter.toolEnd('Bash', 'c1', 'hi', false);
|
|
668
|
-
const events = await readEvents('sess-warrant-4');
|
|
669
|
-
assert.strictEqual(events[0].payload.userId, (0, identity_1.hashIdentity)('alice@acme.com'));
|
|
670
|
-
assert.strictEqual(events[1].payload.userId, (0, identity_1.hashIdentity)('alice@acme.com'));
|
|
671
|
-
});
|
|
672
|
-
test('error/turn_start/turn_end also carry the wrap-time userId, not just tool events', async () => {
|
|
673
|
-
// A turn that errors before any tool call (or has no tool calls at all) must still
|
|
674
|
-
// carry identity attribution — the mechanism was already on the instance, it just
|
|
675
|
-
// wasn't threaded into these three payloads.
|
|
676
|
-
const emitter = (0, sessionEvents_1.wrapEmitterWithObservability)(innerEmitter, writer, 'sess-warrant-5', 'req-1', 'bob@acme.com');
|
|
677
|
-
await emitter.emitTurnStart();
|
|
678
|
-
await emitter.error('boom');
|
|
679
|
-
await emitter.emitTurnEnd(false);
|
|
680
|
-
const events = await readEvents('sess-warrant-5');
|
|
681
|
-
assert.strictEqual(events.length, 3);
|
|
682
|
-
const bob = (0, identity_1.hashIdentity)('bob@acme.com');
|
|
683
|
-
assert.strictEqual(events[0].event_type, 'turn_start');
|
|
684
|
-
assert.strictEqual(events[0].payload.userId, bob);
|
|
685
|
-
assert.strictEqual(events[1].event_type, 'error');
|
|
686
|
-
assert.strictEqual(events[1].payload.userId, bob);
|
|
687
|
-
assert.strictEqual(events[2].event_type, 'turn_end');
|
|
688
|
-
assert.strictEqual(events[2].payload.userId, bob);
|
|
689
|
-
});
|
|
690
|
-
});
|
|
691
|
-
// =============================================================================
|
|
692
|
-
// Evidence-write failures must be LOUD (compliance fix 2a)
|
|
693
|
-
//
|
|
694
|
-
// `append()` used to swallow every error in an empty catch block. A full disk, a read-only
|
|
695
|
-
// volume, a bad mount — all of them produced a turn that ran with no record of it, and nothing
|
|
696
|
-
// anywhere said so. An absent record is the failure mode that matters (SOC 2 CC7.2 / R-13), so
|
|
697
|
-
// these tests exist to keep the silence from coming back.
|
|
698
|
-
// =============================================================================
|
|
699
|
-
suite('Analytics - evidence write failures are surfaced, never swallowed', () => {
|
|
700
|
-
let blockedDir;
|
|
701
|
-
let errors;
|
|
702
|
-
let originalError;
|
|
703
|
-
setup(async () => {
|
|
704
|
-
(0, sessionEvents_1.resetSessionEventWriterStatsForTest)();
|
|
705
|
-
// A FILE where the writer expects a directory: mkdir fails, so every append fails.
|
|
706
|
-
const root = await createUniqueTempDir('agentide-evidence-fail-');
|
|
707
|
-
blockedDir = path.join(root, 'not-a-dir');
|
|
708
|
-
await fs_1.promises.writeFile(blockedDir, 'this is a file, not a directory');
|
|
709
|
-
errors = [];
|
|
710
|
-
originalError = console.error;
|
|
711
|
-
console.error = (msg) => { errors.push(String(msg)); };
|
|
712
|
-
});
|
|
713
|
-
teardown(() => {
|
|
714
|
-
console.error = originalError;
|
|
715
|
-
delete process.env.AGENTHIPPO_EVIDENCE_REQUIRED;
|
|
716
|
-
(0, sessionEvents_1.resetSessionEventWriterStatsForTest)();
|
|
717
|
-
});
|
|
718
|
-
test('a failed append logs at error level and counts the loss', async () => {
|
|
719
|
-
const writer = new sessionEvents_1.SessionEventWriter(blockedDir);
|
|
720
|
-
await writer.append('sess-x', 'req-1', 'tool_start', { toolName: 'Bash' });
|
|
721
|
-
assert.strictEqual(writer.getStats().failed, 1, 'per-writer counter');
|
|
722
|
-
assert.strictEqual(writer.getStats().written, 0);
|
|
723
|
-
assert.strictEqual((0, sessionEvents_1.getSessionEventWriterStats)().failed, 1, 'process-wide counter for /health');
|
|
724
|
-
assert.ok(errors.some((e) => e.includes('LOST session event')), `no error logged: ${JSON.stringify(errors)}`);
|
|
725
|
-
assert.ok(errors.some((e) => e.includes('tool_start')), 'the lost event type is named');
|
|
726
|
-
});
|
|
727
|
-
test('the last failure is retained for /health output', async () => {
|
|
728
|
-
const writer = new sessionEvents_1.SessionEventWriter(blockedDir);
|
|
729
|
-
await writer.append('sess-x', 'req-1', 'turn_end', { success: true });
|
|
730
|
-
const stats = (0, sessionEvents_1.getSessionEventWriterStats)();
|
|
731
|
-
assert.strictEqual(stats.lastError?.eventType, 'turn_end');
|
|
732
|
-
assert.ok((stats.lastError?.at ?? 0) > 0);
|
|
733
|
-
assert.ok((stats.lastError?.message ?? '').length > 0);
|
|
734
|
-
});
|
|
735
|
-
test('AGENTHIPPO_EVIDENCE_REQUIRED makes the turn fail rather than run unrecorded', async () => {
|
|
736
|
-
process.env.AGENTHIPPO_EVIDENCE_REQUIRED = '1';
|
|
737
|
-
const writer = new sessionEvents_1.SessionEventWriter(blockedDir);
|
|
738
|
-
await assert.rejects(() => writer.append('sess-x', 'req-1', 'tool_start', {}), /evidence write failed for tool_start/);
|
|
739
|
-
assert.strictEqual((0, sessionEvents_1.getSessionEventWriterStats)().failed, 1);
|
|
740
|
-
});
|
|
741
|
-
test('without the flag the agent keeps running, but the loss is still counted', async () => {
|
|
742
|
-
const writer = new sessionEvents_1.SessionEventWriter(blockedDir);
|
|
743
|
-
await writer.append('sess-x', 'req-1', 'tool_start', {});
|
|
744
|
-
await writer.append('sess-x', 'req-1', 'tool_end', {});
|
|
745
|
-
assert.strictEqual((0, sessionEvents_1.getSessionEventWriterStats)().failed, 2);
|
|
746
|
-
});
|
|
747
|
-
test('successful writes are counted too, so /health can show a ratio', async () => {
|
|
748
|
-
const dir = await createUniqueTempDir('agentide-evidence-ok-');
|
|
749
|
-
const writer = new sessionEvents_1.SessionEventWriter(dir);
|
|
750
|
-
await writer.append('sess-ok', 'req-1', 'turn_start', {});
|
|
751
|
-
assert.strictEqual(writer.getStats().written, 1);
|
|
752
|
-
assert.strictEqual(writer.getStats().failed, 0);
|
|
753
|
-
assert.strictEqual((0, sessionEvents_1.getSessionEventWriterStats)().written, 1);
|
|
754
|
-
await removeDirWithRetries(dir);
|
|
755
|
-
});
|
|
756
|
-
});
|