@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,1833 @@
1
+ import { SessionStore } from "../../../sessions/session-store.js";
2
+ import { InMemoryTokenStore } from "../token-store.js";
3
+ import MarkdownIt from "markdown-it";
4
+ import { createConversationEvent, createConversationMessage, createOfficeAddress, } from "../../../office/index.js";
5
+ import * as log from "../../../log.js";
6
+ import { escapeHtml, jsonResponse as json, readJsonBody, renderPortalShell, } from "../portal-shell.js";
7
+ import { reportUserFacingError } from "../../../observability/index.js";
8
+ import { inferConversationKind } from "../../../sessions/session-key.js";
9
+ import { isThreadSessionKey, threadSuffixOf } from "../../../sessions/session-key.js";
10
+ const SESSION_VIEW_TOKEN_TTL_MS = 24 * 60 * 60 * 1000;
11
+ export class InMemorySessionViewTokenStore extends InMemoryTokenStore {
12
+ create(options) {
13
+ return this.createRecord(SESSION_VIEW_TOKEN_TTL_MS, {
14
+ platform: options.platform,
15
+ platformUserId: options.platformUserId,
16
+ platformUserName: options.platformUserName || undefined,
17
+ conversationId: options.conversationId,
18
+ sessionKey: options.sessionKey,
19
+ office: options.office,
20
+ });
21
+ }
22
+ }
23
+ const markdown = new MarkdownIt({
24
+ html: false,
25
+ linkify: true,
26
+ breaks: true,
27
+ });
28
+ const defaultLinkOpen = markdown.renderer.rules.link_open;
29
+ markdown.renderer.rules.link_open = (...args) => {
30
+ const [tokens, idx, options, env, self] = args;
31
+ const token = tokens[idx];
32
+ token?.attrSet("target", "_blank");
33
+ token?.attrSet("rel", "noreferrer noopener");
34
+ return defaultLinkOpen
35
+ ? defaultLinkOpen(tokens, idx, options, env, self)
36
+ : self.renderToken(tokens, idx, options);
37
+ };
38
+ class SessionViewStreamHub {
39
+ constructor() {
40
+ this.listeners = new Map();
41
+ }
42
+ subscribe(key, listener) {
43
+ const set = this.listeners.get(key) ?? new Set();
44
+ set.add(listener);
45
+ this.listeners.set(key, set);
46
+ return () => {
47
+ const current = this.listeners.get(key);
48
+ if (!current)
49
+ return;
50
+ current.delete(listener);
51
+ if (current.size === 0)
52
+ this.listeners.delete(key);
53
+ };
54
+ }
55
+ publish(key, event) {
56
+ const set = this.listeners.get(key);
57
+ if (!set)
58
+ return;
59
+ for (const listener of set)
60
+ listener(event);
61
+ }
62
+ }
63
+ const sessionViewStreamHub = new SessionViewStreamHub();
64
+ import { errorMessage } from "../../../unknown-values.js";
65
+ export async function handleSessionViewRequest(req, res, url, sessionViewTokenStore, interactive) {
66
+ if (req.method === "POST" && url.pathname === "/session/message") {
67
+ await handleSessionMessageRequest(req, res, sessionViewTokenStore, interactive);
68
+ return true;
69
+ }
70
+ if (req.method === "GET" && url.pathname === "/session/stream") {
71
+ await handleSessionStreamRequest(req, res, url, sessionViewTokenStore, interactive);
72
+ return true;
73
+ }
74
+ if (req.method !== "GET" || url.pathname !== "/session") {
75
+ return false;
76
+ }
77
+ const target = await resolveSessionRequestTarget(sessionViewTokenStore, url.searchParams.get("token"), url.searchParams.get("session"));
78
+ if (!target.ok) {
79
+ res.writeHead(target.status, { "Content-Type": "text/html; charset=utf-8" });
80
+ res.end(renderStatusPage("Session unavailable", target.message));
81
+ return true;
82
+ }
83
+ const { activeSessionKey, entry } = target;
84
+ try {
85
+ const model = await loadSessionViewModel(entry.office, activeSessionKey);
86
+ const displayedSessionKey = activeSessionKey;
87
+ const isRunning = interactive?.handler.isRunning(createOfficeAddress(entry.platform, entry.conversationId), displayedSessionKey) ?? false;
88
+ res.writeHead(200, {
89
+ "Content-Type": "text/html; charset=utf-8",
90
+ "Cache-Control": "no-store",
91
+ });
92
+ res.end(renderSessionPage({
93
+ model,
94
+ token: entry.token,
95
+ expiresAt: entry.expiresAt,
96
+ isRunning,
97
+ displayedSessionKey,
98
+ conversationId: entry.conversationId,
99
+ }));
100
+ }
101
+ catch (error) {
102
+ log.logWarning(`[${entry.conversationId}] Failed to render session ${activeSessionKey}`, errorMessage(error));
103
+ reportUserFacingError(error, {
104
+ domain: "session_view",
105
+ surface: "session_view",
106
+ operation: "render_session",
107
+ severity: "error",
108
+ platform: entry.platform,
109
+ context: {
110
+ conversationId: entry.conversationId,
111
+ sessionKey: activeSessionKey,
112
+ },
113
+ });
114
+ res.writeHead(500, { "Content-Type": "text/html; charset=utf-8" });
115
+ res.end(renderStatusPage("Session unavailable", "The session could not be loaded right now."));
116
+ }
117
+ return true;
118
+ }
119
+ async function resolveSessionRequestTarget(sessionViewTokenStore, rawToken, requestedSession) {
120
+ if (!sessionViewTokenStore) {
121
+ return { ok: false, status: 503, message: "Session view is not configured." };
122
+ }
123
+ const token = rawToken?.trim() ?? "";
124
+ const entry = token ? sessionViewTokenStore.peek(token) : undefined;
125
+ if (!entry) {
126
+ return { ok: false, status: 400, message: "This session link is invalid or has expired." };
127
+ }
128
+ const requested = requestedSession?.trim() || entry.sessionKey;
129
+ if (!(await SessionStore.exists(entry.office, requested))) {
130
+ return { ok: false, status: 400, message: "The selected session is invalid." };
131
+ }
132
+ return { ok: true, entry, activeSessionKey: requested };
133
+ }
134
+ function sessionStreamKey(entry) {
135
+ return `${entry.platform}:${entry.conversationId}:${entry.sessionKey}`;
136
+ }
137
+ function renderTimelineItems(items, token) {
138
+ return items.length > 0
139
+ ? items.map((item) => renderItem(item, token)).join("\n")
140
+ : `<div class="system-event"><span class="event-dot"></span><span class="event-text">No messages yet — send one to the bot, then refresh.</span></div>`;
141
+ }
142
+ function renderSessionPage(options) {
143
+ const { model, token, expiresAt, isRunning, displayedSessionKey, conversationId } = options;
144
+ const items = renderTimelineItems(model.items, token);
145
+ const relatedSections = model.parent
146
+ ? `<section class="related-card stack">
147
+ <p class="eyebrow">Parent session</p>
148
+ ${renderRelationCard(model.parent, token)}
149
+ </section>`
150
+ : "";
151
+ const body = `<header class="page-head">
152
+ <div>
153
+ <p class="eyebrow">Session</p>
154
+ <h2 class="page-title">${esc(model.title)}</h2>
155
+ <p class="page-desc">
156
+ <span>Created ${esc(formatDate(model.createdAt))}</span> ·
157
+ <span>Updated <strong data-session-updated>${esc(formatDate(model.updatedAt))}</strong></span> ·
158
+ <span><strong data-session-entries>${esc(String(model.entryCount))}</strong> entries</span>
159
+ </p>
160
+ </div>
161
+ <div class="session-side">
162
+ <span class="session-badge session-badge-status${isRunning ? " is-running" : ""}"><span class="session-badge-dot"></span><strong data-session-status>${esc(isRunning ? "Running" : "Idle")}</strong></span>
163
+ <span class="session-badge">${esc(displayedSessionKey === conversationId ? "Channel" : "Thread")}</span>
164
+ </div>
165
+ </header>
166
+
167
+ <div class="session-detail-row">
168
+ <span class="session-detail"><span class="session-detail-label">Session</span><code>${esc(model.sessionId.slice(0, 8))}</code></span>
169
+ <span class="session-detail"><span class="session-detail-label">Session</span><code>${esc(model.sessionKey)}</code></span>
170
+ <span class="session-detail"><span class="session-detail-label">Expires</span><span>${esc(formatDate(new Date(expiresAt).toISOString()))}</span></span>
171
+ </div>
172
+
173
+ ${relatedSections}
174
+
175
+ <div class="timeline-shell">
176
+ <div class="timeline-list" data-timeline-list>
177
+ ${items}
178
+ </div>
179
+ </div>
180
+
181
+ <button class="jump-latest-btn" type="button" hidden data-jump-latest aria-label="Jump to latest" title="Jump to latest">↓</button>
182
+
183
+ <section class="composer-card">
184
+ <form class="composer-form" data-session-composer>
185
+ <input type="hidden" name="token" value="${esc(token)}">
186
+ <input type="hidden" name="session" value="${esc(model.sessionKey)}">
187
+ <input type="hidden" name="sessionKey" value="${esc(displayedSessionKey)}">
188
+ <textarea name="text" rows="1" placeholder="Ask mikan in this session… (replies stay in Session View)" required></textarea>
189
+ <div class="composer-actions">
190
+ <span class="composer-status" data-composer-status></span>
191
+ <button class="composer-send-btn" type="submit" aria-label="Send" title="Send">↑</button>
192
+ </div>
193
+ </form>
194
+ </section>`;
195
+ return renderHtmlDocument(`${model.title} · Session Viewer`, body, isRunning);
196
+ }
197
+ function renderRelationCard(relation, token) {
198
+ const href = `/session?token=${encodeURIComponent(token)}&session=${encodeURIComponent(relation.sessionKey)}`;
199
+ const summary = relation.summary ? `<p class="related-summary">${esc(relation.summary)}</p>` : "";
200
+ return `<a class="related-link" href="${href}">
201
+ <span class="related-copy">
202
+ <strong class="related-title">${esc(relation.title)}</strong>
203
+ ${summary}
204
+ <span class="related-meta">${esc(formatDate(relation.updatedAt))} · ${esc(String(relation.entryCount))} entries · ${esc(relation.sessionKey)}</span>
205
+ </span>
206
+ <span class="related-arrow" aria-hidden="true">→</span>
207
+ </a>`;
208
+ }
209
+ function renderThreadLinks(relations, token) {
210
+ if (!relations || relations.length === 0)
211
+ return "";
212
+ return `<div class="thread-links">${relations
213
+ .map((relation) => {
214
+ const href = `/session?token=${encodeURIComponent(token)}&session=${encodeURIComponent(relation.sessionKey)}`;
215
+ return `<a class="thread-link" href="${href}" title="Open ${esc(relation.title)}">
216
+ <span class="thread-dot" aria-hidden="true"></span>
217
+ <span class="thread-text">Thread</span>
218
+ </a>`;
219
+ })
220
+ .join("")}</div>`;
221
+ }
222
+ export function parseUserBody(raw) {
223
+ let m = raw.match(/^\[([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[+-][0-9]{2}:[0-9]{2})\]\s*\[([^\]]+)\](?:\s*\[in-thread:([^\]]+)\])?:\s*([\s\S]*)$/);
224
+ if (m) {
225
+ const header = [`[${m[1]}]`, `[${m[2]}]`, m[3] ? `[in-thread:${m[3]}]` : ""]
226
+ .filter(Boolean)
227
+ .join(" ");
228
+ return {
229
+ timestamp: m[1] ?? null,
230
+ username: m[2] ?? null,
231
+ threadTs: m[3] ?? null,
232
+ header,
233
+ content: m[4] ?? "",
234
+ };
235
+ }
236
+ m = raw.match(/^\[([^\]]+)\](?:\s*\[in-thread:([^\]]+)\])?:\s*([\s\S]*)$/);
237
+ if (m) {
238
+ const header = [`[${m[1]}]`, m[2] ? `[in-thread:${m[2]}]` : ""].filter(Boolean).join(" ");
239
+ return {
240
+ timestamp: null,
241
+ username: m[1] ?? null,
242
+ threadTs: m[2] ?? null,
243
+ header,
244
+ content: m[3] ?? "",
245
+ };
246
+ }
247
+ return { timestamp: null, username: null, threadTs: null, header: null, content: raw };
248
+ }
249
+ function renderCopyButton(label = "Copy message") {
250
+ return `<div class="msg-actions"><button class="copy-action-btn" type="button" data-copy-button data-copy-label="${esc(label)}" aria-label="${esc(label)}" title="${esc(label)}"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><rect x="9" y="9" width="11" height="11" rx="2" stroke="currentColor" stroke-width="1.8"></rect><path d="M6 15H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v1" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg></button></div>`;
251
+ }
252
+ function renderItem(item, token) {
253
+ if (item.kind === "system") {
254
+ const parts = [item.title, item.body].filter((x) => Boolean(x)).map(esc);
255
+ const time = item.meta
256
+ ? ` · <time class="event-time">${esc(formatDate(item.meta))}</time>`
257
+ : "";
258
+ return `<div class="system-event"><span class="event-dot"></span><span class="event-text">${parts.join(" — ")}</span>${time}</div>`;
259
+ }
260
+ if (item.kind === "tool") {
261
+ const toneClass = item.tone === "err" ? " tone-err" : item.tone === "ok" ? " tone-ok" : "";
262
+ const body = item.body ? `<pre class="tool-output${toneClass}">${esc(item.body)}</pre>` : "";
263
+ const time = item.meta ? `<time class="tool-time">${esc(formatDate(item.meta))}</time>` : "";
264
+ return `<div class="tool-block">
265
+ <div class="tool-header">
266
+ <span class="tool-icon"><svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M1.5 2L5 5.5 1.5 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 9h2.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg></span>
267
+ <span class="tool-name">${esc(item.title)}</span>
268
+ ${time}
269
+ </div>
270
+ ${body}
271
+ </div>`;
272
+ }
273
+ const time = item.meta ? `<time class="msg-time">${esc(formatDate(item.meta))}</time>` : "";
274
+ if (item.kind === "user") {
275
+ const parsed = item.body
276
+ ? parseUserBody(item.body)
277
+ : { timestamp: null, username: null, threadTs: null, header: null, content: "" };
278
+ const { username, threadTs, header, content } = parsed;
279
+ const initial = username ? esc(username.slice(0, 2).toUpperCase()) : "U";
280
+ const rawHeader = header ? `<div class="msg-raw-header">${esc(header)}</div>` : "";
281
+ const body = content ? renderMarkdownBlock(content, "user") : "";
282
+ const threadBadge = threadTs
283
+ ? `<div class="thread-badge" title="Thread ${esc(threadTs)}">Thread · <code>${esc(threadTs)}</code></div>`
284
+ : "";
285
+ const threads = renderThreadLinks(item.threads, token ?? "");
286
+ return `<div class="msg-row msg-user copy-host">
287
+ <div class="msg-main user-main">
288
+ <div class="user-bubble">
289
+ ${rawHeader}
290
+ ${threadBadge}
291
+ ${body}
292
+ ${threads}
293
+ ${time}
294
+ </div>
295
+ ${renderCopyButton()}
296
+ </div>
297
+ <div class="msg-avatar user-avatar" title="${username ? esc(username) : "User"}">${initial}</div>
298
+ </div>`;
299
+ }
300
+ const body = item.body ? renderMarkdownBlock(item.body, "assistant") : "";
301
+ const threads = renderThreadLinks(item.threads, token ?? "");
302
+ return `<div class="msg-row msg-assistant copy-host">
303
+ <div class="msg-avatar asst-avatar" aria-hidden="true">A</div>
304
+ <div class="msg-main asst-main">
305
+ <div class="asst-card">
306
+ ${body}
307
+ ${threads}
308
+ ${time}
309
+ </div>
310
+ ${renderCopyButton()}
311
+ </div>
312
+ </div>`;
313
+ }
314
+ function renderMarkdownBlock(text, variant) {
315
+ return `<div class="msg-body markdown-body markdown-${variant}">${markdown.render(text)}</div>`;
316
+ }
317
+ function renderLiveUserMessage(text, userName) {
318
+ const initial = esc(userName.slice(0, 2).toUpperCase());
319
+ return `<div class="msg-row msg-user copy-host" data-live-item>
320
+ <div class="msg-main user-main">
321
+ <div class="user-bubble">
322
+ ${renderMarkdownBlock(text, "user")}
323
+ </div>
324
+ ${renderCopyButton()}
325
+ </div>
326
+ <div class="msg-avatar user-avatar" title="${esc(userName)}">${initial}</div>
327
+ </div>`;
328
+ }
329
+ function renderLiveAssistantMessage(text) {
330
+ return `<div class="msg-row msg-assistant copy-host" data-live-assistant>
331
+ <div class="msg-avatar asst-avatar" aria-hidden="true">A</div>
332
+ <div class="msg-main asst-main">
333
+ <div class="asst-card">
334
+ ${renderMarkdownBlock(text, "assistant")}
335
+ </div>
336
+ ${renderCopyButton()}
337
+ </div>
338
+ </div>`;
339
+ }
340
+ function renderLiveToolResult(result) {
341
+ const toneClass = result.isError ? " tone-err" : " tone-ok";
342
+ return `<div class="tool-block" data-live-item>
343
+ <div class="tool-header">
344
+ <span class="tool-icon"><svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M1.5 2L5 5.5 1.5 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 9h2.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg></span>
345
+ <span class="tool-name">${esc(result.toolName)}</span>
346
+ </div>
347
+ <pre class="tool-output${toneClass}">${esc(result.result)}</pre>
348
+ </div>`;
349
+ }
350
+ function renderLiveSystemEvent(text, tone = "default") {
351
+ const cls = tone === "err" ? " system-event-err" : "";
352
+ return `<div class="system-event${cls}" data-live-item><span class="event-dot"></span><span class="event-text">${esc(text)}</span></div>`;
353
+ }
354
+ async function handleSessionStreamRequest(req, res, url, sessionViewTokenStore, interactive) {
355
+ if (!interactive) {
356
+ res.writeHead(503, { "Content-Type": "text/plain; charset=utf-8" });
357
+ res.end("Session stream is not configured.");
358
+ return;
359
+ }
360
+ const target = await resolveSessionRequestTarget(sessionViewTokenStore, url.searchParams.get("token"), url.searchParams.get("session"));
361
+ if (!target.ok) {
362
+ res.writeHead(target.status, { "Content-Type": "text/plain; charset=utf-8" });
363
+ res.end(target.message);
364
+ return;
365
+ }
366
+ const { activeSessionKey, entry } = target;
367
+ const streamKey = sessionStreamKey({ ...entry, sessionKey: activeSessionKey });
368
+ res.writeHead(200, {
369
+ "Content-Type": "text/event-stream; charset=utf-8",
370
+ "Cache-Control": "no-store",
371
+ Connection: "keep-alive",
372
+ });
373
+ res.write(`data: ${JSON.stringify({
374
+ type: "status",
375
+ running: interactive.handler.isRunning(createOfficeAddress(entry.platform, entry.conversationId), activeSessionKey),
376
+ })}\n\n`);
377
+ const send = (event) => res.write(`data: ${JSON.stringify(event)}\n\n`);
378
+ const unsubscribe = sessionViewStreamHub.subscribe(streamKey, send);
379
+ const liveRun = createLiveRunProjection(send, async () => {
380
+ const model = await loadSessionViewModel(target.entry.office, target.activeSessionKey);
381
+ return {
382
+ type: "refresh",
383
+ timelineHtml: renderTimelineItems(model.items, url.searchParams.get("token") ?? ""),
384
+ updatedAt: formatDate(model.updatedAt),
385
+ entryCount: model.entryCount,
386
+ running: false,
387
+ };
388
+ });
389
+ const unsubscribeRun = interactive.runEvents.subscribe(createOfficeAddress(entry.platform, entry.conversationId), activeSessionKey, liveRun);
390
+ const heartbeat = setInterval(() => {
391
+ res.write(": keep-alive\n\n");
392
+ }, 15000);
393
+ req.on("close", () => {
394
+ clearInterval(heartbeat);
395
+ unsubscribe();
396
+ unsubscribeRun();
397
+ });
398
+ }
399
+ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, interactive) {
400
+ if (!interactive) {
401
+ json(res, 503, { ok: false, error: "Session chat is not configured." });
402
+ return;
403
+ }
404
+ const body = await readJsonBody(req, res, 1024 * 1024);
405
+ if (!body)
406
+ return;
407
+ const token = typeof body.token === "string" ? body.token.trim() : "";
408
+ const text = typeof body.text === "string" ? body.text.trim() : "";
409
+ const requestedSession = typeof body.session === "string" ? body.session.trim() || null : null;
410
+ const requestedSessionKey = typeof body.sessionKey === "string" ? body.sessionKey.trim() : "";
411
+ if (!token || !text) {
412
+ json(res, 400, { ok: false, error: "Missing token or text." });
413
+ return;
414
+ }
415
+ const target = await resolveSessionRequestTarget(sessionViewTokenStore, token, requestedSession);
416
+ if (!target.ok) {
417
+ json(res, target.status, { ok: false, error: target.message });
418
+ return;
419
+ }
420
+ const { activeSessionKey, entry } = target;
421
+ if (requestedSessionKey && requestedSessionKey !== activeSessionKey) {
422
+ json(res, 400, { ok: false, error: "Session target mismatch." });
423
+ return;
424
+ }
425
+ await dispatchSessionViewMessage({ res, interactive, text, activeSessionKey, entry });
426
+ }
427
+ async function dispatchSessionViewMessage(input) {
428
+ const { res, interactive, text, activeSessionKey, entry } = input;
429
+ const bot = interactive.botsByPlatform[entry.platform];
430
+ if (!bot) {
431
+ json(res, 503, { ok: false, error: `No bot configured for ${entry.platform}.` });
432
+ return;
433
+ }
434
+ const streamKey = sessionStreamKey({ ...entry, sessionKey: activeSessionKey });
435
+ const conversationKind = inferConversationKind(entry.platform, entry.conversationId);
436
+ const ts = (Date.now() / 1000).toFixed(6);
437
+ const platformInfo = bot.getMessagingInfo();
438
+ const platformUserName = entry.platformUserName ||
439
+ platformInfo.users.find((user) => user.id === entry.platformUserId)?.userName ||
440
+ platformInfo.users.find((user) => user.id === entry.platformUserId)?.displayName ||
441
+ "unknown";
442
+ const responder = createSilentResponder();
443
+ const event = createConversationEvent({
444
+ platform: entry.platform,
445
+ type: "session_view",
446
+ conversationId: entry.conversationId,
447
+ conversationKind,
448
+ ts,
449
+ user: entry.platformUserId,
450
+ text,
451
+ attachments: [],
452
+ sessionKey: activeSessionKey,
453
+ thread_ts: isThreadSessionKey(activeSessionKey) ? threadSuffixOf(activeSessionKey) : undefined,
454
+ });
455
+ const message = createConversationMessage({
456
+ platform: entry.platform,
457
+ conversationId: entry.conversationId,
458
+ id: ts,
459
+ sessionKey: activeSessionKey,
460
+ conversationKind,
461
+ userId: entry.platformUserId,
462
+ userName: platformUserName,
463
+ text,
464
+ attachments: [],
465
+ threadTs: event.thread_ts,
466
+ });
467
+ const context = {
468
+ address: event.address,
469
+ message,
470
+ responder,
471
+ platform: { ...platformInfo, diagnostics: { showUsageSummary: false } },
472
+ };
473
+ void interactive.handler.handleEvent(event, bot, context).catch((error) => {
474
+ log.logWarning(`[${entry.conversationId}] Session view message failed`, errorMessage(error));
475
+ reportUserFacingError(error, {
476
+ domain: "session_view",
477
+ surface: "session_view",
478
+ operation: "interactive_message",
479
+ severity: "error",
480
+ platform: entry.platform,
481
+ context: {
482
+ conversationId: entry.conversationId,
483
+ sessionKey: activeSessionKey,
484
+ messageId: ts,
485
+ textLength: text.length,
486
+ },
487
+ });
488
+ sessionViewStreamHub.publish(streamKey, {
489
+ type: "error",
490
+ message: errorMessage(error),
491
+ });
492
+ sessionViewStreamHub.publish(streamKey, { type: "status", running: false });
493
+ });
494
+ json(res, 202, { ok: true, accepted: true });
495
+ }
496
+ async function ignoreResponse() { }
497
+ function createSilentResponder() {
498
+ const ignore = ignoreResponse;
499
+ return {
500
+ respond: ignore,
501
+ replaceResponse: ignore,
502
+ respondDiagnostic: ignore,
503
+ respondToolResult: ignore,
504
+ setTyping: ignore,
505
+ setWorking: ignore,
506
+ uploadFile: ignore,
507
+ deleteResponse: ignore,
508
+ };
509
+ }
510
+ function createLiveRunProjection(send, refresh) {
511
+ let answer = "";
512
+ return (event) => {
513
+ switch (event.type) {
514
+ case "run_started":
515
+ answer = "";
516
+ send({ type: "status", running: true });
517
+ send({ type: "user", html: renderLiveUserMessage(event.text, event.userName) });
518
+ return;
519
+ case "tool_ended":
520
+ send({
521
+ type: "tool",
522
+ html: renderLiveToolResult({
523
+ toolName: event.toolName,
524
+ result: event.resultText,
525
+ isError: event.isError,
526
+ }),
527
+ });
528
+ return;
529
+ case "assistant_delta":
530
+ answer += event.delta;
531
+ send({ type: "assistant", html: renderLiveAssistantMessage(answer) });
532
+ return;
533
+ case "assistant_message":
534
+ answer = "";
535
+ send({ type: "assistant_done" });
536
+ return;
537
+ case "compaction_started":
538
+ send({ type: "system", html: renderLiveSystemEvent("Compacting context…") });
539
+ return;
540
+ case "retry_started":
541
+ send({
542
+ type: "system",
543
+ html: renderLiveSystemEvent(`Retrying (${event.attempt}/${event.maxAttempts})…`),
544
+ });
545
+ return;
546
+ case "budget_exceeded":
547
+ send({
548
+ type: "system",
549
+ html: renderLiveSystemEvent(`Stopped: run budget exceeded (${event.reason})`, "err"),
550
+ });
551
+ return;
552
+ case "run_ended":
553
+ void refresh()
554
+ .then(send)
555
+ .catch((error) => send({ type: "error", message: errorMessage(error) }));
556
+ return;
557
+ default:
558
+ return;
559
+ }
560
+ };
561
+ }
562
+ function renderStatusPage(title, message) {
563
+ return renderHtmlDocument(title, `<section class="card stack">
564
+ <p class="eyebrow">mikan</p>
565
+ <h1 class="page-title">${esc(title)}</h1>
566
+ <div class="status err">${esc(message)}</div>
567
+ </section>`, false);
568
+ }
569
+ function renderHtmlDocument(title, shellContent, isRunning) {
570
+ return renderPortalShell({
571
+ activeView: "session",
572
+ pageTitle: "Session",
573
+ body: shellContent,
574
+ extraStyles: sessionViewStyles,
575
+ bodyAttributes: { "data-session-running": isRunning ? "true" : "false" },
576
+ inlineScript: sessionViewScript,
577
+ });
578
+ }
579
+ const sessionViewScript = `
580
+ const form = document.querySelector('[data-session-composer]');
581
+ const timelineList = document.querySelector('[data-timeline-list]');
582
+ const jumpLatestBtn = document.querySelector('[data-jump-latest]');
583
+ const statusEl = document.querySelector('[data-session-status]');
584
+ const updatedEl = document.querySelector('[data-session-updated]');
585
+ const entriesEl = document.querySelector('[data-session-entries]');
586
+ const composerStatus = form?.querySelector('[data-composer-status]');
587
+ const textarea = form?.querySelector('textarea[name="text"]');
588
+ const submitButton = form?.querySelector('button[type="submit"]');
589
+ let liveAssistant = null;
590
+ let running = document.body.dataset.sessionRunning === 'true';
591
+
592
+ const isNearMessagingBottom = () => window.innerHeight + window.scrollY >= document.body.offsetHeight - 120;
593
+ const scrollToLatest = (behavior = 'smooth') => window.scrollTo({ top: document.body.scrollHeight, behavior });
594
+ const toggleJumpButton = () => {
595
+ if (!jumpLatestBtn) return;
596
+ jumpLatestBtn.hidden = isNearMessagingBottom();
597
+ };
598
+ const updateFollowState = () => {
599
+ if (isNearMessagingBottom()) scrollToLatest('smooth');
600
+ else toggleJumpButton();
601
+ };
602
+ const canSubmit = () => Boolean(textarea && textarea.value.trim()) && !running;
603
+ const updateSubmitButtonState = () => {
604
+ if (submitButton) submitButton.disabled = !canSubmit();
605
+ };
606
+ const setRunning = (value) => {
607
+ running = value;
608
+ document.body.dataset.sessionRunning = value ? 'true' : 'false';
609
+ if (statusEl) statusEl.textContent = value ? 'Running' : 'Idle';
610
+ updateSubmitButtonState();
611
+ if (composerStatus && !value && composerStatus.textContent === 'Thinking…') {
612
+ composerStatus.textContent = '';
613
+ }
614
+ };
615
+
616
+ jumpLatestBtn?.addEventListener('click', () => {
617
+ scrollToLatest('smooth');
618
+ toggleJumpButton();
619
+ });
620
+ document.addEventListener('click', async (event) => {
621
+ const button = event.target instanceof Element ? event.target.closest('[data-copy-button]') : null;
622
+ if (!(button instanceof HTMLButtonElement)) return;
623
+ const label = button.dataset.copyLabel || 'Copy message';
624
+ const source = button.closest('.msg-actions')?.previousElementSibling;
625
+ const text = source instanceof HTMLElement ? (source.innerText || source.textContent || '').trim() : '';
626
+ if (!text) return;
627
+ const setState = (state, transient) => {
628
+ button.dataset.copyState = state;
629
+ button.title = transient;
630
+ button.setAttribute('aria-label', transient);
631
+ window.setTimeout(() => {
632
+ if (!button.isConnected) return;
633
+ delete button.dataset.copyState;
634
+ button.title = label;
635
+ button.setAttribute('aria-label', label);
636
+ }, 1200);
637
+ };
638
+ try {
639
+ await navigator.clipboard.writeText(text);
640
+ setState('done', 'Copied');
641
+ } catch {
642
+ setState('error', 'Copy failed');
643
+ }
644
+ });
645
+ window.addEventListener('scroll', toggleJumpButton, { passive: true });
646
+
647
+ if (textarea) {
648
+ const resize = () => {
649
+ textarea.style.height = 'auto';
650
+ textarea.style.height = Math.min(textarea.scrollHeight, 240) + 'px';
651
+ };
652
+ textarea.addEventListener('input', () => {
653
+ resize();
654
+ updateSubmitButtonState();
655
+ });
656
+ textarea.addEventListener('keydown', (event) => {
657
+ if (event.key !== 'Enter' || event.shiftKey) return;
658
+ if (event.isComposing || event.keyCode === 229) return;
659
+ event.preventDefault();
660
+ if (!running) form?.requestSubmit();
661
+ });
662
+ resize();
663
+ }
664
+
665
+ setRunning(running);
666
+ updateSubmitButtonState();
667
+
668
+ const streamUrl = form
669
+ ? '/session/stream?token=' + encodeURIComponent(form.token.value) + '&session=' + encodeURIComponent(form.session.value)
670
+ : null;
671
+ if (streamUrl) {
672
+ const source = new EventSource(streamUrl);
673
+ source.onmessage = (event) => {
674
+ const payload = JSON.parse(event.data);
675
+ switch (payload.type) {
676
+ case 'status':
677
+ setRunning(Boolean(payload.running));
678
+ if (payload.running && composerStatus) composerStatus.textContent = 'Thinking…';
679
+ break;
680
+ case 'user':
681
+ case 'tool':
682
+ case 'system': {
683
+ timelineList?.insertAdjacentHTML('beforeend', payload.html);
684
+ updateFollowState();
685
+ break;
686
+ }
687
+ case 'assistant': {
688
+ if (!liveAssistant || !liveAssistant.isConnected) {
689
+ timelineList?.insertAdjacentHTML('beforeend', payload.html);
690
+ liveAssistant = timelineList?.querySelector('[data-live-assistant]:last-of-type') || null;
691
+ } else {
692
+ liveAssistant.outerHTML = payload.html;
693
+ liveAssistant = timelineList?.querySelector('[data-live-assistant]:last-of-type') || null;
694
+ }
695
+ updateFollowState();
696
+ break;
697
+ }
698
+ case 'assistant_remove':
699
+ if (liveAssistant?.isConnected) liveAssistant.remove();
700
+ liveAssistant = null;
701
+ break;
702
+ case 'assistant_done':
703
+ liveAssistant = null;
704
+ break;
705
+ case 'refresh':
706
+ if (timelineList) timelineList.innerHTML = payload.timelineHtml;
707
+ liveAssistant = null;
708
+ if (updatedEl) updatedEl.textContent = payload.updatedAt;
709
+ if (entriesEl) entriesEl.textContent = String(payload.entryCount);
710
+ setRunning(Boolean(payload.running));
711
+ if (composerStatus) composerStatus.textContent = '';
712
+ updateFollowState();
713
+ break;
714
+ case 'error':
715
+ if (composerStatus) composerStatus.textContent = payload.message || 'Something went wrong';
716
+ setRunning(false);
717
+ break;
718
+ }
719
+ };
720
+ }
721
+
722
+ form?.addEventListener('submit', async (event) => {
723
+ event.preventDefault();
724
+ if (!textarea || !composerStatus) return;
725
+ const text = textarea.value.trim();
726
+ if (!text || running) return;
727
+ composerStatus.textContent = 'Sending…';
728
+ updateSubmitButtonState();
729
+ try {
730
+ const response = await fetch('/session/message', {
731
+ method: 'POST',
732
+ headers: { 'Content-Type': 'application/json' },
733
+ body: JSON.stringify({ token: form.token.value, session: form.session.value, sessionKey: form.sessionKey.value, text }),
734
+ });
735
+ const payload = await response.json();
736
+ if (!response.ok || !payload.ok) throw new Error(payload.error || 'Request failed');
737
+ textarea.value = '';
738
+ textarea.style.height = 'auto';
739
+ composerStatus.textContent = 'Thinking…';
740
+ setRunning(true);
741
+ updateSubmitButtonState();
742
+ scrollToLatest('smooth');
743
+ } catch (err) {
744
+ composerStatus.textContent = err && err.message ? err.message : String(err);
745
+ submitButton.disabled = false;
746
+ }
747
+ });
748
+
749
+ toggleJumpButton();
750
+ `;
751
+ function formatDate(value) {
752
+ const date = new Date(value);
753
+ if (Number.isNaN(date.getTime()))
754
+ return value;
755
+ return date.toLocaleString();
756
+ }
757
+ const esc = escapeHtml;
758
+ const sessionViewStyles = `
759
+ :root {
760
+ --user-bg: #18181b;
761
+ --user-text: #fafafa;
762
+ --user-time: rgba(250, 250, 250, 0.5);
763
+
764
+ --asst-border: #22c55e;
765
+ --asst-avatar-bg: #f0fdf4;
766
+ --asst-avatar-text: #16a34a;
767
+
768
+ --tool-bg: #0d1117;
769
+ --tool-header: #161b22;
770
+ --tool-text: #c9d1d9;
771
+ --tool-accent: #58a6ff;
772
+ --tool-ok: #3fb950;
773
+ --tool-err: #f85149;
774
+ --tool-time: #484f58;
775
+ }
776
+
777
+ body {
778
+
779
+ padding-bottom: calc(140px + env(safe-area-inset-bottom, 0px));
780
+ overflow-x: hidden;
781
+ }
782
+
783
+
784
+
785
+ .session-side {
786
+ display: flex; flex-direction: column; align-items: flex-end; gap: 8px;
787
+ flex-shrink: 0;
788
+ }
789
+ .session-badge {
790
+ display: inline-flex; align-items: center; gap: 8px;
791
+ padding: 6px 11px; border: 1px solid var(--border); border-radius: 999px;
792
+ background: rgba(255,255,255,0.7); font-size: 0.78rem; color: var(--muted);
793
+ line-height: 1;
794
+ }
795
+ .session-badge strong { color: var(--text); font-weight: 600; }
796
+ .session-badge-status.is-running {
797
+ background: #fff7ed; border-color: rgba(217, 119, 6, 0.18); color: #9a3412;
798
+ }
799
+ .session-badge-dot {
800
+ width: 7px; height: 7px; border-radius: 50%;
801
+ background: #a1a1aa; flex-shrink: 0;
802
+ }
803
+ .session-badge-status.is-running .session-badge-dot {
804
+ background: #d97706; box-shadow: 0 0 0 4px rgba(217, 119, 6, 0.14);
805
+ }
806
+
807
+ .session-detail-row {
808
+ display: flex; flex-wrap: wrap; gap: 8px;
809
+ padding: 12px 14px; border: 1px solid var(--border); border-radius: 14px;
810
+ background: rgba(255,255,255,0.6);
811
+ }
812
+ .session-detail {
813
+ display: inline-flex; align-items: center; gap: 8px; min-width: 0;
814
+ padding: 4px 10px; border-radius: 10px; background: rgba(0, 0, 0, 0.025);
815
+ color: var(--muted); font-size: 0.78rem;
816
+ }
817
+ .session-detail-label {
818
+ text-transform: uppercase; letter-spacing: 0.08em;
819
+ font-size: 0.68rem; color: var(--subtle);
820
+ }
821
+ .session-detail code {
822
+ min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
823
+ font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 0.74rem;
824
+ color: var(--text); padding: 0;
825
+ }
826
+
827
+
828
+
829
+ .thread-links {
830
+ display: flex;
831
+ flex-wrap: wrap;
832
+ gap: 6px;
833
+ margin-top: 10px;
834
+ }
835
+
836
+ .thread-link {
837
+ display: inline-flex;
838
+ align-items: center;
839
+ gap: 6px;
840
+ padding: 5px 10px;
841
+ border-radius: 999px;
842
+ border: 1px solid rgba(239, 68, 68, 0.18);
843
+ background: rgba(254, 242, 242, 0.95);
844
+ color: #b91c1c;
845
+ text-decoration: none;
846
+ font-size: 0.74rem;
847
+ font-weight: 600;
848
+ line-height: 1;
849
+ transition: transform 120ms, background 120ms, border-color 120ms;
850
+ }
851
+
852
+ .thread-link:hover {
853
+ transform: translateY(-1px);
854
+ background: #fff1f2;
855
+ border-color: rgba(239, 68, 68, 0.28);
856
+ }
857
+
858
+ .thread-dot {
859
+ width: 7px;
860
+ height: 7px;
861
+ border-radius: 50%;
862
+ background: #ef4444;
863
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.12);
864
+ flex-shrink: 0;
865
+ }
866
+
867
+ .thread-text {
868
+ white-space: nowrap;
869
+ }
870
+
871
+ .related-card {
872
+ padding: 18px 20px;
873
+ border: 1px solid var(--border);
874
+ border-radius: 18px;
875
+ background: rgba(255,255,255,0.78);
876
+ box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 4px 16px rgba(0,0,0,0.04);
877
+ backdrop-filter: blur(12px);
878
+ }
879
+
880
+ .related-list {
881
+ display: flex;
882
+ flex-direction: column;
883
+ gap: 10px;
884
+ }
885
+
886
+ .related-link {
887
+ display: flex;
888
+ align-items: center;
889
+ justify-content: space-between;
890
+ gap: 12px;
891
+ padding: 12px 14px;
892
+ border-radius: 14px;
893
+ border: 1px solid var(--border);
894
+ background: rgba(255,255,255,0.82);
895
+ color: inherit;
896
+ text-decoration: none;
897
+ transition: transform 120ms, border-color 120ms, box-shadow 120ms, background 120ms;
898
+ }
899
+
900
+ .related-link:hover {
901
+ transform: translateY(-1px);
902
+ border-color: rgba(0,0,0,0.16);
903
+ background: #fff;
904
+ box-shadow: 0 8px 18px rgba(0,0,0,0.05);
905
+ }
906
+
907
+ .related-copy {
908
+ min-width: 0;
909
+ display: flex;
910
+ flex-direction: column;
911
+ gap: 4px;
912
+ }
913
+
914
+ .related-title {
915
+ color: var(--text);
916
+ font-size: 0.94rem;
917
+ line-height: 1.3;
918
+ }
919
+
920
+ .related-summary {
921
+ color: var(--muted);
922
+ font-size: 0.82rem;
923
+ line-height: 1.45;
924
+ }
925
+
926
+ .related-meta {
927
+ color: var(--subtle);
928
+ font-size: 0.74rem;
929
+ line-height: 1.4;
930
+ }
931
+
932
+ .related-arrow {
933
+ flex-shrink: 0;
934
+ color: var(--subtle);
935
+ font-size: 1rem;
936
+ }
937
+
938
+ .timeline-shell {
939
+ padding: 20px 0;
940
+ }
941
+
942
+ .timeline-list {
943
+ display: flex;
944
+ flex-direction: column;
945
+ gap: 14px;
946
+ min-width: 0;
947
+ }
948
+
949
+ .copy-host {
950
+ position: relative;
951
+ }
952
+
953
+ .msg-actions {
954
+ height: 32px;
955
+ display: flex;
956
+ align-items: center;
957
+ gap: 8px;
958
+ margin-top: 8px;
959
+ opacity: 0;
960
+ visibility: hidden;
961
+ transition: opacity 140ms ease, visibility 140ms ease;
962
+ }
963
+
964
+ .copy-host:hover .msg-actions,
965
+ .copy-host .msg-actions:hover,
966
+ .copy-host:focus-within .msg-actions,
967
+ .timeline-list > .copy-host:last-child .msg-actions,
968
+ .copy-action-btn[data-copy-state] {
969
+ opacity: 1;
970
+ visibility: visible;
971
+ }
972
+
973
+ .copy-action-btn {
974
+ width: 24px;
975
+ height: 24px;
976
+ display: inline-flex;
977
+ align-items: center;
978
+ justify-content: center;
979
+ border: 0;
980
+ border-radius: 0;
981
+ background: transparent;
982
+ color: rgba(63,63,70,0.8);
983
+ transition: color 140ms ease, opacity 140ms ease;
984
+ cursor: pointer;
985
+ padding: 0;
986
+ appearance: none;
987
+ }
988
+
989
+ .copy-action-btn:hover {
990
+ background: transparent;
991
+ color: rgba(24,24,27,0.96);
992
+ border-color: transparent;
993
+ }
994
+
995
+ .copy-action-btn[data-copy-state='done'] {
996
+ background: transparent;
997
+ border-color: transparent;
998
+ color: rgba(24,24,27,0.96);
999
+ }
1000
+
1001
+ .copy-action-btn[data-copy-state='done'] svg {
1002
+ position: absolute;
1003
+ opacity: 0;
1004
+ transform: scale(0.6);
1005
+ pointer-events: none;
1006
+ }
1007
+
1008
+ .copy-action-btn svg {
1009
+ transition: opacity 140ms ease, transform 140ms ease;
1010
+ }
1011
+
1012
+ .copy-action-btn[data-copy-state='done']::before {
1013
+ content: '';
1014
+ width: 14px;
1015
+ height: 14px;
1016
+ background-color: currentColor;
1017
+ -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='4 12 10 18 20 6'/></svg>") center / contain no-repeat;
1018
+ mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='4 12 10 18 20 6'/></svg>") center / contain no-repeat;
1019
+ animation: copy-check-in 200ms ease-out both;
1020
+ }
1021
+
1022
+ @keyframes copy-check-in {
1023
+ from { opacity: 0; transform: scale(0.6); }
1024
+ to { opacity: 1; transform: scale(1); }
1025
+ }
1026
+
1027
+ @media (prefers-reduced-motion: reduce) {
1028
+ .copy-action-btn svg,
1029
+ .copy-action-btn[data-copy-state='done']::before {
1030
+ transition: none;
1031
+ animation: none;
1032
+ }
1033
+ }
1034
+
1035
+ .copy-action-btn[data-copy-state='error'] {
1036
+ background: transparent;
1037
+ border-color: transparent;
1038
+ color: #b91c1c;
1039
+ }
1040
+
1041
+
1042
+
1043
+ .msg-row {
1044
+ display: flex;
1045
+ align-items: flex-end;
1046
+ gap: 8px;
1047
+ padding: 4px 0;
1048
+ min-width: 0;
1049
+ }
1050
+
1051
+
1052
+
1053
+ .msg-user {
1054
+ justify-content: flex-end;
1055
+ }
1056
+
1057
+ .msg-main {
1058
+ min-width: 0;
1059
+ }
1060
+
1061
+ .user-main {
1062
+ max-width: 85%;
1063
+ display: flex;
1064
+ flex-direction: column;
1065
+ align-items: flex-end;
1066
+ }
1067
+
1068
+ .user-bubble {
1069
+ max-width: 100%;
1070
+ min-width: 0;
1071
+ padding: 12px 16px;
1072
+ border-radius: 18px 18px 4px 18px;
1073
+ background: var(--user-bg);
1074
+ color: var(--user-text);
1075
+ box-shadow: 0 1px 2px rgba(0,0,0,0.12);
1076
+ }
1077
+
1078
+ .msg-raw-header {
1079
+ margin-bottom: 8px;
1080
+ color: rgba(250, 250, 250, 0.72);
1081
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
1082
+ font-size: 0.72rem;
1083
+ line-height: 1.5;
1084
+ white-space: pre-wrap;
1085
+ word-break: break-word;
1086
+ }
1087
+
1088
+ .thread-badge {
1089
+ display: inline-flex;
1090
+ align-items: center;
1091
+ gap: 6px;
1092
+ margin-bottom: 8px;
1093
+ padding: 4px 10px;
1094
+ border-radius: 999px;
1095
+ background: rgba(255,255,255,0.22);
1096
+ color: var(--user-text);
1097
+ font-size: 0.68rem;
1098
+ font-weight: 700;
1099
+ letter-spacing: 0.01em;
1100
+ }
1101
+
1102
+ .thread-badge code {
1103
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
1104
+ font-size: 0.66rem;
1105
+ background: rgba(255,255,255,0.16);
1106
+ padding: 1px 6px;
1107
+ border-radius: 999px;
1108
+ color: inherit;
1109
+ }
1110
+
1111
+ .msg-user .msg-body {
1112
+ color: var(--user-text);
1113
+ }
1114
+
1115
+ .msg-user .msg-time {
1116
+ display: block;
1117
+ margin-top: 6px;
1118
+ font-size: 0.72rem;
1119
+ color: var(--user-time);
1120
+ text-align: right;
1121
+ }
1122
+
1123
+
1124
+
1125
+ .msg-avatar {
1126
+ flex: 0 0 28px;
1127
+ width: 28px;
1128
+ height: 28px;
1129
+ border-radius: 50%;
1130
+ font-size: 0.68rem;
1131
+ font-weight: 700;
1132
+ display: flex;
1133
+ align-items: center;
1134
+ justify-content: center;
1135
+ letter-spacing: 0;
1136
+ flex-shrink: 0;
1137
+ }
1138
+
1139
+ .user-avatar {
1140
+ background: #eff6ff;
1141
+ border: 1.5px solid #93c5fd;
1142
+ color: #1d4ed8;
1143
+ }
1144
+
1145
+ .asst-avatar {
1146
+ background: var(--asst-avatar-bg);
1147
+ border: 1.5px solid var(--asst-border);
1148
+ color: var(--asst-avatar-text);
1149
+ margin-bottom: 2px;
1150
+ }
1151
+
1152
+
1153
+
1154
+ .msg-assistant {
1155
+ align-items: flex-end;
1156
+ gap: 8px;
1157
+ max-width: 85%;
1158
+ min-width: 0;
1159
+ }
1160
+
1161
+ .asst-main {
1162
+ max-width: 100%;
1163
+ display: flex;
1164
+ flex-direction: column;
1165
+ align-items: flex-start;
1166
+ }
1167
+
1168
+ .asst-card {
1169
+ min-width: 0;
1170
+ max-width: 100%;
1171
+ padding: 14px 18px;
1172
+ border: 1px solid var(--border);
1173
+ border-radius: 18px 18px 18px 4px;
1174
+ background: var(--surface);
1175
+ box-shadow: 0 1px 3px rgba(0,0,0,0.04);
1176
+ }
1177
+
1178
+ .msg-assistant .msg-body {
1179
+ color: var(--text);
1180
+ }
1181
+
1182
+ .msg-assistant .msg-time {
1183
+ display: block;
1184
+ margin-top: 8px;
1185
+ font-size: 0.72rem;
1186
+ color: var(--subtle);
1187
+ }
1188
+
1189
+
1190
+
1191
+ .tool-block {
1192
+ max-width: 92%;
1193
+ margin-left: 36px;
1194
+ border-radius: 10px;
1195
+ overflow: hidden;
1196
+ border: 1px solid rgba(255,255,255,0.06);
1197
+ box-shadow: 0 2px 8px rgba(0,0,0,0.16);
1198
+ margin: 2px 0;
1199
+ }
1200
+
1201
+ .tool-header {
1202
+ display: flex;
1203
+ align-items: center;
1204
+ gap: 8px;
1205
+ padding: 8px 14px;
1206
+ background: var(--tool-header);
1207
+ border-bottom: 1px solid rgba(255,255,255,0.06);
1208
+ overflow: hidden;
1209
+ }
1210
+
1211
+ .tool-icon {
1212
+ color: var(--tool-accent);
1213
+ flex-shrink: 0;
1214
+ display: flex;
1215
+ align-items: center;
1216
+ }
1217
+
1218
+ .tool-name {
1219
+ flex: 1;
1220
+ font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
1221
+ font-size: 0.75rem;
1222
+ font-weight: 500;
1223
+ color: var(--tool-accent);
1224
+ white-space: nowrap;
1225
+ overflow: hidden;
1226
+ text-overflow: ellipsis;
1227
+ }
1228
+
1229
+ .tool-time {
1230
+ flex-shrink: 0;
1231
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
1232
+ font-size: 0.7rem;
1233
+ color: var(--tool-time);
1234
+ }
1235
+
1236
+ .tool-output {
1237
+ display: block;
1238
+ padding: 12px 14px;
1239
+ background: var(--tool-bg);
1240
+ color: var(--tool-text);
1241
+ font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
1242
+ font-size: 0.78rem;
1243
+ line-height: 1.6;
1244
+ white-space: pre-wrap;
1245
+ word-break: break-word;
1246
+ overflow-x: auto;
1247
+ max-height: 400px;
1248
+ overflow-y: auto;
1249
+ }
1250
+
1251
+ .tool-output.tone-ok { color: var(--tool-ok); }
1252
+ .tool-output.tone-err { color: var(--tool-err); }
1253
+
1254
+
1255
+
1256
+ .markdown-body {
1257
+ font-family: 'DM Sans', system-ui, sans-serif;
1258
+ font-size: 0.9rem;
1259
+ line-height: 1.65;
1260
+ word-break: break-word;
1261
+ }
1262
+
1263
+ .markdown-body > *:first-child { margin-top: 0; }
1264
+ .markdown-body > *:last-child { margin-bottom: 0; }
1265
+ .markdown-body p,
1266
+ .markdown-body ul,
1267
+ .markdown-body ol,
1268
+ .markdown-body blockquote,
1269
+ .markdown-body pre,
1270
+ .markdown-body table,
1271
+ .markdown-body hr {
1272
+ margin: 0 0 0.85em;
1273
+ }
1274
+
1275
+ .markdown-body h1,
1276
+ .markdown-body h2,
1277
+ .markdown-body h3,
1278
+ .markdown-body h4,
1279
+ .markdown-body h5,
1280
+ .markdown-body h6 {
1281
+ margin: 0 0 0.55em;
1282
+ line-height: 1.25;
1283
+ font-weight: 700;
1284
+ letter-spacing: -0.01em;
1285
+ }
1286
+
1287
+ .markdown-body h1 { font-size: 1.4rem; }
1288
+ .markdown-body h2 { font-size: 1.22rem; }
1289
+ .markdown-body h3 { font-size: 1.08rem; }
1290
+ .markdown-body h4,
1291
+ .markdown-body h5,
1292
+ .markdown-body h6 { font-size: 0.95rem; }
1293
+
1294
+ .markdown-body ul,
1295
+ .markdown-body ol {
1296
+ padding-left: 1.3em;
1297
+ }
1298
+
1299
+ .markdown-body li + li {
1300
+ margin-top: 0.22em;
1301
+ }
1302
+
1303
+ .markdown-body blockquote {
1304
+ padding-left: 12px;
1305
+ border-left: 3px solid rgba(34, 197, 94, 0.35);
1306
+ opacity: 0.95;
1307
+ }
1308
+
1309
+ .markdown-body a {
1310
+ color: inherit;
1311
+ text-decoration: underline;
1312
+ text-underline-offset: 2px;
1313
+ }
1314
+
1315
+ .markdown-body code {
1316
+ font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
1317
+ font-size: 0.82em;
1318
+ padding: 0.16em 0.38em;
1319
+ border-radius: 6px;
1320
+ }
1321
+
1322
+ .markdown-body pre {
1323
+ overflow-x: auto;
1324
+ border-radius: 12px;
1325
+ padding: 12px 14px;
1326
+ }
1327
+
1328
+ .markdown-body pre code {
1329
+ display: block;
1330
+ padding: 0;
1331
+ border-radius: 0;
1332
+ background: transparent;
1333
+ font-size: 0.82rem;
1334
+ line-height: 1.6;
1335
+ }
1336
+
1337
+ .markdown-body table {
1338
+ width: 100%;
1339
+ border-collapse: collapse;
1340
+ font-size: 0.85rem;
1341
+ }
1342
+
1343
+ .markdown-body th,
1344
+ .markdown-body td {
1345
+ padding: 8px 10px;
1346
+ border: 1px solid rgba(0, 0, 0, 0.08);
1347
+ text-align: left;
1348
+ vertical-align: top;
1349
+ }
1350
+
1351
+ .markdown-body img {
1352
+ max-width: 100%;
1353
+ border-radius: 12px;
1354
+ }
1355
+
1356
+ .markdown-user code {
1357
+ background: rgba(255,255,255,0.14);
1358
+ color: var(--user-text);
1359
+ }
1360
+
1361
+ .markdown-user pre {
1362
+ background: rgba(255,255,255,0.08);
1363
+ border: 1px solid rgba(255,255,255,0.08);
1364
+ }
1365
+
1366
+ .markdown-user table th,
1367
+ .markdown-user table td {
1368
+ border-color: rgba(255,255,255,0.16);
1369
+ }
1370
+
1371
+ .markdown-assistant code {
1372
+ background: #f4f4f5;
1373
+ color: #27272a;
1374
+ }
1375
+
1376
+ .markdown-assistant pre {
1377
+ background: #0f172a;
1378
+ color: #e5e7eb;
1379
+ }
1380
+
1381
+ .markdown-assistant pre code {
1382
+ background: transparent;
1383
+ color: inherit;
1384
+ }
1385
+
1386
+ .markdown-assistant table th,
1387
+ .markdown-assistant table td {
1388
+ border-color: rgba(0, 0, 0, 0.08);
1389
+ }
1390
+
1391
+
1392
+
1393
+ .system-event {
1394
+ display: flex;
1395
+ align-items: center;
1396
+ justify-content: center;
1397
+ gap: 6px;
1398
+ padding: 10px 0;
1399
+ color: var(--subtle);
1400
+ font-size: 0.775rem;
1401
+ }
1402
+
1403
+ .event-dot {
1404
+ width: 4px;
1405
+ height: 4px;
1406
+ border-radius: 50%;
1407
+ background: var(--subtle);
1408
+ flex-shrink: 0;
1409
+ opacity: 0.6;
1410
+ }
1411
+
1412
+ .event-text {
1413
+ color: var(--muted);
1414
+ }
1415
+
1416
+ .system-event-err .event-text {
1417
+ color: var(--err-text);
1418
+ }
1419
+
1420
+ .event-time {
1421
+ color: var(--subtle);
1422
+ font-style: normal;
1423
+ }
1424
+
1425
+
1426
+
1427
+ .stack > * + * { margin-top: 14px; }
1428
+
1429
+ p { color: var(--muted); font-size: 0.9rem; line-height: 1.5; }
1430
+
1431
+ .status {
1432
+ padding: 12px 16px;
1433
+ border-radius: 10px;
1434
+ font-size: 0.9rem;
1435
+ }
1436
+
1437
+ .status.err {
1438
+ background: var(--err-bg);
1439
+ color: var(--err-text);
1440
+ border: 1px solid rgba(185, 28, 28, 0.12);
1441
+ }
1442
+
1443
+
1444
+
1445
+ .composer-card {
1446
+ position: fixed;
1447
+ left: calc(72px + (100vw - 72px) / 2);
1448
+ bottom: calc(16px + env(safe-area-inset-bottom, 0px));
1449
+ transform: translateX(-50%);
1450
+ width: min(960px, calc(100vw - 96px));
1451
+ padding: 10px 12px 10px 14px;
1452
+ border: 1px solid var(--border);
1453
+ border-radius: 22px;
1454
+ background: rgba(250, 248, 244, 0.92);
1455
+ box-shadow: 0 12px 36px rgba(0,0,0,0.10), 0 2px 6px rgba(0,0,0,0.04);
1456
+ backdrop-filter: blur(14px);
1457
+ -webkit-backdrop-filter: blur(14px);
1458
+ z-index: 20;
1459
+ }
1460
+
1461
+ .composer-form {
1462
+ display: flex;
1463
+ flex-direction: column;
1464
+ gap: 6px;
1465
+ }
1466
+
1467
+ .jump-latest-btn {
1468
+ position: fixed;
1469
+ left: calc(72px + (100vw - 72px) / 2);
1470
+ bottom: calc(env(safe-area-inset-bottom, 0px) + 120px);
1471
+ z-index: 25;
1472
+ width: 42px;
1473
+ height: 42px;
1474
+ border: 1px solid var(--border);
1475
+ border-radius: 999px;
1476
+ background: var(--bg);
1477
+ color: var(--text);
1478
+ font: 700 1rem/1 'DM Sans', sans-serif;
1479
+ box-shadow: 0 10px 30px rgba(0,0,0,0.12);
1480
+ cursor: pointer;
1481
+ backdrop-filter: blur(10px);
1482
+ transform: translateX(-50%);
1483
+ outline: none;
1484
+ appearance: none;
1485
+ -webkit-tap-highlight-color: transparent;
1486
+ }
1487
+
1488
+ .jump-latest-btn:hover {
1489
+ transform: translateX(-50%) translateY(-1px);
1490
+ background: #e8e3d9;
1491
+ }
1492
+
1493
+ .jump-latest-btn:focus,
1494
+ .jump-latest-btn:active {
1495
+ outline: none;
1496
+ }
1497
+
1498
+ .jump-latest-btn:focus-visible {
1499
+ box-shadow: 0 10px 30px rgba(0,0,0,0.12), 0 0 0 3px rgba(0,0,0,0.08);
1500
+ }
1501
+
1502
+ .composer-copy { margin-bottom: 12px; color: var(--muted); }
1503
+
1504
+ .composer-form textarea {
1505
+ width: 100%;
1506
+ resize: none;
1507
+ overflow-y: auto;
1508
+ min-height: 28px;
1509
+ max-height: 200px;
1510
+ padding: 6px 6px 2px;
1511
+ border: 0;
1512
+ border-radius: 0;
1513
+ font: inherit;
1514
+ color: var(--text);
1515
+ background: transparent;
1516
+ }
1517
+
1518
+ .composer-form textarea::placeholder {
1519
+ color: rgba(63,63,70,0.55);
1520
+ }
1521
+
1522
+ .composer-form textarea:focus {
1523
+ outline: none;
1524
+ border: 0;
1525
+ }
1526
+
1527
+ .composer-actions {
1528
+ display: flex;
1529
+ align-items: center;
1530
+ justify-content: space-between;
1531
+ gap: 12px;
1532
+ margin-top: 0;
1533
+ }
1534
+
1535
+ .composer-status { color: var(--muted); font-size: 13px; }
1536
+ .composer-actions button:disabled { opacity: 0.55; cursor: wait; }
1537
+
1538
+ .composer-send-btn {
1539
+ display: inline-flex;
1540
+ align-items: center;
1541
+ justify-content: center;
1542
+ width: 32px;
1543
+ height: 32px;
1544
+ border: none;
1545
+ border-radius: 999px;
1546
+ background: #d97706;
1547
+ color: #ffffff;
1548
+ font: 700 1rem/1 'DM Sans', sans-serif;
1549
+ cursor: pointer;
1550
+ box-shadow: 0 10px 24px rgba(217, 119, 6, 0.26);
1551
+ transition: transform 120ms, filter 120ms, box-shadow 120ms, background 120ms;
1552
+ }
1553
+
1554
+ .composer-send-btn:hover:not(:disabled) {
1555
+ transform: translateY(-1px);
1556
+ filter: saturate(1.06) brightness(0.98);
1557
+ box-shadow: 0 12px 28px rgba(217, 119, 6, 0.32);
1558
+ }
1559
+
1560
+ .composer-send-btn:focus-visible {
1561
+ outline: 2px solid rgba(217, 119, 6, 0.28);
1562
+ outline-offset: 3px;
1563
+ }
1564
+
1565
+ .composer-send-btn:disabled {
1566
+ background: #d4d4d8;
1567
+ color: rgba(24, 24, 27, 0.45);
1568
+ box-shadow: none;
1569
+ transform: none;
1570
+ filter: none;
1571
+ cursor: not-allowed;
1572
+ opacity: 1;
1573
+ }
1574
+
1575
+
1576
+
1577
+ @media (max-width: 900px) {
1578
+ .composer-card {
1579
+ left: 50%;
1580
+ width: min(960px, calc(100vw - 24px));
1581
+ }
1582
+ .jump-latest-btn { left: 50%; }
1583
+ }
1584
+
1585
+ @media (max-width: 600px) {
1586
+ body { padding-bottom: calc(130px + env(safe-area-inset-bottom, 0px)); }
1587
+
1588
+ .composer-card {
1589
+ width: calc(100vw - 16px);
1590
+ bottom: calc(8px + env(safe-area-inset-bottom, 0px));
1591
+ padding: 8px 10px;
1592
+ border-radius: 18px;
1593
+ }
1594
+
1595
+ .session-side { align-items: flex-start; flex-direction: row; }
1596
+
1597
+ .user-bubble,
1598
+ .msg-assistant,
1599
+ .tool-block { max-width: 100%; }
1600
+
1601
+ .asst-avatar { display: none; }
1602
+
1603
+ .asst-card { border-radius: 4px 14px 14px 14px; }
1604
+ }
1605
+ `;
1606
+ function entryIsoTime(entry) {
1607
+ if (!entry || typeof entry.timestamp !== "number" || !Number.isFinite(entry.timestamp)) {
1608
+ return undefined;
1609
+ }
1610
+ return new Date(entry.timestamp).toISOString();
1611
+ }
1612
+ export async function loadSessionViewModel(office, sessionKey) {
1613
+ const sm = await SessionStore.inspect(office, sessionKey);
1614
+ if (!sm)
1615
+ throw new Error(`Session not found: ${sessionKey}`);
1616
+ const header = sm.getHeader();
1617
+ const entries = await sm.getEntries();
1618
+ const updatedAt = entryIsoTime(entries.at(-1)) ?? new Date(header.createdAt).toISOString();
1619
+ const title = (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`;
1620
+ const listing = await SessionStore.list(office);
1621
+ const parentListing = listing.find((session) => session.id === header.parentSessionId);
1622
+ const parent = parentListing ? await buildSessionRelation(office, parentListing) : undefined;
1623
+ const threads = [];
1624
+ for (const child of listing.filter((session) => session.parentSessionId === header.id)) {
1625
+ const relation = await buildSessionRelation(office, child);
1626
+ if (relation)
1627
+ threads.push(relation);
1628
+ }
1629
+ threads.sort((a, b) => (a.updatedAt < b.updatedAt ? -1 : a.updatedAt > b.updatedAt ? 1 : 0));
1630
+ const threadsByEntryId = new Map();
1631
+ for (const thread of threads) {
1632
+ if (!thread.anchorEntryId)
1633
+ continue;
1634
+ const bucket = threadsByEntryId.get(thread.anchorEntryId) ?? [];
1635
+ bucket.push(thread);
1636
+ threadsByEntryId.set(thread.anchorEntryId, bucket);
1637
+ }
1638
+ const items = entries.flatMap((entry) => {
1639
+ const item = mapEntryToItem(entry);
1640
+ if (!item)
1641
+ return [];
1642
+ const anchoredThreads = item.entryId ? threadsByEntryId.get(item.entryId) : undefined;
1643
+ if (anchoredThreads)
1644
+ item.threads = anchoredThreads;
1645
+ return [item];
1646
+ });
1647
+ return {
1648
+ sessionId: header.id,
1649
+ sessionKey,
1650
+ title,
1651
+ createdAt: new Date(header.createdAt).toISOString(),
1652
+ updatedAt,
1653
+ entryCount: entries.length,
1654
+ items,
1655
+ parent: parent ?? undefined,
1656
+ };
1657
+ }
1658
+ async function buildSessionRelation(office, session) {
1659
+ const sm = await SessionStore.inspect(office, session.key);
1660
+ if (!sm)
1661
+ return null;
1662
+ const header = sm.getHeader();
1663
+ const entries = await sm.getEntries();
1664
+ return {
1665
+ sessionKey: session.key,
1666
+ title: (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`,
1667
+ updatedAt: entryIsoTime(entries.at(-1)) ?? new Date(header.createdAt).toISOString(),
1668
+ entryCount: entries.length,
1669
+ summary: extractSessionSummary(entries),
1670
+ anchorEntryId: session.forkEntryId,
1671
+ };
1672
+ }
1673
+ function extractSessionSummary(entries) {
1674
+ for (const entry of entries) {
1675
+ if (entry.type !== "message")
1676
+ continue;
1677
+ const item = mapEntryToItem(entry);
1678
+ if (!item?.body)
1679
+ continue;
1680
+ return collapseSummary(item.body);
1681
+ }
1682
+ return undefined;
1683
+ }
1684
+ function collapseSummary(text) {
1685
+ const singleLine = text.replace(/\s+/g, " ").trim();
1686
+ return singleLine.length > 96 ? `${singleLine.slice(0, 93)}…` : singleLine;
1687
+ }
1688
+ function mapEntryToItem(entry) {
1689
+ switch (entry.type) {
1690
+ case "message":
1691
+ return mapMessageEntry(entry);
1692
+ case "compaction":
1693
+ return mapCompactionEntry(entry);
1694
+ case "custom":
1695
+ return {
1696
+ kind: "system",
1697
+ title: `Custom data · ${entry.customType}`,
1698
+ body: entry.data === undefined ? "(no data)" : JSON.stringify(entry.data, null, 2),
1699
+ meta: entryIsoTime(entry) ?? "",
1700
+ tone: "muted",
1701
+ };
1702
+ default:
1703
+ return null;
1704
+ }
1705
+ }
1706
+ function mapMessageEntry(entry) {
1707
+ const message = entry.message;
1708
+ switch (message.role) {
1709
+ case "user":
1710
+ return {
1711
+ kind: "user",
1712
+ title: "User",
1713
+ body: contentToText(message.content),
1714
+ meta: entryIsoTime(entry) ?? "",
1715
+ entryId: entry.id,
1716
+ };
1717
+ case "assistant": {
1718
+ const assistantBody = contentToText(message.content) || (message.errorMessage ? `_${message.errorMessage}_` : "");
1719
+ const metaParts = [message.provider, message.model, message.stopReason].filter(Boolean);
1720
+ return {
1721
+ kind: "assistant",
1722
+ title: "Assistant",
1723
+ body: assistantBody,
1724
+ meta: metaParts.length > 0
1725
+ ? `${entryIsoTime(entry) ?? ""} · ${metaParts.join(" · ")}`
1726
+ : (entryIsoTime(entry) ?? ""),
1727
+ entryId: entry.id,
1728
+ };
1729
+ }
1730
+ case "toolResult":
1731
+ return {
1732
+ kind: "tool",
1733
+ title: `Tool result · ${String(message.toolName ?? "unknown")}`,
1734
+ body: contentToText(message.content),
1735
+ meta: entryIsoTime(entry) ?? "",
1736
+ tone: message.isError ? "err" : "ok",
1737
+ entryId: entry.id,
1738
+ };
1739
+ case "bashExecution": {
1740
+ const command = String(message.command ?? "").trim();
1741
+ const output = String(message.output ?? "").trim();
1742
+ const details = [
1743
+ typeof message.exitCode === "number" ? `[exitCode] ${message.exitCode}` : "",
1744
+ message.cancelled ? `[cancelled] true` : "",
1745
+ message.truncated ? `[truncated] true` : "",
1746
+ ].filter(Boolean);
1747
+ const body = [command ? `$ ${command}` : "", output, ...details].filter(Boolean).join("\n\n");
1748
+ return {
1749
+ kind: "tool",
1750
+ title: "Bash execution",
1751
+ body: body || "(no output)",
1752
+ meta: entryIsoTime(entry) ?? "",
1753
+ entryId: entry.id,
1754
+ };
1755
+ }
1756
+ case "custom":
1757
+ return {
1758
+ kind: "system",
1759
+ title: `Custom message · ${String(message.customType ?? "custom")}`,
1760
+ body: contentToText(message.content),
1761
+ meta: entryIsoTime(entry) ?? "",
1762
+ tone: "muted",
1763
+ entryId: entry.id,
1764
+ };
1765
+ case "branchSummary":
1766
+ return {
1767
+ kind: "system",
1768
+ title: "Session summary",
1769
+ body: String(message.summary ?? ""),
1770
+ meta: entryIsoTime(entry) ?? "",
1771
+ tone: "muted",
1772
+ entryId: entry.id,
1773
+ };
1774
+ case "compactionSummary":
1775
+ return {
1776
+ kind: "system",
1777
+ title: "Compaction summary",
1778
+ body: String(message.summary ?? ""),
1779
+ meta: entryIsoTime(entry) ?? "",
1780
+ tone: "muted",
1781
+ entryId: entry.id,
1782
+ };
1783
+ default:
1784
+ return {
1785
+ kind: "system",
1786
+ title: `Message · ${String(message.role ?? "unknown")}`,
1787
+ body: contentToText(message.content),
1788
+ meta: entryIsoTime(entry) ?? "",
1789
+ tone: "muted",
1790
+ entryId: entry.id,
1791
+ };
1792
+ }
1793
+ }
1794
+ function mapCompactionEntry(entry) {
1795
+ return {
1796
+ kind: "system",
1797
+ title: "Context compacted",
1798
+ body: entry.summary,
1799
+ meta: entryIsoTime(entry) ?? "",
1800
+ tone: "muted",
1801
+ };
1802
+ }
1803
+ function contentToText(content) {
1804
+ if (typeof content === "string")
1805
+ return content;
1806
+ if (!Array.isArray(content))
1807
+ return "";
1808
+ const lines = [];
1809
+ for (const block of content) {
1810
+ if (!block || typeof block !== "object")
1811
+ continue;
1812
+ const value = block;
1813
+ if (value.type === "text" && typeof value.text === "string") {
1814
+ lines.push(value.text);
1815
+ continue;
1816
+ }
1817
+ if (value.type === "thinking" && typeof value.thinking === "string") {
1818
+ lines.push(`[thinking]\n${value.thinking}`);
1819
+ continue;
1820
+ }
1821
+ if (value.type === "toolCall") {
1822
+ const name = typeof value.name === "string" ? value.name : "tool";
1823
+ const args = value.arguments === undefined ? "" : JSON.stringify(value.arguments, null, 2);
1824
+ lines.push([`[toolCall] ${name}`, args].filter(Boolean).join("\n"));
1825
+ continue;
1826
+ }
1827
+ if (value.type === "image") {
1828
+ lines.push(`[image ${String(value.mimeType ?? "unknown")}]`);
1829
+ }
1830
+ }
1831
+ return lines.join("\n\n");
1832
+ }
1833
+ //# sourceMappingURL=portal.js.map