sparkecoder 0.1.78 → 0.1.80

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 (93) hide show
  1. package/dist/agent/index.d.ts +2 -2
  2. package/dist/agent/index.js +19 -3
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/cli.js +73 -15
  5. package/dist/cli.js.map +1 -1
  6. package/dist/db/index.d.ts +2 -2
  7. package/dist/{index-DT1l57s0.d.ts → index-OhuTM4a0.d.ts} +6 -1
  8. package/dist/index.d.ts +4 -4
  9. package/dist/index.js +71 -14
  10. package/dist/index.js.map +1 -1
  11. package/dist/{schema-XcP0dedO.d.ts → schema-CohdIL13.d.ts} +1 -0
  12. package/dist/server/index.js +71 -14
  13. package/dist/server/index.js.map +1 -1
  14. package/dist/tools/index.js +2 -1
  15. package/dist/tools/index.js.map +1 -1
  16. package/package.json +1 -1
  17. package/web/.next/BUILD_ID +1 -1
  18. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  19. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  20. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  21. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  22. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  23. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  24. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  25. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  26. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  27. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  29. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  34. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  36. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  37. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
  38. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
  39. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
  41. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
  43. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  44. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
  45. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  46. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
  48. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  49. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
  50. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  52. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  55. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
  56. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
  57. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
  59. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
  60. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
  61. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  64. package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
  66. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  67. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
  68. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  69. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  70. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  71. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  72. package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
  73. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
  74. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
  75. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  76. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  77. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  78. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  79. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  80. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  81. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  82. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  83. package/web/.next/standalone/web/package-lock.json +3 -3
  84. package/web/.next/standalone/web/src/lib/api.ts +1 -0
  85. /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
  86. /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
  87. /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
  88. /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
  89. /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
  90. /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
  91. /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
  92. /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
  93. /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
- import { C as Checkpoint, F as FileBackup, M as ModelMessage, a as Message, S as Session, L as LoadedSkill, T as TodoItem, b as ToolExecution, A as ActiveStream, I as IndexStatusRecord, c as IndexedChunk, d as SubagentExecution, e as SubagentStep, f as Terminal } from '../schema-XcP0dedO.js';
2
- export { N as NewActiveStream, g as NewCheckpoint, h as NewFileBackup, i as NewIndexStatusRecord, j as NewIndexedChunk, k as NewMessage, l as NewSession, m as NewSubagentExecution, n as NewTerminal, o as NewTodoItem, p as NewToolExecution, q as SessionConfig, r as TaskConfig, U as UserContentPart, s as UserFilePart, t as UserImagePart, u as UserModelMessage, v as UserTextPart } from '../schema-XcP0dedO.js';
1
+ import { C as Checkpoint, F as FileBackup, M as ModelMessage, a as Message, S as Session, L as LoadedSkill, T as TodoItem, b as ToolExecution, A as ActiveStream, I as IndexStatusRecord, c as IndexedChunk, d as SubagentExecution, e as SubagentStep, f as Terminal } from '../schema-CohdIL13.js';
2
+ export { N as NewActiveStream, g as NewCheckpoint, h as NewFileBackup, i as NewIndexStatusRecord, j as NewIndexedChunk, k as NewMessage, l as NewSession, m as NewSubagentExecution, n as NewTerminal, o as NewTodoItem, p as NewToolExecution, q as SessionConfig, r as TaskConfig, U as UserContentPart, s as UserFilePart, t as UserImagePart, u as UserModelMessage, v as UserTextPart } from '../schema-CohdIL13.js';
3
3
  import 'drizzle-orm/sqlite-core';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { ModelMessage, streamText } from 'ai';
2
- import { S as Session, b as ToolExecution, r as TaskConfig } from './schema-XcP0dedO.js';
2
+ import { S as Session, b as ToolExecution, r as TaskConfig } from './schema-CohdIL13.js';
3
3
  import { z } from 'zod';
4
4
  import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from './search-CCffrVJE.js';
5
5
 
