actoviq-agent-sdk 0.4.21 → 0.4.22

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 (278) hide show
  1. package/README-zh.md +50 -113
  2. package/README.md +51 -164
  3. package/assets/hadamard-icon.ico +0 -0
  4. package/assets/hadamard-icon.png +0 -0
  5. package/bin/hadamard-gui.js +31 -12
  6. package/dist/src/codeIntel/codeIntelligenceService.d.ts +16 -0
  7. package/dist/src/codeIntel/codeIntelligenceService.d.ts.map +1 -1
  8. package/dist/src/codeIntel/codeIntelligenceService.js +87 -2
  9. package/dist/src/codeIntel/codeIntelligenceService.js.map +1 -1
  10. package/dist/src/codeIntel/codeIntelligenceTools.d.ts.map +1 -1
  11. package/dist/src/codeIntel/codeIntelligenceTools.js +6 -0
  12. package/dist/src/codeIntel/codeIntelligenceTools.js.map +1 -1
  13. package/dist/src/codeIntel/index.d.ts +1 -0
  14. package/dist/src/codeIntel/index.d.ts.map +1 -1
  15. package/dist/src/codeIntel/index.js +1 -0
  16. package/dist/src/codeIntel/index.js.map +1 -1
  17. package/dist/src/codeIntel/languageServerPresets.d.ts +13 -0
  18. package/dist/src/codeIntel/languageServerPresets.d.ts.map +1 -0
  19. package/dist/src/codeIntel/languageServerPresets.js +51 -0
  20. package/dist/src/codeIntel/languageServerPresets.js.map +1 -0
  21. package/dist/src/codeIntel/languageServerRegistry.d.ts +1 -0
  22. package/dist/src/codeIntel/languageServerRegistry.d.ts.map +1 -1
  23. package/dist/src/codeIntel/languageServerRegistry.js +2 -2
  24. package/dist/src/codeIntel/languageServerRegistry.js.map +1 -1
  25. package/dist/src/config/resolveRuntimeConfig.d.ts.map +1 -1
  26. package/dist/src/config/resolveRuntimeConfig.js +5 -0
  27. package/dist/src/config/resolveRuntimeConfig.js.map +1 -1
  28. package/dist/src/extensions/builtInExtensions.d.ts +61 -0
  29. package/dist/src/extensions/builtInExtensions.d.ts.map +1 -0
  30. package/dist/src/extensions/builtInExtensions.js +218 -0
  31. package/dist/src/extensions/builtInExtensions.js.map +1 -0
  32. package/dist/src/extensions/filterOutputPolicy.d.ts +21 -0
  33. package/dist/src/extensions/filterOutputPolicy.d.ts.map +1 -0
  34. package/dist/src/extensions/filterOutputPolicy.js +121 -0
  35. package/dist/src/extensions/filterOutputPolicy.js.map +1 -0
  36. package/dist/src/extensions/securityPolicy.d.ts +27 -0
  37. package/dist/src/extensions/securityPolicy.d.ts.map +1 -0
  38. package/dist/src/extensions/securityPolicy.js +238 -0
  39. package/dist/src/extensions/securityPolicy.js.map +1 -0
  40. package/dist/src/extensions/sessionCostTracker.d.ts +63 -0
  41. package/dist/src/extensions/sessionCostTracker.d.ts.map +1 -0
  42. package/dist/src/extensions/sessionCostTracker.js +213 -0
  43. package/dist/src/extensions/sessionCostTracker.js.map +1 -0
  44. package/dist/src/extensions/taskNotifications.d.ts +31 -0
  45. package/dist/src/extensions/taskNotifications.d.ts.map +1 -0
  46. package/dist/src/extensions/taskNotifications.js +50 -0
  47. package/dist/src/extensions/taskNotifications.js.map +1 -0
  48. package/dist/src/extensions/usageBar.d.ts +35 -0
  49. package/dist/src/extensions/usageBar.d.ts.map +1 -0
  50. package/dist/src/extensions/usageBar.js +67 -0
  51. package/dist/src/extensions/usageBar.js.map +1 -0
  52. package/dist/src/gui/contextRailStore.d.ts +13 -0
  53. package/dist/src/gui/contextRailStore.d.ts.map +1 -1
  54. package/dist/src/gui/contextRailStore.js +16 -0
  55. package/dist/src/gui/contextRailStore.js.map +1 -1
  56. package/dist/src/gui/electronMain.js +45 -5
  57. package/dist/src/gui/electronMain.js.map +1 -1
  58. package/dist/src/gui/guiDesignClientScript.d.ts.map +1 -1
  59. package/dist/src/gui/guiDesignClientScript.js +31 -0
  60. package/dist/src/gui/guiDesignClientScript.js.map +1 -1
  61. package/dist/src/gui/guiUsageRoutingAssets.d.ts +7 -0
  62. package/dist/src/gui/guiUsageRoutingAssets.d.ts.map +1 -0
  63. package/dist/src/gui/guiUsageRoutingAssets.js +509 -0
  64. package/dist/src/gui/guiUsageRoutingAssets.js.map +1 -0
  65. package/dist/src/gui/guiUsageRoutingHttpController.d.ts +11 -0
  66. package/dist/src/gui/guiUsageRoutingHttpController.d.ts.map +1 -0
  67. package/dist/src/gui/guiUsageRoutingHttpController.js +125 -0
  68. package/dist/src/gui/guiUsageRoutingHttpController.js.map +1 -0
  69. package/dist/src/gui/guiUsageRoutingRuntime.d.ts +36 -0
  70. package/dist/src/gui/guiUsageRoutingRuntime.d.ts.map +1 -0
  71. package/dist/src/gui/guiUsageRoutingRuntime.js +98 -0
  72. package/dist/src/gui/guiUsageRoutingRuntime.js.map +1 -0
  73. package/dist/src/gui/hadamardGui.d.ts +5 -0
  74. package/dist/src/gui/hadamardGui.d.ts.map +1 -1
  75. package/dist/src/gui/hadamardGui.js +159 -16
  76. package/dist/src/gui/hadamardGui.js.map +1 -1
  77. package/dist/src/gui/hadamardGuiAssets.d.ts.map +1 -1
  78. package/dist/src/gui/hadamardGuiAssets.js +297 -41
  79. package/dist/src/gui/hadamardGuiAssets.js.map +1 -1
  80. package/dist/src/index.d.ts +32 -2
  81. package/dist/src/index.d.ts.map +1 -1
  82. package/dist/src/index.js +16 -1
  83. package/dist/src/index.js.map +1 -1
  84. package/dist/src/keyway/electronSecretStore.d.ts +37 -0
  85. package/dist/src/keyway/electronSecretStore.d.ts.map +1 -0
  86. package/dist/src/keyway/electronSecretStore.js +105 -0
  87. package/dist/src/keyway/electronSecretStore.js.map +1 -0
  88. package/dist/src/keyway/embeddedKeyway.d.ts +34 -0
  89. package/dist/src/keyway/embeddedKeyway.d.ts.map +1 -0
  90. package/dist/src/keyway/embeddedKeyway.js +81 -0
  91. package/dist/src/keyway/embeddedKeyway.js.map +1 -0
  92. package/dist/src/keyway/keywayLoopbackGateway.d.ts +30 -0
  93. package/dist/src/keyway/keywayLoopbackGateway.d.ts.map +1 -0
  94. package/dist/src/keyway/keywayLoopbackGateway.js +71 -0
  95. package/dist/src/keyway/keywayLoopbackGateway.js.map +1 -0
  96. package/dist/src/keyway/keywayMigrationService.d.ts +44 -0
  97. package/dist/src/keyway/keywayMigrationService.d.ts.map +1 -0
  98. package/dist/src/keyway/keywayMigrationService.js +219 -0
  99. package/dist/src/keyway/keywayMigrationService.js.map +1 -0
  100. package/dist/src/keyway/keywayModelApi.d.ts +24 -0
  101. package/dist/src/keyway/keywayModelApi.d.ts.map +1 -0
  102. package/dist/src/keyway/keywayModelApi.js +106 -0
  103. package/dist/src/keyway/keywayModelApi.js.map +1 -0
  104. package/dist/src/keyway/keywayPorts.d.ts +189 -0
  105. package/dist/src/keyway/keywayPorts.d.ts.map +1 -0
  106. package/dist/src/keyway/keywayPorts.js +2 -0
  107. package/dist/src/keyway/keywayPorts.js.map +1 -0
  108. package/dist/src/keyway/keywayProviderExecutor.d.ts +30 -0
  109. package/dist/src/keyway/keywayProviderExecutor.d.ts.map +1 -0
  110. package/dist/src/keyway/keywayProviderExecutor.js +257 -0
  111. package/dist/src/keyway/keywayProviderExecutor.js.map +1 -0
  112. package/dist/src/keyway/routingComposition.d.ts +18 -0
  113. package/dist/src/keyway/routingComposition.d.ts.map +1 -0
  114. package/dist/src/keyway/routingComposition.js +19 -0
  115. package/dist/src/keyway/routingComposition.js.map +1 -0
  116. package/dist/src/keyway/usageRoutingAdminService.d.ts +86 -0
  117. package/dist/src/keyway/usageRoutingAdminService.d.ts.map +1 -0
  118. package/dist/src/keyway/usageRoutingAdminService.js +384 -0
  119. package/dist/src/keyway/usageRoutingAdminService.js.map +1 -0
  120. package/dist/src/nativeCli/crushManagedClient.d.ts +84 -0
  121. package/dist/src/nativeCli/crushManagedClient.d.ts.map +1 -0
  122. package/dist/src/nativeCli/crushManagedClient.js +978 -0
  123. package/dist/src/nativeCli/crushManagedClient.js.map +1 -0
  124. package/dist/src/nativeCli/crushNativeCliClient.d.ts +19 -0
  125. package/dist/src/nativeCli/crushNativeCliClient.d.ts.map +1 -0
  126. package/dist/src/nativeCli/crushNativeCliClient.js +243 -0
  127. package/dist/src/nativeCli/crushNativeCliClient.js.map +1 -0
  128. package/dist/src/nativeCli/keywayNativeCliAdapter.d.ts +31 -0
  129. package/dist/src/nativeCli/keywayNativeCliAdapter.d.ts.map +1 -0
  130. package/dist/src/nativeCli/keywayNativeCliAdapter.js +35 -0
  131. package/dist/src/nativeCli/keywayNativeCliAdapter.js.map +1 -0
  132. package/dist/src/nativeCli/nativeCliAuth.d.ts +24 -0
  133. package/dist/src/nativeCli/nativeCliAuth.d.ts.map +1 -0
  134. package/dist/src/nativeCli/nativeCliAuth.js +327 -0
  135. package/dist/src/nativeCli/nativeCliAuth.js.map +1 -0
  136. package/dist/src/nativeCli/nativeCliClient.d.ts +16 -0
  137. package/dist/src/nativeCli/nativeCliClient.d.ts.map +1 -0
  138. package/dist/src/nativeCli/nativeCliClient.js +575 -0
  139. package/dist/src/nativeCli/nativeCliClient.js.map +1 -0
  140. package/dist/src/nativeCli/nativeCliCodewhaleProtocol.d.ts +18 -0
  141. package/dist/src/nativeCli/nativeCliCodewhaleProtocol.d.ts.map +1 -0
  142. package/dist/src/nativeCli/nativeCliCodewhaleProtocol.js +376 -0
  143. package/dist/src/nativeCli/nativeCliCodewhaleProtocol.js.map +1 -0
  144. package/dist/src/nativeCli/nativeCliContracts.d.ts +22 -0
  145. package/dist/src/nativeCli/nativeCliContracts.d.ts.map +1 -0
  146. package/dist/src/nativeCli/nativeCliContracts.js +2 -0
  147. package/dist/src/nativeCli/nativeCliContracts.js.map +1 -0
  148. package/dist/src/nativeCli/nativeCliCursorProtocol.d.ts +7 -0
  149. package/dist/src/nativeCli/nativeCliCursorProtocol.d.ts.map +1 -0
  150. package/dist/src/nativeCli/nativeCliCursorProtocol.js +210 -0
  151. package/dist/src/nativeCli/nativeCliCursorProtocol.js.map +1 -0
  152. package/dist/src/nativeCli/nativeCliEnvironment.d.ts +3 -0
  153. package/dist/src/nativeCli/nativeCliEnvironment.d.ts.map +1 -0
  154. package/dist/src/nativeCli/nativeCliEnvironment.js +17 -0
  155. package/dist/src/nativeCli/nativeCliEnvironment.js.map +1 -0
  156. package/dist/src/nativeCli/nativeCliExecResolver.d.ts +26 -0
  157. package/dist/src/nativeCli/nativeCliExecResolver.d.ts.map +1 -0
  158. package/dist/src/nativeCli/nativeCliExecResolver.js +152 -0
  159. package/dist/src/nativeCli/nativeCliExecResolver.js.map +1 -0
  160. package/dist/src/nativeCli/nativeCliPiProtocol.d.ts +15 -0
  161. package/dist/src/nativeCli/nativeCliPiProtocol.d.ts.map +1 -0
  162. package/dist/src/nativeCli/nativeCliPiProtocol.js +329 -0
  163. package/dist/src/nativeCli/nativeCliPiProtocol.js.map +1 -0
  164. package/dist/src/nativeCli/nativeCliProcessTree.d.ts +3 -0
  165. package/dist/src/nativeCli/nativeCliProcessTree.d.ts.map +1 -0
  166. package/dist/src/nativeCli/nativeCliProcessTree.js +104 -0
  167. package/dist/src/nativeCli/nativeCliProcessTree.js.map +1 -0
  168. package/dist/src/nativeCli/reasonixAcpSession.d.ts +35 -0
  169. package/dist/src/nativeCli/reasonixAcpSession.d.ts.map +1 -0
  170. package/dist/src/nativeCli/reasonixAcpSession.js +472 -0
  171. package/dist/src/nativeCli/reasonixAcpSession.js.map +1 -0
  172. package/dist/src/nativeCli/reasonixManagedClient.d.ts +56 -0
  173. package/dist/src/nativeCli/reasonixManagedClient.d.ts.map +1 -0
  174. package/dist/src/nativeCli/reasonixManagedClient.js +293 -0
  175. package/dist/src/nativeCli/reasonixManagedClient.js.map +1 -0
  176. package/dist/src/nativeCli/reasonixNativeCliClient.d.ts +20 -0
  177. package/dist/src/nativeCli/reasonixNativeCliClient.d.ts.map +1 -0
  178. package/dist/src/nativeCli/reasonixNativeCliClient.js +317 -0
  179. package/dist/src/nativeCli/reasonixNativeCliClient.js.map +1 -0
  180. package/dist/src/parity/bridgeExecResolver.d.ts +2 -25
  181. package/dist/src/parity/bridgeExecResolver.d.ts.map +1 -1
  182. package/dist/src/parity/bridgeExecResolver.js +2 -151
  183. package/dist/src/parity/bridgeExecResolver.js.map +1 -1
  184. package/dist/src/parity/bridgeProcessTree.d.ts +2 -2
  185. package/dist/src/parity/bridgeProcessTree.d.ts.map +1 -1
  186. package/dist/src/parity/bridgeProcessTree.js +2 -82
  187. package/dist/src/parity/bridgeProcessTree.js.map +1 -1
  188. package/dist/src/parity/crushManagedClient.d.ts +2 -83
  189. package/dist/src/parity/crushManagedClient.d.ts.map +1 -1
  190. package/dist/src/parity/crushManagedClient.js +2 -977
  191. package/dist/src/parity/crushManagedClient.js.map +1 -1
  192. package/dist/src/parity/externalCliAuth.d.ts +2 -22
  193. package/dist/src/parity/externalCliAuth.d.ts.map +1 -1
  194. package/dist/src/parity/externalCliAuth.js +2 -295
  195. package/dist/src/parity/externalCliAuth.js.map +1 -1
  196. package/dist/src/parity/hadamardBridgeSdk.d.ts.map +1 -1
  197. package/dist/src/parity/hadamardBridgeSdk.js +14 -1
  198. package/dist/src/parity/hadamardBridgeSdk.js.map +1 -1
  199. package/dist/src/parity/nativeCliBridgeAdapter.d.ts +6 -0
  200. package/dist/src/parity/nativeCliBridgeAdapter.d.ts.map +1 -0
  201. package/dist/src/parity/nativeCliBridgeAdapter.js +38 -0
  202. package/dist/src/parity/nativeCliBridgeAdapter.js.map +1 -0
  203. package/dist/src/parity/reasonixAcpSession.d.ts +2 -34
  204. package/dist/src/parity/reasonixAcpSession.d.ts.map +1 -1
  205. package/dist/src/parity/reasonixAcpSession.js +2 -471
  206. package/dist/src/parity/reasonixAcpSession.js.map +1 -1
  207. package/dist/src/parity/reasonixManagedClient.d.ts +2 -55
  208. package/dist/src/parity/reasonixManagedClient.d.ts.map +1 -1
  209. package/dist/src/parity/reasonixManagedClient.js +2 -292
  210. package/dist/src/parity/reasonixManagedClient.js.map +1 -1
  211. package/dist/src/provider/openai-client.js +2 -2
  212. package/dist/src/provider/openai-client.js.map +1 -1
  213. package/dist/src/provider/openai-model-api.d.ts.map +1 -1
  214. package/dist/src/provider/openai-model-api.js +5 -1
  215. package/dist/src/provider/openai-model-api.js.map +1 -1
  216. package/dist/src/runtime/agentClient.d.ts +14 -1
  217. package/dist/src/runtime/agentClient.d.ts.map +1 -1
  218. package/dist/src/runtime/agentClient.js +60 -6
  219. package/dist/src/runtime/agentClient.js.map +1 -1
  220. package/dist/src/runtime/toolPolicyPipeline.d.ts +32 -1
  221. package/dist/src/runtime/toolPolicyPipeline.d.ts.map +1 -1
  222. package/dist/src/runtime/toolPolicyPipeline.js +43 -3
  223. package/dist/src/runtime/toolPolicyPipeline.js.map +1 -1
  224. package/dist/src/tui/hadamardTuiController.d.ts.map +1 -1
  225. package/dist/src/tui/hadamardTuiController.js +62 -8
  226. package/dist/src/tui/hadamardTuiController.js.map +1 -1
  227. package/dist/src/tui/tuiBasicCommandHandler.d.ts +4 -0
  228. package/dist/src/tui/tuiBasicCommandHandler.d.ts.map +1 -1
  229. package/dist/src/tui/tuiBasicCommandHandler.js +23 -2
  230. package/dist/src/tui/tuiBasicCommandHandler.js.map +1 -1
  231. package/dist/src/tui/tuiCatalogCommandHandler.d.ts +2 -0
  232. package/dist/src/tui/tuiCatalogCommandHandler.d.ts.map +1 -1
  233. package/dist/src/tui/tuiCatalogCommandHandler.js +10 -1
  234. package/dist/src/tui/tuiCatalogCommandHandler.js.map +1 -1
  235. package/dist/src/tui/tuiUsageRoutingRuntime.d.ts +22 -0
  236. package/dist/src/tui/tuiUsageRoutingRuntime.d.ts.map +1 -0
  237. package/dist/src/tui/tuiUsageRoutingRuntime.js +81 -0
  238. package/dist/src/tui/tuiUsageRoutingRuntime.js.map +1 -0
  239. package/dist/src/types.d.ts +16 -0
  240. package/dist/src/types.d.ts.map +1 -1
  241. package/dist/src/types.js.map +1 -1
  242. package/dist/src/ui/commandSurface.d.ts.map +1 -1
  243. package/dist/src/ui/commandSurface.js +45 -1
  244. package/dist/src/ui/commandSurface.js.map +1 -1
  245. package/dist/src/ui/extensionsCommandView.d.ts +18 -0
  246. package/dist/src/ui/extensionsCommandView.d.ts.map +1 -0
  247. package/dist/src/ui/extensionsCommandView.js +82 -0
  248. package/dist/src/ui/extensionsCommandView.js.map +1 -0
  249. package/dist/src/ui/lspCommandView.d.ts +17 -0
  250. package/dist/src/ui/lspCommandView.d.ts.map +1 -0
  251. package/dist/src/ui/lspCommandView.js +25 -0
  252. package/dist/src/ui/lspCommandView.js.map +1 -0
  253. package/dist/src/ui/usageRoutingCommand.d.ts +13 -0
  254. package/dist/src/ui/usageRoutingCommand.d.ts.map +1 -0
  255. package/dist/src/ui/usageRoutingCommand.js +224 -0
  256. package/dist/src/ui/usageRoutingCommand.js.map +1 -0
  257. package/dist/src/usage/budgetService.d.ts +28 -0
  258. package/dist/src/usage/budgetService.d.ts.map +1 -0
  259. package/dist/src/usage/budgetService.js +50 -0
  260. package/dist/src/usage/budgetService.js.map +1 -0
  261. package/dist/src/usage/contracts.d.ts +149 -0
  262. package/dist/src/usage/contracts.d.ts.map +1 -0
  263. package/dist/src/usage/contracts.js +2 -0
  264. package/dist/src/usage/contracts.js.map +1 -0
  265. package/dist/src/usage/index.d.ts +7 -0
  266. package/dist/src/usage/index.d.ts.map +1 -0
  267. package/dist/src/usage/index.js +4 -0
  268. package/dist/src/usage/index.js.map +1 -0
  269. package/dist/src/usage/usageLedger.d.ts +19 -0
  270. package/dist/src/usage/usageLedger.d.ts.map +1 -0
  271. package/dist/src/usage/usageLedger.js +389 -0
  272. package/dist/src/usage/usageLedger.js.map +1 -0
  273. package/dist/src/usage/usageQueryService.d.ts +12 -0
  274. package/dist/src/usage/usageQueryService.d.ts.map +1 -0
  275. package/dist/src/usage/usageQueryService.js +29 -0
  276. package/dist/src/usage/usageQueryService.js.map +1 -0
  277. package/package.json +14 -2
  278. package/scripts/prepare-gui-launcher.mjs +62 -0
