@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,418 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Serve Hardening Test Suite
|
|
4
|
-
*
|
|
5
|
-
* Pure-helper tests: state-dir resolution, identity headers, CORS, turn limiting, body cap.
|
|
6
|
-
* Auth and credential checking are the deploy layer's responsibility — not tested here.
|
|
7
|
-
*--------------------------------------------------------------------------------------------*/
|
|
8
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
-
if (k2 === undefined) k2 = k;
|
|
10
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
-
}
|
|
14
|
-
Object.defineProperty(o, k2, desc);
|
|
15
|
-
}) : (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
o[k2] = m[k];
|
|
18
|
-
}));
|
|
19
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
-
}) : function(o, v) {
|
|
22
|
-
o["default"] = v;
|
|
23
|
-
});
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
require("mocha");
|
|
43
|
-
const assert = __importStar(require("assert"));
|
|
44
|
-
const os = __importStar(require("os"));
|
|
45
|
-
const path = __importStar(require("path"));
|
|
46
|
-
const stream_1 = require("stream");
|
|
47
|
-
const serve_hardening_1 = require("../cli/serve-hardening");
|
|
48
|
-
suite('serve-hardening: resolveStateDir', () => {
|
|
49
|
-
test('explicit --state-dir wins and is absolute and non-ephemeral', () => {
|
|
50
|
-
const r = (0, serve_hardening_1.resolveStateDir)('./state', {});
|
|
51
|
-
assert.strictEqual(r.ephemeral, false);
|
|
52
|
-
assert.ok(path.isAbsolute(r.dir));
|
|
53
|
-
assert.ok(r.dir.endsWith(`${path.sep}state`));
|
|
54
|
-
});
|
|
55
|
-
test('AGENTHIPPO_HOME is used when no --state-dir', () => {
|
|
56
|
-
const r = (0, serve_hardening_1.resolveStateDir)(undefined, { AGENTHIPPO_HOME: '/data/.agent-hippo' });
|
|
57
|
-
assert.strictEqual(r.ephemeral, false);
|
|
58
|
-
assert.strictEqual(r.dir, path.join('/data/.agent-hippo', 'serve-state'));
|
|
59
|
-
});
|
|
60
|
-
test('falls back to tmpdir and flags ephemeral', () => {
|
|
61
|
-
const r = (0, serve_hardening_1.resolveStateDir)(undefined, {});
|
|
62
|
-
assert.strictEqual(r.ephemeral, true);
|
|
63
|
-
assert.ok(r.dir.startsWith(os.tmpdir()));
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
suite('serve-hardening: resolveAnalyticsSessionsDir', () => {
|
|
67
|
-
// getAgentideHome() reads process.env directly (not injectable), so tests that need it to
|
|
68
|
-
// resolve deterministically save/restore the real env vars around themselves.
|
|
69
|
-
const saved = {};
|
|
70
|
-
setup(() => {
|
|
71
|
-
saved.AGENT_HOME_DIR = process.env.AGENT_HOME_DIR;
|
|
72
|
-
saved.AGENTHIPPO_HOME = process.env.AGENTHIPPO_HOME;
|
|
73
|
-
delete process.env.AGENT_HOME_DIR;
|
|
74
|
-
delete process.env.AGENTHIPPO_HOME;
|
|
75
|
-
});
|
|
76
|
-
teardown(() => {
|
|
77
|
-
if (saved.AGENT_HOME_DIR === undefined) {
|
|
78
|
-
delete process.env.AGENT_HOME_DIR;
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
process.env.AGENT_HOME_DIR = saved.AGENT_HOME_DIR;
|
|
82
|
-
}
|
|
83
|
-
if (saved.AGENTHIPPO_HOME === undefined) {
|
|
84
|
-
delete process.env.AGENTHIPPO_HOME;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
process.env.AGENTHIPPO_HOME = saved.AGENTHIPPO_HOME;
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
test('AGENTHIPPO_HOME set → uses getAgentideHome(), not stateDir (stays discoverable to Spotlight/DuckDB)', () => {
|
|
91
|
-
process.env.AGENTHIPPO_HOME = '/data/.agent-hippo';
|
|
92
|
-
const dir = (0, serve_hardening_1.resolveAnalyticsSessionsDir)('/data/.agent-hippo/serve-state', false, { AGENTHIPPO_HOME: '/data/.agent-hippo' });
|
|
93
|
-
assert.strictEqual(dir, path.join('/data/.agent-hippo', 'analytics', 'sessions'));
|
|
94
|
-
});
|
|
95
|
-
test('AGENT_HOME_DIR set → same precedence as AGENTHIPPO_HOME', () => {
|
|
96
|
-
process.env.AGENT_HOME_DIR = '/data/.agent-hippo';
|
|
97
|
-
const dir = (0, serve_hardening_1.resolveAnalyticsSessionsDir)('/data/.agent-hippo/serve-state', false, { AGENT_HOME_DIR: '/data/.agent-hippo' });
|
|
98
|
-
assert.strictEqual(dir, path.join('/data/.agent-hippo', 'analytics', 'sessions'));
|
|
99
|
-
});
|
|
100
|
-
test('no home-dir env var, explicit non-ephemeral --state-dir → uses stateDir (never regress durability for discoverability)', () => {
|
|
101
|
-
const dir = (0, serve_hardening_1.resolveAnalyticsSessionsDir)('/mnt/durable-vol', false, {});
|
|
102
|
-
assert.strictEqual(dir, path.join('/mnt/durable-vol', 'analytics', 'sessions'));
|
|
103
|
-
});
|
|
104
|
-
test('no home-dir env var, ephemeral state (nothing durable configured) → falls back to getAgentideHome() default', () => {
|
|
105
|
-
const dir = (0, serve_hardening_1.resolveAnalyticsSessionsDir)(path.join(os.tmpdir(), 'agenthippo-server'), true, {});
|
|
106
|
-
assert.strictEqual(dir, path.join(os.homedir(), '.agent-hippo', 'analytics', 'sessions'));
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
suite('serve-hardening: resolveBindHost', () => {
|
|
110
|
-
test('defaults to loopback', () => {
|
|
111
|
-
assert.strictEqual((0, serve_hardening_1.resolveBindHost)(undefined, {}), serve_hardening_1.DEFAULT_BIND_HOST);
|
|
112
|
-
assert.strictEqual(serve_hardening_1.DEFAULT_BIND_HOST, '127.0.0.1');
|
|
113
|
-
});
|
|
114
|
-
test('explicit --host wins over env', () => {
|
|
115
|
-
assert.strictEqual((0, serve_hardening_1.resolveBindHost)('0.0.0.0', { AGENTHIPPO_SERVE_HOST: '10.0.0.1' }), '0.0.0.0');
|
|
116
|
-
});
|
|
117
|
-
test('AGENTHIPPO_SERVE_HOST used when no flag', () => {
|
|
118
|
-
assert.strictEqual((0, serve_hardening_1.resolveBindHost)(undefined, { AGENTHIPPO_SERVE_HOST: '0.0.0.0' }), '0.0.0.0');
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
suite('serve-hardening: clientIp', () => {
|
|
122
|
-
const reqWith = (headers, remote = '203.0.113.9') => ({ headers, socket: { remoteAddress: remote } });
|
|
123
|
-
test('falls back to socket address with no XFF', () => {
|
|
124
|
-
assert.strictEqual((0, serve_hardening_1.clientIp)(reqWith({})), '203.0.113.9');
|
|
125
|
-
});
|
|
126
|
-
test('uses the right-most XFF entry (the IP the trusted proxy observed)', () => {
|
|
127
|
-
assert.strictEqual((0, serve_hardening_1.clientIp)(reqWith({ 'x-forwarded-for': 'evil-spoof, 198.51.100.7' })), '198.51.100.7');
|
|
128
|
-
});
|
|
129
|
-
test('AGENTHIPPO_XFF_TRUSTED_HOPS=2 skips the tunnel hop (cloudflared → Caddy)', () => {
|
|
130
|
-
const req = reqWith({ 'x-forwarded-for': '198.51.100.7, 172.18.0.5' });
|
|
131
|
-
assert.strictEqual((0, serve_hardening_1.clientIp)(req, { AGENTHIPPO_XFF_TRUSTED_HOPS: '2' }), '198.51.100.7');
|
|
132
|
-
});
|
|
133
|
-
test('trusted hops beyond the XFF length clamps to the left-most entry', () => {
|
|
134
|
-
const req = reqWith({ 'x-forwarded-for': '198.51.100.7' });
|
|
135
|
-
assert.strictEqual((0, serve_hardening_1.clientIp)(req, { AGENTHIPPO_XFF_TRUSTED_HOPS: '5' }), '198.51.100.7');
|
|
136
|
-
});
|
|
137
|
-
test('invalid trusted hops falls back to 1', () => {
|
|
138
|
-
const req = reqWith({ 'x-forwarded-for': 'evil-spoof, 198.51.100.7' });
|
|
139
|
-
assert.strictEqual((0, serve_hardening_1.clientIp)(req, { AGENTHIPPO_XFF_TRUSTED_HOPS: 'nope' }), '198.51.100.7');
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
suite('serve-hardening: RateLimiter', () => {
|
|
143
|
-
test('allows up to the cap within a window then rejects', () => {
|
|
144
|
-
const lim = new serve_hardening_1.RateLimiter(2, 60_000);
|
|
145
|
-
const t0 = 1_000;
|
|
146
|
-
assert.strictEqual(lim.tryConsume('k', t0), true);
|
|
147
|
-
assert.strictEqual(lim.tryConsume('k', t0), true);
|
|
148
|
-
assert.strictEqual(lim.tryConsume('k', t0), false);
|
|
149
|
-
});
|
|
150
|
-
test('window resets after it elapses', () => {
|
|
151
|
-
const lim = new serve_hardening_1.RateLimiter(1, 1_000);
|
|
152
|
-
assert.strictEqual(lim.tryConsume('k', 0), true);
|
|
153
|
-
assert.strictEqual(lim.tryConsume('k', 500), false);
|
|
154
|
-
assert.strictEqual(lim.tryConsume('k', 1_001), true);
|
|
155
|
-
});
|
|
156
|
-
test('separate keys have separate budgets', () => {
|
|
157
|
-
const lim = new serve_hardening_1.RateLimiter(1);
|
|
158
|
-
assert.strictEqual(lim.tryConsume('a'), true);
|
|
159
|
-
assert.strictEqual(lim.tryConsume('b'), true);
|
|
160
|
-
assert.strictEqual(lim.tryConsume('a'), false);
|
|
161
|
-
});
|
|
162
|
-
test('zero / negative disables the limiter', () => {
|
|
163
|
-
const lim = new serve_hardening_1.RateLimiter(0);
|
|
164
|
-
for (let i = 0; i < 100; i++) {
|
|
165
|
-
assert.strictEqual(lim.tryConsume('k'), true);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
suite('serve-hardening: resolveUserId', () => {
|
|
170
|
-
/**
|
|
171
|
-
* BREAKING, and deliberately so. `x-agent-user` used to be the FIRST trusted alias, so on any
|
|
172
|
-
* deployment that had not pinned AGENTHIPPO_IDENTITY_HEADER, any HTTP client could send
|
|
173
|
-
* `x-agent-user: victim@example.com` and be namespaced into that user's session state, attach
|
|
174
|
-
* to their conversation, and be issued a data-plane turn nonce scoped to them. No platform
|
|
175
|
-
* strips it — Cloud Run IAP strips `X-Goog-*` and forwards this one untouched.
|
|
176
|
-
*/
|
|
177
|
-
test('x-agent-user is NOT trusted by default — it is not stripped by any platform', () => {
|
|
178
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({ 'x-agent-user': 'victim@example.com' }, undefined, {}), undefined);
|
|
179
|
-
});
|
|
180
|
-
test('x-agent-user IS trusted when the deployment pins it (the Caddy forward_auth flow)', () => {
|
|
181
|
-
const env = { AGENTHIPPO_IDENTITY_HEADER: 'x-agent-user' };
|
|
182
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({ 'x-agent-user': 'alice@corp.com' }, { user_id: 'bob' }, env), 'alice@corp.com');
|
|
183
|
-
});
|
|
184
|
-
test('an unpinned deployment is told which env var to set, and why', () => {
|
|
185
|
-
const advice = (0, serve_hardening_1.identityHeaderAdvice)({});
|
|
186
|
-
assert.ok(advice.length > 0);
|
|
187
|
-
assert.ok(advice.every((l) => /AGENTHIPPO_IDENTITY_HEADER/.test(l)));
|
|
188
|
-
assert.ok(advice.some((l) => /x-agent-user/.test(l)), 'the removal must be explained, not silent');
|
|
189
|
-
assert.deepStrictEqual((0, serve_hardening_1.identityHeaderAdvice)({ AGENTHIPPO_IDENTITY_HEADER: 'x-agent-user' }), [], 'a pinned deployment is quiet');
|
|
190
|
-
});
|
|
191
|
-
test('advice severity follows reachability, so the loud case stays loud', () => {
|
|
192
|
-
const loopback = (0, serve_hardening_1.identityHeaderAdvice)({}, '127.0.0.1');
|
|
193
|
-
assert.strictEqual(loopback.length, 1, 'a local run gets one short note, not a lecture');
|
|
194
|
-
assert.ok(loopback.every((l) => /AGENTHIPPO_IDENTITY_HEADER/.test(l)));
|
|
195
|
-
assert.deepStrictEqual((0, serve_hardening_1.identityHeaderAdvice)({}, 'localhost').length, 1);
|
|
196
|
-
assert.deepStrictEqual((0, serve_hardening_1.identityHeaderAdvice)({}, '::1').length, 1);
|
|
197
|
-
const exposed = (0, serve_hardening_1.identityHeaderAdvice)({}, '0.0.0.0');
|
|
198
|
-
assert.ok(exposed.length > loopback.length, 'an exposed bind must say strictly more');
|
|
199
|
-
assert.ok(exposed.some((l) => /reachable beyond this machine/.test(l)));
|
|
200
|
-
assert.ok(exposed.every((l) => /AGENTHIPPO_IDENTITY_HEADER/.test(l)));
|
|
201
|
-
// Pinning silences both, exposed or not.
|
|
202
|
-
const pinned = { AGENTHIPPO_IDENTITY_HEADER: 'x-goog-authenticated-user-email' };
|
|
203
|
-
assert.deepStrictEqual((0, serve_hardening_1.identityHeaderAdvice)(pinned, '0.0.0.0'), []);
|
|
204
|
-
});
|
|
205
|
-
test('Databricks X-Forwarded-Email', () => {
|
|
206
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({ 'x-forwarded-email': 'priya@meridian.com' }, undefined), 'priya@meridian.com');
|
|
207
|
-
});
|
|
208
|
-
test('Cloud Run IAP prefixed value is stripped to the email', () => {
|
|
209
|
-
const id = (0, serve_hardening_1.resolveUserId)({ 'x-goog-authenticated-user-email': 'accounts.google.com:marco@meridian.com' }, undefined);
|
|
210
|
-
assert.strictEqual(id, 'marco@meridian.com');
|
|
211
|
-
});
|
|
212
|
-
test('Cloudflare Access header', () => {
|
|
213
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({ 'cf-access-authenticated-user-email': 'susan@meridian.com' }, undefined), 'susan@meridian.com');
|
|
214
|
-
});
|
|
215
|
-
test('body.user_id is ignored unless explicitly opted in (§10 hole 3)', () => {
|
|
216
|
-
// Safe-by-convention was the hole: any deployment that forgot to pin a header let
|
|
217
|
-
// every caller name an arbitrary victim via the client-controlled body.
|
|
218
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({}, { user_id: 'bob' }, {}), undefined);
|
|
219
|
-
});
|
|
220
|
-
test('AGENTHIPPO_ALLOW_BODY_IDENTITY=1 restores the dev-convenience body fallback', () => {
|
|
221
|
-
const env = { AGENTHIPPO_ALLOW_BODY_IDENTITY: '1' };
|
|
222
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({}, { user_id: 'bob' }, env), 'bob');
|
|
223
|
-
// A trusted platform header still wins over the body even when opted in.
|
|
224
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({ 'x-forwarded-email': 'alice@corp.com' }, { user_id: 'bob' }, env), 'alice@corp.com');
|
|
225
|
-
});
|
|
226
|
-
test('undefined when nothing present', () => {
|
|
227
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({}, undefined), undefined);
|
|
228
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({}, { user_id: ' ' }, { AGENTHIPPO_ALLOW_BODY_IDENTITY: '1' }), undefined);
|
|
229
|
-
});
|
|
230
|
-
test('AGENTHIPPO_IDENTITY_HEADER pins trust to one header — spoofed aliases are ignored', () => {
|
|
231
|
-
const env = { AGENTHIPPO_IDENTITY_HEADER: 'x-goog-authenticated-user-email' };
|
|
232
|
-
// IAP strips X-Goog-* but forwards x-agent-user; pinning must ignore the spoof.
|
|
233
|
-
const id = (0, serve_hardening_1.resolveUserId)({ 'x-agent-user': 'spoofed@evil.com', 'x-goog-authenticated-user-email': 'accounts.google.com:marco@meridian.com' }, undefined, env);
|
|
234
|
-
assert.strictEqual(id, 'marco@meridian.com');
|
|
235
|
-
});
|
|
236
|
-
test('pinned header absent → fails closed (never the alias list, never the body)', () => {
|
|
237
|
-
const env = { AGENTHIPPO_IDENTITY_HEADER: 'x-goog-authenticated-user-email' };
|
|
238
|
-
assert.strictEqual((0, serve_hardening_1.resolveUserId)({ 'x-agent-user': 'spoofed@evil.com' }, { user_id: 'bob' }, env), undefined);
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
suite('serve-hardening: corsHeaders', () => {
|
|
242
|
-
test('always wide-open (serve is always behind a proxy)', () => {
|
|
243
|
-
const h = (0, serve_hardening_1.corsHeaders)();
|
|
244
|
-
assert.strictEqual(h['Access-Control-Allow-Origin'], '*');
|
|
245
|
-
assert.ok(h['Access-Control-Allow-Methods']);
|
|
246
|
-
assert.ok(h['Access-Control-Allow-Headers']);
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
suite('serve-hardening: TurnLimiter', () => {
|
|
250
|
-
test('allows up to the cap then rejects', () => {
|
|
251
|
-
const lim = new serve_hardening_1.TurnLimiter(2);
|
|
252
|
-
assert.strictEqual(lim.tryConsume('s1'), true);
|
|
253
|
-
assert.strictEqual(lim.tryConsume('s1'), true);
|
|
254
|
-
assert.strictEqual(lim.tryConsume('s1'), false);
|
|
255
|
-
});
|
|
256
|
-
test('separate sessions have separate budgets', () => {
|
|
257
|
-
const lim = new serve_hardening_1.TurnLimiter(1);
|
|
258
|
-
assert.strictEqual(lim.tryConsume('s1'), true);
|
|
259
|
-
assert.strictEqual(lim.tryConsume('s2'), true);
|
|
260
|
-
assert.strictEqual(lim.tryConsume('s1'), false);
|
|
261
|
-
});
|
|
262
|
-
test('zero / negative cap disables the limiter', () => {
|
|
263
|
-
const lim = new serve_hardening_1.TurnLimiter(0);
|
|
264
|
-
for (let i = 0; i < 100; i++) {
|
|
265
|
-
assert.strictEqual(lim.tryConsume('s'), true);
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
test('reset clears a session', () => {
|
|
269
|
-
const lim = new serve_hardening_1.TurnLimiter(1);
|
|
270
|
-
assert.strictEqual(lim.tryConsume('s1'), true);
|
|
271
|
-
assert.strictEqual(lim.tryConsume('s1'), false);
|
|
272
|
-
lim.reset('s1');
|
|
273
|
-
assert.strictEqual(lim.tryConsume('s1'), true);
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
suite('serve-hardening: TurnGate', () => {
|
|
277
|
-
test('runs immediately under the inflight cap', async () => {
|
|
278
|
-
const gate = new serve_hardening_1.TurnGate(2, 4, 1_000);
|
|
279
|
-
const a = await gate.acquire();
|
|
280
|
-
const b = await gate.acquire();
|
|
281
|
-
assert.ok(a);
|
|
282
|
-
assert.ok(b);
|
|
283
|
-
assert.strictEqual(gate.inflight, 2);
|
|
284
|
-
assert.strictEqual(gate.queued, 0);
|
|
285
|
-
a();
|
|
286
|
-
b();
|
|
287
|
-
assert.strictEqual(gate.inflight, 0);
|
|
288
|
-
});
|
|
289
|
-
test('queues when at capacity and wakes FIFO on release', async () => {
|
|
290
|
-
const gate = new serve_hardening_1.TurnGate(1, 4, 5_000);
|
|
291
|
-
const first = await gate.acquire();
|
|
292
|
-
assert.ok(first);
|
|
293
|
-
assert.strictEqual(gate.inflight, 1);
|
|
294
|
-
let secondResolved = false;
|
|
295
|
-
const secondPromise = gate.acquire().then((release) => {
|
|
296
|
-
secondResolved = true;
|
|
297
|
-
return release;
|
|
298
|
-
});
|
|
299
|
-
// Let the microtask queue settle so the waiter is enqueued.
|
|
300
|
-
await new Promise((r) => setImmediate(r));
|
|
301
|
-
assert.strictEqual(secondResolved, false);
|
|
302
|
-
assert.strictEqual(gate.queued, 1);
|
|
303
|
-
first();
|
|
304
|
-
const second = await secondPromise;
|
|
305
|
-
assert.strictEqual(secondResolved, true);
|
|
306
|
-
assert.ok(second);
|
|
307
|
-
assert.strictEqual(gate.inflight, 1);
|
|
308
|
-
assert.strictEqual(gate.queued, 0);
|
|
309
|
-
second();
|
|
310
|
-
assert.strictEqual(gate.inflight, 0);
|
|
311
|
-
});
|
|
312
|
-
test('rejects immediately when the queue is full', async () => {
|
|
313
|
-
const gate = new serve_hardening_1.TurnGate(1, 1, 5_000);
|
|
314
|
-
const held = await gate.acquire();
|
|
315
|
-
assert.ok(held);
|
|
316
|
-
const waiting = gate.acquire(); // fills the single queue slot
|
|
317
|
-
await new Promise((r) => setImmediate(r));
|
|
318
|
-
assert.strictEqual(gate.queued, 1);
|
|
319
|
-
const rejected = await gate.acquire();
|
|
320
|
-
assert.strictEqual(rejected, null);
|
|
321
|
-
held();
|
|
322
|
-
const released = await waiting;
|
|
323
|
-
assert.ok(released);
|
|
324
|
-
released();
|
|
325
|
-
});
|
|
326
|
-
test('times out a waiter and returns null', async () => {
|
|
327
|
-
const gate = new serve_hardening_1.TurnGate(1, 4, 30);
|
|
328
|
-
const held = await gate.acquire();
|
|
329
|
-
assert.ok(held);
|
|
330
|
-
const timedOut = await gate.acquire();
|
|
331
|
-
assert.strictEqual(timedOut, null);
|
|
332
|
-
assert.strictEqual(gate.queued, 0);
|
|
333
|
-
held();
|
|
334
|
-
assert.strictEqual(gate.inflight, 0);
|
|
335
|
-
});
|
|
336
|
-
test('zero maxInflight disables the gate', async () => {
|
|
337
|
-
const gate = new serve_hardening_1.TurnGate(0, 0, 1_000);
|
|
338
|
-
const releases = [];
|
|
339
|
-
for (let i = 0; i < 50; i++) {
|
|
340
|
-
const r = await gate.acquire();
|
|
341
|
-
assert.ok(r);
|
|
342
|
-
releases.push(r);
|
|
343
|
-
}
|
|
344
|
-
assert.strictEqual(gate.inflight, 0);
|
|
345
|
-
for (const r of releases) {
|
|
346
|
-
r();
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
test('createTurnGateFromEnv honors env defaults and overrides', () => {
|
|
350
|
-
const def = (0, serve_hardening_1.createTurnGateFromEnv)({});
|
|
351
|
-
assert.strictEqual(def.max, 10);
|
|
352
|
-
const custom = (0, serve_hardening_1.createTurnGateFromEnv)({ AGENTHIPPO_MAX_CONCURRENT_TURNS: '3', AGENTHIPPO_TURN_QUEUE: '7' });
|
|
353
|
-
assert.strictEqual(custom.max, 3);
|
|
354
|
-
const disabled = (0, serve_hardening_1.createTurnGateFromEnv)({ AGENTHIPPO_MAX_CONCURRENT_TURNS: '0' });
|
|
355
|
-
assert.strictEqual(disabled.max, 0);
|
|
356
|
-
});
|
|
357
|
-
test('Retry-After constant matches the default queue timeout', () => {
|
|
358
|
-
assert.strictEqual(serve_hardening_1.TURN_GATE_RETRY_AFTER_SECONDS, 15);
|
|
359
|
-
});
|
|
360
|
-
});
|
|
361
|
-
function fakeReq(body) {
|
|
362
|
-
const stream = new stream_1.PassThrough();
|
|
363
|
-
stream.end(Buffer.from(body, 'utf8'));
|
|
364
|
-
return stream;
|
|
365
|
-
}
|
|
366
|
-
suite('serve-hardening: readBodyWithCap', () => {
|
|
367
|
-
test('reads a small body', async () => {
|
|
368
|
-
const text = await (0, serve_hardening_1.readBodyWithCap)(fakeReq('{"message":"hi"}'), 1024);
|
|
369
|
-
assert.strictEqual(text, '{"message":"hi"}');
|
|
370
|
-
});
|
|
371
|
-
test('rejects an oversized body with tooLarge flag', async () => {
|
|
372
|
-
const big = 'x'.repeat(50);
|
|
373
|
-
await assert.rejects(() => (0, serve_hardening_1.readBodyWithCap)(fakeReq(big), 10), (err) => {
|
|
374
|
-
assert.strictEqual(err.tooLarge, true);
|
|
375
|
-
return true;
|
|
376
|
-
});
|
|
377
|
-
});
|
|
378
|
-
test('default cap is 1 MiB', () => {
|
|
379
|
-
assert.strictEqual(serve_hardening_1.DEFAULT_MAX_BODY_BYTES, 1024 * 1024);
|
|
380
|
-
});
|
|
381
|
-
});
|
|
382
|
-
suite('serve-hardening: resolveServeSessionKey (secure-obo-design §3.4 Phase 0)', () => {
|
|
383
|
-
const PINNED = { AGENTHIPPO_IDENTITY_HEADER: 'x-forwarded-email' };
|
|
384
|
-
test('verified user + session_id → user-namespaced key', () => {
|
|
385
|
-
const r = (0, serve_hardening_1.resolveServeSessionKey)('chat-1', 'alice@corp.com', PINNED);
|
|
386
|
-
assert.strictEqual(r.sessionKey, `u${(0, serve_hardening_1.userNamespaceHash)('alice@corp.com')}--chat-1`);
|
|
387
|
-
assert.strictEqual(r.rejected, undefined);
|
|
388
|
-
});
|
|
389
|
-
test('two users presenting the SAME session_id can never share a key (the defect this closes)', () => {
|
|
390
|
-
const a = (0, serve_hardening_1.resolveServeSessionKey)('chat-1', 'alice@corp.com', PINNED);
|
|
391
|
-
const b = (0, serve_hardening_1.resolveServeSessionKey)('chat-1', 'bob@corp.com', PINNED);
|
|
392
|
-
assert.notStrictEqual(a.sessionKey, b.sessionKey);
|
|
393
|
-
});
|
|
394
|
-
test('verified user without session_id → stable per-user default key', () => {
|
|
395
|
-
const r1 = (0, serve_hardening_1.resolveServeSessionKey)(undefined, 'alice@corp.com', PINNED);
|
|
396
|
-
const r2 = (0, serve_hardening_1.resolveServeSessionKey)('', 'alice@corp.com', PINNED);
|
|
397
|
-
assert.strictEqual(r1.sessionKey, r2.sessionKey);
|
|
398
|
-
assert.strictEqual(r1.sessionKey, `u${(0, serve_hardening_1.userNamespaceHash)('alice@corp.com')}--default`);
|
|
399
|
-
});
|
|
400
|
-
test('pinned identity + session_id but NO verified user → fail closed', () => {
|
|
401
|
-
const r = (0, serve_hardening_1.resolveServeSessionKey)('chat-1', undefined, PINNED);
|
|
402
|
-
assert.strictEqual(r.rejected, serve_hardening_1.SESSION_WITHOUT_USER_REASON);
|
|
403
|
-
});
|
|
404
|
-
test('unpinned (local dev) keeps raw session_id behavior', () => {
|
|
405
|
-
const r = (0, serve_hardening_1.resolveServeSessionKey)('chat-1', undefined, {});
|
|
406
|
-
assert.strictEqual(r.sessionKey, 'chat-1');
|
|
407
|
-
assert.strictEqual(r.rejected, undefined);
|
|
408
|
-
});
|
|
409
|
-
test('unpinned, no user, no session_id → legacy anon bucket', () => {
|
|
410
|
-
const r = (0, serve_hardening_1.resolveServeSessionKey)(undefined, undefined, {});
|
|
411
|
-
assert.strictEqual(r.sessionKey, 'anon-unknown');
|
|
412
|
-
});
|
|
413
|
-
test('the key never embeds the raw user id (emails are not path segments)', () => {
|
|
414
|
-
const r = (0, serve_hardening_1.resolveServeSessionKey)('s', 'alice@corp.com', PINNED);
|
|
415
|
-
assert.ok(!r.sessionKey.includes('alice@corp.com'));
|
|
416
|
-
assert.ok(!r.sessionKey.includes('@'));
|
|
417
|
-
});
|
|
418
|
-
});
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
-
}
|
|
11
|
-
Object.defineProperty(o, k2, desc);
|
|
12
|
-
}) : (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
o[k2] = m[k];
|
|
15
|
-
}));
|
|
16
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
-
}) : function(o, v) {
|
|
19
|
-
o["default"] = v;
|
|
20
|
-
});
|
|
21
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
-
var ownKeys = function(o) {
|
|
23
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
-
var ar = [];
|
|
25
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
-
return ar;
|
|
27
|
-
};
|
|
28
|
-
return ownKeys(o);
|
|
29
|
-
};
|
|
30
|
-
return function (mod) {
|
|
31
|
-
if (mod && mod.__esModule) return mod;
|
|
32
|
-
var result = {};
|
|
33
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
-
__setModuleDefault(result, mod);
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
})();
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
require("mocha");
|
|
40
|
-
const assert = __importStar(require("assert"));
|
|
41
|
-
const http = __importStar(require("http"));
|
|
42
|
-
const serveClient_js_1 = require("../remote/serveClient.js");
|
|
43
|
-
function createCaptureEmitter() {
|
|
44
|
-
const events = [];
|
|
45
|
-
return {
|
|
46
|
-
events,
|
|
47
|
-
async thinking(delta) { events.push({ type: 'thinking', payload: delta }); },
|
|
48
|
-
async text(delta) { events.push({ type: 'text', payload: delta }); },
|
|
49
|
-
async toolStart(toolName, input, toolCallId) {
|
|
50
|
-
events.push({ type: 'toolStart', payload: { toolName, input, toolCallId } });
|
|
51
|
-
},
|
|
52
|
-
async toolEnd(toolName, toolCallId, result, isError) {
|
|
53
|
-
events.push({ type: 'toolEnd', payload: { toolName, toolCallId, result, isError } });
|
|
54
|
-
},
|
|
55
|
-
async progress(message) { events.push({ type: 'progress', payload: message }); },
|
|
56
|
-
async question() { return { selected: [], freeText: null, declined: true }; },
|
|
57
|
-
async error(message) { events.push({ type: 'error', payload: message }); },
|
|
58
|
-
async done() { events.push({ type: 'done', payload: null }); },
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
function startMockServeServer(events) {
|
|
62
|
-
let lastAuth;
|
|
63
|
-
return new Promise((resolve, reject) => {
|
|
64
|
-
const server = http.createServer((req, res) => {
|
|
65
|
-
if (req.method === 'POST' && req.url === '/v1/chat/stream') {
|
|
66
|
-
lastAuth = req.headers.authorization;
|
|
67
|
-
res.writeHead(200, {
|
|
68
|
-
'Content-Type': 'text/event-stream',
|
|
69
|
-
'Cache-Control': 'no-cache',
|
|
70
|
-
Connection: 'keep-alive',
|
|
71
|
-
});
|
|
72
|
-
for (const line of events) {
|
|
73
|
-
res.write(`data: ${line}\n\n`);
|
|
74
|
-
}
|
|
75
|
-
res.end();
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
res.writeHead(404);
|
|
79
|
-
res.end('not found');
|
|
80
|
-
});
|
|
81
|
-
server.listen(0, '127.0.0.1', () => {
|
|
82
|
-
const address = server.address();
|
|
83
|
-
if (!address || typeof address === 'string') {
|
|
84
|
-
reject(new Error('failed to bind mock serve server'));
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
resolve({
|
|
88
|
-
url: `http://127.0.0.1:${address.port}`,
|
|
89
|
-
get lastAuth() { return lastAuth; },
|
|
90
|
-
close: () => new Promise((closeResolve, closeReject) => {
|
|
91
|
-
server.close((err) => (err ? closeReject(err) : closeResolve()));
|
|
92
|
-
}),
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
suite('ServeClient', () => {
|
|
98
|
-
test('normalizeServeBaseUrl strips trailing slashes', () => {
|
|
99
|
-
assert.strictEqual((0, serveClient_js_1.normalizeServeBaseUrl)('http://127.0.0.1:8787/'), 'http://127.0.0.1:8787');
|
|
100
|
-
});
|
|
101
|
-
test('buildServeAuthHeaders sends the bearer token and NO self-asserted identity', () => {
|
|
102
|
-
// `X-Agent-User` used to ride along here, and the serve side trusts `x-agent-user` as its
|
|
103
|
-
// first identity alias. On a deployment that does not pin AGENTHIPPO_IDENTITY_HEADER, a
|
|
104
|
-
// client could name someone else and be namespaced into that user's session/state and
|
|
105
|
-
// handed a data-plane nonce scoped to them. The bearer already carries a verified identity.
|
|
106
|
-
assert.deepStrictEqual((0, serveClient_js_1.buildServeAuthHeaders)({ accessToken: 'tok', userEmail: 'you@acme.com' }), { Authorization: 'Bearer tok' });
|
|
107
|
-
});
|
|
108
|
-
test('streamRemoteServeChat sends Authorization when auth provided', async () => {
|
|
109
|
-
const mock = await startMockServeServer([
|
|
110
|
-
JSON.stringify({ type: 'done' }),
|
|
111
|
-
]);
|
|
112
|
-
try {
|
|
113
|
-
const emitter = createCaptureEmitter();
|
|
114
|
-
await (0, serveClient_js_1.streamRemoteServeChat)({
|
|
115
|
-
baseUrl: mock.url,
|
|
116
|
-
message: 'ping',
|
|
117
|
-
auth: { accessToken: 'jwt-token', userEmail: 'dev@agenthippo.ai' },
|
|
118
|
-
}, emitter);
|
|
119
|
-
assert.strictEqual(mock.lastAuth, 'Bearer jwt-token');
|
|
120
|
-
}
|
|
121
|
-
finally {
|
|
122
|
-
await mock.close();
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
test('streamRemoteServeChat maps SSE events to StreamEmitter', async () => {
|
|
126
|
-
const mock = await startMockServeServer([
|
|
127
|
-
JSON.stringify({ type: 'thinking', delta: 'hmm' }),
|
|
128
|
-
JSON.stringify({ type: 'text', delta: 'hello' }),
|
|
129
|
-
JSON.stringify({ type: 'tool_start', name: 'Read', input: '{}', tool_call_id: 't1' }),
|
|
130
|
-
JSON.stringify({ type: 'tool_end', name: 'Read', tool_call_id: 't1', result: 'ok', is_error: false }),
|
|
131
|
-
JSON.stringify({ type: 'done' }),
|
|
132
|
-
]);
|
|
133
|
-
try {
|
|
134
|
-
const emitter = createCaptureEmitter();
|
|
135
|
-
const result = await (0, serveClient_js_1.streamRemoteServeChat)({
|
|
136
|
-
baseUrl: mock.url,
|
|
137
|
-
message: 'ping',
|
|
138
|
-
sessionId: 'sess-1',
|
|
139
|
-
}, emitter);
|
|
140
|
-
assert.deepStrictEqual(emitter.events.map((e) => e.type), ['thinking', 'text', 'toolStart', 'toolEnd', 'done']);
|
|
141
|
-
assert.strictEqual(emitter.events[1].payload, 'hello');
|
|
142
|
-
assert.deepStrictEqual(result, { ok: true });
|
|
143
|
-
}
|
|
144
|
-
finally {
|
|
145
|
-
await mock.close();
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
test('streamRemoteServeChat surfaces HTTP errors', async () => {
|
|
149
|
-
const server = http.createServer((_req, res) => {
|
|
150
|
-
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
151
|
-
res.end(JSON.stringify({ error: 'Unauthorized' }));
|
|
152
|
-
});
|
|
153
|
-
await new Promise((resolve, reject) => {
|
|
154
|
-
server.listen(0, '127.0.0.1', async () => {
|
|
155
|
-
try {
|
|
156
|
-
const address = server.address();
|
|
157
|
-
if (!address || typeof address === 'string') {
|
|
158
|
-
throw new Error('bad address');
|
|
159
|
-
}
|
|
160
|
-
const emitter = createCaptureEmitter();
|
|
161
|
-
const result = await (0, serveClient_js_1.streamRemoteServeChat)({ baseUrl: `http://127.0.0.1:${address.port}`, message: 'ping' }, emitter);
|
|
162
|
-
assert.deepStrictEqual(emitter.events.map((e) => e.type), ['error', 'done']);
|
|
163
|
-
assert.strictEqual(emitter.events[0].payload, 'Unauthorized');
|
|
164
|
-
// The turn failed: the caller must be able to see it (not record success).
|
|
165
|
-
assert.deepStrictEqual(result, { ok: false, error: 'Unauthorized' });
|
|
166
|
-
resolve();
|
|
167
|
-
}
|
|
168
|
-
catch (err) {
|
|
169
|
-
reject(err);
|
|
170
|
-
}
|
|
171
|
-
finally {
|
|
172
|
-
server.close();
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
test('streamRemoteServeChat surfaces fail-closed credential rejection as HTTP error (not silent success)', async () => {
|
|
178
|
-
// Mirrors serve.ts after the fix: warrant denial happens BEFORE SSE writeHead(200),
|
|
179
|
-
// so the client sees a real non-2xx JSON error instead of 200 + raw body fallthrough.
|
|
180
|
-
const server = http.createServer((_req, res) => {
|
|
181
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
182
|
-
res.end(JSON.stringify({
|
|
183
|
-
error: 'OBO data token present without a verified user in request scope (fail-closed: token_without_verified_user)',
|
|
184
|
-
}));
|
|
185
|
-
});
|
|
186
|
-
await new Promise((resolve, reject) => {
|
|
187
|
-
server.listen(0, '127.0.0.1', async () => {
|
|
188
|
-
try {
|
|
189
|
-
const address = server.address();
|
|
190
|
-
if (!address || typeof address === 'string') {
|
|
191
|
-
throw new Error('bad address');
|
|
192
|
-
}
|
|
193
|
-
const emitter = createCaptureEmitter();
|
|
194
|
-
const result = await (0, serveClient_js_1.streamRemoteServeChat)({ baseUrl: `http://127.0.0.1:${address.port}`, message: 'ping' }, emitter);
|
|
195
|
-
assert.strictEqual(result.ok, false);
|
|
196
|
-
assert.match(result.error ?? '', /token_without_verified_user/);
|
|
197
|
-
assert.deepStrictEqual(emitter.events.map((e) => e.type), ['error', 'done']);
|
|
198
|
-
resolve();
|
|
199
|
-
}
|
|
200
|
-
catch (err) {
|
|
201
|
-
reject(err);
|
|
202
|
-
}
|
|
203
|
-
finally {
|
|
204
|
-
server.close();
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
});
|