sparkecoder 0.1.60 → 0.1.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/agent/index.d.ts +4 -3
  2. package/dist/agent/index.js +588 -176
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/cli.js +818 -95
  5. package/dist/cli.js.map +1 -1
  6. package/dist/db/index.d.ts +3 -2
  7. package/dist/db/index.js.map +1 -1
  8. package/dist/{index-Csad1Nx4.d.ts → index-DuGtMaAJ.d.ts} +85 -4
  9. package/dist/index.d.ts +6 -5
  10. package/dist/index.js +1202 -665
  11. package/dist/index.js.map +1 -1
  12. package/dist/schema-C7Mm4Ykn.d.ts +1410 -0
  13. package/dist/{search-BETuS1vh.d.ts → search-C_IFImt1.d.ts} +3 -3
  14. package/dist/server/index.js +605 -68
  15. package/dist/server/index.js.map +1 -1
  16. package/dist/tools/index.d.ts +38 -3
  17. package/dist/tools/index.js +230 -2
  18. package/dist/tools/index.js.map +1 -1
  19. package/package.json +5 -3
  20. package/web/.next/BUILD_ID +1 -1
  21. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  22. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  23. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  24. package/web/.next/standalone/web/.next/server/app/(main)/page.js.nft.json +1 -1
  25. package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
  26. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page.js.nft.json +1 -1
  27. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  29. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  34. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  37. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +2 -2
  38. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  39. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  41. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  43. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  44. package/web/.next/standalone/web/.next/server/app/api/config/route.js.nft.json +1 -1
  45. package/web/.next/standalone/web/.next/server/app/api/health/route.js.nft.json +1 -1
  46. package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +2 -2
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +2 -2
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +2 -2
  52. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +2 -2
  53. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  55. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
  56. package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  57. package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +2 -2
  60. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +2 -2
  61. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +2 -2
  63. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +2 -2
  64. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  66. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
  67. package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  69. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +2 -2
  70. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +2 -2
  71. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  72. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +2 -2
  73. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +2 -2
  74. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
  75. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  76. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
  77. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  78. package/web/.next/standalone/web/.next/server/app/docs.rsc +2 -2
  79. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +2 -2
  80. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  81. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  82. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  83. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  84. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  85. package/web/.next/standalone/web/.next/server/app/embed/[id]/page.js.nft.json +1 -1
  86. package/web/.next/standalone/web/.next/server/app/embed/[id]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  88. package/web/.next/standalone/web/.next/server/app/index.rsc +4 -4
  89. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +2 -2
  90. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +2 -2
  91. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
  92. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  93. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
  94. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  95. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_19289e11._.js → 2374f_03d22c16._.js} +1 -1
  96. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_b4b86c1f._.js → 2374f_0d0b1fb9._.js} +1 -1
  97. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4858a1ea._.js → 2374f_3f7d6d28._.js} +1 -1
  98. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_51385fed._.js → 2374f_6166d14d._.js} +1 -1
  99. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_40e35a02._.js → 2374f_67b9525f._.js} +1 -1
  100. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_fb95e3c9._.js → 2374f_6b436efc._.js} +1 -1
  101. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_2f0d9f6f._.js → 2374f_784d851c._.js} +1 -1
  102. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_35475cbe._.js → 2374f_976b2ded._.js} +1 -1
  103. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_7db22cde._.js → 2374f_98eba491._.js} +1 -1
  104. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_90b8e4fb._.js → 2374f_99b7b533._.js} +1 -1
  105. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_4666c827._.js → 2374f_a1a36483._.js} +1 -1
  106. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_076f03ec._.js → 2374f_b98835eb._.js} +1 -1
  107. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_b17fce11._.js → 2374f_e19eaecc._.js} +1 -1
  108. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_d8b9ce38._.js → 2374f_e3aec189._.js} +1 -1
  109. package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__7775f784._.js → [root-of-the-server]__4f176a16._.js} +2 -2
  110. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__d59f831d._.js +15 -0
  111. package/web/.next/standalone/web/.next/server/chunks/ssr/{web_645f4b90._.js → web_693f514e._.js} +2 -2
  112. package/web/.next/standalone/web/.next/server/chunks/ssr/web_a42a2651._.js +7 -0
  113. package/web/.next/standalone/web/.next/server/chunks/ssr/web_dc6ce793._.js +7 -0
  114. package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_components_sessions-sidebar_tsx_92510070._.js +1 -1
  115. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  116. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  117. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  118. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  119. package/web/.next/standalone/web/.next/static/chunks/0358a0e7a40cfb93.css +1 -0
  120. package/web/.next/standalone/web/.next/static/chunks/1ecde4c0d426a635.js +1 -0
  121. package/web/.next/standalone/web/.next/static/chunks/20e0fa99c7a1c1fc.js +13 -0
  122. package/web/.next/standalone/web/.next/static/chunks/36688a049d72e8ab.js +5 -0
  123. package/web/.next/standalone/web/.next/static/chunks/95436454a7559b0d.js +7 -0
  124. package/web/.next/standalone/web/.next/static/chunks/a751ca474cc46212.js +5 -0
  125. package/web/.next/standalone/web/.next/static/static/chunks/0358a0e7a40cfb93.css +1 -0
  126. package/web/.next/standalone/web/.next/static/static/chunks/1ecde4c0d426a635.js +1 -0
  127. package/web/.next/standalone/web/.next/static/static/chunks/20e0fa99c7a1c1fc.js +13 -0
  128. package/web/.next/standalone/web/.next/static/static/chunks/36688a049d72e8ab.js +5 -0
  129. package/web/.next/standalone/web/.next/static/static/chunks/95436454a7559b0d.js +7 -0
  130. package/web/.next/standalone/web/.next/static/static/chunks/a751ca474cc46212.js +5 -0
  131. package/web/.next/standalone/web/src/components/ai-elements/complete-task-tool.tsx +126 -0
  132. package/web/.next/standalone/web/src/components/chat-interface.tsx +68 -3
  133. package/web/.next/standalone/web/src/components/sessions-sidebar.tsx +18 -1
  134. package/web/.next/standalone/web/src/lib/api.ts +12 -0
  135. package/web/.next/static/chunks/0358a0e7a40cfb93.css +1 -0
  136. package/web/.next/static/chunks/1ecde4c0d426a635.js +1 -0
  137. package/web/.next/static/chunks/20e0fa99c7a1c1fc.js +13 -0
  138. package/web/.next/static/chunks/36688a049d72e8ab.js +5 -0
  139. package/web/.next/static/chunks/95436454a7559b0d.js +7 -0
  140. package/web/.next/static/chunks/a751ca474cc46212.js +5 -0
  141. package/dist/schema-NcQknWCg.d.ts +0 -295
  142. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__bd396152._.js +0 -15
  143. package/web/.next/standalone/web/.next/server/chunks/ssr/web_9c9f0e3b._.js +0 -7
  144. package/web/.next/standalone/web/.next/server/chunks/ssr/web_d08270f7._.js +0 -7
  145. package/web/.next/standalone/web/.next/static/chunks/2868b007ce5163fc.css +0 -1
  146. package/web/.next/standalone/web/.next/static/chunks/3f295b6960943c38.js +0 -1
  147. package/web/.next/standalone/web/.next/static/chunks/631b023d37a08635.js +0 -13
  148. package/web/.next/standalone/web/.next/static/chunks/a2b4737b190d1b54.js +0 -5
  149. package/web/.next/standalone/web/.next/static/chunks/e97212fcc8221479.js +0 -5
  150. package/web/.next/standalone/web/.next/static/chunks/f6e47c8a9766ce91.js +0 -7
  151. package/web/.next/standalone/web/.next/static/static/chunks/2868b007ce5163fc.css +0 -1
  152. package/web/.next/standalone/web/.next/static/static/chunks/3f295b6960943c38.js +0 -1
  153. package/web/.next/standalone/web/.next/static/static/chunks/631b023d37a08635.js +0 -13
  154. package/web/.next/standalone/web/.next/static/static/chunks/a2b4737b190d1b54.js +0 -5
  155. package/web/.next/standalone/web/.next/static/static/chunks/e97212fcc8221479.js +0 -5
  156. package/web/.next/standalone/web/.next/static/static/chunks/f6e47c8a9766ce91.js +0 -7
  157. package/web/.next/static/chunks/2868b007ce5163fc.css +0 -1
  158. package/web/.next/static/chunks/3f295b6960943c38.js +0 -1
  159. package/web/.next/static/chunks/631b023d37a08635.js +0 -13
  160. package/web/.next/static/chunks/a2b4737b190d1b54.js +0 -5
  161. package/web/.next/static/chunks/e97212fcc8221479.js +0 -5
  162. package/web/.next/static/chunks/f6e47c8a9766ce91.js +0 -7
  163. /package/web/.next/standalone/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_buildManifest.js +0 -0
  164. /package/web/.next/standalone/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_clientMiddlewareManifest.json +0 -0
  165. /package/web/.next/standalone/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_ssgManifest.js +0 -0
  166. /package/web/.next/standalone/web/.next/static/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_buildManifest.js +0 -0
  167. /package/web/.next/standalone/web/.next/static/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_clientMiddlewareManifest.json +0 -0
  168. /package/web/.next/standalone/web/.next/static/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_ssgManifest.js +0 -0
  169. /package/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_buildManifest.js +0 -0
  170. /package/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_clientMiddlewareManifest.json +0 -0
  171. /package/web/.next/static/{R5xiWSOp_Nqqe_js-LROo → 8zJH-RqrUQ3scBGbdaCmn}/_ssgManifest.js +0 -0
