@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.
- package/dist/ExecutionTree.d.ts +19 -0
- package/dist/ExecutionTree.d.ts.map +1 -0
- package/dist/ExecutionTree.js +100 -0
- package/dist/ExecutionTree.js.map +1 -0
- package/dist/app.d.ts +50 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +767 -0
- package/dist/app.js.map +1 -0
- package/dist/commands/agent.d.ts +11 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +483 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/deploy-helpers.d.ts +46 -0
- package/dist/commands/deploy-helpers.d.ts.map +1 -0
- package/dist/commands/deploy-helpers.js +448 -0
- package/dist/commands/deploy-helpers.js.map +1 -0
- package/dist/commands/deploy.d.ts +8 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +645 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/models-hf.d.ts +9 -0
- package/dist/commands/models-hf.d.ts.map +1 -0
- package/dist/commands/models-hf.js +235 -0
- package/dist/commands/models-hf.js.map +1 -0
- package/dist/commands/models-recommended.d.ts +10 -0
- package/dist/commands/models-recommended.d.ts.map +1 -0
- package/dist/commands/models-recommended.js +128 -0
- package/dist/commands/models-recommended.js.map +1 -0
- package/dist/commands/package-helpers.d.ts +14 -0
- package/dist/commands/package-helpers.d.ts.map +1 -0
- package/dist/commands/package-helpers.js +76 -0
- package/dist/commands/package-helpers.js.map +1 -0
- package/dist/commands/package.d.ts +3 -0
- package/dist/commands/package.d.ts.map +1 -0
- package/dist/commands/package.js +254 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +233 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +9 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +48 -0
- package/dist/markdown.js.map +1 -0
- package/dist/nodetool.d.ts +16 -0
- package/dist/nodetool.d.ts.map +1 -0
- package/dist/nodetool.js +1154 -0
- package/dist/nodetool.js.map +1 -0
- package/dist/providers.d.ts +47 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +173 -0
- package/dist/providers.js.map +1 -0
- package/dist/readline-input.d.ts +29 -0
- package/dist/readline-input.d.ts.map +1 -0
- package/dist/readline-input.js +199 -0
- package/dist/readline-input.js.map +1 -0
- package/dist/run-dsl.d.ts +11 -0
- package/dist/run-dsl.d.ts.map +1 -0
- package/dist/run-dsl.js +31 -0
- package/dist/run-dsl.js.map +1 -0
- package/dist/settings.d.ts +18 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +86 -0
- package/dist/settings.js.map +1 -0
- package/dist/stdin.d.ts +48 -0
- package/dist/stdin.d.ts.map +1 -0
- package/dist/stdin.js +352 -0
- package/dist/stdin.js.map +1 -0
- package/dist/useExecutionState.d.ts +44 -0
- package/dist/useExecutionState.d.ts.map +1 -0
- package/dist/useExecutionState.js +281 -0
- package/dist/useExecutionState.js.map +1 -0
- package/dist/websocket-client.d.ts +100 -0
- package/dist/websocket-client.d.ts.map +1 -0
- package/dist/websocket-client.js +351 -0
- package/dist/websocket-client.js.map +1 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/markdown.js
ADDED
|
@@ -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"}
|