@jait/gateway 0.1.461 → 0.1.463

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 (406) hide show
  1. package/dist/api-contracts.d.ts +29 -0
  2. package/dist/api-contracts.d.ts.map +1 -0
  3. package/dist/api-contracts.js +2 -0
  4. package/dist/api-contracts.js.map +1 -0
  5. package/dist/cli/doctor.js +1 -1
  6. package/dist/cli/doctor.js.map +1 -1
  7. package/dist/db/connection.d.ts.map +1 -1
  8. package/dist/db/connection.js +15 -8
  9. package/dist/db/connection.js.map +1 -1
  10. package/dist/db/migrations.d.ts.map +1 -1
  11. package/dist/db/migrations.js +185 -0
  12. package/dist/db/migrations.js.map +1 -1
  13. package/dist/db/schema.d.ts +71 -35
  14. package/dist/db/schema.d.ts.map +1 -1
  15. package/dist/db/schema.js +21 -19
  16. package/dist/db/schema.js.map +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +108 -67
  19. package/dist/index.js.map +1 -1
  20. package/dist/memory/contracts.d.ts +2 -1
  21. package/dist/memory/contracts.d.ts.map +1 -1
  22. package/dist/memory/service.d.ts +1 -0
  23. package/dist/memory/service.d.ts.map +1 -1
  24. package/dist/memory/service.js +110 -11
  25. package/dist/memory/service.js.map +1 -1
  26. package/dist/memory/sqlite-backend.d.ts +1 -0
  27. package/dist/memory/sqlite-backend.d.ts.map +1 -1
  28. package/dist/memory/sqlite-backend.js +15 -0
  29. package/dist/memory/sqlite-backend.js.map +1 -1
  30. package/dist/plugins/contracts.d.ts +1 -1
  31. package/dist/plugins/contracts.d.ts.map +1 -1
  32. package/dist/plugins/manager.d.ts +2 -2
  33. package/dist/plugins/manager.d.ts.map +1 -1
  34. package/dist/plugins/manager.js +3 -3
  35. package/dist/plugins/manager.js.map +1 -1
  36. package/dist/providers/contracts.d.ts +2 -61
  37. package/dist/providers/contracts.d.ts.map +1 -1
  38. package/dist/providers/jait-provider.js +6 -6
  39. package/dist/providers/jait-provider.js.map +1 -1
  40. package/dist/providers/model-fetchers.d.ts +18 -0
  41. package/dist/providers/model-fetchers.d.ts.map +1 -0
  42. package/dist/providers/model-fetchers.js +136 -0
  43. package/dist/providers/model-fetchers.js.map +1 -0
  44. package/dist/providers/provider-auth.d.ts +1 -0
  45. package/dist/providers/provider-auth.d.ts.map +1 -1
  46. package/dist/providers/provider-auth.js +33 -4
  47. package/dist/providers/provider-auth.js.map +1 -1
  48. package/dist/providers/registry.d.ts +1 -1
  49. package/dist/providers/registry.d.ts.map +1 -1
  50. package/dist/providers/registry.js +2 -2
  51. package/dist/providers/registry.js.map +1 -1
  52. package/dist/routes/architecture.js +10 -10
  53. package/dist/routes/architecture.js.map +1 -1
  54. package/dist/routes/auth.js +10 -10
  55. package/dist/routes/auth.js.map +1 -1
  56. package/dist/routes/chat.d.ts +2 -2
  57. package/dist/routes/chat.d.ts.map +1 -1
  58. package/dist/routes/chat.js +197 -77
  59. package/dist/routes/chat.js.map +1 -1
  60. package/dist/routes/environment.d.ts +2 -2
  61. package/dist/routes/environment.d.ts.map +1 -1
  62. package/dist/routes/environment.js +11 -11
  63. package/dist/routes/environment.js.map +1 -1
  64. package/dist/routes/filesystem.d.ts +1 -1
  65. package/dist/routes/filesystem.js +1 -1
  66. package/dist/routes/git.js +1 -1
  67. package/dist/routes/git.js.map +1 -1
  68. package/dist/routes/jobs.js +2 -2
  69. package/dist/routes/jobs.js.map +1 -1
  70. package/dist/routes/mcp-server.d.ts +1 -1
  71. package/dist/routes/mcp-server.d.ts.map +1 -1
  72. package/dist/routes/mcp-server.js +13 -13
  73. package/dist/routes/mcp-server.js.map +1 -1
  74. package/dist/routes/preview.js +1 -1
  75. package/dist/routes/preview.js.map +1 -1
  76. package/dist/routes/project.d.ts +16 -0
  77. package/dist/routes/project.d.ts.map +1 -0
  78. package/dist/routes/{workspace.js → project.js} +100 -100
  79. package/dist/routes/project.js.map +1 -0
  80. package/dist/routes/projects.d.ts +15 -0
  81. package/dist/routes/projects.d.ts.map +1 -0
  82. package/dist/routes/{workspaces.js → projects.js} +98 -98
  83. package/dist/routes/projects.js.map +1 -0
  84. package/dist/routes/providers.d.ts.map +1 -1
  85. package/dist/routes/providers.js +1 -96
  86. package/dist/routes/providers.js.map +1 -1
  87. package/dist/routes/reminders.d.ts +2 -2
  88. package/dist/routes/reminders.d.ts.map +1 -1
  89. package/dist/routes/reminders.js +39 -17
  90. package/dist/routes/reminders.js.map +1 -1
  91. package/dist/routes/repo-proposals.d.ts.map +1 -1
  92. package/dist/routes/repo-proposals.js +16 -10
  93. package/dist/routes/repo-proposals.js.map +1 -1
  94. package/dist/routes/repositories.d.ts +2 -2
  95. package/dist/routes/repositories.d.ts.map +1 -1
  96. package/dist/routes/repositories.js +7 -6
  97. package/dist/routes/repositories.js.map +1 -1
  98. package/dist/routes/sessions.d.ts +2 -2
  99. package/dist/routes/sessions.d.ts.map +1 -1
  100. package/dist/routes/sessions.js +20 -20
  101. package/dist/routes/sessions.js.map +1 -1
  102. package/dist/routes/terminals.js +7 -7
  103. package/dist/routes/terminals.js.map +1 -1
  104. package/dist/routes/threads.js +2 -2
  105. package/dist/routes/threads.js.map +1 -1
  106. package/dist/scheduler/hooks.d.ts +1 -1
  107. package/dist/scheduler/hooks.d.ts.map +1 -1
  108. package/dist/scheduler/hooks.js +5 -5
  109. package/dist/scheduler/hooks.js.map +1 -1
  110. package/dist/scheduler/service.d.ts +3 -3
  111. package/dist/scheduler/service.d.ts.map +1 -1
  112. package/dist/scheduler/service.js +8 -8
  113. package/dist/scheduler/service.js.map +1 -1
  114. package/dist/security/path-guard.d.ts +6 -6
  115. package/dist/security/path-guard.d.ts.map +1 -1
  116. package/dist/security/path-guard.js +8 -8
  117. package/dist/security/path-guard.js.map +1 -1
  118. package/dist/security/sandbox-manager.d.ts +5 -5
  119. package/dist/security/sandbox-manager.d.ts.map +1 -1
  120. package/dist/security/sandbox-manager.js +14 -14
  121. package/dist/security/sandbox-manager.js.map +1 -1
  122. package/dist/security/tool-permissions.d.ts +1 -1
  123. package/dist/security/tool-permissions.d.ts.map +1 -1
  124. package/dist/security/tool-profiles.d.ts.map +1 -1
  125. package/dist/security/tool-profiles.js +15 -12
  126. package/dist/security/tool-profiles.js.map +1 -1
  127. package/dist/server.d.ts +4 -4
  128. package/dist/server.d.ts.map +1 -1
  129. package/dist/server.js +16 -16
  130. package/dist/server.js.map +1 -1
  131. package/dist/services/architecture-diagrams.d.ts +3 -3
  132. package/dist/services/architecture-diagrams.d.ts.map +1 -1
  133. package/dist/services/architecture-diagrams.js +19 -19
  134. package/dist/services/architecture-diagrams.js.map +1 -1
  135. package/dist/services/git.d.ts +1 -1
  136. package/dist/services/git.d.ts.map +1 -1
  137. package/dist/services/git.js +3 -3
  138. package/dist/services/git.js.map +1 -1
  139. package/dist/services/live-view-manager.d.ts +1 -1
  140. package/dist/services/live-view-manager.d.ts.map +1 -1
  141. package/dist/services/live-view-manager.js +2 -2
  142. package/dist/services/live-view-manager.js.map +1 -1
  143. package/dist/services/plans.d.ts +2 -13
  144. package/dist/services/plans.d.ts.map +1 -1
  145. package/dist/services/plans.js.map +1 -1
  146. package/dist/services/preview-runner.d.ts +5 -5
  147. package/dist/services/preview-runner.d.ts.map +1 -1
  148. package/dist/services/preview-runner.js +19 -19
  149. package/dist/services/preview-runner.js.map +1 -1
  150. package/dist/services/preview.d.ts +2 -2
  151. package/dist/services/preview.d.ts.map +1 -1
  152. package/dist/services/preview.js +8 -8
  153. package/dist/services/preview.js.map +1 -1
  154. package/dist/services/project-repositories.d.ts +35 -0
  155. package/dist/services/project-repositories.d.ts.map +1 -0
  156. package/dist/services/{workspace-repositories.js → project-repositories.js} +34 -34
  157. package/dist/services/project-repositories.js.map +1 -0
  158. package/dist/services/project-state.d.ts +8 -0
  159. package/dist/services/project-state.d.ts.map +1 -0
  160. package/dist/services/{workspace-state.js → project-state.js} +25 -25
  161. package/dist/services/project-state.js.map +1 -0
  162. package/dist/services/{workspace-watcher.d.ts → project-watcher.d.ts} +8 -8
  163. package/dist/services/project-watcher.d.ts.map +1 -0
  164. package/dist/services/{workspace-watcher.js → project-watcher.js} +7 -7
  165. package/dist/services/project-watcher.js.map +1 -0
  166. package/dist/services/{workspaces.d.ts → projects.d.ts} +13 -13
  167. package/dist/services/projects.d.ts.map +1 -0
  168. package/dist/services/{workspaces.js → projects.js} +54 -54
  169. package/dist/services/projects.js.map +1 -0
  170. package/dist/services/reminders.d.ts +16 -4
  171. package/dist/services/reminders.d.ts.map +1 -1
  172. package/dist/services/reminders.js +152 -11
  173. package/dist/services/reminders.js.map +1 -1
  174. package/dist/services/repo-proposals.d.ts +3 -14
  175. package/dist/services/repo-proposals.d.ts.map +1 -1
  176. package/dist/services/repo-proposals.js.map +1 -1
  177. package/dist/services/repositories.d.ts +3 -13
  178. package/dist/services/repositories.d.ts.map +1 -1
  179. package/dist/services/repositories.js +10 -2
  180. package/dist/services/repositories.js.map +1 -1
  181. package/dist/services/session-search.d.ts +34 -0
  182. package/dist/services/session-search.d.ts.map +1 -0
  183. package/dist/services/session-search.js +137 -0
  184. package/dist/services/session-search.js.map +1 -0
  185. package/dist/services/session-state.js +1 -1
  186. package/dist/services/sessions.d.ts +22 -22
  187. package/dist/services/sessions.d.ts.map +1 -1
  188. package/dist/services/sessions.js +21 -21
  189. package/dist/services/sessions.js.map +1 -1
  190. package/dist/services/threads.d.ts +3 -50
  191. package/dist/services/threads.d.ts.map +1 -1
  192. package/dist/services/threads.js.map +1 -1
  193. package/dist/services/users.d.ts +4 -4
  194. package/dist/services/users.d.ts.map +1 -1
  195. package/dist/services/users.js +16 -16
  196. package/dist/services/users.js.map +1 -1
  197. package/dist/sessions/contracts.d.ts +4 -4
  198. package/dist/sessions/contracts.d.ts.map +1 -1
  199. package/dist/skills/index.d.ts +1 -1
  200. package/dist/skills/index.d.ts.map +1 -1
  201. package/dist/surfaces/browser.js +1 -1
  202. package/dist/surfaces/browser.js.map +1 -1
  203. package/dist/surfaces/contracts.d.ts +1 -1
  204. package/dist/surfaces/contracts.d.ts.map +1 -1
  205. package/dist/surfaces/filesystem.d.ts +1 -1
  206. package/dist/surfaces/filesystem.d.ts.map +1 -1
  207. package/dist/surfaces/filesystem.js +18 -18
  208. package/dist/surfaces/filesystem.js.map +1 -1
  209. package/dist/surfaces/remote-filesystem.d.ts +2 -2
  210. package/dist/surfaces/remote-filesystem.d.ts.map +1 -1
  211. package/dist/surfaces/remote-filesystem.js +6 -6
  212. package/dist/surfaces/remote-filesystem.js.map +1 -1
  213. package/dist/surfaces/terminal.js +2 -2
  214. package/dist/surfaces/terminal.js.map +1 -1
  215. package/dist/tools/agent-loop.d.ts +15 -0
  216. package/dist/tools/agent-loop.d.ts.map +1 -1
  217. package/dist/tools/agent-loop.js +121 -14
  218. package/dist/tools/agent-loop.js.map +1 -1
  219. package/dist/tools/agent-tools.d.ts.map +1 -1
  220. package/dist/tools/agent-tools.js +2 -1
  221. package/dist/tools/agent-tools.js.map +1 -1
  222. package/dist/tools/architecture-tools.js +8 -8
  223. package/dist/tools/architecture-tools.js.map +1 -1
  224. package/dist/tools/browser-tools.d.ts +1 -1
  225. package/dist/tools/browser-tools.d.ts.map +1 -1
  226. package/dist/tools/browser-tools.js +3 -3
  227. package/dist/tools/browser-tools.js.map +1 -1
  228. package/dist/tools/chat-modes.d.ts +1 -1
  229. package/dist/tools/chat-modes.d.ts.map +1 -1
  230. package/dist/tools/chat-modes.js +2 -0
  231. package/dist/tools/chat-modes.js.map +1 -1
  232. package/dist/tools/contracts.d.ts +1 -1
  233. package/dist/tools/contracts.d.ts.map +1 -1
  234. package/dist/tools/core/execute.d.ts +1 -1
  235. package/dist/tools/core/execute.d.ts.map +1 -1
  236. package/dist/tools/core/execute.js +1 -1
  237. package/dist/tools/core/execute.js.map +1 -1
  238. package/dist/tools/core/get-fs.d.ts +9 -9
  239. package/dist/tools/core/get-fs.d.ts.map +1 -1
  240. package/dist/tools/core/get-fs.js +20 -20
  241. package/dist/tools/core/get-fs.js.map +1 -1
  242. package/dist/tools/core/jait.d.ts +3 -3
  243. package/dist/tools/core/jait.d.ts.map +1 -1
  244. package/dist/tools/core/jait.js +9 -9
  245. package/dist/tools/core/jait.js.map +1 -1
  246. package/dist/tools/core/read.d.ts +1 -1
  247. package/dist/tools/core/read.d.ts.map +1 -1
  248. package/dist/tools/core/search.d.ts +2 -2
  249. package/dist/tools/core/search.d.ts.map +1 -1
  250. package/dist/tools/core/search.js +5 -5
  251. package/dist/tools/core/search.js.map +1 -1
  252. package/dist/tools/cron-tools.js +2 -2
  253. package/dist/tools/cron-tools.js.map +1 -1
  254. package/dist/tools/elevated-tools.js +3 -3
  255. package/dist/tools/elevated-tools.js.map +1 -1
  256. package/dist/tools/file-tools.js +4 -4
  257. package/dist/tools/file-tools.js.map +1 -1
  258. package/dist/tools/index.d.ts +7 -4
  259. package/dist/tools/index.d.ts.map +1 -1
  260. package/dist/tools/index.js +14 -7
  261. package/dist/tools/index.js.map +1 -1
  262. package/dist/tools/memory-tools.d.ts +8 -4
  263. package/dist/tools/memory-tools.d.ts.map +1 -1
  264. package/dist/tools/memory-tools.js +58 -11
  265. package/dist/tools/memory-tools.js.map +1 -1
  266. package/dist/tools/preview-tools.d.ts +1 -1
  267. package/dist/tools/preview-tools.d.ts.map +1 -1
  268. package/dist/tools/preview-tools.js +10 -10
  269. package/dist/tools/preview-tools.js.map +1 -1
  270. package/dist/tools/{workspace-tools.d.ts → project-tools.d.ts} +4 -4
  271. package/dist/tools/project-tools.d.ts.map +1 -0
  272. package/dist/tools/{workspace-tools.js → project-tools.js} +28 -28
  273. package/dist/tools/project-tools.js.map +1 -0
  274. package/dist/tools/prompts/claude-prompt.js +4 -4
  275. package/dist/tools/prompts/default-openai-prompt.js +1 -1
  276. package/dist/tools/prompts/default-prompt.js +1 -1
  277. package/dist/tools/prompts/gemini-prompt.js +4 -4
  278. package/dist/tools/prompts/gpt5-prompt.js +3 -3
  279. package/dist/tools/prompts/gpt51-prompt.js +2 -2
  280. package/dist/tools/prompts/gpt52-prompt.js +2 -2
  281. package/dist/tools/prompts/prompt-registry.d.ts +2 -2
  282. package/dist/tools/prompts/prompt-registry.d.ts.map +1 -1
  283. package/dist/tools/prompts/prompt-registry.js +5 -5
  284. package/dist/tools/prompts/prompt-registry.js.map +1 -1
  285. package/dist/tools/prompts/shared-sections.d.ts +3 -3
  286. package/dist/tools/prompts/shared-sections.d.ts.map +1 -1
  287. package/dist/tools/prompts/shared-sections.js +12 -10
  288. package/dist/tools/prompts/shared-sections.js.map +1 -1
  289. package/dist/tools/prompts/xai-prompt.js +2 -2
  290. package/dist/tools/remote-executor.d.ts +7 -7
  291. package/dist/tools/remote-executor.d.ts.map +1 -1
  292. package/dist/tools/remote-executor.js +14 -13
  293. package/dist/tools/remote-executor.js.map +1 -1
  294. package/dist/tools/repo-proposal-tools.js +5 -5
  295. package/dist/tools/repo-proposal-tools.js.map +1 -1
  296. package/dist/tools/session-search-tools.d.ts +12 -0
  297. package/dist/tools/session-search-tools.d.ts.map +1 -0
  298. package/dist/tools/session-search-tools.js +59 -0
  299. package/dist/tools/session-search-tools.js.map +1 -0
  300. package/dist/tools/ssh-tools.js +1 -1
  301. package/dist/tools/ssh-tools.js.map +1 -1
  302. package/dist/tools/surface-tools.d.ts +1 -1
  303. package/dist/tools/surface-tools.d.ts.map +1 -1
  304. package/dist/tools/surface-tools.js +2 -2
  305. package/dist/tools/surface-tools.js.map +1 -1
  306. package/dist/tools/terminal-tools.d.ts +2 -2
  307. package/dist/tools/terminal-tools.d.ts.map +1 -1
  308. package/dist/tools/terminal-tools.js +10 -10
  309. package/dist/tools/terminal-tools.js.map +1 -1
  310. package/dist/tools/thread-tools.d.ts.map +1 -1
  311. package/dist/tools/thread-tools.js +53 -8
  312. package/dist/tools/thread-tools.js.map +1 -1
  313. package/dist/tools/token-estimator.d.ts.map +1 -1
  314. package/dist/tools/token-estimator.js +30 -1
  315. package/dist/tools/token-estimator.js.map +1 -1
  316. package/dist/tools/tool-names.d.ts +2 -1
  317. package/dist/tools/tool-names.d.ts.map +1 -1
  318. package/dist/tools/tool-names.js +2 -1
  319. package/dist/tools/tool-names.js.map +1 -1
  320. package/dist/voice-assistant/service.d.ts +1 -1
  321. package/dist/voice-assistant/service.js +4 -4
  322. package/dist/voice-assistant/tools.d.ts +2 -2
  323. package/dist/voice-assistant/tools.d.ts.map +1 -1
  324. package/dist/voice-assistant/tools.js +14 -14
  325. package/dist/voice-assistant/tools.js.map +1 -1
  326. package/dist/ws.d.ts +1 -1
  327. package/dist/ws.d.ts.map +1 -1
  328. package/dist/ws.js +2 -2
  329. package/dist/ws.js.map +1 -1
  330. package/package.json +2 -2
  331. package/web-dist/assets/{_basePickBy-BxTNhXHf.js → _basePickBy-BM8eesD4.js} +1 -1
  332. package/web-dist/assets/{_baseUniq-BzmTBuCK.js → _baseUniq-BM6-oAti.js} +1 -1
  333. package/web-dist/assets/{arc-D_str31s.js → arc-DCuHZnW6.js} +1 -1
  334. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-iGpZ5eMv.js → architectureDiagram-2XIMDMQ5-CbghC0Jt.js} +1 -1
  335. package/web-dist/assets/{blockDiagram-WCTKOSBZ-CzaQqynl.js → blockDiagram-WCTKOSBZ-CY4EJBQ6.js} +1 -1
  336. package/web-dist/assets/{c4Diagram-IC4MRINW-PyiTG4vY.js → c4Diagram-IC4MRINW-CWy0R6Nw.js} +1 -1
  337. package/web-dist/assets/channel-C4yEM23r.js +1 -0
  338. package/web-dist/assets/{chunk-4BX2VUAB-D0T3UNJp.js → chunk-4BX2VUAB-Dc3yo1Gc.js} +1 -1
  339. package/web-dist/assets/{chunk-55IACEB6-CEZ65WgK.js → chunk-55IACEB6-ugBuFkg4.js} +1 -1
  340. package/web-dist/assets/{chunk-FMBD7UC4-P5kWRofC.js → chunk-FMBD7UC4-cu6QQh2a.js} +1 -1
  341. package/web-dist/assets/{chunk-JSJVCQXG-Cn1owVt4.js → chunk-JSJVCQXG-DTdBqiLF.js} +1 -1
  342. package/web-dist/assets/{chunk-KX2RTZJC-CC0b6eqX.js → chunk-KX2RTZJC-DFApvQwT.js} +1 -1
  343. package/web-dist/assets/{chunk-NQ4KR5QH-CNIgo-1z.js → chunk-NQ4KR5QH-4yOScl2J.js} +1 -1
  344. package/web-dist/assets/{chunk-QZHKN3VN-DF6TeuK6.js → chunk-QZHKN3VN-CM38B0WV.js} +1 -1
  345. package/web-dist/assets/{chunk-WL4C6EOR-DaZTFehP.js → chunk-WL4C6EOR-eBVrWGce.js} +1 -1
  346. package/web-dist/assets/classDiagram-VBA2DB6C-QCajg6F3.js +1 -0
  347. package/web-dist/assets/classDiagram-v2-RAHNMMFH-QCajg6F3.js +1 -0
  348. package/web-dist/assets/clone-Dqpxz3OJ.js +1 -0
  349. package/web-dist/assets/{cose-bilkent-S5V4N54A-BxdF5cV-.js → cose-bilkent-S5V4N54A-HHRRPeV9.js} +1 -1
  350. package/web-dist/assets/{dagre-KLK3FWXG-Dm4scFIL.js → dagre-KLK3FWXG-aAUSG7Mo.js} +1 -1
  351. package/web-dist/assets/{diagram-E7M64L7V-Bne6RKl6.js → diagram-E7M64L7V-BJt3zK9H.js} +1 -1
  352. package/web-dist/assets/{diagram-IFDJBPK2-j2mQ5C5l.js → diagram-IFDJBPK2-BSK9w0bb.js} +1 -1
  353. package/web-dist/assets/{diagram-P4PSJMXO-CdzuLWEw.js → diagram-P4PSJMXO-DylDASun.js} +1 -1
  354. package/web-dist/assets/{erDiagram-INFDFZHY-DZrdptsJ.js → erDiagram-INFDFZHY-C2CoituG.js} +1 -1
  355. package/web-dist/assets/{flowDiagram-PKNHOUZH-DgjJzAMy.js → flowDiagram-PKNHOUZH-C2UR2xxJ.js} +1 -1
  356. package/web-dist/assets/{ganttDiagram-A5KZAMGK-BUK9KV20.js → ganttDiagram-A5KZAMGK-ClxfUfSR.js} +1 -1
  357. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-D30kLUud.js → gitGraphDiagram-K3NZZRJ6-CHp_onyn.js} +1 -1
  358. package/web-dist/assets/{graph-Uq5Ey2rZ.js → graph-CG2WS7_t.js} +1 -1
  359. package/web-dist/assets/{index-Ceg7oKI4.js → index-BwYKBEGE.js} +1 -1
  360. package/web-dist/assets/index-CPIpYLuw.js +1504 -0
  361. package/web-dist/assets/index-CjPicmz_.css +32 -0
  362. package/web-dist/assets/{index-Dl_78WX8.js → index-DwvrR7An.js} +1 -1
  363. package/web-dist/assets/{infoDiagram-LFFYTUFH-CcayyObn.js → infoDiagram-LFFYTUFH-D-1oFNFC.js} +1 -1
  364. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-CoNyYrRv.js → ishikawaDiagram-PHBUUO56-DWcJu4vD.js} +1 -1
  365. package/web-dist/assets/{journeyDiagram-4ABVD52K-DhNuQwoO.js → journeyDiagram-4ABVD52K-CyrGxq5f.js} +1 -1
  366. package/web-dist/assets/{kanban-definition-K7BYSVSG-CiBoEtT_.js → kanban-definition-K7BYSVSG-Bq9ecx3z.js} +1 -1
  367. package/web-dist/assets/{layout-CclAjc31.js → layout-DnxR75j6.js} +1 -1
  368. package/web-dist/assets/{linear-D0T2Ue4i.js → linear-Bj4ZUyD2.js} +1 -1
  369. package/web-dist/assets/{mindmap-definition-YRQLILUH-Bs5KOLlF.js → mindmap-definition-YRQLILUH-CCzvprBn.js} +1 -1
  370. package/web-dist/assets/{pieDiagram-SKSYHLDU-D5ft8t9O.js → pieDiagram-SKSYHLDU-xDO_MmaO.js} +1 -1
  371. package/web-dist/assets/{quadrantDiagram-337W2JSQ-CTrNOfNq.js → quadrantDiagram-337W2JSQ-DACNxopk.js} +1 -1
  372. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-Lfkxswx5.js → requirementDiagram-Z7DCOOCP-CMqe5H--.js} +1 -1
  373. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-D7VXd1gH.js → sankeyDiagram-WA2Y5GQK-jn75MYj4.js} +1 -1
  374. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-BobMUXZE.js → sequenceDiagram-2WXFIKYE-C8afKJhS.js} +1 -1
  375. package/web-dist/assets/{stateDiagram-RAJIS63D-BiTIuwsM.js → stateDiagram-RAJIS63D-Ftq6oKpa.js} +1 -1
  376. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DaZO7yY_.js +1 -0
  377. package/web-dist/assets/{timeline-definition-YZTLITO2-rKlur9hp.js → timeline-definition-YZTLITO2-DQ4bUy-3.js} +1 -1
  378. package/web-dist/assets/{treemap-KZPCXAKY-BtERtPNk.js → treemap-KZPCXAKY-C9ovvl15.js} +1 -1
  379. package/web-dist/assets/{vennDiagram-LZ73GAT5-Ke0QhSrP.js → vennDiagram-LZ73GAT5-D3O9WbYV.js} +1 -1
  380. package/web-dist/assets/{xychartDiagram-JWTSCODW-Cl96gv3X.js → xychartDiagram-JWTSCODW-UqN90bHw.js} +1 -1
  381. package/web-dist/index.html +2 -2
  382. package/dist/routes/workspace.d.ts +0 -16
  383. package/dist/routes/workspace.d.ts.map +0 -1
  384. package/dist/routes/workspace.js.map +0 -1
  385. package/dist/routes/workspaces.d.ts +0 -15
  386. package/dist/routes/workspaces.d.ts.map +0 -1
  387. package/dist/routes/workspaces.js.map +0 -1
  388. package/dist/services/workspace-repositories.d.ts +0 -35
  389. package/dist/services/workspace-repositories.d.ts.map +0 -1
  390. package/dist/services/workspace-repositories.js.map +0 -1
  391. package/dist/services/workspace-state.d.ts +0 -8
  392. package/dist/services/workspace-state.d.ts.map +0 -1
  393. package/dist/services/workspace-state.js.map +0 -1
  394. package/dist/services/workspace-watcher.d.ts.map +0 -1
  395. package/dist/services/workspace-watcher.js.map +0 -1
  396. package/dist/services/workspaces.d.ts.map +0 -1
  397. package/dist/services/workspaces.js.map +0 -1
  398. package/dist/tools/workspace-tools.d.ts.map +0 -1
  399. package/dist/tools/workspace-tools.js.map +0 -1
  400. package/web-dist/assets/channel-Dpmc9iFy.js +0 -1
  401. package/web-dist/assets/classDiagram-VBA2DB6C-yqgzo6kv.js +0 -1
  402. package/web-dist/assets/classDiagram-v2-RAHNMMFH-yqgzo6kv.js +0 -1
  403. package/web-dist/assets/clone-BV2MQMkR.js +0 -1
  404. package/web-dist/assets/index-Bir79SR1.css +0 -32
  405. package/web-dist/assets/index-CPsRY9iy.js +0 -1503
  406. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-BxQjvEWb.js +0 -1
