@geminixiang/mikan 1.0.0-beta.8 → 1.0.0-beta.80

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 (900) hide show
  1. package/CHANGELOG.md +1149 -0
  2. package/README.md +98 -38
  3. package/dist/adapters/commands/admin.d.ts.map +1 -0
  4. package/dist/{commands → adapters/commands}/admin.js +12 -9
  5. package/dist/adapters/commands/admin.js.map +1 -0
  6. package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
  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/{commands → adapters/commands}/sandbox.d.ts +0 -1
  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/{commands → adapters/commands}/session-view.js +21 -16
  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/{commands → adapters/commands}/utils.js +15 -1
  42. package/dist/adapters/commands/utils.js.map +1 -0
  43. package/dist/adapters/discord/bot.d.ts +10 -17
  44. package/dist/adapters/discord/bot.d.ts.map +1 -1
  45. package/dist/adapters/discord/bot.js +232 -297
  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 +55 -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 +90 -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/bot.d.ts +25 -9
  63. package/dist/adapters/github/bot.d.ts.map +1 -1
  64. package/dist/adapters/github/bot.js +326 -154
  65. package/dist/adapters/github/bot.js.map +1 -1
  66. package/dist/adapters/github/client.d.ts +35 -23
  67. package/dist/adapters/github/client.d.ts.map +1 -1
  68. package/dist/adapters/github/client.js +121 -28
  69. package/dist/adapters/github/client.js.map +1 -1
  70. package/dist/adapters/github/context.d.ts +3 -8
  71. package/dist/adapters/github/context.d.ts.map +1 -1
  72. package/dist/adapters/github/context.js +64 -131
  73. package/dist/adapters/github/context.js.map +1 -1
  74. package/dist/adapters/github/github-ops.d.ts +22 -0
  75. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  76. package/dist/adapters/github/github-ops.js +277 -0
  77. package/dist/adapters/github/github-ops.js.map +1 -0
  78. package/dist/adapters/github/ids.d.ts +2 -23
  79. package/dist/adapters/github/ids.d.ts.map +1 -1
  80. package/dist/adapters/github/ids.js +6 -36
  81. package/dist/adapters/github/ids.js.map +1 -1
  82. package/dist/adapters/github/repo.d.ts +8 -0
  83. package/dist/adapters/github/repo.d.ts.map +1 -0
  84. package/dist/adapters/github/repo.js +92 -0
  85. package/dist/adapters/github/repo.js.map +1 -0
  86. package/dist/adapters/github/tool-pack.d.ts +4 -0
  87. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  88. package/dist/adapters/github/tool-pack.js +45 -0
  89. package/dist/adapters/github/tool-pack.js.map +1 -0
  90. package/dist/adapters/github/tools/checks.d.ts +14 -0
  91. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  92. package/dist/adapters/github/tools/checks.js +80 -0
  93. package/dist/adapters/github/tools/checks.js.map +1 -0
  94. package/dist/adapters/github/tools/issue.d.ts +18 -0
  95. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  96. package/dist/adapters/github/tools/issue.js +44 -0
  97. package/dist/adapters/github/tools/issue.js.map +1 -0
  98. package/dist/adapters/github/tools/pr.d.ts +17 -0
  99. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  100. package/dist/adapters/github/tools/pr.js +42 -0
  101. package/dist/adapters/github/tools/pr.js.map +1 -0
  102. package/dist/adapters/github/tools/read.d.ts +17 -0
  103. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  104. package/dist/adapters/github/tools/read.js +134 -0
  105. package/dist/adapters/github/tools/read.js.map +1 -0
  106. package/dist/adapters/github/tools/review-reply.d.ts +14 -0
  107. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  108. package/dist/adapters/github/tools/review-reply.js +34 -0
  109. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  110. package/dist/adapters/github/tools/sync.d.ts +13 -0
  111. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  112. package/dist/adapters/github/tools/sync.js +29 -0
  113. package/dist/adapters/github/tools/sync.js.map +1 -0
  114. package/dist/adapters/github/types.d.ts +197 -18
  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 +6 -0
  118. package/dist/adapters/github/webhook.d.ts.map +1 -0
  119. package/dist/adapters/github/webhook.js +62 -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 +74 -31
  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/{platform-messages.d.ts → adapters/messages.d.ts} +3 -2
  130. package/dist/adapters/messages.d.ts.map +1 -0
  131. package/dist/{platform-messages.js → adapters/messages.js} +4 -1
  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 +423 -0
  136. package/dist/adapters/progressive-renderer.js.map +1 -0
  137. package/dist/adapters/shared.d.ts +24 -53
  138. package/dist/adapters/shared.d.ts.map +1 -1
  139. package/dist/adapters/shared.js +140 -91
  140. package/dist/adapters/shared.js.map +1 -1
  141. package/dist/adapters/slack/assistant.d.ts +23 -0
  142. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  143. package/dist/adapters/slack/assistant.js +109 -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 +84 -148
  152. package/dist/adapters/slack/blocks.js.map +1 -1
  153. package/dist/adapters/slack/bot.d.ts +51 -39
  154. package/dist/adapters/slack/bot.d.ts.map +1 -1
  155. package/dist/adapters/slack/bot.js +892 -567
  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 +221 -347
  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 +6 -0
  190. package/dist/adapters/slack/task-status.d.ts.map +1 -0
  191. package/dist/adapters/slack/task-status.js +100 -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 +8 -18
  209. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  210. package/dist/adapters/telegram/bot.js +114 -232
  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 +47 -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 +89 -16
  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 +27 -0
  227. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  228. package/dist/adapters/web/admin/portal.js +1506 -0
  229. package/dist/adapters/web/admin/portal.js.map +1 -0
  230. package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
  231. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  232. package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
  233. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  234. package/dist/adapters/web/admin/types.d.ts +56 -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/{web → adapters/web}/login/oauth.js +61 -100
  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/{web → adapters/web}/login/portal.js +169 -159
  244. package/dist/adapters/web/login/portal.js.map +1 -0
  245. package/dist/{web → adapters/web}/login/types.d.ts +1 -17
  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/{portal-shell.js → adapters/web/portal-shell.js} +73 -11
  251. package/dist/adapters/web/portal-shell.js.map +1 -0
  252. package/dist/adapters/web/server.d.ts +33 -0
  253. package/dist/adapters/web/server.d.ts.map +1 -0
  254. package/dist/{web → adapters/web}/server.js +15 -9
  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/{web → adapters/web}/session-view/portal.js +641 -181
  259. package/dist/adapters/web/session-view/portal.js.map +1 -0
  260. package/dist/{web → adapters/web}/session-view/types.d.ts +1 -6
  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/{web → adapters/web}/token-store.d.ts +0 -3
  264. package/dist/adapters/web/token-store.d.ts.map +1 -0
  265. package/dist/{web → adapters/web}/token-store.js +1 -3
  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 +81 -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/office.d.ts +2 -0
  281. package/dist/cli/office.d.ts.map +1 -0
  282. package/dist/cli/office.js +151 -0
  283. package/dist/cli/office.js.map +1 -0
  284. package/dist/cli/onboard.d.ts +8 -0
  285. package/dist/cli/onboard.d.ts.map +1 -0
  286. package/dist/cli/onboard.js +195 -0
  287. package/dist/cli/onboard.js.map +1 -0
  288. package/dist/cli/process-lifecycle.d.ts +14 -0
  289. package/dist/cli/process-lifecycle.d.ts.map +1 -0
  290. package/dist/cli/process-lifecycle.js +61 -0
  291. package/dist/cli/process-lifecycle.js.map +1 -0
  292. package/dist/cli/sandbox.d.ts +3 -0
  293. package/dist/cli/sandbox.d.ts.map +1 -0
  294. package/dist/cli/sandbox.js +80 -0
  295. package/dist/cli/sandbox.js.map +1 -0
  296. package/dist/cli/sessions.d.ts +2 -0
  297. package/dist/cli/sessions.d.ts.map +1 -0
  298. package/dist/cli/sessions.js +78 -0
  299. package/dist/cli/sessions.js.map +1 -0
  300. package/dist/cli/types.d.ts +21 -0
  301. package/dist/cli/types.d.ts.map +1 -0
  302. package/dist/cli/types.js.map +1 -0
  303. package/dist/env-manifest.d.ts +17 -0
  304. package/dist/env-manifest.d.ts.map +1 -0
  305. package/dist/env-manifest.js +249 -0
  306. package/dist/env-manifest.js.map +1 -0
  307. package/dist/events/index.d.ts +122 -0
  308. package/dist/events/index.d.ts.map +1 -0
  309. package/dist/events/index.js +299 -0
  310. package/dist/events/index.js.map +1 -0
  311. package/dist/events/scheduler.d.ts +25 -0
  312. package/dist/events/scheduler.d.ts.map +1 -0
  313. package/dist/events/scheduler.js +223 -0
  314. package/dist/events/scheduler.js.map +1 -0
  315. package/dist/file-guards.d.ts +13 -0
  316. package/dist/file-guards.d.ts.map +1 -0
  317. package/dist/file-guards.js +104 -0
  318. package/dist/file-guards.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 +156 -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 +19 -17
  332. package/dist/harness/index.d.ts.map +1 -1
  333. package/dist/harness/index.js +12 -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/mcp-result.d.ts +20 -0
  340. package/dist/harness/mcp-result.d.ts.map +1 -0
  341. package/dist/harness/mcp-result.js +179 -0
  342. package/dist/harness/mcp-result.js.map +1 -0
  343. package/dist/harness/mcp.d.ts +17 -0
  344. package/dist/harness/mcp.d.ts.map +1 -0
  345. package/dist/harness/mcp.js +243 -0
  346. package/dist/harness/mcp.js.map +1 -0
  347. package/dist/harness/models.d.ts +2 -19
  348. package/dist/harness/models.d.ts.map +1 -1
  349. package/dist/harness/models.js +42 -94
  350. package/dist/harness/models.js.map +1 -1
  351. package/dist/harness/open-connector.d.ts +12 -0
  352. package/dist/harness/open-connector.d.ts.map +1 -0
  353. package/dist/harness/open-connector.js +160 -0
  354. package/dist/harness/open-connector.js.map +1 -0
  355. package/dist/harness/presenter.d.ts +11 -0
  356. package/dist/harness/presenter.d.ts.map +1 -0
  357. package/dist/harness/presenter.js +824 -0
  358. package/dist/harness/presenter.js.map +1 -0
  359. package/dist/harness/prompt.d.ts +18 -0
  360. package/dist/harness/prompt.d.ts.map +1 -0
  361. package/dist/harness/prompt.js +403 -0
  362. package/dist/harness/prompt.js.map +1 -0
  363. package/dist/harness/runner.d.ts +2 -123
  364. package/dist/harness/runner.d.ts.map +1 -1
  365. package/dist/harness/runner.js +547 -415
  366. package/dist/harness/runner.js.map +1 -1
  367. package/dist/harness/session.d.ts +98 -0
  368. package/dist/harness/session.d.ts.map +1 -0
  369. package/dist/harness/session.js +645 -0
  370. package/dist/harness/session.js.map +1 -0
  371. package/dist/harness/skills.d.ts +7 -41
  372. package/dist/harness/skills.d.ts.map +1 -1
  373. package/dist/harness/skills.js +101 -55
  374. package/dist/harness/skills.js.map +1 -1
  375. package/dist/harness/subagent-profiles.d.ts +3 -0
  376. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  377. package/dist/harness/subagent-profiles.js +260 -0
  378. package/dist/harness/subagent-profiles.js.map +1 -0
  379. package/dist/harness/subagent.d.ts +39 -0
  380. package/dist/harness/subagent.d.ts.map +1 -0
  381. package/dist/harness/subagent.js +618 -0
  382. package/dist/harness/subagent.js.map +1 -0
  383. package/dist/harness/tool-args.d.ts +2 -0
  384. package/dist/harness/tool-args.d.ts.map +1 -0
  385. package/dist/harness/tool-args.js +20 -0
  386. package/dist/harness/tool-args.js.map +1 -0
  387. package/dist/harness/tools/attach.d.ts +13 -0
  388. package/dist/harness/tools/attach.d.ts.map +1 -0
  389. package/dist/{adapters/slack → harness}/tools/attach.js +2 -2
  390. package/dist/harness/tools/attach.js.map +1 -0
  391. package/dist/harness/tools/event.d.ts +28 -0
  392. package/dist/harness/tools/event.d.ts.map +1 -0
  393. package/dist/harness/tools/event.js +166 -0
  394. package/dist/harness/tools/event.js.map +1 -0
  395. package/dist/harness/tools/generate-image.d.ts +20 -0
  396. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  397. package/dist/harness/tools/generate-image.js +68 -0
  398. package/dist/harness/tools/generate-image.js.map +1 -0
  399. package/dist/harness/tools/host-fn-tool.d.ts +14 -0
  400. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  401. package/dist/harness/tools/host-fn-tool.js +39 -0
  402. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  403. package/dist/harness/tools/index.d.ts +34 -0
  404. package/dist/harness/tools/index.d.ts.map +1 -0
  405. package/dist/harness/tools/index.js +49 -0
  406. package/dist/harness/tools/index.js.map +1 -0
  407. package/dist/harness/tools/jev-browser.d.ts +42 -0
  408. package/dist/harness/tools/jev-browser.d.ts.map +1 -0
  409. package/dist/harness/tools/jev-browser.js +547 -0
  410. package/dist/harness/tools/jev-browser.js.map +1 -0
  411. package/dist/harness/tools/jev.d.ts +15 -0
  412. package/dist/harness/tools/jev.d.ts.map +1 -0
  413. package/dist/harness/tools/jev.js +98 -0
  414. package/dist/harness/tools/jev.js.map +1 -0
  415. package/dist/harness/tools/pi-tools.d.ts +8 -0
  416. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  417. package/dist/harness/tools/pi-tools.js +55 -0
  418. package/dist/harness/tools/pi-tools.js.map +1 -0
  419. package/dist/harness/tools/react.d.ts +11 -0
  420. package/dist/harness/tools/react.d.ts.map +1 -0
  421. package/dist/harness/tools/react.js +24 -0
  422. package/dist/harness/tools/react.js.map +1 -0
  423. package/dist/harness/tools/sandbox.d.ts +24 -0
  424. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  425. package/dist/{tools → harness/tools}/sandbox.js +15 -9
  426. package/dist/harness/tools/sandbox.js.map +1 -0
  427. package/dist/harness/tools/secret-redaction.d.ts +9 -0
  428. package/dist/harness/tools/secret-redaction.d.ts.map +1 -0
  429. package/dist/harness/tools/secret-redaction.js +44 -0
  430. package/dist/harness/tools/secret-redaction.js.map +1 -0
  431. package/dist/harness/tools/subagent.d.ts +51 -0
  432. package/dist/harness/tools/subagent.d.ts.map +1 -0
  433. package/dist/harness/tools/subagent.js +581 -0
  434. package/dist/harness/tools/subagent.js.map +1 -0
  435. package/dist/harness/tools/task.d.ts +22 -0
  436. package/dist/harness/tools/task.d.ts.map +1 -0
  437. package/dist/harness/tools/task.js +80 -0
  438. package/dist/harness/tools/task.js.map +1 -0
  439. package/dist/harness/tools/types.d.ts +14 -0
  440. package/dist/harness/tools/types.d.ts.map +1 -0
  441. package/dist/harness/tools/types.js.map +1 -0
  442. package/dist/harness/types.d.ts +345 -29
  443. package/dist/harness/types.d.ts.map +1 -1
  444. package/dist/harness/types.js +1 -1
  445. package/dist/harness/types.js.map +1 -1
  446. package/dist/index.d.ts +36 -9
  447. package/dist/index.d.ts.map +1 -1
  448. package/dist/index.js +19 -7
  449. package/dist/index.js.map +1 -1
  450. package/dist/log.d.ts +0 -1
  451. package/dist/log.d.ts.map +1 -1
  452. package/dist/log.js +3 -13
  453. package/dist/log.js.map +1 -1
  454. package/dist/main.js +300 -217
  455. package/dist/main.js.map +1 -1
  456. package/dist/memory-capture/index.d.ts +15 -0
  457. package/dist/memory-capture/index.d.ts.map +1 -0
  458. package/dist/memory-capture/index.js +199 -0
  459. package/dist/memory-capture/index.js.map +1 -0
  460. package/dist/memory-capture/types.d.ts +27 -0
  461. package/dist/memory-capture/types.d.ts.map +1 -0
  462. package/dist/memory-capture/types.js +2 -0
  463. package/dist/memory-capture/types.js.map +1 -0
  464. package/dist/observability/index.d.ts +30 -0
  465. package/dist/observability/index.d.ts.map +1 -0
  466. package/dist/observability/index.js +273 -0
  467. package/dist/observability/index.js.map +1 -0
  468. package/dist/observability/instrument.js +9 -6
  469. package/dist/observability/instrument.js.map +1 -1
  470. package/dist/observability/otel.d.ts +10 -0
  471. package/dist/observability/otel.d.ts.map +1 -0
  472. package/dist/observability/otel.js +182 -0
  473. package/dist/observability/otel.js.map +1 -0
  474. package/dist/observability/sentry.d.ts +32 -13
  475. package/dist/observability/sentry.d.ts.map +1 -1
  476. package/dist/observability/sentry.js +85 -58
  477. package/dist/observability/sentry.js.map +1 -1
  478. package/dist/observability/types.d.ts +30 -3
  479. package/dist/observability/types.d.ts.map +1 -1
  480. package/dist/observability/types.js.map +1 -1
  481. package/dist/office/index.d.ts +74 -0
  482. package/dist/office/index.d.ts.map +1 -0
  483. package/dist/office/index.js +971 -0
  484. package/dist/office/index.js.map +1 -0
  485. package/dist/office/projection.d.ts +11 -0
  486. package/dist/office/projection.d.ts.map +1 -0
  487. package/dist/office/projection.js +146 -0
  488. package/dist/office/projection.js.map +1 -0
  489. package/dist/office/types.d.ts +55 -0
  490. package/dist/office/types.d.ts.map +1 -0
  491. package/dist/office/types.js +2 -0
  492. package/dist/office/types.js.map +1 -0
  493. package/dist/runtime/conversation-runtime.d.ts +0 -1
  494. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  495. package/dist/runtime/conversation-runtime.js +375 -152
  496. package/dist/runtime/conversation-runtime.js.map +1 -1
  497. package/dist/runtime/session-lifecycle.d.ts +66 -0
  498. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  499. package/dist/runtime/session-lifecycle.js +393 -0
  500. package/dist/runtime/session-lifecycle.js.map +1 -0
  501. package/dist/runtime/types.d.ts +41 -17
  502. package/dist/runtime/types.d.ts.map +1 -1
  503. package/dist/runtime/types.js.map +1 -1
  504. package/dist/sandbox/cloudflare.d.ts +4 -0
  505. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  506. package/dist/sandbox/cloudflare.js +59 -55
  507. package/dist/sandbox/cloudflare.js.map +1 -1
  508. package/dist/sandbox/container.d.ts +3 -0
  509. package/dist/sandbox/container.d.ts.map +1 -1
  510. package/dist/sandbox/container.js +39 -20
  511. package/dist/sandbox/container.js.map +1 -1
  512. package/dist/sandbox/host.d.ts +3 -0
  513. package/dist/sandbox/host.d.ts.map +1 -1
  514. package/dist/sandbox/host.js +42 -35
  515. package/dist/sandbox/host.js.map +1 -1
  516. package/dist/sandbox/identity.d.ts +13 -0
  517. package/dist/sandbox/identity.d.ts.map +1 -0
  518. package/dist/sandbox/identity.js +49 -0
  519. package/dist/sandbox/identity.js.map +1 -0
  520. package/dist/sandbox/index.d.ts +5 -15
  521. package/dist/sandbox/index.d.ts.map +1 -1
  522. package/dist/sandbox/index.js +5 -51
  523. package/dist/sandbox/index.js.map +1 -1
  524. package/dist/sandbox/layout.d.ts +7 -0
  525. package/dist/sandbox/layout.d.ts.map +1 -0
  526. package/dist/sandbox/layout.js +13 -0
  527. package/dist/sandbox/layout.js.map +1 -0
  528. package/dist/{provisioner.d.ts → sandbox/provisioner.d.ts} +41 -4
  529. package/dist/sandbox/provisioner.d.ts.map +1 -0
  530. package/dist/sandbox/provisioner.js +971 -0
  531. package/dist/sandbox/provisioner.js.map +1 -0
  532. package/dist/sandbox/registry.d.ts +12 -0
  533. package/dist/sandbox/registry.d.ts.map +1 -0
  534. package/dist/sandbox/registry.js +93 -0
  535. package/dist/sandbox/registry.js.map +1 -0
  536. package/dist/sandbox/types.d.ts +23 -25
  537. package/dist/sandbox/types.d.ts.map +1 -1
  538. package/dist/sandbox/types.js.map +1 -1
  539. package/dist/sandbox/utils.d.ts +21 -0
  540. package/dist/sandbox/utils.d.ts.map +1 -1
  541. package/dist/sandbox/utils.js +100 -8
  542. package/dist/sandbox/utils.js.map +1 -1
  543. package/dist/sessions/chat-history-sync.d.ts +17 -0
  544. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  545. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +224 -183
  546. package/dist/sessions/chat-history-sync.js.map +1 -0
  547. package/dist/sessions/history-line.d.ts +9 -0
  548. package/dist/sessions/history-line.d.ts.map +1 -0
  549. package/dist/sessions/history-line.js +25 -0
  550. package/dist/sessions/history-line.js.map +1 -0
  551. package/dist/sessions/migrate-common.d.ts +28 -0
  552. package/dist/sessions/migrate-common.d.ts.map +1 -0
  553. package/dist/sessions/migrate-common.js +80 -0
  554. package/dist/sessions/migrate-common.js.map +1 -0
  555. package/dist/sessions/migrate-pi-084.d.ts +7 -0
  556. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  557. package/dist/sessions/migrate-pi-084.js +293 -0
  558. package/dist/sessions/migrate-pi-084.js.map +1 -0
  559. package/dist/sessions/migrate-v3.d.ts +7 -0
  560. package/dist/sessions/migrate-v3.d.ts.map +1 -0
  561. package/dist/sessions/migrate-v3.js +351 -0
  562. package/dist/sessions/migrate-v3.js.map +1 -0
  563. package/dist/sessions/session-key.d.ts +18 -0
  564. package/dist/sessions/session-key.d.ts.map +1 -0
  565. package/dist/sessions/session-key.js +88 -0
  566. package/dist/sessions/session-key.js.map +1 -0
  567. package/dist/sessions/session-store.d.ts +55 -0
  568. package/dist/sessions/session-store.d.ts.map +1 -0
  569. package/dist/sessions/session-store.js +635 -0
  570. package/dist/sessions/session-store.js.map +1 -0
  571. package/dist/sessions/store.d.ts +7 -61
  572. package/dist/sessions/store.d.ts.map +1 -1
  573. package/dist/sessions/store.js +126 -102
  574. package/dist/sessions/store.js.map +1 -1
  575. package/dist/sessions/types.d.ts +59 -8
  576. package/dist/sessions/types.d.ts.map +1 -1
  577. package/dist/sessions/types.js +2 -1
  578. package/dist/sessions/types.js.map +1 -1
  579. package/dist/settings/apply.d.ts +9 -0
  580. package/dist/settings/apply.d.ts.map +1 -0
  581. package/dist/settings/apply.js +31 -0
  582. package/dist/settings/apply.js.map +1 -0
  583. package/dist/settings/index.d.ts +76 -0
  584. package/dist/settings/index.d.ts.map +1 -0
  585. package/dist/settings/index.js +351 -0
  586. package/dist/settings/index.js.map +1 -0
  587. package/dist/settings/migrate.d.ts +16 -0
  588. package/dist/settings/migrate.d.ts.map +1 -0
  589. package/dist/settings/migrate.js +70 -0
  590. package/dist/settings/migrate.js.map +1 -0
  591. package/dist/types.d.ts +231 -173
  592. package/dist/types.d.ts.map +1 -1
  593. package/dist/types.js +1 -3
  594. package/dist/types.js.map +1 -1
  595. package/dist/unknown-values.d.ts +3 -0
  596. package/dist/unknown-values.d.ts.map +1 -0
  597. package/dist/unknown-values.js +7 -0
  598. package/dist/unknown-values.js.map +1 -0
  599. package/dist/vault/index.d.ts +35 -11
  600. package/dist/vault/index.d.ts.map +1 -1
  601. package/dist/vault/index.js +326 -115
  602. package/dist/vault/index.js.map +1 -1
  603. package/dist/vault/types.d.ts +5 -16
  604. package/dist/vault/types.d.ts.map +1 -1
  605. package/dist/vault/types.js.map +1 -1
  606. package/package.json +82 -41
  607. package/dist/adapter.d.ts +0 -2
  608. package/dist/adapter.d.ts.map +0 -1
  609. package/dist/adapter.js +0 -2
  610. package/dist/adapter.js.map +0 -1
  611. package/dist/adapters/slack/tools/attach.d.ts +0 -12
  612. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  613. package/dist/adapters/slack/tools/attach.js.map +0 -1
  614. package/dist/adapters/streaming.d.ts +0 -18
  615. package/dist/adapters/streaming.d.ts.map +0 -1
  616. package/dist/adapters/streaming.js +0 -44
  617. package/dist/adapters/streaming.js.map +0 -1
  618. package/dist/adapters/telegram/html.d.ts +0 -3
  619. package/dist/adapters/telegram/html.d.ts.map +0 -1
  620. package/dist/adapters/telegram/html.js +0 -98
  621. package/dist/adapters/telegram/html.js.map +0 -1
  622. package/dist/agent-events.d.ts +0 -5
  623. package/dist/agent-events.d.ts.map +0 -1
  624. package/dist/agent-events.js +0 -26
  625. package/dist/agent-events.js.map +0 -1
  626. package/dist/agent.d.ts +0 -39
  627. package/dist/agent.d.ts.map +0 -1
  628. package/dist/agent.js +0 -1291
  629. package/dist/agent.js.map +0 -1
  630. package/dist/cli/ext-git.d.ts +0 -22
  631. package/dist/cli/ext-git.d.ts.map +0 -1
  632. package/dist/cli/ext-git.js +0 -76
  633. package/dist/cli/ext-git.js.map +0 -1
  634. package/dist/cli/ext.d.ts +0 -2
  635. package/dist/cli/ext.d.ts.map +0 -1
  636. package/dist/cli/ext.js +0 -217
  637. package/dist/cli/ext.js.map +0 -1
  638. package/dist/commands/admin.d.ts.map +0 -1
  639. package/dist/commands/admin.js.map +0 -1
  640. package/dist/commands/auto-reply.d.ts.map +0 -1
  641. package/dist/commands/auto-reply.js +0 -76
  642. package/dist/commands/auto-reply.js.map +0 -1
  643. package/dist/commands/extensions.d.ts +0 -14
  644. package/dist/commands/extensions.d.ts.map +0 -1
  645. package/dist/commands/extensions.js +0 -55
  646. package/dist/commands/extensions.js.map +0 -1
  647. package/dist/commands/login.d.ts +0 -5
  648. package/dist/commands/login.d.ts.map +0 -1
  649. package/dist/commands/login.js +0 -115
  650. package/dist/commands/login.js.map +0 -1
  651. package/dist/commands/model.d.ts +0 -10
  652. package/dist/commands/model.d.ts.map +0 -1
  653. package/dist/commands/model.js +0 -102
  654. package/dist/commands/model.js.map +0 -1
  655. package/dist/commands/new.d.ts.map +0 -1
  656. package/dist/commands/new.js +0 -25
  657. package/dist/commands/new.js.map +0 -1
  658. package/dist/commands/parse.d.ts +0 -7
  659. package/dist/commands/parse.d.ts.map +0 -1
  660. package/dist/commands/parse.js +0 -14
  661. package/dist/commands/parse.js.map +0 -1
  662. package/dist/commands/registry.d.ts +0 -5
  663. package/dist/commands/registry.d.ts.map +0 -1
  664. package/dist/commands/registry.js +0 -31
  665. package/dist/commands/registry.js.map +0 -1
  666. package/dist/commands/sandbox.d.ts.map +0 -1
  667. package/dist/commands/sandbox.js +0 -78
  668. package/dist/commands/sandbox.js.map +0 -1
  669. package/dist/commands/session-view.d.ts.map +0 -1
  670. package/dist/commands/session-view.js.map +0 -1
  671. package/dist/commands/types.d.ts +0 -66
  672. package/dist/commands/types.d.ts.map +0 -1
  673. package/dist/commands/types.js.map +0 -1
  674. package/dist/commands/utils.d.ts +0 -11
  675. package/dist/commands/utils.d.ts.map +0 -1
  676. package/dist/commands/utils.js.map +0 -1
  677. package/dist/config.d.ts +0 -78
  678. package/dist/config.d.ts.map +0 -1
  679. package/dist/config.js +0 -450
  680. package/dist/config.js.map +0 -1
  681. package/dist/download.d.ts.map +0 -1
  682. package/dist/download.js +0 -89
  683. package/dist/download.js.map +0 -1
  684. package/dist/events.d.ts +0 -43
  685. package/dist/events.d.ts.map +0 -1
  686. package/dist/events.js +0 -456
  687. package/dist/events.js.map +0 -1
  688. package/dist/execution-resolver.d.ts +0 -21
  689. package/dist/execution-resolver.d.ts.map +0 -1
  690. package/dist/execution-resolver.js +0 -170
  691. package/dist/execution-resolver.js.map +0 -1
  692. package/dist/harness/auth.d.ts +0 -16
  693. package/dist/harness/auth.d.ts.map +0 -1
  694. package/dist/harness/auth.js +0 -86
  695. package/dist/harness/auth.js.map +0 -1
  696. package/dist/harness/extensions/loader.d.ts +0 -86
  697. package/dist/harness/extensions/loader.d.ts.map +0 -1
  698. package/dist/harness/extensions/loader.js +0 -525
  699. package/dist/harness/extensions/loader.js.map +0 -1
  700. package/dist/harness/extensions/registry.d.ts +0 -23
  701. package/dist/harness/extensions/registry.d.ts.map +0 -1
  702. package/dist/harness/extensions/registry.js +0 -45
  703. package/dist/harness/extensions/registry.js.map +0 -1
  704. package/dist/harness/extensions/types.d.ts +0 -248
  705. package/dist/harness/extensions/types.d.ts.map +0 -1
  706. package/dist/harness/extensions/types.js.map +0 -1
  707. package/dist/harness/session-store.d.ts +0 -77
  708. package/dist/harness/session-store.d.ts.map +0 -1
  709. package/dist/harness/session-store.js +0 -248
  710. package/dist/harness/session-store.js.map +0 -1
  711. package/dist/harness/settings.d.ts +0 -47
  712. package/dist/harness/settings.d.ts.map +0 -1
  713. package/dist/harness/settings.js +0 -29
  714. package/dist/harness/settings.js.map +0 -1
  715. package/dist/model-registry.d.ts +0 -4
  716. package/dist/model-registry.d.ts.map +0 -1
  717. package/dist/model-registry.js +0 -7
  718. package/dist/model-registry.js.map +0 -1
  719. package/dist/platform-messages.d.ts.map +0 -1
  720. package/dist/platform-messages.js.map +0 -1
  721. package/dist/portal-shell.d.ts +0 -4
  722. package/dist/portal-shell.d.ts.map +0 -1
  723. package/dist/portal-shell.js.map +0 -1
  724. package/dist/provisioner.d.ts.map +0 -1
  725. package/dist/provisioner.js +0 -517
  726. package/dist/provisioner.js.map +0 -1
  727. package/dist/runtime/agent-run-controller.d.ts +0 -31
  728. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  729. package/dist/runtime/agent-run-controller.js +0 -195
  730. package/dist/runtime/agent-run-controller.js.map +0 -1
  731. package/dist/sandbox/errors.d.ts +0 -6
  732. package/dist/sandbox/errors.d.ts.map +0 -1
  733. package/dist/sandbox/errors.js +0 -11
  734. package/dist/sandbox/errors.js.map +0 -1
  735. package/dist/sandbox/firecracker.d.ts +0 -15
  736. package/dist/sandbox/firecracker.d.ts.map +0 -1
  737. package/dist/sandbox/firecracker.js +0 -212
  738. package/dist/sandbox/firecracker.js.map +0 -1
  739. package/dist/sandbox/image.d.ts +0 -3
  740. package/dist/sandbox/image.d.ts.map +0 -1
  741. package/dist/sandbox/image.js +0 -27
  742. package/dist/sandbox/image.js.map +0 -1
  743. package/dist/sandbox/path-context.d.ts +0 -3
  744. package/dist/sandbox/path-context.d.ts.map +0 -1
  745. package/dist/sandbox/path-context.js +0 -20
  746. package/dist/sandbox/path-context.js.map +0 -1
  747. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  748. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  749. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  750. package/dist/sessions/metadata.d.ts +0 -3
  751. package/dist/sessions/metadata.d.ts.map +0 -1
  752. package/dist/sessions/metadata.js +0 -11
  753. package/dist/sessions/metadata.js.map +0 -1
  754. package/dist/sessions/policy.d.ts +0 -6
  755. package/dist/sessions/policy.d.ts.map +0 -1
  756. package/dist/sessions/policy.js +0 -24
  757. package/dist/sessions/policy.js.map +0 -1
  758. package/dist/store.d.ts +0 -46
  759. package/dist/store.d.ts.map +0 -1
  760. package/dist/store.js +0 -177
  761. package/dist/store.js.map +0 -1
  762. package/dist/tools/bash.d.ts +0 -10
  763. package/dist/tools/bash.d.ts.map +0 -1
  764. package/dist/tools/bash.js +0 -80
  765. package/dist/tools/bash.js.map +0 -1
  766. package/dist/tools/edit.d.ts +0 -11
  767. package/dist/tools/edit.d.ts.map +0 -1
  768. package/dist/tools/edit.js +0 -131
  769. package/dist/tools/edit.js.map +0 -1
  770. package/dist/tools/event.d.ts +0 -56
  771. package/dist/tools/event.d.ts.map +0 -1
  772. package/dist/tools/event.js +0 -252
  773. package/dist/tools/event.js.map +0 -1
  774. package/dist/tools/index.d.ts +0 -24
  775. package/dist/tools/index.d.ts.map +0 -1
  776. package/dist/tools/index.js +0 -31
  777. package/dist/tools/index.js.map +0 -1
  778. package/dist/tools/react.d.ts +0 -15
  779. package/dist/tools/react.d.ts.map +0 -1
  780. package/dist/tools/react.js +0 -40
  781. package/dist/tools/react.js.map +0 -1
  782. package/dist/tools/read.d.ts +0 -11
  783. package/dist/tools/read.d.ts.map +0 -1
  784. package/dist/tools/read.js +0 -134
  785. package/dist/tools/read.js.map +0 -1
  786. package/dist/tools/sandbox.d.ts +0 -22
  787. package/dist/tools/sandbox.d.ts.map +0 -1
  788. package/dist/tools/sandbox.js.map +0 -1
  789. package/dist/tools/truncate.d.ts +0 -33
  790. package/dist/tools/truncate.d.ts.map +0 -1
  791. package/dist/tools/truncate.js +0 -184
  792. package/dist/tools/truncate.js.map +0 -1
  793. package/dist/tools/types.d.ts +0 -54
  794. package/dist/tools/types.d.ts.map +0 -1
  795. package/dist/tools/types.js.map +0 -1
  796. package/dist/tools/write.d.ts +0 -10
  797. package/dist/tools/write.d.ts.map +0 -1
  798. package/dist/tools/write.js +0 -29
  799. package/dist/tools/write.js.map +0 -1
  800. package/dist/trigger.d.ts +0 -22
  801. package/dist/trigger.d.ts.map +0 -1
  802. package/dist/trigger.js +0 -100
  803. package/dist/trigger.js.map +0 -1
  804. package/dist/utils/date.d.ts +0 -10
  805. package/dist/utils/date.d.ts.map +0 -1
  806. package/dist/utils/date.js +0 -23
  807. package/dist/utils/date.js.map +0 -1
  808. package/dist/utils/env.d.ts +0 -3
  809. package/dist/utils/env.d.ts.map +0 -1
  810. package/dist/utils/env.js +0 -12
  811. package/dist/utils/env.js.map +0 -1
  812. package/dist/utils/file-guards.d.ts +0 -9
  813. package/dist/utils/file-guards.d.ts.map +0 -1
  814. package/dist/utils/file-guards.js +0 -59
  815. package/dist/utils/file-guards.js.map +0 -1
  816. package/dist/utils/fs-atomic.d.ts +0 -10
  817. package/dist/utils/fs-atomic.d.ts.map +0 -1
  818. package/dist/utils/fs-atomic.js +0 -45
  819. package/dist/utils/fs-atomic.js.map +0 -1
  820. package/dist/utils/html.d.ts +0 -2
  821. package/dist/utils/html.d.ts.map +0 -1
  822. package/dist/utils/html.js +0 -4
  823. package/dist/utils/html.js.map +0 -1
  824. package/dist/utils/http-body.d.ts +0 -10
  825. package/dist/utils/http-body.d.ts.map +0 -1
  826. package/dist/utils/http-body.js +0 -34
  827. package/dist/utils/http-body.js.map +0 -1
  828. package/dist/vault/routing.d.ts +0 -3
  829. package/dist/vault/routing.d.ts.map +0 -1
  830. package/dist/vault/routing.js +0 -13
  831. package/dist/vault/routing.js.map +0 -1
  832. package/dist/web/admin/portal.d.ts +0 -5
  833. package/dist/web/admin/portal.d.ts.map +0 -1
  834. package/dist/web/admin/portal.js +0 -2572
  835. package/dist/web/admin/portal.js.map +0 -1
  836. package/dist/web/admin/provider-models.d.ts.map +0 -1
  837. package/dist/web/admin/provider-models.js.map +0 -1
  838. package/dist/web/admin/store.d.ts +0 -13
  839. package/dist/web/admin/store.d.ts.map +0 -1
  840. package/dist/web/admin/store.js +0 -14
  841. package/dist/web/admin/store.js.map +0 -1
  842. package/dist/web/admin/types.d.ts +0 -30
  843. package/dist/web/admin/types.d.ts.map +0 -1
  844. package/dist/web/admin/types.js.map +0 -1
  845. package/dist/web/agent-events/portal.d.ts +0 -3
  846. package/dist/web/agent-events/portal.d.ts.map +0 -1
  847. package/dist/web/agent-events/portal.js +0 -18
  848. package/dist/web/agent-events/portal.js.map +0 -1
  849. package/dist/web/login/oauth.d.ts +0 -6
  850. package/dist/web/login/oauth.d.ts.map +0 -1
  851. package/dist/web/login/oauth.js.map +0 -1
  852. package/dist/web/login/portal.d.ts +0 -17
  853. package/dist/web/login/portal.d.ts.map +0 -1
  854. package/dist/web/login/portal.js.map +0 -1
  855. package/dist/web/login/store.d.ts +0 -8
  856. package/dist/web/login/store.d.ts.map +0 -1
  857. package/dist/web/login/store.js +0 -15
  858. package/dist/web/login/store.js.map +0 -1
  859. package/dist/web/login/types.d.ts.map +0 -1
  860. package/dist/web/login/types.js.map +0 -1
  861. package/dist/web/request.d.ts +0 -3
  862. package/dist/web/request.d.ts.map +0 -1
  863. package/dist/web/request.js +0 -13
  864. package/dist/web/request.js.map +0 -1
  865. package/dist/web/server.d.ts +0 -28
  866. package/dist/web/server.d.ts.map +0 -1
  867. package/dist/web/server.js.map +0 -1
  868. package/dist/web/session-view/command.d.ts +0 -4
  869. package/dist/web/session-view/command.d.ts.map +0 -1
  870. package/dist/web/session-view/command.js +0 -7
  871. package/dist/web/session-view/command.js.map +0 -1
  872. package/dist/web/session-view/portal.d.ts +0 -13
  873. package/dist/web/session-view/portal.d.ts.map +0 -1
  874. package/dist/web/session-view/portal.js.map +0 -1
  875. package/dist/web/session-view/service.d.ts +0 -6
  876. package/dist/web/session-view/service.d.ts.map +0 -1
  877. package/dist/web/session-view/service.js +0 -498
  878. package/dist/web/session-view/service.js.map +0 -1
  879. package/dist/web/session-view/store.d.ts +0 -8
  880. package/dist/web/session-view/store.d.ts.map +0 -1
  881. package/dist/web/session-view/store.js +0 -15
  882. package/dist/web/session-view/store.js.map +0 -1
  883. package/dist/web/session-view/types.d.ts.map +0 -1
  884. package/dist/web/session-view/types.js.map +0 -1
  885. package/dist/web/token-store.d.ts.map +0 -1
  886. package/dist/web/token-store.js.map +0 -1
  887. package/dist/web/types.d.ts.map +0 -1
  888. package/dist/web/types.js.map +0 -1
  889. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  890. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  891. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  892. /package/dist/{commands → adapters/commands}/types.js +0 -0
  893. /package/dist/{harness/extensions → adapters/web/admin}/types.js +0 -0
  894. /package/dist/{tools → adapters/web/login}/types.js +0 -0
  895. /package/dist/{web/admin → adapters/web/session-view}/types.js +0 -0
  896. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  897. /package/dist/{web/login → adapters/web}/types.js +0 -0
  898. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  899. /package/dist/{web/session-view → cli}/types.js +0 -0
  900. /package/dist/{web → harness/tools}/types.js +0 -0
