@nodetool-ai/cli 0.8.4-a24.3 → 0.8.5

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 (62) hide show
  1. package/README.md +34 -8
  2. package/dist/.nodetool-build-stamp +1 -1
  3. package/dist/commands/__tests__/runtime.test.js +2 -1
  4. package/dist/commands/__tests__/runtime.test.js.map +1 -1
  5. package/dist/commands/app.d.ts.map +1 -1
  6. package/dist/commands/app.js +5 -2
  7. package/dist/commands/app.js.map +1 -1
  8. package/dist/commands/deploy-helpers.d.ts +7 -0
  9. package/dist/commands/deploy-helpers.d.ts.map +1 -1
  10. package/dist/commands/deploy-helpers.js +32 -1
  11. package/dist/commands/deploy-helpers.js.map +1 -1
  12. package/dist/commands/generate.d.ts.map +1 -1
  13. package/dist/commands/generate.js +3 -1
  14. package/dist/commands/generate.js.map +1 -1
  15. package/dist/commands/harness.d.ts.map +1 -1
  16. package/dist/commands/harness.js +120 -30
  17. package/dist/commands/harness.js.map +1 -1
  18. package/dist/commands/js-script.d.ts.map +1 -1
  19. package/dist/commands/js-script.js +28 -1
  20. package/dist/commands/js-script.js.map +1 -1
  21. package/dist/commands/node.d.ts.map +1 -1
  22. package/dist/commands/node.js +46 -0
  23. package/dist/commands/node.js.map +1 -1
  24. package/dist/commands/package.d.ts.map +1 -1
  25. package/dist/commands/package.js +8 -4
  26. package/dist/commands/package.js.map +1 -1
  27. package/dist/commands/runtime.d.ts.map +1 -1
  28. package/dist/commands/runtime.js +53 -6
  29. package/dist/commands/runtime.js.map +1 -1
  30. package/dist/commands/telemetry.d.ts +24 -0
  31. package/dist/commands/telemetry.d.ts.map +1 -0
  32. package/dist/commands/telemetry.js +116 -0
  33. package/dist/commands/telemetry.js.map +1 -0
  34. package/dist/commands/tools.d.ts +11 -0
  35. package/dist/commands/tools.d.ts.map +1 -0
  36. package/dist/commands/tools.js +206 -0
  37. package/dist/commands/tools.js.map +1 -0
  38. package/dist/harness/capability-table.js +8 -8
  39. package/dist/harness/capability-table.js.map +1 -1
  40. package/dist/harness/registry.d.ts.map +1 -1
  41. package/dist/harness/registry.js +22 -0
  42. package/dist/harness/registry.js.map +1 -1
  43. package/dist/interaction-script.d.ts.map +1 -1
  44. package/dist/interaction-script.js +13 -5
  45. package/dist/interaction-script.js.map +1 -1
  46. package/dist/js-script-debug/harness.d.ts.map +1 -1
  47. package/dist/js-script-debug/harness.js +13 -2
  48. package/dist/js-script-debug/harness.js.map +1 -1
  49. package/dist/nodetool-main.js +51 -1
  50. package/dist/nodetool-main.js.map +1 -1
  51. package/dist/packs/command-service.d.ts.map +1 -1
  52. package/dist/packs/command-service.js +7 -2
  53. package/dist/packs/command-service.js.map +1 -1
  54. package/dist/providers.d.ts +8 -1
  55. package/dist/providers.d.ts.map +1 -1
  56. package/dist/providers.js +42 -6
  57. package/dist/providers.js.map +1 -1
  58. package/dist/telemetry.d.ts +38 -0
  59. package/dist/telemetry.d.ts.map +1 -0
  60. package/dist/telemetry.js +158 -0
  61. package/dist/telemetry.js.map +1 -0
  62. package/package.json +40 -32
@@ -6,17 +6,23 @@
6
6
  * The specs are `RUNTIME_NPM_PACKAGES` from `@nodetool-ai/protocol`, the same
7
7
  * pinned list the desktop Package Manager installs. A feature that needs a
8
8
  * missing one fails with a message naming `nodetool runtime add <id>`.
9
+ *
10
+ * `sd-cpp` is the one binary here: the stable-diffusion.cpp `sd-server`
11
+ * release, unpacked into `runtimeLocations().sdCpp` by the installer the
12
+ * desktop app shares.
9
13
  */
