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.
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +19 -3
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +73 -15
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/{index-DT1l57s0.d.ts → index-OhuTM4a0.d.ts} +6 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +71 -14
- package/dist/index.js.map +1 -1
- package/dist/{schema-XcP0dedO.d.ts → schema-CohdIL13.d.ts} +1 -0
- package/dist/server/index.js +71 -14
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/_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.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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 +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/web/package-lock.json +3 -3
- package/web/.next/standalone/web/src/lib/api.ts +1 -0
- /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
- /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
- /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 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(),
|
|
@@ -7584,7 +7585,7 @@ function repairToolPairing(messages) {
|
|
|
7584
7585
|
const orphanedResults = new Set([...toolResultIds].filter((id) => !toolCallIds.has(id)));
|
|
7585
7586
|
if (orphanedCalls.size === 0 && orphanedResults.size === 0) return messages;
|
|
7586
7587
|
if (orphanedCalls.size > 0) {
|
|
7587
|
-
console.warn(`[tool-repair]
|
|
7588
|
+
console.warn(`[tool-repair] Injecting ${orphanedCalls.size} synthetic tool-result(s) for orphaned call(s): ${[...orphanedCalls].join(", ")}`);
|
|
7588
7589
|
}
|
|
7589
7590
|
if (orphanedResults.size > 0) {
|
|
7590
7591
|
console.warn(`[tool-repair] Removing ${orphanedResults.size} orphaned tool-result(s) with no matching call`);
|
|
@@ -7596,12 +7597,27 @@ function repairToolPairing(messages) {
|
|
|
7596
7597
|
continue;
|
|
7597
7598
|
}
|
|
7598
7599
|
const parts = msg.content.filter((part) => {
|
|
7599
|
-
if (part.type === "tool-call" && orphanedCalls.has(part.toolCallId)) return false;
|
|
7600
7600
|
if (part.type === "tool-result" && orphanedResults.has(part.toolCallId)) return false;
|
|
7601
7601
|
return true;
|
|
7602
7602
|
});
|
|
7603
7603
|
if (parts.length === 0) continue;
|
|
7604
7604
|
repaired.push({ ...msg, content: parts });
|
|
7605
|
+
if (msg.role === "assistant") {
|
|
7606
|
+
const callsNeedingResults = parts.filter(
|
|
7607
|
+
(part) => part.type === "tool-call" && orphanedCalls.has(part.toolCallId)
|
|
7608
|
+
);
|
|
7609
|
+
if (callsNeedingResults.length > 0) {
|
|
7610
|
+
repaired.push({
|
|
7611
|
+
role: "tool",
|
|
7612
|
+
content: callsNeedingResults.map((call) => ({
|
|
7613
|
+
type: "tool-result",
|
|
7614
|
+
toolCallId: call.toolCallId,
|
|
7615
|
+
toolName: call.toolName || "unknown",
|
|
7616
|
+
output: { type: "text", value: "[No result \u2014 tool execution was interrupted, never completed, or was stripped for brevity]" }
|
|
7617
|
+
}))
|
|
7618
|
+
});
|
|
7619
|
+
}
|
|
7620
|
+
}
|
|
7605
7621
|
}
|
|
7606
7622
|
return repaired;
|
|
7607
7623
|
}
|
|
@@ -10829,7 +10845,8 @@ var createTaskSchema = z19.object({
|
|
|
10829
10845
|
model: z19.string().optional(),
|
|
10830
10846
|
workingDirectory: z19.string().optional(),
|
|
10831
10847
|
name: z19.string().optional(),
|
|
10832
|
-
maxIterations: z19.number().int().min(1).max(500).optional()
|
|
10848
|
+
maxIterations: z19.number().int().min(1).max(500).optional(),
|
|
10849
|
+
parentTaskId: z19.string().optional()
|
|
10833
10850
|
});
|
|
10834
10851
|
tasks.post(
|
|
10835
10852
|
"/",
|
|
@@ -10842,17 +10859,52 @@ tasks.post(
|
|
|
10842
10859
|
outputSchema: body.outputSchema,
|
|
10843
10860
|
webhookUrl: body.webhookUrl,
|
|
10844
10861
|
maxIterations: body.maxIterations ?? 50,
|
|
10845
|
-
status: "running"
|
|
10862
|
+
status: "running",
|
|
10863
|
+
parentTaskId: body.parentTaskId
|
|
10846
10864
|
};
|
|
10847
|
-
|
|
10848
|
-
|
|
10849
|
-
|
|
10850
|
-
|
|
10851
|
-
|
|
10852
|
-
|
|
10853
|
-
|
|
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}`);
|
|
10854
10896
|
}
|
|
10855
|
-
}
|
|
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
|
+
}
|
|
10856
10908
|
const taskId = agent.sessionId;
|
|
10857
10909
|
const abortController = new AbortController();
|
|
10858
10910
|
taskAbortControllers.set(taskId, abortController);
|
|
@@ -10924,7 +10976,11 @@ tasks.post(
|
|
|
10924
10976
|
return readable;
|
|
10925
10977
|
};
|
|
10926
10978
|
await streamContext.resumableStream(streamId, taskStreamProducer);
|
|
10927
|
-
return c.json({
|
|
10979
|
+
return c.json({
|
|
10980
|
+
taskId,
|
|
10981
|
+
status: "running",
|
|
10982
|
+
...body.parentTaskId ? { parentTaskId: body.parentTaskId } : {}
|
|
10983
|
+
}, 201);
|
|
10928
10984
|
}
|
|
10929
10985
|
);
|
|
10930
10986
|
tasks.get("/:id", async (c) => {
|
|
@@ -10954,6 +11010,7 @@ tasks.get("/:id", async (c) => {
|
|
|
10954
11010
|
iterations: task.iterations,
|
|
10955
11011
|
model: session.model,
|
|
10956
11012
|
name: session.name,
|
|
11013
|
+
parentTaskId: task.parentTaskId,
|
|
10957
11014
|
createdAt: session.createdAt.toISOString(),
|
|
10958
11015
|
updatedAt: session.updatedAt.toISOString(),
|
|
10959
11016
|
browserRecordings: browserRecordings.length > 0 ? browserRecordings : void 0
|
|
@@ -12626,7 +12683,7 @@ program.command("server").description("Start the SparkECoder server (API + Web U
|
|
|
12626
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) => {
|
|
12627
12684
|
await runChat(options);
|
|
12628
12685
|
});
|
|
12629
|
-
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) => {
|
|
12630
12687
|
await ensureDependencies({ quiet: true });
|
|
12631
12688
|
loadApiKeysIntoEnv();
|
|
12632
12689
|
const baseUrl = `http://${options.host}:${options.port}`;
|
|
@@ -12674,6 +12731,7 @@ program.command("task").description("Run an autonomous task that completes witho
|
|
|
12674
12731
|
if (options.model) body.model = options.model;
|
|
12675
12732
|
if (options.workingDir) body.workingDirectory = options.workingDir;
|
|
12676
12733
|
if (options.name) body.name = options.name;
|
|
12734
|
+
if (options.parentTask) body.parentTaskId = options.parentTask;
|
|
12677
12735
|
const spinner = ora("Creating task...").start();
|
|
12678
12736
|
const response = await apiRequest(baseUrl, "/tasks", {
|
|
12679
12737
|
method: "POST",
|