sparkecoder 0.1.113 → 0.1.115

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 (106) hide show
  1. package/dist/agent/index.js +57 -1
  2. package/dist/agent/index.js.map +1 -1
  3. package/dist/cli.js +213 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/index.js +57 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/server/index.js +57 -1
  8. package/dist/server/index.js.map +1 -1
  9. package/dist/skills/default/computer-use.md +70 -2
  10. package/dist/skills/default/recording.md +196 -0
  11. package/package.json +1 -1
  12. package/src/skills/default/computer-use.md +70 -2
  13. package/src/skills/default/recording.md +196 -0
  14. package/web/.next/BUILD_ID +1 -1
  15. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  16. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  17. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  18. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  19. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  20. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  21. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  22. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  23. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  24. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  25. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  26. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
  27. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  29. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/agents.html +1 -1
  34. package/web/.next/standalone/web/.next/server/app/agents.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +1 -1
  36. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
  37. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
  38. package/web/.next/standalone/web/.next/server/app/agents.segments/_full.segment.rsc +1 -1
  39. package/web/.next/standalone/web/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/agents.segments/_index.segment.rsc +1 -1
  41. package/web/.next/standalone/web/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  43. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
  44. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
  45. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  46. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  52. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  55. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
  56. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
  57. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
  60. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  61. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  64. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
  66. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
  67. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
  69. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  70. package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
  71. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
  72. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  73. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
  74. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  75. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  76. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  77. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  78. package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
  79. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
  80. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
  81. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  82. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  83. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  84. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  85. package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
  86. package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
  87. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings/__PAGE__.segment.rsc +1 -1
  88. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings.segment.rsc +1 -1
  89. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p.segment.rsc +1 -1
  90. package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  91. package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  92. package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  93. package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  94. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  95. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  96. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  97. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  98. /package/web/.next/standalone/web/.next/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_buildManifest.js +0 -0
  99. /package/web/.next/standalone/web/.next/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_clientMiddlewareManifest.json +0 -0
  100. /package/web/.next/standalone/web/.next/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_ssgManifest.js +0 -0
  101. /package/web/.next/standalone/web/.next/static/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_buildManifest.js +0 -0
  102. /package/web/.next/standalone/web/.next/static/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_clientMiddlewareManifest.json +0 -0
  103. /package/web/.next/standalone/web/.next/static/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_ssgManifest.js +0 -0
  104. /package/web/.next/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_buildManifest.js +0 -0
  105. /package/web/.next/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_clientMiddlewareManifest.json +0 -0
  106. /package/web/.next/static/{mC7Yp8aJpCL22mrYVzIEG → pSGgtxBjN5_o0YHZgQzXm}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -8278,6 +8278,8 @@ ${JSON.stringify(outputSchema, null, 2)}
8278
8278
  `;
8279
8279
  }
8280
8280
  function buildOrchestratorPromptAddendum() {
8281
+ const platform3 = process.platform === "darwin" ? "darwin" : "other";
8282
+ const computerUseAvailable = platform3 === "darwin";
8281
8283
  return `
8282
8284
  ## Orchestrator Mode
8283
8285
 
@@ -8350,9 +8352,63 @@ If the user asks "add the GitHub MCP" or "remember that I prefer Python", load t
8350
8352
  ### Typical flow
8351
8353
 
8352
8354
  1. Inbound event arrives (any channel).
