@nodetool-ai/cli-workflow 0.0.0-stage → 0.8.9-beta.2

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 (71) hide show
  1. package/README.md +14 -2
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/api-client.d.ts +580 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +34 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/commands/collections.d.ts +10 -0
  8. package/dist/commands/collections.d.ts.map +1 -0
  9. package/dist/commands/collections.js +257 -0
  10. package/dist/commands/collections.js.map +1 -0
  11. package/dist/commands/costs.d.ts +15 -0
  12. package/dist/commands/costs.d.ts.map +1 -0
  13. package/dist/commands/costs.js +201 -0
  14. package/dist/commands/costs.js.map +1 -0
  15. package/dist/commands/debug.d.ts +13 -0
  16. package/dist/commands/debug.d.ts.map +1 -0
  17. package/dist/commands/debug.js +149 -0
  18. package/dist/commands/debug.js.map +1 -0
  19. package/dist/commands/errors.d.ts +11 -0
  20. package/dist/commands/errors.d.ts.map +1 -0
  21. package/dist/commands/errors.js +177 -0
  22. package/dist/commands/errors.js.map +1 -0
  23. package/dist/commands/generate.d.ts +17 -0
  24. package/dist/commands/generate.d.ts.map +1 -0
  25. package/dist/commands/generate.js +326 -0
  26. package/dist/commands/generate.js.map +1 -0
  27. package/dist/commands/generations.d.ts +17 -0
  28. package/dist/commands/generations.d.ts.map +1 -0
  29. package/dist/commands/generations.js +408 -0
  30. package/dist/commands/generations.js.map +1 -0
  31. package/dist/commands/install-missing-packs.d.ts +21 -0
  32. package/dist/commands/install-missing-packs.d.ts.map +1 -0
  33. package/dist/commands/install-missing-packs.js +48 -0
  34. package/dist/commands/install-missing-packs.js.map +1 -0
  35. package/dist/commands/node.d.ts +10 -0
  36. package/dist/commands/node.d.ts.map +1 -0
  37. package/dist/commands/node.js +130 -0
  38. package/dist/commands/node.js.map +1 -0
  39. package/dist/commands/projects.d.ts +11 -0
  40. package/dist/commands/projects.d.ts.map +1 -0
  41. package/dist/commands/projects.js +145 -0
  42. package/dist/commands/projects.js.map +1 -0
  43. package/dist/commands/resource-read.d.ts +28 -0
  44. package/dist/commands/resource-read.d.ts.map +1 -0
  45. package/dist/commands/resource-read.js +314 -0
  46. package/dist/commands/resource-read.js.map +1 -0
  47. package/dist/commands/runs.d.ts +7 -0
  48. package/dist/commands/runs.d.ts.map +1 -0
  49. package/dist/commands/runs.js +302 -0
  50. package/dist/commands/runs.js.map +1 -0
  51. package/dist/commands/validate.d.ts +24 -0
  52. package/dist/commands/validate.d.ts.map +1 -0
  53. package/dist/commands/validate.js +132 -0
  54. package/dist/commands/validate.js.map +1 -0
  55. package/dist/index.d.ts +16 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +1034 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/nodetool.d.ts +3 -0
  60. package/dist/nodetool.d.ts.map +1 -0
  61. package/dist/nodetool.js +4 -0
  62. package/dist/nodetool.js.map +1 -0
  63. package/dist/packs/command-service.d.ts +3 -0
  64. package/dist/packs/command-service.d.ts.map +1 -0
  65. package/dist/packs/command-service.js +9 -0
  66. package/dist/packs/command-service.js.map +1 -0
  67. package/dist/workflow-packs.d.ts +7 -0
  68. package/dist/workflow-packs.d.ts.map +1 -0
  69. package/dist/workflow-packs.js +31 -0
  70. package/dist/workflow-packs.js.map +1 -0
  71. package/package.json +73 -4