@@ -68,12 +68,43 @@ export declare class ToolPolicyPipeline implements ToolPolicyPort {
68
68
  }
69
69
  /** Contribution seam: resolves a per-run pipeline (same pattern as the conversation extensions). */
70
70
  export declare const toolPolicyFactoryKey: import("../contrib/contributionHost.js").ContributionServiceKey<(options: ExecuteConversationOptions) => ToolPolicyPort>;
71
+ /**
72
+ * Registry seam for policy listeners contributed outside the built-in set
73
+ * (built-in extensions, plugins). The pipeline factory reads it live per run,
74
+ * so listeners added or removed later take effect on the next run.
75
+ */
76
+ export interface ToolPolicyListenerRegistry {
77
+ addPre(listener: ToolPrePolicyListener): void;
78
+ removePre(listener: ToolPrePolicyListener): boolean;
79
+ addPost(listener: ToolPostPolicyListener): void;
80
+ removePost(listener: ToolPostPolicyListener): boolean;
81
+ pre(): readonly ToolPrePolicyListener[];
82
+ post(): readonly ToolPostPolicyListener[];
83
+ }
84
+ export declare class InMemoryToolPolicyListenerRegistry implements ToolPolicyListenerRegistry {
85
+ private readonly preListeners;
86
+ private readonly postListeners;
87
+ addPre(listener: ToolPrePolicyListener): void;
88
+ removePre(listener: ToolPrePolicyListener): boolean;
89
+ addPost(listener: ToolPostPolicyListener): void;
90
+ removePost(listener: ToolPostPolicyListener): boolean;
91
+ pre(): readonly ToolPrePolicyListener[];
92
+ post(): readonly ToolPostPolicyListener[];
93
+ }
94
+ /** Global listener registry the built-in pipeline factory composes into every per-run pipeline. */
95
+ export declare const toolPolicyListenerRegistryKey: import("../contrib/contributionHost.js").ContributionServiceKey<ToolPolicyListenerRegistry>;
71
96
  /** Built-in contribution: registers the behavior-preserving pipeline factory. */
