@geminixiang/mikan 1.0.0-beta.9 → 1.0.0-beta.91

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 (998) hide show
  1. package/CHANGELOG.md +342 -424
  2. package/README.md +102 -42
  3. package/dist/adapters/commands/admin.d.ts.map +1 -0
  4. package/dist/adapters/commands/admin.js +33 -0
  5. package/dist/adapters/commands/admin.js.map +1 -0
  6. package/dist/adapters/commands/auto-reply.d.ts +5 -0
  7. package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
  8. package/dist/adapters/commands/auto-reply.js +47 -0
  9. package/dist/adapters/commands/auto-reply.js.map +1 -0
  10. package/dist/adapters/commands/login.d.ts +6 -0
  11. package/dist/adapters/commands/login.d.ts.map +1 -0
  12. package/dist/adapters/commands/login.js +158 -0
  13. package/dist/adapters/commands/login.js.map +1 -0
  14. package/dist/adapters/commands/manifest.d.ts +17 -0
  15. package/dist/adapters/commands/manifest.d.ts.map +1 -0
  16. package/dist/adapters/commands/manifest.js +121 -0
  17. package/dist/adapters/commands/manifest.js.map +1 -0
  18. package/dist/adapters/commands/model.d.ts +9 -0
  19. package/dist/adapters/commands/model.d.ts.map +1 -0
  20. package/dist/adapters/commands/model.js +136 -0
  21. package/dist/adapters/commands/model.js.map +1 -0
  22. package/dist/adapters/commands/new.d.ts.map +1 -0
  23. package/dist/adapters/commands/new.js +39 -0
  24. package/dist/adapters/commands/new.js.map +1 -0
  25. package/dist/adapters/commands/registry.d.ts +4 -0
  26. package/dist/adapters/commands/registry.d.ts.map +1 -0
  27. package/dist/adapters/commands/registry.js +35 -0
  28. package/dist/adapters/commands/registry.js.map +1 -0
  29. package/dist/adapters/commands/sandbox.d.ts +6 -0
  30. package/dist/adapters/commands/sandbox.d.ts.map +1 -0
  31. package/dist/adapters/commands/sandbox.js +125 -0
  32. package/dist/adapters/commands/sandbox.js.map +1 -0
  33. package/dist/adapters/commands/session-view.d.ts.map +1 -0
  34. package/dist/adapters/commands/session-view.js +46 -0
  35. package/dist/adapters/commands/session-view.js.map +1 -0
  36. package/dist/adapters/commands/types.d.ts +105 -0
  37. package/dist/adapters/commands/types.d.ts.map +1 -0
  38. package/dist/adapters/commands/types.js.map +1 -0
  39. package/dist/adapters/commands/utils.d.ts +11 -0
  40. package/dist/adapters/commands/utils.d.ts.map +1 -0
  41. package/dist/adapters/commands/utils.js +43 -0
  42. package/dist/adapters/commands/utils.js.map +1 -0
  43. package/dist/adapters/discord/bot.d.ts +14 -18
  44. package/dist/adapters/discord/bot.d.ts.map +1 -1
  45. package/dist/adapters/discord/bot.js +234 -303
  46. package/dist/adapters/discord/bot.js.map +1 -1
  47. package/dist/adapters/discord/components.d.ts +4 -0
  48. package/dist/adapters/discord/components.d.ts.map +1 -0
  49. package/dist/adapters/discord/components.js +9 -0
  50. package/dist/adapters/discord/components.js.map +1 -0
  51. package/dist/adapters/discord/context.d.ts +3 -7
  52. package/dist/adapters/discord/context.d.ts.map +1 -1
  53. package/dist/adapters/discord/context.js +57 -219
  54. package/dist/adapters/discord/context.js.map +1 -1
  55. package/dist/adapters/discord/format.d.ts +2 -0
  56. package/dist/adapters/discord/format.d.ts.map +1 -0
  57. package/dist/adapters/discord/format.js +47 -0
  58. package/dist/adapters/discord/format.js.map +1 -0
  59. package/dist/adapters/discord/types.d.ts +91 -1
  60. package/dist/adapters/discord/types.d.ts.map +1 -1
  61. package/dist/adapters/discord/types.js.map +1 -1
  62. package/dist/adapters/github/activity.d.ts +3 -0
  63. package/dist/adapters/github/activity.d.ts.map +1 -0
  64. package/dist/adapters/github/activity.js +148 -0
  65. package/dist/adapters/github/activity.js.map +1 -0
  66. package/dist/adapters/github/bot.d.ts +24 -37
  67. package/dist/adapters/github/bot.d.ts.map +1 -1
  68. package/dist/adapters/github/bot.js +209 -397
  69. package/dist/adapters/github/bot.js.map +1 -1
  70. package/dist/adapters/github/client.d.ts +32 -49
  71. package/dist/adapters/github/client.d.ts.map +1 -1
  72. package/dist/adapters/github/client.js +108 -118
  73. package/dist/adapters/github/client.js.map +1 -1
  74. package/dist/adapters/github/context.d.ts +3 -8
  75. package/dist/adapters/github/context.d.ts.map +1 -1
  76. package/dist/adapters/github/context.js +74 -138
  77. package/dist/adapters/github/context.js.map +1 -1
  78. package/dist/adapters/github/github-ops.d.ts +14 -0
  79. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  80. package/dist/adapters/github/github-ops.js +218 -0
  81. package/dist/adapters/github/github-ops.js.map +1 -0
  82. package/dist/adapters/github/ids.d.ts +2 -23
  83. package/dist/adapters/github/ids.d.ts.map +1 -1
  84. package/dist/adapters/github/ids.js +6 -36
  85. package/dist/adapters/github/ids.js.map +1 -1
  86. package/dist/adapters/github/policy.d.ts +19 -0
  87. package/dist/adapters/github/policy.d.ts.map +1 -0
  88. package/dist/adapters/github/policy.js +79 -0
  89. package/dist/adapters/github/policy.js.map +1 -0
  90. package/dist/adapters/github/tool-pack.d.ts +4 -0
  91. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  92. package/dist/adapters/github/tool-pack.js +40 -0
  93. package/dist/adapters/github/tool-pack.js.map +1 -0
  94. package/dist/adapters/github/tools/checks.d.ts +14 -0
  95. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  96. package/dist/adapters/github/tools/checks.js +78 -0
  97. package/dist/adapters/github/tools/checks.js.map +1 -0
  98. package/dist/adapters/github/tools/issue.d.ts +18 -0
  99. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  100. package/dist/adapters/github/tools/issue.js +44 -0
  101. package/dist/adapters/github/tools/issue.js.map +1 -0
  102. package/dist/adapters/github/tools/pr.d.ts +17 -0
  103. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  104. package/dist/adapters/github/tools/pr.js +40 -0
  105. package/dist/adapters/github/tools/pr.js.map +1 -0
  106. package/dist/adapters/github/tools/read.d.ts +17 -0
  107. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  108. package/dist/adapters/github/tools/read.js +134 -0
  109. package/dist/adapters/github/tools/read.js.map +1 -0
  110. package/dist/adapters/github/tools/review-reply.d.ts +14 -0
  111. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  112. package/dist/adapters/github/tools/review-reply.js +34 -0
  113. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  114. package/dist/adapters/github/types.d.ts +200 -57
  115. package/dist/adapters/github/types.d.ts.map +1 -1
  116. package/dist/adapters/github/types.js.map +1 -1
  117. package/dist/adapters/github/webhook.d.ts +7 -0
  118. package/dist/adapters/github/webhook.d.ts.map +1 -0
  119. package/dist/adapters/github/webhook.js +104 -0
  120. package/dist/adapters/github/webhook.js.map +1 -0
  121. package/dist/adapters/intake.d.ts +4 -10
  122. package/dist/adapters/intake.d.ts.map +1 -1
  123. package/dist/adapters/intake.js +85 -32
  124. package/dist/adapters/intake.js.map +1 -1
  125. package/dist/adapters/markdown-tables.d.ts +8 -0
  126. package/dist/adapters/markdown-tables.d.ts.map +1 -0
  127. package/dist/adapters/markdown-tables.js +111 -0
  128. package/dist/adapters/markdown-tables.js.map +1 -0
  129. package/dist/adapters/messages.d.ts +13 -0
  130. package/dist/adapters/messages.d.ts.map +1 -0
  131. package/dist/adapters/messages.js +39 -0
  132. package/dist/adapters/messages.js.map +1 -0
  133. package/dist/adapters/progressive-renderer.d.ts +7 -0
  134. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  135. package/dist/adapters/progressive-renderer.js +426 -0
  136. package/dist/adapters/progressive-renderer.js.map +1 -0
  137. package/dist/adapters/shared.d.ts +27 -53
  138. package/dist/adapters/shared.d.ts.map +1 -1
  139. package/dist/adapters/shared.js +167 -91
  140. package/dist/adapters/shared.js.map +1 -1
  141. package/dist/adapters/slack/assistant.d.ts +21 -0
  142. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  143. package/dist/adapters/slack/assistant.js +103 -0
  144. package/dist/adapters/slack/assistant.js.map +1 -0
  145. package/dist/adapters/slack/auto-reply-context.d.ts +14 -0
  146. package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
  147. package/dist/adapters/slack/auto-reply-context.js +21 -0
  148. package/dist/adapters/slack/auto-reply-context.js.map +1 -0
  149. package/dist/adapters/slack/blocks.d.ts +5 -0
  150. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  151. package/dist/adapters/slack/blocks.js +144 -145
  152. package/dist/adapters/slack/blocks.js.map +1 -1
  153. package/dist/adapters/slack/bot.d.ts +60 -40
  154. package/dist/adapters/slack/bot.d.ts.map +1 -1
  155. package/dist/adapters/slack/bot.js +968 -588
  156. package/dist/adapters/slack/bot.js.map +1 -1
  157. package/dist/adapters/slack/context.d.ts +3 -9
  158. package/dist/adapters/slack/context.d.ts.map +1 -1
  159. package/dist/adapters/slack/context.js +8 -17
  160. package/dist/adapters/slack/context.js.map +1 -1
  161. package/dist/adapters/slack/jev-context.d.ts +17 -0
  162. package/dist/adapters/slack/jev-context.d.ts.map +1 -0
  163. package/dist/adapters/slack/jev-context.js +57 -0
  164. package/dist/adapters/slack/jev-context.js.map +1 -0
  165. package/dist/adapters/slack/markdown.d.ts +2 -0
  166. package/dist/adapters/slack/markdown.d.ts.map +1 -0
  167. package/dist/adapters/slack/markdown.js +43 -0
  168. package/dist/adapters/slack/markdown.js.map +1 -0
  169. package/dist/adapters/slack/persona.d.ts +6 -0
  170. package/dist/adapters/slack/persona.d.ts.map +1 -0
  171. package/dist/adapters/slack/persona.js +13 -0
  172. package/dist/adapters/slack/persona.js.map +1 -0
  173. package/dist/adapters/slack/response-lifecycle.d.ts +3 -4
  174. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  175. package/dist/adapters/slack/response-lifecycle.js +222 -348
  176. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  177. package/dist/adapters/slack/session.d.ts +3 -2
  178. package/dist/adapters/slack/session.d.ts.map +1 -1
  179. package/dist/adapters/slack/session.js +9 -13
  180. package/dist/adapters/slack/session.js.map +1 -1
  181. package/dist/adapters/slack/stream-limits.d.ts +10 -0
  182. package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
  183. package/dist/adapters/slack/stream-limits.js +22 -0
  184. package/dist/adapters/slack/stream-limits.js.map +1 -0
  185. package/dist/adapters/slack/task-intent.d.ts +19 -0
  186. package/dist/adapters/slack/task-intent.d.ts.map +1 -0
  187. package/dist/adapters/slack/task-intent.js +65 -0
  188. package/dist/adapters/slack/task-intent.js.map +1 -0
  189. package/dist/adapters/slack/task-status.d.ts +7 -0
  190. package/dist/adapters/slack/task-status.d.ts.map +1 -0
  191. package/dist/adapters/slack/task-status.js +96 -0
  192. package/dist/adapters/slack/task-status.js.map +1 -0
  193. package/dist/adapters/slack/tool-pack.d.ts +4 -0
  194. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  195. package/dist/adapters/slack/tool-pack.js +40 -0
  196. package/dist/adapters/slack/tool-pack.js.map +1 -0
  197. package/dist/adapters/slack/tools/blockkit.d.ts +17 -0
  198. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  199. package/dist/adapters/slack/tools/blockkit.js +98 -0
  200. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  201. package/dist/adapters/slack/types.d.ts +91 -5
  202. package/dist/adapters/slack/types.d.ts.map +1 -1
  203. package/dist/adapters/slack/types.js.map +1 -1
  204. package/dist/adapters/slack/update-diagnostics.d.ts +13 -0
  205. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
  206. package/dist/adapters/slack/update-diagnostics.js +128 -0
  207. package/dist/adapters/slack/update-diagnostics.js.map +1 -0
  208. package/dist/adapters/telegram/bot.d.ts +12 -19
  209. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  210. package/dist/adapters/telegram/bot.js +114 -239
  211. package/dist/adapters/telegram/bot.js.map +1 -1
  212. package/dist/adapters/telegram/context.d.ts +3 -7
  213. package/dist/adapters/telegram/context.d.ts.map +1 -1
  214. package/dist/adapters/telegram/context.js +49 -191
  215. package/dist/adapters/telegram/context.js.map +1 -1
  216. package/dist/adapters/telegram/types.d.ts +24 -1
  217. package/dist/adapters/telegram/types.d.ts.map +1 -1
  218. package/dist/adapters/telegram/types.js.map +1 -1
  219. package/dist/adapters/types.d.ts +92 -17
  220. package/dist/adapters/types.d.ts.map +1 -1
  221. package/dist/adapters/types.js.map +1 -1
  222. package/dist/adapters/web/admin/client-assets.d.ts +4 -0
  223. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
  224. package/dist/adapters/web/admin/client-assets.js +1766 -0
  225. package/dist/adapters/web/admin/client-assets.js.map +1 -0
  226. package/dist/adapters/web/admin/portal.d.ts +26 -0
  227. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  228. package/dist/adapters/web/admin/portal.js +1490 -0
  229. package/dist/adapters/web/admin/portal.js.map +1 -0
  230. package/dist/adapters/web/admin/provider-models.d.ts +10 -0
  231. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  232. package/dist/adapters/web/admin/provider-models.js +103 -0
  233. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  234. package/dist/adapters/web/admin/types.d.ts +54 -0
  235. package/dist/adapters/web/admin/types.d.ts.map +1 -0
  236. package/dist/adapters/web/admin/types.js.map +1 -0
  237. package/dist/adapters/web/login/oauth.d.ts +4 -0
  238. package/dist/adapters/web/login/oauth.d.ts.map +1 -0
  239. package/dist/adapters/web/login/oauth.js +219 -0
  240. package/dist/adapters/web/login/oauth.js.map +1 -0
  241. package/dist/adapters/web/login/portal.d.ts +10 -0
  242. package/dist/adapters/web/login/portal.d.ts.map +1 -0
  243. package/dist/adapters/web/login/portal.js +1336 -0
  244. package/dist/adapters/web/login/portal.js.map +1 -0
  245. package/dist/adapters/web/login/types.d.ts +34 -0
  246. package/dist/adapters/web/login/types.d.ts.map +1 -0
  247. package/dist/adapters/web/login/types.js.map +1 -0
  248. package/dist/adapters/web/portal-shell.d.ts +9 -0
  249. package/dist/adapters/web/portal-shell.d.ts.map +1 -0
  250. package/dist/adapters/web/portal-shell.js +428 -0
  251. package/dist/adapters/web/portal-shell.js.map +1 -0
  252. package/dist/adapters/web/server.d.ts +35 -0
  253. package/dist/adapters/web/server.d.ts.map +1 -0
  254. package/dist/adapters/web/server.js +80 -0
  255. package/dist/adapters/web/server.js.map +1 -0
  256. package/dist/adapters/web/session-view/portal.d.ts +19 -0
  257. package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
  258. package/dist/adapters/web/session-view/portal.js +1833 -0
  259. package/dist/adapters/web/session-view/portal.js.map +1 -0
  260. package/dist/adapters/web/session-view/types.d.ts +45 -0
  261. package/dist/adapters/web/session-view/types.d.ts.map +1 -0
  262. package/dist/adapters/web/session-view/types.js.map +1 -0
  263. package/dist/adapters/web/token-store.d.ts +10 -0
  264. package/dist/adapters/web/token-store.d.ts.map +1 -0
  265. package/dist/adapters/web/token-store.js +42 -0
  266. package/dist/adapters/web/token-store.js.map +1 -0
  267. package/dist/adapters/web/types.d.ts.map +1 -0
  268. package/dist/adapters/web/types.js.map +1 -0
  269. package/dist/cli/arg-grammar.d.ts +8 -0
  270. package/dist/cli/arg-grammar.d.ts.map +1 -0
  271. package/dist/cli/arg-grammar.js +47 -0
  272. package/dist/cli/arg-grammar.js.map +1 -0
  273. package/dist/cli/boot.d.ts +4 -0
  274. package/dist/cli/boot.d.ts.map +1 -0
  275. package/dist/cli/boot.js +79 -0
  276. package/dist/cli/boot.js.map +1 -0
  277. package/dist/cli/download.d.ts.map +1 -0
  278. package/dist/cli/download.js +84 -0
  279. package/dist/cli/download.js.map +1 -0
  280. package/dist/cli/migrate.d.ts +3 -0
  281. package/dist/cli/migrate.d.ts.map +1 -0
  282. package/dist/cli/migrate.js +74 -0
  283. package/dist/cli/migrate.js.map +1 -0
  284. package/dist/cli/office.d.ts +2 -0
  285. package/dist/cli/office.d.ts.map +1 -0
  286. package/dist/cli/office.js +30 -0
  287. package/dist/cli/office.js.map +1 -0
  288. package/dist/cli/onboard.d.ts +7 -0
  289. package/dist/cli/onboard.d.ts.map +1 -0
  290. package/dist/cli/onboard.js +192 -0
  291. package/dist/cli/onboard.js.map +1 -0
  292. package/dist/cli/process-lifecycle.d.ts +14 -0
  293. package/dist/cli/process-lifecycle.d.ts.map +1 -0
  294. package/dist/cli/process-lifecycle.js +61 -0
  295. package/dist/cli/process-lifecycle.js.map +1 -0
  296. package/dist/cli/types.d.ts +20 -0
  297. package/dist/cli/types.d.ts.map +1 -0
  298. package/dist/cli/types.js.map +1 -0
  299. package/dist/env-manifest.d.ts +14 -0
  300. package/dist/env-manifest.d.ts.map +1 -0
  301. package/dist/env-manifest.js +255 -0
  302. package/dist/env-manifest.js.map +1 -0
  303. package/dist/events/index.d.ts +105 -0
  304. package/dist/events/index.d.ts.map +1 -0
  305. package/dist/events/index.js +252 -0
  306. package/dist/events/index.js.map +1 -0
  307. package/dist/events/scheduler.d.ts +24 -0
  308. package/dist/events/scheduler.d.ts.map +1 -0
  309. package/dist/events/scheduler.js +221 -0
  310. package/dist/events/scheduler.js.map +1 -0
  311. package/dist/file-guards.d.ts +20 -0
  312. package/dist/file-guards.d.ts.map +1 -0
  313. package/dist/file-guards.js +166 -0
  314. package/dist/file-guards.js.map +1 -0
  315. package/dist/harness/budget-stop.d.ts +3 -0
  316. package/dist/harness/budget-stop.d.ts.map +1 -0
  317. package/dist/harness/budget-stop.js +36 -0
  318. package/dist/harness/budget-stop.js.map +1 -0
  319. package/dist/harness/execution-env.d.ts +4 -0
  320. package/dist/harness/execution-env.d.ts.map +1 -0
  321. package/dist/harness/execution-env.js +245 -0
  322. package/dist/harness/execution-env.js.map +1 -0
  323. package/dist/harness/execution-resolver.d.ts +23 -0
  324. package/dist/harness/execution-resolver.d.ts.map +1 -0
  325. package/dist/harness/execution-resolver.js +152 -0
  326. package/dist/harness/execution-resolver.js.map +1 -0
  327. package/dist/harness/http.d.ts +0 -12
  328. package/dist/harness/http.d.ts.map +1 -1
  329. package/dist/harness/http.js +0 -34
  330. package/dist/harness/http.js.map +1 -1
  331. package/dist/harness/index.d.ts +18 -17
  332. package/dist/harness/index.d.ts.map +1 -1
  333. package/dist/harness/index.js +11 -15
  334. package/dist/harness/index.js.map +1 -1
  335. package/dist/harness/jev.d.ts +67 -0
  336. package/dist/harness/jev.d.ts.map +1 -0
  337. package/dist/harness/jev.js +135 -0
  338. package/dist/harness/jev.js.map +1 -0
  339. package/dist/harness/loop-guard.d.ts +10 -0
  340. package/dist/harness/loop-guard.d.ts.map +1 -0
  341. package/dist/harness/loop-guard.js +111 -0
  342. package/dist/harness/loop-guard.js.map +1 -0
  343. package/dist/harness/mcp-result.d.ts +21 -0
  344. package/dist/harness/mcp-result.d.ts.map +1 -0
  345. package/dist/harness/mcp-result.js +204 -0
  346. package/dist/harness/mcp-result.js.map +1 -0
  347. package/dist/harness/mcp.d.ts +17 -0
  348. package/dist/harness/mcp.d.ts.map +1 -0
  349. package/dist/harness/mcp.js +339 -0
  350. package/dist/harness/mcp.js.map +1 -0
  351. package/dist/harness/models.d.ts +2 -19
  352. package/dist/harness/models.d.ts.map +1 -1
  353. package/dist/harness/models.js +43 -95
  354. package/dist/harness/models.js.map +1 -1
  355. package/dist/harness/open-connector.d.ts +3 -0
  356. package/dist/harness/open-connector.d.ts.map +1 -0
  357. package/dist/harness/open-connector.js +106 -0
  358. package/dist/harness/open-connector.js.map +1 -0
  359. package/dist/harness/presenter.d.ts +11 -0
  360. package/dist/harness/presenter.d.ts.map +1 -0
  361. package/dist/harness/presenter.js +867 -0
  362. package/dist/harness/presenter.js.map +1 -0
  363. package/dist/harness/prompt.d.ts +17 -0
  364. package/dist/harness/prompt.d.ts.map +1 -0
  365. package/dist/harness/prompt.js +348 -0
  366. package/dist/harness/prompt.js.map +1 -0
  367. package/dist/harness/run-events.d.ts +10 -0
  368. package/dist/harness/run-events.d.ts.map +1 -0
  369. package/dist/harness/run-events.js +126 -0
  370. package/dist/harness/run-events.js.map +1 -0
  371. package/dist/harness/runner.d.ts +2 -123
  372. package/dist/harness/runner.d.ts.map +1 -1
  373. package/dist/harness/runner.js +570 -414
  374. package/dist/harness/runner.js.map +1 -1
  375. package/dist/harness/session.d.ts +102 -0
  376. package/dist/harness/session.d.ts.map +1 -0
  377. package/dist/harness/session.js +725 -0
  378. package/dist/harness/session.js.map +1 -0
  379. package/dist/harness/skills.d.ts +7 -41
  380. package/dist/harness/skills.d.ts.map +1 -1
  381. package/dist/harness/skills.js +120 -69
  382. package/dist/harness/skills.js.map +1 -1
  383. package/dist/harness/subagent-profiles.d.ts +3 -0
  384. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  385. package/dist/harness/subagent-profiles.js +260 -0
  386. package/dist/harness/subagent-profiles.js.map +1 -0
  387. package/dist/harness/subagent.d.ts +39 -0
  388. package/dist/harness/subagent.d.ts.map +1 -0
  389. package/dist/harness/subagent.js +613 -0
  390. package/dist/harness/subagent.js.map +1 -0
  391. package/dist/harness/tool-args.d.ts +2 -0
  392. package/dist/harness/tool-args.d.ts.map +1 -0
  393. package/dist/harness/tool-args.js +20 -0
  394. package/dist/harness/tool-args.js.map +1 -0
  395. package/dist/harness/tools/attach.d.ts +13 -0
  396. package/dist/harness/tools/attach.d.ts.map +1 -0
  397. package/dist/harness/tools/attach.js +39 -0
  398. package/dist/harness/tools/attach.js.map +1 -0
  399. package/dist/harness/tools/codemode.d.ts +5 -0
  400. package/dist/harness/tools/codemode.d.ts.map +1 -0
  401. package/dist/harness/tools/codemode.js +229 -0
  402. package/dist/harness/tools/codemode.js.map +1 -0
  403. package/dist/harness/tools/event.d.ts +28 -0
  404. package/dist/harness/tools/event.d.ts.map +1 -0
  405. package/dist/harness/tools/event.js +183 -0
  406. package/dist/harness/tools/event.js.map +1 -0
  407. package/dist/harness/tools/generate-image.d.ts +20 -0
  408. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  409. package/dist/harness/tools/generate-image.js +82 -0
  410. package/dist/harness/tools/generate-image.js.map +1 -0
  411. package/dist/harness/tools/history.d.ts +20 -0
  412. package/dist/harness/tools/history.d.ts.map +1 -0
  413. package/dist/harness/tools/history.js +293 -0
  414. package/dist/harness/tools/history.js.map +1 -0
  415. package/dist/harness/tools/host-fn-tool.d.ts +14 -0
  416. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  417. package/dist/harness/tools/host-fn-tool.js +39 -0
  418. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  419. package/dist/harness/tools/index.d.ts +34 -0
  420. package/dist/harness/tools/index.d.ts.map +1 -0
  421. package/dist/harness/tools/index.js +49 -0
  422. package/dist/harness/tools/index.js.map +1 -0
  423. package/dist/harness/tools/jev-browser.d.ts +41 -0
  424. package/dist/harness/tools/jev-browser.d.ts.map +1 -0
  425. package/dist/harness/tools/jev-browser.js +570 -0
  426. package/dist/harness/tools/jev-browser.js.map +1 -0
  427. package/dist/harness/tools/jev.d.ts +15 -0
  428. package/dist/harness/tools/jev.d.ts.map +1 -0
  429. package/dist/harness/tools/jev.js +98 -0
  430. package/dist/harness/tools/jev.js.map +1 -0
  431. package/dist/harness/tools/pi-tools.d.ts +8 -0
  432. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  433. package/dist/harness/tools/pi-tools.js +83 -0
  434. package/dist/harness/tools/pi-tools.js.map +1 -0
  435. package/dist/harness/tools/react.d.ts +12 -0
  436. package/dist/harness/tools/react.d.ts.map +1 -0
  437. package/dist/harness/tools/react.js +25 -0
  438. package/dist/harness/tools/react.js.map +1 -0
  439. package/dist/harness/tools/sandbox.d.ts +24 -0
  440. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  441. package/dist/harness/tools/sandbox.js +79 -0
  442. package/dist/harness/tools/sandbox.js.map +1 -0
  443. package/dist/harness/tools/secret-redaction.d.ts +9 -0
  444. package/dist/harness/tools/secret-redaction.d.ts.map +1 -0
  445. package/dist/harness/tools/secret-redaction.js +88 -0
  446. package/dist/harness/tools/secret-redaction.js.map +1 -0
  447. package/dist/harness/tools/subagent.d.ts +51 -0
  448. package/dist/harness/tools/subagent.d.ts.map +1 -0
  449. package/dist/harness/tools/subagent.js +581 -0
  450. package/dist/harness/tools/subagent.js.map +1 -0
  451. package/dist/harness/tools/task.d.ts +22 -0
  452. package/dist/harness/tools/task.d.ts.map +1 -0
  453. package/dist/harness/tools/task.js +80 -0
  454. package/dist/harness/tools/task.js.map +1 -0
  455. package/dist/harness/tools/tool-search.d.ts +6 -0
  456. package/dist/harness/tools/tool-search.d.ts.map +1 -0
  457. package/dist/harness/tools/tool-search.js +89 -0
  458. package/dist/harness/tools/tool-search.js.map +1 -0
  459. package/dist/harness/tools/types.d.ts +14 -0
  460. package/dist/harness/tools/types.d.ts.map +1 -0
  461. package/dist/harness/tools/types.js.map +1 -0
  462. package/dist/harness/types.d.ts +488 -29
  463. package/dist/harness/types.d.ts.map +1 -1
  464. package/dist/harness/types.js +1 -1
  465. package/dist/harness/types.js.map +1 -1
  466. package/dist/index.d.ts +31 -9
  467. package/dist/index.d.ts.map +1 -1
  468. package/dist/index.js +15 -7
  469. package/dist/index.js.map +1 -1
  470. package/dist/log.d.ts +0 -4
  471. package/dist/log.d.ts.map +1 -1
  472. package/dist/log.js +3 -28
  473. package/dist/log.js.map +1 -1
  474. package/dist/main.js +282 -258
  475. package/dist/main.js.map +1 -1
  476. package/dist/memory-capture/index.d.ts +15 -0
  477. package/dist/memory-capture/index.d.ts.map +1 -0
  478. package/dist/memory-capture/index.js +198 -0
  479. package/dist/memory-capture/index.js.map +1 -0
  480. package/dist/memory-capture/types.d.ts +27 -0
  481. package/dist/memory-capture/types.d.ts.map +1 -0
  482. package/dist/memory-capture/types.js +2 -0
  483. package/dist/memory-capture/types.js.map +1 -0
  484. package/dist/migrations/actor-vaults.d.ts +3 -0
  485. package/dist/migrations/actor-vaults.d.ts.map +1 -0
  486. package/dist/migrations/actor-vaults.js +43 -0
  487. package/dist/migrations/actor-vaults.js.map +1 -0
  488. package/dist/migrations/conversation-settings.d.ts +3 -0
  489. package/dist/migrations/conversation-settings.d.ts.map +1 -0
  490. package/dist/migrations/conversation-settings.js +31 -0
  491. package/dist/migrations/conversation-settings.js.map +1 -0
  492. package/dist/migrations/dream-checkpoints.d.ts +3 -0
  493. package/dist/migrations/dream-checkpoints.d.ts.map +1 -0
  494. package/dist/migrations/dream-checkpoints.js +23 -0
  495. package/dist/migrations/dream-checkpoints.js.map +1 -0
  496. package/dist/migrations/index.d.ts +14 -0
  497. package/dist/migrations/index.d.ts.map +1 -0
  498. package/dist/migrations/index.js +105 -0
  499. package/dist/migrations/index.js.map +1 -0
  500. package/dist/migrations/models-json.d.ts +3 -0
  501. package/dist/migrations/models-json.d.ts.map +1 -0
  502. package/dist/migrations/models-json.js +18 -0
  503. package/dist/migrations/models-json.js.map +1 -0
  504. package/dist/migrations/office-layout.d.ts +4 -0
  505. package/dist/migrations/office-layout.d.ts.map +1 -0
  506. package/dist/migrations/office-layout.js +94 -0
  507. package/dist/migrations/office-layout.js.map +1 -0
  508. package/dist/migrations/office-sessions.d.ts +3 -0
  509. package/dist/migrations/office-sessions.d.ts.map +1 -0
  510. package/dist/migrations/office-sessions.js +81 -0
  511. package/dist/migrations/office-sessions.js.map +1 -0
  512. package/dist/migrations/private-office-dirs.d.ts +3 -0
  513. package/dist/migrations/private-office-dirs.d.ts.map +1 -0
  514. package/dist/migrations/private-office-dirs.js +24 -0
  515. package/dist/migrations/private-office-dirs.js.map +1 -0
  516. package/dist/migrations/sandbox-containers.d.ts +3 -0
  517. package/dist/migrations/sandbox-containers.d.ts.map +1 -0
  518. package/dist/migrations/sandbox-containers.js +36 -0
  519. package/dist/migrations/sandbox-containers.js.map +1 -0
  520. package/dist/migrations/session-files.d.ts +28 -0
  521. package/dist/migrations/session-files.d.ts.map +1 -0
  522. package/dist/migrations/session-files.js +80 -0
  523. package/dist/migrations/session-files.js.map +1 -0
  524. package/dist/migrations/session-v4.d.ts +77 -0
  525. package/dist/migrations/session-v4.d.ts.map +1 -0
  526. package/dist/migrations/session-v4.js +177 -0
  527. package/dist/migrations/session-v4.js.map +1 -0
  528. package/dist/migrations/sessions-sqlite.d.ts +3 -0
  529. package/dist/migrations/sessions-sqlite.d.ts.map +1 -0
  530. package/dist/migrations/sessions-sqlite.js +215 -0
  531. package/dist/migrations/sessions-sqlite.js.map +1 -0
  532. package/dist/migrations/sessions-v3.d.ts +8 -0
  533. package/dist/migrations/sessions-v3.d.ts.map +1 -0
  534. package/dist/migrations/sessions-v3.js +350 -0
  535. package/dist/migrations/sessions-v3.js.map +1 -0
  536. package/dist/migrations/types.d.ts +25 -0
  537. package/dist/migrations/types.d.ts.map +1 -0
  538. package/dist/migrations/types.js +2 -0
  539. package/dist/migrations/types.js.map +1 -0
  540. package/dist/migrations/workspace-events.d.ts +3 -0
  541. package/dist/migrations/workspace-events.d.ts.map +1 -0
  542. package/dist/migrations/workspace-events.js +43 -0
  543. package/dist/migrations/workspace-events.js.map +1 -0
  544. package/dist/observability/index.d.ts +30 -0
  545. package/dist/observability/index.d.ts.map +1 -0
  546. package/dist/observability/index.js +273 -0
  547. package/dist/observability/index.js.map +1 -0
  548. package/dist/observability/instrument.js +9 -6
  549. package/dist/observability/instrument.js.map +1 -1
  550. package/dist/observability/otel.d.ts +10 -0
  551. package/dist/observability/otel.d.ts.map +1 -0
  552. package/dist/observability/otel.js +182 -0
  553. package/dist/observability/otel.js.map +1 -0
  554. package/dist/observability/sentry.d.ts +30 -18
  555. package/dist/observability/sentry.d.ts.map +1 -1
  556. package/dist/observability/sentry.js +94 -119
  557. package/dist/observability/sentry.js.map +1 -1
  558. package/dist/observability/types.d.ts +30 -19
  559. package/dist/observability/types.d.ts.map +1 -1
  560. package/dist/observability/types.js.map +1 -1
  561. package/dist/office/index.d.ts +49 -0
  562. package/dist/office/index.d.ts.map +1 -0
  563. package/dist/office/index.js +395 -0
  564. package/dist/office/index.js.map +1 -0
  565. package/dist/office/projection.d.ts +11 -0
  566. package/dist/office/projection.d.ts.map +1 -0
  567. package/dist/office/projection.js +145 -0
  568. package/dist/office/projection.js.map +1 -0
  569. package/dist/office/types.d.ts +44 -0
  570. package/dist/office/types.d.ts.map +1 -0
  571. package/dist/office/types.js +2 -0
  572. package/dist/office/types.js.map +1 -0
  573. package/dist/runtime/conversation-runtime.d.ts +0 -1
  574. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  575. package/dist/runtime/conversation-runtime.js +365 -155
  576. package/dist/runtime/conversation-runtime.js.map +1 -1
  577. package/dist/runtime/session-lifecycle.d.ts +65 -0
  578. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  579. package/dist/runtime/session-lifecycle.js +384 -0
  580. package/dist/runtime/session-lifecycle.js.map +1 -0
  581. package/dist/runtime/types.d.ts +42 -20
  582. package/dist/runtime/types.d.ts.map +1 -1
  583. package/dist/runtime/types.js.map +1 -1
  584. package/dist/sandbox/cloudflare.d.ts +4 -0
  585. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  586. package/dist/sandbox/cloudflare.js +59 -55
  587. package/dist/sandbox/cloudflare.js.map +1 -1
  588. package/dist/sandbox/container.d.ts +3 -0
  589. package/dist/sandbox/container.d.ts.map +1 -1
  590. package/dist/sandbox/container.js +39 -20
  591. package/dist/sandbox/container.js.map +1 -1
  592. package/dist/sandbox/host.d.ts +3 -0
  593. package/dist/sandbox/host.d.ts.map +1 -1
  594. package/dist/sandbox/host.js +42 -35
  595. package/dist/sandbox/host.js.map +1 -1
  596. package/dist/sandbox/identity.d.ts +12 -0
  597. package/dist/sandbox/identity.d.ts.map +1 -0
  598. package/dist/sandbox/identity.js +42 -0
  599. package/dist/sandbox/identity.js.map +1 -0
  600. package/dist/sandbox/index.d.ts +5 -15
  601. package/dist/sandbox/index.d.ts.map +1 -1
  602. package/dist/sandbox/index.js +5 -51
  603. package/dist/sandbox/index.js.map +1 -1
  604. package/dist/sandbox/layout.d.ts +5 -0
  605. package/dist/sandbox/layout.d.ts.map +1 -0
  606. package/dist/sandbox/layout.js +13 -0
  607. package/dist/sandbox/layout.js.map +1 -0
  608. package/dist/sandbox/provisioner.d.ts +64 -0
  609. package/dist/sandbox/provisioner.d.ts.map +1 -0
  610. package/dist/sandbox/provisioner.js +546 -0
  611. package/dist/sandbox/provisioner.js.map +1 -0
  612. package/dist/sandbox/registry.d.ts +12 -0
  613. package/dist/sandbox/registry.d.ts.map +1 -0
  614. package/dist/sandbox/registry.js +93 -0
  615. package/dist/sandbox/registry.js.map +1 -0
  616. package/dist/sandbox/types.d.ts +23 -25
  617. package/dist/sandbox/types.d.ts.map +1 -1
  618. package/dist/sandbox/types.js.map +1 -1
  619. package/dist/sandbox/utils.d.ts +21 -0
  620. package/dist/sandbox/utils.d.ts.map +1 -1
  621. package/dist/sandbox/utils.js +100 -8
  622. package/dist/sandbox/utils.js.map +1 -1
  623. package/dist/sessions/chat-history-sync.d.ts +19 -0
  624. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  625. package/dist/sessions/chat-history-sync.js +459 -0
  626. package/dist/sessions/chat-history-sync.js.map +1 -0
  627. package/dist/sessions/compaction-summary.d.ts +4 -0
  628. package/dist/sessions/compaction-summary.d.ts.map +1 -0
  629. package/dist/sessions/compaction-summary.js +16 -0
  630. package/dist/sessions/compaction-summary.js.map +1 -0
  631. package/dist/sessions/history-line.d.ts +10 -0
  632. package/dist/sessions/history-line.d.ts.map +1 -0
  633. package/dist/sessions/history-line.js +29 -0
  634. package/dist/sessions/history-line.js.map +1 -0
  635. package/dist/sessions/session-key.d.ts +19 -0
  636. package/dist/sessions/session-key.d.ts.map +1 -0
  637. package/dist/sessions/session-key.js +91 -0
  638. package/dist/sessions/session-key.js.map +1 -0
  639. package/dist/sessions/session-store.d.ts +73 -0
  640. package/dist/sessions/session-store.d.ts.map +1 -0
  641. package/dist/sessions/session-store.js +721 -0
  642. package/dist/sessions/session-store.js.map +1 -0
  643. package/dist/sessions/types.d.ts +90 -34
  644. package/dist/sessions/types.d.ts.map +1 -1
  645. package/dist/sessions/types.js +2 -1
  646. package/dist/sessions/types.js.map +1 -1
  647. package/dist/settings/apply.d.ts +9 -0
  648. package/dist/settings/apply.d.ts.map +1 -0
  649. package/dist/settings/apply.js +31 -0
  650. package/dist/settings/apply.js.map +1 -0
  651. package/dist/settings/index.d.ts +28 -0
  652. package/dist/settings/index.d.ts.map +1 -0
  653. package/dist/settings/index.js +322 -0
  654. package/dist/settings/index.js.map +1 -0
  655. package/dist/types.d.ts +209 -191
  656. package/dist/types.d.ts.map +1 -1
  657. package/dist/types.js +1 -3
  658. package/dist/types.js.map +1 -1
  659. package/dist/unknown-values.d.ts +3 -0
  660. package/dist/unknown-values.d.ts.map +1 -0
  661. package/dist/unknown-values.js +7 -0
  662. package/dist/unknown-values.js.map +1 -0
  663. package/dist/vault/index.d.ts +28 -11
  664. package/dist/vault/index.d.ts.map +1 -1
  665. package/dist/vault/index.js +291 -118
  666. package/dist/vault/index.js.map +1 -1
  667. package/dist/vault/types.d.ts +5 -19
  668. package/dist/vault/types.d.ts.map +1 -1
  669. package/dist/vault/types.js.map +1 -1
  670. package/package.json +87 -41
  671. package/dist/adapter.d.ts +0 -2
  672. package/dist/adapter.d.ts.map +0 -1
  673. package/dist/adapter.js +0 -2
  674. package/dist/adapter.js.map +0 -1
  675. package/dist/adapters/github/repo.d.ts +0 -19
  676. package/dist/adapters/github/repo.d.ts.map +0 -1
  677. package/dist/adapters/github/repo.js +0 -58
  678. package/dist/adapters/github/repo.js.map +0 -1
  679. package/dist/adapters/slack/tools/attach.d.ts +0 -12
  680. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  681. package/dist/adapters/slack/tools/attach.js +0 -39
  682. package/dist/adapters/slack/tools/attach.js.map +0 -1
  683. package/dist/adapters/streaming.d.ts +0 -18
  684. package/dist/adapters/streaming.d.ts.map +0 -1
  685. package/dist/adapters/streaming.js +0 -44
  686. package/dist/adapters/streaming.js.map +0 -1
  687. package/dist/adapters/telegram/html.d.ts +0 -3
  688. package/dist/adapters/telegram/html.d.ts.map +0 -1
  689. package/dist/adapters/telegram/html.js +0 -98
  690. package/dist/adapters/telegram/html.js.map +0 -1
  691. package/dist/agent-events.d.ts +0 -5
  692. package/dist/agent-events.d.ts.map +0 -1
  693. package/dist/agent-events.js +0 -26
  694. package/dist/agent-events.js.map +0 -1
  695. package/dist/agent.d.ts +0 -39
  696. package/dist/agent.d.ts.map +0 -1
  697. package/dist/agent.js +0 -1299
  698. package/dist/agent.js.map +0 -1
  699. package/dist/cli/ext-git.d.ts +0 -22
  700. package/dist/cli/ext-git.d.ts.map +0 -1
  701. package/dist/cli/ext-git.js +0 -76
  702. package/dist/cli/ext-git.js.map +0 -1
  703. package/dist/cli/ext.d.ts +0 -2
  704. package/dist/cli/ext.d.ts.map +0 -1
  705. package/dist/cli/ext.js +0 -217
  706. package/dist/cli/ext.js.map +0 -1
  707. package/dist/commands/admin.d.ts.map +0 -1
  708. package/dist/commands/admin.js +0 -30
  709. package/dist/commands/admin.js.map +0 -1
  710. package/dist/commands/auto-reply.d.ts +0 -8
  711. package/dist/commands/auto-reply.d.ts.map +0 -1
  712. package/dist/commands/auto-reply.js +0 -76
  713. package/dist/commands/auto-reply.js.map +0 -1
  714. package/dist/commands/extensions.d.ts +0 -14
  715. package/dist/commands/extensions.d.ts.map +0 -1
  716. package/dist/commands/extensions.js +0 -55
  717. package/dist/commands/extensions.js.map +0 -1
  718. package/dist/commands/login.d.ts +0 -5
  719. package/dist/commands/login.d.ts.map +0 -1
  720. package/dist/commands/login.js +0 -115
  721. package/dist/commands/login.js.map +0 -1
  722. package/dist/commands/model.d.ts +0 -10
  723. package/dist/commands/model.d.ts.map +0 -1
  724. package/dist/commands/model.js +0 -102
  725. package/dist/commands/model.js.map +0 -1
  726. package/dist/commands/new.d.ts.map +0 -1
  727. package/dist/commands/new.js +0 -25
  728. package/dist/commands/new.js.map +0 -1
  729. package/dist/commands/parse.d.ts +0 -7
  730. package/dist/commands/parse.d.ts.map +0 -1
  731. package/dist/commands/parse.js +0 -14
  732. package/dist/commands/parse.js.map +0 -1
  733. package/dist/commands/registry.d.ts +0 -5
  734. package/dist/commands/registry.d.ts.map +0 -1
  735. package/dist/commands/registry.js +0 -31
  736. package/dist/commands/registry.js.map +0 -1
  737. package/dist/commands/sandbox.d.ts +0 -7
  738. package/dist/commands/sandbox.d.ts.map +0 -1
  739. package/dist/commands/sandbox.js +0 -78
  740. package/dist/commands/sandbox.js.map +0 -1
  741. package/dist/commands/session-view.d.ts.map +0 -1
  742. package/dist/commands/session-view.js +0 -41
  743. package/dist/commands/session-view.js.map +0 -1
  744. package/dist/commands/types.d.ts +0 -66
  745. package/dist/commands/types.d.ts.map +0 -1
  746. package/dist/commands/types.js.map +0 -1
  747. package/dist/commands/utils.d.ts +0 -11
  748. package/dist/commands/utils.d.ts.map +0 -1
  749. package/dist/commands/utils.js +0 -29
  750. package/dist/commands/utils.js.map +0 -1
  751. package/dist/config.d.ts +0 -78
  752. package/dist/config.d.ts.map +0 -1
  753. package/dist/config.js +0 -450
  754. package/dist/config.js.map +0 -1
  755. package/dist/download.d.ts.map +0 -1
  756. package/dist/download.js +0 -89
  757. package/dist/download.js.map +0 -1
  758. package/dist/events.d.ts +0 -43
  759. package/dist/events.d.ts.map +0 -1
  760. package/dist/events.js +0 -456
  761. package/dist/events.js.map +0 -1
  762. package/dist/execution-resolver.d.ts +0 -21
  763. package/dist/execution-resolver.d.ts.map +0 -1
  764. package/dist/execution-resolver.js +0 -170
  765. package/dist/execution-resolver.js.map +0 -1
  766. package/dist/harness/auth.d.ts +0 -16
  767. package/dist/harness/auth.d.ts.map +0 -1
  768. package/dist/harness/auth.js +0 -86
  769. package/dist/harness/auth.js.map +0 -1
  770. package/dist/harness/extensions/loader.d.ts +0 -86
  771. package/dist/harness/extensions/loader.d.ts.map +0 -1
  772. package/dist/harness/extensions/loader.js +0 -525
  773. package/dist/harness/extensions/loader.js.map +0 -1
  774. package/dist/harness/extensions/registry.d.ts +0 -23
  775. package/dist/harness/extensions/registry.d.ts.map +0 -1
  776. package/dist/harness/extensions/registry.js +0 -45
  777. package/dist/harness/extensions/registry.js.map +0 -1
  778. package/dist/harness/extensions/types.d.ts +0 -248
  779. package/dist/harness/extensions/types.d.ts.map +0 -1
  780. package/dist/harness/extensions/types.js.map +0 -1
  781. package/dist/harness/session-store.d.ts +0 -77
  782. package/dist/harness/session-store.d.ts.map +0 -1
  783. package/dist/harness/session-store.js +0 -248
  784. package/dist/harness/session-store.js.map +0 -1
  785. package/dist/harness/settings.d.ts +0 -47
  786. package/dist/harness/settings.d.ts.map +0 -1
  787. package/dist/harness/settings.js +0 -29
  788. package/dist/harness/settings.js.map +0 -1
  789. package/dist/model-registry.d.ts +0 -4
  790. package/dist/model-registry.d.ts.map +0 -1
  791. package/dist/model-registry.js +0 -7
  792. package/dist/model-registry.js.map +0 -1
  793. package/dist/platform-messages.d.ts +0 -12
  794. package/dist/platform-messages.d.ts.map +0 -1
  795. package/dist/platform-messages.js +0 -36
  796. package/dist/platform-messages.js.map +0 -1
  797. package/dist/portal-shell.d.ts +0 -4
  798. package/dist/portal-shell.d.ts.map +0 -1
  799. package/dist/portal-shell.js +0 -366
  800. package/dist/portal-shell.js.map +0 -1
  801. package/dist/provisioner.d.ts +0 -61
  802. package/dist/provisioner.d.ts.map +0 -1
  803. package/dist/provisioner.js +0 -517
  804. package/dist/provisioner.js.map +0 -1
  805. package/dist/runtime/agent-run-controller.d.ts +0 -31
  806. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  807. package/dist/runtime/agent-run-controller.js +0 -195
  808. package/dist/runtime/agent-run-controller.js.map +0 -1
  809. package/dist/sandbox/errors.d.ts +0 -6
  810. package/dist/sandbox/errors.d.ts.map +0 -1
  811. package/dist/sandbox/errors.js +0 -11
  812. package/dist/sandbox/errors.js.map +0 -1
  813. package/dist/sandbox/firecracker.d.ts +0 -15
  814. package/dist/sandbox/firecracker.d.ts.map +0 -1
  815. package/dist/sandbox/firecracker.js +0 -212
  816. package/dist/sandbox/firecracker.js.map +0 -1
  817. package/dist/sandbox/image.d.ts +0 -3
  818. package/dist/sandbox/image.d.ts.map +0 -1
  819. package/dist/sandbox/image.js +0 -27
  820. package/dist/sandbox/image.js.map +0 -1
  821. package/dist/sandbox/path-context.d.ts +0 -3
  822. package/dist/sandbox/path-context.d.ts.map +0 -1
  823. package/dist/sandbox/path-context.js +0 -20
  824. package/dist/sandbox/path-context.js.map +0 -1
  825. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  826. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  827. package/dist/sessions/agent-memory-file-manager.js +0 -484
  828. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  829. package/dist/sessions/metadata.d.ts +0 -3
  830. package/dist/sessions/metadata.d.ts.map +0 -1
  831. package/dist/sessions/metadata.js +0 -11
  832. package/dist/sessions/metadata.js.map +0 -1
  833. package/dist/sessions/policy.d.ts +0 -6
  834. package/dist/sessions/policy.d.ts.map +0 -1
  835. package/dist/sessions/policy.js +0 -24
  836. package/dist/sessions/policy.js.map +0 -1
  837. package/dist/sessions/store.d.ts +0 -72
  838. package/dist/sessions/store.d.ts.map +0 -1
  839. package/dist/sessions/store.js +0 -193
  840. package/dist/sessions/store.js.map +0 -1
  841. package/dist/store.d.ts +0 -46
  842. package/dist/store.d.ts.map +0 -1
  843. package/dist/store.js +0 -177
  844. package/dist/store.js.map +0 -1
  845. package/dist/tools/bash.d.ts +0 -10
  846. package/dist/tools/bash.d.ts.map +0 -1
  847. package/dist/tools/bash.js +0 -80
  848. package/dist/tools/bash.js.map +0 -1
  849. package/dist/tools/edit.d.ts +0 -11
  850. package/dist/tools/edit.d.ts.map +0 -1
  851. package/dist/tools/edit.js +0 -131
  852. package/dist/tools/edit.js.map +0 -1
  853. package/dist/tools/event.d.ts +0 -56
  854. package/dist/tools/event.d.ts.map +0 -1
  855. package/dist/tools/event.js +0 -252
  856. package/dist/tools/event.js.map +0 -1
  857. package/dist/tools/github-pr.d.ts +0 -22
  858. package/dist/tools/github-pr.d.ts.map +0 -1
  859. package/dist/tools/github-pr.js +0 -53
  860. package/dist/tools/github-pr.js.map +0 -1
  861. package/dist/tools/index.d.ts +0 -25
  862. package/dist/tools/index.d.ts.map +0 -1
  863. package/dist/tools/index.js +0 -35
  864. package/dist/tools/index.js.map +0 -1
  865. package/dist/tools/react.d.ts +0 -15
  866. package/dist/tools/react.d.ts.map +0 -1
  867. package/dist/tools/react.js +0 -40
  868. package/dist/tools/react.js.map +0 -1
  869. package/dist/tools/read.d.ts +0 -11
  870. package/dist/tools/read.d.ts.map +0 -1
  871. package/dist/tools/read.js +0 -134
  872. package/dist/tools/read.js.map +0 -1
  873. package/dist/tools/sandbox.d.ts +0 -22
  874. package/dist/tools/sandbox.d.ts.map +0 -1
  875. package/dist/tools/sandbox.js +0 -73
  876. package/dist/tools/sandbox.js.map +0 -1
  877. package/dist/tools/truncate.d.ts +0 -33
  878. package/dist/tools/truncate.d.ts.map +0 -1
  879. package/dist/tools/truncate.js +0 -184
  880. package/dist/tools/truncate.js.map +0 -1
  881. package/dist/tools/types.d.ts +0 -54
  882. package/dist/tools/types.d.ts.map +0 -1
  883. package/dist/tools/types.js.map +0 -1
  884. package/dist/tools/write.d.ts +0 -10
  885. package/dist/tools/write.d.ts.map +0 -1
  886. package/dist/tools/write.js +0 -29
  887. package/dist/tools/write.js.map +0 -1
  888. package/dist/trigger.d.ts +0 -22
  889. package/dist/trigger.d.ts.map +0 -1
  890. package/dist/trigger.js +0 -100
  891. package/dist/trigger.js.map +0 -1
  892. package/dist/utils/date.d.ts +0 -10
  893. package/dist/utils/date.d.ts.map +0 -1
  894. package/dist/utils/date.js +0 -23
  895. package/dist/utils/date.js.map +0 -1
  896. package/dist/utils/env.d.ts +0 -3
  897. package/dist/utils/env.d.ts.map +0 -1
  898. package/dist/utils/env.js +0 -12
  899. package/dist/utils/env.js.map +0 -1
  900. package/dist/utils/file-guards.d.ts +0 -9
  901. package/dist/utils/file-guards.d.ts.map +0 -1
  902. package/dist/utils/file-guards.js +0 -59
  903. package/dist/utils/file-guards.js.map +0 -1
  904. package/dist/utils/fs-atomic.d.ts +0 -10
  905. package/dist/utils/fs-atomic.d.ts.map +0 -1
  906. package/dist/utils/fs-atomic.js +0 -45
  907. package/dist/utils/fs-atomic.js.map +0 -1
  908. package/dist/utils/html.d.ts +0 -2
  909. package/dist/utils/html.d.ts.map +0 -1
  910. package/dist/utils/html.js +0 -4
  911. package/dist/utils/html.js.map +0 -1
  912. package/dist/utils/http-body.d.ts +0 -10
  913. package/dist/utils/http-body.d.ts.map +0 -1
  914. package/dist/utils/http-body.js +0 -34
  915. package/dist/utils/http-body.js.map +0 -1
  916. package/dist/vault/routing.d.ts +0 -3
  917. package/dist/vault/routing.d.ts.map +0 -1
  918. package/dist/vault/routing.js +0 -13
  919. package/dist/vault/routing.js.map +0 -1
  920. package/dist/web/admin/portal.d.ts +0 -5
  921. package/dist/web/admin/portal.d.ts.map +0 -1
  922. package/dist/web/admin/portal.js +0 -2572
  923. package/dist/web/admin/portal.js.map +0 -1
  924. package/dist/web/admin/provider-models.d.ts +0 -10
  925. package/dist/web/admin/provider-models.d.ts.map +0 -1
  926. package/dist/web/admin/provider-models.js +0 -96
  927. package/dist/web/admin/provider-models.js.map +0 -1
  928. package/dist/web/admin/store.d.ts +0 -13
  929. package/dist/web/admin/store.d.ts.map +0 -1
  930. package/dist/web/admin/store.js +0 -14
  931. package/dist/web/admin/store.js.map +0 -1
  932. package/dist/web/admin/types.d.ts +0 -30
  933. package/dist/web/admin/types.d.ts.map +0 -1
  934. package/dist/web/admin/types.js.map +0 -1
  935. package/dist/web/agent-events/portal.d.ts +0 -3
  936. package/dist/web/agent-events/portal.d.ts.map +0 -1
  937. package/dist/web/agent-events/portal.js +0 -18
  938. package/dist/web/agent-events/portal.js.map +0 -1
  939. package/dist/web/login/oauth.d.ts +0 -6
  940. package/dist/web/login/oauth.d.ts.map +0 -1
  941. package/dist/web/login/oauth.js +0 -258
  942. package/dist/web/login/oauth.js.map +0 -1
  943. package/dist/web/login/portal.d.ts +0 -17
  944. package/dist/web/login/portal.d.ts.map +0 -1
  945. package/dist/web/login/portal.js +0 -1329
  946. package/dist/web/login/portal.js.map +0 -1
  947. package/dist/web/login/store.d.ts +0 -8
  948. package/dist/web/login/store.d.ts.map +0 -1
  949. package/dist/web/login/store.js +0 -15
  950. package/dist/web/login/store.js.map +0 -1
  951. package/dist/web/login/types.d.ts +0 -50
  952. package/dist/web/login/types.d.ts.map +0 -1
  953. package/dist/web/login/types.js.map +0 -1
  954. package/dist/web/request.d.ts +0 -3
  955. package/dist/web/request.d.ts.map +0 -1
  956. package/dist/web/request.js +0 -13
  957. package/dist/web/request.js.map +0 -1
  958. package/dist/web/server.d.ts +0 -28
  959. package/dist/web/server.d.ts.map +0 -1
  960. package/dist/web/server.js +0 -66
  961. package/dist/web/server.js.map +0 -1
  962. package/dist/web/session-view/command.d.ts +0 -4
  963. package/dist/web/session-view/command.d.ts.map +0 -1
  964. package/dist/web/session-view/command.js +0 -7
  965. package/dist/web/session-view/command.js.map +0 -1
  966. package/dist/web/session-view/portal.d.ts +0 -13
  967. package/dist/web/session-view/portal.d.ts.map +0 -1
  968. package/dist/web/session-view/portal.js +0 -1651
  969. package/dist/web/session-view/portal.js.map +0 -1
  970. package/dist/web/session-view/service.d.ts +0 -6
  971. package/dist/web/session-view/service.d.ts.map +0 -1
  972. package/dist/web/session-view/service.js +0 -498
  973. package/dist/web/session-view/service.js.map +0 -1
  974. package/dist/web/session-view/store.d.ts +0 -8
  975. package/dist/web/session-view/store.d.ts.map +0 -1
  976. package/dist/web/session-view/store.js +0 -15
  977. package/dist/web/session-view/store.js.map +0 -1
  978. package/dist/web/session-view/types.d.ts +0 -50
  979. package/dist/web/session-view/types.d.ts.map +0 -1
  980. package/dist/web/session-view/types.js.map +0 -1
  981. package/dist/web/token-store.d.ts +0 -13
  982. package/dist/web/token-store.d.ts.map +0 -1
  983. package/dist/web/token-store.js +0 -44
  984. package/dist/web/token-store.js.map +0 -1
  985. package/dist/web/types.d.ts.map +0 -1
  986. package/dist/web/types.js.map +0 -1
  987. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  988. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  989. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  990. /package/dist/{commands → adapters/commands}/types.js +0 -0
  991. /package/dist/{harness/extensions → adapters/web/admin}/types.js +0 -0
  992. /package/dist/{tools → adapters/web/login}/types.js +0 -0
  993. /package/dist/{web/admin → adapters/web/session-view}/types.js +0 -0
  994. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  995. /package/dist/{web/login → adapters/web}/types.js +0 -0
  996. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  997. /package/dist/{web/session-view → cli}/types.js +0 -0
  998. /package/dist/{web → harness/tools}/types.js +0 -0
