@derive-ltd/uht-substrate 1.0.0

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 (44) hide show
  1. package/README.md +242 -0
  2. package/dist/client.d.ts +107 -0
  3. package/dist/client.js +253 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/commands/classify.d.ts +3 -0
  6. package/dist/commands/classify.js +29 -0
  7. package/dist/commands/classify.js.map +1 -0
  8. package/dist/commands/compare.d.ts +3 -0
  9. package/dist/commands/compare.js +20 -0
  10. package/dist/commands/compare.js.map +1 -0
  11. package/dist/commands/config.d.ts +2 -0
  12. package/dist/commands/config.js +36 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/entities.d.ts +3 -0
  15. package/dist/commands/entities.js +144 -0
  16. package/dist/commands/entities.js.map +1 -0
  17. package/dist/commands/facts.d.ts +3 -0
  18. package/dist/commands/facts.js +130 -0
  19. package/dist/commands/facts.js.map +1 -0
  20. package/dist/commands/impact.d.ts +3 -0
  21. package/dist/commands/impact.js +148 -0
  22. package/dist/commands/impact.js.map +1 -0
  23. package/dist/commands/info.d.ts +3 -0
  24. package/dist/commands/info.js +35 -0
  25. package/dist/commands/info.js.map +1 -0
  26. package/dist/commands/namespaces.d.ts +3 -0
  27. package/dist/commands/namespaces.js +34 -0
  28. package/dist/commands/namespaces.js.map +1 -0
  29. package/dist/commands/semantic.d.ts +3 -0
  30. package/dist/commands/semantic.js +34 -0
  31. package/dist/commands/semantic.js.map +1 -0
  32. package/dist/config.d.ts +13 -0
  33. package/dist/config.js +58 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.js +74 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/output.d.ts +8 -0
  39. package/dist/output.js +310 -0
  40. package/dist/output.js.map +1 -0
  41. package/dist/types.d.ts +75 -0
  42. package/dist/types.js +2 -0
  43. package/dist/types.js.map +1 -0
  44. package/package.json +41 -0
