@nodetool-ai/cli 0.8.4 → 0.8.6

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/README.md CHANGED
@@ -1,8 +1,39 @@
1
1
  # @nodetool-ai/cli
2
2
 
3
- Command-line tools for [NodeTool](https://nodetool.ai) — interactive AI chat and workflow management from the terminal.
3
+ The [NodeTool](https://nodetool.ai) MCP server and command-line tools. One
4
+ command gives Claude Code, Codex, and OpenCode NodeTool's toolbelt: image,
5
+ video, and audio generation, workflows, assets, the video timeline, and the
6
+ built-in game engine. The desktop app is optional.
4
7
 
5
- Ships two executables: `nodetool` for managing workflows, jobs, assets, models, secrets, and servers, and `nodetool-chat` for an interactive multi-provider LLM chat with tool support.
8
+ ## Use NodeTool from Claude Code, Codex, or OpenCode
9
+
10
+ You need Node.js 22 or later.
11
+
12
+ ```bash
13
+ npx -y --package=@nodetool-ai/cli nodetool mcp install
14
+ ```
15
+
16
+ The command finds Claude Code, Codex, and OpenCode on the machine, starts the
17
+ server once to check that it lists its tools, and writes a `nodetool` entry
18
+ into each client's config. The entry starts `nodetool mcp serve` over stdio.
19
+ Restart the client, then ask it to use NodeTool.
20
+
21
+ ```bash
22
+ nodetool mcp install --claude # One client only (also --codex, --opencode)
23
+ nodetool mcp install --http # Connect to a running NodeTool server at http://127.0.0.1:7777/mcp
24
+ nodetool mcp status --check # Start each registered server and list its tools
25
+ nodetool mcp config # Print an mcpServers block for Cursor, Claude Desktop, or another client
26
+ nodetool mcp uninstall
27
+ ```
28
+
29
+ Generation tools need provider keys. Store one with
30
+ `nodetool secrets store FAL_API_KEY`, or set the environment variable of the
31
+ same name. See [NodeTool as an MCP Server](https://docs.nodetool.ai/mcp-server)
32
+ for what each client's config gets and what the agent can call.
33
+
34
+ The package also ships `nodetool` for workflows, jobs, assets, models,
35
+ secrets, and servers, and `nodetool-chat` for a terminal chat with the
36
+ NodeTool agent.
6
37
 
7
38
  ## Install
8
39
 
@@ -74,15 +105,10 @@ nodetool secrets list
74
105
  nodetool secrets store OPENAI_API_KEY
75
106
  nodetool secrets get OPENAI_API_KEY
76
107
 
77
- # Settings and MCP
108
+ # Settings
78
109
  nodetool settings show
79
- nodetool mcp install # Register the MCP server for Claude Code, Codex, OpenCode
80
- nodetool mcp status --check # Start each registered server and list its tools
81
- nodetool mcp config # Print an mcpServers block for any other client
82
110
  ```
83
111
 
84
- See [NodeTool as an MCP Server](https://docs.nodetool.ai/mcp-server).
85
-
86
112
  The `workflows`, `jobs`, `assets`, and `models` read commands hit the local database, providers, and caches by default. Pass `--api-url <url>` (env `NODETOOL_API_URL`) to query a remote server instead, and `--json` for machine-readable output.
87
113
 
88
114
  ## `nodetool-chat`
@@ -1 +1 @@
1
- 2026-10-17T11:17:13.867Z
1
+ 2026-10-18T07:14:20.928Z
@@ -45,6 +45,7 @@ export declare function defaultDeployerFactories(): {
45
45
  environment?: Record<string, string> | undefined;
46
46
  };
47
47
  server_auth_token?: string | undefined;
48
+ server_url?: string | undefined;
48
49
  state: {
49
50
  last_deployed: string | null;
50
51
  status: "active" | "deploying" | "destroyed" | "error" | "pending" | "running" | "serving" | "stopped" | "unknown";
@@ -58,6 +59,12 @@ export declare function defaultDeployerFactories(): {
58
59
  };
59
60
  export declare function getManager(): Promise<DeploymentManager>;
60
61
  export declare function resolveServerUrl(deployment: AnyDeployment): string | undefined;
62
+ /**
63
+ * Whether the admin token may travel to `url`. The token is admin access that
64
+ * never expires, so plain HTTP is allowed only to this machine (an SSH tunnel
65
+ * counts) unless the operator opts in with NODETOOL_ALLOW_INSECURE_HTTP=1.
66
+ */
67
+ export declare function isSafeTokenUrl(url: string, env?: Record<string, string | undefined>): boolean;
61
68
  export declare function resolveAdminToken(opts?: {
62
69
  token?: string;
63
70
  }): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"deploy-helpers.d.ts","sourceRoot":"","sources":["../../src/commands/deploy-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EAKd,KAAK,aAAa,EAClB,KAAK,QAAQ,EAEb,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,UAAU,EACV,MAAM,EACN,OAAO,EACP,UAAU,EACV,YAAY,EACZ,OAAO,EACR,MAAM,aAAa,CAAC;AAMrB,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAOlE;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,GACX,aAAa,CASf;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvC;AAiBD,wBAAsB,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAI7D;AAMD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,aAAa,GACxB,MAAM,GAAG,SAAS,CAKpB;AAiBD,wBAAsB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlB;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,aAAa,EACzB,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,aAAa,EACzB,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,GACX,aAAa,CAgBf;AAMD,wEAAwE;AACxE,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,oEAAoE;AACpE,wBAAgB,cAAc,IAAI,kBAAkB,CAiBnD;AAMD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,2BAgB9C;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkBlD;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"deploy-helpers.d.ts","sourceRoot":"","sources":["../../src/commands/deploy-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EAKd,KAAK,aAAa,EAClB,KAAK,QAAQ,EAEb,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,UAAU,EACV,MAAM,EACN,OAAO,EACP,UAAU,EACV,YAAY,EACZ,OAAO,EACR,MAAM,aAAa,CAAC;AAMrB,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAOlE;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,GACX,aAAa,CASf;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvC;AAiBD,wBAAsB,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAI7D;AAMD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,aAAa,GACxB,MAAM,GAAG,SAAS,CAKpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,OAAO,CAWT;AA2BD,wBAAsB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBlB;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,aAAa,EACzB,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,aAAa,EACzB,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,GACX,aAAa,CAgBf;AAMD,wEAAwE;AACxE,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,oEAAoE;AACpE,wBAAgB,cAAc,IAAI,kBAAkB,CAiBnD;AAMD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,2BAgB9C;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkBlD;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -65,20 +65,51 @@ export function resolveServerUrl(deployment) {
65
65
  return dockerDeploymentGetServerUrl(deployment);
66
66
  }
67
67
  }
68
+ /**
69
+ * Whether the admin token may travel to `url`. The token is admin access that
70
+ * never expires, so plain HTTP is allowed only to this machine (an SSH tunnel
71
+ * counts) unless the operator opts in with NODETOOL_ALLOW_INSECURE_HTTP=1.
72
+ */
73
+ export function isSafeTokenUrl(url, env = process.env) {
74
+ let parsed;
75
+ try {
76
+ parsed = new URL(url);
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ if (parsed.protocol === "https:")
82
+ return true;
83
+ if (env["NODETOOL_ALLOW_INSECURE_HTTP"] === "1")
84
+ return true;
85
+ const host = parsed.hostname.replace(/^\[|\]$/g, "");
86
+ return host === "localhost" || host === "::1" || host.startsWith("127.");
87
+ }
68
88
  function requireServerUrl(deployment, name) {
69
89
  const url = resolveServerUrl(deployment);
70
90
  if (!url) {
71
91
  console.error(`Deployment '${name}' has no server URL yet (run 'nodetool deploy apply ${name}' first).`);
72
92
  process.exit(1);
73
93
  }
94
+ if (!isSafeTokenUrl(url)) {
95
+ console.error(`Refusing to send the admin token to ${url} over plain HTTP, where anyone ` +
96
+ "on the network path can read it. Put the server behind TLS and set " +
97
+ `'server_url: https://…' on deployment '${name}', or open an SSH tunnel ` +
98
+ "and set 'server_url: http://localhost:<port>'. " +
99
+ "Set NODETOOL_ALLOW_INSECURE_HTTP=1 to send it anyway.");
100
+ process.exit(1);
101
+ }
74
102
  return url;
75
103
  }
76
104
  // ---------------------------------------------------------------------------
77
105
  // Admin auth token resolution
78
106
  // ---------------------------------------------------------------------------
79
107
  export async function resolveAdminToken(opts) {
80
- if (opts?.token)
108
+ if (opts?.token) {
109
+ console.error("Warning: --token is visible to other local users in the process list " +
110
+ "and stays in shell history. Prefer NODETOOL_ADMIN_TOKEN or the prompt.");
81
111
  return opts.token;
112
+ }
82
113
  const envToken = process.env["NODETOOL_ADMIN_TOKEN"];
83
114
  if (envToken)
84
115
  return envToken;
@@ -1 +1 @@
1
- {"version":3,"file":"deploy-helpers.js","sourceRoot":"","sources":["../../src/commands/deploy-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy-helpers.js","sourceRoot":"","sources":["../../src/commands/deploy-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { Command } from "commander";
2
+ import type { ImageDocumentRecord } from "../sketch-debug/target.js";
3
+ export interface SketchRenderCliOptions {
4
+ out?: string;
5
+ format?: string;
6
+ width?: string;
7
+ height?: string;
8
+ background?: string;
9
+ layer?: string;
10
+ mask?: boolean;
11
+ json?: boolean;
12
+ }
13
+ /** A positive integer flag, or undefined when it was not given. */
14
+ export declare function parseDimension(name: string, value: string | undefined): number | undefined;
15
+ /** `<name>.png` or `<name>.psd` beside the working directory. */
16
+ export declare function defaultOutputPath(ref: string, format: "png" | "psd", label: string | undefined): string;
17
+ /** What `sketch render` wrote, as `--json` prints it. */
18
+ export interface SketchRenderReport {
19
+ target: {
20
+ kind: "file" | "id";
21
+ ref: string;
22
+ name?: string;
23
+ };
24
+ out: string;
25
+ format: "png" | "psd";
26
+ width: number;
27
+ height: number;
28
+ canvas_width: number;
29
+ canvas_height: number;
30
+ bytes: number;
31
+ layer_id?: string;
32
+ layers: Array<{
33
+ id: string;
34
+ name: string;
35
+ type: string;
36
+ drawn: boolean;
37
+ issue?: string;
38
+ }>;
39
+ }
40
+ /** Resolve the target, render it, and write the output file. */
41
+ export declare function runSketchRender(ref: string, opts: SketchRenderCliOptions, deps: {
42
+ loadDocument: (id: string) => Promise<ImageDocumentRecord | null>;
43
+ loadImageBytes?: (uri: string) => Promise<Uint8Array>;
44
+ }): Promise<SketchRenderReport>;
45
+ export declare function registerSketchRenderCommand(sketch: Command, loadDocument: () => Promise<(id: string) => Promise<ImageDocumentRecord | null>>): void;
46
+ //# sourceMappingURL=sketch-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sketch-render.d.ts","sourceRoot":"","sources":["../../src/commands/sketch-render.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAS1F;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMvG;AA+BD,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3F;AAED,gEAAgE;AAChE,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,sBAAsB,EAC5B,IAAI,EAAE;IACJ,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAClE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACvD,GACA,OAAO,CAAC,kBAAkB,CAAC,CAmC7B;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC,GAC/E,IAAI,CAoCN"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * `nodetool sketch render` — render a sketch to a PNG or a layered PSD with
3
+ * the editor's compositing rules, from an image-document JSON file or an
4
+ * `image_documents` row id.
5
+ *
6
+ * The renderer is `@nodetool-ai/agents/sketch-render`, the one behind the
7
+ * `render_sketch` capability. Layer images stored as `asset://` resolve
8
+ * through the local asset store, which opens only when a layer needs it.
9
+ */
10
+ import { writeFileSync } from "node:fs";
11
+ import { printCommandError } from "../command-errors.js";
12
+ /** A positive integer flag, or undefined when it was not given. */
13
+ export function parseDimension(name, value) {
14
+ if (value === undefined) {
15
+ return undefined;
16
+ }
17
+ const parsed = Number(value);
18
+ if (!Number.isInteger(parsed) || parsed <= 0) {
19
+ throw new Error(`--${name} must be a positive whole number of pixels, not "${value}".`);
20
+ }
21
+ return parsed;
22
+ }
23
+ /** `<name>.png` or `<name>.psd` beside the working directory. */
24
+ export function defaultOutputPath(ref, format, label) {
25
+ const base = (label ?? ref.replace(/\.json$/i, "").split(/[\\/]/).pop() ?? "sketch")
26
+ .toLowerCase()
27
+ .replace(/[^a-z0-9]+/g, "-")
28
+ .replace(/^-+|-+$/g, "");
29
+ return `${base || "sketch"}.${format}`;
30
+ }
31
+ /** Bytes for an `asset://` or http(s) layer image, via a local processing context. */
32
+ async function localImageLoader() {
33
+ let context;
34
+ const open = async () => {
35
+ const { initDb } = await import("@nodetool-ai/models");
36
+ const { getDefaultAssetsPath, getDefaultDbPath } = await import("@nodetool-ai/config");
37
+ const { ProcessingContext } = await import("@nodetool-ai/runtime");
38
+ const { FileStorageAdapter } = await import("@nodetool-ai/storage");
39
+ initDb(getDefaultDbPath());
40
+ return new ProcessingContext({
41
+ jobId: `sketch-render-${Date.now()}`,
42
+ workflowId: null,
43
+ userId: "1",
44
+ storage: new FileStorageAdapter(getDefaultAssetsPath())
45
+ });
46
+ };
47
+ return async (uri) => {
48
+ const { loadMediaRefBytes } = await import("@nodetool-ai/runtime");
49
+ context ??= open();
50
+ const bytes = await loadMediaRefBytes({ type: "image", uri }, await context, {
51
+ allowLocalFile: false
52
+ });
53
+ if (!bytes || bytes.length === 0) {
54
+ throw new Error(`${uri} could not be read`);
55
+ }
56
+ return bytes;
57
+ };
58
+ }
59
+ /** Resolve the target, render it, and write the output file. */
60
+ export async function runSketchRender(ref, opts, deps) {
61
+ const format = opts.format ?? "png";
62
+ if (format !== "png" && format !== "psd") {
63
+ throw new Error(`--format must be png or psd, not "${format}".`);
64
+ }
65
+ const { resolveSketchTarget } = await import("../sketch-debug/target.js");
66
+ const { renderSketch } = await import("@nodetool-ai/agents/sketch-render");
67
+ const resolved = await resolveSketchTarget(ref, { loadDocument: deps.loadDocument });
68
+ const options = {
69
+ format,
70
+ width: parseDimension("width", opts.width),
71
+ height: parseDimension("height", opts.height),
72
+ background: opts.background,
73
+ layerId: opts.layer,
74
+ mask: opts.mask === true,
75
+ loadImageBytes: deps.loadImageBytes
76
+ };
77
+ const result = await renderSketch(resolved.raw, options);
78
+ const out = opts.out ?? defaultOutputPath(ref, format, resolved.target.name);
79
+ writeFileSync(out, result.bytes);
80
+ const report = {
81
+ target: resolved.target,
82
+ out,
83
+ format: result.format,
84
+ width: result.width,
85
+ height: result.height,
86
+ canvas_width: result.canvasWidth,
87
+ canvas_height: result.canvasHeight,
88
+ bytes: result.bytes.length,
89
+ layers: result.layers
90
+ };
91
+ if (result.layerId) {
92
+ report.layer_id = result.layerId;
93
+ }
94
+ return report;
95
+ }
96
+ export function registerSketchRenderCommand(sketch, loadDocument) {
97
+ sketch
98
+ .command("render <sketch_id_or_file>")
99
+ .description("Render a sketch to a PNG, or a layered PSD, with the editor's compositing rules: visibility and groups, opacity, blend modes, transforms, effects, vector layers and placed images. Takes an image-document JSON file or an image_documents row id")
100
+ .option("-o, --out <file>", "Output file (default: <sketch name>.png or .psd in the working directory)")
101
+ .option("--format <format>", "png or psd", "png")
102
+ .option("--width <px>", "Output width. Alone, the height keeps the canvas aspect ratio. PNG only")
103
+ .option("--height <px>", "Output height. Alone, the width keeps the canvas aspect ratio. PNG only")
104
+ .option("--background <color>", "CSS color under the image (default: transparent). PNG only")
105
+ .option("--layer <layer_id>", "Render one layer alone, without its opacity or blend mode. PNG only")
106
+ .option("--mask", "Render the inpainting mask layer. PNG only")
107
+ .option("--json", "Print the render report as JSON")
108
+ .action(async (ref, opts) => {
109
+ try {
110
+ const report = await runSketchRender(ref, opts, {
111
+ loadDocument: await loadDocument(),
112
+ loadImageBytes: await localImageLoader()
113
+ });
114
+ const issues = report.layers.filter((layer) => layer.issue);
115
+ if (opts.json) {
116
+ console.log(JSON.stringify(report, null, 2));
117
+ }
118
+ else {
119
+ console.log(`Wrote ${report.out} (${report.width}x${report.height} ${report.format.toUpperCase()}, ${report.bytes} bytes)`);
120
+ for (const layer of issues) {
121
+ console.log(` ${layer.name || layer.id}: ${layer.issue}`);
122
+ }
123
+ }
124
+ process.exit(issues.some((layer) => !layer.drawn) ? 1 : 0);
125
+ }
126
+ catch (e) {
127
+ process.exit(printCommandError(e, opts.json));
128
+ }
129
+ });
130
+ }
131
+ //# sourceMappingURL=sketch-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sketch-render.js","sourceRoot":"","sources":["../../src/commands/sketch-render.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  /**
2
- * `nodetool sketch validate`, `debug` and `versions` — the sketch harness
3
- * commands.
2
+ * `nodetool sketch validate`, `debug`, `render` and `versions` — the sketch
3
+ * harness commands.
4
4
  *
5
5
  * `validate` checks an image document statically: layers a binding points at,
6
6
  * fields a round trip through the schema would strip, canvas and layer values
7
7
  * nothing can composite. `debug` additionally replays a scripted `--interact`
8
8
  * edit session against the headless `ui_sketch_*` bridge and writes a bundle.
9
- * Both take an image-document JSON file or an `image_documents` row id.
9
+ * Both take an image-document JSON file or an `image_documents` row id, and so
10
+ * does `render` (sketch-render.ts), which writes a PNG or a layered PSD.
10
11
  * `versions` (sketch-versions.ts) reads and restores a document's snapshot
11
12
  * history.
12
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../../src/commands/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAuClC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF7D"}
1
+ {"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../../src/commands/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAIvE,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAuClC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF7D"}
@@ -1,6 +1,7 @@
1
1
  import { printCommandError } from "../command-errors.js";
2
2
  import { printDebugSummary } from "./debug-summary-output.js";
3
3
  import { renderSketchValidation } from "./sketch-validation-output.js";
4
+ import { registerSketchRenderCommand } from "./sketch-render.js";
4
5
  import { registerSketchVersionsCommands } from "./sketch-versions.js";
5
6
  export { renderSketchValidation };
6
7
  /** Read an image document row through the local database. */
@@ -94,6 +95,7 @@ export function registerSketchCommands(program) {
94
95
  process.exit(printCommandError(e, opts.json));
95
96
  }
96
97
  });
98
+ registerSketchRenderCommand(sketch, documentLoader);
97
99
  registerSketchVersionsCommands(sketch);
98
100
  }
