@vscode/component-explorer-cli 0.2.1-17 → 0.2.1-171

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 (281) hide show
  1. package/README.md +130 -12
  2. package/dist/WorktreePool.d.ts +5 -4
  3. package/dist/WorktreePool.d.ts.map +1 -1
  4. package/dist/WorktreePool.js +3 -3
  5. package/dist/WorktreePool.js.map +1 -1
  6. package/dist/_virtual/_build-info.js +1 -1
  7. package/dist/browserPage.d.ts +55 -1
  8. package/dist/browserPage.d.ts.map +1 -1
  9. package/dist/browserPage.js +103 -7
  10. package/dist/browserPage.js.map +1 -1
  11. package/dist/browserPage.test.d.ts +2 -0
  12. package/dist/browserPage.test.d.ts.map +1 -0
  13. package/dist/commands/acceptCommand.d.ts +1 -1
  14. package/dist/commands/acceptCommand.d.ts.map +1 -1
  15. package/dist/commands/acceptCommand.js +21 -14
  16. package/dist/commands/acceptCommand.js.map +1 -1
  17. package/dist/commands/checkStabilityCommand.d.ts +2 -0
  18. package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
  19. package/dist/commands/checkStabilityCommand.js +25 -8
  20. package/dist/commands/checkStabilityCommand.js.map +1 -1
  21. package/dist/commands/compareCommand.d.ts +1 -1
  22. package/dist/commands/compareCommand.d.ts.map +1 -1
  23. package/dist/commands/compareCommand.js +31 -22
  24. package/dist/commands/compareCommand.js.map +1 -1
  25. package/dist/commands/inputArg.d.ts +33 -0
  26. package/dist/commands/inputArg.d.ts.map +1 -0
  27. package/dist/commands/inputArg.js +103 -0
  28. package/dist/commands/inputArg.js.map +1 -0
  29. package/dist/commands/mcpCommand.d.ts.map +1 -1
  30. package/dist/commands/mcpCommand.js +18 -12
  31. package/dist/commands/mcpCommand.js.map +1 -1
  32. package/dist/commands/renderCommand.d.ts +10 -1
  33. package/dist/commands/renderCommand.d.ts.map +1 -1
  34. package/dist/commands/renderCommand.js +390 -61
  35. package/dist/commands/renderCommand.js.map +1 -1
  36. package/dist/commands/renderCommand.test.d.ts +2 -0
  37. package/dist/commands/renderCommand.test.d.ts.map +1 -0
  38. package/dist/commands/serveCommand.d.ts +4 -1
  39. package/dist/commands/serveCommand.d.ts.map +1 -1
  40. package/dist/commands/serveCommand.js +105 -36
  41. package/dist/commands/serveCommand.js.map +1 -1
  42. package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -1
  43. package/dist/commands/serviceDiffCommitsCommand.js +10 -9
  44. package/dist/commands/serviceDiffCommitsCommand.js.map +1 -1
  45. package/dist/commands/watchCommand.d.ts +1 -0
  46. package/dist/commands/watchCommand.d.ts.map +1 -1
  47. package/dist/commands/watchCommand.js +31 -20
  48. package/dist/commands/watchCommand.js.map +1 -1
  49. package/dist/comparison.d.ts +4 -3
  50. package/dist/comparison.d.ts.map +1 -1
  51. package/dist/comparison.js +17 -14
  52. package/dist/comparison.js.map +1 -1
  53. package/dist/component-explorer-config.schema.json +55 -2
  54. package/dist/componentExplorer.d.ts +110 -12
  55. package/dist/componentExplorer.d.ts.map +1 -1
  56. package/dist/componentExplorer.js +177 -24
  57. package/dist/componentExplorer.js.map +1 -1
  58. package/dist/config.d.ts +33 -4
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +64 -27
  61. package/dist/config.js.map +1 -1
  62. package/dist/coverage.d.ts +64 -0
  63. package/dist/coverage.d.ts.map +1 -0
  64. package/dist/coverage.js +212 -0
  65. package/dist/coverage.js.map +1 -0
  66. package/dist/daemon/DaemonService.d.ts +5 -199
  67. package/dist/daemon/DaemonService.d.ts.map +1 -1
  68. package/dist/daemon/DaemonService.js +248 -300
  69. package/dist/daemon/DaemonService.js.map +1 -1
  70. package/dist/daemon/approvalStore.d.ts +2 -1
  71. package/dist/daemon/approvalStore.d.ts.map +1 -1
  72. package/dist/daemon/approvalStore.js +4 -3
  73. package/dist/daemon/approvalStore.js.map +1 -1
  74. package/dist/daemon/client.d.ts +76 -5
  75. package/dist/daemon/client.d.ts.map +1 -1
  76. package/dist/daemon/daemonRpc.test.d.ts +2 -0
  77. package/dist/daemon/daemonRpc.test.d.ts.map +1 -0
  78. package/dist/daemon/endpointServer.d.ts +4 -0
  79. package/dist/daemon/endpointServer.d.ts.map +1 -0
  80. package/dist/daemon/endpointServer.js +24 -0
  81. package/dist/daemon/endpointServer.js.map +1 -0
  82. package/dist/daemon/inProcessClient.d.ts +3 -9
  83. package/dist/daemon/inProcessClient.d.ts.map +1 -1
  84. package/dist/daemon/inProcessClient.js +29 -30
  85. package/dist/daemon/inProcessClient.js.map +1 -1
  86. package/dist/daemon/lifecycle.d.ts +5 -5
  87. package/dist/daemon/lifecycle.d.ts.map +1 -1
  88. package/dist/daemon/lifecycle.js +4 -3
  89. package/dist/daemon/lifecycle.js.map +1 -1
  90. package/dist/daemon/pipeClient.d.ts +2 -3
  91. package/dist/daemon/pipeClient.d.ts.map +1 -1
  92. package/dist/daemon/pipeClient.js +93 -194
  93. package/dist/daemon/pipeClient.js.map +1 -1
  94. package/dist/daemon/pipeName.d.ts +3 -3
  95. package/dist/daemon/pipeName.d.ts.map +1 -1
  96. package/dist/daemon/pipeName.js +6 -5
  97. package/dist/daemon/pipeName.js.map +1 -1
  98. package/dist/daemon/pipeServer.d.ts +2 -2
  99. package/dist/daemon/pipeServer.d.ts.map +1 -1
  100. package/dist/daemon/pipeServer.js +79 -70
  101. package/dist/daemon/pipeServer.js.map +1 -1
  102. package/dist/daemon/registerDaemonConnection.d.ts +7 -0
  103. package/dist/daemon/registerDaemonConnection.d.ts.map +1 -0
  104. package/dist/daemon/registerDaemonConnection.js +37 -0
  105. package/dist/daemon/registerDaemonConnection.js.map +1 -0
  106. package/dist/daemon/transports.test.d.ts +2 -0
  107. package/dist/daemon/transports.test.d.ts.map +1 -0
  108. package/dist/daemon/types.d.ts +1655 -8
  109. package/dist/daemon/types.d.ts.map +1 -1
  110. package/dist/daemon/types.js +4 -0
  111. package/dist/daemon/types.js.map +1 -0
  112. package/dist/daemon/version.d.ts +1 -5
  113. package/dist/daemon/version.d.ts.map +1 -1
  114. package/dist/daemon/version.js +3 -7
  115. package/dist/daemon/version.js.map +1 -1
  116. package/dist/dependencyInstaller.d.ts +2 -1
  117. package/dist/dependencyInstaller.d.ts.map +1 -1
  118. package/dist/dependencyInstaller.js +4 -4
  119. package/dist/dependencyInstaller.js.map +1 -1
  120. package/dist/explorerSession.d.ts +5 -1
  121. package/dist/explorerSession.d.ts.map +1 -1
  122. package/dist/explorerSession.js +24 -7
  123. package/dist/explorerSession.js.map +1 -1
  124. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/inspectionHost-BA6ZmC_P.js +2523 -0
  125. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/inspectionHost-BA6ZmC_P.js.map +1 -0
  126. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/src-DYVSK_tz.js +1871 -0
  127. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/src-DYVSK_tz.js.map +1 -0
  128. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/webSocketTransport-Ct4OIdG9.js +220 -0
  129. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/webSocketTransport-Ct4OIdG9.js.map +1 -0
  130. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/node.js +721 -0
  131. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/node.js.map +1 -0
  132. package/dist/git/gitCommitResolver.d.ts +2 -1
  133. package/dist/git/gitCommitResolver.d.ts.map +1 -1
  134. package/dist/git/gitCommitResolver.js +8 -8
  135. package/dist/git/gitCommitResolver.js.map +1 -1
  136. package/dist/git/gitIndexResolver.d.ts +2 -1
  137. package/dist/git/gitIndexResolver.d.ts.map +1 -1
  138. package/dist/git/gitIndexResolver.js +7 -7
  139. package/dist/git/gitIndexResolver.js.map +1 -1
  140. package/dist/git/gitService.d.ts +5 -4
  141. package/dist/git/gitService.d.ts.map +1 -1
  142. package/dist/git/gitService.js.map +1 -1
  143. package/dist/git/gitUtils.d.ts +6 -5
  144. package/dist/git/gitUtils.d.ts.map +1 -1
  145. package/dist/git/gitUtils.js +5 -4
  146. package/dist/git/gitUtils.js.map +1 -1
  147. package/dist/git/gitWorktreeManager.d.ts +15 -14
  148. package/dist/git/gitWorktreeManager.d.ts.map +1 -1
  149. package/dist/git/gitWorktreeManager.js +10 -11
  150. package/dist/git/gitWorktreeManager.js.map +1 -1
  151. package/dist/git/testUtils.d.ts +2 -1
  152. package/dist/git/testUtils.d.ts.map +1 -1
  153. package/dist/index.d.ts +0 -2
  154. package/dist/index.js +10 -1
  155. package/dist/index.js.map +1 -1
  156. package/dist/js-component-explorer/packages/common/dist/daemonRpc.js +165 -0
  157. package/dist/js-component-explorer/packages/common/dist/daemonRpc.js.map +1 -0
  158. package/dist/js-component-explorer/packages/common/dist/explorerUrl.js +21 -0
  159. package/dist/js-component-explorer/packages/common/dist/explorerUrl.js.map +1 -0
  160. package/dist/js-component-explorer/packages/common/dist/renderManifest.js +68 -0
  161. package/dist/js-component-explorer/packages/common/dist/renderManifest.js.map +1 -0
  162. package/dist/js-component-explorer/packages/semver/dist/index.js.map +1 -0
  163. package/dist/manifest.schema.json +44 -16
  164. package/dist/mcp/DaemonAccessor.d.ts +2 -3
  165. package/dist/mcp/DaemonAccessor.d.ts.map +1 -1
  166. package/dist/mcp/McpServer.d.ts +1 -1
  167. package/dist/mcp/McpServer.d.ts.map +1 -1
  168. package/dist/mcp/McpServer.js +252 -159
  169. package/dist/mcp/McpServer.js.map +1 -1
  170. package/dist/path.d.ts +30 -0
  171. package/dist/path.d.ts.map +1 -0
  172. package/dist/path.js +78 -0
  173. package/dist/path.js.map +1 -0
  174. package/dist/processTree.d.ts +6 -1
  175. package/dist/processTree.d.ts.map +1 -1
  176. package/dist/processTree.js +48 -5
  177. package/dist/processTree.js.map +1 -1
  178. package/dist/renderManifest.d.ts +70 -5
  179. package/dist/renderManifest.js +1 -1
  180. package/dist/server/httpServer.d.ts +1 -1
  181. package/dist/server/httpServer.d.ts.map +1 -1
  182. package/dist/server/httpServer.js +4 -8
  183. package/dist/server/httpServer.js.map +1 -1
  184. package/dist/server/serverConfig.d.ts +23 -8
  185. package/dist/server/serverConfig.d.ts.map +1 -1
  186. package/dist/server/serverConfig.js +11 -18
  187. package/dist/server/serverConfig.js.map +1 -1
  188. package/dist/server/viteServer.d.ts +16 -3
  189. package/dist/server/viteServer.d.ts.map +1 -1
  190. package/dist/server/viteServer.js +86 -5
  191. package/dist/server/viteServer.js.map +1 -1
  192. package/dist/storage.d.ts +2 -1
  193. package/dist/storage.d.ts.map +1 -1
  194. package/dist/storage.js +1 -1
  195. package/dist/storage.js.map +1 -1
  196. package/dist/utils.d.ts +3 -30
  197. package/dist/utils.d.ts.map +1 -1
  198. package/dist/utils.js +4 -24
  199. package/dist/utils.js.map +1 -1
  200. package/dist/visualCache.d.ts +2 -1
  201. package/dist/visualCache.d.ts.map +1 -1
  202. package/dist/visualCache.js +4 -3
  203. package/dist/visualCache.js.map +1 -1
  204. package/dist/viteProjectRef.d.ts +4 -12
  205. package/dist/viteProjectRef.d.ts.map +1 -1
  206. package/dist/viteProjectRef.js +9 -17
  207. package/dist/viteProjectRef.js.map +1 -1
  208. package/dist/vscode-observables/observables/dist/disposables.js.map +1 -0
  209. package/dist/vscode-observables/observables/dist/observableInternal/base.js.map +1 -0
  210. package/dist/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +1 -0
  211. package/dist/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +1 -0
  212. package/dist/vscode-observables/observables/dist/observableInternal/debugName.js.map +1 -0
  213. package/dist/vscode-observables/observables/dist/observableInternal/index.js.map +1 -0
  214. package/dist/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +1 -0
  215. package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/debugGetDependencyGraph.js +1 -1
  216. package/dist/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +1 -0
  217. package/dist/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +1 -0
  218. package/dist/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -0
  219. package/dist/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +1 -0
  220. package/dist/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +1 -0
  221. package/dist/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +1 -0
  222. package/dist/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +1 -0
  223. package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js → vscode-observables/observables/dist/observableInternal/reactions/createEffect.js} +9 -5
  224. package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffect.js.map +1 -0
  225. package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js → vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js} +1 -1
  226. package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js.map +1 -0
  227. package/dist/vscode-observables/observables/dist/observableInternal/transaction.js.map +1 -0
  228. package/dist/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +1 -0
  229. package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utilsCancellation.js +2 -2
  230. package/dist/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +1 -0
  231. package/package.json +18 -15
  232. package/dist/commands/artifactCommand.d.ts +0 -14
  233. package/dist/commands/artifactCommand.d.ts.map +0 -1
  234. package/dist/external/vscode-observables/observables/dist/disposables.js.map +0 -1
  235. package/dist/external/vscode-observables/observables/dist/observableInternal/base.js.map +0 -1
  236. package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +0 -1
  237. package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +0 -1
  238. package/dist/external/vscode-observables/observables/dist/observableInternal/debugName.js.map +0 -1
  239. package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +0 -1
  240. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +0 -1
  241. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +0 -1
  242. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +0 -1
  243. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +0 -1
  244. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +0 -1
  245. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +0 -1
  246. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +0 -1
  247. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +0 -1
  248. package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js.map +0 -1
  249. package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js.map +0 -1
  250. package/dist/external/vscode-observables/observables/dist/observableInternal/transaction.js.map +0 -1
  251. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +0 -1
  252. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +0 -1
  253. package/dist/formatValue.js +0 -96
  254. package/dist/formatValue.js.map +0 -1
  255. package/dist/packages/common/dist/renderManifest.js +0 -46
  256. package/dist/packages/common/dist/renderManifest.js.map +0 -1
  257. package/dist/packages/semver/dist/index.js.map +0 -1
  258. package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js +0 -138
  259. package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +0 -1
  260. package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js +0 -27
  261. package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js.map +0 -1
  262. package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js +0 -28
  263. package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js.map +0 -1
  264. package/dist/packages/simple-api/dist/express.js +0 -104
  265. package/dist/packages/simple-api/dist/express.js.map +0 -1
  266. /package/dist/{packages → js-component-explorer/packages}/semver/dist/index.js +0 -0
  267. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/disposables.js +0 -0
  268. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/base.js +0 -0
  269. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/commonFacade/deps.js +0 -0
  270. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugLocation.js +0 -0
  271. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugName.js +0 -0
  272. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/index.js +0 -0
  273. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/consoleObservableLogger.js +0 -0
  274. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/logging.js +0 -0
  275. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/baseObservable.js +0 -0
  276. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derived.js +0 -0
  277. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derivedImpl.js +0 -0
  278. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableFromEvent.js +0 -0
  279. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableValue.js +0 -0
  280. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/transaction.js +0 -0
  281. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utils.js +0 -0