@@ -3,7 +3,7 @@ import {} from "../config.js";
3
3
  import { FileSystemSurface } from "../surfaces/filesystem.js";
4
4
  import { extractTodoResultItems } from "../providers/todo-result.js";
5
5
  import { RemoteCliProvider } from "../providers/remote-cli-provider.js";
6
- import { resolveWorkspaceRoot } from "../tools/core/get-fs.js";
6
+ import { resolveProjectRoot } from "../tools/core/get-fs.js";
7
7
  import { existsSync } from "node:fs";
8
8
  import { messages as messagesTable } from "../db/schema.js";
9
9
  import { eq } from "drizzle-orm";
@@ -40,7 +40,7 @@ function buildCliProviderSystemPrompt(provider, model, mode, promptCtx) {
40
40
  backend: provider,
41
41
  });
42
42
  }
43
- function buildExternalProviderContextFlow(requestProvider, model, setupMessage, systemPrompt, userContent, sentAt, note) {
43
+ function buildExternalProviderContextFlow(requestProvider, model, setupMessage, systemPrompt, userContent, sentAt, note, memory) {
44
44
  const messages = [
45
45
  { role: "system", content: setupMessage },
46
46
  ];
@@ -52,6 +52,7 @@ function buildExternalProviderContextFlow(requestProvider, model, setupMessage,
52
52
  provider: requestProvider,
53
53
  ...(model ? { model } : {}),
54
54
  note,
55
+ ...(memory ? { memory } : {}),
55
56
  rounds: [{
56
57
  round: 1,
57
58
  createdAt: sentAt,
@@ -60,6 +61,79 @@ function buildExternalProviderContextFlow(requestProvider, model, setupMessage,
60
61
  }],
61
62
  };
62
63
  }
64
+ function truncateForMemoryBlock(value, max = 220) {
65
+ const compact = value.replace(/\s+/g, " ").trim();
66
+ if (compact.length <= max)
67
+ return compact;
68
+ return `${compact.slice(0, max - 1)}…`;
69
+ }
70
+ function shouldIncludeContactMemories(content) {
71
+ return /\b(based on what you know|remember|preference|preferences|prefer|my usual|about me|what do you know)\b/i.test(content);
72
+ }
73
+ function memorySourceLabel(entry) {
74
+ return `${entry.source.type}:${entry.source.id}@${entry.source.surface}`;
75
+ }
76
+ function toContextFlowMemoryEntry(entry) {
77
+ return {
78
+ id: entry.id,
79
+ scope: entry.scope,
80
+ source: memorySourceLabel(entry),
81
+ sourceType: entry.source.type,
82
+ sourceId: entry.source.id,
83
+ sourceSurface: entry.source.surface,
84
+ updatedAt: entry.updatedAt,
85
+ content: truncateForMemoryBlock(entry.content),
86
+ };
87
+ }
88
+ function buildRelevantMemoryPromptBlock(entries) {
89
+ const lines = entries.slice(0, 5).map((entry) => {
90
+ const content = truncateForMemoryBlock(entry.content);
91
+ return `- [id=${entry.id} scope=${entry.scope} source=${memorySourceLabel(entry)} updated=${entry.updatedAt}] ${content}`;
92
+ });
93
+ return [
94
+ "<relevant_memory>",
95
+ "Use these memories only when they are directly relevant. Do not mention memory IDs unless the user asks for provenance.",
96
+ ...lines,
97
+ "</relevant_memory>",
98
+ ].join("\n");
99
+ }
100
+ async function retrieveRelevantMemoryContext(memoryService, content) {
101
+ const query = content.trim();
102
+ if (!memoryService || !query)
103
+ return null;
104
+ const projectMemories = await memoryService.search(query, 5, "project");
105
+ const byId = new Map();
106
+ for (const entry of projectMemories)
107
+ byId.set(entry.id, entry);
108
+ if (shouldIncludeContactMemories(query)) {
109
+ const contactMemories = await memoryService.search(query, Math.max(0, 5 - byId.size), "contact");
110
+ for (const entry of contactMemories)
111
+ byId.set(entry.id, entry);
112
+ }
113
+ const entries = [...byId.values()].slice(0, 5);
114
+ if (entries.length === 0) {
115
+ return {
116
+ block: "",
117
+ flow: {
118
+ query,
119
+ retrieved: [],
120
+ injectedIds: [],
121
+ ignoredIds: [],
122
+ savedIds: [],
123
+ },
124
+ };
125
+ }
126
+ return {
127
+ block: buildRelevantMemoryPromptBlock(entries),
128
+ flow: {
129
+ query,
130
+ retrieved: entries.map(toContextFlowMemoryEntry),
131
+ injectedIds: entries.map((entry) => entry.id),
132
+ ignoredIds: [],
133
+ savedIds: [],
134
+ },
135
+ };
136
+ }
63
137
  function buildSyntheticSkillToolCall(skills) {
64
138
  if (skills.length === 0)
65
139
  return null;
@@ -129,9 +203,9 @@ function parseUserDisplaySegments(raw) {
129
203
  });
130
204
  continue;
131
205
  }
132
- if (record.type === "workspace" && typeof record.path === "string") {
206
+ if (record.type === "project" && typeof record.path === "string") {
133
207
  segments.push({
134
- type: "workspace",
208
+ type: "project",
135
209
  path: record.path,
136
210
  name: typeof record.name === "string" ? record.name : record.path.split("/").pop() ?? record.path,
137
211
  });
@@ -142,7 +216,7 @@ function parseUserDisplaySegments(raw) {
142
216
  type: "terminal",
143
217
  terminalId: record.terminalId,
144
218
  name: typeof record.name === "string" ? record.name : record.terminalId,
145
- ...(typeof record.workspaceRoot === "string" ? { workspaceRoot: record.workspaceRoot } : {}),
219
+ ...(typeof record.projectRoot === "string" ? { projectRoot: record.projectRoot } : {}),
146
220
  ...(parseDisplayLineRange(record) ? { lineRange: parseDisplayLineRange(record) } : {}),
147
221
  ...(typeof record.selectedText === "string" ? { selectedText: record.selectedText } : {}),
148
222
  });
@@ -618,7 +692,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
618
692
  let memoryService;
619
693
  let ws;
620
694
  let sessionStateService;
621
- let workspaceService;
695
+ let projectService;
622
696
  let providerRegistry;
623
697
  let skillRegistry;
624
698
  if (depsOrDb && typeof depsOrDb === "object" && "sessionService" in depsOrDb) {
@@ -633,7 +707,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
633
707
  memoryService = deps.memoryService;
634
708
  ws = deps.ws;
635
709
  sessionStateService = deps.sessionState;
636
- workspaceService = deps.workspaceService;
710
+ projectService = deps.projectService;
637
711
  providerRegistry = deps.providerRegistry;
638
712
  skillRegistry = deps.skillRegistry;
639
713
  }
@@ -835,6 +909,28 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
835
909
  app.log.error(err, "Failed to persist message");
836
910
  }
837
911
  }