@@ -36,6 +36,7 @@ declare const SessionConfigSchema: z.ZodObject<{
36
36
  result: z.ZodOptional<z.ZodUnknown>;
37
37
  error: z.ZodOptional<z.ZodString>;
38
38
  iterations: z.ZodOptional<z.ZodNumber>;
39
+ parentTaskId: z.ZodOptional<z.ZodString>;
39
40
  }, "strip", z.ZodTypeAny, {
40
41
  status: "completed" | "failed" | "running";
41
42
  outputSchema: Record<string, unknown>;
@@ -43,6 +44,7 @@ declare const SessionConfigSchema: z.ZodObject<{
43
44
  error?: string | undefined;
44
45
  maxIterations?: number | undefined;
45
46
  webhookUrl?: string | undefined;
47
+ parentTaskId?: string | undefined;
46
48
  result?: unknown;
47
49
  iterations?: number | undefined;
48
50
  }, {
@@ -52,6 +54,7 @@ declare const SessionConfigSchema: z.ZodObject<{
52
54
  error?: string | undefined;
53
55
  maxIterations?: number | undefined;
54
56
  webhookUrl?: string | undefined;
57
+ parentTaskId?: string | undefined;
55
58
  result?: unknown;
56
59
  iterations?: number | undefined;
57
60
  }>>;
@@ -66,6 +69,7 @@ declare const SessionConfigSchema: z.ZodObject<{
66
69
  error?: string | undefined;
67
70
  maxIterations?: number | undefined;
68
71
  webhookUrl?: string | undefined;
72
+ parentTaskId?: string | undefined;
69
73
  result?: unknown;
70
74
  iterations?: number | undefined;
71
75
  } | undefined;
@@ -80,6 +84,7 @@ declare const SessionConfigSchema: z.ZodObject<{
80
84
  error?: string | undefined;
81
85
  maxIterations?: number | undefined;
82
86
  webhookUrl?: string | undefined;
87
+ parentTaskId?: string | undefined;
83
88
  result?: unknown;
84
89
  iterations?: number | undefined;
85
90
  } | undefined;
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { R as ResolvedConfig } from './index-DT1l57s0.js';
2
- export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, S as SparkcoderConfig, T as ToolApprovalConfig } from './index-DT1l57s0.js';
1
+ import { R as ResolvedConfig } from './index-OhuTM4a0.js';
2
+ export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, S as SparkcoderConfig, T as ToolApprovalConfig } from './index-OhuTM4a0.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-XcP0dedO.js';
6
- export { a as Message, M as ModelMessage, S as Session, q as SessionConfig, f as Terminal, T as TodoItem, b as ToolExecution } from './schema-XcP0dedO.js';
5
+ import { F as FileBackup, C as Checkpoint } from './schema-CohdIL13.js';
6
+ export { a as Message, M as ModelMessage, S as Session, q as SessionConfig, f as Terminal, T as TodoItem, b as ToolExecution } from './schema-CohdIL13.js';
7
7
  export { createLoadSkillTool, createReadFileTool, createTodoTool, createTools } from './tools/index.js';
8
8
  export { c as createBashTool, a as createWriteFileTool } from './search-CCffrVJE.js';
9
9
  import 'ai';
package/dist/index.js CHANGED
@@ -37,7 +37,8 @@ var init_types = __esm({
37
37
  status: z.enum(["running", "completed", "failed"]),
38
38
  result: z.unknown().optional(),
39
39
  error: z.string().optional(),
40
- iterations: z.number().optional()
40
+ iterations: z.number().optional(),
41
+ parentTaskId: z.string().optional()
41
42
  });
