@tiangong-ai/cli 0.0.1

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/AGENTS.md ADDED
@@ -0,0 +1,72 @@
1
+ ---
2
+ docType: agent-contract
3
+ scope: repository
4
+ status: current
5
+ authoritative: true
6
+ owner: cli
7
+ language: en
8
+ whenToUse: "Before changing the Tiangong AI CLI implementation."
9
+ whenToUpdate: "When CLI command boundaries, environment variables, validation commands, or release flow change."
10
+ checkPaths:
11
+ - AGENTS.md
12
+ - README.md
13
+ - package.json
14
+ - .github/workflows/**
15
+ - .docpact/config.yaml
16
+ - docs/agents/**
17
+ - src/**
18
+ lastReviewedAt: 2026-05-08
19
+ lastReviewedCommit: 2f4144ea41116de344f7fce1f2ef919823b09bff
20
+ ---
21
+
22
+ # Tiangong AI CLI Contract
23
+
24
+ This repository owns the Tiangong AI command-line interface.
25
+
26
+ ## Boundaries
27
+
28
+ - The CLI is a local operator tool for repeatable, long-running, or batch work.
29
+ - The CLI may call public Tiangong HTTP APIs with user-provided credentials.
30
+ - The CLI must not embed server-side secrets, Supabase service-role keys, NAS
31
+ credentials, AWS keys, Pinecone keys, or OpenSearch admin credentials.
32
+ - Backend services remain responsible for authorization, persistence, dedupe,
33
+ queueing, and state transitions.
34
+ - Agent skills may call this CLI, but reusable workflow prompts belong in the
35
+ `skills` repository.
36
+
37
+ ## Current Command Surface
38
+
39
+ - `tiangong-ai doctor`
40
+ - `tiangong-ai kb ingest`
41
+ - `tiangong-ai kb collections`
42
+ - `tiangong-ai kb status`
43
+
44
+ ## Validation
45
+
46
+ Run before delivery:
47
+
48
+ ```bash
49
+ npm run lint
50
+ npm run build
51
+ npm test
52
+ npm run test:coverage
53
+ docpact validate-config --root . --strict
54
+ docpact lint --root . --worktree --mode enforce
55
+ ```
56
+
57
+ Use `npm run typecheck` for a faster TypeScript-only check.
58
+ Use `npm run prepush:gate` when `docpact` is installed and you want the
59
+ aggregated local quality gate.
60
+
61
+ ## Release
62
+
63
+ GitHub Actions publishes npm releases through `.github/workflows/npm-publish.yml`.
64
+ The workflow uses npm Trusted Publishing through GitHub OIDC and runs npm lint,
65
+ test, coverage, and pack checks before publishing.
66
+
67
+ ## Required Docs
68
+
69
+ - Read `docs/agents/repo-architecture.md` before changing command behavior or
70
+ skill handoff boundaries.
71
+ - Read `docs/agents/repo-validation.md` before changing package scripts,
72
+ coverage thresholds, CI, or docpact configuration.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tiangong AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,91 @@
1
+ ---
2
+ docType: repo-readme
3
+ scope: repo
4
+ status: current
5
+ authoritative: true
6
+ owner: cli
7
+ language: en
8
+ whenToUse: "When installing, running, or validating the Tiangong AI CLI."
9
+ whenToUpdate: "When package name, Node baseline, command examples, environment variables, or validation commands change."
10
+ checkPaths:
11
+ - README.md
12
+ - package.json
13
+ - bin/**
14
+ - src/**
15
+ lastReviewedAt: 2026-05-08
16
+ lastReviewedCommit: 2f4144ea41116de344f7fce1f2ef919823b09bff
17
+ ---
18
+
19
+ # Tiangong AI CLI
20
+
21
+ Package: `@tiangong-ai/cli` Executable: `tiangong-ai` Node: `>=24`
22
+
23
+ ## Run From This Repository
24
+
25
+ ```bash
26
+ npm install
27
+ npm run build
28
+ node ./bin/tiangong-ai.js --help
29
+ ```
30
+
31
+ Use Node `24.x`; this package declares `>=24 <25` and includes `.nvmrc` for
32
+ compatible version managers.
33
+
34
+ ## KB Ingest
35
+
36
+ Required environment:
37
+
38
+ ```bash
39
+ TIANGONG_AI_API_KEY=
40
+ TIANGONG_KB_DEFAULT_COLLECTION_NAME=
41
+ ```
42
+
43
+ The KB API server defaults to `https://thuenv.tiangong.world:7300` with path
44
+ prefix `/api/v1/kb`.
45
+
46
+ Upload one file:
47
+
48
+ ```bash
49
+ tiangong-ai kb ingest upload /path/to/document.pdf
50
+ ```
51
+
52
+ Upload a folder recursively with local checkpointing:
53
+
54
+ ```bash
55
+ tiangong-ai kb ingest upload /path/to/folder --recursive --concurrency 3 --retries 3
56
+ ```
57
+
58
+ List uploadable collections:
59
+
60
+ ```bash
61
+ tiangong-ai kb collections list --capability upload
62
+ ```
63
+
64
+ Check document status:
65
+
66
+ ```bash
67
+ tiangong-ai kb ingest status <document-id>
68
+ ```
69
+
70
+ ## Boundary
71
+
72
+ The CLI is a thin local client. It sends bearer-token requests to the Tiangong
73
+ KB ingest API and records local manifests for batch recovery. The backend owns
74
+ authorization, collection permissions, duplicate detection, NAS raw writes,
75
+ parse queueing, and status transitions.
76
+
77
+ ## Validation
78
+
79
+ ```bash
80
+ npm run lint
81
+ npm test
82
+ npm run test:coverage
83
+ docpact validate-config --root . --strict
84
+ ```
85
+
86
+ ## Release
87
+
88
+ Publishing is handled by GitHub Actions in `.github/workflows/npm-publish.yml`.
89
+ Push a `v*` tag that matches `package.json` version. The workflow publishes
90
+ `@tiangong-ai/cli` to npm through npm Trusted Publishing after lint, tests,
91
+ coverage, version availability, and a package dry run pass.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/main.js";
package/dist/cli.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ export declare const DEFAULT_API_BASE_URL = "https://thuenv.tiangong.world:7300";
2
+ export declare const DEFAULT_API_PATH_PREFIX = "/api/v1/kb";
3
+ type Output = Pick<NodeJS.WriteStream, "write">;
4
+ export interface CliIO {
5
+ env: NodeJS.ProcessEnv;
6
+ stdout: Output;
7
+ stderr: Output;
8
+ }
9
+ interface ParsedArgs {
10
+ positionals: string[];
11
+ flags: Map<string, string | true>;
12
+ }
13
+ interface CollectionSelector {
14
+ field: "primary_collection_id" | "collection_path" | "collection_key" | "collection_name";
15
+ value: string;
16
+ }
17
+ export declare function runCli(argv: string[], io: CliIO): Promise<number>;
18
+ export declare function parseArgs(argv: string[]): ParsedArgs;
19
+ export declare function resolveCollectionSelector(args: ParsedArgs, env: NodeJS.ProcessEnv): CollectionSelector;
20
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,754 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { createReadStream, openAsBlob, readFileSync } from "node:fs";
3
+ import { appendFile, mkdir, readFile, stat } from "node:fs/promises";
4
+ import { basename, dirname, resolve } from "node:path";
5
+ import { setTimeout as sleep } from "node:timers/promises";
6
+ import { fileURLToPath } from "node:url";
7
+ export const DEFAULT_API_BASE_URL = "https://thuenv.tiangong.world:7300";
8
+ export const DEFAULT_API_PATH_PREFIX = "/api/v1/kb";
9
+ const DEFAULT_CONCURRENCY = 3;
10
+ const DEFAULT_RETRIES = 3;
11
+ const DEFAULT_MANIFEST = ".tiangong-kb-ingest-manifest.jsonl";
12
+ const RETRYABLE_HTTP_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);
13
+ const TERMINAL_STATUSES = new Set(["completed", "failed", "deleted"]);
14
+ const DEFAULT_POLL_INTERVAL_SECONDS = 2;
15
+ const DEFAULT_WAIT_TIMEOUT_SECONDS = 300;
16
+ class CliError extends Error {
17
+ exitCode;
18
+ constructor(message, exitCode = 1) {
19
+ super(message);
20
+ this.exitCode = exitCode;
21
+ }
22
+ }
23
+ class HttpError extends CliError {
24
+ status;
25
+ retryAfterSeconds;
26
+ retryable;
27
+ constructor(message, status, retryAfterSeconds, retryable) {
28
+ super(message);
29
+ this.status = status;
30
+ this.retryAfterSeconds = retryAfterSeconds;
31
+ this.retryable = retryable;
32
+ }
33
+ }
34
+ export async function runCli(argv, io) {
35
+ try {
36
+ loadDotenv(io.env);
37
+ if (argv.length === 0 || argv[0] === "--help" || argv[0] === "-h") {
38
+ write(io.stdout, topHelp());
39
+ return 0;
40
+ }
41
+ const [command, subcommand, ...rest] = argv;
42
+ if (command === "doctor") {
43
+ if (subcommand === "--help" || subcommand === "-h") {
44
+ write(io.stdout, "Usage: tiangong-ai doctor\n");
45
+ return 0;
46
+ }
47
+ return await doctor(rest, io);
48
+ }
49
+ if (command === "kb") {
50
+ if (!subcommand || subcommand === "--help" || subcommand === "-h") {
51
+ write(io.stdout, kbHelp());
52
+ return 0;
53
+ }
54
+ if (subcommand === "ingest" || subcommand === "upload") {
55
+ if (rest[0] === "status") {
56
+ return await kbStatus(rest.slice(1), io);
57
+ }
58
+ if (rest[0] === "upload") {
59
+ return await kbIngest(rest.slice(1), io);
60
+ }
61
+ return await kbIngest(rest, io);
62
+ }
63
+ if (subcommand === "collections") {
64
+ if (rest[0] === "list") {
65
+ return await kbCollections(rest.slice(1), io);
66
+ }
67
+ return await kbCollections(rest, io);
68
+ }
69
+ if (subcommand === "status") {
70
+ return await kbStatus(rest, io);
71
+ }
72
+ write(io.stdout, kbHelp());
73
+ return 1;
74
+ }
75
+ throw new CliError(`Unknown command: ${command}`);
76
+ }
77
+ catch (error) {
78
+ if (error instanceof CliError) {
79
+ write(io.stderr, `${error.message}\n`);
80
+ return error.exitCode;
81
+ }
82
+ throw error;
83
+ }
84
+ }
85
+ export function parseArgs(argv) {
86
+ const positionals = [];
87
+ const flags = new Map();
88
+ for (let index = 0; index < argv.length; index += 1) {
89
+ const arg = argv[index];
90
+ if (!arg)
91
+ continue;
92
+ if (!arg.startsWith("--")) {
93
+ positionals.push(arg);
94
+ continue;
95
+ }
96
+ const withoutPrefix = arg.slice(2);
97
+ const equalsIndex = withoutPrefix.indexOf("=");
98
+ if (equalsIndex >= 0) {
99
+ flags.set(withoutPrefix.slice(0, equalsIndex), withoutPrefix.slice(equalsIndex + 1));
100
+ continue;
101
+ }
102
+ const next = argv[index + 1];
103
+ if (next && !next.startsWith("--")) {
104
+ flags.set(withoutPrefix, next);
105
+ index += 1;
106
+ }
107
+ else {
108
+ flags.set(withoutPrefix, true);
109
+ }
110
+ }
111
+ return { positionals, flags };
112
+ }
113
+ export function resolveCollectionSelector(args, env) {
114
+ const selectors = [];
115
+ addSelector(selectors, "primary_collection_id", getString(args, "collection-id"));
116
+ addSelector(selectors, "collection_path", getString(args, "collection-path"));
117
+ addSelector(selectors, "collection_key", getString(args, "collection-key"));
118
+ addSelector(selectors, "collection_name", getString(args, "collection-name"));
119
+ if (selectors.length > 1) {
120
+ throw new CliError("Provide exactly one collection selector.");
121
+ }
122
+ if (selectors.length === 1)
123
+ return selectors[0];
124
+ const envName = firstEnv(env, "TIANGONG_KB_DEFAULT_COLLECTION_NAME");
125
+ if (envName)
126
+ return { field: "collection_name", value: envName };
127
+ const legacyName = firstEnv(env, "TIANGONG_KB_DEFAULT_COLLECTION_ID");
128
+ if (legacyName) {
129
+ if (isUuid(legacyName)) {
130
+ throw new CliError("TIANGONG_KB_DEFAULT_COLLECTION_ID is treated as a collection name. Use --collection-id for UUID uploads.");
131
+ }
132
+ return { field: "collection_name", value: legacyName };
133
+ }
134
+ const envPath = firstEnv(env, "TIANGONG_KB_DEFAULT_COLLECTION_PATH");
135
+ if (envPath)
136
+ return { field: "collection_path", value: envPath };
137
+ const envKey = firstEnv(env, "TIANGONG_KB_DEFAULT_COLLECTION_KEY");
138
+ if (envKey)
139
+ return { field: "collection_key", value: envKey };
140
+ throw new CliError("Missing collection selector. Provide --collection-name, --collection-key, --collection-path, --collection-id, or set TIANGONG_KB_DEFAULT_COLLECTION_NAME.");
141
+ }
142
+ async function doctor(argv, io) {
143
+ const args = parseArgs(argv);
144
+ const config = resolveConfig(args, io.env, { requireKey: false });
145
+ const collection = firstEnv(io.env, "TIANGONG_KB_DEFAULT_COLLECTION_NAME") ??
146
+ firstEnv(io.env, "TIANGONG_KB_DEFAULT_COLLECTION_KEY") ??
147
+ firstEnv(io.env, "TIANGONG_KB_DEFAULT_COLLECTION_PATH") ??
148
+ "";
149
+ const payload = {
150
+ apiBaseUrl: config.apiBaseUrl,
151
+ apiPathPrefix: config.apiPathPrefix,
152
+ apiKeyPresent: Boolean(firstEnv(io.env, "TIANGONG_AI_API_KEY", "TIANGONG_KB_API_KEY")),
153
+ defaultCollectionPresent: Boolean(collection),
154
+ };
155
+ write(io.stdout, `${JSON.stringify(payload, null, 2)}\n`);
156
+ return 0;
157
+ }
158
+ async function kbCollections(argv, io) {
159
+ const args = parseArgs(argv);
160
+ const config = resolveConfig(args, io.env);
161
+ const capability = getString(args, "capability") ?? "upload";
162
+ const limit = getPositiveInteger(args, "limit", 100);
163
+ const collections = await listCollections(config, capability, limit);
164
+ writeJsonOrText(io.stdout, args, collections, () => collections
165
+ .map((item) => `${item.name ?? ""}\t${collectionKey(item) ?? ""}\t${collectionPath(item) ?? ""}\t${item.id ?? ""}`)
166
+ .join("\n")
167
+ .concat(collections.length ? "\n" : ""));
168
+ return 0;
169
+ }
170
+ async function kbStatus(argv, io) {
171
+ const args = parseArgs(argv);
172
+ const [documentId] = args.positionals;
173
+ if (!documentId)
174
+ throw new CliError("Usage: tiangong-ai kb status <document-id>");
175
+ const config = resolveConfig(args, io.env);
176
+ const payload = await jsonRequest(config, `documents/${encodeURIComponent(documentId)}`);
177
+ writeJsonOrText(io.stdout, args, payload, () => `${JSON.stringify(payload, null, 2)}\n`);
178
+ return 0;
179
+ }
180
+ async function kbIngest(argv, io) {
181
+ const args = parseArgs(argv);
182
+ const config = resolveConfig(args, io.env);
183
+ const targetPath = args.positionals[0];
184
+ if (!targetPath)
185
+ throw new CliError("Usage: tiangong-ai kb ingest <file-or-folder>");
186
+ const selector = resolveCollectionSelector(args, io.env);
187
+ const selectorFields = await resolveSelectorFields(config, selector);
188
+ const recursive = getBoolean(args, "recursive");
189
+ const force = getBoolean(args, "force");
190
+ const waitForTerminal = getBoolean(args, "wait");
191
+ const concurrency = positiveIntegerValue(getString(args, "concurrency") ?? firstEnv(io.env, "TIANGONG_KB_UPLOAD_CONCURRENCY"), DEFAULT_CONCURRENCY, "--concurrency");
192
+ const retries = nonNegativeIntegerValue(getString(args, "retries") ?? firstEnv(io.env, "TIANGONG_KB_UPLOAD_RETRIES"), DEFAULT_RETRIES, "--retries");
193
+ const manifestPath = resolve(getString(args, "manifest") ??
194
+ firstEnv(io.env, "TIANGONG_KB_MANIFEST_PATH") ??
195
+ DEFAULT_MANIFEST);
196
+ const metadata = await loadMetadata(args);
197
+ const files = await collectFiles(resolve(targetPath), recursive);
198
+ const manifest = await loadManifest(manifestPath);
199
+ const plans = await Promise.all(files.map((file) => fingerprintFile(file)));
200
+ const uploadPlans = plans.filter((plan) => force || manifest.get(plan.manifestKey)?.status !== "succeeded");
201
+ await mkdir(dirname(manifestPath), { recursive: true });
202
+ if (uploadPlans.length === 0) {
203
+ const summary = { total: plans.length, uploaded: 0, skipped: plans.length, failed: 0 };
204
+ writeJsonOrText(io.stdout, args, summary, () => `No files to upload; ${plans.length} already succeeded.\n`);
205
+ return 0;
206
+ }
207
+ const results = await runPool(uploadPlans, concurrency, async (plan) => {
208
+ const result = await uploadWithRetries({
209
+ args,
210
+ config,
211
+ selectorFields,
212
+ plan,
213
+ metadata,
214
+ retries,
215
+ waitForTerminal,
216
+ env: io.env,
217
+ });
218
+ await appendManifest(manifestPath, result);
219
+ if (!getBoolean(args, "json")) {
220
+ write(io.stdout, formatUploadLine(result));
221
+ }
222
+ return result;
223
+ });
224
+ const failed = results.filter((item) => item.status === "failed").length;
225
+ const summary = {
226
+ total: plans.length,
227
+ uploaded: results.filter((item) => item.status === "succeeded").length,
228
+ skipped: plans.length - uploadPlans.length,
229
+ failed,
230
+ manifest: manifestPath,
231
+ results,
232
+ };
233
+ if (getBoolean(args, "json")) {
234
+ write(io.stdout, `${JSON.stringify(summary, null, 2)}\n`);
235
+ }
236
+ else {
237
+ write(io.stdout, `Summary: uploaded=${summary.uploaded} skipped=${summary.skipped} failed=${failed}\n`);
238
+ }
239
+ return failed > 0 ? 1 : 0;
240
+ }
241
+ async function uploadWithRetries(input) {
242
+ let lastError;
243
+ for (let attempt = 1; attempt <= input.retries + 1; attempt += 1) {
244
+ const requestId = randomUUID();
245
+ const idempotencyKey = `tiangong-kb-ingest:${input.plan.sha256}:${input.plan.size}`;
246
+ try {
247
+ const response = await uploadOne({
248
+ ...input,
249
+ requestId,
250
+ idempotencyKey,
251
+ });
252
+ const documentId = documentIdFromUpload(response);
253
+ const existingDocumentId = existingDocumentIdFromUpload(response);
254
+ let finalResponse = response;
255
+ if (input.waitForTerminal && documentId) {
256
+ finalResponse = await waitForStatus(input.config, documentId, input.args, input.env);
257
+ }
258
+ const result = {
259
+ key: input.plan.manifestKey,
260
+ path: input.plan.path,
261
+ sha256: input.plan.sha256,
262
+ status: "succeeded",
263
+ attempts: attempt,
264
+ response: finalResponse,
265
+ requestId,
266
+ idempotencyKey,
267
+ updatedAt: new Date().toISOString(),
268
+ };
269
+ if (documentId)
270
+ result.documentId = documentId;
271
+ if (existingDocumentId)
272
+ result.existingDocumentId = existingDocumentId;
273
+ const duplicate = duplicateFromUpload(response);
274
+ if (duplicate !== undefined)
275
+ result.duplicate = duplicate;
276
+ return result;
277
+ }
278
+ catch (error) {
279
+ lastError = error;
280
+ const retryable = error instanceof HttpError ? error.retryable : true;
281
+ if (!retryable || attempt > input.retries)
282
+ break;
283
+ await sleep(retryDelay(error, attempt) * 1000);
284
+ }
285
+ }
286
+ return {
287
+ key: input.plan.manifestKey,
288
+ path: input.plan.path,
289
+ sha256: input.plan.sha256,
290
+ status: "failed",
291
+ attempts: input.retries + 1,
292
+ error: lastError instanceof Error ? lastError.message : String(lastError),
293
+ updatedAt: new Date().toISOString(),
294
+ };
295
+ }
296
+ async function uploadOne(input) {
297
+ const form = new FormData();
298
+ for (const [key, value] of Object.entries(input.selectorFields)) {
299
+ form.set(key, value);
300
+ }
301
+ form.set("metadata_json", JSON.stringify({
302
+ ...input.metadata,
303
+ client_filename: input.plan.filename,
304
+ client_size: input.plan.size,
305
+ client_mtime_ms: input.plan.mtimeMs,
306
+ }));
307
+ form.set("request_id", input.requestId);
308
+ const dedupeScope = getString(input.args, "dedupe-scope");
309
+ if (dedupeScope)
310
+ form.set("dedupe_scope", dedupeScope);
311
+ const visibility = getString(input.args, "visibility");
312
+ if (visibility)
313
+ form.set("visibility", visibility);
314
+ const blob = await openAsBlob(input.plan.path, { type: mimeType(input.plan.path) });
315
+ form.set("file", blob, input.plan.filename);
316
+ return jsonRequest(input.config, "documents", {
317
+ method: "POST",
318
+ body: form,
319
+ headers: {
320
+ "Idempotency-Key": input.idempotencyKey,
321
+ "X-Request-Id": input.requestId,
322
+ },
323
+ });
324
+ }
325
+ async function resolveSelectorFields(config, selector) {
326
+ if (selector.field !== "collection_name") {
327
+ return { [selector.field]: selector.value };
328
+ }
329
+ const matches = (await listCollections(config, "upload", 100)).filter((item) => item.name === selector.value);
330
+ if (matches.length === 0)
331
+ throw new CliError(`No uploadable collection matched name: ${selector.value}`);
332
+ if (matches.length > 1) {
333
+ const choices = matches.map((item) => item.key ?? item.path ?? item.id ?? "").join(", ");
334
+ throw new CliError(`Collection name is not unique: ${selector.value}. Use --collection-key or --collection-path. Matches: ${choices}`);
335
+ }
336
+ const match = matches[0];
337
+ const key = collectionKey(match);
338
+ if (key)
339
+ return { collection_key: key };
340
+ const path = collectionPath(match);
341
+ if (path)
342
+ return { collection_path: path };
343
+ if (typeof match.id === "string" && match.id)
344
+ return { primary_collection_id: match.id };
345
+ throw new CliError(`Collection matched name ${selector.value}, but response had no key, path, or id.`);
346
+ }
347
+ async function listCollections(config, capability, limit) {
348
+ const collections = [];
349
+ let offset = 0;
350
+ while (true) {
351
+ const payload = await jsonRequest(config, `collections?${new URLSearchParams({
352
+ capability,
353
+ limit: String(limit),
354
+ offset: String(offset),
355
+ }).toString()}`);
356
+ const page = collectionItems(payload);
357
+ collections.push(...page);
358
+ if (page.length < limit)
359
+ return collections;
360
+ offset += limit;
361
+ }
362
+ }
363
+ async function waitForStatus(config, documentId, args, env) {
364
+ const timeoutSeconds = positiveNumberValue(getString(args, "wait-timeout") ?? firstEnv(env, "TIANGONG_KB_WAIT_TIMEOUT"), DEFAULT_WAIT_TIMEOUT_SECONDS, "--wait-timeout");
365
+ const intervalSeconds = positiveNumberValue(getString(args, "poll-interval") ?? firstEnv(env, "TIANGONG_KB_POLL_INTERVAL"), DEFAULT_POLL_INTERVAL_SECONDS, "--poll-interval");
366
+ const startedAt = Date.now();
367
+ while (Date.now() - startedAt < timeoutSeconds * 1000) {
368
+ const payload = await jsonRequest(config, `documents/${encodeURIComponent(documentId)}`);
369
+ const status = statusFromPayload(payload);
370
+ if (status && TERMINAL_STATUSES.has(status))
371
+ return payload;
372
+ await sleep(intervalSeconds * 1000);
373
+ }
374
+ throw new CliError(`Timed out waiting for document ${documentId}.`);
375
+ }
376
+ async function jsonRequest(config, path, init = {}) {
377
+ const url = `${config.apiBaseUrl}${config.apiPathPrefix}/${path.replace(/^\/+/, "")}`;
378
+ const headers = new Headers(init.headers);
379
+ headers.set("Authorization", `Bearer ${config.apiKey}`);
380
+ headers.set("Accept", "application/json");
381
+ if (init.body && !(init.body instanceof FormData)) {
382
+ headers.set("Content-Type", "application/json");
383
+ }
384
+ let response;
385
+ try {
386
+ response = await fetch(url, {
387
+ ...init,
388
+ headers,
389
+ signal: AbortSignal.timeout(config.timeoutSeconds * 1000),
390
+ });
391
+ }
392
+ catch (error) {
393
+ throw new HttpError(`Request failed for ${url}: ${error instanceof Error ? error.message : String(error)}`, undefined, undefined, true);
394
+ }
395
+ const text = await response.text();
396
+ if (!response.ok) {
397
+ throw new HttpError(`HTTP ${response.status} from ${url}: ${text}`, response.status, retryAfterSeconds(response.headers), RETRYABLE_HTTP_STATUSES.has(response.status));
398
+ }
399
+ if (!text.trim())
400
+ return {};
401
+ try {
402
+ return JSON.parse(text);
403
+ }
404
+ catch {
405
+ throw new CliError(`Expected JSON from ${url}, got: ${text.slice(0, 200)}`);
406
+ }
407
+ }
408
+ function resolveConfig(args, env, options = {}) {
409
+ const requireKey = options.requireKey ?? true;
410
+ const apiKey = getString(args, "api-key") ?? firstEnv(env, "TIANGONG_AI_API_KEY", "TIANGONG_KB_API_KEY") ?? "";
411
+ if (requireKey && !apiKey) {
412
+ throw new CliError("Missing API key. Provide --api-key or set TIANGONG_AI_API_KEY.");
413
+ }
414
+ return {
415
+ apiBaseUrl: (getString(args, "api-base-url") ??
416
+ firstEnv(env, "TIANGONG_KB_API_BASE_URL") ??
417
+ DEFAULT_API_BASE_URL).replace(/\/+$/, ""),
418
+ apiPathPrefix: normalizePrefix(getString(args, "api-path-prefix") ??
419
+ firstEnv(env, "TIANGONG_KB_API_PATH_PREFIX") ??
420
+ DEFAULT_API_PATH_PREFIX),
421
+ apiKey,
422
+ timeoutSeconds: positiveNumberValue(getString(args, "timeout") ?? firstEnv(env, "TIANGONG_KB_TIMEOUT"), 120, "--timeout"),
423
+ };
424
+ }
425
+ async function collectFiles(path, recursive) {
426
+ const item = await stat(path).catch(() => undefined);
427
+ if (!item)
428
+ throw new CliError(`Path not found: ${path}`);
429
+ if (item.isFile())
430
+ return [path];
431
+ if (!item.isDirectory())
432
+ throw new CliError(`Path is not a file or directory: ${path}`);
433
+ if (!recursive)
434
+ throw new CliError(`Path is a directory. Pass --recursive to upload its files: ${path}`);
435
+ const { readdir } = await import("node:fs/promises");
436
+ const files = [];
437
+ async function walk(dir) {
438
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
439
+ const child = resolve(dir, entry.name);
440
+ if (entry.isDirectory()) {
441
+ await walk(child);
442
+ }
443
+ else if (entry.isFile()) {
444
+ files.push(child);
445
+ }
446
+ }
447
+ }
448
+ await walk(path);
449
+ if (files.length === 0)
450
+ throw new CliError(`No files found: ${path}`);
451
+ return files.sort();
452
+ }
453
+ async function fingerprintFile(path) {
454
+ const info = await stat(path);
455
+ const hash = createHash("sha256");
456
+ await new Promise((resolvePromise, reject) => {
457
+ createReadStream(path)
458
+ .on("data", (chunk) => hash.update(chunk))
459
+ .on("error", reject)
460
+ .on("end", resolvePromise);
461
+ });
462
+ const sha256 = hash.digest("hex");
463
+ return {
464
+ path,
465
+ filename: basename(path),
466
+ size: info.size,
467
+ mtimeMs: info.mtimeMs,
468
+ sha256,
469
+ manifestKey: `${sha256}:${info.size}`,
470
+ };
471
+ }
472
+ async function loadManifest(path) {
473
+ const records = new Map();
474
+ const content = await readFile(path, "utf8").catch((error) => {
475
+ if (error.code === "ENOENT")
476
+ return "";
477
+ throw error;
478
+ });
479
+ for (const line of content.split(/\r?\n/)) {
480
+ if (!line.trim())
481
+ continue;
482
+ const record = JSON.parse(line);
483
+ records.set(record.key, record);
484
+ }
485
+ return records;
486
+ }
487
+ async function appendManifest(path, record) {
488
+ await appendFile(path, `${JSON.stringify(record)}\n`, "utf8");
489
+ }
490
+ async function loadMetadata(args) {
491
+ const metadataFile = getString(args, "metadata-file");
492
+ const metadataJson = getString(args, "metadata-json");
493
+ if (metadataFile && metadataJson)
494
+ throw new CliError("Use only one of --metadata-file or --metadata-json.");
495
+ if (!metadataFile && !metadataJson)
496
+ return {};
497
+ const raw = metadataFile ? await readFile(resolve(metadataFile), "utf8") : metadataJson;
498
+ const parsed = JSON.parse(raw ?? "{}");
499
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
500
+ throw new CliError("Metadata must be a JSON object.");
501
+ }
502
+ return parsed;
503
+ }
504
+ async function runPool(items, concurrency, worker) {
505
+ const results = [];
506
+ let index = 0;
507
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
508
+ while (index < items.length) {
509
+ const item = items[index];
510
+ index += 1;
511
+ results.push(await worker(item));
512
+ }
513
+ });
514
+ await Promise.all(workers);
515
+ return results;
516
+ }
517
+ function collectionItems(payload) {
518
+ const data = responseData(payload);
519
+ if (Array.isArray(data))
520
+ return data.filter(isObject);
521
+ if (isObject(data) && Array.isArray(data.collections))
522
+ return data.collections.filter(isObject);
523
+ if (isObject(data) && Array.isArray(data.data))
524
+ return data.data.filter(isObject);
525
+ if (isObject(payload) && Array.isArray(payload.data))
526
+ return payload.data.filter(isObject);
527
+ throw new CliError("Collection list response did not contain a data array.");
528
+ }
529
+ function collectionKey(item) {
530
+ return (stringField(item, "key") ??
531
+ stringField(item, "collectionKey") ??
532
+ stringField(item, "collection_key"));
533
+ }
534
+ function collectionPath(item) {
535
+ return (stringField(item, "path") ??
536
+ stringField(item, "collectionPath") ??
537
+ stringField(item, "collection_path"));
538
+ }
539
+ function responseData(payload) {
540
+ if (isObject(payload) && "data" in payload && "api_version" in payload)
541
+ return payload.data;
542
+ return payload;
543
+ }
544
+ function documentIdFromUpload(payload) {
545
+ const data = responseData(payload);
546
+ if (!isObject(data))
547
+ return undefined;
548
+ return (stringField(data, "document_id") ??
549
+ stringField(data, "documentId") ??
550
+ existingDocumentIdFromUpload(payload));
551
+ }
552
+ function existingDocumentIdFromUpload(payload) {
553
+ const data = responseData(payload);
554
+ if (!isObject(data))
555
+ return undefined;
556
+ return stringField(data, "existing_document_id") ?? stringField(data, "existingDocumentId");
557
+ }
558
+ function duplicateFromUpload(payload) {
559
+ const data = responseData(payload);
560
+ if (!isObject(data))
561
+ return undefined;
562
+ const value = data.duplicate ?? data.isDuplicate;
563
+ return typeof value === "boolean" ? value : undefined;
564
+ }
565
+ function statusFromPayload(payload) {
566
+ const data = responseData(payload);
567
+ if (!isObject(data))
568
+ return undefined;
569
+ return stringField(data, "status");
570
+ }
571
+ function writeJsonOrText(stdout, args, payload, text) {
572
+ write(stdout, getBoolean(args, "json") ? `${JSON.stringify(payload, null, 2)}\n` : text());
573
+ }
574
+ function formatUploadLine(result) {
575
+ if (result.status === "failed")
576
+ return `FAIL ${result.path}: ${result.error}\n`;
577
+ const duplicate = result.duplicate === undefined ? "" : ` duplicate=${result.duplicate}`;
578
+ const existing = result.existingDocumentId ? ` existing=${result.existingDocumentId}` : "";
579
+ return `OK ${result.path} document=${result.documentId ?? ""}${duplicate}${existing}\n`;
580
+ }
581
+ function addSelector(selectors, field, value) {
582
+ if (value)
583
+ selectors.push({ field, value });
584
+ }
585
+ function getString(args, name) {
586
+ const value = args.flags.get(name);
587
+ if (typeof value !== "string" || value.trim() === "")
588
+ return undefined;
589
+ return value.trim();
590
+ }
591
+ function getBoolean(args, name) {
592
+ return args.flags.get(name) === true || args.flags.get(name) === "true";
593
+ }
594
+ function getPositiveInteger(args, name, defaultValue) {
595
+ return positiveIntegerValue(getString(args, name), defaultValue, `--${name}`);
596
+ }
597
+ function positiveIntegerValue(value, defaultValue, label) {
598
+ if (!value)
599
+ return defaultValue;
600
+ const parsed = Number(value);
601
+ if (!Number.isInteger(parsed) || parsed <= 0)
602
+ throw new CliError(`${label} must be a positive integer.`);
603
+ return parsed;
604
+ }
605
+ function getNonNegativeInteger(args, name, defaultValue) {
606
+ return nonNegativeIntegerValue(getString(args, name), defaultValue, `--${name}`);
607
+ }
608
+ function nonNegativeIntegerValue(value, defaultValue, label) {
609
+ if (!value)
610
+ return defaultValue;
611
+ const parsed = Number(value);
612
+ if (!Number.isInteger(parsed) || parsed < 0)
613
+ throw new CliError(`${label} must be a non-negative integer.`);
614
+ return parsed;
615
+ }
616
+ function getPositiveNumber(args, name, defaultValue) {
617
+ return positiveNumberValue(getString(args, name), defaultValue, `--${name}`);
618
+ }
619
+ function positiveNumberValue(value, defaultValue, label) {
620
+ if (!value)
621
+ return defaultValue;
622
+ const parsed = Number(value);
623
+ if (!Number.isFinite(parsed) || parsed <= 0)
624
+ throw new CliError(`${label} must be a positive number.`);
625
+ return parsed;
626
+ }
627
+ function firstEnv(env, ...names) {
628
+ for (const name of names) {
629
+ const value = env[name]?.trim();
630
+ if (value)
631
+ return value;
632
+ }
633
+ return undefined;
634
+ }
635
+ function normalizePrefix(value) {
636
+ return `/${value.replace(/^\/+|\/+$/g, "")}`;
637
+ }
638
+ function retryAfterSeconds(headers) {
639
+ const value = headers.get("Retry-After");
640
+ if (!value)
641
+ return undefined;
642
+ const parsed = Number(value);
643
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
644
+ }
645
+ function retryDelay(error, attempt) {
646
+ if (error instanceof HttpError && error.retryAfterSeconds)
647
+ return Math.min(error.retryAfterSeconds, 30);
648
+ return Math.min(2 * 2 ** Math.max(0, attempt - 1), 30);
649
+ }
650
+ function mimeType(path) {
651
+ if (path.endsWith(".pdf"))
652
+ return "application/pdf";
653
+ if (path.endsWith(".txt"))
654
+ return "text/plain";
655
+ if (path.endsWith(".md"))
656
+ return "text/markdown";
657
+ if (path.endsWith(".json"))
658
+ return "application/json";
659
+ if (path.endsWith(".docx")) {
660
+ return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
661
+ }
662
+ if (path.endsWith(".xlsx")) {
663
+ return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
664
+ }
665
+ if (path.endsWith(".pptx")) {
666
+ return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
667
+ }
668
+ return "application/octet-stream";
669
+ }
670
+ function isUuid(value) {
671
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
672
+ }
673
+ function isObject(value) {
674
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
675
+ }
676
+ function stringField(value, field) {
677
+ const candidate = value[field];
678
+ return typeof candidate === "string" && candidate ? candidate : undefined;
679
+ }
680
+ function write(output, text) {
681
+ output.write(text);
682
+ }
683
+ function loadDotenv(env) {
684
+ const cwd = dirname(fileURLToPath(import.meta.url));
685
+ const candidates = [resolve(process.cwd(), ".env"), resolve(cwd, "../.env")];
686
+ for (const candidate of candidates) {
687
+ const content = readEnvFile(candidate);
688
+ if (!content)
689
+ continue;
690
+ for (const line of content.split(/\r?\n/)) {
691
+ const trimmed = line.trim();
692
+ if (!trimmed || trimmed.startsWith("#") || !trimmed.includes("="))
693
+ continue;
694
+ const [rawKey, ...rawValue] = trimmed.replace(/^export\s+/, "").split("=");
695
+ const key = rawKey?.trim();
696
+ if (!key || env[key])
697
+ continue;
698
+ env[key] = rawValue
699
+ .join("=")
700
+ .trim()
701
+ .replace(/^["']|["']$/g, "");
702
+ }
703
+ }
704
+ }
705
+ function readEnvFile(path) {
706
+ try {
707
+ return readFileSync(path, "utf8");
708
+ }
709
+ catch {
710
+ return undefined;
711
+ }
712
+ }
713
+ function topHelp() {
714
+ return `Tiangong AI CLI
715
+
716
+ Usage:
717
+ tiangong-ai doctor [--json]
718
+ tiangong-ai kb ingest upload <file-or-folder> [--recursive] [--concurrency 3]
719
+ tiangong-ai kb ingest status <document-id>
720
+ tiangong-ai kb collections list [--capability upload]
721
+
722
+ Run "tiangong-ai kb --help" for KB options.
723
+ `;
724
+ }
725
+ function kbHelp() {
726
+ return `Tiangong KB commands
727
+
728
+ Usage:
729
+ tiangong-ai kb ingest upload <file-or-folder> [options]
730
+ tiangong-ai kb ingest status <document-id> [--json]
731
+ tiangong-ai kb collections list [--capability upload] [--json]
732
+
733
+ Common options:
734
+ --api-key <token>
735
+ --api-base-url <url>
736
+ --api-path-prefix <path>
737
+ --collection-name <name>
738
+ --collection-key <key>
739
+ --collection-path <path>
740
+ --collection-id <uuid>
741
+ --json
742
+
743
+ Ingest options:
744
+ --recursive
745
+ --manifest <path>
746
+ --concurrency <n>
747
+ --retries <n>
748
+ --force
749
+ --wait
750
+ --metadata-json <json>
751
+ --metadata-file <path>
752
+ `;
753
+ }
754
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,8 @@
1
+ import { runCli } from "./cli.js";
2
+ const exitCode = await runCli(process.argv.slice(2), {
3
+ env: process.env,
4
+ stdout: process.stdout,
5
+ stderr: process.stderr,
6
+ });
7
+ process.exitCode = exitCode;
8
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACnD,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,MAAM,EAAE,OAAO,CAAC,MAAM;IACtB,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC;AAEH,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@tiangong-ai/cli",
3
+ "version": "0.0.1",
4
+ "description": "Tiangong AI command-line interface.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/tiangong-ai/cli.git"
8
+ },
9
+ "homepage": "https://github.com/tiangong-ai/cli#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/tiangong-ai/cli/issues"
12
+ },
13
+ "type": "module",
14
+ "bin": {
15
+ "tiangong-ai": "./bin/tiangong-ai.js"
16
+ },
17
+ "files": [
18
+ "bin/",
19
+ "dist/",
20
+ "README.md",
21
+ "AGENTS.md",
22
+ "LICENSE"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.build.json",
29
+ "prepack": "npm run build",
30
+ "typecheck": "tsc --noEmit",
31
+ "test": "npm run build && node --import tsx --test test/*.test.ts",
32
+ "test:coverage": "npm run build && node ./scripts/run-test-coverage.cjs",
33
+ "prepush:gate": "npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce",
34
+ "lint": "npm run lint:format && npm run lint:coverage-guards",
35
+ "lint:format": "prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"",
36
+ "lint:coverage-guards": "node ./scripts/assert-no-coverage-ignore.cjs",
37
+ "format": "prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"",
38
+ "clean": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\""
39
+ },
40
+ "engines": {
41
+ "node": ">=24 <25"
42
+ },
43
+ "keywords": [
44
+ "tiangong",
45
+ "ai",
46
+ "cli",
47
+ "kb"
48
+ ],
49
+ "license": "MIT",
50
+ "devDependencies": {
51
+ "@types/node": "^24.12.2",
52
+ "c8": "^11.0.0",
53
+ "prettier": "^3.8.1",
54
+ "tsx": "^4.21.0",
55
+ "typescript": "^5.9.3"
56
+ }
57
+ }