@@ -0,0 +1,257 @@
1
+ /**
2
+ * `nodetool collections` — manage RAG vector-store collections.
3
+ *
4
+ * Runs in-process against the default vector provider (sqlite-vec unless
5
+ * NODETOOL_VECTOR_PROVIDER points elsewhere), so it works without a running
6
+ * server. Indexing chunks documents with the same splitter the server uses.
7
+ */
8
+ import { readFile } from "node:fs/promises";
9
+ import { basename } from "node:path";
10
+ import { getDefaultVectorProvider, splitDocument, CollectionNotFoundError } from "@nodetool-ai/vectorstore";
11
+ import { Workflow } from "@nodetool-ai/models";
12
+ import { asJson, printTable, printKv, confirm } from "@nodetool-ai/cli-common/commands/output";
13
+ import { setupLocalDb } from "@nodetool-ai/cli-local/local-db";
14
+ import { isNonEmptyString } from "@nodetool-ai/cli-common/predicates";
15
+ function fail(e) {
16
+ if (e instanceof CollectionNotFoundError) {
17
+ console.error(e.message);
18
+ process.exit(1);
19
+ }
20
+ console.error(String(e instanceof Error ? e.message : e));
21
+ process.exit(1);
22
+ }
23
+ /** Resolve a workflow's name from an id, forgivingly (null on any failure). */
24
+ async function workflowName(id) {
25
+ if (!isNonEmptyString(id)) {
26
+ return null;
27
+ }
28
+ try {
29
+ const wf = (await Workflow.get(id));
30
+ return wf?.name ?? null;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ export function registerCollectionCommands(program) {
37
+ const collections = program
38
+ .command("collections")
39
+ .description("Manage RAG vector-store collections");
40
+ collections
41
+ .command("list")
42
+ .description("List collections with document counts")
43
+ .option("--json", "Output as JSON")
44
+ .action(async (opts) => {
45
+ try {
46
+ await setupLocalDb();
47
+ const provider = getDefaultVectorProvider();
48
+ const infos = await provider.listCollections();
49
+ const rows = [];
50
+ for (const info of infos) {
51
+ try {
52
+ const collection = await provider.getCollection({ name: info.name });
53
+ const count = await collection.count();
54
+ const metadata = info.metadata ?? {};
55
+ rows.push({
56
+ name: info.name,
57
+ count,
58
+ embedding_model: metadata["embedding_model"] ?? "",
59
+ workflow: (await workflowName(metadata["workflow"])) ?? ""
60
+ });
61
+ }
62
+ catch (err) {
63
+ // A collection can race a delete between listCollections() and
64
+ // getCollection(); skip only that. Surface anything else (corrupt
65
+ // collection, provider failure) instead of hiding it.
66
+ if (!(err instanceof CollectionNotFoundError)) {
67
+ throw err;
68
+ }
69
+ }
70
+ }
71
+ if (opts.json) {
72
+ asJson(rows);
73
+ return;
74
+ }
75
+ printTable(rows);
76
+ }
77
+ catch (e) {
78
+ fail(e);
79
+ }
80
+ });
81
+ collections
82
+ .command("get <name>")
83
+ .description("Show a collection's metadata and document count")
84
+ .option("--json", "Output as JSON")
85
+ .action(async (name, opts) => {
86
+ try {
87
+ await setupLocalDb();
88
+ const collection = await getDefaultVectorProvider().getCollection({
89
+ name
90
+ });
91
+ const count = await collection.count();
92
+ const metadata = collection.metadata ?? {};
93
+ if (opts.json) {
94
+ asJson({ name: collection.name, count, metadata });
95
+ return;
96
+ }
97
+ printKv({ name: collection.name, count, ...metadata });
98
+ }
99
+ catch (e) {
100
+ fail(e);
101
+ }
102
+ });
103
+ collections
104
+ .command("create <name>")
105
+ .description("Create a collection")
106
+ .option("--embedding-model <model>", "Embedding model id")
107
+ .option("--embedding-provider <provider>", "Embedding provider id")
108
+ .option("--json", "Output as JSON")
109
+ .action(async (name, opts) => {
110
+ try {
111
+ await setupLocalDb();
112
+ const metadata = {};
113
+ if (opts.embeddingModel) {
114
+ metadata["embedding_model"] = opts.embeddingModel;
115
+ }
116
+ if (opts.embeddingProvider) {
117
+ metadata["embedding_provider"] = opts.embeddingProvider;
118
+ }
119
+ const collection = await getDefaultVectorProvider().createCollection({
120
+ name,
121
+ metadata
122
+ });
123
+ if (opts.json) {
124
+ asJson({ name: collection.name, metadata: collection.metadata });
125
+ return;
126
+ }
127
+ console.log(`Created collection '${collection.name}'.`);
128
+ }
129
+ catch (e) {
130
+ fail(e);
131
+ }
132
+ });
133
+ collections
134
+ .command("delete <name>")
135
+ .description("Delete a collection and all its documents")
136
+ .option("-y, --yes", "Skip the confirmation prompt")
137
+ .option("--json", "Output as JSON")
138
+ .action(async (name, opts) => {
139
+ try {
140
+ const ok = await confirm(`Delete collection '${name}' and all its documents?`, { force: opts.yes });
141
+ if (!ok) {
142
+ if (opts.json) {
143
+ asJson({ deleted: false, aborted: true });
144
+ }
145
+ else {
146
+ console.error("Aborted.");
147
+ }
148
+ process.exit(1);
149
+ }
150
+ await setupLocalDb();
151
+ await getDefaultVectorProvider().deleteCollection(name);
152
+ const message = `Collection ${name} deleted successfully`;
153
+ if (opts.json) {
154
+ asJson({ message });
155
+ return;
156
+ }
157
+ console.log(message);
158
+ }
159
+ catch (e) {
160
+ fail(e);
161
+ }
162
+ });
163
+ collections
164
+ .command("query <name> <text...>")
165
+ .description("Semantic search over a collection")
166
+ .option("-n, --n-results <n>", "Number of results", "10")
167
+ .option("--json", "Output as JSON")
168
+ .action(async (name, text, opts) => {
169
+ const nResults = Number.parseInt(opts.nResults, 10);
170
+ if (!Number.isFinite(nResults) || nResults <= 0) {
171
+ console.error(`Invalid --n-results value: ${opts.nResults}`);
172
+ process.exit(1);
173
+ }
174
+ try {
175
+ await setupLocalDb();
176
+ const collection = await getDefaultVectorProvider().getCollection({
177
+ name
178
+ });
179
+ const matches = await collection.query({
180
+ text: text.join(" "),
181
+ topK: nResults
182
+ });
183
+ if (opts.json) {
184
+ asJson(matches);
185
+ return;
186
+ }
187
+ if (matches.length === 0) {
188
+ console.log("(no matches)");
189
+ return;
190
+ }
191
+ printTable(matches.map((m) => ({
192
+ id: m.id,
193
+ distance: m.distance?.toFixed(4) ?? "",
194
+ document: (m.document ?? "").replace(/\s+/g, " ").slice(0, 80)
195
+ })));
196
+ }
197
+ catch (e) {
198
+ fail(e);
199
+ }
200
+ });
201
+ collections
202
+ .command("index <name> <file...>")
203
+ .description("Chunk and index one or more text documents into a collection")
204
+ .option("--json", "Output as JSON")
205
+ .action(async (name, files, opts) => {
206
+ try {
207
+ await setupLocalDb();
208
+ const collection = await getDefaultVectorProvider().getCollection({
209
+ name
210
+ });
211
+ const results = [];
212
+ for (const file of files) {
213
+ try {
214
+ const text = await readFile(file, "utf8");
215
+ const fileName = basename(file);
216
+ const chunks = splitDocument(text, fileName);
217
+ if (chunks.length > 0) {
218
+ // Derive the record-id prefix from the full path (sanitized) so
219
+ // two files with the same basename (a/foo.txt, b/foo.txt) don't
220
+ // collide and overwrite each other's chunks. Re-indexing the same
221
+ // path stays idempotent.
222
+ const idPrefix = file.replace(/[^A-Za-z0-9._-]+/g, "_");
223
+ await collection.upsert(chunks.map((c, i) => ({
224
+ id: `${idPrefix}#${i}`,
225
+ document: c.text,
226
+ metadata: {
227
+ source: file,
228
+ start_index: String(c.start_index)
229
+ }
230
+ })));
231
+ }
232
+ results.push({ file, chunks: chunks.length, error: "" });
233
+ }
234
+ catch (e) {
235
+ results.push({
236
+ file,
237
+ chunks: 0,
238
+ error: String(e instanceof Error ? e.message : e)
239
+ });
240
+ }
241
+ }
242
+ if (opts.json) {
243
+ asJson(results);
244
+ }
245
+ else {
246
+ printTable(results);
247
+ }
248
+ if (results.some((r) => r.error)) {
249
+ process.exit(1);
250
+ }
251
+ }
252
+ catch (e) {
253
+ fail(e);
254
+ }
255
+ });
256
+ }
257
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/commands/collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `nodetool costs` — inspect provider spend tracked in the local DB.
3
+ *
4
+ * Reads the local SQLite `predictions` table directly (in-process), so it works
5
+ * without a running server. Every provider call NodeTool makes is recorded as a
6
+ * Prediction — LLM calls with token counts, image/video/audio generation with
7
+ * the billing unit, quantity and unit price behind the charge.
8
+ *
9
+ * A call whose model is in no price catalog is still recorded, with a null
10
+ * cost. It shows up in `list` and is counted as `unpriced` in the aggregates,
11
+ * so an unknown price reads as unknown rather than as free.
12
+ */
13
+ import type { Command } from "commander";
14
+ export declare function registerCostsCommands(program: Command): void;
15
+ //# sourceMappingURL=costs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.d.ts","sourceRoot":"","sources":["../../src/commands/costs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8L5D"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * `nodetool costs` — inspect provider spend tracked in the local DB.
3
+ *
4
+ * Reads the local SQLite `predictions` table directly (in-process), so it works
5
+ * without a running server. Every provider call NodeTool makes is recorded as a
6
+ * Prediction — LLM calls with token counts, image/video/audio generation with
7
+ * the billing unit, quantity and unit price behind the charge.
8
+ *
9
+ * A call whose model is in no price catalog is still recorded, with a null
10
+ * cost. It shows up in `list` and is counted as `unpriced` in the aggregates,
11
+ * so an unknown price reads as unknown rather than as free.
12
+ */
13
+ import { Prediction } from "@nodetool-ai/models";
14
+ import { asJson, printTable, printKv } from "@nodetool-ai/cli-common/commands/output";
15
+ import { setupLocalDb, LOCAL_USER_ID } from "@nodetool-ai/cli-local/local-db";
16
+ function fail(e) {
17
+ console.error(String(e instanceof Error ? e.message : e));
18
+ process.exit(1);
19
+ }
20
+ function usd(n) {
21
+ return `$${(n ?? 0).toFixed(4)}`;
22
+ }
23
+ /** A cost cell that tells an unpriced call apart from a genuinely free one. */
24
+ function costCell(cost) {
25
+ return cost == null ? "unpriced" : usd(cost);
26
+ }
27
+ /** The units behind a unit-billed charge, e.g. "5 × seconds @ $0.2050". */
28
+ function unitsCell(call) {
29
+ if (call.billing_unit == null && call.unit_price == null)
30
+ return "";
31
+ const quantity = call.quantity ?? 1;
32
+ const unit = call.billing_unit ?? "run";
33
+ const price = call.unit_price == null ? "" : ` @ ${usd(call.unit_price)}`;
34
+ return `${quantity} × ${unit}${price}`;
35
+ }
36
+ export function registerCostsCommands(program) {
37
+ const costs = program
38
+ .command("costs")
39
+ .description("Inspect tracked LLM/provider spend");
40
+ costs
41
+ .command("summary")
42
+ .description("Overall spend plus per-provider and per-model breakdowns")
43
+ .option("--json", "Output as JSON")
44
+ .action(async (opts) => {
45
+ try {
46
+ await setupLocalDb();
47
+ const [byProvider, byModel] = await Promise.all([
48
+ Prediction.aggregateByProvider(LOCAL_USER_ID),
49
+ Prediction.aggregateByModel(LOCAL_USER_ID)
50
+ ]);
51
+ // Derive the overall totals by summing the provider aggregates rather
52
+ // than issuing a third full-table scan (aggregateByUser).
53
+ const overall = byProvider.reduce((acc, p) => ({
54
+ total_cost: acc.total_cost + p.total_cost,
55
+ total_input_tokens: acc.total_input_tokens + p.total_input_tokens,
56
+ total_output_tokens: acc.total_output_tokens + p.total_output_tokens,
57
+ total_tokens: acc.total_tokens + p.total_tokens,
58
+ call_count: acc.call_count + p.call_count,
59
+ unpriced_count: acc.unpriced_count + p.unpriced_count
60
+ }), {
61
+ total_cost: 0,
62
+ total_input_tokens: 0,
63
+ total_output_tokens: 0,
64
+ total_tokens: 0,
65
+ call_count: 0,
66
+ unpriced_count: 0
67
+ });
68
+ if (opts.json) {
69
+ asJson({ overall, by_provider: byProvider, by_model: byModel });
70
+ return;
71
+ }
72
+ console.log("\nOverall");
73
+ printKv({
74
+ total_cost: usd(overall.total_cost),
75
+ total_tokens: overall.total_tokens,
76
+ calls: overall.call_count,
77
+ unpriced_calls: overall.unpriced_count
78
+ });
79
+ if (overall.unpriced_count > 0) {
80
+ console.log(`\n${overall.unpriced_count} call(s) ran on a model no price ` +
81
+ `catalog covers, so the total above is a lower bound. ` +
82
+ `Run \`nodetool costs list\` to see them.`);
83
+ }
84
+ console.log("\nBy provider");
85
+ printTable(byProvider.map((p) => ({
86
+ provider: p.provider,
87
+ cost: usd(p.total_cost),
88
+ tokens: p.total_tokens,
89
+ calls: p.call_count,
90
+ unpriced: p.unpriced_count
91
+ })));
92
+ console.log("\nBy model");
93
+ printTable(byModel.map((m) => ({
94
+ provider: m.provider,
95
+ model: m.model,
96
+ cost: usd(m.total_cost),
97
+ tokens: m.total_tokens,
98
+ calls: m.call_count,
99
+ unpriced: m.unpriced_count
100
+ })));
101
+ console.log();
102
+ }
103
+ catch (e) {
104
+ fail(e);
105
+ }
106
+ });
107
+ costs
108
+ .command("list")
109
+ .description("List recent provider calls with cost, tokens and billed units")
110
+ .option("--provider <name>", "Filter by provider")
111
+ .option("--model <id>", "Filter by model")
112
+ .option("--limit <n>", "Max results", "50")
113
+ .option("--json", "Output as JSON")
114
+ .action(async (opts) => {
115
+ const limit = Number.parseInt(opts.limit, 10);
116
+ if (!Number.isFinite(limit) || limit <= 0) {
117
+ console.error(`Invalid --limit value: ${opts.limit}`);
118
+ process.exit(1);
119
+ }
120
+ try {
121
+ await setupLocalDb();
122
+ const page = { limit };
123
+ if (opts.provider) {
124
+ page.provider = opts.provider;
125
+ }
126
+ if (opts.model) {
127
+ page.model = opts.model;
128
+ }
129
+ const [calls] = await Prediction.paginate(LOCAL_USER_ID, page);
130
+ if (opts.json) {
131
+ asJson(calls);
132
+ return;
133
+ }
134
+ printTable(calls.map((c) => ({
135
+ created_at: c.created_at ?? "",
136
+ provider: c.provider,
137
+ model: c.model,
138
+ cost: costCell(c.cost),
139
+ in: c.input_tokens ?? "",
140
+ out: c.output_tokens ?? "",
141
+ units: unitsCell(c)
142
+ })));
143
+ }
144
+ catch (e) {
145
+ fail(e);
146
+ }
147
+ });
148
+ costs
149
+ .command("by-provider")
150
+ .description("Aggregate spend grouped by provider")
151
+ .option("--json", "Output as JSON")
152
+ .action(async (opts) => {
153
+ try {
154
+ await setupLocalDb();
155
+ const data = await Prediction.aggregateByProvider(LOCAL_USER_ID);
156
+ if (opts.json) {
157
+ asJson(data);
158
+ return;
159
+ }
160
+ printTable(data.map((p) => ({
161
+ provider: p.provider,
162
+ cost: usd(p.total_cost),
163
+ input_tokens: p.total_input_tokens,
164
+ output_tokens: p.total_output_tokens,
165
+ calls: p.call_count,
166
+ unpriced: p.unpriced_count
167
+ })));
168
+ }
169
+ catch (e) {
170
+ fail(e);
171
+ }
172
+ });
173
+ costs
174
+ .command("by-model")
175
+ .description("Aggregate spend grouped by model")
176
+ .option("--provider <name>", "Filter by provider")
177
+ .option("--json", "Output as JSON")
178
+ .action(async (opts) => {
179
+ try {
180
+ await setupLocalDb();
181
+ const data = await Prediction.aggregateByModel(LOCAL_USER_ID, opts.provider ? { provider: opts.provider } : {});
182
+ if (opts.json) {
183
+ asJson(data);
184
+ return;
185
+ }
186
+ printTable(data.map((m) => ({
187
+ provider: m.provider,
188
+ model: m.model,
189
+ cost: usd(m.total_cost),
190
+ input_tokens: m.total_input_tokens,
191
+ output_tokens: m.total_output_tokens,
192
+ calls: m.call_count,
193
+ unpriced: m.unpriced_count
194
+ })));
195
+ }
196
+ catch (e) {
197
+ fail(e);
198
+ }
199
+ });
200
+ }
201
+ //# sourceMappingURL=costs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.js","sourceRoot":"","sources":["../../src/commands/costs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `nodetool debug` — the workflow debug harness command.
3
+ *
4
+ * Runs a workflow end-to-end on the headless server and (optionally) in a real
5
+ * browser, then writes a debug bundle (workflow JSON, every message/log/output/
6
+ * error, an OpenTelemetry trace summary, plus browser console errors and a
7
+ * screenshot) and prints an agent-friendly summary. Heavy dependencies are
8
+ * imported lazily inside the action so command registration stays light and
9
+ * unit-testable.
10
+ */
11
+ import type { Command } from "commander";
12
+ export declare function registerDebugCommands(program: Command): void;
13
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmI5D"}