@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.
Files changed (534) hide show
  1. package/out/agentpack/types.js +2 -5
  2. package/out/analytics/dashboard/artifactManager.js +2 -439
  3. package/out/analytics/dashboard/fleetDisplayUtils.js +2 -162
  4. package/out/analytics/dashboard/fleetOrchestrator.js +3 -142
  5. package/out/analytics/dashboard/fleetRegistry.js +2 -79
  6. package/out/analytics/dashboard/fleetRowDefaults.js +2 -87
  7. package/out/analytics/dashboard/fleetScriptAdapter.js +2 -146
  8. package/out/analytics/dashboard/fleetTypes.js +2 -29
  9. package/out/analytics/dashboard/index.js +2 -17
  10. package/out/analytics/dashboard/indexingService.js +2 -422
  11. package/out/analytics/dashboard/localFleetAdapter.js +2 -302
  12. package/out/analytics/dashboard/performanceMonitor.js +5 -76
  13. package/out/analytics/dashboard/processManager.js +2 -209
  14. package/out/analytics/dashboard/provider.js +38 -3817
  15. package/out/analytics/dashboard/queryRunner.js +62 -750
  16. package/out/analytics/dashboard/scheduledFleetStorage.js +2 -241
  17. package/out/analytics/dashboard/sessionJsonlFleet.js +3 -204
  18. package/out/analytics/dashboard/teamViewDiscovery.js +2 -106
  19. package/out/analytics/dashboard/webview/panel.js +34 -2318
  20. package/out/analytics/dashboard/webview/runtime-bridge.js +2 -82
  21. package/out/analytics/lifecycle.js +2 -43
  22. package/out/analytics/service.js +8 -1283
  23. package/out/auth/authBaseUrl.js +2 -59
  24. package/out/auth/bootstrapApply.js +2 -71
  25. package/out/auth/brokerClient.js +2 -160
  26. package/out/auth/callbackUri.js +2 -59
  27. package/out/auth/githubStoreGate.js +2 -70
  28. package/out/auth/loopbackAuthServer.js +4 -159
  29. package/out/auth/onboardingPrompt.js +2 -112
  30. package/out/auth/pkce.js +2 -9
  31. package/out/auth/provider.js +2 -226
  32. package/out/auth/sessionStore.js +2 -156
  33. package/out/auth/signInFlow.js +2 -183
  34. package/out/cli/index.js +617 -564
  35. package/out/cli/run-custom-engine-runner.js +3 -318
  36. package/out/cli/vscode-shim.js +2 -86
  37. package/out/engines/factory.js +2 -45
  38. package/out/engines/types.js +2 -17
  39. package/out/examples/run-headless-repl.js +6 -286
  40. package/out/examples/run-headless.js +2 -187
  41. package/out/extension.js +32 -4473
  42. package/out/gateway/gatewayRouteIndex.js +6 -371
  43. package/out/gateway/gatewaySessionStore.js +3 -243
  44. package/out/gateway/index.js +2 -31
  45. package/out/gateway/resetMappings.js +2 -52
  46. package/out/gateway/service.js +5 -1249
  47. package/out/mcp/publish.js +2 -143
  48. package/out/remote/handleRemoteChat.js +2 -169
  49. package/out/remote/remotePackStatusBar.js +3 -103
  50. package/out/remote/remoteTrust.js +6 -277
  51. package/out/remote/serveClient.js +4 -277
  52. package/out/remoteSkills.js +3 -191
  53. package/out/runtime/index.js +2 -32
  54. package/out/runtime/vscode/index.js +2 -20
  55. package/out/runtime/vscode/vscode-config-provider.js +2 -77
  56. package/out/runtime/vscode/vscode-edit-tracker.js +2 -122
  57. package/out/runtime/vscode/vscode-logger.js +2 -30
  58. package/out/runtime/vscode/vscode-permission-handler.js +2 -72
  59. package/out/scripts/agentide-litellm.sh +0 -1
  60. package/out/scripts/agentide_litellm_hooks_v1.py +127 -459
  61. package/out/scripts/analytics/agent-fleet-widget.js +18 -257
  62. package/out/scripts/analytics/agentide-litellm-otel.config.yaml +0 -4
  63. package/out/scripts/analytics/duckdbLocator.js +2 -28
  64. package/out/scripts/analytics/generate-default-charts.py +43 -323
  65. package/out/scripts/analytics/hotspot-analysis-widget.js +4 -430
  66. package/out/scripts/analytics/index-traces.py +78 -1036
  67. package/out/scripts/analytics/session-comparison-widget.js +26 -472
  68. package/out/scripts/analytics/session-timeline-widget.js +25 -846
  69. package/out/scripts/analytics/token-cost-flamegraph-widget.js +4 -461
  70. package/out/scripts/analytics/token-cost-trend-widget.js +4 -534
  71. package/out/scripts/analytics/workflows-collector.cjs +4 -314
  72. package/out/scripts/analytics/workflows-daemon.mjs +9 -185
  73. package/out/scripts/analytics/workflows-widget.cjs +15 -159
  74. package/out/scripts/analytics/wow-model-widget.js +10 -120
  75. package/out/scripts/vendor-tools.mjs +2 -233
  76. package/out/skills/publish.js +3 -178
  77. package/out/store/github/setup.js +7 -212
  78. package/out/store/oramaIndex.js +2 -884
  79. package/out/sync.js +26 -1829
  80. package/out/terminalLogger.js +5 -358
  81. package/out/utils/pathSafety.js +2 -60
  82. package/out/utils/pythonRunner.js +4 -258
  83. package/out/utils/toolPath.js +2 -83
  84. package/out/workspaceFolders.js +2 -59
  85. package/package.json +1 -1
  86. package/out/agentpack/github.js +0 -547
  87. package/out/agentpack/index.js +0 -69
  88. package/out/agentpack/install.js +0 -297
  89. package/out/agentpack/manager.js +0 -441
  90. package/out/agentpack/manifest.js +0 -135
  91. package/out/agentpack/paths.js +0 -521
  92. package/out/agentpack/publish.js +0 -248
  93. package/out/agentpack/stores.js +0 -554
  94. package/out/analytics/dashboard/fleetStatusUtils.js +0 -30
  95. package/out/analytics/dashboard/fleetTitleUtils.js +0 -68
  96. package/out/analytics/dashboard/refreshPolicy.js +0 -16
  97. package/out/analytics/dashboard/scheduledFleetFingerprint.js +0 -22
  98. package/out/analytics/dashboard/scheduledFleetUtils.js +0 -22
  99. package/out/analytics/dashboard/sessionEventFleetStats.js +0 -118
  100. package/out/analytics/dashboard/viewsConfigMerge.js +0 -221
  101. package/out/analytics/dashboard/webview/codicon.ttf +0 -0
  102. package/out/analytics/identity.js +0 -0
  103. package/out/analytics/sessionEvents.js +0 -324
  104. package/out/auth/callbackUriParse.js +0 -59
  105. package/out/auth/types.js +0 -12
  106. package/out/auth-broker/config.js +0 -112
  107. package/out/auth-broker/jwt.js +0 -105
  108. package/out/auth-broker/pkce.js +0 -59
  109. package/out/auth-broker/server.js +0 -681
  110. package/out/auth-broker/store.js +0 -275
  111. package/out/authority/warrant.js +0 -206
  112. package/out/base-prompts/mcp-servers/.mcp.json +0 -13
  113. package/out/base-prompts/mcp-servers/langfuse-analytics/README.md +0 -142
  114. package/out/base-prompts/mcp-servers/langfuse-analytics/mcp.json +0 -13
  115. package/out/base-prompts/mcp-servers/langfuse-analytics/package-lock.json +0 -1192
  116. package/out/base-prompts/mcp-servers/langfuse-analytics/package.json +0 -23
  117. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/run-with-env.sh +0 -12
  118. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/sdk-test.js +0 -102
  119. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/simple-test.js +0 -137
  120. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-client.js +0 -118
  121. package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-server.js +0 -209
  122. package/out/base-prompts/mcp-servers/langfuse-analytics/src/client.ts +0 -431
  123. package/out/base-prompts/mcp-servers/langfuse-analytics/src/index.ts +0 -270
  124. package/out/base-prompts/mcp-servers/langfuse-analytics/tsconfig.json +0 -18
  125. package/out/base-prompts/rules/AGENTS.md +0 -204
  126. package/out/base-prompts/skills/agent-browser/SKILL.md +0 -102
  127. package/out/base-prompts/skills/agent-builder/SKILL.md +0 -73
  128. package/out/base-prompts/skills/agent-builder/references/agent-pack.md +0 -63
  129. package/out/base-prompts/skills/agent-builder/references/crewai.md +0 -66
  130. package/out/base-prompts/skills/agent-builder/references/langchain.md +0 -60
  131. package/out/base-prompts/skills/agent-builder/references/raw-sdk.md +0 -73
  132. package/out/base-prompts/skills/agent-engine-creator/SKILL.md +0 -586
  133. package/out/base-prompts/skills/agent-engine-installer/SKILL.md +0 -106
  134. package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.mjs +0 -259
  135. package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.ps1 +0 -189
  136. package/out/base-prompts/skills/agenthippo-cli/SKILL.md +0 -69
  137. package/out/base-prompts/skills/agenthippo-cli/scripts/install.sh +0 -63
  138. package/out/base-prompts/skills/agentpack-creator/SKILL.md +0 -375
  139. package/out/base-prompts/skills/agentpack-creator/references/agent-templates.md +0 -261
  140. package/out/base-prompts/skills/agentpack-creator/references/agents-md-guide.md +0 -195
  141. package/out/base-prompts/skills/agentpack-creator/scripts/init_pack.py +0 -391
  142. package/out/base-prompts/skills/agentpack-creator/scripts/init_pack_test.py +0 -294
  143. package/out/base-prompts/skills/agentpack-testbench/SKILL.md +0 -135
  144. package/out/base-prompts/skills/algorithmic-art/LICENSE.txt +0 -202
  145. package/out/base-prompts/skills/algorithmic-art/SKILL.md +0 -405
  146. package/out/base-prompts/skills/algorithmic-art/templates/generator_template.js +0 -223
  147. package/out/base-prompts/skills/algorithmic-art/templates/viewer.html +0 -599
  148. package/out/base-prompts/skills/debug-agent/SKILL.md +0 -83
  149. package/out/base-prompts/skills/desktop-automation/SKILL.md +0 -166
  150. package/out/base-prompts/skills/desktop-automation/references/agenthippo-ui-recipes.md +0 -441
  151. package/out/base-prompts/skills/desktop-automation/scripts/windows-desktop-uia.psm1 +0 -280
  152. package/out/base-prompts/skills/docx/LICENSE.txt +0 -30
  153. package/out/base-prompts/skills/docx/SKILL.md +0 -197
  154. package/out/base-prompts/skills/docx/docx-js.md +0 -350
  155. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  156. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  157. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  158. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  159. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  160. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  161. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  162. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  163. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  164. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  165. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  166. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  167. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  168. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  169. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  170. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  171. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  172. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  173. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  174. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  175. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  176. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  177. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  178. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  179. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  180. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  181. package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  182. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  183. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  184. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  185. package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  186. package/out/base-prompts/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
  187. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  188. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  189. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  190. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  191. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  192. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  193. package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  194. package/out/base-prompts/skills/docx/ooxml/scripts/pack.py +0 -159
  195. package/out/base-prompts/skills/docx/ooxml/scripts/unpack.py +0 -29
  196. package/out/base-prompts/skills/docx/ooxml/scripts/validate.py +0 -69
  197. package/out/base-prompts/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
  198. package/out/base-prompts/skills/docx/ooxml/scripts/validation/base.py +0 -951
  199. package/out/base-prompts/skills/docx/ooxml/scripts/validation/docx.py +0 -274
  200. package/out/base-prompts/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
  201. package/out/base-prompts/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
  202. package/out/base-prompts/skills/docx/ooxml.md +0 -610
  203. package/out/base-prompts/skills/docx/scripts/__init__.py +0 -1
  204. package/out/base-prompts/skills/docx/scripts/document.py +0 -1276
  205. package/out/base-prompts/skills/docx/scripts/templates/comments.xml +0 -3
  206. package/out/base-prompts/skills/docx/scripts/templates/commentsExtended.xml +0 -3
  207. package/out/base-prompts/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
  208. package/out/base-prompts/skills/docx/scripts/templates/commentsIds.xml +0 -3
  209. package/out/base-prompts/skills/docx/scripts/templates/people.xml +0 -3
  210. package/out/base-prompts/skills/docx/scripts/utilities.py +0 -374
  211. package/out/base-prompts/skills/gateway-outbound/SKILL.md +0 -136
  212. package/out/base-prompts/skills/mcp-builder/LICENSE.txt +0 -202
  213. package/out/base-prompts/skills/mcp-builder/SKILL.md +0 -328
  214. package/out/base-prompts/skills/mcp-builder/reference/evaluation.md +0 -602
  215. package/out/base-prompts/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
  216. package/out/base-prompts/skills/mcp-builder/reference/node_mcp_server.md +0 -970
  217. package/out/base-prompts/skills/mcp-builder/reference/python_mcp_server.md +0 -719
  218. package/out/base-prompts/skills/mcp-builder/scripts/connections.py +0 -151
  219. package/out/base-prompts/skills/mcp-builder/scripts/evaluation.py +0 -373
  220. package/out/base-prompts/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
  221. package/out/base-prompts/skills/mcp-builder/scripts/requirements.txt +0 -2
  222. package/out/base-prompts/skills/openclaw/SKILL.md +0 -406
  223. package/out/base-prompts/skills/openclaw/scripts/run-smoke.sh +0 -61
  224. package/out/base-prompts/skills/pdf/LICENSE.txt +0 -30
  225. package/out/base-prompts/skills/pdf/SKILL.md +0 -294
  226. package/out/base-prompts/skills/pdf/forms.md +0 -205
  227. package/out/base-prompts/skills/pdf/reference.md +0 -612
  228. package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes.py +0 -70
  229. package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
  230. package/out/base-prompts/skills/pdf/scripts/check_fillable_fields.py +0 -12
  231. package/out/base-prompts/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
  232. package/out/base-prompts/skills/pdf/scripts/create_validation_image.py +0 -41
  233. package/out/base-prompts/skills/pdf/scripts/extract_form_field_info.py +0 -152
  234. package/out/base-prompts/skills/pdf/scripts/fill_fillable_fields.py +0 -114
  235. package/out/base-prompts/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
  236. package/out/base-prompts/skills/pptx/LICENSE.txt +0 -30
  237. package/out/base-prompts/skills/pptx/SKILL.md +0 -484
  238. package/out/base-prompts/skills/pptx/html2pptx.md +0 -625
  239. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  240. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  241. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  242. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  243. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  244. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  245. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  246. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  247. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  248. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  249. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  250. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  251. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  252. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  253. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  254. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  255. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  256. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  257. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  258. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  259. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  260. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  261. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  262. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  263. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  264. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  265. package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  266. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  267. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  268. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  269. package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  270. package/out/base-prompts/skills/pptx/ooxml/schemas/mce/mc.xsd +0 -75
  271. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  272. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  273. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  274. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  275. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  276. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  277. package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  278. package/out/base-prompts/skills/pptx/ooxml/scripts/pack.py +0 -159
  279. package/out/base-prompts/skills/pptx/ooxml/scripts/unpack.py +0 -29
  280. package/out/base-prompts/skills/pptx/ooxml/scripts/validate.py +0 -69
  281. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/__init__.py +0 -15
  282. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/base.py +0 -951
  283. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/docx.py +0 -274
  284. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/pptx.py +0 -315
  285. package/out/base-prompts/skills/pptx/ooxml/scripts/validation/redlining.py +0 -279
  286. package/out/base-prompts/skills/pptx/ooxml.md +0 -427
  287. package/out/base-prompts/skills/pptx/scripts/html2pptx.js +0 -984
  288. package/out/base-prompts/skills/pptx/scripts/inventory.py +0 -1020
  289. package/out/base-prompts/skills/pptx/scripts/rearrange.py +0 -231
  290. package/out/base-prompts/skills/pptx/scripts/replace.py +0 -385
  291. package/out/base-prompts/skills/pptx/scripts/thumbnail.py +0 -450
  292. package/out/base-prompts/skills/prompt-lab/SKILL.md +0 -149
  293. package/out/base-prompts/skills/prompt-lab/scripts/query-analytics.sh +0 -2551
  294. package/out/base-prompts/skills/skill-creator/LICENSE.txt +0 -202
  295. package/out/base-prompts/skills/skill-creator/SKILL.md +0 -371
  296. package/out/base-prompts/skills/skill-creator/references/output-patterns.md +0 -82
  297. package/out/base-prompts/skills/skill-creator/references/workflows.md +0 -28
  298. package/out/base-prompts/skills/skill-creator/scripts/init_skill.py +0 -303
  299. package/out/base-prompts/skills/skill-creator/scripts/package_skill.py +0 -110
  300. package/out/base-prompts/skills/skill-creator/scripts/quick_validate.py +0 -95
  301. package/out/base-prompts/skills/skill-installer/SKILL.md +0 -251
  302. package/out/base-prompts/skills/skill-installer/references/store-api.md +0 -219
  303. package/out/base-prompts/skills/spotlight-dashboard/SKILL.md +0 -83
  304. package/out/base-prompts/skills/spotlight-insights/SKILL.md +0 -101
  305. package/out/base-prompts/skills/spotlight-optimize/SKILL.md +0 -93
  306. package/out/base-prompts/skills/spotlight-optimize/scripts/query-analytics.sh +0 -2551
  307. package/out/base-prompts/skills/spotlight-query/SKILL.md +0 -314
  308. package/out/base-prompts/skills/spotlight-query/references/otel-schema.md +0 -163
  309. package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.sh +0 -2551
  310. package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.test.sh +0 -744
  311. package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/sessions/sess-test-1.jsonl +0 -14
  312. package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/.duckdb-index.json +0 -7
  313. package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/sample.jsonl +0 -5
  314. package/out/base-prompts/skills/spotlight-report/SKILL.md +0 -86
  315. package/out/base-prompts/skills/spotlight-visualize/SKILL.md +0 -92
  316. package/out/base-prompts/skills/spotlight-visualize/scripts/query-analytics.sh +0 -2551
  317. package/out/base-prompts/skills/xlsx/LICENSE.txt +0 -30
  318. package/out/base-prompts/skills/xlsx/SKILL.md +0 -289
  319. package/out/base-prompts/skills/xlsx/recalc.py +0 -178
  320. package/out/branding.js +0 -49
  321. package/out/cli/commands/anywhere.js +0 -66
  322. package/out/cli/commands/ask.js +0 -246
  323. package/out/cli/commands/auth-broker.js +0 -24
  324. package/out/cli/commands/auth.js +0 -219
  325. package/out/cli/commands/chat.js +0 -357
  326. package/out/cli/commands/conformance.js +0 -249
  327. package/out/cli/commands/data-plane.js +0 -151
  328. package/out/cli/commands/deploy.js +0 -263
  329. package/out/cli/commands/gateway.js +0 -218
  330. package/out/cli/commands/idp.js +0 -85
  331. package/out/cli/commands/pack.js +0 -399
  332. package/out/cli/commands/probe-custom-engine.js +0 -82
  333. package/out/cli/commands/sandbox.js +0 -351
  334. package/out/cli/commands/serve.js +0 -1950
  335. package/out/cli/commands/store.js +0 -927
  336. package/out/cli/credential-context.js +0 -108
  337. package/out/cli/data-plane/broker.js +0 -78
  338. package/out/cli/data-plane/connector-host.js +0 -121
  339. package/out/cli/data-plane/egress.js +0 -189
  340. package/out/cli/data-plane/gateway.js +0 -218
  341. package/out/cli/data-plane/index.js +0 -153
  342. package/out/cli/data-plane/registry.js +0 -89
  343. package/out/cli/data-plane/remote.js +0 -106
  344. package/out/cli/data-plane/sidecar.js +0 -225
  345. package/out/cli/deploy/blueprints/registry.js +0 -84
  346. package/out/cli/deploy/layers/identity.js +0 -175
  347. package/out/cli/deploy-init.js +0 -3023
  348. package/out/cli/deps.js +0 -342
  349. package/out/cli/idp-init.js +0 -338
  350. package/out/cli/pack-install-ref.js +0 -15
  351. package/out/cli/pack-loader.js +0 -418
  352. package/out/cli/pack-runtime.js +0 -61
  353. package/out/cli/runtime.js +0 -450
  354. package/out/cli/serve-hardening.js +0 -776
  355. package/out/cli/state-sync.js +0 -424
  356. package/out/cli/utils.js +0 -231
  357. package/out/engines/base.js +0 -188
  358. package/out/engines/claude.js +0 -1254
  359. package/out/engines/codex.js +0 -862
  360. package/out/engines/custom.js +0 -680
  361. package/out/engines/customEngineIpc.js +0 -95
  362. package/out/engines/customEngineRunnerEmbed.js +0 -107
  363. package/out/engines/customRegistry.js +0 -274
  364. package/out/engines/embeddedCustomEngineRunner.generated.js +0 -9
  365. package/out/engines/engineApiKey.js +0 -138
  366. package/out/engines/install.js +0 -372
  367. package/out/engines/persistentEngineWorker.js +0 -320
  368. package/out/engines/publish.js +0 -341
  369. package/out/evidence/sessionShip.js +0 -643
  370. package/out/gateway/bridge.js +0 -843
  371. package/out/gateway/cli-agent-id.js +0 -36
  372. package/out/gateway/client.js +0 -336
  373. package/out/gateway/client.test.js +0 -395
  374. package/out/gateway/gateway-scope-errors.js +0 -14
  375. package/out/gateway/gatewayBackup.js +0 -76
  376. package/out/gateway/installSource.js +0 -68
  377. package/out/gateway/lifecycle.js +0 -3190
  378. package/out/gateway/openclaw-channel-routing.js +0 -317
  379. package/out/gateway/outboundHandles.js +0 -373
  380. package/out/gateway/outboundPaths.js +0 -75
  381. package/out/gateway/outboundSend.js +0 -254
  382. package/out/gateway/protocol.js +0 -48
  383. package/out/gateway/secretsPreflight.js +0 -90
  384. package/out/gateway/sessionRouting.js +0 -77
  385. package/out/headless/index.js +0 -546
  386. package/out/headless/sync.js +0 -473
  387. package/out/live-e2e/mcp-demo/server.mjs +0 -32
  388. package/out/live-probe/connector.mjs +0 -8
  389. package/out/live-probe/env-report.mjs +0 -8
  390. package/out/mcp.js +0 -654
  391. package/out/pack/caps.js +0 -271
  392. package/out/pack/governor.js +0 -326
  393. package/out/pack/lease-schema.js +0 -273
  394. package/out/pack/lease.js +0 -682
  395. package/out/pack/reconcile.js +0 -217
  396. package/out/pack/signature.js +0 -839
  397. package/out/permissions.js +0 -108
  398. package/out/permissions.mapping.yaml +0 -68
  399. package/out/registry/index.js +0 -332
  400. package/out/runner/host.js +0 -141
  401. package/out/runner/protocol.js +0 -128
  402. package/out/runner/remoteEngine.js +0 -166
  403. package/out/runtime/interfaces/config-provider.js +0 -32
  404. package/out/runtime/interfaces/edit-tracker.js +0 -24
  405. package/out/runtime/interfaces/index.js +0 -29
  406. package/out/runtime/interfaces/logger.js +0 -40
  407. package/out/runtime/interfaces/permission-handler.js +0 -66
  408. package/out/runtime/interfaces/session-store.js +0 -342
  409. package/out/runtime/vscode/vscode-session-store.js +0 -22
  410. package/out/sandbox/containerDriver.js +0 -572
  411. package/out/sandbox/processDriver.js +0 -318
  412. package/out/sandbox/sandboxRunner.js +0 -303
  413. package/out/sandbox/support.js +0 -301
  414. package/out/sandbox/types.js +0 -55
  415. package/out/scripts/analytics/fleet-local-adapter.js +0 -246
  416. package/out/scripts/analytics/live-fleet-4-collector.cjs +0 -315
  417. package/out/scripts/analytics/live-fleet-4-daemon.mjs +0 -134
  418. package/out/scripts/analytics/live-fleet-4-widget.cjs +0 -433
  419. package/out/scripts/gateway/Dockerfile.serve +0 -45
  420. package/out/scripts/gateway/docker-serve.sh +0 -248
  421. package/out/scripts/gateway/setup-gateway-server.ps1 +0 -953
  422. package/out/scripts/gateway/setup-gateway-server.sh +0 -935
  423. package/out/session.js +0 -272
  424. package/out/shared/agentEngines.js +0 -170
  425. package/out/shared/index.js +0 -109
  426. package/out/shared/models.js +0 -136
  427. package/out/shared/providers.js +0 -205
  428. package/out/spotlight/install.js +0 -345
  429. package/out/spotlight/publish.js +0 -544
  430. package/out/spotlight/yaml.js +0 -31
  431. package/out/store/index.js +0 -786
  432. package/out/store/shared.js +0 -241
  433. package/out/test/agentEnvFile.test.js +0 -97
  434. package/out/test/agentYaml.test.js +0 -373
  435. package/out/test/agentpack.test.js +0 -639
  436. package/out/test/analytics-lifecycle.test.js +0 -174
  437. package/out/test/analytics.test.js +0 -756
  438. package/out/test/auth-baseurl.test.js +0 -132
  439. package/out/test/auth-bootstrapApply.test.js +0 -123
  440. package/out/test/auth-broker-hardening.test.js +0 -227
  441. package/out/test/auth-broker.test.js +0 -541
  442. package/out/test/auth-callback.test.js +0 -62
  443. package/out/test/blueprint-registry.test.js +0 -105
  444. package/out/test/branding.test.js +0 -242
  445. package/out/test/caps-governor.test.js +0 -460
  446. package/out/test/cli-agent-id.test.js +0 -55
  447. package/out/test/codex-new-file-survival.test.js +0 -119
  448. package/out/test/configuration-scopes.test.js +0 -131
  449. package/out/test/credential-context.test.js +0 -160
  450. package/out/test/custom-env-layering.test.js +0 -151
  451. package/out/test/customEngineInstall.test.js +0 -100
  452. package/out/test/customRegistry.test.js +0 -122
  453. package/out/test/data-plane-engine-wiring.test.js +0 -282
  454. package/out/test/data-plane.test.js +0 -624
  455. package/out/test/deploy-init.test.js +0 -860
  456. package/out/test/deps-auto-install.test.js +0 -81
  457. package/out/test/egress-broker.test.js +0 -172
  458. package/out/test/engine-integration.test.js +0 -297
  459. package/out/test/enginePaths.test.js +0 -195
  460. package/out/test/enginePublish.test.js +0 -82
  461. package/out/test/fleetDisplayUtils.test.js +0 -100
  462. package/out/test/gateway-client.test.js +0 -409
  463. package/out/test/gateway-install-source.test.js +0 -111
  464. package/out/test/gateway-lifecycle.test.js +0 -608
  465. package/out/test/gateway-outbound.test.js +0 -538
  466. package/out/test/gateway-reset-mappings.test.js +0 -221
  467. package/out/test/gateway-route-index.test.js +0 -235
  468. package/out/test/gateway-secrets-preflight.test.js +0 -127
  469. package/out/test/gateway-session-routing.test.js +0 -65
  470. package/out/test/gateway-session-store.test.js +0 -216
  471. package/out/test/github.test.js +0 -232
  472. package/out/test/governor-hardening.test.js +0 -222
  473. package/out/test/headless-sync.test.js +0 -301
  474. package/out/test/helpers/manifest-fixtures.js +0 -27
  475. package/out/test/idp-init.test.js +0 -151
  476. package/out/test/lease-signature.test.js +0 -357
  477. package/out/test/lease-trust-root.test.js +0 -273
  478. package/out/test/lease-validation.test.js +0 -224
  479. package/out/test/lease.test.js +0 -114
  480. package/out/test/localFleetAdapter.test.js +0 -91
  481. package/out/test/mcp-obo.test.js +0 -107
  482. package/out/test/mcp.test.js +0 -389
  483. package/out/test/model-routing.test.js +0 -133
  484. package/out/test/openclaw-channel-routing.test.js +0 -191
  485. package/out/test/pack-admission.test.js +0 -216
  486. package/out/test/pack-digest-parity.test.js +0 -140
  487. package/out/test/pack-reconcile.test.js +0 -183
  488. package/out/test/pack-signature-artifact.test.js +0 -103
  489. package/out/test/pack-signature.test.js +0 -176
  490. package/out/test/pack-trust-root.test.js +0 -202
  491. package/out/test/pathSafety.test.js +0 -63
  492. package/out/test/permissions.test.js +0 -175
  493. package/out/test/persistent-engine-worker.test.js +0 -220
  494. package/out/test/refreshPolicy.test.js +0 -60
  495. package/out/test/registry.test.js +0 -351
  496. package/out/test/remote-trust.test.js +0 -242
  497. package/out/test/runner-protocol.test.js +0 -249
  498. package/out/test/runtime.test.js +0 -349
  499. package/out/test/sandbox-driver.test.js +0 -553
  500. package/out/test/sandbox-hardening.test.js +0 -406
  501. package/out/test/sandbox-runner.test.js +0 -343
  502. package/out/test/sandbox-scope.test.js +0 -449
  503. package/out/test/scheduledFleetStorage.test.js +0 -72
  504. package/out/test/serve-cron-acceptance.test.js +0 -370
  505. package/out/test/serve-gateway-turn.test.js +0 -389
  506. package/out/test/serve-hardening.test.js +0 -591
  507. package/out/test/serveClient.test.js +0 -209
  508. package/out/test/sessionJsonlFleet.test.js +0 -78
  509. package/out/test/sessionShip.test.js +0 -618
  510. package/out/test/shared.test.js +0 -173
  511. package/out/test/skills-mcp.test.js +0 -299
  512. package/out/test/spotlightPublish.test.js +0 -327
  513. package/out/test/spotlightYaml.test.js +0 -58
  514. package/out/test/state-sync-peer.test.js +0 -156
  515. package/out/test/store-install-safe.test.js +0 -69
  516. package/out/test/store.test.js +0 -331
  517. package/out/test/stores.test.js +0 -504
  518. package/out/test/sync-switch.test.js +0 -251
  519. package/out/test/teamViewDiscovery.test.js +0 -90
  520. package/out/test/tls-bypass.test.js +0 -90
  521. package/out/test/toolPath.test.js +0 -120
  522. package/out/test/utils.test.js +0 -308
  523. package/out/test/viewsConfigMerge.test.js +0 -180
  524. package/out/test/warrant.test.js +0 -138
  525. package/out/test/windows-command-line.test.js +0 -75
  526. package/out/utils/agentEnvFile.js +0 -131
  527. package/out/utils/binary.js +0 -175
  528. package/out/utils/index.js +0 -37
  529. package/out/utils/network.js +0 -74
  530. package/out/utils/paths.js +0 -116
  531. package/out/utils/pid.js +0 -180
  532. package/out/utils/resolveNodeBinary.js +0 -168
  533. package/out/utils/windowsCommandLine.js +0 -29
  534. 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
- });