@@ -1,16 +1,16 @@
1
- import { z } from 'zod';
2
- import '../external/vscode-observables/observables/dist/observableInternal/index.js';
3
- import { observableValue } from '../external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js';
4
- import '../external/vscode-observables/observables/dist/observableInternal/debugLocation.js';
5
- import { autorun } from '../external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js';
6
- import { derived } from '../external/vscode-observables/observables/dist/observableInternal/observables/derived.js';
7
- import { waitForState } from '../external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js';
8
- import '../external/vscode-observables/observables/dist/observableInternal/utils/utils.js';
9
- import '../external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
10
- import { createApiFactory } from '../packages/simple-api/dist/chunk-FJ7AVNQE.js';
11
- import { AsyncStream } from '../packages/simple-api/dist/chunk-TTRCY65Z.js';
1
+ import '../vscode-observables/observables/dist/observableInternal/index.js';
2
+ import { observableValue } from '../vscode-observables/observables/dist/observableInternal/observables/observableValue.js';
3
+ import '../vscode-observables/observables/dist/observableInternal/debugLocation.js';
4
+ import { autorun } from '../vscode-observables/observables/dist/observableInternal/reactions/createEffect.js';
5
+ import { derived } from '../vscode-observables/observables/dist/observableInternal/observables/derived.js';
6
+ import { waitForState } from '../vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js';
7
+ import '../vscode-observables/observables/dist/observableInternal/utils/utils.js';
8
+ import '../vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
9
+ import { nt as defaultInterfaceTarget } from '../external/linkrpc/typescript/packages/linkrpc/dist/chunks/src-DYVSK_tz.js';
10
+ import { daemonRpcInterface } from '../js-component-explorer/packages/common/dist/daemonRpc.js';
12
11
  import { ExplorerSession } from '../explorerSession.js';
