sparkecoder 0.1.79 → 0.1.81
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 +21 -6
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +75 -18
- 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 +73 -17
- package/dist/index.js.map +1 -1
- package/dist/{schema-XcP0dedO.d.ts → schema-CohdIL13.d.ts} +1 -0
- package/dist/server/index.js +73 -17
- package/dist/server/index.js.map +1 -1
- package/dist/skills/default/browser.md +11 -2
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/src/skills/default/browser.md +11 -2
- 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/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_ssgManifest.js +0 -0
- /package/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_buildManifest.js +0 -0
- /package/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{mEI-vdO1YIKdN2l_2MTLR → CAGGCb0khU_QcA3lh6Rk6}/_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(),
|
|
@@ -7108,11 +7109,25 @@ Before calling \`complete_task\`, you MUST verify your work completely. Do not j
|
|
|
7108
7109
|
- If something doesn't look right, fix it \u2014 don't complete with known issues.
|
|
7109
7110
|
|
|
7110
7111
|
**Screenshot your completed work:**
|
|
7111
|
-
- After completing a task, take a screenshot of the result when it makes sense (UI changes browser pages, etc.).
|
|
7112
|
-
-
|
|
7113
|
-
|
|
7114
|
-
-
|
|
7115
|
-
|
|
7112
|
+
- After completing a task, take a screenshot of the result when it makes sense (UI changes, browser pages, etc.).
|
|
7113
|
+
- All screenshots and artifacts go under \`.sparkecode-artifacts/\` **inside the working directory**. Create subdirectories as needed:
|
|
7114
|
+
\`\`\`bash
|
|
7115
|
+
mkdir -p .sparkecode-artifacts/screenshots
|
|
7116
|
+
\`\`\`
|
|
7117
|
+
- Before your first screenshot, check that \`.sparkecode-artifacts/\` is listed in the project's \`.gitignore\`. If it is missing, add it:
|
|
7118
|
+
\`\`\`bash
|
|
7119
|
+
grep -q "sparkecode-artifacts" .gitignore 2>/dev/null || echo ".sparkecode-artifacts/" >> .gitignore
|
|
7120
|
+
\`\`\`
|
|
7121
|
+
- Take screenshots with \`agent-browser\` using the full relative path from the working directory:
|
|
7122
|
+
\`\`\`bash
|
|
7123
|
+
agent-browser screenshot ".sparkecode-artifacts/screenshots/result.png"
|
|
7124
|
+
\`\`\`
|
|
7125
|
+
- After taking a screenshot, view it with \`read_file\` and then upload it with \`upload_file\`:
|
|
7126
|
+
\`\`\`
|
|
7127
|
+
read_file({ path: ".sparkecode-artifacts/screenshots/result.png" })
|
|
7128
|
+
upload_file({ path: ".sparkecode-artifacts/screenshots/result.png", name: "result.png" })
|
|
7129
|
+
\`\`\`
|
|
7130
|
+
- In task results, NEVER return local filesystem paths for screenshots/reports. Return only the \`downloadUrl\` from \`upload_file\`.
|
|
7116
7131
|
- This is especially valuable for UI/visual changes, successful test runs, and browser verification \u2014 show, don't just tell.
|
|
7117
7132
|
|
|
7118
7133
|
### Use All Available Tools
|
|
@@ -10844,7 +10859,8 @@ var createTaskSchema = z19.object({
|
|
|
10844
10859
|
model: z19.string().optional(),
|
|
10845
10860
|
workingDirectory: z19.string().optional(),
|
|
10846
10861
|
name: z19.string().optional(),
|
|
10847
|
-
maxIterations: z19.number().int().min(1).max(500).optional()
|
|
10862
|
+
maxIterations: z19.number().int().min(1).max(500).optional(),
|
|
10863
|
+
parentTaskId: z19.string().optional()
|
|
10848
10864
|
});
|
|
10849
10865
|
tasks.post(
|
|
10850
10866
|
"/",
|
|
@@ -10857,17 +10873,52 @@ tasks.post(
|
|
|
10857
10873
|
outputSchema: body.outputSchema,
|
|
10858
10874
|
webhookUrl: body.webhookUrl,
|
|
10859
10875
|
maxIterations: body.maxIterations ?? 50,
|
|
10860
|
-
status: "running"
|
|
10876
|
+
status: "running",
|
|
10877
|
+
parentTaskId: body.parentTaskId
|
|
10861
10878
|
};
|
|
10862
|
-
|
|
10863
|
-
|
|
10864
|
-
|
|
10865
|
-
|
|
10866
|
-
|
|
10867
|
-
|
|
10868
|
-
|
|
10879
|
+
let agent;
|
|
10880
|
+
if (body.parentTaskId) {
|
|
10881
|
+
const parentSession = await sessionQueries.getById(body.parentTaskId);
|
|
10882
|
+
if (!parentSession) {
|
|
10883
|
+
return c.json({ error: "Parent task not found" }, 404);
|
|
10884
|
+
}
|
|
10885
|
+
const parentTask = parentSession.config?.task;
|
|
10886
|
+
if (!parentTask?.enabled) {
|
|
10887
|
+
return c.json({ error: "Parent session is not a task" }, 400);
|
|
10888
|
+
}
|
|
10889
|
+
if (parentTask.status === "running") {
|
|
10890
|
+
return c.json({ error: "Parent task is still running. Wait for it to complete before chaining." }, 409);
|
|
10891
|
+
}
|
|
10892
|
+
const parentStream = await activeStreamQueries.getBySessionId(body.parentTaskId);
|
|
10893
|
+
if (parentStream) {
|
|
10894
|
+
return c.json({ error: "Parent task has an active stream" }, 409);
|
|
10895
|
+
}
|
|
10896
|
+
agent = await Agent.create({
|
|
10897
|
+
name: body.name || "Task",
|
|
10898
|
+
workingDirectory: body.workingDirectory || parentSession.workingDirectory,
|
|
10899
|
+
model: body.model || parentSession.model,
|
|
10900
|
+
sessionConfig: {
|
|
10901
|
+
toolApprovals: { bash: false, write_file: false, read_file: false },
|
|
10902
|
+
task: taskConfig
|
|
10903
|
+
}
|
|
10904
|
+
});
|
|
10905
|
+
const parentMessages = await messageQueries.getBySession(body.parentTaskId);
|
|
10906
|
+
if (parentMessages.length > 0) {
|
|
10907
|
+
const modelMessages = parentMessages.map((m) => m.modelMessage);
|
|
10908
|
+
await messageQueries.addMany(agent.sessionId, modelMessages);
|
|
10909
|
+
console.log(`[TASK] Copied ${modelMessages.length} messages from parent ${body.parentTaskId} to ${agent.sessionId}`);
|
|
10869
10910
|
}
|
|
10870
|
-
}
|
|
10911
|
+
} else {
|
|
10912
|
+
agent = await Agent.create({
|
|
10913
|
+
name: body.name || "Task",
|
|
10914
|
+
workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,
|
|
10915
|
+
model: body.model || config.defaultModel,
|
|
10916
|
+
sessionConfig: {
|
|
10917
|
+
toolApprovals: { bash: false, write_file: false, read_file: false },
|
|
10918
|
+
task: taskConfig
|
|
10919
|
+
}
|
|
10920
|
+
});
|
|
10921
|
+
}
|
|
10871
10922
|
const taskId = agent.sessionId;
|
|
10872
10923
|
const abortController = new AbortController();
|
|
10873
10924
|
taskAbortControllers.set(taskId, abortController);
|
|
@@ -10939,7 +10990,11 @@ tasks.post(
|
|
|
10939
10990
|
return readable;
|
|
10940
10991
|
};
|
|
10941
10992
|
await streamContext.resumableStream(streamId, taskStreamProducer);
|
|
10942
|
-
return c.json({
|
|
10993
|
+
return c.json({
|
|
10994
|
+
taskId,
|
|
10995
|
+
status: "running",
|
|
10996
|
+
...body.parentTaskId ? { parentTaskId: body.parentTaskId } : {}
|
|
10997
|
+
}, 201);
|
|
10943
10998
|
}
|
|
10944
10999
|
);
|
|
10945
11000
|
tasks.get("/:id", async (c) => {
|
|
@@ -10969,6 +11024,7 @@ tasks.get("/:id", async (c) => {
|
|
|
10969
11024
|
iterations: task.iterations,
|
|
10970
11025
|
model: session.model,
|
|
10971
11026
|
name: session.name,
|
|
11027
|
+
parentTaskId: task.parentTaskId,
|
|
10972
11028
|
createdAt: session.createdAt.toISOString(),
|
|
10973
11029
|
updatedAt: session.updatedAt.toISOString(),
|
|
10974
11030
|
browserRecordings: browserRecordings.length > 0 ? browserRecordings : void 0
|
|
@@ -12641,7 +12697,7 @@ program.command("server").description("Start the SparkECoder server (API + Web U
|
|
|
12641
12697
|
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
12698
|
await runChat(options);
|
|
12643
12699
|
});
|
|
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) => {
|
|
12700
|
+
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
12701
|
await ensureDependencies({ quiet: true });
|
|
12646
12702
|
loadApiKeysIntoEnv();
|
|
12647
12703
|
const baseUrl = `http://${options.host}:${options.port}`;
|
|
@@ -12689,6 +12745,7 @@ program.command("task").description("Run an autonomous task that completes witho
|
|
|
12689
12745
|
if (options.model) body.model = options.model;
|
|
12690
12746
|
if (options.workingDir) body.workingDirectory = options.workingDir;
|
|
12691
12747
|
if (options.name) body.name = options.name;
|
|
12748
|
+
if (options.parentTask) body.parentTaskId = options.parentTask;
|
|
12692
12749
|
const spinner = ora("Creating task...").start();
|
|
12693
12750
|
const response = await apiRequest(baseUrl, "/tasks", {
|
|
12694
12751
|
method: "POST",
|