sparkecoder 0.1.79 → 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 +2 -1
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/cli.js +56 -13
  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 +54 -12
  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 +54 -12
  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/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
  86. /package/web/.next/standalone/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
  87. /package/web/.next/standalone/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
  88. /package/web/.next/standalone/web/.next/static/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
  89. /package/web/.next/standalone/web/.next/static/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
  90. /package/web/.next/standalone/web/.next/static/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
  91. /package/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
  92. /package/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
  93. /package/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -524,7 +524,8 @@ var init_types = __esm({
524
524
  status: z.enum(["running", "completed", "failed"]),
525
525
  result: z.unknown().optional(),
526
526
  error: z.string().optional(),
527
- iterations: z.number().optional()
527
+ iterations: z.number().optional(),
528
+ parentTaskId: z.string().optional()
528
529
  });
529
530
  SessionConfigSchema = z.object({
530
531
  toolApprovals: z.record(z.string(), z.boolean()).optional(),
@@ -10844,7 +10845,8 @@ var createTaskSchema = z19.object({
10844
10845
  model: z19.string().optional(),
10845
10846
  workingDirectory: z19.string().optional(),
10846
10847
  name: z19.string().optional(),
10847
- maxIterations: z19.number().int().min(1).max(500).optional()
10848
+ maxIterations: z19.number().int().min(1).max(500).optional(),
10849
+ parentTaskId: z19.string().optional()
10848
10850
  });
10849
10851
  tasks.post(
10850
10852
  "/",
@@ -10857,17 +10859,52 @@ tasks.post(
10857
10859
  outputSchema: body.outputSchema,
10858
10860
  webhookUrl: body.webhookUrl,
10859
10861
  maxIterations: body.maxIterations ?? 50,
10860
- status: "running"
10862
+ status: "running",
10863
+ parentTaskId: body.parentTaskId
10861
10864
  };
10862
- const agent = await Agent.create({
10863
- name: body.name || "Task",
10864
- workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,
10865
- model: body.model || config.defaultModel,
10866
- sessionConfig: {
10867
- toolApprovals: { bash: false, write_file: false, read_file: false },
10868
- task: taskConfig
10865
+ let agent;
10866
+ if (body.parentTaskId) {
10867
+ const parentSession = await sessionQueries.getById(body.parentTaskId);
10868
+ if (!parentSession) {
10869
+ return c.json({ error: "Parent task not found" }, 404);
10870
+ }
10871
+ const parentTask = parentSession.config?.task;
10872
+ if (!parentTask?.enabled) {
10873
+ return c.json({ error: "Parent session is not a task" }, 400);
10874
+ }
10875
+ if (parentTask.status === "running") {
10876
+ return c.json({ error: "Parent task is still running. Wait for it to complete before chaining." }, 409);
10877
+ }
10878
+ const parentStream = await activeStreamQueries.getBySessionId(body.parentTaskId);
10879
+ if (parentStream) {
10880
+ return c.json({ error: "Parent task has an active stream" }, 409);
10881
+ }
10882
+ agent = await Agent.create({
10883
+ name: body.name || "Task",
10884
+ workingDirectory: body.workingDirectory || parentSession.workingDirectory,
10885
+ model: body.model || parentSession.model,
10886
+ sessionConfig: {
10887
+ toolApprovals: { bash: false, write_file: false, read_file: false },
10888
+ task: taskConfig
10889
+ }
10890
+ });
10891
+ const parentMessages = await messageQueries.getBySession(body.parentTaskId);
10892
+ if (parentMessages.length > 0) {
10893
+ const modelMessages = parentMessages.map((m) => m.modelMessage);
10894
+ await messageQueries.addMany(agent.sessionId, modelMessages);
10895
+ console.log(`[TASK] Copied ${modelMessages.length} messages from parent ${body.parentTaskId} to ${agent.sessionId}`);
10869
10896
  }
10870
- });
10897
+ } else {
10898
+ agent = await Agent.create({
10899
+ name: body.name || "Task",
10900
+ workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,
10901
+ model: body.model || config.defaultModel,
10902
+ sessionConfig: {
10903
+ toolApprovals: { bash: false, write_file: false, read_file: false },
10904
+ task: taskConfig
10905
+ }
10906
+ });
10907
+ }
10871
10908
  const taskId = agent.sessionId;
10872
10909
  const abortController = new AbortController();
10873
10910
  taskAbortControllers.set(taskId, abortController);
@@ -10939,7 +10976,11 @@ tasks.post(
10939
10976
  return readable;
10940
10977
  };
10941
10978
  await streamContext.resumableStream(streamId, taskStreamProducer);
10942
- return c.json({ taskId, status: "running" }, 201);
10979
+ return c.json({
10980
+ taskId,
10981
+ status: "running",
10982
+ ...body.parentTaskId ? { parentTaskId: body.parentTaskId } : {}
10983
+ }, 201);
10943
10984
  }
10944
10985
  );
10945
10986
  tasks.get("/:id", async (c) => {
@@ -10969,6 +11010,7 @@ tasks.get("/:id", async (c) => {
10969
11010
  iterations: task.iterations,
10970
11011
  model: session.model,
10971
11012
  name: session.name,
11013
+ parentTaskId: task.parentTaskId,
10972
11014
  createdAt: session.createdAt.toISOString(),
10973
11015
  updatedAt: session.updatedAt.toISOString(),
10974
11016
  browserRecordings: browserRecordings.length > 0 ? browserRecordings : void 0
@@ -12641,7 +12683,7 @@ program.command("server").description("Start the SparkECoder server (API + Web U
12641
12683
  program.command("chat").description("Start an interactive chat session").option("-s, --session <id>", "Resume an existing session").option("-n, --name <name>", "Name for the new session").option("-m, --model <model>", "Model to use").option("-w, --working-dir <path>", "Working directory").option("-c, --config <path>", "Path to config file").option("-p, --port <port>", "Server port", "3141").option("-H, --host <host>", "Server host", "127.0.0.1").option("--no-auto-start", "Do not auto-start server if not running").option("--web-port <port>", "Web UI port", "6969").option("--no-web", "Do not start web UI when auto-starting server").option("--public-url <url>", "Public URL for web UI to connect to API (for Docker/remote access)").option("-v, --verbose", "Enable verbose logging for web server").option("--dangerously-skip-approvals", "Auto-approve all tool calls (no confirmation prompts)").action(async (options) => {
12642
12684
  await runChat(options);
12643
12685
  });
12644
- program.command("task").description("Run an autonomous task that completes without human interaction").requiredOption("--prompt <prompt>", "Task prompt describing what to do").requiredOption("--schema <schema>", "JSON Schema for the output (file path or inline JSON string)").option("--webhook <url>", "Webhook URL to receive task events").option("-m, --model <model>", "Model to use").option("-w, --working-dir <path>", "Working directory").option("-n, --name <name>", "Name for the task").option("--max-iterations <n>", "Maximum agent loop iterations", "50").option("-p, --port <port>", "Server port", "3141").option("-H, --host <host>", "Server host", "127.0.0.1").option("-c, --config <path>", "Path to config file").option("--no-auto-start", "Do not auto-start server if not running").option("--wait", "Block and poll until task completes").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
12686
+ program.command("task").description("Run an autonomous task that completes without human interaction").requiredOption("--prompt <prompt>", "Task prompt describing what to do").requiredOption("--schema <schema>", "JSON Schema for the output (file path or inline JSON string)").option("--webhook <url>", "Webhook URL to receive task events").option("-m, --model <model>", "Model to use").option("-w, --working-dir <path>", "Working directory").option("-n, --name <name>", "Name for the task").option("--max-iterations <n>", "Maximum agent loop iterations", "50").option("-p, --port <port>", "Server port", "3141").option("-H, --host <host>", "Server host", "127.0.0.1").option("-c, --config <path>", "Path to config file").option("--no-auto-start", "Do not auto-start server if not running").option("--parent-task <id>", "Continue from a previous task (inherits its full conversation context)").option("--wait", "Block and poll until task completes").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
12645
12687
  await ensureDependencies({ quiet: true });
12646
12688
  loadApiKeysIntoEnv();
12647
12689
  const baseUrl = `http://${options.host}:${options.port}`;
@@ -12689,6 +12731,7 @@ program.command("task").description("Run an autonomous task that completes witho
12689
12731
  if (options.model) body.model = options.model;
12690
12732
  if (options.workingDir) body.workingDirectory = options.workingDir;
12691
12733
  if (options.name) body.name = options.name;
12734
+ if (options.parentTask) body.parentTaskId = options.parentTask;
12692
12735
  const spinner = ora("Creating task...").start();
12693
12736
  const response = await apiRequest(baseUrl, "/tasks", {
12694
12737
  method: "POST",