@geminixiang/mikan 1.0.0-beta.6 → 1.0.0-beta.61

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 (799) hide show
  1. package/CHANGELOG.md +948 -0
  2. package/README.md +95 -37
  3. package/dist/adapter.d.ts +11 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +18 -1
  6. package/dist/adapter.js.map +1 -1
  7. package/dist/adapters/commands/admin.d.ts.map +1 -0
  8. package/dist/{commands → adapters/commands}/admin.js +11 -8
  9. package/dist/adapters/commands/admin.js.map +1 -0
  10. package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
  11. package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
  12. package/dist/adapters/commands/auto-reply.js +38 -0
  13. package/dist/adapters/commands/auto-reply.js.map +1 -0
  14. package/dist/adapters/commands/login.d.ts +6 -0
  15. package/dist/adapters/commands/login.d.ts.map +1 -0
  16. package/dist/adapters/commands/login.js +166 -0
  17. package/dist/adapters/commands/login.js.map +1 -0
  18. package/dist/adapters/commands/manifest.d.ts +37 -0
  19. package/dist/adapters/commands/manifest.d.ts.map +1 -0
  20. package/dist/adapters/commands/manifest.js +155 -0
  21. package/dist/adapters/commands/manifest.js.map +1 -0
  22. package/dist/adapters/commands/model.d.ts +15 -0
  23. package/dist/adapters/commands/model.d.ts.map +1 -0
  24. package/dist/adapters/commands/model.js +153 -0
  25. package/dist/adapters/commands/model.js.map +1 -0
  26. package/dist/adapters/commands/new.d.ts.map +1 -0
  27. package/dist/adapters/commands/new.js +41 -0
  28. package/dist/adapters/commands/new.js.map +1 -0
  29. package/dist/adapters/commands/registry.d.ts +5 -0
  30. package/dist/adapters/commands/registry.d.ts.map +1 -0
  31. package/dist/adapters/commands/registry.js +43 -0
  32. package/dist/adapters/commands/registry.js.map +1 -0
  33. package/dist/adapters/commands/sandbox.d.ts.map +1 -0
  34. package/dist/adapters/commands/sandbox.js +148 -0
  35. package/dist/adapters/commands/sandbox.js.map +1 -0
  36. package/dist/adapters/commands/session-view.d.ts.map +1 -0
  37. package/dist/{commands → adapters/commands}/session-view.js +23 -16
  38. package/dist/adapters/commands/session-view.js.map +1 -0
  39. package/dist/adapters/commands/types.d.ts +145 -0
  40. package/dist/adapters/commands/types.d.ts.map +1 -0
  41. package/dist/adapters/commands/types.js.map +1 -0
  42. package/dist/adapters/commands/utils.d.ts +14 -0
  43. package/dist/adapters/commands/utils.d.ts.map +1 -0
  44. package/dist/{commands → adapters/commands}/utils.js +18 -1
  45. package/dist/adapters/commands/utils.js.map +1 -0
  46. package/dist/adapters/discord/bot.d.ts +11 -8
  47. package/dist/adapters/discord/bot.d.ts.map +1 -1
  48. package/dist/adapters/discord/bot.js +218 -252
  49. package/dist/adapters/discord/bot.js.map +1 -1
  50. package/dist/adapters/discord/components.d.ts +28 -0
  51. package/dist/adapters/discord/components.d.ts.map +1 -0
  52. package/dist/adapters/discord/components.js +32 -0
  53. package/dist/adapters/discord/components.js.map +1 -0
  54. package/dist/adapters/discord/context.d.ts +2 -6
  55. package/dist/adapters/discord/context.d.ts.map +1 -1
  56. package/dist/adapters/discord/context.js +63 -218
  57. package/dist/adapters/discord/context.js.map +1 -1
  58. package/dist/adapters/discord/format.d.ts +3 -0
  59. package/dist/adapters/discord/format.d.ts.map +1 -0
  60. package/dist/adapters/discord/format.js +84 -0
  61. package/dist/adapters/discord/format.js.map +1 -0
  62. package/dist/adapters/discord/types.d.ts +7 -0
  63. package/dist/adapters/discord/types.d.ts.map +1 -1
  64. package/dist/adapters/discord/types.js.map +1 -1
  65. package/dist/adapters/github/bot.d.ts +102 -0
  66. package/dist/adapters/github/bot.d.ts.map +1 -0
  67. package/dist/adapters/github/bot.js +720 -0
  68. package/dist/adapters/github/bot.js.map +1 -0
  69. package/dist/adapters/github/client.d.ts +122 -0
  70. package/dist/adapters/github/client.d.ts.map +1 -0
  71. package/dist/adapters/github/client.js +301 -0
  72. package/dist/adapters/github/client.js.map +1 -0
  73. package/dist/adapters/github/context.d.ts +5 -0
  74. package/dist/adapters/github/context.d.ts.map +1 -0
  75. package/dist/adapters/github/context.js +101 -0
  76. package/dist/adapters/github/context.js.map +1 -0
  77. package/dist/adapters/github/github-ops.d.ts +78 -0
  78. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  79. package/dist/adapters/github/github-ops.js +337 -0
  80. package/dist/adapters/github/github-ops.js.map +1 -0
  81. package/dist/adapters/github/ids.d.ts +34 -0
  82. package/dist/adapters/github/ids.d.ts.map +1 -0
  83. package/dist/adapters/github/ids.js +57 -0
  84. package/dist/adapters/github/ids.js.map +1 -0
  85. package/dist/adapters/github/repo.d.ts +33 -0
  86. package/dist/adapters/github/repo.d.ts.map +1 -0
  87. package/dist/adapters/github/repo.js +141 -0
  88. package/dist/adapters/github/repo.js.map +1 -0
  89. package/dist/adapters/github/tool-pack.d.ts +14 -0
  90. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  91. package/dist/adapters/github/tool-pack.js +55 -0
  92. package/dist/adapters/github/tool-pack.js.map +1 -0
  93. package/dist/adapters/github/tools/checks.d.ts +18 -0
  94. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  95. package/dist/adapters/github/tools/checks.js +86 -0
  96. package/dist/adapters/github/tools/checks.js.map +1 -0
  97. package/dist/adapters/github/tools/issue.d.ts +21 -0
  98. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  99. package/dist/adapters/github/tools/issue.js +48 -0
  100. package/dist/adapters/github/tools/issue.js.map +1 -0
  101. package/dist/adapters/github/tools/pr.d.ts +22 -0
  102. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  103. package/dist/adapters/github/tools/pr.js +48 -0
  104. package/dist/adapters/github/tools/pr.js.map +1 -0
  105. package/dist/adapters/github/tools/read.d.ts +21 -0
  106. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  107. package/dist/adapters/github/tools/read.js +141 -0
  108. package/dist/adapters/github/tools/read.js.map +1 -0
  109. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  110. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  111. package/dist/adapters/github/tools/review-reply.js +38 -0
  112. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  113. package/dist/adapters/github/tools/sync.d.ts +17 -0
  114. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  115. package/dist/adapters/github/tools/sync.js +34 -0
  116. package/dist/adapters/github/tools/sync.js.map +1 -0
  117. package/dist/adapters/github/types.d.ts +345 -0
  118. package/dist/adapters/github/types.d.ts.map +1 -0
  119. package/dist/adapters/github/types.js.map +1 -0
  120. package/dist/adapters/github/webhook.d.ts +20 -0
  121. package/dist/adapters/github/webhook.d.ts.map +1 -0
  122. package/dist/adapters/github/webhook.js +78 -0
  123. package/dist/adapters/github/webhook.js.map +1 -0
  124. package/dist/adapters/intake.d.ts +16 -5
  125. package/dist/adapters/intake.d.ts.map +1 -1
  126. package/dist/adapters/intake.js +96 -27
  127. package/dist/adapters/intake.js.map +1 -1
  128. package/dist/adapters/markdown-tables.d.ts +19 -0
  129. package/dist/adapters/markdown-tables.d.ts.map +1 -0
  130. package/dist/adapters/markdown-tables.js +152 -0
  131. package/dist/adapters/markdown-tables.js.map +1 -0
  132. package/dist/adapters/progressive-renderer.d.ts +7 -0
  133. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  134. package/dist/adapters/progressive-renderer.js +443 -0
  135. package/dist/adapters/progressive-renderer.js.map +1 -0
  136. package/dist/adapters/shared.d.ts +35 -11
  137. package/dist/adapters/shared.d.ts.map +1 -1
  138. package/dist/adapters/shared.js +105 -24
  139. package/dist/adapters/shared.js.map +1 -1
  140. package/dist/adapters/slack/assistant.d.ts +73 -0
  141. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  142. package/dist/adapters/slack/assistant.js +205 -0
  143. package/dist/adapters/slack/assistant.js.map +1 -0
  144. package/dist/adapters/slack/blocks.d.ts +14 -0
  145. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  146. package/dist/adapters/slack/blocks.js +104 -148
  147. package/dist/adapters/slack/blocks.js.map +1 -1
  148. package/dist/adapters/slack/bot.d.ts +118 -18
  149. package/dist/adapters/slack/bot.d.ts.map +1 -1
  150. package/dist/adapters/slack/bot.js +883 -468
  151. package/dist/adapters/slack/bot.js.map +1 -1
  152. package/dist/adapters/slack/context.d.ts +2 -6
  153. package/dist/adapters/slack/context.d.ts.map +1 -1
  154. package/dist/adapters/slack/context.js +11 -17
  155. package/dist/adapters/slack/context.js.map +1 -1
  156. package/dist/adapters/slack/markdown.d.ts +3 -0
  157. package/dist/adapters/slack/markdown.d.ts.map +1 -0
  158. package/dist/adapters/slack/markdown.js +48 -0
  159. package/dist/adapters/slack/markdown.js.map +1 -0
  160. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  161. package/dist/adapters/slack/response-lifecycle.js +240 -345
  162. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  163. package/dist/adapters/slack/session.d.ts.map +1 -1
  164. package/dist/adapters/slack/session.js +7 -11
  165. package/dist/adapters/slack/session.js.map +1 -1
  166. package/dist/adapters/slack/stream-limits.d.ts +35 -0
  167. package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
  168. package/dist/adapters/slack/stream-limits.js +56 -0
  169. package/dist/adapters/slack/stream-limits.js.map +1 -0
  170. package/dist/adapters/slack/task-status.d.ts +7 -0
  171. package/dist/adapters/slack/task-status.d.ts.map +1 -0
  172. package/dist/adapters/slack/task-status.js +101 -0
  173. package/dist/adapters/slack/task-status.js.map +1 -0
  174. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  175. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  176. package/dist/adapters/slack/tool-pack.js +45 -0
  177. package/dist/adapters/slack/tool-pack.js.map +1 -0
  178. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  179. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  180. package/dist/adapters/slack/tools/blockkit.js +106 -0
  181. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  182. package/dist/adapters/slack/types.d.ts +73 -2
  183. package/dist/adapters/slack/types.d.ts.map +1 -1
  184. package/dist/adapters/slack/types.js.map +1 -1
  185. package/dist/adapters/slack/update-diagnostics.d.ts +14 -0
  186. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
  187. package/dist/adapters/slack/update-diagnostics.js +134 -0
  188. package/dist/adapters/slack/update-diagnostics.js.map +1 -0
  189. package/dist/adapters/telegram/bot.d.ts +10 -9
  190. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  191. package/dist/adapters/telegram/bot.js +129 -198
  192. package/dist/adapters/telegram/bot.js.map +1 -1
  193. package/dist/adapters/telegram/context.d.ts +2 -6
  194. package/dist/adapters/telegram/context.d.ts.map +1 -1
  195. package/dist/adapters/telegram/context.js +52 -190
  196. package/dist/adapters/telegram/context.js.map +1 -1
  197. package/dist/adapters/types.d.ts +144 -13
  198. package/dist/adapters/types.d.ts.map +1 -1
  199. package/dist/adapters/types.js.map +1 -1
  200. package/dist/adapters/web/admin/portal.d.ts +44 -0
  201. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  202. package/dist/adapters/web/admin/portal.js +3284 -0
  203. package/dist/adapters/web/admin/portal.js.map +1 -0
  204. package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
  205. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  206. package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
  207. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  208. package/dist/adapters/web/admin/types.d.ts +50 -0
  209. package/dist/adapters/web/admin/types.d.ts.map +1 -0
  210. package/dist/adapters/web/admin/types.js.map +1 -0
  211. package/dist/adapters/web/login/oauth.d.ts +5 -0
  212. package/dist/adapters/web/login/oauth.d.ts.map +1 -0
  213. package/dist/{web → adapters/web}/login/oauth.js +50 -85
  214. package/dist/adapters/web/login/oauth.js.map +1 -0
  215. package/dist/{web → adapters/web}/login/portal.d.ts +9 -3
  216. package/dist/adapters/web/login/portal.d.ts.map +1 -0
  217. package/dist/{web → adapters/web}/login/portal.js +161 -119
  218. package/dist/adapters/web/login/portal.js.map +1 -0
  219. package/dist/{web → adapters/web}/login/types.d.ts +1 -12
  220. package/dist/adapters/web/login/types.d.ts.map +1 -0
  221. package/dist/adapters/web/login/types.js.map +1 -0
  222. package/dist/adapters/web/portal-shell.d.ts +22 -0
  223. package/dist/adapters/web/portal-shell.d.ts.map +1 -0
  224. package/dist/{portal-shell.js → adapters/web/portal-shell.js} +78 -2
  225. package/dist/adapters/web/portal-shell.js.map +1 -0
  226. package/dist/{web → adapters/web}/server.d.ts +11 -8
  227. package/dist/adapters/web/server.d.ts.map +1 -0
  228. package/dist/{web → adapters/web}/server.js +16 -7
  229. package/dist/adapters/web/server.js.map +1 -0
  230. package/dist/adapters/web/session-view/portal.d.ts +20 -0
  231. package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
  232. package/dist/{web → adapters/web}/session-view/portal.js +633 -162
  233. package/dist/adapters/web/session-view/portal.js.map +1 -0
  234. package/dist/{web → adapters/web}/session-view/types.d.ts +11 -6
  235. package/dist/adapters/web/session-view/types.d.ts.map +1 -0
  236. package/dist/adapters/web/session-view/types.js.map +1 -0
  237. package/dist/adapters/web/token-store.d.ts.map +1 -0
  238. package/dist/{web → adapters/web}/token-store.js +1 -1
  239. package/dist/adapters/web/token-store.js.map +1 -0
  240. package/dist/adapters/web/types.d.ts.map +1 -0
  241. package/dist/adapters/web/types.js.map +1 -0
  242. package/dist/cli/arg-grammar.d.ts +11 -0
  243. package/dist/cli/arg-grammar.d.ts.map +1 -0
  244. package/dist/cli/arg-grammar.js +50 -0
  245. package/dist/cli/arg-grammar.js.map +1 -0
  246. package/dist/cli/boot.d.ts +5 -0
  247. package/dist/cli/boot.d.ts.map +1 -0
  248. package/dist/cli/boot.js +90 -0
  249. package/dist/cli/boot.js.map +1 -0
  250. package/dist/cli/download.d.ts.map +1 -0
  251. package/dist/cli/download.js +88 -0
  252. package/dist/cli/download.js.map +1 -0
  253. package/dist/cli/office.d.ts +2 -0
  254. package/dist/cli/office.d.ts.map +1 -0
  255. package/dist/cli/office.js +83 -0
  256. package/dist/cli/office.js.map +1 -0
  257. package/dist/cli/onboard.d.ts +10 -0
  258. package/dist/cli/onboard.d.ts.map +1 -0
  259. package/dist/cli/onboard.js +225 -0
  260. package/dist/cli/onboard.js.map +1 -0
  261. package/dist/cli/sessions.d.ts +2 -0
  262. package/dist/cli/sessions.d.ts.map +1 -0
  263. package/dist/cli/sessions.js +88 -0
  264. package/dist/cli/sessions.js.map +1 -0
  265. package/dist/cli/types.d.ts +25 -0
  266. package/dist/cli/types.d.ts.map +1 -0
  267. package/dist/cli/types.js.map +1 -0
  268. package/dist/config.d.ts +38 -39
  269. package/dist/config.d.ts.map +1 -1
  270. package/dist/config.js +256 -215
  271. package/dist/config.js.map +1 -1
  272. package/dist/dream/index.d.ts +20 -0
  273. package/dist/dream/index.d.ts.map +1 -0
  274. package/dist/dream/index.js +264 -0
  275. package/dist/dream/index.js.map +1 -0
  276. package/dist/dream/types.d.ts +30 -0
  277. package/dist/dream/types.d.ts.map +1 -0
  278. package/dist/dream/types.js +2 -0
  279. package/dist/dream/types.js.map +1 -0
  280. package/dist/env-manifest.d.ts +32 -0
  281. package/dist/env-manifest.d.ts.map +1 -0
  282. package/dist/env-manifest.js +244 -0
  283. package/dist/env-manifest.js.map +1 -0
  284. package/dist/events/index.d.ts +150 -0
  285. package/dist/events/index.d.ts.map +1 -0
  286. package/dist/events/index.js +249 -0
  287. package/dist/events/index.js.map +1 -0
  288. package/dist/{events.d.ts → events/watcher.d.ts} +4 -4
  289. package/dist/events/watcher.d.ts.map +1 -0
  290. package/dist/{events.js → events/watcher.js} +23 -84
  291. package/dist/events/watcher.js.map +1 -0
  292. package/dist/{utils/file-guards.d.ts → file-guards.d.ts} +9 -0
  293. package/dist/file-guards.d.ts.map +1 -0
  294. package/dist/{utils/file-guards.js → file-guards.js} +44 -1
  295. package/dist/file-guards.js.map +1 -0
  296. package/dist/harness/execution-env.d.ts +19 -0
  297. package/dist/harness/execution-env.d.ts.map +1 -0
  298. package/dist/harness/execution-env.js +262 -0
  299. package/dist/harness/execution-env.js.map +1 -0
  300. package/dist/harness/execution-resolver.d.ts +25 -0
  301. package/dist/harness/execution-resolver.d.ts.map +1 -0
  302. package/dist/harness/execution-resolver.js +156 -0
  303. package/dist/harness/execution-resolver.js.map +1 -0
  304. package/dist/harness/index.d.ts +17 -13
  305. package/dist/harness/index.d.ts.map +1 -1
  306. package/dist/harness/index.js +10 -11
  307. package/dist/harness/index.js.map +1 -1
  308. package/dist/harness/mcp.d.ts +38 -0
  309. package/dist/harness/mcp.d.ts.map +1 -0
  310. package/dist/harness/mcp.js +306 -0
  311. package/dist/harness/mcp.js.map +1 -0
  312. package/dist/harness/models.d.ts +7 -4
  313. package/dist/harness/models.d.ts.map +1 -1
  314. package/dist/harness/models.js +54 -55
  315. package/dist/harness/models.js.map +1 -1
  316. package/dist/harness/open-connector.d.ts +14 -0
  317. package/dist/harness/open-connector.d.ts.map +1 -0
  318. package/dist/harness/open-connector.js +204 -0
  319. package/dist/harness/open-connector.js.map +1 -0
  320. package/dist/harness/presenter.d.ts +31 -0
  321. package/dist/harness/presenter.d.ts.map +1 -0
  322. package/dist/harness/presenter.js +832 -0
  323. package/dist/harness/presenter.js.map +1 -0
  324. package/dist/harness/prompt.d.ts +30 -0
  325. package/dist/harness/prompt.d.ts.map +1 -0
  326. package/dist/harness/prompt.js +431 -0
  327. package/dist/harness/prompt.js.map +1 -0
  328. package/dist/harness/runner.d.ts +2 -123
  329. package/dist/harness/runner.d.ts.map +1 -1
  330. package/dist/harness/runner.js +537 -417
  331. package/dist/harness/runner.js.map +1 -1
  332. package/dist/harness/session.d.ts +122 -0
  333. package/dist/harness/session.d.ts.map +1 -0
  334. package/dist/harness/session.js +581 -0
  335. package/dist/harness/session.js.map +1 -0
  336. package/dist/harness/skills.d.ts +17 -28
  337. package/dist/harness/skills.d.ts.map +1 -1
  338. package/dist/harness/skills.js +104 -39
  339. package/dist/harness/skills.js.map +1 -1
  340. package/dist/harness/subagent-profiles.d.ts +8 -0
  341. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  342. package/dist/harness/subagent-profiles.js +284 -0
  343. package/dist/harness/subagent-profiles.js.map +1 -0
  344. package/dist/harness/subagent.d.ts +64 -0
  345. package/dist/harness/subagent.d.ts.map +1 -0
  346. package/dist/harness/subagent.js +687 -0
  347. package/dist/harness/subagent.js.map +1 -0
  348. package/dist/harness/tools/attach.d.ts.map +1 -0
  349. package/dist/{adapters/slack → harness}/tools/attach.js +1 -1
  350. package/dist/harness/tools/attach.js.map +1 -0
  351. package/dist/{tools → harness/tools}/event.d.ts +3 -32
  352. package/dist/harness/tools/event.d.ts.map +1 -0
  353. package/dist/harness/tools/event.js +178 -0
  354. package/dist/harness/tools/event.js.map +1 -0
  355. package/dist/harness/tools/generate-image.d.ts +23 -0
  356. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  357. package/dist/harness/tools/generate-image.js +65 -0
  358. package/dist/harness/tools/generate-image.js.map +1 -0
  359. package/dist/harness/tools/host-fn-tool.d.ts +21 -0
  360. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  361. package/dist/harness/tools/host-fn-tool.js +32 -0
  362. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  363. package/dist/harness/tools/index.d.ts +40 -0
  364. package/dist/harness/tools/index.d.ts.map +1 -0
  365. package/dist/harness/tools/index.js +49 -0
  366. package/dist/harness/tools/index.js.map +1 -0
  367. package/dist/harness/tools/pi-tools.d.ts +18 -0
  368. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  369. package/dist/harness/tools/pi-tools.js +84 -0
  370. package/dist/harness/tools/pi-tools.js.map +1 -0
  371. package/dist/harness/tools/react.d.ts.map +1 -0
  372. package/dist/{tools → harness/tools}/react.js +6 -17
  373. package/dist/harness/tools/react.js.map +1 -0
  374. package/dist/{tools → harness/tools}/sandbox.d.ts +4 -4
  375. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  376. package/dist/{tools → harness/tools}/sandbox.js +12 -8
  377. package/dist/harness/tools/sandbox.js.map +1 -0
  378. package/dist/harness/tools/subagent.d.ts +88 -0
  379. package/dist/harness/tools/subagent.d.ts.map +1 -0
  380. package/dist/harness/tools/subagent.js +681 -0
  381. package/dist/harness/tools/subagent.js.map +1 -0
  382. package/dist/harness/tools/task.d.ts +20 -0
  383. package/dist/harness/tools/task.d.ts.map +1 -0
  384. package/dist/harness/tools/task.js +79 -0
  385. package/dist/harness/tools/task.js.map +1 -0
  386. package/dist/harness/tools/types.d.ts +29 -0
  387. package/dist/harness/tools/types.d.ts.map +1 -0
  388. package/dist/harness/tools/types.js +2 -0
  389. package/dist/harness/tools/types.js.map +1 -0
  390. package/dist/harness/types.d.ts +384 -25
  391. package/dist/harness/types.d.ts.map +1 -1
  392. package/dist/harness/types.js +1 -1
  393. package/dist/harness/types.js.map +1 -1
  394. package/dist/index.d.ts +33 -9
  395. package/dist/index.d.ts.map +1 -1
  396. package/dist/index.js +19 -6
  397. package/dist/index.js.map +1 -1
  398. package/dist/main.js +344 -188
  399. package/dist/main.js.map +1 -1
  400. package/dist/observability/index.d.ts +33 -0
  401. package/dist/observability/index.d.ts.map +1 -0
  402. package/dist/observability/index.js +257 -0
  403. package/dist/observability/index.js.map +1 -0
  404. package/dist/observability/instrument.js +14 -6
  405. package/dist/observability/instrument.js.map +1 -1
  406. package/dist/observability/otel.d.ts +10 -0
  407. package/dist/observability/otel.d.ts.map +1 -0
  408. package/dist/observability/otel.js +183 -0
  409. package/dist/observability/otel.js.map +1 -0
  410. package/dist/observability/sentry.d.ts +40 -7
  411. package/dist/observability/sentry.d.ts.map +1 -1
  412. package/dist/observability/sentry.js +176 -32
  413. package/dist/observability/sentry.js.map +1 -1
  414. package/dist/observability/types.d.ts +24 -3
  415. package/dist/observability/types.d.ts.map +1 -1
  416. package/dist/observability/types.js.map +1 -1
  417. package/dist/office/index.d.ts +138 -0
  418. package/dist/office/index.d.ts.map +1 -0
  419. package/dist/office/index.js +1084 -0
  420. package/dist/office/index.js.map +1 -0
  421. package/dist/office/projection.d.ts +22 -0
  422. package/dist/office/projection.d.ts.map +1 -0
  423. package/dist/office/projection.js +208 -0
  424. package/dist/office/projection.js.map +1 -0
  425. package/dist/office/types.d.ts +116 -0
  426. package/dist/office/types.d.ts.map +1 -0
  427. package/dist/office/types.js +2 -0
  428. package/dist/office/types.js.map +1 -0
  429. package/dist/platform-messages.d.ts +1 -0
  430. package/dist/platform-messages.d.ts.map +1 -1
  431. package/dist/platform-messages.js +3 -0
  432. package/dist/platform-messages.js.map +1 -1
  433. package/dist/process-lifecycle.d.ts +19 -0
  434. package/dist/process-lifecycle.d.ts.map +1 -0
  435. package/dist/process-lifecycle.js +67 -0
  436. package/dist/process-lifecycle.js.map +1 -0
  437. package/dist/runtime/conversation-runtime.d.ts +1 -1
  438. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  439. package/dist/runtime/conversation-runtime.js +422 -152
  440. package/dist/runtime/conversation-runtime.js.map +1 -1
  441. package/dist/runtime/session-lifecycle.d.ts +76 -0
  442. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  443. package/dist/runtime/session-lifecycle.js +404 -0
  444. package/dist/runtime/session-lifecycle.js.map +1 -0
  445. package/dist/runtime/types.d.ts +60 -15
  446. package/dist/runtime/types.d.ts.map +1 -1
  447. package/dist/runtime/types.js.map +1 -1
  448. package/dist/sandbox/cloudflare.d.ts +4 -0
  449. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  450. package/dist/sandbox/cloudflare.js +54 -52
  451. package/dist/sandbox/cloudflare.js.map +1 -1
  452. package/dist/sandbox/container.d.ts +3 -0
  453. package/dist/sandbox/container.d.ts.map +1 -1
  454. package/dist/sandbox/container.js +19 -7
  455. package/dist/sandbox/container.js.map +1 -1
  456. package/dist/sandbox/host.d.ts +3 -0
  457. package/dist/sandbox/host.d.ts.map +1 -1
  458. package/dist/sandbox/host.js +44 -35
  459. package/dist/sandbox/host.js.map +1 -1
  460. package/dist/sandbox/identity.d.ts +42 -0
  461. package/dist/sandbox/identity.d.ts.map +1 -0
  462. package/dist/sandbox/identity.js +77 -0
  463. package/dist/sandbox/identity.js.map +1 -0
  464. package/dist/sandbox/index.d.ts +16 -6
  465. package/dist/sandbox/index.d.ts.map +1 -1
  466. package/dist/sandbox/index.js +73 -17
  467. package/dist/sandbox/index.js.map +1 -1
  468. package/dist/sandbox/provisioner.d.ts +121 -0
  469. package/dist/sandbox/provisioner.d.ts.map +1 -0
  470. package/dist/{provisioner.js → sandbox/provisioner.js} +352 -20
  471. package/dist/sandbox/provisioner.js.map +1 -0
  472. package/dist/sandbox/types.d.ts +43 -9
  473. package/dist/sandbox/types.d.ts.map +1 -1
  474. package/dist/sandbox/types.js.map +1 -1
  475. package/dist/sandbox/utils.d.ts +24 -0
  476. package/dist/sandbox/utils.d.ts.map +1 -1
  477. package/dist/sandbox/utils.js +92 -1
  478. package/dist/sandbox/utils.js.map +1 -1
  479. package/dist/sessions/chat-history-sync.d.ts +23 -0
  480. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  481. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +239 -175
  482. package/dist/sessions/chat-history-sync.js.map +1 -0
  483. package/dist/sessions/history-line.d.ts +29 -0
  484. package/dist/sessions/history-line.d.ts.map +1 -0
  485. package/dist/sessions/history-line.js +45 -0
  486. package/dist/sessions/history-line.js.map +1 -0
  487. package/dist/sessions/migrate-common.d.ts +43 -0
  488. package/dist/sessions/migrate-common.d.ts.map +1 -0
  489. package/dist/sessions/migrate-common.js +99 -0
  490. package/dist/sessions/migrate-common.js.map +1 -0
  491. package/dist/sessions/migrate-pi-084.d.ts +8 -0
  492. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  493. package/dist/sessions/migrate-pi-084.js +302 -0
  494. package/dist/sessions/migrate-pi-084.js.map +1 -0
  495. package/dist/sessions/migrate-v3.d.ts +15 -0
  496. package/dist/sessions/migrate-v3.d.ts.map +1 -0
  497. package/dist/sessions/migrate-v3.js +419 -0
  498. package/dist/sessions/migrate-v3.js.map +1 -0
  499. package/dist/sessions/session-key.d.ts +33 -0
  500. package/dist/sessions/session-key.d.ts.map +1 -0
  501. package/dist/sessions/session-key.js +115 -0
  502. package/dist/sessions/session-key.js.map +1 -0
  503. package/dist/sessions/session-store.d.ts +59 -0
  504. package/dist/sessions/session-store.d.ts.map +1 -0
  505. package/dist/sessions/session-store.js +683 -0
  506. package/dist/sessions/session-store.js.map +1 -0
  507. package/dist/sessions/store.d.ts +17 -10
  508. package/dist/sessions/store.d.ts.map +1 -1
  509. package/dist/sessions/store.js +182 -47
  510. package/dist/sessions/store.js.map +1 -1
  511. package/dist/sessions/types.d.ts +73 -7
  512. package/dist/sessions/types.d.ts.map +1 -1
  513. package/dist/sessions/types.js +1 -1
  514. package/dist/sessions/types.js.map +1 -1
  515. package/dist/settings-mutation.d.ts +40 -0
  516. package/dist/settings-mutation.d.ts.map +1 -0
  517. package/dist/settings-mutation.js +66 -0
  518. package/dist/settings-mutation.js.map +1 -0
  519. package/dist/types.d.ts +350 -140
  520. package/dist/types.d.ts.map +1 -1
  521. package/dist/types.js +2 -2
  522. package/dist/types.js.map +1 -1
  523. package/dist/vault/index.d.ts +52 -2
  524. package/dist/vault/index.d.ts.map +1 -1
  525. package/dist/vault/index.js +218 -86
  526. package/dist/vault/index.js.map +1 -1
  527. package/dist/vault/types.d.ts +6 -2
  528. package/dist/vault/types.d.ts.map +1 -1
  529. package/dist/vault/types.js.map +1 -1
  530. package/package.json +77 -39
  531. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  532. package/dist/adapters/slack/tools/attach.js.map +0 -1
  533. package/dist/adapters/streaming.d.ts +0 -18
  534. package/dist/adapters/streaming.d.ts.map +0 -1
  535. package/dist/adapters/streaming.js +0 -44
  536. package/dist/adapters/streaming.js.map +0 -1
  537. package/dist/adapters/telegram/html.d.ts +0 -3
  538. package/dist/adapters/telegram/html.d.ts.map +0 -1
  539. package/dist/adapters/telegram/html.js +0 -98
  540. package/dist/adapters/telegram/html.js.map +0 -1
  541. package/dist/agent-events.d.ts +0 -5
  542. package/dist/agent-events.d.ts.map +0 -1
  543. package/dist/agent-events.js +0 -26
  544. package/dist/agent-events.js.map +0 -1
  545. package/dist/agent.d.ts +0 -39
  546. package/dist/agent.d.ts.map +0 -1
  547. package/dist/agent.js +0 -1291
  548. package/dist/agent.js.map +0 -1
  549. package/dist/commands/admin.d.ts.map +0 -1
  550. package/dist/commands/admin.js.map +0 -1
  551. package/dist/commands/auto-reply.d.ts.map +0 -1
  552. package/dist/commands/auto-reply.js +0 -76
  553. package/dist/commands/auto-reply.js.map +0 -1
  554. package/dist/commands/extensions.d.ts +0 -14
  555. package/dist/commands/extensions.d.ts.map +0 -1
  556. package/dist/commands/extensions.js +0 -55
  557. package/dist/commands/extensions.js.map +0 -1
  558. package/dist/commands/login.d.ts +0 -5
  559. package/dist/commands/login.d.ts.map +0 -1
  560. package/dist/commands/login.js +0 -115
  561. package/dist/commands/login.js.map +0 -1
  562. package/dist/commands/model.d.ts +0 -10
  563. package/dist/commands/model.d.ts.map +0 -1
  564. package/dist/commands/model.js +0 -102
  565. package/dist/commands/model.js.map +0 -1
  566. package/dist/commands/new.d.ts.map +0 -1
  567. package/dist/commands/new.js +0 -25
  568. package/dist/commands/new.js.map +0 -1
  569. package/dist/commands/parse.d.ts +0 -7
  570. package/dist/commands/parse.d.ts.map +0 -1
  571. package/dist/commands/parse.js +0 -14
  572. package/dist/commands/parse.js.map +0 -1
  573. package/dist/commands/registry.d.ts +0 -5
  574. package/dist/commands/registry.d.ts.map +0 -1
  575. package/dist/commands/registry.js +0 -31
  576. package/dist/commands/registry.js.map +0 -1
  577. package/dist/commands/sandbox.d.ts.map +0 -1
  578. package/dist/commands/sandbox.js +0 -78
  579. package/dist/commands/sandbox.js.map +0 -1
  580. package/dist/commands/session-view.d.ts.map +0 -1
  581. package/dist/commands/session-view.js.map +0 -1
  582. package/dist/commands/types.d.ts +0 -66
  583. package/dist/commands/types.d.ts.map +0 -1
  584. package/dist/commands/types.js.map +0 -1
  585. package/dist/commands/utils.d.ts +0 -11
  586. package/dist/commands/utils.d.ts.map +0 -1
  587. package/dist/commands/utils.js.map +0 -1
  588. package/dist/download.d.ts.map +0 -1
  589. package/dist/download.js +0 -89
  590. package/dist/download.js.map +0 -1
  591. package/dist/events.d.ts.map +0 -1
  592. package/dist/events.js.map +0 -1
  593. package/dist/execution-resolver.d.ts +0 -21
  594. package/dist/execution-resolver.d.ts.map +0 -1
  595. package/dist/execution-resolver.js +0 -170
  596. package/dist/execution-resolver.js.map +0 -1
  597. package/dist/harness/auth.d.ts +0 -16
  598. package/dist/harness/auth.d.ts.map +0 -1
  599. package/dist/harness/auth.js +0 -86
  600. package/dist/harness/auth.js.map +0 -1
  601. package/dist/harness/extensions/loader.d.ts +0 -62
  602. package/dist/harness/extensions/loader.d.ts.map +0 -1
  603. package/dist/harness/extensions/loader.js +0 -374
  604. package/dist/harness/extensions/loader.js.map +0 -1
  605. package/dist/harness/extensions/registry.d.ts +0 -23
  606. package/dist/harness/extensions/registry.d.ts.map +0 -1
  607. package/dist/harness/extensions/registry.js +0 -45
  608. package/dist/harness/extensions/registry.js.map +0 -1
  609. package/dist/harness/extensions/types.d.ts +0 -248
  610. package/dist/harness/extensions/types.d.ts.map +0 -1
  611. package/dist/harness/extensions/types.js.map +0 -1
  612. package/dist/harness/session-store.d.ts +0 -77
  613. package/dist/harness/session-store.d.ts.map +0 -1
  614. package/dist/harness/session-store.js +0 -248
  615. package/dist/harness/session-store.js.map +0 -1
  616. package/dist/harness/settings.d.ts +0 -47
  617. package/dist/harness/settings.d.ts.map +0 -1
  618. package/dist/harness/settings.js +0 -29
  619. package/dist/harness/settings.js.map +0 -1
  620. package/dist/model-registry.d.ts +0 -4
  621. package/dist/model-registry.d.ts.map +0 -1
  622. package/dist/model-registry.js +0 -7
  623. package/dist/model-registry.js.map +0 -1
  624. package/dist/portal-shell.d.ts +0 -4
  625. package/dist/portal-shell.d.ts.map +0 -1
  626. package/dist/portal-shell.js.map +0 -1
  627. package/dist/provisioner.d.ts +0 -61
  628. package/dist/provisioner.d.ts.map +0 -1
  629. package/dist/provisioner.js.map +0 -1
  630. package/dist/runtime/agent-run-controller.d.ts +0 -31
  631. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  632. package/dist/runtime/agent-run-controller.js +0 -195
  633. package/dist/runtime/agent-run-controller.js.map +0 -1
  634. package/dist/sandbox/errors.d.ts +0 -6
  635. package/dist/sandbox/errors.d.ts.map +0 -1
  636. package/dist/sandbox/errors.js +0 -11
  637. package/dist/sandbox/errors.js.map +0 -1
  638. package/dist/sandbox/firecracker.d.ts +0 -15
  639. package/dist/sandbox/firecracker.d.ts.map +0 -1
  640. package/dist/sandbox/firecracker.js +0 -212
  641. package/dist/sandbox/firecracker.js.map +0 -1
  642. package/dist/sandbox/image.d.ts +0 -3
  643. package/dist/sandbox/image.d.ts.map +0 -1
  644. package/dist/sandbox/image.js +0 -27
  645. package/dist/sandbox/image.js.map +0 -1
  646. package/dist/sandbox/path-context.d.ts +0 -3
  647. package/dist/sandbox/path-context.d.ts.map +0 -1
  648. package/dist/sandbox/path-context.js +0 -20
  649. package/dist/sandbox/path-context.js.map +0 -1
  650. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  651. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  652. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  653. package/dist/sessions/metadata.d.ts +0 -3
  654. package/dist/sessions/metadata.d.ts.map +0 -1
  655. package/dist/sessions/metadata.js +0 -11
  656. package/dist/sessions/metadata.js.map +0 -1
  657. package/dist/sessions/policy.d.ts +0 -6
  658. package/dist/sessions/policy.d.ts.map +0 -1
  659. package/dist/sessions/policy.js +0 -23
  660. package/dist/sessions/policy.js.map +0 -1
  661. package/dist/store.d.ts +0 -46
  662. package/dist/store.d.ts.map +0 -1
  663. package/dist/store.js +0 -177
  664. package/dist/store.js.map +0 -1
  665. package/dist/tools/bash.d.ts +0 -10
  666. package/dist/tools/bash.d.ts.map +0 -1
  667. package/dist/tools/bash.js +0 -80
  668. package/dist/tools/bash.js.map +0 -1
  669. package/dist/tools/edit.d.ts +0 -11
  670. package/dist/tools/edit.d.ts.map +0 -1
  671. package/dist/tools/edit.js +0 -131
  672. package/dist/tools/edit.js.map +0 -1
  673. package/dist/tools/event.d.ts.map +0 -1
  674. package/dist/tools/event.js +0 -252
  675. package/dist/tools/event.js.map +0 -1
  676. package/dist/tools/index.d.ts +0 -24
  677. package/dist/tools/index.d.ts.map +0 -1
  678. package/dist/tools/index.js +0 -31
  679. package/dist/tools/index.js.map +0 -1
  680. package/dist/tools/react.d.ts.map +0 -1
  681. package/dist/tools/react.js.map +0 -1
  682. package/dist/tools/read.d.ts +0 -11
  683. package/dist/tools/read.d.ts.map +0 -1
  684. package/dist/tools/read.js +0 -134
  685. package/dist/tools/read.js.map +0 -1
  686. package/dist/tools/sandbox.d.ts.map +0 -1
  687. package/dist/tools/sandbox.js.map +0 -1
  688. package/dist/tools/truncate.d.ts +0 -33
  689. package/dist/tools/truncate.d.ts.map +0 -1
  690. package/dist/tools/truncate.js +0 -184
  691. package/dist/tools/truncate.js.map +0 -1
  692. package/dist/tools/types.d.ts +0 -54
  693. package/dist/tools/types.d.ts.map +0 -1
  694. package/dist/tools/types.js.map +0 -1
  695. package/dist/tools/write.d.ts +0 -10
  696. package/dist/tools/write.d.ts.map +0 -1
  697. package/dist/tools/write.js +0 -29
  698. package/dist/tools/write.js.map +0 -1
  699. package/dist/trigger.d.ts +0 -22
  700. package/dist/trigger.d.ts.map +0 -1
  701. package/dist/trigger.js +0 -100
  702. package/dist/trigger.js.map +0 -1
  703. package/dist/utils/date.d.ts +0 -10
  704. package/dist/utils/date.d.ts.map +0 -1
  705. package/dist/utils/date.js +0 -23
  706. package/dist/utils/date.js.map +0 -1
  707. package/dist/utils/env.d.ts +0 -3
  708. package/dist/utils/env.d.ts.map +0 -1
  709. package/dist/utils/env.js +0 -12
  710. package/dist/utils/env.js.map +0 -1
  711. package/dist/utils/file-guards.d.ts.map +0 -1
  712. package/dist/utils/file-guards.js.map +0 -1
  713. package/dist/utils/fs-atomic.d.ts +0 -10
  714. package/dist/utils/fs-atomic.d.ts.map +0 -1
  715. package/dist/utils/fs-atomic.js +0 -45
  716. package/dist/utils/fs-atomic.js.map +0 -1
  717. package/dist/utils/html.d.ts +0 -2
  718. package/dist/utils/html.d.ts.map +0 -1
  719. package/dist/utils/html.js +0 -4
  720. package/dist/utils/html.js.map +0 -1
  721. package/dist/utils/http-body.d.ts +0 -10
  722. package/dist/utils/http-body.d.ts.map +0 -1
  723. package/dist/utils/http-body.js +0 -34
  724. package/dist/utils/http-body.js.map +0 -1
  725. package/dist/vault/routing.d.ts +0 -3
  726. package/dist/vault/routing.d.ts.map +0 -1
  727. package/dist/vault/routing.js +0 -13
  728. package/dist/vault/routing.js.map +0 -1
  729. package/dist/web/admin/portal.d.ts +0 -5
  730. package/dist/web/admin/portal.d.ts.map +0 -1
  731. package/dist/web/admin/portal.js +0 -2572
  732. package/dist/web/admin/portal.js.map +0 -1
  733. package/dist/web/admin/provider-models.d.ts.map +0 -1
  734. package/dist/web/admin/provider-models.js.map +0 -1
  735. package/dist/web/admin/store.d.ts +0 -13
  736. package/dist/web/admin/store.d.ts.map +0 -1
  737. package/dist/web/admin/store.js +0 -14
  738. package/dist/web/admin/store.js.map +0 -1
  739. package/dist/web/admin/types.d.ts +0 -30
  740. package/dist/web/admin/types.d.ts.map +0 -1
  741. package/dist/web/admin/types.js.map +0 -1
  742. package/dist/web/agent-events/portal.d.ts +0 -3
  743. package/dist/web/agent-events/portal.d.ts.map +0 -1
  744. package/dist/web/agent-events/portal.js +0 -18
  745. package/dist/web/agent-events/portal.js.map +0 -1
  746. package/dist/web/login/oauth.d.ts +0 -6
  747. package/dist/web/login/oauth.d.ts.map +0 -1
  748. package/dist/web/login/oauth.js.map +0 -1
  749. package/dist/web/login/portal.d.ts.map +0 -1
  750. package/dist/web/login/portal.js.map +0 -1
  751. package/dist/web/login/store.d.ts +0 -8
  752. package/dist/web/login/store.d.ts.map +0 -1
  753. package/dist/web/login/store.js +0 -15
  754. package/dist/web/login/store.js.map +0 -1
  755. package/dist/web/login/types.d.ts.map +0 -1
  756. package/dist/web/login/types.js.map +0 -1
  757. package/dist/web/request.d.ts +0 -3
  758. package/dist/web/request.d.ts.map +0 -1
  759. package/dist/web/request.js +0 -13
  760. package/dist/web/request.js.map +0 -1
  761. package/dist/web/server.d.ts.map +0 -1
  762. package/dist/web/server.js.map +0 -1
  763. package/dist/web/session-view/command.d.ts +0 -4
  764. package/dist/web/session-view/command.d.ts.map +0 -1
  765. package/dist/web/session-view/command.js +0 -7
  766. package/dist/web/session-view/command.js.map +0 -1
  767. package/dist/web/session-view/portal.d.ts +0 -13
  768. package/dist/web/session-view/portal.d.ts.map +0 -1
  769. package/dist/web/session-view/portal.js.map +0 -1
  770. package/dist/web/session-view/service.d.ts +0 -6
  771. package/dist/web/session-view/service.d.ts.map +0 -1
  772. package/dist/web/session-view/service.js +0 -498
  773. package/dist/web/session-view/service.js.map +0 -1
  774. package/dist/web/session-view/store.d.ts +0 -8
  775. package/dist/web/session-view/store.d.ts.map +0 -1
  776. package/dist/web/session-view/store.js +0 -15
  777. package/dist/web/session-view/store.js.map +0 -1
  778. package/dist/web/session-view/types.d.ts.map +0 -1
  779. package/dist/web/session-view/types.js.map +0 -1
  780. package/dist/web/token-store.d.ts.map +0 -1
  781. package/dist/web/token-store.js.map +0 -1
  782. package/dist/web/types.d.ts.map +0 -1
  783. package/dist/web/types.js.map +0 -1
  784. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  785. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  786. /package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -0
  787. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  788. /package/dist/{commands → adapters/commands}/types.js +0 -0
  789. /package/dist/{harness/extensions → adapters/github}/types.js +0 -0
  790. /package/dist/{tools → adapters/web/admin}/types.js +0 -0
  791. /package/dist/{web/admin → adapters/web/login}/types.js +0 -0
  792. /package/dist/{web/login → adapters/web/session-view}/types.js +0 -0
  793. /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
  794. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  795. /package/dist/{web/session-view → adapters/web}/types.js +0 -0
  796. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  797. /package/dist/{web → cli}/types.js +0 -0
  798. /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
  799. /package/dist/{tools → harness/tools}/react.d.ts +0 -0
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="src/content/docs/assets/mikan.png" alt="mikan — multi-platform AI coding agent" width="100%">
2
+ <img src="src/content/docs/assets/mikan-office-hero.png" alt="mikan office architecture — conversation-scoped workspaces and sandbox execution" width="100%">
3
3
  </p>