13
12
  import '../config.js';
13
+ import { RelativePath } from '../path.js';
14
14
  import { GitIndexResolver } from '../git/gitIndexResolver.js';
15
15
  import { DirtyWorktreeError } from '../git/gitWorktreeManager.js';
16
16
  import { execGit } from '../git/gitUtils.js';
@@ -20,7 +20,6 @@ import { FileApprovalStore } from './approvalStore.js';
20
20
  import { VisualCache } from '../visualCache.js';
21
21
  import { contentHash } from '../screenshotCache.js';
22
22
  import { WorktreePool } from '../WorktreePool.js';
23
- import { pluginProtocolVersionText, daemonApiVersionText } from './version.js';
24
23
  export { isCompatibleVersion, parseVersion } from './version.js';
25
24
  import { ViteServerConfig } from '../server/serverConfig.js';
26
25
 
@@ -107,339 +106,276 @@ class DaemonService {
107
106
  _worktreePool;
108
107
  approvals;
109
108
  visualCache;
110
- api;
111
109
  constructor(_config, _pipeName, _logger, _browserFactory, approvalStorePath, idleTimeoutMs) {
112
110
  this._config = _config;
113
111
  this._pipeName = _pipeName;
114
112
  this._logger = _logger;
115
113
  this._browserFactory = _browserFactory;
116
114
  this.approvals = new FileApprovalStore(approvalStorePath);
117
- this.visualCache = new VisualCache(`${_config.screenshotDir}/visual-cache.json`);
115
+ this.visualCache = new VisualCache(_config.screenshotDir.join(new RelativePath('visual-cache.json')));
118
116
  this._activityTracker = new ActivityTracker(idleTimeoutMs, () => this.requestShutdown(), this._logger);
119
117
  if (_config.worktreePool) {
120
118
  this._worktreePool = new WorktreePool(_config.worktreePool.maxSlots, _config.repo.worktreeRootPath());
121
119
  }
122
- this.api = this._buildApi();
123
120
  }
124
121
  static async create(config, logger, pipeName, options) {
125
122
  const browserFactory = new PlaywrightBrowserPageFactory(options?.headed ?? false, 30_000, logger);
126
- const approvalStorePath = `${config.screenshotDir}/approvals.json`;
123
+ const approvalStorePath = config.screenshotDir.join(new RelativePath('approvals.json'));
127
124
  const idleTimeoutMs = options?.idleTimeoutMs ?? 5 * 60 * 1000; // 5 minutes default
128
125
  const svc = new DaemonService(config, pipeName, logger, browserFactory, approvalStorePath, idleTimeoutMs);
129
- for (const sessionConfig of config.sessions) {
130
- svc._sessionConfigs.set(sessionConfig.name, sessionConfig);
131
- await svc._setupSession(sessionConfig);
126
+ try {
127
+ for (const sessionConfig of config.sessions) {
128
+ svc._sessionConfigs.set(sessionConfig.name, sessionConfig);
129
+ await svc._setupSession(sessionConfig);
130
+ }
131
+ }
132
+ catch (error) {
133
+ await svc.dispose();
134
+ throw error;
132
135
  }
133
136
  return svc;
134
137
  }
135
138
  // -- API definition ------------------------------------------------------
136
- _buildApi() {
137
- const { createApi, createMethod } = createApiFactory();
138
- return createApi({
139
- fixtures: createApi({
140
- list: createMethod({
141
- args: {
142
- sessionName: z.string(),
143
- sourceTreeId: z.string(),
144
- },
145
- }, async (args) => {
146
- this._activityTracker.reportActivity();
147
- this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
148
- const session = this.getSession(args.sessionName);
149
- const result = await session.explorer.listFixtures();
150
- this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
151
- return result;
152
- }),
153
- }),
154
- screenshots: createApi({
155
- take: createMethod({
156
- args: {
157
- fixtureId: z.string(),
158
- sourceTreeId: z.string(),
159
- sessionName: z.string(),
160
- includeImage: z.boolean().optional(),
161
- stabilityCheck: z.boolean().optional(),
162
- },
163
- }, async (args) => {
164
- this._activityTracker.reportActivity();
165
- const session = this.getSession(args.sessionName);
166
- this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
167
- if (args.stabilityCheck) {
168
- const result = await session.explorer.screenshotFixtureStabilityCheck(args.fixtureId);
169
- this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
170
- const hashes = result.screenshots.map(s => contentHash(s.image));
171
- const isStable = hashes[0] === hashes[1] && hashes[1] === hashes[2];
172
- const stabilityScreenshots = result.screenshots.map((s, i) => ({
173
- hash: hashes[i],
174
- delayMs: s.delayMs,
175
- image: (args.includeImage ?? true)
176
- ? Buffer.from(s.image).toString('base64')
177
- : undefined,
178
- }));
179
- return {
180
- hash: hashes[hashes.length - 1],
181
- sourceTreeId: args.sourceTreeId,
182
- image: (args.includeImage ?? true)
183
- ? Buffer.from(result.screenshots[result.screenshots.length - 1].image).toString('base64')
184
- : undefined,
185
- hasError: result.hasError,
186
- error: result.error,
187
- events: result.events.length > 0 ? result.events : undefined,
188
- resultData: result.resultData,
189
- isStable,
190
- stabilityScreenshots,
191
- };
192
- }
193
- const result = await session.explorer.screenshotFixture(args.fixtureId);
139
+ registerRpc(connection, context) {
140
+ const registration = connection.register(defaultInterfaceTarget(daemonRpcInterface), {
141
+ fixturesList: async (args) => {
142
+ this._activityTracker.reportActivity();
143
+ this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
144
+ const session = this.getSession(args.sessionName);
145
+ const result = await session.explorer.listFixtures();
146
+ this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
147
+ return result;
148
+ },
149
+ screenshotsTake: async (args) => {
150
+ this._activityTracker.reportActivity();
151
+ const session = this.getSession(args.sessionName);
152
+ this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
153
+ if (args.stabilityCheck) {
154
+ const result = await session.explorer.screenshotFixtureStabilityCheck(args.fixtureId, {
155
+ reloadBeforeRender: args.reloadBeforeRender,
156
+ input: args.input,
157
+ disposeAfter: args.disposeAfter,
158
+ });
194
159
  this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
160
+ const hashes = result.screenshots.map(s => contentHash(s.image));
161
+ const isStable = hashes[0] === hashes[1] && hashes[1] === hashes[2];
162
+ const stabilityScreenshots = result.screenshots.map((s, i) => ({
163
+ hash: hashes[i],
164
+ delayMs: s.delayMs,
165
+ image: (args.includeImage ?? true)
166
+ ? Buffer.from(s.image).toString('base64')
167
+ : undefined,
168
+ }));
195
169
  return {
196
- hash: result.image ? contentHash(result.image) : undefined,
170
+ hash: hashes[hashes.length - 1],
197
171
  sourceTreeId: args.sourceTreeId,
198
- image: (args.includeImage ?? true) && result.image
199
- ? Buffer.from(result.image).toString('base64')
172
+ image: (args.includeImage ?? true)
173
+ ? Buffer.from(result.screenshots[result.screenshots.length - 1].image).toString('base64')
200
174
  : undefined,
201
175
  hasError: result.hasError,
202
176
  error: result.error,
203
- events: result.events?.length > 0 ? result.events : undefined,
204
- resultData: result.resultData,
177
+ events: result.events.length > 0 ? result.events : undefined,
178
+ output: result.output,
179
+ isStable,
180
+ stabilityScreenshots,
181
+ previousDispose: result.previousDispose,
182
+ currentDispose: result.currentDispose,
205
183
  };
206
- }),
207
- takeBatch: createMethod({
208
- args: {
209
- fixtureIds: z.array(z.string()),
210
- sourceTreeId: z.string(),
211
- sessionName: z.string(),
212
- includeImages: z.boolean().optional(),
213
- },
214
- }, async (args) => {
215
- this._activityTracker.reportActivity();
216
- const session = this.getSession(args.sessionName);
184
+ }
185
+ const result = await session.explorer.screenshotFixture(args.fixtureId, {
186
+ reloadBeforeRender: args.reloadBeforeRender,
187
+ input: args.input,
188
+ disposeAfter: args.disposeAfter,
189
+ });
190
+ this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
191
+ return {
192
+ hash: result.image ? contentHash(result.image) : undefined,
193
+ sourceTreeId: args.sourceTreeId,
194
+ image: (args.includeImage ?? true) && result.image
195
+ ? Buffer.from(result.image).toString('base64')
196
+ : undefined,
197
+ hasError: result.hasError,
198
+ error: result.error,
199
+ events: result.events?.length > 0 ? result.events : undefined,
200
+ output: result.output,
201
+ previousDispose: result.previousDispose,
202
+ currentDispose: result.currentDispose,
203
+ };
204
+ },
205
+ screenshotsTakeBatch: async (args) => {
206
+ this._activityTracker.reportActivity();
207
+ const session = this.getSession(args.sessionName);
208
+ this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
209
+ const includeImages = args.includeImages ?? false;
210
+ this._logger.trace(`takeBatch: ${args.fixtureIds.length} fixtures, session=${args.sessionName}`);
211
+ const startTime = Date.now();
212
+ const screenshots = [];
213
+ for (let i = 0; i < args.fixtureIds.length; i++) {
214
+ const fixtureId = args.fixtureIds[i];
215
+ const result = await session.explorer.screenshotFixture(fixtureId, {
216
+ reloadOnError: true,
217
+ // Reload between fixtures (skip before the first one — the page is already fresh)
218
+ reloadBeforeRender: args.reloadBetweenFixtures && i > 0,
219
+ input: args.input,
220
+ });
217
221
  this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
218
- const includeImages = args.includeImages ?? false;
219
- this._logger.trace(`takeBatch: ${args.fixtureIds.length} fixtures, session=${args.sessionName}`);
220
- const startTime = Date.now();
221
- const screenshots = [];
222
- for (const fixtureId of args.fixtureIds) {
223
- const result = await session.explorer.screenshotFixture(fixtureId);
224
- this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
225
- screenshots.push({
226
- fixtureId,
227
- hash: result.image ? contentHash(result.image) : undefined,
228
- image: includeImages && result.image
229
- ? Buffer.from(result.image).toString('base64')
230
- : undefined,
231
- hasError: result.hasError,
232
- error: result.error,
233
- events: result.events.length > 0 ? result.events : undefined,
234
- resultData: result.resultData,
235
- });
236
- }
237
- this._logger.trace(`takeBatch: done in ${Date.now() - startTime}ms`);
238
- return { sourceTreeId: args.sourceTreeId, screenshots };
239
- }),
240
- compare: createMethod({
241
- args: {
242
- fixtureId: z.string(),
243
- baselineSessionName: z.string(),
244
- baselineSourceTreeId: z.string(),
245
- currentSessionName: z.string(),
246
- currentSourceTreeId: z.string(),
247
- includeImages: z.boolean().optional(),
248
- },
249
- }, async (args) => {
250
- this._activityTracker.reportActivity();
251
- const baselineSession = this.getSession(args.baselineSessionName);
252
- const currentSession = this.getSession(args.currentSessionName);
253
- this.assertSourceTreeId(args.baselineSessionName, args.baselineSourceTreeId);
254
- this.assertSourceTreeId(args.currentSessionName, args.currentSourceTreeId);
255
- const [baselineResult, baselineListResult] = await Promise.all([
256
- baselineSession.explorer.screenshotFixture(args.fixtureId),
257
- baselineSession.explorer.listFixtures(),
258
- ]);
259
- this.assertSourceTreeId(args.baselineSessionName, args.baselineSourceTreeId);
260
- const [currentResult, currentListResult] = await Promise.all([
261
- currentSession.explorer.screenshotFixture(args.fixtureId),
262
- currentSession.explorer.listFixtures(),
263
- ]);
264
- this.assertSourceTreeId(args.currentSessionName, args.currentSourceTreeId);
265
- const baselineHash = baselineResult.image ? contentHash(baselineResult.image) : undefined;
266
- const currentHash = currentResult.image ? contentHash(currentResult.image) : undefined;
267
- const includeImages = args.includeImages ?? false;
268
- const currentFixture = currentListResult.fixtures.find(f => f.fixtureId === args.fixtureId);
269
- const baselineFixture = baselineListResult.fixtures.find(f => f.fixtureId === args.fixtureId);
270
- const labels = currentFixture?.labels;
271
- const labelsChanged = baselineFixture && !arraysEqual(baselineFixture.labels, currentFixture?.labels ?? []);
272
- return {
273
- match: baselineHash === currentHash,
274
- baselineHash,
275
- currentHash,
276
- baselineImage: includeImages && baselineResult.image
277
- ? Buffer.from(baselineResult.image).toString('base64') : undefined,
278
- currentImage: includeImages && currentResult.image
279
- ? Buffer.from(currentResult.image).toString('base64') : undefined,
280
- baselineHasError: baselineResult.hasError,
281
- baselineError: baselineResult.error,
282
- baselineEvents: baselineResult.events.length > 0 ? baselineResult.events : undefined,
283
- baselineResultData: baselineResult.resultData,
284
- currentHasError: currentResult.hasError,
285
- currentError: currentResult.error,
286
- currentEvents: currentResult.events.length > 0 ? currentResult.events : undefined,
287
- currentResultData: currentResult.resultData,
288
- labels,
289
- labelsBefore: labelsChanged ? baselineFixture.labels : undefined,
290
- approval: (baselineHash !== undefined && currentHash !== undefined && baselineHash !== currentHash)
291
- ? this.approvals.lookup({
292
- fixtureId: args.fixtureId,
293
- originalHash: baselineHash,
294
- modifiedHash: currentHash,
295
- }) ?? undefined
222
+ screenshots.push({
223
+ fixtureId,
224
+ hash: result.image ? contentHash(result.image) : undefined,
225
+ image: includeImages && result.image
226
+ ? Buffer.from(result.image).toString('base64')
296
227
  : undefined,
297
- };
298
- }),
299
- }),
300
- approvals: createApi({
301
- approve: createMethod({
302
- args: {
303
- fixtureId: z.string(),
304
- originalHash: z.string(),
305
- modifiedHash: z.string(),
306
- comment: z.string(),
307
- },
308
- }, async (args) => {
309
- this._activityTracker.reportActivity();
310
- this.approvals.approve(args);
311
- }),
312
- revoke: createMethod({
313
- args: {
314
- fixtureId: z.string(),
315
- originalHash: z.string(),
316
- modifiedHash: z.string(),
317
- },
318
- }, async (args) => {
319
- this._activityTracker.reportActivity();
320
- this.approvals.revoke(args);
321
- }),
322
- list: createMethod({
323
- args: { fixtureId: z.string().optional() },
324
- }, async (args) => {
325
- this._activityTracker.reportActivity();
326
- return this.approvals.list(args.fixtureId);
327
- }),
328
- lookup: createMethod({
329
- args: {
330
- fixtureId: z.string(),
331
- originalHash: z.string(),
332
- modifiedHash: z.string(),
333
- },
334
- }, async (args) => {
335
- this._activityTracker.reportActivity();
336
- return this.approvals.lookup(args) ?? null;
337
- }),
338
- }),
339
- visualReview: createApi({
340
- getStatus: createMethod({
341
- args: {
342
- fixtureId: z.string(),
343
- expectedVisualDescriptions: z.array(z.string()),
344
- screenshotHash: z.string(),
345
- },
346
- }, async (args) => {
347
- this._activityTracker.reportActivity();
348
- return this.visualCache.getReviewStatus(args.fixtureId, args.expectedVisualDescriptions, args.screenshotHash);
349
- }),
350
- approve: createMethod({
351
- args: {
352
- fixtureId: z.string(),
353
- expectedVisualDescriptions: z.array(z.string()),
354
- screenshotHash: z.string(),
355
- comment: z.string(),
356
- },
357
- }, async (args) => {
358
- this._activityTracker.reportActivity();
359
- this.visualCache.approve(args.fixtureId, args.expectedVisualDescriptions, args.screenshotHash, args.comment);
360
- }),
361
- }),
362
- evaluate: createMethod({
363
- args: {
364
- sessionName: z.string(),
365
- sourceTreeId: z.string(),
366
- expression: z.string(),
367
- fixtureId: z.string().optional(),
368
- },
369
- }, async (args) => {
228
+ hasError: result.hasError,
229
+ error: result.error,
230
+ events: result.events.length > 0 ? result.events : undefined,
231
+ output: result.output,
232
+ });
233
+ }
234
+ this._logger.trace(`takeBatch: done in ${Date.now() - startTime}ms`);
235
+ return { sourceTreeId: args.sourceTreeId, screenshots };
236
+ },
237
+ screenshotsCompare: async (args) => {
238
+ this._activityTracker.reportActivity();
239
+ const baselineSession = this.getSession(args.baselineSessionName);
240
+ const currentSession = this.getSession(args.currentSessionName);
241
+ this.assertSourceTreeId(args.baselineSessionName, args.baselineSourceTreeId);
242
+ this.assertSourceTreeId(args.currentSessionName, args.currentSourceTreeId);
243
+ const [baselineResult, baselineListResult] = await Promise.all([
244
+ baselineSession.explorer.screenshotFixture(args.fixtureId),
245
+ baselineSession.explorer.listFixtures(),
246
+ ]);
247
+ this.assertSourceTreeId(args.baselineSessionName, args.baselineSourceTreeId);
248
+ const [currentResult, currentListResult] = await Promise.all([
249
+ currentSession.explorer.screenshotFixture(args.fixtureId),
250
+ currentSession.explorer.listFixtures(),
251
+ ]);
252
+ this.assertSourceTreeId(args.currentSessionName, args.currentSourceTreeId);
253
+ const baselineHash = baselineResult.image ? contentHash(baselineResult.image) : undefined;
254
+ const currentHash = currentResult.image ? contentHash(currentResult.image) : undefined;
255
+ const includeImages = args.includeImages ?? false;
256
+ const currentFixture = currentListResult.fixtures.find(f => f.fixtureId === args.fixtureId);
257
+ const baselineFixture = baselineListResult.fixtures.find(f => f.fixtureId === args.fixtureId);
258
+ const labels = currentFixture?.labels;
259
+ const labelsChanged = baselineFixture && !arraysEqual(baselineFixture.labels, currentFixture?.labels ?? []);
260
+ return {
261
+ match: baselineHash === currentHash,
262
+ baselineHash,
263
+ currentHash,
264
+ baselineImage: includeImages && baselineResult.image
265
+ ? Buffer.from(baselineResult.image).toString('base64') : undefined,
266
+ currentImage: includeImages && currentResult.image
267
+ ? Buffer.from(currentResult.image).toString('base64') : undefined,
268
+ baselineHasError: baselineResult.hasError,
269
+ baselineError: baselineResult.error,
270
+ baselineEvents: baselineResult.events.length > 0 ? baselineResult.events : undefined,
271
+ baselineOutput: baselineResult.output,
272
+ currentHasError: currentResult.hasError,
273
+ currentError: currentResult.error,
274
+ currentEvents: currentResult.events.length > 0 ? currentResult.events : undefined,
275
+ currentOutput: currentResult.output,
276
+ labels,
277
+ labelsBefore: labelsChanged ? baselineFixture.labels : undefined,
278
+ approval: (baselineHash !== undefined && currentHash !== undefined && baselineHash !== currentHash)
279
+ ? this.approvals.lookup({
280
+ fixtureId: args.fixtureId,
281
+ originalHash: baselineHash,
282
+ modifiedHash: currentHash,
283
+ }) ?? undefined
284
+ : undefined,
285
+ };
286
+ },
287
+ approvalsApprove: async (args) => {
288
+ this._activityTracker.reportActivity();
289
+ this.approvals.approve(args);
290
+ },
291
+ approvalsRevoke: async (args) => {
292
+ this._activityTracker.reportActivity();
293
+ this.approvals.revoke(args);
294
+ },
295
+ approvalsList: async (args) => {
296
+ this._activityTracker.reportActivity();
297
+ return this.approvals.list(args.fixtureId);
298
+ },
299
+ approvalsLookup: async (args) => {
300
+ this._activityTracker.reportActivity();
301
+ return this.approvals.lookup(args) ?? null;
302
+ },
303
+ visualReviewGetStatus: async (args) => {
304
+ this._activityTracker.reportActivity();
305
+ return this.visualCache.getReviewStatus(args.fixtureId, args.expectedVisualDescriptions, args.screenshotHash);
306
+ },
307
+ visualReviewApprove: async (args) => {
308
+ this._activityTracker.reportActivity();
309
+ this.visualCache.approve(args.fixtureId, args.expectedVisualDescriptions, args.screenshotHash, args.comment);
310
+ },
311
+ evaluate: async (args) => {
370
312
  this._activityTracker.reportActivity();
371
313
  const session = this.getSession(args.sessionName);
372
314
  this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
373
315
  const result = await session.explorer.evaluateJs(args.expression, args.fixtureId);
374
316
  this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
375
317
  return { result };
376
- }),
377
- setBrowserVisibility: createMethod({
378
- args: { visible: z.boolean() },
379
- }, async (args, ctx) => {
318
+ },
319
+ setBrowserVisibility: async (args) => {
380
320
  this._activityTracker.reportActivity();
381
- this._logger.debug(`Set browser visibility: ${args.visible} (client=${ctx.clientName})`);
321
+ this._logger.debug(`Set browser visibility: ${args.visible} (client=${context.clientName})`);
382
322
  await this._browserFactory.setHeaded(args.visible);
383
323
  for (const session of this._sessions.values()) {
384
324
  session.explorer.closePage();
385
325
  }
386
326
  return { visible: args.visible };
387
- }),
388
- events: createMethod({ args: {} }, async () => {
389
- return AsyncStream.fromIterable(this.eventStream());
390
- }),
391
- sessions: createMethod({ args: {} }, async (_args, ctx) => {
327
+ },
328
+ events: async (_args, _ctx, stream) => {
329
+ const iterator = this.eventStream()[Symbol.asyncIterator]();
330
+ const onAbort = () => { void iterator.return?.(); };
331
+ stream.signal.addEventListener('abort', onAbort, { once: true });
332
+ try {
333
+ while (!stream.signal.aborted) {
334
+ const next = await iterator.next();
335
+ if (next.done) {
336
+ break;
337
+ }
338
+ await stream.send(next.value);
339
+ }
340
+ }
341
+ finally {
342
+ stream.signal.removeEventListener('abort', onAbort);
343
+ await iterator.return?.();
344
+ }
345
+ },
346
+ sessions: async () => {
392
347
  this._activityTracker.reportActivity();
393
- this._logger.trace(`API: sessions (client=${ctx.clientName}, eventListeners=${this._eventListeners.size})`);
348
+ this._logger.trace(`API: sessions (client=${context.clientName}, eventListeners=${this._eventListeners.size})`);
394
349
  return this.getSessionInfos();
395
- }),
396
- version: createMethod({ args: {} }, async () => {
397
- this._activityTracker.reportActivity();
398
- return {
399
- daemonApiVersion: daemonApiVersionText,
400
- pluginProtocolVersion: pluginProtocolVersionText,
401
- };
402
- }),
403
- restartSession: createMethod({
404
- args: { sessionName: z.string() },
405
- }, async (args, ctx) => {
350
+ },
351
+ restartSession: async (args) => {
406
352
  this._activityTracker.reportActivity();
407
- this._logger.debug(`Restart session "${args.sessionName}" requested (client=${ctx.clientName})`);
353
+ this._logger.debug(`Restart session "${args.sessionName}" requested (client=${context.clientName})`);
408
354
  await this._restartSession(args.sessionName);
409
355
  return this.getSessionInfos();
410
- }),
411
- openSession: createMethod({
412
- args: {
413
- name: z.string(),
414
- ref: z.string(),
415
- },
416
- }, async (args, ctx) => {
356
+ },
357
+ openSession: async (args) => {
417
358
  this._activityTracker.reportActivity();
418
- this._logger.log(`Open session "${args.name}" @ ${args.ref} requested (client=${ctx.clientName})`);
359
+ this._logger.log(`Open session "${args.name}" @ ${args.ref} requested (client=${context.clientName})`);
419
360
  return this._openDynamicSession(args.name, args.ref);
420
- }),
421
- closeSession: createMethod({
422
- args: { name: z.string() },
423
- }, async (args, ctx) => {
361
+ },
362
+ closeSession: async (args) => {
424
363
  this._activityTracker.reportActivity();
425
- this._logger.log(`Close session "${args.name}" requested (client=${ctx.clientName})`);
364
+ this._logger.log(`Close session "${args.name}" requested (client=${context.clientName})`);
426
365
  return this._closeDynamicSession(args.name);
427
- }),
428
- updateSessionRef: createMethod({
429
- args: {
430
- name: z.string(),
431
- ref: z.string(),
432
- },
433
- }, async (args, ctx) => {
366
+ },
367
+ updateSessionRef: async (args) => {
434
368
  this._activityTracker.reportActivity();
435
- this._logger.log(`Update session ref "${args.name}" → ${args.ref} requested (client=${ctx.clientName})`);
369
+ this._logger.log(`Update session ref "${args.name}" → ${args.ref} requested (client=${context.clientName})`);
436
370
  return this._updateDynamicSessionRef(args.name, args.ref);
437
- }),
438
- shutdown: createMethod({ args: {} }, async (_args, ctx) => {
439
- this._logger.debug(`Shutdown requested via API (client=${ctx.clientName})`);
440
- this.requestShutdown();
441
- }),
371
+ },
372
+ shutdown: async () => {
373
+ this._logger.debug(`Shutdown requested via API (client=${context.clientName})`);
374
+ // Let LinkRPC serialize the reply before shutting down its transport.
375
+ setImmediate(() => this.requestShutdown());
376
+ },
442
377
  });
378
+ return registration;
443
379
  }
444
380
  // -- Session access ------------------------------------------------------
445
381
  getSession(name) {
@@ -466,7 +402,7 @@ class DaemonService {
466
402
  sourceKind: 'worktree',
467
403
  serverUrl: session.serverUrl,
468
404
  sourceTreeId: reader ? session.sourceTreeId.read(reader).value : session.sourceTreeId.get().value,
469
- worktreePath: meta.worktreePath,
405
+ worktreePath: meta.worktreePath.value,
470
406
  ref: meta.ref,
471
407
  });
472
408
  }
@@ -494,7 +430,7 @@ class DaemonService {
494
430
  sourceKind: 'worktree',
495
431
  serverUrl: session.serverUrl,
496
432
  sourceTreeId: reader ? session.sourceTreeId.read(reader).value : session.sourceTreeId.get().value,
497
- worktreePath: meta.worktreePath,
433
+ worktreePath: meta.worktreePath.value,
498
434
  ref: meta.ref,
499
435
  });
500
436
  }
@@ -527,6 +463,9 @@ class DaemonService {
527
463
  let resolve;
528
464
  let done = false;
529
465
  const listener = (event) => {
466
+ if (done) {
467
+ return;
468
+ }
530
469
  if (event.type !== 'log') {
531
470
  self._logger.trace(`Event stream: ${event.type}`);
532
471
  }
@@ -544,6 +483,9 @@ class DaemonService {
544
483
  self._activityTracker.setActive(true);
545
484
  self._logger.debug(`Event stream opened (listeners: ${self._eventListeners.size})`);
546
485
  const onShutdown = () => {
486
+ if (done) {
487
+ return;
488
+ }
547
489
  done = true;
548
490
  cleanup();
549
491
  if (resolve) {
@@ -554,9 +496,16 @@ class DaemonService {
554
496
  };
555
497
  self._shutdownResolvers.push(onShutdown);
556
498
  const cleanup = () => {
499
+ if (!self._eventListeners.has(listener)) {
500
+ return;
501
+ }
557
502
  self._eventListeners.delete(listener);
558
503
  self._eventListenerCount.set(self._eventListeners.size, undefined);
559
504
  self._activityTracker.setActive(false);
505
+ const shutdownIndex = self._shutdownResolvers.indexOf(onShutdown);
506
+ if (shutdownIndex >= 0) {
507
+ self._shutdownResolvers.splice(shutdownIndex, 1);
508
+ }
560
509
  self._logger.debug(`Event stream closed (listeners: ${self._eventListeners.size})`);
561
510
  };
562
511
  return {
@@ -652,10 +601,11 @@ class DaemonService {
652
601
  // -- Shutdown ------------------------------------------------------------
653
602
  requestShutdown() {
654
603
  this._shutdownRequested = true;
655
- for (const resolve of this._shutdownResolvers) {
604
+ const resolvers = this._shutdownResolvers;
605
+ this._shutdownResolvers = [];
606
+ for (const resolve of resolvers) {
656
607
  resolve();
657
608
  }
658
- this._shutdownResolvers = [];
659
609
  }
660
610
  async dispose() {
661
611
  this.requestShutdown();
@@ -709,8 +659,6 @@ class DaemonService {
709
659
  daemonConfig: this._pipeName ? {
710
660
  pipeName: this._pipeName,
711
661
  sessionName,
712
- daemonApiVersion: daemonApiVersionText,
713
- pluginProtocolVersion: pluginProtocolVersionText,
714
662
  } : undefined,
715
663
  };
716
664
  }
@@ -967,5 +915,5 @@ function arraysEqual(a, b) {
967
915
  return true;
968
916
  }
969
917
 
970
- export { ActivityTracker, DaemonService, SourceTreeChangedError, daemonApiVersionText, pluginProtocolVersionText };
918
+ export { ActivityTracker, DaemonService, SourceTreeChangedError };
971
919
  //# sourceMappingURL=DaemonService.js.map