72
97
  export declare function createBuiltInToolPolicyContribution(): HadamardRuntimeContribution;
73
98
  /**
74
99
  * Default pipeline preserving the current executor behavior exactly:
75
100
  * PreToolUse hooks, then the permission decision (with PermissionDecision
76
101
  * hooks), then deny stops; post: spill shaping then PostToolUse hooks.
102
+ * Contributed listeners (`extra`) run before the built-in pre listeners
103
+ * (monotonic deny: they can only tighten) and after the built-in post
104
+ * listeners in the waterfall.
77
105
  */
78
- export declare function createBuiltInToolPolicyPipeline(options: ExecuteConversationOptions): ToolPolicyPipeline;
106
+ export declare function createBuiltInToolPolicyPipeline(options: ExecuteConversationOptions, extra?: {
107
+ pre?: readonly ToolPrePolicyListener[];
108
+ post?: readonly ToolPostPolicyListener[];
109
+ }): ToolPolicyPipeline;
79
110
  //# sourceMappingURL=toolPolicyPipeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolPolicyPipeline.d.ts","sourceRoot":"","sources":["../../../src/runtime/toolPolicyPipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AAOrB,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGzF,OAAO,KAAK,EAA4B,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE5G,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,mBAAmB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACtE,uFAAuF;IACvF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvG,MAAM,MAAM,sBAAsB,GAC9B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC1C,kBAAkB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,sBAAsB,GAAG,CACnC,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,2BAA2B,EACtC,IAAI,EAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,KACxC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAErC;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAErD,QAAQ,CAAC,GAAG,EAAE,SAAS,qBAAqB,EAAE;IAC9C,QAAQ,CAAC,IAAI,EAAE,SAAS,sBAAsB,EAAE;gBADvC,GAAG,EAAE,SAAS,qBAAqB,EAAE,EACrC,IAAI,EAAE,SAAS,sBAAsB,EAAE;IAG5C,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAWzD,OAAO,CACX,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,2BAA2B,GACrC,OAAO,CAAC,sBAAsB,CAAC;CASnC;AAGD,oGAAoG;AACpG,eAAO,MAAM,oBAAoB,4EACrB,0BAA0B,KAAK,cAAc,CACjC,CAAC;AAEzB,iFAAiF;AACjF,wBAAgB,mCAAmC,IAAI,2BAA2B,CAQjF;AAGD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,0BAA0B,GAAG,kBAAkB,CAqGvG"}