@@ -1,7 +1,40 @@
1
1
  import * as ai from 'ai';
2
2
  import { ToolSet } from 'ai';
3
- import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from '../search-BETuS1vh.js';
4
- export { b as BashToolOptions, d as SearchToolOptions, e as WriteFileToolOptions, c as createBashTool, f as createSearchTool, a as createWriteFileTool } from '../search-BETuS1vh.js';
3
+ import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from '../search-C_IFImt1.js';
4
+ export { b as BashToolOptions, d as SearchToolOptions, e as WriteFileToolOptions, c as createBashTool, f as createSearchTool, a as createWriteFileTool } from '../search-C_IFImt1.js';
5
+
6
+ interface TaskCompletionSignal {
7
+ status: 'completed' | 'failed';
8
+ result?: unknown;
9
+ error?: string;
10
+ }
11
+ interface CreateTaskToolsOptions {
12
+ outputSchema: Record<string, unknown>;
13
+ onComplete: (signal: TaskCompletionSignal) => void;
14
+ }
15
+ declare function createCompleteTaskTool(options: CreateTaskToolsOptions): ai.Tool<{
16
+ result: Record<string, unknown>;
17
+ }, {
18
+ status: string;
19
+ message: string;
20
+ errors: {
21
+ path: string;
22
+ message: string | undefined;
23
+ params: Record<string, any>;
24
+ }[] | undefined;
25
+ expectedSchema: Record<string, unknown>;
26
+ } | {
27
+ status: string;
28
+ message: string;
29
+ errors?: undefined;
30
+ expectedSchema?: undefined;
31
+ }>;
32
+ declare function createTaskFailedTool(options: Pick<CreateTaskToolsOptions, 'onComplete'>): ai.Tool<{
33
+ reason: string;
34
+ }, {
35
+ status: string;
36
+ message: string;
37
+ }>;
5
38
 
