@aaronsb/kg-cli 0.6.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.
Files changed (266) hide show
  1. package/README.md +112 -0
  2. package/dist/api/client.d.ts +867 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +1362 -0
  5. package/dist/api/client.js.map +1 -0
  6. package/dist/cli/admin/backup.d.ts +9 -0
  7. package/dist/cli/admin/backup.d.ts.map +1 -0
  8. package/dist/cli/admin/backup.js +363 -0
  9. package/dist/cli/admin/backup.js.map +1 -0
  10. package/dist/cli/admin/index.d.ts +7 -0
  11. package/dist/cli/admin/index.d.ts.map +1 -0
  12. package/dist/cli/admin/index.js +52 -0
  13. package/dist/cli/admin/index.js.map +1 -0
  14. package/dist/cli/admin/scheduler.d.ts +7 -0
  15. package/dist/cli/admin/scheduler.d.ts.map +1 -0
  16. package/dist/cli/admin/scheduler.js +125 -0
  17. package/dist/cli/admin/scheduler.js.map +1 -0
  18. package/dist/cli/admin/status.d.ts +7 -0
  19. package/dist/cli/admin/status.d.ts.map +1 -0
  20. package/dist/cli/admin/status.js +134 -0
  21. package/dist/cli/admin/status.js.map +1 -0
  22. package/dist/cli/admin/utils.d.ts +34 -0
  23. package/dist/cli/admin/utils.d.ts.map +1 -0
  24. package/dist/cli/admin/utils.js +441 -0
  25. package/dist/cli/admin/utils.js.map +1 -0
  26. package/dist/cli/ai-config/embedding.d.ts +11 -0
  27. package/dist/cli/ai-config/embedding.d.ts.map +1 -0
  28. package/dist/cli/ai-config/embedding.js +598 -0
  29. package/dist/cli/ai-config/embedding.js.map +1 -0
  30. package/dist/cli/ai-config/extraction.d.ts +11 -0
  31. package/dist/cli/ai-config/extraction.d.ts.map +1 -0
  32. package/dist/cli/ai-config/extraction.js +206 -0
  33. package/dist/cli/ai-config/extraction.js.map +1 -0
  34. package/dist/cli/ai-config/index.d.ts +21 -0
  35. package/dist/cli/ai-config/index.d.ts.map +1 -0
  36. package/dist/cli/ai-config/index.js +27 -0
  37. package/dist/cli/ai-config/index.js.map +1 -0
  38. package/dist/cli/ai-config/keys.d.ts +11 -0
  39. package/dist/cli/ai-config/keys.d.ts.map +1 -0
  40. package/dist/cli/ai-config/keys.js +182 -0
  41. package/dist/cli/ai-config/keys.js.map +1 -0
  42. package/dist/cli/ai-config/utils.d.ts +13 -0
  43. package/dist/cli/ai-config/utils.d.ts.map +1 -0
  44. package/dist/cli/ai-config/utils.js +84 -0
  45. package/dist/cli/ai-config/utils.js.map +1 -0
  46. package/dist/cli/artifact.d.ts +8 -0
  47. package/dist/cli/artifact.d.ts.map +1 -0
  48. package/dist/cli/artifact.js +296 -0
  49. package/dist/cli/artifact.js.map +1 -0
  50. package/dist/cli/auth-admin.d.ts +11 -0
  51. package/dist/cli/auth-admin.d.ts.map +1 -0
  52. package/dist/cli/auth-admin.js +415 -0
  53. package/dist/cli/auth-admin.js.map +1 -0
  54. package/dist/cli/colors.d.ts +105 -0
  55. package/dist/cli/colors.d.ts.map +1 -0
  56. package/dist/cli/colors.js +164 -0
  57. package/dist/cli/colors.js.map +1 -0
  58. package/dist/cli/commands.d.ts +6 -0
  59. package/dist/cli/commands.d.ts.map +1 -0
  60. package/dist/cli/commands.js +164 -0
  61. package/dist/cli/commands.js.map +1 -0
  62. package/dist/cli/config.d.ts +6 -0
  63. package/dist/cli/config.d.ts.map +1 -0
  64. package/dist/cli/config.js +694 -0
  65. package/dist/cli/config.js.map +1 -0
  66. package/dist/cli/curve-viz.d.ts +89 -0
  67. package/dist/cli/curve-viz.d.ts.map +1 -0
  68. package/dist/cli/curve-viz.js +228 -0
  69. package/dist/cli/curve-viz.js.map +1 -0
  70. package/dist/cli/database.d.ts +6 -0
  71. package/dist/cli/database.d.ts.map +1 -0
  72. package/dist/cli/database.js +324 -0
  73. package/dist/cli/database.js.map +1 -0
  74. package/dist/cli/document.d.ts +6 -0
  75. package/dist/cli/document.d.ts.map +1 -0
  76. package/dist/cli/document.js +458 -0
  77. package/dist/cli/document.js.map +1 -0
  78. package/dist/cli/group.d.ts +8 -0
  79. package/dist/cli/group.d.ts.map +1 -0
  80. package/dist/cli/group.js +174 -0
  81. package/dist/cli/group.js.map +1 -0
  82. package/dist/cli/health.d.ts +6 -0
  83. package/dist/cli/health.d.ts.map +1 -0
  84. package/dist/cli/health.js +34 -0
  85. package/dist/cli/health.js.map +1 -0
  86. package/dist/cli/help-formatter.d.ts +16 -0
  87. package/dist/cli/help-formatter.d.ts.map +1 -0
  88. package/dist/cli/help-formatter.js +248 -0
  89. package/dist/cli/help-formatter.js.map +1 -0
  90. package/dist/cli/help.d.ts +9 -0
  91. package/dist/cli/help.d.ts.map +1 -0
  92. package/dist/cli/help.js +227 -0
  93. package/dist/cli/help.js.map +1 -0
  94. package/dist/cli/ingest.d.ts +6 -0
  95. package/dist/cli/ingest.d.ts.map +1 -0
  96. package/dist/cli/ingest.js +722 -0
  97. package/dist/cli/ingest.js.map +1 -0
  98. package/dist/cli/jobs.d.ts +6 -0
  99. package/dist/cli/jobs.d.ts.map +1 -0
  100. package/dist/cli/jobs.js +663 -0
  101. package/dist/cli/jobs.js.map +1 -0
  102. package/dist/cli/login.d.ts +21 -0
  103. package/dist/cli/login.d.ts.map +1 -0
  104. package/dist/cli/login.js +221 -0
  105. package/dist/cli/login.js.map +1 -0
  106. package/dist/cli/logout.d.ts +16 -0
  107. package/dist/cli/logout.d.ts.map +1 -0
  108. package/dist/cli/logout.js +141 -0
  109. package/dist/cli/logout.js.map +1 -0
  110. package/dist/cli/mcp-config.d.ts +10 -0
  111. package/dist/cli/mcp-config.d.ts.map +1 -0
  112. package/dist/cli/mcp-config.js +358 -0
  113. package/dist/cli/mcp-config.js.map +1 -0
  114. package/dist/cli/oauth.d.ts +15 -0
  115. package/dist/cli/oauth.d.ts.map +1 -0
  116. package/dist/cli/oauth.js +296 -0
  117. package/dist/cli/oauth.js.map +1 -0
  118. package/dist/cli/ontology.d.ts +6 -0
  119. package/dist/cli/ontology.d.ts.map +1 -0
  120. package/dist/cli/ontology.js +231 -0
  121. package/dist/cli/ontology.js.map +1 -0
  122. package/dist/cli/polarity.d.ts +6 -0
  123. package/dist/cli/polarity.d.ts.map +1 -0
  124. package/dist/cli/polarity.js +295 -0
  125. package/dist/cli/polarity.js.map +1 -0
  126. package/dist/cli/projection.d.ts +8 -0
  127. package/dist/cli/projection.d.ts.map +1 -0
  128. package/dist/cli/projection.js +297 -0
  129. package/dist/cli/projection.js.map +1 -0
  130. package/dist/cli/query-def.d.ts +8 -0
  131. package/dist/cli/query-def.d.ts.map +1 -0
  132. package/dist/cli/query-def.js +163 -0
  133. package/dist/cli/query-def.js.map +1 -0
  134. package/dist/cli/rbac.d.ts +12 -0
  135. package/dist/cli/rbac.d.ts.map +1 -0
  136. package/dist/cli/rbac.js +615 -0
  137. package/dist/cli/rbac.js.map +1 -0
  138. package/dist/cli/search.d.ts +6 -0
  139. package/dist/cli/search.d.ts.map +1 -0
  140. package/dist/cli/search.js +829 -0
  141. package/dist/cli/search.js.map +1 -0
  142. package/dist/cli/source.d.ts +6 -0
  143. package/dist/cli/source.d.ts.map +1 -0
  144. package/dist/cli/source.js +202 -0
  145. package/dist/cli/source.js.map +1 -0
  146. package/dist/cli/verb-router.d.ts +25 -0
  147. package/dist/cli/verb-router.d.ts.map +1 -0
  148. package/dist/cli/verb-router.js +415 -0
  149. package/dist/cli/verb-router.js.map +1 -0
  150. package/dist/cli/vocabulary/config.d.ts +7 -0
  151. package/dist/cli/vocabulary/config.d.ts.map +1 -0
  152. package/dist/cli/vocabulary/config.js +201 -0
  153. package/dist/cli/vocabulary/config.js.map +1 -0
  154. package/dist/cli/vocabulary/consolidate.d.ts +8 -0
  155. package/dist/cli/vocabulary/consolidate.d.ts.map +1 -0
  156. package/dist/cli/vocabulary/consolidate.js +192 -0
  157. package/dist/cli/vocabulary/consolidate.js.map +1 -0
  158. package/dist/cli/vocabulary/embeddings.d.ts +9 -0
  159. package/dist/cli/vocabulary/embeddings.d.ts.map +1 -0
  160. package/dist/cli/vocabulary/embeddings.js +205 -0
  161. package/dist/cli/vocabulary/embeddings.js.map +1 -0
  162. package/dist/cli/vocabulary/epistemic.d.ts +7 -0
  163. package/dist/cli/vocabulary/epistemic.d.ts.map +1 -0
  164. package/dist/cli/vocabulary/epistemic.js +315 -0
  165. package/dist/cli/vocabulary/epistemic.js.map +1 -0
  166. package/dist/cli/vocabulary/index.d.ts +7 -0
  167. package/dist/cli/vocabulary/index.d.ts.map +1 -0
  168. package/dist/cli/vocabulary/index.js +45 -0
  169. package/dist/cli/vocabulary/index.js.map +1 -0
  170. package/dist/cli/vocabulary/profiles.d.ts +7 -0
  171. package/dist/cli/vocabulary/profiles.d.ts.map +1 -0
  172. package/dist/cli/vocabulary/profiles.js +171 -0
  173. package/dist/cli/vocabulary/profiles.js.map +1 -0
  174. package/dist/cli/vocabulary/similarity.d.ts +9 -0
  175. package/dist/cli/vocabulary/similarity.d.ts.map +1 -0
  176. package/dist/cli/vocabulary/similarity.js +199 -0
  177. package/dist/cli/vocabulary/similarity.js.map +1 -0
  178. package/dist/cli/vocabulary/status.d.ts +8 -0
  179. package/dist/cli/vocabulary/status.d.ts.map +1 -0
  180. package/dist/cli/vocabulary/status.js +280 -0
  181. package/dist/cli/vocabulary/status.js.map +1 -0
  182. package/dist/cli/vocabulary/sync.d.ts +7 -0
  183. package/dist/cli/vocabulary/sync.d.ts.map +1 -0
  184. package/dist/cli/vocabulary/sync.js +111 -0
  185. package/dist/cli/vocabulary/sync.js.map +1 -0
  186. package/dist/index.d.ts +9 -0
  187. package/dist/index.d.ts.map +1 -0
  188. package/dist/index.js +16 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/lib/auth/auth-client.d.ts +247 -0
  191. package/dist/lib/auth/auth-client.d.ts.map +1 -0
  192. package/dist/lib/auth/auth-client.js +305 -0
  193. package/dist/lib/auth/auth-client.js.map +1 -0
  194. package/dist/lib/auth/challenge.d.ts +39 -0
  195. package/dist/lib/auth/challenge.d.ts.map +1 -0
  196. package/dist/lib/auth/challenge.js +125 -0
  197. package/dist/lib/auth/challenge.js.map +1 -0
  198. package/dist/lib/auth/client-credentials-flow.d.ts +58 -0
  199. package/dist/lib/auth/client-credentials-flow.d.ts.map +1 -0
  200. package/dist/lib/auth/client-credentials-flow.js +118 -0
  201. package/dist/lib/auth/client-credentials-flow.js.map +1 -0
  202. package/dist/lib/auth/device-flow.d.ts +75 -0
  203. package/dist/lib/auth/device-flow.d.ts.map +1 -0
  204. package/dist/lib/auth/device-flow.js +177 -0
  205. package/dist/lib/auth/device-flow.js.map +1 -0
  206. package/dist/lib/auth/index.d.ts +14 -0
  207. package/dist/lib/auth/index.d.ts.map +1 -0
  208. package/dist/lib/auth/index.js +34 -0
  209. package/dist/lib/auth/index.js.map +1 -0
  210. package/dist/lib/auth/oauth-types.d.ts +69 -0
  211. package/dist/lib/auth/oauth-types.d.ts.map +1 -0
  212. package/dist/lib/auth/oauth-types.js +10 -0
  213. package/dist/lib/auth/oauth-types.js.map +1 -0
  214. package/dist/lib/auth/oauth-utils.d.ts +51 -0
  215. package/dist/lib/auth/oauth-utils.d.ts.map +1 -0
  216. package/dist/lib/auth/oauth-utils.js +110 -0
  217. package/dist/lib/auth/oauth-utils.js.map +1 -0
  218. package/dist/lib/auth/token-manager.d.ts +87 -0
  219. package/dist/lib/auth/token-manager.d.ts.map +1 -0
  220. package/dist/lib/auth/token-manager.js +139 -0
  221. package/dist/lib/auth/token-manager.js.map +1 -0
  222. package/dist/lib/auth/token-refresh.d.ts +63 -0
  223. package/dist/lib/auth/token-refresh.d.ts.map +1 -0
  224. package/dist/lib/auth/token-refresh.js +141 -0
  225. package/dist/lib/auth/token-refresh.js.map +1 -0
  226. package/dist/lib/config.d.ts +286 -0
  227. package/dist/lib/config.d.ts.map +1 -0
  228. package/dist/lib/config.js +537 -0
  229. package/dist/lib/config.js.map +1 -0
  230. package/dist/lib/job-stream.d.ts +53 -0
  231. package/dist/lib/job-stream.d.ts.map +1 -0
  232. package/dist/lib/job-stream.js +153 -0
  233. package/dist/lib/job-stream.js.map +1 -0
  234. package/dist/lib/mcp-allowlist.d.ts +101 -0
  235. package/dist/lib/mcp-allowlist.d.ts.map +1 -0
  236. package/dist/lib/mcp-allowlist.js +340 -0
  237. package/dist/lib/mcp-allowlist.js.map +1 -0
  238. package/dist/lib/table-example.d.ts +7 -0
  239. package/dist/lib/table-example.d.ts.map +1 -0
  240. package/dist/lib/table-example.js +105 -0
  241. package/dist/lib/table-example.js.map +1 -0
  242. package/dist/lib/table.d.ts +95 -0
  243. package/dist/lib/table.d.ts.map +1 -0
  244. package/dist/lib/table.js +263 -0
  245. package/dist/lib/table.js.map +1 -0
  246. package/dist/lib/terminal-images.d.ts +66 -0
  247. package/dist/lib/terminal-images.d.ts.map +1 -0
  248. package/dist/lib/terminal-images.js +268 -0
  249. package/dist/lib/terminal-images.js.map +1 -0
  250. package/dist/mcp/formatters.d.ts +100 -0
  251. package/dist/mcp/formatters.d.ts.map +1 -0
  252. package/dist/mcp/formatters.js +1411 -0
  253. package/dist/mcp/formatters.js.map +1 -0
  254. package/dist/mcp-server.d.ts +9 -0
  255. package/dist/mcp-server.d.ts.map +1 -0
  256. package/dist/mcp-server.js +1810 -0
  257. package/dist/mcp-server.js.map +1 -0
  258. package/dist/types/index.d.ts +742 -0
  259. package/dist/types/index.d.ts.map +1 -0
  260. package/dist/types/index.js +6 -0
  261. package/dist/types/index.js.map +1 -0
  262. package/dist/version.d.ts +10 -0
  263. package/dist/version.d.ts.map +1 -0
  264. package/dist/version.js +13 -0
  265. package/dist/version.js.map +1 -0
  266. package/package.json +84 -0
