botmux 3.2.1 → 3.4.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 (277) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +47 -0
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +137 -0
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/cli/pi.d.ts.map +1 -1
  6. package/dist/adapters/cli/pi.js +4 -0
  7. package/dist/adapters/cli/pi.js.map +1 -1
  8. package/dist/adapters/cli/read-isolation.d.ts +72 -3
  9. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  10. package/dist/adapters/cli/read-isolation.js +143 -6
  11. package/dist/adapters/cli/read-isolation.js.map +1 -1
  12. package/dist/adapters/cli/registry.d.ts.map +1 -1
  13. package/dist/adapters/cli/registry.js +8 -2
  14. package/dist/adapters/cli/registry.js.map +1 -1
  15. package/dist/adapters/cli/types.d.ts +8 -1
  16. package/dist/adapters/cli/types.d.ts.map +1 -1
  17. package/dist/cli/deferred-topic-send.d.ts +37 -0
  18. package/dist/cli/deferred-topic-send.d.ts.map +1 -0
  19. package/dist/cli/deferred-topic-send.js +69 -0
  20. package/dist/cli/deferred-topic-send.js.map +1 -0
  21. package/dist/cli/pm2-command.d.ts.map +1 -1
  22. package/dist/cli/pm2-command.js +6 -0
  23. package/dist/cli/pm2-command.js.map +1 -1
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +173 -34
  26. package/dist/cli.js.map +1 -1
  27. package/dist/core/command-handler.d.ts.map +1 -1
  28. package/dist/core/command-handler.js +17 -12
  29. package/dist/core/command-handler.js.map +1 -1
  30. package/dist/core/dashboard-ipc-server.d.ts +4 -1
  31. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  32. package/dist/core/dashboard-ipc-server.js +99 -8
  33. package/dist/core/dashboard-ipc-server.js.map +1 -1
  34. package/dist/core/deferred-schedule-settlement.d.ts +20 -0
  35. package/dist/core/deferred-schedule-settlement.d.ts.map +1 -0
  36. package/dist/core/deferred-schedule-settlement.js +18 -0
  37. package/dist/core/deferred-schedule-settlement.js.map +1 -0
  38. package/dist/core/deferred-topic-binding.d.ts +19 -0
  39. package/dist/core/deferred-topic-binding.d.ts.map +1 -0
  40. package/dist/core/deferred-topic-binding.js +55 -0
  41. package/dist/core/deferred-topic-binding.js.map +1 -0
  42. package/dist/core/device-isolation-activation.d.ts +56 -0
  43. package/dist/core/device-isolation-activation.d.ts.map +1 -0
  44. package/dist/core/device-isolation-activation.js +110 -0
  45. package/dist/core/device-isolation-activation.js.map +1 -0
  46. package/dist/core/device-isolation-daemon.d.ts +84 -0
  47. package/dist/core/device-isolation-daemon.d.ts.map +1 -0
  48. package/dist/core/device-isolation-daemon.js +591 -0
  49. package/dist/core/device-isolation-daemon.js.map +1 -0
  50. package/dist/core/scheduler.d.ts +26 -20
  51. package/dist/core/scheduler.d.ts.map +1 -1
  52. package/dist/core/scheduler.js +114 -56
  53. package/dist/core/scheduler.js.map +1 -1
  54. package/dist/core/session-discovery.d.ts.map +1 -1
  55. package/dist/core/session-discovery.js +47 -15
  56. package/dist/core/session-discovery.js.map +1 -1
  57. package/dist/core/session-manager.d.ts +17 -1
  58. package/dist/core/session-manager.d.ts.map +1 -1
  59. package/dist/core/session-manager.js +178 -84
  60. package/dist/core/session-manager.js.map +1 -1
  61. package/dist/core/types.d.ts +13 -0
  62. package/dist/core/types.d.ts.map +1 -1
  63. package/dist/core/types.js +10 -0
  64. package/dist/core/types.js.map +1 -1
  65. package/dist/core/worker-pool.d.ts +7 -0
  66. package/dist/core/worker-pool.d.ts.map +1 -1
  67. package/dist/core/worker-pool.js +86 -1
  68. package/dist/core/worker-pool.js.map +1 -1
  69. package/dist/daemon.d.ts.map +1 -1
  70. package/dist/daemon.js +95 -5
  71. package/dist/daemon.js.map +1 -1
  72. package/dist/dashboard/schedule-card-model.d.ts +12 -3
  73. package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
  74. package/dist/dashboard/schedule-card-model.js +32 -8
  75. package/dist/dashboard/schedule-card-model.js.map +1 -1
  76. package/dist/dashboard/web/dashboard-components.d.ts +7 -0
  77. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
  78. package/dist/dashboard/web/dashboard-components.js +11 -2
  79. package/dist/dashboard/web/dashboard-components.js.map +1 -1
  80. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  81. package/dist/dashboard/web/i18n.js +30 -6
  82. package/dist/dashboard/web/i18n.js.map +1 -1
  83. package/dist/dashboard/web/schedules-page.d.ts +2 -0
  84. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  85. package/dist/dashboard/web/schedules-page.js +74 -27
  86. package/dist/dashboard/web/schedules-page.js.map +1 -1
  87. package/dist/dashboard-web/app.js +1 -1
  88. package/dist/dashboard-web/chunks/{bot-defaults-page-O37SAQD5.js → bot-defaults-page-B5AY4B2J.js} +1 -1
  89. package/dist/dashboard-web/chunks/{chunk-6QHMLMIM.js → chunk-CUV65BIQ.js} +3 -3
  90. package/dist/dashboard-web/chunks/{chunk-O2DPQL7C.js → chunk-JNRSPKLS.js} +1 -1
  91. package/dist/dashboard-web/chunks/{chunk-FYALHCPG.js → chunk-P6GO5KT4.js} +1 -1
  92. package/dist/dashboard-web/chunks/chunk-QFMH6ITB.js +1 -0
  93. package/dist/dashboard-web/chunks/{chunk-B42PCL5P.js → chunk-UBOLHQCK.js} +1 -1
  94. package/dist/dashboard-web/chunks/{connectors-page-DZBQ42MH.js → connectors-page-KTC2QWNW.js} +1 -1
  95. package/dist/dashboard-web/chunks/{groups-page-3IEGRZKQ.js → groups-page-B3EKGOLY.js} +1 -1
  96. package/dist/dashboard-web/chunks/{insights-page-X3ADRON3.js → insights-page-X6RXNCWX.js} +1 -1
  97. package/dist/dashboard-web/chunks/{monitor-room-IV36RGQY.js → monitor-room-LLRA5LQW.js} +1 -1
  98. package/dist/dashboard-web/chunks/{monitoring-page-ADFKVON4.js → monitoring-page-7MT5FEOS.js} +1 -1
  99. package/dist/dashboard-web/chunks/{office-page-CALAOWNS.js → office-page-KD46D5TD.js} +1 -1
  100. package/dist/dashboard-web/chunks/{overview-page-SLMGLK3M.js → overview-page-JUWNH32O.js} +1 -1
  101. package/dist/dashboard-web/chunks/{roles-page-L7JJ4FFV.js → roles-page-P6F7NLOI.js} +1 -1
  102. package/dist/dashboard-web/chunks/schedules-page-XIHWZST4.js +1 -0
  103. package/dist/dashboard-web/chunks/{sessions-page-OKJ5YWUZ.js → sessions-page-2VECQ27T.js} +1 -1
  104. package/dist/dashboard-web/chunks/{settings-page-P6MI2ZUE.js → settings-page-HMIUE2JA.js} +1 -1
  105. package/dist/dashboard-web/chunks/{skills-page-FT7BVZ6X.js → skills-page-A46KVWBL.js} +1 -1
  106. package/dist/dashboard-web/chunks/{team-federation-page-DEYCPUFB.js → team-federation-page-SDUC56DF.js} +1 -1
  107. package/dist/dashboard-web/chunks/{v3-page-4IOWREZG.js → v3-page-J5JOTUSQ.js} +1 -1
  108. package/dist/dashboard-web/chunks/{whiteboards-page-2VMBETZH.js → whiteboards-page-U7LSOAWI.js} +1 -1
  109. package/dist/dashboard-web/style.css +34 -4
  110. package/dist/dashboard.js +16 -1
  111. package/dist/dashboard.js.map +1 -1
  112. package/dist/desktop/main/auto-start.d.ts +2 -0
  113. package/dist/desktop/main/auto-start.d.ts.map +1 -1
  114. package/dist/desktop/main/auto-start.js +10 -6
  115. package/dist/desktop/main/auto-start.js.map +1 -1
  116. package/dist/desktop/main/bundled-runtime.d.ts +12 -0
  117. package/dist/desktop/main/bundled-runtime.d.ts.map +1 -0
  118. package/dist/desktop/main/bundled-runtime.js +30 -0
  119. package/dist/desktop/main/bundled-runtime.js.map +1 -0
  120. package/dist/desktop/main/device-status.d.ts +15 -0
  121. package/dist/desktop/main/device-status.d.ts.map +1 -0
  122. package/dist/desktop/main/device-status.js +94 -0
  123. package/dist/desktop/main/device-status.js.map +1 -0
  124. package/dist/desktop/main/external-runtime.d.ts +9 -0
  125. package/dist/desktop/main/external-runtime.d.ts.map +1 -1
  126. package/dist/desktop/main/external-runtime.js +88 -18
  127. package/dist/desktop/main/external-runtime.js.map +1 -1
  128. package/dist/desktop/main/ipc.d.ts.map +1 -1
  129. package/dist/desktop/main/ipc.js +1 -0
  130. package/dist/desktop/main/ipc.js.map +1 -1
  131. package/dist/desktop/main/node-command.d.ts +21 -0
  132. package/dist/desktop/main/node-command.d.ts.map +1 -1
  133. package/dist/desktop/main/node-command.js +41 -0
  134. package/dist/desktop/main/node-command.js.map +1 -1
  135. package/dist/desktop/main/pm2-apps.d.ts +4 -2
  136. package/dist/desktop/main/pm2-apps.d.ts.map +1 -1
  137. package/dist/desktop/main/pm2-apps.js +11 -3
  138. package/dist/desktop/main/pm2-apps.js.map +1 -1
  139. package/dist/desktop/main/runtime-service.d.ts +21 -5
  140. package/dist/desktop/main/runtime-service.d.ts.map +1 -1
  141. package/dist/desktop/main/runtime-service.js +94 -10
  142. package/dist/desktop/main/runtime-service.js.map +1 -1
  143. package/dist/desktop/main/runtime-source.d.ts +2 -0
  144. package/dist/desktop/main/runtime-source.d.ts.map +1 -1
  145. package/dist/desktop/main/runtime-source.js +12 -6
  146. package/dist/desktop/main/runtime-source.js.map +1 -1
  147. package/dist/desktop/main/tray.d.ts +1 -0
  148. package/dist/desktop/main/tray.d.ts.map +1 -1
  149. package/dist/desktop/main/tray.js +3 -3
  150. package/dist/desktop/main/tray.js.map +1 -1
  151. package/dist/desktop/main.js +28 -8
  152. package/dist/desktop/main.js.map +1 -1
  153. package/dist/desktop/preload.js +3 -0
  154. package/dist/desktop/preload.js.map +1 -1
  155. package/dist/desktop/renderer/app.d.ts +2 -1
  156. package/dist/desktop/renderer/app.d.ts.map +1 -1
  157. package/dist/desktop/renderer/app.js +6 -1
  158. package/dist/desktop/renderer/app.js.map +1 -1
  159. package/dist/desktop/renderer/runtime-state.d.ts.map +1 -1
  160. package/dist/desktop/renderer/runtime-state.js +2 -0
  161. package/dist/desktop/renderer/runtime-state.js.map +1 -1
  162. package/dist/desktop/shared/shell-path-probes.d.ts +24 -0
  163. package/dist/desktop/shared/shell-path-probes.d.ts.map +1 -0
  164. package/dist/desktop/shared/shell-path-probes.js +38 -0
  165. package/dist/desktop/shared/shell-path-probes.js.map +1 -0
  166. package/dist/desktop/shared/types.d.ts +21 -1
  167. package/dist/desktop/shared/types.d.ts.map +1 -1
  168. package/dist/desktop/smoke.d.ts +1 -0
  169. package/dist/desktop/smoke.d.ts.map +1 -1
  170. package/dist/desktop/smoke.js +20 -5
  171. package/dist/desktop/smoke.js.map +1 -1
  172. package/dist/i18n/en.d.ts.map +1 -1
  173. package/dist/i18n/en.js +16 -7
  174. package/dist/i18n/en.js.map +1 -1
  175. package/dist/i18n/zh.d.ts.map +1 -1
  176. package/dist/i18n/zh.js +16 -7
  177. package/dist/i18n/zh.js.map +1 -1
  178. package/dist/im/lark/card-handler.d.ts.map +1 -1
  179. package/dist/im/lark/card-handler.js +3 -0
  180. package/dist/im/lark/card-handler.js.map +1 -1
  181. package/dist/im/lark/event-dispatcher.d.ts +1 -0
  182. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  183. package/dist/im/lark/event-dispatcher.js +1 -1
  184. package/dist/im/lark/event-dispatcher.js.map +1 -1
  185. package/dist/im/lark/schedules-card.d.ts +2 -2
  186. package/dist/im/lark/schedules-card.d.ts.map +1 -1
  187. package/dist/im/lark/schedules-card.js +50 -34
  188. package/dist/im/lark/schedules-card.js.map +1 -1
  189. package/dist/index-daemon.js +13 -1
  190. package/dist/index-daemon.js.map +1 -1
  191. package/dist/platform/bind.d.ts +4 -1
  192. package/dist/platform/bind.d.ts.map +1 -1
  193. package/dist/platform/bind.js +10 -1
  194. package/dist/platform/bind.js.map +1 -1
  195. package/dist/platform/binding.d.ts.map +1 -1
  196. package/dist/platform/binding.js +15 -9
  197. package/dist/platform/binding.js.map +1 -1
  198. package/dist/platform/device-command.d.ts +35 -0
  199. package/dist/platform/device-command.d.ts.map +1 -0
  200. package/dist/platform/device-command.js +187 -0
  201. package/dist/platform/device-command.js.map +1 -0
  202. package/dist/platform/device-enroll.d.ts +156 -0
  203. package/dist/platform/device-enroll.d.ts.map +1 -0
  204. package/dist/platform/device-enroll.js +781 -0
  205. package/dist/platform/device-enroll.js.map +1 -0
  206. package/dist/platform/device-isolation-activation-client.d.ts +28 -0
  207. package/dist/platform/device-isolation-activation-client.d.ts.map +1 -0
  208. package/dist/platform/device-isolation-activation-client.js +279 -0
  209. package/dist/platform/device-isolation-activation-client.js.map +1 -0
  210. package/dist/platform/device-isolation.d.ts +35 -0
  211. package/dist/platform/device-isolation.d.ts.map +1 -0
  212. package/dist/platform/device-isolation.js +90 -0
  213. package/dist/platform/device-isolation.js.map +1 -0
  214. package/dist/platform/device-paths.d.ts +9 -0
  215. package/dist/platform/device-paths.d.ts.map +1 -0
  216. package/dist/platform/device-paths.js +14 -0
  217. package/dist/platform/device-paths.js.map +1 -0
  218. package/dist/platform/device.d.ts +77 -0
  219. package/dist/platform/device.d.ts.map +1 -0
  220. package/dist/platform/device.js +212 -0
  221. package/dist/platform/device.js.map +1 -0
  222. package/dist/platform/host-command-context.d.ts +15 -0
  223. package/dist/platform/host-command-context.d.ts.map +1 -0
  224. package/dist/platform/host-command-context.js +26 -0
  225. package/dist/platform/host-command-context.js.map +1 -0
  226. package/dist/platform/secure-host-file.d.ts +12 -0
  227. package/dist/platform/secure-host-file.d.ts.map +1 -0
  228. package/dist/platform/secure-host-file.js +182 -0
  229. package/dist/platform/secure-host-file.js.map +1 -0
  230. package/dist/services/schedule-store.d.ts +6 -2
  231. package/dist/services/schedule-store.d.ts.map +1 -1
  232. package/dist/services/schedule-store.js +19 -4
  233. package/dist/services/schedule-store.js.map +1 -1
  234. package/dist/skills/definitions.d.ts.map +1 -1
  235. package/dist/skills/definitions.js +4 -5
  236. package/dist/skills/definitions.js.map +1 -1
  237. package/dist/types.d.ts +45 -8
  238. package/dist/types.d.ts.map +1 -1
  239. package/dist/utils/atomic-write.d.ts +13 -0
  240. package/dist/utils/atomic-write.d.ts.map +1 -1
  241. package/dist/utils/atomic-write.js +89 -9
  242. package/dist/utils/atomic-write.js.map +1 -1
  243. package/dist/utils/child-env.d.ts +40 -1
  244. package/dist/utils/child-env.d.ts.map +1 -1
  245. package/dist/utils/child-env.js +45 -0
  246. package/dist/utils/child-env.js.map +1 -1
  247. package/dist/utils/pending-input-queue.d.ts +10 -0
  248. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  249. package/dist/utils/pending-input-queue.js +15 -0
  250. package/dist/utils/pending-input-queue.js.map +1 -1
  251. package/dist/worker.js +391 -28
  252. package/dist/worker.js.map +1 -1
  253. package/dist/workflows/events/payloads.d.ts +4 -4
  254. package/dist/workflows/events/schema.d.ts +16 -16
  255. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +3 -1
  256. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  257. package/dist/workflows/hostExecutors/botmux-schedule.js +14 -3
  258. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  259. package/dist/workflows/v3/architect.js +1 -1
  260. package/dist/workflows/v3/architect.js.map +1 -1
  261. package/dist/workflows/v3/contract.d.ts +8 -0
  262. package/dist/workflows/v3/contract.d.ts.map +1 -1
  263. package/dist/workflows/v3/contract.js.map +1 -1
  264. package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
  265. package/dist/workflows/v3/daemon-run.js +2 -0
  266. package/dist/workflows/v3/daemon-run.js.map +1 -1
  267. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
  268. package/dist/workflows/v3/ephemeral-pool.js +10 -2
  269. package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
  270. package/dist/workflows/v3/run-envelope.d.ts +24 -24
  271. package/dist/workflows/v3/runtime.d.ts +5 -0
  272. package/dist/workflows/v3/runtime.d.ts.map +1 -1
  273. package/dist/workflows/v3/runtime.js +1 -0
  274. package/dist/workflows/v3/runtime.js.map +1 -1
  275. package/package.json +6 -3
  276. package/dist/dashboard-web/chunks/chunk-I35DXGM4.js +0 -1
  277. package/dist/dashboard-web/chunks/schedules-page-Z3672POL.js +0 -1