@@ -0,0 +1,395 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { lstatSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { atomicWritePrivateFile, readTextFileIfExists } from "../file-guards.js";
5
+ import { isRecord } from "../unknown-values.js";
6
+ export const OFFICE_LOG_FILENAME = "log.jsonl";
7
+ const OFFICE_SESSIONS_FILENAME = "sessions.db";
8
+ const OFFICE_KEY_VERSION = "v1";
9
+ const OFFICE_KEY_DOMAIN = "office-address-v1";
10
+ const OFFICE_KEY_DIGEST_LENGTH = 16;
11
+ const READABLE_ID_LENGTH = 32;
12
+ const PLATFORM_NAMES = new Set(["slack", "discord", "telegram", "github"]);
13
+ const OFFICE_KEY_PATTERN = /^v1-(slack|discord|telegram|github)-[a-z0-9]+(?:-[a-z0-9]+)*-[a-f0-9]{16}$/;
14
+ export function createOfficeAddress(platform, conversationId) {
15
+ assertPlatformName(platform);
16
+ assertConversationId(conversationId);
17
+ return Object.freeze({ platform, conversationId });
18
+ }
19
+ export function validateOfficeAddress(value) {
20
+ if (!isRecord(value))
21
+ throw new Error("Office address must be an object");
22
+ if (typeof value.platform !== "string") {
23
+ throw new Error("Office address platform must be a string");
24
+ }
25
+ if (typeof value.conversationId !== "string") {
26
+ throw new Error("Office address conversation id must be a string");
27
+ }
28
+ return createOfficeAddress(assertPlatformName(value.platform), value.conversationId);
29
+ }
30
+ function isPlatformName(value) {
31
+ return typeof value === "string" && PLATFORM_NAMES.has(value);
32
+ }
33
+ export function assertPlatformName(value) {
34
+ if (!isPlatformName(value))
35
+ throw new Error(`Unsupported platform: ${JSON.stringify(value)}`);
36
+ return value;
37
+ }
38
+ function isUnsafeConversationIdChar(character) {
39
+ const code = character.codePointAt(0) ?? 0;
40
+ return character === "/" || character === "\\" || code <= 0x1f || (code >= 0x7f && code <= 0x9f);
41
+ }
42
+ export function assertConversationId(value) {
43
+ if (value.length === 0 || value === "." || value === "..") {
44
+ throw new Error("Conversation id must be non-empty and not a path marker");
45
+ }
46
+ if ([...value].some(isUnsafeConversationIdChar)) {
47
+ throw new Error("Conversation id must not contain path separators or control characters");
48
+ }
49
+ return value;
50
+ }
51
+ export function officeKey(address) {
52
+ const normalized = validateOfficeAddress(address);
53
+ const readable = readableConversationId(normalized.conversationId);
54
+ const digest = createHash("sha256")
55
+ .update(`${OFFICE_KEY_DOMAIN}\0${normalized.platform}\0${normalized.conversationId}`)
56
+ .digest("hex")
57
+ .slice(0, OFFICE_KEY_DIGEST_LENGTH);
58
+ return `${OFFICE_KEY_VERSION}-${normalized.platform}-${readable}-${digest}`;
59
+ }
60
+ export function officeDir(workspaceRoot, address) {
61
+ return join(workspaceRoot, officeKey(address));
62
+ }
63
+ export function officeStateDir(stateDir, address) {
64
+ return join(stateDir, "conversations", officeKey(address));
65
+ }
66
+ export function sameOffice(left, right) {
67
+ const leftAddress = validateOfficeAddress(left);
68
+ const rightAddress = validateOfficeAddress(right);
69
+ return (leftAddress.platform === rightAddress.platform &&
70
+ leftAddress.conversationId === rightAddress.conversationId);
71
+ }
72
+ function resolveConversationAddress(input) {
73
+ const address = createOfficeAddress(input.platform, input.conversationId);
74
+ if (input.address && !sameOffice(address, input.address)) {
75
+ throw new Error(`Conversation address mismatch for ${JSON.stringify(input.conversationId)} on ${input.platform}`);
76
+ }
77
+ return address;
78
+ }
79
+ export function createConversationEvent(input) {
80
+ const address = resolveConversationAddress(input);
81
+ const { platform: _platform, conversationId: _conversationId, address: _suppliedAddress, ...event } = input;
82
+ return { ...event, address };
83
+ }
84
+ export function createConversationMessage(input) {
85
+ const address = resolveConversationAddress(input);
86
+ const { platform: _platform, conversationId: _conversationId, address: _suppliedAddress, ...message } = input;
87
+ return { ...message, address };
88
+ }
89
+ export function buildGithubConversationId(ref) {
90
+ return `GH_${ref.owner.toLowerCase()}_${ref.repo.toLowerCase()}_${ref.number}`;
91
+ }
92
+ const GITHUB_CONVERSATION_ID_PATTERN = /^GH_([A-Za-z0-9-]+)_(.+)_(\d+)$/;
93
+ export function parseGithubConversationId(conversationId) {
94
+ const match = GITHUB_CONVERSATION_ID_PATTERN.exec(conversationId);
95
+ if (!match) {
96
+ throw new Error(`Not a GitHub conversation id: ${conversationId}`);
97
+ }
98
+ const [, owner, repo, number] = match;
99
+ if (owner === undefined || repo === undefined || number === undefined) {
100
+ throw new Error(`Not a GitHub conversation id: ${conversationId}`);
101
+ }
102
+ return {
103
+ owner: owner.toLowerCase(),
104
+ repo: repo.toLowerCase(),
105
+ number: Number(number),
106
+ };
107
+ }
108
+ export function isOfficeKey(value) {
109
+ return typeof value === "string" && OFFICE_KEY_PATTERN.test(value);
110
+ }
111
+ function readableConversationId(conversationId) {
112
+ const readable = conversationId
113
+ .toLowerCase()
114
+ .replace(/[^a-z0-9]+/g, "-")
115
+ .replace(/^-+|-+$/g, "")
116
+ .slice(0, READABLE_ID_LENGTH)
117
+ .replace(/-+$/g, "");
118
+ return readable || "conversation";
119
+ }
120
+ export const RESERVED_WORKSPACE_NAMES = Object.freeze(new Set(["skills", "events", "agents", "MEMORY.md"]));
121
+ export function createWorkspace(options) {
122
+ const { root, stateDir } = options;
123
+ let registry;
124
+ const recorded = new Set();
125
+ const offices = new Map();
126
+ const workspace = Object.freeze({
127
+ root,
128
+ stateDir,
129
+ memoryPath: join(root, "MEMORY.md"),
130
+ skillsDir: join(root, "skills"),
131
+ agentsDir: join(root, "agents"),
132
+ reservedNames: RESERVED_WORKSPACE_NAMES,
133
+ office(address) {
134
+ const normalized = validateOfficeAddress(address);
135
+ const key = officeKey(normalized);
136
+ const existing = offices.get(key);
137
+ if (existing)
138
+ return existing;
139
+ const dir = join(root, key);
140
+ const conversationStateDir = join(stateDir, "conversations", key);
141
+ const office = Object.freeze({
142
+ address: normalized,
143
+ key,
144
+ dir,
145
+ memoryPath: join(dir, "MEMORY.md"),
146
+ skillsDir: join(dir, "skills"),
147
+ sessionsPath: join(conversationStateDir, OFFICE_SESSIONS_FILENAME),
148
+ attachmentsDir: join(dir, "attachments"),
149
+ logPath: join(dir, OFFICE_LOG_FILENAME),
150
+ stateDir: conversationStateDir,
151
+ workspace,
152
+ ensure() {
153
+ if (!recorded.has(key)) {
154
+ registry ??= new OfficeRegistry(stateDir);
155
+ registry.recordOffice(normalized);
156
+ recorded.add(key);
157
+ }
158
+ ensureRegularOfficeDirectory(dir);
159
+ return dir;
160
+ },
161
+ });
162
+ offices.set(key, office);
163
+ return office;
164
+ },
165
+ });
166
+ return workspace;
167
+ }
168
+ function ensureRegularOfficeDirectory(dir) {
169
+ let stats;
170
+ try {
171
+ stats = lstatSync(dir);
172
+ }
173
+ catch (err) {
174
+ if (err.code !== "ENOENT")
175
+ throw err;
176
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
177
+ return;
178
+ }
179
+ if (stats.isSymbolicLink() || !stats.isDirectory()) {
180
+ throw new Error(`Office directory must be a regular non-symlink directory: ${dir}`);
181
+ }
182
+ }
183
+ const REGISTRY_VERSION = 1;
184
+ const REGISTRY_FILENAME = "office-registry.json";
185
+ const REGISTRY_LOCK_FILENAME = ".office-registry.lock";
186
+ const REGISTRY_LOCK_RETRY_MS = 25;
187
+ const REGISTRY_LOCK_TIMEOUT_MS = 5_000;
188
+ const REGISTRY_LOCK_STALE_MS = 60_000;
189
+ export class OfficeRegistry {
190
+ constructor(stateDir, options = {}) {
191
+ this.stateDir = resolve(stateDir);
192
+ mkdirSync(this.stateDir, { recursive: true, mode: 0o700 });
193
+ assertRegularDirectory(this.stateDir, "State directory");
194
+ this.registryPath = resolve(this.stateDir, REGISTRY_FILENAME);
195
+ this.lockPath = join(this.stateDir, REGISTRY_LOCK_FILENAME);
196
+ this.writeState = options.writeState ?? atomicWritePrivateFile;
197
+ this.lockTimeoutMs = options.lockTimeoutMs ?? REGISTRY_LOCK_TIMEOUT_MS;
198
+ this.state = this.readState();
199
+ }
200
+ recordOffice(address) {
201
+ const normalized = validateOfficeAddress(address);
202
+ const existing = this.findOffice(normalized);
203
+ if (existing)
204
+ return existing;
205
+ return this.withExclusiveLease(() => {
206
+ const found = this.findOffice(normalized);
207
+ if (found)
208
+ return found;
209
+ const record = Object.freeze({
210
+ platform: normalized.platform,
211
+ conversationId: normalized.conversationId,
212
+ recordedAt: new Date().toISOString(),
213
+ });
214
+ this.replaceState([...this.state.offices, record]);
215
+ return record;
216
+ });
217
+ }
218
+ getOffices() {
219
+ return this.state.offices;
220
+ }
221
+ findOffice(address) {
222
+ return this.state.offices.find((record) => record.platform === address.platform && record.conversationId === address.conversationId);
223
+ }
224
+ replaceState(offices) {
225
+ const candidate = freezeState(offices);
226
+ this.writeState(this.registryPath, `${JSON.stringify(candidate, null, 2)}\n`);
227
+ this.state = candidate;
228
+ }
229
+ withExclusiveLease(operation) {
230
+ const release = acquireRegistryLease(this.lockPath, this.lockTimeoutMs);
231
+ try {
232
+ this.state = this.readState();
233
+ return operation();
234
+ }
235
+ finally {
236
+ release();
237
+ }
238
+ }
239
+ readState() {
240
+ assertRegistryFileSafe(this.registryPath);
241
+ const raw = readTextFileIfExists(this.registryPath);
242
+ if (raw === undefined) {
243
+ return freezeState([]);
244
+ }
245
+ let value;
246
+ try {
247
+ value = JSON.parse(raw);
248
+ }
249
+ catch (error) {
250
+ throw new Error(`Invalid office registry JSON at ${this.registryPath}`, { cause: error });
251
+ }
252
+ return parseState(value, this.registryPath);
253
+ }
254
+ }
255
+ function freezeState(offices) {
256
+ return Object.freeze({
257
+ version: REGISTRY_VERSION,
258
+ offices: Object.freeze(offices.map((record) => Object.freeze({ ...record }))),
259
+ });
260
+ }
261
+ function parseState(value, path) {
262
+ if (!isRecord(value) || value.version !== REGISTRY_VERSION || !Array.isArray(value.offices)) {
263
+ throw new Error(`Invalid office registry at ${path}`);
264
+ }
265
+ const offices = value.offices.map((entry) => parseOfficeRecord(entry, path));
266
+ if (new Set(offices.map((record) => officeKey(record))).size !== offices.length) {
267
+ throw new Error(`Duplicate office record in ${path}`);
268
+ }
269
+ return freezeState(offices);
270
+ }
271
+ function parseOfficeRecord(value, path) {
272
+ if (!isRecord(value))
273
+ throw new Error(`Invalid office record in ${path}`);
274
+ if (typeof value.platform !== "string" ||
275
+ typeof value.conversationId !== "string" ||
276
+ typeof value.recordedAt !== "string") {
277
+ throw new Error(`Invalid office record fields in ${path}`);
278
+ }
279
+ return Object.freeze({
280
+ platform: assertPlatformName(value.platform),
281
+ conversationId: assertConversationId(value.conversationId),
282
+ recordedAt: value.recordedAt,
283
+ });
284
+ }
285
+ function assertRegularDirectory(path, label) {
286
+ let stat;
287
+ try {
288
+ stat = lstatSync(path);
289
+ }
290
+ catch (error) {
291
+ throw new Error(`${label} does not exist: ${path}`, { cause: error });
292
+ }
293
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
294
+ throw new Error(`${label} must be a regular directory: ${path}`);
295
+ }
296
+ }
297
+ function lstatIfExists(path) {
298
+ try {
299
+ return lstatSync(path);
300
+ }
301
+ catch (error) {
302
+ if (isErrno(error, "ENOENT"))
303
+ return undefined;
304
+ throw error;
305
+ }
306
+ }
307
+ function assertRegistryFileSafe(path) {
308
+ const stat = lstatIfExists(path);
309
+ if (stat && (stat.isSymbolicLink() || !stat.isFile())) {
310
+ throw new Error(`Office registry must be a regular file: ${path}`);
311
+ }
312
+ }
313
+ function claimRegistryLock(lockPath, token) {
314
+ mkdirSync(lockPath, { mode: 0o700 });
315
+ try {
316
+ writeFileSync(join(lockPath, "owner"), `${token}\n`, { mode: 0o600 });
317
+ }
318
+ catch (error) {
319
+ rmSync(lockPath, { recursive: true, force: true });
320
+ throw error;
321
+ }
322
+ }
323
+ function acquireRegistryLease(lockPath, timeoutMs) {
324
+ const deadline = Date.now() + timeoutMs;
325
+ const token = `${process.pid}:${randomBytes(8).toString("hex")}`;
326
+ for (;;) {
327
+ try {
328
+ claimRegistryLock(lockPath, token);
329
+ return () => releaseRegistryLease(lockPath, token);
330
+ }
331
+ catch (error) {
332
+ awaitFreeRegistryLock(lockPath, deadline, error);
333
+ }
334
+ }
335
+ }
336
+ function awaitFreeRegistryLock(lockPath, deadline, error) {
337
+ if (!isErrno(error, "EEXIST"))
338
+ throw error;
339
+ if (registryLockIsStale(lockPath)) {
340
+ rmSync(lockPath, { recursive: true, force: true });
341
+ return;
342
+ }
343
+ if (Date.now() >= deadline) {
344
+ throw new Error(`Timed out acquiring office registry lock: ${lockPath}`, { cause: error });
345
+ }
346
+ sleepSync(REGISTRY_LOCK_RETRY_MS);
347
+ }
348
+ function releaseRegistryLease(lockPath, token) {
349
+ try {
350
+ if (readFileSync(join(lockPath, "owner"), "utf8").trim() === token) {
351
+ rmSync(lockPath, { recursive: true, force: true });
352
+ }
353
+ }
354
+ catch (error) {
355
+ if (!isErrno(error, "ENOENT"))
356
+ throw error;
357
+ }
358
+ }
359
+ function registryLockIsStale(lockPath) {
360
+ let ownerKnown = false;
361
+ let ownerAlive = false;
362
+ try {
363
+ const owner = readFileSync(join(lockPath, "owner"), "utf8").trim();
364
+ const pid = Number(owner.split(":", 1)[0]);
365
+ if (Number.isInteger(pid) && pid > 0) {
366
+ ownerKnown = true;
367
+ try {
368
+ process.kill(pid, 0);
369
+ ownerAlive = true;
370
+ }
371
+ catch (error) {
372
+ if (isErrno(error, "EPERM"))
373
+ ownerAlive = true;
374
+ }
375
+ }
376
+ }
377
+ catch { }
378
+ try {
379
+ const oldEnough = Date.now() - statSync(lockPath).mtimeMs >= REGISTRY_LOCK_STALE_MS;
380
+ return ownerKnown ? !ownerAlive : oldEnough;
381
+ }
382
+ catch {
383
+ return false;
384
+ }
385
+ }
386
+ function sleepSync(milliseconds) {
387
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
388
+ }
389
+ export function listRegisteredOffices(stateDir) {
390
+ return new OfficeRegistry(stateDir).getOffices();
391
+ }
392
+ function isErrno(error, code) {
393
+ return error instanceof Error && "code" in error && error.code === code;
394
+ }
395
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/office/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport type { Stats } from \"node:fs\";\nimport { lstatSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type {\n ConversationEvent,\n ConversationMessage,\n OfficeAddress,\n OfficeKey,\n OfficeRecord,\n OfficeRegistryState,\n PlatformName,\n} from \"../types.js\";\nimport type { GithubConversationRef, Office, Workspace } from \"./types.js\";\nimport { atomicWritePrivateFile, readTextFileIfExists } from \"../file-guards.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\nexport const OFFICE_LOG_FILENAME = \"log.jsonl\";\nconst OFFICE_SESSIONS_FILENAME = \"sessions.db\";\nconst OFFICE_KEY_VERSION = \"v1\";\nconst OFFICE_KEY_DOMAIN = \"office-address-v1\";\nconst OFFICE_KEY_DIGEST_LENGTH = 16;\nconst READABLE_ID_LENGTH = 32;\nconst PLATFORM_NAMES = new Set<PlatformName>([\"slack\", \"discord\", \"telegram\", \"github\"]);\nconst OFFICE_KEY_PATTERN =\n /^v1-(slack|discord|telegram|github)-[a-z0-9]+(?:-[a-z0-9]+)*-[a-f0-9]{16}$/;\n\nexport function createOfficeAddress(platform: PlatformName, conversationId: string): OfficeAddress {\n assertPlatformName(platform);\n assertConversationId(conversationId);\n return Object.freeze({ platform, conversationId });\n}\n\nexport function validateOfficeAddress(value: unknown): OfficeAddress {\n if (!isRecord(value)) throw new Error(\"Office address must be an object\");\n if (typeof value.platform !== \"string\") {\n throw new Error(\"Office address platform must be a string\");\n }\n if (typeof value.conversationId !== \"string\") {\n throw new Error(\"Office address conversation id must be a string\");\n }\n return createOfficeAddress(assertPlatformName(value.platform), value.conversationId);\n}\n\nfunction isPlatformName(value: unknown): value is PlatformName {\n return typeof value === \"string\" && PLATFORM_NAMES.has(value as PlatformName);\n}\n\nexport function assertPlatformName(value: string): PlatformName {\n if (!isPlatformName(value)) throw new Error(`Unsupported platform: ${JSON.stringify(value)}`);\n return value;\n}\n\nfunction isUnsafeConversationIdChar(character: string): boolean {\n const code = character.codePointAt(0) ?? 0;\n return character === \"/\" || character === \"\\\\\" || code <= 0x1f || (code >= 0x7f && code <= 0x9f);\n}\n\nexport function assertConversationId(value: string): string {\n if (value.length === 0 || value === \".\" || value === \"..\") {\n throw new Error(\"Conversation id must be non-empty and not a path marker\");\n }\n if ([...value].some(isUnsafeConversationIdChar)) {\n throw new Error(\"Conversation id must not contain path separators or control characters\");\n }\n return value;\n}\n\nexport function officeKey(address: OfficeAddress): OfficeKey {\n const normalized = validateOfficeAddress(address);\n const readable = readableConversationId(normalized.conversationId);\n const digest = createHash(\"sha256\")\n .update(`${OFFICE_KEY_DOMAIN}\\0${normalized.platform}\\0${normalized.conversationId}`)\n .digest(\"hex\")\n .slice(0, OFFICE_KEY_DIGEST_LENGTH);\n return `${OFFICE_KEY_VERSION}-${normalized.platform}-${readable}-${digest}` as OfficeKey;\n}\n\nexport function officeDir(workspaceRoot: string, address: OfficeAddress): string {\n return join(workspaceRoot, officeKey(address));\n}\n\nexport function officeStateDir(stateDir: string, address: OfficeAddress): string {\n return join(stateDir, \"conversations\", officeKey(address));\n}\n\nexport function sameOffice(left: OfficeAddress, right: OfficeAddress): boolean {\n const leftAddress = validateOfficeAddress(left);\n const rightAddress = validateOfficeAddress(right);\n return (\n leftAddress.platform === rightAddress.platform &&\n leftAddress.conversationId === rightAddress.conversationId\n );\n}\n\ninterface ConversationIdentityInput {\n platform: PlatformName;\n conversationId: string;\n address?: OfficeAddress;\n}\n\nfunction resolveConversationAddress(input: ConversationIdentityInput): OfficeAddress {\n const address = createOfficeAddress(input.platform, input.conversationId);\n if (input.address && !sameOffice(address, input.address)) {\n throw new Error(\n `Conversation address mismatch for ${JSON.stringify(input.conversationId)} on ${input.platform}`,\n );\n }\n return address;\n}\n\ntype CanonicalConversation<T, Shape> = Omit<T, keyof ConversationIdentityInput> & Shape;\n\nexport function createConversationEvent<T extends Omit<ConversationEvent, \"address\">>(\n input: T & ConversationIdentityInput,\n): CanonicalConversation<T, ConversationEvent> {\n const address = resolveConversationAddress(input);\n const {\n platform: _platform,\n conversationId: _conversationId,\n address: _suppliedAddress,\n ...event\n } = input;\n return { ...event, address } as CanonicalConversation<T, ConversationEvent>;\n}\n\nexport function createConversationMessage<T extends Omit<ConversationMessage, \"address\">>(\n input: T & ConversationIdentityInput,\n): CanonicalConversation<T, ConversationMessage> {\n const address = resolveConversationAddress(input);\n const {\n platform: _platform,\n conversationId: _conversationId,\n address: _suppliedAddress,\n ...message\n } = input;\n return { ...message, address } as CanonicalConversation<T, ConversationMessage>;\n}\n\nexport function buildGithubConversationId(ref: GithubConversationRef): string {\n return `GH_${ref.owner.toLowerCase()}_${ref.repo.toLowerCase()}_${ref.number}`;\n}\n\nconst GITHUB_CONVERSATION_ID_PATTERN = /^GH_([A-Za-z0-9-]+)_(.+)_(\\d+)$/;\n\nexport function parseGithubConversationId(conversationId: string): GithubConversationRef {\n const match = GITHUB_CONVERSATION_ID_PATTERN.exec(conversationId);\n if (!match) {\n throw new Error(`Not a GitHub conversation id: ${conversationId}`);\n }\n const [, owner, repo, number] = match;\n if (owner === undefined || repo === undefined || number === undefined) {\n throw new Error(`Not a GitHub conversation id: ${conversationId}`);\n }\n return {\n owner: owner.toLowerCase(),\n repo: repo.toLowerCase(),\n number: Number(number),\n };\n}\n\nexport function isOfficeKey(value: unknown): value is OfficeKey {\n return typeof value === \"string\" && OFFICE_KEY_PATTERN.test(value);\n}\n\nfunction readableConversationId(conversationId: string): string {\n const readable = conversationId\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, READABLE_ID_LENGTH)\n .replace(/-+$/g, \"\");\n return readable || \"conversation\";\n}\n\nexport const RESERVED_WORKSPACE_NAMES: ReadonlySet<string> = Object.freeze(\n new Set([\"skills\", \"events\", \"agents\", \"MEMORY.md\"]),\n);\n\nexport function createWorkspace(options: { root: string; stateDir: string }): Workspace {\n const { root, stateDir } = options;\n let registry: OfficeRegistry | undefined;\n const recorded = new Set<string>();\n const offices = new Map<string, Office>();\n\n const workspace: Workspace = Object.freeze({\n root,\n stateDir,\n memoryPath: join(root, \"MEMORY.md\"),\n skillsDir: join(root, \"skills\"),\n agentsDir: join(root, \"agents\"),\n reservedNames: RESERVED_WORKSPACE_NAMES,\n office(address: OfficeAddress): Office {\n const normalized = validateOfficeAddress(address);\n const key = officeKey(normalized);\n const existing = offices.get(key);\n if (existing) return existing;\n\n const dir = join(root, key);\n const conversationStateDir = join(stateDir, \"conversations\", key);\n const office: Office = Object.freeze({\n address: normalized,\n key,\n dir,\n memoryPath: join(dir, \"MEMORY.md\"),\n skillsDir: join(dir, \"skills\"),\n sessionsPath: join(conversationStateDir, OFFICE_SESSIONS_FILENAME),\n attachmentsDir: join(dir, \"attachments\"),\n logPath: join(dir, OFFICE_LOG_FILENAME),\n stateDir: conversationStateDir,\n workspace,\n ensure(): string {\n if (!recorded.has(key)) {\n registry ??= new OfficeRegistry(stateDir);\n registry.recordOffice(normalized);\n recorded.add(key);\n }\n ensureRegularOfficeDirectory(dir);\n return dir;\n },\n });\n offices.set(key, office);\n return office;\n },\n });\n return workspace;\n}\n\nfunction ensureRegularOfficeDirectory(dir: string): void {\n let stats;\n try {\n stats = lstatSync(dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n return;\n }\n if (stats.isSymbolicLink() || !stats.isDirectory()) {\n throw new Error(`Office directory must be a regular non-symlink directory: ${dir}`);\n }\n}\n\nconst REGISTRY_VERSION = 1;\nconst REGISTRY_FILENAME = \"office-registry.json\";\nconst REGISTRY_LOCK_FILENAME = \".office-registry.lock\";\nconst REGISTRY_LOCK_RETRY_MS = 25;\nconst REGISTRY_LOCK_TIMEOUT_MS = 5_000;\nconst REGISTRY_LOCK_STALE_MS = 60_000;\n\ninterface OfficeRegistryOptions {\n writeState?: (path: string, content: string) => void;\n lockTimeoutMs?: number;\n}\n\nexport class OfficeRegistry {\n private readonly stateDir: string;\n private readonly registryPath: string;\n private readonly lockPath: string;\n private readonly writeState: (path: string, content: string) => void;\n private readonly lockTimeoutMs: number;\n private state: OfficeRegistryState;\n\n constructor(stateDir: string, options: OfficeRegistryOptions = {}) {\n this.stateDir = resolve(stateDir);\n mkdirSync(this.stateDir, { recursive: true, mode: 0o700 });\n assertRegularDirectory(this.stateDir, \"State directory\");\n this.registryPath = resolve(this.stateDir, REGISTRY_FILENAME);\n this.lockPath = join(this.stateDir, REGISTRY_LOCK_FILENAME);\n this.writeState = options.writeState ?? atomicWritePrivateFile;\n this.lockTimeoutMs = options.lockTimeoutMs ?? REGISTRY_LOCK_TIMEOUT_MS;\n this.state = this.readState();\n }\n\n recordOffice(address: OfficeAddress): OfficeRecord {\n const normalized = validateOfficeAddress(address);\n const existing = this.findOffice(normalized);\n if (existing) return existing;\n return this.withExclusiveLease(() => {\n const found = this.findOffice(normalized);\n if (found) return found;\n const record: OfficeRecord = Object.freeze({\n platform: normalized.platform,\n conversationId: normalized.conversationId,\n recordedAt: new Date().toISOString(),\n });\n this.replaceState([...this.state.offices, record]);\n return record;\n });\n }\n\n getOffices(): readonly OfficeRecord[] {\n return this.state.offices;\n }\n\n private findOffice(address: OfficeAddress): OfficeRecord | undefined {\n return this.state.offices.find(\n (record) =>\n record.platform === address.platform && record.conversationId === address.conversationId,\n );\n }\n\n private replaceState(offices: readonly OfficeRecord[]): void {\n const candidate = freezeState(offices);\n this.writeState(this.registryPath, `${JSON.stringify(candidate, null, 2)}\\n`);\n this.state = candidate;\n }\n\n private withExclusiveLease<T>(operation: () => T): T {\n const release = acquireRegistryLease(this.lockPath, this.lockTimeoutMs);\n try {\n this.state = this.readState();\n return operation();\n } finally {\n release();\n }\n }\n\n private readState(): OfficeRegistryState {\n assertRegistryFileSafe(this.registryPath);\n const raw = readTextFileIfExists(this.registryPath);\n if (raw === undefined) {\n return freezeState([]);\n }\n\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (error) {\n throw new Error(`Invalid office registry JSON at ${this.registryPath}`, { cause: error });\n }\n return parseState(value, this.registryPath);\n }\n}\n\nfunction freezeState(offices: readonly OfficeRecord[]): OfficeRegistryState {\n return Object.freeze({\n version: REGISTRY_VERSION as 1,\n offices: Object.freeze(offices.map((record) => Object.freeze({ ...record }))),\n });\n}\n\nfunction parseState(value: unknown, path: string): OfficeRegistryState {\n if (!isRecord(value) || value.version !== REGISTRY_VERSION || !Array.isArray(value.offices)) {\n throw new Error(`Invalid office registry at ${path}`);\n }\n const offices = value.offices.map((entry) => parseOfficeRecord(entry, path));\n if (new Set(offices.map((record) => officeKey(record))).size !== offices.length) {\n throw new Error(`Duplicate office record in ${path}`);\n }\n return freezeState(offices);\n}\n\nfunction parseOfficeRecord(value: unknown, path: string): OfficeRecord {\n if (!isRecord(value)) throw new Error(`Invalid office record in ${path}`);\n if (\n typeof value.platform !== \"string\" ||\n typeof value.conversationId !== \"string\" ||\n typeof value.recordedAt !== \"string\"\n ) {\n throw new Error(`Invalid office record fields in ${path}`);\n }\n return Object.freeze({\n platform: assertPlatformName(value.platform),\n conversationId: assertConversationId(value.conversationId),\n recordedAt: value.recordedAt,\n });\n}\n\nfunction assertRegularDirectory(path: string, label: string): void {\n let stat;\n try {\n stat = lstatSync(path);\n } catch (error) {\n throw new Error(`${label} does not exist: ${path}`, { cause: error });\n }\n if (stat.isSymbolicLink() || !stat.isDirectory()) {\n throw new Error(`${label} must be a regular directory: ${path}`);\n }\n}\n\nfunction lstatIfExists(path: string): Stats | undefined {\n try {\n return lstatSync(path);\n } catch (error) {\n if (isErrno(error, \"ENOENT\")) return undefined;\n throw error;\n }\n}\n\nfunction assertRegistryFileSafe(path: string): void {\n const stat = lstatIfExists(path);\n if (stat && (stat.isSymbolicLink() || !stat.isFile())) {\n throw new Error(`Office registry must be a regular file: ${path}`);\n }\n}\n\nfunction claimRegistryLock(lockPath: string, token: string): void {\n mkdirSync(lockPath, { mode: 0o700 });\n try {\n writeFileSync(join(lockPath, \"owner\"), `${token}\\n`, { mode: 0o600 });\n } catch (error) {\n rmSync(lockPath, { recursive: true, force: true });\n throw error;\n }\n}\n\nfunction acquireRegistryLease(lockPath: string, timeoutMs: number): () => void {\n const deadline = Date.now() + timeoutMs;\n const token = `${process.pid}:${randomBytes(8).toString(\"hex\")}`;\n\n for (;;) {\n try {\n claimRegistryLock(lockPath, token);\n return () => releaseRegistryLease(lockPath, token);\n } catch (error) {\n awaitFreeRegistryLock(lockPath, deadline, error);\n }\n }\n}\n\nfunction awaitFreeRegistryLock(lockPath: string, deadline: number, error: unknown): void {\n if (!isErrno(error, \"EEXIST\")) throw error;\n if (registryLockIsStale(lockPath)) {\n rmSync(lockPath, { recursive: true, force: true });\n return;\n }\n if (Date.now() >= deadline) {\n throw new Error(`Timed out acquiring office registry lock: ${lockPath}`, { cause: error });\n }\n sleepSync(REGISTRY_LOCK_RETRY_MS);\n}\n\nfunction releaseRegistryLease(lockPath: string, token: string): void {\n try {\n if (readFileSync(join(lockPath, \"owner\"), \"utf8\").trim() === token) {\n rmSync(lockPath, { recursive: true, force: true });\n }\n } catch (error) {\n if (!isErrno(error, \"ENOENT\")) throw error;\n }\n}\n\nfunction registryLockIsStale(lockPath: string): boolean {\n let ownerKnown = false;\n let ownerAlive = false;\n try {\n const owner = readFileSync(join(lockPath, \"owner\"), \"utf8\").trim();\n const pid = Number(owner.split(\":\", 1)[0]);\n if (Number.isInteger(pid) && pid > 0) {\n ownerKnown = true;\n try {\n process.kill(pid, 0);\n ownerAlive = true;\n } catch (error) {\n if (isErrno(error, \"EPERM\")) ownerAlive = true;\n }\n }\n } catch {}\n try {\n const oldEnough = Date.now() - statSync(lockPath).mtimeMs >= REGISTRY_LOCK_STALE_MS;\n return ownerKnown ? !ownerAlive : oldEnough;\n } catch {\n return false;\n }\n}\n\nfunction sleepSync(milliseconds: number): void {\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);\n}\n\nexport function listRegisteredOffices(stateDir: string): readonly OfficeRecord[] {\n return new OfficeRegistry(stateDir).getOffices();\n}\n\nfunction isErrno(error: unknown, code: string): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { Office, PlatformChannelKind, WorkspaceProjection } from "./types.js";
2
+ import type { WorkspaceVisibility } from "../types.js";
3
+ export declare function recordPlatformChannelKind(office: Office, kind: PlatformChannelKind): void;
4
+ export declare function readPlatformChannelKind(office: Office): PlatformChannelKind | undefined;
5
+ export interface OfficeVisibilityDecision {
6
+ visibility: WorkspaceVisibility;
7
+ source: "platform" | "override" | "unknown";
8
+ }
9
+ export declare function resolveOfficeVisibility(office: Office): OfficeVisibilityDecision;
10
+ export declare function resolveWorkspaceProjection(office: Office): WorkspaceProjection;
11
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/office/projection.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,KAAK,EAAkB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAWvE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAIzF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAiBvF;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CAC7C;AAID,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAUhF;AAcD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAiC9E"}
@@ -0,0 +1,145 @@
1
+ import { dirname, join } from "node:path";
2
+ import { lstatSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { atomicWritePrivateFile, ensureDirExists } from "../file-guards.js";
4
+ import { loadOfficeVisibilityOverride } from "../settings/index.js";
5
+ import { listRegisteredOffices } from "./index.js";
6
+ import * as log from "../log.js";
7
+ import { guestPublicOfficePath, guestWorkspacePath } from "../sandbox/layout.js";
8
+ import { errorMessage } from "../unknown-values.js";
9
+ const CHANNEL_KIND_FILE = "channel-kind";
10
+ const CHANNEL_KINDS = [
11
+ "public_channel",
12
+ "private_channel",
13
+ "im",
14
+ "external",
15
+ ];
16
+ export function recordPlatformChannelKind(office, kind) {
17
+ if (readPlatformChannelKind(office) === kind)
18
+ return;
19
+ ensureDirExists(office.stateDir);
20
+ atomicWritePrivateFile(join(office.stateDir, CHANNEL_KIND_FILE), kind + "\n");
21
+ }
22
+ export function readPlatformChannelKind(office) {
23
+ const path = join(office.stateDir, CHANNEL_KIND_FILE);
24
+ let raw;
25
+ try {
26
+ raw = readFileSync(path, "utf-8");
27
+ }
28
+ catch (err) {
29
+ if (err.code === "ENOENT")
30
+ return undefined;
31
+ log.logWarning("Could not read platform channel kind; treating the office as private", `${path}: ${errorMessage(err)}`);
32
+ return undefined;
33
+ }
34
+ const value = raw.trim();
35
+ return CHANNEL_KINDS.includes(value)
36
+ ? value
37
+ : undefined;
38
+ }
39
+ const PUBLIC_CAPABLE_PLATFORMS = new Set(["slack"]);
40
+ export function resolveOfficeVisibility(office) {
41
+ if (loadOfficeVisibilityOverride(office) === "private") {
42
+ return { visibility: "private", source: "override" };
43
+ }
44
+ if (!PUBLIC_CAPABLE_PLATFORMS.has(office.address.platform)) {
45
+ return { visibility: "private", source: "platform" };
46
+ }
47
+ const kind = readPlatformChannelKind(office);
48
+ if (kind === undefined)
49
+ return { visibility: "private", source: "unknown" };
50
+ return { visibility: kind === "public_channel" ? "public" : "private", source: "platform" };
51
+ }
52
+ function publicOfficeMounts(self) {
53
+ const { workspace } = self;
54
+ const mounts = [];
55
+ for (const record of listRegisteredOffices(workspace.stateDir)) {
56
+ const other = workspace.office(record);
57
+ if (other.key === self.key || !exists(other.dir))
58
+ continue;
59
+ if (resolveOfficeVisibility(other).visibility !== "public")
60
+ continue;
61
+ mounts.push({ source: other.dir, target: guestPublicOfficePath(other.key), readOnly: true });
62
+ }
63
+ return mounts.toSorted((a, b) => a.target.localeCompare(b.target));
64
+ }
65
+ export function resolveWorkspaceProjection(office) {
66
+ const { workspace } = office;
67
+ const decision = resolveOfficeVisibility(office);
68
+ const readOnlyKnowledge = decision.visibility === "private";
69
+ assertDirectory(workspace.root, "Host workspace root");
70
+ office.ensure();
71
+ ensureRegularFile(workspace.memoryPath, "Workspace memory");
72
+ ensureDirectoryRoot(workspace.skillsDir, "Workspace skills");
73
+ return {
74
+ ...decision,
75
+ mounts: [
76
+ { source: office.dir, target: guestWorkspacePath(office.key) },
77
+ {
78
+ source: workspace.memoryPath,
79
+ target: guestWorkspacePath("MEMORY.md"),
80
+ readOnly: readOnlyKnowledge ? true : undefined,
81
+ },
82
+ {
83
+ source: workspace.skillsDir,
84
+ target: guestWorkspacePath("skills"),
85
+ readOnly: readOnlyKnowledge ? true : undefined,
86
+ },
87
+ ...publicOfficeMounts(office),
88
+ ],
89
+ promptSources: {
90
+ conversationMemoryPath: office.memoryPath,
91
+ conversationSkillsDir: office.skillsDir,
92
+ globalMemoryPath: workspace.memoryPath,
93
+ globalSkillsDir: workspace.skillsDir,
94
+ globalKnowledgeReadOnly: readOnlyKnowledge ? true : undefined,
95
+ },
96
+ };
97
+ }
98
+ function ensureDirectoryRoot(path, label) {
99
+ if (!exists(path)) {
100
+ mkdirSync(path, { recursive: true, mode: 0o700 });
101
+ return;
102
+ }
103
+ assertDirectory(path, label);
104
+ }
105
+ function ensureRegularFile(path, label) {
106
+ if (!exists(path)) {
107
+ ensureDirExists(dirname(path));
108
+ writeFileSync(path, "", { mode: 0o600, flag: "wx" });
109
+ return;
110
+ }
111
+ let stats;
112
+ try {
113
+ stats = lstatSync(path);
114
+ }
115
+ catch (err) {
116
+ throw new Error(`${label} cannot be inspected: ${path}`, { cause: err });
117
+ }
118
+ if (stats.isSymbolicLink() || !stats.isFile()) {
119
+ throw new Error(`${label} must be a regular non-symlink file: ${path}`);
120
+ }
121
+ }
122
+ function assertDirectory(path, label) {
123
+ let stats;
124
+ try {
125
+ stats = lstatSync(path);
126
+ }
127
+ catch (err) {
128
+ throw new Error(`${label} cannot be inspected: ${path}`, { cause: err });
129
+ }
130
+ if (stats.isSymbolicLink() || !stats.isDirectory()) {
131
+ throw new Error(`${label} must be a regular non-symlink directory: ${path}`);
132
+ }
133
+ }
134
+ function exists(path) {
135
+ try {
136
+ lstatSync(path);
137
+ return true;
138
+ }
139
+ catch (err) {
140
+ if (err.code === "ENOENT")
141
+ return false;
142
+ throw err;
143
+ }
144
+ }
145
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/office/projection.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, join } from \"node:path\";\nimport { lstatSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { atomicWritePrivateFile, ensureDirExists } from \"../file-guards.js\";\nimport { loadOfficeVisibilityOverride } from \"../settings/index.js\";\nimport { listRegisteredOffices } from \"./index.js\";\nimport type { Office, PlatformChannelKind, WorkspaceProjection } from \"./types.js\";\nimport * as log from \"../log.js\";\nimport { guestPublicOfficePath, guestWorkspacePath } from \"../sandbox/layout.js\";\nimport type { ContainerMount, WorkspaceVisibility } from \"../types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst CHANNEL_KIND_FILE = \"channel-kind\";\nconst CHANNEL_KINDS: readonly PlatformChannelKind[] = [\n \"public_channel\",\n \"private_channel\",\n \"im\",\n \"external\",\n];\n\nexport function recordPlatformChannelKind(office: Office, kind: PlatformChannelKind): void {\n if (readPlatformChannelKind(office) === kind) return;\n ensureDirExists(office.stateDir);\n atomicWritePrivateFile(join(office.stateDir, CHANNEL_KIND_FILE), kind + \"\\n\");\n}\n\nexport function readPlatformChannelKind(office: Office): PlatformChannelKind | undefined {\n const path = join(office.stateDir, CHANNEL_KIND_FILE);\n let raw: string;\n try {\n raw = readFileSync(path, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n log.logWarning(\n \"Could not read platform channel kind; treating the office as private\",\n `${path}: ${errorMessage(err)}`,\n );\n return undefined;\n }\n const value = raw.trim();\n return (CHANNEL_KINDS as readonly string[]).includes(value)\n ? (value as PlatformChannelKind)\n : undefined;\n}\n\nexport interface OfficeVisibilityDecision {\n visibility: WorkspaceVisibility;\n source: \"platform\" | \"override\" | \"unknown\";\n}\n\nconst PUBLIC_CAPABLE_PLATFORMS: ReadonlySet<string> = new Set([\"slack\"]);\n\nexport function resolveOfficeVisibility(office: Office): OfficeVisibilityDecision {\n if (loadOfficeVisibilityOverride(office) === \"private\") {\n return { visibility: \"private\", source: \"override\" };\n }\n if (!PUBLIC_CAPABLE_PLATFORMS.has(office.address.platform)) {\n return { visibility: \"private\", source: \"platform\" };\n }\n const kind = readPlatformChannelKind(office);\n if (kind === undefined) return { visibility: \"private\", source: \"unknown\" };\n return { visibility: kind === \"public_channel\" ? \"public\" : \"private\", source: \"platform\" };\n}\n\nfunction publicOfficeMounts(self: Office): ContainerMount[] {\n const { workspace } = self;\n const mounts: ContainerMount[] = [];\n for (const record of listRegisteredOffices(workspace.stateDir)) {\n const other = workspace.office(record);\n if (other.key === self.key || !exists(other.dir)) continue;\n if (resolveOfficeVisibility(other).visibility !== \"public\") continue;\n mounts.push({ source: other.dir, target: guestPublicOfficePath(other.key), readOnly: true });\n }\n return mounts.toSorted((a, b) => a.target.localeCompare(b.target));\n}\n\nexport function resolveWorkspaceProjection(office: Office): WorkspaceProjection {\n const { workspace } = office;\n const decision = resolveOfficeVisibility(office);\n const readOnlyKnowledge = decision.visibility === \"private\";\n\n assertDirectory(workspace.root, \"Host workspace root\");\n office.ensure();\n ensureRegularFile(workspace.memoryPath, \"Workspace memory\");\n ensureDirectoryRoot(workspace.skillsDir, \"Workspace skills\");\n return {\n ...decision,\n mounts: [\n { source: office.dir, target: guestWorkspacePath(office.key) },\n {\n source: workspace.memoryPath,\n target: guestWorkspacePath(\"MEMORY.md\"),\n readOnly: readOnlyKnowledge ? true : undefined,\n },\n {\n source: workspace.skillsDir,\n target: guestWorkspacePath(\"skills\"),\n readOnly: readOnlyKnowledge ? true : undefined,\n },\n ...publicOfficeMounts(office),\n ],\n promptSources: {\n conversationMemoryPath: office.memoryPath,\n conversationSkillsDir: office.skillsDir,\n globalMemoryPath: workspace.memoryPath,\n globalSkillsDir: workspace.skillsDir,\n globalKnowledgeReadOnly: readOnlyKnowledge ? true : undefined,\n },\n };\n}\n\nfunction ensureDirectoryRoot(path: string, label: string): void {\n if (!exists(path)) {\n mkdirSync(path, { recursive: true, mode: 0o700 });\n return;\n }\n assertDirectory(path, label);\n}\n\nfunction ensureRegularFile(path: string, label: string): void {\n if (!exists(path)) {\n ensureDirExists(dirname(path));\n writeFileSync(path, \"\", { mode: 0o600, flag: \"wx\" });\n return;\n }\n let stats;\n try {\n stats = lstatSync(path);\n } catch (err) {\n throw new Error(`${label} cannot be inspected: ${path}`, { cause: err });\n }\n if (stats.isSymbolicLink() || !stats.isFile()) {\n throw new Error(`${label} must be a regular non-symlink file: ${path}`);\n }\n}\n\nfunction assertDirectory(path: string, label: string): void {\n let stats;\n try {\n stats = lstatSync(path);\n } catch (err) {\n throw new Error(`${label} cannot be inspected: ${path}`, { cause: err });\n }\n if (stats.isSymbolicLink() || !stats.isDirectory()) {\n throw new Error(`${label} must be a regular non-symlink directory: ${path}`);\n }\n}\n\nfunction exists(path: string): boolean {\n try {\n lstatSync(path);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw err;\n }\n}\n"]}