@@ -1,12 +1,30 @@
1
- import { basename } from "path";
1
+ import { dirname, join, resolve } from "node:path";
2
+ import { existsSync, readdirSync } from "node:fs";
3
+ import { SessionStore } from "../../../sessions/session-store.js";
4
+ import { getThreadSessionFile, resolveChannelSessionFile, tryResolveThreadSession, } from "../../../sessions/store.js";
5
+ import { isPlatformHistorySession } from "../../../sessions/store.js";
6
+ import { basename } from "node:path";
7
+ import { InMemoryTokenStore } from "../token-store.js";
2
8
  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";
9
+ import { createConversationEvent, createConversationMessage, createOfficeAddress, } from "../../../office/index.js";
10
+ import * as log from "../../../log.js";
11
+ import { escapeHtml, jsonResponse as json, readJsonBody, renderPortalShell, } from "../portal-shell.js";
12
+ import { reportUserFacingError } from "../../../observability/index.js";
13
+ import { inferConversationKind } from "../../../sessions/session-key.js";
14
+ import { isThreadSessionKey, threadSuffixOf } from "../../../sessions/session-key.js";
15
+ const SESSION_VIEW_TOKEN_TTL_MS = 24 * 60 * 60 * 1000;
16
+ export class InMemorySessionViewTokenStore extends InMemoryTokenStore {
17
+ create(options) {
18
+ return this.createRecord(SESSION_VIEW_TOKEN_TTL_MS, {
19
+ platform: options.platform,
20
+ platformUserId: options.platformUserId,
21
+ platformUserName: options.platformUserName || undefined,
22
+ conversationId: options.conversationId,
23
+ sessionKey: options.sessionKey,
24
+ sessionFile: options.sessionFile,
25
+ });
26
+ }
27
+ }
10
28
  const markdown = new MarkdownIt({
11
29
  html: false,
12
30
  linkify: true,
@@ -16,8 +34,8 @@ const defaultLinkOpen = markdown.renderer.rules.link_open;
16
34
  markdown.renderer.rules.link_open = (...args) => {
17
35
  const [tokens, idx, options, env, self] = args;
18
36
  const token = tokens[idx];
19
- token.attrSet("target", "_blank");
20
- token.attrSet("rel", "noreferrer noopener");
37
+ token?.attrSet("target", "_blank");
38
+ token?.attrSet("rel", "noreferrer noopener");
21
39
  return defaultLinkOpen
22
40
  ? defaultLinkOpen(tokens, idx, options, env, self)
23
41
  : self.renderToken(tokens, idx, options);
@@ -48,6 +66,7 @@ class SessionViewStreamHub {
48
66
  }
49
67
  }
50
68
  const sessionViewStreamHub = new SessionViewStreamHub();
69
+ import { errorMessage } from "../../../unknown-values.js";
51
70
  export async function handleSessionViewRequest(req, res, url, sessionViewTokenStore, interactive) {
52
71
  if (req.method === "POST" && url.pathname === "/session/message") {
53
72
  await handleSessionMessageRequest(req, res, sessionViewTokenStore, interactive);
@@ -60,75 +79,88 @@ export async function handleSessionViewRequest(req, res, url, sessionViewTokenSt
60
79
  if (req.method !== "GET" || url.pathname !== "/session") {
61
80
  return false;
62
81
  }
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."));
82
+ const target = await resolveSessionRequestTarget(sessionViewTokenStore, url.searchParams.get("token"), url.searchParams.get("session"));
83
+ if (!target.ok) {
84
+ res.writeHead(target.status, { "Content-Type": "text/html; charset=utf-8" });
85
+ res.end(renderStatusPage("Session unavailable", target.message));
67
86
  return true;
68
87
  }
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;
88
+ const { activeSessionKey, entry, targetSessionFile } = target;
77
89
  try {
78
- targetSessionFile = resolveRequestedSessionFile(entry.sessionFile, requestedSession);
90
+ const model = await loadSessionViewModel(targetSessionFile);
91
+ const displayedSessionKey = activeSessionKey;
92
+ const isRunning = interactive?.handler.isRunning(createOfficeAddress(entry.platform, entry.conversationId), displayedSessionKey) ?? false;
93
+ res.writeHead(200, {
94
+ "Content-Type": "text/html; charset=utf-8",
95
+ "Cache-Control": "no-store",
96
+ });
97
+ res.end(renderSessionPage({
98
+ model,
99
+ token: entry.token,
100
+ expiresAt: entry.expiresAt,
101
+ isRunning,
102
+ displayedSessionKey,
103
+ conversationId: entry.conversationId,
104
+ }));
79
105
  }
80
106
  catch (error) {
81
- log.logWarning(`[${entry.conversationId}] Corrupted session file referenced for ${entry.sessionFile}`, error instanceof Error ? error.message : String(error));
107
+ log.logWarning(`[${entry.conversationId}] Failed to render session ${entry.sessionFile}`, errorMessage(error));
82
108
  reportUserFacingError(error, {
83
109
  domain: "session_view",
84
110
  surface: "session_view",
85
- operation: "resolve_requested_session",
111
+ operation: "render_session",
86
112
  severity: "error",
87
113
  platform: entry.platform,
88
114
  context: {
89
115
  conversationId: entry.conversationId,
90
116
  sessionKey: entry.sessionKey,
91
- sessionFile: basename(entry.sessionFile),
92
- requestedSession,
117
+ sessionFile: basename(targetSessionFile),
93
118
  },
94
119
  });
95
120
  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;
121
+ res.end(renderStatusPage("Session unavailable", "The session could not be loaded right now."));
98
122
  }
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;
123
+ return true;
124
+ }
125
+ async function resolveSessionRequestTarget(sessionViewTokenStore, rawToken, requestedSession) {
126
+ if (!sessionViewTokenStore) {
127
+ return { ok: false, status: 503, message: "Session view is not configured." };
128
+ }
129
+ const token = rawToken?.trim() ?? "";
130
+ const entry = token ? sessionViewTokenStore.peek(token) : undefined;
131
+ if (!entry) {
132
+ return { ok: false, status: 400, message: "This session link is invalid or has expired." };
103
133
  }
134
+ let targetSessionFile;
104
135
  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));
136
+ targetSessionFile = await resolveRequestedSessionFile(entry.sessionFile, requestedSession);
113
137
  }
114
138
  catch (error) {
115
- log.logWarning(`[${entry.conversationId}] Failed to render session ${entry.sessionFile}`, error instanceof Error ? error.message : String(error));
139
+ log.logWarning(`[${entry.conversationId}] Corrupted session file referenced for ${entry.sessionFile}`, errorMessage(error));
116
140
  reportUserFacingError(error, {
117
141
  domain: "session_view",
118
142
  surface: "session_view",
119
- operation: "render_session",
143
+ operation: "resolve_requested_session",
120
144
  severity: "error",
121
145
  platform: entry.platform,
122
146
  context: {
123
147
  conversationId: entry.conversationId,
124
148
  sessionKey: entry.sessionKey,
125
- sessionFile: basename(targetSessionFile),
149
+ sessionFile: basename(entry.sessionFile),
150
+ requestedSession,
126
151
  },
127
152
  });
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."));
153
+ return { ok: false, status: 500, message: "The selected session file is corrupted." };
130
154
  }
131
- return true;
155
+ if (!targetSessionFile) {
156
+ return { ok: false, status: 400, message: "The selected session is invalid." };
157
+ }
158
+ return {
159
+ ok: true,
160
+ entry,
161
+ targetSessionFile,
162
+ activeSessionKey: resolveDisplayedSessionKey(entry, targetSessionFile),
163
+ };
132
164
  }
133
165
  function resolveDisplayedSessionKey(entry, sessionFile) {
134
166
  if (entry.platform === "slack") {
@@ -148,7 +180,8 @@ function renderTimelineItems(items, token) {
148
180
  ? items.map((item) => renderItem(item, token)).join("\n")
149
181
  : `<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
182
  }
151
- function renderSessionPage(model, token, expiresAt, isRunning, displayedSessionKey, conversationId) {
183
+ function renderSessionPage(options) {
184
+ const { model, token, expiresAt, isRunning, displayedSessionKey, conversationId } = options;
152
185
  const items = renderTimelineItems(model.items, token);
153
186
  const relatedSections = model.parent
154
187
  ? `<section class="related-card stack">
@@ -228,30 +261,28 @@ function renderThreadLinks(relations, token) {
228
261
  .join("")}</div>`;
229
262
  }
230
263
  export function parseUserBody(raw) {
231
- // [timestamp] [username] [in-thread:ts]: content
232
264
  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
265
  if (m) {
234
266
  const header = [`[${m[1]}]`, `[${m[2]}]`, m[3] ? `[in-thread:${m[3]}]` : ""]
235
267
  .filter(Boolean)
236
268
  .join(" ");
237
269
  return {
238
- timestamp: m[1],
239
- username: m[2],
270
+ timestamp: m[1] ?? null,
271
+ username: m[2] ?? null,
240
272
  threadTs: m[3] ?? null,
241
273
  header,
242
- content: m[4],
274
+ content: m[4] ?? "",
243
275
  };
244
276
  }
245
- // [username] [in-thread:ts]: content
246
277
  m = raw.match(/^\[([^\]]+)\](?:\s*\[in-thread:([^\]]+)\])?:\s*([\s\S]*)$/);
247
278
  if (m) {
248
279
  const header = [`[${m[1]}]`, m[2] ? `[in-thread:${m[2]}]` : ""].filter(Boolean).join(" ");
249
280
  return {
250
281
  timestamp: null,
251
- username: m[1],
282
+ username: m[1] ?? null,
252
283
  threadTs: m[2] ?? null,
253
284
  header,
254
- content: m[3],
285
+ content: m[3] ?? "",
255
286
  };
256
287
  }
257
288
  return { timestamp: null, username: null, threadTs: null, header: null, content: raw };
@@ -307,7 +338,6 @@ function renderItem(item, token) {
307
338
  <div class="msg-avatar user-avatar" title="${username ? esc(username) : "User"}">${initial}</div>
308
339
  </div>`;
309
340
  }
310
- // assistant
311
341
  const body = item.body ? renderMarkdownBlock(item.body, "assistant") : "";
312
342
  const threads = renderThreadLinks(item.threads, token ?? "");
313
343
  return `<div class="msg-row msg-assistant copy-host">
@@ -363,54 +393,28 @@ function renderLiveSystemEvent(text, tone = "default") {
363
393
  return `<div class="system-event${cls}" data-live-item><span class="event-dot"></span><span class="event-text">${esc(text)}</span></div>`;
364
394
  }
365
395
  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");
396
+ if (!interactive) {
397
+ res.writeHead(503, { "Content-Type": "text/plain; charset=utf-8" });
398
+ res.end("Session stream is not configured.");
370
399
  return;
371
400
  }
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");
401
+ const target = await resolveSessionRequestTarget(sessionViewTokenStore, url.searchParams.get("token"), url.searchParams.get("session"));
402
+ if (!target.ok) {
403
+ res.writeHead(target.status, { "Content-Type": "text/plain; charset=utf-8" });
404
+ res.end(target.message);
376
405
  return;
377
406
  }
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 { activeSessionKey, entry } = target;
407
408
  const streamKey = sessionStreamKey({ ...entry, sessionKey: activeSessionKey });
408
409
  res.writeHead(200, {
409
410
  "Content-Type": "text/event-stream; charset=utf-8",
410
411
  "Cache-Control": "no-store",
411
412
  Connection: "keep-alive",
412
413
  });
413
- res.write(`data: ${JSON.stringify({ type: "status", running: interactive.handler.isRunning(activeSessionKey) })}\n\n`);
414
+ res.write(`data: ${JSON.stringify({
415
+ type: "status",
416
+ running: interactive.handler.isRunning(createOfficeAddress(entry.platform, entry.conversationId), activeSessionKey),
417
+ })}\n\n`);
414
418
  const unsubscribe = sessionViewStreamHub.subscribe(streamKey, (event) => {
415
419
  res.write(`data: ${JSON.stringify(event)}\n\n`);
416
420
  });
@@ -423,64 +427,43 @@ async function handleSessionStreamRequest(req, res, url, sessionViewTokenStore,
423
427
  });
424
428
  }
425
429
  async function handleSessionMessageRequest(req, res, sessionViewTokenStore, interactive) {
426
- if (!sessionViewTokenStore || !interactive) {
430
+ if (!interactive) {
427
431
  json(res, 503, { ok: false, error: "Session chat is not configured." });
428
432
  return;
429
433
  }
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." });
434
+ const body = await readJsonBody(req, res, 1024 * 1024);
435
+ if (!body)
439
436
  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() || "";
437
+ const token = typeof body.token === "string" ? body.token.trim() : "";
438
+ const text = typeof body.text === "string" ? body.text.trim() : "";
439
+ const requestedSession = typeof body.session === "string" ? body.session.trim() || null : null;
440
+ const requestedSessionKey = typeof body.sessionKey === "string" ? body.sessionKey.trim() : "";
445
441
  if (!token || !text) {
446
442
  json(res, 400, { ok: false, error: "Missing token or text." });
447
443
  return;
448
444
  }
449
- const entry = sessionViewTokenStore.peek(token);
450
- if (!entry) {
451
- json(res, 400, { ok: false, error: "This session link is invalid or has expired." });
445
+ const target = await resolveSessionRequestTarget(sessionViewTokenStore, token, requestedSession);
446
+ if (!target.ok) {
447
+ json(res, target.status, { ok: false, error: target.message });
452
448
  return;
453
449
  }
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);
450
+ const { activeSessionKey, entry, targetSessionFile } = target;
480
451
  if (requestedSessionKey && requestedSessionKey !== activeSessionKey) {
481
452
  json(res, 400, { ok: false, error: "Session target mismatch." });
482
453
  return;
483
454
  }
455
+ await dispatchSessionViewMessage({
456
+ res,
457
+ interactive,
458
+ token,
459
+ text,
460
+ activeSessionKey,
461
+ entry,
462
+ targetSessionFile,
463
+ });
464
+ }
465
+ async function dispatchSessionViewMessage(input) {
466
+ const { res, interactive, token, text, activeSessionKey, entry, targetSessionFile } = input;
484
467
  const bot = interactive.botsByPlatform[entry.platform];
485
468
  if (!bot) {
486
469
  json(res, 503, { ok: false, error: `No bot configured for ${entry.platform}.` });
@@ -497,7 +480,8 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
497
480
  const responder = createSessionViewResponseContext((event) => {
498
481
  sessionViewStreamHub.publish(streamKey, event);
499
482
  });
500
- const event = {
483
+ const event = createConversationEvent({
484
+ platform: entry.platform,
501
485
  type: "session_view",
502
486
  conversationId: entry.conversationId,
503
487
  conversationKind,
@@ -506,21 +490,23 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
506
490
  text,
507
491
  attachments: [],
508
492
  sessionKey: activeSessionKey,
509
- ...(activeSessionKey.includes(":")
510
- ? { thread_ts: activeSessionKey.split(":").slice(1).join(":") }
511
- : {}),
512
- };
493
+ thread_ts: isThreadSessionKey(activeSessionKey) ? threadSuffixOf(activeSessionKey) : undefined,
494
+ });
495
+ const message = createConversationMessage({
496
+ platform: entry.platform,
497
+ conversationId: entry.conversationId,
498
+ id: ts,
499
+ sessionKey: activeSessionKey,
500
+ conversationKind,
501
+ userId: entry.platformUserId,
502
+ userName: platformUserName,
503
+ text,
504
+ attachments: [],
505
+ threadTs: event.thread_ts,
506
+ });
513
507
  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
- },
508
+ address: event.address,
509
+ message,
524
510
  responder,
525
511
  platform: { ...platformInfo, diagnostics: { showUsageSummary: false } },
526
512
  };
@@ -531,12 +517,8 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
531
517
  });
532
518
  void interactive.handler
533
519
  .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);
520
+ .then(async () => {
521
+ const model = await loadSessionViewModel(targetSessionFile);
540
522
  sessionViewStreamHub.publish(streamKey, {
541
523
  type: "refresh",
542
524
  timelineHtml: renderTimelineItems(model.items, token),
@@ -546,7 +528,7 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
546
528
  });
547
529
  })
548
530
  .catch((error) => {
549
- log.logWarning(`[${entry.conversationId}] Session view message failed`, error instanceof Error ? error.message : String(error));
531
+ log.logWarning(`[${entry.conversationId}] Session view message failed`, errorMessage(error));
550
532
  reportUserFacingError(error, {
551
533
  domain: "session_view",
552
534
  surface: "session_view",
@@ -562,7 +544,7 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
562
544
  });
563
545
  sessionViewStreamHub.publish(streamKey, {
564
546
  type: "error",
565
- message: error instanceof Error ? error.message : String(error),
547
+ message: errorMessage(error),
566
548
  });
567
549
  sessionViewStreamHub.publish(streamKey, { type: "status", running: false });
568
550
  });
@@ -600,13 +582,6 @@ function createSessionViewResponseContext(publish) {
600
582
  },
601
583
  };
602
584
  }
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
585
  function renderStatusPage(title, message) {
611
586
  return renderHtmlDocument(title, `<section class="card stack">
612
587
  <p class="eyebrow">mikan</p>
@@ -820,12 +795,12 @@ const sessionViewStyles = `
820
795
  }
821
796
 
822
797
  body {
823
- /* Extra bottom padding for the fixed composer */
798
+
824
799
  padding-bottom: calc(140px + env(safe-area-inset-bottom, 0px));
825
800
  overflow-x: hidden;
826
801
  }
827
802
 
828
- /* ── Session-specific page-head extras ─────────────────────────────── */
803
+
829
804
 
830
805
  .session-side {
831
806
  display: flex; flex-direction: column; align-items: flex-end; gap: 8px;
@@ -869,7 +844,7 @@ const sessionViewStyles = `
869
844
  color: var(--text); padding: 0;
870
845
  }
871
846
 
872
- /* ── Timeline shell ───────────────────────────────────────────────────── */
847
+
873
848
 
874
849
  .thread-links {
875
850
  display: flex;
@@ -1083,7 +1058,7 @@ const sessionViewStyles = `
1083
1058
  color: #b91c1c;
1084
1059
  }
1085
1060
 
1086
- /* ── Message rows ─────────────────────────────────────────────────────── */
1061
+
1087
1062
 
1088
1063
  .msg-row {
1089
1064
  display: flex;
@@ -1093,7 +1068,7 @@ const sessionViewStyles = `
1093
1068
  min-width: 0;
1094
1069
  }
1095
1070
 
1096
- /* ── User messages ────────────────────────────────────────────────────── */
1071
+
1097
1072
 
1098
1073
  .msg-user {
1099
1074
  justify-content: flex-end;
@@ -1165,7 +1140,7 @@ const sessionViewStyles = `
1165
1140
  text-align: right;
1166
1141
  }
1167
1142
 
1168
- /* ── Avatars ──────────────────────────────────────────────────────────── */
1143
+
1169
1144
 
1170
1145
  .msg-avatar {
1171
1146
  flex: 0 0 28px;
@@ -1194,7 +1169,7 @@ const sessionViewStyles = `
1194
1169
  margin-bottom: 2px;
1195
1170
  }
1196
1171
 
1197
- /* ── Assistant messages ───────────────────────────────────────────────── */
1172
+
1198
1173
 
1199
1174
  .msg-assistant {
1200
1175
  align-items: flex-end;
@@ -1231,7 +1206,7 @@ const sessionViewStyles = `
1231
1206
  color: var(--subtle);
1232
1207
  }
1233
1208
 
1234
- /* ── Tool blocks ──────────────────────────────────────────────────────── */
1209
+
1235
1210
 
1236
1211
  .tool-block {
1237
1212
  max-width: 92%;
@@ -1296,7 +1271,7 @@ const sessionViewStyles = `
1296
1271
  .tool-output.tone-ok { color: var(--tool-ok); }
1297
1272
  .tool-output.tone-err { color: var(--tool-err); }
1298
1273
 
1299
- /* ── Markdown blocks ──────────────────────────────────────────────────── */
1274
+
1300
1275
 
1301
1276
  .markdown-body {
1302
1277
  font-family: 'DM Sans', system-ui, sans-serif;
@@ -1433,7 +1408,7 @@ const sessionViewStyles = `
1433
1408
  border-color: rgba(0, 0, 0, 0.08);
1434
1409
  }
1435
1410
 
1436
- /* ── System events ────────────────────────────────────────────────────── */
1411
+
1437
1412
 
1438
1413
  .system-event {
1439
1414
  display: flex;
@@ -1467,7 +1442,7 @@ const sessionViewStyles = `
1467
1442
  font-style: normal;
1468
1443
  }
1469
1444
 
1470
- /* ── Status page ──────────────────────────────────────────────────────── */
1445
+
1471
1446
 
1472
1447
  .stack > * + * { margin-top: 14px; }
1473
1448
 
@@ -1485,7 +1460,7 @@ const sessionViewStyles = `
1485
1460
  border: 1px solid rgba(185, 28, 28, 0.12);
1486
1461
  }
1487
1462
 
1488
- /* ── Composer ─────────────────────────────────────────────────────────── */
1463
+
1489
1464
 
1490
1465
  .composer-card {
1491
1466
  position: fixed;
@@ -1617,7 +1592,7 @@ const sessionViewStyles = `
1617
1592
  opacity: 1;
1618
1593
  }
1619
1594
 
1620
- /* ── Responsive ───────────────────────────────────────────────────────── */
1595
+
1621
1596
 
1622
1597
  @media (max-width: 900px) {
1623
1598
  .composer-card {
@@ -1648,4 +1623,489 @@ const sessionViewStyles = `
1648
1623
  .asst-card { border-radius: 4px 14px 14px 14px; }
1649
1624
  }
1650
1625
  `;
1626
+ function entryIsoTime(entry) {
1627
+ if (!entry || typeof entry.timestamp !== "number" || !Number.isFinite(entry.timestamp)) {
1628
+ return undefined;
1629
+ }
1630
+ return new Date(entry.timestamp).toISOString();
1631
+ }
1632
+ export function resolveExistingSessionFile(conversationDir, sessionKey) {
1633
+ if (isThreadSessionKey(sessionKey)) {
1634
+ return tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey));
1635
+ }
1636
+ return resolveChannelSessionFile(conversationDir);
1637
+ }
1638
+ export async function loadSessionViewModel(sessionFile) {
1639
+ const resolvedFile = resolve(sessionFile);
1640
+ const sm = await SessionStore.inspect(resolvedFile);
1641
+ const header = sm.getHeader();
1642
+ const entries = await sm.getEntries();
1643
+ const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
1644
+ const title = (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`;
1645
+ const parent = await resolveParentRelation(resolvedFile, header);
1646
+ const threadCandidates = [];
1647
+ for (const candidate of listRelatedSessionFiles(resolvedFile)) {
1648
+ if (candidate === resolvedFile)
1649
+ continue;
1650
+ const relation = await buildSessionRelation(candidate, "thread", resolvedFile, header.id, entries);
1651
+ if (relation)
1652
+ threadCandidates.push(relation);
1653
+ }
1654
+ const threads = threadCandidates.toSorted((a, b) => a.updatedAt < b.updatedAt ? -1 : a.updatedAt > b.updatedAt ? 1 : 0);
1655
+ const threadsByEntryId = new Map();
1656
+ for (const thread of threads) {
1657
+ if (!thread.anchorEntryId)
1658
+ continue;
1659
+ const bucket = threadsByEntryId.get(thread.anchorEntryId) ?? [];
1660
+ bucket.push(thread);
1661
+ threadsByEntryId.set(thread.anchorEntryId, bucket);
1662
+ }
1663
+ const items = entries.flatMap((entry) => {
1664
+ const item = mapEntryToItem(entry);
1665
+ if (!item)
1666
+ return [];
1667
+ if (item.entryId) {
1668
+ const anchoredThreads = threadsByEntryId.get(item.entryId);
1669
+ if (anchoredThreads) {
1670
+ item.threads = anchoredThreads;
1671
+ }
1672
+ }
1673
+ return [item];
1674
+ });
1675
+ return {
1676
+ sessionId: header.id,
1677
+ fileName: basename(resolvedFile),
1678
+ title,
1679
+ createdAt: header.timestamp,
1680
+ updatedAt,
1681
+ entryCount: entries.length,
1682
+ items,
1683
+ parent: parent ?? undefined,
1684
+ threads,
1685
+ };
1686
+ }
1687
+ async function resolveRequestedSessionFile(baseSessionFile, requestedFileName) {
1688
+ const resolvedBase = resolve(baseSessionFile);
1689
+ if (!requestedFileName)
1690
+ return resolvedBase;
1691
+ const trimmed = requestedFileName.trim();
1692
+ if (!trimmed)
1693
+ return resolvedBase;
1694
+ const fileName = basename(trimmed);
1695
+ if (fileName !== trimmed || !fileName.endsWith(".jsonl"))
1696
+ return null;
1697
+ const candidate = join(dirname(resolvedBase), fileName);
1698
+ if (!existsSync(candidate))
1699
+ return null;
1700
+ try {
1701
+ if (!SessionStore.readHeader(candidate))
1702
+ throw new Error("Invalid session header");
1703
+ }
1704
+ catch (err) {
1705
+ throw new Error(`Session file is corrupted: ${candidate}: ${errorMessage(err)}`, {
1706
+ cause: err,
1707
+ });
1708
+ }
1709
+ return candidate;
1710
+ }
1711
+ function listRelatedSessionFiles(sessionFile) {
1712
+ const dir = dirname(sessionFile);
1713
+ if (!existsSync(dir))
1714
+ return [];
1715
+ return readdirSync(dir)
1716
+ .filter((name) => name.endsWith(".jsonl"))
1717
+ .map((fileName) => join(dir, fileName));
1718
+ }
1719
+ async function buildSessionRelation(sessionFile, kind, expectedParent, expectedParentId, expectedParentEntries) {
1720
+ let sm;
1721
+ try {
1722
+ sm = await SessionStore.inspect(sessionFile);
1723
+ }
1724
+ catch (err) {
1725
+ log.logWarning(`Skipping corrupted session file while building ${kind} relation: ${sessionFile}`, errorMessage(err));
1726
+ return null;
1727
+ }
1728
+ const header = sm.getHeader();
1729
+ if (kind === "thread" &&
1730
+ !isChildThreadSession(sessionFile, header.parentSession, expectedParent, expectedParentId, header.parentSessionId)) {
1731
+ return null;
1732
+ }
1733
+ const entries = await sm.getEntries();
1734
+ const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
1735
+ const threadId = kind === "thread" ? getFixedThreadSessionId(sessionFile) : null;
1736
+ const anchorEntryId = kind === "thread" && expectedParent
1737
+ ? findThreadAnchorEntryId(expectedParentEntries ??
1738
+ (await (await SessionStore.inspect(expectedParent)).getEntries()), entries, threadId)
1739
+ : undefined;
1740
+ return {
1741
+ kind,
1742
+ fileName: basename(sessionFile),
1743
+ sessionId: header.id,
1744
+ title: (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`,
1745
+ updatedAt,
1746
+ entryCount: entries.length,
1747
+ summary: extractSessionSummary(entries),
1748
+ anchorEntryId,
1749
+ };
1750
+ }
1751
+ async function resolveParentRelation(sessionFile, header) {
1752
+ if (header.parentSession) {
1753
+ const parentPath = resolve(header.parentSession);
1754
+ if (existsSync(parentPath)) {
1755
+ return (await buildSessionRelation(parentPath, "parent")) ?? undefined;
1756
+ }
1757
+ if (header.parentSessionId) {
1758
+ const found = findSessionFileById(dirname(sessionFile), header.parentSessionId);
1759
+ if (found)
1760
+ return (await buildSessionRelation(found, "parent")) ?? undefined;
1761
+ }
1762
+ }
1763
+ return buildInferredThreadParentRelation(sessionFile);
1764
+ }
1765
+ function findSessionFileById(sessionDir, targetId) {
1766
+ if (!existsSync(sessionDir))
1767
+ return null;
1768
+ for (const name of readdirSync(sessionDir)) {
1769
+ if (!name.endsWith(".jsonl"))
1770
+ continue;
1771
+ try {
1772
+ const filePath = join(sessionDir, name);
1773
+ if (SessionStore.readHeader(filePath)?.id === targetId)
1774
+ return filePath;
1775
+ }
1776
+ catch {
1777
+ continue;
1778
+ }
1779
+ }
1780
+ return null;
1781
+ }
1782
+ async function buildInferredThreadParentRelation(sessionFile) {
1783
+ if (!getFixedThreadSessionId(sessionFile))
1784
+ return undefined;
1785
+ const parentSession = resolveChannelSessionFile(dirname(dirname(sessionFile)));
1786
+ if (!parentSession || parentSession === sessionFile)
1787
+ return undefined;
1788
+ return (await buildSessionRelation(parentSession, "parent")) ?? undefined;
1789
+ }
1790
+ function isChildThreadSession(sessionFile, parentSession, expectedParent, expectedParentId, threadParentSessionId) {
1791
+ if (!expectedParent)
1792
+ return false;
1793
+ if (parentSession) {
1794
+ const resolvedParent = resolve(parentSession);
1795
+ if (resolvedParent === expectedParent ||
1796
+ (isPlatformHistorySession(expectedParent) && isPlatformHistorySession(resolvedParent))) {
1797
+ return true;
1798
+ }
1799
+ if (expectedParentId && threadParentSessionId) {
1800
+ return threadParentSessionId === expectedParentId;
1801
+ }
1802
+ return false;
1803
+ }
1804
+ if (!getFixedThreadSessionId(sessionFile))
1805
+ return false;
1806
+ return resolveChannelSessionFile(dirname(dirname(sessionFile))) === expectedParent;
1807
+ }
1808
+ function getFixedThreadSessionId(sessionFile) {
1809
+ const fileName = basename(sessionFile);
1810
+ if (!fileName.endsWith(".jsonl"))
1811
+ return null;
1812
+ if (/^\d{4}-\d{2}-\d{2}T.+_[0-9a-f]{8}\.jsonl$/i.test(fileName))
1813
+ return null;
1814
+ return fileName.slice(0, -".jsonl".length);
1815
+ }
1816
+ function findThreadAnchorEntryId(parentEntries, childEntries, threadId) {
1817
+ const threadTimestamp = threadId ? Number(threadId) * 1000 : undefined;
1818
+ if (threadTimestamp !== undefined && Number.isFinite(threadTimestamp)) {
1819
+ const timestampAnchor = findEntryIdByMessageTimestamp(parentEntries, threadTimestamp);
1820
+ if (timestampAnchor)
1821
+ return timestampAnchor;
1822
+ }
1823
+ let sharedCount = 0;
1824
+ while (sharedCount < parentEntries.length &&
1825
+ sharedCount < childEntries.length &&
1826
+ parentEntries[sharedCount]?.id === childEntries[sharedCount]?.id) {
1827
+ sharedCount += 1;
1828
+ }
1829
+ if (sharedCount > 0) {
1830
+ return parentEntries[sharedCount - 1]?.id;
1831
+ }
1832
+ const contentAnchor = findSharedContentAnchorEntryId(parentEntries, childEntries);
1833
+ if (contentAnchor)
1834
+ return contentAnchor;
1835
+ const childRoot = findComparableUserMessage(childEntries);
1836
+ if (!childRoot)
1837
+ return undefined;
1838
+ return findParentAnchorByRootMessage(parentEntries, childRoot);
1839
+ }
1840
+ function findEntryIdByMessageTimestamp(entries, timestamp) {
1841
+ for (const entry of entries) {
1842
+ if (entry.type !== "message")
1843
+ continue;
1844
+ const messageTimestamp = entry.message.timestamp;
1845
+ if (messageTimestamp === timestamp)
1846
+ return entry.id;
1847
+ }
1848
+ return undefined;
1849
+ }
1850
+ function findSharedContentAnchorEntryId(parentEntries, childEntries) {
1851
+ const parentMessages = parentEntries.flatMap((entry) => {
1852
+ const comparable = getComparableSessionMessage(entry);
1853
+ return comparable ? [comparable] : [];
1854
+ });
1855
+ const childMessages = childEntries.flatMap((entry) => {
1856
+ const comparable = getComparableSessionMessage(entry);
1857
+ return comparable ? [comparable] : [];
1858
+ });
1859
+ if (parentMessages.length === 0 || childMessages.length === 0)
1860
+ return undefined;
1861
+ let bestParentEnd = -1;
1862
+ let bestLength = 0;
1863
+ for (let parentStart = 0; parentStart < parentMessages.length; parentStart++) {
1864
+ let length = 0;
1865
+ while (parentStart + length < parentMessages.length && length < childMessages.length) {
1866
+ const parentMessage = parentMessages[parentStart + length];
1867
+ const childMessage = childMessages[length];
1868
+ if (parentMessage === undefined ||
1869
+ childMessage === undefined ||
1870
+ parentMessage.role !== childMessage.role ||
1871
+ parentMessage.normalizedText !== childMessage.normalizedText) {
1872
+ break;
1873
+ }
1874
+ length += 1;
1875
+ }
1876
+ if (length > bestLength) {
1877
+ bestLength = length;
1878
+ bestParentEnd = parentStart + length - 1;
1879
+ }
1880
+ }
1881
+ return bestLength > 0 ? parentMessages[bestParentEnd]?.entryId : undefined;
1882
+ }
1883
+ function getComparableSessionMessage(entry) {
1884
+ if (entry.type !== "message")
1885
+ return null;
1886
+ const role = entry.message.role;
1887
+ if (role !== "user" && role !== "assistant")
1888
+ return null;
1889
+ const body = contentToText(entry.message.content);
1890
+ const normalizedText = normalizeComparableSessionText(body, role);
1891
+ if (!normalizedText)
1892
+ return null;
1893
+ return { entryId: entry.id, role, normalizedText };
1894
+ }
1895
+ function normalizeComparableSessionText(text, role) {
1896
+ const normalized = role === "user" ? normalizeComparableUserText(text) : text.trim();
1897
+ return normalized.replace(/\s+/g, " ").trim();
1898
+ }
1899
+ function findParentAnchorByRootMessage(parentEntries, childRoot) {
1900
+ let textMatchId;
1901
+ for (const entry of parentEntries) {
1902
+ const comparable = getComparableUserMessage(entry);
1903
+ if (!comparable)
1904
+ continue;
1905
+ if (comparable.normalizedText !== childRoot.normalizedText)
1906
+ continue;
1907
+ if (childRoot.messageTimestamp !== undefined &&
1908
+ comparable.messageTimestamp !== undefined &&
1909
+ comparable.messageTimestamp === childRoot.messageTimestamp) {
1910
+ return entry.id;
1911
+ }
1912
+ textMatchId ??= entry.id;
1913
+ }
1914
+ return textMatchId;
1915
+ }
1916
+ function findComparableUserMessage(entries) {
1917
+ for (const entry of entries) {
1918
+ const comparable = getComparableUserMessage(entry);
1919
+ if (comparable)
1920
+ return comparable;
1921
+ }
1922
+ return null;
1923
+ }
1924
+ function getComparableUserMessage(entry) {
1925
+ if (entry.type !== "message" || entry.message.role !== "user")
1926
+ return null;
1927
+ const body = contentToText(entry.message.content);
1928
+ const normalizedText = normalizeComparableUserText(body);
1929
+ if (!normalizedText)
1930
+ return null;
1931
+ const messageTimestamp = typeof entry.message.timestamp === "number" ? entry.message.timestamp : undefined;
1932
+ return { normalizedText, messageTimestamp };
1933
+ }
1934
+ function normalizeComparableUserText(text) {
1935
+ const withoutTimestamp = text.replace(/^\[[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)/, "");
1936
+ return withoutTimestamp
1937
+ .replace(/\n*<slack_attachments>\n[\s\S]*?\n<\/slack_attachments>\s*$/g, "")
1938
+ .trim();
1939
+ }
1940
+ function extractSessionSummary(entries) {
1941
+ for (const entry of entries) {
1942
+ if (entry.type !== "message")
1943
+ continue;
1944
+ const item = mapEntryToItem(entry);
1945
+ if (!item?.body)
1946
+ continue;
1947
+ return collapseSummary(item.body);
1948
+ }
1949
+ return undefined;
1950
+ }
1951
+ function collapseSummary(text) {
1952
+ const singleLine = text.replace(/\s+/g, " ").trim();
1953
+ return singleLine.length > 96 ? `${singleLine.slice(0, 93)}…` : singleLine;
1954
+ }
1955
+ function mapEntryToItem(entry) {
1956
+ switch (entry.type) {
1957
+ case "message":
1958
+ return mapMessageEntry(entry);
1959
+ case "compaction":
1960
+ return mapCompactionEntry(entry);
1961
+ case "branch_summary":
1962
+ return mapSessionSummaryEntry(entry);
1963
+ case "custom":
1964
+ return {
1965
+ kind: "system",
1966
+ title: `Custom data · ${entry.customType}`,
1967
+ body: entry.data === undefined ? "(no data)" : JSON.stringify(entry.data, null, 2),
1968
+ meta: entryIsoTime(entry) ?? "",
1969
+ tone: "muted",
1970
+ };
1971
+ default:
1972
+ return null;
1973
+ }
1974
+ }
1975
+ function mapMessageEntry(entry) {
1976
+ const message = entry.message;
1977
+ switch (message.role) {
1978
+ case "user":
1979
+ return {
1980
+ kind: "user",
1981
+ title: "User",
1982
+ body: contentToText(message.content),
1983
+ meta: entryIsoTime(entry) ?? "",
1984
+ entryId: entry.id,
1985
+ };
1986
+ case "assistant": {
1987
+ const assistantBody = contentToText(message.content) || (message.errorMessage ? `_${message.errorMessage}_` : "");
1988
+ const metaParts = [message.provider, message.model, message.stopReason].filter(Boolean);
1989
+ return {
1990
+ kind: "assistant",
1991
+ title: "Assistant",
1992
+ body: assistantBody,
1993
+ meta: metaParts.length > 0
1994
+ ? `${entryIsoTime(entry) ?? ""} · ${metaParts.join(" · ")}`
1995
+ : (entryIsoTime(entry) ?? ""),
1996
+ entryId: entry.id,
1997
+ };
1998
+ }
1999
+ case "toolResult":
2000
+ return {
2001
+ kind: "tool",
2002
+ title: `Tool result · ${String(message.toolName ?? "unknown")}`,
2003
+ body: contentToText(message.content),
2004
+ meta: entryIsoTime(entry) ?? "",
2005
+ tone: message.isError ? "err" : "ok",
2006
+ entryId: entry.id,
2007
+ };
2008
+ case "bashExecution": {
2009
+ const command = String(message.command ?? "").trim();
2010
+ const output = String(message.output ?? "").trim();
2011
+ const details = [
2012
+ typeof message.exitCode === "number" ? `[exitCode] ${message.exitCode}` : "",
2013
+ message.cancelled ? `[cancelled] true` : "",
2014
+ message.truncated ? `[truncated] true` : "",
2015
+ ].filter(Boolean);
2016
+ const body = [command ? `$ ${command}` : "", output, ...details].filter(Boolean).join("\n\n");
2017
+ return {
2018
+ kind: "tool",
2019
+ title: "Bash execution",
2020
+ body: body || "(no output)",
2021
+ meta: entryIsoTime(entry) ?? "",
2022
+ entryId: entry.id,
2023
+ };
2024
+ }
2025
+ case "custom":
2026
+ return {
2027
+ kind: "system",
2028
+ title: `Custom message · ${String(message.customType ?? "custom")}`,
2029
+ body: contentToText(message.content),
2030
+ meta: entryIsoTime(entry) ?? "",
2031
+ tone: "muted",
2032
+ entryId: entry.id,
2033
+ };
2034
+ case "branchSummary":
2035
+ return {
2036
+ kind: "system",
2037
+ title: "Session summary",
2038
+ body: String(message.summary ?? ""),
2039
+ meta: entryIsoTime(entry) ?? "",
2040
+ tone: "muted",
2041
+ entryId: entry.id,
2042
+ };
2043
+ case "compactionSummary":
2044
+ return {
2045
+ kind: "system",
2046
+ title: "Compaction summary",
2047
+ body: String(message.summary ?? ""),
2048
+ meta: entryIsoTime(entry) ?? "",
2049
+ tone: "muted",
2050
+ entryId: entry.id,
2051
+ };
2052
+ default:
2053
+ return {
2054
+ kind: "system",
2055
+ title: `Message · ${String(message.role ?? "unknown")}`,
2056
+ body: contentToText(message.content),
2057
+ meta: entryIsoTime(entry) ?? "",
2058
+ tone: "muted",
2059
+ entryId: entry.id,
2060
+ };
2061
+ }
2062
+ }
2063
+ function mapCompactionEntry(entry) {
2064
+ return {
2065
+ kind: "system",
2066
+ title: "Context compacted",
2067
+ body: entry.summary,
2068
+ meta: `${entryIsoTime(entry) ?? ""} · ${entry.tokensBefore} tokens before compaction`,
2069
+ tone: "muted",
2070
+ };
2071
+ }
2072
+ function mapSessionSummaryEntry(entry) {
2073
+ return {
2074
+ kind: "system",
2075
+ title: "Session summary",
2076
+ body: entry.summary,
2077
+ meta: entryIsoTime(entry) ?? "",
2078
+ tone: "muted",
2079
+ };
2080
+ }
2081
+ function contentToText(content) {
2082
+ if (typeof content === "string")
2083
+ return content;
2084
+ if (!Array.isArray(content))
2085
+ return "";
2086
+ const lines = [];
2087
+ for (const block of content) {
2088
+ if (!block || typeof block !== "object")
2089
+ continue;
2090
+ const value = block;
2091
+ if (value.type === "text" && typeof value.text === "string") {
2092
+ lines.push(value.text);
2093
+ continue;
2094
+ }
2095
+ if (value.type === "thinking" && typeof value.thinking === "string") {
2096
+ lines.push(`[thinking]\n${value.thinking}`);
2097
+ continue;
2098
+ }
2099
+ if (value.type === "toolCall") {
2100
+ const name = typeof value.name === "string" ? value.name : "tool";
2101
+ const args = value.arguments === undefined ? "" : JSON.stringify(value.arguments, null, 2);
2102
+ lines.push([`[toolCall] ${name}`, args].filter(Boolean).join("\n"));
2103
+ continue;
2104
+ }
2105
+ if (value.type === "image") {
2106
+ lines.push(`[image ${String(value.mimeType ?? "unknown")}]`);
2107
+ }
2108
+ }
2109
+ return lines.join("\n\n");
2110
+ }
1651
2111
  //# sourceMappingURL=portal.js.map