@codata-io/cli 0.3.2 → 0.4.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 (59) hide show
  1. package/dist/src/cli.js +360 -5
  2. package/dist/src/cli.js.map +1 -1
  3. package/dist/src/commands/api.d.ts +5 -1
  4. package/dist/src/commands/api.d.ts.map +1 -1
  5. package/dist/src/commands/api.js +153 -29
  6. package/dist/src/commands/api.js.map +1 -1
  7. package/dist/src/commands/chat.d.ts +9 -0
  8. package/dist/src/commands/chat.d.ts.map +1 -0
  9. package/dist/src/commands/chat.js +123 -0
  10. package/dist/src/commands/chat.js.map +1 -0
  11. package/dist/src/commands/completion.d.ts +2 -0
  12. package/dist/src/commands/completion.d.ts.map +1 -0
  13. package/dist/src/commands/completion.js +107 -0
  14. package/dist/src/commands/completion.js.map +1 -0
  15. package/dist/src/commands/conversations.d.ts +13 -0
  16. package/dist/src/commands/conversations.d.ts.map +1 -0
  17. package/dist/src/commands/conversations.js +90 -0
  18. package/dist/src/commands/conversations.js.map +1 -0
  19. package/dist/src/commands/costs.d.ts +7 -0
  20. package/dist/src/commands/costs.d.ts.map +1 -0
  21. package/dist/src/commands/costs.js +43 -0
  22. package/dist/src/commands/costs.js.map +1 -0
  23. package/dist/src/commands/doctor.d.ts +2 -0
  24. package/dist/src/commands/doctor.d.ts.map +1 -0
  25. package/dist/src/commands/doctor.js +142 -0
  26. package/dist/src/commands/doctor.js.map +1 -0
  27. package/dist/src/commands/endpoints.d.ts +10 -0
  28. package/dist/src/commands/endpoints.d.ts.map +1 -0
  29. package/dist/src/commands/endpoints.js +129 -0
  30. package/dist/src/commands/endpoints.js.map +1 -0
  31. package/dist/src/commands/files.d.ts +11 -0
  32. package/dist/src/commands/files.d.ts.map +1 -0
  33. package/dist/src/commands/files.js +84 -0
  34. package/dist/src/commands/files.js.map +1 -0
  35. package/dist/src/commands/integrationKit.d.ts +6 -0
  36. package/dist/src/commands/integrationKit.d.ts.map +1 -0
  37. package/dist/src/commands/integrationKit.js +71 -0
  38. package/dist/src/commands/integrationKit.js.map +1 -0
  39. package/dist/src/commands/lifecycle.d.ts +24 -0
  40. package/dist/src/commands/lifecycle.d.ts.map +1 -0
  41. package/dist/src/commands/lifecycle.js +84 -0
  42. package/dist/src/commands/lifecycle.js.map +1 -0
  43. package/dist/src/commands/tokens.d.ts +17 -0
  44. package/dist/src/commands/tokens.d.ts.map +1 -0
  45. package/dist/src/commands/tokens.js +112 -0
  46. package/dist/src/commands/tokens.js.map +1 -0
  47. package/dist/src/commands/versions.d.ts +8 -0
  48. package/dist/src/commands/versions.d.ts.map +1 -0
  49. package/dist/src/commands/versions.js +61 -0
  50. package/dist/src/commands/versions.js.map +1 -0
  51. package/dist/src/commands/workspaces.d.ts +8 -0
  52. package/dist/src/commands/workspaces.d.ts.map +1 -1
  53. package/dist/src/commands/workspaces.js +44 -1
  54. package/dist/src/commands/workspaces.js.map +1 -1
  55. package/dist/src/config.d.ts +10 -0
  56. package/dist/src/config.d.ts.map +1 -1
  57. package/dist/src/config.js +71 -2
  58. package/dist/src/config.js.map +1 -1
  59. package/package.json +2 -2
