@agenthippo-ai/agenthippo 1.110.11 → 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 -302
- 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 -1283
- 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 +617 -564
- 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 +127 -459
- package/out/scripts/analytics/agent-fleet-widget.js +18 -257
- package/out/scripts/analytics/agentide-litellm-otel.config.yaml +0 -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/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 -69
- 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 -521
- 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 -324
- 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 -681
- 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 -151
- 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 -351
- package/out/cli/commands/serve.js +0 -1950
- package/out/cli/commands/store.js +0 -927
- package/out/cli/credential-context.js +0 -108
- 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 -153
- 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 -225
- package/out/cli/deploy/blueprints/registry.js +0 -84
- package/out/cli/deploy/layers/identity.js +0 -175
- 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 -776
- 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 -680
- 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 -643
- 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 -546
- 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 -326
- package/out/pack/lease-schema.js +0 -273
- package/out/pack/lease.js +0 -682
- 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 -141
- package/out/runner/protocol.js +0 -128
- package/out/runner/remoteEngine.js +0 -166
- 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 -572
- package/out/sandbox/processDriver.js +0 -318
- package/out/sandbox/sandboxRunner.js +0 -303
- 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 -460
- 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 -282
- package/out/test/data-plane.test.js +0 -624
- package/out/test/deploy-init.test.js +0 -860
- 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 -222
- 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 -224
- package/out/test/lease.test.js +0 -114
- package/out/test/localFleetAdapter.test.js +0 -91
- 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 -406
- package/out/test/sandbox-runner.test.js +0 -343
- package/out/test/sandbox-scope.test.js +0 -449
- package/out/test/scheduledFleetStorage.test.js +0 -72
- package/out/test/serve-cron-acceptance.test.js +0 -370
- package/out/test/serve-gateway-turn.test.js +0 -389
- package/out/test/serve-hardening.test.js +0 -591
- package/out/test/serveClient.test.js +0 -209
- package/out/test/sessionJsonlFleet.test.js +0 -78
- package/out/test/sessionShip.test.js +0 -618
- 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,624 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Data-plane gateway integration tests (secure-obo-design §3, §5, §9)
|
|
4
|
-
*
|
|
5
|
-
* Boots the real thing end to end: TurnRegistry + CredentialBroker + a real connector
|
|
6
|
-
* subprocess (stdio MCP over a private pipe) + the loopback streamable-HTTP gateway —
|
|
7
|
-
* then drives it with the MCP SDK client exactly like an engine would.
|
|
8
|
-
*--------------------------------------------------------------------------------------------*/
|
|
9
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
-
}
|
|
15
|
-
Object.defineProperty(o, k2, desc);
|
|
16
|
-
}) : (function(o, m, k, k2) {
|
|
17
|
-
if (k2 === undefined) k2 = k;
|
|
18
|
-
o[k2] = m[k];
|
|
19
|
-
}));
|
|
20
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
-
}) : function(o, v) {
|
|
23
|
-
o["default"] = v;
|
|
24
|
-
});
|
|
25
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
-
var ownKeys = function(o) {
|
|
27
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
-
var ar = [];
|
|
29
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
-
return ar;
|
|
31
|
-
};
|
|
32
|
-
return ownKeys(o);
|
|
33
|
-
};
|
|
34
|
-
return function (mod) {
|
|
35
|
-
if (mod && mod.__esModule) return mod;
|
|
36
|
-
var result = {};
|
|
37
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
-
__setModuleDefault(result, mod);
|
|
39
|
-
return result;
|
|
40
|
-
};
|
|
41
|
-
})();
|
|
42
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
require("mocha");
|
|
44
|
-
const assert = __importStar(require("assert"));
|
|
45
|
-
const fs = __importStar(require("fs"));
|
|
46
|
-
const path = __importStar(require("path"));
|
|
47
|
-
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
48
|
-
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
49
|
-
const data_plane_1 = require("../cli/data-plane");
|
|
50
|
-
const data_plane_2 = require("../cli/commands/data-plane");
|
|
51
|
-
const identity_1 = require("../analytics/identity");
|
|
52
|
-
// The fixture connector must live INSIDE the extension tree so its `import` of
|
|
53
|
-
// @modelcontextprotocol/sdk resolves by walking up to extensions/agentide/node_modules.
|
|
54
|
-
const FIXTURE_DIR = path.join(__dirname, 'data-plane-fixture');
|
|
55
|
-
const CONNECTOR_PATH = path.join(FIXTURE_DIR, 'connector.mjs');
|
|
56
|
-
const CONNECTOR_SOURCE = `
|
|
57
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
58
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
59
|
-
import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
60
|
-
|
|
61
|
-
const server = new Server({ name: 'test-connector', version: '0.0.1' }, { capabilities: { tools: {} } });
|
|
62
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
63
|
-
tools: [{
|
|
64
|
-
name: 'whoami',
|
|
65
|
-
description: 'echo the broker-supplied turn context',
|
|
66
|
-
inputSchema: { type: 'object', properties: { probe: { type: 'string' } } },
|
|
67
|
-
}],
|
|
68
|
-
}));
|
|
69
|
-
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
70
|
-
const turn = (req.params._meta ?? {})['ai.agenthippo/turn'] ?? null;
|
|
71
|
-
const probe = (req.params.arguments ?? {}).probe ?? '';
|
|
72
|
-
return {
|
|
73
|
-
content: [{ type: 'text', text: JSON.stringify({
|
|
74
|
-
userId: turn ? turn.userId : null,
|
|
75
|
-
credential: turn ? turn.credential : null,
|
|
76
|
-
envContainsProbe: probe ? JSON.stringify(process.env).includes(probe) : false,
|
|
77
|
-
}) }],
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
await server.connect(new StdioServerTransport());
|
|
81
|
-
`;
|
|
82
|
-
function mcpClient(url, nonce) {
|
|
83
|
-
const transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(url), {
|
|
84
|
-
requestInit: { headers: { Authorization: `Bearer ${nonce}` } },
|
|
85
|
-
});
|
|
86
|
-
const client = new index_js_1.Client({ name: 'test-engine', version: '0.0.1' });
|
|
87
|
-
return { client, transport };
|
|
88
|
-
}
|
|
89
|
-
async function callWhoami(url, nonce, probe) {
|
|
90
|
-
const { client, transport } = mcpClient(url, nonce);
|
|
91
|
-
try {
|
|
92
|
-
await client.connect(transport);
|
|
93
|
-
const res = await client.callTool({ name: 'whoami', arguments: probe ? { probe } : {} });
|
|
94
|
-
const content = res.content[0];
|
|
95
|
-
return JSON.parse(content.text);
|
|
96
|
-
}
|
|
97
|
-
finally {
|
|
98
|
-
await client.close().catch(() => undefined);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
suite('data-plane: gateway + registry + broker end to end', function () {
|
|
102
|
-
this.timeout(30_000);
|
|
103
|
-
let plane;
|
|
104
|
-
suiteSetup(async () => {
|
|
105
|
-
fs.mkdirSync(FIXTURE_DIR, { recursive: true });
|
|
106
|
-
fs.writeFileSync(CONNECTOR_PATH, CONNECTOR_SOURCE, 'utf8');
|
|
107
|
-
plane = await data_plane_1.DataPlane.start({ connectorPath: CONNECTOR_PATH, provider: 'passthrough' });
|
|
108
|
-
});
|
|
109
|
-
suiteTeardown(async () => {
|
|
110
|
-
await plane?.close();
|
|
111
|
-
fs.rmSync(FIXTURE_DIR, { recursive: true, force: true });
|
|
112
|
-
});
|
|
113
|
-
test('gateway binds loopback only', () => {
|
|
114
|
-
assert.ok(plane.url.startsWith('http://127.0.0.1:'), plane.url);
|
|
115
|
-
});
|
|
116
|
-
test('a live nonce lists and calls tools as the registered user, credential selected server-side', async () => {
|
|
117
|
-
const turn = plane.registerTurn({ userId: 'alice@corp.com', sessionKey: 's1', inboundToken: 'alice-obo-token' });
|
|
118
|
-
try {
|
|
119
|
-
const { client, transport } = mcpClient(plane.url, turn.nonce);
|
|
120
|
-
await client.connect(transport);
|
|
121
|
-
const tools = await client.listTools();
|
|
122
|
-
assert.deepStrictEqual(tools.tools.map((t) => t.name), ['whoami']);
|
|
123
|
-
await client.close();
|
|
124
|
-
const who = await callWhoami(plane.url, turn.nonce);
|
|
125
|
-
assert.strictEqual(who.userId, 'alice@corp.com');
|
|
126
|
-
assert.strictEqual(who.credential, 'alice-obo-token', 'the broker must hand the connector the turn user\'s credential');
|
|
127
|
-
}
|
|
128
|
-
finally {
|
|
129
|
-
turn.release();
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
test('the credential never enters the connector process env — it rides only the per-call pipe', async () => {
|
|
133
|
-
const turn = plane.registerTurn({ userId: 'alice@corp.com', sessionKey: 's1', inboundToken: 'alice-obo-token' });
|
|
134
|
-
try {
|
|
135
|
-
const who = await callWhoami(plane.url, turn.nonce, 'alice-obo-token');
|
|
136
|
-
assert.strictEqual(who.envContainsProbe, false, 'raw credential must not appear anywhere in the connector env');
|
|
137
|
-
}
|
|
138
|
-
finally {
|
|
139
|
-
turn.release();
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
test('two concurrent turns each resolve their OWN user + credential (the §9.1 concurrency property)', async () => {
|
|
143
|
-
const alice = plane.registerTurn({ userId: 'alice@corp.com', sessionKey: 'sa', inboundToken: 'tok-alice' });
|
|
144
|
-
const bob = plane.registerTurn({ userId: 'bob@corp.com', sessionKey: 'sb', inboundToken: 'tok-bob' });
|
|
145
|
-
try {
|
|
146
|
-
const [a, b] = await Promise.all([
|
|
147
|
-
callWhoami(plane.url, alice.nonce),
|
|
148
|
-
callWhoami(plane.url, bob.nonce),
|
|
149
|
-
]);
|
|
150
|
-
assert.strictEqual(a.userId, 'alice@corp.com');
|
|
151
|
-
assert.strictEqual(a.credential, 'tok-alice');
|
|
152
|
-
assert.strictEqual(b.userId, 'bob@corp.com');
|
|
153
|
-
assert.strictEqual(b.credential, 'tok-bob');
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
alice.release();
|
|
157
|
-
bob.release();
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
test('missing / unknown nonce → 401, fail closed', async () => {
|
|
161
|
-
await assert.rejects(() => callWhoami(plane.url, 'not-a-real-nonce'), /401|Unauthorized/i);
|
|
162
|
-
});
|
|
163
|
-
test('a released (turn-ended) nonce → 401 — a stale engine fails closed (§3.2)', async () => {
|
|
164
|
-
const turn = plane.registerTurn({ userId: 'alice@corp.com', sessionKey: 's1', inboundToken: 't' });
|
|
165
|
-
const nonce = turn.nonce;
|
|
166
|
-
const who = await callWhoami(plane.url, nonce);
|
|
167
|
-
assert.strictEqual(who.userId, 'alice@corp.com');
|
|
168
|
-
turn.release();
|
|
169
|
-
await assert.rejects(() => callWhoami(plane.url, nonce), /401|Unauthorized/i);
|
|
170
|
-
});
|
|
171
|
-
test('an expired deadline → 401 even if release() was never called (stranded-nonce backstop)', async () => {
|
|
172
|
-
const { nonce } = plane.registry.register({
|
|
173
|
-
userId: 'alice@corp.com',
|
|
174
|
-
sessionKey: 's1',
|
|
175
|
-
inboundToken: 't',
|
|
176
|
-
deadline: Date.now() - 1,
|
|
177
|
-
});
|
|
178
|
-
await assert.rejects(() => callWhoami(plane.url, nonce), /401|Unauthorized/i);
|
|
179
|
-
});
|
|
180
|
-
test('passthrough provider with no inbound token → the TOOL CALL errors, fail closed, turn itself unaffected', async () => {
|
|
181
|
-
const turn = plane.registerTurn({ userId: 'peer:telegram:123', sessionKey: 's2' });
|
|
182
|
-
try {
|
|
183
|
-
const { client, transport } = mcpClient(plane.url, turn.nonce);
|
|
184
|
-
await client.connect(transport);
|
|
185
|
-
const res = await client.callTool({ name: 'whoami', arguments: {} });
|
|
186
|
-
assert.strictEqual(res.isError, true, 'no inbound credential must fail the call closed');
|
|
187
|
-
const text = res.content[0].text;
|
|
188
|
-
assert.match(text, /fail-closed/);
|
|
189
|
-
await client.close();
|
|
190
|
-
}
|
|
191
|
-
finally {
|
|
192
|
-
turn.release();
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
test('a token-less turn fails closed even RIGHT AFTER the same user ran a turn WITH a token (no cache bridging)', async () => {
|
|
196
|
-
// Passthrough gets the platform token on every legitimate request; a broker cache
|
|
197
|
-
// that outlives the turn would let broken forwarding silently reuse the previous
|
|
198
|
-
// token for the cache TTL — the exact silent-fallback failure the provider forbids.
|
|
199
|
-
const withToken = plane.registerTurn({ userId: 'u@corp.com', sessionKey: 's3', inboundToken: 'tok-1' });
|
|
200
|
-
try {
|
|
201
|
-
const ok = await callWhoami(plane.url, withToken.nonce);
|
|
202
|
-
assert.strictEqual(ok.credential, 'tok-1');
|
|
203
|
-
}
|
|
204
|
-
finally {
|
|
205
|
-
withToken.release();
|
|
206
|
-
}
|
|
207
|
-
const withoutToken = plane.registerTurn({ userId: 'u@corp.com', sessionKey: 's3' });
|
|
208
|
-
try {
|
|
209
|
-
const { client, transport } = mcpClient(plane.url, withoutToken.nonce);
|
|
210
|
-
await client.connect(transport);
|
|
211
|
-
const res = await client.callTool({ name: 'whoami', arguments: {} });
|
|
212
|
-
assert.strictEqual(res.isError, true, 'the cached tok-1 must not serve a token-less turn');
|
|
213
|
-
await client.close();
|
|
214
|
-
}
|
|
215
|
-
finally {
|
|
216
|
-
withoutToken.release();
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
suite('data-plane: TurnRegistry unit properties', () => {
|
|
221
|
-
test('raw nonces are never map keys — lookups go through sha256', () => {
|
|
222
|
-
const reg = new data_plane_1.TurnRegistry();
|
|
223
|
-
const { nonce } = reg.register({ userId: 'u', sessionKey: 's' });
|
|
224
|
-
assert.ok(reg.resolve(nonce));
|
|
225
|
-
// resolve by the HASH must fail — only the raw nonce authenticates.
|
|
226
|
-
assert.strictEqual(reg.resolve((0, data_plane_1.hashNonce)(nonce)), undefined);
|
|
227
|
-
});
|
|
228
|
-
test('release is idempotent and deletes exactly its own entry', () => {
|
|
229
|
-
const reg = new data_plane_1.TurnRegistry();
|
|
230
|
-
const a = reg.register({ userId: 'a', sessionKey: 's' });
|
|
231
|
-
const b = reg.register({ userId: 'b', sessionKey: 's' });
|
|
232
|
-
a.release();
|
|
233
|
-
a.release();
|
|
234
|
-
assert.strictEqual(reg.resolve(a.nonce), undefined);
|
|
235
|
-
assert.strictEqual(reg.resolve(b.nonce)?.userId, 'b');
|
|
236
|
-
b.release();
|
|
237
|
-
assert.strictEqual(reg.size, 0);
|
|
238
|
-
});
|
|
239
|
-
test('expired entries are pruned on register', () => {
|
|
240
|
-
const reg = new data_plane_1.TurnRegistry();
|
|
241
|
-
reg.register({ userId: 'a', sessionKey: 's', deadline: Date.now() - 1 });
|
|
242
|
-
assert.strictEqual(reg.size, 1);
|
|
243
|
-
reg.register({ userId: 'b', sessionKey: 's' });
|
|
244
|
-
assert.strictEqual(reg.size, 1, 'the expired entry must have been pruned');
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
suite('data-plane: sidecar EDGE registration (P1 fix — no forging authority in the agent container)', function () {
|
|
248
|
-
this.timeout(30_000);
|
|
249
|
-
const EDGE_TOKEN = 'edge-only-secret';
|
|
250
|
-
let sidecar;
|
|
251
|
-
let controlBase;
|
|
252
|
-
suiteSetup(async () => {
|
|
253
|
-
fs.mkdirSync(FIXTURE_DIR, { recursive: true });
|
|
254
|
-
fs.writeFileSync(CONNECTOR_PATH, CONNECTOR_SOURCE, 'utf8');
|
|
255
|
-
sidecar = await (0, data_plane_1.startDataPlaneSidecar)({
|
|
256
|
-
config: { connectorPath: CONNECTOR_PATH, provider: 'identity' },
|
|
257
|
-
registerToken: EDGE_TOKEN,
|
|
258
|
-
gatewayPort: 0,
|
|
259
|
-
controlPort: 0,
|
|
260
|
-
bindHost: '127.0.0.1',
|
|
261
|
-
});
|
|
262
|
-
controlBase = `http://127.0.0.1:${sidecar.controlPort}`;
|
|
263
|
-
});
|
|
264
|
-
suiteTeardown(async () => {
|
|
265
|
-
await sidecar?.close();
|
|
266
|
-
fs.rmSync(FIXTURE_DIR, { recursive: true, force: true });
|
|
267
|
-
});
|
|
268
|
-
async function edgeRegister(user, token = EDGE_TOKEN) {
|
|
269
|
-
// Shaped like Caddy forward_auth: GET, no body, verified identity in X-Agent-User.
|
|
270
|
-
return fetch(`${controlBase}/edge/turn`, {
|
|
271
|
-
headers: { Authorization: `Bearer ${token}`, 'X-Agent-User': user },
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
test('the edge mints a nonce for the verified user; the nonce works at the gateway as that user', async () => {
|
|
275
|
-
const res = await edgeRegister('alice@corp.com');
|
|
276
|
-
assert.strictEqual(res.status, 200);
|
|
277
|
-
const nonce = res.headers.get(data_plane_1.TURN_NONCE_HEADER);
|
|
278
|
-
assert.ok(nonce, 'nonce must ride the response header for Caddy copy_headers');
|
|
279
|
-
const who = await callWhoami(sidecar.gatewayUrl, nonce);
|
|
280
|
-
assert.strictEqual(who.userId, 'alice@corp.com');
|
|
281
|
-
});
|
|
282
|
-
test('edge registration without the edge token → 401 (the engine can route here but cannot forge)', async () => {
|
|
283
|
-
const res = await edgeRegister('victim@corp.com', 'stolen-or-missing');
|
|
284
|
-
assert.strictEqual(res.status, 401);
|
|
285
|
-
});
|
|
286
|
-
test('edge registration without a verified identity header → 400, fail closed', async () => {
|
|
287
|
-
const res = await fetch(`${controlBase}/edge/turn`, { headers: { Authorization: `Bearer ${EDGE_TOKEN}` } });
|
|
288
|
-
assert.strictEqual(res.status, 400);
|
|
289
|
-
});
|
|
290
|
-
test('serve releases an adopted turn via the gateway using ONLY the nonce; the nonce then fails closed', async () => {
|
|
291
|
-
const res = await edgeRegister('bob@corp.com');
|
|
292
|
-
const nonce = res.headers.get(data_plane_1.TURN_NONCE_HEADER);
|
|
293
|
-
const edge = new data_plane_1.EdgeDataPlane({ gatewayUrl: sidecar.gatewayUrl });
|
|
294
|
-
const turn = edge.adoptTurn(nonce);
|
|
295
|
-
assert.strictEqual(turn.env.AGENTHIPPO_TURN_NONCE, nonce);
|
|
296
|
-
assert.strictEqual(turn.env.AGENTHIPPO_DATA_MCP_URL, sidecar.gatewayUrl);
|
|
297
|
-
const who = await callWhoami(sidecar.gatewayUrl, nonce);
|
|
298
|
-
assert.strictEqual(who.userId, 'bob@corp.com');
|
|
299
|
-
await turn.release();
|
|
300
|
-
await assert.rejects(() => callWhoami(sidecar.gatewayUrl, nonce), /401|Unauthorized/i);
|
|
301
|
-
});
|
|
302
|
-
/**
|
|
303
|
-
* PR-F1 / agent-identity.md §8.5 G1.
|
|
304
|
-
*
|
|
305
|
-
* The edge forwarded `X-Agent-User` and nothing else, and `/edge/turn` registered with no
|
|
306
|
-
* inboundToken — so edge mode silently supported the `identity` provider ALONE. A
|
|
307
|
-
* `passthrough` deployment (Databricks-style OBO) booted clean and then failed closed on
|
|
308
|
-
* every single tool call, and an RFC 8693 `exchange` provider had no subject_token at all.
|
|
309
|
-
*/
|
|
310
|
-
test('release with a bogus nonce is a harmless no-op (204) and touches no other turn', async () => {
|
|
311
|
-
const res = await edgeRegister('carol@corp.com');
|
|
312
|
-
const nonce = res.headers.get(data_plane_1.TURN_NONCE_HEADER);
|
|
313
|
-
const del = await fetch(new URL('/turn', sidecar.gatewayUrl), {
|
|
314
|
-
method: 'DELETE',
|
|
315
|
-
headers: { Authorization: 'Bearer not-a-real-nonce' },
|
|
316
|
-
});
|
|
317
|
-
assert.strictEqual(del.status, 204);
|
|
318
|
-
const who = await callWhoami(sidecar.gatewayUrl, nonce);
|
|
319
|
-
assert.strictEqual(who.userId, 'carol@corp.com', 'an unrelated release must not end a live turn');
|
|
320
|
-
});
|
|
321
|
-
});
|
|
322
|
-
/**
|
|
323
|
-
* PLAN/agent-identity.md §8.5 G1 (build record §10.5).
|
|
324
|
-
*
|
|
325
|
-
* The edge forwarded `X-Agent-User` (an identifier) and nothing else, and `/edge/turn` registered
|
|
326
|
-
* with no inboundToken. So edge mode silently supported the `identity` provider ALONE: a
|
|
327
|
-
* `passthrough` deployment (Databricks-style OBO) booted clean and then failed closed on every
|
|
328
|
-
* single tool call, and an RFC 8693 `exchange` provider had no `subject_token` to exchange at all.
|
|
329
|
-
*
|
|
330
|
-
* This suite runs a PASSTHROUGH sidecar behind the edge — the combination that could not work.
|
|
331
|
-
*/
|
|
332
|
-
suite('data-plane: sidecar EDGE + passthrough (PR-F1 — the edge must forward the assertion)', function () {
|
|
333
|
-
this.timeout(30_000);
|
|
334
|
-
const EDGE_TOKEN = 'edge-assertion-token';
|
|
335
|
-
let sidecar;
|
|
336
|
-
let controlBase;
|
|
337
|
-
suiteSetup(async () => {
|
|
338
|
-
fs.mkdirSync(FIXTURE_DIR, { recursive: true });
|
|
339
|
-
fs.writeFileSync(CONNECTOR_PATH, CONNECTOR_SOURCE, 'utf8');
|
|
340
|
-
sidecar = await (0, data_plane_1.startDataPlaneSidecar)({
|
|
341
|
-
config: { connectorPath: CONNECTOR_PATH, provider: 'passthrough' },
|
|
342
|
-
registerToken: EDGE_TOKEN,
|
|
343
|
-
gatewayPort: 0,
|
|
344
|
-
controlPort: 0,
|
|
345
|
-
bindHost: '127.0.0.1',
|
|
346
|
-
});
|
|
347
|
-
controlBase = `http://127.0.0.1:${sidecar.controlPort}`;
|
|
348
|
-
});
|
|
349
|
-
suiteTeardown(async () => {
|
|
350
|
-
await sidecar?.close();
|
|
351
|
-
fs.rmSync(FIXTURE_DIR, { recursive: true, force: true });
|
|
352
|
-
});
|
|
353
|
-
const register = (user, assertion) => fetch(`${controlBase}/edge/turn`, {
|
|
354
|
-
headers: {
|
|
355
|
-
Authorization: `Bearer ${EDGE_TOKEN}`,
|
|
356
|
-
'X-Agent-User': user,
|
|
357
|
-
...(assertion ? { [data_plane_1.ASSERTION_HEADER]: assertion } : {}),
|
|
358
|
-
},
|
|
359
|
-
});
|
|
360
|
-
test('with the assertion forwarded, a passthrough turn reaches the backend as that user', async () => {
|
|
361
|
-
const res = await register('alice@corp.com', 'Bearer alice-platform-token');
|
|
362
|
-
assert.strictEqual(res.status, 200);
|
|
363
|
-
const who = await callWhoami(sidecar.gatewayUrl, res.headers.get(data_plane_1.TURN_NONCE_HEADER));
|
|
364
|
-
assert.strictEqual(who.userId, 'alice@corp.com');
|
|
365
|
-
assert.strictEqual(who.credential, 'alice-platform-token', 'the assertion becomes the turn inboundToken, and passthrough hands it to the connector');
|
|
366
|
-
});
|
|
367
|
-
test('a bare "Bearer " prefix is stripped — the connector gets the token, not the scheme', async () => {
|
|
368
|
-
const res = await register('bob@corp.com', 'Bearer bob-token');
|
|
369
|
-
const who = await callWhoami(sidecar.gatewayUrl, res.headers.get(data_plane_1.TURN_NONCE_HEADER));
|
|
370
|
-
assert.strictEqual(who.credential, 'bob-token');
|
|
371
|
-
});
|
|
372
|
-
test('an assertion sent WITHOUT the scheme prefix is taken verbatim', async () => {
|
|
373
|
-
const res = await register('carol@corp.com', 'carol-raw-token');
|
|
374
|
-
const who = await callWhoami(sidecar.gatewayUrl, res.headers.get(data_plane_1.TURN_NONCE_HEADER));
|
|
375
|
-
assert.strictEqual(who.credential, 'carol-raw-token');
|
|
376
|
-
});
|
|
377
|
-
test('WITHOUT the assertion the turn still registers, but every call fails closed — the pre-PR-F1 behaviour', async () => {
|
|
378
|
-
const res = await register('dave@corp.com');
|
|
379
|
-
assert.strictEqual(res.status, 200, 'registration itself must not depend on the assertion');
|
|
380
|
-
const { client, transport } = mcpClient(sidecar.gatewayUrl, res.headers.get(data_plane_1.TURN_NONCE_HEADER));
|
|
381
|
-
await client.connect(transport);
|
|
382
|
-
const out = await client.callTool({ name: 'whoami', arguments: {} });
|
|
383
|
-
await client.close();
|
|
384
|
-
assert.strictEqual(out.isError, true);
|
|
385
|
-
assert.match(out.content[0].text, /fail-closed/, 'no inbound credential must never fall back to a shared one');
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
/**
|
|
389
|
-
* PLAN/agent-identity.md §10.1 — the audit writer.
|
|
390
|
-
*
|
|
391
|
-
* The sidecar accepted an optional `audit` and `dataPlaneSidecarCommand` never passed one. Because
|
|
392
|
-
* every emit site is `opts.audit?.(…)`, the entire data-plane trust-boundary record was silently
|
|
393
|
-
* discarded in sidecar and edge mode — the two shapes the blueprints deploy. The compliance claim
|
|
394
|
-
* ("which user touched which rows") had no writer exactly where it was being made.
|
|
395
|
-
*
|
|
396
|
-
* These tests pin both halves: the sink the command builds actually writes, and the sidecar
|
|
397
|
-
* actually emits through it on the authorize / deny / reject paths.
|
|
398
|
-
*/
|
|
399
|
-
suite('data-plane: sidecar audit sink (PR-0 — the record must have a writer)', function () {
|
|
400
|
-
this.timeout(30_000);
|
|
401
|
-
const TOKEN = 'audit-suite-token';
|
|
402
|
-
const AUDIT_ROOT = path.join(FIXTURE_DIR, 'audit-state');
|
|
403
|
-
let sidecar;
|
|
404
|
-
let controlBase;
|
|
405
|
-
let auditDir;
|
|
406
|
-
const rows = () => {
|
|
407
|
-
if (!fs.existsSync(auditDir)) {
|
|
408
|
-
return [];
|
|
409
|
-
}
|
|
410
|
-
return fs.readdirSync(auditDir)
|
|
411
|
-
.filter((f) => f.endsWith('.jsonl'))
|
|
412
|
-
.flatMap((f) => fs.readFileSync(path.join(auditDir, f), 'utf8')
|
|
413
|
-
.split('\n').filter(Boolean).map((l) => JSON.parse(l)));
|
|
414
|
-
};
|
|
415
|
-
// The writer is fire-and-forget (`void writer.append(...)`) so the audit write must never
|
|
416
|
-
// delay a tool call. Poll briefly rather than sleeping a fixed amount.
|
|
417
|
-
const waitForEvent = async (eventType,
|
|
418
|
-
// Without a predicate this matches the FIRST row of the type, which may be one an earlier
|
|
419
|
-
// test wrote — and then the row under test may not have landed yet. Pass a predicate
|
|
420
|
-
// whenever a specific row is meant.
|
|
421
|
-
where = () => true, timeoutMs = 5_000) => {
|
|
422
|
-
const deadline = Date.now() + timeoutMs;
|
|
423
|
-
for (;;) {
|
|
424
|
-
const hit = rows().find((r) => r.event_type === eventType && where(r.payload));
|
|
425
|
-
if (hit) {
|
|
426
|
-
return hit;
|
|
427
|
-
}
|
|
428
|
-
if (Date.now() > deadline) {
|
|
429
|
-
assert.fail(`no matching "${eventType}" event within ${timeoutMs}ms; saw: ${JSON.stringify(rows().map((r) => r.event_type))}`);
|
|
430
|
-
}
|
|
431
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
432
|
-
}
|
|
433
|
-
};
|
|
434
|
-
suiteSetup(async () => {
|
|
435
|
-
fs.mkdirSync(FIXTURE_DIR, { recursive: true });
|
|
436
|
-
fs.writeFileSync(CONNECTOR_PATH, CONNECTOR_SOURCE, 'utf8');
|
|
437
|
-
const sink = await (0, data_plane_2.createDataPlaneAuditSink)(AUDIT_ROOT);
|
|
438
|
-
assert.strictEqual(sink.ok, true, sink.error);
|
|
439
|
-
assert.strictEqual(sink.ephemeral, false, 'an explicit state dir is durable');
|
|
440
|
-
auditDir = sink.auditDir;
|
|
441
|
-
sidecar = await (0, data_plane_1.startDataPlaneSidecar)({
|
|
442
|
-
config: { connectorPath: CONNECTOR_PATH, provider: 'identity' },
|
|
443
|
-
registerToken: TOKEN,
|
|
444
|
-
gatewayPort: 0,
|
|
445
|
-
controlPort: 0,
|
|
446
|
-
bindHost: '127.0.0.1',
|
|
447
|
-
audit: sink.audit,
|
|
448
|
-
});
|
|
449
|
-
controlBase = `http://127.0.0.1:${sidecar.controlPort}`;
|
|
450
|
-
});
|
|
451
|
-
suiteTeardown(async () => {
|
|
452
|
-
await sidecar?.close();
|
|
453
|
-
fs.rmSync(FIXTURE_DIR, { recursive: true, force: true });
|
|
454
|
-
});
|
|
455
|
-
test('an authorized tool call is recorded with the tool and the verified principal', async () => {
|
|
456
|
-
const res = await fetch(`${controlBase}/edge/turn`, {
|
|
457
|
-
headers: { Authorization: `Bearer ${TOKEN}`, 'X-Agent-User': 'dana@corp.com' },
|
|
458
|
-
});
|
|
459
|
-
const nonce = res.headers.get(data_plane_1.TURN_NONCE_HEADER);
|
|
460
|
-
const who = await callWhoami(sidecar.gatewayUrl, nonce);
|
|
461
|
-
assert.strictEqual(who.userId, 'dana@corp.com');
|
|
462
|
-
const ev = await waitForEvent('tool_authorize');
|
|
463
|
-
const payload = ev.payload;
|
|
464
|
-
assert.strictEqual(payload.tool, 'whoami');
|
|
465
|
-
assert.strictEqual(payload.userId, (0, identity_1.hashIdentity)('dana@corp.com'));
|
|
466
|
-
assert.strictEqual(payload.provider, 'identity');
|
|
467
|
-
});
|
|
468
|
-
test('an edge registration is recorded', async () => {
|
|
469
|
-
const ev = await waitForEvent('sidecar_edge_register');
|
|
470
|
-
assert.strictEqual(ev.payload.userId, (0, identity_1.hashIdentity)('dana@corp.com'));
|
|
471
|
-
});
|
|
472
|
-
/**
|
|
473
|
-
* These records ship wholesale to the evidence server, so whatever lands here leaves the
|
|
474
|
-
* machine. The tool-event lane already pseudonymises (ObservableStreamEmitter → hashIdentity);
|
|
475
|
-
* the data-plane lane must not be the one that exports raw addresses. In EDGE mode the sidecar
|
|
476
|
-
* registers with `sessionKey: userId`, so without this the evidence FILE is `alice@corp.com.jsonl`.
|
|
477
|
-
*/
|
|
478
|
-
test('no raw address reaches the record — not in a payload, not in a filename', () => {
|
|
479
|
-
const files = fs.readdirSync(auditDir);
|
|
480
|
-
assert.ok(files.length > 0, 'the suite must have produced evidence by now');
|
|
481
|
-
for (const f of files) {
|
|
482
|
-
assert.ok(!f.includes('@'), `evidence filename must not carry an address: ${f}`);
|
|
483
|
-
}
|
|
484
|
-
const serialized = JSON.stringify(rows());
|
|
485
|
-
const anon = (0, identity_1.hashIdentity)('dana@corp.com');
|
|
486
|
-
assert.ok(anon, 'hashIdentity must yield a pseudonym for a non-empty address');
|
|
487
|
-
assert.ok(!serialized.includes('dana@corp.com'), 'a raw address must never reach the record');
|
|
488
|
-
assert.ok(serialized.includes(anon), 'the salted hash is the join key and must be present');
|
|
489
|
-
});
|
|
490
|
-
test('a rejected registration is recorded — the reject path is the one an auditor asks about', async () => {
|
|
491
|
-
const res = await fetch(`${controlBase}/edge/turn`, {
|
|
492
|
-
headers: { Authorization: 'Bearer wrong-token', 'X-Agent-User': 'mallory@corp.com' },
|
|
493
|
-
});
|
|
494
|
-
assert.strictEqual(res.status, 401);
|
|
495
|
-
const ev = await waitForEvent('sidecar_register_reject');
|
|
496
|
-
assert.strictEqual(ev.payload.reason, 'bad_token');
|
|
497
|
-
});
|
|
498
|
-
test('an unknown nonce at the gateway is recorded, and never logs the raw nonce', async () => {
|
|
499
|
-
await assert.rejects(() => callWhoami(sidecar.gatewayUrl, 'forged-nonce-value'), /401|Unauthorized/i);
|
|
500
|
-
const ev = await waitForEvent('nonce_reject');
|
|
501
|
-
const payload = ev.payload;
|
|
502
|
-
assert.strictEqual(payload.reason, 'unknown_or_expired');
|
|
503
|
-
assert.ok(payload.nonce_sha256_prefix, 'a hash prefix must be present');
|
|
504
|
-
const serialized = JSON.stringify(rows());
|
|
505
|
-
assert.ok(!serialized.includes('forged-nonce-value'), 'a raw nonce must never reach the audit record');
|
|
506
|
-
});
|
|
507
|
-
test('the assertion is fingerprinted in the record, never carried raw', async () => {
|
|
508
|
-
const secret = 'super-secret-user-assertion-value';
|
|
509
|
-
await fetch(`${controlBase}/edge/turn`, {
|
|
510
|
-
headers: { Authorization: `Bearer ${TOKEN}`, 'X-Agent-User': 'erin@corp.com', [data_plane_1.ASSERTION_HEADER]: `Bearer ${secret}` },
|
|
511
|
-
});
|
|
512
|
-
const ev = await waitForEvent('sidecar_edge_register', (p) => p.userId === (0, identity_1.hashIdentity)('erin@corp.com'));
|
|
513
|
-
assert.match(String(ev.payload.assertion), /^sha256:[0-9a-f]{12}$/, 'a hash prefix must prove which assertion the turn used');
|
|
514
|
-
assert.ok(!JSON.stringify(rows()).includes(secret), 'a user assertion is a bearer credential and must never reach the record');
|
|
515
|
-
});
|
|
516
|
-
test('an unwritable audit root reports ok:false rather than throwing, so the caller sets the policy', async () => {
|
|
517
|
-
// A path whose parent is a FILE — mkdir -p cannot succeed.
|
|
518
|
-
const blocker = path.join(FIXTURE_DIR, 'not-a-dir');
|
|
519
|
-
fs.writeFileSync(blocker, 'x', 'utf8');
|
|
520
|
-
const sink = await (0, data_plane_2.createDataPlaneAuditSink)(path.join(blocker, 'nested'));
|
|
521
|
-
assert.strictEqual(sink.ok, false);
|
|
522
|
-
assert.ok(sink.error, 'the failure reason must be reportable to the operator');
|
|
523
|
-
});
|
|
524
|
-
});
|
|
525
|
-
/**
|
|
526
|
-
* PLAN/agent-identity.md §10.6 — the audit stamp and the agent field.
|
|
527
|
-
*
|
|
528
|
-
* Design §1's third failure was "the auditor's second question is unanswerable" — *why could the
|
|
529
|
-
* invoice agent reach the HR schema at all*. PR-0 gave the record a writer, which made "which user
|
|
530
|
-
* touched which rows" answerable. It did not make "via which agent" answerable: rows carried
|
|
531
|
-
* `{tool, userId, provider}` and nothing about the pack. The agent was only ever IMPLIED, by which
|
|
532
|
-
* deployment happened to write the file — and that implication is exactly what breaks when two
|
|
533
|
-
* serves share one connector (§4.4).
|
|
534
|
-
*/
|
|
535
|
-
suite('data-plane: every audit row names the AGENT, not just the user', function () {
|
|
536
|
-
this.timeout(30_000);
|
|
537
|
-
const TOKEN = 'agent-stamp-token';
|
|
538
|
-
const AUDIT_ROOT = path.join(FIXTURE_DIR, 'agent-stamp-state');
|
|
539
|
-
const LOADED = { pack: 'invoice-agent', version: '1.4.0' };
|
|
540
|
-
let sidecar;
|
|
541
|
-
let controlBase;
|
|
542
|
-
let auditDir;
|
|
543
|
-
const rows = () => (fs.existsSync(auditDir) ? fs.readdirSync(auditDir) : [])
|
|
544
|
-
.filter((f) => f.endsWith('.jsonl'))
|
|
545
|
-
.flatMap((f) => fs.readFileSync(path.join(auditDir, f), 'utf8')
|
|
546
|
-
.split('\n').filter(Boolean).map((l) => JSON.parse(l)));
|
|
547
|
-
const waitFor = async (pred) => {
|
|
548
|
-
const deadline = Date.now() + 5_000;
|
|
549
|
-
for (;;) {
|
|
550
|
-
const hit = rows().find(pred);
|
|
551
|
-
if (hit) {
|
|
552
|
-
return hit;
|
|
553
|
-
}
|
|
554
|
-
if (Date.now() > deadline) {
|
|
555
|
-
assert.fail(`no matching row; saw ${JSON.stringify(rows().map((r) => r.event_type))}`);
|
|
556
|
-
}
|
|
557
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
558
|
-
}
|
|
559
|
-
};
|
|
560
|
-
suiteSetup(async () => {
|
|
561
|
-
fs.mkdirSync(FIXTURE_DIR, { recursive: true });
|
|
562
|
-
fs.writeFileSync(CONNECTOR_PATH, CONNECTOR_SOURCE, 'utf8');
|
|
563
|
-
const sink = await (0, data_plane_2.createDataPlaneAuditSink)(AUDIT_ROOT, LOADED);
|
|
564
|
-
auditDir = sink.auditDir;
|
|
565
|
-
sidecar = await (0, data_plane_1.startDataPlaneSidecar)({
|
|
566
|
-
config: { connectorPath: CONNECTOR_PATH, provider: 'identity' },
|
|
567
|
-
registerToken: TOKEN, gatewayPort: 0, controlPort: 0, bindHost: '127.0.0.1',
|
|
568
|
-
audit: sink.audit, agent: LOADED,
|
|
569
|
-
});
|
|
570
|
-
controlBase = `http://127.0.0.1:${sidecar.controlPort}`;
|
|
571
|
-
});
|
|
572
|
-
suiteTeardown(async () => {
|
|
573
|
-
await sidecar?.close();
|
|
574
|
-
fs.rmSync(FIXTURE_DIR, { recursive: true, force: true });
|
|
575
|
-
});
|
|
576
|
-
test('a tool call records WHICH AGENT served it — the auditor\'s second question', async () => {
|
|
577
|
-
const res = await fetch(`${controlBase}/edge/turn`, {
|
|
578
|
-
headers: { Authorization: `Bearer ${TOKEN}`, 'X-Agent-User': 'alice@corp.com' },
|
|
579
|
-
});
|
|
580
|
-
await callWhoami(sidecar.gatewayUrl, res.headers.get(data_plane_1.TURN_NONCE_HEADER));
|
|
581
|
-
const ev = await waitFor((r) => r.event_type === 'tool_authorize');
|
|
582
|
-
assert.deepStrictEqual(ev.payload.agent, { ...LOADED, digest: null }, 'without this the row says which USER touched the rows and nothing about the agent');
|
|
583
|
-
});
|
|
584
|
-
test('the sidecar claims no digest it has not verified', async () => {
|
|
585
|
-
const ev = await waitFor((r) => r.event_type === 'tool_authorize');
|
|
586
|
-
assert.strictEqual(ev.payload.agent.digest, null, 'pack-loader does not verify signatures in the sidecar; a digest here would dress an '
|
|
587
|
-
+ 'unverified read as an attestation');
|
|
588
|
-
});
|
|
589
|
-
test('PR-8: a registration records the agent it CLAIMS, marked as asserted', async () => {
|
|
590
|
-
await fetch(`${controlBase}/turns`, {
|
|
591
|
-
method: 'POST',
|
|
592
|
-
headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
|
|
593
|
-
body: JSON.stringify({ userId: 'bob@corp.com', sessionKey: 's-claim', agent: { pack: 'invoice-agent' } }),
|
|
594
|
-
});
|
|
595
|
-
const ev = await waitFor((r) => r.event_type === 'sidecar_register' && r.payload.claimedAgent === 'invoice-agent');
|
|
596
|
-
assert.strictEqual(ev.payload.binding, 'asserted', 'the register token is shared, so the claim is only as good as whoever holds it — '
|
|
597
|
-
+ 'evidence must never present it as verified');
|
|
598
|
-
assert.strictEqual(ev.payload.agentMismatch, undefined);
|
|
599
|
-
});
|
|
600
|
-
test('PR-8 / §4.4: a DIFFERENT agent on the same connector is flagged, not silently accepted', async () => {
|
|
601
|
-
// The invariant E2 rests on: one connector, one agent. It is unenforceable over a shared
|
|
602
|
-
// bearer, so the deliverable is that it becomes VISIBLE the moment it is violated.
|
|
603
|
-
const res = await fetch(`${controlBase}/turns`, {
|
|
604
|
-
method: 'POST',
|
|
605
|
-
headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
|
|
606
|
-
body: JSON.stringify({ userId: 'mallory@corp.com', sessionKey: 's-other', agent: { pack: 'hr-agent' } }),
|
|
607
|
-
});
|
|
608
|
-
assert.strictEqual(res.status, 200, 'it must still register — refusing on an unverifiable claim would let anyone with the '
|
|
609
|
-
+ 'token deny service by lying about the pack');
|
|
610
|
-
const ev = await waitFor((r) => r.event_type === 'sidecar_register' && r.payload.claimedAgent === 'hr-agent');
|
|
611
|
-
assert.strictEqual(ev.payload.agentMismatch, true);
|
|
612
|
-
assert.strictEqual(ev.payload.loadedAgent, 'invoice-agent');
|
|
613
|
-
});
|
|
614
|
-
test('a registration with no agent claim still works — the field is optional', async () => {
|
|
615
|
-
const res = await fetch(`${controlBase}/turns`, {
|
|
616
|
-
method: 'POST',
|
|
617
|
-
headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
|
|
618
|
-
body: JSON.stringify({ userId: 'carol@corp.com', sessionKey: 's-none' }),
|
|
619
|
-
});
|
|
620
|
-
assert.strictEqual(res.status, 200);
|
|
621
|
-
const ev = await waitFor((r) => r.event_type === 'sidecar_register' && r.payload.claimedAgent === 'none');
|
|
622
|
-
assert.strictEqual(ev.payload.agentMismatch, undefined, 'absent is not a mismatch');
|
|
623
|
-
});
|
|
624
|
-
});
|