6
39
  interface ReadFileToolOptions {
7
40
  workingDirectory: string;
@@ -327,6 +360,8 @@ interface CreateToolsOptions {
327
360
  enableLSP?: boolean;
328
361
  /** Enable semantic search if configured (default: true) */
329
362
  enableSemanticSearch?: boolean;
363
+ /** Task mode: include complete_task and task_failed tools */
364
+ taskTools?: CreateTaskToolsOptions;
330
365
  }
331
366
  /**
332
367
  * Create all tools for an agent session
@@ -334,4 +369,4 @@ interface CreateToolsOptions {
334
369
  */
335
370
  declare function createTools(options: CreateToolsOptions): Promise<ToolSet>;
336
371
 
337
- export { BashToolProgress, type CodeGraphToolOptions, type CreateToolsOptions, type LinterToolOptions, type LoadSkillToolOptions, type ReadFileToolOptions, SearchToolProgress, type SemanticSearchResult, type SemanticSearchToolOptions, type TodoToolOptions, WriteFileProgress, createCodeGraphTool, createLinterTool, createLoadSkillTool, createReadFileTool, createSemanticSearchTool, createTodoTool, createTools };
372
+ export { BashToolProgress, type CodeGraphToolOptions, type CreateTaskToolsOptions, type CreateToolsOptions, type LinterToolOptions, type LoadSkillToolOptions, type ReadFileToolOptions, SearchToolProgress, type SemanticSearchResult, type SemanticSearchToolOptions, type TaskCompletionSignal, type TodoToolOptions, WriteFileProgress, createCodeGraphTool, createCompleteTaskTool, createLinterTool, createLoadSkillTool, createReadFileTool, createSemanticSearchTool, createTaskFailedTool, createTodoTool, createTools };
@@ -10,7 +10,7 @@ var __export = (target, all) => {
10
10
 
11
11
  // src/config/types.ts
12
12
  import { z } from "zod";
13
- var ToolApprovalConfigSchema, SkillMetadataSchema, SessionConfigSchema, VectorGatewayConfigSchema, RemoteServerConfigSchema, SparkcoderConfigSchema;
13
+ var ToolApprovalConfigSchema, SkillMetadataSchema, TaskConfigSchema, SessionConfigSchema, VectorGatewayConfigSchema, RemoteServerConfigSchema, SparkcoderConfigSchema;
14
14
  var init_types = __esm({
15
15
  "src/config/types.ts"() {
16
16
  "use strict";
@@ -29,11 +29,22 @@ var init_types = __esm({
29
29
  // Glob patterns - auto-inject when working with matching files
30
30
  globs: z.array(z.string()).optional().default([])
31
31
  });
32
+ TaskConfigSchema = z.object({
33
+ enabled: z.boolean(),
34
+ outputSchema: z.record(z.string(), z.unknown()),
35
+ webhookUrl: z.string().url().optional(),
36
+ maxIterations: z.number().optional(),
37
+ status: z.enum(["running", "completed", "failed"]),
38
+ result: z.unknown().optional(),
39
+ error: z.string().optional(),
40
+ iterations: z.number().optional()
41
+ });
32
42
  SessionConfigSchema = z.object({
33
43
  toolApprovals: z.record(z.string(), z.boolean()).optional(),
34
44
  approvalWebhook: z.string().url().optional(),
35
45
  skillsDirectory: z.string().optional(),
36
- maxContextChars: z.number().optional().default(2e5)
46
+ maxContextChars: z.number().optional().default(2e5),
47
+ task: TaskConfigSchema.optional()
37
48
  });
38
49
  VectorGatewayConfigSchema = z.object({
39
50
  // Redis cluster nodes URL for Vector Gateway (or use REDIS_CLUSTER_NODES env var)
@@ -2911,7 +2922,165 @@ import { nanoid as nanoid2 } from "nanoid";
2911
2922
 
2912
2923
  // src/agent/model.ts
2913
2924
  import { gateway } from "@ai-sdk/gateway";
2925
+
2926
+ // src/agent/remote-model.ts
2927
+ function serializePrompt(prompt) {
2928
+ return prompt.map((msg) => {
2929
+ if (!Array.isArray(msg.content)) return msg;
2930
+ return {
2931
+ ...msg,
2932
+ content: msg.content.map((part) => {
2933
+ if (part.type === "file" && part.data instanceof Uint8Array) {
2934
+ return {
2935
+ ...part,
2936
+ data: Buffer.from(part.data).toString("base64"),
2937
+ _base64: true
2938
+ };
2939
+ }
2940
+ return part;
2941
+ })
2942
+ };
2943
+ });
2944
+ }
2945
+ function deserializeValue(value) {
2946
+ if (value && typeof value === "object") {
2947
+ if (value.__uint8array && typeof value.data === "string") {
2948
+ return Buffer.from(value.data, "base64");
2949
+ }
2950
+ if (Array.isArray(value)) {
2951
+ return value.map(deserializeValue);
2952
+ }
2953
+ const result = {};
2954
+ for (const [k, v] of Object.entries(value)) {
2955
+ result[k] = deserializeValue(v);
2956
+ }
2957
+ return result;
2958
+ }
2959
+ return value;
2960
+ }
2961
+ function prepareOptions(options) {
2962
+ const { abortSignal, ...rest } = options;
2963
+ return {
2964
+ ...rest,
2965
+ prompt: serializePrompt(options.prompt)
2966
+ };
2967
+ }
2968
+ function createRemoteModel(modelId, config) {
2969
+ const baseUrl = config.url.replace(/\/$/, "");
2970
+ const headers = {
2971
+ "Content-Type": "application/json",
2972
+ "Authorization": `Bearer ${config.authKey}`
2973
+ };
2974
+ return {
2975
+ specificationVersion: "v3",
2976
+ provider: "remote-proxy",
2977
+ modelId,
2978
+ supportedUrls: {},
2979
+ async doGenerate(options) {
2980
+ const res = await fetch(`${baseUrl}/inference/generate`, {
2981
+ method: "POST",
2982
+ headers,
2983
+ body: JSON.stringify({
2984
+ modelId,
2985
+ options: prepareOptions(options)
2986
+ }),
2987
+ signal: options.abortSignal
2988
+ });
2989
+ if (!res.ok) {
2990
+ const err = await res.json().catch(() => ({}));
2991
+ throw new Error(
2992
+ `Remote inference failed (${res.status}): ${err.error || res.statusText}`
2993
+ );
2994
+ }
2995
+ const result = await res.json();
2996
+ return deserializeValue(result);
2997
+ },
2998
+ async doStream(options) {
2999
+ const res = await fetch(`${baseUrl}/inference/stream`, {
3000
+ method: "POST",
3001
+ headers,
3002
+ body: JSON.stringify({
3003
+ modelId,
3004
+ options: prepareOptions(options)
3005
+ }),
3006
+ signal: options.abortSignal
3007
+ });
3008
+ if (!res.ok) {
3009
+ const err = await res.json().catch(() => ({}));
3010
+ throw new Error(
3011
+ `Remote inference failed (${res.status}): ${err.error || res.statusText}`
3012
+ );
3013
+ }
3014
+ const reader = res.body.getReader();
3015
+ const decoder = new TextDecoder();
3016
+ let buffer = "";
3017
+ const stream = new ReadableStream({
3018
+ async pull(controller) {
3019
+ while (true) {
3020
+ const { done, value } = await reader.read();
3021
+ if (done) {
3022
+ if (buffer.trim()) {
3023
+ try {
3024
+ const parsed = deserializeValue(JSON.parse(buffer.trim()));
3025
+ if (parsed.type === "error") {
3026
+ controller.error(new Error(parsed.error));
3027
+ } else {
3028
+ controller.enqueue(parsed);
3029
+ }
3030
+ } catch {
3031
+ }
3032
+ }
3033
+ controller.close();
3034
+ return;
3035
+ }
3036
+ buffer += decoder.decode(value, { stream: true });
3037
+ const lines = buffer.split("\n");
3038
+ buffer = lines.pop() || "";
3039
+ for (const line of lines) {
3040
+ if (!line.trim()) continue;
3041
+ try {
3042
+ const parsed = deserializeValue(JSON.parse(line));
3043
+ if (parsed.type === "error") {
3044
+ controller.error(new Error(parsed.error));
3045
+ return;
3046
+ }
3047
+ controller.enqueue(parsed);
3048
+ } catch {
3049
+ }
3050
+ }
3051
+ }
3052
+ },
3053
+ cancel() {
3054
+ reader.cancel();
3055
+ }
3056
+ });
3057
+ const responseHeaders = {};
3058
+ res.headers.forEach((v, k) => {
3059
+ if (k.startsWith("x-upstream-")) {
3060
+ responseHeaders[k.replace("x-upstream-", "")] = v;
3061
+ }
3062
+ });
3063
+ return {
3064
+ stream,
3065
+ response: Object.keys(responseHeaders).length > 0 ? { headers: responseHeaders } : void 0
3066
+ };
3067
+ }
3068
+ };
3069
+ }
3070
+
3071
+ // src/agent/model.ts
3072
+ init_config();
2914
3073
  function resolveModel(modelId) {
3074
+ try {
3075
+ const config = getConfig();
3076
+ if (config.resolvedRemoteServer.isConfigured) {
3077
+ return createRemoteModel(modelId.trim(), {
3078
+ url: config.resolvedRemoteServer.url,
3079
+ authKey: config.resolvedRemoteServer.authKey
3080
+ });
3081
+ }
3082
+ } catch {
3083
+ }
2915
3084
  return gateway(modelId.trim());
2916
3085
  }
2917
3086
  var SUBAGENT_MODELS = {
@@ -4081,6 +4250,59 @@ Context: ${context}` : query;
4081
4250
 
4082
4251
  // src/tools/index.ts
4083
4252
  init_semantic_search();
4253
+
4254
+ // src/tools/task.ts
4255
+ import { tool as tool11 } from "ai";
4256
+ import { z as z12 } from "zod";
4257
+ import Ajv from "ajv";
4258
+ var ajv = new Ajv({ allErrors: true });
4259
+ function createCompleteTaskTool(options) {
4260
+ const validate = ajv.compile(options.outputSchema);
4261
+ return tool11({
4262
+ description: "Call this tool when you have completed the task. Pass the result as a JSON object matching the required output schema. If the result does not match the schema, you will receive validation errors and should fix and retry.",
4263
+ inputSchema: z12.object({
4264
+ result: z12.record(z12.string(), z12.unknown()).describe("The task result as a JSON object matching the output schema")
4265
+ }),
4266
+ execute: async (input) => {
4267
+ const valid = validate(input.result);
4268
+ if (!valid) {
4269
+ const errors = validate.errors?.map((e) => ({
4270
+ path: e.instancePath || "/",
4271
+ message: e.message,
4272
+ params: e.params
4273
+ }));
4274
+ return {
4275
+ status: "validation_error",
4276
+ message: "The result does not match the required output schema. Fix the errors and call complete_task again.",
4277
+ errors,
4278
+ expectedSchema: options.outputSchema
4279
+ };
4280
+ }
4281
+ options.onComplete({ status: "completed", result: input.result });
4282
+ return {
4283
+ status: "completed",
4284
+ message: "Task completed successfully."
4285
+ };
4286
+ }
4287
+ });
4288
+ }
4289
+ function createTaskFailedTool(options) {
4290
+ return tool11({
4291
+ description: "Call this tool if you are unable to complete the task. Provide a clear reason explaining why the task cannot be completed.",
4292
+ inputSchema: z12.object({
4293
+ reason: z12.string().describe("Explanation of why the task cannot be completed")
4294
+ }),
4295
+ execute: async (input) => {
4296
+ options.onComplete({ status: "failed", error: input.reason });
4297
+ return {
4298
+ status: "failed",
4299
+ message: `Task marked as failed: ${input.reason}`
4300
+ };
4301
+ }
4302
+ });
4303
+ }
4304
+
4305
+ // src/tools/index.ts
4084
4306
  init_semantic();
4085
4307
  init_semantic_search();
4086
4308
  async function createTools(options) {
@@ -4132,16 +4354,22 @@ async function createTools(options) {
4132
4354
  } catch {
4133
4355
  }
4134
4356
  }
4357
+ if (options.taskTools) {
4358
+ tools.complete_task = createCompleteTaskTool(options.taskTools);
4359
+ tools.task_failed = createTaskFailedTool(options.taskTools);
4360
+ }
4135
4361
  return tools;
4136
4362
  }
4137
4363
  export {
4138
4364
  createBashTool,
4139
4365
  createCodeGraphTool,
4366
+ createCompleteTaskTool,
4140
4367
  createLinterTool,
4141
4368
  createLoadSkillTool,
4142
4369
  createReadFileTool,
4143
4370
  createSearchTool,
4144
4371
  createSemanticSearchTool,
4372
+ createTaskFailedTool,
4145
4373
  createTodoTool,
4146
4374
  createTools,
4147
4375
  createWriteFileTool