@tiangong-ai/cli 0.0.13 → 0.0.14

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 (63) hide show
  1. package/AGENTS.md +4 -2
  2. package/README.md +59 -2
  3. package/dist/args.d.ts +13 -0
  4. package/dist/args.js +72 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/cli.d.ts +5 -21
  7. package/dist/cli.js +27 -445
  8. package/dist/cli.js.map +1 -1
  9. package/dist/data.d.ts +3 -0
  10. package/dist/data.js +16 -0
  11. package/dist/data.js.map +1 -0
  12. package/dist/edge-search.d.ts +54 -0
  13. package/dist/edge-search.js +108 -0
  14. package/dist/edge-search.js.map +1 -0
  15. package/dist/education/commands.d.ts +2 -0
  16. package/dist/education/commands.js +144 -0
  17. package/dist/education/commands.js.map +1 -0
  18. package/dist/education/config.d.ts +24 -0
  19. package/dist/education/config.js +127 -0
  20. package/dist/education/config.js.map +1 -0
  21. package/dist/education/types.d.ts +1 -0
  22. package/dist/education/types.js +2 -0
  23. package/dist/education/types.js.map +1 -0
  24. package/dist/env.d.ts +2 -0
  25. package/dist/env.js +42 -0
  26. package/dist/env.js.map +1 -0
  27. package/dist/errors.d.ts +24 -0
  28. package/dist/errors.js +53 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/http.d.ts +28 -0
  31. package/dist/http.js +80 -0
  32. package/dist/http.js.map +1 -0
  33. package/dist/io.d.ts +11 -0
  34. package/dist/io.js +33 -0
  35. package/dist/io.js.map +1 -0
  36. package/dist/kb/client.d.ts +19 -0
  37. package/dist/kb/client.js +71 -0
  38. package/dist/kb/client.js.map +1 -0
  39. package/dist/kb/config.d.ts +12 -0
  40. package/dist/kb/config.js +26 -0
  41. package/dist/kb/config.js.map +1 -0
  42. package/dist/kb/pipeline-health.d.ts +10 -0
  43. package/dist/kb/pipeline-health.js +68 -0
  44. package/dist/kb/pipeline-health.js.map +1 -0
  45. package/dist/kb/selector.d.ts +3 -0
  46. package/dist/kb/selector.js +40 -0
  47. package/dist/kb/selector.js.map +1 -0
  48. package/dist/kb/status.d.ts +19 -0
  49. package/dist/kb/status.js +74 -0
  50. package/dist/kb/status.js.map +1 -0
  51. package/dist/research/commands.d.ts +2 -0
  52. package/dist/research/commands.js +147 -0
  53. package/dist/research/commands.js.map +1 -0
  54. package/dist/research/config.d.ts +23 -0
  55. package/dist/research/config.js +120 -0
  56. package/dist/research/config.js.map +1 -0
  57. package/dist/research/types.d.ts +1 -0
  58. package/dist/research/types.js +2 -0
  59. package/dist/research/types.js.map +1 -0
  60. package/dist/strict-args.d.ts +8 -0
  61. package/dist/strict-args.js +63 -0
  62. package/dist/strict-args.js.map +1 -0
  63. package/package.json +1 -1
package/AGENTS.md CHANGED
@@ -15,8 +15,8 @@ checkPaths:
15
15
  - .docpact/config.yaml