@@ -0,0 +1,20 @@
1
+ import { output } from "../output.js";
2
+ export function registerCompareCommands(program, getClient, getFormat) {
3
+ program
4
+ .command("compare")
5
+ .description("Compare two entities")
6
+ .argument("<entity-a>", "First entity")
7
+ .argument("<entity-b>", "Second entity")
8
+ .action(async (entityA, entityB) => {
9
+ output(await getClient().compare(entityA, entityB), getFormat());
10
+ });
11
+ program
12
+ .command("batch-compare")
13
+ .description("Compare an entity against multiple candidates, ranked by Jaccard")
14
+ .argument("<entity>", "Reference entity")
15
+ .argument("<candidates...>", "Candidate entities to compare against")
16
+ .action(async (entity, candidates) => {
17
+ output(await getClient().batchCompare(entity, candidates), getFormat());
18
+ });
19
+ }
20
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,uBAAuB,CACrC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sBAAsB,CAAC;SACnC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC;SACtC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,EAAE;QACjD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;SACxC,QAAQ,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,UAAoB,EAAE,EAAE;QACrD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerConfigCommands(program: Command): void;
@@ -0,0 +1,36 @@
1
+ import { saveConfigFile, showConfig } from "../config.js";
2
+ const VALID_KEYS = {
3
+ "api-url": "apiUrl",
4
+ "token": "token",
5
+ "format": "format",
6
+ };
7
+ export function registerConfigCommands(program) {
8
+ const config = program
9
+ .command("config")
10
+ .description("Manage CLI configuration");
11
+ config
12
+ .command("set")
13
+ .description("Set a config value")
14
+ .argument("<key>", `Config key: ${Object.keys(VALID_KEYS).join(", ")}`)
15
+ .argument("<value>", "Config value")
16
+ .action((key, value) => {
17
+ const mapped = VALID_KEYS[key];
18
+ if (!mapped) {
19
+ console.error(`Unknown config key: ${key}`);
20
+ console.error(`Valid keys: ${Object.keys(VALID_KEYS).join(", ")}`);
21
+ process.exit(1);
22
+ }
23
+ saveConfigFile({ [mapped]: value });
24
+ console.log(`Set ${key} = ${key === "token" ? "***" : value}`);
25
+ });
26
+ config
27
+ .command("show")
28
+ .description("Show current configuration")
29
+ .action(() => {
30
+ const cfg = showConfig();
31
+ for (const [k, v] of Object.entries(cfg)) {
32
+ console.log(`${k}: ${v}`);
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,GAA2B;IACzC,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE3C,MAAM;SACH,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oBAAoB,CAAC;SACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACtE,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;SACnC,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { UHTClient } from "../client.js";
3
+ export declare function registerEntityCommands(program: Command, getClient: () => UHTClient, getFormat: () => "json" | "pretty"): void;
@@ -0,0 +1,144 @@
1
+ import { output } from "../output.js";
2
+ const TRAIT_NAMES = [
3
+ "physical_object", "synthetic", "biological", "powered",
4
+ "structural", "observable", "physical_medium", "active",
5
+ "intentionally_designed", "outputs_effect", "processes_signals", "state_transforming",
6
+ "human_interactive", "system_integrated", "functionally_autonomous", "system_essential",
7
+ "symbolic", "signalling", "rule_governed", "compositional",
8
+ "normative", "meta", "temporal", "digital_virtual",
9
+ "social_construct", "institutionally_defined", "identity_linked", "regulated",
10
+ "economically_significant", "politicised", "ritualised", "ethically_significant",
11
+ ];
12
+ export function registerEntityCommands(program, getClient, getFormat) {
13
+ const entities = program
14
+ .command("entities")
15
+ .description("Entity management commands");
16
+ entities
17
+ .command("list")
18
+ .description("List entities in the knowledge graph")
19
+ .option("-n, --name <filter>", "Filter by name substring")
20
+ .option("--hex <pattern>", "Filter by hex pattern")
21
+ .option("--namespace <ns>", "Filter by namespace (e.g. 'SE', 'SE:aerospace')")
22
+ .option("-l, --limit <n>", "Max results (or 'all')", "50")
23
+ .option("--offset <n>", "Skip N results", "0")
24
+ .option("--count-only", "Return only the total count without fetching entities")
25
+ .action(async (opts) => {
26
+ const limit = opts.limit.toLowerCase() === "all" ? 10000 : parseInt(opts.limit) || 50;
27
+ output(await getClient().listEntities({
28
+ name_contains: opts.name,
29
+ hex_pattern: opts.hex,
30
+ namespace: opts.namespace,
31
+ limit,
32
+ offset: parseInt(opts.offset),
33
+ count_only: opts.countOnly,
34
+ }), getFormat());
35
+ });
36
+ entities
37
+ .command("get")
38
+ .description("Get a single entity by name or UUID")
39
+ .option("-n, --name <name>", "Entity name (case-insensitive)")
40
+ .option("-u, --uuid <uuid>", "Entity UUID")
41
+ .action(async (opts) => {
42
+ if (!opts.name && !opts.uuid) {
43
+ console.error("Error: provide --name or --uuid");
44
+ process.exit(1);
45
+ }
46
+ output(await getClient().getEntity(opts), getFormat());
47
+ });
48
+ entities
49
+ .command("update")
50
+ .description("Update entity metadata")
51
+ .argument("<name>", "Exact entity name")
52
+ .option("--display-name <displayName>", "Short display name for presentation (empty to clear)")
53
+ .action(async (name, opts) => {
54
+ output(await getClient().updateEntity(name, { display_name: opts.displayName }), getFormat());
55
+ });
56
+ entities
57
+ .command("delete")
58
+ .description("Delete an entity and its trait edges from the local graph (facts are kept as unbound)")
59
+ .argument("<name>", "Exact entity name")
60
+ .action(async (name) => {
61
+ output(await getClient().deleteEntity(name), getFormat());
62
+ });
63
+ entities
64
+ .command("deduplicate")
65
+ .description("Find/remove entities that leaked from global into a namespace")
66
+ .requiredOption("--namespace <ns>", "Namespace to deduplicate")
67
+ .option("--apply", "Actually remove duplicates (default is dry run)")
68
+ .action(async (opts) => {
69
+ output(await getClient().deduplicateNamespace(opts.namespace, !opts.apply), getFormat());
70
+ });
71
+ entities
72
+ .command("find-similar")
73
+ .description("[Experimental] Find entities similar to the given entity")
74
+ .argument("<entity>", "Entity to find similar items for")
75
+ .option("-l, --limit <n>", "Max results", "5")
76
+ .option("--min-traits <n>", "Minimum shared traits", "20")
77
+ .action(async (entity, opts) => {
78
+ output(await getClient().findSimilar(entity, {
79
+ limit: parseInt(opts.limit),
80
+ min_shared_traits: parseInt(opts.minTraits),
81
+ }), getFormat());
82
+ });
83
+ entities
84
+ .command("merge")
85
+ .description("Merge source entity into target, transferring all facts and relationships")
86
+ .argument("<source>", "Entity to merge FROM (will be deleted)")
87
+ .argument("<target>", "Entity to merge INTO (will be kept)")
88
+ .action(async (source, target) => {
89
+ output(await getClient().mergeEntities(source, target), getFormat());
90
+ });
91
+ entities
92
+ .command("reclassify")
93
+ .description("Re-run classification on an existing entity, preserving UUID and facts")
94
+ .argument("<name>", "Exact entity name")
95
+ .option("-c, --context <ctx>", "Context to guide reclassification")
96
+ .option("-n, --namespace <ns>", "Namespace to search in")
97
+ .action(async (name, opts) => {
98
+ output(await getClient().reclassifyEntity(name, {
99
+ context: opts.context,
100
+ namespace: opts.namespace,
101
+ }), getFormat());
102
+ });
103
+ entities
104
+ .command("history")
105
+ .description("Show classification history of an entity")
106
+ .argument("<name>", "Entity name")
107
+ .option("-l, --limit <n>", "Max history entries", "50")
108
+ .action(async (name, opts) => {
109
+ output(await getClient().getEntityHistory(name, parseInt(opts.limit)), getFormat());
110
+ });
111
+ entities
112
+ .command("search-traits")
113
+ .description("Search entities by trait pattern (use --<trait-name> or --no-<trait-name>)")
114
+ .option("-l, --limit <n>", "Max results", "100")
115
+ .allowUnknownOption(true)
116
+ .action(async function () {
117
+ const rawArgs = this.args;
118
+ const query = {};
119
+ let limit = "100";
120
+ for (let i = 0; i < rawArgs.length; i++) {
121
+ const arg = rawArgs[i];
122
+ if (arg === "--limit" || arg === "-l") {
123
+ limit = rawArgs[++i] ?? "100";
124
+ continue;
125
+ }
126
+ // --trait-name or --no-trait-name
127
+ const noMatch = arg.match(/^--no-(.+)$/);
128
+ const yesMatch = arg.match(/^--(.+)$/);
129
+ if (noMatch) {
130
+ const trait = noMatch[1].replace(/-/g, "_");
131
+ if (TRAIT_NAMES.includes(trait))
132
+ query[trait] = "false";
133
+ }
134
+ else if (yesMatch) {
135
+ const trait = yesMatch[1].replace(/-/g, "_");
136
+ if (TRAIT_NAMES.includes(trait))
137
+ query[trait] = "true";
138
+ }
139
+ }
140
+ query["limit"] = limit;
141
+ output(await getClient().searchByTraits(query), getFormat());
142
+ });
143
+ }
144
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/commands/entities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,WAAW,GAAG;IAClB,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS;IACvD,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ;IACvD,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB;IACrF,mBAAmB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,kBAAkB;IACvF,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IAC1D,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB;IAClD,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,WAAW;IAC7E,0BAA0B,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB;CACjF,CAAC;AAEF,MAAM,UAAU,sBAAsB,CACpC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;SACzD,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;SAClD,MAAM,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,cAAc,EAAE,uDAAuD,CAAC;SAC/E,MAAM,CAAC,KAAK,EAAE,IAA6G,EAAE,EAAE;QAC9H,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtF,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC;YAC7B,aAAa,EAAE,IAAI,CAAC,IAAI;YACxB,WAAW,EAAE,IAAI,CAAC,GAAG;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK;YACL,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7B,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,8BAA8B,EAAE,sDAAsD,CAAC;SAC9F,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA8B,EAAE,EAAE;QAC7D,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uFAAuF,CAAC;SACpG,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,cAAc,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SAC9D,MAAM,CAAC,SAAS,EAAE,iDAAiD,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,IAA4C,EAAE,EAAE;QAC7D,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EACnE,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACxD,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAA0C,EAAE,EAAE;QAC3E,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE;YACpC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,iBAAiB,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;SAC5C,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2EAA2E,CAAC;SACxF,QAAQ,CAAC,UAAU,EAAE,wCAAwC,CAAC;SAC9D,QAAQ,CAAC,UAAU,EAAE,qCAAqC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;QAC/C,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,wEAAwE,CAAC;SACrF,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA8C,EAAE,EAAE;QAC7E,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;SACjC,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,IAAI,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAuB,EAAE,EAAE;QACtD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,KAAK,CAAC;SAC/C,kBAAkB,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YACxB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACtC,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,kCAAkC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAC1D,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC9C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YACzD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { UHTClient } from "../client.js";
3
+ export declare function registerFactCommands(program: Command, getClient: () => UHTClient, getFormat: () => "json" | "pretty"): void;
@@ -0,0 +1,130 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { output } from "../output.js";
3
+ export function registerFactCommands(program, getClient, getFormat) {
4
+ const facts = program
5
+ .command("facts")
6
+ .description("Fact management commands");
7
+ facts
8
+ .command("store")
9
+ .description("Store a fact in the knowledge graph")
10
+ .argument("<subject>", "Subject of the fact")
11
+ .argument("<predicate>", "Relationship/predicate")
12
+ .argument("<object>", "Object value")
13
+ .option("-u, --user <id>", "User ID", "default")
14
+ .option("-n, --namespace <ns>", "Namespace")
15
+ .action(async (subject, predicate, object, opts) => {
16
+ output(await getClient().storeFact(subject, predicate, object, {
17
+ user_id: opts.user,
18
+ namespace: opts.namespace,
19
+ }), getFormat());
20
+ });
21
+ facts
22
+ .command("store-bulk")
23
+ .description("Store multiple facts from a JSON file")
24
+ .option("-f, --file <path>", "JSON file with array of facts (or - for stdin)")
25
+ .option("-n, --namespace <ns>", "Default namespace for all facts (overridden by per-fact namespace)")
26
+ .action(async (opts) => {
27
+ let data;
28
+ if (!opts.file || opts.file === "-") {
29
+ const chunks = [];
30
+ for await (const chunk of process.stdin) {
31
+ chunks.push(chunk);
32
+ }
33
+ data = Buffer.concat(chunks).toString("utf-8");
34
+ }
35
+ else {
36
+ data = readFileSync(opts.file, "utf-8");
37
+ }
38
+ let parsed = JSON.parse(data);
39
+ // Apply default namespace if provided and fact doesn't already have one
40
+ if (opts.namespace) {
41
+ parsed = parsed.map(f => ({ ...f, namespace: f.namespace || opts.namespace }));
42
+ }
43
+ output(await getClient().storeFactsBulk(parsed), getFormat());
44
+ });
45
+ facts
46
+ .command("upsert")
47
+ .description("Upsert a fact (create or update)")
48
+ .argument("<subject>", "Subject of the fact")
49
+ .argument("<predicate>", "Relationship/predicate")
50
+ .argument("<object>", "Object value")
51
+ .option("-u, --user <id>", "User ID", "default")
52
+ .option("-n, --namespace <ns>", "Namespace")
53
+ .action(async (subject, predicate, object, opts) => {
54
+ output(await getClient().upsertFact(subject, predicate, object, {
55
+ user_id: opts.user,
56
+ namespace: opts.namespace,
57
+ }), getFormat());
58
+ });
59
+ facts
60
+ .command("query")
61
+ .description("Query facts with flexible filters")
62
+ .option("-s, --subject <subject>", "Filter by subject")
63
+ .option("-o, --object <object>", "Filter by object value")
64
+ .option("-p, --predicate <predicate>", "Filter by predicate")
65
+ .option("-c, --category <category>", "Filter by category")
66
+ .option("-u, --user <id>", "Filter by user ID")
67
+ .option("-n, --namespace <ns>", "Filter by namespace")
68
+ .option("-l, --limit <n>", "Max results (or 'all')", "50")
69
+ .action(async (opts) => {
70
+ const limit = opts.limit.toLowerCase() === "all" ? 10000 : parseInt(opts.limit) || 50;
71
+ output(await getClient().queryFacts({
72
+ subject: opts.subject,
73
+ object_value: opts.object,
74
+ predicate: opts.predicate,
75
+ category: opts.category,
76
+ user_id: opts.user,
77
+ namespace: opts.namespace,
78
+ limit,
79
+ }), getFormat());
80
+ });
81
+ facts
82
+ .command("update")
83
+ .description("Update an existing fact")
84
+ .argument("<fact-id>", "UUID of the fact")
85
+ .option("-s, --subject <subject>", "New subject")
86
+ .option("-p, --predicate <predicate>", "New predicate")
87
+ .option("-o, --object <object>", "New object value")
88
+ .action(async (factId, opts) => {
89
+ output(await getClient().updateFact(factId, {
90
+ subject: opts.subject,
91
+ predicate: opts.predicate,
92
+ object_value: opts.object,
93
+ }), getFormat());
94
+ });
95
+ facts
96
+ .command("delete")
97
+ .description("Delete a fact from the knowledge graph")
98
+ .argument("<fact-id>", "UUID of the fact")
99
+ .action(async (factId) => {
100
+ output(await getClient().deleteFact(factId), getFormat());
101
+ });
102
+ facts
103
+ .command("user-context")
104
+ .description("Get stored facts and preferences for a user")
105
+ .option("-u, --user <id>", "User ID", "default")
106
+ .action(async (opts) => {
107
+ output(await getClient().getUserContext(opts.user), getFormat());
108
+ });
109
+ facts
110
+ .command("namespace-context")
111
+ .description("Get all entities and facts under a namespace")
112
+ .argument("<namespace>", "Namespace code")
113
+ .option("-u, --user <id>", "Filter facts by user ID")
114
+ .action(async (namespace, opts) => {
115
+ output(await getClient().getNamespaceContext(namespace, opts.user), getFormat());
116
+ });
117
+ facts
118
+ .command("reconcile")
119
+ .description("Reconcile UHT facts against AIRGen trace links")
120
+ .requiredOption("--namespace <ns>", "UHT namespace to reconcile")
121
+ .requiredOption("--tenant <slug>", "AIRGen tenant slug")
122
+ .requiredOption("--project <slug>", "AIRGen project slug")
123
+ .option("--airgen-url <url>", "AIRGen API URL (or set AIRGEN_API_URL)")
124
+ .option("--airgen-email <email>", "AIRGen email (or set AIRGEN_EMAIL)")
125
+ .option("--airgen-password <pw>", "AIRGen password (or set AIRGEN_PASSWORD)")
126
+ .action(async (opts) => {
127
+ output(await getClient().reconcileFacts(opts.namespace, opts.tenant, opts.project, { airgen_url: opts.airgenUrl, airgen_email: opts.airgenEmail, airgen_password: opts.airgenPassword }), getFormat());
128
+ });
129
+ }
130
+ //# sourceMappingURL=facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.js","sourceRoot":"","sources":["../../src/commands/facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { UHTClient } from "../client.js";
3
+ export declare function registerImpactCommand(program: Command, getClient: () => UHTClient, getFormat: () => "json" | "pretty"): void;
@@ -0,0 +1,148 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { bold, cyan, green, red, yellow } from "../output.js";
3
+ // --- Helpers ---
4
+ function getActiveTraitNames(traits) {
5
+ return traits.filter((t) => t.present && t.name).map((t) => t.name);
6
+ }
7
+ function findFlippedTraits(oldTraits, newTraits) {
8
+ const flipped = [];
9
+ const oldMap = new Map(oldTraits.map((t) => [t.bit, t]));
10
+ for (const nt of newTraits) {
11
+ const ot = oldMap.get(nt.bit);
12
+ if (!ot)
13
+ continue;
14
+ if (ot.present && !nt.present && ot.name) {
15
+ flipped.push({ bit: nt.bit, name: ot.name, direction: "removed" });
16
+ }
17
+ else if (!ot.present && nt.present && nt.name) {
18
+ flipped.push({ bit: nt.bit, name: nt.name, direction: "added" });
19
+ }
20
+ }
21
+ return flipped;
22
+ }
23
+ // --- Core logic ---
24
+ async function runImpact(client, diff) {
25
+ const added = [];
26
+ const removed = [];
27
+ const drift = [];
28
+ // Classify added requirements
29
+ const addedReqs = diff.added ?? [];
30
+ for (const req of addedReqs) {
31
+ const result = (await client.classify(req.text));
32
+ added.push({
33
+ ref: req.ref,
34
+ hex: result.hex_code,
35
+ text: req.text,
36
+ top_traits: getActiveTraitNames(result.traits),
37
+ });
38
+ }
39
+ // Classify removed requirements
40
+ const removedReqs = diff.removed ?? [];
41
+ for (const req of removedReqs) {
42
+ const result = (await client.classify(req.text));
43
+ removed.push({
44
+ ref: req.ref,
45
+ hex: result.hex_code,
46
+ text: req.text,
47
+ top_traits: getActiveTraitNames(result.traits),
48
+ });
49
+ }
50
+ // Classify both sides of modified requirements and detect drift
51
+ const modifiedReqs = diff.modified ?? [];
52
+ for (const req of modifiedReqs) {
53
+ const [oldResult, newResult] = (await Promise.all([
54
+ client.classify(req.old_text),
55
+ client.classify(req.new_text),
56
+ ]));
57
+ if (oldResult.hex_code !== newResult.hex_code) {
58
+ drift.push({
59
+ ref: req.ref,
60
+ old_hex: oldResult.hex_code,
61
+ new_hex: newResult.hex_code,
62
+ old_text: req.old_text,
63
+ new_text: req.new_text,
64
+ flipped_traits: findFlippedTraits(oldResult.traits, newResult.traits),
65
+ });
66
+ }
67
+ }
68
+ return {
69
+ summary: {
70
+ added: addedReqs.length,
71
+ removed: removedReqs.length,
72
+ modified: modifiedReqs.length,
73
+ semantic_drift: drift.length,
74
+ },
75
+ drift,
76
+ added,
77
+ removed,
78
+ };
79
+ }
80
+ // --- Pretty output ---
81
+ function prettyPrintImpact(result) {
82
+ const s = result.summary;
83
+ const driftLabel = s.semantic_drift > 0
84
+ ? ` (${yellow(`${s.semantic_drift} with semantic drift`)})`
85
+ : "";
86
+ console.log(bold("Summary: ") +
87
+ `${green(`${s.added} added`)}, ${red(`${s.removed} removed`)}, ` +
88
+ `${cyan(`${s.modified} modified`)}${driftLabel}`);
89
+ if (result.drift.length) {
90
+ console.log(bold("\nSemantic Drift:"));
91
+ for (const d of result.drift) {
92
+ console.log(` ${bold(d.ref)} ${red(d.old_hex)} → ${green(d.new_hex)}`);
93
+ for (const f of d.flipped_traits) {
94
+ const arrow = f.direction === "added" ? green("+") : red("-");
95
+ console.log(` ${arrow} ${f.name}`);
96
+ }
97
+ }
98
+ }
99
+ if (result.added.length) {
100
+ console.log(bold("\nAdded:"));
101
+ for (const a of result.added) {
102
+ console.log(` ${bold(a.ref)} ${cyan(a.hex)} ${a.top_traits.join(", ")}`);
103
+ }
104
+ }
105
+ if (result.removed.length) {
106
+ console.log(bold("\nRemoved:"));
107
+ for (const r of result.removed) {
108
+ console.log(` ${bold(r.ref)} ${cyan(r.hex)} ${r.top_traits.join(", ")}`);
109
+ }
110
+ }
111
+ }
112
+ // --- Command registration ---
113
+ export function registerImpactCommand(program, getClient, getFormat) {
114
+ program
115
+ .command("impact")
116
+ .description("Analyse semantic impact of requirement changes from an airgen diff")
117
+ .requiredOption("--airgen-diff <path>", "Path to airgen diff JSON file (airgen diff --json)")
118
+ .option("--json", "Force JSON output")
119
+ .action(async (opts) => {
120
+ const filePath = opts.airgenDiff;
121
+ if (!existsSync(filePath)) {
122
+ console.error(`Error: File not found: ${filePath}`);
123
+ process.exit(1);
124
+ }
125
+ let diff;
126
+ try {
127
+ const raw = readFileSync(filePath, "utf-8");
128
+ diff = JSON.parse(raw);
129
+ }
130
+ catch {
131
+ console.error(`Error: Could not parse ${filePath} as JSON. Expected airgen diff format: { summary, added, removed, modified }`);
132
+ process.exit(1);
133
+ }
134
+ if (!diff.added && !diff.removed && !diff.modified) {
135
+ console.error(`Error: No added, removed, or modified arrays found in ${filePath}. Expected airgen diff format.`);
136
+ process.exit(1);
137
+ }
138
+ const result = await runImpact(getClient(), diff);
139
+ const format = opts.json ? "json" : getFormat();
140
+ if (format === "json") {
141
+ console.log(JSON.stringify(result, null, 2));
142
+ }
143
+ else {
144
+ prettyPrintImpact(result);
145
+ }
146
+ });
147
+ }
148
+ //# sourceMappingURL=impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.js","sourceRoot":"","sources":["../../src/commands/impact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { UHTClient } from "../client.js";
3
+ export declare function registerInfoCommands(program: Command, getClient: () => UHTClient, getFormat: () => "json" | "pretty"): void;
@@ -0,0 +1,35 @@
1
+ import { output } from "../output.js";
2
+ export function registerInfoCommands(program, getClient, getFormat) {
3
+ program
4
+ .command("info")
5
+ .description("Get system information and overview")
6
+ .action(async () => {
7
+ output(await getClient().info(), getFormat());
8
+ });
9
+ program
10
+ .command("traits")
11
+ .description("Get all 32 trait definitions")
12
+ .action(async () => {
13
+ output(await getClient().traits(), getFormat());
14
+ });
15
+ program
16
+ .command("trait-prompts")
17
+ .description("Get classifier prompts sent to the LLM (includes edge cases and examples)")
18
+ .option("-e, --entity <name>", "Entity name to substitute into prompts")
19
+ .option("-d, --description <desc>", "Entity description to substitute")
20
+ .option("-b, --bit <n>", "Single trait bit (1-32), or omit for all")
21
+ .action(async (opts) => {
22
+ output(await getClient().traitPrompts({
23
+ entity_name: opts.entity,
24
+ entity_description: opts.description,
25
+ bit: opts.bit ? parseInt(opts.bit) : undefined,
26
+ }), getFormat());
27
+ });
28
+ program
29
+ .command("patterns")
30
+ .description("Get reasoning patterns for tool orchestration")
31
+ .action(async () => {
32
+ output(await getClient().patterns(), getFormat());
33
+ });
34
+ }
35
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,0BAA0B,EAAE,kCAAkC,CAAC;SACtE,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAA6D,EAAE,EAAE;QAC9E,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC;YAC7B,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,kBAAkB,EAAE,IAAI,CAAC,WAAW;YACpC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/C,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { UHTClient } from "../client.js";
3
+ export declare function registerNamespaceCommands(program: Command, getClient: () => UHTClient, getFormat: () => "json" | "pretty"): void;
@@ -0,0 +1,34 @@
1
+ import { output } from "../output.js";
2
+ export function registerNamespaceCommands(program, getClient, getFormat) {
3
+ const ns = program
4
+ .command("namespaces")
5
+ .alias("ns")
6
+ .description("Namespace management commands");
7
+ ns.command("create")
8
+ .description("Create a new namespace")
9
+ .argument("<code>", "Unique namespace code (e.g. SE:aerospace)")
10
+ .argument("<name>", "Human-readable name")
11
+ .option("-d, --description <desc>", "Optional description")
12
+ .action(async (code, name, opts) => {
13
+ output(await getClient().createNamespace(code, name, opts.description), getFormat());
14
+ });
15
+ ns.command("list")
16
+ .description("List namespaces")
17
+ .option("-p, --parent <code>", "List children of this namespace")
18
+ .option("--descendants", "Include entire subtree", false)
19
+ .action(async (opts) => {
20
+ output(await getClient().listNamespaces({
21
+ parent: opts.parent,
22
+ include_descendants: opts.descendants,
23
+ }), getFormat());
24
+ });
25
+ ns.command("assign")
26
+ .description("Assign an entity to a namespace")
27
+ .argument("<entity>", "Entity name")
28
+ .argument("<namespace>", "Namespace code")
29
+ .option("--no-primary", "Do not set as primary namespace")
30
+ .action(async (entity, namespace, opts) => {
31
+ output(await getClient().assignNamespace(entity, namespace, opts.primary), getFormat());
32
+ });
33
+ }
34
+ //# sourceMappingURL=namespaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespaces.js","sourceRoot":"","sources":["../../src/commands/namespaces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,yBAAyB,CACvC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,YAAY,CAAC;SACrB,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAEhD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,QAAQ,EAAE,2CAA2C,CAAC;SAC/D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SACzC,MAAM,CAAC,0BAA0B,EAAE,sBAAsB,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,IAA8B,EAAE,EAAE;QAC3E,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAA+C,EAAE,EAAE;QAChE,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,WAAW;SACtC,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;SACnC,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,cAAc,EAAE,iCAAiC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,SAAiB,EAAE,IAA0B,EAAE,EAAE;QAC9E,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACP,CAAC"}