8353
- 2. You decompose, \`spawn\` one or more workers with explicit goals.
8355
+ 2. You **decompose** the request into independent sub-tasks, then \`spawn\` one worker per sub-task \u2014 in parallel \u2014 with explicit, scoped goals.
8354
8356
  3. Workers run autonomously. They wake you via SYSTEM events when done / failed / blocked.
8355
8357
  4. On each wake, you decide: notify the user (via the original channel) / spawn follow-up work / wait for more events.
8358
+
8359
+ ### Decomposition rule
8360
+
8361
+ If a single user message contains **multiple independent asks** that don't share state, spawn **one worker per ask, all in the same turn** (parallel \`spawn\` calls). They run concurrently and finish faster. Examples of when to split:
8362
+
8363
+ - *"Take a screenshot of the desktop AND open Calculator"*
8364
+ \u2192 spawn \`screenshot\` worker + spawn \`open-calculator\` worker (independent).
8365
+ - *"Run the tests and also tell me what changed since yesterday"*
8366
+ \u2192 spawn \`run-tests\` worker + spawn \`git-diff-since-yesterday\` worker.
8367
+ - *"Fix the typo in README and bump the version"*
8368
+ \u2192 spawn \`fix-readme-typo\` worker + spawn \`bump-version\` worker.
8369
+
8370
+ When NOT to split (keep as one worker):
8371
+
8372
+ - The asks share state (one's output feeds the other).
8373
+ - The asks are tightly coupled (e.g. *"refactor X and run its tests"* \u2014 the tests depend on the refactor).
8374
+ - The asks are trivially small (one or two tool calls each); spawning overhead exceeds the parallelism win.
8375
+
8376
+ ### Prefer headless tools
8377
+
8378
+ When spawning a worker, push it toward the *cheapest tool that gets the job done*:
8379
+
8380
+ 1. **Bash / file tools** for anything with a CLI (git, npm, brew, builds, tests, file editing, HTTP via curl, scripting).
8381
+ 2. **agent-browser** (\`load_skill browser\`) for *anything* in a web browser \u2014 refs from \`snapshot -i\` are deterministic, ~100\xD7 cheaper in tokens than pixel coordinates, work cross-platform, and don't need any host permissions.${computerUseAvailable ? `
8382
+ 3. **Computer use** is the last resort \u2014 only when the task genuinely requires a native macOS GUI app with no CLI / API equivalent (System Settings, Calculator, Finder operations that don't have CLI flags, complex cross-app drag/drop, demos where the user wants to *see* the screen).
8383
+
8384
+ A common anti-pattern: a worker reaches for computer use because the user phrased the request visually ("open the website and click the button"). Almost always wrong \u2014 that's a job for the browser skill, not the desktop. Coach the worker in its goal text: *"Use the browser skill (\`load_skill browser\` + \`agent-browser\` with refs from \`snapshot -i\`) to open the site and click the button. Don't use computer use for browser work."*
8385
+
8386
+ ### Serialize desktop / computer-use tasks
8387
+
8388
+ There is exactly **one** desktop, mouse, and keyboard on the host. If two or more workers both need the **\`computer\` tool** (clicking, typing, taking desktop screenshots, opening apps, switching windows), they will **fight over the same screen** \u2014 windows will steal focus from each other, screenshots will catch the wrong app, mouse clicks will land on the wrong target.
8389
+
8390
+ **Rule**: when spawning workers, look at each one's goal:
8391
+
8392
+ - Does it require **GUI interaction** (open an app, click, type in a window, screenshot the desktop, navigate the OS, drive a real browser/terminal window)? \u2192 mark it as a **desktop task**.
8393
+ - Does it only need **headless tools** (bash, file edits, web fetches, code analysis, git, builds, tests run non-interactively)? \u2192 it's a **headless task**.
8394
+
8395
+ Then:
8396
+
8397
+ - **Spawn ALL headless tasks in parallel** (in the same turn).
8398
+ - **Run desktop tasks one at a time**, even if there are multiple of them. Either:
8399
+ - Spawn the first one now, wait for its \`worker.completed\`, then spawn the next; OR
8400
+ - Tell the user the desktop tasks will run sequentially and pick the most important one first.
8401
+
8402
+ Example: *"Take a screenshot of Calculator AND run the test suite AND open System Settings"*:
8403
+ - \u2713 \`screenshot-calculator\` (desktop) \u2014 spawn now
8404
+ - \u2713 \`run-tests\` (headless) \u2014 spawn now, in parallel
8405
+ - \u23F3 \`open-system-settings\` (desktop) \u2014 wait until \`screenshot-calculator\` completes, THEN spawn.
8406
+
8407
+ Headless workers never interfere with desktop workers (they don't touch the screen), so they always run in parallel.
8408
+
8409
+ When you spawn a **desktop worker**, include a one-liner in the goal asking it to **record the session by default** (\`screencapture -v -V <seconds> -C\` on macOS) and return the recording path in its result, *unless* the task is long-running / boring / contains sensitive content. The recording lets you (and the user) replay what actually happened on screen. When the worker reports back, mention the recording path in your reply via the original channel.` : ""}
8410
+
8411
+ Default bias: **when in doubt, decompose**. Two workers running in parallel and reporting independently is almost always better UX than one worker doing things sequentially.
8356
8412
  `;
8357
8413
  }
8358
8414
  function createSummaryPrompt(conversationHistory) {
@@ -16366,7 +16422,7 @@ function generateOpenAPISpec() {
16366
16422
  init_config();
16367
16423
  init_semantic();
16368
16424
  init_db();
16369
- import { writeFileSync as writeFileSync6, readFileSync as readFileSync10, existsSync as existsSync21 } from "fs";
16425
+ import { mkdirSync as mkdirSync10, writeFileSync as writeFileSync6, readFileSync as readFileSync10, existsSync as existsSync21, statSync as statSync3 } from "fs";
16370
16426
  import { resolve as resolve12, join as join16 } from "path";
16371
16427
  function getCliVersion() {
16372
16428
  const here = dirname8(fileURLToPath5(import.meta.url));
@@ -17970,5 +18026,160 @@ program.command("request-permissions").description("Request macOS permissions fo
17970
18026
  }
17971
18027
  console.log();
17972
18028
  });
18029
+ {
18030
+ let stateFilePath = function() {
18031
+ return join16(ensureAppDataDirectory(), "recordings.json");
18032
+ }, readState = function() {
18033
+ const p = stateFilePath();
18034
+ if (!existsSync21(p)) return [];
18035
+ try {
18036
+ return JSON.parse(readFileSync10(p, "utf-8"));
18037
+ } catch {
18038
+ return [];
18039
+ }
18040
+ }, writeState = function(rows) {
18041
+ writeFileSync6(stateFilePath(), JSON.stringify(rows, null, 2), { mode: 384 });
18042
+ }, isAlive = function(pid) {
18043
+ try {
18044
+ process.kill(pid, 0);
18045
+ return true;
18046
+ } catch {
18047
+ return false;
18048
+ }
18049
+ }, pruneDead = function(rows) {
18050
+ return rows.filter((r) => isAlive(r.pid));
18051
+ };
18052
+ stateFilePath2 = stateFilePath, readState2 = readState, writeState2 = writeState, isAlive2 = isAlive, pruneDead2 = pruneDead;
18053
+ const record = program.command("record").description("Start/stop screen recordings");
18054
+ record.command("start").description("Start a screen recording (returns id, path, pid as JSON)").option("--name <slug>", "Optional human-readable label for the recording").option("--dir <path>", "Output directory (default: ~/recordings)").action(async (opts) => {
18055
+ const { spawn: spawn3 } = await import("child_process");
18056
+ const { homedir: homedir2, platform: osPlatform } = await import("os");
18057
+ const outDir = opts.dir ? resolve12(opts.dir.replace(/^~/, homedir2())) : join16(homedir2(), "recordings");
18058
+ mkdirSync10(outDir, { recursive: true });
18059
+ const id = `rec-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
18060
+ const ext = osPlatform() === "darwin" ? "mov" : "mp4";
18061
+ const filename = `${id}${opts.name ? `-${String(opts.name).replace(/[^a-z0-9-]+/gi, "-").toLowerCase()}` : ""}.${ext}`;
18062
+ const path = join16(outDir, filename);
18063
+ let cmd;
18064
+ let args;
18065
+ if (osPlatform() === "darwin") {
18066
+ cmd = "screencapture";
18067
+ args = ["-v", "-C", "-k", path];
18068
+ } else if (osPlatform() === "linux") {
18069
+ const display = process.env.DISPLAY || ":0.0";
18070
+ const size = process.env.SPARKECODER_RECORD_SIZE || "1920x1080";
18071
+ cmd = "ffmpeg";
18072
+ args = [
18073
+ "-y",
18074
+ "-f",
18075
+ "x11grab",
18076
+ "-framerate",
18077
+ "25",
18078
+ "-video_size",
18079
+ size,
18080
+ "-i",
18081
+ display,
18082
+ "-c:v",
18083
+ "libx264",
18084
+ "-preset",
18085
+ "veryfast",
18086
+ "-pix_fmt",
18087
+ "yuv420p",
18088
+ path
18089
+ ];
18090
+ } else {
18091
+ console.error(JSON.stringify({ error: `Unsupported platform: ${osPlatform()}` }));
18092
+ process.exit(1);
18093
+ }
18094
+ const child = spawn3(cmd, args, { detached: true, stdio: "ignore" });
18095
+ child.unref();
18096
+ if (!child.pid) {
18097
+ console.error(JSON.stringify({ error: `Failed to spawn ${cmd}` }));
18098
+ process.exit(1);
18099
+ }
18100
+ const row = {
18101
+ id,
18102
+ name: opts.name,
18103
+ path,
18104
+ pid: child.pid,
18105
+ startedAt: (/* @__PURE__ */ new Date()).toISOString(),
18106
+ platform: osPlatform()
18107
+ };
18108
+ const rows = pruneDead(readState());
18109
+ rows.push(row);
18110
+ writeState(rows);
18111
+ console.log(JSON.stringify({ id, path, pid: child.pid, platform: osPlatform() }));
18112
+ });
18113
+ record.command("stop <id>").description("Stop a recording started by `sparkecoder record start`").action(async (id) => {
18114
+ const rows = readState();
18115
+ const row = rows.find((r) => r.id === id);
18116
+ if (!row) {
18117
+ console.error(JSON.stringify({ error: `No recording found with id ${id}` }));
18118
+ process.exit(1);
18119
+ }
18120
+ const startedAt = new Date(row.startedAt).getTime();
18121
+ if (isAlive(row.pid)) {
18122
+ try {
18123
+ process.kill(row.pid, "SIGINT");
18124
+ } catch {
18125
+ }
18126
+ for (let i = 0; i < 40; i++) {
18127
+ if (!isAlive(row.pid)) break;
18128
+ await new Promise((r) => setTimeout(r, 200));
18129
+ }
18130
+ if (isAlive(row.pid)) {
18131
+ try {
18132
+ process.kill(row.pid, "SIGTERM");
18133
+ } catch {
18134
+ }
18135
+ }
18136
+ }
18137
+ writeState(rows.filter((r) => r.id !== id));
18138
+ const fileExists = existsSync21(row.path);
18139
+ const sizeMb = fileExists ? Math.round(statSync3(row.path).size / (1024 * 1024) * 10) / 10 : 0;
18140
+ console.log(JSON.stringify({
18141
+ id,
18142
+ path: row.path,
18143
+ durationSec: Math.round((Date.now() - startedAt) / 1e3),
18144
+ sizeMb,
18145
+ ok: fileExists
18146
+ }));
18147
+ });
18148
+ record.command("list").description("List active recordings").action(() => {
18149
+ const rows = pruneDead(readState());
18150
+ writeState(rows);
18151
+ console.log(JSON.stringify(rows, null, 2));
18152
+ });
18153
+ record.command("stop-all").description("Stop every active recording").action(async () => {
18154
+ const rows = readState();
18155
+ const stopped = [];
18156
+ for (const r of rows) {
18157
+ if (isAlive(r.pid)) {
18158
+ try {
18159
+ process.kill(r.pid, "SIGINT");
18160
+ } catch {
18161
+ }
18162
+ for (let i = 0; i < 30; i++) {
18163
+ if (!isAlive(r.pid)) break;
18164
+ await new Promise((res) => setTimeout(res, 200));
18165
+ }
18166
+ if (isAlive(r.pid)) {
18167
+ try {
18168
+ process.kill(r.pid, "SIGTERM");
18169
+ } catch {
18170
+ }
18171
+ }
18172
+ }
18173
+ stopped.push({ id: r.id, path: r.path, ok: existsSync21(r.path) });
18174
+ }
18175
+ writeState([]);
18176
+ console.log(JSON.stringify({ stopped }));
18177
+ });
18178
+ }
18179
+ var stateFilePath2;
18180
+ var readState2;
18181
+ var writeState2;
18182
+ var isAlive2;
18183
+ var pruneDead2;
17973
18184
  program.parse();
17974
18185
  //# sourceMappingURL=cli.js.map