4
4
 
5
5
  # @geminixiang/mikan
@@ -7,7 +7,10 @@
7
7
  [![npm version](https://img.shields.io/npm/v/@geminixiang/mikan.svg)](https://www.npmjs.com/package/@geminixiang/mikan)
8
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
9
 
10
- A multi-platform AI coding agent for Slack, Telegram, and Discord.
10
+ A multi-platform AI coding agent for Slack, Telegram, Discord, and GitHub.
11
+
12
+ > [!WARNING]
13
+ > **Pre-1.0 status** — the overall framework stabilizes at 1.0.0. Until then, releases may change settings and on-disk data formats without migrations: upgrading between pre-1.0 versions can require resetting or manually adjusting existing state and workspace data.
11
14
 
12
15
  ## Architecture
13
16
 
@@ -15,20 +18,22 @@ mikan keeps the chat record, agent session, and execution runtime separate:
15
18
 
16
19
  ![mikan architecture](src/content/docs/assets/architecture.png)
17
20
 
21
+ - **Conversation office** is the unit everything else hangs off: one conversation's working area plus its own sandbox runtime. An office is identified by its platform and raw conversation id, and its directory is named by an office key (`v1-<platform>-<readable-id>-<hash>`), so two platforms can never collide on the same raw id.
18
22
  - **Chat / conversation data** is the platform-facing record: `log.jsonl`, attachments, and conversation files.
19
23
  - **Session orchestration** turns platform events into agent runs, handles top-level/thread scopes, and persists structured context under `sessions/*.jsonl`.
20
- - **mikan agent harness** (`src/harness/`, built on pi-agent-core and pi-ai) runs the model loop, session persistence, compaction, and calls mikan tools.
21
- - **Sandbox runtime** is where tool commands execute: host, Docker container/image, Firecracker, or Cloudflare bridge.
24
+ - **mikan agent harness** (`src/harness/`, built on pi-agent-core and pi-ai) owns run preparation, authorized prompts/tools, response presentation, and native Pi session integration. Pi handles the model/tool loop, persistence, compaction, retries, and cancellation.
25
+ - **Sandbox runtime** is where tool commands execute: host, Docker container/image, or the experimental Cloudflare bridge.
22
26
  - **Vault** provides runtime credentials as env vars and mounted secret files.
23
27
 
24
28
  ## Features
25
29
 
26
- - **Multi-platform** — Slack, Telegram, Discord adapters
30
+ - **Multi-platform** — Slack, Telegram, Discord, and GitHub adapters
27
31
  - **Concurrent conversations** — Slack threads, Discord replies/threads, and Telegram reply chains run as independent sessions
28
- - **Sandbox execution** — host, shared container, per-user managed container, Firecracker (alpha), or Cloudflare bridge (experimental)
32
+ - **Conversation offices** — one office directory and one sandbox runtime per conversation, with platform-derived workspace sharing and explicit door-policy overrides
33
+ - **Sandbox execution** — host, shared container, per-conversation managed container, or Cloudflare bridge (experimental)
29
34
  - **Credential vaults** — `/login` stores credentials under `--state-dir` and injects env into sandbox runs
30
35
  - **Web session viewer** — read-only web view of the current session via `session` / `/session`
31
- - **Persistent memory** — workspace-level and channel-level `MEMORY.md`
36
+ - **Persistent memory** — workspace-level and per-office `MEMORY.md`
32
37
  - **Skills** — drop CLI tools into `skills/`
33
38
  - **Events** — schedule one-shot or recurring tasks via JSON files
34
39
  - **Multi-provider** — any provider/model supported by `pi-ai`
@@ -51,57 +56,99 @@ npm install && npm run build
51
56
 
52
57
  ## Quick Start
53
58
 
54
- All platforms share the same CLI:
59
+ Run mikan under [PM2](https://pm2.keymetrics.io/) so it stays up, restarts after failures, and starts on boot:
55
60
 
56
61
  ```bash
57
- mikan [--state-dir=~/.mikan] [--sandbox=<mode>] <working-directory>
62
+ npm i -g @geminixiang/mikan pm2
63
+
64
+ # One-time setup: create the state directory and settings
65
+ mikan --onboard --state-dir=~/.mikan
66
+
67
+ # Secrets live in ~/.mikan/mikan.env (0600), outside any repo tree
68
+ curl -o ~/.mikan/mikan.env https://raw.githubusercontent.com/geminixiang/mikan/main/deploy/pm2/mikan.env.example
69
+ chmod 600 ~/.mikan/mikan.env # then fill in your tokens
70
+
71
+ # Pull the sandbox image the default deployment runs tools in
72
+ docker pull ghcr.io/geminixiang/mikan-sandbox:latest
73
+
74
+ # Grab the maintained ecosystem file (supervision only), edit `args`
75
+ curl -O https://raw.githubusercontent.com/geminixiang/mikan/main/deploy/pm2/ecosystem.config.cjs
76
+
77
+ pm2 start ecosystem.config.cjs
78
+ pm2 save
79
+ pm2 startup # run the printed command to enable boot autostart
58
80
  ```
59
81
 
60
- Set the platform tokens you need; you can run multiple platforms at once:
82
+ Each file has one job: `settings.json` holds behavior (model, sandbox limits, reply modes — the Admin surface), `~/.mikan/mikan.env` holds secrets and platform tokens, and `ecosystem.config.cjs` holds process supervision only. In `ecosystem.config.cjs`, point `args` at your state dir, sandbox mode, and working directory (`mikan --help` documents the flags):
83
+
84
+ ```js
85
+ args: "--state-dir=/srv/mikan/state --sandbox=image:ghcr.io/geminixiang/mikan-sandbox:latest /srv/mikan/workspace",
86
+ ```
87
+
88
+ Set the platform tokens you need in `~/.mikan/mikan.env`; you can run multiple platforms at once. `mikan env` prints the full inventory and what is currently set:
61
89
 
62
90
  ```bash
63
- export SLACK_APP_TOKEN=xapp-...
64
- export SLACK_BOT_TOKEN=xoxb-...
65
- export TELEGRAM_BOT_TOKEN=123456:ABC-...
66
- export DISCORD_BOT_TOKEN=MTI...
91
+ SLACK_APP_TOKEN=xapp-...
92
+ SLACK_BOT_TOKEN=xoxb-...
93
+ TELEGRAM_BOT_TOKEN=123456:ABC-...
94
+ DISCORD_BOT_TOKEN=MTI...
95
+ GITHUB_APP_ID=123456
96
+ GITHUB_INSTALLATION_ID=12345678
97
+ GITHUB_APP_PRIVATE_KEY_PATH=/srv/mikan/github-app.pem
67
98
  ```
68
99
 
100
+ Tail logs with `pm2 logs mikan`; upgrade with `npm i -g @geminixiang/mikan && pm2 reload mikan`. See [the deployment guide](src/content/docs/deployment.mdx) for sandbox images, graceful shutdown, and the health endpoint.
101
+
102
+ For a one-off foreground run, the same CLI works directly:
103
+
104
+ ```bash
105
+ mikan [--state-dir=~/.mikan] [--sandbox=<mode>] [<working-directory>]
106
+ ```
107
+
108
+ The working directory is optional: it defaults to `<state-dir>/workspace` (so `~/.mikan/workspace` with the default state dir) and is created on first run.
109
+
69
110
  ## Platforms
70
111
 
71
112
  - **Slack** — create a Socket Mode app using [src/content/docs/slack-bot-minimal-guide.md](src/content/docs/slack-bot-minimal-guide.md). The bot responds when `@mentioned` in channels and to all DMs.
72
113
  - **Telegram** — create a bot via [@BotFather](https://t.me/BotFather). The bot responds to private messages, `@mention`, and reply chains in groups.
73
114
  - **Discord** — create an application in the [Discord Developer Portal](https://discord.com/developers/applications), enable **Message Content Intent**, and invite it with message/file permissions.
115
+ - **GitHub** — install a GitHub App (polling, no webhooks) and set `GITHUB_APP_ID`, `GITHUB_INSTALLATION_ID`, and a private key. One issue or PR is one conversation. See [src/content/docs/platform-adapters/github.md](src/content/docs/platform-adapters/github.md).
74
116
 
75
- Slack threads, Discord replies/threads, and Telegram reply chains are mapped to independent session scopes. See [src/content/docs/sessions.md](src/content/docs/sessions.md).
117
+ Slack threads, Discord replies/threads, and Telegram reply chains are mapped to independent session scopes. See [src/content/docs/sessions.mdx](src/content/docs/sessions.mdx).
76
118
 
77
119
  ## Sandbox
78
120
 
79
- | Mode | Description |
80
- | ---------------------------- | ---------------------------------------------------------------------- |
81
- | `host` (default) | Run on host; no vault env injection |
82
- | `container:<name>` | Run in an existing shared container; uses vault key `container-<name>` |
83
- | `image:<image>` | Auto-provision one Docker container per resolved vault/user |
84
- | `firecracker:<vm-id>:<path>` | Firecracker microVM (alpha; not recommended) |
85
- | `cloudflare:<sandbox-id>` | Cloudflare Worker bridge (experimental; no auto workspace sync) |
121
+ | Mode | Description |
122
+ | ------------------------- | ----------------------------------------------------------------------------- |
123
+ | `host` (default) | Run on host; no vault env injection |
124
+ | `container:<name>` | Run in an existing shared container; everyone sharing it shares its one vault |
125
+ | `image:<image>` | Auto-provision one Docker container and one vault per conversation office |
126
+ | `cloudflare:<sandbox-id>` | Cloudflare Worker bridge (experimental; no auto workspace sync) |
86
127
 
87
- For routing, mounts, vault behavior, managed container details, and Firecracker/Cloudflare notes, see [src/content/docs/sandbox.md](src/content/docs/sandbox.md).
128
+ Each office's data view is set by its **door policy**. Without an explicit workspace setting, Slack follows the channel kind: public channels use trusted shared support and can update workspace `MEMORY.md`; private channels can read that shared memory but receive it read-only; DMs, external channels, unknown channel kinds, and other platforms stay isolated. The admin portal or `/pi-sandbox door <default|isolated|shared|shared-private|full>` can override that result. Door policy governs data access only; execution isolation is unaffected.
129
+
130
+ Only `image:*` can enforce isolated projections and read-only shared memory. `host`, `container:*`, and `cloudflare:*` therefore fail closed for isolated or private-channel projections; an admin must either use `image:*` or explicitly select a trusted read-write layout.
131
+
132
+ For routing, mounts, vault behavior, managed container details, and Cloudflare notes, see [src/content/docs/sandbox.mdx](src/content/docs/sandbox.mdx).
88
133
 
89
134
  ## Chat commands
90
135
 
91
- | Command | Purpose |
92
- | ---------------------------------------------------------- | ------------------------------------------------ |
93
- | `/login` / `/pi-login` | Store API keys or run built-in OAuth flows |
94
- | `session` / `/session` | Open a read-only web view of the current session |
95
- | `new` / `/new` | Reset the current session |
96
- | `model` / `/model` / `/pi-model provider/model[:thinking]` | Switch the LLM for the current conversation |
97
- | `auto-reply` / `/pi-auto-reply on\|off\|status` | Control group/channel auto-reply |
98
- | `stop` / `/stop` | Stop the current run |
136
+ | Command | Purpose |
137
+ | ------------------------------------------------ | ---------------------------------------------------------------- |
138
+ | `/login` / `/pi-login` | Store API keys or run built-in OAuth flows |
139
+ | `session` / `/session` | Open a read-only web view of the current session |
140
+ | `/new` / `/pi-new` | Reset the current session |
141
+ | `/model` / `/pi-model provider/model[:thinking]` | Switch the LLM for the current conversation |
142
+ | `/sandbox` / `/pi-sandbox [boost\|door …]` | Show sandbox status, boost limits, or set the office door policy |
143
+ | `/pi-auto-reply <on\|off>` | Toggle mention-free replies for the current Slack channel |
144
+ | `/admin` / `/pi-admin` | Open the admin portal |
145
+ | `stop` / `/stop` | Stop the current run (works on every platform) |
99
146
 
100
- See [src/content/docs/commands.md](src/content/docs/commands.md) for command details and web session viewer setup.
147
+ `session` is the only command accepted without a leading slash. See [src/content/docs/commands.mdx](src/content/docs/commands.mdx) for the full command reference and web session viewer setup.
101
148
 
102
149
  ## Configuration
103
150
 
104
- mikan reads global settings from `<state-dir>/settings.json`; per-conversation overrides live at `<working-directory>/<conversationId>/settings.json`.
151
+ mikan reads global settings from `<state-dir>/settings.json`; host-only per-conversation overrides live at `<state-dir>/conversations/<office-key>/settings.json`. Legacy workspace settings are migrated once, then ignored.
105
152
 
106
153
  ```json
107
154
  {
@@ -120,14 +167,20 @@ See [src/content/docs/configuration.md](src/content/docs/configuration.md) for a
120
167
  ```text
121
168
  <state-dir>/
122
169
  ├── settings.json
170
+ ├── office-registry.json
171
+ ├── conversations/
172
+ │ └── <office-key>/
173
+ │ └── settings.json
123
174
  └── vaults/
124
175
 
125
176
  <working-directory>/
126
177
  ├── MEMORY.md
127
- ├── SYSTEM.md
128
178
  ├── skills/
129
179
  ├── events/
130
- └── <conversation-id>/
180
+ ├── agents/
181
+ └── <office-key>/
182
+ ├── MEMORY.md
183
+ ├── SYSTEM.md
131
184
  ├── log.jsonl
132
185
  ├── attachments/
133
186
  ├── scratch/
@@ -135,13 +188,16 @@ See [src/content/docs/configuration.md](src/content/docs/configuration.md) for a
135
188
  └── sessions/
136
189
  ```
137
190
 
191
+ Office directories are named by office key (`v1-<platform>-<readable-id>-<hash>`) and are not reversible to a raw platform id, so `office-registry.json` records each office's `(platform, conversationId)`. `mikan office list` prints the registered offices; deployments created before the office layout are migrated on the next boot, and `mikan office claim <conversationId> <platform>` names the owner when boot cannot infer it.
192
+
138
193
  ## More docs
139
194
 
140
195
  - [Events](src/content/docs/events.md)
141
196
  - [Skills](src/content/docs/skills.md)
142
- - [Deployment](src/content/docs/deployment.md)
197
+ - [Deployment](src/content/docs/deployment.mdx)
143
198
  - [Development](src/content/docs/development.md)
144
- - [Sandbox](src/content/docs/sandbox.md)
199
+ - [Sandbox](src/content/docs/sandbox.mdx)
200
+ - [Embedding mikan](deploy/examples/embedder/README.md) — build your own agent on the published package interface
145
201
 
146
202
  ## Slack: Download channel history
147
203
 
@@ -168,3 +224,5 @@ PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup, commit sty
168
224
  ## License
169
225
 
170
226
  MIT — see [LICENSE](LICENSE).
227
+
228
+ Slack auto-reply uses the conversation's `auto-reply` / `auto-reply.disabled` marker files. File contents are ignored: only the on/off marker name matters; rules and `llm.autoReply` judge-model settings remain retired.
package/dist/adapter.d.ts CHANGED
@@ -1,2 +1,12 @@
1
- export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, ChatAdapter, ConversationMessage, ConversationResponder, ChatToolResult, ConversationKind, MessagingInfo, PlatformName, PlatformNotifier, PlatformReactor, RunningSession, } from "./types.js";
1
+ import type { ConversationEvent, ConversationMessage, OfficeAddress, PlatformName } from "./types.js";
2
+ export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, HandleNewCommandOptions, ConversationMessage, ConversationResponder, ChatToolResult, ConversationKind, MessagingInfo, OfficeAddress, OfficeKey, PlatformHistoryMessage, PlatformHistoryOptions, PlatformName, PlatformUserInfo, RunningSession, SubagentProgressSnapshot, } from "./types.js";
3
+ interface ConversationIdentityInput {
4
+ platform: PlatformName;
5
+ conversationId: string;
6
+ address?: OfficeAddress;
7
+ }
8
+ /** Normalize platform intake into one authoritative conversation identity. */
9
+ export declare function createConversationEvent<T extends Omit<ConversationEvent, "address" | "conversationId">>(input: T & ConversationIdentityInput): T & ConversationEvent;
10
+ /** Normalize a platform response context into one authoritative identity. */
11
+ export declare function createConversationMessage<T extends Omit<ConversationMessage, "address" | "conversationId">>(input: T & ConversationIdentityInput): T & ConversationMessage;
2
12
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,UAAU,yBAAyB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAYD,8EAA8E;AAC9E,wBAAgB,uBAAuB,CACrC,CAAC,SAAS,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EAC/D,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,iBAAiB,CAG7D;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CACvC,CAAC,SAAS,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EACjE,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,mBAAmB,CAG/D"}
package/dist/adapter.js CHANGED
@@ -1,2 +1,19 @@
1
- export {};
1
+ import { createOfficeAddress, sameOffice } from "./office/index.js";
2
+ function resolveConversationAddress(input) {
3
+ const address = createOfficeAddress(input.platform, input.conversationId);
4
+ if (input.address && !sameOffice(address, input.address)) {
5
+ throw new Error(`Conversation address mismatch for ${JSON.stringify(input.conversationId)} on ${input.platform}`);
6
+ }
7
+ return address;
8
+ }
9
+ /** Normalize platform intake into one authoritative conversation identity. */
10
+ export function createConversationEvent(input) {
11
+ const address = resolveConversationAddress(input);
12
+ return { ...input, address, conversationId: address.conversationId };
13
+ }
14
+ /** Normalize a platform response context into one authoritative identity. */
15
+ export function createConversationMessage(input) {
16
+ const address = resolveConversationAddress(input);
17
+ return { ...input, address, conversationId: address.conversationId };
18
+ }
2
19
  //# sourceMappingURL=adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"","sourcesContent":["export type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n PlatformName,\n PlatformNotifier,\n PlatformReactor,\n RunningSession,\n} from \"./types.js\";\n"]}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAmCpE,SAAS,0BAA0B,CAAC,KAAgC;IAClE,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,QAAQ,EAAE,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAErC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,yBAAyB,CAEvC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC","sourcesContent":["import { createOfficeAddress, sameOffice } from \"./office/index.js\";\nimport type {\n ConversationEvent,\n ConversationMessage,\n OfficeAddress,\n PlatformName,\n} from \"./types.js\";\n\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n HandleNewCommandOptions,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n OfficeAddress,\n OfficeKey,\n PlatformHistoryMessage,\n PlatformHistoryOptions,\n PlatformName,\n PlatformUserInfo,\n RunningSession,\n SubagentProgressSnapshot,\n} from \"./types.js\";\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\n/** Normalize platform intake into one authoritative conversation identity. */\nexport function createConversationEvent<\n T extends Omit<ConversationEvent, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationEvent {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n\n/** Normalize a platform response context into one authoritative identity. */\nexport function createConversationMessage<\n T extends Omit<ConversationMessage, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationMessage {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/adapters/commands/admin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjE,qBAAa,mBAAoB,YAAW,cAAc;IAClD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BzD;CACF"}
@@ -1,15 +1,18 @@
1
- import { matchCommand } from "./parse.js";
2
- import { formatCommandSummary, replyPrivatelyWithContext } from "./utils.js";
3
- const ADMIN_COMMANDS = ["/admin", "/pi-admin"];
1
+ import { slashForms, matchCommand } from "./manifest.js";
2
+ import { portalNotConfiguredLines, replySummary, replySummaryPrivately } from "./utils.js";
3
+ const ADMIN_COMMANDS = slashForms("admin");
4
4
  export class AdminCommandHandler {
5
5
  async tryHandle(context) {
6
6
  if (!matchCommand(context.commandText, ADMIN_COMMANDS, { stripMention: true }))
7
7
  return false;
8
+ if (!context.privateConversation && !context.bot.postPrivate) {
9
+ await replySummary(context, "Admin", [
10
+ "For privacy, open a direct conversation with mikan and run `/admin` there.",
11
+ ]);
12
+ return true;
13
+ }
8
14
  if (!context.services.portalBaseUrl) {
9
- await replyPrivatelyWithContext(context, formatCommandSummary("Admin", [
10
- "Admin portal is not configured.",
11
- "Set `MIKAN_LINK_URL` or `MIKAN_LINK_PORT` on the server.",
12
- ]), { style: "muted" });
15
+ await replySummaryPrivately(context, "Admin", portalNotConfiguredLines("Admin portal"));
13
16
  return true;
14
17
  }
15
18
  const platformUser = context.bot
@@ -23,7 +26,7 @@ export class AdminCommandHandler {
23
26
  ...(platformUserName ? { platformUserName } : {}),
24
27
  });
25
28
  const url = `${context.services.portalBaseUrl}/admin?token=${token.token}`;
26
- await replyPrivatelyWithContext(context, formatCommandSummary("Admin", [url, "Expires: 30 minutes"]), { style: "muted" });
29
+ await replySummaryPrivately(context, "Admin", [url, "Expires: 30 minutes"]);
27
30
  return true;
28
31
  }
29
32
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/adapters/commands/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE3F,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAE3C,MAAM,OAAO,mBAAmB;IAC9B,KAAK,CAAC,SAAS,CAAC,OAAuB;QACrC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QAE7F,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAC7D,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE;gBACnC,4EAA4E;aAC7E,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG;aAC7B,gBAAgB,EAAE;aAClB,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,WAAW,CAAC;QAE7E,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;YACpD,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,gBAAgB,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3E,MAAM,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import { slashForms, matchCommand } from \"./manifest.js\";\nimport type { CommandContext, CommandHandler } from \"./types.js\";\nimport { portalNotConfiguredLines, replySummary, replySummaryPrivately } from \"./utils.js\";\n\nconst ADMIN_COMMANDS = slashForms(\"admin\");\n\nexport class AdminCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n if (!matchCommand(context.commandText, ADMIN_COMMANDS, { stripMention: true })) return false;\n\n if (!context.privateConversation && !context.bot.postPrivate) {\n await replySummary(context, \"Admin\", [\n \"For privacy, open a direct conversation with mikan and run `/admin` there.\",\n ]);\n return true;\n }\n\n if (!context.services.portalBaseUrl) {\n await replySummaryPrivately(context, \"Admin\", portalNotConfiguredLines(\"Admin portal\"));\n return true;\n }\n\n const platformUser = context.bot\n .getMessagingInfo()\n .users.find((user) => user.id === context.platformUserId);\n const platformUserName = platformUser?.userName || platformUser?.displayName;\n\n const token = context.services.adminTokenStore.create({\n platform: context.platform,\n platformUserId: context.platformUserId,\n conversationId: context.conversationId,\n ...(platformUserName ? { platformUserName } : {}),\n });\n\n const url = `${context.services.portalBaseUrl}/admin?token=${token.token}`;\n await replySummaryPrivately(context, \"Admin\", [url, \"Expires: 30 minutes\"]);\n return true;\n }\n}\n"]}
@@ -1,7 +1,4 @@
1
1
  import type { CommandContext, CommandHandler } from "./types.js";
2
- /**
3
- * @deprecated Auto-reply is kept for compatibility while its future is undecided.
4
- */
5
2
  export declare class AutoReplyCommandHandler implements CommandHandler {
6
3
  tryHandle(context: CommandContext): Promise<boolean>;
7
4
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-reply.d.ts","sourceRoot":"","sources":["../../../src/adapters/commands/auto-reply.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjE,qBAAa,uBAAwB,YAAW,cAAc;IACtD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAiCzD;CACF"}
@@ -0,0 +1,38 @@
1
+ import { setSlackConversationAutoReply, slackConversationAutoReplyEnabled } from "../../config.js";
2
+ import { slashForms, matchCommand } from "./manifest.js";
3
+ import { replySummary } from "./utils.js";
4
+ const AUTO_REPLY_COMMANDS = slashForms("autoreply");
5
+ export class AutoReplyCommandHandler {
6
+ async tryHandle(context) {
7
+ const matched = matchCommand(context.commandText, AUTO_REPLY_COMMANDS);
8
+ if (!matched)
9
+ return false;
10
+ if (context.platform !== "slack") {
11
+ await replySummary(context, "Auto-reply", [
12
+ "Auto-reply is currently available on Slack only.",
13
+ ]);
14
+ return true;
15
+ }
16
+ if (context.privateConversation) {
17
+ await replySummary(context, "Auto-reply", [
18
+ "Auto-reply only applies to shared channels. Direct messages already reply automatically.",
19
+ ]);
20
+ return true;
21
+ }
22
+ const value = matched.args[0]?.toLowerCase();
23
+ if ((value !== "on" && value !== "off") || matched.args.length !== 1) {
24
+ await replySummary(context, "Auto-reply", ["Usage: `/pi-auto-reply <on|off>`"]);
25
+ return true;
26
+ }
27
+ const office = context.services.workspace.office(context.address);
28
+ setSlackConversationAutoReply(office, value === "on");
29
+ const enabled = slackConversationAutoReplyEnabled(office);
30
+ await replySummary(context, "Auto-reply", [
31
+ enabled
32
+ ? "Enabled. New messages in this channel will trigger mikan without a mention."
33
+ : "Disabled. New messages in this channel must address mikan explicitly.",
34
+ ]);
35
+ return true;
36
+ }
37
+ }
38
+ //# sourceMappingURL=auto-reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-reply.js","sourceRoot":"","sources":["../../../src/adapters/commands/auto-reply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;AAEpD,MAAM,OAAO,uBAAuB;IAClC,KAAK,CAAC,SAAS,CAAC,OAAuB;QACrC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE;gBACxC,kDAAkD;aACnD,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAChC,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE;gBACxC,0FAA0F;aAC3F,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClE,6BAA6B,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,iCAAiC,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE;YACxC,OAAO;gBACL,CAAC,CAAC,6EAA6E;gBAC/E,CAAC,CAAC,uEAAuE;SAC5E,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import { setSlackConversationAutoReply, slackConversationAutoReplyEnabled } from \"../../config.js\";\nimport { slashForms, matchCommand } from \"./manifest.js\";\nimport type { CommandContext, CommandHandler } from \"./types.js\";\nimport { replySummary } from \"./utils.js\";\n\nconst AUTO_REPLY_COMMANDS = slashForms(\"autoreply\");\n\nexport class AutoReplyCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n const matched = matchCommand(context.commandText, AUTO_REPLY_COMMANDS);\n if (!matched) return false;\n\n if (context.platform !== \"slack\") {\n await replySummary(context, \"Auto-reply\", [\n \"Auto-reply is currently available on Slack only.\",\n ]);\n return true;\n }\n\n if (context.privateConversation) {\n await replySummary(context, \"Auto-reply\", [\n \"Auto-reply only applies to shared channels. Direct messages already reply automatically.\",\n ]);\n return true;\n }\n\n const value = matched.args[0]?.toLowerCase();\n if ((value !== \"on\" && value !== \"off\") || matched.args.length !== 1) {\n await replySummary(context, \"Auto-reply\", [\"Usage: `/pi-auto-reply <on|off>`\"]);\n return true;\n }\n\n const office = context.services.workspace.office(context.address);\n setSlackConversationAutoReply(office, value === \"on\");\n const enabled = slackConversationAutoReplyEnabled(office);\n await replySummary(context, \"Auto-reply\", [\n enabled\n ? \"Enabled. New messages in this channel will trigger mikan without a mention.\"\n : \"Disabled. New messages in this channel must address mikan explicitly.\",\n ]);\n return true;\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { CommandContext, CommandHandler, ParsedLoginCommand } from "./types.js";
2
+ export declare function parseLoginCommand(text: string): ParsedLoginCommand | null;
3
+ export declare class LoginCommandHandler implements CommandHandler {
4
+ tryHandle(context: CommandContext): Promise<boolean>;
5
+ }
6
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/adapters/commands/login.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQrF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAazE;AAkDD,qBAAa,mBAAoB,YAAW,cAAc;IAClD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBzD;CACF"}
@@ -0,0 +1,166 @@
1
+ import * as log from "../../log.js";
2
+ import { credentialAuthorizationKey, runtimeResourceKey } from "../../sandbox/identity.js";
3
+ import { sharedVaultKey } from "../../vault/index.js";
4
+ import { slashForms, matchCommand } from "./manifest.js";
5
+ import { portalNotConfiguredLines, replySummary } from "./utils.js";
6
+ import { createOfficeAddress } from "../../office/index.js";
7
+ const LOGIN_COMMANDS = slashForms("login");
8
+ const SHARED_OPERATIONS = ["create", "update", "delete"];
9
+ export function parseLoginCommand(text) {
10
+ const matched = matchCommand(text, LOGIN_COMMANDS);
11
+ if (!matched)
12
+ return null;
13
+ const [subcommand, operation, name, ...extra] = matched.args;
14
+ if (!subcommand)
15
+ return { action: "setup" };
16
+ if (extra.length > 0)
17
+ return null;
18
+ const verb = subcommand.toLowerCase();
19
+ if (verb === "shared")
20
+ return parseSharedLogin(operation?.toLowerCase(), name);
21
+ if (verb === "copy" && operation && !name)
22
+ return { action: "copy_shared", name: operation };
23
+ // Backward-compatible provider arguments open the generic login page.
24
+ return operation ? null : { action: "setup" };
25
+ }
26
+ function parseSharedLogin(operation, name) {
27
+ if (operation === "list")
28
+ return name ? null : { action: "shared_list" };
29
+ const matched = SHARED_OPERATIONS.find((candidate) => candidate === operation);
30
+ if (!matched || !name)
31
+ return null;
32
+ return { action: `shared_${matched}`, name };
33
+ }
34
+ function ensureLoginVault(context) {
35
+ const { services, platformUserId, conversationId, vaultConversationId } = context;
36
+ // The vault target is a conversation on the same platform; a command may
37
+ // aim at another conversation's vault via vaultConversationId.
38
+ return credentialAuthorizationKey(services.sandbox, {
39
+ userId: platformUserId,
40
+ address: createOfficeAddress(context.address.platform, vaultConversationId ?? conversationId),
41
+ });
42
+ }
43
+ async function refreshCopiedVaultRuntime(context) {
44
+ if (context.services.sandbox.type !== "image")
45
+ return undefined;
46
+ const targetAddress = createOfficeAddress(context.address.platform, context.vaultConversationId ?? context.conversationId);
47
+ const cleared = context.services.runtime?.refreshConversationEnvironment(targetAddress);
48
+ if (cleared === false) {
49
+ return "A session is currently running, so the sandbox was not restarted. The copied credentials will be applied after the run finishes and the sandbox is recreated.";
50
+ }
51
+ if (!context.services.provisioner) {
52
+ return "The cached session was refreshed. The sandbox will pick up copied credentials on the next provision.";
53
+ }
54
+ // The provisioner names containers by runtime resource key, not by the
55
+ // credential key the vault copy used — the two identities differ in image
56
+ // mode (office key vs raw-conversation key). Removing by the wrong key
57
+ // would silently leave the real container running with stale mounts.
58
+ const resourceKey = runtimeResourceKey(context.services.sandbox, {
59
+ userId: context.platformUserId,
60
+ address: targetAddress,
61
+ });
62
+ await context.services.provisioner.remove(resourceKey);
63
+ return "The sandbox container was removed and will be recreated with the copied env and file mounts on the next message.";
64
+ }
65
+ export class LoginCommandHandler {
66
+ async tryHandle(context) {
67
+ const parsed = parseLoginCommand(context.commandText);
68
+ if (!parsed)
69
+ return false;
70
+ if (!context.privateConversation) {
71
+ await replySummary(context, "Vault", [
72
+ "為了保護你的憑證,`/login` 只能在與機器人的私訊中使用。",
73
+ "請先私訊機器人,再重新執行 `/login`。",
74
+ ]);
75
+ return true;
76
+ }
77
+ if (parsed.action === "shared_list")
78
+ await listSharedProfiles(context);
79
+ else if (parsed.action === "shared_delete")
80
+ await deleteSharedProfile(context, parsed.name);
81
+ else if (parsed.action === "copy_shared")
82
+ await copySharedProfile(context, parsed.name);
83
+ else
84
+ await startLoginSetup(context, parsed);
85
+ return true;
86
+ }
87
+ }
88
+ /** Surface a vault-manager failure to the user without failing the command. */
89
+ async function replyVaultError(context, error) {
90
+ await replySummary(context, "Vault", [error instanceof Error ? error.message : String(error)]);
91
+ }
92
+ async function listSharedProfiles(context) {
93
+ const profiles = context.services.vaultManager.listSharedVaults();
94
+ await replySummary(context, "Vault", profiles.length > 0
95
+ ? ["Shared login profiles:", ...profiles.map((name) => `- ${name}`)]
96
+ : ["No shared login profiles found."]);
97
+ }
98
+ async function deleteSharedProfile(context, name) {
99
+ try {
100
+ const deleted = context.services.vaultManager.deleteSharedVault(name);
101
+ await replySummary(context, "Vault", [
102
+ deleted
103
+ ? `Deleted shared login profile \`${name}\`.`
104
+ : `Shared login profile \`${name}\` does not exist.`,
105
+ ]);
106
+ }
107
+ catch (error) {
108
+ await replyVaultError(context, error);
109
+ }
110
+ }
111
+ async function copySharedProfile(context, name) {
112
+ try {
113
+ const vaultId = ensureLoginVault(context);
114
+ const result = context.services.vaultManager.copySharedVaultTo(name, vaultId);
115
+ const refreshNote = await refreshCopiedVaultRuntime(context);
116
+ await replySummary(context, "Vault", [
117
+ `Copied shared login profile \`${name}\` into this conversation.`,
118
+ "Shared values overwrite matching conversation values; conversation-only values are kept.",
119
+ `Copied: ${result.envKeysCopied} env key(s), ${result.filesCopied} file(s).`,
120
+ ...(refreshNote ? [refreshNote] : []),
121
+ ]);
122
+ }
123
+ catch (error) {
124
+ await replyVaultError(context, error);
125
+ }
126
+ }
127
+ /** Issue a portal link for this conversation's vault, or for a shared profile. */
128
+ async function startLoginSetup(context, parsed) {
129
+ if (!context.services.portalBaseUrl) {
130
+ await replySummary(context, "Vault", portalNotConfiguredLines("Login"));
131
+ return;
132
+ }
133
+ let vaultId;
134
+ try {
135
+ vaultId = resolveLoginVaultId(context, parsed);
136
+ }
137
+ catch (error) {
138
+ log.logWarning(`[${context.conversationId}] Failed to prepare login vault for ${context.platform}/${context.platformUserId}`, error instanceof Error ? error.message : String(error));
139
+ await replySummary(context, "Vault", [
140
+ "Login setup failed on the server.",
141
+ "請稍後重試,或聯絡管理員檢查 vault 儲存權限。",
142
+ ]);
143
+ return;
144
+ }
145
+ const token = context.services.linkTokenStore.create(context.platform, context.platformUserId, context.conversationId, vaultId, "");
146
+ await replySummary(context, "Vault", [
147
+ `${context.services.portalBaseUrl}/link?token=${token.token}`,
148
+ `Target: ${loginVaultLabel(context, parsed, vaultId)} · Expires: 15 minutes`,
149
+ ]);
150
+ }
151
+ function resolveLoginVaultId(context, parsed) {
152
+ const isSharedSetup = parsed.action === "shared_create" || parsed.action === "shared_update";
153
+ const vaultId = isSharedSetup ? (sharedVaultKey(parsed.name) ?? "") : ensureLoginVault(context);
154
+ if (vaultId)
155
+ return vaultId;
156
+ throw new Error(isSharedSetup ? `Invalid shared login profile name: ${parsed.name}` : "Invalid vault id");
157
+ }
158
+ function loginVaultLabel(context, parsed, vaultId) {
159
+ if (parsed.action === "shared_create" || parsed.action === "shared_update") {
160
+ return `shared login profile (${parsed.name})`;
161
+ }
162
+ return context.services.sandbox.type === "container"
163
+ ? `container vault (${vaultId})`
164
+ : "your vault";
165
+ }
166
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/adapters/commands/login.ts"],"names":[],"mappings":"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","sourcesContent":["import * as log from \"../../log.js\";\nimport { credentialAuthorizationKey, runtimeResourceKey } from \"../../sandbox/identity.js\";\nimport { sharedVaultKey } from \"../../vault/index.js\";\nimport { slashForms, matchCommand } from \"./manifest.js\";\nimport type { CommandContext, CommandHandler, ParsedLoginCommand } from \"./types.js\";\nimport { portalNotConfiguredLines, replySummary } from \"./utils.js\";\nimport { createOfficeAddress } from \"../../office/index.js\";\n\nconst LOGIN_COMMANDS = slashForms(\"login\");\n\nconst SHARED_OPERATIONS = [\"create\", \"update\", \"delete\"] as const;\n\nexport function parseLoginCommand(text: string): ParsedLoginCommand | null {\n const matched = matchCommand(text, LOGIN_COMMANDS);\n if (!matched) return null;\n\n const [subcommand, operation, name, ...extra] = matched.args;\n if (!subcommand) return { action: \"setup\" };\n if (extra.length > 0) return null;\n\n const verb = subcommand.toLowerCase();\n if (verb === \"shared\") return parseSharedLogin(operation?.toLowerCase(), name);\n if (verb === \"copy\" && operation && !name) return { action: \"copy_shared\", name: operation };\n // Backward-compatible provider arguments open the generic login page.\n return operation ? null : { action: \"setup\" };\n}\n\nfunction parseSharedLogin(\n operation: string | undefined,\n name: string | undefined,\n): ParsedLoginCommand | null {\n if (operation === \"list\") return name ? null : { action: \"shared_list\" };\n const matched = SHARED_OPERATIONS.find((candidate) => candidate === operation);\n if (!matched || !name) return null;\n return { action: `shared_${matched}`, name };\n}\n\nfunction ensureLoginVault(context: CommandContext): string {\n const { services, platformUserId, conversationId, vaultConversationId } = context;\n // The vault target is a conversation on the same platform; a command may\n // aim at another conversation's vault via vaultConversationId.\n return credentialAuthorizationKey(services.sandbox, {\n userId: platformUserId,\n address: createOfficeAddress(context.address.platform, vaultConversationId ?? conversationId),\n });\n}\n\nasync function refreshCopiedVaultRuntime(context: CommandContext): Promise<string | undefined> {\n if (context.services.sandbox.type !== \"image\") return undefined;\n\n const targetAddress = createOfficeAddress(\n context.address.platform,\n context.vaultConversationId ?? context.conversationId,\n );\n const cleared = context.services.runtime?.refreshConversationEnvironment(targetAddress);\n if (cleared === false) {\n return \"A session is currently running, so the sandbox was not restarted. The copied credentials will be applied after the run finishes and the sandbox is recreated.\";\n }\n\n if (!context.services.provisioner) {\n return \"The cached session was refreshed. The sandbox will pick up copied credentials on the next provision.\";\n }\n\n // The provisioner names containers by runtime resource key, not by the\n // credential key the vault copy used — the two identities differ in image\n // mode (office key vs raw-conversation key). Removing by the wrong key\n // would silently leave the real container running with stale mounts.\n const resourceKey = runtimeResourceKey(context.services.sandbox, {\n userId: context.platformUserId,\n address: targetAddress,\n });\n await context.services.provisioner.remove(resourceKey);\n return \"The sandbox container was removed and will be recreated with the copied env and file mounts on the next message.\";\n}\n\nexport class LoginCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n const parsed = parseLoginCommand(context.commandText);\n if (!parsed) return false;\n\n if (!context.privateConversation) {\n await replySummary(context, \"Vault\", [\n \"為了保護你的憑證,`/login` 只能在與機器人的私訊中使用。\",\n \"請先私訊機器人,再重新執行 `/login`。\",\n ]);\n return true;\n }\n\n if (parsed.action === \"shared_list\") await listSharedProfiles(context);\n else if (parsed.action === \"shared_delete\") await deleteSharedProfile(context, parsed.name);\n else if (parsed.action === \"copy_shared\") await copySharedProfile(context, parsed.name);\n else await startLoginSetup(context, parsed);\n return true;\n }\n}\n\n/** Surface a vault-manager failure to the user without failing the command. */\nasync function replyVaultError(context: CommandContext, error: unknown): Promise<void> {\n await replySummary(context, \"Vault\", [error instanceof Error ? error.message : String(error)]);\n}\n\nasync function listSharedProfiles(context: CommandContext): Promise<void> {\n const profiles = context.services.vaultManager.listSharedVaults();\n await replySummary(\n context,\n \"Vault\",\n profiles.length > 0\n ? [\"Shared login profiles:\", ...profiles.map((name) => `- ${name}`)]\n : [\"No shared login profiles found.\"],\n );\n}\n\nasync function deleteSharedProfile(context: CommandContext, name: string): Promise<void> {\n try {\n const deleted = context.services.vaultManager.deleteSharedVault(name);\n await replySummary(context, \"Vault\", [\n deleted\n ? `Deleted shared login profile \\`${name}\\`.`\n : `Shared login profile \\`${name}\\` does not exist.`,\n ]);\n } catch (error) {\n await replyVaultError(context, error);\n }\n}\n\nasync function copySharedProfile(context: CommandContext, name: string): Promise<void> {\n try {\n const vaultId = ensureLoginVault(context);\n const result = context.services.vaultManager.copySharedVaultTo(name, vaultId);\n const refreshNote = await refreshCopiedVaultRuntime(context);\n await replySummary(context, \"Vault\", [\n `Copied shared login profile \\`${name}\\` into this conversation.`,\n \"Shared values overwrite matching conversation values; conversation-only values are kept.\",\n `Copied: ${result.envKeysCopied} env key(s), ${result.filesCopied} file(s).`,\n ...(refreshNote ? [refreshNote] : []),\n ]);\n } catch (error) {\n await replyVaultError(context, error);\n }\n}\n\n/** Issue a portal link for this conversation's vault, or for a shared profile. */\nasync function startLoginSetup(context: CommandContext, parsed: ParsedLoginCommand): Promise<void> {\n if (!context.services.portalBaseUrl) {\n await replySummary(context, \"Vault\", portalNotConfiguredLines(\"Login\"));\n return;\n }\n\n let vaultId: string;\n try {\n vaultId = resolveLoginVaultId(context, parsed);\n } catch (error) {\n log.logWarning(\n `[${context.conversationId}] Failed to prepare login vault for ${context.platform}/${context.platformUserId}`,\n error instanceof Error ? error.message : String(error),\n );\n await replySummary(context, \"Vault\", [\n \"Login setup failed on the server.\",\n \"請稍後重試,或聯絡管理員檢查 vault 儲存權限。\",\n ]);\n return;\n }\n\n const token = context.services.linkTokenStore.create(\n context.platform,\n context.platformUserId,\n context.conversationId,\n vaultId,\n \"\",\n );\n await replySummary(context, \"Vault\", [\n `${context.services.portalBaseUrl}/link?token=${token.token}`,\n `Target: ${loginVaultLabel(context, parsed, vaultId)} · Expires: 15 minutes`,\n ]);\n}\n\nfunction resolveLoginVaultId(context: CommandContext, parsed: ParsedLoginCommand): string {\n const isSharedSetup = parsed.action === \"shared_create\" || parsed.action === \"shared_update\";\n const vaultId = isSharedSetup ? (sharedVaultKey(parsed.name) ?? \"\") : ensureLoginVault(context);\n if (vaultId) return vaultId;\n throw new Error(\n isSharedSetup ? `Invalid shared login profile name: ${parsed.name}` : \"Invalid vault id\",\n );\n}\n\nfunction loginVaultLabel(\n context: CommandContext,\n parsed: ParsedLoginCommand,\n vaultId: string,\n): string {\n if (parsed.action === \"shared_create\" || parsed.action === \"shared_update\") {\n return `shared login profile (${parsed.name})`;\n }\n return context.services.sandbox.type === \"container\"\n ? `container vault (${vaultId})`\n : \"your vault\";\n}\n"]}