1
+ {"version":3,"file":"toolPolicyPipeline.d.ts","sourceRoot":"","sources":["../../../src/runtime/toolPolicyPipeline.ts"],"names":[],"mappings":"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"}
@@ -37,12 +37,49 @@ export class ToolPolicyPipeline {
37
37
  }
38
38
  /** Contribution seam: resolves a per-run pipeline (same pattern as the conversation extensions). */
39
39
  export const toolPolicyFactoryKey = defineContributionServiceKey('hadamard.toolPolicy');
40
+ export class InMemoryToolPolicyListenerRegistry {
41
+ preListeners = [];
42
+ postListeners = [];
43
+ addPre(listener) {
44
+ if (!this.preListeners.includes(listener))
45
+ this.preListeners.push(listener);
46
+ }
47
+ removePre(listener) {
48
+ const index = this.preListeners.indexOf(listener);
49
+ if (index < 0)
50
+ return false;
51
+ this.preListeners.splice(index, 1);
52
+ return true;
53
+ }
54
+ addPost(listener) {
55
+ if (!this.postListeners.includes(listener))
56
+ this.postListeners.push(listener);
57
+ }
58
+ removePost(listener) {
59
+ const index = this.postListeners.indexOf(listener);
60
+ if (index < 0)
61
+ return false;
62
+ this.postListeners.splice(index, 1);
63
+ return true;
64
+ }
65
+ pre() {
66
+ return [...this.preListeners];
67
+ }
68
+ post() {
69
+ return [...this.postListeners];
70
+ }
71
+ }
72
+ /** Global listener registry the built-in pipeline factory composes into every per-run pipeline. */
73
+ export const toolPolicyListenerRegistryKey = defineContributionServiceKey('hadamard.toolPolicyListeners');
40
74
  /** Built-in contribution: registers the behavior-preserving pipeline factory. */