42
43
  SessionConfigSchema = z.object({
43
44
  toolApprovals: z.record(z.string(), z.boolean()).optional(),
@@ -6801,7 +6802,7 @@ function repairToolPairing(messages) {
6801
6802
  const orphanedResults = new Set([...toolResultIds].filter((id) => !toolCallIds.has(id)));
6802
6803
  if (orphanedCalls.size === 0 && orphanedResults.size === 0) return messages;
6803
6804
  if (orphanedCalls.size > 0) {
6804
- console.warn(`[tool-repair] Removing ${orphanedCalls.size} orphaned tool-call(s) with no matching result`);
6805
+ console.warn(`[tool-repair] Injecting ${orphanedCalls.size} synthetic tool-result(s) for orphaned call(s): ${[...orphanedCalls].join(", ")}`);
6805
6806
  }
6806
6807
  if (orphanedResults.size > 0) {
6807
6808
  console.warn(`[tool-repair] Removing ${orphanedResults.size} orphaned tool-result(s) with no matching call`);
@@ -6813,12 +6814,27 @@ function repairToolPairing(messages) {
6813
6814
  continue;
6814
6815
  }
6815
6816
  const parts = msg.content.filter((part) => {
6816
- if (part.type === "tool-call" && orphanedCalls.has(part.toolCallId)) return false;
6817
6817
  if (part.type === "tool-result" && orphanedResults.has(part.toolCallId)) return false;
6818
6818
  return true;
6819
6819
  });
6820
6820
  if (parts.length === 0) continue;
6821
6821
  repaired.push({ ...msg, content: parts });
6822
+ if (msg.role === "assistant") {
6823
+ const callsNeedingResults = parts.filter(
6824
+ (part) => part.type === "tool-call" && orphanedCalls.has(part.toolCallId)
6825
+ );
6826
+ if (callsNeedingResults.length > 0) {
6827
+ repaired.push({
6828
+ role: "tool",
6829
+ content: callsNeedingResults.map((call) => ({
6830
+ type: "tool-result",
6831
+ toolCallId: call.toolCallId,
6832
+ toolName: call.toolName || "unknown",
6833
+ output: { type: "text", value: "[No result \u2014 tool execution was interrupted, never completed, or was stripped for brevity]" }
6834
+ }))
6835
+ });
6836
+ }
6837
+ }
6822
6838
  }
6823
6839
  return repaired;
6824
6840
  }
@@ -10066,7 +10082,8 @@ var createTaskSchema = z19.object({
10066
10082
  model: z19.string().optional(),
10067
10083
  workingDirectory: z19.string().optional(),
10068
10084
  name: z19.string().optional(),
10069
- maxIterations: z19.number().int().min(1).max(500).optional()
10085
+ maxIterations: z19.number().int().min(1).max(500).optional(),
10086
+ parentTaskId: z19.string().optional()
10070
10087
  });
10071
10088
  tasks.post(
10072
10089
  "/",
@@ -10079,17 +10096,52 @@ tasks.post(
10079
10096
  outputSchema: body.outputSchema,
10080
10097
  webhookUrl: body.webhookUrl,
10081
10098
  maxIterations: body.maxIterations ?? 50,
10082
- status: "running"
10099
+ status: "running",
10100
+ parentTaskId: body.parentTaskId
10083
10101
  };
10084
- const agent = await Agent.create({
10085
- name: body.name || "Task",
10086
- workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,
10087
- model: body.model || config.defaultModel,
10088
- sessionConfig: {
10089
- toolApprovals: { bash: false, write_file: false, read_file: false },
10090
- task: taskConfig
10102
+ let agent;
10103
+ if (body.parentTaskId) {
10104
+ const parentSession = await sessionQueries.getById(body.parentTaskId);
10105
+ if (!parentSession) {
10106
+ return c.json({ error: "Parent task not found" }, 404);
10107
+ }
10108
+ const parentTask = parentSession.config?.task;
10109
+ if (!parentTask?.enabled) {
10110
+ return c.json({ error: "Parent session is not a task" }, 400);
10111
+ }
10112
+ if (parentTask.status === "running") {
10113
+ return c.json({ error: "Parent task is still running. Wait for it to complete before chaining." }, 409);
10114
+ }
10115
+ const parentStream = await activeStreamQueries.getBySessionId(body.parentTaskId);
10116
+ if (parentStream) {
10117
+ return c.json({ error: "Parent task has an active stream" }, 409);
10118
+ }
10119
+ agent = await Agent.create({
10120
+ name: body.name || "Task",
10121
+ workingDirectory: body.workingDirectory || parentSession.workingDirectory,
10122
+ model: body.model || parentSession.model,
10123
+ sessionConfig: {
10124
+ toolApprovals: { bash: false, write_file: false, read_file: false },
10125
+ task: taskConfig
10126
+ }
10127
+ });
10128
+ const parentMessages = await messageQueries.getBySession(body.parentTaskId);
10129
+ if (parentMessages.length > 0) {
10130
+ const modelMessages = parentMessages.map((m) => m.modelMessage);
10131
+ await messageQueries.addMany(agent.sessionId, modelMessages);
10132
+ console.log(`[TASK] Copied ${modelMessages.length} messages from parent ${body.parentTaskId} to ${agent.sessionId}`);
10091
10133
  }
10092
- });
10134
+ } else {
10135
+ agent = await Agent.create({
10136
+ name: body.name || "Task",
10137
+ workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,
10138
+ model: body.model || config.defaultModel,
10139
+ sessionConfig: {
10140
+ toolApprovals: { bash: false, write_file: false, read_file: false },
10141
+ task: taskConfig
10142
+ }
10143
+ });
10144
+ }
10093
10145
  const taskId = agent.sessionId;
10094
10146
  const abortController = new AbortController();
10095
10147
  taskAbortControllers.set(taskId, abortController);
@@ -10161,7 +10213,11 @@ tasks.post(
10161
10213
  return readable;
10162
10214
  };
10163
10215
  await streamContext.resumableStream(streamId, taskStreamProducer);
10164
- return c.json({ taskId, status: "running" }, 201);
10216
+ return c.json({
10217
+ taskId,
10218
+ status: "running",
10219
+ ...body.parentTaskId ? { parentTaskId: body.parentTaskId } : {}
10220
+ }, 201);
10165
10221
  }
10166
10222
  );
10167
10223
  tasks.get("/:id", async (c) => {
@@ -10191,6 +10247,7 @@ tasks.get("/:id", async (c) => {
10191
10247
  iterations: task.iterations,
10192
10248
  model: session.model,
10193
10249
  name: session.name,
10250
+ parentTaskId: task.parentTaskId,
10194
10251
  createdAt: session.createdAt.toISOString(),
10195
10252
  updatedAt: session.updatedAt.toISOString(),
10196
10253
  browserRecordings: browserRecordings.length > 0 ? browserRecordings : void 0