16
16
  - docs/agents/**
17
17
  - src/**
18
- lastReviewedAt: 2026-05-17
19
- lastReviewedCommit: d56d2633c2d69354d2cc787fe241459d887f22b9
18
+ lastReviewedAt: 2026-05-26
19
+ lastReviewedCommit: 6a05f20d5e167b770fce1aa3286a7dbdd2e1cd0d
20
20
  ---
21
21
 
22
22
  # Tiangong AI CLI Contract
@@ -44,6 +44,8 @@ This repository owns the Tiangong AI command-line interface.
44
44
  - `tiangong-ai kb ingest export`
45
45
  - `tiangong-ai kb collections`
46
46
  - `tiangong-ai kb status`
47
+ - `tiangong-ai research search`
48
+ - `tiangong-ai education search`
47
49
 
48
50
  ## Validation
49
51
 
package/README.md CHANGED
@@ -12,8 +12,8 @@ checkPaths:
12
12
  - package.json
13
13
  - bin/**
14
14
  - src/**
15
- lastReviewedAt: 2026-05-17
16
- lastReviewedCommit: d56d2633c2d69354d2cc787fe241459d887f22b9
15
+ lastReviewedAt: 2026-05-26
16
+ lastReviewedCommit: 6a05f20d5e167b770fce1aa3286a7dbdd2e1cd0d
17
17
  ---
18
18
 
19
19
  # Tiangong AI CLI
@@ -150,6 +150,63 @@ Check document status:
150
150
  tiangong-ai kb ingest status <document-id>
151
151
  ```
152
152
 
153
+ ## Research Search
154
+
155
+ Forward research-oriented search requests to SCI, report, and patent edge
156
+ search sources:
157
+
158
+ ```bash
159
+ tiangong-ai research search \
160
+ --input ./sci-request.json \
161
+ --sources all \
162
+ --dry-run \
163
+ --json
164
+ ```
165
+
166
+ Required environment:
167
+
168
+ ```bash
169
+ TIANGONG_AI_APIKEY=
170
+ ```
171
+
172
+ `--input <file>` reads a JSON object and forwards it unchanged as the POST body
173
+ to every selected source. Use `--dry-run` to emit the exact request plan,
174
+ including method, URL, masked headers, input path, body, and timeout
175
+ milliseconds, without remote calls.
176
+ For quick calls, `--query <text>` builds a minimal body with `query` plus
177
+ optional `--top-k`, `--ext-k`, and `--get-meta`.
178
+
179
+ `--sources` accepts concrete IDs and presets. `default` expands to `sci`; `all`
180
+ expands to `sci,report,patent`. Use source-specific endpoint or credential
181
+ overrides with `--sci-url`, `--report-url`, `--patent-url`,
182
+ `--sci-api-key`, `--report-api-key`, and `--patent-api-key`. When source URLs
183
+ are not provided, `--api-base-url` or `TIANGONG_AI_API_BASE_URL` may be a
184
+ Supabase project root, `/functions/v1`, or `/rest/v1`; the CLI derives the
185
+ Functions base URL and appends `sci_search`, `report_search`, or
186
+ `patent_search`.
187
+
188
+ ## Education Search
189
+
190
+ Forward education-oriented search requests to course, education, and textbook
191
+ edge search sources:
192
+
193
+ ```bash
194
+ tiangong-ai education search \
195
+ --query "activated sludge process principles" \
196
+ --sources all \
197
+ --json
198
+ ```
199
+
200
+ `--input <file>` forwards the JSON request body unchanged. `--query <text>`
201
+ builds a minimal body with `query` plus optional `--top-k` and `--ext-k`.
202
+ `--sources default` expands to `course`; `--sources all` expands to
203
+ `course,edu,textbook`. `course` search can use a scoped bearer token through
204
+ `--bearer-token` or `TIANGONG_EDUCATION_BEARER_TOKEN`; all education sources can
205
+ use `--api-key` or `TIANGONG_AI_APIKEY`. When source URLs are not provided,
206
+ `--api-base-url` or `TIANGONG_AI_API_BASE_URL` may be a Supabase project root,
207
+ `/functions/v1`, or `/rest/v1`; the CLI derives the Functions base URL and
208
+ appends `course_search`, `edu_search`, or `textbook_search`.
209
+
153
210
  ## Boundary
154
211
 
155
212
  The CLI is a thin local client. It sends bearer-token requests to the Tiangong
package/dist/args.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ export interface ParsedArgs {
2
+ positionals: string[];
3
+ flags: Map<string, string | true>;
4
+ }
5
+ export declare function parseArgs(argv: string[]): ParsedArgs;
6
+ export declare function getString(args: ParsedArgs, name: string): string | undefined;
7
+ export declare function getBoolean(args: ParsedArgs, name: string): boolean;
8
+ export declare function getPositiveInteger(args: ParsedArgs, name: string, defaultValue: number): number;
9
+ export declare function getNonNegativeInteger(args: ParsedArgs, name: string, defaultValue: number): number;
10
+ export declare function nonNegativeIntegerValue(value: string | undefined, defaultValue: number, label: string): number;
11
+ export declare function getPositiveNumber(args: ParsedArgs, name: string, defaultValue: number): number;
12
+ export declare function positiveNumberValue(value: string | undefined, defaultValue: number, label: string): number;
13
+ export declare function positiveIntegerValue(value: string | undefined, defaultValue: number, label: string): number;
package/dist/args.js ADDED
@@ -0,0 +1,72 @@
1
+ import { CliError } from "./errors.js";
2
+ export function parseArgs(argv) {
3
+ const positionals = [];
4
+ const flags = new Map();
5
+ for (let index = 0; index < argv.length; index += 1) {
6
+ const arg = argv[index];
7
+ if (!arg)
8
+ continue;
9
+ if (!arg.startsWith("--")) {
10
+ positionals.push(arg);
11
+ continue;
12
+ }
13
+ const withoutPrefix = arg.slice(2);
14
+ const equalsIndex = withoutPrefix.indexOf("=");
15
+ if (equalsIndex >= 0) {
16
+ flags.set(withoutPrefix.slice(0, equalsIndex), withoutPrefix.slice(equalsIndex + 1));
17
+ continue;
18
+ }
19
+ const next = argv[index + 1];
20
+ if (next && !next.startsWith("--")) {
21
+ flags.set(withoutPrefix, next);
22
+ index += 1;
23
+ }
24
+ else {
25
+ flags.set(withoutPrefix, true);
26
+ }
27
+ }
28
+ return { positionals, flags };
29
+ }
30
+ export function getString(args, name) {
31
+ const value = args.flags.get(name);
32
+ if (typeof value !== "string" || value.trim() === "")
33
+ return undefined;
34
+ return value.trim();
35
+ }
36
+ export function getBoolean(args, name) {
37
+ return args.flags.get(name) === true || args.flags.get(name) === "true";
38
+ }
39
+ export function getPositiveInteger(args, name, defaultValue) {
40
+ return positiveIntegerValue(getString(args, name), defaultValue, `--${name}`);
41
+ }
42
+ export function getNonNegativeInteger(args, name, defaultValue) {
43
+ return nonNegativeIntegerValue(getString(args, name), defaultValue, `--${name}`);
44
+ }
45
+ export function nonNegativeIntegerValue(value, defaultValue, label) {
46
+ if (!value)
47
+ return defaultValue;
48
+ const parsed = Number(value);
49
+ if (!Number.isInteger(parsed) || parsed < 0)
50
+ throw new CliError(`${label} must be a non-negative integer.`);
51
+ return parsed;
52
+ }
53
+ export function getPositiveNumber(args, name, defaultValue) {
54
+ return positiveNumberValue(getString(args, name), defaultValue, `--${name}`);
55
+ }
56
+ export function positiveNumberValue(value, defaultValue, label) {
57
+ if (!value)
58
+ return defaultValue;
59
+ const parsed = Number(value);
60
+ if (!Number.isFinite(parsed) || parsed <= 0)
61
+ throw new CliError(`${label} must be a positive number.`);
62
+ return parsed;
63
+ }
64
+ export function positiveIntegerValue(value, defaultValue, label) {
65
+ if (!value)
66
+ return defaultValue;
67
+ const parsed = Number(value);
68
+ if (!Number.isInteger(parsed) || parsed <= 0)
69
+ throw new CliError(`${label} must be a positive integer.`);
70
+ return parsed;
71
+ }
72
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,22 +1,6 @@
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
- interface Output {
4
- write(text: string): unknown;
5
- }
6
- export interface CliIO {
7
- env: NodeJS.ProcessEnv;
8
- stdout: Output;
9
- stderr: Output;
10
- }
11
- interface ParsedArgs {
12
- positionals: string[];
13
- flags: Map<string, string | true>;
14
- }
15
- interface CollectionSelector {
16
- field: "primary_collection_id" | "collection_path" | "collection_key" | "collection_name";
17
- value: string;
18
- }
1
+ import type { CliIO } from "./io.js";
2
+ export type { CliIO, Output } from "./io.js";
3
+ export { parseArgs } from "./args.js";
4
+ export { DEFAULT_API_BASE_URL, DEFAULT_API_PATH_PREFIX } from "./kb/config.js";
5
+ export { resolveCollectionSelector } from "./kb/selector.js";
19
6
  export declare function runCli(argv: string[], io: CliIO): Promise<number>;
20
- export declare function parseArgs(argv: string[]): ParsedArgs;
21
- export declare function resolveCollectionSelector(args: ParsedArgs, env: NodeJS.ProcessEnv): CollectionSelector;
22
- export {};