@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.
- package/dist/api/client.d.ts +168 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +266 -0
- package/dist/api/client.js.map +1 -1
- package/dist/cli/batch.d.ts +8 -0
- package/dist/cli/batch.d.ts.map +1 -0
- package/dist/cli/batch.js +225 -0
- package/dist/cli/batch.js.map +1 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +8 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/concept.d.ts +9 -0
- package/dist/cli/concept.d.ts.map +1 -0
- package/dist/cli/concept.js +336 -0
- package/dist/cli/concept.js.map +1 -0
- package/dist/cli/edge.d.ts +9 -0
- package/dist/cli/edge.d.ts.map +1 -0
- package/dist/cli/edge.js +364 -0
- package/dist/cli/edge.js.map +1 -0
- package/dist/cli/jobs.js +111 -3
- package/dist/cli/jobs.js.map +1 -1
- package/dist/cli/ontology.d.ts.map +1 -1
- package/dist/cli/ontology.js +534 -1
- package/dist/cli/ontology.js.map +1 -1
- package/dist/cli/storage.d.ts +10 -0
- package/dist/cli/storage.d.ts.map +1 -0
- package/dist/cli/storage.js +260 -0
- package/dist/cli/storage.js.map +1 -0
- package/dist/cli/vocabulary/index.d.ts.map +1 -1
- package/dist/cli/vocabulary/index.js +1 -0
- package/dist/cli/vocabulary/index.js.map +1 -1
- package/dist/cli/vocabulary/similarity.d.ts +1 -0
- package/dist/cli/vocabulary/similarity.d.ts.map +1 -1
- package/dist/cli/vocabulary/similarity.js +60 -9
- package/dist/cli/vocabulary/similarity.js.map +1 -1
- package/dist/lib/interactive.d.ts +84 -0
- package/dist/lib/interactive.d.ts.map +1 -0
- package/dist/lib/interactive.js +296 -0
- package/dist/lib/interactive.js.map +1 -0
- package/dist/lib/validation.d.ts +106 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +354 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/mcp/formatters/concept.d.ts +24 -0
- package/dist/mcp/formatters/concept.d.ts.map +1 -0
- package/dist/mcp/formatters/concept.js +243 -0
- package/dist/mcp/formatters/concept.js.map +1 -0
- package/dist/mcp/formatters/document.d.ts +25 -0
- package/dist/mcp/formatters/document.d.ts.map +1 -0
- package/dist/mcp/formatters/document.js +178 -0
- package/dist/mcp/formatters/document.js.map +1 -0
- package/dist/mcp/formatters/epistemic.d.ts +16 -0
- package/dist/mcp/formatters/epistemic.d.ts.map +1 -0
- package/dist/mcp/formatters/epistemic.js +269 -0
- package/dist/mcp/formatters/epistemic.js.map +1 -0
- package/dist/mcp/formatters/graph.d.ts +63 -0
- package/dist/mcp/formatters/graph.d.ts.map +1 -0
- package/dist/mcp/formatters/graph.js +220 -0
- package/dist/mcp/formatters/graph.js.map +1 -0
- package/dist/mcp/formatters/index.d.ts +19 -0
- package/dist/mcp/formatters/index.d.ts.map +1 -0
- package/dist/mcp/formatters/index.js +73 -0
- package/dist/mcp/formatters/index.js.map +1 -0
- package/dist/mcp/formatters/ingest.d.ts +16 -0
- package/dist/mcp/formatters/ingest.d.ts.map +1 -0
- package/dist/mcp/formatters/ingest.js +169 -0
- package/dist/mcp/formatters/ingest.js.map +1 -0
- package/dist/mcp/formatters/job.d.ts +13 -0
- package/dist/mcp/formatters/job.d.ts.map +1 -0
- package/dist/mcp/formatters/job.js +204 -0
- package/dist/mcp/formatters/job.js.map +1 -0
- package/dist/mcp/formatters/ontology.d.ts +93 -0
- package/dist/mcp/formatters/ontology.d.ts.map +1 -0
- package/dist/mcp/formatters/ontology.js +328 -0
- package/dist/mcp/formatters/ontology.js.map +1 -0
- package/dist/mcp/formatters/source.d.ts +19 -0
- package/dist/mcp/formatters/source.d.ts.map +1 -0
- package/dist/mcp/formatters/source.js +182 -0
- package/dist/mcp/formatters/source.js.map +1 -0
- package/dist/mcp/formatters/system.d.ts +10 -0
- package/dist/mcp/formatters/system.d.ts.map +1 -0
- package/dist/mcp/formatters/system.js +152 -0
- package/dist/mcp/formatters/system.js.map +1 -0
- package/dist/mcp/formatters/utils.d.ts +17 -0
- package/dist/mcp/formatters/utils.d.ts.map +1 -0
- package/dist/mcp/formatters/utils.js +55 -0
- package/dist/mcp/formatters/utils.js.map +1 -0
- package/dist/mcp/graph-operations.d.ts +242 -0
- package/dist/mcp/graph-operations.d.ts.map +1 -0
- package/dist/mcp/graph-operations.js +532 -0
- package/dist/mcp/graph-operations.js.map +1 -0
- package/dist/mcp-server.js +625 -37
- package/dist/mcp-server.js.map +1 -1
- package/dist/types/index.d.ts +289 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/version.d.ts +3 -3
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/dist/mcp/formatters.d.ts +0 -100
- package/dist/mcp/formatters.d.ts.map +0 -1
- package/dist/mcp/formatters.js +0 -1411
- package/dist/mcp/formatters.js.map +0 -1
package/dist/cli/edge.js
ADDED
|
@@ -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
|
-
//
|
|
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
|
|
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
|
|
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)();
|