@@ -0,0 +1,20 @@
1
+ import type { DaemonSession } from './types.js';
2
+ export type DeferredScheduleSettlementResult = {
3
+ action: 'ignored';
4
+ } | {
5
+ action: 'materialized';
6
+ rootMessageId: string;
7
+ } | {
8
+ action: 'closed';
9
+ };
10
+ /** Execute the exact-turn lifecycle decision after a hidden schedule run
11
+ * reaches a terminal/idle edge. Timer debounce lives in daemon.ts; keeping the
12
+ * decision here makes the close-vs-retain contract independently testable. */
13
+ export declare function settleDeferredScheduleRun(ds: DaemonSession, context: {
14
+ turnId: string;
15
+ source: 'terminal' | 'idle';
16
+ }, deps: {
17
+ reconcile: (ds: DaemonSession) => string | undefined;
18
+ closeSession: (sessionId: string) => Promise<unknown>;
19
+ }): Promise<DeferredScheduleSettlementResult>;
20
+ //# sourceMappingURL=deferred-schedule-settlement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferred-schedule-settlement.d.ts","sourceRoot":"","sources":["../../src/core/deferred-schedule-settlement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,gCAAgC,GACxC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEzB;;8EAE8E;AAC9E,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,aAAa,EACjB,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAA;CAAE,EACxD,IAAI,EAAE;IACJ,SAAS,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD,GACA,OAAO,CAAC,gCAAgC,CAAC,CAY3C"}
@@ -0,0 +1,18 @@
1
+ /** Execute the exact-turn lifecycle decision after a hidden schedule run
2
+ * reaches a terminal/idle edge. Timer debounce lives in daemon.ts; keeping the
3
+ * decision here makes the close-vs-retain contract independently testable. */
4
+ export async function settleDeferredScheduleRun(ds, context, deps) {
5
+ const run = ds.session.deferredScheduleRun;
6
+ if (!run || run.turnId !== context.turnId || ds.session.status === 'closed') {
7
+ return { action: 'ignored' };
8
+ }
9
+ if (context.source === 'idle' && ds.lastScreenStatus !== 'idle') {
10
+ return { action: 'ignored' };
11
+ }
12
+ const rootMessageId = deps.reconcile(ds);
13
+ if (rootMessageId)
14
+ return { action: 'materialized', rootMessageId };
15
+ await deps.closeSession(ds.session.sessionId);
16
+ return { action: 'closed' };
17
+ }
18
+ //# sourceMappingURL=deferred-schedule-settlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferred-schedule-settlement.js","sourceRoot":"","sources":["../../src/core/deferred-schedule-settlement.ts"],"names":[],"mappings":"AAOA;;8EAE8E;AAC9E,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAAiB,EACjB,OAAwD,EACxD,IAGC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAC3C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,EAAE,CAAC,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,aAAa;QAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;IACpE,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface DeferredTopicBinding {
2
+ sessionId: string;
3
+ turnId: string;
4
+ chatId: string;
5
+ larkAppId: string;
6
+ routingAnchor: string;
7
+ rootMessageId: string;
8
+ createdAt: string;
9
+ }
10
+ export declare function deferredTopicBindingPath(dataDir: string, sessionId: string): string;
11
+ export declare function readDeferredTopicBinding(dataDir: string, sessionId: string): DeferredTopicBinding | undefined;
12
+ export declare function writeDeferredTopicBinding(dataDir: string, binding: DeferredTopicBinding): void;
13
+ /** Serialize the first-message claim across concurrent `botmux send`
14
+ * processes. The callback may hold the lock across the Lark request: that is
15
+ * intentional, because releasing it before the provider returns would allow
16
+ * two callers to create two roots for the same deferred run. */
17
+ export declare function withDeferredTopicBindingLock<T>(dataDir: string, sessionId: string, fn: () => Promise<T>): Promise<T>;
18
+ export declare function removeDeferredTopicBinding(dataDir: string, sessionId: string): void;
19
+ //# sourceMappingURL=deferred-topic-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferred-topic-binding.d.ts","sourceRoot":"","sources":["../../src/core/deferred-topic-binding.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,oBAAoB,GAAG,SAAS,CAmBlC;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAMN;AAED;;;gEAGgE;AAChE,wBAAgB,4BAA4B,CAAC,CAAC,EAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAIZ;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGnF"}
@@ -0,0 +1,55 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { withFileLock } from '../utils/file-lock.js';
5
+ function bindingDir(dataDir) {
6
+ return join(dataDir, 'deferred-topics');
7
+ }
8
+ export function deferredTopicBindingPath(dataDir, sessionId) {
9
+ return join(bindingDir(dataDir), `${sessionId}.json`);
10
+ }
11
+ export function readDeferredTopicBinding(dataDir, sessionId) {
12
+ const path = deferredTopicBindingPath(dataDir, sessionId);
13
+ if (!existsSync(path))
14
+ return undefined;
15
+ try {
16
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
17
+ if (parsed.sessionId !== sessionId
18
+ || typeof parsed.turnId !== 'string'
19
+ || typeof parsed.chatId !== 'string'
20
+ || typeof parsed.larkAppId !== 'string'
21
+ || typeof parsed.routingAnchor !== 'string'
22
+ || typeof parsed.rootMessageId !== 'string'
23
+ || !parsed.rootMessageId.startsWith('om_')
24
+ || typeof parsed.createdAt !== 'string')
25
+ return undefined;
26
+ return parsed;
27
+ }
28
+ catch {
29
+ return undefined;
30
+ }
31
+ }
32
+ export function writeDeferredTopicBinding(dataDir, binding) {
33
+ const path = deferredTopicBindingPath(dataDir, binding.sessionId);
34
+ mkdirSync(dirname(path), { recursive: true });
35
+ const tmp = `${path}.${process.pid}.${randomUUID()}.tmp`;
36
+ writeFileSync(tmp, JSON.stringify(binding, null, 2), 'utf8');
37
+ renameSync(tmp, path);
38
+ }
39
+ /** Serialize the first-message claim across concurrent `botmux send`
40
+ * processes. The callback may hold the lock across the Lark request: that is
41
+ * intentional, because releasing it before the provider returns would allow
42
+ * two callers to create two roots for the same deferred run. */
43
+ export function withDeferredTopicBindingLock(dataDir, sessionId, fn) {
44
+ const path = deferredTopicBindingPath(dataDir, sessionId);
45
+ mkdirSync(dirname(path), { recursive: true });
46
+ return withFileLock(path, fn, { maxWaitMs: 30_000 });
47
+ }
48
+ export function removeDeferredTopicBinding(dataDir, sessionId) {
49
+ const path = deferredTopicBindingPath(dataDir, sessionId);
50
+ try {
51
+ rmSync(path, { force: true });
52
+ }
53
+ catch { /* best-effort lifecycle cleanup */ }
54
+ }
55
+ //# sourceMappingURL=deferred-topic-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferred-topic-binding.js","sourceRoot":"","sources":["../../src/core/deferred-topic-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export declare const DEVICE_ISOLATION_ACTIVATION_VERSION: 1;
2
+ export declare const DEVICE_ISOLATION_FREEZE_LEASE_MS = 30000;
3
+ export interface DeviceIsolationFreezeLease {
4
+ activationVersion: typeof DEVICE_ISOLATION_ACTIVATION_VERSION;
5
+ leaseId: string;
6
+ nonce: string;
7
+ inventoryGeneration: string;
8
+ acquiredAt: number;
9
+ expiresAt: number;
10
+ }
11
+ export declare function currentDeviceIsolationFreezeLease(now?: number): DeviceIsolationFreezeLease | null;
12
+ export type AcquireDeviceIsolationFreezeResult = {
13
+ ok: true;
14
+ lease: DeviceIsolationFreezeLease;
15
+ reused: boolean;
16
+ } | {
17
+ ok: false;
18
+ reason: 'busy';
19
+ };
20
+ export declare function acquireDeviceIsolationFreeze(input: {
21
+ nonce: string;
22
+ inventoryGeneration: string;
23
+ now?: number;
24
+ leaseMs?: number;
25
+ leaseIdFactory?: () => string;
26
+ }): AcquireDeviceIsolationFreezeResult;
27
+ export declare function requireDeviceIsolationFreeze(input: {
28
+ nonce: string;
29
+ leaseId: string;
30
+ now?: number;
31
+ }): DeviceIsolationFreezeLease | null;
32
+ /**
33
+ * Bind the post-freeze inventory to the lease. Prepare must acquire the spawn
34
+ * barrier before it looks at sessions; otherwise a worker can appear between
35
+ * inventory and freeze. Only the holder may replace the provisional value.
36
+ */
37
+ export declare function bindDeviceIsolationFreezeInventoryGeneration(input: {
38
+ nonce: string;
39
+ leaseId: string;
40
+ inventoryGeneration: string;
41
+ now?: number;
42
+ }): DeviceIsolationFreezeLease | null;
43
+ export declare function releaseDeviceIsolationFreeze(input: {
44
+ nonce: string;
45
+ leaseId: string;
46
+ now?: number;
47
+ }): boolean;
48
+ /**
49
+ * Queue only the first spawn request for a logical session. Later turns are
50
+ * already retained by the session's normal pending-input machinery; replaying
51
+ * multiple fork requests would instead kill and replace the first new worker.
52
+ */
53
+ export declare function deferWorkerSpawnDuringDeviceIsolation(sessionId: string, callback: () => void, now?: number): boolean;
54
+ /** Test-only reset; production callers release through the lease protocol. */
55
+ export declare function resetDeviceIsolationActivationForTest(): void;
56
+ //# sourceMappingURL=device-isolation-activation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-isolation-activation.d.ts","sourceRoot":"","sources":["../../src/core/device-isolation-activation.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,mCAAmC,EAAG,CAAU,CAAC;AAC9D,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAEvD,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,EAAE,OAAO,mCAAmC,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyBD,wBAAgB,iCAAiC,CAC/C,GAAG,SAAa,GACf,0BAA0B,GAAG,IAAI,CAGnC;AAED,MAAM,MAAM,kCAAkC,GAC1C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,0BAA0B,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAChE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;CAC/B,GAAG,kCAAkC,CAuBrC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,0BAA0B,GAAG,IAAI,CAMpC;AAED;;;;GAIG;AACH,wBAAgB,4CAA4C,CAAC,KAAK,EAAE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,0BAA0B,GAAG,IAAI,CAIpC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAMV;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,IAAI,EACpB,GAAG,SAAa,GACf,OAAO,CAIT;AAED,8EAA8E;AAC9E,wBAAgB,qCAAqC,IAAI,IAAI,CAI5D"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Short-lived daemon barrier used while a host enables device credentials.
3
+ *
4
+ * The barrier is deliberately process-local: the host CLI acquires one lease
5
+ * from every online botmux daemon before it writes the one-way marker. While a
6
+ * lease is held, forkWorker queues at most one cold spawn per logical session;
7
+ * existing workers are inventoried and torn down by the authenticated daemon
8
+ * IPC route. A bounded lease prevents a crashed host CLI from wedging a daemon
9
+ * forever. No device secret is written until every daemon has committed and
10
+ * released its lease.
11
+ */
12
+ import { randomUUID } from 'node:crypto';
13
+ export const DEVICE_ISOLATION_ACTIVATION_VERSION = 1;
14
+ export const DEVICE_ISOLATION_FREEZE_LEASE_MS = 30_000;
15
+ let lease = null;
16
+ let expiryTimer = null;
17
+ const deferredSpawns = new Map();
18
+ function clearExpiryTimer() {
19
+ if (!expiryTimer)
20
+ return;
21
+ clearTimeout(expiryTimer);
22
+ expiryTimer = null;
23
+ }
24
+ function flushDeferredSpawns() {
25
+ const callbacks = [...deferredSpawns.values()];
26
+ deferredSpawns.clear();
27
+ for (const callback of callbacks)
28
+ setImmediate(callback);
29
+ }
30
+ function expireIfNeeded(now = Date.now()) {
31
+ if (!lease || lease.expiresAt > now)
32
+ return;
33
+ lease = null;
34
+ clearExpiryTimer();
35
+ flushDeferredSpawns();
36
+ }
37
+ export function currentDeviceIsolationFreezeLease(now = Date.now()) {
38
+ expireIfNeeded(now);
39
+ return lease ? { ...lease } : null;
40
+ }
41
+ export function acquireDeviceIsolationFreeze(input) {
42
+ const now = input.now ?? Date.now();
43
+ expireIfNeeded(now);
44
+ if (lease) {
45
+ if (lease.nonce !== input.nonce)
46
+ return { ok: false, reason: 'busy' };
47
+ return { ok: true, lease: { ...lease }, reused: true };
48
+ }
49
+ const leaseMs = input.leaseMs ?? DEVICE_ISOLATION_FREEZE_LEASE_MS;
50
+ if (!Number.isSafeInteger(leaseMs) || leaseMs < 1_000 || leaseMs > 120_000) {
51
+ throw new Error('invalid device-isolation freeze lease');
52
+ }
53
+ lease = {
54
+ activationVersion: DEVICE_ISOLATION_ACTIVATION_VERSION,
55
+ leaseId: (input.leaseIdFactory ?? randomUUID)(),
56
+ nonce: input.nonce,
57
+ inventoryGeneration: input.inventoryGeneration,
58
+ acquiredAt: now,
59
+ expiresAt: now + leaseMs,
60
+ };
61
+ clearExpiryTimer();
62
+ expiryTimer = setTimeout(() => expireIfNeeded(), leaseMs + 1);
63
+ expiryTimer.unref?.();
64
+ return { ok: true, lease: { ...lease }, reused: false };
65
+ }
66
+ export function requireDeviceIsolationFreeze(input) {
67
+ const current = currentDeviceIsolationFreezeLease(input.now);
68
+ if (!current || current.nonce !== input.nonce || current.leaseId !== input.leaseId) {
69
+ return null;
70
+ }
71
+ return current;
72
+ }
73
+ /**
74
+ * Bind the post-freeze inventory to the lease. Prepare must acquire the spawn
75
+ * barrier before it looks at sessions; otherwise a worker can appear between
76
+ * inventory and freeze. Only the holder may replace the provisional value.
77
+ */
78
+ export function bindDeviceIsolationFreezeInventoryGeneration(input) {
79
+ if (!requireDeviceIsolationFreeze(input) || !lease)
80
+ return null;
81
+ lease.inventoryGeneration = input.inventoryGeneration;
82
+ return { ...lease };
83
+ }
84
+ export function releaseDeviceIsolationFreeze(input) {
85
+ if (!requireDeviceIsolationFreeze(input))
86
+ return false;
87
+ lease = null;
88
+ clearExpiryTimer();
89
+ flushDeferredSpawns();
90
+ return true;
91
+ }
92
+ /**
93
+ * Queue only the first spawn request for a logical session. Later turns are
94
+ * already retained by the session's normal pending-input machinery; replaying
95
+ * multiple fork requests would instead kill and replace the first new worker.
96
+ */
97
+ export function deferWorkerSpawnDuringDeviceIsolation(sessionId, callback, now = Date.now()) {
98
+ if (!currentDeviceIsolationFreezeLease(now))
99
+ return false;
100
+ if (!deferredSpawns.has(sessionId))
101
+ deferredSpawns.set(sessionId, callback);
102
+ return true;
103
+ }
104
+ /** Test-only reset; production callers release through the lease protocol. */
105
+ export function resetDeviceIsolationActivationForTest() {
106
+ lease = null;
107
+ clearExpiryTimer();
108
+ deferredSpawns.clear();
109
+ }
110
+ //# sourceMappingURL=device-isolation-activation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-isolation-activation.js","sourceRoot":"","sources":["../../src/core/device-isolation-activation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAU,CAAC;AAC9D,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAWvD,IAAI,KAAK,GAAsC,IAAI,CAAC;AACpD,IAAI,WAAW,GAA0B,IAAI,CAAC;AAC9C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAsB,CAAC;AAErD,SAAS,gBAAgB;IACvB,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,YAAY,CAAC,WAAW,CAAC,CAAC;IAC1B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,SAAS,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,cAAc,CAAC,KAAK,EAAE,CAAC;IACvB,KAAK,MAAM,QAAQ,IAAI,SAAS;QAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACtC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO;IAC5C,KAAK,GAAG,IAAI,CAAC;IACb,gBAAgB,EAAE,CAAC;IACnB,mBAAmB,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAMD,MAAM,UAAU,4BAA4B,CAAC,KAM5C;IACC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACpC,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,gCAAgC,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,GAAG;QACN,iBAAiB,EAAE,mCAAmC;QACtD,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,IAAI,UAAU,CAAC,EAAE;QAC/C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,GAAG,GAAG,OAAO;KACzB,CAAC;IACF,gBAAgB,EAAE,CAAC;IACnB,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAC9D,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;IACtB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAI5C;IACC,MAAM,OAAO,GAAG,iCAAiC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4CAA4C,CAAC,KAK5D;IACC,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAChE,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,CAAC;IACtD,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAI5C;IACC,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,KAAK,GAAG,IAAI,CAAC;IACb,gBAAgB,EAAE,CAAC;IACnB,mBAAmB,EAAE,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qCAAqC,CACnD,SAAiB,EACjB,QAAoB,EACpB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,IAAI,CAAC,iCAAiC,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,qCAAqC;IACnD,KAAK,GAAG,IAAI,CAAC;IACb,gBAAgB,EAAE,CAAC;IACnB,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,84 @@
1
+ import type { BackendType, SessionProbe } from '../adapters/backend/types.js';
2
+ import type { DaemonSession } from './types.js';
3
+ export declare const DEVICE_ISOLATION_PREPARE_PATH = "/api/device-isolation/activation/prepare";
4
+ export declare const DEVICE_ISOLATION_COMMIT_PATH = "/api/device-isolation/activation/commit";
5
+ export declare const DEVICE_ISOLATION_RELEASE_PATH = "/api/device-isolation/activation/release";
6
+ type LocalPersistentBackend = 'tmux' | 'herdr' | 'zellij';
7
+ type InventoryBackend = BackendType | 'unknown';
8
+ type ProcessIdentity = {
9
+ pid: number;
10
+ procStart: string;
11
+ };
12
+ export type DeviceIsolationBlocker = 'adopted_session' | 'unknown_backend' | 'unattested_worker' | 'stale_attestation' | 'process_identity_unavailable' | 'backend_probe_unknown' | 'backend_inconsistent';
13
+ export interface DeviceIsolationRuntimeSession {
14
+ sessionId: string;
15
+ adopted: boolean;
16
+ /** Backend stamped by daemon-owned state, if this session predates no stamp. */
17
+ frozenBackend?: BackendType;
18
+ workerPresent: boolean;
19
+ workerGeneration?: number;
20
+ worker?: ProcessIdentity;
21
+ attestation?: {
22
+ backendType: BackendType;
23
+ credentialIsolated: boolean;
24
+ cli?: ProcessIdentity;
25
+ workerGeneration?: number;
26
+ };
27
+ /** Opaque production handle. It is deliberately excluded from generation. */
28
+ source?: DaemonSession;
29
+ }
30
+ export interface DeviceIsolationInventoryEntry {
31
+ sessionId: string;
32
+ backendType: InventoryBackend;
33
+ disposition: 'blocked' | 'owned_local' | 'safe_remote' | 'quiescent';
34
+ credentialIsolated?: boolean;
35
+ worker?: ProcessIdentity;
36
+ cli?: ProcessIdentity;
37
+ workerGeneration?: number;
38
+ persistent?: {
39
+ backendType: LocalPersistentBackend;
40
+ name: string;
41
+ probe: SessionProbe;
42
+ };
43
+ blocker?: DeviceIsolationBlocker;
44
+ }
45
+ export interface DeviceIsolationInventory {
46
+ generation: string;
47
+ entries: DeviceIsolationInventoryEntry[];
48
+ blockers: Array<{
49
+ sessionId: string;
50
+ blocker: DeviceIsolationBlocker;
51
+ }>;
52
+ }
53
+ export interface DeviceIsolationDaemonIdentity {
54
+ larkAppId: string;
55
+ bootInstanceId: string;
56
+ }
57
+ export interface DeviceIsolationDaemonDependencies {
58
+ now: () => number;
59
+ listSessions: () => DeviceIsolationRuntimeSession[];
60
+ processStart: (pid: number) => string | undefined;
61
+ processExists: (pid: number) => boolean;
62
+ signalProcess: (pid: number, signal: NodeJS.Signals) => void;
63
+ probePersistent: (backendType: LocalPersistentBackend, name: string) => SessionProbe;
64
+ killPersistent: (backendType: LocalPersistentBackend, name: string) => void;
65
+ closeWorker: (session: DeviceIsolationRuntimeSession) => void;
66
+ readMarker: () => string | null;
67
+ sleep: (ms: number) => Promise<void>;
68
+ dataDir: () => string;
69
+ }
70
+ export type DeviceIsolationDaemonResult = {
71
+ status: 200 | 409 | 423 | 503;
72
+ body: Record<string, unknown>;
73
+ };
74
+ export declare function buildDeviceIsolationInventory(): DeviceIsolationInventory;
75
+ export declare function setDeviceIsolationDaemonIdentity(identity: DeviceIsolationDaemonIdentity | null): void;
76
+ export declare function prepareDeviceIsolationActivation(body: unknown): DeviceIsolationDaemonResult;
77
+ export declare function commitDeviceIsolationActivation(body: unknown): Promise<DeviceIsolationDaemonResult>;
78
+ export declare function releaseDeviceIsolationActivation(body: unknown): DeviceIsolationDaemonResult;
79
+ /** Test seams keep process and backend destruction out of unit tests. */
80
+ export declare function setDeviceIsolationDaemonDependenciesForTest(overrides: Partial<DeviceIsolationDaemonDependencies> | null): void;
81
+ export declare function resetDeviceIsolationDaemonForTest(): void;
82
+ export declare function logDeviceIsolationActivationError(error: unknown): void;
83
+ export {};
84
+ //# sourceMappingURL=device-isolation-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-isolation-daemon.d.ts","sourceRoot":"","sources":["../../src/core/device-isolation-daemon.ts"],"names":[],"mappings":"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"}