@geminixiang/mikan 1.0.0-beta.44 → 1.0.0-beta.46

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 (422) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +12 -19
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/discord/bot.d.ts +3 -1
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +143 -141
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts +2 -8
  11. package/dist/adapters/discord/context.d.ts.map +1 -1
  12. package/dist/adapters/discord/context.js +1 -1
  13. package/dist/adapters/discord/context.js.map +1 -1
  14. package/dist/adapters/discord/format.d.ts.map +1 -1
  15. package/dist/adapters/discord/format.js +2 -4
  16. package/dist/adapters/discord/format.js.map +1 -1
  17. package/dist/adapters/github/bot.d.ts.map +1 -1
  18. package/dist/adapters/github/bot.js +1 -4
  19. package/dist/adapters/github/bot.js.map +1 -1
  20. package/dist/adapters/github/context.d.ts +2 -9
  21. package/dist/adapters/github/context.d.ts.map +1 -1
  22. package/dist/adapters/github/context.js.map +1 -1
  23. package/dist/adapters/github/github-ops.d.ts +4 -17
  24. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  25. package/dist/adapters/github/github-ops.js +17 -86
  26. package/dist/adapters/github/github-ops.js.map +1 -1
  27. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  28. package/dist/adapters/github/tool-pack.js +0 -1
  29. package/dist/adapters/github/tool-pack.js.map +1 -1
  30. package/dist/adapters/github/tools/checks.d.ts +0 -1
  31. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  32. package/dist/adapters/github/tools/checks.js +3 -22
  33. package/dist/adapters/github/tools/checks.js.map +1 -1
  34. package/dist/adapters/github/types.d.ts +0 -33
  35. package/dist/adapters/github/types.d.ts.map +1 -1
  36. package/dist/adapters/github/types.js.map +1 -1
  37. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  38. package/dist/adapters/progressive-renderer.js +311 -318
  39. package/dist/adapters/progressive-renderer.js.map +1 -1
  40. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  41. package/dist/adapters/slack/blocks.js +1 -4
  42. package/dist/adapters/slack/blocks.js.map +1 -1
  43. package/dist/adapters/slack/bot.d.ts +12 -0
  44. package/dist/adapters/slack/bot.d.ts.map +1 -1
  45. package/dist/adapters/slack/bot.js +158 -178
  46. package/dist/adapters/slack/bot.js.map +1 -1
  47. package/dist/adapters/slack/context.d.ts +2 -8
  48. package/dist/adapters/slack/context.d.ts.map +1 -1
  49. package/dist/adapters/slack/context.js +1 -1
  50. package/dist/adapters/slack/context.js.map +1 -1
  51. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  52. package/dist/adapters/slack/response-lifecycle.js +135 -123
  53. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  54. package/dist/adapters/slack/stream-limits.d.ts +1 -1
  55. package/dist/adapters/slack/stream-limits.js +1 -1
  56. package/dist/adapters/slack/stream-limits.js.map +1 -1
  57. package/dist/adapters/slack/types.d.ts +4 -0
  58. package/dist/adapters/slack/types.d.ts.map +1 -1
  59. package/dist/adapters/slack/types.js.map +1 -1
  60. package/dist/adapters/telegram/context.d.ts +2 -8
  61. package/dist/adapters/telegram/context.d.ts.map +1 -1
  62. package/dist/adapters/telegram/context.js +1 -2
  63. package/dist/adapters/telegram/context.js.map +1 -1
  64. package/dist/adapters/types.d.ts +11 -5
  65. package/dist/adapters/types.d.ts.map +1 -1
  66. package/dist/adapters/types.js.map +1 -1
  67. package/dist/agent/catalog.d.ts +6 -18
  68. package/dist/agent/catalog.d.ts.map +1 -1
  69. package/dist/agent/catalog.js +19 -155
  70. package/dist/agent/catalog.js.map +1 -1
  71. package/dist/agent/execution.d.ts +0 -7
  72. package/dist/agent/execution.d.ts.map +1 -1
  73. package/dist/agent/execution.js +23 -21
  74. package/dist/agent/execution.js.map +1 -1
  75. package/dist/agent/presenter.d.ts +7 -9
  76. package/dist/agent/presenter.d.ts.map +1 -1
  77. package/dist/agent/presenter.js +355 -357
  78. package/dist/agent/presenter.js.map +1 -1
  79. package/dist/agent/prompt.d.ts +5 -12
  80. package/dist/agent/prompt.d.ts.map +1 -1
  81. package/dist/agent/prompt.js +56 -81
  82. package/dist/agent/prompt.js.map +1 -1
  83. package/dist/agent/runner.d.ts +0 -7
  84. package/dist/agent/runner.d.ts.map +1 -1
  85. package/dist/agent/runner.js +255 -308
  86. package/dist/agent/runner.js.map +1 -1
  87. package/dist/agent/types.d.ts +21 -17
  88. package/dist/agent/types.d.ts.map +1 -1
  89. package/dist/agent/types.js +0 -1
  90. package/dist/agent/types.js.map +1 -1
  91. package/dist/cli/boot.d.ts.map +1 -1
  92. package/dist/cli/boot.js +7 -10
  93. package/dist/cli/boot.js.map +1 -1
  94. package/dist/cli/onboard.d.ts +10 -0
  95. package/dist/cli/onboard.d.ts.map +1 -0
  96. package/dist/cli/onboard.js +237 -0
  97. package/dist/cli/onboard.js.map +1 -0
  98. package/dist/cli/types.d.ts +8 -3
  99. package/dist/cli/types.d.ts.map +1 -1
  100. package/dist/cli/types.js.map +1 -1
  101. package/dist/commands/auto-reply.d.ts.map +1 -1
  102. package/dist/commands/auto-reply.js +5 -12
  103. package/dist/commands/auto-reply.js.map +1 -1
  104. package/dist/commands/manifest.d.ts.map +1 -1
  105. package/dist/commands/manifest.js +9 -16
  106. package/dist/commands/manifest.js.map +1 -1
  107. package/dist/commands/new.d.ts.map +1 -1
  108. package/dist/commands/new.js +15 -10
  109. package/dist/commands/new.js.map +1 -1
  110. package/dist/commands/registry.d.ts.map +1 -1
  111. package/dist/commands/registry.js +0 -2
  112. package/dist/commands/registry.js.map +1 -1
  113. package/dist/commands/sandbox.d.ts.map +1 -1
  114. package/dist/commands/sandbox.js +89 -70
  115. package/dist/commands/sandbox.js.map +1 -1
  116. package/dist/commands/session-view.js +9 -2
  117. package/dist/commands/session-view.js.map +1 -1
  118. package/dist/commands/types.d.ts +4 -3
  119. package/dist/commands/types.d.ts.map +1 -1
  120. package/dist/commands/types.js.map +1 -1
  121. package/dist/config.d.ts +13 -17
  122. package/dist/config.d.ts.map +1 -1
  123. package/dist/config.js +39 -37
  124. package/dist/config.js.map +1 -1
  125. package/dist/dream/index.d.ts +20 -0
  126. package/dist/dream/index.d.ts.map +1 -0
  127. package/dist/dream/index.js +253 -0
  128. package/dist/dream/index.js.map +1 -0
  129. package/dist/dream/types.d.ts +30 -0
  130. package/dist/dream/types.d.ts.map +1 -0
  131. package/dist/dream/types.js.map +1 -0
  132. package/dist/env-manifest.d.ts.map +1 -1
  133. package/dist/env-manifest.js +2 -34
  134. package/dist/env-manifest.js.map +1 -1
  135. package/dist/execution-resolver.d.ts +9 -2
  136. package/dist/execution-resolver.d.ts.map +1 -1
  137. package/dist/execution-resolver.js +26 -27
  138. package/dist/execution-resolver.js.map +1 -1
  139. package/dist/harness/event-format.d.ts +1 -2
  140. package/dist/harness/event-format.d.ts.map +1 -1
  141. package/dist/harness/event-format.js +9 -15
  142. package/dist/harness/event-format.js.map +1 -1
  143. package/dist/harness/index.d.ts +1 -7
  144. package/dist/harness/index.d.ts.map +1 -1
  145. package/dist/harness/index.js +0 -4
  146. package/dist/harness/index.js.map +1 -1
  147. package/dist/harness/models.d.ts.map +1 -1
  148. package/dist/harness/models.js +15 -35
  149. package/dist/harness/models.js.map +1 -1
  150. package/dist/harness/runner.d.ts +7 -16
  151. package/dist/harness/runner.d.ts.map +1 -1
  152. package/dist/harness/runner.js +13 -131
  153. package/dist/harness/runner.js.map +1 -1
  154. package/dist/harness/session-store.d.ts +1 -1
  155. package/dist/harness/session-store.d.ts.map +1 -1
  156. package/dist/harness/session-store.js +1 -1
  157. package/dist/harness/session-store.js.map +1 -1
  158. package/dist/harness/subagent-runner.d.ts +2 -2
  159. package/dist/harness/subagent-runner.d.ts.map +1 -1
  160. package/dist/harness/subagent-runner.js +157 -162
  161. package/dist/harness/subagent-runner.js.map +1 -1
  162. package/dist/harness/types.d.ts +1 -13
  163. package/dist/harness/types.d.ts.map +1 -1
  164. package/dist/harness/types.js.map +1 -1
  165. package/dist/index.d.ts +3 -9
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +1 -5
  168. package/dist/index.js.map +1 -1
  169. package/dist/main.js +31 -212
  170. package/dist/main.js.map +1 -1
  171. package/dist/mcp/catalog.d.ts +5 -0
  172. package/dist/mcp/catalog.d.ts.map +1 -0
  173. package/dist/mcp/catalog.js +135 -0
  174. package/dist/mcp/catalog.js.map +1 -0
  175. package/dist/mcp/loader.d.ts.map +1 -1
  176. package/dist/mcp/loader.js +3 -6
  177. package/dist/mcp/loader.js.map +1 -1
  178. package/dist/mcp/types.d.ts +22 -0
  179. package/dist/mcp/types.d.ts.map +1 -1
  180. package/dist/mcp/types.js.map +1 -1
  181. package/dist/office/index.d.ts +136 -8
  182. package/dist/office/index.d.ts.map +1 -1
  183. package/dist/office/index.js +1050 -9
  184. package/dist/office/index.js.map +1 -1
  185. package/dist/office/types.d.ts +19 -1
  186. package/dist/office/types.d.ts.map +1 -1
  187. package/dist/office/types.js.map +1 -1
  188. package/dist/packages/index.d.ts +168 -5
  189. package/dist/packages/index.d.ts.map +1 -1
  190. package/dist/packages/index.js +749 -5
  191. package/dist/packages/index.js.map +1 -1
  192. package/dist/packages/types.d.ts +1 -5
  193. package/dist/packages/types.d.ts.map +1 -1
  194. package/dist/packages/types.js.map +1 -1
  195. package/dist/provisioner.d.ts +2 -9
  196. package/dist/provisioner.d.ts.map +1 -1
  197. package/dist/provisioner.js +3 -12
  198. package/dist/provisioner.js.map +1 -1
  199. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  200. package/dist/runtime/conversation-runtime.js +117 -380
  201. package/dist/runtime/conversation-runtime.js.map +1 -1
  202. package/dist/runtime/session-lifecycle.d.ts +32 -18
  203. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  204. package/dist/runtime/session-lifecycle.js +159 -46
  205. package/dist/runtime/session-lifecycle.js.map +1 -1
  206. package/dist/runtime/types.d.ts +4 -26
  207. package/dist/runtime/types.d.ts.map +1 -1
  208. package/dist/runtime/types.js.map +1 -1
  209. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  210. package/dist/sandbox/cloudflare.js +2 -3
  211. package/dist/sandbox/cloudflare.js.map +1 -1
  212. package/dist/sandbox/container.d.ts +0 -1
  213. package/dist/sandbox/container.d.ts.map +1 -1
  214. package/dist/sandbox/container.js +2 -3
  215. package/dist/sandbox/container.js.map +1 -1
  216. package/dist/sandbox/host.d.ts.map +1 -1
  217. package/dist/sandbox/host.js +4 -2
  218. package/dist/sandbox/host.js.map +1 -1
  219. package/dist/sandbox/identity.d.ts +10 -19
  220. package/dist/sandbox/identity.d.ts.map +1 -1
  221. package/dist/sandbox/identity.js +8 -8
  222. package/dist/sandbox/identity.js.map +1 -1
  223. package/dist/sandbox/index.d.ts +7 -10
  224. package/dist/sandbox/index.d.ts.map +1 -1
  225. package/dist/sandbox/index.js +45 -16
  226. package/dist/sandbox/index.js.map +1 -1
  227. package/dist/sandbox/types.d.ts +13 -45
  228. package/dist/sandbox/types.d.ts.map +1 -1
  229. package/dist/sandbox/types.js.map +1 -1
  230. package/dist/sandbox/utils.d.ts +5 -0
  231. package/dist/sandbox/utils.d.ts.map +1 -1
  232. package/dist/sandbox/utils.js +10 -0
  233. package/dist/sandbox/utils.js.map +1 -1
  234. package/dist/sessions/chat-history-sync.d.ts +1 -3
  235. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  236. package/dist/sessions/chat-history-sync.js +58 -11
  237. package/dist/sessions/chat-history-sync.js.map +1 -1
  238. package/dist/sessions/migrate-v3.d.ts +2 -5
  239. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  240. package/dist/sessions/migrate-v3.js +34 -4
  241. package/dist/sessions/migrate-v3.js.map +1 -1
  242. package/dist/sessions/store.d.ts +5 -6
  243. package/dist/sessions/store.d.ts.map +1 -1
  244. package/dist/sessions/store.js +62 -2
  245. package/dist/sessions/store.js.map +1 -1
  246. package/dist/sessions/types.d.ts +9 -0
  247. package/dist/sessions/types.d.ts.map +1 -1
  248. package/dist/sessions/types.js.map +1 -1
  249. package/dist/tools/bash.d.ts.map +1 -1
  250. package/dist/tools/bash.js +2 -10
  251. package/dist/tools/bash.js.map +1 -1
  252. package/dist/tools/read.js +2 -2
  253. package/dist/tools/read.js.map +1 -1
  254. package/dist/tools/sandbox.d.ts.map +1 -1
  255. package/dist/tools/sandbox.js +2 -3
  256. package/dist/tools/sandbox.js.map +1 -1
  257. package/dist/tools/subagent.d.ts +1 -1
  258. package/dist/tools/subagent.js.map +1 -1
  259. package/dist/types.d.ts +38 -127
  260. package/dist/types.d.ts.map +1 -1
  261. package/dist/types.js.map +1 -1
  262. package/dist/vault/index.d.ts +9 -2
  263. package/dist/vault/index.d.ts.map +1 -1
  264. package/dist/vault/index.js +29 -5
  265. package/dist/vault/index.js.map +1 -1
  266. package/dist/web/admin/portal.d.ts +12 -1
  267. package/dist/web/admin/portal.d.ts.map +1 -1
  268. package/dist/web/admin/portal.js +437 -422
  269. package/dist/web/admin/portal.js.map +1 -1
  270. package/dist/web/admin/types.d.ts +2 -2
  271. package/dist/web/admin/types.d.ts.map +1 -1
  272. package/dist/web/admin/types.js.map +1 -1
  273. package/dist/web/login/portal.d.ts +7 -1
  274. package/dist/web/login/portal.d.ts.map +1 -1
  275. package/dist/web/login/portal.js +143 -78
  276. package/dist/web/login/portal.js.map +1 -1
  277. package/dist/web/portal-shell.d.ts +1 -0
  278. package/dist/web/portal-shell.d.ts.map +1 -1
  279. package/dist/web/portal-shell.js +12 -1
  280. package/dist/web/portal-shell.js.map +1 -1
  281. package/dist/web/server.d.ts +3 -3
  282. package/dist/web/server.d.ts.map +1 -1
  283. package/dist/web/server.js.map +1 -1
  284. package/dist/web/session-view/portal.d.ts +8 -1
  285. package/dist/web/session-view/portal.d.ts.map +1 -1
  286. package/dist/web/session-view/portal.js +609 -132
  287. package/dist/web/session-view/portal.js.map +1 -1
  288. package/dist/web/session-view/types.d.ts +8 -0
  289. package/dist/web/session-view/types.d.ts.map +1 -1
  290. package/dist/web/session-view/types.js.map +1 -1
  291. package/dist/workspace-projection/index.d.ts +14 -2
  292. package/dist/workspace-projection/index.d.ts.map +1 -1
  293. package/dist/workspace-projection/index.js +102 -14
  294. package/dist/workspace-projection/index.js.map +1 -1
  295. package/dist/workspace-projection/types.d.ts +14 -1
  296. package/dist/workspace-projection/types.d.ts.map +1 -1
  297. package/dist/workspace-projection/types.js.map +1 -1
  298. package/package.json +3 -5
  299. package/dist/adapters/github/cloudbuild.d.ts +0 -19
  300. package/dist/adapters/github/cloudbuild.d.ts.map +0 -1
  301. package/dist/adapters/github/cloudbuild.js +0 -71
  302. package/dist/adapters/github/cloudbuild.js.map +0 -1
  303. package/dist/adapters/github/gcp-auth.d.ts +0 -28
  304. package/dist/adapters/github/gcp-auth.d.ts.map +0 -1
  305. package/dist/adapters/github/gcp-auth.js +0 -196
  306. package/dist/adapters/github/gcp-auth.js.map +0 -1
  307. package/dist/agent/index.d.ts +0 -9
  308. package/dist/agent/index.d.ts.map +0 -1
  309. package/dist/agent/index.js +0 -8
  310. package/dist/agent/index.js.map +0 -1
  311. package/dist/cli/ext-dev.d.ts +0 -2
  312. package/dist/cli/ext-dev.d.ts.map +0 -1
  313. package/dist/cli/ext-dev.js +0 -188
  314. package/dist/cli/ext-dev.js.map +0 -1
  315. package/dist/cli/ext.d.ts +0 -2
  316. package/dist/cli/ext.d.ts.map +0 -1
  317. package/dist/cli/ext.js +0 -324
  318. package/dist/cli/ext.js.map +0 -1
  319. package/dist/commands/extensions.d.ts +0 -26
  320. package/dist/commands/extensions.d.ts.map +0 -1
  321. package/dist/commands/extensions.js +0 -103
  322. package/dist/commands/extensions.js.map +0 -1
  323. package/dist/extension-schedules.d.ts +0 -31
  324. package/dist/extension-schedules.d.ts.map +0 -1
  325. package/dist/extension-schedules.js +0 -229
  326. package/dist/extension-schedules.js.map +0 -1
  327. package/dist/harness/auth.d.ts +0 -17
  328. package/dist/harness/auth.d.ts.map +0 -1
  329. package/dist/harness/auth.js +0 -92
  330. package/dist/harness/auth.js.map +0 -1
  331. package/dist/harness/extensions/loader.d.ts +0 -40
  332. package/dist/harness/extensions/loader.d.ts.map +0 -1
  333. package/dist/harness/extensions/loader.js +0 -723
  334. package/dist/harness/extensions/loader.js.map +0 -1
  335. package/dist/harness/extensions/registry.d.ts +0 -155
  336. package/dist/harness/extensions/registry.d.ts.map +0 -1
  337. package/dist/harness/extensions/registry.js +0 -420
  338. package/dist/harness/extensions/registry.js.map +0 -1
  339. package/dist/harness/extensions/types.d.ts +0 -665
  340. package/dist/harness/extensions/types.d.ts.map +0 -1
  341. package/dist/harness/extensions/types.js.map +0 -1
  342. package/dist/office/address.d.ts +0 -31
  343. package/dist/office/address.d.ts.map +0 -1
  344. package/dist/office/address.js +0 -113
  345. package/dist/office/address.js.map +0 -1
  346. package/dist/office/layout.d.ts +0 -27
  347. package/dist/office/layout.d.ts.map +0 -1
  348. package/dist/office/layout.js +0 -97
  349. package/dist/office/layout.js.map +0 -1
  350. package/dist/office/migration.d.ts +0 -44
  351. package/dist/office/migration.d.ts.map +0 -1
  352. package/dist/office/migration.js +0 -255
  353. package/dist/office/migration.js.map +0 -1
  354. package/dist/office/registry.d.ts +0 -75
  355. package/dist/office/registry.d.ts.map +0 -1
  356. package/dist/office/registry.js +0 -646
  357. package/dist/office/registry.js.map +0 -1
  358. package/dist/packages/admin.d.ts +0 -17
  359. package/dist/packages/admin.d.ts.map +0 -1
  360. package/dist/packages/admin.js +0 -98
  361. package/dist/packages/admin.js.map +0 -1
  362. package/dist/packages/inspect.d.ts +0 -11
  363. package/dist/packages/inspect.d.ts.map +0 -1
  364. package/dist/packages/inspect.js +0 -98
  365. package/dist/packages/inspect.js.map +0 -1
  366. package/dist/packages/materialize.d.ts +0 -40
  367. package/dist/packages/materialize.d.ts.map +0 -1
  368. package/dist/packages/materialize.js +0 -297
  369. package/dist/packages/materialize.js.map +0 -1
  370. package/dist/packages/resolve.d.ts +0 -25
  371. package/dist/packages/resolve.d.ts.map +0 -1
  372. package/dist/packages/resolve.js +0 -208
  373. package/dist/packages/resolve.js.map +0 -1
  374. package/dist/packages/source.d.ts +0 -39
  375. package/dist/packages/source.d.ts.map +0 -1
  376. package/dist/packages/source.js +0 -189
  377. package/dist/packages/source.js.map +0 -1
  378. package/dist/sandbox/errors.d.ts +0 -6
  379. package/dist/sandbox/errors.d.ts.map +0 -1
  380. package/dist/sandbox/errors.js +0 -11
  381. package/dist/sandbox/errors.js.map +0 -1
  382. package/dist/sandbox/firecracker.d.ts +0 -18
  383. package/dist/sandbox/firecracker.d.ts.map +0 -1
  384. package/dist/sandbox/firecracker.js +0 -223
  385. package/dist/sandbox/firecracker.js.map +0 -1
  386. package/dist/sandbox/gondolin.d.ts +0 -57
  387. package/dist/sandbox/gondolin.d.ts.map +0 -1
  388. package/dist/sandbox/gondolin.js +0 -764
  389. package/dist/sandbox/gondolin.js.map +0 -1
  390. package/dist/sandbox/image.d.ts +0 -3
  391. package/dist/sandbox/image.d.ts.map +0 -1
  392. package/dist/sandbox/image.js +0 -29
  393. package/dist/sandbox/image.js.map +0 -1
  394. package/dist/sessions/conversation-log.d.ts +0 -9
  395. package/dist/sessions/conversation-log.d.ts.map +0 -1
  396. package/dist/sessions/conversation-log.js +0 -50
  397. package/dist/sessions/conversation-log.js.map +0 -1
  398. package/dist/sessions/rotation.d.ts +0 -2
  399. package/dist/sessions/rotation.d.ts.map +0 -1
  400. package/dist/sessions/rotation.js +0 -41
  401. package/dist/sessions/rotation.js.map +0 -1
  402. package/dist/vault/disabled.d.ts +0 -9
  403. package/dist/vault/disabled.d.ts.map +0 -1
  404. package/dist/vault/disabled.js +0 -25
  405. package/dist/vault/disabled.js.map +0 -1
  406. package/dist/web/admin/store.d.ts +0 -13
  407. package/dist/web/admin/store.d.ts.map +0 -1
  408. package/dist/web/admin/store.js +0 -14
  409. package/dist/web/admin/store.js.map +0 -1
  410. package/dist/web/login/store.d.ts +0 -8
  411. package/dist/web/login/store.d.ts.map +0 -1
  412. package/dist/web/login/store.js +0 -15
  413. package/dist/web/login/store.js.map +0 -1
  414. package/dist/web/session-view/service.d.ts +0 -6
  415. package/dist/web/session-view/service.d.ts.map +0 -1
  416. package/dist/web/session-view/service.js +0 -517
  417. package/dist/web/session-view/service.js.map +0 -1
  418. package/dist/web/session-view/store.d.ts +0 -8
  419. package/dist/web/session-view/store.d.ts.map +0 -1
  420. package/dist/web/session-view/store.js +0 -15
  421. package/dist/web/session-view/store.js.map +0 -1
  422. /package/dist/{harness/extensions → dream}/types.js +0 -0
