@agimon-ai/po-web-dashboard 0.0.0-alpha.0

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 (924) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +10 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  4. package/dist/core.cjs +222 -0
  5. package/dist/core.d.mts +21 -0
  6. package/dist/core.mjs +21 -0
  7. package/dist/index.cjs +546 -0
  8. package/dist/index.d.mts +81 -0
  9. package/dist/index.mjs +81 -0
  10. package/dist/testing.cjs +18 -0
  11. package/dist/testing.d.mts +6 -0
  12. package/dist/testing.mjs +6 -0
  13. package/dist/types/auth.cjs +20 -0
  14. package/dist/types/auth.cjs.map +1 -0
  15. package/dist/types/auth.d.mts +160 -0
  16. package/dist/types/auth.d.mts.map +1 -0
  17. package/dist/types/auth.mjs +19 -0
  18. package/dist/types/auth.mjs.map +1 -0
  19. package/dist/types/bridge.d.mts +18 -0
  20. package/dist/types/bridge.d.mts.map +1 -0
  21. package/dist/types/devProxy.cjs +41 -0
  22. package/dist/types/devProxy.cjs.map +1 -0
  23. package/dist/types/devProxy.d.mts +54 -0
  24. package/dist/types/devProxy.d.mts.map +1 -0
  25. package/dist/types/devProxy.mjs +39 -0
  26. package/dist/types/devProxy.mjs.map +1 -0
  27. package/dist/types/hub.cjs +220 -0
  28. package/dist/types/hub.cjs.map +1 -0
  29. package/dist/types/hub.d.mts +447 -0
  30. package/dist/types/hub.d.mts.map +1 -0
  31. package/dist/types/hub.mjs +179 -0
  32. package/dist/types/hub.mjs.map +1 -0
  33. package/dist/types/media.cjs +75 -0
  34. package/dist/types/media.cjs.map +1 -0
  35. package/dist/types/media.d.mts +22 -0
  36. package/dist/types/media.d.mts.map +1 -0
  37. package/dist/types/media.mjs +70 -0
  38. package/dist/types/media.mjs.map +1 -0
  39. package/dist/types/notification.cjs +19 -0
  40. package/dist/types/notification.cjs.map +1 -0
  41. package/dist/types/notification.d.mts +10 -0
  42. package/dist/types/notification.d.mts.map +1 -0
  43. package/dist/types/notification.mjs +19 -0
  44. package/dist/types/notification.mjs.map +1 -0
  45. package/dist/types/remoteAccess.cjs +92 -0
  46. package/dist/types/remoteAccess.cjs.map +1 -0
  47. package/dist/types/remoteAccess.d.mts +214 -0
  48. package/dist/types/remoteAccess.d.mts.map +1 -0
  49. package/dist/types/remoteAccess.mjs +68 -0
  50. package/dist/types/remoteAccess.mjs.map +1 -0
  51. package/dist/types/session.cjs +23 -0
  52. package/dist/types/session.cjs.map +1 -0
  53. package/dist/types/session.d.mts +29 -0
  54. package/dist/types/session.d.mts.map +1 -0
  55. package/dist/types/session.mjs +18 -0
  56. package/dist/types/session.mjs.map +1 -0
  57. package/dist/types/sessionMcp.d.mts +56 -0
  58. package/dist/types/sessionMcp.d.mts.map +1 -0
  59. package/dist/types/settings.cjs +18 -0
  60. package/dist/types/settings.cjs.map +1 -0
  61. package/dist/types/settings.d.mts +126 -0
  62. package/dist/types/settings.d.mts.map +1 -0
  63. package/dist/types/settings.mjs +12 -0
  64. package/dist/types/settings.mjs.map +1 -0
  65. package/dist/types.cjs +101 -0
  66. package/dist/types.d.mts +11 -0
  67. package/dist/types.mjs +9 -0
  68. package/dist/views.cjs +120 -0
  69. package/dist/views.d.mts +56 -0
  70. package/dist/views.mjs +56 -0
  71. package/dist/web/components/MascotMark.cjs +18 -0
  72. package/dist/web/components/MascotMark.cjs.map +1 -0
  73. package/dist/web/components/MascotMark.d.mts +9 -0
  74. package/dist/web/components/MascotMark.d.mts.map +1 -0
  75. package/dist/web/components/MascotMark.mjs +18 -0
  76. package/dist/web/components/MascotMark.mjs.map +1 -0
  77. package/dist/web/components/PluginSurface.cjs +15 -0
  78. package/dist/web/components/PluginSurface.cjs.map +1 -0
  79. package/dist/web/components/PluginSurface.d.mts +13 -0
  80. package/dist/web/components/PluginSurface.d.mts.map +1 -0
  81. package/dist/web/components/PluginSurface.mjs +15 -0
  82. package/dist/web/components/PluginSurface.mjs.map +1 -0
  83. package/dist/web/components/QrCode.cjs +37 -0
  84. package/dist/web/components/QrCode.cjs.map +1 -0
  85. package/dist/web/components/QrCode.d.mts +22 -0
  86. package/dist/web/components/QrCode.d.mts.map +1 -0
  87. package/dist/web/components/QrCode.mjs +37 -0
  88. package/dist/web/components/QrCode.mjs.map +1 -0
  89. package/dist/web/components/Remote.fixture.cjs +73 -0
  90. package/dist/web/components/Remote.fixture.cjs.map +1 -0
  91. package/dist/web/components/Remote.fixture.mjs +72 -0
  92. package/dist/web/components/Remote.fixture.mjs.map +1 -0
  93. package/dist/web/components/SessionMcp.cjs +279 -0
  94. package/dist/web/components/SessionMcp.cjs.map +1 -0
  95. package/dist/web/components/SessionMcp.d.mts +12 -0
  96. package/dist/web/components/SessionMcp.d.mts.map +1 -0
  97. package/dist/web/components/SessionMcp.mjs +278 -0
  98. package/dist/web/components/SessionMcp.mjs.map +1 -0
  99. package/dist/web/components/Story.fixture.cjs +124 -0
  100. package/dist/web/components/Story.fixture.cjs.map +1 -0
  101. package/dist/web/components/Story.fixture.d.mts +19 -0
  102. package/dist/web/components/Story.fixture.d.mts.map +1 -0
  103. package/dist/web/components/Story.fixture.mjs +119 -0
  104. package/dist/web/components/Story.fixture.mjs.map +1 -0
  105. package/dist/web/components/Template.fixture.cjs +67 -0
  106. package/dist/web/components/Template.fixture.cjs.map +1 -0
  107. package/dist/web/components/Template.fixture.d.mts +7 -0
  108. package/dist/web/components/Template.fixture.d.mts.map +1 -0
  109. package/dist/web/components/Template.fixture.mjs +65 -0
  110. package/dist/web/components/Template.fixture.mjs.map +1 -0
  111. package/dist/web/components/ToolRendererBoundary.cjs +23 -0
  112. package/dist/web/components/ToolRendererBoundary.cjs.map +1 -0
  113. package/dist/web/components/ToolRendererBoundary.d.mts +23 -0
  114. package/dist/web/components/ToolRendererBoundary.d.mts.map +1 -0
  115. package/dist/web/components/ToolRendererBoundary.mjs +23 -0
  116. package/dist/web/components/ToolRendererBoundary.mjs.map +1 -0
  117. package/dist/web/features/activity/ActivityDock.cjs +271 -0
  118. package/dist/web/features/activity/ActivityDock.cjs.map +1 -0
  119. package/dist/web/features/activity/ActivityDock.d.mts +22 -0
  120. package/dist/web/features/activity/ActivityDock.d.mts.map +1 -0
  121. package/dist/web/features/activity/ActivityDock.mjs +271 -0
  122. package/dist/web/features/activity/ActivityDock.mjs.map +1 -0
  123. package/dist/web/features/activity/ContextItemDialog.cjs +276 -0
  124. package/dist/web/features/activity/ContextItemDialog.cjs.map +1 -0
  125. package/dist/web/features/activity/ContextItemDialog.d.mts +16 -0
  126. package/dist/web/features/activity/ContextItemDialog.d.mts.map +1 -0
  127. package/dist/web/features/activity/ContextItemDialog.mjs +276 -0
  128. package/dist/web/features/activity/ContextItemDialog.mjs.map +1 -0
  129. package/dist/web/features/activity/ContextPanel.cjs +248 -0
  130. package/dist/web/features/activity/ContextPanel.cjs.map +1 -0
  131. package/dist/web/features/activity/ContextPanel.d.mts +4 -0
  132. package/dist/web/features/activity/ContextPanel.d.mts.map +1 -0
  133. package/dist/web/features/activity/ContextPanel.mjs +248 -0
  134. package/dist/web/features/activity/ContextPanel.mjs.map +1 -0
  135. package/dist/web/features/activity/DockTabs.cjs +47 -0
  136. package/dist/web/features/activity/DockTabs.cjs.map +1 -0
  137. package/dist/web/features/activity/DockTabs.d.mts +9 -0
  138. package/dist/web/features/activity/DockTabs.d.mts.map +1 -0
  139. package/dist/web/features/activity/DockTabs.mjs +47 -0
  140. package/dist/web/features/activity/DockTabs.mjs.map +1 -0
  141. package/dist/web/features/connection/RefusedCard.cjs +76 -0
  142. package/dist/web/features/connection/RefusedCard.cjs.map +1 -0
  143. package/dist/web/features/connection/RefusedCard.d.mts +5 -0
  144. package/dist/web/features/connection/RefusedCard.d.mts.map +1 -0
  145. package/dist/web/features/connection/RefusedCard.mjs +76 -0
  146. package/dist/web/features/connection/RefusedCard.mjs.map +1 -0
  147. package/dist/web/features/dialogs/DialogOverlay.cjs +164 -0
  148. package/dist/web/features/dialogs/DialogOverlay.cjs.map +1 -0
  149. package/dist/web/features/dialogs/DialogOverlay.d.mts +15 -0
  150. package/dist/web/features/dialogs/DialogOverlay.d.mts.map +1 -0
  151. package/dist/web/features/dialogs/DialogOverlay.mjs +164 -0
  152. package/dist/web/features/dialogs/DialogOverlay.mjs.map +1 -0
  153. package/dist/web/features/leader/CommandPalette.cjs +390 -0
  154. package/dist/web/features/leader/CommandPalette.cjs.map +1 -0
  155. package/dist/web/features/leader/CommandPalette.d.mts +14 -0
  156. package/dist/web/features/leader/CommandPalette.d.mts.map +1 -0
  157. package/dist/web/features/leader/CommandPalette.mjs +390 -0
  158. package/dist/web/features/leader/CommandPalette.mjs.map +1 -0
  159. package/dist/web/features/remote/DevProxyTargets.cjs +122 -0
  160. package/dist/web/features/remote/DevProxyTargets.cjs.map +1 -0
  161. package/dist/web/features/remote/DevProxyTargets.d.mts +15 -0
  162. package/dist/web/features/remote/DevProxyTargets.d.mts.map +1 -0
  163. package/dist/web/features/remote/DevProxyTargets.mjs +122 -0
  164. package/dist/web/features/remote/DevProxyTargets.mjs.map +1 -0
  165. package/dist/web/features/remote/HandoverProgress.cjs +28 -0
  166. package/dist/web/features/remote/HandoverProgress.cjs.map +1 -0
  167. package/dist/web/features/remote/HandoverProgress.d.mts +12 -0
  168. package/dist/web/features/remote/HandoverProgress.d.mts.map +1 -0
  169. package/dist/web/features/remote/HandoverProgress.mjs +28 -0
  170. package/dist/web/features/remote/HandoverProgress.mjs.map +1 -0
  171. package/dist/web/features/remote/PairedDeviceList.cjs +37 -0
  172. package/dist/web/features/remote/PairedDeviceList.cjs.map +1 -0
  173. package/dist/web/features/remote/PairedDeviceList.d.mts +5 -0
  174. package/dist/web/features/remote/PairedDeviceList.d.mts.map +1 -0
  175. package/dist/web/features/remote/PairedDeviceList.mjs +37 -0
  176. package/dist/web/features/remote/PairedDeviceList.mjs.map +1 -0
  177. package/dist/web/features/remote/PairingApprovalDialog.cjs +65 -0
  178. package/dist/web/features/remote/PairingApprovalDialog.cjs.map +1 -0
  179. package/dist/web/features/remote/PairingApprovalDialog.d.mts +11 -0
  180. package/dist/web/features/remote/PairingApprovalDialog.d.mts.map +1 -0
  181. package/dist/web/features/remote/PairingApprovalDialog.mjs +65 -0
  182. package/dist/web/features/remote/PairingApprovalDialog.mjs.map +1 -0
  183. package/dist/web/features/remote/RemoteAccessDialog.cjs +83 -0
  184. package/dist/web/features/remote/RemoteAccessDialog.cjs.map +1 -0
  185. package/dist/web/features/remote/RemoteAccessDialog.d.mts +11 -0
  186. package/dist/web/features/remote/RemoteAccessDialog.d.mts.map +1 -0
  187. package/dist/web/features/remote/RemoteAccessDialog.mjs +83 -0
  188. package/dist/web/features/remote/RemoteAccessDialog.mjs.map +1 -0
  189. package/dist/web/features/remote/RemoteAccessOptions.cjs +154 -0
  190. package/dist/web/features/remote/RemoteAccessOptions.cjs.map +1 -0
  191. package/dist/web/features/remote/RemoteAccessOptions.d.mts +11 -0
  192. package/dist/web/features/remote/RemoteAccessOptions.d.mts.map +1 -0
  193. package/dist/web/features/remote/RemoteAccessOptions.mjs +154 -0
  194. package/dist/web/features/remote/RemoteAccessOptions.mjs.map +1 -0
  195. package/dist/web/features/remote/RemoteAccessPairing.cjs +93 -0
  196. package/dist/web/features/remote/RemoteAccessPairing.cjs.map +1 -0
  197. package/dist/web/features/remote/RemoteAccessPairing.d.mts +5 -0
  198. package/dist/web/features/remote/RemoteAccessPairing.d.mts.map +1 -0
  199. package/dist/web/features/remote/RemoteAccessPairing.mjs +93 -0
  200. package/dist/web/features/remote/RemoteAccessPairing.mjs.map +1 -0
  201. package/dist/web/features/remote/SandboxWorkspaces.cjs +87 -0
  202. package/dist/web/features/remote/SandboxWorkspaces.cjs.map +1 -0
  203. package/dist/web/features/remote/SandboxWorkspaces.d.mts +7 -0
  204. package/dist/web/features/remote/SandboxWorkspaces.d.mts.map +1 -0
  205. package/dist/web/features/remote/SandboxWorkspaces.mjs +87 -0
  206. package/dist/web/features/remote/SandboxWorkspaces.mjs.map +1 -0
  207. package/dist/web/features/remote/TrustedDeviceList.cjs +65 -0
  208. package/dist/web/features/remote/TrustedDeviceList.cjs.map +1 -0
  209. package/dist/web/features/remote/TrustedDeviceList.d.mts +13 -0
  210. package/dist/web/features/remote/TrustedDeviceList.d.mts.map +1 -0
  211. package/dist/web/features/remote/TrustedDeviceList.mjs +64 -0
  212. package/dist/web/features/remote/TrustedDeviceList.mjs.map +1 -0
  213. package/dist/web/features/selection/SelectionBar.cjs +401 -0
  214. package/dist/web/features/selection/SelectionBar.cjs.map +1 -0
  215. package/dist/web/features/selection/SelectionBar.d.mts +14 -0
  216. package/dist/web/features/selection/SelectionBar.d.mts.map +1 -0
  217. package/dist/web/features/selection/SelectionBar.mjs +400 -0
  218. package/dist/web/features/selection/SelectionBar.mjs.map +1 -0
  219. package/dist/web/features/session/AgentLockPanel.cjs +31 -0
  220. package/dist/web/features/session/AgentLockPanel.cjs.map +1 -0
  221. package/dist/web/features/session/AgentLockPanel.mjs +31 -0
  222. package/dist/web/features/session/AgentLockPanel.mjs.map +1 -0
  223. package/dist/web/features/session/Composer.cjs +808 -0
  224. package/dist/web/features/session/Composer.cjs.map +1 -0
  225. package/dist/web/features/session/Composer.d.mts +21 -0
  226. package/dist/web/features/session/Composer.d.mts.map +1 -0
  227. package/dist/web/features/session/Composer.mjs +806 -0
  228. package/dist/web/features/session/Composer.mjs.map +1 -0
  229. package/dist/web/features/session/ComposerPrompt.cjs +47 -0
  230. package/dist/web/features/session/ComposerPrompt.cjs.map +1 -0
  231. package/dist/web/features/session/ComposerPrompt.d.mts +16 -0
  232. package/dist/web/features/session/ComposerPrompt.d.mts.map +1 -0
  233. package/dist/web/features/session/ComposerPrompt.mjs +47 -0
  234. package/dist/web/features/session/ComposerPrompt.mjs.map +1 -0
  235. package/dist/web/features/session/DormantPanel.cjs +61 -0
  236. package/dist/web/features/session/DormantPanel.cjs.map +1 -0
  237. package/dist/web/features/session/DormantPanel.d.mts +8 -0
  238. package/dist/web/features/session/DormantPanel.d.mts.map +1 -0
  239. package/dist/web/features/session/DormantPanel.mjs +61 -0
  240. package/dist/web/features/session/DormantPanel.mjs.map +1 -0
  241. package/dist/web/features/session/MentionPreviews.cjs +128 -0
  242. package/dist/web/features/session/MentionPreviews.cjs.map +1 -0
  243. package/dist/web/features/session/MentionPreviews.d.mts +17 -0
  244. package/dist/web/features/session/MentionPreviews.d.mts.map +1 -0
  245. package/dist/web/features/session/MentionPreviews.mjs +127 -0
  246. package/dist/web/features/session/MentionPreviews.mjs.map +1 -0
  247. package/dist/web/features/session/MessageMarkdown.cjs +20 -0
  248. package/dist/web/features/session/MessageMarkdown.cjs.map +1 -0
  249. package/dist/web/features/session/MessageMarkdown.d.mts +19 -0
  250. package/dist/web/features/session/MessageMarkdown.d.mts.map +1 -0
  251. package/dist/web/features/session/MessageMarkdown.mjs +20 -0
  252. package/dist/web/features/session/MessageMarkdown.mjs.map +1 -0
  253. package/dist/web/features/session/QueueSheet.cjs +189 -0
  254. package/dist/web/features/session/QueueSheet.cjs.map +1 -0
  255. package/dist/web/features/session/QueueSheet.d.mts +16 -0
  256. package/dist/web/features/session/QueueSheet.d.mts.map +1 -0
  257. package/dist/web/features/session/QueueSheet.mjs +189 -0
  258. package/dist/web/features/session/QueueSheet.mjs.map +1 -0
  259. package/dist/web/features/session/SessionActivity.cjs +88 -0
  260. package/dist/web/features/session/SessionActivity.cjs.map +1 -0
  261. package/dist/web/features/session/SessionActivity.d.mts +16 -0
  262. package/dist/web/features/session/SessionActivity.d.mts.map +1 -0
  263. package/dist/web/features/session/SessionActivity.mjs +87 -0
  264. package/dist/web/features/session/SessionActivity.mjs.map +1 -0
  265. package/dist/web/features/session/SessionTranscriptView.cjs +34 -0
  266. package/dist/web/features/session/SessionTranscriptView.cjs.map +1 -0
  267. package/dist/web/features/session/SessionTranscriptView.d.mts +16 -0
  268. package/dist/web/features/session/SessionTranscriptView.d.mts.map +1 -0
  269. package/dist/web/features/session/SessionTranscriptView.mjs +34 -0
  270. package/dist/web/features/session/SessionTranscriptView.mjs.map +1 -0
  271. package/dist/web/features/session/ThreadView.cjs +40 -0
  272. package/dist/web/features/session/ThreadView.cjs.map +1 -0
  273. package/dist/web/features/session/ThreadView.d.mts +18 -0
  274. package/dist/web/features/session/ThreadView.d.mts.map +1 -0
  275. package/dist/web/features/session/ThreadView.mjs +40 -0
  276. package/dist/web/features/session/ThreadView.mjs.map +1 -0
  277. package/dist/web/features/session/Timeline.cjs +620 -0
  278. package/dist/web/features/session/Timeline.cjs.map +1 -0
  279. package/dist/web/features/session/Timeline.d.mts +28 -0
  280. package/dist/web/features/session/Timeline.d.mts.map +1 -0
  281. package/dist/web/features/session/Timeline.mjs +619 -0
  282. package/dist/web/features/session/Timeline.mjs.map +1 -0
  283. package/dist/web/features/session/ToolCard.cjs +210 -0
  284. package/dist/web/features/session/ToolCard.cjs.map +1 -0
  285. package/dist/web/features/session/ToolCard.d.mts +16 -0
  286. package/dist/web/features/session/ToolCard.d.mts.map +1 -0
  287. package/dist/web/features/session/ToolCard.mjs +210 -0
  288. package/dist/web/features/session/ToolCard.mjs.map +1 -0
  289. package/dist/web/features/session/session.fixture.cjs +76 -0
  290. package/dist/web/features/session/session.fixture.cjs.map +1 -0
  291. package/dist/web/features/session/session.fixture.d.mts +6 -0
  292. package/dist/web/features/session/session.fixture.d.mts.map +1 -0
  293. package/dist/web/features/session/session.fixture.mjs +74 -0
  294. package/dist/web/features/session/session.fixture.mjs.map +1 -0
  295. package/dist/web/features/sessions/NewSessionDialog.cjs +70 -0
  296. package/dist/web/features/sessions/NewSessionDialog.cjs.map +1 -0
  297. package/dist/web/features/sessions/NewSessionDialog.d.mts +9 -0
  298. package/dist/web/features/sessions/NewSessionDialog.d.mts.map +1 -0
  299. package/dist/web/features/sessions/NewSessionDialog.mjs +70 -0
  300. package/dist/web/features/sessions/NewSessionDialog.mjs.map +1 -0
  301. package/dist/web/features/sessions/ResumeSessionDialog.cjs +131 -0
  302. package/dist/web/features/sessions/ResumeSessionDialog.cjs.map +1 -0
  303. package/dist/web/features/sessions/ResumeSessionDialog.d.mts +14 -0
  304. package/dist/web/features/sessions/ResumeSessionDialog.d.mts.map +1 -0
  305. package/dist/web/features/sessions/ResumeSessionDialog.mjs +131 -0
  306. package/dist/web/features/sessions/ResumeSessionDialog.mjs.map +1 -0
  307. package/dist/web/features/sessions/SessionRailDialogs.cjs +62 -0
  308. package/dist/web/features/sessions/SessionRailDialogs.cjs.map +1 -0
  309. package/dist/web/features/sessions/SessionRailDialogs.d.mts +10 -0
  310. package/dist/web/features/sessions/SessionRailDialogs.d.mts.map +1 -0
  311. package/dist/web/features/sessions/SessionRailDialogs.mjs +62 -0
  312. package/dist/web/features/sessions/SessionRailDialogs.mjs.map +1 -0
  313. package/dist/web/features/sessions/WelcomePanel.cjs +42 -0
  314. package/dist/web/features/sessions/WelcomePanel.cjs.map +1 -0
  315. package/dist/web/features/sessions/WelcomePanel.d.mts +16 -0
  316. package/dist/web/features/sessions/WelcomePanel.d.mts.map +1 -0
  317. package/dist/web/features/sessions/WelcomePanel.mjs +42 -0
  318. package/dist/web/features/sessions/WelcomePanel.mjs.map +1 -0
  319. package/dist/web/features/sessions/useNewSessionActions.cjs +38 -0
  320. package/dist/web/features/sessions/useNewSessionActions.cjs.map +1 -0
  321. package/dist/web/features/sessions/useNewSessionActions.d.mts +12 -0
  322. package/dist/web/features/sessions/useNewSessionActions.d.mts.map +1 -0
  323. package/dist/web/features/sessions/useNewSessionActions.mjs +38 -0
  324. package/dist/web/features/sessions/useNewSessionActions.mjs.map +1 -0
  325. package/dist/web/features/sessions/useSessionRail.cjs +302 -0
  326. package/dist/web/features/sessions/useSessionRail.cjs.map +1 -0
  327. package/dist/web/features/sessions/useSessionRail.d.mts +14 -0
  328. package/dist/web/features/sessions/useSessionRail.d.mts.map +1 -0
  329. package/dist/web/features/sessions/useSessionRail.mjs +302 -0
  330. package/dist/web/features/sessions/useSessionRail.mjs.map +1 -0
  331. package/dist/web/features/settings/AppearanceSettings.cjs +126 -0
  332. package/dist/web/features/settings/AppearanceSettings.cjs.map +1 -0
  333. package/dist/web/features/settings/AppearanceSettings.d.mts +12 -0
  334. package/dist/web/features/settings/AppearanceSettings.d.mts.map +1 -0
  335. package/dist/web/features/settings/AppearanceSettings.mjs +126 -0
  336. package/dist/web/features/settings/AppearanceSettings.mjs.map +1 -0
  337. package/dist/web/features/settings/ContributedSettings.cjs +257 -0
  338. package/dist/web/features/settings/ContributedSettings.cjs.map +1 -0
  339. package/dist/web/features/settings/ContributedSettings.d.mts +14 -0
  340. package/dist/web/features/settings/ContributedSettings.d.mts.map +1 -0
  341. package/dist/web/features/settings/ContributedSettings.mjs +257 -0
  342. package/dist/web/features/settings/ContributedSettings.mjs.map +1 -0
  343. package/dist/web/features/settings/ImageSettings.cjs +146 -0
  344. package/dist/web/features/settings/ImageSettings.cjs.map +1 -0
  345. package/dist/web/features/settings/ImageSettings.d.mts +12 -0
  346. package/dist/web/features/settings/ImageSettings.d.mts.map +1 -0
  347. package/dist/web/features/settings/ImageSettings.mjs +146 -0
  348. package/dist/web/features/settings/ImageSettings.mjs.map +1 -0
  349. package/dist/web/features/settings/LoginFlowDialog.cjs +226 -0
  350. package/dist/web/features/settings/LoginFlowDialog.cjs.map +1 -0
  351. package/dist/web/features/settings/LoginFlowDialog.d.mts +15 -0
  352. package/dist/web/features/settings/LoginFlowDialog.d.mts.map +1 -0
  353. package/dist/web/features/settings/LoginFlowDialog.mjs +225 -0
  354. package/dist/web/features/settings/LoginFlowDialog.mjs.map +1 -0
  355. package/dist/web/features/settings/NotificationSettings.cjs +69 -0
  356. package/dist/web/features/settings/NotificationSettings.cjs.map +1 -0
  357. package/dist/web/features/settings/NotificationSettings.d.mts +5 -0
  358. package/dist/web/features/settings/NotificationSettings.d.mts.map +1 -0
  359. package/dist/web/features/settings/NotificationSettings.mjs +69 -0
  360. package/dist/web/features/settings/NotificationSettings.mjs.map +1 -0
  361. package/dist/web/features/settings/PluginSettings.cjs +106 -0
  362. package/dist/web/features/settings/PluginSettings.cjs.map +1 -0
  363. package/dist/web/features/settings/PluginSettings.d.mts +10 -0
  364. package/dist/web/features/settings/PluginSettings.d.mts.map +1 -0
  365. package/dist/web/features/settings/PluginSettings.mjs +106 -0
  366. package/dist/web/features/settings/PluginSettings.mjs.map +1 -0
  367. package/dist/web/features/settings/ProviderSettings.cjs +323 -0
  368. package/dist/web/features/settings/ProviderSettings.cjs.map +1 -0
  369. package/dist/web/features/settings/ProviderSettings.d.mts +9 -0
  370. package/dist/web/features/settings/ProviderSettings.d.mts.map +1 -0
  371. package/dist/web/features/settings/ProviderSettings.mjs +323 -0
  372. package/dist/web/features/settings/ProviderSettings.mjs.map +1 -0
  373. package/dist/web/features/settings/RemoteControlSettings.cjs +50 -0
  374. package/dist/web/features/settings/RemoteControlSettings.cjs.map +1 -0
  375. package/dist/web/features/settings/RemoteControlSettings.d.mts +5 -0
  376. package/dist/web/features/settings/RemoteControlSettings.d.mts.map +1 -0
  377. package/dist/web/features/settings/RemoteControlSettings.mjs +50 -0
  378. package/dist/web/features/settings/RemoteControlSettings.mjs.map +1 -0
  379. package/dist/web/features/settings/RepositorySettings.cjs +318 -0
  380. package/dist/web/features/settings/RepositorySettings.cjs.map +1 -0
  381. package/dist/web/features/settings/RepositorySettings.d.mts +7 -0
  382. package/dist/web/features/settings/RepositorySettings.d.mts.map +1 -0
  383. package/dist/web/features/settings/RepositorySettings.mjs +318 -0
  384. package/dist/web/features/settings/RepositorySettings.mjs.map +1 -0
  385. package/dist/web/features/settings/RepositoryWorkspace.cjs +160 -0
  386. package/dist/web/features/settings/RepositoryWorkspace.cjs.map +1 -0
  387. package/dist/web/features/settings/RepositoryWorkspace.d.mts +10 -0
  388. package/dist/web/features/settings/RepositoryWorkspace.d.mts.map +1 -0
  389. package/dist/web/features/settings/RepositoryWorkspace.mjs +160 -0
  390. package/dist/web/features/settings/RepositoryWorkspace.mjs.map +1 -0
  391. package/dist/web/features/settings/SessionMcpSettings.cjs +488 -0
  392. package/dist/web/features/settings/SessionMcpSettings.cjs.map +1 -0
  393. package/dist/web/features/settings/SessionMcpSettings.d.mts +5 -0
  394. package/dist/web/features/settings/SessionMcpSettings.d.mts.map +1 -0
  395. package/dist/web/features/settings/SessionMcpSettings.mjs +488 -0
  396. package/dist/web/features/settings/SessionMcpSettings.mjs.map +1 -0
  397. package/dist/web/features/settings/SettingsMenu.cjs +135 -0
  398. package/dist/web/features/settings/SettingsMenu.cjs.map +1 -0
  399. package/dist/web/features/settings/SettingsMenu.d.mts +9 -0
  400. package/dist/web/features/settings/SettingsMenu.d.mts.map +1 -0
  401. package/dist/web/features/settings/SettingsMenu.mjs +135 -0
  402. package/dist/web/features/settings/SettingsMenu.mjs.map +1 -0
  403. package/dist/web/features/settings/SettingsPanelHost.cjs +32 -0
  404. package/dist/web/features/settings/SettingsPanelHost.cjs.map +1 -0
  405. package/dist/web/features/settings/SettingsPanelHost.d.mts +8 -0
  406. package/dist/web/features/settings/SettingsPanelHost.d.mts.map +1 -0
  407. package/dist/web/features/settings/SettingsPanelHost.mjs +32 -0
  408. package/dist/web/features/settings/SettingsPanelHost.mjs.map +1 -0
  409. package/dist/web/features/settings/TemplateSettings.cjs +177 -0
  410. package/dist/web/features/settings/TemplateSettings.cjs.map +1 -0
  411. package/dist/web/features/settings/TemplateSettings.d.mts +8 -0
  412. package/dist/web/features/settings/TemplateSettings.d.mts.map +1 -0
  413. package/dist/web/features/settings/TemplateSettings.mjs +177 -0
  414. package/dist/web/features/settings/TemplateSettings.mjs.map +1 -0
  415. package/dist/web/features/settings/TunnelSettings.cjs +182 -0
  416. package/dist/web/features/settings/TunnelSettings.cjs.map +1 -0
  417. package/dist/web/features/settings/TunnelSettings.d.mts +8 -0
  418. package/dist/web/features/settings/TunnelSettings.d.mts.map +1 -0
  419. package/dist/web/features/settings/TunnelSettings.mjs +182 -0
  420. package/dist/web/features/settings/TunnelSettings.mjs.map +1 -0
  421. package/dist/web/features/settings/settings.fixture.cjs +230 -0
  422. package/dist/web/features/settings/settings.fixture.cjs.map +1 -0
  423. package/dist/web/features/settings/settings.fixture.d.mts +6 -0
  424. package/dist/web/features/settings/settings.fixture.d.mts.map +1 -0
  425. package/dist/web/features/settings/settings.fixture.mjs +223 -0
  426. package/dist/web/features/settings/settings.fixture.mjs.map +1 -0
  427. package/dist/web/features/status/TopBar.cjs +200 -0
  428. package/dist/web/features/status/TopBar.cjs.map +1 -0
  429. package/dist/web/features/status/TopBar.d.mts +11 -0
  430. package/dist/web/features/status/TopBar.d.mts.map +1 -0
  431. package/dist/web/features/status/TopBar.mjs +200 -0
  432. package/dist/web/features/status/TopBar.mjs.map +1 -0
  433. package/dist/web/lib/authApi.cjs +77 -0
  434. package/dist/web/lib/authApi.cjs.map +1 -0
  435. package/dist/web/lib/authApi.d.mts +28 -0
  436. package/dist/web/lib/authApi.d.mts.map +1 -0
  437. package/dist/web/lib/authApi.mjs +72 -0
  438. package/dist/web/lib/authApi.mjs.map +1 -0
  439. package/dist/web/lib/browserNotifications.cjs +37 -0
  440. package/dist/web/lib/browserNotifications.cjs.map +1 -0
  441. package/dist/web/lib/browserNotifications.d.mts +12 -0
  442. package/dist/web/lib/browserNotifications.d.mts.map +1 -0
  443. package/dist/web/lib/browserNotifications.mjs +35 -0
  444. package/dist/web/lib/browserNotifications.mjs.map +1 -0
  445. package/dist/web/lib/browserTelemetry.cjs +158 -0
  446. package/dist/web/lib/browserTelemetry.cjs.map +1 -0
  447. package/dist/web/lib/browserTelemetry.d.mts +28 -0
  448. package/dist/web/lib/browserTelemetry.d.mts.map +1 -0
  449. package/dist/web/lib/browserTelemetry.mjs +154 -0
  450. package/dist/web/lib/browserTelemetry.mjs.map +1 -0
  451. package/dist/web/lib/commands.cjs +176 -0
  452. package/dist/web/lib/commands.cjs.map +1 -0
  453. package/dist/web/lib/commands.d.mts +53 -0
  454. package/dist/web/lib/commands.d.mts.map +1 -0
  455. package/dist/web/lib/commands.mjs +153 -0
  456. package/dist/web/lib/commands.mjs.map +1 -0
  457. package/dist/web/lib/composerSubmissions.cjs +20 -0
  458. package/dist/web/lib/composerSubmissions.cjs.map +1 -0
  459. package/dist/web/lib/composerSubmissions.d.mts +7 -0
  460. package/dist/web/lib/composerSubmissions.d.mts.map +1 -0
  461. package/dist/web/lib/composerSubmissions.mjs +19 -0
  462. package/dist/web/lib/composerSubmissions.mjs.map +1 -0
  463. package/dist/web/lib/composition.cjs +403 -0
  464. package/dist/web/lib/composition.cjs.map +1 -0
  465. package/dist/web/lib/composition.d.mts +137 -0
  466. package/dist/web/lib/composition.d.mts.map +1 -0
  467. package/dist/web/lib/composition.mjs +392 -0
  468. package/dist/web/lib/composition.mjs.map +1 -0
  469. package/dist/web/lib/contextComposition.cjs +132 -0
  470. package/dist/web/lib/contextComposition.cjs.map +1 -0
  471. package/dist/web/lib/contextComposition.d.mts +75 -0
  472. package/dist/web/lib/contextComposition.d.mts.map +1 -0
  473. package/dist/web/lib/contextComposition.mjs +127 -0
  474. package/dist/web/lib/contextComposition.mjs.map +1 -0
  475. package/dist/web/lib/contextDetailApi.cjs +61 -0
  476. package/dist/web/lib/contextDetailApi.cjs.map +1 -0
  477. package/dist/web/lib/contextDetailApi.d.mts +12 -0
  478. package/dist/web/lib/contextDetailApi.d.mts.map +1 -0
  479. package/dist/web/lib/contextDetailApi.mjs +61 -0
  480. package/dist/web/lib/contextDetailApi.mjs.map +1 -0
  481. package/dist/web/lib/dashboardRenderers.cjs +9 -0
  482. package/dist/web/lib/dashboardRenderers.cjs.map +1 -0
  483. package/dist/web/lib/dashboardRenderers.d.mts +12 -0
  484. package/dist/web/lib/dashboardRenderers.d.mts.map +1 -0
  485. package/dist/web/lib/dashboardRenderers.mjs +9 -0
  486. package/dist/web/lib/dashboardRenderers.mjs.map +1 -0
  487. package/dist/web/lib/dashboardRoute.cjs +27 -0
  488. package/dist/web/lib/dashboardRoute.cjs.map +1 -0
  489. package/dist/web/lib/dashboardRoute.d.mts +29 -0
  490. package/dist/web/lib/dashboardRoute.d.mts.map +1 -0
  491. package/dist/web/lib/dashboardRoute.mjs +26 -0
  492. package/dist/web/lib/dashboardRoute.mjs.map +1 -0
  493. package/dist/web/lib/dashboardTranscript.cjs +15 -0
  494. package/dist/web/lib/dashboardTranscript.cjs.map +1 -0
  495. package/dist/web/lib/dashboardTranscript.d.mts +6 -0
  496. package/dist/web/lib/dashboardTranscript.d.mts.map +1 -0
  497. package/dist/web/lib/dashboardTranscript.mjs +14 -0
  498. package/dist/web/lib/dashboardTranscript.mjs.map +1 -0
  499. package/dist/web/lib/devProxyApi.cjs +74 -0
  500. package/dist/web/lib/devProxyApi.cjs.map +1 -0
  501. package/dist/web/lib/devProxyApi.d.mts +21 -0
  502. package/dist/web/lib/devProxyApi.d.mts.map +1 -0
  503. package/dist/web/lib/devProxyApi.mjs +72 -0
  504. package/dist/web/lib/devProxyApi.mjs.map +1 -0
  505. package/dist/web/lib/fileMentions.cjs +30 -0
  506. package/dist/web/lib/fileMentions.cjs.map +1 -0
  507. package/dist/web/lib/fileMentions.d.mts +13 -0
  508. package/dist/web/lib/fileMentions.d.mts.map +1 -0
  509. package/dist/web/lib/fileMentions.mjs +29 -0
  510. package/dist/web/lib/fileMentions.mjs.map +1 -0
  511. package/dist/web/lib/hubApi.cjs +283 -0
  512. package/dist/web/lib/hubApi.cjs.map +1 -0
  513. package/dist/web/lib/hubApi.d.mts +109 -0
  514. package/dist/web/lib/hubApi.d.mts.map +1 -0
  515. package/dist/web/lib/hubApi.mjs +268 -0
  516. package/dist/web/lib/hubApi.mjs.map +1 -0
  517. package/dist/web/lib/leaderTree.cjs +150 -0
  518. package/dist/web/lib/leaderTree.cjs.map +1 -0
  519. package/dist/web/lib/leaderTree.d.mts +41 -0
  520. package/dist/web/lib/leaderTree.d.mts.map +1 -0
  521. package/dist/web/lib/leaderTree.mjs +149 -0
  522. package/dist/web/lib/leaderTree.mjs.map +1 -0
  523. package/dist/web/lib/livePush.cjs +97 -0
  524. package/dist/web/lib/livePush.cjs.map +1 -0
  525. package/dist/web/lib/livePush.d.mts +10 -0
  526. package/dist/web/lib/livePush.d.mts.map +1 -0
  527. package/dist/web/lib/livePush.mjs +94 -0
  528. package/dist/web/lib/livePush.mjs.map +1 -0
  529. package/dist/web/lib/modelContextAdapter.cjs +63 -0
  530. package/dist/web/lib/modelContextAdapter.cjs.map +1 -0
  531. package/dist/web/lib/modelContextAdapter.d.mts +11 -0
  532. package/dist/web/lib/modelContextAdapter.d.mts.map +1 -0
  533. package/dist/web/lib/modelContextAdapter.mjs +62 -0
  534. package/dist/web/lib/modelContextAdapter.mjs.map +1 -0
  535. package/dist/web/lib/piTransport.cjs +103 -0
  536. package/dist/web/lib/piTransport.cjs.map +1 -0
  537. package/dist/web/lib/piTransport.d.mts +8 -0
  538. package/dist/web/lib/piTransport.d.mts.map +1 -0
  539. package/dist/web/lib/piTransport.mjs +102 -0
  540. package/dist/web/lib/piTransport.mjs.map +1 -0
  541. package/dist/web/lib/pluginCompositions.cjs +57 -0
  542. package/dist/web/lib/pluginCompositions.cjs.map +1 -0
  543. package/dist/web/lib/pluginCompositions.d.mts +37 -0
  544. package/dist/web/lib/pluginCompositions.d.mts.map +1 -0
  545. package/dist/web/lib/pluginCompositions.mjs +52 -0
  546. package/dist/web/lib/pluginCompositions.mjs.map +1 -0
  547. package/dist/web/lib/pluginRegistry.cjs +675 -0
  548. package/dist/web/lib/pluginRegistry.cjs.map +1 -0
  549. package/dist/web/lib/pluginRegistry.d.mts +155 -0
  550. package/dist/web/lib/pluginRegistry.d.mts.map +1 -0
  551. package/dist/web/lib/pluginRegistry.mjs +633 -0
  552. package/dist/web/lib/pluginRegistry.mjs.map +1 -0
  553. package/dist/web/lib/pluginScopes.cjs +48 -0
  554. package/dist/web/lib/pluginScopes.cjs.map +1 -0
  555. package/dist/web/lib/pluginScopes.d.mts +8 -0
  556. package/dist/web/lib/pluginScopes.d.mts.map +1 -0
  557. package/dist/web/lib/pluginScopes.mjs +47 -0
  558. package/dist/web/lib/pluginScopes.mjs.map +1 -0
  559. package/dist/web/lib/pluginSlotProps.cjs +83 -0
  560. package/dist/web/lib/pluginSlotProps.cjs.map +1 -0
  561. package/dist/web/lib/pluginSlotProps.d.mts +21 -0
  562. package/dist/web/lib/pluginSlotProps.d.mts.map +1 -0
  563. package/dist/web/lib/pluginSlotProps.mjs +82 -0
  564. package/dist/web/lib/pluginSlotProps.mjs.map +1 -0
  565. package/dist/web/lib/promptFocus.cjs +30 -0
  566. package/dist/web/lib/promptFocus.cjs.map +1 -0
  567. package/dist/web/lib/promptFocus.d.mts +7 -0
  568. package/dist/web/lib/promptFocus.d.mts.map +1 -0
  569. package/dist/web/lib/promptFocus.mjs +29 -0
  570. package/dist/web/lib/promptFocus.mjs.map +1 -0
  571. package/dist/web/lib/protocolHubSocket.cjs +107 -0
  572. package/dist/web/lib/protocolHubSocket.cjs.map +1 -0
  573. package/dist/web/lib/protocolHubSocket.d.mts +18 -0
  574. package/dist/web/lib/protocolHubSocket.d.mts.map +1 -0
  575. package/dist/web/lib/protocolHubSocket.mjs +107 -0
  576. package/dist/web/lib/protocolHubSocket.mjs.map +1 -0
  577. package/dist/web/lib/protocolTimeline.cjs +86 -0
  578. package/dist/web/lib/protocolTimeline.cjs.map +1 -0
  579. package/dist/web/lib/protocolTimeline.d.mts +9 -0
  580. package/dist/web/lib/protocolTimeline.d.mts.map +1 -0
  581. package/dist/web/lib/protocolTimeline.mjs +85 -0
  582. package/dist/web/lib/protocolTimeline.mjs.map +1 -0
  583. package/dist/web/lib/qrMatrix.cjs +37 -0
  584. package/dist/web/lib/qrMatrix.cjs.map +1 -0
  585. package/dist/web/lib/qrMatrix.d.mts +5 -0
  586. package/dist/web/lib/qrMatrix.d.mts.map +1 -0
  587. package/dist/web/lib/qrMatrix.mjs +35 -0
  588. package/dist/web/lib/qrMatrix.mjs.map +1 -0
  589. package/dist/web/lib/remoteApi.cjs +100 -0
  590. package/dist/web/lib/remoteApi.cjs.map +1 -0
  591. package/dist/web/lib/remoteApi.d.mts +45 -0
  592. package/dist/web/lib/remoteApi.d.mts.map +1 -0
  593. package/dist/web/lib/remoteApi.mjs +92 -0
  594. package/dist/web/lib/remoteApi.mjs.map +1 -0
  595. package/dist/web/lib/sealedSession.cjs +81 -0
  596. package/dist/web/lib/sealedSession.cjs.map +1 -0
  597. package/dist/web/lib/sealedSession.d.mts +24 -0
  598. package/dist/web/lib/sealedSession.d.mts.map +1 -0
  599. package/dist/web/lib/sealedSession.mjs +75 -0
  600. package/dist/web/lib/sealedSession.mjs.map +1 -0
  601. package/dist/web/lib/sessionActivityRenderer.cjs +19 -0
  602. package/dist/web/lib/sessionActivityRenderer.cjs.map +1 -0
  603. package/dist/web/lib/sessionActivityRenderer.d.mts +10 -0
  604. package/dist/web/lib/sessionActivityRenderer.d.mts.map +1 -0
  605. package/dist/web/lib/sessionActivityRenderer.mjs +17 -0
  606. package/dist/web/lib/sessionActivityRenderer.mjs.map +1 -0
  607. package/dist/web/lib/sessionAsset.cjs +45 -0
  608. package/dist/web/lib/sessionAsset.cjs.map +1 -0
  609. package/dist/web/lib/sessionAsset.d.mts +17 -0
  610. package/dist/web/lib/sessionAsset.d.mts.map +1 -0
  611. package/dist/web/lib/sessionAsset.mjs +44 -0
  612. package/dist/web/lib/sessionAsset.mjs.map +1 -0
  613. package/dist/web/lib/sessionAvatar.cjs +18 -0
  614. package/dist/web/lib/sessionAvatar.cjs.map +1 -0
  615. package/dist/web/lib/sessionAvatar.d.mts +10 -0
  616. package/dist/web/lib/sessionAvatar.d.mts.map +1 -0
  617. package/dist/web/lib/sessionAvatar.mjs +18 -0
  618. package/dist/web/lib/sessionAvatar.mjs.map +1 -0
  619. package/dist/web/lib/sessionMcpApi.cjs +120 -0
  620. package/dist/web/lib/sessionMcpApi.cjs.map +1 -0
  621. package/dist/web/lib/sessionMcpApi.d.mts +27 -0
  622. package/dist/web/lib/sessionMcpApi.d.mts.map +1 -0
  623. package/dist/web/lib/sessionMcpApi.mjs +114 -0
  624. package/dist/web/lib/sessionMcpApi.mjs.map +1 -0
  625. package/dist/web/lib/sessionMcpPrompt.cjs +24 -0
  626. package/dist/web/lib/sessionMcpPrompt.cjs.map +1 -0
  627. package/dist/web/lib/sessionMcpPrompt.mjs +23 -0
  628. package/dist/web/lib/sessionMcpPrompt.mjs.map +1 -0
  629. package/dist/web/lib/sessionModel.cjs +970 -0
  630. package/dist/web/lib/sessionModel.cjs.map +1 -0
  631. package/dist/web/lib/sessionModel.d.mts +254 -0
  632. package/dist/web/lib/sessionModel.d.mts.map +1 -0
  633. package/dist/web/lib/sessionModel.mjs +958 -0
  634. package/dist/web/lib/sessionModel.mjs.map +1 -0
  635. package/dist/web/lib/sessionProtocolCommands.cjs +196 -0
  636. package/dist/web/lib/sessionProtocolCommands.cjs.map +1 -0
  637. package/dist/web/lib/sessionProtocolCommands.d.mts +15 -0
  638. package/dist/web/lib/sessionProtocolCommands.d.mts.map +1 -0
  639. package/dist/web/lib/sessionProtocolCommands.mjs +193 -0
  640. package/dist/web/lib/sessionProtocolCommands.mjs.map +1 -0
  641. package/dist/web/lib/sessionRailModel.cjs +107 -0
  642. package/dist/web/lib/sessionRailModel.cjs.map +1 -0
  643. package/dist/web/lib/sessionRailModel.d.mts +38 -0
  644. package/dist/web/lib/sessionRailModel.d.mts.map +1 -0
  645. package/dist/web/lib/sessionRailModel.mjs +104 -0
  646. package/dist/web/lib/sessionRailModel.mjs.map +1 -0
  647. package/dist/web/lib/sessionSummary.cjs +58 -0
  648. package/dist/web/lib/sessionSummary.cjs.map +1 -0
  649. package/dist/web/lib/sessionSummary.d.mts +39 -0
  650. package/dist/web/lib/sessionSummary.d.mts.map +1 -0
  651. package/dist/web/lib/sessionSummary.mjs +54 -0
  652. package/dist/web/lib/sessionSummary.mjs.map +1 -0
  653. package/dist/web/lib/sessionTranscriptRenderer.cjs +19 -0
  654. package/dist/web/lib/sessionTranscriptRenderer.cjs.map +1 -0
  655. package/dist/web/lib/sessionTranscriptRenderer.d.mts +11 -0
  656. package/dist/web/lib/sessionTranscriptRenderer.d.mts.map +1 -0
  657. package/dist/web/lib/sessionTranscriptRenderer.mjs +17 -0
  658. package/dist/web/lib/sessionTranscriptRenderer.mjs.map +1 -0
  659. package/dist/web/lib/settingsApi.cjs +237 -0
  660. package/dist/web/lib/settingsApi.cjs.map +1 -0
  661. package/dist/web/lib/settingsApi.d.mts +57 -0
  662. package/dist/web/lib/settingsApi.d.mts.map +1 -0
  663. package/dist/web/lib/settingsApi.mjs +230 -0
  664. package/dist/web/lib/settingsApi.mjs.map +1 -0
  665. package/dist/web/lib/settingsDraft.cjs +48 -0
  666. package/dist/web/lib/settingsDraft.cjs.map +1 -0
  667. package/dist/web/lib/settingsDraft.d.mts +28 -0
  668. package/dist/web/lib/settingsDraft.d.mts.map +1 -0
  669. package/dist/web/lib/settingsDraft.mjs +45 -0
  670. package/dist/web/lib/settingsDraft.mjs.map +1 -0
  671. package/dist/web/lib/settingsSections.cjs +108 -0
  672. package/dist/web/lib/settingsSections.cjs.map +1 -0
  673. package/dist/web/lib/settingsSections.d.mts +36 -0
  674. package/dist/web/lib/settingsSections.d.mts.map +1 -0
  675. package/dist/web/lib/settingsSections.mjs +105 -0
  676. package/dist/web/lib/settingsSections.mjs.map +1 -0
  677. package/dist/web/lib/statusLine.cjs +82 -0
  678. package/dist/web/lib/statusLine.cjs.map +1 -0
  679. package/dist/web/lib/statusLine.d.mts +27 -0
  680. package/dist/web/lib/statusLine.d.mts.map +1 -0
  681. package/dist/web/lib/statusLine.mjs +79 -0
  682. package/dist/web/lib/statusLine.mjs.map +1 -0
  683. package/dist/web/lib/stepUp.cjs +41 -0
  684. package/dist/web/lib/stepUp.cjs.map +1 -0
  685. package/dist/web/lib/stepUp.d.mts +18 -0
  686. package/dist/web/lib/stepUp.d.mts.map +1 -0
  687. package/dist/web/lib/stepUp.mjs +41 -0
  688. package/dist/web/lib/stepUp.mjs.map +1 -0
  689. package/dist/web/lib/templateCatalog.cjs +123 -0
  690. package/dist/web/lib/templateCatalog.cjs.map +1 -0
  691. package/dist/web/lib/templateCatalog.d.mts +38 -0
  692. package/dist/web/lib/templateCatalog.d.mts.map +1 -0
  693. package/dist/web/lib/templateCatalog.mjs +118 -0
  694. package/dist/web/lib/templateCatalog.mjs.map +1 -0
  695. package/dist/web/lib/threadRenderer.cjs +25 -0
  696. package/dist/web/lib/threadRenderer.cjs.map +1 -0
  697. package/dist/web/lib/threadRenderer.d.mts +17 -0
  698. package/dist/web/lib/threadRenderer.d.mts.map +1 -0
  699. package/dist/web/lib/threadRenderer.mjs +23 -0
  700. package/dist/web/lib/threadRenderer.mjs.map +1 -0
  701. package/dist/web/lib/timelineGroups.cjs +83 -0
  702. package/dist/web/lib/timelineGroups.cjs.map +1 -0
  703. package/dist/web/lib/timelineGroups.d.mts +36 -0
  704. package/dist/web/lib/timelineGroups.d.mts.map +1 -0
  705. package/dist/web/lib/timelineGroups.mjs +81 -0
  706. package/dist/web/lib/timelineGroups.mjs.map +1 -0
  707. package/dist/web/lib/toolCompletionTabs.cjs +98 -0
  708. package/dist/web/lib/toolCompletionTabs.cjs.map +1 -0
  709. package/dist/web/lib/toolCompletionTabs.d.mts +14 -0
  710. package/dist/web/lib/toolCompletionTabs.d.mts.map +1 -0
  711. package/dist/web/lib/toolCompletionTabs.mjs +98 -0
  712. package/dist/web/lib/toolCompletionTabs.mjs.map +1 -0
  713. package/dist/web/lib/toolMessageProps.cjs +19 -0
  714. package/dist/web/lib/toolMessageProps.cjs.map +1 -0
  715. package/dist/web/lib/toolMessageProps.d.mts +7 -0
  716. package/dist/web/lib/toolMessageProps.d.mts.map +1 -0
  717. package/dist/web/lib/toolMessageProps.mjs +19 -0
  718. package/dist/web/lib/toolMessageProps.mjs.map +1 -0
  719. package/dist/web/lib/toolPrompt.cjs +44 -0
  720. package/dist/web/lib/toolPrompt.cjs.map +1 -0
  721. package/dist/web/lib/toolPrompt.d.mts +34 -0
  722. package/dist/web/lib/toolPrompt.d.mts.map +1 -0
  723. package/dist/web/lib/toolPrompt.mjs +44 -0
  724. package/dist/web/lib/toolPrompt.mjs.map +1 -0
  725. package/dist/web/lib/transport.cjs +57 -0
  726. package/dist/web/lib/transport.cjs.map +1 -0
  727. package/dist/web/lib/transport.d.mts +40 -0
  728. package/dist/web/lib/transport.d.mts.map +1 -0
  729. package/dist/web/lib/transport.mjs +50 -0
  730. package/dist/web/lib/transport.mjs.map +1 -0
  731. package/dist/web/lib/useSessionMcp.cjs +65 -0
  732. package/dist/web/lib/useSessionMcp.cjs.map +1 -0
  733. package/dist/web/lib/useSessionMcp.d.mts +15 -0
  734. package/dist/web/lib/useSessionMcp.d.mts.map +1 -0
  735. package/dist/web/lib/useSessionMcp.mjs +65 -0
  736. package/dist/web/lib/useSessionMcp.mjs.map +1 -0
  737. package/dist/web/lib/webauthnClient.cjs +110 -0
  738. package/dist/web/lib/webauthnClient.cjs.map +1 -0
  739. package/dist/web/lib/webauthnClient.d.mts +32 -0
  740. package/dist/web/lib/webauthnClient.d.mts.map +1 -0
  741. package/dist/web/lib/webauthnClient.mjs +106 -0
  742. package/dist/web/lib/webauthnClient.mjs.map +1 -0
  743. package/dist/web/lib/webmcpSimulator.cjs +105 -0
  744. package/dist/web/lib/webmcpSimulator.cjs.map +1 -0
  745. package/dist/web/lib/webmcpSimulator.mjs +105 -0
  746. package/dist/web/lib/webmcpSimulator.mjs.map +1 -0
  747. package/dist/web/stores/captureStore.cjs +137 -0
  748. package/dist/web/stores/captureStore.cjs.map +1 -0
  749. package/dist/web/stores/captureStore.d.mts +13 -0
  750. package/dist/web/stores/captureStore.d.mts.map +1 -0
  751. package/dist/web/stores/captureStore.mjs +133 -0
  752. package/dist/web/stores/captureStore.mjs.map +1 -0
  753. package/dist/web/stores/composerStore.cjs +390 -0
  754. package/dist/web/stores/composerStore.cjs.map +1 -0
  755. package/dist/web/stores/composerStore.d.mts +101 -0
  756. package/dist/web/stores/composerStore.d.mts.map +1 -0
  757. package/dist/web/stores/composerStore.mjs +370 -0
  758. package/dist/web/stores/composerStore.mjs.map +1 -0
  759. package/dist/web/stores/composerSubmissionStore.cjs +88 -0
  760. package/dist/web/stores/composerSubmissionStore.cjs.map +1 -0
  761. package/dist/web/stores/composerSubmissionStore.d.mts +11 -0
  762. package/dist/web/stores/composerSubmissionStore.d.mts.map +1 -0
  763. package/dist/web/stores/composerSubmissionStore.mjs +87 -0
  764. package/dist/web/stores/composerSubmissionStore.mjs.map +1 -0
  765. package/dist/web/stores/dashboardStateStore.cjs +35 -0
  766. package/dist/web/stores/dashboardStateStore.cjs.map +1 -0
  767. package/dist/web/stores/dashboardStateStore.d.mts +11 -0
  768. package/dist/web/stores/dashboardStateStore.d.mts.map +1 -0
  769. package/dist/web/stores/dashboardStateStore.mjs +33 -0
  770. package/dist/web/stores/dashboardStateStore.mjs.map +1 -0
  771. package/dist/web/stores/devProxyStore.cjs +76 -0
  772. package/dist/web/stores/devProxyStore.cjs.map +1 -0
  773. package/dist/web/stores/devProxyStore.d.mts +25 -0
  774. package/dist/web/stores/devProxyStore.d.mts.map +1 -0
  775. package/dist/web/stores/devProxyStore.mjs +73 -0
  776. package/dist/web/stores/devProxyStore.mjs.map +1 -0
  777. package/dist/web/stores/dialogDraftStore.cjs +38 -0
  778. package/dist/web/stores/dialogDraftStore.cjs.map +1 -0
  779. package/dist/web/stores/dialogDraftStore.d.mts +13 -0
  780. package/dist/web/stores/dialogDraftStore.d.mts.map +1 -0
  781. package/dist/web/stores/dialogDraftStore.mjs +36 -0
  782. package/dist/web/stores/dialogDraftStore.mjs.map +1 -0
  783. package/dist/web/stores/fileLinkModesStore.cjs +20 -0
  784. package/dist/web/stores/fileLinkModesStore.cjs.map +1 -0
  785. package/dist/web/stores/fileLinkModesStore.d.mts +5 -0
  786. package/dist/web/stores/fileLinkModesStore.d.mts.map +1 -0
  787. package/dist/web/stores/fileLinkModesStore.mjs +20 -0
  788. package/dist/web/stores/fileLinkModesStore.mjs.map +1 -0
  789. package/dist/web/stores/menuStore.cjs +85 -0
  790. package/dist/web/stores/menuStore.cjs.map +1 -0
  791. package/dist/web/stores/menuStore.d.mts +42 -0
  792. package/dist/web/stores/menuStore.d.mts.map +1 -0
  793. package/dist/web/stores/menuStore.mjs +79 -0
  794. package/dist/web/stores/menuStore.mjs.map +1 -0
  795. package/dist/web/stores/newSessionStore.cjs +93 -0
  796. package/dist/web/stores/newSessionStore.cjs.map +1 -0
  797. package/dist/web/stores/newSessionStore.d.mts +30 -0
  798. package/dist/web/stores/newSessionStore.d.mts.map +1 -0
  799. package/dist/web/stores/newSessionStore.mjs +86 -0
  800. package/dist/web/stores/newSessionStore.mjs.map +1 -0
  801. package/dist/web/stores/pagedTranscriptStore.cjs +235 -0
  802. package/dist/web/stores/pagedTranscriptStore.cjs.map +1 -0
  803. package/dist/web/stores/pagedTranscriptStore.d.mts +12 -0
  804. package/dist/web/stores/pagedTranscriptStore.d.mts.map +1 -0
  805. package/dist/web/stores/pagedTranscriptStore.mjs +235 -0
  806. package/dist/web/stores/pagedTranscriptStore.mjs.map +1 -0
  807. package/dist/web/stores/paletteStore.cjs +37 -0
  808. package/dist/web/stores/paletteStore.cjs.map +1 -0
  809. package/dist/web/stores/paletteStore.d.mts +14 -0
  810. package/dist/web/stores/paletteStore.d.mts.map +1 -0
  811. package/dist/web/stores/paletteStore.mjs +34 -0
  812. package/dist/web/stores/paletteStore.mjs.map +1 -0
  813. package/dist/web/stores/railDialogStore.cjs +105 -0
  814. package/dist/web/stores/railDialogStore.cjs.map +1 -0
  815. package/dist/web/stores/railDialogStore.d.mts +32 -0
  816. package/dist/web/stores/railDialogStore.d.mts.map +1 -0
  817. package/dist/web/stores/railDialogStore.mjs +97 -0
  818. package/dist/web/stores/railDialogStore.mjs.map +1 -0
  819. package/dist/web/stores/remoteAccessStore.cjs +216 -0
  820. package/dist/web/stores/remoteAccessStore.cjs.map +1 -0
  821. package/dist/web/stores/remoteAccessStore.d.mts +48 -0
  822. package/dist/web/stores/remoteAccessStore.d.mts.map +1 -0
  823. package/dist/web/stores/remoteAccessStore.mjs +202 -0
  824. package/dist/web/stores/remoteAccessStore.mjs.map +1 -0
  825. package/dist/web/stores/sessionChannelHoldsStore.cjs +43 -0
  826. package/dist/web/stores/sessionChannelHoldsStore.cjs.map +1 -0
  827. package/dist/web/stores/sessionChannelHoldsStore.d.mts +9 -0
  828. package/dist/web/stores/sessionChannelHoldsStore.d.mts.map +1 -0
  829. package/dist/web/stores/sessionChannelHoldsStore.mjs +42 -0
  830. package/dist/web/stores/sessionChannelHoldsStore.mjs.map +1 -0
  831. package/dist/web/stores/sessionStore.cjs +610 -0
  832. package/dist/web/stores/sessionStore.cjs.map +1 -0
  833. package/dist/web/stores/sessionStore.d.mts +116 -0
  834. package/dist/web/stores/sessionStore.d.mts.map +1 -0
  835. package/dist/web/stores/sessionStore.mjs +568 -0
  836. package/dist/web/stores/sessionStore.mjs.map +1 -0
  837. package/dist/web/stores/sessionsStore.cjs +272 -0
  838. package/dist/web/stores/sessionsStore.cjs.map +1 -0
  839. package/dist/web/stores/sessionsStore.d.mts +74 -0
  840. package/dist/web/stores/sessionsStore.d.mts.map +1 -0
  841. package/dist/web/stores/sessionsStore.mjs +257 -0
  842. package/dist/web/stores/sessionsStore.mjs.map +1 -0
  843. package/dist/web/stores/settingsDraftStore.cjs +138 -0
  844. package/dist/web/stores/settingsDraftStore.cjs.map +1 -0
  845. package/dist/web/stores/settingsDraftStore.d.mts +27 -0
  846. package/dist/web/stores/settingsDraftStore.d.mts.map +1 -0
  847. package/dist/web/stores/settingsDraftStore.mjs +132 -0
  848. package/dist/web/stores/settingsDraftStore.mjs.map +1 -0
  849. package/dist/web/stores/templateStore.cjs +136 -0
  850. package/dist/web/stores/templateStore.cjs.map +1 -0
  851. package/dist/web/stores/templateStore.d.mts +20 -0
  852. package/dist/web/stores/templateStore.d.mts.map +1 -0
  853. package/dist/web/stores/templateStore.mjs +131 -0
  854. package/dist/web/stores/templateStore.mjs.map +1 -0
  855. package/dist/web/stores/themeStore.cjs +42 -0
  856. package/dist/web/stores/themeStore.cjs.map +1 -0
  857. package/dist/web/stores/themeStore.d.mts +20 -0
  858. package/dist/web/stores/themeStore.d.mts.map +1 -0
  859. package/dist/web/stores/themeStore.mjs +39 -0
  860. package/dist/web/stores/themeStore.mjs.map +1 -0
  861. package/dist/web/stores/threadStore.cjs +122 -0
  862. package/dist/web/stores/threadStore.cjs.map +1 -0
  863. package/dist/web/stores/threadStore.d.mts +24 -0
  864. package/dist/web/stores/threadStore.d.mts.map +1 -0
  865. package/dist/web/stores/threadStore.mjs +114 -0
  866. package/dist/web/stores/threadStore.mjs.map +1 -0
  867. package/dist/web/stores/toolPromptStore.cjs +15 -0
  868. package/dist/web/stores/toolPromptStore.cjs.map +1 -0
  869. package/dist/web/stores/toolPromptStore.d.mts +23 -0
  870. package/dist/web/stores/toolPromptStore.d.mts.map +1 -0
  871. package/dist/web/stores/toolPromptStore.mjs +14 -0
  872. package/dist/web/stores/toolPromptStore.mjs.map +1 -0
  873. package/dist/web/stores/transientTabsStore.cjs +66 -0
  874. package/dist/web/stores/transientTabsStore.cjs.map +1 -0
  875. package/dist/web/stores/transientTabsStore.d.mts +21 -0
  876. package/dist/web/stores/transientTabsStore.d.mts.map +1 -0
  877. package/dist/web/stores/transientTabsStore.mjs +59 -0
  878. package/dist/web/stores/transientTabsStore.mjs.map +1 -0
  879. package/dist/web/stores/uiStore.cjs +47 -0
  880. package/dist/web/stores/uiStore.cjs.map +1 -0
  881. package/dist/web/stores/uiStore.d.mts +18 -0
  882. package/dist/web/stores/uiStore.d.mts.map +1 -0
  883. package/dist/web/stores/uiStore.mjs +45 -0
  884. package/dist/web/stores/uiStore.mjs.map +1 -0
  885. package/dist/web/stores/useOpenTab.cjs +31 -0
  886. package/dist/web/stores/useOpenTab.cjs.map +1 -0
  887. package/dist/web/stores/useOpenTab.d.mts +9 -0
  888. package/dist/web/stores/useOpenTab.d.mts.map +1 -0
  889. package/dist/web/stores/useOpenTab.mjs +31 -0
  890. package/dist/web/stores/useOpenTab.mjs.map +1 -0
  891. package/dist/web/stores/usePluginSlotProps.cjs +115 -0
  892. package/dist/web/stores/usePluginSlotProps.cjs.map +1 -0
  893. package/dist/web/stores/usePluginSlotProps.d.mts +6 -0
  894. package/dist/web/stores/usePluginSlotProps.d.mts.map +1 -0
  895. package/dist/web/stores/usePluginSlotProps.mjs +115 -0
  896. package/dist/web/stores/usePluginSlotProps.mjs.map +1 -0
  897. package/dist/web/stores/useToolPrompt.cjs +42 -0
  898. package/dist/web/stores/useToolPrompt.cjs.map +1 -0
  899. package/dist/web/stores/useToolPrompt.d.mts +14 -0
  900. package/dist/web/stores/useToolPrompt.d.mts.map +1 -0
  901. package/dist/web/stores/useToolPrompt.mjs +42 -0
  902. package/dist/web/stores/useToolPrompt.mjs.map +1 -0
  903. package/dist/web/stores/useWebPluginRegistry.cjs +11 -0
  904. package/dist/web/stores/useWebPluginRegistry.cjs.map +1 -0
  905. package/dist/web/stores/useWebPluginRegistry.d.mts +5 -0
  906. package/dist/web/stores/useWebPluginRegistry.d.mts.map +1 -0
  907. package/dist/web/stores/useWebPluginRegistry.mjs +11 -0
  908. package/dist/web/stores/useWebPluginRegistry.mjs.map +1 -0
  909. package/dist/web/stores/workspaceAdmissionStore.cjs +67 -0
  910. package/dist/web/stores/workspaceAdmissionStore.cjs.map +1 -0
  911. package/dist/web/stores/workspaceAdmissionStore.d.mts +24 -0
  912. package/dist/web/stores/workspaceAdmissionStore.d.mts.map +1 -0
  913. package/dist/web/stores/workspaceAdmissionStore.mjs +64 -0
  914. package/dist/web/stores/workspaceAdmissionStore.mjs.map +1 -0
  915. package/dist/web/stores/workspacesStore.cjs +83 -0
  916. package/dist/web/stores/workspacesStore.cjs.map +1 -0
  917. package/dist/web/stores/workspacesStore.d.mts +17 -0
  918. package/dist/web/stores/workspacesStore.d.mts.map +1 -0
  919. package/dist/web/stores/workspacesStore.mjs +78 -0
  920. package/dist/web/stores/workspacesStore.mjs.map +1 -0
  921. package/llms.txt +3 -0
  922. package/package.json +107 -0
  923. package/styles/dashboard.css +2 -0
  924. package/styles/preview.css +3 -0