912
+ function updateLatestAssistantContextFlow(sessionId, contextFlow) {
913
+ if (!db)
914
+ return;
915
+ try {
916
+ const rows = db
917
+ .select()
918
+ .from(messagesTable)
919
+ .where(eq(messagesTable.sessionId, sessionId))
920
+ .orderBy(messagesTable.createdAt)
921
+ .all();
922
+ const lastAssistant = [...rows].reverse().find((row) => row.role === "assistant");
923
+ if (!lastAssistant)
924
+ return;
925
+ db.update(messagesTable)
926
+ .set({ contextFlow })
927
+ .where(eq(messagesTable.id, lastAssistant.id))
928
+ .run();
929
+ }
930
+ catch (err) {
931
+ app.log.error(err, "Failed to update assistant context flow");
932
+ }
933
+ }
838
934
  // ── Tool execution helper ──────────────────────────────────────────
839
935
  async function executeTool(toolName, args, sessionId, auth, onOutputChunk, signal) {
840
936
  if (!toolRegistry) {
@@ -844,15 +940,15 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
844
940
  return { ok: false, message: "Cancelled" };
845
941
  }
846
942
  const sessionRecord = sessionService?.getById(sessionId);
847
- const workspaceRecord = sessionRecord?.workspaceId
848
- ? workspaceService?.getById(sessionRecord.workspaceId, auth?.userId)
943
+ const projectRecord = sessionRecord?.projectId
944
+ ? projectService?.getById(sessionRecord.projectId, auth?.userId)
849
945
  : null;
850
- const wsPath = workspaceRecord?.rootPath ?? sessionRecord?.workspacePath;
946
+ const wsPath = projectRecord?.rootPath ?? sessionRecord?.projectPath;
851
947
  const context = {
852
948
  sessionId,
853
949
  actionId: uuidv7(),
854
- workspaceRoot: surfaceRegistry
855
- ? resolveWorkspaceRoot(surfaceRegistry, sessionId, wsPath)
950
+ projectRoot: surfaceRegistry
951
+ ? resolveProjectRoot(surfaceRegistry, sessionId, wsPath)
856
952
  : (wsPath?.trim() || process.cwd()),
857
953
  requestedBy: "agent",
858
954
  userId: auth?.userId,
@@ -989,16 +1085,16 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
989
1085
  };
990
1086
  // Build conversation history (hydrate from DB if needed)
991
1087
  hydrateSession(sessionId);
992
- // Resolve workspace root so the system prompt includes it
1088
+ // Resolve project root so the system prompt includes it
993
1089
  const sessionRecord = sessionService?.getById(sessionId);
994
- const workspaceRecord = sessionRecord?.workspaceId
995
- ? workspaceService?.getById(sessionRecord.workspaceId, authUser.id)
1090
+ const projectRecord = sessionRecord?.projectId
1091
+ ? projectService?.getById(sessionRecord.projectId, authUser.id)
996
1092
  : null;
997
1093
  const wsRoot = surfaceRegistry
998
- ? resolveWorkspaceRoot(surfaceRegistry, sessionId, workspaceRecord?.rootPath ?? sessionRecord?.workspacePath)
999
- : ((workspaceRecord?.rootPath ?? sessionRecord?.workspacePath)?.trim() || process.cwd());
1094
+ ? resolveProjectRoot(surfaceRegistry, sessionId, projectRecord?.rootPath ?? sessionRecord?.projectPath)
1095
+ : ((projectRecord?.rootPath ?? sessionRecord?.projectPath)?.trim() || process.cwd());
1000
1096
  const promptCtx = {
1001
- workspaceRoot: wsRoot,
1097
+ projectRoot: wsRoot,
1002
1098
  skills: skillRegistry?.listEnabled(),
1003
1099
  responseStyle,
1004
1100
  backend: llmRuntime.backend,
@@ -1009,7 +1105,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1009
1105
  ]);