99
101
  //# sourceMappingURL=sketch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sketch.js","sourceRoot":"","sources":["../../src/commands/sketch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sketch.js","sourceRoot":"","sources":["../../src/commands/sketch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `nodetool telemetry` — the CLI's consent controls for anonymous usage
3
+ * analytics. Nothing is sent until `enable` runs, and nothing here ever
4
+ * prompts. See docs/analytics.md.
5
+ */
6
+ import type { Command } from "commander";
7
+ import { type AnalyticsClient } from "@nodetool-ai/analytics";
8
+ type Env = Readonly<Record<string, string | undefined>>;
9
+ export declare const NEVER_COLLECTED: readonly ["command lines, arguments and flags", "file paths, file names and the working directory", "environment variables, API keys and tokens", "stdin, stdout and stderr", "prompts, workflow contents and outputs", "URLs you pass to commands", "account, project and workflow IDs"];
10
+ export interface TelemetryStatus {
11
+ enabled: boolean;
12
+ consent: string;
13
+ disabledByEnv: boolean;
14
+ configFile: string;
15
+ endpoint: string;
16
+ pendingEvents: number;
17
+ }
18
+ export declare function telemetryStatus(client: AnalyticsClient, env: Env, configFile: string): Promise<TelemetryStatus>;
19
+ export declare function registerTelemetryCommands(program: Command, deps?: {
20
+ env?: Env;
21
+ configFile?: string;
22
+ }): void;
23
+ export {};
24
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAMhC,KAAK,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe,YAC1B,oCAAoC,EACpC,kDAAkD,EAClD,4CAA4C,EAC5C,0BAA0B,EAC1B,wCAAwC,EACxC,2BAA2B,EAC3B,mCAAmC,CAC3B,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAY1B;AAeD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,IAAI,CAoFN"}
@@ -0,0 +1,116 @@
1
+ import { ANALYTICS_EVENTS, isAnalyticsDisabledByEnv } from "@nodetool-ai/analytics";
2
+ import { defaultCliAnalyticsPath } from "@nodetool-ai/analytics/node";
3
+ import { asJson, printKv } from "./output.js";
4
+ import { cliAnalyticsEndpoint, createCliAnalyticsClient } from "../telemetry.js";
5
+ export const NEVER_COLLECTED = [
6
+ "command lines, arguments and flags",
7
+ "file paths, file names and the working directory",
8
+ "environment variables, API keys and tokens",
9
+ "stdin, stdout and stderr",
10
+ "prompts, workflow contents and outputs",
11
+ "URLs you pass to commands",
12
+ "account, project and workflow IDs"
13
+ ];
14
+ export async function telemetryStatus(client, env, configFile) {
15
+ await client.ready;
16
+ const disabledByEnv = isAnalyticsDisabledByEnv(env);
17
+ const consent = client.getConsent().productAnalytics;
18
+ return {
19
+ enabled: consent === "granted" && !disabledByEnv,
20
+ consent,
21
+ disabledByEnv,
22
+ configFile,
23
+ endpoint: cliAnalyticsEndpoint(env),
24
+ pendingEvents: client.pendingEvents().length
25
+ };
26
+ }
27
+ function printStatus(status) {
28
+ printKv({
29
+ "Anonymous usage analytics": status.enabled ? "enabled" : "disabled",
30
+ Consent: status.consent,
31
+ "Disabled by environment": status.disabledByEnv
32
+ ? "yes (NODETOOL_TELEMETRY or DO_NOT_TRACK)"
33
+ : "no",
34
+ "Config file": status.configFile,
35
+ Endpoint: status.endpoint,
36
+ "Unsent events": status.pendingEvents
37
+ });
38
+ }
39
+ export function registerTelemetryCommands(program, deps = {}) {
40
+ const env = deps.env ?? process.env;
41
+ const configFile = deps.configFile ?? defaultCliAnalyticsPath();
42
+ const client = () => createCliAnalyticsClient({ env, storePath: configFile });
43
+ const telemetry = program
44
+ .command("telemetry")
45
+ .description("Anonymous usage analytics for the CLI: off until you enable it");
46
+ telemetry
47
+ .command("enable")
48
+ .description("Share anonymous, coarse usage events")
49
+ .action(async () => {
50
+ const c = client();
51
+ await c.setConsent("productAnalytics", "granted");
52
+ console.log("Anonymous usage analytics enabled. The CLI sends the command category, " +
53
+ "platform, version and bucketed run counts and durations.");
54
+ console.log(`Never collected: ${NEVER_COLLECTED.join("; ")}.`);
55
+ if (isAnalyticsDisabledByEnv(env)) {
56
+ console.log("NODETOOL_TELEMETRY or DO_NOT_TRACK is set, so nothing is sent while it stays set.");
57
+ }
58
+ console.log("Run `nodetool telemetry disable` to turn it off.");
59
+ c.shutdown();
60
+ });
61
+ telemetry
62
+ .command("disable")
63
+ .description("Stop sending and delete unsent events and the anonymous ID")
64
+ .action(async () => {
65
+ const c = client();
66
+ await c.setConsent("productAnalytics", "denied");
67
+ console.log("Anonymous usage analytics disabled. Unsent events and the anonymous ID were deleted.");
68
+ c.shutdown();
69
+ });
70
+ telemetry
71
+ .command("status")
72
+ .description("Show whether telemetry is on and why")
73
+ .option("--json", "Output as JSON")
74
+ .action(async (opts) => {
75
+ const c = client();
76
+ const status = await telemetryStatus(c, env, configFile);
77
+ if (opts.json)
78
+ asJson(status);
79
+ else
80
+ printStatus(status);
81
+ c.shutdown();
82
+ });
83
+ telemetry
84
+ .command("inspect")
85
+ .description("Print unsent events and an example event exactly as they would be sent, without sending")
86
+ .option("--json", "Output as JSON")
87
+ .action(async (opts) => {
88
+ const c = client();
89
+ const status = await telemetryStatus(c, env, configFile);
90
+ const example = c.preview({
91
+ event: "cli_started",
92
+ properties: { commandCategory: "run" }
93
+ });
94
+ const report = {
95
+ status,
96
+ pending: c.pendingEvents(),
97
+ example,
98
+ events: Object.keys(ANALYTICS_EVENTS),
99
+ neverCollected: NEVER_COLLECTED
100
+ };
101
+ if (opts.json) {
102
+ asJson(report);
103
+ }
104
+ else {
105
+ printStatus(status);
106
+ console.log("\nExample event (not sent):");
107
+ console.log(JSON.stringify(example, null, 2));
108
+ console.log(`\nUnsent events (${report.pending.length}):`);
109
+ for (const event of report.pending)
110
+ console.log(JSON.stringify(event));
111
+ console.log(`\nNever collected: ${NEVER_COLLECTED.join("; ")}.`);
112
+ }
113
+ c.shutdown();
114
+ });
115
+ }
116
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"capability-table.d.ts","sourceRoot":"","sources":["../../src/harness/capability-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,eAAO,MAAM,mBAAmB,EAAE,SAAS,uBAAuB,EA41HjE,CAAC"}
1
+ {"version":3,"file":"capability-table.d.ts","sourceRoot":"","sources":["../../src/harness/capability-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,eAAO,MAAM,mBAAmB,EAAE,SAAS,uBAAuB,EAu2HjE,CAAC"}
@@ -2565,6 +2565,17 @@ export const CAPABILITY_COVERAGE = [
2565
2565
  },
2566
2566
  ],
2567
2567
  },
2568
+ {
2569
+ name: "render_sketch",
2570
+ module: "sketches",
2571
+ impl: "packages/agents/src/capabilities/sketches.ts",
2572
+ contract: "2c4cf879b284",
2573
+ selfcheck: "capability-suites",
2574
+ suites: [
2575
+ "packages/agents/tests/capabilities-sketches.test.ts",
2576
+ "packages/agents/tests/capabilities-sketch-render.test.ts",
2577
+ ],
2578
+ },
2568
2579
  {
2569
2580
  name: "delete_sketch",
2570
2581
  module: "sketches",