sparkecoder 0.1.21 → 0.1.23
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 +3 -3
- package/dist/agent/index.js +1361 -215
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +2179 -349
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +20 -2
- package/dist/db/index.js +97 -0
- package/dist/db/index.js.map +1 -1
- package/dist/{index-BzedNBK-.d.ts → index-BblbmG_0.d.ts} +42 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +2165 -335
- package/dist/index.js.map +1 -1
- package/dist/{schema-CkrIadxa.d.ts → schema-D_8A4k01.d.ts} +270 -3
- package/dist/search-ybREg7F_.d.ts +254 -0
- package/dist/server/index.js +2163 -333
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.d.ts +7 -56
- package/dist/tools/index.js +894 -27
- package/dist/tools/index.js.map +1 -1
- package/package.json +5 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/app-path-routes-manifest.json +4 -0
- package/web/.next/standalone/web/.next/build-manifest.json +7 -6
- package/web/.next/standalone/web/.next/prerender-manifest.json +99 -3
- package/web/.next/standalone/web/.next/required-server-files.json +28 -4
- package/web/.next/standalone/web/.next/routes-manifest.json +24 -0
- package/web/.next/standalone/web/.next/server/app/(main)/page/build-manifest.json +5 -4
- package/web/.next/standalone/web/.next/server/app/(main)/page.js +2 -2
- 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/build-manifest.json +5 -4
- package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page.js +2 -2
- 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/page/build-manifest.json +5 -4
- package/web/.next/standalone/web/.next/server/app/_global-error/page.js +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error/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/build-manifest.json +5 -4
- package/web/.next/standalone/web/.next/server/app/_not-found/page.js +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found/page.js.nft.json +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/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page/build-manifest.json +18 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page/next-font-manifest.json +11 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page/react-loadable-manifest.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page/server-reference-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page.js +21 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page.js.map +5 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page.js.nft.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +2 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +86 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.meta +16 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +36 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +36 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +6 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +7 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +3 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +22 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +4 -0
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +5 -0
- package/web/.next/standalone/web/.next/server/app/docs/page/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/app/docs/page/build-manifest.json +18 -0
- package/web/.next/standalone/web/.next/server/app/docs/page/next-font-manifest.json +11 -0
- package/web/.next/standalone/web/.next/server/app/docs/page/react-loadable-manifest.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/page/server-reference-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/app/docs/page.js +21 -0
- package/web/.next/standalone/web/.next/server/app/docs/page.js.map +5 -0
- package/web/.next/standalone/web/.next/server/app/docs/page.js.nft.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +2 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page/build-manifest.json +18 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page/next-font-manifest.json +11 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page/react-loadable-manifest.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page/server-reference-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page.js +21 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page.js.map +5 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page.js.nft.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +2 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +268 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.meta +16 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +82 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +82 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +6 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +7 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +3 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +66 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +4 -0
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +5 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page/build-manifest.json +18 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page/next-font-manifest.json +11 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page/react-loadable-manifest.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page/server-reference-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page.js +21 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page.js.map +5 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page.js.nft.json +1 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +2 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +242 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.meta +16 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +87 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +87 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +6 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +7 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +3 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +72 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +4 -0
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +5 -0
- package/web/.next/standalone/web/.next/server/app/docs.html +74 -0
- package/web/.next/standalone/web/.next/server/app/docs.meta +15 -0
- package/web/.next/standalone/web/.next/server/app/docs.rsc +34 -0
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +34 -0
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +6 -0
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +7 -0
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +3 -0
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +20 -0
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +5 -0
- 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/app-paths-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_378282b1._.js → 2374f_244589df._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_5de336d2._.js → 2374f_41a27541._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_30f9df13._.js → 2374f_47c9e2d5._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_d94c2b70._.js → 2374f_4bf2df9d._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_663d1038._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_954e49c0._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_1d78db71._.js → 2374f_c33b095a._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_bbc99511._.js → 2374f_fa61fbb2._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_8825dcc9._.js → 2374f_fb82ac0d._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{web_96bca05b._.js → 2374f_next_dist_bbe64674._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__7f04455b._.js → [root-of-the-server]__1e06ddf7._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__2b151e1c._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__2dbf511a._.js +9 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__397fadd4._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__44bd8bd1._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__70cecda8._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__9fdf9974._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__f18f92f4._.js → [root-of-the-server]__b050bb8f._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__d3034cd2._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__c3a1e22c._.js → [root-of-the-server]__ef2713cf._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__f764bebe._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_046bf7db._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_656c1e45._.js +7 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_76ccf09f._.js +8 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app_docs_installation_page_actions_52cc0648.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app_docs_page_actions_4fe77da8.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app_docs_skills_page_actions_251df2e1.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app_docs_tools_page_actions_3e6382b0.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_a565dc94._.js +4 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_b1cce0b7._.js +4 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_b42ed1be._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_c0c2bee4._.js +4 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_eea9c122._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_ff00a5c3._.js +4 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_app_(main)_layout_tsx_453f6492._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_app_(main)_page_tsx_5ac4794b._.js +3 -0
- package/web/.next/standalone/web/.next/server/middleware-build-manifest.js +5 -4
- package/web/.next/standalone/web/.next/server/next-font-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/next-font-manifest.json +16 -0
- 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/0cc382a66266188e.js +7 -0
- package/web/.next/standalone/web/.next/static/chunks/0fda34e553582102.js +1 -0
- package/web/.next/standalone/web/.next/static/{static/chunks/5ec82ce8f3aabaf0.js → chunks/6407c045dfc908fe.js} +3 -3
- package/web/.next/standalone/web/.next/static/chunks/651e187cc15d66de.js +1 -0
- package/web/.next/standalone/web/.next/static/chunks/862ced58ce21a270.js +4 -0
- package/web/.next/standalone/web/.next/static/chunks/89bc21c0443670f4.js +1 -0
- package/web/.next/standalone/web/.next/static/chunks/8f4edf22ededc29b.js +7 -0
- package/web/.next/standalone/web/.next/static/chunks/ad6b9dbb257d62cc.js +1 -0
- package/web/.next/standalone/web/.next/static/chunks/af22745850132107.css +1 -0
- package/web/.next/standalone/web/.next/static/chunks/b9ad1584d4e11d12.js +1 -0
- package/web/.next/standalone/web/.next/static/chunks/db9b22c844a35e20.js +5 -0
- package/web/.next/standalone/web/.next/static/chunks/turbopack-597558bb7b6982f6.js +4 -0
- package/web/.next/standalone/web/.next/static/static/chunks/0cc382a66266188e.js +7 -0
- package/web/.next/standalone/web/.next/static/static/chunks/0fda34e553582102.js +1 -0
- package/web/.next/{static/chunks/5ec82ce8f3aabaf0.js → standalone/web/.next/static/static/chunks/6407c045dfc908fe.js} +3 -3
- package/web/.next/standalone/web/.next/static/static/chunks/651e187cc15d66de.js +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/862ced58ce21a270.js +4 -0
- package/web/.next/standalone/web/.next/static/static/chunks/89bc21c0443670f4.js +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/8f4edf22ededc29b.js +7 -0
- package/web/.next/standalone/web/.next/static/static/chunks/ad6b9dbb257d62cc.js +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/af22745850132107.css +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/b9ad1584d4e11d12.js +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/db9b22c844a35e20.js +5 -0
- package/web/.next/standalone/web/.next/static/static/chunks/turbopack-597558bb7b6982f6.js +4 -0
- package/web/.next/standalone/web/mdx-components.tsx +119 -0
- package/web/.next/standalone/web/next.config.ts +15 -1
- package/web/.next/standalone/web/package-lock.json +559 -4
- package/web/.next/standalone/web/package.json +4 -0
- package/web/.next/standalone/web/runtime-config.json +1 -1
- package/web/.next/standalone/web/server.js +1 -1
- package/web/.next/standalone/web/src/app/(main)/page.tsx +127 -5
- package/web/.next/standalone/web/src/app/docs/installation/page.mdx +128 -0
- package/web/.next/standalone/web/src/app/docs/layout.tsx +74 -0
- package/web/.next/standalone/web/src/app/docs/page.mdx +90 -0
- package/web/.next/standalone/web/src/app/docs/skills/page.mdx +334 -0
- package/web/.next/standalone/web/src/app/docs/tools/page.mdx +300 -0
- package/web/.next/standalone/web/src/components/ai-elements/mention-input.tsx +809 -0
- package/web/.next/standalone/web/src/components/ai-elements/search-tool.tsx +400 -0
- package/web/.next/standalone/web/src/components/ai-elements/speech-input.tsx +89 -36
- package/web/.next/standalone/web/src/components/ai-elements/subagent-modal.tsx +275 -0
- package/web/.next/standalone/web/src/components/ai-elements/write-file-tool.tsx +19 -5
- package/web/.next/standalone/web/src/components/chat-interface.tsx +820 -50
- package/web/.next/standalone/web/src/hooks/use-workspace-files.ts +108 -0
- package/web/.next/standalone/web/src/lib/api.ts +223 -6
- package/web/.next/static/chunks/0cc382a66266188e.js +7 -0
- package/web/.next/static/chunks/0fda34e553582102.js +1 -0
- package/web/.next/{standalone/web/.next/static/chunks/5ec82ce8f3aabaf0.js → static/chunks/6407c045dfc908fe.js} +3 -3
- package/web/.next/static/chunks/651e187cc15d66de.js +1 -0
- package/web/.next/static/chunks/862ced58ce21a270.js +4 -0
- package/web/.next/static/chunks/89bc21c0443670f4.js +1 -0
- package/web/.next/static/chunks/8f4edf22ededc29b.js +7 -0
- package/web/.next/static/chunks/ad6b9dbb257d62cc.js +1 -0
- package/web/.next/static/chunks/af22745850132107.css +1 -0
- package/web/.next/static/chunks/b9ad1584d4e11d12.js +1 -0
- package/web/.next/static/chunks/db9b22c844a35e20.js +5 -0
- package/web/.next/static/chunks/turbopack-597558bb7b6982f6.js +4 -0
- package/web/package.json +4 -0
- package/dist/bash-CGAqW7HR.d.ts +0 -80
- package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_9bf3c7f3._.js +0 -3
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__0f6b5fa7._.js +0 -3
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__513c6b45._.js +0 -3
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__a984d933._.js +0 -9
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__de58a952._.js +0 -3
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_19b6934c._.js +0 -8
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_d7d3e40d._.js +0 -7
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_e6034803._.js +0 -3
- package/web/.next/standalone/web/.next/static/chunks/03d4169891280e04.js +0 -7
- package/web/.next/standalone/web/.next/static/chunks/2d5da0cfc011b8d9.js +0 -1
- package/web/.next/standalone/web/.next/static/chunks/634fd97fab9ed4e4.js +0 -4
- package/web/.next/standalone/web/.next/static/chunks/77e4bf0421481629.js +0 -1
- package/web/.next/standalone/web/.next/static/chunks/a86053f0894587f2.js +0 -7
- package/web/.next/standalone/web/.next/static/chunks/beb9625c4a470042.js +0 -1
- package/web/.next/standalone/web/.next/static/chunks/c2244168e74b8c78.js +0 -1
- package/web/.next/standalone/web/.next/static/chunks/c81c1aec4369c77f.js +0 -5
- package/web/.next/standalone/web/.next/static/chunks/d0a69c59b1c0d99c.css +0 -1
- package/web/.next/standalone/web/.next/static/chunks/turbopack-54bc7d566cd2d105.js +0 -4
- package/web/.next/standalone/web/.next/static/static/chunks/03d4169891280e04.js +0 -7
- package/web/.next/standalone/web/.next/static/static/chunks/2d5da0cfc011b8d9.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/634fd97fab9ed4e4.js +0 -4
- package/web/.next/standalone/web/.next/static/static/chunks/77e4bf0421481629.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/a86053f0894587f2.js +0 -7
- package/web/.next/standalone/web/.next/static/static/chunks/beb9625c4a470042.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/c2244168e74b8c78.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/c81c1aec4369c77f.js +0 -5
- package/web/.next/standalone/web/.next/static/static/chunks/d0a69c59b1c0d99c.css +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/turbopack-54bc7d566cd2d105.js +0 -4
- package/web/.next/static/chunks/03d4169891280e04.js +0 -7
- package/web/.next/static/chunks/2d5da0cfc011b8d9.js +0 -1
- package/web/.next/static/chunks/634fd97fab9ed4e4.js +0 -4
- package/web/.next/static/chunks/77e4bf0421481629.js +0 -1
- package/web/.next/static/chunks/a86053f0894587f2.js +0 -7
- package/web/.next/static/chunks/beb9625c4a470042.js +0 -1
- package/web/.next/static/chunks/c2244168e74b8c78.js +0 -1
- package/web/.next/static/chunks/c81c1aec4369c77f.js +0 -5
- package/web/.next/static/chunks/d0a69c59b1c0d99c.css +0 -1
- package/web/.next/static/chunks/turbopack-54bc7d566cd2d105.js +0 -4
- /package/web/.next/standalone/web/.next/static/{kABnAk0Y1tlcrUKDlM8UT → static/uXbuwS0U7fRElucaXbKUe}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{kABnAk0Y1tlcrUKDlM8UT → static/uXbuwS0U7fRElucaXbKUe}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{kABnAk0Y1tlcrUKDlM8UT → static/uXbuwS0U7fRElucaXbKUe}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{static/kABnAk0Y1tlcrUKDlM8UT → uXbuwS0U7fRElucaXbKUe}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{static/kABnAk0Y1tlcrUKDlM8UT → uXbuwS0U7fRElucaXbKUe}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{static/kABnAk0Y1tlcrUKDlM8UT → uXbuwS0U7fRElucaXbKUe}/_ssgManifest.js +0 -0
- /package/web/.next/static/{kABnAk0Y1tlcrUKDlM8UT → uXbuwS0U7fRElucaXbKUe}/_buildManifest.js +0 -0
- /package/web/.next/static/{kABnAk0Y1tlcrUKDlM8UT → uXbuwS0U7fRElucaXbKUe}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{kABnAk0Y1tlcrUKDlM8UT → uXbuwS0U7fRElucaXbKUe}/_ssgManifest.js +0 -0
package/dist/db/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as drizzle_orm_better_sqlite3 from 'drizzle-orm/better-sqlite3';
|
|
2
2
|
import Database from 'better-sqlite3';
|
|
3
|
-
import { C as Checkpoint, F as FileBackup, s as schema, M as ModelMessage, a as Message, N as NewSession, S as Session, b as SessionConfig, L as LoadedSkill, c as NewTodoItem, T as TodoItem, d as NewToolExecution, e as ToolExecution, A as ActiveStream, f as
|
|
3
|
+
import { C as Checkpoint, F as FileBackup, s as schema, M as ModelMessage, a as Message, N as NewSession, S as Session, b as SessionConfig, L as LoadedSkill, c as NewTodoItem, T as TodoItem, d as NewToolExecution, e as ToolExecution, A as ActiveStream, f as SubagentExecution, g as SubagentStep, h as NewTerminal, i as Terminal } from '../schema-D_8A4k01.js';
|
|
4
|
+
export { U as UserContentPart, j as UserFilePart, k as UserImagePart, l as UserModelMessage, m as UserTextPart } from '../schema-D_8A4k01.js';
|
|
4
5
|
import 'drizzle-orm/sqlite-core';
|
|
5
6
|
|
|
6
7
|
declare function initDatabase(dbPath: string): drizzle_orm_better_sqlite3.BetterSQLite3Database<typeof schema> & {
|
|
@@ -145,5 +146,22 @@ declare const fileBackupQueries: {
|
|
|
145
146
|
hasBackup(checkpointId: string, filePath: string): boolean;
|
|
146
147
|
deleteBySession(sessionId: string): number;
|
|
147
148
|
};
|
|
149
|
+
declare const subagentQueries: {
|
|
150
|
+
create(data: {
|
|
151
|
+
sessionId: string;
|
|
152
|
+
toolCallId: string;
|
|
153
|
+
subagentType: string;
|
|
154
|
+
task: string;
|
|
155
|
+
model: string;
|
|
156
|
+
}): SubagentExecution;
|
|
157
|
+
getById(id: string): SubagentExecution | undefined;
|
|
158
|
+
getByToolCallId(toolCallId: string): SubagentExecution | undefined;
|
|
159
|
+
getBySession(sessionId: string): SubagentExecution[];
|
|
160
|
+
addStep(id: string, step: SubagentStep): SubagentExecution | undefined;
|
|
161
|
+
complete(id: string, result: unknown): SubagentExecution | undefined;
|
|
162
|
+
markError(id: string, error: string): SubagentExecution | undefined;
|
|
163
|
+
cancel(id: string): SubagentExecution | undefined;
|
|
164
|
+
deleteBySession(sessionId: string): number;
|
|
165
|
+
};
|
|
148
166
|
|
|
149
|
-
export { ActiveStream, Checkpoint, FileBackup, Message, ModelMessage, Session, SessionConfig, Terminal, TodoItem, ToolExecution, activeStreamQueries, checkpointQueries, closeDatabase, fileBackupQueries, getDb, initDatabase, messageQueries, sessionQueries, skillQueries, terminalQueries, todoQueries, toolExecutionQueries };
|
|
167
|
+
export { ActiveStream, Checkpoint, FileBackup, Message, ModelMessage, Session, SessionConfig, SubagentExecution, SubagentStep, Terminal, TodoItem, ToolExecution, activeStreamQueries, checkpointQueries, closeDatabase, fileBackupQueries, getDb, initDatabase, messageQueries, sessionQueries, skillQueries, subagentQueries, terminalQueries, todoQueries, toolExecutionQueries };
|
package/dist/db/index.js
CHANGED
|
@@ -19,6 +19,7 @@ __export(schema_exports, {
|
|
|
19
19
|
loadedSkills: () => loadedSkills,
|
|
20
20
|
messages: () => messages,
|
|
21
21
|
sessions: () => sessions,
|
|
22
|
+
subagentExecutions: () => subagentExecutions,
|
|
22
23
|
terminals: () => terminals,
|
|
23
24
|
todoItems: () => todoItems,
|
|
24
25
|
toolExecutions: () => toolExecutions
|
|
@@ -122,6 +123,26 @@ var fileBackups = sqliteTable("file_backups", {
|
|
|
122
123
|
existed: integer("existed", { mode: "boolean" }).notNull().default(true),
|
|
123
124
|
createdAt: integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
|
|
124
125
|
});
|
|
126
|
+
var subagentExecutions = sqliteTable("subagent_executions", {
|
|
127
|
+
id: text("id").primaryKey(),
|
|
128
|
+
sessionId: text("session_id").notNull().references(() => sessions.id, { onDelete: "cascade" }),
|
|
129
|
+
toolCallId: text("tool_call_id").notNull(),
|
|
130
|
+
// The tool call that spawned this subagent
|
|
131
|
+
subagentType: text("subagent_type").notNull(),
|
|
132
|
+
// e.g., 'search', 'analyze', etc.
|
|
133
|
+
task: text("task").notNull(),
|
|
134
|
+
// The task/query given to the subagent
|
|
135
|
+
model: text("model").notNull(),
|
|
136
|
+
// The model used (e.g., 'gemini-2.0-flash')
|
|
137
|
+
status: text("status", { enum: ["running", "completed", "error", "cancelled"] }).notNull().default("running"),
|
|
138
|
+
// Steps taken by the subagent (stored as JSON array)
|
|
139
|
+
steps: text("steps", { mode: "json" }).$type().default([]),
|
|
140
|
+
// Final result/output
|
|
141
|
+
result: text("result", { mode: "json" }),
|
|
142
|
+
error: text("error"),
|
|
143
|
+
startedAt: integer("started_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
|
|
144
|
+
completedAt: integer("completed_at", { mode: "timestamp" })
|
|
145
|
+
});
|
|
125
146
|
|
|
126
147
|
// src/db/index.ts
|
|
127
148
|
var db = null;
|
|
@@ -226,6 +247,22 @@ function initDatabase(dbPath) {
|
|
|
226
247
|
created_at INTEGER NOT NULL
|
|
227
248
|
);
|
|
228
249
|
|
|
250
|
+
-- Subagent executions table - tracks subagent runs
|
|
251
|
+
CREATE TABLE IF NOT EXISTS subagent_executions (
|
|
252
|
+
id TEXT PRIMARY KEY,
|
|
253
|
+
session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
254
|
+
tool_call_id TEXT NOT NULL,
|
|
255
|
+
subagent_type TEXT NOT NULL,
|
|
256
|
+
task TEXT NOT NULL,
|
|
257
|
+
model TEXT NOT NULL,
|
|
258
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
259
|
+
steps TEXT DEFAULT '[]',
|
|
260
|
+
result TEXT,
|
|
261
|
+
error TEXT,
|
|
262
|
+
started_at INTEGER NOT NULL,
|
|
263
|
+
completed_at INTEGER
|
|
264
|
+
);
|
|
265
|
+
|
|
229
266
|
CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);
|
|
230
267
|
CREATE INDEX IF NOT EXISTS idx_tool_executions_session ON tool_executions(session_id);
|
|
231
268
|
CREATE INDEX IF NOT EXISTS idx_todo_items_session ON todo_items(session_id);
|
|
@@ -235,6 +272,8 @@ function initDatabase(dbPath) {
|
|
|
235
272
|
CREATE INDEX IF NOT EXISTS idx_checkpoints_session ON checkpoints(session_id);
|
|
236
273
|
CREATE INDEX IF NOT EXISTS idx_file_backups_checkpoint ON file_backups(checkpoint_id);
|
|
237
274
|
CREATE INDEX IF NOT EXISTS idx_file_backups_session ON file_backups(session_id);
|
|
275
|
+
CREATE INDEX IF NOT EXISTS idx_subagent_executions_session ON subagent_executions(session_id);
|
|
276
|
+
CREATE INDEX IF NOT EXISTS idx_subagent_executions_tool_call ON subagent_executions(tool_call_id);
|
|
238
277
|
`);
|
|
239
278
|
return db;
|
|
240
279
|
}
|
|
@@ -672,6 +711,63 @@ var fileBackupQueries = {
|
|
|
672
711
|
return result.changes;
|
|
673
712
|
}
|
|
674
713
|
};
|
|
714
|
+
var subagentQueries = {
|
|
715
|
+
create(data) {
|
|
716
|
+
const id = nanoid();
|
|
717
|
+
const result = getDb().insert(subagentExecutions).values({
|
|
718
|
+
id,
|
|
719
|
+
sessionId: data.sessionId,
|
|
720
|
+
toolCallId: data.toolCallId,
|
|
721
|
+
subagentType: data.subagentType,
|
|
722
|
+
task: data.task,
|
|
723
|
+
model: data.model,
|
|
724
|
+
status: "running",
|
|
725
|
+
steps: [],
|
|
726
|
+
startedAt: /* @__PURE__ */ new Date()
|
|
727
|
+
}).returning().get();
|
|
728
|
+
return result;
|
|
729
|
+
},
|
|
730
|
+
getById(id) {
|
|
731
|
+
return getDb().select().from(subagentExecutions).where(eq(subagentExecutions.id, id)).get();
|
|
732
|
+
},
|
|
733
|
+
getByToolCallId(toolCallId) {
|
|
734
|
+
return getDb().select().from(subagentExecutions).where(eq(subagentExecutions.toolCallId, toolCallId)).get();
|
|
735
|
+
},
|
|
736
|
+
getBySession(sessionId) {
|
|
737
|
+
return getDb().select().from(subagentExecutions).where(eq(subagentExecutions.sessionId, sessionId)).orderBy(desc(subagentExecutions.startedAt)).all();
|
|
738
|
+
},
|
|
739
|
+
addStep(id, step) {
|
|
740
|
+
const existing = this.getById(id);
|
|
741
|
+
if (!existing) return void 0;
|
|
742
|
+
const currentSteps = existing.steps || [];
|
|
743
|
+
const newSteps = [...currentSteps, step];
|
|
744
|
+
return getDb().update(subagentExecutions).set({ steps: newSteps }).where(eq(subagentExecutions.id, id)).returning().get();
|
|
745
|
+
},
|
|
746
|
+
complete(id, result) {
|
|
747
|
+
return getDb().update(subagentExecutions).set({
|
|
748
|
+
status: "completed",
|
|
749
|
+
result,
|
|
750
|
+
completedAt: /* @__PURE__ */ new Date()
|
|
751
|
+
}).where(eq(subagentExecutions.id, id)).returning().get();
|
|
752
|
+
},
|
|
753
|
+
markError(id, error) {
|
|
754
|
+
return getDb().update(subagentExecutions).set({
|
|
755
|
+
status: "error",
|
|
756
|
+
error,
|
|
757
|
+
completedAt: /* @__PURE__ */ new Date()
|
|
758
|
+
}).where(eq(subagentExecutions.id, id)).returning().get();
|
|
759
|
+
},
|
|
760
|
+
cancel(id) {
|
|
761
|
+
return getDb().update(subagentExecutions).set({
|
|
762
|
+
status: "cancelled",
|
|
763
|
+
completedAt: /* @__PURE__ */ new Date()
|
|
764
|
+
}).where(eq(subagentExecutions.id, id)).returning().get();
|
|
765
|
+
},
|
|
766
|
+
deleteBySession(sessionId) {
|
|
767
|
+
const result = getDb().delete(subagentExecutions).where(eq(subagentExecutions.sessionId, sessionId)).run();
|
|
768
|
+
return result.changes;
|
|
769
|
+
}
|
|
770
|
+
};
|
|
675
771
|
export {
|
|
676
772
|
activeStreamQueries,
|
|
677
773
|
checkpointQueries,
|
|
@@ -682,6 +778,7 @@ export {
|
|
|
682
778
|
messageQueries,
|
|
683
779
|
sessionQueries,
|
|
684
780
|
skillQueries,
|
|
781
|
+
subagentQueries,
|
|
685
782
|
terminalQueries,
|
|
686
783
|
todoQueries,
|
|
687
784
|
toolExecutionQueries
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/index.ts","../../src/db/schema.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { eq, desc, and, sql } from 'drizzle-orm';\nimport { nanoid } from 'nanoid';\nimport * as schema from './schema.js';\nimport type {\n Session,\n NewSession,\n Message,\n NewMessage,\n ToolExecution,\n NewToolExecution,\n TodoItem,\n NewTodoItem,\n SessionConfig,\n ModelMessage,\n Terminal,\n NewTerminal,\n ActiveStream,\n NewActiveStream,\n Checkpoint,\n NewCheckpoint,\n FileBackup,\n NewFileBackup,\n} from './schema.js';\n\nlet db: ReturnType<typeof drizzle<typeof schema>> | null = null;\nlet sqlite: Database.Database | null = null;\n\nexport function initDatabase(dbPath: string) {\n sqlite = new Database(dbPath);\n sqlite.pragma('journal_mode = WAL');\n db = drizzle(sqlite, { schema });\n\n // Create tables if they don't exist (preserves existing data)\n sqlite.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n name TEXT,\n working_directory TEXT NOT NULL,\n model TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n config TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n model_message TEXT NOT NULL,\n sequence INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS tool_executions (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n message_id TEXT REFERENCES messages(id) ON DELETE CASCADE,\n tool_name TEXT NOT NULL,\n tool_call_id TEXT NOT NULL,\n input TEXT,\n output TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n requires_approval INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n started_at INTEGER NOT NULL,\n completed_at INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS todo_items (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n \"order\" INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS loaded_skills (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n skill_name TEXT NOT NULL,\n loaded_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS terminals (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n name TEXT,\n command TEXT NOT NULL,\n cwd TEXT NOT NULL,\n pid INTEGER,\n status TEXT NOT NULL DEFAULT 'running',\n exit_code INTEGER,\n error TEXT,\n created_at INTEGER NOT NULL,\n stopped_at INTEGER\n );\n\n -- Table for tracking active streams (for resumable streams)\n CREATE TABLE IF NOT EXISTS active_streams (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n stream_id TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL DEFAULT 'active',\n created_at INTEGER NOT NULL,\n finished_at INTEGER\n );\n\n -- Checkpoints table - created before each user message\n CREATE TABLE IF NOT EXISTS checkpoints (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n message_sequence INTEGER NOT NULL,\n git_head TEXT,\n created_at INTEGER NOT NULL\n );\n\n -- File backups table - stores original file content\n CREATE TABLE IF NOT EXISTS file_backups (\n id TEXT PRIMARY KEY,\n checkpoint_id TEXT NOT NULL REFERENCES checkpoints(id) ON DELETE CASCADE,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n original_content TEXT,\n existed INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\n CREATE INDEX IF NOT EXISTS idx_tool_executions_session ON tool_executions(session_id);\n CREATE INDEX IF NOT EXISTS idx_todo_items_session ON todo_items(session_id);\n CREATE INDEX IF NOT EXISTS idx_loaded_skills_session ON loaded_skills(session_id);\n CREATE INDEX IF NOT EXISTS idx_terminals_session ON terminals(session_id);\n CREATE INDEX IF NOT EXISTS idx_active_streams_session ON active_streams(session_id);\n CREATE INDEX IF NOT EXISTS idx_checkpoints_session ON checkpoints(session_id);\n CREATE INDEX IF NOT EXISTS idx_file_backups_checkpoint ON file_backups(checkpoint_id);\n CREATE INDEX IF NOT EXISTS idx_file_backups_session ON file_backups(session_id);\n `);\n\n return db;\n}\n\nexport function getDb() {\n if (!db) {\n throw new Error('Database not initialized. Call initDatabase first.');\n }\n return db;\n}\n\nexport function closeDatabase() {\n if (sqlite) {\n sqlite.close();\n sqlite = null;\n db = null;\n }\n}\n\n// Session queries\nexport const sessionQueries = {\n create(data: Omit<NewSession, 'id' | 'createdAt' | 'updatedAt'>): Session {\n const id = nanoid();\n const now = new Date();\n const result = getDb()\n .insert(schema.sessions)\n .values({\n id,\n ...data,\n createdAt: now,\n updatedAt: now,\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Session | undefined {\n return getDb().select().from(schema.sessions).where(eq(schema.sessions.id, id)).get();\n },\n\n list(limit = 50, offset = 0): Session[] {\n return getDb()\n .select()\n .from(schema.sessions)\n .orderBy(desc(schema.sessions.createdAt))\n .limit(limit)\n .offset(offset)\n .all();\n },\n\n updateStatus(id: string, status: Session['status']): Session | undefined {\n return getDb()\n .update(schema.sessions)\n .set({ status, updatedAt: new Date() })\n .where(eq(schema.sessions.id, id))\n .returning()\n .get();\n },\n\n updateModel(id: string, model: string): Session | undefined {\n return getDb()\n .update(schema.sessions)\n .set({ model, updatedAt: new Date() })\n .where(eq(schema.sessions.id, id))\n .returning()\n .get();\n },\n\n update(id: string, updates: { model?: string; name?: string; config?: SessionConfig }): Session | undefined {\n return getDb()\n .update(schema.sessions)\n .set({ ...updates, updatedAt: new Date() })\n .where(eq(schema.sessions.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb().delete(schema.sessions).where(eq(schema.sessions.id, id)).run();\n return result.changes > 0;\n },\n};\n\n// Message queries - stores AI SDK ModelMessage directly\nexport const messageQueries = {\n /**\n * Get the next sequence number for a session\n */\n getNextSequence(sessionId: string): number {\n const result = getDb()\n .select({ maxSeq: sql<number>`COALESCE(MAX(sequence), -1)` })\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .get();\n return (result?.maxSeq ?? -1) + 1;\n },\n\n /**\n * Create a single message from a ModelMessage\n */\n create(sessionId: string, modelMessage: ModelMessage): Message {\n const id = nanoid();\n const sequence = this.getNextSequence(sessionId);\n const result = getDb()\n .insert(schema.messages)\n .values({\n id,\n sessionId,\n modelMessage,\n sequence,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n /**\n * Add multiple ModelMessages at once (from response.messages)\n * Maintains insertion order via sequence numbers\n */\n addMany(sessionId: string, modelMessages: ModelMessage[]): Message[] {\n const results: Message[] = [];\n let sequence = this.getNextSequence(sessionId);\n for (const msg of modelMessages) {\n const id = nanoid();\n const result = getDb()\n .insert(schema.messages)\n .values({\n id,\n sessionId,\n modelMessage: msg,\n sequence,\n createdAt: new Date(),\n })\n .returning()\n .get();\n results.push(result);\n sequence++;\n }\n return results;\n },\n\n /**\n * Get all messages for a session as ModelMessage[]\n * Ordered by sequence to maintain exact insertion order\n */\n getBySession(sessionId: string): Message[] {\n return getDb()\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .orderBy(schema.messages.sequence)\n .all();\n },\n\n /**\n * Get ModelMessages directly (for passing to AI SDK)\n */\n getModelMessages(sessionId: string): ModelMessage[] {\n const messages = this.getBySession(sessionId);\n return messages.map(m => m.modelMessage);\n },\n\n getRecentBySession(sessionId: string, limit = 50): Message[] {\n return getDb()\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .orderBy(desc(schema.messages.sequence))\n .limit(limit)\n .all()\n .reverse();\n },\n\n countBySession(sessionId: string): number {\n const result = getDb()\n .select({ count: sql<number>`count(*)` })\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .get();\n return result?.count ?? 0;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .run();\n return result.changes;\n },\n\n /**\n * Delete all messages with sequence >= the given sequence number\n * (Used when reverting to a checkpoint)\n */\n deleteFromSequence(sessionId: string, fromSequence: number): number {\n const result = getDb()\n .delete(schema.messages)\n .where(\n and(\n eq(schema.messages.sessionId, sessionId),\n sql`sequence >= ${fromSequence}`\n )\n )\n .run();\n return result.changes;\n },\n};\n\n// Tool execution queries\nexport const toolExecutionQueries = {\n create(data: Omit<NewToolExecution, 'id' | 'startedAt'>): ToolExecution {\n const id = nanoid();\n const result = getDb()\n .insert(schema.toolExecutions)\n .values({\n id,\n ...data,\n startedAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): ToolExecution | undefined {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.id, id))\n .get();\n },\n\n getByToolCallId(toolCallId: string): ToolExecution | undefined {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.toolCallId, toolCallId))\n .get();\n },\n\n getPendingApprovals(sessionId: string): ToolExecution[] {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(\n and(\n eq(schema.toolExecutions.sessionId, sessionId),\n eq(schema.toolExecutions.status, 'pending'),\n eq(schema.toolExecutions.requiresApproval, true)\n )\n )\n .all();\n },\n\n approve(id: string): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({ status: 'approved' })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n reject(id: string): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({ status: 'rejected' })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n complete(\n id: string,\n output: unknown,\n error?: string\n ): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({\n status: error ? 'error' : 'completed',\n output: output as any,\n error,\n completedAt: new Date(),\n })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n getBySession(sessionId: string): ToolExecution[] {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.sessionId, sessionId))\n .orderBy(schema.toolExecutions.startedAt)\n .all();\n },\n\n /**\n * Delete all tool executions after a given timestamp\n * (Used when reverting to a checkpoint)\n */\n deleteAfterTime(sessionId: string, afterTime: Date): number {\n const result = getDb()\n .delete(schema.toolExecutions)\n .where(\n and(\n eq(schema.toolExecutions.sessionId, sessionId),\n sql`started_at > ${afterTime.getTime()}`\n )\n )\n .run();\n return result.changes;\n },\n};\n\n// Todo item queries\nexport const todoQueries = {\n create(data: Omit<NewTodoItem, 'id' | 'createdAt' | 'updatedAt'>): TodoItem {\n const id = nanoid();\n const now = new Date();\n const result = getDb()\n .insert(schema.todoItems)\n .values({\n id,\n ...data,\n createdAt: now,\n updatedAt: now,\n })\n .returning()\n .get();\n return result;\n },\n\n createMany(\n sessionId: string,\n items: Array<{ content: string; order?: number }>\n ): TodoItem[] {\n const now = new Date();\n const values = items.map((item, index) => ({\n id: nanoid(),\n sessionId,\n content: item.content,\n order: item.order ?? index,\n createdAt: now,\n updatedAt: now,\n }));\n\n return getDb().insert(schema.todoItems).values(values).returning().all();\n },\n\n getBySession(sessionId: string): TodoItem[] {\n return getDb()\n .select()\n .from(schema.todoItems)\n .where(eq(schema.todoItems.sessionId, sessionId))\n .orderBy(schema.todoItems.order)\n .all();\n },\n\n updateStatus(\n id: string,\n status: TodoItem['status']\n ): TodoItem | undefined {\n return getDb()\n .update(schema.todoItems)\n .set({ status, updatedAt: new Date() })\n .where(eq(schema.todoItems.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb()\n .delete(schema.todoItems)\n .where(eq(schema.todoItems.id, id))\n .run();\n return result.changes > 0;\n },\n\n clearSession(sessionId: string): number {\n const result = getDb()\n .delete(schema.todoItems)\n .where(eq(schema.todoItems.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Loaded skills queries\nexport const skillQueries = {\n load(sessionId: string, skillName: string): schema.LoadedSkill {\n const id = nanoid();\n const result = getDb()\n .insert(schema.loadedSkills)\n .values({\n id,\n sessionId,\n skillName,\n loadedAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getBySession(sessionId: string): schema.LoadedSkill[] {\n return getDb()\n .select()\n .from(schema.loadedSkills)\n .where(eq(schema.loadedSkills.sessionId, sessionId))\n .orderBy(schema.loadedSkills.loadedAt)\n .all();\n },\n\n isLoaded(sessionId: string, skillName: string): boolean {\n const result = getDb()\n .select()\n .from(schema.loadedSkills)\n .where(\n and(\n eq(schema.loadedSkills.sessionId, sessionId),\n eq(schema.loadedSkills.skillName, skillName)\n )\n )\n .get();\n return !!result;\n },\n};\n\n// Terminal queries\nexport const terminalQueries = {\n create(data: Omit<NewTerminal, 'id' | 'createdAt'>): Terminal {\n const id = nanoid();\n const result = getDb()\n .insert(schema.terminals)\n .values({\n id,\n ...data,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Terminal | undefined {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(eq(schema.terminals.id, id))\n .get();\n },\n\n getBySession(sessionId: string): Terminal[] {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(eq(schema.terminals.sessionId, sessionId))\n .orderBy(desc(schema.terminals.createdAt))\n .all();\n },\n\n getRunning(sessionId: string): Terminal[] {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(\n and(\n eq(schema.terminals.sessionId, sessionId),\n eq(schema.terminals.status, 'running')\n )\n )\n .all();\n },\n\n updateStatus(\n id: string,\n status: Terminal['status'],\n exitCode?: number,\n error?: string\n ): Terminal | undefined {\n return getDb()\n .update(schema.terminals)\n .set({\n status,\n exitCode,\n error,\n stoppedAt: status !== 'running' ? new Date() : undefined,\n })\n .where(eq(schema.terminals.id, id))\n .returning()\n .get();\n },\n\n updatePid(id: string, pid: number): Terminal | undefined {\n return getDb()\n .update(schema.terminals)\n .set({ pid })\n .where(eq(schema.terminals.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb()\n .delete(schema.terminals)\n .where(eq(schema.terminals.id, id))\n .run();\n return result.changes > 0;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.terminals)\n .where(eq(schema.terminals.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Active stream queries - for resumable streams\nexport const activeStreamQueries = {\n create(sessionId: string, streamId: string): ActiveStream {\n const id = nanoid();\n const result = getDb()\n .insert(schema.activeStreams)\n .values({\n id,\n sessionId,\n streamId,\n status: 'active',\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getBySessionId(sessionId: string): ActiveStream | undefined {\n return getDb()\n .select()\n .from(schema.activeStreams)\n .where(\n and(\n eq(schema.activeStreams.sessionId, sessionId),\n eq(schema.activeStreams.status, 'active')\n )\n )\n .get();\n },\n\n getByStreamId(streamId: string): ActiveStream | undefined {\n return getDb()\n .select()\n .from(schema.activeStreams)\n .where(eq(schema.activeStreams.streamId, streamId))\n .get();\n },\n\n finish(streamId: string): ActiveStream | undefined {\n return getDb()\n .update(schema.activeStreams)\n .set({ status: 'finished', finishedAt: new Date() })\n .where(eq(schema.activeStreams.streamId, streamId))\n .returning()\n .get();\n },\n\n markError(streamId: string): ActiveStream | undefined {\n return getDb()\n .update(schema.activeStreams)\n .set({ status: 'error', finishedAt: new Date() })\n .where(eq(schema.activeStreams.streamId, streamId))\n .returning()\n .get();\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.activeStreams)\n .where(eq(schema.activeStreams.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Checkpoint queries - for session revert functionality\nexport const checkpointQueries = {\n create(data: { sessionId: string; messageSequence: number; gitHead?: string }): Checkpoint {\n const id = nanoid();\n const result = getDb()\n .insert(schema.checkpoints)\n .values({\n id,\n sessionId: data.sessionId,\n messageSequence: data.messageSequence,\n gitHead: data.gitHead,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Checkpoint | undefined {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(eq(schema.checkpoints.id, id))\n .get();\n },\n\n getBySession(sessionId: string): Checkpoint[] {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(eq(schema.checkpoints.sessionId, sessionId))\n .orderBy(schema.checkpoints.messageSequence)\n .all();\n },\n\n getByMessageSequence(sessionId: string, messageSequence: number): Checkpoint | undefined {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(\n and(\n eq(schema.checkpoints.sessionId, sessionId),\n eq(schema.checkpoints.messageSequence, messageSequence)\n )\n )\n .get();\n },\n\n getLatest(sessionId: string): Checkpoint | undefined {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(eq(schema.checkpoints.sessionId, sessionId))\n .orderBy(desc(schema.checkpoints.messageSequence))\n .limit(1)\n .get();\n },\n\n /**\n * Delete all checkpoints after a given sequence number\n * (Used when reverting to a checkpoint)\n */\n deleteAfterSequence(sessionId: string, messageSequence: number): number {\n const result = getDb()\n .delete(schema.checkpoints)\n .where(\n and(\n eq(schema.checkpoints.sessionId, sessionId),\n sql`message_sequence > ${messageSequence}`\n )\n )\n .run();\n return result.changes;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.checkpoints)\n .where(eq(schema.checkpoints.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// File backup queries - for storing original file content\nexport const fileBackupQueries = {\n create(data: {\n checkpointId: string;\n sessionId: string;\n filePath: string;\n originalContent: string | null;\n existed: boolean;\n }): FileBackup {\n const id = nanoid();\n const result = getDb()\n .insert(schema.fileBackups)\n .values({\n id,\n checkpointId: data.checkpointId,\n sessionId: data.sessionId,\n filePath: data.filePath,\n originalContent: data.originalContent,\n existed: data.existed,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getByCheckpoint(checkpointId: string): FileBackup[] {\n return getDb()\n .select()\n .from(schema.fileBackups)\n .where(eq(schema.fileBackups.checkpointId, checkpointId))\n .all();\n },\n\n getBySession(sessionId: string): FileBackup[] {\n return getDb()\n .select()\n .from(schema.fileBackups)\n .where(eq(schema.fileBackups.sessionId, sessionId))\n .orderBy(schema.fileBackups.createdAt)\n .all();\n },\n\n /**\n * Get all file backups from a given checkpoint sequence onwards (inclusive)\n * (Used when reverting - need to restore these files)\n * \n * When reverting to checkpoint X, we need backups from checkpoint X and all later ones\n * because checkpoint X's backups represent the state BEFORE processing message X.\n */\n getFromSequence(sessionId: string, messageSequence: number): FileBackup[] {\n // Get all checkpoints from this sequence onwards, then get their backups\n const checkpointsFrom = getDb()\n .select()\n .from(schema.checkpoints)\n .where(\n and(\n eq(schema.checkpoints.sessionId, sessionId),\n sql`message_sequence >= ${messageSequence}`\n )\n )\n .all();\n\n if (checkpointsFrom.length === 0) {\n return [];\n }\n\n const checkpointIds = checkpointsFrom.map(c => c.id);\n \n // Get all backups for these checkpoints\n const allBackups: FileBackup[] = [];\n for (const cpId of checkpointIds) {\n const backups = getDb()\n .select()\n .from(schema.fileBackups)\n .where(eq(schema.fileBackups.checkpointId, cpId))\n .all();\n allBackups.push(...backups);\n }\n \n return allBackups;\n },\n\n /**\n * Check if a file already has a backup in the current checkpoint\n */\n hasBackup(checkpointId: string, filePath: string): boolean {\n const result = getDb()\n .select()\n .from(schema.fileBackups)\n .where(\n and(\n eq(schema.fileBackups.checkpointId, checkpointId),\n eq(schema.fileBackups.filePath, filePath)\n )\n )\n .get();\n return !!result;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.fileBackups)\n .where(eq(schema.fileBackups.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\nexport type { \n Session, \n Message, \n ToolExecution, \n TodoItem, \n SessionConfig, \n ModelMessage,\n Terminal,\n ActiveStream,\n Checkpoint,\n FileBackup,\n};\n","import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\n\n// Sessions table - represents an agent session/thread\nexport const sessions = sqliteTable('sessions', {\n id: text('id').primaryKey(),\n name: text('name'),\n workingDirectory: text('working_directory').notNull(),\n model: text('model').notNull(),\n status: text('status', { enum: ['active', 'waiting', 'completed', 'error'] })\n .notNull()\n .default('active'),\n config: text('config', { mode: 'json' }).$type<SessionConfig>(),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Messages table - stores AI SDK ModelMessage directly\nexport const messages = sqliteTable('messages', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n // Store the entire ModelMessage as JSON (role + content)\n modelMessage: text('model_message', { mode: 'json' }).$type<ModelMessage>().notNull(),\n // Sequence number within session to maintain exact ordering\n sequence: integer('sequence').notNull().default(0),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Tool executions - tracks all tool calls and their results\nexport const toolExecutions = sqliteTable('tool_executions', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n messageId: text('message_id').references(() => messages.id, { onDelete: 'cascade' }),\n toolName: text('tool_name').notNull(),\n toolCallId: text('tool_call_id').notNull(),\n input: text('input', { mode: 'json' }),\n output: text('output', { mode: 'json' }),\n status: text('status', { enum: ['pending', 'approved', 'rejected', 'completed', 'error'] })\n .notNull()\n .default('pending'),\n requiresApproval: integer('requires_approval', { mode: 'boolean' }).notNull().default(false),\n error: text('error'),\n startedAt: integer('started_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n completedAt: integer('completed_at', { mode: 'timestamp' }),\n});\n\n// Todo items for the planning tool\nexport const todoItems = sqliteTable('todo_items', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n content: text('content').notNull(),\n status: text('status', { enum: ['pending', 'in_progress', 'completed', 'cancelled'] })\n .notNull()\n .default('pending'),\n order: integer('order').notNull().default(0),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Skills loaded into sessions\nexport const loadedSkills = sqliteTable('loaded_skills', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n skillName: text('skill_name').notNull(),\n loadedAt: integer('loaded_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Terminal sessions - background processes managed by agents\nexport const terminals = sqliteTable('terminals', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n name: text('name'), // Optional friendly name (e.g., \"dev-server\")\n command: text('command').notNull(), // The command that was run\n cwd: text('cwd').notNull(), // Working directory\n pid: integer('pid'), // Process ID (null if not running)\n status: text('status', { enum: ['running', 'stopped', 'error'] })\n .notNull()\n .default('running'),\n exitCode: integer('exit_code'), // Exit code if stopped\n error: text('error'), // Error message if status is 'error'\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n stoppedAt: integer('stopped_at', { mode: 'timestamp' }),\n});\n\n// Active streams - tracks resumable stream sessions for multi-client sync\nexport const activeStreams = sqliteTable('active_streams', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n streamId: text('stream_id').notNull().unique(), // Unique stream identifier\n status: text('status', { enum: ['active', 'finished', 'error'] })\n .notNull()\n .default('active'),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n finishedAt: integer('finished_at', { mode: 'timestamp' }),\n});\n\n// Checkpoints - created before each user message for revert capability\nexport const checkpoints = sqliteTable('checkpoints', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n // The message sequence number this checkpoint was created BEFORE\n // (i.e., the state before this user message was processed)\n messageSequence: integer('message_sequence').notNull(),\n // Optional git commit hash if in a git repo\n gitHead: text('git_head'),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// File backups - stores original file content before modifications\nexport const fileBackups = sqliteTable('file_backups', {\n id: text('id').primaryKey(),\n checkpointId: text('checkpoint_id')\n .notNull()\n .references(() => checkpoints.id, { onDelete: 'cascade' }),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n // Relative path from working directory\n filePath: text('file_path').notNull(),\n // Original content (null means file didn't exist before)\n originalContent: text('original_content'),\n // Whether the file existed before this checkpoint\n existed: integer('existed', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Types for JSON columns\nexport interface SessionConfig {\n toolApprovals?: Record<string, boolean>;\n approvalWebhook?: string;\n skillsDirectory?: string;\n maxContextChars?: number;\n}\n\n// AI SDK ModelMessage types - stored directly for accurate context passing\n// These match the exact format from AI SDK's response.messages\nexport type ModelMessage = \n | SystemModelMessage\n | UserModelMessage\n | AssistantModelMessage\n | ToolModelMessage;\n\nexport interface SystemModelMessage {\n role: 'system';\n content: string;\n}\n\nexport interface UserModelMessage {\n role: 'user';\n content: string;\n}\n\nexport interface AssistantModelMessage {\n role: 'assistant';\n content: string | AssistantContentPart[];\n}\n\nexport interface ToolModelMessage {\n role: 'tool';\n content: ToolResultPart[];\n}\n\nexport interface AssistantContentPart {\n type: 'text' | 'tool-call' | 'reasoning';\n text?: string;\n toolCallId?: string;\n toolName?: string;\n input?: unknown;\n}\n\nexport interface ToolResultPart {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: unknown;\n}\n\n// Type exports for queries\nexport type Session = typeof sessions.$inferSelect;\nexport type NewSession = typeof sessions.$inferInsert;\nexport type Message = typeof messages.$inferSelect;\nexport type NewMessage = typeof messages.$inferInsert;\nexport type ToolExecution = typeof toolExecutions.$inferSelect;\nexport type NewToolExecution = typeof toolExecutions.$inferInsert;\nexport type TodoItem = typeof todoItems.$inferSelect;\nexport type NewTodoItem = typeof todoItems.$inferInsert;\nexport type LoadedSkill = typeof loadedSkills.$inferSelect;\nexport type Terminal = typeof terminals.$inferSelect;\nexport type NewTerminal = typeof terminals.$inferInsert;\nexport type ActiveStream = typeof activeStreams.$inferSelect;\nexport type NewActiveStream = typeof activeStreams.$inferInsert;\nexport type Checkpoint = typeof checkpoints.$inferSelect;\nexport type NewCheckpoint = typeof checkpoints.$inferInsert;\nexport type FileBackup = typeof fileBackups.$inferSelect;\nexport type NewFileBackup = typeof fileBackups.$inferInsert;"],"mappings":"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","names":["messages"]}
|
|
1
|
+
{"version":3,"sources":["../../src/db/index.ts","../../src/db/schema.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { eq, desc, and, sql } from 'drizzle-orm';\nimport { nanoid } from 'nanoid';\nimport * as schema from './schema.js';\nimport 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} from './schema.js';\n\nlet db: ReturnType<typeof drizzle<typeof schema>> | null = null;\nlet sqlite: Database.Database | null = null;\n\nexport function initDatabase(dbPath: string) {\n sqlite = new Database(dbPath);\n sqlite.pragma('journal_mode = WAL');\n db = drizzle(sqlite, { schema });\n\n // Create tables if they don't exist (preserves existing data)\n sqlite.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n name TEXT,\n working_directory TEXT NOT NULL,\n model TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n config TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n model_message TEXT NOT NULL,\n sequence INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS tool_executions (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n message_id TEXT REFERENCES messages(id) ON DELETE CASCADE,\n tool_name TEXT NOT NULL,\n tool_call_id TEXT NOT NULL,\n input TEXT,\n output TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n requires_approval INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n started_at INTEGER NOT NULL,\n completed_at INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS todo_items (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n \"order\" INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS loaded_skills (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n skill_name TEXT NOT NULL,\n loaded_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS terminals (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n name TEXT,\n command TEXT NOT NULL,\n cwd TEXT NOT NULL,\n pid INTEGER,\n status TEXT NOT NULL DEFAULT 'running',\n exit_code INTEGER,\n error TEXT,\n created_at INTEGER NOT NULL,\n stopped_at INTEGER\n );\n\n -- Table for tracking active streams (for resumable streams)\n CREATE TABLE IF NOT EXISTS active_streams (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n stream_id TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL DEFAULT 'active',\n created_at INTEGER NOT NULL,\n finished_at INTEGER\n );\n\n -- Checkpoints table - created before each user message\n CREATE TABLE IF NOT EXISTS checkpoints (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n message_sequence INTEGER NOT NULL,\n git_head TEXT,\n created_at INTEGER NOT NULL\n );\n\n -- File backups table - stores original file content\n CREATE TABLE IF NOT EXISTS file_backups (\n id TEXT PRIMARY KEY,\n checkpoint_id TEXT NOT NULL REFERENCES checkpoints(id) ON DELETE CASCADE,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n original_content TEXT,\n existed INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL\n );\n\n -- Subagent executions table - tracks subagent runs\n CREATE TABLE IF NOT EXISTS subagent_executions (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n tool_call_id TEXT NOT NULL,\n subagent_type TEXT NOT NULL,\n task TEXT NOT NULL,\n model TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n steps TEXT DEFAULT '[]',\n result TEXT,\n error TEXT,\n started_at INTEGER NOT NULL,\n completed_at INTEGER\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\n CREATE INDEX IF NOT EXISTS idx_tool_executions_session ON tool_executions(session_id);\n CREATE INDEX IF NOT EXISTS idx_todo_items_session ON todo_items(session_id);\n CREATE INDEX IF NOT EXISTS idx_loaded_skills_session ON loaded_skills(session_id);\n CREATE INDEX IF NOT EXISTS idx_terminals_session ON terminals(session_id);\n CREATE INDEX IF NOT EXISTS idx_active_streams_session ON active_streams(session_id);\n CREATE INDEX IF NOT EXISTS idx_checkpoints_session ON checkpoints(session_id);\n CREATE INDEX IF NOT EXISTS idx_file_backups_checkpoint ON file_backups(checkpoint_id);\n CREATE INDEX IF NOT EXISTS idx_file_backups_session ON file_backups(session_id);\n CREATE INDEX IF NOT EXISTS idx_subagent_executions_session ON subagent_executions(session_id);\n CREATE INDEX IF NOT EXISTS idx_subagent_executions_tool_call ON subagent_executions(tool_call_id);\n `);\n\n return db;\n}\n\nexport function getDb() {\n if (!db) {\n throw new Error('Database not initialized. Call initDatabase first.');\n }\n return db;\n}\n\nexport function closeDatabase() {\n if (sqlite) {\n sqlite.close();\n sqlite = null;\n db = null;\n }\n}\n\n// Session queries\nexport const sessionQueries = {\n create(data: Omit<NewSession, 'id' | 'createdAt' | 'updatedAt'>): Session {\n const id = nanoid();\n const now = new Date();\n const result = getDb()\n .insert(schema.sessions)\n .values({\n id,\n ...data,\n createdAt: now,\n updatedAt: now,\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Session | undefined {\n return getDb().select().from(schema.sessions).where(eq(schema.sessions.id, id)).get();\n },\n\n list(limit = 50, offset = 0): Session[] {\n return getDb()\n .select()\n .from(schema.sessions)\n .orderBy(desc(schema.sessions.createdAt))\n .limit(limit)\n .offset(offset)\n .all();\n },\n\n updateStatus(id: string, status: Session['status']): Session | undefined {\n return getDb()\n .update(schema.sessions)\n .set({ status, updatedAt: new Date() })\n .where(eq(schema.sessions.id, id))\n .returning()\n .get();\n },\n\n updateModel(id: string, model: string): Session | undefined {\n return getDb()\n .update(schema.sessions)\n .set({ model, updatedAt: new Date() })\n .where(eq(schema.sessions.id, id))\n .returning()\n .get();\n },\n\n update(id: string, updates: { model?: string; name?: string; config?: SessionConfig }): Session | undefined {\n return getDb()\n .update(schema.sessions)\n .set({ ...updates, updatedAt: new Date() })\n .where(eq(schema.sessions.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb().delete(schema.sessions).where(eq(schema.sessions.id, id)).run();\n return result.changes > 0;\n },\n};\n\n// Message queries - stores AI SDK ModelMessage directly\nexport const messageQueries = {\n /**\n * Get the next sequence number for a session\n */\n getNextSequence(sessionId: string): number {\n const result = getDb()\n .select({ maxSeq: sql<number>`COALESCE(MAX(sequence), -1)` })\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .get();\n return (result?.maxSeq ?? -1) + 1;\n },\n\n /**\n * Create a single message from a ModelMessage\n */\n create(sessionId: string, modelMessage: ModelMessage): Message {\n const id = nanoid();\n const sequence = this.getNextSequence(sessionId);\n const result = getDb()\n .insert(schema.messages)\n .values({\n id,\n sessionId,\n modelMessage,\n sequence,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n /**\n * Add multiple ModelMessages at once (from response.messages)\n * Maintains insertion order via sequence numbers\n */\n addMany(sessionId: string, modelMessages: ModelMessage[]): Message[] {\n const results: Message[] = [];\n let sequence = this.getNextSequence(sessionId);\n for (const msg of modelMessages) {\n const id = nanoid();\n const result = getDb()\n .insert(schema.messages)\n .values({\n id,\n sessionId,\n modelMessage: msg,\n sequence,\n createdAt: new Date(),\n })\n .returning()\n .get();\n results.push(result);\n sequence++;\n }\n return results;\n },\n\n /**\n * Get all messages for a session as ModelMessage[]\n * Ordered by sequence to maintain exact insertion order\n */\n getBySession(sessionId: string): Message[] {\n return getDb()\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .orderBy(schema.messages.sequence)\n .all();\n },\n\n /**\n * Get ModelMessages directly (for passing to AI SDK)\n */\n getModelMessages(sessionId: string): ModelMessage[] {\n const messages = this.getBySession(sessionId);\n return messages.map(m => m.modelMessage);\n },\n\n getRecentBySession(sessionId: string, limit = 50): Message[] {\n return getDb()\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .orderBy(desc(schema.messages.sequence))\n .limit(limit)\n .all()\n .reverse();\n },\n\n countBySession(sessionId: string): number {\n const result = getDb()\n .select({ count: sql<number>`count(*)` })\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .get();\n return result?.count ?? 0;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .run();\n return result.changes;\n },\n\n /**\n * Delete all messages with sequence >= the given sequence number\n * (Used when reverting to a checkpoint)\n */\n deleteFromSequence(sessionId: string, fromSequence: number): number {\n const result = getDb()\n .delete(schema.messages)\n .where(\n and(\n eq(schema.messages.sessionId, sessionId),\n sql`sequence >= ${fromSequence}`\n )\n )\n .run();\n return result.changes;\n },\n};\n\n// Tool execution queries\nexport const toolExecutionQueries = {\n create(data: Omit<NewToolExecution, 'id' | 'startedAt'>): ToolExecution {\n const id = nanoid();\n const result = getDb()\n .insert(schema.toolExecutions)\n .values({\n id,\n ...data,\n startedAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): ToolExecution | undefined {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.id, id))\n .get();\n },\n\n getByToolCallId(toolCallId: string): ToolExecution | undefined {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.toolCallId, toolCallId))\n .get();\n },\n\n getPendingApprovals(sessionId: string): ToolExecution[] {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(\n and(\n eq(schema.toolExecutions.sessionId, sessionId),\n eq(schema.toolExecutions.status, 'pending'),\n eq(schema.toolExecutions.requiresApproval, true)\n )\n )\n .all();\n },\n\n approve(id: string): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({ status: 'approved' })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n reject(id: string): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({ status: 'rejected' })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n complete(\n id: string,\n output: unknown,\n error?: string\n ): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({\n status: error ? 'error' : 'completed',\n output: output as any,\n error,\n completedAt: new Date(),\n })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n getBySession(sessionId: string): ToolExecution[] {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.sessionId, sessionId))\n .orderBy(schema.toolExecutions.startedAt)\n .all();\n },\n\n /**\n * Delete all tool executions after a given timestamp\n * (Used when reverting to a checkpoint)\n */\n deleteAfterTime(sessionId: string, afterTime: Date): number {\n const result = getDb()\n .delete(schema.toolExecutions)\n .where(\n and(\n eq(schema.toolExecutions.sessionId, sessionId),\n sql`started_at > ${afterTime.getTime()}`\n )\n )\n .run();\n return result.changes;\n },\n};\n\n// Todo item queries\nexport const todoQueries = {\n create(data: Omit<NewTodoItem, 'id' | 'createdAt' | 'updatedAt'>): TodoItem {\n const id = nanoid();\n const now = new Date();\n const result = getDb()\n .insert(schema.todoItems)\n .values({\n id,\n ...data,\n createdAt: now,\n updatedAt: now,\n })\n .returning()\n .get();\n return result;\n },\n\n createMany(\n sessionId: string,\n items: Array<{ content: string; order?: number }>\n ): TodoItem[] {\n const now = new Date();\n const values = items.map((item, index) => ({\n id: nanoid(),\n sessionId,\n content: item.content,\n order: item.order ?? index,\n createdAt: now,\n updatedAt: now,\n }));\n\n return getDb().insert(schema.todoItems).values(values).returning().all();\n },\n\n getBySession(sessionId: string): TodoItem[] {\n return getDb()\n .select()\n .from(schema.todoItems)\n .where(eq(schema.todoItems.sessionId, sessionId))\n .orderBy(schema.todoItems.order)\n .all();\n },\n\n updateStatus(\n id: string,\n status: TodoItem['status']\n ): TodoItem | undefined {\n return getDb()\n .update(schema.todoItems)\n .set({ status, updatedAt: new Date() })\n .where(eq(schema.todoItems.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb()\n .delete(schema.todoItems)\n .where(eq(schema.todoItems.id, id))\n .run();\n return result.changes > 0;\n },\n\n clearSession(sessionId: string): number {\n const result = getDb()\n .delete(schema.todoItems)\n .where(eq(schema.todoItems.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Loaded skills queries\nexport const skillQueries = {\n load(sessionId: string, skillName: string): schema.LoadedSkill {\n const id = nanoid();\n const result = getDb()\n .insert(schema.loadedSkills)\n .values({\n id,\n sessionId,\n skillName,\n loadedAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getBySession(sessionId: string): schema.LoadedSkill[] {\n return getDb()\n .select()\n .from(schema.loadedSkills)\n .where(eq(schema.loadedSkills.sessionId, sessionId))\n .orderBy(schema.loadedSkills.loadedAt)\n .all();\n },\n\n isLoaded(sessionId: string, skillName: string): boolean {\n const result = getDb()\n .select()\n .from(schema.loadedSkills)\n .where(\n and(\n eq(schema.loadedSkills.sessionId, sessionId),\n eq(schema.loadedSkills.skillName, skillName)\n )\n )\n .get();\n return !!result;\n },\n};\n\n// Terminal queries\nexport const terminalQueries = {\n create(data: Omit<NewTerminal, 'id' | 'createdAt'>): Terminal {\n const id = nanoid();\n const result = getDb()\n .insert(schema.terminals)\n .values({\n id,\n ...data,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Terminal | undefined {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(eq(schema.terminals.id, id))\n .get();\n },\n\n getBySession(sessionId: string): Terminal[] {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(eq(schema.terminals.sessionId, sessionId))\n .orderBy(desc(schema.terminals.createdAt))\n .all();\n },\n\n getRunning(sessionId: string): Terminal[] {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(\n and(\n eq(schema.terminals.sessionId, sessionId),\n eq(schema.terminals.status, 'running')\n )\n )\n .all();\n },\n\n updateStatus(\n id: string,\n status: Terminal['status'],\n exitCode?: number,\n error?: string\n ): Terminal | undefined {\n return getDb()\n .update(schema.terminals)\n .set({\n status,\n exitCode,\n error,\n stoppedAt: status !== 'running' ? new Date() : undefined,\n })\n .where(eq(schema.terminals.id, id))\n .returning()\n .get();\n },\n\n updatePid(id: string, pid: number): Terminal | undefined {\n return getDb()\n .update(schema.terminals)\n .set({ pid })\n .where(eq(schema.terminals.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb()\n .delete(schema.terminals)\n .where(eq(schema.terminals.id, id))\n .run();\n return result.changes > 0;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.terminals)\n .where(eq(schema.terminals.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Active stream queries - for resumable streams\nexport const activeStreamQueries = {\n create(sessionId: string, streamId: string): ActiveStream {\n const id = nanoid();\n const result = getDb()\n .insert(schema.activeStreams)\n .values({\n id,\n sessionId,\n streamId,\n status: 'active',\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getBySessionId(sessionId: string): ActiveStream | undefined {\n return getDb()\n .select()\n .from(schema.activeStreams)\n .where(\n and(\n eq(schema.activeStreams.sessionId, sessionId),\n eq(schema.activeStreams.status, 'active')\n )\n )\n .get();\n },\n\n getByStreamId(streamId: string): ActiveStream | undefined {\n return getDb()\n .select()\n .from(schema.activeStreams)\n .where(eq(schema.activeStreams.streamId, streamId))\n .get();\n },\n\n finish(streamId: string): ActiveStream | undefined {\n return getDb()\n .update(schema.activeStreams)\n .set({ status: 'finished', finishedAt: new Date() })\n .where(eq(schema.activeStreams.streamId, streamId))\n .returning()\n .get();\n },\n\n markError(streamId: string): ActiveStream | undefined {\n return getDb()\n .update(schema.activeStreams)\n .set({ status: 'error', finishedAt: new Date() })\n .where(eq(schema.activeStreams.streamId, streamId))\n .returning()\n .get();\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.activeStreams)\n .where(eq(schema.activeStreams.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Checkpoint queries - for session revert functionality\nexport const checkpointQueries = {\n create(data: { sessionId: string; messageSequence: number; gitHead?: string }): Checkpoint {\n const id = nanoid();\n const result = getDb()\n .insert(schema.checkpoints)\n .values({\n id,\n sessionId: data.sessionId,\n messageSequence: data.messageSequence,\n gitHead: data.gitHead,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Checkpoint | undefined {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(eq(schema.checkpoints.id, id))\n .get();\n },\n\n getBySession(sessionId: string): Checkpoint[] {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(eq(schema.checkpoints.sessionId, sessionId))\n .orderBy(schema.checkpoints.messageSequence)\n .all();\n },\n\n getByMessageSequence(sessionId: string, messageSequence: number): Checkpoint | undefined {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(\n and(\n eq(schema.checkpoints.sessionId, sessionId),\n eq(schema.checkpoints.messageSequence, messageSequence)\n )\n )\n .get();\n },\n\n getLatest(sessionId: string): Checkpoint | undefined {\n return getDb()\n .select()\n .from(schema.checkpoints)\n .where(eq(schema.checkpoints.sessionId, sessionId))\n .orderBy(desc(schema.checkpoints.messageSequence))\n .limit(1)\n .get();\n },\n\n /**\n * Delete all checkpoints after a given sequence number\n * (Used when reverting to a checkpoint)\n */\n deleteAfterSequence(sessionId: string, messageSequence: number): number {\n const result = getDb()\n .delete(schema.checkpoints)\n .where(\n and(\n eq(schema.checkpoints.sessionId, sessionId),\n sql`message_sequence > ${messageSequence}`\n )\n )\n .run();\n return result.changes;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.checkpoints)\n .where(eq(schema.checkpoints.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// File backup queries - for storing original file content\nexport const fileBackupQueries = {\n create(data: {\n checkpointId: string;\n sessionId: string;\n filePath: string;\n originalContent: string | null;\n existed: boolean;\n }): FileBackup {\n const id = nanoid();\n const result = getDb()\n .insert(schema.fileBackups)\n .values({\n id,\n checkpointId: data.checkpointId,\n sessionId: data.sessionId,\n filePath: data.filePath,\n originalContent: data.originalContent,\n existed: data.existed,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getByCheckpoint(checkpointId: string): FileBackup[] {\n return getDb()\n .select()\n .from(schema.fileBackups)\n .where(eq(schema.fileBackups.checkpointId, checkpointId))\n .all();\n },\n\n getBySession(sessionId: string): FileBackup[] {\n return getDb()\n .select()\n .from(schema.fileBackups)\n .where(eq(schema.fileBackups.sessionId, sessionId))\n .orderBy(schema.fileBackups.createdAt)\n .all();\n },\n\n /**\n * Get all file backups from a given checkpoint sequence onwards (inclusive)\n * (Used when reverting - need to restore these files)\n * \n * When reverting to checkpoint X, we need backups from checkpoint X and all later ones\n * because checkpoint X's backups represent the state BEFORE processing message X.\n */\n getFromSequence(sessionId: string, messageSequence: number): FileBackup[] {\n // Get all checkpoints from this sequence onwards, then get their backups\n const checkpointsFrom = getDb()\n .select()\n .from(schema.checkpoints)\n .where(\n and(\n eq(schema.checkpoints.sessionId, sessionId),\n sql`message_sequence >= ${messageSequence}`\n )\n )\n .all();\n\n if (checkpointsFrom.length === 0) {\n return [];\n }\n\n const checkpointIds = checkpointsFrom.map(c => c.id);\n \n // Get all backups for these checkpoints\n const allBackups: FileBackup[] = [];\n for (const cpId of checkpointIds) {\n const backups = getDb()\n .select()\n .from(schema.fileBackups)\n .where(eq(schema.fileBackups.checkpointId, cpId))\n .all();\n allBackups.push(...backups);\n }\n \n return allBackups;\n },\n\n /**\n * Check if a file already has a backup in the current checkpoint\n */\n hasBackup(checkpointId: string, filePath: string): boolean {\n const result = getDb()\n .select()\n .from(schema.fileBackups)\n .where(\n and(\n eq(schema.fileBackups.checkpointId, checkpointId),\n eq(schema.fileBackups.filePath, filePath)\n )\n )\n .get();\n return !!result;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.fileBackups)\n .where(eq(schema.fileBackups.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Subagent execution queries - for tracking subagent runs\nexport const subagentQueries = {\n create(data: {\n sessionId: string;\n toolCallId: string;\n subagentType: string;\n task: string;\n model: string;\n }): SubagentExecution {\n const id = nanoid();\n const result = getDb()\n .insert(schema.subagentExecutions)\n .values({\n id,\n sessionId: data.sessionId,\n toolCallId: data.toolCallId,\n subagentType: data.subagentType,\n task: data.task,\n model: data.model,\n status: 'running',\n steps: [],\n startedAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): SubagentExecution | undefined {\n return getDb()\n .select()\n .from(schema.subagentExecutions)\n .where(eq(schema.subagentExecutions.id, id))\n .get();\n },\n\n getByToolCallId(toolCallId: string): SubagentExecution | undefined {\n return getDb()\n .select()\n .from(schema.subagentExecutions)\n .where(eq(schema.subagentExecutions.toolCallId, toolCallId))\n .get();\n },\n\n getBySession(sessionId: string): SubagentExecution[] {\n return getDb()\n .select()\n .from(schema.subagentExecutions)\n .where(eq(schema.subagentExecutions.sessionId, sessionId))\n .orderBy(desc(schema.subagentExecutions.startedAt))\n .all();\n },\n\n addStep(id: string, step: SubagentStep): SubagentExecution | undefined {\n const existing = this.getById(id);\n if (!existing) return undefined;\n\n const currentSteps = existing.steps || [];\n const newSteps = [...currentSteps, step];\n\n return getDb()\n .update(schema.subagentExecutions)\n .set({ steps: newSteps })\n .where(eq(schema.subagentExecutions.id, id))\n .returning()\n .get();\n },\n\n complete(id: string, result: unknown): SubagentExecution | undefined {\n return getDb()\n .update(schema.subagentExecutions)\n .set({\n status: 'completed',\n result: result as any,\n completedAt: new Date(),\n })\n .where(eq(schema.subagentExecutions.id, id))\n .returning()\n .get();\n },\n\n markError(id: string, error: string): SubagentExecution | undefined {\n return getDb()\n .update(schema.subagentExecutions)\n .set({\n status: 'error',\n error,\n completedAt: new Date(),\n })\n .where(eq(schema.subagentExecutions.id, id))\n .returning()\n .get();\n },\n\n cancel(id: string): SubagentExecution | undefined {\n return getDb()\n .update(schema.subagentExecutions)\n .set({\n status: 'cancelled',\n completedAt: new Date(),\n })\n .where(eq(schema.subagentExecutions.id, id))\n .returning()\n .get();\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.subagentExecutions)\n .where(eq(schema.subagentExecutions.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\nexport type { \n Session, \n Message, \n ToolExecution, \n TodoItem, \n SessionConfig, \n ModelMessage,\n UserModelMessage,\n UserContentPart,\n UserTextPart,\n UserImagePart,\n UserFilePart,\n Terminal,\n ActiveStream,\n Checkpoint,\n FileBackup,\n SubagentExecution,\n SubagentStep,\n};\n","import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\n\n// Sessions table - represents an agent session/thread\nexport const sessions = sqliteTable('sessions', {\n id: text('id').primaryKey(),\n name: text('name'),\n workingDirectory: text('working_directory').notNull(),\n model: text('model').notNull(),\n status: text('status', { enum: ['active', 'waiting', 'completed', 'error'] })\n .notNull()\n .default('active'),\n config: text('config', { mode: 'json' }).$type<SessionConfig>(),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Messages table - stores AI SDK ModelMessage directly\nexport const messages = sqliteTable('messages', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n // Store the entire ModelMessage as JSON (role + content)\n modelMessage: text('model_message', { mode: 'json' }).$type<ModelMessage>().notNull(),\n // Sequence number within session to maintain exact ordering\n sequence: integer('sequence').notNull().default(0),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Tool executions - tracks all tool calls and their results\nexport const toolExecutions = sqliteTable('tool_executions', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n messageId: text('message_id').references(() => messages.id, { onDelete: 'cascade' }),\n toolName: text('tool_name').notNull(),\n toolCallId: text('tool_call_id').notNull(),\n input: text('input', { mode: 'json' }),\n output: text('output', { mode: 'json' }),\n status: text('status', { enum: ['pending', 'approved', 'rejected', 'completed', 'error'] })\n .notNull()\n .default('pending'),\n requiresApproval: integer('requires_approval', { mode: 'boolean' }).notNull().default(false),\n error: text('error'),\n startedAt: integer('started_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n completedAt: integer('completed_at', { mode: 'timestamp' }),\n});\n\n// Todo items for the planning tool\nexport const todoItems = sqliteTable('todo_items', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n content: text('content').notNull(),\n status: text('status', { enum: ['pending', 'in_progress', 'completed', 'cancelled'] })\n .notNull()\n .default('pending'),\n order: integer('order').notNull().default(0),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Skills loaded into sessions\nexport const loadedSkills = sqliteTable('loaded_skills', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n skillName: text('skill_name').notNull(),\n loadedAt: integer('loaded_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Terminal sessions - background processes managed by agents\nexport const terminals = sqliteTable('terminals', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n name: text('name'), // Optional friendly name (e.g., \"dev-server\")\n command: text('command').notNull(), // The command that was run\n cwd: text('cwd').notNull(), // Working directory\n pid: integer('pid'), // Process ID (null if not running)\n status: text('status', { enum: ['running', 'stopped', 'error'] })\n .notNull()\n .default('running'),\n exitCode: integer('exit_code'), // Exit code if stopped\n error: text('error'), // Error message if status is 'error'\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n stoppedAt: integer('stopped_at', { mode: 'timestamp' }),\n});\n\n// Active streams - tracks resumable stream sessions for multi-client sync\nexport const activeStreams = sqliteTable('active_streams', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n streamId: text('stream_id').notNull().unique(), // Unique stream identifier\n status: text('status', { enum: ['active', 'finished', 'error'] })\n .notNull()\n .default('active'),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n finishedAt: integer('finished_at', { mode: 'timestamp' }),\n});\n\n// Checkpoints - created before each user message for revert capability\nexport const checkpoints = sqliteTable('checkpoints', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n // The message sequence number this checkpoint was created BEFORE\n // (i.e., the state before this user message was processed)\n messageSequence: integer('message_sequence').notNull(),\n // Optional git commit hash if in a git repo\n gitHead: text('git_head'),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// File backups - stores original file content before modifications\nexport const fileBackups = sqliteTable('file_backups', {\n id: text('id').primaryKey(),\n checkpointId: text('checkpoint_id')\n .notNull()\n .references(() => checkpoints.id, { onDelete: 'cascade' }),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n // Relative path from working directory\n filePath: text('file_path').notNull(),\n // Original content (null means file didn't exist before)\n originalContent: text('original_content'),\n // Whether the file existed before this checkpoint\n existed: integer('existed', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Types for JSON columns\nexport interface SessionConfig {\n toolApprovals?: Record<string, boolean>;\n approvalWebhook?: string;\n skillsDirectory?: string;\n maxContextChars?: number;\n}\n\n// AI SDK ModelMessage types - stored directly for accurate context passing\n// These match the exact format from AI SDK's response.messages\nexport type ModelMessage = \n | SystemModelMessage\n | UserModelMessage\n | AssistantModelMessage\n | ToolModelMessage;\n\nexport interface SystemModelMessage {\n role: 'system';\n content: string;\n}\n\n// User message content parts (for multimodal messages)\nexport interface UserTextPart {\n type: 'text';\n text: string;\n}\n\nexport interface UserImagePart {\n type: 'image';\n image: string; // base64 data URL or raw base64\n mediaType?: string;\n filename?: string; // Original filename for context\n savedPath?: string; // Path where file was saved on disk\n}\n\nexport interface UserFilePart {\n type: 'file';\n data: string; // base64 data\n mediaType?: string;\n filename?: string; // Original filename for context\n savedPath?: string; // Path where file was saved on disk\n}\n\nexport type UserContentPart = UserTextPart | UserImagePart | UserFilePart;\n\nexport interface UserModelMessage {\n role: 'user';\n content: string | UserContentPart[];\n}\n\nexport interface AssistantModelMessage {\n role: 'assistant';\n content: string | AssistantContentPart[];\n}\n\nexport interface ToolModelMessage {\n role: 'tool';\n content: ToolResultPart[];\n}\n\nexport interface AssistantContentPart {\n type: 'text' | 'tool-call' | 'reasoning';\n text?: string;\n toolCallId?: string;\n toolName?: string;\n input?: unknown;\n}\n\nexport interface ToolResultPart {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: unknown;\n}\n\n// Subagent executions - tracks subagent runs within a parent agent session\nexport const subagentExecutions = sqliteTable('subagent_executions', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n toolCallId: text('tool_call_id').notNull(), // The tool call that spawned this subagent\n subagentType: text('subagent_type').notNull(), // e.g., 'search', 'analyze', etc.\n task: text('task').notNull(), // The task/query given to the subagent\n model: text('model').notNull(), // The model used (e.g., 'gemini-2.0-flash')\n status: text('status', { enum: ['running', 'completed', 'error', 'cancelled'] })\n .notNull()\n .default('running'),\n // Steps taken by the subagent (stored as JSON array)\n steps: text('steps', { mode: 'json' }).$type<SubagentStep[]>().default([]),\n // Final result/output\n result: text('result', { mode: 'json' }),\n error: text('error'),\n startedAt: integer('started_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n completedAt: integer('completed_at', { mode: 'timestamp' }),\n});\n\n// Subagent step type - represents a single step in the subagent's execution\nexport interface SubagentStep {\n id: string;\n type: 'thought' | 'tool_call' | 'tool_result' | 'text';\n content: string;\n toolName?: string;\n toolInput?: unknown;\n toolOutput?: unknown;\n timestamp: number;\n}\n\n// Type exports for queries\nexport type SubagentExecution = typeof subagentExecutions.$inferSelect;\nexport type NewSubagentExecution = typeof subagentExecutions.$inferInsert;\nexport type Session = typeof sessions.$inferSelect;\nexport type NewSession = typeof sessions.$inferInsert;\nexport type Message = typeof messages.$inferSelect;\nexport type NewMessage = typeof messages.$inferInsert;\nexport type ToolExecution = typeof toolExecutions.$inferSelect;\nexport type NewToolExecution = typeof toolExecutions.$inferInsert;\nexport type TodoItem = typeof todoItems.$inferSelect;\nexport type NewTodoItem = typeof todoItems.$inferInsert;\nexport type LoadedSkill = typeof loadedSkills.$inferSelect;\nexport type Terminal = typeof terminals.$inferSelect;\nexport type NewTerminal = typeof terminals.$inferInsert;\nexport type ActiveStream = typeof activeStreams.$inferSelect;\nexport type NewActiveStream = typeof activeStreams.$inferInsert;\nexport type Checkpoint = typeof checkpoints.$inferSelect;\nexport type NewCheckpoint = typeof checkpoints.$inferInsert;\nexport type FileBackup = typeof fileBackups.$inferSelect;\nexport type NewFileBackup = typeof fileBackups.$inferInsert;"],"mappings":"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","names":["messages"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ModelMessage, streamText } from 'ai';
|
|
2
|
-
import { S as Session, e as ToolExecution } from './schema-
|
|
2
|
+
import { S as Session, e as ToolExecution } from './schema-D_8A4k01.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { B as BashToolProgress } from './
|
|
4
|
+
import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from './search-ybREg7F_.js';
|
|
5
5
|
|
|
6
6
|
declare const ToolApprovalConfigSchema: z.ZodObject<{
|
|
7
7
|
bash: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
@@ -154,6 +154,18 @@ declare const SparkcoderConfigSchema: z.ZodObject<{
|
|
|
154
154
|
type ToolApprovalConfig = z.infer<typeof ToolApprovalConfigSchema>;
|
|
155
155
|
type SessionConfig = z.infer<typeof SessionConfigSchema>;
|
|
156
156
|
type SparkcoderConfig = z.infer<typeof SparkcoderConfigSchema>;
|
|
157
|
+
interface DiscoveredSkills {
|
|
158
|
+
alwaysLoadedDirs: Array<{
|
|
159
|
+
path: string;
|
|
160
|
+
priority: number;
|
|
161
|
+
}>;
|
|
162
|
+
onDemandDirs: Array<{
|
|
163
|
+
path: string;
|
|
164
|
+
priority: number;
|
|
165
|
+
}>;
|
|
166
|
+
agentsMdPath: string | null;
|
|
167
|
+
allDirectories: string[];
|
|
168
|
+
}
|
|
157
169
|
interface ResolvedConfig extends Omit<SparkcoderConfig, 'server'> {
|
|
158
170
|
server: {
|
|
159
171
|
port: number;
|
|
@@ -163,6 +175,7 @@ interface ResolvedConfig extends Omit<SparkcoderConfig, 'server'> {
|
|
|
163
175
|
resolvedWorkingDirectory: string;
|
|
164
176
|
resolvedSkillsDirectories: string[];
|
|
165
177
|
resolvedDatabasePath: string;
|
|
178
|
+
discoveredSkills: DiscoveredSkills;
|
|
166
179
|
}
|
|
167
180
|
|
|
168
181
|
interface ContextManagerOptions {
|
|
@@ -195,8 +208,15 @@ declare class ContextManager {
|
|
|
195
208
|
private summarizeContext;
|
|
196
209
|
/**
|
|
197
210
|
* Add a user message to the context
|
|
211
|
+
* Content can be a string or an array of content parts (for messages with images/files)
|
|
198
212
|
*/
|
|
199
|
-
addUserMessage(
|
|
213
|
+
addUserMessage(content: string | Array<{
|
|
214
|
+
type: string;
|
|
215
|
+
text?: string;
|
|
216
|
+
image?: string;
|
|
217
|
+
data?: string;
|
|
218
|
+
mediaType?: string;
|
|
219
|
+
}>): void;
|
|
200
220
|
/**
|
|
201
221
|
* Add response messages from AI SDK directly
|
|
202
222
|
* This is the preferred method - use result.response.messages from streamText/generateText
|
|
@@ -223,6 +243,8 @@ declare function buildSystemPrompt(options: {
|
|
|
223
243
|
workingDirectory: string;
|
|
224
244
|
skillsDirectories: string[];
|
|
225
245
|
sessionId: string;
|
|
246
|
+
discoveredSkills?: DiscoveredSkills;
|
|
247
|
+
activeFiles?: string[];
|
|
226
248
|
customInstructions?: string;
|
|
227
249
|
}): Promise<string>;
|
|
228
250
|
|
|
@@ -233,8 +255,18 @@ interface AgentOptions {
|
|
|
233
255
|
model?: string;
|
|
234
256
|
sessionConfig?: Partial<SessionConfig>;
|
|
235
257
|
}
|
|
258
|
+
/** Attachment for user messages (images, files) */
|
|
259
|
+
interface MessageAttachment {
|
|
260
|
+
type: 'image' | 'file';
|
|
261
|
+
data: string;
|
|
262
|
+
mediaType?: string;
|
|
263
|
+
filename?: string;
|
|
264
|
+
savedPath?: string;
|
|
265
|
+
}
|
|
236
266
|
interface AgentRunOptions {
|
|
237
267
|
prompt: string;
|
|
268
|
+
/** Optional file/image attachments to include in the message */
|
|
269
|
+
attachments?: MessageAttachment[];
|
|
238
270
|
abortSignal?: AbortSignal;
|
|
239
271
|
/** Skip saving user message (if already saved externally) */
|
|
240
272
|
skipSaveUserMessage?: boolean;
|
|
@@ -258,10 +290,10 @@ interface AgentRunOptions {
|
|
|
258
290
|
onAbort?: (info: {
|
|
259
291
|
steps: unknown[];
|
|
260
292
|
}) => void;
|
|
261
|
-
/** Called when a tool (like bash) has progress to report
|
|
293
|
+
/** Called when a tool (like bash, write_file, or search) has progress to report */
|
|
262
294
|
onToolProgress?: (progress: {
|
|
263
295
|
toolName: string;
|
|
264
|
-
data: BashToolProgress;
|
|
296
|
+
data: BashToolProgress | WriteFileProgress | SearchToolProgress;
|
|
265
297
|
}) => void;
|
|
266
298
|
}
|
|
267
299
|
interface AgentStreamResult {
|
|
@@ -296,6 +328,10 @@ declare class Agent {
|
|
|
296
328
|
* Get session details
|
|
297
329
|
*/
|
|
298
330
|
getSession(): Session;
|
|
331
|
+
/**
|
|
332
|
+
* Build user message content from prompt and attachments
|
|
333
|
+
*/
|
|
334
|
+
private buildUserMessageContent;
|
|
299
335
|
/**
|
|
300
336
|
* Run the agent with a prompt (streaming)
|
|
301
337
|
*/
|
|
@@ -345,4 +381,4 @@ declare class Agent {
|
|
|
345
381
|
clearContext(): void;
|
|
346
382
|
}
|
|
347
383
|
|
|
348
|
-
export { Agent as A, ContextManager as C, 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 };
|
|
384
|
+
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 };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
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-BblbmG_0.js';
|
|
2
|
+
export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, S as SparkcoderConfig, T as ToolApprovalConfig } from './index-BblbmG_0.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, b as SessionConfig,
|
|
7
|
-
export { createLoadSkillTool, createReadFileTool, createTodoTool, createTools
|
|
8
|
-
export { c as createBashTool } from './
|
|
5
|
+
import { F as FileBackup, C as Checkpoint } from './schema-D_8A4k01.js';
|
|
6
|
+
export { a as Message, M as ModelMessage, S as Session, b as SessionConfig, i as Terminal, T as TodoItem, e as ToolExecution } from './schema-D_8A4k01.js';
|
|
7
|
+
export { createLoadSkillTool, createReadFileTool, createTodoTool, createTools } from './tools/index.js';
|
|
8
|
+
export { c as createBashTool, a as createWriteFileTool } from './search-ybREg7F_.js';
|
|
9
9
|
import 'ai';
|
|
10
10
|
import 'zod';
|
|
11
11
|
import 'hono/types';
|