1010
1106
  }
1011
1107
  else {
1012
- // Update system prompt if mode/model/workspace changed mid-session
1108
+ // Update system prompt if mode/model/project changed mid-session
1013
1109
  const h = sessionHistory.get(sessionId);
1014
1110
  const modePrompt = buildSystemPrompt(chatMode, modelEndpoint, promptCtx);
1015
1111
  if (h[0]?.role === "system" && h[0].content !== modePrompt) {
@@ -1045,8 +1141,8 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1045
1141
  }
1046
1142
  try {
1047
1143
  sessionService?.touch(sessionId);
1048
- if (sessionRecord?.workspaceId) {
1049
- workspaceService?.touch(sessionRecord.workspaceId);
1144
+ if (sessionRecord?.projectId) {
1145
+ projectService?.touch(sessionRecord.projectId);
1050
1146
  }
1051
1147
  }
1052
1148
  catch { /* session may not exist */ }
@@ -1077,6 +1173,9 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1077
1173
  const matchedSkills = (promptCtx.skills ?? []).filter((skill) => matchedSkillIds.has(skill.id));
1078
1174
  const turnSkillToolCall = buildSyntheticSkillToolCall(matchedSkills);
1079
1175
  emitSyntheticSkillToolCall(sessionId, turnSkillToolCall, safeWrite, emitToSubscribers);
1176
+ const relevantMemory = await retrieveRelevantMemoryContext(memoryService, content);
1177
+ const memoryFlow = relevantMemory?.flow;
1178
+ const memoryBlock = relevantMemory?.block;
1080
1179
  const providerLabel = requestProvider === "codex"
1081
1180
  ? "Codex"
1082
1181
  : requestProvider === "claude-code"
@@ -1099,9 +1198,9 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1099
1198
  // ══ CLI Provider path (codex / claude-code via MCP) ══════════
1100
1199
  if (requestProvider && requestProvider !== "jait" && providerRegistry) {
1101
1200
  const cliWsRoot = surfaceRegistry
1102
- ? resolveWorkspaceRoot(surfaceRegistry, sessionId, workspaceRecord?.rootPath ?? sessionRecord?.workspacePath)
1103
- : ((workspaceRecord?.rootPath ?? sessionRecord?.workspacePath)?.trim() || process.cwd());
1104
- // Detect if the workspace lives on a remote node (e.g. Windows
1201
+ ? resolveProjectRoot(surfaceRegistry, sessionId, projectRecord?.rootPath ?? sessionRecord?.projectPath)
1202
+ : ((projectRecord?.rootPath ?? sessionRecord?.projectPath)?.trim() || process.cwd());
1203
+ // Detect if the project lives on a remote node (e.g. Windows
1105
1204
  // desktop) and route the CLI provider session there instead of
1106
1205
  // trying to spawn codex/claude-code locally on the gateway.
1107
1206
  const pathExistsLocally = existsSync(cliWsRoot);
@@ -1143,11 +1242,11 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1143
1242
  safeWrite(`data: ${JSON.stringify({ type: "provider_fallback", from: requestProvider, to: "jait", reason })}\n\n`);
1144
1243
  }
1145
1244
  else {
1146
- console.log(`[chat/cli] session=${sessionId} wsRoot="${cliWsRoot}" session.workspacePath="${sessionRecord?.workspacePath}" surfaces=${surfaceRegistry?.getBySession(sessionId)?.length ?? 0}`);
1245
+ console.log(`[chat/cli] session=${sessionId} wsRoot="${cliWsRoot}" session.projectPath="${sessionRecord?.projectPath}" surfaces=${surfaceRegistry?.getBySession(sessionId)?.length ?? 0}`);
1147
1246
  // Ensure a FileSystemSurface exists for this session so we can
1148
1247
  // back up files before CLI providers (Codex/Claude) write them,
1149
1248
  // enabling the keep/discard (undo) flow.
1150
- // Use _skipBroadcast so the UI doesn't open the workspace panel.
1249
+ // Use _skipBroadcast so the UI doesn't open the project panel.
1151
1250
  let cliFsSurface = null;
1152
1251
  if (surfaceRegistry) {
1153
1252
  const fsId = `fs-${sessionId}`;
@@ -1161,7 +1260,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1161
1260
  surfaceRegistry.onSurfaceStarted = null;
1162
1261
  const started = await surfaceRegistry.startSurface("filesystem", fsId, {
1163
1262
  sessionId,
1164
- workspaceRoot: cliWsRoot,
1263
+ projectRoot: cliWsRoot,
1165
1264
  });
1166
1265
  surfaceRegistry.onSurfaceStarted = prevHandler;
1167
1266
  cliFsSurface = started;
@@ -1171,7 +1270,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1171
1270
  }
1172
1271
  const mcpServers = [providerRegistry.buildJaitMcpServerRef(config, getRequestBaseUrl(request), {
1173
1272
  sessionId,
1174
- workspaceRoot: cliWsRoot,
1273
+ projectRoot: cliWsRoot,
1175
1274
  })];
1176
1275
  // ── Reuse an existing CLI session if one is alive for this Jait session ──
1177
1276
  const cachedCliSession = activeCliSessions.get(sessionId);
@@ -1204,11 +1303,11 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1204
1303
  activeCliSessions.set(sessionId, { providerId: requestProvider, runtimeMode, providerSessionId, provider: cliProvider });
1205
1304
  console.log(`[chat/cli] Started new ${requestProvider}/${runtimeMode}${isRemote ? " (remote)" : ""} session ${providerSessionId} for ${sessionId}`);
1206
1305
  }
1207
- // Tell the frontend about the execution context (node, workspace)
1306
+ // Tell the frontend about the execution context (node, project)
1208
1307
  safeWrite(`data: ${JSON.stringify({
1209
1308
  type: "session_info",
1210
1309
  provider: requestProvider,
1211
- workspacePath: cliWsRoot,
1310
+ projectPath: cliWsRoot,
1212
1311
  isRemote,
1213
1312
  ...(remoteNodeInfo ? { remoteNode: remoteNodeInfo } : {}),
1214
1313
  })}\n\n`);
@@ -1394,9 +1493,10 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1394
1493
  });
