@nodetool-ai/cli 0.7.0-rc.11

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 (77) hide show
  1. package/dist/ExecutionTree.d.ts +19 -0
  2. package/dist/ExecutionTree.d.ts.map +1 -0
  3. package/dist/ExecutionTree.js +100 -0
  4. package/dist/ExecutionTree.js.map +1 -0
  5. package/dist/app.d.ts +50 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +767 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/commands/agent.d.ts +11 -0
  10. package/dist/commands/agent.d.ts.map +1 -0
  11. package/dist/commands/agent.js +483 -0
  12. package/dist/commands/agent.js.map +1 -0
  13. package/dist/commands/deploy-helpers.d.ts +46 -0
  14. package/dist/commands/deploy-helpers.d.ts.map +1 -0
  15. package/dist/commands/deploy-helpers.js +448 -0
  16. package/dist/commands/deploy-helpers.js.map +1 -0
  17. package/dist/commands/deploy.d.ts +8 -0
  18. package/dist/commands/deploy.d.ts.map +1 -0
  19. package/dist/commands/deploy.js +645 -0
  20. package/dist/commands/deploy.js.map +1 -0
  21. package/dist/commands/models-hf.d.ts +9 -0
  22. package/dist/commands/models-hf.d.ts.map +1 -0
  23. package/dist/commands/models-hf.js +235 -0
  24. package/dist/commands/models-hf.js.map +1 -0
  25. package/dist/commands/models-recommended.d.ts +10 -0
  26. package/dist/commands/models-recommended.d.ts.map +1 -0
  27. package/dist/commands/models-recommended.js +128 -0
  28. package/dist/commands/models-recommended.js.map +1 -0
  29. package/dist/commands/package-helpers.d.ts +14 -0
  30. package/dist/commands/package-helpers.d.ts.map +1 -0
  31. package/dist/commands/package-helpers.js +76 -0
  32. package/dist/commands/package-helpers.js.map +1 -0
  33. package/dist/commands/package.d.ts +3 -0
  34. package/dist/commands/package.d.ts.map +1 -0
  35. package/dist/commands/package.js +254 -0
  36. package/dist/commands/package.js.map +1 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +233 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/markdown.d.ts +9 -0
  42. package/dist/markdown.d.ts.map +1 -0
  43. package/dist/markdown.js +48 -0
  44. package/dist/markdown.js.map +1 -0
  45. package/dist/nodetool.d.ts +16 -0
  46. package/dist/nodetool.d.ts.map +1 -0
  47. package/dist/nodetool.js +1154 -0
  48. package/dist/nodetool.js.map +1 -0
  49. package/dist/providers.d.ts +47 -0
  50. package/dist/providers.d.ts.map +1 -0
  51. package/dist/providers.js +173 -0
  52. package/dist/providers.js.map +1 -0
  53. package/dist/readline-input.d.ts +29 -0
  54. package/dist/readline-input.d.ts.map +1 -0
  55. package/dist/readline-input.js +199 -0
  56. package/dist/readline-input.js.map +1 -0
  57. package/dist/run-dsl.d.ts +11 -0
  58. package/dist/run-dsl.d.ts.map +1 -0
  59. package/dist/run-dsl.js +31 -0
  60. package/dist/run-dsl.js.map +1 -0
  61. package/dist/settings.d.ts +18 -0
  62. package/dist/settings.d.ts.map +1 -0
  63. package/dist/settings.js +86 -0
  64. package/dist/settings.js.map +1 -0
  65. package/dist/stdin.d.ts +48 -0
  66. package/dist/stdin.d.ts.map +1 -0
  67. package/dist/stdin.js +352 -0
  68. package/dist/stdin.js.map +1 -0
  69. package/dist/useExecutionState.d.ts +44 -0
  70. package/dist/useExecutionState.d.ts.map +1 -0
  71. package/dist/useExecutionState.js +281 -0
  72. package/dist/useExecutionState.js.map +1 -0
  73. package/dist/websocket-client.d.ts +100 -0
  74. package/dist/websocket-client.d.ts.map +1 -0
  75. package/dist/websocket-client.js +351 -0
  76. package/dist/websocket-client.js.map +1 -0
  77. package/package.json +85 -0