41
75
  export function createBuiltInToolPolicyContribution() {
42
76
  return {
43
77
  id: 'hadamard.tool-policy',
44
78
  async apply(ctx) {
45
- ctx.services.register(toolPolicyFactoryKey, createBuiltInToolPolicyPipeline);
79
+ // Optional: tests may load this contribution without the registry.
80
+ const registry = ctx.services.get(toolPolicyListenerRegistryKey);
81
+ const factory = (options) => createBuiltInToolPolicyPipeline(options, { pre: registry?.pre(), post: registry?.post() });
82
+ ctx.services.register(toolPolicyFactoryKey, factory);
46
83
  return () => { ctx.services.unregister(toolPolicyFactoryKey); };
47
84
  },
48
85
  };
@@ -51,8 +88,11 @@ export function createBuiltInToolPolicyContribution() {
51
88
  * Default pipeline preserving the current executor behavior exactly:
52
89
  * PreToolUse hooks, then the permission decision (with PermissionDecision
53
90
  * hooks), then deny stops; post: spill shaping then PostToolUse hooks.
91
+ * Contributed listeners (`extra`) run before the built-in pre listeners
92
+ * (monotonic deny: they can only tighten) and after the built-in post
93
+ * listeners in the waterfall.
54
94
  */
55
- export function createBuiltInToolPolicyPipeline(options) {
95
+ export function createBuiltInToolPolicyPipeline(options, extra) {
56
96
  const preToolUseListener = async (call, state) => {
57
97
  const outputs = await runTypedLifecycleHooks(options, 'PreToolUse', { iteration: call.iteration, input: call.input }, call.toolName);
58
98
  if (hasLifecycleBlock(outputs)) {
@@ -131,6 +171,6 @@ export function createBuiltInToolPolicyPipeline(options) {
131
171
  });
132
172
  return { kind: 'accept', content: shaped.content, additionalContexts: inner.additionalContexts };
133
173
  };
134
- return new ToolPolicyPipeline([preToolUseListener, permissionListener], [spillListener, postToolUseListener]);
174
+ return new ToolPolicyPipeline([...(extra?.pre ?? []), preToolUseListener, permissionListener], [spillListener, postToolUseListener, ...(extra?.post ?? [])]);
135
175
  }
136
176
  //# sourceMappingURL=toolPolicyPipeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolPolicyPipeline.js","sourceRoot":"","sources":["../../../src/runtime/toolPolicyPipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolPolicyPipeline.js","sourceRoot":"","sources":["../../../src/runtime/toolPolicyPipeline.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hadamardTuiController.d.ts","sourceRoot":"","sources":["../../../src/tui/hadamardTuiController.ts"],"names":[],"mappings":"AAuPA,OAAO,KAAK,EACV,kBAAkB,EAKnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAUxD,eAAO,MAAM,kBAAkB,wBAAgC,CAAC;AAQhE;;;;;GAKG;AAMH,wBAAsB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAymJpF"}
1
+ {"version":3,"file":"hadamardTuiController.d.ts","sourceRoot":"","sources":["../../../src/tui/hadamardTuiController.ts"],"names":[],"mappings":"AAiQA,OAAO,KAAK,EACV,kBAAkB,EAKnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAUxD,eAAO,MAAM,kBAAkB,wBAAgC,CAAC;AAQhE;;;;;GAKG;AAMH,wBAAsB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAupJpF"}
@@ -38,6 +38,9 @@ import { buildRouteModelApi } from '../router/modelRouter.js';
38
38
  import { addMcpServer, readMcpServerConfig, removeMcpServer } from '../mcp/mcpServerConfig.js';
39
39
  import { isReadOnlyBashCommand } from '../runtime/bashClassification.js';
40
40
  import { estimateCost } from '../team/pricing.js';
41
+ import { SessionCostTracker } from '../extensions/sessionCostTracker.js';
42
+ import { formatUsageBar, usageBarColorLevel } from '../extensions/usageBar.js';
43
+ import { buildTerminalNotifySequence, formatTaskSettledNotification, resolveTaskNotificationOptions, } from '../extensions/taskNotifications.js';
41
44
  import { planFilePath, readPlanFile } from '../tools/planMode/PlanModeTools.js';
42
45
  import { loadProjectContext } from '../memory/projectContext.js';
43
46
  import { hashProjectInstructionContent, parseProjectInstructionState, } from '../memory/projectInstructionContext.js';
@@ -46,6 +49,9 @@ import { applyResolvedToolDescriptions } from '../runtime/agentClientRunHelpers.
46
49
  import { LegacySurfaceEventPipeline, } from '../surfaces/index.js';
47
50
  import { HADAMARD_INTERACTIVE_COMMANDS, SUBCOMMAND_DESCRIPTIONS, canRunInteractiveCommand, interactiveCommandRunPolicy, interactiveCommandUsage, selectInteractiveCommand, } from '../ui/commandSurface.js';
48
51
  import { createAgentExecutionProjectView, createAgentExecutionRootView, formatAgentExecutionTreeLines, } from '../ui/agentExecutionView.js';
52
+ import { runExtensionsCommandView } from '../ui/extensionsCommandView.js';
53
+ import { runLspCommandView } from '../ui/lspCommandView.js';
54
+ import { TuiUsageRoutingRuntime } from './tuiUsageRoutingRuntime.js';
49
55
  import { A, truncateToWidth, wrapToWidth } from './ansi.js';
50
56
  import { InputEditor } from './editor.js';
51
57
  import { discoverHadamardPlugins } from './pluginCatalog.js';
@@ -218,6 +224,8 @@ export async function runHadamardTui(options = {}) {
218
224
  model: options.model,
219
225
  permissionMode,
220
226
  });
227
+ let activeKeywayRouteAlias = null;
228
+ const usageRoutingRuntime = new TuiUsageRoutingRuntime(sdk.config.homeDir, sdk.config.workDir, selection => { clearBridgeSelection(); activeRouter = null; routedModelLabel = null; activeBridgeModelApi = { model: selection.model, modelApi: selection.modelApi, maxTokens: 32000 }; bridgeModelLabel = selection.model; bridgeMode = true; activeKeywayRouteAlias = selection.routeAlias; });
221
229
  let deviceLinkService = null;
222
230
  async function getDeviceLinkService() {
223
231
  deviceLinkService ??= await DeviceLinkService.open({
@@ -233,6 +241,23 @@ export async function runHadamardTui(options = {}) {
233
241
  const screen = new TuiScreen(process.stdout);
234
242
  const editor = new InputEditor();
235
243
  const flusher = new StreamFlusher(() => screen.width);
244
+ // notifications extension: surface background-task completion inline in the
245
+ // transcript plus terminal bell/OSC. Enablement is read at fire time so
246
+ // toggling the extension applies to the next settled task.
247
+ let unsubscribeTaskNotifications = null;
248
+ function subscribeTaskNotifications() {
249
+ unsubscribeTaskNotifications?.();
250
+ unsubscribeTaskNotifications = sdk.onBackgroundTaskSettled(task => {
251
+ if (!sdk.builtInExtensions.isEnabled('notifications'))
252
+ return;
253
+ const notification = formatTaskSettledNotification(task);
254
+ appendStatic([...formatInfoLine(notification.body ? `${notification.title} — ${notification.body}` : notification.title), '']);
255
+ const sequence = buildTerminalNotifySequence(notification, resolveTaskNotificationOptions(sdk.builtInExtensions.getConfig('notifications')));
256
+ if (sequence)
257
+ process.stdout.write(sequence);
258
+ });
259
+ }
260
+ subscribeTaskNotifications();
236
261
  let running = false;
237
262
  let queuedConfirmActive = false;
238
263
  let commandBusy = false;
@@ -405,6 +430,7 @@ export async function runHadamardTui(options = {}) {
405
430
  bridgeMode = false;
406
431
  activeBridgeConfig = null;
407
432
  activeBridgeModelApi = null;
433
+ activeKeywayRouteAlias = null;
408
434
  bridgeModelLabel = null;
409
435
  }
410
436
  async function restoreSessionRuntimeSelection() {
@@ -593,14 +619,22 @@ export async function runHadamardTui(options = {}) {
593
619
  let totalInputTokens = 0;
594
620
  let totalOutputTokens = 0;
595
621
  let totalCostUsd = 0;
622
+ // costTracker extension: per-model accumulation + durable JSONL ledger at
623
+ // <homeDir>/usage/cost-ledger.jsonl. Token totals above always count; cost
624
+ // accumulation and ledger writes are gated on the extension at record time.
625
+ const costTracker = new SessionCostTracker(sdk.config.homeDir);
596
626
  const configUsage = new Map();
597
- function recordUsage(model, usage) {
627
+ function recordUsage(model, usage, runId) {
598
628
  const inT = usage?.input_tokens ?? 0;
599
629
  const outT = usage?.output_tokens ?? 0;
600
630
  totalInputTokens += inT;
601
631
  totalOutputTokens += outT;
602
- const cost = estimateCost(model, inT, outT);
603
- totalCostUsd = cost === null ? null : (totalCostUsd === null ? cost : totalCostUsd + cost);
632
+ if (sdk.builtInExtensions.isEnabled('costTracker')) {
633
+ costTracker.record(model, usage ?? {}, { sessionId: session.id, runId,
634
+ configurationId: activeBridgeConfig?.name, source: bridgeMode ? 'bridge' : 'hadamard' });
635
+ const cost = estimateCost(model, inT, outT);
636
+ totalCostUsd = cost === null ? null : (totalCostUsd === null ? cost : totalCostUsd + cost);
637
+ }
604
638
  // Per-config tracking: attribute this turn to the active bridge config.
605
639
  if (bridgeMode && activeBridgeConfig) {
606
640
  const rec = configUsage.get(activeBridgeConfig.name) ?? { inputTokens: 0, outputTokens: 0, turns: 0 };
@@ -700,6 +734,7 @@ export async function runHadamardTui(options = {}) {
700
734
  sdk = nextSdk;
701
735
  session = nextSession;
702
736
  toolMetadata = nextToolMetadata;
737
+ subscribeTaskNotifications();
703
738
  await restoreSessionRuntimeSelection();
704
739
  }
705
740
  catch (error) {
@@ -986,7 +1021,7 @@ export async function runHadamardTui(options = {}) {
986
1021
  ?? 200_000;
987
1022
  const pct = window > 0 ? Math.min(100, Math.round((used / window) * 100)) : 0;
988
1023
  const usedK = used >= 1000 ? `${(used / 1000).toFixed(used >= 100_000 ? 0 : 1)}k` : `${used}`;
989
- const ctxColor = pct >= 90 ? A.red : pct >= 70 ? A.yellow : A.dim;
1024
+ const ctxColor = usageBarColorLevel(pct) === 'critical' ? A.red : usageBarColorLevel(pct) === 'warn' ? A.yellow : A.dim;
990
1025
  const modelLabel = activeRouter
991
1026
  ? `router:${activeRouter.name}${routedModelLabel ? ` → ${routedModelLabel}` : ''}`
992
1027
  : !bridgeMode && activeBridgeConfig?.runtime === 'hadamard' && bridgeModelLabel
@@ -999,7 +1034,20 @@ export async function runHadamardTui(options = {}) {
999
1034
  ? `team:${activeTeamName}${teamPrefs.autoInvoke ? '' : ' (manual)'}`
1000
1035
  : 'team:none';
1001
1036
  const left = `${modelLabel} · ${permissionLabel()} · mode:${currentAgentMode()} · effort:${currentEffort() ?? 'auto'} · ${teamLabel}${bridgeTag}${goalContextLine()} · `;
1002
- return `${A.dim} ${left}${A.reset}${ctxColor}ctx ${pct}% (${usedK})${A.reset}`;
1037
+ // usageBar extension: swap the plain ctx segment for a bar + session
1038
+ // cost/tokens. Read at render time so /extensions toggling is live.
1039
+ const ctxSegment = sdk.builtInExtensions.isEnabled('usageBar')
1040
+ ? formatUsageBar({
1041
+ contextUsedTokens: used,
1042
+ contextWindowTokens: window,
1043
+ ...(sdk.builtInExtensions.isEnabled('costTracker') && totalCostUsd !== null
1044
+ ? { sessionCostUsd: totalCostUsd }
1045
+ : {}),
1046
+ inputTokens: totalInputTokens,
1047
+ outputTokens: totalOutputTokens,
1048
+ })
1049
+ : `ctx ${pct}% (${usedK})`;
1050
+ return `${A.dim} ${left}${A.reset}${ctxColor}${ctxSegment}${A.reset}`;
1003
1051
  }
1004
1052
  function buildStatusLine() {
1005
1053
  const modeLine = buildModeLine();
@@ -1455,7 +1503,7 @@ export async function runHadamardTui(options = {}) {
1455
1503
  // pre-built {model, modelApi} into session.stream — the /model
1456
1504
  // router's proven mechanism for cross-provider routing. Same
1457
1505
  // session → context intact; switching bridge↔hadamard is seamless.
1458
- statusNote = `bridge:${activeBridgeConfig?.name ?? 'bridge'}`;
1506
+ statusNote = activeKeywayRouteAlias ? `keyway:${activeKeywayRouteAlias}` : `bridge:${activeBridgeConfig?.name ?? 'bridge'}`;
1459
1507
  const stream = session.stream(expandImageRefs(text), {
1460
1508
  systemPrompt,
1461
1509
  ...projectInstructionRunOptions(),
@@ -1504,7 +1552,7 @@ export async function runHadamardTui(options = {}) {
1504
1552
  collapseReasoning();
1505
1553
  // Accumulate token + USD usage for /cost and /usage. The model is the
1506
1554
  // routed model (if a router is active) or the session model. Bridge runs
1507
- recordUsage(routed?.model ?? activeBridgeModelApi?.model ?? bridgeModelLabel ?? session.model, result.usage);
1555
+ recordUsage(routed?.model ?? activeBridgeModelApi?.model ?? bridgeModelLabel ?? session.model, result.usage, result.runId);
1508
1556
  const rest = flusher.drain();
1509
1557
  if (rest.length > 0)
1510
1558
  appendStatic(rest);
@@ -2650,6 +2698,7 @@ export async function runHadamardTui(options = {}) {
2650
2698
  // session.stream (same session, context naturally survives switching).
2651
2699
  async function activateBridgeConfig(config) {
2652
2700
  try {
2701
+ activeKeywayRouteAlias = null;
2653
2702
  if (config.execution === 'cli') {
2654
2703
  if (!isManagedExternalCliRuntime(config.runtime)) {
2655
2704
  throw new Error('External CLI mode requires an installed CLI runtime.');
@@ -3806,6 +3855,7 @@ export async function runHadamardTui(options = {}) {
3806
3855
  bridgeName: bridgeMode ? activeBridgeConfig?.name : undefined,
3807
3856
  planMode: session.permissionContext.mode === 'plan',
3808
3857
  }),
3858
+ ...usageRoutingRuntime.commandPorts(() => sdk.builtInExtensions.isEnabled('costTracker'), async (label) => promptText({ title: 'Write-only API key', label, secret: true })),
3809
3859
  runGoal: async (args) => (await sdk.goals.command(session, args)).message,
3810
3860
  appendStatic,
3811
3861
  });
@@ -4396,7 +4446,7 @@ export async function runHadamardTui(options = {}) {
4396
4446
  effort: currentEffort() ?? 'auto',
4397
4447
  team: activeTeamName ?? 'none',
4398
4448
  router: activeRouter?.name ?? 'off',
4399
- bridge: bridgeMode && activeBridgeConfig ? activeBridgeConfig.name : 'off',
4449
+ bridge: activeKeywayRouteAlias ? `keyway:${activeKeywayRouteAlias}` : bridgeMode && activeBridgeConfig ? activeBridgeConfig.name : 'off',
4400
4450
  };
4401
4451
  },
4402
4452
  doctorSnapshot: async () => {
@@ -4491,6 +4541,8 @@ export async function runHadamardTui(options = {}) {
4491
4541
  const { RuleCommandService } = await import('../context/ruleCommandService.js');
4492
4542
  return new RuleCommandService(sdk.config.homeDir, sdk.config.workDir).execute(commandArgs);
4493
4543
  },
4544
+ extensionsCommand: commandArgs => runExtensionsCommandView(sdk.builtInExtensions, commandArgs),
4545
+ lspCommand: () => runLspCommandView(sdk.codeIntelligence),
4494
4546
  appendStatic,
4495
4547
  }))
4496
4548
  return;
@@ -4645,6 +4697,7 @@ export async function runHadamardTui(options = {}) {
4645
4697
  if (shuttingDown)
4646
4698
  return;
4647
4699
  shuttingDown = true;
4700
+ unsubscribeTaskNotifications?.();
4648
4701
  let exitCode = code;
4649
4702
  if (spinnerTimer)
4650
4703
  clearInterval(spinnerTimer);
@@ -4675,6 +4728,7 @@ export async function runHadamardTui(options = {}) {
4675
4728
  ...(globalAssistantSdk ? [globalAssistantSdk.close()] : []),
4676
4729
  externalCliRuntimeManager.close(),
4677
4730
  ...[...externalBridgeRuntimes.values()].map(runtime => runtime.client.close()),
4731
+ usageRoutingRuntime.close(),
4678
4732
  ]);
4679
4733
  const cleanupFailures = cleanupResults
4680
4734
  .filter((result) => result.status === 'rejected');