1395
1494
  const responseStyleBlock = getResponseStyleInstructions(responseStyle);
1396
1495
  const cliSystemPrompt = buildCliProviderSystemPrompt(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, chatMode, promptCtx);
1397
- let cliContent = content;
1496
+ const cliUserContent = memoryBlock ? `${memoryBlock}\n\n${content}` : content;
1497
+ let cliContent = cliUserContent;
1398
1498
  if (isNewCliSession) {
1399
- cliContent = formatExternalProviderFirstTurn(cliSystemPrompt, content);
1499
+ cliContent = formatExternalProviderFirstTurn(cliSystemPrompt, cliUserContent);
1400
1500
  }
1401
1501
  else if (responseStyleBlock) {
1402
1502
  cliContent = `<responseStyle>\n${responseStyleBlock}\n</responseStyle>\n\n${cliContent}`;
@@ -1437,7 +1537,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1437
1537
  : "Jait did not paste its internal system prompt into this provider turn.",
1438
1538
  "Provider-native hidden system prompts may still exist inside the CLI provider and are not visible to Jait.",
1439
1539
  ].join("\n");
1440
- const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, cliSystemPrompt, content, sentAt, "CLI providers keep their own session context. This captures the Jait setup metadata, the external-provider system prompt, and the user turn content. On reused CLI sessions, the system prompt is shown for inspection even though it was only sent when Jait initialized or recovered the provider session.");
1540
+ const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, cliSystemPrompt, cliUserContent, sentAt, "CLI providers keep their own session context. This captures the Jait setup metadata, the external-provider system prompt, and the user turn content. On reused CLI sessions, the system prompt is shown for inspection even though it was only sent when Jait initialized or recovered the provider session.", memoryFlow);
1441
1541
  contextFlowJson = JSON.stringify(cliContextFlow);
