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