@@ -0,0 +1,254 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { confirm, input } from "@inquirer/prompts";
4
+ import { loadPythonPackageMetadata, fetchAvailablePackages, generatePackageOverviewMarkdown, generateAllNodeDocs, generateAllWorkflowDocs } from "@nodetool-ai/node-sdk";
5
+ import { asJson, findWorkspaceRoots, printTable } from "./package-helpers.js";
6
+ export function registerPackageCommands(program) {
7
+ const pkg = program
8
+ .command("package")
9
+ .description("Manage NodeTool TypeScript node packages");
10
+ // -----------------------------------------------------------------------
11
+ // list
12
+ // -----------------------------------------------------------------------
13
+ pkg
14
+ .command("list")
15
+ .description("List installed packages (or available with --available)")
16
+ .option("-a, --available", "Show available packages from the registry")
17
+ .option("--json", "Output as JSON")
18
+ .action(async (opts) => {
19
+ try {
20
+ if (opts.available) {
21
+ const packages = await fetchAvailablePackages();
22
+ if (opts.json) {
23
+ asJson(packages);
24
+ return;
25
+ }
26
+ if (packages.length === 0) {
27
+ console.log("(no packages available)");
28
+ return;
29
+ }
30
+ printTable(packages.map((p) => ({
31
+ name: p.name,
32
+ repo_id: p.repo_id,
33
+ description: p.description ?? ""
34
+ })));
35
+ return;
36
+ }
37
+ const roots = findWorkspaceRoots(process.cwd());
38
+ const result = loadPythonPackageMetadata({ roots });
39
+ if (opts.json) {
40
+ asJson(result.packages);
41
+ return;
42
+ }
43
+ if (result.packages.length === 0) {
44
+ console.log("(no packages installed)");
45
+ return;
46
+ }
47
+ printTable(result.packages.map((p) => ({
48
+ name: p.name,
49
+ version: p.version ?? "-",
50
+ description: p.description ?? "-",
51
+ nodes: (p.nodes ?? []).length
52
+ })));
53
+ }
54
+ catch (e) {
55
+ console.error(String(e));
56
+ process.exit(1);
57
+ }
58
+ });
59
+ // -----------------------------------------------------------------------
60
+ // init
61
+ // -----------------------------------------------------------------------
62
+ pkg
63
+ .command("init")
64
+ .description("Scaffold a new TypeScript node package in the current directory")
65
+ .action(async () => {
66
+ try {
67
+ const cwd = process.cwd();
68
+ const packageJsonPath = path.join(cwd, "package.json");
69
+ if (fs.existsSync(packageJsonPath)) {
70
+ const overwrite = await confirm({
71
+ message: "package.json already exists. Overwrite?",
72
+ default: false
73
+ });
74
+ if (!overwrite)
75
+ return;
76
+ }
77
+ const name = await input({
78
+ message: "Package name (e.g. nodetool-foo):"
79
+ });
80
+ const description = await input({
81
+ message: "Description:",
82
+ default: ""
83
+ });
84
+ const author = await input({
85
+ message: "Author (Name <email>):",
86
+ default: ""
87
+ });
88
+ const packageJson = {
89
+ name,
90
+ version: "0.1.0",
91
+ description,
92
+ type: "module",
93
+ main: "dist/index.js",
94
+ types: "dist/index.d.ts",
95
+ author,
96
+ scripts: {
97
+ build: "tsc"
98
+ },
99
+ dependencies: {
100
+ "@nodetool-ai/node-sdk": "*",
101
+ "@nodetool-ai/runtime": "*"
102
+ },
103
+ devDependencies: {
104
+ typescript: "^5.7.2"
105
+ },
106
+ exports: {
107
+ ".": {
108
+ import: "./dist/index.js",
109
+ types: "./dist/index.d.ts"
110
+ }
111
+ }
112
+ };
113
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n");
114
+ const tsconfig = {
115
+ compilerOptions: {
116
+ target: "ES2022",
117
+ module: "ESNext",
118
+ moduleResolution: "Bundler",
119
+ declaration: true,
120
+ outDir: "dist",
121
+ strict: true,
122
+ esModuleInterop: true
123
+ },
124
+ include: ["src/**/*"]
125
+ };
126
+ fs.writeFileSync(path.join(cwd, "tsconfig.json"), JSON.stringify(tsconfig, null, 2) + "\n");
127
+ fs.mkdirSync(path.join(cwd, "src"), { recursive: true });
128
+ fs.writeFileSync(path.join(cwd, "src", "index.ts"), `import type { NodeRegistry } from "@nodetool-ai/node-sdk";\n` +
129
+ `\n` +
130
+ `export function registerNodes(_registry: NodeRegistry): void {\n` +
131
+ ` // register your nodes here\n` +
132
+ `}\n`);
133
+ fs.mkdirSync(path.join(cwd, "nodetool", "package_metadata"), {
134
+ recursive: true
135
+ });
136
+ fs.mkdirSync(path.join(cwd, "examples"), { recursive: true });
137
+ fs.mkdirSync(path.join(cwd, "assets"), { recursive: true });
138
+ console.log(`Initialized '${name}'.`);
139
+ console.log("Next: implement nodes in src/ and run 'npm run build'.");
140
+ }
141
+ catch (e) {
142
+ console.error(String(e));
143
+ process.exit(1);
144
+ }
145
+ });
146
+ // -----------------------------------------------------------------------
147
+ // docs (package overview)
148
+ // -----------------------------------------------------------------------
149
+ pkg
150
+ .command("docs")
151
+ .description("Generate Markdown overview docs for the current package")
152
+ .option("-o, --output-dir <dir>", "Output directory", "docs")
153
+ .option("-c, --compact", "Produce a compact overview")
154
+ .option("-v, --verbose", "Verbose output")
155
+ .action(async (opts) => {
156
+ try {
157
+ const cwd = process.cwd();
158
+ const metadataDir = path.join(cwd, "nodetool", "package_metadata");
159
+ if (!fs.existsSync(metadataDir)) {
160
+ throw new Error("No nodetool/package_metadata/ found. Run 'nodetool package scan' first.");
161
+ }
162
+ const loaded = loadPythonPackageMetadata({ roots: [cwd] });
163
+ if (loaded.packages.length === 0) {
164
+ throw new Error("No package metadata found.");
165
+ }
166
+ const pkgMeta = loaded.packages[0];
167
+ fs.mkdirSync(opts.outputDir, { recursive: true });
168
+ const md = generatePackageOverviewMarkdown(pkgMeta, {
169
+ compact: opts.compact ?? false
170
+ });
171
+ const outPath = path.join(opts.outputDir, "index.md");
172
+ fs.writeFileSync(outPath, md);
173
+ console.log(`Wrote ${outPath}`);
174
+ }
175
+ catch (e) {
176
+ console.error(String(e));
177
+ process.exit(1);
178
+ }
179
+ });
180
+ // -----------------------------------------------------------------------
181
+ // node-docs (per-node)
182
+ // -----------------------------------------------------------------------
183
+ pkg
184
+ .command("node-docs")
185
+ .description("Generate per-node Markdown docs")
186
+ .option("-o, --output-dir <dir>", "Output directory", "docs/nodes")
187
+ .option("-p, --package-name <name>", "Filter by namespace prefix")
188
+ .option("-v, --verbose", "Verbose output")
189
+ .action(async (opts) => {
190
+ try {
191
+ const cwd = process.cwd();
192
+ const loaded = loadPythonPackageMetadata({ roots: [cwd] });
193
+ const allNodes = loaded.packages.flatMap((p) => p.nodes ?? []);
194
+ const filterOpts = opts.packageName
195
+ ? { packageName: opts.packageName }
196
+ : {};
197
+ const docs = generateAllNodeDocs(allNodes, filterOpts);
198
+ fs.mkdirSync(opts.outputDir, { recursive: true });
199
+ for (const [filename, markdown] of docs) {
200
+ fs.writeFileSync(path.join(opts.outputDir, filename), markdown);
201
+ }
202
+ console.log(`Wrote ${docs.size} node doc files to ${opts.outputDir}`);
203
+ }
204
+ catch (e) {
205
+ console.error(String(e));
206
+ process.exit(1);
207
+ }
208
+ });
209
+ // -----------------------------------------------------------------------
210
+ // workflow-docs (from examples dir)
211
+ // -----------------------------------------------------------------------
212
+ pkg
213
+ .command("workflow-docs")
214
+ .description("Generate Markdown docs for workflow JSONs")
215
+ .requiredOption("-e, --examples-dir <dir>", "Directory containing workflow JSONs")
216
+ .option("-o, --output-dir <dir>", "Output directory", "docs/workflows")
217
+ .option("-p, --package-name <name>", "Filter by package_name field")
218
+ .option("-v, --verbose", "Verbose output")
219
+ .action(async (opts) => {
220
+ try {
221
+ if (!fs.existsSync(opts.examplesDir)) {
222
+ throw new Error(`Examples dir not found: ${opts.examplesDir}`);
223
+ }
224
+ const files = fs
225
+ .readdirSync(opts.examplesDir, { withFileTypes: true })
226
+ .filter((e) => e.isFile() && e.name.endsWith(".json"))
227
+ .map((e) => path.join(opts.examplesDir, e.name));
228
+ const workflows = [];
229
+ for (const file of files) {
230
+ try {
231
+ const data = JSON.parse(fs.readFileSync(file, "utf8"));
232
+ workflows.push({ path: file, data });
233
+ }
234
+ catch (err) {
235
+ console.error(`Skipping ${file}: ${String(err)}`);
236
+ }
237
+ }
238
+ const filterOpts = opts.packageName
239
+ ? { packageName: opts.packageName }
240
+ : {};
241
+ const docs = generateAllWorkflowDocs(workflows, filterOpts);
242
+ fs.mkdirSync(opts.outputDir, { recursive: true });
243
+ for (const [filename, markdown] of docs) {
244
+ fs.writeFileSync(path.join(opts.outputDir, filename), markdown);
245
+ }
246
+ console.log(`Wrote ${docs.size} workflow doc files to ${opts.outputDir}`);
247
+ }
248
+ catch (e) {
249
+ console.error(String(e));
250
+ process.exit(1);
251
+ }
252
+ });
253
+ }
254
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/commands/package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nodetool-chat — Entry point.
4
+ *
5
+ * Usage:
6
+ * nodetool-chat # use saved/auto-detected settings
7
+ * nodetool-chat --provider anthropic # override provider
8
+ * nodetool-chat --model claude-opus-4-6 # override model
9
+ * nodetool-chat --agent # start in agent mode
10
+ * nodetool-chat --workspace /path/to/dir # set workspace directory
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
package/dist/index.js ADDED
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nodetool-chat — Entry point.
4
+ *
5
+ * Usage:
6
+ * nodetool-chat # use saved/auto-detected settings
7
+ * nodetool-chat --provider anthropic # override provider
8
+ * nodetool-chat --model claude-opus-4-6 # override model
9
+ * nodetool-chat --agent # start in agent mode
10
+ * nodetool-chat --workspace /path/to/dir # set workspace directory
11
+ */
12
+ import { initTelemetry } from "@nodetool-ai/runtime";
13
+ import { program } from "commander";
14
+ import { render } from "ink";
15
+ import React from "react";
16
+ import { App } from "./app.js";
17
+ import { loadSettings } from "./settings.js";
18
+ import { runStdinMode } from "./stdin.js";
19
+ import { buildConfiguredProviders } from "./providers.js";
20
+ import { initDb, getSecret } from "@nodetool-ai/models";
21
+ import { getDefaultDbPath, configureLogging } from "@nodetool-ai/config";
22
+ import { NodeRegistry } from "@nodetool-ai/node-sdk";
23
+ import { registerBaseNodes } from "@nodetool-ai/base-nodes";
24
+ import { DockerSandboxProvider, SessionStore } from "@nodetool-ai/sandbox";
25
+ import { createSandboxTools } from "@nodetool-ai/sandbox-tools";
26
+ import { randomUUID } from "node:crypto";
27
+ // Configure logging: in interactive mode, suppress non-error logs to a file
28
+ // so they don't interfere with the Ink TUI. Env vars can still override.
29
+ import { join } from "node:path";
30
+ import { homedir } from "node:os";
31
+ import { mkdirSync } from "node:fs";
32
+ if (!process.env["NODETOOL_LOG_LEVEL"]) {
33
+ process.env["NODETOOL_LOG_LEVEL"] = "error";
34
+ }
35
+ if (!process.env["NODETOOL_LOG_FILE"]) {
36
+ const logDir = join(homedir(), ".nodetool");
37
+ mkdirSync(logDir, { recursive: true });
38
+ process.env["NODETOOL_LOG_FILE"] = join(logDir, "chat.log");
39
+ }
40
+ configureLogging();
41
+ program
42
+ .name("nodetool-chat")
43
+ .description("NodeTool interactive chat CLI with multi-provider LLM support and agent mode")
44
+ .option("-p, --provider <provider>", "LLM provider (anthropic, openai, ollama, gemini, mistral, groq)")
45
+ .option("-m, --model <model>", "Model ID")
46
+ .option("-a, --agent", "Start in agent mode")
47
+ .option("--no-agent", "Disable agent mode (overrides saved settings)")
48
+ .option("--planner <type>", "Agent planner: 'graph' (workflow builder, default) or 'multi' (parallel tasks)")
49
+ .option("-w, --workspace <path>", "Workspace directory (default: current directory)")
50
+ .option("--tools <tools>", "Comma-separated list of enabled tools")
51
+ .option("-u, --url <url>", "NodeTool server WebSocket URL (e.g. ws://localhost:7777/ws)")
52
+ .option("--sandbox", "Provision an isolated Docker sandbox and expose its tools (file, shell, browser, desktop, search, messaging) to the agent")
53
+ .option("--sandbox-image <image>", "Override the sandbox Docker image (default: nodetool/sandbox-agent:latest)")
54
+ .option("--trace-file <path>", "Append every LLM/agent/workflow span as JSONL to <path> (analyzer-friendly)")
55
+ .option("--trace-stdout [format]", "Stream spans to stdout: 'pretty' (default, human-readable) or 'json' (JSONL)")
56
+ .option("--no-trace-stdout", "Disable stdout span output (overrides NODETOOL_TRACE_STDOUT)")
57
+ .helpOption("-h, --help", "Show help")
58
+ .version("0.1.0")
59
+ .parse();
60
+ const opts = program.opts();
61
+ // Initialize OpenLLMetry before any LLM SDK calls are made. Honors CLI flags
62
+ // and env vars (TRACELOOP_API_KEY, OTEL_EXPORTER_OTLP_ENDPOINT,
63
+ // NODETOOL_TRACE_FILE, NODETOOL_TRACE_STDOUT). No-op if nothing is configured.
64
+ await initTelemetry({
65
+ ...(opts.traceFile && { traceFile: opts.traceFile }),
66
+ ...(opts.traceStdout !== undefined && {
67
+ stdout: parseTraceStdout(opts.traceStdout)
68
+ })
69
+ });
70
+ function parseTraceStdout(v) {
71
+ if (v === false)
72
+ return false;
73
+ if (v === true)
74
+ return "pretty";
75
+ if (typeof v === "string") {
76
+ const lower = v.toLowerCase();
77
+ if (lower === "false" || lower === "0" || lower === "no")
78
+ return false;
79
+ if (lower === "json")
80
+ return "json";
81
+ if (lower === "pretty" || lower === "true" || lower === "1")
82
+ return "pretty";
83
+ }
84
+ throw new Error(`--trace-stdout must be 'pretty' or 'json' (got ${JSON.stringify(v)})`);
85
+ }
86
+ // Initialize database
87
+ try {
88
+ initDb(getDefaultDbPath());
89
+ }
90
+ catch {
91
+ // DB unavailable — secret lookups will fall back to env vars
92
+ }
93
+ // Load persisted settings and merge with CLI flags
94
+ const settings = await loadSettings();
95
+ const provider = opts.provider ?? settings.provider;
96
+ const model = opts.model ?? settings.model;
97
+ // When connecting to a WS server, default to regular chat mode unless --agent is explicit
98
+ const agentMode = opts.agent ?? (opts.url ? false : settings.agentMode);
99
+ const agentPlanner = opts.planner === "multi" || opts.planner === "graph"
100
+ ? opts.planner
101
+ : settings.agentPlanner;
102
+ const workspace = opts.workspace ?? settings.workspace;
103
+ const enabledTools = opts.tools
104
+ ? opts.tools.split(",").map((t) => t.trim())
105
+ : settings.enabledTools;
106
+ // Always-on tools (no credentials needed)
107
+ for (const tool of [
108
+ "statistics",
109
+ "geometry",
110
+ "conversion",
111
+ "extract_pdf_text",
112
+ "convert_pdf_to_markdown",
113
+ "convert_document"
114
+ ]) {
115
+ if (!enabledTools.includes(tool))
116
+ enabledTools.push(tool);
117
+ }
118
+ // Auto-enable based on available secrets (env or encrypted DB)
119
+ async function autoEnable(key, tools) {
120
+ const val = process.env[key] ?? (await getSecret(key, "1"));
121
+ if (val) {
122
+ for (const tool of tools) {
123
+ if (!enabledTools.includes(tool))
124
+ enabledTools.push(tool);
125
+ }
126
+ }
127
+ }
128
+ await Promise.all([
129
+ autoEnable("SERPAPI_API_KEY", [
130
+ "google_search",
131
+ "google_news",
132
+ "google_images"
133
+ ]),
134
+ autoEnable("OPENAI_API_KEY", [
135
+ "openai_web_search",
136
+ "openai_image_generation",
137
+ "openai_text_to_speech"
138
+ ]),
139
+ autoEnable("DATA_FOR_SEO_LOGIN", ["dataseo_search", "dataseo_news"]),
140
+ autoEnable("IMAP_USERNAME", ["search_email", "archive_email"])
141
+ ]);
142
+ // --- Sandbox provisioning (optional) ---------------------------------------
143
+ //
144
+ // When `--sandbox` is set we bring up a DockerSandbox for this CLI process,
145
+ // wrap its ToolClient with the agent adapter, and pass the resulting Tool
146
+ // array into the App as `extraTools`. The sandbox is released on exit.
147
+ let sandboxStore = null;
148
+ let sandboxHandle = null;
149
+ let sandboxExtraTools;
150
+ if (opts.sandbox) {
151
+ const provider_ = new DockerSandboxProvider(opts.sandboxImage ? { defaultImage: opts.sandboxImage } : {});
152
+ sandboxStore = new SessionStore({ provider: provider_ });
153
+ const sessionId = `cli-${randomUUID().slice(0, 8)}`;
154
+ try {
155
+ sandboxHandle = await sandboxStore.acquire(sessionId, {
156
+ workspaceDir: workspace
157
+ });
158
+ sandboxExtraTools = createSandboxTools(sandboxHandle.client);
159
+ }
160
+ catch (err) {
161
+ // eslint-disable-next-line no-console
162
+ console.error(`Failed to provision sandbox: ${err instanceof Error ? err.message : String(err)}`);
163
+ process.exit(1);
164
+ }
165
+ const cleanup = async () => {
166
+ try {
167
+ if (sandboxStore)
168
+ await sandboxStore.close();
169
+ }
170
+ catch {
171
+ // ignore
172
+ }
173
+ };
174
+ process.on("SIGINT", () => void cleanup().finally(() => process.exit(130)));
175
+ process.on("SIGTERM", () => void cleanup().finally(() => process.exit(143)));
176
+ process.on("exit", () => {
177
+ // Best-effort synchronous cleanup; `release` is async so we just
178
+ // kick it off and trust Docker to reap containers on daemon shutdown.
179
+ if (sandboxHandle)
180
+ void sandboxHandle.release();
181
+ });
182
+ }
183
+ // Build a NodeRegistry once per session for the graph-native agent. Only
184
+ // when running locally (no --url): the WebSocket server has its own
185
+ // registry and doesn't need the CLI to provide one.
186
+ let cliRegistry;
187
+ if (!opts.url) {
188
+ cliRegistry = new NodeRegistry();
189
+ registerBaseNodes(cliRegistry);
190
+ }
191
+ // Build configured providers unconditionally so `find_model` and the
192
+ // media-generation tools (generate_image, generate_speech, etc.) are
193
+ // available to ANY agent loop — multi-task or graph — even without a
194
+ // registry.
195
+ const cliAgentProviders = await buildConfiguredProviders();
196
+ // Stdin mode: activated when stdin is piped (not a TTY)
197
+ if (!process.stdin.isTTY) {
198
+ try {
199
+ await runStdinMode({
200
+ provider,
201
+ model,
202
+ workspaceDir: workspace,
203
+ agentMode,
204
+ agentPlanner,
205
+ wsUrl: opts.url,
206
+ extraTools: sandboxExtraTools,
207
+ registry: cliRegistry,
208
+ agentProviders: cliAgentProviders
209
+ });
210
+ }
211
+ finally {
212
+ if (sandboxStore)
213
+ await sandboxStore.close();
214
+ }
215
+ process.exit(0);
216
+ }
217
+ const { waitUntilExit } = render(React.createElement(App, {
218
+ initialProvider: provider,
219
+ initialModel: model,
220
+ initialAgentMode: agentMode,
221
+ initialAgentPlanner: agentPlanner,
222
+ enabledTools,
223
+ workspaceDir: workspace,
224
+ wsUrl: opts.url,
225
+ extraTools: sandboxExtraTools,
226
+ registry: cliRegistry,
227
+ agentProviders: cliAgentProviders
228
+ }), { exitOnCtrlC: false });
229
+ await waitUntilExit();
230
+ if (sandboxStore)
231
+ await sandboxStore.close();
232
+ process.exit(0);
233
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Markdown rendering for the terminal.
3
+ * Uses marked + marked-terminal for full markdown support including
4
+ * syntax-highlighted code blocks, tables, bold/italic, links.
5
+ */
6
+ export declare function renderMarkdown(text: string): Promise<string>;
7
+ /** Synchronous fallback — strips markdown syntax for plain display. */
8
+ export declare function stripMarkdown(text: string): string;
9
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BlE;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Markdown rendering for the terminal.
3
+ * Uses marked + marked-terminal for full markdown support including
4
+ * syntax-highlighted code blocks, tables, bold/italic, links.
5
+ */
6
+ import { marked } from "marked";
7
+ // Cache so we only set the extension once
8
+ let _initialized = false;
9
+ export async function renderMarkdown(text) {
10
+ if (!_initialized) {
11
+ try {
12
+ // marked-terminal v7 exports markedTerminal() as a MarkedExtension factory
13
+ const mod = await import("marked-terminal");
14
+ const markedTerminal = mod.markedTerminal ?? mod.default;
15
+ marked.use(markedTerminal({
16
+ width: process.stdout.columns ?? 80,
17
+ emoji: false,
18
+ tab: 2,
19
+ showSectionPrefix: false,
20
+ reflowText: false
21
+ }));
22
+ }
23
+ catch {
24
+ // marked-terminal unavailable — fall back to plain marked output
25
+ }
26
+ _initialized = true;
27
+ }
28
+ try {
29
+ const result = marked(text);
30
+ if (typeof result === "string")
31
+ return result;
32
+ return await result;
33
+ }
34
+ catch {
35
+ return text; // fallback to raw text on render error
36
+ }
37
+ }
38
+ /** Synchronous fallback — strips markdown syntax for plain display. */
39
+ export function stripMarkdown(text) {
40
+ return text
41
+ .replace(/```[\s\S]*?```/g, "[code]")
42
+ .replace(/`([^`]+)`/g, "$1")
43
+ .replace(/\*\*([^*]+)\*\*/g, "$1")
44
+ .replace(/\*([^*]+)\*/g, "$1")
45
+ .replace(/^#{1,6}\s+/gm, "")
46
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
47
+ }
48
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,0CAA0C;AAC1C,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5C,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,OAAO,CAAC;YACzD,MAAM,CAAC,GAAG,CACR,cAAc,CAAC;gBACb,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;gBACnC,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,CAAC;gBACN,iBAAiB,EAAE,KAAK;gBACxB,UAAU,EAAE,KAAK;aAClB,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC9C,OAAO,MAAM,MAAM,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,uCAAuC;IACtD,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC;SACpC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;SACjC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nodetool — Top-level CLI mirroring the Python nodetool CLI.
4
+ *
5
+ * Usage:
6
+ * nodetool info # system/env info
7
+ * nodetool serve [--host] [--port] # start TS server
8
+ * nodetool chat [--url] [--provider] # interactive chat
9
+ * nodetool workflows list/get/run
10
+ * nodetool jobs list/get
11
+ * nodetool assets list/get
12
+ * nodetool secrets list/store <key>
13
+ * nodetool settings show
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=nodetool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodetool.d.ts","sourceRoot":"","sources":["../src/nodetool.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}