1442
1542
  safeWrite(`data: ${JSON.stringify({ type: "context_flow", ...cliContextFlow })}\n\n`);
1443
1543
  emitToSubscribers(sessionId, { type: "context_flow", ...cliContextFlow });
@@ -1473,7 +1573,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1473
1573
  });
1474
1574
  const refreshedSystemPrompt = buildCliProviderSystemPrompt(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, chatMode, promptCtx);
1475
1575
  let recoveryContent = content;
1476
- recoveryContent = formatExternalProviderFirstTurn(refreshedSystemPrompt, content);
1576
+ recoveryContent = formatExternalProviderFirstTurn(refreshedSystemPrompt, cliUserContent);
1477
1577
  const sentAt = new Date().toISOString();
1478
1578
  const setupContent = [
1479
1579
  "CLI provider recovery session setup captured by Jait.",
@@ -1486,7 +1586,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1486
1586
  "Jait pasted its external-provider system prompt into this recovery provider session turn.",
1487
1587
  "Provider-native hidden system prompts may still exist inside the CLI provider and are not visible to Jait.",
1488
1588
  ].join("\n");
1489
- const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, refreshedSystemPrompt, content, sentAt, "CLI providers keep their own session context. This captures the Jait recovery setup metadata, the current Jait session system prompt, and the user turn content.");
1589
+ const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, refreshedSystemPrompt, cliUserContent, sentAt, "CLI providers keep their own session context. This captures the Jait recovery setup metadata, the current Jait session system prompt, and the user turn content.", memoryFlow);
1490
1590
  contextFlowJson = JSON.stringify(cliContextFlow);
