@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 +72 -0
- package/LICENSE +21 -0
- package/README.md +91 -0
- package/bin/tiangong-ai.js +2 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.js +754 -0
- package/dist/cli.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +8 -0
- package/dist/main.js.map +1 -0
- package/package.json +57 -0
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.
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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
package/dist/main.js.map
ADDED
|
@@ -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
|
+
}
|