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.
- package/README.md +1 -1
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +153 -4
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +209 -22
- package/dist/cli.js.map +1 -1
- package/dist/db/index.js +11 -3
- package/dist/db/index.js.map +1 -1
- package/dist/{index-D2eLXP9V.d.ts → index-DJ5qNs1Z.d.ts} +9 -5
- package/dist/index.d.ts +3 -3
- package/dist/index.js +210 -21
- package/dist/index.js.map +1 -1
- package/dist/{search-D3Wtf7TJ.d.ts → search-BOYIUmDp.d.ts} +1 -1
- package/dist/server/index.js +208 -21
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.js +11 -3
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/(main)/page.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/embed/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/embed/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +5 -5
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__36edac7c._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_85c176b8._.js → 2374f_13da7b2a._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_3eca1553._.js → 2374f_1de2f628._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_8b8baaa3._.js → 2374f_2bfcd3a2._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_0146c9df._.js → 2374f_40c1da73._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_b30bed04._.js → 2374f_41d07cce._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4d1accac._.js → 2374f_6d8e5e94._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_c99180da._.js → 2374f_88aa1671._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_147b1db0._.js → 2374f_9f2fae06._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_98432ce4._.js → 2374f_ac79ddf4._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_36dd81aa._.js → 2374f_c8f8a326._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_bcffd98c._.js → 2374f_dd21a4e9._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_dde5cdd9._.js → 2374f_e5142825._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4b3676c4._.js → 2374f_ec658806._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_f5998fca._.js → 2374f_f3c65774._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__43405ad6._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__adf39cf8._.js → [root-of-the-server]__a87e1c27._.js} +6 -8
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__be5e2967._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__de76483d._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{web_76f53fe7._.js → web_273500a6._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/{web_76ccf09f._.js → web_2b3a5919._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/{web_633d8a33._.js → web_329773d1._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/{web_248fc1f2._.js → web_38156da8._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_8305f089._.js +7 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_app_(main)_page_tsx_5ac4794b._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_components_sessions-sidebar_tsx_92510070._.js +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/web/.next/static/{static/chunks/194b3ed8e8d9c0e9.js → chunks/294ebe8457006bce.js} +3 -3
- package/web/.next/standalone/web/.next/static/chunks/{3722b72974319d65.js → 7e48d04fbd6dd7a6.js} +5 -7
- package/web/.next/standalone/web/.next/static/{static/chunks/1e9fdac31c7fd474.js → chunks/81685e5e8be4eac9.js} +3 -3
- package/web/.next/{static/chunks/3425251cd978da61.js → standalone/web/.next/static/chunks/8d3efc76109d2efc.js} +1 -1
- package/web/.next/standalone/web/.next/static/chunks/96ec96279ada0efe.js +1 -0
- package/web/.next/standalone/web/.next/static/chunks/b31b0765abe0c427.js +1 -0
- package/web/.next/standalone/web/.next/static/{static/chunks/c06faa5848e3b0b3.js → chunks/b7d722dab2a7ecc0.js} +1 -1
- package/web/.next/standalone/web/.next/static/chunks/cc6d43f798bbe415.js +5 -0
- package/web/.next/standalone/web/.next/static/chunks/de300ff10b63be85.css +1 -0
- package/web/.next/standalone/web/.next/static/chunks/de71e63276f488bb.js +7 -0
- package/web/.next/standalone/web/.next/static/{chunks/194b3ed8e8d9c0e9.js → static/chunks/294ebe8457006bce.js} +3 -3
- package/web/.next/standalone/web/.next/static/static/chunks/{3722b72974319d65.js → 7e48d04fbd6dd7a6.js} +5 -7
- package/web/.next/{static/chunks/1e9fdac31c7fd474.js → standalone/web/.next/static/static/chunks/81685e5e8be4eac9.js} +3 -3
- package/web/.next/standalone/web/.next/static/{chunks/3425251cd978da61.js → static/chunks/8d3efc76109d2efc.js} +1 -1
- package/web/.next/standalone/web/.next/static/static/chunks/96ec96279ada0efe.js +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/b31b0765abe0c427.js +1 -0
- package/web/.next/{static/chunks/c06faa5848e3b0b3.js → standalone/web/.next/static/static/chunks/b7d722dab2a7ecc0.js} +1 -1
- package/web/.next/standalone/web/.next/static/static/chunks/cc6d43f798bbe415.js +5 -0
- package/web/.next/standalone/web/.next/static/static/chunks/de300ff10b63be85.css +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/de71e63276f488bb.js +7 -0
- package/web/.next/standalone/web/src/app/(main)/page.tsx +2 -2
- package/web/.next/standalone/web/src/app/api/config/route.ts +3 -2
- package/web/.next/standalone/web/src/components/chat-interface.tsx +287 -32
- package/web/.next/standalone/web/src/components/sessions-sidebar.tsx +1 -1
- package/web/.next/standalone/web/src/lib/api.ts +3 -0
- package/web/.next/standalone/web/src/lib/config.ts +2 -1
- package/web/.next/static/chunks/{194b3ed8e8d9c0e9.js → 294ebe8457006bce.js} +3 -3
- package/web/.next/static/chunks/{3722b72974319d65.js → 7e48d04fbd6dd7a6.js} +5 -7
- package/web/.next/{standalone/web/.next/static/chunks/1e9fdac31c7fd474.js → static/chunks/81685e5e8be4eac9.js} +3 -3
- package/web/.next/{standalone/web/.next/static/static/chunks/3425251cd978da61.js → static/chunks/8d3efc76109d2efc.js} +1 -1
- package/web/.next/static/chunks/96ec96279ada0efe.js +1 -0
- package/web/.next/static/chunks/b31b0765abe0c427.js +1 -0
- package/web/.next/{standalone/web/.next/static/chunks/c06faa5848e3b0b3.js → static/chunks/b7d722dab2a7ecc0.js} +1 -1
- package/web/.next/static/chunks/cc6d43f798bbe415.js +5 -0
- package/web/.next/static/chunks/de300ff10b63be85.css +1 -0
- package/web/.next/static/chunks/de71e63276f488bb.js +7 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__9d3fe3b4._.js +0 -3
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_631133e0._.js +0 -7
- package/web/.next/standalone/web/.next/static/chunks/2110d26bc24ed542.js +0 -1
- package/web/.next/standalone/web/.next/static/chunks/4fe97b7866eacdcf.js +0 -7
- package/web/.next/standalone/web/.next/static/chunks/a895d50f76a48e6e.js +0 -1
- package/web/.next/standalone/web/.next/static/chunks/dccaa0e6b27241a5.js +0 -5
- package/web/.next/standalone/web/.next/static/chunks/ddfca0cb2050fc42.css +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/2110d26bc24ed542.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/4fe97b7866eacdcf.js +0 -7
- package/web/.next/standalone/web/.next/static/static/chunks/a895d50f76a48e6e.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/dccaa0e6b27241a5.js +0 -5
- package/web/.next/standalone/web/.next/static/static/chunks/ddfca0cb2050fc42.css +0 -1
- package/web/.next/static/chunks/2110d26bc24ed542.js +0 -1
- package/web/.next/static/chunks/4fe97b7866eacdcf.js +0 -7
- package/web/.next/static/chunks/a895d50f76a48e6e.js +0 -1
- package/web/.next/static/chunks/dccaa0e6b27241a5.js +0 -5
- package/web/.next/static/chunks/ddfca0cb2050fc42.css +0 -1
- /package/web/.next/standalone/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_ssgManifest.js +0 -0
- /package/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_buildManifest.js +0 -0
- /package/web/.next/static/{pESXpeEFvm95PYxUZ2_yV → _0-MmiObGsO5iLpf0Qgmw}/_clientMiddlewareManifest.json +0 -0
- /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-
|
|
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` |
|
package/dist/agent/index.d.ts
CHANGED
|
@@ -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-
|
|
4
|
-
import '../search-
|
|
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';
|
package/dist/agent/index.js
CHANGED
|
@@ -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-
|
|
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
|
-
|
|
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);
|