1491
1591
  safeWrite(`data: ${JSON.stringify({ type: "context_flow", ...cliContextFlow })}\n\n`);
1492
1592
  emitToSubscribers(sessionId, { type: "context_flow", ...cliContextFlow });
@@ -1627,47 +1727,64 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1627
1727
  }
1628
1728
  };
1629
1729
  const contextRounds = [];
1630
- const result = await runAgentLoop({
1631
- llm: llmRuntime,
1632
- history,
1633
- toolSchemas,
1634
- hasTools,
1635
- sessionId,
1636
- auth: {
1637
- userId: authUser.id,
1638
- apiKeys: userApiKeys,
1639
- providerId: swarmWorkerProvider ?? requestProvider,
1640
- model: requestBodyModel || undefined,
1641
- jaitBackend,
1642
- runtimeMode: requestRuntimeMode ?? undefined,
1643
- },
1644
- abort: streamAbort,
1645
- maxRounds: MAX_TOOL_ROUNDS,
1646
- parallel: true,
1647
- toolRegistry,
1648
- disabledTools,
1649
- mode: chatMode,
1650
- onEvent,
1651
- onContext: (round) => {
1652
- contextRounds.push(round);
1653
- contextFlowJson = JSON.stringify({
1654
- provider: "jait",
1655
- model: llmRuntime.openaiModel,
1656
- rounds: contextRounds,
1657
- });
1658
- const event = {
1659
- type: "context_flow",
1660
- provider: "jait",
1661
- model: llmRuntime.openaiModel,
1662
- rounds: contextRounds,
1663
- };
1664
- emitToSubscribers(sessionId, event);
1665
- safeWrite(`data: ${JSON.stringify(event)}\n\n`);
1666
- },
1667
- onPersist: (sid, role, content, tc, seg, thinking) => persistMessage(sid, role, content, tc, seg, contextFlowJson, thinking),
1668
- priorFingerprints: sessionFingerprints.get(sessionId),
1669
- log: app.log,
1670
- }, executeTool, steering);
1730
+ const injectedMemoryMessage = memoryBlock
1731
+ ? { role: "system", content: memoryBlock }
1732
+ : null;
1733
+ if (injectedMemoryMessage)
1734
+ history.push(injectedMemoryMessage);
1735
+ let result;
1736
+ try {
1737
+ result = await runAgentLoop({
1738
+ llm: llmRuntime,
1739
+ history,
1740
+ toolSchemas,
1741
+ hasTools,
1742
+ sessionId,
1743
+ auth: {
1744
+ userId: authUser.id,
1745
+ apiKeys: userApiKeys,
1746
+ providerId: swarmWorkerProvider ?? requestProvider,
1747
+ model: requestBodyModel || undefined,
1748
+ jaitBackend,
1749
+ runtimeMode: requestRuntimeMode ?? undefined,
1750
+ },
1751
+ abort: streamAbort,
1752
+ maxRounds: MAX_TOOL_ROUNDS,
1753
+ parallel: true,
1754
+ toolRegistry,
1755
+ disabledTools,
1756
+ mode: chatMode,
1757
+ onEvent,
1758
+ onContext: (round) => {
1759
+ contextRounds.push(round);
1760
+ contextFlowJson = JSON.stringify({
1761
+ provider: "jait",
1762
+ model: llmRuntime.openaiModel,
1763
+ rounds: contextRounds,
1764
+ ...(memoryFlow ? { memory: memoryFlow } : {}),
1765
+ });
1766
+ const event = {
1767
+ type: "context_flow",
1768
+ provider: "jait",
1769
+ model: llmRuntime.openaiModel,
1770
+ rounds: contextRounds,
1771
+ ...(memoryFlow ? { memory: memoryFlow } : {}),
1772
+ };
1773
+ emitToSubscribers(sessionId, event);
1774
+ safeWrite(`data: ${JSON.stringify(event)}\n\n`);
1775
+ },
1776
+ onPersist: (sid, role, content, tc, seg, thinking) => persistMessage(sid, role, content, tc, seg, contextFlowJson, thinking),
1777
+ priorFingerprints: sessionFingerprints.get(sessionId),
1778
+ log: app.log,
1779
+ }, executeTool, steering);
1780
+ }
1781
+ finally {
1782
+ if (injectedMemoryMessage) {
1783
+ const index = history.indexOf(injectedMemoryMessage);
1784
+ if (index >= 0)
1785
+ history.splice(index, 1);
1786
+ }
1787
+ }
1671
1788
  fullContent = result.content;