10
14
  import { existsSync } from "node:fs";
11
15
  import { mkdir, readFile, writeFile } from "node:fs/promises";
12
16
  import { join } from "node:path";
13
17
  import { z } from "zod";
18
+ import { installSdCpp, runtimeLocations, sdCppInstallStatus, uninstallSdCpp } from "@nodetool-ai/config";
14
19
  import { RUNTIME_NPM_PACKAGES, RUNTIME_PACKAGE_NAMES, isRuntimeNpmPackageId } from "@nodetool-ai/protocol";
15
20
  import { optionalNodeModulesDir, optionalNodeRoot } from "../optional-node-root.js";
16
21
  import { asJson, printTable } from "./output.js";
17
22
  import { runNpm } from "../npm-runner.js";
18
23
  import { withInstallLock } from "../install-lock.js";
19
24
  const installedManifestSchema = z.object({ version: z.string() });
25
+ const SD_CPP_ID = "sd-cpp";
20
26
  /** The version installed in the optional-node root, or null. */
21
27
  async function installedVersion(packageName) {
22
28
  const manifest = join(optionalNodeModulesDir(), packageName, "package.json");
@@ -32,9 +38,26 @@ async function installedVersion(packageName) {
32
38
  return null;
33
39
  }
34
40
  }
41
+ function sdCppDir() {
42
+ const dir = runtimeLocations().sdCpp;
43
+ if (!dir) {
44
+ throw new Error("This host has no sd-server install directory. Set SD_CPP_SERVER_PATH instead.");
45
+ }
46
+ return dir;
47
+ }
48
+ async function sdCppRow() {
49
+ const status = await sdCppInstallStatus(sdCppDir(), process.platform);
50
+ return {
51
+ id: SD_CPP_ID,
52
+ name: RUNTIME_PACKAGE_NAMES[SD_CPP_ID],
53
+ installed: status.installed,
54
+ version: status.version ?? "",
55
+ description: "Local image generation server (sd-server) for the stable-diffusion.cpp provider."
56
+ };
57
+ }
35
58
  async function runtimeRows() {
36
59
  const ids = Object.keys(RUNTIME_NPM_PACKAGES).filter(isRuntimeNpmPackageId);
37
- return Promise.all(ids.map(async (id) => {
60
+ const npmRows = await Promise.all(ids.map(async (id) => {
38
61
  const spec = RUNTIME_NPM_PACKAGES[id];
39
62
  const versions = await Promise.all(spec.packageNames.map(installedVersion));
40
63
  const installed = versions.every((version) => version !== null);
@@ -46,15 +69,16 @@ async function runtimeRows() {
46
69
  description: spec.description
47
70
  };
48
71
  }));
72
+ return runtimeLocations().sdCpp ? [...npmRows, await sdCppRow()] : npmRows;
49
73
  }
50
74
  /** Parse the ids a user typed, failing on any id the catalog lacks. */
51
75
  function parseIds(ids) {
52
- const unknown = ids.filter((id) => !isRuntimeNpmPackageId(id));
76
+ const unknown = ids.filter((id) => id !== SD_CPP_ID && !isRuntimeNpmPackageId(id));
53
77
  if (unknown.length > 0) {
54
- const known = Object.keys(RUNTIME_NPM_PACKAGES).join(", ");
78
+ const known = [...Object.keys(RUNTIME_NPM_PACKAGES), SD_CPP_ID].join(", ");
55
79
  throw new Error(`Unknown runtime package: ${unknown.join(", ")}. Known: ${known}.`);
56
80
  }
57
- return ids.filter(isRuntimeNpmPackageId);
81
+ return { npm: ids.filter(isRuntimeNpmPackageId), sdCpp: ids.includes(SD_CPP_ID) };
58
82
  }
59
83
  /** Create the root with a private manifest, so npm installs into it. */
60
84
  async function ensureRoot() {
@@ -87,7 +111,24 @@ export function registerRuntimeCommands(program) {
87
111
  .description("Install one or more runtime packages by id")
88
112
  .argument("<ids...>", "Runtime package ids, from `nodetool runtime list`")
89
113
  .action(async (ids) => {
90
- const parsed = parseIds(ids);
114
+ const { npm: parsed, sdCpp } = parseIds(ids);
115
+ if (sdCpp) {
116
+ const installDir = sdCppDir();
117
+ console.error(`Installing sd-cpp into ${installDir}`);
118
+ await installSdCpp({
119
+ installDir,
120
+ platform: process.platform,
121
+ arch: process.arch,
122
+ onEvent: (event) => {
123
+ if (event.type === "stage") {
124
+ console.error(event.label);
125
+ }
126
+ }
127
+ });
128
+ }
129
+ if (parsed.length === 0) {
130
+ return;
131
+ }
91
132
  const specs = parsed.flatMap((id) => RUNTIME_NPM_PACKAGES[id].npmPackages);
92
133
  const root = optionalNodeRoot();
93
134
  console.error(`Installing ${parsed.join(", ")} into ${root}`);
@@ -103,7 +144,13 @@ export function registerRuntimeCommands(program) {
103
144
  .description("Uninstall one or more runtime packages by id")
104
145
  .argument("<ids...>", "Runtime package ids")
105
146
  .action(async (ids) => {
106
- const parsed = parseIds(ids);
147
+ const { npm: parsed, sdCpp } = parseIds(ids);
148
+ if (sdCpp) {
149
+ await uninstallSdCpp(sdCppDir());
150
+ }
151
+ if (parsed.length === 0) {
152
+ return;
153
+ }
107
154
  const names = parsed.flatMap((id) => RUNTIME_NPM_PACKAGES[id].packageNames);
108
155
  const root = optionalNodeRoot();
109
156
  if (!existsSync(join(root, "package.json"))) {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/commands/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/commands/runtime.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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"}
@@ -0,0 +1,11 @@
1
+ /** Direct local access to the same tools and guides as CLI agent sessions. */
2
+ import type { Command } from "commander";
3
+ import type { Tool } from "@nodetool-ai/agents";
4
+ export interface AuthoringTools {
5
+ list(): Promise<Tool[]>;
6
+ call(name: string, args: Record<string, unknown>): Promise<unknown>;
7
+ }
8
+ export declare function parseToolArguments(raw: string): Promise<Record<string, unknown>>;
9
+ export declare const AUTHORING_HELP = "\nAuthoring tools and starting documents:\n nodetool tools list timeline\n nodetool tools info create_timeline\n nodetool skills list\n nodetool skills read storyboard-core\n nodetool skills read motion-graphics\n nodetool skills read nodetool-workflow-builder\n nodetool skills read nodetool-app-builder\n nodetool skills read native-game\n nodetool tools call list_projects\n nodetool tools call create_timeline --args '{\"name\":\"My timeline\"}'\n nodetool tools call <name> --args @arguments.json\n\nTools expose their current input schemas. Read the matching shipped guide\nbefore creating workflows, timelines, motion graphics, mini apps, or games.\n";
10
+ export declare function registerAuthoringCommands(program: Command, load?: () => Promise<AuthoringTools>): void;
11
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAShD,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AA6ED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC;AA0CD,eAAO,MAAM,cAAc,iqBAgB1B,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE,MAAM,OAAO,CAAC,cAAc,CAAc,GAC/C,IAAI,CAmGN"}
@@ -0,0 +1,206 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { asJson } from "./output.js";
3
+ import { commandFailureExitCode, printCommandError } from "../command-errors.js";
4
+ import { isRecord } from "../predicates.js";
5
+ import { setupLocalDb, LOCAL_USER_ID } from "./local-db.js";
6
+ async function localTools() {
7
+ const { buildCliToolbelt } = await import("../agent-toolbelt.js");
8
+ const { buildFullRegistry } = await import("../node-registry.js");
9
+ const registry = await buildFullRegistry();
10
+ const { toolForCapabilityName } = await import("@nodetool-ai/agents");
11
+ const byName = new Map(buildCliToolbelt({}, registry).map((tool) => [tool.name, tool]));
12
+ // Model discovery is provider-backed at invocation, but its schema is static.
13
+ for (const name of ["find_model", "list_models"]) {
14
+ if (!byName.has(name)) {
15
+ byName.set(name, toolForCapabilityName(name));
16
+ }
17
+ }
18
+ const tools = [...byName.values()];
19
+ return {
20
+ list: async () => tools,
21
+ call: async (name, args) => {
22
+ if (!tools.some((candidate) => candidate.name === name)) {
23
+ throw new Error(`Unknown tool: ${name}. Use nodetool tools list to discover names.`);
24
+ }
25
+ const { getDefaultDbPath } = await import("@nodetool-ai/config");
26
+ const { migrateSqliteDb, Project } = await import("@nodetool-ai/models");
27
+ await migrateSqliteDb(getDefaultDbPath());
28
+ await setupLocalDb();
29
+ await Project.ensurePersonal(LOCAL_USER_ID);
30
+ const { buildConfiguredProviders } = await import("../providers.js");
31
+ const providers = await buildConfiguredProviders();
32
+ const tool = buildCliToolbelt(providers, registry).find((candidate) => candidate.name === name);
33
+ if (!tool) {
34
+ throw new Error(`No configured providers are available for ${name}. Configure a provider before calling this tool.`);
35
+ }
36
+ const { createChatContext } = await import("../chat-context.js");
37
+ const context = await createChatContext({
38
+ workspaceDir: process.cwd(),
39
+ userId: LOCAL_USER_ID
40
+ });
41
+ for (const [id, provider] of Object.entries(providers)) {
42
+ context.registerProvider(id, provider);
43
+ }
44
+ const { RUN_BUDGET_CONTEXT_KEY } = await import("@nodetool-ai/runtime");
45
+ const { PERMISSION_GATE_CONTEXT_KEY, headlessGate } = await import("@nodetool-ai/agents");
46
+ const { createCliRunBudget } = await import("../run-budget.js");
47
+ context.set(RUN_BUDGET_CONTEXT_KEY, await createCliRunBudget());
48
+ context.set(PERMISSION_GATE_CONTEXT_KEY, headlessGate("CLI tool call"));
49
+ const { attachRunCostLedger } = await import("@nodetool-ai/execution");
50
+ const ledger = attachRunCostLedger(context, {
51
+ userId: LOCAL_USER_ID,
52
+ workflowId: null
53
+ });
54
+ const controller = new AbortController();
55
+ const cancel = () => controller.abort(new Error("Tool call interrupted"));
56
+ context.signal = controller.signal;
57
+ process.once("SIGINT", cancel);
58
+ process.once("SIGTERM", cancel);
59
+ try {
60
+ return await tool.execute(context, args);
61
+ }
62
+ finally {
63
+ await ledger.settled();
64
+ ledger();
65
+ process.removeListener("SIGINT", cancel);
66
+ process.removeListener("SIGTERM", cancel);
67
+ }
68
+ }
69
+ };
70
+ }
71
+ export async function parseToolArguments(raw) {
72
+ const value = JSON.parse(raw.startsWith("@") ? await readFile(raw.slice(1), "utf8") : raw);
73
+ if (!isRecord(value)) {
74
+ throw new Error("--args must be a JSON object or @path to a JSON object file.");
75
+ }
76
+ return value;
77
+ }
78
+ /** Inspect only result envelopes whose tool contracts define failure statuses. */
79
+ function toolCallFailed(name, result) {
80
+ if (!isRecord(result)) {
81
+ return false;
82
+ }
83
+ if (commandFailureExitCode(result) === 3 ||
84
+ result.error ||
85
+ result.isError === true ||
86
+ result.success === false ||
87
+ result.ok === false) {
88
+ return true;
89
+ }
90
+ switch (name) {
91
+ case "get_node_info":
92
+ case "search_nodes":
93
+ return result.status === "error";
94
+ case "run_node":
95
+ case "run_workflow":
96
+ case "resolve_workflow_escalation":
97
+ return result.status === "failed" || result.status === "error";
98
+ case "debug_app":
99
+ return (result.status === "failed" ||
100
+ (isRecord(result.verdict) && result.verdict.ok === false));
101
+ case "debug_workflow":
102
+ return (isRecord(result.run) &&
103
+ (result.run.status === "failed" ||
104
+ result.run.status === "error" ||
105
+ Boolean(result.run.error) ||
106
+ (isRecord(result.run.verdict) && result.run.verdict.ok === false)));
107
+ default:
108
+ return false;
109
+ }
110
+ }
111
+ export const AUTHORING_HELP = `
112
+ Authoring tools and starting documents:
113
+ nodetool tools list timeline
114
+ nodetool tools info create_timeline
115
+ nodetool skills list
116
+ nodetool skills read storyboard-core
117
+ nodetool skills read motion-graphics
118
+ nodetool skills read nodetool-workflow-builder
119
+ nodetool skills read nodetool-app-builder
120
+ nodetool skills read native-game
121
+ nodetool tools call list_projects
122
+ nodetool tools call create_timeline --args '{"name":"My timeline"}'
123
+ nodetool tools call <name> --args @arguments.json
124
+
125
+ Tools expose their current input schemas. Read the matching shipped guide
126
+ before creating workflows, timelines, motion graphics, mini apps, or games.
127
+ `;
128
+ export function registerAuthoringCommands(program, load = localTools) {
129
+ const run = async (name, args) => {
130
+ try {
131
+ const result = await (await load()).call(name, args);
132
+ asJson(result);
133
+ if (toolCallFailed(name, result)) {
134
+ const failure = name === "debug_workflow" && isRecord(result) && isRecord(result.run)
135
+ ? result.run
136
+ : result;
137
+ process.exitCode = commandFailureExitCode(failure);
138
+ }
139
+ }
140
+ catch (error) {
141
+ process.exitCode = printCommandError(error, true);
142
+ }
143
+ };
144
+ const tools = program
145
+ .command("tools")
146
+ .description("Discover tool schemas and call local authoring tools")
147
+ .addHelpText("after", AUTHORING_HELP);
148
+ tools
149
+ .command("list [query]")
150
+ .description("List tool names and descriptions, optionally filtered")
151
+ .action(async (query) => {
152
+ const matches = (await (await load()).list()).filter((tool) => !query ||
153
+ `${tool.name} ${tool.description}`
154
+ .toLowerCase()
155
+ .includes(query.toLowerCase()));
156
+ asJson(matches.map((tool) => ({
157
+ name: tool.name,
158
+ description: tool.description
159
+ })));
160
+ });
161
+ tools
162
+ .command("info <name>")
163
+ .description("Print the authoritative input schema for a tool")
164
+ .action(async (name) => {
165
+ const tool = (await (await load()).list()).find((candidate) => candidate.name === name);
166
+ if (!tool) {
167
+ throw new Error(`Unknown tool: ${name}. Use nodetool tools list.`);
168
+ }
169
+ asJson({
170
+ name: tool.name,
171
+ description: tool.description,
172
+ inputSchema: tool.inputSchema
173
+ });
174
+ });
175
+ tools
176
+ .command("call <name>")
177
+ .description("Execute a local tool. Calls can save documents, run jobs, or use configured providers.")
178
+ .option("--args <json|@file>", "JSON arguments, inline or read from a file", "{}")
179
+ .action(async (name, options) => run(name, await parseToolArguments(options.args)));
180
+ const skills = program
181
+ .command("skills")
182
+ .description("Find and read installed authoring guides and user skills");
183
+ skills
184
+ .command("list [query]")
185
+ .description("Search the installed skill catalog")
186
+ .action(async (query) => run("list_skills", query ? { query } : {}));
187
+ skills
188
+ .command("read <name>")
189
+ .description("Read a guide, including its starting examples and tool instructions")
190
+ .action(async (name) => run("load_skill", { name }));
191
+ program.addHelpText("after", AUTHORING_HELP);
192
+ for (const name of [
193
+ "timeline",
194
+ "game",
195
+ "app",
196
+ "apps",
197
+ "workflows",
198
+ "jsscript",
199
+ "sketch"
200
+ ]) {
201
+ program.commands
202
+ .find((command) => command.name() === name)
203
+ ?.addHelpText("after", AUTHORING_HELP);
204
+ }
205
+ }
206
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
@@ -242,7 +242,7 @@ export const CAPABILITY_COVERAGE = [
242
242
  name: "export_workflow_digraph",
243
243
  module: "workflows",
244
244
  impl: "packages/agents/src/capabilities/workflows.ts",
245
- contract: "adbf4387177b",
245
+ contract: "e77dc5f2c0d1",
246
246
  selfcheck: "capability-suites",
247
247
  suites: [
248
248
  "packages/agents/tests/mcp-tools.test.ts",
@@ -1271,7 +1271,7 @@ export const CAPABILITY_COVERAGE = [
1271
1271
  name: "edit_app",
1272
1272
  module: "apps",
1273
1273
  impl: "packages/agents/src/capabilities/apps.ts",
1274
- contract: "80aab4b438b8",
1274
+ contract: "5d71cf4b7e8e",
1275
1275
  selfcheck: "capability-suites",
1276
1276
  suites: [
1277
1277
  "packages/agents/tests/capabilities-apps.test.ts",
@@ -2644,8 +2644,8 @@ export const CAPABILITY_COVERAGE = [
2644
2644
  suites: [
2645
2645
  "packages/agents/tests/capabilities-game.test.ts",
2646
2646
  "packages/agents/tests/capabilities-game3d.test.ts",
2647
+ "packages/agents/tests/capabilities-game-assertions.test.ts",
2647
2648
  "packages/agents/tests/capabilities-game-asset-browser.test.ts",
2648
- "packages/agents/tests/capabilities-game-authoring.test.ts",
2649
2649
  ],
2650
2650
  evals: [
2651
2651
  {
@@ -2702,13 +2702,13 @@ export const CAPABILITY_COVERAGE = [
2702
2702
  name: "playtest_native_game",
2703
2703
  module: "game",
2704
2704
  impl: "packages/agents/src/capabilities/game.ts",
2705
- contract: "dc700e7f4caa",
2705
+ contract: "7b0863b4985f",
2706
2706
  selfcheck: "capability-suites",
2707
2707
  suites: [
2708
2708
  "packages/agents/tests/capabilities-game.test.ts",
2709
2709
  "packages/agents/tests/capabilities-game3d.test.ts",
2710
+ "packages/agents/tests/capabilities-game-assertions.test.ts",
2710
2711
  "packages/agents/tests/capabilities-game-autoplay.test.ts",
2711
- "packages/agents/tests/game-asset-pipeline.test.ts",
2712
2712
  ],
2713
2713
  },
2714
2714
  {
@@ -2731,8 +2731,8 @@ export const CAPABILITY_COVERAGE = [
2731
2731
  suites: [
2732
2732
  "packages/agents/tests/capabilities-game.test.ts",
2733
2733
  "packages/agents/tests/capabilities-game3d.test.ts",
2734
+ "packages/agents/tests/capabilities-game-assertions.test.ts",
2734
2735
  "packages/agents/tests/capabilities-game-authoring.test.ts",
2735
- "packages/agents/tests/capabilities-game-autoplay.test.ts",
2736
2736
  ],
2737
2737
  evals: [
2738
2738
  {
@@ -2741,7 +2741,7 @@ export const CAPABILITY_COVERAGE = [
2741
2741
  },
2742
2742
  {
2743
2743
  file: "packages/agents/src/evals/surfaces/game.ts",
2744
- cases: ["audio-mixer-buses", "cascaded-shadows", "collision-layer-matrix", "entity-tags-properties", "environment-preset-3d", "forces-and-torques-3d", "hud-widget-tree", "hud-widget-tree-3d", "input-bindings", "lifecycle-timer-script", "material-system-3d", "particle-emitter", "particle-rendering", "particle-rendering-3d", "physics-materials", "player-saves-script", "post-processing", "procedural-sky", "render-culling", "script-parameters", "spatial-audio-source", "typed-event-script"],
2744
+ cases: ["audio-mixer-buses", "cascaded-shadows", "collision-layer-matrix", "entity-tags-properties", "environment-preset-3d", "forces-and-torques-3d", "height-fog-and-decals-3d", "hud-widget-tree", "hud-widget-tree-3d", "input-bindings", "lifecycle-timer-script", "material-system-3d", "particle-emitter", "particle-rendering", "particle-rendering-3d", "physics-materials", "player-saves-script", "post-processing", "procedural-sky", "render-culling", "script-parameters", "spatial-audio-source", "typed-event-script"],
2745
2745
  },
2746
2746
  ],
2747
2747
  },
@@ -3086,7 +3086,7 @@ export const CAPABILITY_COVERAGE = [
3086
3086
  name: "edit_storyboard",
3087
3087
  module: "storyboards",
3088
3088
  impl: "packages/agents/src/capabilities/storyboards.ts",
3089
- contract: "f8a51c6734fd",
3089
+ contract: "a2f214d7936b",
3090
3090
  selfcheck: "capability-suites",
3091
3091
  suites: [
3092
3092
  "packages/agents/tests/capabilities-storyboards.test.ts",