@@ -0,0 +1,598 @@
1
+ "use strict";
2
+ /**
3
+ * Embedding Commands (ADR-039)
4
+ * Manages embedding model configuration
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.createEmbeddingCommand = createEmbeddingCommand;
41
+ const commander_1 = require("commander");
42
+ const colors = __importStar(require("../colors"));
43
+ const colors_1 = require("../colors");
44
+ const utils_1 = require("./utils");
45
+ /**
46
+ * Create a new embedding configuration
47
+ */
48
+ function createEmbeddingCreateCommand(client) {
49
+ return new commander_1.Command('create')
50
+ .description('Create a new embedding configuration (inactive)')
51
+ .option('--provider <provider>', 'Provider: local or openai')
52
+ .option('--model <model>', 'Model name')
53
+ .option('--dimensions <dims>', 'Embedding dimensions', parseInt)
54
+ .option('--precision <precision>', 'Precision: float16, float32, int8')
55
+ .option('--device <device>', 'Device: cpu, cuda, mps')
56
+ .option('--memory <mb>', 'Max memory in MB', parseInt)
57
+ .option('--threads <n>', 'Number of threads', parseInt)
58
+ .option('--batch-size <n>', 'Batch size', parseInt)
59
+ .action(async (options) => {
60
+ try {
61
+ console.log('\n' + (0, colors_1.separator)());
62
+ console.log(colors.ui.title('➕ Create Embedding Configuration'));
63
+ console.log((0, colors_1.separator)());
64
+ const config = {};
65
+ if (options.provider)
66
+ config.provider = options.provider;
67
+ if (options.model)
68
+ config.model_name = options.model;
69
+ if (options.dimensions)
70
+ config.embedding_dimensions = options.dimensions;
71
+ if (options.precision)
72
+ config.precision = options.precision;
73
+ if (options.device)
74
+ config.device = options.device;
75
+ if (options.memory)
76
+ config.max_memory_mb = options.memory;
77
+ if (options.threads)
78
+ config.num_threads = options.threads;
79
+ if (options.batchSize)
80
+ config.batch_size = options.batchSize;
81
+ if (Object.keys(config).length === 0) {
82
+ console.error(colors.status.error('\n✗ No configuration options provided'));
83
+ console.log(colors.status.dim(' Use --help to see available options\n'));
84
+ process.exit(1);
85
+ }
86
+ const result = await client.updateEmbeddingConfig(config);
87
+ console.log('\n' + colors.status.success('✓ Configuration created successfully'));
88
+ console.log(`\n ${colors.ui.key('Config ID:')} ${colors.ui.value(result.config_id)}`);
89
+ console.log(` ${colors.ui.key('Status:')} ${colors.status.dim('Inactive')}`);
90
+ console.log('\n' + colors.status.warning('⚠️ Next steps:'));
91
+ console.log(colors.status.dim(` 1. Review: kg admin embedding list`));
92
+ console.log(colors.status.dim(` 2. Activate: kg admin embedding activate ${result.config_id}`));
93
+ console.log(colors.status.dim(` 3. Apply: kg admin embedding reload\n`));
94
+ console.log((0, colors_1.separator)() + '\n');
95
+ }
96
+ catch (error) {
97
+ console.error(colors.status.error('✗ Failed to create embedding configuration'));
98
+ console.error(colors.status.error(error.response?.data?.detail || error.message));
99
+ process.exit(1);
100
+ }
101
+ });
102
+ }
103
+ /**
104
+ * Hot reload embedding model
105
+ */
106
+ function createEmbeddingReloadCommand(client) {
107
+ return new commander_1.Command('reload')
108
+ .description('Hot reload embedding model (zero-downtime)')
109
+ .action(async () => {
110
+ try {
111
+ console.log('\n' + (0, colors_1.separator)());
112
+ console.log(colors.ui.title('🔄 Hot Reload Embedding Model'));
113
+ console.log((0, colors_1.separator)());
114
+ console.log(colors.status.info('\nReloading model from database configuration...'));
115
+ const result = await client.reloadEmbeddingModel();
116
+ console.log('\n' + colors.status.success('✓ Hot reload successful'));
117
+ console.log(`\n ${colors.ui.key('Provider:')} ${colors.ui.value(result.provider)}`);
118
+ if (result.model) {
119
+ console.log(` ${colors.ui.key('Model:')} ${colors.ui.value(result.model)}`);
120
+ }
121
+ if (result.dimensions) {
122
+ console.log(` ${colors.ui.key('Dimensions:')} ${colors.ui.value(result.dimensions)}`);
123
+ }
124
+ console.log(`\n ${colors.status.dim('Next embedding request will use new configuration')}`);
125
+ console.log('\n' + (0, colors_1.separator)() + '\n');
126
+ }
127
+ catch (error) {
128
+ console.error(colors.status.error('✗ Hot reload failed'));
129
+ console.error(colors.status.error(error.response?.data?.detail || error.message));
130
+ process.exit(1);
131
+ }
132
+ });
133
+ }
134
+ /**
135
+ * List all embedding configurations
136
+ */
137
+ function createEmbeddingListCommand(client) {
138
+ return new commander_1.Command('list')
139
+ .description('List all embedding configurations')
140
+ .action(async () => {
141
+ try {
142
+ console.log('\n' + (0, colors_1.separator)());
143
+ console.log(colors.ui.title('📋 Embedding Configurations'));
144
+ console.log((0, colors_1.separator)());
145
+ const configs = await client.listEmbeddingConfigs();
146
+ if (configs.length === 0) {
147
+ console.log(colors.status.dim('\n No configurations found\n'));
148
+ }
149
+ else {
150
+ console.log('');
151
+ for (const config of configs) {
152
+ const activeMarker = config.active ? colors.status.success('✓ ACTIVE') : colors.status.dim('○ Inactive');
153
+ const deleteProtected = config.delete_protected ? '🔒' : '';
154
+ const changeProtected = config.change_protected ? '🔐' : '';
155
+ const protection = [deleteProtected, changeProtected].filter(p => p).join(' ');
156
+ console.log(` ${activeMarker} ${colors.ui.header(`Config ${config.id}`)} ${protection}`);
157
+ console.log(` ${colors.ui.key('Provider:')} ${colors.ui.value(config.provider)}`);
158
+ if (config.model_name) {
159
+ console.log(` ${colors.ui.key('Model:')} ${colors.ui.value(config.model_name)}`);
160
+ }
161
+ if (config.embedding_dimensions) {
162
+ console.log(` ${colors.ui.key('Dimensions:')} ${colors.ui.value(config.embedding_dimensions)}`);
163
+ }
164
+ if (config.delete_protected || config.change_protected) {
165
+ const flags = [];
166
+ if (config.delete_protected)
167
+ flags.push('delete-protected');
168
+ if (config.change_protected)
169
+ flags.push('change-protected');
170
+ console.log(` ${colors.ui.key('Protection:')} ${colors.status.warning(flags.join(', '))}`);
171
+ }
172
+ console.log(` ${colors.status.dim('Updated: ' + new Date(config.updated_at).toLocaleString())}`);
173
+ console.log(` ${colors.status.dim('By: ' + config.updated_by)}`);
174
+ console.log('');
175
+ }
176
+ }
177
+ console.log((0, colors_1.separator)() + '\n');
178
+ }
179
+ catch (error) {
180
+ console.error(colors.status.error('✗ Failed to list embedding configurations'));
181
+ console.error(colors.status.error(error.response?.data?.detail || error.message));
182
+ process.exit(1);
183
+ }
184
+ });
185
+ }
186
+ /**
187
+ * Protect an embedding configuration
188
+ */
189
+ function createEmbeddingProtectCommand(client) {
190
+ return new commander_1.Command('protect')
191
+ .description('Enable protection flags on an embedding configuration')
192
+ .argument('<config-id>', 'Configuration ID', parseInt)
193
+ .option('--delete', 'Enable delete protection')
194
+ .option('--change', 'Enable change protection')
195
+ .action(async (configId, options) => {
196
+ try {
197
+ console.log('\n' + (0, colors_1.separator)());
198
+ console.log(colors.ui.title(`🔒 Protect Config ${configId}`));
199
+ console.log((0, colors_1.separator)());
200
+ if (!options.delete && !options.change) {
201
+ console.error(colors.status.error('\n✗ Must specify at least one protection flag'));
202
+ console.log(colors.status.dim(' Use --delete and/or --change\n'));
203
+ process.exit(1);
204
+ }
205
+ const result = await client.protectEmbeddingConfig(configId, options.delete ? true : undefined, options.change ? true : undefined);
206
+ console.log('\n' + colors.status.success('✓ Protection enabled'));
207
+ const flags = [];
208
+ if (options.delete)
209
+ flags.push('delete-protected');
210
+ if (options.change)
211
+ flags.push('change-protected');
212
+ console.log(`\n ${colors.ui.key('Config ID:')} ${colors.ui.value(configId)}`);
213
+ console.log(` ${colors.ui.key('Flags:')} ${colors.status.warning(flags.join(', '))}`);
214
+ console.log('\n' + (0, colors_1.separator)() + '\n');
215
+ }
216
+ catch (error) {
217
+ console.error(colors.status.error('✗ Failed to set protection'));
218
+ console.error(colors.status.error(error.response?.data?.detail || error.message));
219
+ process.exit(1);
220
+ }
221
+ });
222
+ }
223
+ /**
224
+ * Unprotect an embedding configuration
225
+ */
226
+ function createEmbeddingUnprotectCommand(client) {
227
+ return new commander_1.Command('unprotect')
228
+ .description('Disable protection flags on an embedding configuration')
229
+ .argument('<config-id>', 'Configuration ID', parseInt)
230
+ .option('--delete', 'Disable delete protection')
231
+ .option('--change', 'Disable change protection')
232
+ .action(async (configId, options) => {
233
+ try {
234
+ console.log('\n' + (0, colors_1.separator)());
235
+ console.log(colors.ui.title(`🔓 Unprotect Config ${configId}`));
236
+ console.log((0, colors_1.separator)());
237
+ if (!options.delete && !options.change) {
238
+ console.error(colors.status.error('\n✗ Must specify at least one protection flag'));
239
+ console.log(colors.status.dim(' Use --delete and/or --change\n'));
240
+ process.exit(1);
241
+ }
242
+ const result = await client.protectEmbeddingConfig(configId, options.delete ? false : undefined, options.change ? false : undefined);
243
+ console.log('\n' + colors.status.success('✓ Protection disabled'));
244
+ const flags = [];
245
+ if (options.delete)
246
+ flags.push('delete-protection');
247
+ if (options.change)
248
+ flags.push('change-protection');
249
+ console.log(`\n ${colors.ui.key('Config ID:')} ${colors.ui.value(configId)}`);
250
+ console.log(` ${colors.ui.key('Removed:')} ${colors.status.dim(flags.join(', '))}`);
251
+ console.log('\n' + (0, colors_1.separator)() + '\n');
252
+ }
253
+ catch (error) {
254
+ console.error(colors.status.error('✗ Failed to remove protection'));
255
+ console.error(colors.status.error(error.response?.data?.detail || error.message));
256
+ process.exit(1);
257
+ }
258
+ });
259
+ }
260
+ /**
261
+ * Activate an embedding configuration
262
+ */
263
+ function createEmbeddingActivateCommand(client) {
264
+ return new commander_1.Command('activate')
265
+ .description('Activate an embedding configuration (with automatic protection)')
266
+ .argument('<config-id>', 'Configuration ID', parseInt)
267
+ .option('--force', 'Force activation even with dimension mismatch (dangerous!)')
268
+ .action(async (configId, options) => {
269
+ try {
270
+ console.log('\n' + (0, colors_1.separator)());
271
+ console.log(colors.ui.title(`🔄 Activate Config ${configId}`));
272
+ console.log((0, colors_1.separator)());
273
+ if (options.force) {
274
+ console.log(colors.status.warning('\n⚠️ FORCE MODE: Bypassing dimension safety check'));
275
+ console.log(colors.status.dim(' This may break vector search if dimensions change!\n'));
276
+ }
277
+ console.log(colors.status.info('\nActivating configuration...'));
278
+ console.log(colors.status.dim(' • Unlocking current config (change protection)'));
279
+ console.log(colors.status.dim(' • Switching to new config'));
280
+ console.log(colors.status.dim(' • Locking new config (delete + change protection)'));
281
+ const result = await client.activateEmbeddingConfig(configId, options.force);
282
+ console.log('\n' + colors.status.success('✓ Configuration activated successfully'));
283
+ console.log(`\n ${colors.ui.key('Config ID:')} ${colors.ui.value(result.config_id)}`);
284
+ console.log(` ${colors.ui.key('Provider:')} ${colors.ui.value(result.provider)}`);
285
+ if (result.model) {
286
+ console.log(` ${colors.ui.key('Model:')} ${colors.ui.value(result.model)}`);
287
+ }
288
+ if (result.dimensions) {
289
+ console.log(` ${colors.ui.key('Dimensions:')} ${colors.ui.value(result.dimensions)}`);
290
+ }
291
+ console.log('\n' + colors.status.warning('⚠️ Next step: Hot reload to apply changes'));
292
+ console.log(colors.status.dim(' Run: kg admin embedding reload\n'));
293
+ console.log((0, colors_1.separator)() + '\n');
294
+ }
295
+ catch (error) {
296
+ console.error(colors.status.error('✗ Failed to activate configuration'));
297
+ console.error(colors.status.error(error.response?.data?.detail || error.message));
298
+ process.exit(1);
299
+ }
300
+ });
301
+ }
302
+ /**
303
+ * Delete an embedding configuration
304
+ */
305
+ function createEmbeddingDeleteCommand(client) {
306
+ return new commander_1.Command('delete')
307
+ .description('Delete an embedding configuration')
308
+ .argument('<config-id>', 'Configuration ID', parseInt)
309
+ .action(async (configId) => {
310
+ try {
311
+ console.log('\n' + (0, colors_1.separator)());
312
+ console.log(colors.ui.title(`🗑️ Delete Config ${configId}`));
313
+ console.log((0, colors_1.separator)());
314
+ // Confirm deletion
315
+ const confirm = await (0, utils_1.prompt)(`\nDelete embedding config ${configId}? (yes/no): `);
316
+ if (confirm.toLowerCase() !== 'yes') {
317
+ console.log(colors.status.dim('Cancelled\n'));
318
+ process.exit(0);
319
+ }
320
+ const result = await client.deleteEmbeddingConfig(configId);
321
+ console.log('\n' + colors.status.success('✓ Configuration deleted'));
322
+ console.log(`\n ${colors.ui.key('Config ID:')} ${colors.ui.value(configId)}`);
323
+ console.log('\n' + (0, colors_1.separator)() + '\n');
324
+ }
325
+ catch (error) {
326
+ console.error(colors.status.error('✗ Failed to delete configuration'));
327
+ console.error(colors.status.error(error.response?.data?.detail || error.message));
328
+ process.exit(1);
329
+ }
330
+ });
331
+ }
332
+ /**
333
+ * Show comprehensive embedding status (ADR-068 Phase 4)
334
+ */
335
+ function createEmbeddingStatusCommand(client) {
336
+ return new commander_1.Command('status')
337
+ .description('Show comprehensive embedding coverage across all graph text entities with hash verification')
338
+ .option('--ontology <name>', 'Limit status to specific ontology namespace')
339
+ .action(async (options) => {
340
+ try {
341
+ console.log((0, colors_1.separator)());
342
+ console.log(colors.ui.title('📊 Embedding Coverage Status'));
343
+ if (options.ontology) {
344
+ console.log(colors.status.dim(` Ontology: ${options.ontology}`));
345
+ }
346
+ console.log((0, colors_1.separator)());
347
+ const status = await client.getEmbeddingStatus(options.ontology);
348
+ // Active Config
349
+ if (status.active_config) {
350
+ console.log();
351
+ console.log(colors.ui.header('Active Embedding Configuration:'));
352
+ console.log(` ${colors.ui.key('Provider:')} ${colors.ui.value(status.active_config.provider)}`);
353
+ console.log(` ${colors.ui.key('Model:')} ${colors.ui.value(status.active_config.model_name)}`);
354
+ console.log(` ${colors.ui.key('Dimensions:')} ${colors.ui.value(status.active_config.embedding_dimensions.toString())}`);
355
+ }
356
+ // Concepts
357
+ console.log();
358
+ console.log(colors.ui.header('Concepts (AGE Graph Nodes):'));
359
+ console.log(` ${colors.ui.key('Total:')} ${colors.ui.value(status.concepts.total.toString())}`);
360
+ console.log(` ${colors.status.success('✓ With embeddings:')} ${colors.ui.value(status.concepts.with_embeddings.toString())} (${status.concepts.percentage}%)`);
361
+ if (status.concepts.without_embeddings > 0) {
362
+ console.log(` ${colors.status.warning('✗ Without embeddings:')} ${colors.ui.value(status.concepts.without_embeddings.toString())}`);
363
+ }
364
+ if (status.concepts.incompatible_embeddings > 0) {
365
+ console.log(` ${colors.status.error('⚠ Incompatible:')} ${colors.ui.value(status.concepts.incompatible_embeddings.toString())} (model/dimension mismatch)`);
366
+ }
367
+ // Sources
368
+ console.log();
369
+ console.log(colors.ui.header('Sources (Text Chunks):'));
370
+ console.log(` ${colors.ui.key('Total:')} ${colors.ui.value(status.sources.total.toString())}`);
371
+ console.log(` ${colors.status.success('✓ With embeddings:')} ${colors.ui.value(status.sources.with_embeddings.toString())} (${status.sources.percentage}%)`);
372
+ if (status.sources.without_embeddings > 0) {
373
+ console.log(` ${colors.status.warning('✗ Without embeddings:')} ${colors.ui.value(status.sources.without_embeddings.toString())}`);
374
+ }
375
+ if (status.sources.stale_embeddings > 0) {
376
+ console.log(` ${colors.status.error('⚠ Stale embeddings:')} ${colors.ui.value(status.sources.stale_embeddings.toString())} (hash mismatch - source changed)`);
377
+ }
378
+ if (status.sources.incompatible_embeddings > 0) {
379
+ console.log(` ${colors.status.error('⚠ Incompatible:')} ${colors.ui.value(status.sources.incompatible_embeddings.toString())} (model/dimension mismatch)`);
380
+ }
381
+ // Vocabulary
382
+ console.log();
383
+ console.log(colors.ui.header('Vocabulary (Relationship Types):'));
384
+ console.log(` ${colors.ui.key('Total:')} ${colors.ui.value(status.vocabulary.total.toString())}`);
385
+ console.log(` ${colors.status.success('✓ With embeddings:')} ${colors.ui.value(status.vocabulary.with_embeddings.toString())} (${status.vocabulary.percentage}%)`);
386
+ if (status.vocabulary.without_embeddings > 0) {
387
+ console.log(` ${colors.status.warning('✗ Without embeddings:')} ${colors.ui.value(status.vocabulary.without_embeddings.toString())}`);
388
+ }
389
+ if (status.vocabulary.incompatible_embeddings > 0) {
390
+ console.log(` ${colors.status.error('⚠ Incompatible:')} ${colors.ui.value(status.vocabulary.incompatible_embeddings.toString())} (model/dimension mismatch)`);
391
+ }
392
+ // Images (future)
393
+ if (status.images && status.images.total > 0) {
394
+ console.log();
395
+ console.log(colors.ui.header('Images:'));
396
+ console.log(` ${colors.ui.key('Total:')} ${colors.ui.value(status.images.total.toString())}`);
397
+ console.log(` ${colors.status.success('✓ With embeddings:')} ${colors.ui.value(status.images.with_embeddings.toString())} (${status.images.percentage}%)`);
398
+ }
399
+ else if (status.images && status.images.note) {
400
+ console.log();
401
+ console.log(colors.ui.header('Images:'));
402
+ console.log(` ${colors.status.dim(status.images.note)}`);
403
+ }
404
+ // Summary
405
+ console.log();
406
+ console.log((0, colors_1.separator)());
407
+ console.log(colors.ui.header('Overall Summary:'));
408
+ console.log(` ${colors.ui.key('Total Entities:')} ${colors.ui.value(status.summary.total_entities.toString())}`);
409
+ console.log(` ${colors.status.success('✓ With Embeddings:')} ${colors.ui.value(status.summary.total_with_embeddings.toString())} (${status.summary.overall_percentage}%)`);
410
+ if (status.summary.total_without_embeddings > 0) {
411
+ console.log(` ${colors.status.warning('✗ Without Embeddings:')} ${colors.ui.value(status.summary.total_without_embeddings.toString())}`);
412
+ }
413
+ if (status.summary.total_incompatible > 0) {
414
+ console.log(` ${colors.status.error('⚠ Incompatible:')} ${colors.ui.value(status.summary.total_incompatible.toString())} (requires regeneration)`);
415
+ }
416
+ console.log((0, colors_1.separator)());
417
+ console.log();
418
+ }
419
+ catch (error) {
420
+ console.error();
421
+ console.error(colors.status.error('✗ Failed to get embedding status'));
422
+ console.error(colors.status.dim(` ${error.message || error}`));
423
+ console.error();
424
+ process.exit(1);
425
+ }
426
+ });
427
+ }
428
+ /**
429
+ * Regenerate embeddings (ADR-068 Phase 4)
430
+ */
431
+ function createEmbeddingRegenerateCommand(client) {
432
+ const cmd = new commander_1.Command('regenerate')
433
+ .description('Regenerate vector embeddings for all graph text entities: concepts, sources, vocabulary (ADR-068 Phase 4) - useful after changing embedding model or repairing missing embeddings')
434
+ .option('--type <type>', 'Type of embeddings to regenerate: concept, source, vocabulary, all')
435
+ .option('--only-missing', 'Only generate for entities without embeddings (skip existing) - applies to concept and source types', false)
436
+ .option('--only-incompatible', 'Only regenerate embeddings with mismatched model/dimensions (for model migrations)', false)
437
+ .option('--ontology <name>', 'Limit regeneration to specific ontology namespace - applies to concept and source types')
438
+ .option('--limit <n>', 'Maximum number of entities to process (useful for testing/batching)', parseInt)
439
+ .option('--status', 'Show embedding status before regeneration (diagnostic mode)', false)
440
+ .action(async (options) => {
441
+ // If --status flag is set, show status and exit (reuse status command logic)
442
+ if (options.status) {
443
+ const statusCommand = createEmbeddingStatusCommand(client);
444
+ await statusCommand.parseAsync(['status', ...(options.ontology ? ['--ontology', options.ontology] : [])], { from: 'user' });
445
+ return;
446
+ }
447
+ // If no --type provided, show help and exit
448
+ if (!options.type) {
449
+ console.log();
450
+ console.log(colors.status.warning('⚠ No --type specified'));
451
+ console.log();
452
+ console.log(colors.ui.header('Usage:'));
453
+ console.log(' kg admin embedding regenerate --type <type> [options]');
454
+ console.log();
455
+ console.log(colors.ui.header('Required:'));
456
+ console.log(' --type <type> Type: concept, source, vocabulary, all');
457
+ console.log();
458
+ console.log(colors.ui.header('Options:'));
459
+ console.log(' --only-missing Only generate for entities without embeddings');
460
+ console.log(' --only-incompatible Only regenerate embeddings with model/dimension mismatch');
461
+ console.log(' --ontology <name> Limit to specific ontology (concept/source only)');
462
+ console.log(' --limit <n> Maximum number of entities to process');
463
+ console.log(' --status Show embedding status first (diagnostic mode)');
464
+ console.log();
465
+ console.log(colors.ui.header('Examples:'));
466
+ console.log(' kg admin embedding regenerate --type concept --only-missing');
467
+ console.log(' kg admin embedding regenerate --type source --only-incompatible');
468
+ console.log(' kg admin embedding regenerate --type all');
469
+ console.log(' kg admin embedding regenerate --status # Show status first');
470
+ console.log();
471
+ console.log(colors.status.dim('Tip: Run "kg admin embedding status" to check current coverage'));
472
+ console.log();
473
+ process.exit(0);
474
+ }
475
+ // Normal regeneration flow
476
+ try {
477
+ // Validate embedding type
478
+ const validTypes = ['concept', 'source', 'vocabulary', 'all'];
479
+ const embeddingType = options.type;
480
+ if (!validTypes.includes(embeddingType)) {
481
+ console.error();
482
+ console.error(colors.status.error(`✗ Invalid --type: ${embeddingType}`));
483
+ console.error(colors.status.dim(` Valid types: ${validTypes.join(', ')}`));
484
+ console.error();
485
+ process.exit(1);
486
+ }
487
+ // Validate flag combination
488
+ if (options.onlyMissing && options.onlyIncompatible) {
489
+ console.error();
490
+ console.error(colors.status.error('✗ Cannot use both --only-missing and --only-incompatible'));
491
+ console.error(colors.status.dim(' Choose one: missing (no embeddings) or incompatible (wrong model/dimensions)'));
492
+ console.error();
493
+ process.exit(1);
494
+ }
495
+ console.log((0, colors_1.separator)());
496
+ console.log(colors.ui.title(`🔄 Regenerating ${embeddingType.charAt(0).toUpperCase() + embeddingType.slice(1)} Embeddings`));
497
+ console.log((0, colors_1.separator)());
498
+ const params = {
499
+ embedding_type: embeddingType,
500
+ only_missing: options.onlyMissing || false,
501
+ only_incompatible: options.onlyIncompatible || false
502
+ };
503
+ if (options.ontology) {
504
+ params.ontology = options.ontology;
505
+ }
506
+ if (options.limit) {
507
+ params.limit = options.limit;
508
+ }
509
+ console.log();
510
+ console.log(colors.status.info('Starting regeneration...'));
511
+ console.log(colors.status.dim(` Type: ${embeddingType}`));
512
+ if (options.ontology) {
513
+ console.log(colors.status.dim(` Ontology: ${options.ontology}`));
514
+ }
515
+ if (options.onlyMissing) {
516
+ console.log(colors.status.dim(' Mode: Only missing embeddings'));
517
+ }
518
+ if (options.onlyIncompatible) {
519
+ console.log(colors.status.dim(' Mode: Only incompatible embeddings (model migration)'));
520
+ }
521
+ if (options.limit) {
522
+ console.log(colors.status.dim(` Limit: ${options.limit} entities`));
523
+ }
524
+ console.log();
525
+ const result = await client.regenerateEmbeddings(params);
526
+ console.log((0, colors_1.separator)());
527
+ console.log(colors.status.success('✓ Regeneration completed'));
528
+ // Handle 'all' type response (has totals and per-type results)
529
+ if (embeddingType === 'all' && result.totals) {
530
+ console.log(` ${colors.stats.label('Total Processed:')} ${colors.stats.value(result.totals.processed_count.toString())} / ${result.totals.target_count}`);
531
+ if (result.totals.failed_count > 0) {
532
+ console.log(` ${colors.status.error('Total Failed:')} ${result.totals.failed_count}`);
533
+ }
534
+ console.log(` ${colors.status.dim('Total Duration:')} ${result.totals.duration_ms}ms`);
535
+ console.log();
536
+ console.log(colors.ui.header('Breakdown:'));
537
+ if (result.results.concepts) {
538
+ console.log(` ${colors.ui.key('Concepts:')} ${colors.stats.value(result.results.concepts.processed_count.toString())} / ${result.results.concepts.target_count} (${result.results.concepts.duration_ms}ms)`);
539
+ }
540
+ if (result.results.sources) {
541
+ console.log(` ${colors.ui.key('Sources:')} ${colors.stats.value(result.results.sources.processed_count.toString())} / ${result.results.sources.target_count} (${result.results.sources.duration_ms}ms)`);
542
+ }
543
+ if (result.results.vocabulary) {
544
+ console.log(` ${colors.ui.key('Vocabulary:')} ${colors.stats.value(result.results.vocabulary.processed_count.toString())} / ${result.results.vocabulary.target_count} (${result.results.vocabulary.duration_ms}ms)`);
545
+ }
546
+ }
547
+ else {
548
+ // Single type response
549
+ console.log(` ${colors.stats.label('Processed:')} ${colors.stats.value(result.processed_count.toString())} / ${result.target_count}`);
550
+ if (result.failed_count > 0) {
551
+ console.log(` ${colors.status.error('Failed:')} ${result.failed_count}`);
552
+ }
553
+ console.log(` ${colors.status.dim('Duration:')} ${result.duration_ms}ms`);
554
+ if (result.embedding_model && result.embedding_provider) {
555
+ console.log(` ${colors.status.dim('Model:')} ${result.embedding_provider}/${result.embedding_model}`);
556
+ }
557
+ if (result.errors && result.errors.length > 0) {
558
+ console.log();
559
+ console.log(colors.status.error('Errors:'));
560
+ result.errors.slice(0, 5).forEach((err) => {
561
+ console.log(colors.status.dim(` ${err}`));
562
+ });
563
+ if (result.errors.length > 5) {
564
+ console.log(colors.status.dim(` ... and ${result.errors.length - 5} more`));
565
+ }
566
+ }
567
+ }
568
+ console.log((0, colors_1.separator)());
569
+ console.log();
570
+ }
571
+ catch (error) {
572
+ console.error();
573
+ console.error(colors.status.error('✗ Failed to regenerate embeddings'));
574
+ console.error(colors.status.dim(` ${error.message || error}`));
575
+ console.error();
576
+ process.exit(1);
577
+ }
578
+ });
579
+ return cmd;
580
+ }
581
+ /**
582
+ * Embedding command group
583
+ */
584
+ function createEmbeddingCommand(client) {
585
+ const embeddingCommand = new commander_1.Command('embedding')
586
+ .description('Manage embedding model configuration (ADR-039)');
587
+ embeddingCommand.addCommand(createEmbeddingListCommand(client));
588
+ embeddingCommand.addCommand(createEmbeddingCreateCommand(client));
589
+ embeddingCommand.addCommand(createEmbeddingActivateCommand(client));
590
+ embeddingCommand.addCommand(createEmbeddingReloadCommand(client));
591
+ embeddingCommand.addCommand(createEmbeddingProtectCommand(client));
592
+ embeddingCommand.addCommand(createEmbeddingUnprotectCommand(client));
593
+ embeddingCommand.addCommand(createEmbeddingDeleteCommand(client));
594
+ embeddingCommand.addCommand(createEmbeddingStatusCommand(client));
595
+ embeddingCommand.addCommand(createEmbeddingRegenerateCommand(client));
596
+ return embeddingCommand;
597
+ }
598
+ //# sourceMappingURL=embedding.js.map