sparkecoder 0.1.45 → 0.1.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 (184) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/index.d.ts +2 -2
  3. package/dist/agent/index.js +153 -4
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/cli.js +209 -22
  6. package/dist/cli.js.map +1 -1
  7. package/dist/db/index.js +11 -3
  8. package/dist/db/index.js.map +1 -1
  9. package/dist/{index-D2eLXP9V.d.ts → index-DJ5qNs1Z.d.ts} +9 -5
  10. package/dist/index.d.ts +3 -3
  11. package/dist/index.js +210 -21
  12. package/dist/index.js.map +1 -1
  13. package/dist/{search-D3Wtf7TJ.d.ts → search-BOYIUmDp.d.ts} +1 -1
  14. package/dist/server/index.js +208 -21
  15. package/dist/server/index.js.map +1 -1
  16. package/dist/tools/index.d.ts +2 -2
  17. package/dist/tools/index.js +11 -3
  18. package/dist/tools/index.js.map +1 -1
  19. package/package.json +1 -1
  20. package/web/.next/BUILD_ID +1 -1
  21. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  22. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  23. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  24. package/web/.next/standalone/web/.next/server/app/(main)/page.js.nft.json +1 -1
  25. package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
  26. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page.js.nft.json +1 -1
  27. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  29. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  34. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  37. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +3 -3
  38. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  39. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  41. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  43. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  44. package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
  45. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  46. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +4 -4
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +4 -4
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +3 -3
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +2 -2
  51. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +2 -2
  52. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +2 -2
  54. package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  55. package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
  56. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  57. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +4 -4
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +4 -4
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  60. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +3 -3
  61. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +2 -2
  62. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  64. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +2 -2
  65. package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
  66. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  67. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +4 -4
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +4 -4
  69. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  70. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +3 -3
  71. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +2 -2
  72. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +2 -2
  73. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  74. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +2 -2
  75. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  76. package/web/.next/standalone/web/.next/server/app/docs.rsc +4 -4
  77. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +4 -4
  78. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  79. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +3 -3
  80. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  81. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
  82. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +2 -2
  83. package/web/.next/standalone/web/.next/server/app/embed/[id]/page.js.nft.json +1 -1
  84. package/web/.next/standalone/web/.next/server/app/embed/[id]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  86. package/web/.next/standalone/web/.next/server/app/index.rsc +5 -5
  87. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +2 -2
  88. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +2 -2
  89. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +5 -5
  90. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  91. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
  92. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  93. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__36edac7c._.js +1 -1
  94. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_85c176b8._.js → 2374f_13da7b2a._.js} +1 -1
  95. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_3eca1553._.js → 2374f_1de2f628._.js} +1 -1
  96. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_8b8baaa3._.js → 2374f_2bfcd3a2._.js} +1 -1
  97. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_0146c9df._.js → 2374f_40c1da73._.js} +1 -1
  98. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_b30bed04._.js → 2374f_41d07cce._.js} +1 -1
  99. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4d1accac._.js → 2374f_6d8e5e94._.js} +1 -1
  100. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_c99180da._.js → 2374f_88aa1671._.js} +1 -1
  101. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_147b1db0._.js → 2374f_9f2fae06._.js} +1 -1
  102. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_98432ce4._.js → 2374f_ac79ddf4._.js} +1 -1
  103. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_36dd81aa._.js → 2374f_c8f8a326._.js} +1 -1
  104. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_bcffd98c._.js → 2374f_dd21a4e9._.js} +1 -1
  105. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_dde5cdd9._.js → 2374f_e5142825._.js} +1 -1
  106. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4b3676c4._.js → 2374f_ec658806._.js} +1 -1
  107. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_f5998fca._.js → 2374f_f3c65774._.js} +1 -1
  108. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__43405ad6._.js +3 -0
  109. package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__adf39cf8._.js → [root-of-the-server]__a87e1c27._.js} +6 -8
  110. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__be5e2967._.js +1 -1
  111. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__de76483d._.js +1 -1
  112. package/web/.next/standalone/web/.next/server/chunks/ssr/{web_76f53fe7._.js → web_273500a6._.js} +2 -2
  113. package/web/.next/standalone/web/.next/server/chunks/ssr/{web_76ccf09f._.js → web_2b3a5919._.js} +2 -2
  114. package/web/.next/standalone/web/.next/server/chunks/ssr/{web_633d8a33._.js → web_329773d1._.js} +2 -2
  115. package/web/.next/standalone/web/.next/server/chunks/ssr/{web_248fc1f2._.js → web_38156da8._.js} +2 -2
  116. package/web/.next/standalone/web/.next/server/chunks/ssr/web_8305f089._.js +7 -0
  117. package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_app_(main)_page_tsx_5ac4794b._.js +1 -1
  118. package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_components_sessions-sidebar_tsx_92510070._.js +1 -1
  119. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  120. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  121. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  122. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  123. package/web/.next/standalone/web/.next/static/{static/chunks/194b3ed8e8d9c0e9.js → chunks/294ebe8457006bce.js} +3 -3
  124. package/web/.next/standalone/web/.next/static/chunks/{3722b72974319d65.js → 7e48d04fbd6dd7a6.js} +5 -7
  125. package/web/.next/standalone/web/.next/static/{static/chunks/1e9fdac31c7fd474.js → chunks/81685e5e8be4eac9.js} +3 -3
  126. package/web/.next/{static/chunks/3425251cd978da61.js → standalone/web/.next/static/chunks/8d3efc76109d2efc.js} +1 -1
  127. package/web/.next/standalone/web/.next/static/chunks/96ec96279ada0efe.js +1 -0
  128. package/web/.next/standalone/web/.next/static/chunks/b31b0765abe0c427.js +1 -0
  129. package/web/.next/standalone/web/.next/static/{static/chunks/c06faa5848e3b0b3.js → chunks/b7d722dab2a7ecc0.js} +1 -1
  130. package/web/.next/standalone/web/.next/static/chunks/cc6d43f798bbe415.js +5 -0
  131. package/web/.next/standalone/web/.next/static/chunks/de300ff10b63be85.css +1 -0
  132. package/web/.next/standalone/web/.next/static/chunks/de71e63276f488bb.js +7 -0
  133. package/web/.next/standalone/web/.next/static/{chunks/194b3ed8e8d9c0e9.js → static/chunks/294ebe8457006bce.js} +3 -3
  134. package/web/.next/standalone/web/.next/static/static/chunks/{3722b72974319d65.js → 7e48d04fbd6dd7a6.js} +5 -7
  135. package/web/.next/{static/chunks/1e9fdac31c7fd474.js → standalone/web/.next/static/static/chunks/81685e5e8be4eac9.js} +3 -3
  136. package/web/.next/standalone/web/.next/static/{chunks/3425251cd978da61.js → static/chunks/8d3efc76109d2efc.js} +1 -1
  137. package/web/.next/standalone/web/.next/static/static/chunks/96ec96279ada0efe.js +1 -0
  138. package/web/.next/standalone/web/.next/static/static/chunks/b31b0765abe0c427.js +1 -0
  139. package/web/.next/{static/chunks/c06faa5848e3b0b3.js → standalone/web/.next/static/static/chunks/b7d722dab2a7ecc0.js} +1 -1
  140. package/web/.next/standalone/web/.next/static/static/chunks/cc6d43f798bbe415.js +5 -0
  141. package/web/.next/standalone/web/.next/static/static/chunks/de300ff10b63be85.css +1 -0
  142. package/web/.next/standalone/web/.next/static/static/chunks/de71e63276f488bb.js +7 -0
  143. package/web/.next/standalone/web/src/app/(main)/page.tsx +2 -2
  144. package/web/.next/standalone/web/src/app/api/config/route.ts +3 -2
  145. package/web/.next/standalone/web/src/components/chat-interface.tsx +287 -32
  146. package/web/.next/standalone/web/src/components/sessions-sidebar.tsx +1 -1
  147. package/web/.next/standalone/web/src/lib/api.ts +3 -0
  148. package/web/.next/standalone/web/src/lib/config.ts +2 -1
  149. package/web/.next/static/chunks/{194b3ed8e8d9c0e9.js → 294ebe8457006bce.js} +3 -3
  150. package/web/.next/static/chunks/{3722b72974319d65.js → 7e48d04fbd6dd7a6.js} +5 -7
  151. package/web/.next/{standalone/web/.next/static/chunks/1e9fdac31c7fd474.js → static/chunks/81685e5e8be4eac9.js} +3 -3
  152. package/web/.next/{standalone/web/.next/static/static/chunks/3425251cd978da61.js → static/chunks/8d3efc76109d2efc.js} +1 -1
  153. package/web/.next/static/chunks/96ec96279ada0efe.js +1 -0
  154. package/web/.next/static/chunks/b31b0765abe0c427.js +1 -0
  155. package/web/.next/{standalone/web/.next/static/chunks/c06faa5848e3b0b3.js → static/chunks/b7d722dab2a7ecc0.js} +1 -1
  156. package/web/.next/static/chunks/cc6d43f798bbe415.js +5 -0
  157. package/web/.next/static/chunks/de300ff10b63be85.css +1 -0
  158. package/web/.next/static/chunks/de71e63276f488bb.js +7 -0
  159. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__9d3fe3b4._.js +0 -3
  160. package/web/.next/standalone/web/.next/server/chunks/ssr/web_631133e0._.js +0 -7
  161. package/web/.next/standalone/web/.next/static/chunks/2110d26bc24ed542.js +0 -1
  162. package/web/.next/standalone/web/.next/static/chunks/4fe97b7866eacdcf.js +0 -7
  163. package/web/.next/standalone/web/.next/static/chunks/a895d50f76a48e6e.js +0 -1
  164. package/web/.next/standalone/web/.next/static/chunks/dccaa0e6b27241a5.js +0 -5
  165. package/web/.next/standalone/web/.next/static/chunks/ddfca0cb2050fc42.css +0 -1
  166. package/web/.next/standalone/web/.next/static/static/chunks/2110d26bc24ed542.js +0 -1
  167. package/web/.next/standalone/web/.next/static/static/chunks/4fe97b7866eacdcf.js +0 -7
  168. package/web/.next/standalone/web/.next/static/static/chunks/a895d50f76a48e6e.js +0 -1
  169. package/web/.next/standalone/web/.next/static/static/chunks/dccaa0e6b27241a5.js +0 -5
  170. package/web/.next/standalone/web/.next/static/static/chunks/ddfca0cb2050fc42.css +0 -1
  171. package/web/.next/static/chunks/2110d26bc24ed542.js +0 -1
  172. package/web/.next/static/chunks/4fe97b7866eacdcf.js +0 -7
  173. package/web/.next/static/chunks/a895d50f76a48e6e.js +0 -1
  174. package/web/.next/static/chunks/dccaa0e6b27241a5.js +0 -5
  175. package/web/.next/static/chunks/ddfca0cb2050fc42.css +0 -1
  176. /package/web/.next/standalone/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_buildManifest.js +0 -0
  177. /package/web/.next/standalone/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_clientMiddlewareManifest.json +0 -0
  178. /package/web/.next/standalone/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_ssgManifest.js +0 -0
  179. /package/web/.next/standalone/web/.next/static/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_buildManifest.js +0 -0
  180. /package/web/.next/standalone/web/.next/static/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_clientMiddlewareManifest.json +0 -0
  181. /package/web/.next/standalone/web/.next/static/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_ssgManifest.js +0 -0
  182. /package/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_buildManifest.js +0 -0
  183. /package/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_clientMiddlewareManifest.json +0 -0
  184. /package/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -139,7 +139,7 @@ Create a `sparkecoder.config.json` file:
139
139
 
140
140
  | Option | Description | Default |
141
141
  |--------|-------------|---------|
142
- | `defaultModel` | Vercel AI Gateway model string | `anthropic/claude-opus-4-5` |
142
+ | `defaultModel` | Vercel AI Gateway model string | `anthropic/claude-opus-4-6` |
143
143
  | `workingDirectory` | Base directory for file operations | Current directory |
144
144
  | `toolApprovals` | Which tools require user approval | `{ bash: true }` |
145
145
  | `skills.directory` | Directory containing skill files | `./skills` |
@@ -1,5 +1,5 @@
1
1
  import 'ai';
2
2
  import '../schema-NcQknWCg.js';
3
- export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, C as ContextManager, M as MessageAttachment, d as buildSystemPrompt } from '../index-D2eLXP9V.js';
4
- import '../search-D3Wtf7TJ.js';
3
+ export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, C as ContextManager, M as MessageAttachment, d as buildSystemPrompt } from '../index-DJ5qNs1Z.js';
4
+ import '../search-BOYIUmDp.js';
5
5
  import 'zod';
@@ -84,7 +84,7 @@ var init_types = __esm({
84
84
  }).optional();
85
85
  SparkcoderConfigSchema = z.object({
86
86
  // Default model to use (Vercel AI Gateway format)
87
- defaultModel: z.string().default("anthropic/claude-opus-4-5"),
87
+ defaultModel: z.string().default("anthropic/claude-opus-4-6"),
88
88
  // Working directory for file operations
89
89
  workingDirectory: z.string().optional(),
90
90
  // Tool approval settings
@@ -478,12 +478,16 @@ import { nanoid as nanoid3 } from "nanoid";
478
478
  var remoteServerUrl = null;
479
479
  var authKey = null;
480
480
  var DATE_FIELDS = ["createdAt", "updatedAt", "startedAt", "completedAt", "stoppedAt", "finishedAt", "loadedAt", "indexedAt", "lastFullIndex", "lastIncrementalIndex"];
481
+ var MODEL_MESSAGE_FIELDS = ["modelMessage", "modelMessages"];
481
482
  function parseDates(obj) {
482
483
  if (obj === null || obj === void 0) return obj;
483
484
  if (Array.isArray(obj)) return obj.map(parseDates);
484
- if (typeof obj !== "object") return obj;
485
+ if (typeof obj !== "object" || obj instanceof Date) return obj;
485
486
  const result = { ...obj };
486
487
  for (const key of Object.keys(result)) {
488
+ if (MODEL_MESSAGE_FIELDS.includes(key)) {
489
+ continue;
490
+ }
487
491
  if (DATE_FIELDS.includes(key) && typeof result[key] === "string") {
488
492
  result[key] = new Date(result[key]);
489
493
  } else if (typeof result[key] === "object") {
@@ -516,7 +520,11 @@ async function api(path, options = {}) {
516
520
  if (!text || text === "null") {
517
521
  return null;
518
522
  }
519
- return parseDates(JSON.parse(text));
523
+ const parsed = JSON.parse(text);
524
+ if (options.skipParseDates) {
525
+ return parsed;
526
+ }
527
+ return parseDates(parsed);
520
528
  }
521
529
  var remoteSessionQueries = {
522
530
  create(data) {
@@ -556,7 +564,7 @@ var remoteMessageQueries = {
556
564
  return api(`/messages/session/${sessionId}`);
557
565
  },
558
566
  getModelMessages(sessionId) {
559
- return api(`/messages/session/${sessionId}/model-messages`);
567
+ return api(`/messages/session/${sessionId}/model-messages`, { skipParseDates: true });
560
568
  },
561
569
  async getRecentBySession(sessionId, limit = 50) {
562
570
  const messages = await api(`/messages/session/${sessionId}`);
@@ -3870,6 +3878,142 @@ ${conversationHistory}
3870
3878
  Summary:`;
3871
3879
  }
3872
3880
 
3881
+ // src/utils/sanitize-messages.ts
3882
+ import { modelMessageSchema } from "ai";
3883
+ function convertDatesToStrings(value) {
3884
+ if (value === null || value === void 0) return value;
3885
+ if (value instanceof Date) return value.toISOString();
3886
+ if (Array.isArray(value)) return value.map(convertDatesToStrings);
3887
+ if (typeof value === "object") {
3888
+ const result = {};
3889
+ for (const [k, v] of Object.entries(value)) {
3890
+ result[k] = convertDatesToStrings(v);
3891
+ }
3892
+ return result;
3893
+ }
3894
+ return value;
3895
+ }
3896
+ function sanitizeMessage(msg) {
3897
+ if (msg === null || msg === void 0 || typeof msg !== "object") return msg;
3898
+ const message = msg;
3899
+ if (!message.role || typeof message.role !== "string") return msg;
3900
+ return convertDatesToStrings(message);
3901
+ }
3902
+ function mergeUserContent(a, b) {
3903
+ const aIsString = typeof a === "string";
3904
+ const bIsString = typeof b === "string";
3905
+ if (aIsString && bIsString) {
3906
+ return `${a}
3907
+
3908
+ ${b}`;
3909
+ }
3910
+ const aParts = aIsString ? [{ type: "text", text: a }] : Array.isArray(a) ? a : [];
3911
+ const bParts = bIsString ? [{ type: "text", text: b }] : Array.isArray(b) ? b : [];
3912
+ return [...aParts, ...bParts];
3913
+ }
3914
+ function mergeConsecutiveSameRole(messages) {
3915
+ if (messages.length <= 1) return messages;
3916
+ const merged = [];
3917
+ for (const msg of messages) {
3918
+ const prev = merged[merged.length - 1];
3919
+ if (!prev || prev.role !== msg.role) {
3920
+ merged.push(msg);
3921
+ continue;
3922
+ }
3923
+ const role = msg.role;
3924
+ if (role === "user") {
3925
+ const mergedContent = mergeUserContent(prev.content, msg.content);
3926
+ merged[merged.length - 1] = { role: "user", content: mergedContent };
3927
+ console.warn("[sanitize-messages] Merged consecutive user messages");
3928
+ } else if (role === "assistant") {
3929
+ const prevParts = typeof prev.content === "string" ? [{ type: "text", text: prev.content }] : Array.isArray(prev.content) ? prev.content : [];
3930
+ const curParts = typeof msg.content === "string" ? [{ type: "text", text: msg.content }] : Array.isArray(msg.content) ? msg.content : [];
3931
+ merged[merged.length - 1] = { role: "assistant", content: [...prevParts, ...curParts] };
3932
+ console.warn("[sanitize-messages] Merged consecutive assistant messages");
3933
+ } else if (role === "tool") {
3934
+ const prevContent = Array.isArray(prev.content) ? prev.content : [];
3935
+ const curContent = Array.isArray(msg.content) ? msg.content : [];
3936
+ merged[merged.length - 1] = { role: "tool", content: [...prevContent, ...curContent] };
3937
+ console.warn("[sanitize-messages] Merged consecutive tool messages");
3938
+ } else {
3939
+ merged.push(msg);
3940
+ }
3941
+ }
3942
+ return merged;
3943
+ }
3944
+ function sanitizeModelMessages(messages) {
3945
+ let allValid = true;
3946
+ for (const msg of messages) {
3947
+ try {
3948
+ modelMessageSchema.parse(msg);
3949
+ } catch {
3950
+ allValid = false;
3951
+ break;
3952
+ }
3953
+ }
3954
+ let result;
3955
+ if (allValid) {
3956
+ result = messages;
3957
+ } else {
3958
+ console.warn("[sanitize-messages] Detected invalid messages, attempting self-repair...");
3959
+ const sanitized = [];
3960
+ let repairCount = 0;
3961
+ for (let i = 0; i < messages.length; i++) {
3962
+ const msg = messages[i];
3963
+ try {
3964
+ modelMessageSchema.parse(msg);
3965
+ sanitized.push(msg);
3966
+ continue;
3967
+ } catch {
3968
+ }
3969
+ const fixed = sanitizeMessage(msg);
3970
+ try {
3971
+ modelMessageSchema.parse(fixed);
3972
+ sanitized.push(fixed);
3973
+ repairCount++;
3974
+ console.warn(`[sanitize-messages] Repaired message ${i} (role=${msg.role}) - converted Date objects to strings`);
3975
+ continue;
3976
+ } catch {
3977
+ }
3978
+ if (msg.role === "tool" && Array.isArray(msg.content)) {
3979
+ const fixedContent = msg.content.map((part) => {
3980
+ if (part.type === "tool-result" && part.output !== void 0) {
3981
+ const output = convertDatesToStrings(part.output);
3982
+ if (output && typeof output === "object" && !output.type) {
3983
+ return { ...part, output: { type: "json", value: output } };
3984
+ }
3985
+ const knownTypes = ["text", "json", "execution-denied", "error-text", "error-json", "content"];
3986
+ if (output && typeof output === "object" && !knownTypes.includes(output.type)) {
3987
+ return { ...part, output: { type: "json", value: output } };
3988
+ }
3989
+ return { ...part, output };
3990
+ }
3991
+ return convertDatesToStrings(part);
3992
+ });
3993
+ const wrappedMsg = { ...msg, content: fixedContent };
3994
+ try {
3995
+ modelMessageSchema.parse(wrappedMsg);
3996
+ sanitized.push(wrappedMsg);
3997
+ repairCount++;
3998
+ console.warn(`[sanitize-messages] Repaired message ${i} (role=tool) - wrapped raw output in json type`);
3999
+ continue;
4000
+ } catch {
4001
+ }
4002
+ }
4003
+ console.error(
4004
+ `[sanitize-messages] Could not repair message ${i} (role=${msg.role}). Message will be included as-is. Content keys: ${JSON.stringify(Object.keys(msg))}`
4005
+ );
4006
+ sanitized.push(msg);
4007
+ }
4008
+ if (repairCount > 0) {
4009
+ console.warn(`[sanitize-messages] Self-repair complete: fixed ${repairCount}/${messages.length} messages`);
4010
+ }
4011
+ result = sanitized;
4012
+ }
4013
+ result = mergeConsecutiveSameRole(result);
4014
+ return result;
4015
+ }
4016
+
3873
4017
  // src/agent/context.ts
3874
4018
  var ContextManager = class {
3875
4019
  sessionId;
@@ -3886,9 +4030,14 @@ var ContextManager = class {
3886
4030
  /**
3887
4031
  * Get messages for the current context
3888
4032
  * Returns ModelMessage[] that can be passed directly to streamText/generateText
4033
+ *
4034
+ * Includes self-repair: if messages from the database have been corrupted
4035
+ * (e.g., Date objects in tool outputs from parseDates), they are automatically
4036
+ * sanitized to conform to the AI SDK's ModelMessage schema.
3889
4037
  */
3890
4038
  async getMessages() {
3891
4039
  let modelMessages = await messageQueries.getModelMessages(this.sessionId);
4040
+ modelMessages = sanitizeModelMessages(modelMessages);
3892
4041
  const contextSize = calculateContextSize(modelMessages);
3893
4042
  if (this.autoSummarize && contextSize > this.maxContextChars) {
3894
4043
  modelMessages = await this.summarizeContext(modelMessages);