@@ -3,26 +3,56 @@
3
3
  // ────────────────────────────────────────────────────────────────────────────
4
4
  //
5
5
  // Usage:
6
+ // codata api <workspace> # List available endpoints
7
+ // codata api <workspace> <METHOD> # List endpoints for that METHOD
6
8
  // codata api <workspace> <METHOD> <path> [--data '{}'] [--query key=val] [--key wsk_...]
7
9
  //
8
10
  // Examples:
11
+ // codata api my-api # Show all endpoints
12
+ // codata api my-api GET # Show all GET endpoints
9
13
  // codata api my-api GET /users
10
14
  // codata api my-api POST /users --data '{"name":"Alice"}'
11
15
  // codata api my-api GET /users --query limit=10
12
16
  // codata api my-api GET /users --key wsk_live_abc123
13
17
  //
18
+ import fs from 'fs';
14
19
  import { createCliClient } from '../config.js';
15
- import { methodColor, printJson, error as printError, info } from '../output.js';
20
+ import { methodColor, printJson, printTable, heading, info, warn, error as printError, } from '../output.js';
21
+ const SUPPORTED_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];
16
22
  export async function apiCommand(nameOrId, method, apiPath, options) {
23
+ // ── Listing mode: no method, or method given but no path ────────────────
24
+ if (!method || !apiPath) {
25
+ await listEndpoints(nameOrId, method, options);
26
+ return;
27
+ }
17
28
  method = method.toUpperCase();
18
- // Parse --data (JSON body)
29
+ // Parse --data (JSON body). Supports:
30
+ // --data '{"name":"Alice"}' inline JSON
31
+ // --data @path/to/body.json file reference
32
+ // --data - read from stdin
19
33
  let body = undefined;
20
- if (options.data) {
34
+ if (options.data !== undefined) {
35
+ let raw;
36
+ try {
37
+ if (options.data === '-') {
38
+ raw = fs.readFileSync(0, 'utf8');
39
+ }
40
+ else if (options.data.startsWith('@')) {
41
+ raw = fs.readFileSync(options.data.slice(1), 'utf8');
42
+ }
43
+ else {
44
+ raw = options.data;
45
+ }
46
+ }
47
+ catch (err) {
48
+ printError(`Failed to read --data: ${err.message ?? err}`);
49
+ process.exit(1);
50
+ }
21
51
  try {
22
- body = JSON.parse(options.data);
52
+ body = JSON.parse(raw);
23
53
  }
24
54
  catch {
25
- printError('Invalid JSON in --data. Use: --data \'{"key":"value"}\'');
55
+ printError('Invalid JSON in --data. Use inline JSON, @file.json, or - for stdin.');
26
56
  process.exit(1);
27
57
  }
28
58
  }
@@ -34,7 +64,28 @@ export async function apiCommand(nameOrId, method, apiPath, options) {
34
64
  queryParams[key] = rest.join('=');
35
65
  }
36
66
  }
37
- info(`${methodColor(method)} ${apiPath}`);
67
+ // Parse --header (key=value or key:value pairs)
68
+ const headers = {};
69
+ if (options.header) {
70
+ for (const h of options.header) {
71
+ const sep = h.indexOf('=') >= 0 ? '=' : h.indexOf(':') >= 0 ? ':' : null;
72
+ if (!sep) {
73
+ printError(`Invalid --header: "${h}". Use key=value or key:value.`);
74
+ process.exit(1);
75
+ }
76
+ const idx = h.indexOf(sep);
77
+ const k = h.slice(0, idx).trim();
78
+ const v = h.slice(idx + 1).trim();
79
+ if (!k) {
80
+ printError(`Invalid --header: "${h}". Empty key.`);
81
+ process.exit(1);
82
+ }
83
+ headers[k] = v;
84
+ }
85
+ }
86
+ if (!options.raw) {
87
+ info(`${methodColor(method)} ${apiPath}`);
88
+ }
38
89
  try {
39
90
  // Create client with optional explicit key
40
91
  const client = createCliClient({
@@ -43,33 +94,106 @@ export async function apiCommand(nameOrId, method, apiPath, options) {
43
94
  });
44
95
  // Find workspace
45
96
  const ws = await client.findWorkspace(nameOrId);
46
- // If no explicit key, try to get a client with stored key for this workspace
97
+ // If no explicit key, try to get a client with stored key for this workspace.
98
+ // Always route through the branch (default 'main') so we hit the modern
99
+ // Gater path (/v0/workspace/<id>/branch/<branch>/api/...).
100
+ const branch = options.branch ?? 'main';
101
+ const wsClient = options.key
102
+ ? client.workspace(ws.id, { branch })
103
+ : createCliClient({ workspaceId: ws.id }).workspace(ws.id, { branch });
104
+ if (!SUPPORTED_METHODS.includes(method)) {
105
+ printError(`Unsupported method: ${method}. Supported: ${SUPPORTED_METHODS.join(', ')}`);
106
+ process.exit(1);
107
+ }
108
+ // Route through the Gater via the generic request() — supports headers
109
+ // for all methods uniformly.
110
+ const result = await wsClient.request(method, apiPath, {
111
+ body,
112
+ query: Object.keys(queryParams).length ? queryParams : undefined,
113
+ headers: Object.keys(headers).length ? headers : undefined,
114
+ });
115
+ if (options.raw) {
116
+ // Print body as-is. For JSON, pretty-print; for everything else, raw text.
117
+ if (typeof result === 'string') {
118
+ process.stdout.write(result);
119
+ }
120
+ else if (result === null || result === undefined) {
121
+ // nothing to print
122
+ }
123
+ else {
124
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
125
+ }
126
+ }
127
+ else {
128
+ printJson(result);
129
+ }
130
+ }
131
+ catch (err) {
132
+ printError(err.message);
133
+ process.exit(1);
134
+ }
135
+ }
136
+ // ────────────────────────────────────────────────────────────────────────────
137
+ // Endpoint listing
138
+ // ────────────────────────────────────────────────────────────────────────────
139
+ async function listEndpoints(nameOrId, methodFilter, options) {
140
+ const filter = methodFilter?.toUpperCase();
141
+ if (filter && !SUPPORTED_METHODS.includes(filter)) {
142
+ printError(`Unsupported method: ${filter}. Supported: ${SUPPORTED_METHODS.join(', ')}`);
143
+ process.exit(1);
144
+ }
145
+ try {
146
+ const client = createCliClient({ apiKey: options.key });
147
+ const ws = await client.findWorkspace(nameOrId);
47
148
  const wsClient = options.key
48
149
  ? client.workspace(ws.id)
49
150
  : createCliClient({ workspaceId: ws.id }).workspace(ws.id);
50
- // Route through the Gater
51
- let result;
52
- switch (method) {
53
- case 'GET':
54
- result = await wsClient.get(apiPath, Object.keys(queryParams).length ? queryParams : undefined);
55
- break;
56
- case 'POST':
57
- result = await wsClient.post(apiPath, body);
58
- break;
59
- case 'PUT':
60
- result = await wsClient.put(apiPath, body);
61
- break;
62
- case 'PATCH':
63
- result = await wsClient.patch(apiPath, body);
64
- break;
65
- case 'DELETE':
66
- result = await wsClient.delete(apiPath);
67
- break;
68
- default:
69
- printError(`Unsupported method: ${method}`);
70
- process.exit(1);
151
+ const spec = await wsClient.getSpec();
152
+ const allEndpoints = spec?.endpoints ?? [];
153
+ if (allEndpoints.length === 0) {
154
+ warn(`No endpoints found for workspace "${ws.name ?? ws.id}". ` +
155
+ 'Has this workspace been generated yet?');
156
+ return;
157
+ }
158
+ const endpoints = filter
159
+ ? allEndpoints.filter((e) => e.method?.toUpperCase() === filter)
160
+ : allEndpoints;
161
+ if (endpoints.length === 0) {
162
+ warn(`No ${filter} endpoints found for workspace "${ws.name ?? ws.id}".`);
163
+ info(`Available methods: ${[
164
+ ...new Set(allEndpoints.map((e) => e.method?.toUpperCase()).filter(Boolean)),
165
+ ].join(', ')}`);
166
+ return;
167
+ }
168
+ if (options.json) {
169
+ printJson(endpoints.map((e) => ({
170
+ method: e.method?.toUpperCase(),
171
+ path: e.path,
172
+ operationId: e.operationId,
173
+ summary: e.summary,
174
+ description: e.description,
175
+ })));
176
+ return;
71
177
  }
72
- printJson(result);
178
+ heading(filter
179
+ ? `Available ${filter} endpoints for ${ws.name ?? ws.id}`
180
+ : `Available endpoints for ${ws.name ?? ws.id}`);
181
+ const rows = endpoints
182
+ .slice()
183
+ .sort((a, b) => {
184
+ const p = (a.path ?? '').localeCompare(b.path ?? '');
185
+ return p !== 0 ? p : (a.method ?? '').localeCompare(b.method ?? '');
186
+ })
187
+ .map((e) => [
188
+ methodColor((e.method ?? '').toUpperCase()),
189
+ e.path ?? '',
190
+ e.summary ?? e.description ?? e.operationId ?? '',
191
+ ]);
192
+ printTable(['METHOD', 'PATH', 'DESCRIPTION'], rows);
193
+ console.log('');
194
+ info('Run an endpoint:');
195
+ const example = endpoints[0];
196
+ info(` codata api ${nameOrId} ${(example.method ?? 'GET').toUpperCase()} ${example.path ?? '/'}`);
73
197
  }
74
198
  catch (err) {
75
199
  printError(err.message);
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/commands/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/commands/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function chatCommand(workspace: string, message: string, options: {
2
+ key?: string;
3
+ branch?: string;
4
+ mode?: 'agent' | 'ask';
5
+ conversation?: string;
6
+ timeout?: string;
7
+ json?: boolean;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/commands/chat.ts"],"names":[],"mappings":"AAiDA,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAsGf"}
@@ -0,0 +1,123 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Chat (drive the workspace conversation agent)
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // One-shot, blocking chat:
6
+ // codata chat <workspace> "Add an asset called Task with title and dueDate"
7
+ //
8
+ // Backend routes (combinedAuth → wsk_* keys accepted):
9
+ // POST /api/workspaces/:workspaceId/conversations
10
+ // POST /api/workspaces/:workspaceId/conversations/:conversationId/messages
11
+ // GET /api/workspaces/:workspaceId/conversations/:conversationId
12
+ //
13
+ // The backend processes messages asynchronously, so we poll the conversation
14
+ // every second until `pendingMessage.status` clears or we time out.
15
+ //
16
+ import { createCliClient } from '../config.js';
17
+ import { heading, info, warn, success, error as printError, printJson, } from '../output.js';
18
+ export async function chatCommand(workspace, message, options) {
19
+ const timeoutMs = (Number(options.timeout) || 120) * 1000;
20
+ const mode = options.mode ?? 'agent';
21
+ if (!['agent', 'ask'].includes(mode)) {
22
+ printError('--mode must be "agent" or "ask"');
23
+ process.exit(1);
24
+ }
25
+ try {
26
+ const client = createCliClient({ apiKey: options.key });
27
+ const ws = await client.findWorkspace(workspace);
28
+ const authedClient = options.key ? client : createCliClient({ workspaceId: ws.id });
29
+ let conversationId = options.conversation;
30
+ let trackingMessageId;
31
+ if (!conversationId) {
32
+ // Start a new conversation with the initial message.
33
+ const started = await authedClient.request('POST', `/api/workspaces/${ws.id}/conversations`, {
34
+ body: { agentType: 'human', mode, initialMessage: message },
35
+ query: options.branch ? { branch: options.branch } : undefined,
36
+ });
37
+ conversationId = started.conversationId;
38
+ trackingMessageId = started.messageId;
39
+ if (!options.json) {
40
+ info(`Conversation: ${conversationId}`);
41
+ }
42
+ }
43
+ else {
44
+ // Send a message into an existing conversation.
45
+ const sent = await authedClient.request('POST', `/api/workspaces/${ws.id}/conversations/${conversationId}/messages`, {
46
+ body: { agentType: 'human', mode, message },
47
+ query: options.branch ? { branch: options.branch } : undefined,
48
+ });
49
+ trackingMessageId = sent.messageId;
50
+ }
51
+ if (!options.json) {
52
+ heading(`> ${message}`);
53
+ info(`(waiting for reply, timeout ${Math.round(timeoutMs / 1000)}s)`);
54
+ }
55
+ // Poll for completion. Backend sets pendingMessage.status to 'processing'
56
+ // while the agent runs; when done it's cleared (or set to 'error').
57
+ const start = Date.now();
58
+ let lastSeenAssistantId;
59
+ while (Date.now() - start < timeoutMs) {
60
+ await sleep(1000);
61
+ const conv = await authedClient.request('GET', `/api/workspaces/${ws.id}/conversations/${conversationId}`);
62
+ const pending = conv.pendingMessage?.status;
63
+ if (pending === 'error') {
64
+ printError(`Agent error: ${conv.pendingMessage?.error ?? 'unknown'}`);
65
+ process.exit(1);
66
+ }
67
+ if (!pending || pending !== 'processing') {
68
+ // Done. Pick the most recent assistant message after our user msg.
69
+ const messages = conv.messages ?? [];
70
+ const reply = findAssistantReply(messages, trackingMessageId);
71
+ if (options.json) {
72
+ printJson({
73
+ conversationId,
74
+ messageId: trackingMessageId,
75
+ reply: reply ? extractText(reply) : null,
76
+ messages,
77
+ });
78
+ return;
79
+ }
80
+ if (!reply) {
81
+ warn('Agent finished but produced no assistant message.');
82
+ return;
83
+ }
84
+ console.log('');
85
+ success('Agent reply:');
86
+ const text = extractText(reply);
87
+ console.log(text ?? '(empty)');
88
+ info('');
89
+ info(`Continue: codata chat ${workspace} "<next msg>" --conversation ${conversationId}`);
90
+ return;
91
+ }
92
+ lastSeenAssistantId = pending;
93
+ }
94
+ warn(`Timed out after ${Math.round(timeoutMs / 1000)}s. Conversation ID: ${conversationId}`);
95
+ void lastSeenAssistantId;
96
+ process.exit(2);
97
+ }
98
+ catch (err) {
99
+ printError(err.message ?? String(err));
100
+ process.exit(1);
101
+ }
102
+ }
103
+ function findAssistantReply(messages, afterMessageId) {
104
+ // Walk from the end and return the latest non-user message whose
105
+ // createdAt is after the user message (best effort).
106
+ let userIndex = -1;
107
+ if (afterMessageId) {
108
+ userIndex = messages.findIndex((m) => m.messageId === afterMessageId);
109
+ }
110
+ for (let i = messages.length - 1; i > userIndex; i--) {
111
+ const m = messages[i];
112
+ if (m.role && m.role !== 'user')
113
+ return m;
114
+ }
115
+ return null;
116
+ }
117
+ function extractText(m) {
118
+ return m.text ?? m.content ?? m.message ?? null;
119
+ }
120
+ function sleep(ms) {
121
+ return new Promise((r) => setTimeout(r, ms));
122
+ }
123
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6DAA6D;AAC7D,+EAA+E;AAC/E,EAAE;AACF,2BAA2B;AAC3B,8EAA8E;AAC9E,EAAE;AACF,uDAAuD;AACvD,sDAAsD;AACtD,+EAA+E;AAC/E,sEAAsE;AACtE,EAAE;AACF,6EAA6E;AAC7E,oEAAoE;AACpE,EAAE;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,IAAI,UAAU,EACnB,SAAS,GACV,MAAM,cAAc,CAAC;AAyBtB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,OAAe,EACf,OAOC;IAED,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;IACrC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,UAAU,CAAC,iCAAiC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEpF,IAAI,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,IAAI,iBAAqC,CAAC;QAE1C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,qDAAqD;YACrD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CACxC,MAAM,EACN,mBAAmB,EAAE,CAAC,EAAE,gBAAgB,EACxC;gBACE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE;gBAC3D,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aAC/D,CACF,CAAC;YACF,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YACxC,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,iBAAiB,cAAc,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CACrC,MAAM,EACN,mBAAmB,EAAE,CAAC,EAAE,kBAAkB,cAAc,WAAW,EACnE;gBACE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;gBAC3C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aAC/D,CACF,CAAC;YACF,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YACxB,IAAI,CAAC,+BAA+B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;QAED,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,mBAAuC,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CACrC,KAAK,EACL,mBAAmB,EAAE,CAAC,EAAE,kBAAkB,cAAc,EAAE,CAC3D,CAAC;YAEF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC;YAC5C,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,UAAU,CAAC,gBAAgB,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;gBACzC,mEAAmE;gBACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;gBAE9D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,SAAS,CAAC;wBACR,cAAc;wBACd,SAAS,EAAE,iBAAiB;wBAC5B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;wBACxC,QAAQ;qBACT,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,IAAI,CAAC,mDAAmD,CAAC,CAAC;oBAC1D,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,cAAc,CAAC,CAAC;gBACxB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;gBAC/B,IAAI,CAAC,EAAE,CAAC,CAAC;gBACT,IAAI,CAAC,yBAAyB,SAAS,gCAAgC,cAAc,EAAE,CAAC,CAAC;gBACzF,OAAO;YACT,CAAC;YACD,mBAAmB,GAAG,OAAO,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,uBAAuB,cAAc,EAAE,CAAC,CAAC;QAC7F,KAAK,mBAAmB,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,QAA+B,EAC/B,cAAkC;IAElC,iEAAiE;IACjE,qDAAqD;IACrD,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC;IACxE,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,CAAsB;IACzC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function completionCommand(shell: string): void;
2
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/commands/completion.ts"],"names":[],"mappings":"AAiCA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAiBrD"}
@@ -0,0 +1,107 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Shell Completion
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // Emits a shell completion script for bash | zsh | fish. The user installs it
6
+ // by sourcing the output, e.g.:
7
+ //
8
+ // bash: source <(codata completion bash)
9
+ // zsh: source <(codata completion zsh)
10
+ // fish: codata completion fish | source
11
+ //
12
+ // Completion is purely static (top-level commands + common subcommands).
13
+ // We deliberately don't enumerate workspaces/keys at completion time — that
14
+ // would require a network call on every TAB press.
15
+ //
16
+ const TOP = [
17
+ 'login', 'logout', 'whoami', 'init',
18
+ 'workspaces', 'ws', 'show', 'create',
19
+ 'keys', 'api', 'branches', 'br',
20
+ 'scaffold', 'export', 'config',
21
+ 'doctor', 'tokens', 'integration-kit', 'endpoints', 'completion',
22
+ ];
23
+ const SUB = {
24
+ keys: ['create', 'list', 'ls', 'revoke', 'rotate', 'current', 'stored'],
25
+ branches: ['list', 'ls', 'create', 'show', 'delete', 'rm', 'merge'],
26
+ br: ['list', 'ls', 'create', 'show', 'delete', 'rm', 'merge'],
27
+ config: ['set', 'get'],
28
+ tokens: ['mint', 'list', 'ls', 'revoke'],
29
+ endpoints: ['list', 'ls', 'show'],
30
+ };
31
+ export function completionCommand(shell) {
32
+ switch (shell) {
33
+ case 'bash':
34
+ process.stdout.write(bashScript());
35
+ return;
36
+ case 'zsh':
37
+ process.stdout.write(zshScript());
38
+ return;
39
+ case 'fish':
40
+ process.stdout.write(fishScript());
41
+ return;
42
+ default:
43
+ process.stderr.write(`Unsupported shell: ${shell}. Use one of: bash, zsh, fish\n`);
44
+ process.exit(1);
45
+ }
46
+ }
47
+ function bashScript() {
48
+ const top = TOP.join(' ');
49
+ const subCases = Object.entries(SUB)
50
+ .map(([cmd, subs]) => ` ${cmd}) COMPREPLY=( $(compgen -W "${subs.join(' ')}" -- "$cur") ); return 0 ;;`)
51
+ .join('\n');
52
+ return `# codata bash completion
53
+ _codata_complete() {
54
+ local cur prev cmd
55
+ COMPREPLY=()
56
+ cur="\${COMP_WORDS[COMP_CWORD]}"
57
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
58
+ cmd="\${COMP_WORDS[1]}"
59
+
60
+ if [[ $COMP_CWORD -eq 1 ]]; then
61
+ COMPREPLY=( $(compgen -W "${top}" -- "$cur") )
62
+ return 0
63
+ fi
64
+
65
+ if [[ $COMP_CWORD -eq 2 ]]; then
66
+ case "$cmd" in
67
+ ${subCases}
68
+ esac
69
+ fi
70
+ }
71
+ complete -F _codata_complete codata
72
+ `;
73
+ }
74
+ function zshScript() {
75
+ const top = TOP.join(' ');
76
+ const subCases = Object.entries(SUB)
77
+ .map(([cmd, subs]) => ` ${cmd}) compadd ${subs.join(' ')} ;;`)
78
+ .join('\n');
79
+ return `# codata zsh completion
80
+ _codata() {
81
+ local context state line
82
+ if (( CURRENT == 2 )); then
83
+ compadd ${top}
84
+ return
85
+ fi
86
+ if (( CURRENT == 3 )); then
87
+ case "\${words[2]}" in
88
+ ${subCases}
89
+ esac
90
+ fi
91
+ }
92
+ compdef _codata codata
93
+ `;
94
+ }
95
+ function fishScript() {
96
+ const lines = ['# codata fish completion'];
97
+ for (const c of TOP) {
98
+ lines.push(`complete -c codata -n "__fish_use_subcommand" -a "${c}"`);
99
+ }
100
+ for (const [cmd, subs] of Object.entries(SUB)) {
101
+ for (const s of subs) {
102
+ lines.push(`complete -c codata -n "__fish_seen_subcommand_from ${cmd}" -a "${s}"`);
103
+ }
104
+ }
105
+ return lines.join('\n') + '\n';
106
+ }
107
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function conversationsListCommand(workspace: string, options: {
2
+ key?: string;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export declare function conversationsShowCommand(workspace: string, conversationId: string, options: {
6
+ key?: string;
7
+ json?: boolean;
8
+ }): Promise<void>;
9
+ export declare function conversationsDeleteCommand(workspace: string, conversationId: string, options: {
10
+ key?: string;
11
+ force?: boolean;
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../../src/commands/conversations.ts"],"names":[],"mappings":"AAyBA,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,90 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Conversations (list / show / delete)
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // codata conversations list <ws> # combinedAuth
6
+ // codata conversations show <ws> <id> # combinedAuth
7
+ // codata conversations delete <ws> <id> # combinedAuth
8
+ //
9
+ import { createCliClient } from '../config.js';
10
+ import { heading, info, success, error as printError, printJson } from '../output.js';
11
+ export async function conversationsListCommand(workspace, options) {
12
+ try {
13
+ const client = createCliClient({ apiKey: options.key });
14
+ const ws = await client.findWorkspace(workspace);
15
+ const c = options.key ? client : createCliClient({ workspaceId: ws.id });
16
+ const list = await c.request('GET', `/api/workspaces/${ws.id}/conversations`);
17
+ const items = Array.isArray(list) ? list : list?.conversations ?? [];
18
+ if (options.json) {
19
+ printJson(items);
20
+ return;
21
+ }
22
+ heading(`Conversations for ${ws.name ?? ws.id}`);
23
+ if (items.length === 0) {
24
+ info('(no conversations)');
25
+ return;
26
+ }
27
+ info(' ID AGENT MODE UPDATED MSGS');
28
+ for (const c of items) {
29
+ const id = (c._id ?? c.id ?? '?').toString().padEnd(28);
30
+ const agent = (c.agentType ?? '?').padEnd(8);
31
+ const mode = (c.mode ?? '?').padEnd(7);
32
+ const updated = (c.updatedAt ?? c.createdAt ?? '').padEnd(26);
33
+ const count = c.messageCount ?? c.messages?.length ?? '?';
34
+ console.log(` ${id} ${agent} ${mode} ${updated} ${count}`);
35
+ }
36
+ }
37
+ catch (err) {
38
+ printError(err.message ?? String(err));
39
+ process.exit(1);
40
+ }
41
+ }
42
+ export async function conversationsShowCommand(workspace, conversationId, options) {
43
+ try {
44
+ const client = createCliClient({ apiKey: options.key });
45
+ const ws = await client.findWorkspace(workspace);
46
+ const c = options.key ? client : createCliClient({ workspaceId: ws.id });
47
+ const conv = await c.request('GET', `/api/workspaces/${ws.id}/conversations/${conversationId}`);
48
+ if (options.json) {
49
+ printJson(conv);
50
+ return;
51
+ }
52
+ heading(`Conversation ${conv._id ?? conversationId}`);
53
+ info(`agent: ${conv.agentType ?? '?'} mode: ${conv.mode ?? '?'} status: ${conv.status ?? '?'}`);
54
+ const messages = conv.messages ?? [];
55
+ info(`${messages.length} message(s):`);
56
+ console.log('');
57
+ for (const m of messages) {
58
+ const role = m.role ?? '?';
59
+ const text = m.text ?? m.content ?? m.message ?? '';
60
+ console.log(` [${role}] ${truncate(text, 400)}`);
61
+ }
62
+ }
63
+ catch (err) {
64
+ printError(err.message ?? String(err));
65
+ process.exit(1);
66
+ }
67
+ }
68
+ export async function conversationsDeleteCommand(workspace, conversationId, options) {
69
+ if (!options.force) {
70
+ printError('Refusing to delete without --force.');
71
+ process.exit(1);
72
+ }
73
+ try {
74
+ const client = createCliClient({ apiKey: options.key });
75
+ const ws = await client.findWorkspace(workspace);
76
+ const c = options.key ? client : createCliClient({ workspaceId: ws.id });
77
+ await c.request('DELETE', `/api/workspaces/${ws.id}/conversations/${conversationId}`);
78
+ success(`Deleted conversation ${conversationId}`);
79
+ }
80
+ catch (err) {
81
+ printError(err.message ?? String(err));
82
+ process.exit(1);
83
+ }
84
+ }
85
+ function truncate(s, max) {
86
+ if (s.length <= max)
87
+ return s;
88
+ return s.slice(0, max - 1) + '…';
89
+ }
90
+ //# sourceMappingURL=conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../../src/commands/conversations.ts"],"names":[],"mappings":"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"}