1672
1789
  partialToolCalls = result.executedToolCalls;
1673
1790
  if (turnSkillToolCall) {
@@ -1687,21 +1804,24 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1687
1804
  provider: "jait",
1688
1805
  model: llmRuntime.openaiModel,
1689
1806
  rounds: contextRounds,
1807
+ ...(memoryFlow ? { memory: memoryFlow } : {}),
1690
1808
  });
1691
1809
  const finalEvent = {
1692
1810
  type: "context_flow",
1693
1811
  provider: "jait",
1694
1812
  model: llmRuntime.openaiModel,
1695
1813
  rounds: contextRounds,
1814
+ ...(memoryFlow ? { memory: memoryFlow } : {}),
1696
1815
  };
1697
1816
  emitToSubscribers(sessionId, finalEvent);
1698
1817
  safeWrite(`data: ${JSON.stringify(finalEvent)}\n\n`);
1699
1818
  }
1700
1819
  if (contextFlowJson) {
1701
- const lastAssistant = [...history].reverse().find((msg) => msg.role === "assistant" && !msg.contextFlow);
1820
+ const lastAssistant = [...history].reverse().find((msg) => msg.role === "assistant");
1702
1821
  if (lastAssistant) {
1703
1822
  lastAssistant.contextFlow = JSON.parse(contextFlowJson);
1704
1823
  }
1824
+ updateLatestAssistantContextFlow(sessionId, contextFlowJson);
1705
1825
  }
1706
1826
  // Track executed tool calls for retry API
1707
1827
  sessionExecutedToolCalls.set(sessionId, result.executedToolCalls);