@@ -0,0 +1,74 @@
1
+ const require_sealedSession = require("./sealedSession.cjs");
2
+ const require_devProxy = require("../../types/devProxy.cjs");
3
+ //#region src/web/lib/devProxyApi.ts
4
+ /**
5
+ * The dev proxy control plane, seen from the browser.
6
+ *
7
+ * Every call goes through the sealed session for the same reason the rest of
8
+ * the cockpit does: on a tunnel, an unsealed `/api/` request is refused. The
9
+ * proxied dev site itself is the deliberate exception, and it never comes
10
+ * through here, because the browser fetches those bytes on its own.
11
+ */
12
+ const UNREACHABLE = "The cockpit hub is unreachable.";
13
+ const JSON_HEADERS = { "Content-Type": "application/json" };
14
+ const NO_CONTENT = 204;
15
+ function isRecord(value) {
16
+ return typeof value === "object" && value !== null && !Array.isArray(value);
17
+ }
18
+ async function readError(response) {
19
+ try {
20
+ const body = await response.json();
21
+ if (isRecord(body) && typeof body.error === "string") return body.error;
22
+ } catch {}
23
+ return `The hub answered ${String(response.status)}.`;
24
+ }
25
+ async function fetchDevProxyTargets() {
26
+ let response;
27
+ try {
28
+ response = await require_sealedSession.sealedHttpSession.fetch(require_devProxy.DEV_PROXY_TARGETS_ROUTE);
29
+ } catch {
30
+ return { error: UNREACHABLE };
31
+ }
32
+ if (!response.ok) return { error: await readError(response) };
33
+ const body = await response.json().catch(() => void 0);
34
+ if (!isRecord(body) || !Array.isArray(body.targets)) return { error: "The hub sent no dev proxy targets." };
35
+ return { state: {
36
+ targets: body.targets,
37
+ canRegister: body.canRegister === true
38
+ } };
39
+ }
40
+ async function addDevProxyTarget(name, port) {
41
+ let response;
42
+ try {
43
+ response = await require_sealedSession.sealedHttpSession.fetch(require_devProxy.DEV_PROXY_TARGETS_ROUTE, {
44
+ method: "POST",
45
+ headers: JSON_HEADERS,
46
+ body: JSON.stringify({
47
+ name,
48
+ port
49
+ })
50
+ });
51
+ } catch {
52
+ return { error: UNREACHABLE };
53
+ }
54
+ if (!response.ok) return { error: await readError(response) };
55
+ const body = await response.json().catch(() => void 0);
56
+ if (!isRecord(body) || !isRecord(body.target)) return { error: "The hub did not confirm the target." };
57
+ return { target: body.target };
58
+ }
59
+ async function removeDevProxyTarget(name) {
60
+ let response;
61
+ try {
62
+ response = await require_sealedSession.sealedHttpSession.fetch(`${require_devProxy.DEV_PROXY_TARGETS_ROUTE}/${encodeURIComponent(name)}`, { method: "DELETE" });
63
+ } catch {
64
+ return { error: UNREACHABLE };
65
+ }
66
+ if (response.status !== NO_CONTENT && !response.ok) return { error: await readError(response) };
67
+ return { ok: true };
68
+ }
69
+ //#endregion
70
+ exports.addDevProxyTarget = addDevProxyTarget;
71
+ exports.fetchDevProxyTargets = fetchDevProxyTargets;
72
+ exports.removeDevProxyTarget = removeDevProxyTarget;
73
+
74
+ //# sourceMappingURL=devProxyApi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devProxyApi.cjs","names":["sealedHttpSession","DEV_PROXY_TARGETS_ROUTE"],"sources":["../../../src/web/lib/devProxyApi.ts"],"sourcesContent":["import { DEV_PROXY_TARGETS_ROUTE, type DevProxyStateView, type DevProxyTarget } from '../../types/devProxy';\nimport { sealedHttpSession } from './sealedSession';\n\n/**\n * The dev proxy control plane, seen from the browser.\n *\n * Every call goes through the sealed session for the same reason the rest of\n * the cockpit does: on a tunnel, an unsealed `/api/` request is refused. The\n * proxied dev site itself is the deliberate exception, and it never comes\n * through here, because the browser fetches those bytes on its own.\n */\n\nconst UNREACHABLE = 'The cockpit hub is unreachable.';\nconst JSON_HEADERS = { 'Content-Type': 'application/json' };\nconst NO_CONTENT = 204;\n\nexport type TargetsResult = { state: DevProxyStateView } | { error: string };\nexport type TargetResult = { target: DevProxyTarget } | { error: string };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function readError(response: Response): Promise<string> {\n try {\n const body: unknown = await response.json();\n if (isRecord(body) && typeof body.error === 'string') return body.error;\n } catch {\n // A body that is not JSON tells us nothing the status has not already.\n }\n return `The hub answered ${String(response.status)}.`;\n}\n\nexport async function fetchDevProxyTargets(): Promise<TargetsResult> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(DEV_PROXY_TARGETS_ROUTE);\n } catch {\n return { error: UNREACHABLE };\n }\n if (!response.ok) return { error: await readError(response) };\n const body: unknown = await response.json().catch(() => undefined);\n if (!isRecord(body) || !Array.isArray(body.targets)) return { error: 'The hub sent no dev proxy targets.' };\n return {\n state: { targets: body.targets as DevProxyTarget[], canRegister: body.canRegister === true },\n };\n}\n\nexport async function addDevProxyTarget(name: string, port: number): Promise<TargetResult> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(DEV_PROXY_TARGETS_ROUTE, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({ name, port }),\n });\n } catch {\n return { error: UNREACHABLE };\n }\n if (!response.ok) return { error: await readError(response) };\n const body: unknown = await response.json().catch(() => undefined);\n if (!isRecord(body) || !isRecord(body.target)) return { error: 'The hub did not confirm the target.' };\n return { target: body.target as unknown as DevProxyTarget };\n}\n\nexport async function removeDevProxyTarget(name: string): Promise<{ ok: true } | { error: string }> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(`${DEV_PROXY_TARGETS_ROUTE}/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n } catch {\n return { error: UNREACHABLE };\n }\n if (response.status !== NO_CONTENT && !response.ok) return { error: await readError(response) };\n return { ok: true };\n}\n"],"mappings":";;;;;;;;;;;AAYA,MAAM,cAAc;AACpB,MAAM,eAAe,EAAE,gBAAgB,mBAAmB;AAC1D,MAAM,aAAa;AAKnB,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,eAAe,UAAU,UAAqC;CAC5D,IAAI;EACF,MAAM,OAAgB,MAAM,SAAS,KAAK;EAC1C,IAAI,SAAS,IAAI,KAAK,OAAO,KAAK,UAAU,UAAU,OAAO,KAAK;CACpE,QAAQ,CAER;CACA,OAAO,oBAAoB,OAAO,SAAS,MAAM,EAAE;AACrD;AAEA,eAAsB,uBAA+C;CACnE,IAAI;CACJ,IAAI;EACF,WAAW,MAAMA,sBAAAA,kBAAkB,MAAMC,iBAAAA,uBAAuB;CAClE,QAAQ;EACN,OAAO,EAAE,OAAO,YAAY;CAC9B;CACA,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,UAAU,QAAQ,EAAE;CAC5D,MAAM,OAAgB,MAAM,SAAS,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACjE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,OAAO,GAAG,OAAO,EAAE,OAAO,qCAAqC;CAC1G,OAAO,EACL,OAAO;EAAE,SAAS,KAAK;EAA6B,aAAa,KAAK,gBAAgB;CAAK,EAC7F;AACF;AAEA,eAAsB,kBAAkB,MAAc,MAAqC;CACzF,IAAI;CACJ,IAAI;EACF,WAAW,MAAMD,sBAAAA,kBAAkB,MAAMC,iBAAAA,yBAAyB;GAChE,QAAQ;GACR,SAAS;GACT,MAAM,KAAK,UAAU;IAAE;IAAM;GAAK,CAAC;EACrC,CAAC;CACH,QAAQ;EACN,OAAO,EAAE,OAAO,YAAY;CAC9B;CACA,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,UAAU,QAAQ,EAAE;CAC5D,MAAM,OAAgB,MAAM,SAAS,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACjE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,GAAG,OAAO,EAAE,OAAO,sCAAsC;CACrG,OAAO,EAAE,QAAQ,KAAK,OAAoC;AAC5D;AAEA,eAAsB,qBAAqB,MAAyD;CAClG,IAAI;CACJ,IAAI;EACF,WAAW,MAAMD,sBAAAA,kBAAkB,MAAM,GAAGC,iBAAAA,wBAAwB,GAAG,mBAAmB,IAAI,KAAK,EACjG,QAAQ,SACV,CAAC;CACH,QAAQ;EACN,OAAO,EAAE,OAAO,YAAY;CAC9B;CACA,IAAI,SAAS,WAAW,cAAc,CAAC,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,UAAU,QAAQ,EAAE;CAC9F,OAAO,EAAE,IAAI,KAAK;AACpB"}
@@ -0,0 +1,21 @@
1
+ import { DevProxyStateView, DevProxyTarget } from "../../types/devProxy.mjs";
2
+ //#region src/web/lib/devProxyApi.d.ts
3
+ export type TargetsResult = {
4
+ state: DevProxyStateView;
5
+ } | {
6
+ error: string;
7
+ };
8
+ export type TargetResult = {
9
+ target: DevProxyTarget;
10
+ } | {
11
+ error: string;
12
+ };
13
+ export declare function fetchDevProxyTargets(): Promise<TargetsResult>;
14
+ export declare function addDevProxyTarget(name: string, port: number): Promise<TargetResult>;
15
+ export declare function removeDevProxyTarget(name: string): Promise<{
16
+ ok: true;
17
+ } | {
18
+ error: string;
19
+ }>;
20
+ //#endregion
21
+ //# sourceMappingURL=devProxyApi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devProxyApi.d.mts","names":[],"sources":["../../../src/web/lib/devProxyApi.ts"],"mappings":";;YAgBY;EAAkB,OAAO;;EAAwB;;YACjD;EAAiB,QAAQ;;EAAqB;;wBAgBpC,wBAAwB,QAAQ;wBAehC,kBAAkB,cAAc,eAAe,QAAQ;wBAiBvD,qBAAqB,eAAe;EAAU;;EAAe"}
@@ -0,0 +1,72 @@
1
+ import { sealedHttpSession } from "./sealedSession.mjs";
2
+ import { DEV_PROXY_TARGETS_ROUTE } from "../../types/devProxy.mjs";
3
+ //#region src/web/lib/devProxyApi.ts
4
+ /**
5
+ * The dev proxy control plane, seen from the browser.
6
+ *
7
+ * Every call goes through the sealed session for the same reason the rest of
8
+ * the cockpit does: on a tunnel, an unsealed `/api/` request is refused. The
9
+ * proxied dev site itself is the deliberate exception, and it never comes
10
+ * through here, because the browser fetches those bytes on its own.
11
+ */
12
+ const UNREACHABLE = "The cockpit hub is unreachable.";
13
+ const JSON_HEADERS = { "Content-Type": "application/json" };
14
+ const NO_CONTENT = 204;
15
+ function isRecord(value) {
16
+ return typeof value === "object" && value !== null && !Array.isArray(value);
17
+ }
18
+ async function readError(response) {
19
+ try {
20
+ const body = await response.json();
21
+ if (isRecord(body) && typeof body.error === "string") return body.error;
22
+ } catch {}
23
+ return `The hub answered ${String(response.status)}.`;
24
+ }
25
+ async function fetchDevProxyTargets() {
26
+ let response;
27
+ try {
28
+ response = await sealedHttpSession.fetch(DEV_PROXY_TARGETS_ROUTE);
29
+ } catch {
30
+ return { error: UNREACHABLE };
31
+ }
32
+ if (!response.ok) return { error: await readError(response) };
33
+ const body = await response.json().catch(() => void 0);
34
+ if (!isRecord(body) || !Array.isArray(body.targets)) return { error: "The hub sent no dev proxy targets." };
35
+ return { state: {
36
+ targets: body.targets,
37
+ canRegister: body.canRegister === true
38
+ } };
39
+ }
40
+ async function addDevProxyTarget(name, port) {
41
+ let response;
42
+ try {
43
+ response = await sealedHttpSession.fetch(DEV_PROXY_TARGETS_ROUTE, {
44
+ method: "POST",
45
+ headers: JSON_HEADERS,
46
+ body: JSON.stringify({
47
+ name,
48
+ port
49
+ })
50
+ });
51
+ } catch {
52
+ return { error: UNREACHABLE };
53
+ }
54
+ if (!response.ok) return { error: await readError(response) };
55
+ const body = await response.json().catch(() => void 0);
56
+ if (!isRecord(body) || !isRecord(body.target)) return { error: "The hub did not confirm the target." };
57
+ return { target: body.target };
58
+ }
59
+ async function removeDevProxyTarget(name) {
60
+ let response;
61
+ try {
62
+ response = await sealedHttpSession.fetch(`${DEV_PROXY_TARGETS_ROUTE}/${encodeURIComponent(name)}`, { method: "DELETE" });
63
+ } catch {
64
+ return { error: UNREACHABLE };
65
+ }
66
+ if (response.status !== NO_CONTENT && !response.ok) return { error: await readError(response) };
67
+ return { ok: true };
68
+ }
69
+ //#endregion
70
+ export { addDevProxyTarget, fetchDevProxyTargets, removeDevProxyTarget };
71
+
72
+ //# sourceMappingURL=devProxyApi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devProxyApi.mjs","names":[],"sources":["../../../src/web/lib/devProxyApi.ts"],"sourcesContent":["import { DEV_PROXY_TARGETS_ROUTE, type DevProxyStateView, type DevProxyTarget } from '../../types/devProxy';\nimport { sealedHttpSession } from './sealedSession';\n\n/**\n * The dev proxy control plane, seen from the browser.\n *\n * Every call goes through the sealed session for the same reason the rest of\n * the cockpit does: on a tunnel, an unsealed `/api/` request is refused. The\n * proxied dev site itself is the deliberate exception, and it never comes\n * through here, because the browser fetches those bytes on its own.\n */\n\nconst UNREACHABLE = 'The cockpit hub is unreachable.';\nconst JSON_HEADERS = { 'Content-Type': 'application/json' };\nconst NO_CONTENT = 204;\n\nexport type TargetsResult = { state: DevProxyStateView } | { error: string };\nexport type TargetResult = { target: DevProxyTarget } | { error: string };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function readError(response: Response): Promise<string> {\n try {\n const body: unknown = await response.json();\n if (isRecord(body) && typeof body.error === 'string') return body.error;\n } catch {\n // A body that is not JSON tells us nothing the status has not already.\n }\n return `The hub answered ${String(response.status)}.`;\n}\n\nexport async function fetchDevProxyTargets(): Promise<TargetsResult> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(DEV_PROXY_TARGETS_ROUTE);\n } catch {\n return { error: UNREACHABLE };\n }\n if (!response.ok) return { error: await readError(response) };\n const body: unknown = await response.json().catch(() => undefined);\n if (!isRecord(body) || !Array.isArray(body.targets)) return { error: 'The hub sent no dev proxy targets.' };\n return {\n state: { targets: body.targets as DevProxyTarget[], canRegister: body.canRegister === true },\n };\n}\n\nexport async function addDevProxyTarget(name: string, port: number): Promise<TargetResult> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(DEV_PROXY_TARGETS_ROUTE, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({ name, port }),\n });\n } catch {\n return { error: UNREACHABLE };\n }\n if (!response.ok) return { error: await readError(response) };\n const body: unknown = await response.json().catch(() => undefined);\n if (!isRecord(body) || !isRecord(body.target)) return { error: 'The hub did not confirm the target.' };\n return { target: body.target as unknown as DevProxyTarget };\n}\n\nexport async function removeDevProxyTarget(name: string): Promise<{ ok: true } | { error: string }> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(`${DEV_PROXY_TARGETS_ROUTE}/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n } catch {\n return { error: UNREACHABLE };\n }\n if (response.status !== NO_CONTENT && !response.ok) return { error: await readError(response) };\n return { ok: true };\n}\n"],"mappings":";;;;;;;;;;;AAYA,MAAM,cAAc;AACpB,MAAM,eAAe,EAAE,gBAAgB,mBAAmB;AAC1D,MAAM,aAAa;AAKnB,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,eAAe,UAAU,UAAqC;CAC5D,IAAI;EACF,MAAM,OAAgB,MAAM,SAAS,KAAK;EAC1C,IAAI,SAAS,IAAI,KAAK,OAAO,KAAK,UAAU,UAAU,OAAO,KAAK;CACpE,QAAQ,CAER;CACA,OAAO,oBAAoB,OAAO,SAAS,MAAM,EAAE;AACrD;AAEA,eAAsB,uBAA+C;CACnE,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,kBAAkB,MAAM,uBAAuB;CAClE,QAAQ;EACN,OAAO,EAAE,OAAO,YAAY;CAC9B;CACA,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,UAAU,QAAQ,EAAE;CAC5D,MAAM,OAAgB,MAAM,SAAS,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACjE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,OAAO,GAAG,OAAO,EAAE,OAAO,qCAAqC;CAC1G,OAAO,EACL,OAAO;EAAE,SAAS,KAAK;EAA6B,aAAa,KAAK,gBAAgB;CAAK,EAC7F;AACF;AAEA,eAAsB,kBAAkB,MAAc,MAAqC;CACzF,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,kBAAkB,MAAM,yBAAyB;GAChE,QAAQ;GACR,SAAS;GACT,MAAM,KAAK,UAAU;IAAE;IAAM;GAAK,CAAC;EACrC,CAAC;CACH,QAAQ;EACN,OAAO,EAAE,OAAO,YAAY;CAC9B;CACA,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,UAAU,QAAQ,EAAE;CAC5D,MAAM,OAAgB,MAAM,SAAS,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACjE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,GAAG,OAAO,EAAE,OAAO,sCAAsC;CACrG,OAAO,EAAE,QAAQ,KAAK,OAAoC;AAC5D;AAEA,eAAsB,qBAAqB,MAAyD;CAClG,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,kBAAkB,MAAM,GAAG,wBAAwB,GAAG,mBAAmB,IAAI,KAAK,EACjG,QAAQ,SACV,CAAC;CACH,QAAQ;EACN,OAAO,EAAE,OAAO,YAAY;CAC9B;CACA,IAAI,SAAS,WAAW,cAAc,CAAC,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,UAAU,QAAQ,EAAE;CAC9F,OAAO,EAAE,IAAI,KAAK;AACpB"}
@@ -0,0 +1,30 @@
1
+ const require_media = require("../../types/media.cjs");
2
+ //#region src/web/lib/fileMentions.ts
3
+ const MENTION = /(?:^|\s)@([^\s@]+)/gu;
4
+ const TRAILING_PUNCTUATION = /[.,;:!?)\]]+$/u;
5
+ function mediaKindFor(filePath) {
6
+ if (filePath.endsWith("/")) return "directory";
7
+ const dot = filePath.lastIndexOf(".");
8
+ if (dot < 0) return "file";
9
+ return require_media.MEDIA_TYPES[filePath.slice(dot + 1).toLowerCase()]?.kind ?? "file";
10
+ }
11
+ /** The distinct files a message mentions with @, in order of appearance. */
12
+ function parseFileMentions(text) {
13
+ const seen = /* @__PURE__ */ new Set();
14
+ const mentions = [];
15
+ for (const match of text.matchAll(MENTION)) {
16
+ const mentionPath = match[1].replace(TRAILING_PUNCTUATION, "");
17
+ if (!mentionPath || seen.has(mentionPath)) continue;
18
+ seen.add(mentionPath);
19
+ mentions.push({
20
+ path: mentionPath,
21
+ kind: mediaKindFor(mentionPath)
22
+ });
23
+ }
24
+ return mentions;
25
+ }
26
+ //#endregion
27
+ exports.mediaKindFor = mediaKindFor;
28
+ exports.parseFileMentions = parseFileMentions;
29
+
30
+ //# sourceMappingURL=fileMentions.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileMentions.cjs","names":["MEDIA_TYPES"],"sources":["../../../src/web/lib/fileMentions.ts"],"sourcesContent":["import { MEDIA_TYPES, type MediaKind } from '../../types/media';\n\nexport interface FileMention {\n /** The cwd-relative path as the message spelled it. */\n path: string;\n /** How the timeline previews it; 'file' offers a link, 'directory' previews nothing. */\n kind: MediaKind | 'file' | 'directory';\n}\n\n// An @ token starts the message or follows whitespace, runs to the next\n// whitespace, and sheds the punctuation a sentence hangs on it.\nconst MENTION = /(?:^|\\s)@([^\\s@]+)/gu;\nconst TRAILING_PUNCTUATION = /[.,;:!?)\\]]+$/u;\n\nexport function mediaKindFor(filePath: string): MediaKind | 'file' | 'directory' {\n // The trailing slash the @ completion writes for a folder. Naming one is\n // useful to the agent, but there is no asset behind it, and fetching one\n // only ever produced a \"could not load\" badge under the message.\n if (filePath.endsWith('/')) return 'directory';\n const dot = filePath.lastIndexOf('.');\n if (dot < 0) return 'file';\n return MEDIA_TYPES[filePath.slice(dot + 1).toLowerCase()]?.kind ?? 'file';\n}\n\n/** The distinct files a message mentions with @, in order of appearance. */\nexport function parseFileMentions(text: string): FileMention[] {\n const seen = new Set<string>();\n const mentions: FileMention[] = [];\n for (const match of text.matchAll(MENTION)) {\n const mentionPath = match[1].replace(TRAILING_PUNCTUATION, '');\n if (!mentionPath || seen.has(mentionPath)) continue;\n seen.add(mentionPath);\n mentions.push({ path: mentionPath, kind: mediaKindFor(mentionPath) });\n }\n return mentions;\n}\n"],"mappings":";;AAWA,MAAM,UAAU;AAChB,MAAM,uBAAuB;AAE7B,SAAgB,aAAa,UAAoD;CAI/E,IAAI,SAAS,SAAS,GAAG,GAAG,OAAO;CACnC,MAAM,MAAM,SAAS,YAAY,GAAG;CACpC,IAAI,MAAM,GAAG,OAAO;CACpB,OAAOA,cAAAA,YAAY,SAAS,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,QAAQ;AACrE;;AAGA,SAAgB,kBAAkB,MAA6B;CAC7D,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,WAA0B,CAAC;CACjC,KAAK,MAAM,SAAS,KAAK,SAAS,OAAO,GAAG;EAC1C,MAAM,cAAc,MAAM,EAAE,CAAC,QAAQ,sBAAsB,EAAE;EAC7D,IAAI,CAAC,eAAe,KAAK,IAAI,WAAW,GAAG;EAC3C,KAAK,IAAI,WAAW;EACpB,SAAS,KAAK;GAAE,MAAM;GAAa,MAAM,aAAa,WAAW;EAAE,CAAC;CACtE;CACA,OAAO;AACT"}
@@ -0,0 +1,13 @@
1
+ import { MediaKind } from "../../types/media.mjs";
2
+ //#region src/web/lib/fileMentions.d.ts
3
+ export interface FileMention {
4
+ /** The cwd-relative path as the message spelled it. */
5
+ path: string;
6
+ /** How the timeline previews it; 'file' offers a link, 'directory' previews nothing. */
7
+ kind: MediaKind | 'file' | 'directory';
8
+ }
9
+ export declare function mediaKindFor(filePath: string): MediaKind | 'file' | 'directory';
10
+ /** The distinct files a message mentions with @, in order of appearance. */
11
+ export declare function parseFileMentions(text: string): FileMention[];
12
+ //#endregion
13
+ //# sourceMappingURL=fileMentions.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileMentions.d.mts","names":[],"sources":["../../../src/web/lib/fileMentions.ts"],"mappings":";;iBAEiB;;EAEf;;EAEA,MAAM;;wBAQQ,aAAa,mBAAmB;;wBAWhC,kBAAkB,eAAe"}
@@ -0,0 +1,29 @@
1
+ import { MEDIA_TYPES } from "../../types/media.mjs";
2
+ //#region src/web/lib/fileMentions.ts
3
+ const MENTION = /(?:^|\s)@([^\s@]+)/gu;
4
+ const TRAILING_PUNCTUATION = /[.,;:!?)\]]+$/u;
5
+ function mediaKindFor(filePath) {
6
+ if (filePath.endsWith("/")) return "directory";
7
+ const dot = filePath.lastIndexOf(".");
8
+ if (dot < 0) return "file";
9
+ return MEDIA_TYPES[filePath.slice(dot + 1).toLowerCase()]?.kind ?? "file";
10
+ }
11
+ /** The distinct files a message mentions with @, in order of appearance. */
12
+ function parseFileMentions(text) {
13
+ const seen = /* @__PURE__ */ new Set();
14
+ const mentions = [];
15
+ for (const match of text.matchAll(MENTION)) {
16
+ const mentionPath = match[1].replace(TRAILING_PUNCTUATION, "");
17
+ if (!mentionPath || seen.has(mentionPath)) continue;
18
+ seen.add(mentionPath);
19
+ mentions.push({
20
+ path: mentionPath,
21
+ kind: mediaKindFor(mentionPath)
22
+ });
23
+ }
24
+ return mentions;
25
+ }
26
+ //#endregion
27
+ export { mediaKindFor, parseFileMentions };
28
+
29
+ //# sourceMappingURL=fileMentions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileMentions.mjs","names":[],"sources":["../../../src/web/lib/fileMentions.ts"],"sourcesContent":["import { MEDIA_TYPES, type MediaKind } from '../../types/media';\n\nexport interface FileMention {\n /** The cwd-relative path as the message spelled it. */\n path: string;\n /** How the timeline previews it; 'file' offers a link, 'directory' previews nothing. */\n kind: MediaKind | 'file' | 'directory';\n}\n\n// An @ token starts the message or follows whitespace, runs to the next\n// whitespace, and sheds the punctuation a sentence hangs on it.\nconst MENTION = /(?:^|\\s)@([^\\s@]+)/gu;\nconst TRAILING_PUNCTUATION = /[.,;:!?)\\]]+$/u;\n\nexport function mediaKindFor(filePath: string): MediaKind | 'file' | 'directory' {\n // The trailing slash the @ completion writes for a folder. Naming one is\n // useful to the agent, but there is no asset behind it, and fetching one\n // only ever produced a \"could not load\" badge under the message.\n if (filePath.endsWith('/')) return 'directory';\n const dot = filePath.lastIndexOf('.');\n if (dot < 0) return 'file';\n return MEDIA_TYPES[filePath.slice(dot + 1).toLowerCase()]?.kind ?? 'file';\n}\n\n/** The distinct files a message mentions with @, in order of appearance. */\nexport function parseFileMentions(text: string): FileMention[] {\n const seen = new Set<string>();\n const mentions: FileMention[] = [];\n for (const match of text.matchAll(MENTION)) {\n const mentionPath = match[1].replace(TRAILING_PUNCTUATION, '');\n if (!mentionPath || seen.has(mentionPath)) continue;\n seen.add(mentionPath);\n mentions.push({ path: mentionPath, kind: mediaKindFor(mentionPath) });\n }\n return mentions;\n}\n"],"mappings":";;AAWA,MAAM,UAAU;AAChB,MAAM,uBAAuB;AAE7B,SAAgB,aAAa,UAAoD;CAI/E,IAAI,SAAS,SAAS,GAAG,GAAG,OAAO;CACnC,MAAM,MAAM,SAAS,YAAY,GAAG;CACpC,IAAI,MAAM,GAAG,OAAO;CACpB,OAAO,YAAY,SAAS,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,QAAQ;AACrE;;AAGA,SAAgB,kBAAkB,MAA6B;CAC7D,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,WAA0B,CAAC;CACjC,KAAK,MAAM,SAAS,KAAK,SAAS,OAAO,GAAG;EAC1C,MAAM,cAAc,MAAM,EAAE,CAAC,QAAQ,sBAAsB,EAAE;EAC7D,IAAI,CAAC,eAAe,KAAK,IAAI,WAAW,GAAG;EAC3C,KAAK,IAAI,WAAW;EACpB,SAAS,KAAK;GAAE,MAAM;GAAa,MAAM,aAAa,WAAW;EAAE,CAAC;CACtE;CACA,OAAO;AACT"}
@@ -0,0 +1,283 @@
1
+ const require_sealedSession = require("./sealedSession.cjs");
2
+ const require_stepUp = require("./stepUp.cjs");
3
+ const require_hub = require("../../types/hub.cjs");
4
+ let _agimon_ai_po_core_web = require("@agimon-ai/po-core/web");
5
+ //#region src/web/lib/hubApi.ts
6
+ function isRecord(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ /** Lists one server folder's visible child directories for the workspace folder browser. */
10
+ async function listDirectory(folder) {
11
+ try {
12
+ const query = folder === void 0 ? "" : `?path=${encodeURIComponent(folder)}`;
13
+ const response = await require_sealedSession.sealedHttpSession.fetch(`${require_hub.DIRECTORY_CHILDREN_API_ROUTE}${query}`);
14
+ const body = await response.json().catch(() => void 0);
15
+ if (response.ok && isRecord(body) && typeof body.path === "string" && Array.isArray(body.directories)) return {
16
+ path: body.path,
17
+ ...typeof body.parent === "string" ? { parent: body.parent } : {},
18
+ directories: body.directories.filter((entry) => typeof entry === "string")
19
+ };
20
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
21
+ } catch {
22
+ return { error: "The cockpit hub is unreachable." };
23
+ }
24
+ }
25
+ function asWorkspace(value) {
26
+ if (!isRecord(value) || typeof value.id !== "string" || typeof value.root !== "string") return void 0;
27
+ return {
28
+ id: value.id,
29
+ root: value.root,
30
+ ...typeof value.name === "string" && value.name !== "" ? { name: value.name } : {},
31
+ ...typeof value.available === "boolean" ? { available: value.available } : {},
32
+ ...typeof value.error === "string" ? { error: value.error } : {}
33
+ };
34
+ }
35
+ async function listWorkspaces() {
36
+ try {
37
+ const response = await require_sealedSession.sealedHttpSession.fetch(require_hub.WORKSPACES_API_ROUTE);
38
+ const body = await response.json().catch(() => void 0);
39
+ if (response.ok && isRecord(body) && Array.isArray(body.workspaces)) return { workspaces: body.workspaces.map(asWorkspace).filter((entry) => entry !== void 0) };
40
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
41
+ } catch {
42
+ return { error: "The cockpit hub is unreachable." };
43
+ }
44
+ }
45
+ /**
46
+ * Admits a server-side repository root without starting a session. A name alone
47
+ * asks the server to create the workspace in its default folder.
48
+ */
49
+ async function admitWorkspace(input) {
50
+ try {
51
+ const response = await require_stepUp.fetchWithStepUp(require_hub.WORKSPACES_API_ROUTE, {
52
+ method: "POST",
53
+ headers: { "Content-Type": "application/json" },
54
+ body: JSON.stringify(input)
55
+ });
56
+ const body = await response.json().catch(() => void 0);
57
+ const workspace = isRecord(body) ? asWorkspace(body.workspace) : void 0;
58
+ if (response.ok && workspace !== void 0) return { workspace };
59
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
60
+ } catch {
61
+ return { error: "The cockpit hub is unreachable." };
62
+ }
63
+ }
64
+ /** Unregisters a workspace from Po without touching its files on disk. */
65
+ async function removeWorkspace(workspaceId) {
66
+ try {
67
+ const response = await require_sealedSession.sealedHttpSession.fetch(`${require_hub.WORKSPACES_API_ROUTE}/${encodeURIComponent(workspaceId)}`, { method: "DELETE" });
68
+ if (response.ok) return { ok: true };
69
+ const body = await response.json().catch(() => void 0);
70
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
71
+ } catch {
72
+ return { error: "The cockpit hub is unreachable." };
73
+ }
74
+ }
75
+ /** Starts a session in an already admitted workspace. */
76
+ async function createWorkspaceSession(workspaceId, input = {}) {
77
+ let response;
78
+ try {
79
+ response = await require_stepUp.fetchWithStepUp(`/api/workspaces/${encodeURIComponent(workspaceId)}/sessions`, {
80
+ method: "POST",
81
+ headers: { "Content-Type": "application/json" },
82
+ body: JSON.stringify({ name: input.name })
83
+ });
84
+ } catch {
85
+ return { error: "The cockpit hub is unreachable." };
86
+ }
87
+ const body = await response.json().catch(() => void 0);
88
+ if (!response.ok || !isRecord(body) || typeof body.sessionId !== "string") return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
89
+ const sessionId = body.sessionId;
90
+ try {
91
+ const detail = await require_sealedSession.sealedHttpSession.fetch(`/api/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}`);
92
+ const session = await detail.json().catch(() => void 0);
93
+ if (detail.ok && isRecord(session) && session.id === sessionId) return {
94
+ sessionId,
95
+ session
96
+ };
97
+ } catch {}
98
+ return { sessionId };
99
+ }
100
+ /** Compatibility flow for callers that have not admitted a workspace yet. */
101
+ async function createSession(input) {
102
+ const admission = await admitWorkspace({ root: input.cwd });
103
+ if ("error" in admission) return admission;
104
+ return createWorkspaceSession(admission.workspace.id, { name: input.name });
105
+ }
106
+ /** Asks the hub to stop a session's server; the rail card leaves once the server withdraws its record. */
107
+ async function stopSession(sessionId) {
108
+ let response;
109
+ try {
110
+ response = await require_sealedSession.sealedHttpSession.fetch(`${(0, _agimon_ai_po_core_web.sessionApiPath)(sessionId)}`, { method: "DELETE" });
111
+ } catch {
112
+ return { error: "The cockpit hub is unreachable." };
113
+ }
114
+ if (response.ok) return { ok: true };
115
+ let body;
116
+ try {
117
+ body = await response.json();
118
+ } catch {
119
+ body = void 0;
120
+ }
121
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
122
+ }
123
+ /**
124
+ * Asks the hub to replace a session's server, keeping its id.
125
+ *
126
+ * A running server reads the composition once. Restart syncs workspace changes
127
+ * before reopening the session, so changed extensions and APIs take effect.
128
+ */
129
+ async function restartSession(sessionId) {
130
+ let response;
131
+ try {
132
+ response = await require_sealedSession.sealedHttpSession.fetch(`${(0, _agimon_ai_po_core_web.sessionApiPath)(sessionId)}/restart`, { method: "POST" });
133
+ } catch {
134
+ return { error: "The cockpit hub is unreachable." };
135
+ }
136
+ if (response.ok) return { ok: true };
137
+ let body;
138
+ try {
139
+ body = await response.json();
140
+ } catch {
141
+ body = void 0;
142
+ }
143
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
144
+ }
145
+ /**
146
+ * Asks the hub to reopen a recorded session it has not started yet.
147
+ *
148
+ * Step-up gated like creating one, because it is the same act: an agent begins
149
+ * running in a directory. The card turns live when the resulting upsert lands.
150
+ */
151
+ async function reviveSession(sessionId) {
152
+ let response;
153
+ try {
154
+ response = await require_stepUp.fetchWithStepUp(`${(0, _agimon_ai_po_core_web.sessionApiPath)(sessionId)}/revive`, { method: "POST" });
155
+ } catch {
156
+ return { error: "The cockpit hub is unreachable." };
157
+ }
158
+ if (response.ok) return { ok: true };
159
+ let body;
160
+ try {
161
+ body = await response.json();
162
+ } catch {
163
+ body = void 0;
164
+ }
165
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
166
+ }
167
+ async function readDormantTranscriptPage(sessionId, request, signal) {
168
+ const params = new URLSearchParams();
169
+ if (request.cursor !== void 0) params.set("cursor", request.cursor);
170
+ if (request.direction !== void 0) params.set("direction", request.direction);
171
+ if (request.limit !== void 0) params.set("limit", String(request.limit));
172
+ const query = params.toString();
173
+ const response = await require_sealedSession.sealedHttpSession.fetch(`${(0, _agimon_ai_po_core_web.sessionApiPath)(sessionId)}/transcript${query === "" ? "" : `?${query}`}`, signal === void 0 ? {} : { signal });
174
+ const body = await response.json().catch(() => void 0);
175
+ if (!response.ok) {
176
+ const message = isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.`;
177
+ throw new Error(message);
178
+ }
179
+ if (!isRecord(body) || !Array.isArray(body.entries)) throw new Error("The saved transcript response was invalid.");
180
+ return body;
181
+ }
182
+ /** Lists the Pi threads saved for a live session's workspace. */
183
+ function listSessionHistory(sessionId) {
184
+ return listHistoryAt(`${(0, _agimon_ai_po_core_web.sessionApiPath)(sessionId)}/history`);
185
+ }
186
+ async function listHistoryAt(path) {
187
+ try {
188
+ const response = await require_sealedSession.sealedHttpSession.fetch(path);
189
+ const body = await response.json();
190
+ if (response.ok && isRecord(body) && Array.isArray(body.sessions)) return { sessions: body.sessions.filter((session) => isRecord(session) && typeof session.id === "string" && (session.name === void 0 || typeof session.name === "string") && typeof session.firstMessage === "string" && typeof session.createdAt === "string" && typeof session.updatedAt === "string" && typeof session.messageCount === "number") };
191
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
192
+ } catch {
193
+ return { error: "The cockpit hub is unreachable." };
194
+ }
195
+ }
196
+ /** Lists saved history without requiring a live session in the workspace. */
197
+ function listWorkspaceHistory(workspaceId) {
198
+ return listHistoryAt(`/api/workspaces/${encodeURIComponent(workspaceId)}/history`);
199
+ }
200
+ /** Starts one saved thread without replacing another live session. */
201
+ async function resumeWorkspaceSession(workspaceId, targetSessionId) {
202
+ try {
203
+ const response = await require_stepUp.fetchWithStepUp(`/api/workspaces/${encodeURIComponent(workspaceId)}/resume`, {
204
+ method: "POST",
205
+ headers: { "Content-Type": "application/json" },
206
+ body: JSON.stringify({ targetSessionId })
207
+ });
208
+ const body = await response.json();
209
+ if (!response.ok || !isRecord(body) || typeof body.sessionId !== "string") return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
210
+ const sessionId = body.sessionId;
211
+ try {
212
+ const detail = await require_sealedSession.sealedHttpSession.fetch(`/api/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}`);
213
+ const session = await detail.json().catch(() => void 0);
214
+ if (detail.ok && isRecord(session) && session.id === sessionId) return {
215
+ sessionId,
216
+ session
217
+ };
218
+ } catch {}
219
+ return { sessionId };
220
+ } catch {
221
+ return { error: "The cockpit hub is unreachable." };
222
+ }
223
+ }
224
+ /** Replaces one live card with a selected Pi thread from the same workspace. */
225
+ async function resumeSession(sessionId, targetSessionId) {
226
+ try {
227
+ const response = await require_stepUp.fetchWithStepUp(`${(0, _agimon_ai_po_core_web.sessionApiPath)(sessionId)}/resume`, {
228
+ method: "POST",
229
+ headers: { "Content-Type": "application/json" },
230
+ body: JSON.stringify({ targetSessionId })
231
+ });
232
+ const body = await response.json();
233
+ if (response.ok && isRecord(body) && typeof body.sessionId === "string") return { sessionId: body.sessionId };
234
+ return { error: isRecord(body) && typeof body.error === "string" ? body.error : `The hub answered ${response.status}.` };
235
+ } catch {
236
+ return { error: "The cockpit hub is unreachable." };
237
+ }
238
+ }
239
+ /** File paths under a session's cwd matching the query, for @ completion. */
240
+ async function searchSessionFiles(sessionId, query) {
241
+ try {
242
+ const response = await require_sealedSession.sealedHttpSession.fetch(`${(0, _agimon_ai_po_core_web.sessionApiPath)(sessionId)}/plugins/files/?q=${encodeURIComponent(query)}`);
243
+ if (!response.ok) return [];
244
+ const body = await response.json();
245
+ return Array.isArray(body.files) ? body.files.filter((file) => typeof file === "string") : [];
246
+ } catch {
247
+ return [];
248
+ }
249
+ }
250
+ /**
251
+ * Directories the typed path could complete to, for the new-session picker.
252
+ * The hub lists the parent directory's children and filters them by the
253
+ * trailing segment as a regular expression.
254
+ */
255
+ async function searchDirectories(query) {
256
+ try {
257
+ const response = await require_sealedSession.sealedHttpSession.fetch(`${require_hub.DIRECTORIES_API_ROUTE}?q=${encodeURIComponent(query)}`);
258
+ if (!response.ok) return [];
259
+ const body = await response.json();
260
+ return Array.isArray(body.directories) ? body.directories.filter((directory) => typeof directory === "string") : [];
261
+ } catch {
262
+ return [];
263
+ }
264
+ }
265
+ //#endregion
266
+ exports.admitWorkspace = admitWorkspace;
267
+ exports.createSession = createSession;
268
+ exports.createWorkspaceSession = createWorkspaceSession;
269
+ exports.listDirectory = listDirectory;
270
+ exports.listSessionHistory = listSessionHistory;
271
+ exports.listWorkspaceHistory = listWorkspaceHistory;
272
+ exports.listWorkspaces = listWorkspaces;
273
+ exports.readDormantTranscriptPage = readDormantTranscriptPage;
274
+ exports.removeWorkspace = removeWorkspace;
275
+ exports.restartSession = restartSession;
276
+ exports.resumeSession = resumeSession;
277
+ exports.resumeWorkspaceSession = resumeWorkspaceSession;
278
+ exports.reviveSession = reviveSession;
279
+ exports.searchDirectories = searchDirectories;
280
+ exports.searchSessionFiles = searchSessionFiles;
281
+ exports.stopSession = stopSession;
282
+
283
+ //# sourceMappingURL=hubApi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubApi.cjs","names":["sealedHttpSession","DIRECTORY_CHILDREN_API_ROUTE","WORKSPACES_API_ROUTE","fetchWithStepUp","sessionApiPath","DIRECTORIES_API_ROUTE"],"sources":["../../../src/web/lib/hubApi.ts"],"sourcesContent":["import type { TranscriptPage, TranscriptPageRequest } from '@agimon-ai/po-core/sessionProtocol';\nimport { sessionApiPath } from '@agimon-ai/po-core/web';\n\nimport {\n DIRECTORIES_API_ROUTE,\n DIRECTORY_CHILDREN_API_ROUTE,\n WORKSPACES_API_ROUTE,\n type DirectoryListing,\n type PiSessionHistoryItem,\n type SessionSummary,\n type WorkspaceSummary,\n} from '../../types/hub';\nimport { sealedHttpSession } from './sealedSession';\nimport { fetchWithStepUp } from './stepUp';\n\nexport type CreateSessionResult = { sessionId: string; session?: SessionSummary } | { error: string };\nexport type WorkspaceResult = { workspace: WorkspaceSummary } | { error: string };\nexport type WorkspacesResult = { workspaces: WorkspaceSummary[] } | { error: string };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Lists one server folder's visible child directories for the workspace folder browser. */\nexport async function listDirectory(folder?: string): Promise<DirectoryListing | { error: string }> {\n try {\n const query = folder === undefined ? '' : `?path=${encodeURIComponent(folder)}`;\n const response = await sealedHttpSession.fetch(`${DIRECTORY_CHILDREN_API_ROUTE}${query}`);\n const body: unknown = await response.json().catch(() => undefined);\n if (response.ok && isRecord(body) && typeof body.path === 'string' && Array.isArray(body.directories)) {\n return {\n path: body.path,\n ...(typeof body.parent === 'string' ? { parent: body.parent } : {}),\n directories: body.directories.filter((entry): entry is string => typeof entry === 'string'),\n };\n }\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n}\n\nfunction asWorkspace(value: unknown): WorkspaceSummary | undefined {\n if (!isRecord(value) || typeof value.id !== 'string' || typeof value.root !== 'string') return undefined;\n return {\n id: value.id,\n root: value.root,\n ...(typeof value.name === 'string' && value.name !== '' ? { name: value.name } : {}),\n ...(typeof value.available === 'boolean' ? { available: value.available } : {}),\n ...(typeof value.error === 'string' ? { error: value.error } : {}),\n };\n}\n\nexport async function listWorkspaces(): Promise<WorkspacesResult> {\n try {\n const response = await sealedHttpSession.fetch(WORKSPACES_API_ROUTE);\n const body: unknown = await response.json().catch(() => undefined);\n if (response.ok && isRecord(body) && Array.isArray(body.workspaces)) {\n return {\n workspaces: body.workspaces.map(asWorkspace).filter((entry): entry is WorkspaceSummary => entry !== undefined),\n };\n }\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n}\n\n/**\n * Admits a server-side repository root without starting a session. A name alone\n * asks the server to create the workspace in its default folder.\n */\nexport async function admitWorkspace(input: { root?: string; name?: string }): Promise<WorkspaceResult> {\n try {\n const response = await fetchWithStepUp(WORKSPACES_API_ROUTE, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n const body: unknown = await response.json().catch(() => undefined);\n const workspace = isRecord(body) ? asWorkspace(body.workspace) : undefined;\n if (response.ok && workspace !== undefined) return { workspace };\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n}\n\nexport type RemoveWorkspaceResult = { ok: true } | { error: string };\n\n/** Unregisters a workspace from Po without touching its files on disk. */\nexport async function removeWorkspace(workspaceId: string): Promise<RemoveWorkspaceResult> {\n try {\n const response = await sealedHttpSession.fetch(`${WORKSPACES_API_ROUTE}/${encodeURIComponent(workspaceId)}`, {\n method: 'DELETE',\n });\n if (response.ok) return { ok: true };\n const body: unknown = await response.json().catch(() => undefined);\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n}\n\n/** Starts a session in an already admitted workspace. */\nexport async function createWorkspaceSession(\n workspaceId: string,\n input: { name?: string } = {},\n): Promise<CreateSessionResult> {\n let response: Response;\n try {\n response = await fetchWithStepUp(`/api/workspaces/${encodeURIComponent(workspaceId)}/sessions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name: input.name }),\n });\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n const body: unknown = await response.json().catch(() => undefined);\n if (!response.ok || !isRecord(body) || typeof body.sessionId !== 'string') {\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n }\n const sessionId = body.sessionId;\n try {\n const detail = await sealedHttpSession.fetch(\n `/api/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}`,\n );\n const session: unknown = await detail.json().catch(() => undefined);\n if (detail.ok && isRecord(session) && session.id === sessionId) {\n return { sessionId, session: session as unknown as SessionSummary };\n }\n } catch {\n // The socket can still deliver the summary; this read only closes a missed-event race.\n }\n return { sessionId };\n}\n\n/** Compatibility flow for callers that have not admitted a workspace yet. */\nexport async function createSession(input: { cwd: string; name?: string }): Promise<CreateSessionResult> {\n const admission = await admitWorkspace({ root: input.cwd });\n if ('error' in admission) return admission;\n return createWorkspaceSession(admission.workspace.id, { name: input.name });\n}\n\nexport type StopSessionResult = { ok: true } | { error: string };\n\n/** Asks the hub to stop a session's server; the rail card leaves once the server withdraws its record. */\nexport async function stopSession(sessionId: string): Promise<StopSessionResult> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(`${sessionApiPath(sessionId)}`, {\n method: 'DELETE',\n });\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n if (response.ok) return { ok: true };\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = undefined;\n }\n const error = isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`;\n return { error };\n}\n\nexport type RestartSessionResult = { ok: true } | { error: string };\n\n/**\n * Asks the hub to replace a session's server, keeping its id.\n *\n * A running server reads the composition once. Restart syncs workspace changes\n * before reopening the session, so changed extensions and APIs take effect.\n */\nexport async function restartSession(sessionId: string): Promise<RestartSessionResult> {\n let response: Response;\n try {\n response = await sealedHttpSession.fetch(`${sessionApiPath(sessionId)}/restart`, {\n method: 'POST',\n });\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n if (response.ok) return { ok: true };\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = undefined;\n }\n const error = isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`;\n return { error };\n}\n\nexport type ReviveSessionResult = { ok: true } | { error: string };\n\n/**\n * Asks the hub to reopen a recorded session it has not started yet.\n *\n * Step-up gated like creating one, because it is the same act: an agent begins\n * running in a directory. The card turns live when the resulting upsert lands.\n */\nexport async function reviveSession(sessionId: string): Promise<ReviveSessionResult> {\n let response: Response;\n try {\n response = await fetchWithStepUp(`${sessionApiPath(sessionId)}/revive`, { method: 'POST' });\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n if (response.ok) return { ok: true };\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = undefined;\n }\n const error = isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`;\n return { error };\n}\n\nexport async function readDormantTranscriptPage(\n sessionId: string,\n request: TranscriptPageRequest,\n signal?: AbortSignal,\n): Promise<TranscriptPage> {\n const params = new URLSearchParams();\n if (request.cursor !== undefined) params.set('cursor', request.cursor);\n if (request.direction !== undefined) params.set('direction', request.direction);\n if (request.limit !== undefined) params.set('limit', String(request.limit));\n const query = params.toString();\n const response = await sealedHttpSession.fetch(\n `${sessionApiPath(sessionId)}/transcript${query === '' ? '' : `?${query}`}`,\n signal === undefined ? {} : { signal },\n );\n const body: unknown = await response.json().catch(() => undefined);\n if (!response.ok) {\n const message =\n isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`;\n throw new Error(message);\n }\n if (!isRecord(body) || !Array.isArray(body.entries)) throw new Error('The saved transcript response was invalid.');\n return body as unknown as TranscriptPage;\n}\nexport type SessionHistoryResult = { sessions: PiSessionHistoryItem[] } | { error: string };\n\n/** Lists the Pi threads saved for a live session's workspace. */\nexport function listSessionHistory(sessionId: string): Promise<SessionHistoryResult> {\n return listHistoryAt(`${sessionApiPath(sessionId)}/history`);\n}\n\nexport type ResumeSessionResult = { sessionId: string; session?: SessionSummary } | { error: string };\n\nasync function listHistoryAt(path: string): Promise<SessionHistoryResult> {\n try {\n const response = await sealedHttpSession.fetch(path);\n const body = (await response.json()) as unknown;\n if (response.ok && isRecord(body) && Array.isArray(body.sessions)) {\n return {\n sessions: body.sessions.filter(\n (session): session is PiSessionHistoryItem =>\n isRecord(session) &&\n typeof session.id === 'string' &&\n (session.name === undefined || typeof session.name === 'string') &&\n typeof session.firstMessage === 'string' &&\n typeof session.createdAt === 'string' &&\n typeof session.updatedAt === 'string' &&\n typeof session.messageCount === 'number',\n ),\n };\n }\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n}\n\n/** Lists saved history without requiring a live session in the workspace. */\nexport function listWorkspaceHistory(workspaceId: string): Promise<SessionHistoryResult> {\n return listHistoryAt(`/api/workspaces/${encodeURIComponent(workspaceId)}/history`);\n}\n\n/** Starts one saved thread without replacing another live session. */\nexport async function resumeWorkspaceSession(\n workspaceId: string,\n targetSessionId: string,\n): Promise<ResumeSessionResult> {\n try {\n const response = await fetchWithStepUp(`/api/workspaces/${encodeURIComponent(workspaceId)}/resume`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ targetSessionId }),\n });\n const body = (await response.json()) as unknown;\n if (!response.ok || !isRecord(body) || typeof body.sessionId !== 'string') {\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n }\n const sessionId = body.sessionId;\n try {\n const detail = await sealedHttpSession.fetch(\n `/api/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}`,\n );\n const session: unknown = await detail.json().catch(() => undefined);\n if (detail.ok && isRecord(session) && session.id === sessionId) {\n return { sessionId, session: session as unknown as SessionSummary };\n }\n } catch {\n // The socket can still deliver the summary; this read only closes a missed-event race.\n }\n return { sessionId };\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n}\n\n/** Replaces one live card with a selected Pi thread from the same workspace. */\nexport async function resumeSession(sessionId: string, targetSessionId: string): Promise<ResumeSessionResult> {\n try {\n const response = await fetchWithStepUp(`${sessionApiPath(sessionId)}/resume`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ targetSessionId }),\n });\n const body = (await response.json()) as unknown;\n if (response.ok && isRecord(body) && typeof body.sessionId === 'string') return { sessionId: body.sessionId };\n return {\n error: isRecord(body) && typeof body.error === 'string' ? body.error : `The hub answered ${response.status}.`,\n };\n } catch {\n return { error: 'The cockpit hub is unreachable.' };\n }\n}\n/** File paths under a session's cwd matching the query, for @ completion. */\nexport async function searchSessionFiles(sessionId: string, query: string): Promise<string[]> {\n try {\n const response = await sealedHttpSession.fetch(\n `${sessionApiPath(sessionId)}/plugins/files/?q=${encodeURIComponent(query)}`,\n );\n if (!response.ok) return [];\n const body = (await response.json()) as { files?: unknown };\n return Array.isArray(body.files) ? body.files.filter((file): file is string => typeof file === 'string') : [];\n } catch {\n return []; // Completion is a convenience; a failed lookup just shows nothing.\n }\n}\n\n/**\n * Directories the typed path could complete to, for the new-session picker.\n * The hub lists the parent directory's children and filters them by the\n * trailing segment as a regular expression.\n */\nexport async function searchDirectories(query: string): Promise<string[]> {\n try {\n const response = await sealedHttpSession.fetch(`${DIRECTORIES_API_ROUTE}?q=${encodeURIComponent(query)}`);\n if (!response.ok) return [];\n const body = (await response.json()) as { directories?: unknown };\n return Array.isArray(body.directories)\n ? body.directories.filter((directory): directory is string => typeof directory === 'string')\n : [];\n } catch {\n return []; // Suggestions are a convenience; a failed lookup just shows nothing.\n }\n}\n"],"mappings":"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"}