@@ -1,517 +0,0 @@
1
- import { basename, dirname, join, resolve } from "node:path";
2
- import { existsSync, readdirSync } from "node:fs";
3
- import { SessionStore, } from "../../harness/index.js";
4
- import { getThreadSessionFile, resolveChannelSessionFile, tryResolveThreadSession, } from "../../sessions/store.js";
5
- import { isPlatformHistorySession } from "../../sessions/store.js";
6
- import { isThreadSessionKey } from "../../sessions/session-key.js";
7
- import * as log from "../../log.js";
8
- function entryIsoTime(entry) {
9
- if (!entry || typeof entry.timestamp !== "number" || !Number.isFinite(entry.timestamp)) {
10
- return undefined;
11
- }
12
- return new Date(entry.timestamp).toISOString();
13
- }
14
- export function resolveExistingSessionFile(conversationDir, sessionKey) {
15
- if (isThreadSessionKey(sessionKey)) {
16
- return tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey));
17
- }
18
- return resolveChannelSessionFile(conversationDir);
19
- }
20
- export async function loadSessionViewModel(sessionFile) {
21
- const resolvedFile = resolve(sessionFile);
22
- const sm = await SessionStore.inspect(resolvedFile);
23
- const header = sm.getHeader();
24
- const entries = await sm.getEntries();
25
- const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
26
- const title = (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`;
27
- const parent = await resolveParentRelation(resolvedFile, header);
28
- const threadCandidates = [];
29
- for (const candidate of listRelatedSessionFiles(resolvedFile)) {
30
- if (candidate === resolvedFile)
31
- continue;
32
- const relation = await buildSessionRelation(candidate, "thread", resolvedFile, header.id, entries);
33
- if (relation)
34
- threadCandidates.push(relation);
35
- }
36
- const threads = threadCandidates.toSorted((a, b) => a.updatedAt < b.updatedAt ? -1 : a.updatedAt > b.updatedAt ? 1 : 0);
37
- const threadsByEntryId = new Map();
38
- for (const thread of threads) {
39
- if (!thread.anchorEntryId)
40
- continue;
41
- const bucket = threadsByEntryId.get(thread.anchorEntryId) ?? [];
42
- bucket.push(thread);
43
- threadsByEntryId.set(thread.anchorEntryId, bucket);
44
- }
45
- const items = entries.flatMap((entry) => {
46
- const item = mapEntryToItem(entry);
47
- if (!item)
48
- return [];
49
- if (item.entryId) {
50
- const anchoredThreads = threadsByEntryId.get(item.entryId);
51
- if (anchoredThreads) {
52
- item.threads = anchoredThreads;
53
- }
54
- }
55
- return [item];
56
- });
57
- return {
58
- sessionId: header.id,
59
- fileName: basename(resolvedFile),
60
- title,
61
- createdAt: header.timestamp,
62
- updatedAt,
63
- entryCount: entries.length,
64
- items,
65
- parent: parent ?? undefined,
66
- threads,
67
- };
68
- }
69
- export async function resolveRequestedSessionFile(baseSessionFile, requestedFileName) {
70
- const resolvedBase = resolve(baseSessionFile);
71
- if (!requestedFileName)
72
- return resolvedBase;
73
- const trimmed = requestedFileName.trim();
74
- if (!trimmed)
75
- return resolvedBase;
76
- const fileName = basename(trimmed);
77
- if (fileName !== trimmed || !fileName.endsWith(".jsonl"))
78
- return null;
79
- const candidate = join(dirname(resolvedBase), fileName);
80
- if (!existsSync(candidate))
81
- return null;
82
- try {
83
- await SessionStore.open(candidate);
84
- }
85
- catch (err) {
86
- throw new Error(`Session file is corrupted: ${candidate}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
87
- }
88
- return candidate;
89
- }
90
- function listRelatedSessionFiles(sessionFile) {
91
- const dir = dirname(sessionFile);
92
- if (!existsSync(dir))
93
- return [];
94
- return readdirSync(dir)
95
- .filter((name) => name.endsWith(".jsonl"))
96
- .map((fileName) => join(dir, fileName));
97
- }
98
- async function buildSessionRelation(sessionFile, kind, expectedParent, expectedParentId, expectedParentEntries) {
99
- let sm;
100
- try {
101
- sm = await SessionStore.inspect(sessionFile);
102
- }
103
- catch (err) {
104
- log.logWarning(`Skipping corrupted session file while building ${kind} relation: ${sessionFile}`, err instanceof Error ? err.message : String(err));
105
- return null;
106
- }
107
- const header = sm.getHeader();
108
- if (kind === "thread" &&
109
- !isChildThreadSession(sessionFile, header.parentSession, expectedParent, expectedParentId, header.parentSessionId)) {
110
- return null;
111
- }
112
- const entries = await sm.getEntries();
113
- const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
114
- const threadId = kind === "thread" ? getFixedThreadSessionId(sessionFile) : null;
115
- const anchorEntryId = kind === "thread" && expectedParent
116
- ? findThreadAnchorEntryId(expectedParentEntries ??
117
- (await (await SessionStore.inspect(expectedParent)).getEntries()), entries, threadId)
118
- : undefined;
119
- return {
120
- kind,
121
- fileName: basename(sessionFile),
122
- sessionId: header.id,
123
- title: (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`,
124
- updatedAt,
125
- entryCount: entries.length,
126
- summary: extractSessionSummary(entries),
127
- anchorEntryId,
128
- };
129
- }
130
- async function resolveParentRelation(sessionFile, header) {
131
- if (header.parentSession) {
132
- const parentPath = resolve(header.parentSession);
133
- if (existsSync(parentPath)) {
134
- return (await buildSessionRelation(parentPath, "parent")) ?? undefined;
135
- }
136
- // Path is stale — try UUID fallback before heuristic.
137
- if (header.parentSessionId) {
138
- const found = findSessionFileById(dirname(sessionFile), header.parentSessionId);
139
- if (found)
140
- return (await buildSessionRelation(found, "parent")) ?? undefined;
141
- }
142
- }
143
- return buildInferredThreadParentRelation(sessionFile);
144
- }
145
- function findSessionFileById(sessionDir, targetId) {
146
- if (!existsSync(sessionDir))
147
- return null;
148
- for (const name of readdirSync(sessionDir)) {
149
- if (!name.endsWith(".jsonl"))
150
- continue;
151
- try {
152
- const filePath = join(sessionDir, name);
153
- if (SessionStore.readHeader(filePath)?.id === targetId)
154
- return filePath;
155
- }
156
- catch {
157
- continue;
158
- }
159
- }
160
- return null;
161
- }
162
- async function buildInferredThreadParentRelation(sessionFile) {
163
- if (!getFixedThreadSessionId(sessionFile))
164
- return undefined;
165
- const parentSession = resolveChannelSessionFile(dirname(dirname(sessionFile)));
166
- if (!parentSession || parentSession === sessionFile)
167
- return undefined;
168
- return (await buildSessionRelation(parentSession, "parent")) ?? undefined;
169
- }
170
- function isChildThreadSession(sessionFile, parentSession, expectedParent, expectedParentId, threadParentSessionId) {
171
- if (!expectedParent)
172
- return false;
173
- if (parentSession) {
174
- const resolvedParent = resolve(parentSession);
175
- if (resolvedParent === expectedParent ||
176
- (isPlatformHistorySession(expectedParent) && isPlatformHistorySession(resolvedParent))) {
177
- return true;
178
- }
179
- // Path is stale — fall back to UUID comparison.
180
- if (expectedParentId && threadParentSessionId) {
181
- return threadParentSessionId === expectedParentId;
182
- }
183
- return false;
184
- }
185
- if (!getFixedThreadSessionId(sessionFile))
186
- return false;
187
- return resolveChannelSessionFile(dirname(dirname(sessionFile))) === expectedParent;
188
- }
189
- function getFixedThreadSessionId(sessionFile) {
190
- const fileName = basename(sessionFile);
191
- if (!fileName.endsWith(".jsonl"))
192
- return null;
193
- if (/^\d{4}-\d{2}-\d{2}T.+_[0-9a-f]{8}\.jsonl$/i.test(fileName))
194
- return null;
195
- return fileName.slice(0, -".jsonl".length);
196
- }
197
- function findThreadAnchorEntryId(parentEntries, childEntries, threadId) {
198
- const threadTimestamp = parseThreadTimestamp(threadId);
199
- if (threadTimestamp !== undefined) {
200
- const timestampAnchor = findEntryIdByMessageTimestamp(parentEntries, threadTimestamp);
201
- if (timestampAnchor)
202
- return timestampAnchor;
203
- }
204
- let sharedCount = 0;
205
- while (sharedCount < parentEntries.length &&
206
- sharedCount < childEntries.length &&
207
- parentEntries[sharedCount]?.id === childEntries[sharedCount]?.id) {
208
- sharedCount += 1;
209
- }
210
- if (sharedCount > 0) {
211
- return parentEntries[sharedCount - 1]?.id;
212
- }
213
- const contentAnchor = findSharedContentAnchorEntryId(parentEntries, childEntries);
214
- if (contentAnchor)
215
- return contentAnchor;
216
- const childRoot = findComparableUserMessage(childEntries);
217
- if (!childRoot)
218
- return undefined;
219
- return findParentAnchorByRootMessage(parentEntries, childRoot);
220
- }
221
- function parseThreadTimestamp(threadId) {
222
- if (!threadId)
223
- return undefined;
224
- const timestamp = Number(threadId) * 1000;
225
- return Number.isFinite(timestamp) ? timestamp : undefined;
226
- }
227
- function findEntryIdByMessageTimestamp(entries, timestamp) {
228
- for (const entry of entries) {
229
- if (entry.type !== "message")
230
- continue;
231
- const messageTimestamp = entry.message.timestamp;
232
- if (messageTimestamp === timestamp)
233
- return entry.id;
234
- }
235
- return undefined;
236
- }
237
- function findSharedContentAnchorEntryId(parentEntries, childEntries) {
238
- const parentMessages = parentEntries.flatMap((entry) => {
239
- const comparable = getComparableSessionMessage(entry);
240
- return comparable ? [comparable] : [];
241
- });
242
- const childMessages = childEntries.flatMap((entry) => {
243
- const comparable = getComparableSessionMessage(entry);
244
- return comparable ? [comparable] : [];
245
- });
246
- if (parentMessages.length === 0 || childMessages.length === 0)
247
- return undefined;
248
- let bestParentEnd = -1;
249
- let bestLength = 0;
250
- for (let parentStart = 0; parentStart < parentMessages.length; parentStart++) {
251
- let length = 0;
252
- while (parentStart + length < parentMessages.length && length < childMessages.length) {
253
- const parentMessage = parentMessages[parentStart + length];
254
- const childMessage = childMessages[length];
255
- if (parentMessage === undefined ||
256
- childMessage === undefined ||
257
- !comparableSessionMessagesMatch(parentMessage, childMessage)) {
258
- break;
259
- }
260
- length += 1;
261
- }
262
- if (length > bestLength) {
263
- bestLength = length;
264
- bestParentEnd = parentStart + length - 1;
265
- }
266
- }
267
- return bestLength > 0 ? parentMessages[bestParentEnd]?.entryId : undefined;
268
- }
269
- function getComparableSessionMessage(entry) {
270
- if (entry.type !== "message")
271
- return null;
272
- const role = entry.message.role;
273
- if (role !== "user" && role !== "assistant")
274
- return null;
275
- const body = contentToText(entry.message.content);
276
- const normalizedText = normalizeComparableSessionText(body, role);
277
- if (!normalizedText)
278
- return null;
279
- return { entryId: entry.id, role, normalizedText };
280
- }
281
- function comparableSessionMessagesMatch(parent, child) {
282
- return parent.role === child.role && parent.normalizedText === child.normalizedText;
283
- }
284
- function normalizeComparableSessionText(text, role) {
285
- const normalized = role === "user" ? normalizeComparableUserText(text) : text.trim();
286
- return normalized.replace(/\s+/g, " ").trim();
287
- }
288
- function findParentAnchorByRootMessage(parentEntries, childRoot) {
289
- let textMatchId;
290
- for (const entry of parentEntries) {
291
- const comparable = getComparableUserMessage(entry);
292
- if (!comparable)
293
- continue;
294
- if (comparable.normalizedText !== childRoot.normalizedText)
295
- continue;
296
- if (childRoot.messageTimestamp !== undefined &&
297
- comparable.messageTimestamp !== undefined &&
298
- comparable.messageTimestamp === childRoot.messageTimestamp) {
299
- return entry.id;
300
- }
301
- textMatchId ??= entry.id;
302
- }
303
- return textMatchId;
304
- }
305
- function findComparableUserMessage(entries) {
306
- for (const entry of entries) {
307
- const comparable = getComparableUserMessage(entry);
308
- if (comparable)
309
- return comparable;
310
- }
311
- return null;
312
- }
313
- function getComparableUserMessage(entry) {
314
- if (entry.type !== "message" || entry.message.role !== "user")
315
- return null;
316
- const body = contentToText(entry.message.content);
317
- const normalizedText = normalizeComparableUserText(body);
318
- if (!normalizedText)
319
- return null;
320
- const messageTimestamp = typeof entry.message.timestamp === "number" ? entry.message.timestamp : undefined;
321
- return { normalizedText, messageTimestamp };
322
- }
323
- function normalizeComparableUserText(text) {
324
- 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)/, "");
325
- return stripSlackAttachmentBlock(withoutTimestamp).trim();
326
- }
327
- function stripSlackAttachmentBlock(text) {
328
- return text.replace(/\n*<slack_attachments>\n[\s\S]*?\n<\/slack_attachments>\s*$/g, "");
329
- }
330
- function extractSessionSummary(entries) {
331
- for (const entry of entries) {
332
- if (entry.type !== "message")
333
- continue;
334
- const item = mapEntryToItem(entry);
335
- if (!item?.body)
336
- continue;
337
- return collapseSummary(item.body);
338
- }
339
- return undefined;
340
- }
341
- function collapseSummary(text) {
342
- const singleLine = text.replace(/\s+/g, " ").trim();
343
- return singleLine.length > 96 ? `${singleLine.slice(0, 93)}…` : singleLine;
344
- }
345
- function mapEntryToItem(entry) {
346
- switch (entry.type) {
347
- case "message":
348
- return mapMessageEntry(entry);
349
- case "model_change":
350
- return {
351
- kind: "system",
352
- title: "Model changed",
353
- body: `${entry.provider} / ${entry.modelId}`,
354
- meta: entryIsoTime(entry) ?? "",
355
- tone: "muted",
356
- };
357
- case "thinking_level_change":
358
- return {
359
- kind: "system",
360
- title: "Thinking level changed",
361
- body: entry.thinkingLevel,
362
- meta: entryIsoTime(entry) ?? "",
363
- tone: "muted",
364
- };
365
- case "compaction":
366
- return mapCompactionEntry(entry);
367
- case "branch_summary":
368
- return mapSessionSummaryEntry(entry);
369
- case "custom":
370
- return {
371
- kind: "system",
372
- title: `Custom data · ${entry.customType}`,
373
- body: entry.data === undefined ? "(no data)" : JSON.stringify(entry.data, null, 2),
374
- meta: entryIsoTime(entry) ?? "",
375
- tone: "muted",
376
- };
377
- default:
378
- return null;
379
- }
380
- }
381
- function mapMessageEntry(entry) {
382
- const message = entry.message;
383
- switch (message.role) {
384
- case "user":
385
- return {
386
- kind: "user",
387
- title: "User",
388
- body: contentToText(message.content),
389
- meta: entryIsoTime(entry) ?? "",
390
- entryId: entry.id,
391
- };
392
- case "assistant": {
393
- const assistantBody = contentToText(message.content) || (message.errorMessage ? `_${message.errorMessage}_` : "");
394
- const metaParts = [message.provider, message.model, message.stopReason].filter(Boolean);
395
- return {
396
- kind: "assistant",
397
- title: "Assistant",
398
- body: assistantBody,
399
- meta: metaParts.length > 0
400
- ? `${entryIsoTime(entry) ?? ""} · ${metaParts.join(" · ")}`
401
- : (entryIsoTime(entry) ?? ""),
402
- entryId: entry.id,
403
- };
404
- }
405
- case "toolResult":
406
- return {
407
- kind: "tool",
408
- title: `Tool result · ${String(message.toolName ?? "unknown")}`,
409
- body: contentToText(message.content),
410
- meta: entryIsoTime(entry) ?? "",
411
- tone: message.isError ? "err" : "ok",
412
- entryId: entry.id,
413
- };
414
- case "bashExecution": {
415
- const command = String(message.command ?? "").trim();
416
- const output = String(message.output ?? "").trim();
417
- const details = [
418
- typeof message.exitCode === "number" ? `[exitCode] ${message.exitCode}` : "",
419
- message.cancelled ? `[cancelled] true` : "",
420
- message.truncated ? `[truncated] true` : "",
421
- ].filter(Boolean);
422
- const body = [command ? `$ ${command}` : "", output, ...details].filter(Boolean).join("\n\n");
423
- return {
424
- kind: "tool",
425
- title: "Bash execution",
426
- body: body || "(no output)",
427
- meta: entryIsoTime(entry) ?? "",
428
- entryId: entry.id,
429
- };
430
- }
431
- case "custom":
432
- return {
433
- kind: "system",
434
- title: `Custom message · ${String(message.customType ?? "custom")}`,
435
- body: contentToText(message.content),
436
- meta: entryIsoTime(entry) ?? "",
437
- tone: "muted",
438
- entryId: entry.id,
439
- };
440
- case "branchSummary":
441
- return {
442
- kind: "system",
443
- title: "Session summary",
444
- body: String(message.summary ?? ""),
445
- meta: entryIsoTime(entry) ?? "",
446
- tone: "muted",
447
- entryId: entry.id,
448
- };
449
- case "compactionSummary":
450
- return {
451
- kind: "system",
452
- title: "Compaction summary",
453
- body: String(message.summary ?? ""),
454
- meta: entryIsoTime(entry) ?? "",
455
- tone: "muted",
456
- entryId: entry.id,
457
- };
458
- default:
459
- return {
460
- kind: "system",
461
- title: `Message · ${String(message.role ?? "unknown")}`,
462
- body: contentToText(message.content),
463
- meta: entryIsoTime(entry) ?? "",
464
- tone: "muted",
465
- entryId: entry.id,
466
- };
467
- }
468
- }
469
- function mapCompactionEntry(entry) {
470
- return {
471
- kind: "system",
472
- title: "Context compacted",
473
- body: entry.summary,
474
- meta: `${entryIsoTime(entry) ?? ""} · ${entry.tokensBefore} tokens before compaction`,
475
- tone: "muted",
476
- };
477
- }
478
- function mapSessionSummaryEntry(entry) {
479
- return {
480
- kind: "system",
481
- title: "Session summary",
482
- body: entry.summary,
483
- meta: entryIsoTime(entry) ?? "",
484
- tone: "muted",
485
- };
486
- }
487
- function contentToText(content) {
488
- if (typeof content === "string")
489
- return content;
490
- if (!Array.isArray(content))
491
- return "";
492
- const lines = [];
493
- for (const block of content) {
494
- if (!block || typeof block !== "object")
495
- continue;
496
- const value = block;
497
- if (value.type === "text" && typeof value.text === "string") {
498
- lines.push(value.text);
499
- continue;
500
- }
501
- if (value.type === "thinking" && typeof value.thinking === "string") {
502
- lines.push(`[thinking]\n${value.thinking}`);
503
- continue;
504
- }
505
- if (value.type === "toolCall") {
506
- const name = typeof value.name === "string" ? value.name : "tool";
507
- const args = value.arguments === undefined ? "" : JSON.stringify(value.arguments, null, 2);
508
- lines.push([`[toolCall] ${name}`, args].filter(Boolean).join("\n"));
509
- continue;
510
- }
511
- if (value.type === "image") {
512
- lines.push(`[image ${String(value.mimeType ?? "unknown")}]`);
513
- }
514
- }
515
- return lines.join("\n\n");
516
- }
517
- //# sourceMappingURL=service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/web/session-view/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, join, resolve } from \"node:path\";\nimport { existsSync, readdirSync } from \"node:fs\";\nimport {\n SessionStore,\n type BranchSummaryEntry as SessionBranchSummaryEntry,\n type CompactionEntry,\n type SessionEntry,\n type SessionMessageEntry,\n} from \"../../harness/index.js\";\nimport {\n getThreadSessionFile,\n resolveChannelSessionFile,\n tryResolveThreadSession,\n} from \"../../sessions/store.js\";\nimport { isPlatformHistorySession } from \"../../sessions/store.js\";\nimport { isThreadSessionKey } from \"../../sessions/session-key.js\";\nimport * as log from \"../../log.js\";\n\nexport type { SessionViewItem, SessionViewRelation, SessionViewModel } from \"./types.js\";\nimport type { SessionHeader } from \"../../harness/types.js\";\nimport type { SessionViewItem, SessionViewRelation, SessionViewModel } from \"./types.js\";\n\nfunction entryIsoTime(entry: SessionEntry | undefined): string | undefined {\n if (!entry || typeof entry.timestamp !== \"number\" || !Number.isFinite(entry.timestamp)) {\n return undefined;\n }\n return new Date(entry.timestamp).toISOString();\n}\n\nexport function resolveExistingSessionFile(\n conversationDir: string,\n sessionKey: string,\n): string | null {\n if (isThreadSessionKey(sessionKey)) {\n return tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey));\n }\n return resolveChannelSessionFile(conversationDir);\n}\n\nexport async function loadSessionViewModel(sessionFile: string): Promise<SessionViewModel> {\n const resolvedFile = resolve(sessionFile);\n const sm = await SessionStore.inspect(resolvedFile);\n const header = sm.getHeader();\n\n const entries = await sm.getEntries();\n const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;\n const title = (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`;\n\n const parent = await resolveParentRelation(resolvedFile, header);\n const threadCandidates: SessionViewRelation[] = [];\n for (const candidate of listRelatedSessionFiles(resolvedFile)) {\n if (candidate === resolvedFile) continue;\n const relation = await buildSessionRelation(\n candidate,\n \"thread\",\n resolvedFile,\n header.id,\n entries,\n );\n if (relation) threadCandidates.push(relation);\n }\n const threads = threadCandidates.toSorted((a, b) =>\n a.updatedAt < b.updatedAt ? -1 : a.updatedAt > b.updatedAt ? 1 : 0,\n );\n\n const threadsByEntryId = new Map<string, SessionViewRelation[]>();\n for (const thread of threads) {\n if (!thread.anchorEntryId) continue;\n const bucket = threadsByEntryId.get(thread.anchorEntryId) ?? [];\n bucket.push(thread);\n threadsByEntryId.set(thread.anchorEntryId, bucket);\n }\n\n const items = entries.flatMap((entry) => {\n const item = mapEntryToItem(entry);\n if (!item) return [];\n if (item.entryId) {\n const anchoredThreads = threadsByEntryId.get(item.entryId);\n if (anchoredThreads) {\n item.threads = anchoredThreads;\n }\n }\n return [item];\n });\n\n return {\n sessionId: header.id,\n fileName: basename(resolvedFile),\n title,\n createdAt: header.timestamp,\n updatedAt,\n entryCount: entries.length,\n items,\n parent: parent ?? undefined,\n threads,\n };\n}\n\nexport async function resolveRequestedSessionFile(\n baseSessionFile: string,\n requestedFileName?: string | null,\n): Promise<string | null> {\n const resolvedBase = resolve(baseSessionFile);\n if (!requestedFileName) return resolvedBase;\n\n const trimmed = requestedFileName.trim();\n if (!trimmed) return resolvedBase;\n\n const fileName = basename(trimmed);\n if (fileName !== trimmed || !fileName.endsWith(\".jsonl\")) return null;\n\n const candidate = join(dirname(resolvedBase), fileName);\n if (!existsSync(candidate)) return null;\n\n try {\n await SessionStore.open(candidate);\n } catch (err) {\n throw new Error(\n `Session file is corrupted: ${candidate}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n { cause: err },\n );\n }\n return candidate;\n}\n\nfunction listRelatedSessionFiles(sessionFile: string): string[] {\n const dir = dirname(sessionFile);\n if (!existsSync(dir)) return [];\n\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".jsonl\"))\n .map((fileName) => join(dir, fileName));\n}\n\nasync function buildSessionRelation(\n sessionFile: string,\n kind: \"parent\" | \"thread\",\n expectedParent?: string,\n expectedParentId?: string,\n expectedParentEntries?: SessionEntry[],\n): Promise<SessionViewRelation | null> {\n let sm: Awaited<ReturnType<typeof SessionStore.inspect>>;\n try {\n sm = await SessionStore.inspect(sessionFile);\n } catch (err) {\n log.logWarning(\n `Skipping corrupted session file while building ${kind} relation: ${sessionFile}`,\n err instanceof Error ? err.message : String(err),\n );\n return null;\n }\n const header = sm.getHeader();\n if (\n kind === \"thread\" &&\n !isChildThreadSession(\n sessionFile,\n header.parentSession,\n expectedParent,\n expectedParentId,\n header.parentSessionId,\n )\n ) {\n return null;\n }\n\n const entries = await sm.getEntries();\n const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;\n const threadId = kind === \"thread\" ? getFixedThreadSessionId(sessionFile) : null;\n const anchorEntryId =\n kind === \"thread\" && expectedParent\n ? findThreadAnchorEntryId(\n expectedParentEntries ??\n (await (await SessionStore.inspect(expectedParent)).getEntries()),\n entries,\n threadId,\n )\n : undefined;\n return {\n kind,\n fileName: basename(sessionFile),\n sessionId: header.id,\n title: (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`,\n updatedAt,\n entryCount: entries.length,\n summary: extractSessionSummary(entries),\n anchorEntryId,\n };\n}\n\nasync function resolveParentRelation(\n sessionFile: string,\n header: SessionHeader,\n): Promise<SessionViewRelation | undefined> {\n if (header.parentSession) {\n const parentPath = resolve(header.parentSession);\n if (existsSync(parentPath)) {\n return (await buildSessionRelation(parentPath, \"parent\")) ?? undefined;\n }\n // Path is stale — try UUID fallback before heuristic.\n if (header.parentSessionId) {\n const found = findSessionFileById(dirname(sessionFile), header.parentSessionId);\n if (found) return (await buildSessionRelation(found, \"parent\")) ?? undefined;\n }\n }\n return buildInferredThreadParentRelation(sessionFile);\n}\n\nfunction findSessionFileById(sessionDir: string, targetId: string): string | null {\n if (!existsSync(sessionDir)) return null;\n for (const name of readdirSync(sessionDir)) {\n if (!name.endsWith(\".jsonl\")) continue;\n try {\n const filePath = join(sessionDir, name);\n if (SessionStore.readHeader(filePath)?.id === targetId) return filePath;\n } catch {\n continue;\n }\n }\n return null;\n}\n\nasync function buildInferredThreadParentRelation(\n sessionFile: string,\n): Promise<SessionViewRelation | undefined> {\n if (!getFixedThreadSessionId(sessionFile)) return undefined;\n\n const parentSession = resolveChannelSessionFile(dirname(dirname(sessionFile)));\n if (!parentSession || parentSession === sessionFile) return undefined;\n\n return (await buildSessionRelation(parentSession, \"parent\")) ?? undefined;\n}\n\nfunction isChildThreadSession(\n sessionFile: string,\n parentSession: string | undefined,\n expectedParent: string | undefined,\n expectedParentId?: string,\n threadParentSessionId?: string,\n): boolean {\n if (!expectedParent) return false;\n\n if (parentSession) {\n const resolvedParent = resolve(parentSession);\n if (\n resolvedParent === expectedParent ||\n (isPlatformHistorySession(expectedParent) && isPlatformHistorySession(resolvedParent))\n ) {\n return true;\n }\n // Path is stale — fall back to UUID comparison.\n if (expectedParentId && threadParentSessionId) {\n return threadParentSessionId === expectedParentId;\n }\n return false;\n }\n\n if (!getFixedThreadSessionId(sessionFile)) return false;\n return resolveChannelSessionFile(dirname(dirname(sessionFile))) === expectedParent;\n}\n\nfunction getFixedThreadSessionId(sessionFile: string): string | null {\n const fileName = basename(sessionFile);\n if (!fileName.endsWith(\".jsonl\")) return null;\n if (/^\\d{4}-\\d{2}-\\d{2}T.+_[0-9a-f]{8}\\.jsonl$/i.test(fileName)) return null;\n return fileName.slice(0, -\".jsonl\".length);\n}\n\nfunction findThreadAnchorEntryId(\n parentEntries: SessionEntry[],\n childEntries: SessionEntry[],\n threadId: string | null,\n): string | undefined {\n const threadTimestamp = parseThreadTimestamp(threadId);\n if (threadTimestamp !== undefined) {\n const timestampAnchor = findEntryIdByMessageTimestamp(parentEntries, threadTimestamp);\n if (timestampAnchor) return timestampAnchor;\n }\n let sharedCount = 0;\n while (\n sharedCount < parentEntries.length &&\n sharedCount < childEntries.length &&\n parentEntries[sharedCount]?.id === childEntries[sharedCount]?.id\n ) {\n sharedCount += 1;\n }\n\n if (sharedCount > 0) {\n return parentEntries[sharedCount - 1]?.id;\n }\n\n const contentAnchor = findSharedContentAnchorEntryId(parentEntries, childEntries);\n if (contentAnchor) return contentAnchor;\n\n const childRoot = findComparableUserMessage(childEntries);\n if (!childRoot) return undefined;\n\n return findParentAnchorByRootMessage(parentEntries, childRoot);\n}\n\nfunction parseThreadTimestamp(threadId: string | null): number | undefined {\n if (!threadId) return undefined;\n const timestamp = Number(threadId) * 1000;\n return Number.isFinite(timestamp) ? timestamp : undefined;\n}\n\nfunction findEntryIdByMessageTimestamp(\n entries: SessionEntry[],\n timestamp: number,\n): string | undefined {\n for (const entry of entries) {\n if (entry.type !== \"message\") continue;\n const messageTimestamp = (entry.message as { timestamp?: unknown }).timestamp;\n if (messageTimestamp === timestamp) return entry.id;\n }\n return undefined;\n}\n\nfunction findSharedContentAnchorEntryId(\n parentEntries: SessionEntry[],\n childEntries: SessionEntry[],\n): string | undefined {\n const parentMessages = parentEntries.flatMap((entry) => {\n const comparable = getComparableSessionMessage(entry);\n return comparable ? [comparable] : [];\n });\n const childMessages = childEntries.flatMap((entry) => {\n const comparable = getComparableSessionMessage(entry);\n return comparable ? [comparable] : [];\n });\n if (parentMessages.length === 0 || childMessages.length === 0) return undefined;\n\n let bestParentEnd = -1;\n let bestLength = 0;\n for (let parentStart = 0; parentStart < parentMessages.length; parentStart++) {\n let length = 0;\n while (parentStart + length < parentMessages.length && length < childMessages.length) {\n const parentMessage = parentMessages[parentStart + length];\n const childMessage = childMessages[length];\n if (\n parentMessage === undefined ||\n childMessage === undefined ||\n !comparableSessionMessagesMatch(parentMessage, childMessage)\n ) {\n break;\n }\n length += 1;\n }\n if (length > bestLength) {\n bestLength = length;\n bestParentEnd = parentStart + length - 1;\n }\n }\n\n return bestLength > 0 ? parentMessages[bestParentEnd]?.entryId : undefined;\n}\n\ninterface ComparableSessionMessage {\n entryId: string;\n role: \"user\" | \"assistant\";\n normalizedText: string;\n}\n\nfunction getComparableSessionMessage(entry: SessionEntry): ComparableSessionMessage | null {\n if (entry.type !== \"message\") return null;\n const role = entry.message.role;\n if (role !== \"user\" && role !== \"assistant\") return null;\n\n const body = contentToText(entry.message.content);\n const normalizedText = normalizeComparableSessionText(body, role);\n if (!normalizedText) return null;\n\n return { entryId: entry.id, role, normalizedText };\n}\n\nfunction comparableSessionMessagesMatch(\n parent: ComparableSessionMessage,\n child: ComparableSessionMessage,\n): boolean {\n return parent.role === child.role && parent.normalizedText === child.normalizedText;\n}\n\nfunction normalizeComparableSessionText(text: string, role: \"user\" | \"assistant\"): string {\n const normalized = role === \"user\" ? normalizeComparableUserText(text) : text.trim();\n return normalized.replace(/\\s+/g, \" \").trim();\n}\n\nfunction findParentAnchorByRootMessage(\n parentEntries: SessionEntry[],\n childRoot: ComparableUserMessage,\n): string | undefined {\n let textMatchId: string | undefined;\n\n for (const entry of parentEntries) {\n const comparable = getComparableUserMessage(entry);\n if (!comparable) continue;\n if (comparable.normalizedText !== childRoot.normalizedText) continue;\n if (\n childRoot.messageTimestamp !== undefined &&\n comparable.messageTimestamp !== undefined &&\n comparable.messageTimestamp === childRoot.messageTimestamp\n ) {\n return entry.id;\n }\n textMatchId ??= entry.id;\n }\n\n return textMatchId;\n}\n\ninterface ComparableUserMessage {\n normalizedText: string;\n messageTimestamp?: number;\n}\n\nfunction findComparableUserMessage(entries: SessionEntry[]): ComparableUserMessage | null {\n for (const entry of entries) {\n const comparable = getComparableUserMessage(entry);\n if (comparable) return comparable;\n }\n return null;\n}\n\nfunction getComparableUserMessage(entry: SessionEntry): ComparableUserMessage | null {\n if (entry.type !== \"message\" || entry.message.role !== \"user\") return null;\n\n const body = contentToText(entry.message.content);\n const normalizedText = normalizeComparableUserText(body);\n if (!normalizedText) return null;\n\n const messageTimestamp =\n typeof entry.message.timestamp === \"number\" ? entry.message.timestamp : undefined;\n return { normalizedText, messageTimestamp };\n}\n\nfunction normalizeComparableUserText(text: string): string {\n const withoutTimestamp = text.replace(\n /^\\[[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)/,\n \"\",\n );\n return stripSlackAttachmentBlock(withoutTimestamp).trim();\n}\n\nfunction stripSlackAttachmentBlock(text: string): string {\n return text.replace(/\\n*<slack_attachments>\\n[\\s\\S]*?\\n<\\/slack_attachments>\\s*$/g, \"\");\n}\n\nfunction extractSessionSummary(entries: SessionEntry[]): string | undefined {\n for (const entry of entries) {\n if (entry.type !== \"message\") continue;\n const item = mapEntryToItem(entry);\n if (!item?.body) continue;\n return collapseSummary(item.body);\n }\n return undefined;\n}\n\nfunction collapseSummary(text: string): string {\n const singleLine = text.replace(/\\s+/g, \" \").trim();\n return singleLine.length > 96 ? `${singleLine.slice(0, 93)}…` : singleLine;\n}\n\nfunction mapEntryToItem(entry: SessionEntry): SessionViewItem | null {\n switch (entry.type) {\n case \"message\":\n return mapMessageEntry(entry);\n case \"model_change\":\n return {\n kind: \"system\",\n title: \"Model changed\",\n body: `${entry.provider} / ${entry.modelId}`,\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n };\n case \"thinking_level_change\":\n return {\n kind: \"system\",\n title: \"Thinking level changed\",\n body: entry.thinkingLevel,\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n };\n case \"compaction\":\n return mapCompactionEntry(entry);\n case \"branch_summary\":\n return mapSessionSummaryEntry(entry);\n case \"custom\":\n return {\n kind: \"system\",\n title: `Custom data · ${entry.customType}`,\n body: entry.data === undefined ? \"(no data)\" : JSON.stringify(entry.data, null, 2),\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n };\n default:\n return null;\n }\n}\n\nfunction mapMessageEntry(entry: SessionMessageEntry): SessionViewItem {\n const message = entry.message as unknown as Record<string, unknown> & {\n role?: string;\n content?: unknown;\n provider?: string;\n model?: string;\n toolName?: string;\n isError?: boolean;\n command?: string;\n output?: string;\n exitCode?: number;\n cancelled?: boolean;\n truncated?: boolean;\n stopReason?: string;\n errorMessage?: string;\n customType?: string;\n summary?: string;\n };\n\n switch (message.role) {\n case \"user\":\n return {\n kind: \"user\",\n title: \"User\",\n body: contentToText(message.content),\n meta: entryIsoTime(entry) ?? \"\",\n entryId: entry.id,\n };\n case \"assistant\": {\n const assistantBody =\n contentToText(message.content) || (message.errorMessage ? `_${message.errorMessage}_` : \"\");\n const metaParts = [message.provider, message.model, message.stopReason].filter(Boolean);\n return {\n kind: \"assistant\",\n title: \"Assistant\",\n body: assistantBody,\n meta:\n metaParts.length > 0\n ? `${entryIsoTime(entry) ?? \"\"} · ${metaParts.join(\" · \")}`\n : (entryIsoTime(entry) ?? \"\"),\n entryId: entry.id,\n };\n }\n case \"toolResult\":\n return {\n kind: \"tool\",\n title: `Tool result · ${String(message.toolName ?? \"unknown\")}`,\n body: contentToText(message.content),\n meta: entryIsoTime(entry) ?? \"\",\n tone: message.isError ? \"err\" : \"ok\",\n entryId: entry.id,\n };\n case \"bashExecution\": {\n const command = String(message.command ?? \"\").trim();\n const output = String(message.output ?? \"\").trim();\n const details = [\n typeof message.exitCode === \"number\" ? `[exitCode] ${message.exitCode}` : \"\",\n message.cancelled ? `[cancelled] true` : \"\",\n message.truncated ? `[truncated] true` : \"\",\n ].filter(Boolean);\n const body = [command ? `$ ${command}` : \"\", output, ...details].filter(Boolean).join(\"\\n\\n\");\n return {\n kind: \"tool\",\n title: \"Bash execution\",\n body: body || \"(no output)\",\n meta: entryIsoTime(entry) ?? \"\",\n entryId: entry.id,\n };\n }\n case \"custom\":\n return {\n kind: \"system\",\n title: `Custom message · ${String(message.customType ?? \"custom\")}`,\n body: contentToText(message.content),\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n entryId: entry.id,\n };\n case \"branchSummary\":\n return {\n kind: \"system\",\n title: \"Session summary\",\n body: String(message.summary ?? \"\"),\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n entryId: entry.id,\n };\n case \"compactionSummary\":\n return {\n kind: \"system\",\n title: \"Compaction summary\",\n body: String(message.summary ?? \"\"),\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n entryId: entry.id,\n };\n default:\n return {\n kind: \"system\",\n title: `Message · ${String(message.role ?? \"unknown\")}`,\n body: contentToText(message.content),\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n entryId: entry.id,\n };\n }\n}\n\nfunction mapCompactionEntry(entry: CompactionEntry): SessionViewItem {\n return {\n kind: \"system\",\n title: \"Context compacted\",\n body: entry.summary,\n meta: `${entryIsoTime(entry) ?? \"\"} · ${entry.tokensBefore} tokens before compaction`,\n tone: \"muted\",\n };\n}\n\nfunction mapSessionSummaryEntry(entry: SessionBranchSummaryEntry): SessionViewItem {\n return {\n kind: \"system\",\n title: \"Session summary\",\n body: entry.summary,\n meta: entryIsoTime(entry) ?? \"\",\n tone: \"muted\",\n };\n}\n\nfunction contentToText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n\n const lines: string[] = [];\n for (const block of content) {\n if (!block || typeof block !== \"object\") continue;\n const value = block as Record<string, unknown>;\n if (value.type === \"text\" && typeof value.text === \"string\") {\n lines.push(value.text);\n continue;\n }\n if (value.type === \"thinking\" && typeof value.thinking === \"string\") {\n lines.push(`[thinking]\\n${value.thinking}`);\n continue;\n }\n if (value.type === \"toolCall\") {\n const name = typeof value.name === \"string\" ? value.name : \"tool\";\n const args = value.arguments === undefined ? \"\" : JSON.stringify(value.arguments, null, 2);\n lines.push([`[toolCall] ${name}`, args].filter(Boolean).join(\"\\n\"));\n continue;\n }\n if (value.type === \"image\") {\n lines.push(`[image ${String(value.mimeType ?? \"unknown\")}]`);\n }\n }\n\n return lines.join(\"\\n\\n\");\n}\n"]}
@@ -1,8 +0,0 @@
1
- import type { PlatformName } from "../../adapter.js";
2
- import { InMemoryTokenStore } from "../token-store.js";
3
- export type { SessionViewToken } from "./types.js";
4
- import type { SessionViewToken } from "./types.js";
5
- export declare class InMemorySessionViewTokenStore extends InMemoryTokenStore<SessionViewToken> {
6
- create(platform: PlatformName, platformUserId: string, conversationId: string, sessionKey: string, sessionFile: string, platformUserName?: string): SessionViewToken;
7
- }
8
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/web/session-view/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,qBAAa,6BAA8B,SAAQ,kBAAkB,CAAC,gBAAgB,CAAC;IACrF,MAAM,CACJ,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,gBAAgB,CASlB;CACF"}
@@ -1,15 +0,0 @@
1
- import { InMemoryTokenStore } from "../token-store.js";
2
- const TTL_MS = 24 * 60 * 60 * 1000;
3
- export class InMemorySessionViewTokenStore extends InMemoryTokenStore {
4
- create(platform, platformUserId, conversationId, sessionKey, sessionFile, platformUserName) {
5
- return this.createRecord(TTL_MS, {
6
- platform,
7
- platformUserId,
8
- ...(platformUserName ? { platformUserName } : {}),
9
- conversationId,
10
- sessionKey,
11
- sessionFile,
12
- });
13
- }
14
- }
15
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/web/session-view/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIvD,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,OAAO,6BAA8B,SAAQ,kBAAoC;IACrF,MAAM,CACJ,QAAsB,EACtB,cAAsB,EACtB,cAAsB,EACtB,UAAkB,EAClB,WAAmB,EACnB,gBAAyB;QAEzB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAC/B,QAAQ;YACR,cAAc;YACd,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,cAAc;YACd,UAAU;YACV,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import type { PlatformName } from \"../../adapter.js\";\nimport { InMemoryTokenStore } from \"../token-store.js\";\nexport type { SessionViewToken } from \"./types.js\";\nimport type { SessionViewToken } from \"./types.js\";\n\nconst TTL_MS = 24 * 60 * 60 * 1000;\n\nexport class InMemorySessionViewTokenStore extends InMemoryTokenStore<SessionViewToken> {\n create(\n platform: PlatformName,\n platformUserId: string,\n conversationId: string,\n sessionKey: string,\n sessionFile: string,\n platformUserName?: string,\n ): SessionViewToken {\n return this.createRecord(TTL_MS, {\n platform,\n platformUserId,\n ...(platformUserName ? { platformUserName } : {}),\n conversationId,\n sessionKey,\n sessionFile,\n });\n }\n}\n"]}
File without changes