@aaronsb/kg-cli 0.6.6 → 0.8.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 (103) hide show
  1. package/dist/api/client.d.ts +168 -1
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +266 -0
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/cli/batch.d.ts +8 -0
  6. package/dist/cli/batch.d.ts.map +1 -0
  7. package/dist/cli/batch.js +225 -0
  8. package/dist/cli/batch.js.map +1 -0
  9. package/dist/cli/commands.d.ts.map +1 -1
  10. package/dist/cli/commands.js +8 -0
  11. package/dist/cli/commands.js.map +1 -1
  12. package/dist/cli/concept.d.ts +9 -0
  13. package/dist/cli/concept.d.ts.map +1 -0
  14. package/dist/cli/concept.js +336 -0
  15. package/dist/cli/concept.js.map +1 -0
  16. package/dist/cli/edge.d.ts +9 -0
  17. package/dist/cli/edge.d.ts.map +1 -0
  18. package/dist/cli/edge.js +364 -0
  19. package/dist/cli/edge.js.map +1 -0
  20. package/dist/cli/jobs.js +111 -3
  21. package/dist/cli/jobs.js.map +1 -1
  22. package/dist/cli/ontology.d.ts.map +1 -1
  23. package/dist/cli/ontology.js +534 -1
  24. package/dist/cli/ontology.js.map +1 -1
  25. package/dist/cli/storage.d.ts +10 -0
  26. package/dist/cli/storage.d.ts.map +1 -0
  27. package/dist/cli/storage.js +260 -0
  28. package/dist/cli/storage.js.map +1 -0
  29. package/dist/cli/vocabulary/index.d.ts.map +1 -1
  30. package/dist/cli/vocabulary/index.js +1 -0
  31. package/dist/cli/vocabulary/index.js.map +1 -1
  32. package/dist/cli/vocabulary/similarity.d.ts +1 -0
  33. package/dist/cli/vocabulary/similarity.d.ts.map +1 -1
  34. package/dist/cli/vocabulary/similarity.js +60 -9
  35. package/dist/cli/vocabulary/similarity.js.map +1 -1
  36. package/dist/lib/interactive.d.ts +84 -0
  37. package/dist/lib/interactive.d.ts.map +1 -0
  38. package/dist/lib/interactive.js +296 -0
  39. package/dist/lib/interactive.js.map +1 -0
  40. package/dist/lib/validation.d.ts +106 -0
  41. package/dist/lib/validation.d.ts.map +1 -0
  42. package/dist/lib/validation.js +354 -0
  43. package/dist/lib/validation.js.map +1 -0
  44. package/dist/mcp/formatters/concept.d.ts +24 -0
  45. package/dist/mcp/formatters/concept.d.ts.map +1 -0
  46. package/dist/mcp/formatters/concept.js +243 -0
  47. package/dist/mcp/formatters/concept.js.map +1 -0
  48. package/dist/mcp/formatters/document.d.ts +25 -0
  49. package/dist/mcp/formatters/document.d.ts.map +1 -0
  50. package/dist/mcp/formatters/document.js +178 -0
  51. package/dist/mcp/formatters/document.js.map +1 -0
  52. package/dist/mcp/formatters/epistemic.d.ts +16 -0
  53. package/dist/mcp/formatters/epistemic.d.ts.map +1 -0
  54. package/dist/mcp/formatters/epistemic.js +269 -0
  55. package/dist/mcp/formatters/epistemic.js.map +1 -0
  56. package/dist/mcp/formatters/graph.d.ts +63 -0
  57. package/dist/mcp/formatters/graph.d.ts.map +1 -0
  58. package/dist/mcp/formatters/graph.js +220 -0
  59. package/dist/mcp/formatters/graph.js.map +1 -0
  60. package/dist/mcp/formatters/index.d.ts +19 -0
  61. package/dist/mcp/formatters/index.d.ts.map +1 -0
  62. package/dist/mcp/formatters/index.js +73 -0
  63. package/dist/mcp/formatters/index.js.map +1 -0
  64. package/dist/mcp/formatters/ingest.d.ts +16 -0
  65. package/dist/mcp/formatters/ingest.d.ts.map +1 -0
  66. package/dist/mcp/formatters/ingest.js +169 -0
  67. package/dist/mcp/formatters/ingest.js.map +1 -0
  68. package/dist/mcp/formatters/job.d.ts +13 -0
  69. package/dist/mcp/formatters/job.d.ts.map +1 -0
  70. package/dist/mcp/formatters/job.js +204 -0
  71. package/dist/mcp/formatters/job.js.map +1 -0
  72. package/dist/mcp/formatters/ontology.d.ts +93 -0
  73. package/dist/mcp/formatters/ontology.d.ts.map +1 -0
  74. package/dist/mcp/formatters/ontology.js +328 -0
  75. package/dist/mcp/formatters/ontology.js.map +1 -0
  76. package/dist/mcp/formatters/source.d.ts +19 -0
  77. package/dist/mcp/formatters/source.d.ts.map +1 -0
  78. package/dist/mcp/formatters/source.js +182 -0
  79. package/dist/mcp/formatters/source.js.map +1 -0
  80. package/dist/mcp/formatters/system.d.ts +10 -0
  81. package/dist/mcp/formatters/system.d.ts.map +1 -0
  82. package/dist/mcp/formatters/system.js +152 -0
  83. package/dist/mcp/formatters/system.js.map +1 -0
  84. package/dist/mcp/formatters/utils.d.ts +17 -0
  85. package/dist/mcp/formatters/utils.d.ts.map +1 -0
  86. package/dist/mcp/formatters/utils.js +55 -0
  87. package/dist/mcp/formatters/utils.js.map +1 -0
  88. package/dist/mcp/graph-operations.d.ts +242 -0
  89. package/dist/mcp/graph-operations.d.ts.map +1 -0
  90. package/dist/mcp/graph-operations.js +532 -0
  91. package/dist/mcp/graph-operations.js.map +1 -0
  92. package/dist/mcp-server.js +625 -37
  93. package/dist/mcp-server.js.map +1 -1
  94. package/dist/types/index.d.ts +289 -0
  95. package/dist/types/index.d.ts.map +1 -1
  96. package/dist/version.d.ts +3 -3
  97. package/dist/version.js +3 -3
  98. package/dist/version.js.map +1 -1
  99. package/package.json +1 -1
  100. package/dist/mcp/formatters.d.ts +0 -100
  101. package/dist/mcp/formatters.d.ts.map +0 -1
  102. package/dist/mcp/formatters.js +0 -1411
  103. package/dist/mcp/formatters.js.map +0 -1
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ /**
3
+ * Edge CRUD Commands (ADR-089 Phase 2)
4
+ *
5
+ * Direct creation, listing, and management of edges (relationships) in the knowledge graph.
6
+ * Supports both non-interactive (flags) and interactive (-i) modes.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.edgeCommand = void 0;
43
+ const commander_1 = require("commander");
44
+ const client_1 = require("../api/client");
45
+ const colors = __importStar(require("./colors"));
46
+ const colors_1 = require("./colors");
47
+ const table_1 = require("../lib/table");
48
+ const help_formatter_1 = require("./help-formatter");
49
+ const validation_1 = require("../lib/validation");
50
+ const interactive_1 = require("../lib/interactive");
51
+ exports.edgeCommand = (0, help_formatter_1.setCommandHelp)(new commander_1.Command('edge'), 'Manage edges (relationships) in the knowledge graph', 'Create, list, and delete edges between concepts. Edges represent relationships like IMPLIES, SUPPORTS, CONTRADICTS, etc. Use --from/--to with concept IDs or --from-label/--to-label for semantic lookup by label.')
52
+ .alias('e')
53
+ .showHelpAfterError('(add --help for additional information)')
54
+ .showSuggestionAfterError()
55
+ .addCommand(createListCommand())
56
+ .addCommand(createCreateCommand())
57
+ .addCommand(createDeleteCommand());
58
+ function createListCommand() {
59
+ return new commander_1.Command('list')
60
+ .description('List edges with optional filters.')
61
+ .option('--from <id>', 'Filter by source concept ID')
62
+ .option('--to <id>', 'Filter by target concept ID')
63
+ .option('--type <type>', 'Filter by relationship type')
64
+ .option('--category <cat>', 'Filter by category')
65
+ .option('--limit <n>', 'Maximum results (default: 50)', '50')
66
+ .option('--offset <n>', 'Pagination offset', '0')
67
+ .option('--json', 'Output as JSON')
68
+ .action(async (options) => {
69
+ try {
70
+ const client = (0, client_1.createClientFromEnv)();
71
+ const params = {
72
+ from_concept_id: options.from,
73
+ to_concept_id: options.to,
74
+ relationship_type: options.type,
75
+ category: options.category,
76
+ limit: parseInt(options.limit, 10),
77
+ offset: parseInt(options.offset, 10),
78
+ };
79
+ const result = await client.listEdges(params);
80
+ if (options.json) {
81
+ console.log(JSON.stringify(result, null, 2));
82
+ return;
83
+ }
84
+ if (result.edges.length === 0) {
85
+ console.log(colors.status.warning('\nNo edges found.'));
86
+ return;
87
+ }
88
+ console.log('\n' + colors.ui.title('🔗 Edges'));
89
+ console.log((0, colors_1.separator)());
90
+ console.log(colors.status.dim(`Showing ${result.edges.length} of ${result.total} edges\n`));
91
+ const table = new table_1.Table({
92
+ columns: [
93
+ { header: 'From', field: 'from_concept_id', type: 'concept_id', width: 15 },
94
+ { header: 'Type', field: 'relationship_type', type: 'heading', width: 20 },
95
+ { header: 'To', field: 'to_concept_id', type: 'concept_id', width: 15 },
96
+ { header: 'Category', field: 'category', type: 'text', width: 15 },
97
+ { header: 'Conf', field: (row) => (row.confidence * 100).toFixed(0) + '%', type: 'text', width: 6, align: 'right' },
98
+ ],
99
+ });
100
+ table.print(result.edges);
101
+ if (result.total > result.edges.length) {
102
+ console.log(colors.status.dim(`\nUse --offset ${result.offset + result.edges.length} to see more`));
103
+ }
104
+ }
105
+ catch (error) {
106
+ (0, interactive_1.handleCliError)(error, 'Failed to list edges');
107
+ }
108
+ });
109
+ }
110
+ function createCreateCommand() {
111
+ return new commander_1.Command('create')
112
+ .description('Create an edge between two concepts.')
113
+ .option('--from <id>', 'Source concept ID')
114
+ .option('--to <id>', 'Target concept ID')
115
+ .option('--from-label <text>', 'Source concept (search by label)')
116
+ .option('--to-label <text>', 'Target concept (search by label)')
117
+ .option('--type <type>', 'Relationship type (e.g., IMPLIES, SUPPORTS)')
118
+ .option('--category <cat>', 'Relationship category (auto-inferred if omitted)')
119
+ .option('--confidence <n>', 'Confidence score 0-1 (default: 1.0)', '1.0')
120
+ .option('--create-vocab', 'Create vocabulary term if it does not exist')
121
+ .option('--json', 'Output as JSON')
122
+ .option('-i, --interactive', 'Guided wizard mode')
123
+ .option('-y, --yes', 'Skip confirmation prompts')
124
+ .action(async (options) => {
125
+ try {
126
+ const client = (0, client_1.createClientFromEnv)();
127
+ let fromConceptId;
128
+ let toConceptId;
129
+ let relationshipType;
130
+ let category = options.category;
131
+ let confidence = parseFloat(options.confidence) || 1.0;
132
+ if (options.interactive) {
133
+ // Interactive wizard mode
134
+ console.log('\n' + colors.ui.title('🔗 Create Edge'));
135
+ console.log((0, colors_1.separator)());
136
+ console.log();
137
+ // Get source concept
138
+ const fromResult = await (0, interactive_1.textInput)('Source concept (ID or search term)');
139
+ if (fromResult.cancelled || !fromResult.value) {
140
+ console.log(colors.status.dim('\nCancelled.'));
141
+ return;
142
+ }
143
+ // Try to resolve as ID first, then as label
144
+ if (fromResult.value.startsWith('c_')) {
145
+ const validFrom = await (0, validation_1.validateConceptId)(client, fromResult.value);
146
+ if (!validFrom.valid) {
147
+ console.log(colors.status.error(validFrom.error));
148
+ return;
149
+ }
150
+ fromConceptId = validFrom.data.concept_id;
151
+ console.log(colors.status.success(` → ${validFrom.data.label}`));
152
+ }
153
+ else {
154
+ const resolved = await (0, validation_1.resolveConceptByLabel)(client, fromResult.value);
155
+ if (!resolved.valid) {
156
+ console.log(colors.status.error(resolved.error));
157
+ return;
158
+ }
159
+ fromConceptId = resolved.data.concept_id;
160
+ console.log(colors.status.success(` → ${resolved.data.label} (${resolved.data.similarity.toFixed(0)}% match)`));
161
+ }
162
+ // Get target concept
163
+ const toResult = await (0, interactive_1.textInput)('Target concept (ID or search term)');
164
+ if (toResult.cancelled || !toResult.value) {
165
+ console.log(colors.status.dim('\nCancelled.'));
166
+ return;
167
+ }
168
+ if (toResult.value.startsWith('c_')) {
169
+ const validTo = await (0, validation_1.validateConceptId)(client, toResult.value);
170
+ if (!validTo.valid) {
171
+ console.log(colors.status.error(validTo.error));
172
+ return;
173
+ }
174
+ toConceptId = validTo.data.concept_id;
175
+ console.log(colors.status.success(` → ${validTo.data.label}`));
176
+ }
177
+ else {
178
+ const resolved = await (0, validation_1.resolveConceptByLabel)(client, toResult.value);
179
+ if (!resolved.valid) {
180
+ console.log(colors.status.error(resolved.error));
181
+ return;
182
+ }
183
+ toConceptId = resolved.data.concept_id;
184
+ console.log(colors.status.success(` → ${resolved.data.label} (${resolved.data.similarity.toFixed(0)}% match)`));
185
+ }
186
+ // Get relationship type
187
+ const typeResult = await (0, interactive_1.textInput)('Relationship type (e.g., IMPLIES, SUPPORTS)');
188
+ if (typeResult.cancelled || !typeResult.value) {
189
+ console.log(colors.status.dim('\nCancelled.'));
190
+ return;
191
+ }
192
+ relationshipType = typeResult.value.toUpperCase().replace(/\s+/g, '_');
193
+ // Validate vocab term
194
+ const vocabResult = await (0, validation_1.validateVocabTerm)(client, relationshipType, false);
195
+ if (!vocabResult.valid) {
196
+ console.log(colors.status.warning(` Vocabulary term '${relationshipType}' not found.`));
197
+ if (vocabResult.data?.similar_terms?.length) {
198
+ console.log(colors.status.dim(' Similar terms:'));
199
+ for (const t of vocabResult.data.similar_terms.slice(0, 3)) {
200
+ console.log(colors.status.dim(` - ${t.term} (${(t.similarity * 100).toFixed(0)}%)`));
201
+ }
202
+ }
203
+ const createNew = await (0, interactive_1.confirmYesNo)('Create new vocabulary term?', false);
204
+ if (!createNew) {
205
+ console.log(colors.status.dim('\nCancelled.'));
206
+ return;
207
+ }
208
+ // Will create with --create-vocab
209
+ options.createVocab = true;
210
+ }
211
+ // Confidence
212
+ const confResult = await (0, interactive_1.textInput)('Confidence (0-1)', '1.0');
213
+ if (!confResult.cancelled && confResult.value) {
214
+ confidence = parseFloat(confResult.value) || 1.0;
215
+ }
216
+ // Confirm
217
+ console.log('\n' + (0, colors_1.separator)());
218
+ console.log(colors.ui.header('Summary:'));
219
+ console.log(` ${fromConceptId} -[${relationshipType}]-> ${toConceptId}`);
220
+ console.log(` ${colors.ui.key('Confidence:')} ${(confidence * 100).toFixed(0)}%`);
221
+ console.log();
222
+ const confirmed = await (0, interactive_1.confirmYesNo)('Create this edge?', true);
223
+ if (!confirmed) {
224
+ console.log(colors.status.dim('\nCancelled.'));
225
+ return;
226
+ }
227
+ }
228
+ else {
229
+ // Non-interactive mode
230
+ const hasFromId = !!options.from;
231
+ const hasToId = !!options.to;
232
+ const hasFromLabel = !!options.fromLabel;
233
+ const hasToLabel = !!options.toLabel;
234
+ if (!hasFromId && !hasFromLabel) {
235
+ console.error(colors.status.error('✗ Missing required option: --from or --from-label'));
236
+ process.exit(1);
237
+ }
238
+ if (!hasToId && !hasToLabel) {
239
+ console.error(colors.status.error('✗ Missing required option: --to or --to-label'));
240
+ process.exit(1);
241
+ }
242
+ if (!options.type) {
243
+ console.error(colors.status.error('✗ Missing required option: --type'));
244
+ process.exit(1);
245
+ }
246
+ // Resolve source concept
247
+ if (hasFromId) {
248
+ const validFrom = await (0, validation_1.validateConceptId)(client, options.from);
249
+ if (!validFrom.valid) {
250
+ console.error(colors.status.error(`✗ From concept: ${validFrom.error}`));
251
+ process.exit(1);
252
+ }
253
+ fromConceptId = validFrom.data.concept_id;
254
+ }
255
+ else {
256
+ const resolved = await (0, validation_1.resolveConceptByLabel)(client, options.fromLabel);
257
+ if (!resolved.valid) {
258
+ console.error(colors.status.error(`✗ From concept: ${resolved.error}`));
259
+ process.exit(1);
260
+ }
261
+ fromConceptId = resolved.data.concept_id;
262
+ if (!options.json) {
263
+ console.log(colors.status.info(`Resolved --from-label "${options.fromLabel}" → ${resolved.data.concept_id}`));
264
+ }
265
+ }
266
+ // Resolve target concept
267
+ if (hasToId) {
268
+ const validTo = await (0, validation_1.validateConceptId)(client, options.to);
269
+ if (!validTo.valid) {
270
+ console.error(colors.status.error(`✗ To concept: ${validTo.error}`));
271
+ process.exit(1);
272
+ }
273
+ toConceptId = validTo.data.concept_id;
274
+ }
275
+ else {
276
+ const resolved = await (0, validation_1.resolveConceptByLabel)(client, options.toLabel);
277
+ if (!resolved.valid) {
278
+ console.error(colors.status.error(`✗ To concept: ${resolved.error}`));
279
+ process.exit(1);
280
+ }
281
+ toConceptId = resolved.data.concept_id;
282
+ if (!options.json) {
283
+ console.log(colors.status.info(`Resolved --to-label "${options.toLabel}" → ${resolved.data.concept_id}`));
284
+ }
285
+ }
286
+ relationshipType = options.type.toUpperCase().replace(/\s+/g, '_');
287
+ // Validate vocab term
288
+ const vocabResult = await (0, validation_1.validateVocabTerm)(client, relationshipType, options.createVocab);
289
+ if (!vocabResult.valid) {
290
+ console.error(colors.status.error(`✗ Relationship type: ${vocabResult.error}`));
291
+ process.exit(1);
292
+ }
293
+ if (vocabResult.warning) {
294
+ console.log(colors.status.warning(`⚠ ${vocabResult.warning}`));
295
+ }
296
+ relationshipType = vocabResult.data.term;
297
+ }
298
+ // Create the edge
299
+ const request = {
300
+ from_concept_id: fromConceptId,
301
+ to_concept_id: toConceptId,
302
+ relationship_type: relationshipType,
303
+ confidence,
304
+ source: 'api_creation',
305
+ };
306
+ if (category) {
307
+ request.category = category;
308
+ }
309
+ const result = await (0, interactive_1.withSpinner)('Creating edge...', async () => {
310
+ return client.createEdge(request);
311
+ });
312
+ if (options.json) {
313
+ console.log(JSON.stringify(result, null, 2));
314
+ return;
315
+ }
316
+ console.log(colors.status.success(`\n✓ Created edge: ${result.edge_id}`));
317
+ console.log(` ${result.from_concept_id} -[${result.relationship_type}]-> ${result.to_concept_id}`);
318
+ }
319
+ catch (error) {
320
+ (0, interactive_1.handleCliError)(error, 'Failed to create edge');
321
+ }
322
+ });
323
+ }
324
+ function createDeleteCommand() {
325
+ return new commander_1.Command('delete')
326
+ .description('Delete an edge by its composite key (from, type, to).')
327
+ .argument('<from>', 'Source concept ID')
328
+ .argument('<type>', 'Relationship type')
329
+ .argument('<to>', 'Target concept ID')
330
+ .option('-f, --force', 'Skip confirmation')
331
+ .option('--json', 'Output as JSON')
332
+ .action(async (from, type, to, options) => {
333
+ try {
334
+ const client = (0, client_1.createClientFromEnv)();
335
+ if (!options.force) {
336
+ console.log('\n' + (0, colors_1.separator)());
337
+ console.log(colors.status.warning('⚠️ Delete Edge'));
338
+ console.log((0, colors_1.separator)());
339
+ console.log();
340
+ console.log(` ${from} -[${type}]-> ${to}`);
341
+ console.log();
342
+ console.log(colors.status.warning('This action cannot be undone.'));
343
+ console.log();
344
+ const confirmed = await (0, interactive_1.confirmYesNo)('Delete this edge?', false);
345
+ if (!confirmed) {
346
+ console.log(colors.status.dim('\nCancelled.'));
347
+ return;
348
+ }
349
+ }
350
+ await client.deleteEdge(from, type, to);
351
+ if (options.json) {
352
+ console.log(JSON.stringify({ deleted: true, from, type, to }));
353
+ return;
354
+ }
355
+ console.log(colors.status.success(`\n✓ Deleted edge: ${from} -[${type}]-> ${to}`));
356
+ }
357
+ catch (error) {
358
+ (0, interactive_1.handleCliError)(error, 'Failed to delete edge', {
359
+ notFoundMessage: `Edge not found: ${from} -[${type}]-> ${to}`,
360
+ });
361
+ }
362
+ });
363
+ }
364
+ //# sourceMappingURL=edge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.js","sourceRoot":"","sources":["../../src/cli/edge.ts"],"names":[],"mappings":"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"}
package/dist/cli/jobs.js CHANGED
@@ -508,18 +508,126 @@ exports.jobsCommand
508
508
  process.exit(1);
509
509
  }
510
510
  });
511
- // Clear all jobs
511
+ // Delete a single job permanently
512
+ exports.jobsCommand
513
+ .command('delete <job-id>')
514
+ .description('Permanently delete a job from database (removes record entirely, not just cancels)')
515
+ .option('-f, --force', 'Force delete even if job is processing (dangerous)', false)
516
+ .showHelpAfterError()
517
+ .action(async (jobId, options) => {
518
+ try {
519
+ const client = (0, client_1.createClientFromEnv)();
520
+ console.log(chalk_1.default.blue(`Deleting job ${jobId}...`));
521
+ const result = await client.deleteJob(jobId, { purge: true, force: options.force });
522
+ if (result.deleted) {
523
+ console.log(chalk_1.default.green('✓ Job permanently deleted'));
524
+ }
525
+ else {
526
+ console.log(chalk_1.default.yellow('⚠ Job could not be deleted'));
527
+ }
528
+ }
529
+ catch (error) {
530
+ console.error(chalk_1.default.red('✗ Failed to delete job'));
531
+ console.error(chalk_1.default.red(error.response?.data?.detail || error.message));
532
+ process.exit(1);
533
+ }
534
+ });
535
+ // Cleanup jobs with filters
536
+ exports.jobsCommand
537
+ .command('cleanup')
538
+ .description('Delete jobs matching filters (with preview) - safer alternative to clear')
539
+ .option('-s, --status <status>', 'Filter by status (pending|cancelled|completed|failed)')
540
+ .option('--system', 'Only delete system/scheduled jobs', false)
541
+ .option('--older-than <duration>', 'Delete jobs older than duration (1h|24h|7d|30d)')
542
+ .option('-t, --type <job-type>', 'Filter by job type (ingestion|epistemic_remeasurement|projection|etc)')
543
+ .option('--confirm', 'Execute deletion (without this flag, shows preview only)', false)
544
+ .option('--all', 'Delete ALL jobs (nuclear option, requires --confirm)', false)
545
+ .showHelpAfterError()
546
+ .action(async (options) => {
547
+ try {
548
+ const client = (0, client_1.createClientFromEnv)();
549
+ // Check for --all without filters
550
+ const hasFilters = options.status || options.system || options.olderThan || options.type;
551
+ if (options.all && !options.confirm) {
552
+ console.error(chalk_1.default.red('✗ Confirmation required for --all'));
553
+ console.error(chalk_1.default.yellow('\n⚠️ This will DELETE ALL jobs from the database!'));
554
+ console.error(chalk_1.default.gray('\nTo confirm, run: ') + chalk_1.default.cyan('kg job cleanup --all --confirm'));
555
+ process.exit(1);
556
+ }
557
+ if (!hasFilters && !options.all) {
558
+ console.error(chalk_1.default.red('✗ No filters specified'));
559
+ console.error(chalk_1.default.gray('\nExamples:'));
560
+ console.error(chalk_1.default.gray(' kg job cleanup --status pending # Preview pending jobs'));
561
+ console.error(chalk_1.default.gray(' kg job cleanup --status pending --confirm # Delete pending jobs'));
562
+ console.error(chalk_1.default.gray(' kg job cleanup --system --older-than 24h # Preview old system jobs'));
563
+ console.error(chalk_1.default.gray(' kg job cleanup --all --confirm # Delete ALL jobs (nuclear)'));
564
+ process.exit(1);
565
+ }
566
+ // Preview mode (default)
567
+ if (!options.confirm) {
568
+ console.log(chalk_1.default.blue('Preview mode - showing jobs that would be deleted:\n'));
569
+ const result = await client.deleteJobs({
570
+ dryRun: true,
571
+ status: options.status,
572
+ system: options.system,
573
+ olderThan: options.olderThan,
574
+ jobType: options.type
575
+ });
576
+ if (!result.jobs || result.jobs.length === 0) {
577
+ console.log(chalk_1.default.gray('No jobs match the specified filters\n'));
578
+ return;
579
+ }
580
+ console.log(chalk_1.default.yellow(`Found ${result.jobs_to_delete} job(s) to delete:\n`));
581
+ // Show preview table (limit to 10)
582
+ const previewJobs = result.jobs.slice(0, 10);
583
+ for (const job of previewJobs) {
584
+ const created = new Date(job.created_at).toLocaleString();
585
+ console.log(chalk_1.default.gray(` ${job.job_id.substring(0, 16)} ${job.status.padEnd(10)} ${(job.job_type || '-').padEnd(24)} ${created}`));
586
+ }
587
+ if (result.jobs.length > 10) {
588
+ console.log(chalk_1.default.gray(` ... and ${result.jobs.length - 10} more\n`));
589
+ }
590
+ console.log(chalk_1.default.blue('\nTo delete these jobs, add --confirm'));
591
+ }
592
+ else {
593
+ // Execute deletion
594
+ if (options.all) {
595
+ console.log(chalk_1.default.yellow('\n⚠️ Deleting ALL jobs from database...'));
596
+ }
597
+ else {
598
+ console.log(chalk_1.default.yellow('\n⚠️ Deleting jobs matching filters...'));
599
+ }
600
+ const result = await client.deleteJobs({
601
+ confirm: true,
602
+ status: options.status,
603
+ system: options.system,
604
+ olderThan: options.olderThan,
605
+ jobType: options.type
606
+ });
607
+ console.log(chalk_1.default.green(`\n✓ ${result.message}`));
608
+ console.log(chalk_1.default.gray(` Jobs deleted: ${result.jobs_deleted}\n`));
609
+ }
610
+ }
611
+ catch (error) {
612
+ console.error(chalk_1.default.red('✗ Failed to cleanup jobs'));
613
+ console.error(chalk_1.default.red(error.response?.data?.detail || error.message));
614
+ process.exit(1);
615
+ }
616
+ });
617
+ // Clear all jobs (deprecated, kept for backwards compatibility)
512
618
  exports.jobsCommand
513
619
  .command('clear')
514
- .description('Clear ALL jobs from database - DESTRUCTIVE operation requiring --confirm flag (use for dev/testing cleanup)')
620
+ .description('Clear ALL jobs from database (deprecated: use "cleanup --all --confirm" instead)')
515
621
  .option('--confirm', 'Confirm deletion (REQUIRED for safety)', false)
516
622
  .showHelpAfterError()
517
623
  .action(async (options) => {
518
624
  try {
625
+ console.log(chalk_1.default.yellow('⚠️ Note: "kg job clear" is deprecated. Use "kg job cleanup --all --confirm" instead.\n'));
519
626
  if (!options.confirm) {
520
627
  console.error(chalk_1.default.red('✗ Confirmation required'));
521
628
  console.error(chalk_1.default.yellow('\n⚠️ This will DELETE ALL jobs from the database!'));
522
- console.error(chalk_1.default.gray('\nTo confirm, run: ') + chalk_1.default.cyan('kg jobs clear --confirm'));
629
+ console.error(chalk_1.default.gray('\nTo confirm, run: ') + chalk_1.default.cyan('kg job clear --confirm'));
630
+ console.error(chalk_1.default.gray('Or use: ') + chalk_1.default.cyan('kg job cleanup --all --confirm'));
523
631
  process.exit(1);
524
632
  }
525
633
  const client = (0, client_1.createClientFromEnv)();