sparkecoder 0.1.60 → 0.1.61
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/dist/agent/index.d.ts +4 -3
- package/dist/agent/index.js +588 -176
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +818 -95
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +3 -2
- package/dist/db/index.js.map +1 -1
- package/dist/{index-Csad1Nx4.d.ts → index-DuGtMaAJ.d.ts} +85 -4
- package/dist/index.d.ts +6 -5
- package/dist/index.js +1202 -665
- package/dist/index.js.map +1 -1
- package/dist/schema-C7Mm4Ykn.d.ts +1410 -0
- package/dist/{search-BETuS1vh.d.ts → search-C_IFImt1.d.ts} +3 -3
- package/dist/server/index.js +605 -68
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.d.ts +38 -3
- package/dist/tools/index.js +230 -2
- package/dist/tools/index.js.map +1 -1
- package/package.json +5 -3
- 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 +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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/api/config/route.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/api/health/route.js.nft.json +1 -1
- 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 +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +1 -1
- 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 +1 -1
- 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 +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +1 -1
- 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 +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +1 -1
- 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 +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- 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 +4 -4
- 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 +4 -4
- 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 +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_19289e11._.js → 2374f_03d22c16._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_b4b86c1f._.js → 2374f_0d0b1fb9._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4858a1ea._.js → 2374f_3f7d6d28._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_51385fed._.js → 2374f_6166d14d._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_40e35a02._.js → 2374f_67b9525f._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_fb95e3c9._.js → 2374f_6b436efc._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_2f0d9f6f._.js → 2374f_784d851c._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_35475cbe._.js → 2374f_976b2ded._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_7db22cde._.js → 2374f_98eba491._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_90b8e4fb._.js → 2374f_99b7b533._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4666c827._.js → 2374f_a1a36483._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_076f03ec._.js → 2374f_b98835eb._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_b17fce11._.js → 2374f_e19eaecc._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_d8b9ce38._.js → 2374f_e3aec189._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__7775f784._.js → [root-of-the-server]__4f176a16._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__d59f831d._.js +15 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/{web_645f4b90._.js → web_693f514e._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_a42a2651._.js +7 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_dc6ce793._.js +7 -0
- 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/chunks/0358a0e7a40cfb93.css +1 -0
- package/web/.next/standalone/web/.next/static/chunks/1ecde4c0d426a635.js +1 -0
- package/web/.next/standalone/web/.next/static/chunks/20e0fa99c7a1c1fc.js +13 -0
- package/web/.next/standalone/web/.next/static/chunks/36688a049d72e8ab.js +5 -0
- package/web/.next/standalone/web/.next/static/chunks/95436454a7559b0d.js +7 -0
- package/web/.next/standalone/web/.next/static/chunks/a751ca474cc46212.js +5 -0
- package/web/.next/standalone/web/.next/static/static/chunks/0358a0e7a40cfb93.css +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/1ecde4c0d426a635.js +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/20e0fa99c7a1c1fc.js +13 -0
- package/web/.next/standalone/web/.next/static/static/chunks/36688a049d72e8ab.js +5 -0
- package/web/.next/standalone/web/.next/static/static/chunks/95436454a7559b0d.js +7 -0
- package/web/.next/standalone/web/.next/static/static/chunks/a751ca474cc46212.js +5 -0
- package/web/.next/standalone/web/src/components/ai-elements/complete-task-tool.tsx +126 -0
- package/web/.next/standalone/web/src/components/chat-interface.tsx +68 -3
- package/web/.next/standalone/web/src/components/sessions-sidebar.tsx +18 -1
- package/web/.next/standalone/web/src/lib/api.ts +12 -0
- package/web/.next/static/chunks/0358a0e7a40cfb93.css +1 -0
- package/web/.next/static/chunks/1ecde4c0d426a635.js +1 -0
- package/web/.next/static/chunks/20e0fa99c7a1c1fc.js +13 -0
- package/web/.next/static/chunks/36688a049d72e8ab.js +5 -0
- package/web/.next/static/chunks/95436454a7559b0d.js +7 -0
- package/web/.next/static/chunks/a751ca474cc46212.js +5 -0
- package/dist/schema-NcQknWCg.d.ts +0 -295
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__bd396152._.js +0 -15
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_9c9f0e3b._.js +0 -7
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_d08270f7._.js +0 -7
- package/web/.next/standalone/web/.next/static/chunks/2868b007ce5163fc.css +0 -1
- package/web/.next/standalone/web/.next/static/chunks/3f295b6960943c38.js +0 -1
- package/web/.next/standalone/web/.next/static/chunks/631b023d37a08635.js +0 -13
- package/web/.next/standalone/web/.next/static/chunks/a2b4737b190d1b54.js +0 -5
- package/web/.next/standalone/web/.next/static/chunks/e97212fcc8221479.js +0 -5
- package/web/.next/standalone/web/.next/static/chunks/f6e47c8a9766ce91.js +0 -7
- package/web/.next/standalone/web/.next/static/static/chunks/2868b007ce5163fc.css +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/3f295b6960943c38.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/631b023d37a08635.js +0 -13
- package/web/.next/standalone/web/.next/static/static/chunks/a2b4737b190d1b54.js +0 -5
- package/web/.next/standalone/web/.next/static/static/chunks/e97212fcc8221479.js +0 -5
- package/web/.next/standalone/web/.next/static/static/chunks/f6e47c8a9766ce91.js +0 -7
- package/web/.next/static/chunks/2868b007ce5163fc.css +0 -1
- package/web/.next/static/chunks/3f295b6960943c38.js +0 -1
- package/web/.next/static/chunks/631b023d37a08635.js +0 -13
- package/web/.next/static/chunks/a2b4737b190d1b54.js +0 -5
- package/web/.next/static/chunks/e97212fcc8221479.js +0 -5
- package/web/.next/static/chunks/f6e47c8a9766ce91.js +0 -7
- /package/web/.next/standalone/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_ssgManifest.js +0 -0
- /package/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_buildManifest.js +0 -0
- /package/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_ssgManifest.js +0 -0
package/dist/db/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { C as Checkpoint, F as FileBackup, M as ModelMessage, a as Message, S as Session, L as LoadedSkill, T as TodoItem, b as ToolExecution, A as ActiveStream, I as IndexStatusRecord, c as IndexedChunk, d as SubagentExecution, e as SubagentStep, f as Terminal } from '../schema-
|
|
2
|
-
export { N as NewActiveStream, g as NewCheckpoint, h as NewFileBackup, i as NewIndexStatusRecord, j as NewIndexedChunk, k as NewMessage, l as NewSession, m as NewSubagentExecution, n as NewTerminal, o as NewTodoItem, p as NewToolExecution, q as SessionConfig, U as UserContentPart,
|
|
1
|
+
import { C as Checkpoint, F as FileBackup, M as ModelMessage, a as Message, S as Session, L as LoadedSkill, T as TodoItem, b as ToolExecution, A as ActiveStream, I as IndexStatusRecord, c as IndexedChunk, d as SubagentExecution, e as SubagentStep, f as Terminal } from '../schema-C7Mm4Ykn.js';
|
|
2
|
+
export { N as NewActiveStream, g as NewCheckpoint, h as NewFileBackup, i as NewIndexStatusRecord, j as NewIndexedChunk, k as NewMessage, l as NewSession, m as NewSubagentExecution, n as NewTerminal, o as NewTodoItem, p as NewToolExecution, q as SessionConfig, r as TaskConfig, U as UserContentPart, s as UserFilePart, t as UserImagePart, u as UserModelMessage, v as UserTextPart } from '../schema-C7Mm4Ykn.js';
|
|
3
|
+
import 'drizzle-orm/sqlite-core';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Initialize the database with remote server config
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/remote.ts","../../src/db/index.ts"],"sourcesContent":["/**\n * Remote database client\n * \n * Implements the same interface as the local SQLite database\n * but calls the remote server via HTTP.\n */\n\nimport type {\n Session,\n Message,\n ToolExecution,\n TodoItem,\n ModelMessage,\n Terminal,\n ActiveStream,\n Checkpoint,\n FileBackup,\n SubagentExecution,\n SubagentStep,\n IndexedChunk,\n IndexStatusRecord,\n LoadedSkill,\n} from './schema.js';\n\nlet remoteServerUrl: string | null = null;\nlet authKey: string | null = null;\n\n/**\n * Initialize the remote database client\n */\nexport function initRemoteDatabase(serverUrl: string, key: string) {\n remoteServerUrl = serverUrl.replace(/\\/$/, ''); // Remove trailing slash\n authKey = key;\n}\n\n/**\n * Close the remote client (no-op, just for API compatibility)\n */\nexport function closeRemoteDatabase() {\n remoteServerUrl = null;\n authKey = null;\n}\n\n/**\n * Check if remote database is configured\n */\nexport function isRemoteConfigured(): boolean {\n return !!remoteServerUrl && !!authKey;\n}\n\n/**\n * Date fields that should be parsed from ISO strings to Date objects.\n * These are top-level metadata fields on database records (Session, Message, etc.),\n * NOT fields inside modelMessage content (tool outputs, etc.).\n */\nconst DATE_FIELDS = ['createdAt', 'updatedAt', 'startedAt', 'completedAt', 'stoppedAt', 'finishedAt', 'loadedAt', 'indexedAt', 'lastFullIndex', 'lastIncrementalIndex'];\n\n/**\n * Fields that contain AI SDK ModelMessage data and should NOT be recursively\n * processed by parseDates. The AI SDK's Zod schema requires tool output values\n * to be valid JSON primitives (string, number, boolean, null, object, array).\n * Converting date strings to Date objects inside these fields corrupts them and\n * causes AI_InvalidPromptError when the messages are passed back to streamText().\n */\nconst MODEL_MESSAGE_FIELDS = ['modelMessage', 'modelMessages'];\n\n/**\n * Parse date strings to Date objects on top-level record fields only.\n * \n * IMPORTANT: Does NOT recurse into `modelMessage` / `modelMessages` fields.\n * Those contain AI SDK ModelMessage data that must remain JSON-serializable.\n * Recursing into them converts date strings (e.g. `createdAt` inside tool\n * result outputs) to Date objects, which violates the AI SDK's jsonValueSchema\n * and triggers AI_InvalidPromptError on subsequent streamText() calls.\n */\nfunction parseDates(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(parseDates);\n if (typeof obj !== 'object' || obj instanceof Date) return obj;\n \n const result = { ...obj };\n for (const key of Object.keys(result)) {\n // Skip modelMessage fields entirely - these must stay JSON-serializable\n if (MODEL_MESSAGE_FIELDS.includes(key)) {\n continue;\n }\n if (DATE_FIELDS.includes(key) && typeof result[key] === 'string') {\n result[key] = new Date(result[key]);\n } else if (typeof result[key] === 'object') {\n result[key] = parseDates(result[key]);\n }\n }\n return result;\n}\n\n/**\n * HTTP helper for remote API calls\n * @param options.skipParseDates - If true, skip the parseDates post-processing.\n * Use for endpoints that return ModelMessage[] directly, since those must\n * remain JSON-serializable for the AI SDK.\n */\nasync function api<T>(\n path: string,\n options: { method?: string; body?: unknown; skipParseDates?: boolean } = {}\n): Promise<T> {\n if (!remoteServerUrl || !authKey) {\n throw new Error('Remote database not initialized');\n }\n \n const url = `${remoteServerUrl}/db${path}`;\n const init: RequestInit = {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${authKey}`,\n },\n };\n \n if (options.body) {\n init.body = JSON.stringify(options.body);\n }\n \n const response = await fetch(url, init);\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n \n const text = await response.text();\n if (!text || text === 'null') {\n return null as T;\n }\n \n const parsed = JSON.parse(text);\n\n // Skip date parsing for raw ModelMessage data - it must stay JSON-serializable\n if (options.skipParseDates) {\n return parsed as T;\n }\n\n // Parse JSON and convert date strings to Date objects\n return parseDates(parsed) as T;\n}\n\n// ============================================\n// Session Queries\n// ============================================\n\nexport const remoteSessionQueries = {\n create(data: { workingDirectory: string; model: string; name?: string; config?: any }): Promise<Session> {\n return api<Session>('/sessions', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`).catch(() => undefined);\n },\n\n list(limit = 50, offset = 0): Promise<Session[]> {\n return api<Session[]>(`/sessions?limit=${limit}&offset=${offset}`);\n },\n\n updateStatus(id: string, status: Session['status']): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`, { method: 'PATCH', body: { status } });\n },\n\n updateModel(id: string, model: string): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`, { method: 'PATCH', body: { model } });\n },\n\n update(id: string, updates: { model?: string; name?: string; config?: any }): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`, { method: 'PATCH', body: updates });\n },\n\n delete(id: string): Promise<boolean> {\n return api<{ success: boolean }>(`/sessions/${id}`, { method: 'DELETE' }).then(r => r?.success ?? false);\n },\n};\n\n// ============================================\n// Message Queries\n// ============================================\n\nexport const remoteMessageQueries = {\n async getNextSequence(sessionId: string): Promise<number> {\n const result = await api<{ nextSequence: number }>(`/messages/session/${sessionId}/next-sequence`);\n return result.nextSequence;\n },\n\n create(sessionId: string, modelMessage: ModelMessage): Promise<Message> {\n return api<Message>('/messages', { method: 'POST', body: { sessionId, modelMessage } });\n },\n\n addMany(sessionId: string, modelMessages: ModelMessage[]): Promise<Message[]> {\n return api<Message[]>('/messages/batch', { method: 'POST', body: { sessionId, modelMessages } });\n },\n\n getBySession(sessionId: string): Promise<Message[]> {\n return api<Message[]>(`/messages/session/${sessionId}`);\n },\n\n getModelMessages(sessionId: string): Promise<ModelMessage[]> {\n // IMPORTANT: skipParseDates=true because ModelMessage data must remain\n // JSON-serializable. The parseDates function would convert date strings\n // inside tool result outputs (e.g. todo items with createdAt) to Date\n // objects, which violates the AI SDK's jsonValueSchema and causes\n // AI_InvalidPromptError on subsequent streamText() calls.\n return api<ModelMessage[]>(`/messages/session/${sessionId}/model-messages`, { skipParseDates: true });\n },\n\n async getRecentBySession(sessionId: string, limit = 50): Promise<Message[]> {\n const messages = await api<Message[]>(`/messages/session/${sessionId}`);\n return messages.slice(-limit);\n },\n\n async countBySession(sessionId: string): Promise<number> {\n const result = await api<{ count: number }>(`/messages/session/${sessionId}/count`);\n return result.count;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/messages/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n\n async deleteFromSequence(sessionId: string, fromSequence: number): Promise<number> {\n const result = await api<{ deleted: number }>(\n `/messages/session/${sessionId}/from-sequence/${fromSequence}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n};\n\n// ============================================\n// Tool Execution Queries\n// ============================================\n\nexport const remoteToolExecutionQueries = {\n create(data: {\n sessionId: string;\n messageId?: string;\n toolName: string;\n toolCallId: string;\n input?: any;\n requiresApproval?: boolean;\n status?: 'pending' | 'approved' | 'rejected' | 'completed' | 'error';\n }): Promise<ToolExecution> {\n return api<ToolExecution>('/tool-executions', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`).catch(() => undefined);\n },\n\n getByToolCallId(toolCallId: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/by-tool-call-id/${toolCallId}`).catch(() => undefined);\n },\n\n getPendingApprovals(sessionId: string): Promise<ToolExecution[]> {\n return api<ToolExecution[]>(`/tool-executions/session/${sessionId}/pending`);\n },\n\n approve(id: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`, { method: 'PATCH', body: { status: 'approved' } });\n },\n\n reject(id: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`, { method: 'PATCH', body: { status: 'rejected' } });\n },\n\n complete(id: string, output: unknown, error?: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`, {\n method: 'PATCH',\n body: { status: error ? 'error' : 'completed', output, error },\n });\n },\n\n getBySession(sessionId: string): Promise<ToolExecution[]> {\n return api<ToolExecution[]>(`/tool-executions/session/${sessionId}`);\n },\n\n async deleteAfterTime(sessionId: string, afterTime: Date | string): Promise<number> {\n // Handle both Date objects and ISO strings\n const timestamp = afterTime instanceof Date ? afterTime.getTime() : new Date(afterTime).getTime();\n const result = await api<{ deleted: number }>(\n `/tool-executions/session/${sessionId}/after/${timestamp}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n};\n\n// ============================================\n// Todo Queries\n// ============================================\n\nexport const remoteTodoQueries = {\n create(data: { sessionId: string; content: string; order?: number }): Promise<TodoItem> {\n return api<TodoItem>('/todos', { method: 'POST', body: data });\n },\n\n createMany(sessionId: string, items: Array<{ content: string; order?: number }>): Promise<TodoItem[]> {\n return api<TodoItem[]>('/todos/batch', { method: 'POST', body: { sessionId, items } });\n },\n\n getBySession(sessionId: string): Promise<TodoItem[]> {\n return api<TodoItem[]>(`/todos/session/${sessionId}`);\n },\n\n updateStatus(id: string, status: TodoItem['status']): Promise<TodoItem | undefined> {\n return api<TodoItem | undefined>(`/todos/${id}`, { method: 'PATCH', body: { status } });\n },\n\n async delete(id: string): Promise<boolean> {\n const result = await api<{ success: boolean }>(`/todos/${id}`, { method: 'DELETE' });\n return result?.success ?? false;\n },\n\n async clearSession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/todos/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Skill Queries\n// ============================================\n\nexport const remoteSkillQueries = {\n load(sessionId: string, skillName: string): Promise<LoadedSkill> {\n return api<LoadedSkill>('/skills', { method: 'POST', body: { sessionId, skillName } });\n },\n\n getBySession(sessionId: string): Promise<LoadedSkill[]> {\n return api<LoadedSkill[]>(`/skills/session/${sessionId}`);\n },\n\n async isLoaded(sessionId: string, skillName: string): Promise<boolean> {\n const result = await api<{ isLoaded: boolean }>(`/skills/session/${sessionId}/is-loaded/${skillName}`);\n return result.isLoaded;\n },\n};\n\n// ============================================\n// Terminal Queries\n// ============================================\n\nexport const remoteTerminalQueries = {\n create(data: { sessionId: string; command: string; cwd: string; name?: string }): Promise<Terminal> {\n return api<Terminal>('/terminals', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<Terminal | undefined> {\n return api<Terminal | undefined>(`/terminals/${id}`).catch(() => undefined);\n },\n\n getBySession(sessionId: string): Promise<Terminal[]> {\n return api<Terminal[]>(`/terminals/session/${sessionId}`);\n },\n\n getRunning(sessionId: string): Promise<Terminal[]> {\n return api<Terminal[]>(`/terminals/session/${sessionId}/running`);\n },\n\n updateStatus(id: string, status: Terminal['status'], exitCode?: number, error?: string): Promise<Terminal | undefined> {\n return api<Terminal | undefined>(`/terminals/${id}`, { method: 'PATCH', body: { status, exitCode, error } });\n },\n\n updatePid(id: string, pid: number): Promise<Terminal | undefined> {\n return api<Terminal | undefined>(`/terminals/${id}`, { method: 'PATCH', body: { pid } });\n },\n\n async delete(id: string): Promise<boolean> {\n const result = await api<{ success: boolean }>(`/terminals/${id}`, { method: 'DELETE' });\n return result?.success ?? false;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/terminals/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Active Stream Queries\n// ============================================\n\nexport const remoteActiveStreamQueries = {\n create(sessionId: string, streamId: string): Promise<ActiveStream> {\n return api<ActiveStream>('/streams', { method: 'POST', body: { sessionId, streamId } });\n },\n\n getBySessionId(sessionId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | null>(`/streams/session/${sessionId}`).then(r => r ?? undefined);\n },\n\n getByStreamId(streamId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | undefined>(`/streams/by-stream-id/${streamId}`).catch(() => undefined);\n },\n\n finish(streamId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | undefined>(`/streams/by-stream-id/${streamId}`, { method: 'PATCH', body: { status: 'finished' } });\n },\n\n markError(streamId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | undefined>(`/streams/by-stream-id/${streamId}`, { method: 'PATCH', body: { status: 'error' } });\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/streams/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Checkpoint Queries\n// ============================================\n\nexport const remoteCheckpointQueries = {\n create(data: { sessionId: string; messageSequence: number; gitHead?: string }): Promise<Checkpoint> {\n return api<Checkpoint>('/checkpoints', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<Checkpoint | undefined> {\n return api<Checkpoint | undefined>(`/checkpoints/${id}`).catch(() => undefined);\n },\n\n getBySession(sessionId: string): Promise<Checkpoint[]> {\n return api<Checkpoint[]>(`/checkpoints/session/${sessionId}`);\n },\n\n getByMessageSequence(sessionId: string, messageSequence: number): Promise<Checkpoint | undefined> {\n return api<Checkpoint | null>(`/checkpoints/session/${sessionId}/by-sequence/${messageSequence}`).then(r => r ?? undefined);\n },\n\n getLatest(sessionId: string): Promise<Checkpoint | undefined> {\n return api<Checkpoint | null>(`/checkpoints/session/${sessionId}/latest`).then(r => r ?? undefined);\n },\n\n async deleteAfterSequence(sessionId: string, messageSequence: number): Promise<number> {\n const result = await api<{ deleted: number }>(\n `/checkpoints/session/${sessionId}/after-sequence/${messageSequence}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/checkpoints/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// File Backup Queries\n// ============================================\n\nexport const remoteFileBackupQueries = {\n create(data: {\n checkpointId: string;\n sessionId: string;\n filePath: string;\n originalContent: string | null;\n existed: boolean;\n }): Promise<FileBackup> {\n return api<FileBackup>('/file-backups', { method: 'POST', body: data });\n },\n\n getByCheckpoint(checkpointId: string): Promise<FileBackup[]> {\n return api<FileBackup[]>(`/file-backups/checkpoint/${checkpointId}`);\n },\n\n getBySession(sessionId: string): Promise<FileBackup[]> {\n return api<FileBackup[]>(`/file-backups/session/${sessionId}`);\n },\n\n getFromSequence(sessionId: string, messageSequence: number): Promise<FileBackup[]> {\n return api<FileBackup[]>(`/file-backups/session/${sessionId}/from-sequence/${messageSequence}`);\n },\n\n async hasBackup(checkpointId: string, filePath: string): Promise<boolean> {\n const result = await api<{ hasBackup: boolean }>(\n `/file-backups/checkpoint/${checkpointId}/has-backup/${encodeURIComponent(filePath)}`\n );\n return result.hasBackup;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/file-backups/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Subagent Queries\n// ============================================\n\nexport const remoteSubagentQueries = {\n create(data: {\n sessionId: string;\n toolCallId: string;\n subagentType: string;\n task: string;\n model: string;\n }): Promise<SubagentExecution> {\n return api<SubagentExecution>('/subagents', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`).catch(() => undefined);\n },\n\n getByToolCallId(toolCallId: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/by-tool-call-id/${toolCallId}`).catch(() => undefined);\n },\n\n getBySession(sessionId: string): Promise<SubagentExecution[]> {\n return api<SubagentExecution[]>(`/subagents/session/${sessionId}`);\n },\n\n addStep(id: string, step: SubagentStep): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}/add-step`, { method: 'POST', body: { step } }).catch(() => undefined);\n },\n\n complete(id: string, result: unknown): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`, { method: 'PATCH', body: { status: 'completed', result } }).catch(() => undefined);\n },\n\n markError(id: string, error: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`, { method: 'PATCH', body: { status: 'error', error } }).catch(() => undefined);\n },\n\n cancel(id: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`, { method: 'PATCH', body: { status: 'cancelled' } }).catch(() => undefined);\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/subagents/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Indexed Chunk Queries\n// ============================================\n\nexport const remoteIndexedChunkQueries = {\n upsert(\n _db: any, // Ignored - for API compatibility\n data: {\n id: string;\n contentHash: string;\n filePath: string;\n repoNamespace: string;\n startLine?: number;\n endLine?: number;\n language?: string;\n }\n ): Promise<IndexedChunk> {\n return api<IndexedChunk>('/indexed-chunks', { method: 'POST', body: data });\n },\n\n batchUpsert(\n _db: any,\n chunks: Array<{\n id: string;\n contentHash: string;\n filePath: string;\n repoNamespace: string;\n startLine?: number;\n endLine?: number;\n language?: string;\n }>\n ): Promise<{ created: number; updated: number }> {\n return api<{ created: number; updated: number }>('/indexed-chunks/batch', { \n method: 'POST', \n body: { chunks } \n });\n },\n\n getById(_db: any, id: string): Promise<IndexedChunk | undefined> {\n return api<IndexedChunk | undefined>(`/indexed-chunks/${id}`).catch(() => undefined);\n },\n\n getByNamespace(_db: any, namespace: string): Promise<IndexedChunk[]> {\n return api<IndexedChunk[]>(`/indexed-chunks/namespace/${namespace}`);\n },\n\n getByFilePath(_db: any, namespace: string, filePath: string): Promise<IndexedChunk[]> {\n return api<IndexedChunk[]>(`/indexed-chunks/namespace/${namespace}/file/${encodeURIComponent(filePath)}`);\n },\n\n async deleteByNamespace(_db: any, namespace: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/indexed-chunks/namespace/${namespace}`, { method: 'DELETE' });\n return result.deleted;\n },\n\n async deleteByFilePath(_db: any, namespace: string, filePath: string): Promise<number> {\n const result = await api<{ deleted: number }>(\n `/indexed-chunks/namespace/${namespace}/file/${encodeURIComponent(filePath)}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n\n async countByNamespace(_db: any, namespace: string): Promise<number> {\n const result = await api<{ count: number }>(`/indexed-chunks/namespace/${namespace}/count`);\n return result.count;\n },\n};\n\n// ============================================\n// Index Status Queries\n// ============================================\n\nexport const remoteIndexStatusQueries = {\n upsert(\n _db: any, // Ignored\n data: {\n id: string;\n repoNamespace: string;\n totalChunks?: number;\n lastFullIndex?: Date;\n lastIncrementalIndex?: Date;\n }\n ): Promise<IndexStatusRecord> {\n return api<IndexStatusRecord>('/index-status', {\n method: 'POST',\n body: {\n ...data,\n lastFullIndex: data.lastFullIndex?.toISOString(),\n lastIncrementalIndex: data.lastIncrementalIndex?.toISOString(),\n },\n });\n },\n\n get(_db: any, namespace: string): Promise<IndexStatusRecord | undefined> {\n return api<IndexStatusRecord | null>(`/index-status/namespace/${namespace}`).then(r => r ?? undefined);\n },\n\n async delete(_db: any, namespace: string): Promise<boolean> {\n const result = await api<{ success: boolean }>(`/index-status/namespace/${namespace}`, { method: 'DELETE' });\n return result?.success ?? false;\n },\n\n list(_db: any): Promise<IndexStatusRecord[]> {\n return api<IndexStatusRecord[]>('/index-status');\n },\n};\n","/**\n * Database layer - Remote MongoDB only\n * \n * All data is stored on the remote server at agent.sparkecode.com\n */\n\nimport {\n initRemoteDatabase,\n closeRemoteDatabase,\n remoteSessionQueries,\n remoteMessageQueries,\n remoteToolExecutionQueries,\n remoteTodoQueries,\n remoteSkillQueries,\n remoteTerminalQueries,\n remoteActiveStreamQueries,\n remoteCheckpointQueries,\n remoteFileBackupQueries,\n remoteSubagentQueries,\n remoteIndexedChunkQueries,\n remoteIndexStatusQueries,\n} from './remote.js';\n\n// Re-export types from schema\nexport type {\n Session,\n NewSession,\n Message,\n NewMessage,\n ToolExecution,\n NewToolExecution,\n TodoItem,\n NewTodoItem,\n SessionConfig,\n ModelMessage,\n UserModelMessage,\n UserContentPart,\n UserTextPart,\n UserImagePart,\n UserFilePart,\n Terminal,\n NewTerminal,\n ActiveStream,\n NewActiveStream,\n Checkpoint,\n NewCheckpoint,\n FileBackup,\n NewFileBackup,\n SubagentExecution,\n NewSubagentExecution,\n SubagentStep,\n IndexedChunk,\n NewIndexedChunk,\n IndexStatusRecord,\n NewIndexStatusRecord,\n LoadedSkill,\n} from './schema.js';\n\nlet initialized = false;\n\n/**\n * Initialize the database with remote server config\n * @param config - Remote server configuration { url, authKey }\n */\nexport function initDatabase(config: { url: string; authKey: string }) {\n initRemoteDatabase(config.url, config.authKey);\n initialized = true;\n}\n\n/**\n * Get a stub database object for API compatibility\n * Functions that take a db parameter will ignore it for remote operations\n */\nexport function getDb() {\n if (!initialized) {\n throw new Error('Database not initialized. Call initDatabase first.');\n }\n // Return a stub - the actual queries use remote API calls\n return {} as any;\n}\n\n/**\n * Check if using remote database (always true now)\n */\nexport function isUsingRemote(): boolean {\n return true;\n}\n\n/**\n * Close the database connection\n */\nexport function closeDatabase() {\n closeRemoteDatabase();\n initialized = false;\n}\n\n// Re-export query objects with cleaner names\nexport const sessionQueries = remoteSessionQueries;\nexport const messageQueries = remoteMessageQueries;\nexport const toolExecutionQueries = remoteToolExecutionQueries;\nexport const todoQueries = remoteTodoQueries;\nexport const skillQueries = remoteSkillQueries;\nexport const terminalQueries = remoteTerminalQueries;\nexport const activeStreamQueries = remoteActiveStreamQueries;\nexport const checkpointQueries = remoteCheckpointQueries;\nexport const fileBackupQueries = remoteFileBackupQueries;\nexport const subagentQueries = remoteSubagentQueries;\nexport const indexedChunkQueries = remoteIndexedChunkQueries;\nexport const indexStatusQueries = remoteIndexStatusQueries;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/db/remote.ts","../../src/db/index.ts"],"sourcesContent":["/**\n * Remote database client\n * \n * Implements the same interface as the local SQLite database\n * but calls the remote server via HTTP.\n */\n\nimport type {\n Session,\n Message,\n ToolExecution,\n TodoItem,\n ModelMessage,\n Terminal,\n ActiveStream,\n Checkpoint,\n FileBackup,\n SubagentExecution,\n SubagentStep,\n IndexedChunk,\n IndexStatusRecord,\n LoadedSkill,\n} from './schema.js';\n\nlet remoteServerUrl: string | null = null;\nlet authKey: string | null = null;\n\n/**\n * Initialize the remote database client\n */\nexport function initRemoteDatabase(serverUrl: string, key: string) {\n remoteServerUrl = serverUrl.replace(/\\/$/, ''); // Remove trailing slash\n authKey = key;\n}\n\n/**\n * Close the remote client (no-op, just for API compatibility)\n */\nexport function closeRemoteDatabase() {\n remoteServerUrl = null;\n authKey = null;\n}\n\n/**\n * Check if remote database is configured\n */\nexport function isRemoteConfigured(): boolean {\n return !!remoteServerUrl && !!authKey;\n}\n\n/**\n * Date fields that should be parsed from ISO strings to Date objects.\n * These are top-level metadata fields on database records (Session, Message, etc.),\n * NOT fields inside modelMessage content (tool outputs, etc.).\n */\nconst DATE_FIELDS = ['createdAt', 'updatedAt', 'startedAt', 'completedAt', 'stoppedAt', 'finishedAt', 'loadedAt', 'indexedAt', 'lastFullIndex', 'lastIncrementalIndex'];\n\n/**\n * Fields that contain AI SDK ModelMessage data and should NOT be recursively\n * processed by parseDates. The AI SDK's Zod schema requires tool output values\n * to be valid JSON primitives (string, number, boolean, null, object, array).\n * Converting date strings to Date objects inside these fields corrupts them and\n * causes AI_InvalidPromptError when the messages are passed back to streamText().\n */\nconst MODEL_MESSAGE_FIELDS = ['modelMessage', 'modelMessages'];\n\n/**\n * Parse date strings to Date objects on top-level record fields only.\n * \n * IMPORTANT: Does NOT recurse into `modelMessage` / `modelMessages` fields.\n * Those contain AI SDK ModelMessage data that must remain JSON-serializable.\n * Recursing into them converts date strings (e.g. `createdAt` inside tool\n * result outputs) to Date objects, which violates the AI SDK's jsonValueSchema\n * and triggers AI_InvalidPromptError on subsequent streamText() calls.\n */\nfunction parseDates(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(parseDates);\n if (typeof obj !== 'object' || obj instanceof Date) return obj;\n \n const result = { ...obj };\n for (const key of Object.keys(result)) {\n // Skip modelMessage fields entirely - these must stay JSON-serializable\n if (MODEL_MESSAGE_FIELDS.includes(key)) {\n continue;\n }\n if (DATE_FIELDS.includes(key) && typeof result[key] === 'string') {\n result[key] = new Date(result[key]);\n } else if (typeof result[key] === 'object') {\n result[key] = parseDates(result[key]);\n }\n }\n return result;\n}\n\n/**\n * HTTP helper for remote API calls\n * @param options.skipParseDates - If true, skip the parseDates post-processing.\n * Use for endpoints that return ModelMessage[] directly, since those must\n * remain JSON-serializable for the AI SDK.\n */\nasync function api<T>(\n path: string,\n options: { method?: string; body?: unknown; skipParseDates?: boolean } = {}\n): Promise<T> {\n if (!remoteServerUrl || !authKey) {\n throw new Error('Remote database not initialized');\n }\n \n const url = `${remoteServerUrl}/db${path}`;\n const init: RequestInit = {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${authKey}`,\n },\n };\n \n if (options.body) {\n init.body = JSON.stringify(options.body);\n }\n \n const response = await fetch(url, init);\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n \n const text = await response.text();\n if (!text || text === 'null') {\n return null as T;\n }\n \n const parsed = JSON.parse(text);\n\n // Skip date parsing for raw ModelMessage data - it must stay JSON-serializable\n if (options.skipParseDates) {\n return parsed as T;\n }\n\n // Parse JSON and convert date strings to Date objects\n return parseDates(parsed) as T;\n}\n\n// ============================================\n// Session Queries\n// ============================================\n\nexport const remoteSessionQueries = {\n create(data: { workingDirectory: string; model: string; name?: string; config?: any }): Promise<Session> {\n return api<Session>('/sessions', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`).catch(() => undefined);\n },\n\n list(limit = 50, offset = 0): Promise<Session[]> {\n return api<Session[]>(`/sessions?limit=${limit}&offset=${offset}`);\n },\n\n updateStatus(id: string, status: Session['status']): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`, { method: 'PATCH', body: { status } });\n },\n\n updateModel(id: string, model: string): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`, { method: 'PATCH', body: { model } });\n },\n\n update(id: string, updates: { model?: string; name?: string; config?: any }): Promise<Session | undefined> {\n return api<Session | undefined>(`/sessions/${id}`, { method: 'PATCH', body: updates });\n },\n\n delete(id: string): Promise<boolean> {\n return api<{ success: boolean }>(`/sessions/${id}`, { method: 'DELETE' }).then(r => r?.success ?? false);\n },\n};\n\n// ============================================\n// Message Queries\n// ============================================\n\nexport const remoteMessageQueries = {\n async getNextSequence(sessionId: string): Promise<number> {\n const result = await api<{ nextSequence: number }>(`/messages/session/${sessionId}/next-sequence`);\n return result.nextSequence;\n },\n\n create(sessionId: string, modelMessage: ModelMessage): Promise<Message> {\n return api<Message>('/messages', { method: 'POST', body: { sessionId, modelMessage } });\n },\n\n addMany(sessionId: string, modelMessages: ModelMessage[]): Promise<Message[]> {\n return api<Message[]>('/messages/batch', { method: 'POST', body: { sessionId, modelMessages } });\n },\n\n getBySession(sessionId: string): Promise<Message[]> {\n return api<Message[]>(`/messages/session/${sessionId}`);\n },\n\n getModelMessages(sessionId: string): Promise<ModelMessage[]> {\n // IMPORTANT: skipParseDates=true because ModelMessage data must remain\n // JSON-serializable. The parseDates function would convert date strings\n // inside tool result outputs (e.g. todo items with createdAt) to Date\n // objects, which violates the AI SDK's jsonValueSchema and causes\n // AI_InvalidPromptError on subsequent streamText() calls.\n return api<ModelMessage[]>(`/messages/session/${sessionId}/model-messages`, { skipParseDates: true });\n },\n\n async getRecentBySession(sessionId: string, limit = 50): Promise<Message[]> {\n const messages = await api<Message[]>(`/messages/session/${sessionId}`);\n return messages.slice(-limit);\n },\n\n async countBySession(sessionId: string): Promise<number> {\n const result = await api<{ count: number }>(`/messages/session/${sessionId}/count`);\n return result.count;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/messages/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n\n async deleteFromSequence(sessionId: string, fromSequence: number): Promise<number> {\n const result = await api<{ deleted: number }>(\n `/messages/session/${sessionId}/from-sequence/${fromSequence}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n};\n\n// ============================================\n// Tool Execution Queries\n// ============================================\n\nexport const remoteToolExecutionQueries = {\n create(data: {\n sessionId: string;\n messageId?: string;\n toolName: string;\n toolCallId: string;\n input?: any;\n requiresApproval?: boolean;\n status?: 'pending' | 'approved' | 'rejected' | 'completed' | 'error';\n }): Promise<ToolExecution> {\n return api<ToolExecution>('/tool-executions', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`).catch(() => undefined);\n },\n\n getByToolCallId(toolCallId: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/by-tool-call-id/${toolCallId}`).catch(() => undefined);\n },\n\n getPendingApprovals(sessionId: string): Promise<ToolExecution[]> {\n return api<ToolExecution[]>(`/tool-executions/session/${sessionId}/pending`);\n },\n\n approve(id: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`, { method: 'PATCH', body: { status: 'approved' } });\n },\n\n reject(id: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`, { method: 'PATCH', body: { status: 'rejected' } });\n },\n\n complete(id: string, output: unknown, error?: string): Promise<ToolExecution | undefined> {\n return api<ToolExecution | undefined>(`/tool-executions/${id}`, {\n method: 'PATCH',\n body: { status: error ? 'error' : 'completed', output, error },\n });\n },\n\n getBySession(sessionId: string): Promise<ToolExecution[]> {\n return api<ToolExecution[]>(`/tool-executions/session/${sessionId}`);\n },\n\n async deleteAfterTime(sessionId: string, afterTime: Date | string): Promise<number> {\n // Handle both Date objects and ISO strings\n const timestamp = afterTime instanceof Date ? afterTime.getTime() : new Date(afterTime).getTime();\n const result = await api<{ deleted: number }>(\n `/tool-executions/session/${sessionId}/after/${timestamp}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n};\n\n// ============================================\n// Todo Queries\n// ============================================\n\nexport const remoteTodoQueries = {\n create(data: { sessionId: string; content: string; order?: number }): Promise<TodoItem> {\n return api<TodoItem>('/todos', { method: 'POST', body: data });\n },\n\n createMany(sessionId: string, items: Array<{ content: string; order?: number }>): Promise<TodoItem[]> {\n return api<TodoItem[]>('/todos/batch', { method: 'POST', body: { sessionId, items } });\n },\n\n getBySession(sessionId: string): Promise<TodoItem[]> {\n return api<TodoItem[]>(`/todos/session/${sessionId}`);\n },\n\n updateStatus(id: string, status: TodoItem['status']): Promise<TodoItem | undefined> {\n return api<TodoItem | undefined>(`/todos/${id}`, { method: 'PATCH', body: { status } });\n },\n\n async delete(id: string): Promise<boolean> {\n const result = await api<{ success: boolean }>(`/todos/${id}`, { method: 'DELETE' });\n return result?.success ?? false;\n },\n\n async clearSession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/todos/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Skill Queries\n// ============================================\n\nexport const remoteSkillQueries = {\n load(sessionId: string, skillName: string): Promise<LoadedSkill> {\n return api<LoadedSkill>('/skills', { method: 'POST', body: { sessionId, skillName } });\n },\n\n getBySession(sessionId: string): Promise<LoadedSkill[]> {\n return api<LoadedSkill[]>(`/skills/session/${sessionId}`);\n },\n\n async isLoaded(sessionId: string, skillName: string): Promise<boolean> {\n const result = await api<{ isLoaded: boolean }>(`/skills/session/${sessionId}/is-loaded/${skillName}`);\n return result.isLoaded;\n },\n};\n\n// ============================================\n// Terminal Queries\n// ============================================\n\nexport const remoteTerminalQueries = {\n create(data: { sessionId: string; command: string; cwd: string; name?: string }): Promise<Terminal> {\n return api<Terminal>('/terminals', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<Terminal | undefined> {\n return api<Terminal | undefined>(`/terminals/${id}`).catch(() => undefined);\n },\n\n getBySession(sessionId: string): Promise<Terminal[]> {\n return api<Terminal[]>(`/terminals/session/${sessionId}`);\n },\n\n getRunning(sessionId: string): Promise<Terminal[]> {\n return api<Terminal[]>(`/terminals/session/${sessionId}/running`);\n },\n\n updateStatus(id: string, status: Terminal['status'], exitCode?: number, error?: string): Promise<Terminal | undefined> {\n return api<Terminal | undefined>(`/terminals/${id}`, { method: 'PATCH', body: { status, exitCode, error } });\n },\n\n updatePid(id: string, pid: number): Promise<Terminal | undefined> {\n return api<Terminal | undefined>(`/terminals/${id}`, { method: 'PATCH', body: { pid } });\n },\n\n async delete(id: string): Promise<boolean> {\n const result = await api<{ success: boolean }>(`/terminals/${id}`, { method: 'DELETE' });\n return result?.success ?? false;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/terminals/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Active Stream Queries\n// ============================================\n\nexport const remoteActiveStreamQueries = {\n create(sessionId: string, streamId: string): Promise<ActiveStream> {\n return api<ActiveStream>('/streams', { method: 'POST', body: { sessionId, streamId } });\n },\n\n getBySessionId(sessionId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | null>(`/streams/session/${sessionId}`).then(r => r ?? undefined);\n },\n\n getByStreamId(streamId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | undefined>(`/streams/by-stream-id/${streamId}`).catch(() => undefined);\n },\n\n finish(streamId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | undefined>(`/streams/by-stream-id/${streamId}`, { method: 'PATCH', body: { status: 'finished' } });\n },\n\n markError(streamId: string): Promise<ActiveStream | undefined> {\n return api<ActiveStream | undefined>(`/streams/by-stream-id/${streamId}`, { method: 'PATCH', body: { status: 'error' } });\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/streams/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Checkpoint Queries\n// ============================================\n\nexport const remoteCheckpointQueries = {\n create(data: { sessionId: string; messageSequence: number; gitHead?: string }): Promise<Checkpoint> {\n return api<Checkpoint>('/checkpoints', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<Checkpoint | undefined> {\n return api<Checkpoint | undefined>(`/checkpoints/${id}`).catch(() => undefined);\n },\n\n getBySession(sessionId: string): Promise<Checkpoint[]> {\n return api<Checkpoint[]>(`/checkpoints/session/${sessionId}`);\n },\n\n getByMessageSequence(sessionId: string, messageSequence: number): Promise<Checkpoint | undefined> {\n return api<Checkpoint | null>(`/checkpoints/session/${sessionId}/by-sequence/${messageSequence}`).then(r => r ?? undefined);\n },\n\n getLatest(sessionId: string): Promise<Checkpoint | undefined> {\n return api<Checkpoint | null>(`/checkpoints/session/${sessionId}/latest`).then(r => r ?? undefined);\n },\n\n async deleteAfterSequence(sessionId: string, messageSequence: number): Promise<number> {\n const result = await api<{ deleted: number }>(\n `/checkpoints/session/${sessionId}/after-sequence/${messageSequence}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/checkpoints/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// File Backup Queries\n// ============================================\n\nexport const remoteFileBackupQueries = {\n create(data: {\n checkpointId: string;\n sessionId: string;\n filePath: string;\n originalContent: string | null;\n existed: boolean;\n }): Promise<FileBackup> {\n return api<FileBackup>('/file-backups', { method: 'POST', body: data });\n },\n\n getByCheckpoint(checkpointId: string): Promise<FileBackup[]> {\n return api<FileBackup[]>(`/file-backups/checkpoint/${checkpointId}`);\n },\n\n getBySession(sessionId: string): Promise<FileBackup[]> {\n return api<FileBackup[]>(`/file-backups/session/${sessionId}`);\n },\n\n getFromSequence(sessionId: string, messageSequence: number): Promise<FileBackup[]> {\n return api<FileBackup[]>(`/file-backups/session/${sessionId}/from-sequence/${messageSequence}`);\n },\n\n async hasBackup(checkpointId: string, filePath: string): Promise<boolean> {\n const result = await api<{ hasBackup: boolean }>(\n `/file-backups/checkpoint/${checkpointId}/has-backup/${encodeURIComponent(filePath)}`\n );\n return result.hasBackup;\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/file-backups/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Subagent Queries\n// ============================================\n\nexport const remoteSubagentQueries = {\n create(data: {\n sessionId: string;\n toolCallId: string;\n subagentType: string;\n task: string;\n model: string;\n }): Promise<SubagentExecution> {\n return api<SubagentExecution>('/subagents', { method: 'POST', body: data });\n },\n\n getById(id: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`).catch(() => undefined);\n },\n\n getByToolCallId(toolCallId: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/by-tool-call-id/${toolCallId}`).catch(() => undefined);\n },\n\n getBySession(sessionId: string): Promise<SubagentExecution[]> {\n return api<SubagentExecution[]>(`/subagents/session/${sessionId}`);\n },\n\n addStep(id: string, step: SubagentStep): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}/add-step`, { method: 'POST', body: { step } }).catch(() => undefined);\n },\n\n complete(id: string, result: unknown): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`, { method: 'PATCH', body: { status: 'completed', result } }).catch(() => undefined);\n },\n\n markError(id: string, error: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`, { method: 'PATCH', body: { status: 'error', error } }).catch(() => undefined);\n },\n\n cancel(id: string): Promise<SubagentExecution | undefined> {\n return api<SubagentExecution | undefined>(`/subagents/${id}`, { method: 'PATCH', body: { status: 'cancelled' } }).catch(() => undefined);\n },\n\n async deleteBySession(sessionId: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/subagents/session/${sessionId}`, { method: 'DELETE' });\n return result.deleted;\n },\n};\n\n// ============================================\n// Indexed Chunk Queries\n// ============================================\n\nexport const remoteIndexedChunkQueries = {\n upsert(\n _db: any, // Ignored - for API compatibility\n data: {\n id: string;\n contentHash: string;\n filePath: string;\n repoNamespace: string;\n startLine?: number;\n endLine?: number;\n language?: string;\n }\n ): Promise<IndexedChunk> {\n return api<IndexedChunk>('/indexed-chunks', { method: 'POST', body: data });\n },\n\n batchUpsert(\n _db: any,\n chunks: Array<{\n id: string;\n contentHash: string;\n filePath: string;\n repoNamespace: string;\n startLine?: number;\n endLine?: number;\n language?: string;\n }>\n ): Promise<{ created: number; updated: number }> {\n return api<{ created: number; updated: number }>('/indexed-chunks/batch', { \n method: 'POST', \n body: { chunks } \n });\n },\n\n getById(_db: any, id: string): Promise<IndexedChunk | undefined> {\n return api<IndexedChunk | undefined>(`/indexed-chunks/${id}`).catch(() => undefined);\n },\n\n getByNamespace(_db: any, namespace: string): Promise<IndexedChunk[]> {\n return api<IndexedChunk[]>(`/indexed-chunks/namespace/${namespace}`);\n },\n\n getByFilePath(_db: any, namespace: string, filePath: string): Promise<IndexedChunk[]> {\n return api<IndexedChunk[]>(`/indexed-chunks/namespace/${namespace}/file/${encodeURIComponent(filePath)}`);\n },\n\n async deleteByNamespace(_db: any, namespace: string): Promise<number> {\n const result = await api<{ deleted: number }>(`/indexed-chunks/namespace/${namespace}`, { method: 'DELETE' });\n return result.deleted;\n },\n\n async deleteByFilePath(_db: any, namespace: string, filePath: string): Promise<number> {\n const result = await api<{ deleted: number }>(\n `/indexed-chunks/namespace/${namespace}/file/${encodeURIComponent(filePath)}`,\n { method: 'DELETE' }\n );\n return result.deleted;\n },\n\n async countByNamespace(_db: any, namespace: string): Promise<number> {\n const result = await api<{ count: number }>(`/indexed-chunks/namespace/${namespace}/count`);\n return result.count;\n },\n};\n\n// ============================================\n// Index Status Queries\n// ============================================\n\nexport const remoteIndexStatusQueries = {\n upsert(\n _db: any, // Ignored\n data: {\n id: string;\n repoNamespace: string;\n totalChunks?: number;\n lastFullIndex?: Date;\n lastIncrementalIndex?: Date;\n }\n ): Promise<IndexStatusRecord> {\n return api<IndexStatusRecord>('/index-status', {\n method: 'POST',\n body: {\n ...data,\n lastFullIndex: data.lastFullIndex?.toISOString(),\n lastIncrementalIndex: data.lastIncrementalIndex?.toISOString(),\n },\n });\n },\n\n get(_db: any, namespace: string): Promise<IndexStatusRecord | undefined> {\n return api<IndexStatusRecord | null>(`/index-status/namespace/${namespace}`).then(r => r ?? undefined);\n },\n\n async delete(_db: any, namespace: string): Promise<boolean> {\n const result = await api<{ success: boolean }>(`/index-status/namespace/${namespace}`, { method: 'DELETE' });\n return result?.success ?? false;\n },\n\n list(_db: any): Promise<IndexStatusRecord[]> {\n return api<IndexStatusRecord[]>('/index-status');\n },\n};\n","/**\n * Database layer - Remote MongoDB only\n * \n * All data is stored on the remote server at agent.sparkecode.com\n */\n\nimport {\n initRemoteDatabase,\n closeRemoteDatabase,\n remoteSessionQueries,\n remoteMessageQueries,\n remoteToolExecutionQueries,\n remoteTodoQueries,\n remoteSkillQueries,\n remoteTerminalQueries,\n remoteActiveStreamQueries,\n remoteCheckpointQueries,\n remoteFileBackupQueries,\n remoteSubagentQueries,\n remoteIndexedChunkQueries,\n remoteIndexStatusQueries,\n} from './remote.js';\n\n// Re-export types from schema\nexport type {\n Session,\n NewSession,\n Message,\n NewMessage,\n ToolExecution,\n NewToolExecution,\n TodoItem,\n NewTodoItem,\n SessionConfig,\n ModelMessage,\n UserModelMessage,\n UserContentPart,\n UserTextPart,\n UserImagePart,\n UserFilePart,\n Terminal,\n NewTerminal,\n ActiveStream,\n NewActiveStream,\n Checkpoint,\n NewCheckpoint,\n FileBackup,\n NewFileBackup,\n SubagentExecution,\n NewSubagentExecution,\n SubagentStep,\n IndexedChunk,\n NewIndexedChunk,\n IndexStatusRecord,\n NewIndexStatusRecord,\n LoadedSkill,\n TaskConfig,\n} from './schema.js';\n\nlet initialized = false;\n\n/**\n * Initialize the database with remote server config\n * @param config - Remote server configuration { url, authKey }\n */\nexport function initDatabase(config: { url: string; authKey: string }) {\n initRemoteDatabase(config.url, config.authKey);\n initialized = true;\n}\n\n/**\n * Get a stub database object for API compatibility\n * Functions that take a db parameter will ignore it for remote operations\n */\nexport function getDb() {\n if (!initialized) {\n throw new Error('Database not initialized. Call initDatabase first.');\n }\n // Return a stub - the actual queries use remote API calls\n return {} as any;\n}\n\n/**\n * Check if using remote database (always true now)\n */\nexport function isUsingRemote(): boolean {\n return true;\n}\n\n/**\n * Close the database connection\n */\nexport function closeDatabase() {\n closeRemoteDatabase();\n initialized = false;\n}\n\n// Re-export query objects with cleaner names\nexport const sessionQueries = remoteSessionQueries;\nexport const messageQueries = remoteMessageQueries;\nexport const toolExecutionQueries = remoteToolExecutionQueries;\nexport const todoQueries = remoteTodoQueries;\nexport const skillQueries = remoteSkillQueries;\nexport const terminalQueries = remoteTerminalQueries;\nexport const activeStreamQueries = remoteActiveStreamQueries;\nexport const checkpointQueries = remoteCheckpointQueries;\nexport const fileBackupQueries = remoteFileBackupQueries;\nexport const subagentQueries = remoteSubagentQueries;\nexport const indexedChunkQueries = remoteIndexedChunkQueries;\nexport const indexStatusQueries = remoteIndexStatusQueries;\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ModelMessage, streamText } from 'ai';
|
|
2
|
-
import { S as Session, b as ToolExecution } from './schema-
|
|
2
|
+
import { S as Session, b as ToolExecution, r as TaskConfig } from './schema-C7Mm4Ykn.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from './search-
|
|
4
|
+
import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from './search-C_IFImt1.js';
|
|
5
5
|
|
|
6
6
|
declare const ToolApprovalConfigSchema: z.ZodObject<{
|
|
7
7
|
bash: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
@@ -27,16 +27,64 @@ declare const SessionConfigSchema: z.ZodObject<{
|
|
|
27
27
|
approvalWebhook: z.ZodOptional<z.ZodString>;
|
|
28
28
|
skillsDirectory: z.ZodOptional<z.ZodString>;
|
|
29
29
|
maxContextChars: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
30
|
+
task: z.ZodOptional<z.ZodObject<{
|
|
31
|
+
enabled: z.ZodBoolean;
|
|
32
|
+
outputSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
33
|
+
webhookUrl: z.ZodOptional<z.ZodString>;
|
|
34
|
+
maxIterations: z.ZodOptional<z.ZodNumber>;
|
|
35
|
+
status: z.ZodEnum<["running", "completed", "failed"]>;
|
|
36
|
+
result: z.ZodOptional<z.ZodUnknown>;
|
|
37
|
+
error: z.ZodOptional<z.ZodString>;
|
|
38
|
+
iterations: z.ZodOptional<z.ZodNumber>;
|
|
39
|
+
}, "strip", z.ZodTypeAny, {
|
|
40
|
+
status: "running" | "completed" | "failed";
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
outputSchema: Record<string, unknown>;
|
|
43
|
+
webhookUrl?: string | undefined;
|
|
44
|
+
maxIterations?: number | undefined;
|
|
45
|
+
result?: unknown;
|
|
46
|
+
error?: string | undefined;
|
|
47
|
+
iterations?: number | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
status: "running" | "completed" | "failed";
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
outputSchema: Record<string, unknown>;
|
|
52
|
+
webhookUrl?: string | undefined;
|
|
53
|
+
maxIterations?: number | undefined;
|
|
54
|
+
result?: unknown;
|
|
55
|
+
error?: string | undefined;
|
|
56
|
+
iterations?: number | undefined;
|
|
57
|
+
}>>;
|
|
30
58
|
}, "strip", z.ZodTypeAny, {
|
|
31
59
|
maxContextChars: number;
|
|
32
60
|
toolApprovals?: Record<string, boolean> | undefined;
|
|
33
61
|
approvalWebhook?: string | undefined;
|
|
34
62
|
skillsDirectory?: string | undefined;
|
|
63
|
+
task?: {
|
|
64
|
+
status: "running" | "completed" | "failed";
|
|
65
|
+
enabled: boolean;
|
|
66
|
+
outputSchema: Record<string, unknown>;
|
|
67
|
+
webhookUrl?: string | undefined;
|
|
68
|
+
maxIterations?: number | undefined;
|
|
69
|
+
result?: unknown;
|
|
70
|
+
error?: string | undefined;
|
|
71
|
+
iterations?: number | undefined;
|
|
72
|
+
} | undefined;
|
|
35
73
|
}, {
|
|
36
74
|
toolApprovals?: Record<string, boolean> | undefined;
|
|
37
75
|
approvalWebhook?: string | undefined;
|
|
38
76
|
skillsDirectory?: string | undefined;
|
|
39
77
|
maxContextChars?: number | undefined;
|
|
78
|
+
task?: {
|
|
79
|
+
status: "running" | "completed" | "failed";
|
|
80
|
+
enabled: boolean;
|
|
81
|
+
outputSchema: Record<string, unknown>;
|
|
82
|
+
webhookUrl?: string | undefined;
|
|
83
|
+
maxIterations?: number | undefined;
|
|
84
|
+
result?: unknown;
|
|
85
|
+
error?: string | undefined;
|
|
86
|
+
iterations?: number | undefined;
|
|
87
|
+
} | undefined;
|
|
40
88
|
}>;
|
|
41
89
|
declare const SparkcoderConfigSchema: z.ZodObject<{
|
|
42
90
|
defaultModel: z.ZodDefault<z.ZodString>;
|
|
@@ -177,8 +225,8 @@ declare const SparkcoderConfigSchema: z.ZodObject<{
|
|
|
177
225
|
todo?: boolean | undefined;
|
|
178
226
|
} | undefined;
|
|
179
227
|
approvalWebhook?: string | undefined;
|
|
180
|
-
defaultModel?: string | undefined;
|
|
181
228
|
workingDirectory?: string | undefined;
|
|
229
|
+
defaultModel?: string | undefined;
|
|
182
230
|
skills?: {
|
|
183
231
|
directory?: string | undefined;
|
|
184
232
|
additionalDirectories?: string[] | undefined;
|
|
@@ -322,6 +370,11 @@ declare function buildSystemPrompt(options: {
|
|
|
322
370
|
activeFiles?: string[];
|
|
323
371
|
customInstructions?: string;
|
|
324
372
|
}): Promise<string>;
|
|
373
|
+
/**
|
|
374
|
+
* Build an addendum for the system prompt when running in task mode.
|
|
375
|
+
* Describes the output schema and the two completion tools the agent must use.
|
|
376
|
+
*/
|
|
377
|
+
declare function buildTaskPromptAddendum(outputSchema: Record<string, unknown>): string;
|
|
325
378
|
|
|
326
379
|
interface AgentOptions {
|
|
327
380
|
sessionId?: string;
|
|
@@ -418,6 +471,34 @@ declare class Agent {
|
|
|
418
471
|
text: string;
|
|
419
472
|
steps: unknown[];
|
|
420
473
|
}>;
|
|
474
|
+
/**
|
|
475
|
+
* Run the agent in task mode — loops autonomously until the agent calls
|
|
476
|
+
* complete_task or task_failed (or hits maxIterations).
|
|
477
|
+
* All tools run without approval. Webhook events are fired throughout.
|
|
478
|
+
*/
|
|
479
|
+
runTask(options: {
|
|
480
|
+
prompt: string;
|
|
481
|
+
taskConfig: TaskConfig;
|
|
482
|
+
abortSignal?: AbortSignal;
|
|
483
|
+
onText?: (text: string) => void;
|
|
484
|
+
onToolCall?: (toolCall: {
|
|
485
|
+
toolCallId: string;
|
|
486
|
+
toolName: string;
|
|
487
|
+
input: unknown;
|
|
488
|
+
}) => void;
|
|
489
|
+
onToolResult?: (result: {
|
|
490
|
+
toolCallId: string;
|
|
491
|
+
toolName: string;
|
|
492
|
+
output: unknown;
|
|
493
|
+
}) => void;
|
|
494
|
+
onToolProgress?: AgentRunOptions['onToolProgress'];
|
|
495
|
+
onStepFinish?: AgentRunOptions['onStepFinish'];
|
|
496
|
+
}): Promise<{
|
|
497
|
+
status: 'completed' | 'failed';
|
|
498
|
+
result?: unknown;
|
|
499
|
+
error?: string;
|
|
500
|
+
iterations: number;
|
|
501
|
+
}>;
|
|
421
502
|
/**
|
|
422
503
|
* Wrap tools to add approval checking
|
|
423
504
|
*/
|
|
@@ -456,4 +537,4 @@ declare class Agent {
|
|
|
456
537
|
clearContext(): void;
|
|
457
538
|
}
|
|
458
539
|
|
|
459
|
-
export { Agent as A, ContextManager as C, type MessageAttachment as M, type ResolvedConfig as R, type SparkcoderConfig as S, type ToolApprovalConfig as T, type AgentOptions as a, type AgentRunOptions as b, type AgentStreamResult as c, buildSystemPrompt as d };
|
|
540
|
+
export { Agent as A, ContextManager as C, type MessageAttachment as M, type ResolvedConfig as R, type SparkcoderConfig as S, type ToolApprovalConfig as T, type AgentOptions as a, type AgentRunOptions as b, type AgentStreamResult as c, buildSystemPrompt as d, buildTaskPromptAddendum as e };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { R as ResolvedConfig } from './index-
|
|
2
|
-
export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, S as SparkcoderConfig, T as ToolApprovalConfig } from './index-
|
|
1
|
+
import { R as ResolvedConfig } from './index-DuGtMaAJ.js';
|
|
2
|
+
export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, S as SparkcoderConfig, T as ToolApprovalConfig } from './index-DuGtMaAJ.js';
|
|
3
3
|
export { ServerOptions, createApp, startServer, stopServer } from './server/index.js';
|
|
4
4
|
export { checkpointQueries, closeDatabase, fileBackupQueries, getDb, initDatabase, messageQueries, sessionQueries, skillQueries, todoQueries, toolExecutionQueries } from './db/index.js';
|
|
5
|
-
import { F as FileBackup, C as Checkpoint } from './schema-
|
|
6
|
-
export { a as Message, M as ModelMessage, S as Session, q as SessionConfig, f as Terminal, T as TodoItem, b as ToolExecution } from './schema-
|
|
5
|
+
import { F as FileBackup, C as Checkpoint } from './schema-C7Mm4Ykn.js';
|
|
6
|
+
export { a as Message, M as ModelMessage, S as Session, q as SessionConfig, f as Terminal, T as TodoItem, b as ToolExecution } from './schema-C7Mm4Ykn.js';
|
|
7
7
|
export { createLoadSkillTool, createReadFileTool, createTodoTool, createTools } from './tools/index.js';
|
|
8
|
-
export { c as createBashTool, a as createWriteFileTool } from './search-
|
|
8
|
+
export { c as createBashTool, a as createWriteFileTool } from './search-C_IFImt1.js';
|
|
9
9
|
import 'ai';
|
|
10
10
|
import 'zod';
|
|
11
11
|
import 'hono/types';
|
|
12
12
|
import 'hono';
|
|
13
|
+
import 'drizzle-orm/sqlite-core';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Load and parse the config file
|