@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.
- package/dist/src/cli.js +360 -5
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/api.d.ts +5 -1
- package/dist/src/commands/api.d.ts.map +1 -1
- package/dist/src/commands/api.js +153 -29
- package/dist/src/commands/api.js.map +1 -1
- package/dist/src/commands/chat.d.ts +9 -0
- package/dist/src/commands/chat.d.ts.map +1 -0
- package/dist/src/commands/chat.js +123 -0
- package/dist/src/commands/chat.js.map +1 -0
- package/dist/src/commands/completion.d.ts +2 -0
- package/dist/src/commands/completion.d.ts.map +1 -0
- package/dist/src/commands/completion.js +107 -0
- package/dist/src/commands/completion.js.map +1 -0
- package/dist/src/commands/conversations.d.ts +13 -0
- package/dist/src/commands/conversations.d.ts.map +1 -0
- package/dist/src/commands/conversations.js +90 -0
- package/dist/src/commands/conversations.js.map +1 -0
- package/dist/src/commands/costs.d.ts +7 -0
- package/dist/src/commands/costs.d.ts.map +1 -0
- package/dist/src/commands/costs.js +43 -0
- package/dist/src/commands/costs.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +2 -0
- package/dist/src/commands/doctor.d.ts.map +1 -0
- package/dist/src/commands/doctor.js +142 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/endpoints.d.ts +10 -0
- package/dist/src/commands/endpoints.d.ts.map +1 -0
- package/dist/src/commands/endpoints.js +129 -0
- package/dist/src/commands/endpoints.js.map +1 -0
- package/dist/src/commands/files.d.ts +11 -0
- package/dist/src/commands/files.d.ts.map +1 -0
- package/dist/src/commands/files.js +84 -0
- package/dist/src/commands/files.js.map +1 -0
- package/dist/src/commands/integrationKit.d.ts +6 -0
- package/dist/src/commands/integrationKit.d.ts.map +1 -0
- package/dist/src/commands/integrationKit.js +71 -0
- package/dist/src/commands/integrationKit.js.map +1 -0
- package/dist/src/commands/lifecycle.d.ts +24 -0
- package/dist/src/commands/lifecycle.d.ts.map +1 -0
- package/dist/src/commands/lifecycle.js +84 -0
- package/dist/src/commands/lifecycle.js.map +1 -0
- package/dist/src/commands/tokens.d.ts +17 -0
- package/dist/src/commands/tokens.d.ts.map +1 -0
- package/dist/src/commands/tokens.js +112 -0
- package/dist/src/commands/tokens.js.map +1 -0
- package/dist/src/commands/versions.d.ts +8 -0
- package/dist/src/commands/versions.d.ts.map +1 -0
- package/dist/src/commands/versions.js +61 -0
- package/dist/src/commands/versions.js.map +1 -0
- package/dist/src/commands/workspaces.d.ts +8 -0
- package/dist/src/commands/workspaces.d.ts.map +1 -1
- package/dist/src/commands/workspaces.js +44 -1
- package/dist/src/commands/workspaces.js.map +1 -1
- package/dist/src/config.d.ts +10 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +71 -2
- package/dist/src/config.js.map +1 -1
- package/package.json +2 -2
package/dist/src/commands/api.js
CHANGED
|
@@ -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,
|
|
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(
|
|
52
|
+
body = JSON.parse(raw);
|
|
23
53
|
}
|
|
24
54
|
catch {
|
|
25
|
-
printError('Invalid JSON in --data. Use
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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":"AAAA,+EAA+E;AAC/E,yDAAyD;AACzD,+EAA+E;AAC/E,EAAE;AACF,SAAS;AACT,2FAA2F;AAC3F,EAAE;AACF,YAAY;AACZ,iCAAiC;AACjC,4DAA4D;AAC5D,kDAAkD;AAClD,uDAAuD;AACvD,EAAE;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,
|
|
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":"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"}
|
|
@@ -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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"}
|