UNPKG

@agentled/cli

Version:

CLI for Agentled — manage workflows, apps, and knowledge from the command line. Zero context-window cost for AI agents.

330 lines 14 kB
import { readFileSync, writeFileSync } from 'node:fs'; import { AgentledClient } from '../client.js'; import { printOutput, printError } from '../utils/output.js'; export function registerKnowledgeCommands(program) { const knowledge = program .command('knowledge') .alias('kg') .description('Access workspace knowledge base and knowledge graph'); // --- Knowledge Data (DynamoDB lists & text) --- knowledge .command('lists') .description('List all knowledge lists in the workspace') .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const client = new AgentledClient(); const result = await client.listKnowledgeLists(); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('rows <listKey>') .description('Get rows from a knowledge list') .option('--limit <n>', 'Max rows to return', parseInt) .option('--status <status>', 'Filter rows by top-level status') .option('--next-token <token>', 'Pagination cursor from a previous response') .option('--format <fmt>', 'Output format', 'json') .action(async (listKey, opts) => { try { const client = new AgentledClient(); const result = await client.getKnowledgeRows(listKey, opts.limit, opts.status, opts.nextToken); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('rows-by-ids <rowIds...>') .description('Fetch specific knowledge rows by ID (max 200). Use after "kg graph edges" to resolve entity IDs.') .option('--format <fmt>', 'Output format', 'json') .action(async (rowIds, opts) => { try { const client = new AgentledClient(); const result = await client.getKnowledgeRowsByIds(rowIds); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('text <key>') .description('Get a knowledge text entry') .option('--format <fmt>', 'Output format', 'json') .action(async (key, opts) => { try { const client = new AgentledClient(); const result = await client.getKnowledgeText(key); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('create-list') .description('Create a knowledge list') .requiredOption('--key <key>', 'Knowledge list key') .requiredOption('--name <name>', 'Knowledge list name') .option('--fields <json>', 'JSON array of field definitions') .option('--list-category <value>', 'List category') .option('--sync-to-kg', 'Sync list rows to Knowledge Graph', false) .option('--entity-config <json>', 'Entity config JSON object') .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const result = await new AgentledClient().createKnowledgeList({ key: opts.key, name: opts.name, fields: opts.fields ? JSON.parse(opts.fields) : undefined, listCategory: opts.listCategory, syncToKg: opts.syncToKg, entityConfig: opts.entityConfig ? JSON.parse(opts.entityConfig) : undefined, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('update-list-schema') .description('Update a knowledge list schema') .requiredOption('--list-key <key>', 'Knowledge list key') .option('--name <name>', 'Updated name') .option('--add-fields <json>', 'JSON array of fields to add') .option('--remove-field-ids <ids...>', 'Field IDs to remove') .option('--sync-to-kg', 'Sync list rows to Knowledge Graph', false) .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const result = await new AgentledClient().updateKnowledgeListSchema({ listKey: opts.listKey, name: opts.name, addFields: opts.addFields ? JSON.parse(opts.addFields) : undefined, removeFieldIds: opts.removeFieldIds, syncToKg: opts.syncToKg, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('delete-list <listKey>') .description('Delete a knowledge list') .option('--format <fmt>', 'Output format', 'json') .action(async (listKey, opts) => { try { const result = await new AgentledClient().deleteKnowledgeList(listKey); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('upsert-rows') .description('Upsert rows into a knowledge list') .requiredOption('--list-key <key>', 'Knowledge list key') .requiredOption('--rows <json>', 'JSON array of row objects ({ rowData, id?, userKey? }) or { rows: [...] }') .option('--user-key <key>', 'Apply userKey to a single-row payload when row.userKey is omitted') .option('--merge-strategy <strategy>', 'overwrite | merge | append-arrays') .option('--status <status>', 'Row status') .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const parsed = JSON.parse(opts.rows); const rows = Array.isArray(parsed) ? parsed : parsed.rows; if (!Array.isArray(rows) || rows.length === 0) { throw new Error('Rows payload must be a non-empty JSON array or { rows: [...] }'); } if (opts.userKey && rows.length > 1) { throw new Error('When using --user-key, provide exactly one row. For multi-row payloads, set userKey per row.'); } const normalizedRows = rows.map((row, index) => ({ ...row, userKey: row.userKey ?? (opts.userKey && index === 0 ? opts.userKey : undefined), })); const result = await new AgentledClient().upsertKnowledgeRows({ listKey: opts.listKey, rows: normalizedRows, mergeStrategy: opts.mergeStrategy, status: opts.status, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('delete-rows') .description('Delete rows from a knowledge list') .requiredOption('--list-key <key>', 'Knowledge list key') .requiredOption('--row-ids <ids...>', 'One or more row IDs to delete') .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const result = await new AgentledClient().deleteKnowledgeRows({ listKey: opts.listKey, rowIds: opts.rowIds, confirm: true, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('upsert-text') .description('Create or update a knowledge text entry') .requiredOption('--key <key>', 'Knowledge text key') .requiredOption('--content <content>', 'Text content') .option('--title <title>', 'Optional title') .option('--tags <tags...>', 'Optional tags') .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const result = await new AgentledClient().upsertKnowledgeText({ key: opts.key, content: opts.content, title: opts.title, tags: opts.tags, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('delete-text <key>') .description('Delete a knowledge text entry') .option('--format <fmt>', 'Output format', 'json') .action(async (key, opts) => { try { const result = await new AgentledClient().deleteKnowledgeText(key); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('snapshot <listKey>') .description('Capture a full point-in-time backup of a knowledge list. Writes JSON to --out file or stdout.') .option('--out <file>', 'Write snapshot JSON to this file instead of stdout') .option('--format <fmt>', 'Output format (when writing to stdout)', 'json') .action(async (listKey, opts) => { try { const result = await new AgentledClient().snapshotKnowledgeList({ listKey }); if (opts.out) { writeFileSync(opts.out, JSON.stringify(result, null, 2)); console.log(`Snapshot written to ${opts.out} (${result.rowCount ?? '?'} rows)`); } else { printOutput(result, opts.format); } } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); knowledge .command('restore <listKey>') .description('Restore a knowledge list from a snapshot file. Never wipes computed fields.') .requiredOption('--from <file>', 'Path to snapshot JSON file (from "kg snapshot")') .option('--mode <mode>', '"merge-restore" (default) shallow-merges snapshot fields into existing rows; "append" inserts only missing rows', 'merge-restore') .option('--format <fmt>', 'Output format', 'json') .action(async (listKey, opts) => { try { let snapshotData; try { snapshotData = JSON.parse(readFileSync(opts.from, 'utf8')); } catch { throw new Error(`Could not read snapshot file: ${opts.from}`); } if (!['merge-restore', 'append'].includes(opts.mode)) { throw new Error('--mode must be "merge-restore" or "append"'); } const result = await new AgentledClient().restoreKnowledgeListSnapshot({ listKey, snapshotData, mode: opts.mode, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); // --- Knowledge Graph (Graphiti) --- const graph = knowledge .command('graph') .description('Query the Knowledge Graph (entities, edges, scoring)'); graph .command('edges') .description('Traverse Knowledge Graph edges by entity name and/or relationship type') .option('--entity <name>', 'Filter by entity name') .option('--relation <type>', 'Filter by relationship type (e.g. INVESTED_IN, CO_INVESTED_WITH, SCORED)') .option('--limit <n>', 'Max edges to return (default 100, max 500)', parseInt) .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const client = new AgentledClient(); const result = await client.traverseEdges({ entityName: opts.entity, relationshipType: opts.relation, limit: opts.limit, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); graph .command('scoring') .description('Fetch scoring history from the Knowledge Graph') .option('--entity <name>', 'Filter by entity name') .option('--limit <n>', 'Max records to return', parseInt) .option('--format <fmt>', 'Output format', 'json') .action(async (opts) => { try { const client = new AgentledClient(); const result = await client.getScoringHistory({ entityName: opts.entity, limit: opts.limit, }); printOutput(result, opts.format); } catch (error) { const message = error instanceof Error ? error.message : String(error); printError(message); } }); } //# sourceMappingURL=knowledge.js.map