olakai-cli 0.1.1 → 0.1.2
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/index.js +574 -0
- package/dist/index.js.map +1 -1
- package/package.json +9 -11
package/dist/index.js
CHANGED
|
@@ -157,6 +157,253 @@ async function getCurrentUser() {
|
|
|
157
157
|
}
|
|
158
158
|
return await response.json();
|
|
159
159
|
}
|
|
160
|
+
async function listAgents(options) {
|
|
161
|
+
const token = getValidToken();
|
|
162
|
+
if (!token) {
|
|
163
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
164
|
+
}
|
|
165
|
+
const params = new URLSearchParams();
|
|
166
|
+
if (options?.includeKpis) {
|
|
167
|
+
params.set("includeKpis", "true");
|
|
168
|
+
}
|
|
169
|
+
const url = `${getBaseUrl()}/api/config/agents${params.toString() ? `?${params}` : ""}`;
|
|
170
|
+
const response = await fetch(url, {
|
|
171
|
+
headers: {
|
|
172
|
+
Authorization: `Bearer ${token}`
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
if (!response.ok) {
|
|
176
|
+
if (response.status === 401) {
|
|
177
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
178
|
+
}
|
|
179
|
+
const error = await response.json();
|
|
180
|
+
throw new Error(error.error || "Failed to list agents");
|
|
181
|
+
}
|
|
182
|
+
const data = await response.json();
|
|
183
|
+
return data.agents;
|
|
184
|
+
}
|
|
185
|
+
async function getAgent(id) {
|
|
186
|
+
const token = getValidToken();
|
|
187
|
+
if (!token) {
|
|
188
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
189
|
+
}
|
|
190
|
+
const response = await fetch(`${getBaseUrl()}/api/config/agents/${id}`, {
|
|
191
|
+
headers: {
|
|
192
|
+
Authorization: `Bearer ${token}`
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
if (response.status === 401) {
|
|
197
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
198
|
+
}
|
|
199
|
+
if (response.status === 404) {
|
|
200
|
+
throw new Error("Agent not found");
|
|
201
|
+
}
|
|
202
|
+
const error = await response.json();
|
|
203
|
+
throw new Error(error.error || "Failed to get agent");
|
|
204
|
+
}
|
|
205
|
+
return await response.json();
|
|
206
|
+
}
|
|
207
|
+
async function createAgent(payload) {
|
|
208
|
+
const token = getValidToken();
|
|
209
|
+
if (!token) {
|
|
210
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
211
|
+
}
|
|
212
|
+
const response = await fetch(`${getBaseUrl()}/api/config/agents`, {
|
|
213
|
+
method: "POST",
|
|
214
|
+
headers: {
|
|
215
|
+
Authorization: `Bearer ${token}`,
|
|
216
|
+
"Content-Type": "application/json"
|
|
217
|
+
},
|
|
218
|
+
body: JSON.stringify(payload)
|
|
219
|
+
});
|
|
220
|
+
if (!response.ok) {
|
|
221
|
+
if (response.status === 401) {
|
|
222
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
223
|
+
}
|
|
224
|
+
if (response.status === 409) {
|
|
225
|
+
throw new Error("An agent with this name already exists");
|
|
226
|
+
}
|
|
227
|
+
const error = await response.json();
|
|
228
|
+
throw new Error(error.error || "Failed to create agent");
|
|
229
|
+
}
|
|
230
|
+
return await response.json();
|
|
231
|
+
}
|
|
232
|
+
async function updateAgent(id, payload) {
|
|
233
|
+
const token = getValidToken();
|
|
234
|
+
if (!token) {
|
|
235
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
236
|
+
}
|
|
237
|
+
const response = await fetch(`${getBaseUrl()}/api/config/agents/${id}`, {
|
|
238
|
+
method: "PUT",
|
|
239
|
+
headers: {
|
|
240
|
+
Authorization: `Bearer ${token}`,
|
|
241
|
+
"Content-Type": "application/json"
|
|
242
|
+
},
|
|
243
|
+
body: JSON.stringify(payload)
|
|
244
|
+
});
|
|
245
|
+
if (!response.ok) {
|
|
246
|
+
if (response.status === 401) {
|
|
247
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
248
|
+
}
|
|
249
|
+
if (response.status === 404) {
|
|
250
|
+
throw new Error("Agent not found");
|
|
251
|
+
}
|
|
252
|
+
if (response.status === 409) {
|
|
253
|
+
throw new Error("An agent with this name already exists");
|
|
254
|
+
}
|
|
255
|
+
const error = await response.json();
|
|
256
|
+
throw new Error(error.error || "Failed to update agent");
|
|
257
|
+
}
|
|
258
|
+
return await response.json();
|
|
259
|
+
}
|
|
260
|
+
async function deleteAgent(id) {
|
|
261
|
+
const token = getValidToken();
|
|
262
|
+
if (!token) {
|
|
263
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
264
|
+
}
|
|
265
|
+
const response = await fetch(`${getBaseUrl()}/api/config/agents/${id}`, {
|
|
266
|
+
method: "DELETE",
|
|
267
|
+
headers: {
|
|
268
|
+
Authorization: `Bearer ${token}`
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
if (!response.ok) {
|
|
272
|
+
if (response.status === 401) {
|
|
273
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
274
|
+
}
|
|
275
|
+
if (response.status === 404) {
|
|
276
|
+
throw new Error("Agent not found");
|
|
277
|
+
}
|
|
278
|
+
const error = await response.json();
|
|
279
|
+
throw new Error(error.error || "Failed to delete agent");
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
async function listWorkflows(options) {
|
|
283
|
+
const token = getValidToken();
|
|
284
|
+
if (!token) {
|
|
285
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
286
|
+
}
|
|
287
|
+
const params = new URLSearchParams();
|
|
288
|
+
if (options?.includeAgents) {
|
|
289
|
+
params.set("includeAgents", "true");
|
|
290
|
+
}
|
|
291
|
+
if (options?.includeInactive) {
|
|
292
|
+
params.set("includeInactive", "true");
|
|
293
|
+
}
|
|
294
|
+
const url = `${getBaseUrl()}/api/config/workflows${params.toString() ? `?${params}` : ""}`;
|
|
295
|
+
const response = await fetch(url, {
|
|
296
|
+
headers: {
|
|
297
|
+
Authorization: `Bearer ${token}`
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
if (!response.ok) {
|
|
301
|
+
if (response.status === 401) {
|
|
302
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
303
|
+
}
|
|
304
|
+
const error = await response.json();
|
|
305
|
+
throw new Error(error.error || "Failed to list workflows");
|
|
306
|
+
}
|
|
307
|
+
const data = await response.json();
|
|
308
|
+
return data.workflows;
|
|
309
|
+
}
|
|
310
|
+
async function getWorkflow(id) {
|
|
311
|
+
const token = getValidToken();
|
|
312
|
+
if (!token) {
|
|
313
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
314
|
+
}
|
|
315
|
+
const response = await fetch(`${getBaseUrl()}/api/config/workflows/${id}`, {
|
|
316
|
+
headers: {
|
|
317
|
+
Authorization: `Bearer ${token}`
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
if (!response.ok) {
|
|
321
|
+
if (response.status === 401) {
|
|
322
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
323
|
+
}
|
|
324
|
+
if (response.status === 404) {
|
|
325
|
+
throw new Error("Workflow not found");
|
|
326
|
+
}
|
|
327
|
+
const error = await response.json();
|
|
328
|
+
throw new Error(error.error || "Failed to get workflow");
|
|
329
|
+
}
|
|
330
|
+
return await response.json();
|
|
331
|
+
}
|
|
332
|
+
async function createWorkflow(payload) {
|
|
333
|
+
const token = getValidToken();
|
|
334
|
+
if (!token) {
|
|
335
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
336
|
+
}
|
|
337
|
+
const response = await fetch(`${getBaseUrl()}/api/config/workflows`, {
|
|
338
|
+
method: "POST",
|
|
339
|
+
headers: {
|
|
340
|
+
Authorization: `Bearer ${token}`,
|
|
341
|
+
"Content-Type": "application/json"
|
|
342
|
+
},
|
|
343
|
+
body: JSON.stringify(payload)
|
|
344
|
+
});
|
|
345
|
+
if (!response.ok) {
|
|
346
|
+
if (response.status === 401) {
|
|
347
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
348
|
+
}
|
|
349
|
+
if (response.status === 409) {
|
|
350
|
+
throw new Error("A workflow with this name already exists");
|
|
351
|
+
}
|
|
352
|
+
const error = await response.json();
|
|
353
|
+
throw new Error(error.error || "Failed to create workflow");
|
|
354
|
+
}
|
|
355
|
+
return await response.json();
|
|
356
|
+
}
|
|
357
|
+
async function updateWorkflow(id, payload) {
|
|
358
|
+
const token = getValidToken();
|
|
359
|
+
if (!token) {
|
|
360
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
361
|
+
}
|
|
362
|
+
const response = await fetch(`${getBaseUrl()}/api/config/workflows/${id}`, {
|
|
363
|
+
method: "PUT",
|
|
364
|
+
headers: {
|
|
365
|
+
Authorization: `Bearer ${token}`,
|
|
366
|
+
"Content-Type": "application/json"
|
|
367
|
+
},
|
|
368
|
+
body: JSON.stringify(payload)
|
|
369
|
+
});
|
|
370
|
+
if (!response.ok) {
|
|
371
|
+
if (response.status === 401) {
|
|
372
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
373
|
+
}
|
|
374
|
+
if (response.status === 404) {
|
|
375
|
+
throw new Error("Workflow not found");
|
|
376
|
+
}
|
|
377
|
+
if (response.status === 409) {
|
|
378
|
+
throw new Error("A workflow with this name already exists");
|
|
379
|
+
}
|
|
380
|
+
const error = await response.json();
|
|
381
|
+
throw new Error(error.error || "Failed to update workflow");
|
|
382
|
+
}
|
|
383
|
+
return await response.json();
|
|
384
|
+
}
|
|
385
|
+
async function deleteWorkflow(id) {
|
|
386
|
+
const token = getValidToken();
|
|
387
|
+
if (!token) {
|
|
388
|
+
throw new Error("Not logged in. Run 'olakai login' first.");
|
|
389
|
+
}
|
|
390
|
+
const response = await fetch(`${getBaseUrl()}/api/config/workflows/${id}`, {
|
|
391
|
+
method: "DELETE",
|
|
392
|
+
headers: {
|
|
393
|
+
Authorization: `Bearer ${token}`
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
if (!response.ok) {
|
|
397
|
+
if (response.status === 401) {
|
|
398
|
+
throw new Error("Session expired. Run 'olakai login' to authenticate again.");
|
|
399
|
+
}
|
|
400
|
+
if (response.status === 404) {
|
|
401
|
+
throw new Error("Workflow not found");
|
|
402
|
+
}
|
|
403
|
+
const error = await response.json();
|
|
404
|
+
throw new Error(error.error || "Failed to delete workflow");
|
|
405
|
+
}
|
|
406
|
+
}
|
|
160
407
|
|
|
161
408
|
// src/commands/login.ts
|
|
162
409
|
var POLL_INTERVAL_MS = 5e3;
|
|
@@ -262,6 +509,331 @@ async function whoamiCommand() {
|
|
|
262
509
|
}
|
|
263
510
|
}
|
|
264
511
|
|
|
512
|
+
// src/commands/agents.ts
|
|
513
|
+
function formatAgentTable(agents) {
|
|
514
|
+
if (agents.length === 0) {
|
|
515
|
+
console.log("No agents found.");
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
const headers = ["ID", "NAME", "ROLE", "WORKFLOW", "API KEY"];
|
|
519
|
+
const rows = agents.map((agent) => [
|
|
520
|
+
agent.id.slice(0, 12) + "...",
|
|
521
|
+
agent.name.slice(0, 30),
|
|
522
|
+
agent.role,
|
|
523
|
+
agent.workflowId ? agent.workflowId.slice(0, 12) + "..." : "-",
|
|
524
|
+
agent.apiKey ? agent.apiKey.isActive ? "Active" : "Inactive" : "None"
|
|
525
|
+
]);
|
|
526
|
+
const widths = headers.map(
|
|
527
|
+
(h, i) => Math.max(h.length, ...rows.map((r) => r[i].length))
|
|
528
|
+
);
|
|
529
|
+
console.log(headers.map((h, i) => h.padEnd(widths[i])).join(" "));
|
|
530
|
+
console.log(widths.map((w) => "-".repeat(w)).join(" "));
|
|
531
|
+
for (const row of rows) {
|
|
532
|
+
console.log(row.map((cell, i) => cell.padEnd(widths[i])).join(" "));
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
function formatAgentDetail(agent) {
|
|
536
|
+
console.log(`ID: ${agent.id}`);
|
|
537
|
+
console.log(`Name: ${agent.name}`);
|
|
538
|
+
console.log(`Description: ${agent.description || "-"}`);
|
|
539
|
+
console.log(`Role: ${agent.role}`);
|
|
540
|
+
console.log(`Source: ${agent.source}`);
|
|
541
|
+
console.log(`Category: ${agent.category || "-"}`);
|
|
542
|
+
console.log(`Workflow ID: ${agent.workflowId || "-"}`);
|
|
543
|
+
if (agent.workflow) {
|
|
544
|
+
console.log(`Workflow: ${agent.workflow.name}`);
|
|
545
|
+
}
|
|
546
|
+
console.log("");
|
|
547
|
+
console.log("API Key:");
|
|
548
|
+
if (agent.apiKey) {
|
|
549
|
+
console.log(` ID: ${agent.apiKey.id}`);
|
|
550
|
+
if (agent.apiKey.key) {
|
|
551
|
+
console.log(` Key: ${agent.apiKey.key}`);
|
|
552
|
+
} else {
|
|
553
|
+
console.log(` Key: ${agent.apiKey.keyMasked}`);
|
|
554
|
+
}
|
|
555
|
+
console.log(` Status: ${agent.apiKey.isActive ? "Active" : "Inactive"}`);
|
|
556
|
+
} else {
|
|
557
|
+
console.log(" None");
|
|
558
|
+
}
|
|
559
|
+
if (agent.kpiDefinitions && agent.kpiDefinitions.length > 0) {
|
|
560
|
+
console.log("");
|
|
561
|
+
console.log("KPI Definitions:");
|
|
562
|
+
for (const kpi of agent.kpiDefinitions) {
|
|
563
|
+
console.log(` - ${kpi.name} (${kpi.type})`);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
async function listCommand(options) {
|
|
568
|
+
try {
|
|
569
|
+
const agents = await listAgents({ includeKpis: options.includeKpis });
|
|
570
|
+
if (options.json) {
|
|
571
|
+
console.log(JSON.stringify(agents, null, 2));
|
|
572
|
+
} else {
|
|
573
|
+
formatAgentTable(agents);
|
|
574
|
+
}
|
|
575
|
+
} catch (error) {
|
|
576
|
+
console.error(
|
|
577
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
578
|
+
);
|
|
579
|
+
process.exit(1);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
async function getCommand(id, options) {
|
|
583
|
+
try {
|
|
584
|
+
const agent = await getAgent(id);
|
|
585
|
+
if (options.json) {
|
|
586
|
+
console.log(JSON.stringify(agent, null, 2));
|
|
587
|
+
} else {
|
|
588
|
+
formatAgentDetail(agent);
|
|
589
|
+
}
|
|
590
|
+
} catch (error) {
|
|
591
|
+
console.error(
|
|
592
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
593
|
+
);
|
|
594
|
+
process.exit(1);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
async function createCommand(options) {
|
|
598
|
+
try {
|
|
599
|
+
if (!options.name) {
|
|
600
|
+
console.error("Error: --name is required");
|
|
601
|
+
process.exit(1);
|
|
602
|
+
}
|
|
603
|
+
const agent = await createAgent({
|
|
604
|
+
name: options.name,
|
|
605
|
+
description: options.description || "",
|
|
606
|
+
role: options.role || "WORKER",
|
|
607
|
+
workflowId: options.workflow,
|
|
608
|
+
createApiKey: options.withApiKey || false,
|
|
609
|
+
category: options.category
|
|
610
|
+
});
|
|
611
|
+
if (options.json) {
|
|
612
|
+
console.log(JSON.stringify(agent, null, 2));
|
|
613
|
+
} else {
|
|
614
|
+
console.log("Agent created successfully!");
|
|
615
|
+
console.log("");
|
|
616
|
+
formatAgentDetail(agent);
|
|
617
|
+
if (agent.apiKey?.key) {
|
|
618
|
+
console.log("");
|
|
619
|
+
console.log(
|
|
620
|
+
"IMPORTANT: Save your API key now. It will not be shown again."
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
} catch (error) {
|
|
625
|
+
console.error(
|
|
626
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
627
|
+
);
|
|
628
|
+
process.exit(1);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
async function updateCommand(id, options) {
|
|
632
|
+
try {
|
|
633
|
+
const payload = {};
|
|
634
|
+
if (options.name !== void 0) payload.name = options.name;
|
|
635
|
+
if (options.description !== void 0)
|
|
636
|
+
payload.description = options.description;
|
|
637
|
+
if (options.role !== void 0)
|
|
638
|
+
payload.role = options.role;
|
|
639
|
+
if (options.workflow !== void 0) payload.workflowId = options.workflow;
|
|
640
|
+
if (options.category !== void 0) payload.category = options.category;
|
|
641
|
+
if (Object.keys(payload).length === 0) {
|
|
642
|
+
console.error("Error: At least one field to update is required");
|
|
643
|
+
process.exit(1);
|
|
644
|
+
}
|
|
645
|
+
const agent = await updateAgent(id, payload);
|
|
646
|
+
if (options.json) {
|
|
647
|
+
console.log(JSON.stringify(agent, null, 2));
|
|
648
|
+
} else {
|
|
649
|
+
console.log("Agent updated successfully!");
|
|
650
|
+
console.log("");
|
|
651
|
+
formatAgentDetail(agent);
|
|
652
|
+
}
|
|
653
|
+
} catch (error) {
|
|
654
|
+
console.error(
|
|
655
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
656
|
+
);
|
|
657
|
+
process.exit(1);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
async function deleteCommand(id, options) {
|
|
661
|
+
try {
|
|
662
|
+
if (!options.force) {
|
|
663
|
+
console.log("Are you sure you want to delete this agent?");
|
|
664
|
+
console.log("Use --force to confirm deletion.");
|
|
665
|
+
process.exit(1);
|
|
666
|
+
}
|
|
667
|
+
await deleteAgent(id);
|
|
668
|
+
console.log("Agent deleted successfully.");
|
|
669
|
+
} catch (error) {
|
|
670
|
+
console.error(
|
|
671
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
672
|
+
);
|
|
673
|
+
process.exit(1);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
function registerAgentsCommand(program2) {
|
|
677
|
+
const agents = program2.command("agents").description("Manage agents");
|
|
678
|
+
agents.command("list").description("List all agents").option("--json", "Output as JSON").option("--include-kpis", "Include KPI definitions").action(listCommand);
|
|
679
|
+
agents.command("get <id>").description("Get agent details").option("--json", "Output as JSON").action(getCommand);
|
|
680
|
+
agents.command("create").description("Create a new agent").requiredOption("--name <name>", "Agent name").option("--description <description>", "Agent description").option("--role <role>", "Agent role (WORKER or COORDINATOR)", "WORKER").option("--workflow <id>", "Workflow ID to assign").option("--with-api-key", "Create an API key for this agent").option("--category <category>", "Agent category").option("--json", "Output as JSON").action(createCommand);
|
|
681
|
+
agents.command("update <id>").description("Update an agent").option("--name <name>", "Agent name").option("--description <description>", "Agent description").option("--role <role>", "Agent role (WORKER or COORDINATOR)").option("--workflow <id>", "Workflow ID to assign").option("--category <category>", "Agent category").option("--json", "Output as JSON").action(updateCommand);
|
|
682
|
+
agents.command("delete <id>").description("Delete an agent").option("--force", "Skip confirmation").action(deleteCommand);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// src/commands/workflows.ts
|
|
686
|
+
function formatWorkflowTable(workflows) {
|
|
687
|
+
if (workflows.length === 0) {
|
|
688
|
+
console.log("No workflows found.");
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
const headers = ["ID", "NAME", "AGENTS", "STATUS"];
|
|
692
|
+
const rows = workflows.map((wf) => [
|
|
693
|
+
wf.id.slice(0, 12) + "...",
|
|
694
|
+
wf.name.slice(0, 30),
|
|
695
|
+
wf.agentCount.toString(),
|
|
696
|
+
wf.isActive ? "Active" : "Inactive"
|
|
697
|
+
]);
|
|
698
|
+
const widths = headers.map(
|
|
699
|
+
(h, i) => Math.max(h.length, ...rows.map((r) => r[i].length))
|
|
700
|
+
);
|
|
701
|
+
console.log(headers.map((h, i) => h.padEnd(widths[i])).join(" "));
|
|
702
|
+
console.log(widths.map((w) => "-".repeat(w)).join(" "));
|
|
703
|
+
for (const row of rows) {
|
|
704
|
+
console.log(row.map((cell, i) => cell.padEnd(widths[i])).join(" "));
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
function formatWorkflowDetail(workflow) {
|
|
708
|
+
console.log(`ID: ${workflow.id}`);
|
|
709
|
+
console.log(`Name: ${workflow.name}`);
|
|
710
|
+
console.log(`Description: ${workflow.description || "-"}`);
|
|
711
|
+
console.log(`Status: ${workflow.isActive ? "Active" : "Inactive"}`);
|
|
712
|
+
console.log(`Agents: ${workflow.agentCount}`);
|
|
713
|
+
if (workflow.createdAt) {
|
|
714
|
+
console.log(`Created: ${new Date(workflow.createdAt).toISOString()}`);
|
|
715
|
+
}
|
|
716
|
+
if (workflow.updatedAt) {
|
|
717
|
+
console.log(`Updated: ${new Date(workflow.updatedAt).toISOString()}`);
|
|
718
|
+
}
|
|
719
|
+
if (workflow.agents && workflow.agents.length > 0) {
|
|
720
|
+
console.log("");
|
|
721
|
+
console.log("Agents:");
|
|
722
|
+
for (const agent of workflow.agents) {
|
|
723
|
+
const apiKeyStatus = agent.apiKey ? agent.apiKey.isActive ? "API Key: Active" : "API Key: Inactive" : "No API Key";
|
|
724
|
+
console.log(` - ${agent.name} (${agent.role}) - ${apiKeyStatus}`);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
async function listCommand2(options) {
|
|
729
|
+
try {
|
|
730
|
+
const workflows = await listWorkflows({
|
|
731
|
+
includeAgents: options.includeAgents,
|
|
732
|
+
includeInactive: options.includeInactive
|
|
733
|
+
});
|
|
734
|
+
if (options.json) {
|
|
735
|
+
console.log(JSON.stringify(workflows, null, 2));
|
|
736
|
+
} else {
|
|
737
|
+
formatWorkflowTable(workflows);
|
|
738
|
+
}
|
|
739
|
+
} catch (error) {
|
|
740
|
+
console.error(
|
|
741
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
742
|
+
);
|
|
743
|
+
process.exit(1);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
async function getCommand2(id, options) {
|
|
747
|
+
try {
|
|
748
|
+
const workflow = await getWorkflow(id);
|
|
749
|
+
if (options.json) {
|
|
750
|
+
console.log(JSON.stringify(workflow, null, 2));
|
|
751
|
+
} else {
|
|
752
|
+
formatWorkflowDetail(workflow);
|
|
753
|
+
}
|
|
754
|
+
} catch (error) {
|
|
755
|
+
console.error(
|
|
756
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
757
|
+
);
|
|
758
|
+
process.exit(1);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
async function createCommand2(options) {
|
|
762
|
+
try {
|
|
763
|
+
if (!options.name) {
|
|
764
|
+
console.error("Error: --name is required");
|
|
765
|
+
process.exit(1);
|
|
766
|
+
}
|
|
767
|
+
const workflow = await createWorkflow({
|
|
768
|
+
name: options.name,
|
|
769
|
+
description: options.description
|
|
770
|
+
});
|
|
771
|
+
if (options.json) {
|
|
772
|
+
console.log(JSON.stringify(workflow, null, 2));
|
|
773
|
+
} else {
|
|
774
|
+
console.log("Workflow created successfully!");
|
|
775
|
+
console.log("");
|
|
776
|
+
formatWorkflowDetail(workflow);
|
|
777
|
+
}
|
|
778
|
+
} catch (error) {
|
|
779
|
+
console.error(
|
|
780
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
781
|
+
);
|
|
782
|
+
process.exit(1);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
async function updateCommand2(id, options) {
|
|
786
|
+
try {
|
|
787
|
+
const payload = {};
|
|
788
|
+
if (options.name !== void 0) payload.name = options.name;
|
|
789
|
+
if (options.description !== void 0)
|
|
790
|
+
payload.description = options.description;
|
|
791
|
+
if (options.active) payload.isActive = true;
|
|
792
|
+
if (options.inactive) payload.isActive = false;
|
|
793
|
+
if (Object.keys(payload).length === 0) {
|
|
794
|
+
console.error("Error: At least one field to update is required");
|
|
795
|
+
process.exit(1);
|
|
796
|
+
}
|
|
797
|
+
const workflow = await updateWorkflow(id, payload);
|
|
798
|
+
if (options.json) {
|
|
799
|
+
console.log(JSON.stringify(workflow, null, 2));
|
|
800
|
+
} else {
|
|
801
|
+
console.log("Workflow updated successfully!");
|
|
802
|
+
console.log("");
|
|
803
|
+
formatWorkflowDetail(workflow);
|
|
804
|
+
}
|
|
805
|
+
} catch (error) {
|
|
806
|
+
console.error(
|
|
807
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
808
|
+
);
|
|
809
|
+
process.exit(1);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
async function deleteCommand2(id, options) {
|
|
813
|
+
try {
|
|
814
|
+
if (!options.force) {
|
|
815
|
+
console.log("Are you sure you want to delete this workflow?");
|
|
816
|
+
console.log("Use --force to confirm deletion.");
|
|
817
|
+
process.exit(1);
|
|
818
|
+
}
|
|
819
|
+
await deleteWorkflow(id);
|
|
820
|
+
console.log("Workflow deleted successfully.");
|
|
821
|
+
} catch (error) {
|
|
822
|
+
console.error(
|
|
823
|
+
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
824
|
+
);
|
|
825
|
+
process.exit(1);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
function registerWorkflowsCommand(program2) {
|
|
829
|
+
const workflows = program2.command("workflows").description("Manage workflows");
|
|
830
|
+
workflows.command("list").description("List all workflows").option("--json", "Output as JSON").option("--include-agents", "Include agent details").option("--include-inactive", "Include inactive workflows").action(listCommand2);
|
|
831
|
+
workflows.command("get <id>").description("Get workflow details").option("--json", "Output as JSON").action(getCommand2);
|
|
832
|
+
workflows.command("create").description("Create a new workflow").requiredOption("--name <name>", "Workflow name").option("--description <description>", "Workflow description").option("--json", "Output as JSON").action(createCommand2);
|
|
833
|
+
workflows.command("update <id>").description("Update a workflow").option("--name <name>", "Workflow name").option("--description <description>", "Workflow description").option("--active", "Set workflow as active").option("--inactive", "Set workflow as inactive").option("--json", "Output as JSON").action(updateCommand2);
|
|
834
|
+
workflows.command("delete <id>").description("Delete a workflow").option("--force", "Skip confirmation").action(deleteCommand2);
|
|
835
|
+
}
|
|
836
|
+
|
|
265
837
|
// src/index.ts
|
|
266
838
|
var program = new Command();
|
|
267
839
|
program.name("olakai").description("Olakai CLI tool").version("0.1.0").option(
|
|
@@ -283,5 +855,7 @@ program.name("olakai").description("Olakai CLI tool").version("0.1.0").option(
|
|
|
283
855
|
program.command("login").description("Log in to Olakai using browser authentication").action(loginCommand);
|
|
284
856
|
program.command("logout").description("Log out from Olakai").action(logoutCommand);
|
|
285
857
|
program.command("whoami").description("Show current logged-in user").action(whoamiCommand);
|
|
858
|
+
registerAgentsCommand(program);
|
|
859
|
+
registerWorkflowsCommand(program);
|
|
286
860
|
program.parse();
|
|
287
861
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/lib/config.ts","../src/lib/auth.ts","../src/lib/api.ts","../src/commands/logout.ts","../src/commands/whoami.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { whoamiCommand } from \"./commands/whoami.js\";\nimport {\n setEnvironment,\n isValidEnvironment,\n getValidEnvironments,\n type Environment,\n} from \"./lib/config.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"olakai\")\n .description(\"Olakai CLI tool\")\n .version(\"0.1.0\")\n .option(\n \"-e, --env <environment>\",\n `Environment to use (${getValidEnvironments().join(\", \")})`,\n \"production\",\n )\n .hook(\"preAction\", (thisCommand) => {\n const options = thisCommand.opts();\n if (options.env) {\n if (!isValidEnvironment(options.env)) {\n console.error(\n `Invalid environment: ${options.env}. Valid options: ${getValidEnvironments().join(\", \")}`,\n );\n process.exit(1);\n }\n setEnvironment(options.env as Environment);\n }\n });\n\nprogram\n .command(\"login\")\n .description(\"Log in to Olakai using browser authentication\")\n .action(loginCommand);\n\nprogram\n .command(\"logout\")\n .description(\"Log out from Olakai\")\n .action(logoutCommand);\n\nprogram\n .command(\"whoami\")\n .description(\"Show current logged-in user\")\n .action(whoamiCommand);\n\nprogram.parse();\n","import open from \"open\";\nimport { requestDeviceCode, pollForToken, getCurrentUser } from \"../lib/api.js\";\nimport { saveToken, isTokenValid } from \"../lib/auth.js\";\nimport { getEnvironment } from \"../lib/config.js\";\n\nconst POLL_INTERVAL_MS = 5000; // 5 seconds\n\n/**\n * Login command handler\n */\nexport async function loginCommand(): Promise<void> {\n // Check if already logged in\n if (isTokenValid()) {\n try {\n const user = await getCurrentUser();\n console.log(`Already logged in as ${user.email}`);\n console.log(\"Run 'olakai logout' to log out first.\");\n return;\n } catch {\n // Token is invalid, continue with login\n }\n }\n\n console.log(`Logging in to Olakai (${getEnvironment()})...\\n`);\n\n try {\n // Request device code\n const deviceCode = await requestDeviceCode();\n\n // Display instructions\n console.log(\"To complete login, visit:\");\n console.log(`\\n ${deviceCode.verification_uri_complete}\\n`);\n console.log(`Or go to ${deviceCode.verification_uri} and enter code:`);\n console.log(`\\n ${deviceCode.user_code}\\n`);\n\n // Try to open browser\n console.log(\"Opening browser...\");\n try {\n await open(deviceCode.verification_uri_complete);\n } catch {\n console.log(\"(Could not open browser automatically)\");\n }\n\n console.log(\"\\nWaiting for authorization...\");\n\n // Poll for token\n const expiresAt = Date.now() + deviceCode.expires_in * 1000;\n\n while (Date.now() < expiresAt) {\n await sleep(POLL_INTERVAL_MS);\n\n try {\n const tokenResponse = await pollForToken(deviceCode.device_code);\n\n if (tokenResponse) {\n // Save token\n saveToken(tokenResponse.access_token, tokenResponse.expires_in);\n\n // Get user info\n const user = await getCurrentUser();\n\n console.log(`\\nLogged in as ${user.email}`);\n console.log(`Account: ${user.accountId}`);\n console.log(`Role: ${user.role}`);\n return;\n }\n\n // Still pending, show spinner\n process.stdout.write(\".\");\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\nLogin failed: ${error.message}`);\n } else {\n console.error(\"\\nLogin failed: Unknown error\");\n }\n process.exit(1);\n }\n }\n\n console.error(\"\\nLogin timed out. Please try again.\");\n process.exit(1);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Login failed: ${error.message}`);\n } else {\n console.error(\"Login failed: Unknown error\");\n }\n process.exit(1);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export type Environment = \"production\" | \"staging\" | \"local\";\n\nconst HOSTS: Record<Environment, string> = {\n production: \"https://app.olakai.ai\",\n staging: \"https://staging.app.olakai.ai\",\n local: \"http://localhost:3000\",\n};\n\n// CLI client identifier\nexport const CLIENT_ID = \"olakai-cli\";\n\nlet currentEnvironment: Environment = \"production\";\n\n/**\n * Set the current environment\n */\nexport function setEnvironment(env: Environment): void {\n currentEnvironment = env;\n}\n\n/**\n * Get the current environment from:\n * 1. Environment variable OLAKAI_ENV\n * 2. Programmatically set value\n * 3. Default to \"production\"\n */\nexport function getEnvironment(): Environment {\n const envVar = process.env.OLAKAI_ENV as Environment | undefined;\n if (envVar && isValidEnvironment(envVar)) {\n return envVar;\n }\n return currentEnvironment;\n}\n\n/**\n * Get the API base URL for the current environment\n */\nexport function getBaseUrl(): string {\n return HOSTS[getEnvironment()];\n}\n\n/**\n * Check if a string is a valid environment\n */\nexport function isValidEnvironment(env: string): env is Environment {\n return env === \"production\" || env === \"staging\" || env === \"local\";\n}\n\n/**\n * Get list of valid environments for CLI help\n */\nexport function getValidEnvironments(): Environment[] {\n return [\"production\", \"staging\", \"local\"];\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { type Environment, getEnvironment } from \"./config.js\";\n\ninterface StoredCredentials {\n token: string;\n expiresAt: number; // Unix timestamp in seconds\n environment: Environment;\n}\n\n/**\n * Get the credentials file path\n */\nfunction getCredentialsPath(): string {\n const configDir = path.join(os.homedir(), \".config\", \"olakai\");\n return path.join(configDir, \"credentials.json\");\n}\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n const configDir = path.dirname(getCredentialsPath());\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Save an access token to disk\n */\nexport function saveToken(token: string, expiresIn: number): void {\n ensureConfigDir();\n\n const credentials: StoredCredentials = {\n token,\n expiresAt: Math.floor(Date.now() / 1000) + expiresIn,\n environment: getEnvironment(),\n };\n\n const credentialsPath = getCredentialsPath();\n fs.writeFileSync(credentialsPath, JSON.stringify(credentials, null, 2), {\n mode: 0o600, // Read/write for owner only\n });\n}\n\n/**\n * Load the stored token\n */\nexport function loadToken(): StoredCredentials | null {\n const credentialsPath = getCredentialsPath();\n\n if (!fs.existsSync(credentialsPath)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(credentialsPath, \"utf-8\");\n const credentials = JSON.parse(content) as StoredCredentials;\n return credentials;\n } catch {\n return null;\n }\n}\n\n/**\n * Clear stored credentials\n */\nexport function clearToken(): void {\n const credentialsPath = getCredentialsPath();\n\n if (fs.existsSync(credentialsPath)) {\n fs.unlinkSync(credentialsPath);\n }\n}\n\n/**\n * Check if the stored token is valid (exists and not expired)\n */\nexport function isTokenValid(): boolean {\n const credentials = loadToken();\n\n if (!credentials) {\n return false;\n }\n\n // Check if expired (with 60 second buffer)\n const now = Math.floor(Date.now() / 1000);\n if (credentials.expiresAt <= now + 60) {\n return false;\n }\n\n // Check if environment matches\n if (credentials.environment !== getEnvironment()) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Get the current valid token or null\n */\nexport function getValidToken(): string | null {\n if (!isTokenValid()) {\n return null;\n }\n\n const credentials = loadToken();\n return credentials?.token ?? null;\n}\n","import { getBaseUrl, CLIENT_ID } from \"./config.js\";\nimport { getValidToken } from \"./auth.js\";\n\nexport interface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n}\n\nexport interface TokenErrorResponse {\n error: \"authorization_pending\" | \"expired_token\" | \"access_denied\";\n error_description?: string;\n}\n\nexport interface UserMeResponse {\n id: string;\n email: string;\n firstName: string;\n lastName: string;\n role: string;\n accountId: string;\n}\n\n/**\n * Request a device code to start the login flow\n */\nexport async function requestDeviceCode(): Promise<DeviceCodeResponse> {\n const response = await fetch(`${getBaseUrl()}/api/auth/device/code`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ client_id: CLIENT_ID }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as { error_description?: string; error?: string };\n throw new Error(error.error_description || error.error || \"Failed to request device code\");\n }\n\n return (await response.json()) as DeviceCodeResponse;\n}\n\n/**\n * Poll for token exchange\n * Returns the token response if approved, or throws an error\n */\nexport async function pollForToken(\n deviceCode: string,\n): Promise<TokenResponse | null> {\n const response = await fetch(`${getBaseUrl()}/api/auth/device/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n client_id: CLIENT_ID,\n }),\n });\n\n const data = (await response.json()) as TokenResponse | TokenErrorResponse;\n\n if (!response.ok) {\n if (\"error\" in data && data.error === \"authorization_pending\") {\n return null; // Still waiting for user\n }\n const errorMsg = \"error_description\" in data ? data.error_description : (\"error\" in data ? data.error : \"Token exchange failed\");\n throw new Error(errorMsg || \"Token exchange failed\");\n }\n\n return data as TokenResponse;\n}\n\n/**\n * Get current user info\n */\nexport async function getCurrentUser(): Promise<UserMeResponse> {\n const token = getValidToken();\n\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/user/me`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n throw new Error(\"Failed to get user info\");\n }\n\n return (await response.json()) as UserMeResponse;\n}\n","import { clearToken, isTokenValid } from \"../lib/auth.js\";\n\n/**\n * Logout command handler\n */\nexport function logoutCommand(): void {\n if (!isTokenValid()) {\n console.log(\"Not currently logged in.\");\n return;\n }\n\n clearToken();\n console.log(\"Logged out successfully.\");\n}\n","import { getCurrentUser } from \"../lib/api.js\";\nimport { isTokenValid } from \"../lib/auth.js\";\nimport { getEnvironment } from \"../lib/config.js\";\n\n/**\n * Whoami command handler\n */\nexport async function whoamiCommand(): Promise<void> {\n if (!isTokenValid()) {\n console.log(\"Not logged in. Run 'olakai login' to authenticate.\");\n process.exit(1);\n }\n\n try {\n const user = await getCurrentUser();\n\n console.log(`Email: ${user.email}`);\n console.log(`Name: ${user.firstName} ${user.lastName}`);\n console.log(`Role: ${user.role}`);\n console.log(`Account ID: ${user.accountId}`);\n console.log(`Environment: ${getEnvironment()}`);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n } else {\n console.error(\"Failed to get user info\");\n }\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/lib/config.ts","../src/lib/auth.ts","../src/lib/api.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/agents.ts","../src/commands/workflows.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { whoamiCommand } from \"./commands/whoami.js\";\nimport { registerAgentsCommand } from \"./commands/agents.js\";\nimport { registerWorkflowsCommand } from \"./commands/workflows.js\";\nimport {\n setEnvironment,\n isValidEnvironment,\n getValidEnvironments,\n type Environment,\n} from \"./lib/config.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"olakai\")\n .description(\"Olakai CLI tool\")\n .version(\"0.1.0\")\n .option(\n \"-e, --env <environment>\",\n `Environment to use (${getValidEnvironments().join(\", \")})`,\n \"production\",\n )\n .hook(\"preAction\", (thisCommand) => {\n const options = thisCommand.opts();\n if (options.env) {\n if (!isValidEnvironment(options.env)) {\n console.error(\n `Invalid environment: ${options.env}. Valid options: ${getValidEnvironments().join(\", \")}`,\n );\n process.exit(1);\n }\n setEnvironment(options.env as Environment);\n }\n });\n\nprogram\n .command(\"login\")\n .description(\"Log in to Olakai using browser authentication\")\n .action(loginCommand);\n\nprogram\n .command(\"logout\")\n .description(\"Log out from Olakai\")\n .action(logoutCommand);\n\nprogram\n .command(\"whoami\")\n .description(\"Show current logged-in user\")\n .action(whoamiCommand);\n\n// Register subcommands for config management\nregisterAgentsCommand(program);\nregisterWorkflowsCommand(program);\n\nprogram.parse();\n","import open from \"open\";\nimport { requestDeviceCode, pollForToken, getCurrentUser } from \"../lib/api.js\";\nimport { saveToken, isTokenValid } from \"../lib/auth.js\";\nimport { getEnvironment } from \"../lib/config.js\";\n\nconst POLL_INTERVAL_MS = 5000; // 5 seconds\n\n/**\n * Login command handler\n */\nexport async function loginCommand(): Promise<void> {\n // Check if already logged in\n if (isTokenValid()) {\n try {\n const user = await getCurrentUser();\n console.log(`Already logged in as ${user.email}`);\n console.log(\"Run 'olakai logout' to log out first.\");\n return;\n } catch {\n // Token is invalid, continue with login\n }\n }\n\n console.log(`Logging in to Olakai (${getEnvironment()})...\\n`);\n\n try {\n // Request device code\n const deviceCode = await requestDeviceCode();\n\n // Display instructions\n console.log(\"To complete login, visit:\");\n console.log(`\\n ${deviceCode.verification_uri_complete}\\n`);\n console.log(`Or go to ${deviceCode.verification_uri} and enter code:`);\n console.log(`\\n ${deviceCode.user_code}\\n`);\n\n // Try to open browser\n console.log(\"Opening browser...\");\n try {\n await open(deviceCode.verification_uri_complete);\n } catch {\n console.log(\"(Could not open browser automatically)\");\n }\n\n console.log(\"\\nWaiting for authorization...\");\n\n // Poll for token\n const expiresAt = Date.now() + deviceCode.expires_in * 1000;\n\n while (Date.now() < expiresAt) {\n await sleep(POLL_INTERVAL_MS);\n\n try {\n const tokenResponse = await pollForToken(deviceCode.device_code);\n\n if (tokenResponse) {\n // Save token\n saveToken(tokenResponse.access_token, tokenResponse.expires_in);\n\n // Get user info\n const user = await getCurrentUser();\n\n console.log(`\\nLogged in as ${user.email}`);\n console.log(`Account: ${user.accountId}`);\n console.log(`Role: ${user.role}`);\n return;\n }\n\n // Still pending, show spinner\n process.stdout.write(\".\");\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\nLogin failed: ${error.message}`);\n } else {\n console.error(\"\\nLogin failed: Unknown error\");\n }\n process.exit(1);\n }\n }\n\n console.error(\"\\nLogin timed out. Please try again.\");\n process.exit(1);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Login failed: ${error.message}`);\n } else {\n console.error(\"Login failed: Unknown error\");\n }\n process.exit(1);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export type Environment = \"production\" | \"staging\" | \"local\";\n\nconst HOSTS: Record<Environment, string> = {\n production: \"https://app.olakai.ai\",\n staging: \"https://staging.app.olakai.ai\",\n local: \"http://localhost:3000\",\n};\n\n// CLI client identifier\nexport const CLIENT_ID = \"olakai-cli\";\n\nlet currentEnvironment: Environment = \"production\";\n\n/**\n * Set the current environment\n */\nexport function setEnvironment(env: Environment): void {\n currentEnvironment = env;\n}\n\n/**\n * Get the current environment from:\n * 1. Environment variable OLAKAI_ENV\n * 2. Programmatically set value\n * 3. Default to \"production\"\n */\nexport function getEnvironment(): Environment {\n const envVar = process.env.OLAKAI_ENV as Environment | undefined;\n if (envVar && isValidEnvironment(envVar)) {\n return envVar;\n }\n return currentEnvironment;\n}\n\n/**\n * Get the API base URL for the current environment\n */\nexport function getBaseUrl(): string {\n return HOSTS[getEnvironment()];\n}\n\n/**\n * Check if a string is a valid environment\n */\nexport function isValidEnvironment(env: string): env is Environment {\n return env === \"production\" || env === \"staging\" || env === \"local\";\n}\n\n/**\n * Get list of valid environments for CLI help\n */\nexport function getValidEnvironments(): Environment[] {\n return [\"production\", \"staging\", \"local\"];\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { type Environment, getEnvironment } from \"./config.js\";\n\ninterface StoredCredentials {\n token: string;\n expiresAt: number; // Unix timestamp in seconds\n environment: Environment;\n}\n\n/**\n * Get the credentials file path\n */\nfunction getCredentialsPath(): string {\n const configDir = path.join(os.homedir(), \".config\", \"olakai\");\n return path.join(configDir, \"credentials.json\");\n}\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n const configDir = path.dirname(getCredentialsPath());\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Save an access token to disk\n */\nexport function saveToken(token: string, expiresIn: number): void {\n ensureConfigDir();\n\n const credentials: StoredCredentials = {\n token,\n expiresAt: Math.floor(Date.now() / 1000) + expiresIn,\n environment: getEnvironment(),\n };\n\n const credentialsPath = getCredentialsPath();\n fs.writeFileSync(credentialsPath, JSON.stringify(credentials, null, 2), {\n mode: 0o600, // Read/write for owner only\n });\n}\n\n/**\n * Load the stored token\n */\nexport function loadToken(): StoredCredentials | null {\n const credentialsPath = getCredentialsPath();\n\n if (!fs.existsSync(credentialsPath)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(credentialsPath, \"utf-8\");\n const credentials = JSON.parse(content) as StoredCredentials;\n return credentials;\n } catch {\n return null;\n }\n}\n\n/**\n * Clear stored credentials\n */\nexport function clearToken(): void {\n const credentialsPath = getCredentialsPath();\n\n if (fs.existsSync(credentialsPath)) {\n fs.unlinkSync(credentialsPath);\n }\n}\n\n/**\n * Check if the stored token is valid (exists and not expired)\n */\nexport function isTokenValid(): boolean {\n const credentials = loadToken();\n\n if (!credentials) {\n return false;\n }\n\n // Check if expired (with 60 second buffer)\n const now = Math.floor(Date.now() / 1000);\n if (credentials.expiresAt <= now + 60) {\n return false;\n }\n\n // Check if environment matches\n if (credentials.environment !== getEnvironment()) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Get the current valid token or null\n */\nexport function getValidToken(): string | null {\n if (!isTokenValid()) {\n return null;\n }\n\n const credentials = loadToken();\n return credentials?.token ?? null;\n}\n","import { getBaseUrl, CLIENT_ID } from \"./config.js\";\nimport { getValidToken } from \"./auth.js\";\n\nexport interface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n}\n\nexport interface TokenErrorResponse {\n error: \"authorization_pending\" | \"expired_token\" | \"access_denied\";\n error_description?: string;\n}\n\nexport interface UserMeResponse {\n id: string;\n email: string;\n firstName: string;\n lastName: string;\n role: string;\n accountId: string;\n}\n\n// Config API Types\nexport interface AgentApiKey {\n id: string;\n key?: string; // Only present on creation\n keyMasked: string;\n isActive: boolean;\n createdAt?: string;\n}\n\nexport interface KpiDefinition {\n id: string;\n name: string;\n description: string | null;\n type: \"PREDEFINED\" | \"USER_DEFINED\";\n category: string | null;\n agentId: string | null;\n calculatorId: string;\n calculatorParams: Record<string, unknown> | null;\n unit: string | null;\n isActive: boolean;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface Agent {\n id: string;\n name: string;\n description: string;\n role: \"WORKER\" | \"COORDINATOR\";\n source: \"SDK\" | \"AUTOMATION_PROVIDER\";\n workflowId: string | null;\n category: string | null;\n apiKey: AgentApiKey | null;\n kpiDefinitions?: KpiDefinition[];\n workflow?: Workflow | null;\n}\n\nexport interface Workflow {\n id: string;\n name: string;\n description: string | null;\n isActive: boolean;\n agentCount: number;\n agents?: Agent[];\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface CreateAgentPayload {\n name: string;\n description?: string;\n role?: \"WORKER\" | \"COORDINATOR\";\n workflowId?: string;\n createApiKey?: boolean;\n category?: string;\n}\n\nexport interface UpdateAgentPayload {\n name?: string;\n description?: string;\n role?: \"WORKER\" | \"COORDINATOR\";\n workflowId?: string | null;\n category?: string | null;\n}\n\nexport interface CreateWorkflowPayload {\n name: string;\n description?: string;\n}\n\nexport interface UpdateWorkflowPayload {\n name?: string;\n description?: string | null;\n isActive?: boolean;\n}\n\n/**\n * Request a device code to start the login flow\n */\nexport async function requestDeviceCode(): Promise<DeviceCodeResponse> {\n const response = await fetch(`${getBaseUrl()}/api/auth/device/code`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ client_id: CLIENT_ID }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as { error_description?: string; error?: string };\n throw new Error(error.error_description || error.error || \"Failed to request device code\");\n }\n\n return (await response.json()) as DeviceCodeResponse;\n}\n\n/**\n * Poll for token exchange\n * Returns the token response if approved, or throws an error\n */\nexport async function pollForToken(\n deviceCode: string,\n): Promise<TokenResponse | null> {\n const response = await fetch(`${getBaseUrl()}/api/auth/device/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n client_id: CLIENT_ID,\n }),\n });\n\n const data = (await response.json()) as TokenResponse | TokenErrorResponse;\n\n if (!response.ok) {\n if (\"error\" in data && data.error === \"authorization_pending\") {\n return null; // Still waiting for user\n }\n const errorMsg = \"error_description\" in data ? data.error_description : (\"error\" in data ? data.error : \"Token exchange failed\");\n throw new Error(errorMsg || \"Token exchange failed\");\n }\n\n return data as TokenResponse;\n}\n\n/**\n * Get current user info\n */\nexport async function getCurrentUser(): Promise<UserMeResponse> {\n const token = getValidToken();\n\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/user/me`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n throw new Error(\"Failed to get user info\");\n }\n\n return (await response.json()) as UserMeResponse;\n}\n\n// ============================================\n// Config API - Agents\n// ============================================\n\n/**\n * List agents for the current account\n */\nexport async function listAgents(options?: {\n includeKpis?: boolean;\n}): Promise<Agent[]> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const params = new URLSearchParams();\n if (options?.includeKpis) {\n params.set(\"includeKpis\", \"true\");\n }\n\n const url = `${getBaseUrl()}/api/config/agents${params.toString() ? `?${params}` : \"\"}`;\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to list agents\");\n }\n\n const data = (await response.json()) as { agents: Agent[] };\n return data.agents;\n}\n\n/**\n * Get a single agent by ID\n */\nexport async function getAgent(id: string): Promise<Agent> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/agents/${id}`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 404) {\n throw new Error(\"Agent not found\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to get agent\");\n }\n\n return (await response.json()) as Agent;\n}\n\n/**\n * Create a new agent\n */\nexport async function createAgent(payload: CreateAgentPayload): Promise<Agent> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/agents`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 409) {\n throw new Error(\"An agent with this name already exists\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to create agent\");\n }\n\n return (await response.json()) as Agent;\n}\n\n/**\n * Update an agent\n */\nexport async function updateAgent(\n id: string,\n payload: UpdateAgentPayload,\n): Promise<Agent> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/agents/${id}`, {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 404) {\n throw new Error(\"Agent not found\");\n }\n if (response.status === 409) {\n throw new Error(\"An agent with this name already exists\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to update agent\");\n }\n\n return (await response.json()) as Agent;\n}\n\n/**\n * Delete an agent\n */\nexport async function deleteAgent(id: string): Promise<void> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/agents/${id}`, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 404) {\n throw new Error(\"Agent not found\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to delete agent\");\n }\n}\n\n// ============================================\n// Config API - Workflows\n// ============================================\n\n/**\n * List workflows for the current account\n */\nexport async function listWorkflows(options?: {\n includeAgents?: boolean;\n includeInactive?: boolean;\n}): Promise<Workflow[]> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const params = new URLSearchParams();\n if (options?.includeAgents) {\n params.set(\"includeAgents\", \"true\");\n }\n if (options?.includeInactive) {\n params.set(\"includeInactive\", \"true\");\n }\n\n const url = `${getBaseUrl()}/api/config/workflows${params.toString() ? `?${params}` : \"\"}`;\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to list workflows\");\n }\n\n const data = (await response.json()) as { workflows: Workflow[] };\n return data.workflows;\n}\n\n/**\n * Get a single workflow by ID\n */\nexport async function getWorkflow(id: string): Promise<Workflow> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/workflows/${id}`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 404) {\n throw new Error(\"Workflow not found\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to get workflow\");\n }\n\n return (await response.json()) as Workflow;\n}\n\n/**\n * Create a new workflow\n */\nexport async function createWorkflow(\n payload: CreateWorkflowPayload,\n): Promise<Workflow> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/workflows`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 409) {\n throw new Error(\"A workflow with this name already exists\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to create workflow\");\n }\n\n return (await response.json()) as Workflow;\n}\n\n/**\n * Update a workflow\n */\nexport async function updateWorkflow(\n id: string,\n payload: UpdateWorkflowPayload,\n): Promise<Workflow> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/workflows/${id}`, {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 404) {\n throw new Error(\"Workflow not found\");\n }\n if (response.status === 409) {\n throw new Error(\"A workflow with this name already exists\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to update workflow\");\n }\n\n return (await response.json()) as Workflow;\n}\n\n/**\n * Delete a workflow\n */\nexport async function deleteWorkflow(id: string): Promise<void> {\n const token = getValidToken();\n if (!token) {\n throw new Error(\"Not logged in. Run 'olakai login' first.\");\n }\n\n const response = await fetch(`${getBaseUrl()}/api/config/workflows/${id}`, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\"Session expired. Run 'olakai login' to authenticate again.\");\n }\n if (response.status === 404) {\n throw new Error(\"Workflow not found\");\n }\n const error = (await response.json()) as { error?: string };\n throw new Error(error.error || \"Failed to delete workflow\");\n }\n}\n","import { clearToken, isTokenValid } from \"../lib/auth.js\";\n\n/**\n * Logout command handler\n */\nexport function logoutCommand(): void {\n if (!isTokenValid()) {\n console.log(\"Not currently logged in.\");\n return;\n }\n\n clearToken();\n console.log(\"Logged out successfully.\");\n}\n","import { getCurrentUser } from \"../lib/api.js\";\nimport { isTokenValid } from \"../lib/auth.js\";\nimport { getEnvironment } from \"../lib/config.js\";\n\n/**\n * Whoami command handler\n */\nexport async function whoamiCommand(): Promise<void> {\n if (!isTokenValid()) {\n console.log(\"Not logged in. Run 'olakai login' to authenticate.\");\n process.exit(1);\n }\n\n try {\n const user = await getCurrentUser();\n\n console.log(`Email: ${user.email}`);\n console.log(`Name: ${user.firstName} ${user.lastName}`);\n console.log(`Role: ${user.role}`);\n console.log(`Account ID: ${user.accountId}`);\n console.log(`Environment: ${getEnvironment()}`);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n } else {\n console.error(\"Failed to get user info\");\n }\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport {\n listAgents,\n getAgent,\n createAgent,\n updateAgent,\n deleteAgent,\n type Agent,\n} from \"../lib/api.js\";\n\nfunction formatAgentTable(agents: Agent[]): void {\n if (agents.length === 0) {\n console.log(\"No agents found.\");\n return;\n }\n\n // Calculate column widths\n const headers = [\"ID\", \"NAME\", \"ROLE\", \"WORKFLOW\", \"API KEY\"];\n const rows = agents.map((agent) => [\n agent.id.slice(0, 12) + \"...\",\n agent.name.slice(0, 30),\n agent.role,\n agent.workflowId ? agent.workflowId.slice(0, 12) + \"...\" : \"-\",\n agent.apiKey ? (agent.apiKey.isActive ? \"Active\" : \"Inactive\") : \"None\",\n ]);\n\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => r[i].length))\n );\n\n // Print header\n console.log(headers.map((h, i) => h.padEnd(widths[i])).join(\" \"));\n console.log(widths.map((w) => \"-\".repeat(w)).join(\" \"));\n\n // Print rows\n for (const row of rows) {\n console.log(row.map((cell, i) => cell.padEnd(widths[i])).join(\" \"));\n }\n}\n\nfunction formatAgentDetail(agent: Agent): void {\n console.log(`ID: ${agent.id}`);\n console.log(`Name: ${agent.name}`);\n console.log(`Description: ${agent.description || \"-\"}`);\n console.log(`Role: ${agent.role}`);\n console.log(`Source: ${agent.source}`);\n console.log(`Category: ${agent.category || \"-\"}`);\n console.log(`Workflow ID: ${agent.workflowId || \"-\"}`);\n\n if (agent.workflow) {\n console.log(`Workflow: ${agent.workflow.name}`);\n }\n\n console.log(\"\");\n console.log(\"API Key:\");\n if (agent.apiKey) {\n console.log(` ID: ${agent.apiKey.id}`);\n if (agent.apiKey.key) {\n console.log(` Key: ${agent.apiKey.key}`);\n } else {\n console.log(` Key: ${agent.apiKey.keyMasked}`);\n }\n console.log(` Status: ${agent.apiKey.isActive ? \"Active\" : \"Inactive\"}`);\n } else {\n console.log(\" None\");\n }\n\n if (agent.kpiDefinitions && agent.kpiDefinitions.length > 0) {\n console.log(\"\");\n console.log(\"KPI Definitions:\");\n for (const kpi of agent.kpiDefinitions) {\n console.log(` - ${kpi.name} (${kpi.type})`);\n }\n }\n}\n\nasync function listCommand(options: {\n json?: boolean;\n includeKpis?: boolean;\n}): Promise<void> {\n try {\n const agents = await listAgents({ includeKpis: options.includeKpis });\n\n if (options.json) {\n console.log(JSON.stringify(agents, null, 2));\n } else {\n formatAgentTable(agents);\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function getCommand(id: string, options: { json?: boolean }): Promise<void> {\n try {\n const agent = await getAgent(id);\n\n if (options.json) {\n console.log(JSON.stringify(agent, null, 2));\n } else {\n formatAgentDetail(agent);\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function createCommand(options: {\n name: string;\n description?: string;\n role?: string;\n workflow?: string;\n withApiKey?: boolean;\n category?: string;\n json?: boolean;\n}): Promise<void> {\n try {\n if (!options.name) {\n console.error(\"Error: --name is required\");\n process.exit(1);\n }\n\n const agent = await createAgent({\n name: options.name,\n description: options.description || \"\",\n role: (options.role as \"WORKER\" | \"COORDINATOR\") || \"WORKER\",\n workflowId: options.workflow,\n createApiKey: options.withApiKey || false,\n category: options.category,\n });\n\n if (options.json) {\n console.log(JSON.stringify(agent, null, 2));\n } else {\n console.log(\"Agent created successfully!\");\n console.log(\"\");\n formatAgentDetail(agent);\n\n if (agent.apiKey?.key) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Save your API key now. It will not be shown again.\"\n );\n }\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function updateCommand(\n id: string,\n options: {\n name?: string;\n description?: string;\n role?: string;\n workflow?: string;\n category?: string;\n json?: boolean;\n }\n): Promise<void> {\n try {\n const payload: {\n name?: string;\n description?: string;\n role?: \"WORKER\" | \"COORDINATOR\";\n workflowId?: string | null;\n category?: string | null;\n } = {};\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.description !== undefined)\n payload.description = options.description;\n if (options.role !== undefined)\n payload.role = options.role as \"WORKER\" | \"COORDINATOR\";\n if (options.workflow !== undefined) payload.workflowId = options.workflow;\n if (options.category !== undefined) payload.category = options.category;\n\n if (Object.keys(payload).length === 0) {\n console.error(\"Error: At least one field to update is required\");\n process.exit(1);\n }\n\n const agent = await updateAgent(id, payload);\n\n if (options.json) {\n console.log(JSON.stringify(agent, null, 2));\n } else {\n console.log(\"Agent updated successfully!\");\n console.log(\"\");\n formatAgentDetail(agent);\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function deleteCommand(\n id: string,\n options: { force?: boolean }\n): Promise<void> {\n try {\n if (!options.force) {\n // In a real CLI, we'd use readline for confirmation\n // For now, require --force flag\n console.log(\"Are you sure you want to delete this agent?\");\n console.log(\"Use --force to confirm deletion.\");\n process.exit(1);\n }\n\n await deleteAgent(id);\n console.log(\"Agent deleted successfully.\");\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nexport function registerAgentsCommand(program: Command): void {\n const agents = program\n .command(\"agents\")\n .description(\"Manage agents\");\n\n agents\n .command(\"list\")\n .description(\"List all agents\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--include-kpis\", \"Include KPI definitions\")\n .action(listCommand);\n\n agents\n .command(\"get <id>\")\n .description(\"Get agent details\")\n .option(\"--json\", \"Output as JSON\")\n .action(getCommand);\n\n agents\n .command(\"create\")\n .description(\"Create a new agent\")\n .requiredOption(\"--name <name>\", \"Agent name\")\n .option(\"--description <description>\", \"Agent description\")\n .option(\"--role <role>\", \"Agent role (WORKER or COORDINATOR)\", \"WORKER\")\n .option(\"--workflow <id>\", \"Workflow ID to assign\")\n .option(\"--with-api-key\", \"Create an API key for this agent\")\n .option(\"--category <category>\", \"Agent category\")\n .option(\"--json\", \"Output as JSON\")\n .action(createCommand);\n\n agents\n .command(\"update <id>\")\n .description(\"Update an agent\")\n .option(\"--name <name>\", \"Agent name\")\n .option(\"--description <description>\", \"Agent description\")\n .option(\"--role <role>\", \"Agent role (WORKER or COORDINATOR)\")\n .option(\"--workflow <id>\", \"Workflow ID to assign\")\n .option(\"--category <category>\", \"Agent category\")\n .option(\"--json\", \"Output as JSON\")\n .action(updateCommand);\n\n agents\n .command(\"delete <id>\")\n .description(\"Delete an agent\")\n .option(\"--force\", \"Skip confirmation\")\n .action(deleteCommand);\n}\n","import { Command } from \"commander\";\nimport {\n listWorkflows,\n getWorkflow,\n createWorkflow,\n updateWorkflow,\n deleteWorkflow,\n type Workflow,\n} from \"../lib/api.js\";\n\nfunction formatWorkflowTable(workflows: Workflow[]): void {\n if (workflows.length === 0) {\n console.log(\"No workflows found.\");\n return;\n }\n\n // Calculate column widths\n const headers = [\"ID\", \"NAME\", \"AGENTS\", \"STATUS\"];\n const rows = workflows.map((wf) => [\n wf.id.slice(0, 12) + \"...\",\n wf.name.slice(0, 30),\n wf.agentCount.toString(),\n wf.isActive ? \"Active\" : \"Inactive\",\n ]);\n\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => r[i].length))\n );\n\n // Print header\n console.log(headers.map((h, i) => h.padEnd(widths[i])).join(\" \"));\n console.log(widths.map((w) => \"-\".repeat(w)).join(\" \"));\n\n // Print rows\n for (const row of rows) {\n console.log(row.map((cell, i) => cell.padEnd(widths[i])).join(\" \"));\n }\n}\n\nfunction formatWorkflowDetail(workflow: Workflow): void {\n console.log(`ID: ${workflow.id}`);\n console.log(`Name: ${workflow.name}`);\n console.log(`Description: ${workflow.description || \"-\"}`);\n console.log(`Status: ${workflow.isActive ? \"Active\" : \"Inactive\"}`);\n console.log(`Agents: ${workflow.agentCount}`);\n if (workflow.createdAt) {\n console.log(`Created: ${new Date(workflow.createdAt).toISOString()}`);\n }\n if (workflow.updatedAt) {\n console.log(`Updated: ${new Date(workflow.updatedAt).toISOString()}`);\n }\n\n if (workflow.agents && workflow.agents.length > 0) {\n console.log(\"\");\n console.log(\"Agents:\");\n for (const agent of workflow.agents) {\n const apiKeyStatus = agent.apiKey\n ? agent.apiKey.isActive\n ? \"API Key: Active\"\n : \"API Key: Inactive\"\n : \"No API Key\";\n console.log(` - ${agent.name} (${agent.role}) - ${apiKeyStatus}`);\n }\n }\n}\n\nasync function listCommand(options: {\n json?: boolean;\n includeAgents?: boolean;\n includeInactive?: boolean;\n}): Promise<void> {\n try {\n const workflows = await listWorkflows({\n includeAgents: options.includeAgents,\n includeInactive: options.includeInactive,\n });\n\n if (options.json) {\n console.log(JSON.stringify(workflows, null, 2));\n } else {\n formatWorkflowTable(workflows);\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function getCommand(id: string, options: { json?: boolean }): Promise<void> {\n try {\n const workflow = await getWorkflow(id);\n\n if (options.json) {\n console.log(JSON.stringify(workflow, null, 2));\n } else {\n formatWorkflowDetail(workflow);\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function createCommand(options: {\n name: string;\n description?: string;\n json?: boolean;\n}): Promise<void> {\n try {\n if (!options.name) {\n console.error(\"Error: --name is required\");\n process.exit(1);\n }\n\n const workflow = await createWorkflow({\n name: options.name,\n description: options.description,\n });\n\n if (options.json) {\n console.log(JSON.stringify(workflow, null, 2));\n } else {\n console.log(\"Workflow created successfully!\");\n console.log(\"\");\n formatWorkflowDetail(workflow);\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function updateCommand(\n id: string,\n options: {\n name?: string;\n description?: string;\n active?: boolean;\n inactive?: boolean;\n json?: boolean;\n }\n): Promise<void> {\n try {\n const payload: {\n name?: string;\n description?: string | null;\n isActive?: boolean;\n } = {};\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.description !== undefined)\n payload.description = options.description;\n if (options.active) payload.isActive = true;\n if (options.inactive) payload.isActive = false;\n\n if (Object.keys(payload).length === 0) {\n console.error(\"Error: At least one field to update is required\");\n process.exit(1);\n }\n\n const workflow = await updateWorkflow(id, payload);\n\n if (options.json) {\n console.log(JSON.stringify(workflow, null, 2));\n } else {\n console.log(\"Workflow updated successfully!\");\n console.log(\"\");\n formatWorkflowDetail(workflow);\n }\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nasync function deleteCommand(\n id: string,\n options: { force?: boolean }\n): Promise<void> {\n try {\n if (!options.force) {\n // In a real CLI, we'd use readline for confirmation\n // For now, require --force flag\n console.log(\"Are you sure you want to delete this workflow?\");\n console.log(\"Use --force to confirm deletion.\");\n process.exit(1);\n }\n\n await deleteWorkflow(id);\n console.log(\"Workflow deleted successfully.\");\n } catch (error) {\n console.error(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n}\n\nexport function registerWorkflowsCommand(program: Command): void {\n const workflows = program\n .command(\"workflows\")\n .description(\"Manage workflows\");\n\n workflows\n .command(\"list\")\n .description(\"List all workflows\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--include-agents\", \"Include agent details\")\n .option(\"--include-inactive\", \"Include inactive workflows\")\n .action(listCommand);\n\n workflows\n .command(\"get <id>\")\n .description(\"Get workflow details\")\n .option(\"--json\", \"Output as JSON\")\n .action(getCommand);\n\n workflows\n .command(\"create\")\n .description(\"Create a new workflow\")\n .requiredOption(\"--name <name>\", \"Workflow name\")\n .option(\"--description <description>\", \"Workflow description\")\n .option(\"--json\", \"Output as JSON\")\n .action(createCommand);\n\n workflows\n .command(\"update <id>\")\n .description(\"Update a workflow\")\n .option(\"--name <name>\", \"Workflow name\")\n .option(\"--description <description>\", \"Workflow description\")\n .option(\"--active\", \"Set workflow as active\")\n .option(\"--inactive\", \"Set workflow as inactive\")\n .option(\"--json\", \"Output as JSON\")\n .action(updateCommand);\n\n workflows\n .command(\"delete <id>\")\n .description(\"Delete a workflow\")\n .option(\"--force\", \"Skip confirmation\")\n .action(deleteCommand);\n}\n"],"mappings":"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","names":["program","listCommand","getCommand","createCommand","updateCommand","deleteCommand","program"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "olakai-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Olakai CLI tool",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,14 +10,6 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"dist"
|
|
12
12
|
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsup",
|
|
15
|
-
"dev": "tsx src/index.ts",
|
|
16
|
-
"start": "node dist/index.js",
|
|
17
|
-
"lint": "eslint src --ext .ts",
|
|
18
|
-
"type-check": "tsc --noEmit",
|
|
19
|
-
"prepublishOnly": "pnpm build"
|
|
20
|
-
},
|
|
21
13
|
"keywords": [
|
|
22
14
|
"olakai",
|
|
23
15
|
"cli"
|
|
@@ -40,5 +32,11 @@
|
|
|
40
32
|
"commander": "^12.0.0",
|
|
41
33
|
"open": "^10.0.0"
|
|
42
34
|
},
|
|
43
|
-
"
|
|
44
|
-
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"dev": "tsx src/index.ts",
|
|
38
|
+
"start": "node dist/index.js",
|
|
39
|
+
"lint": "eslint src --ext .ts",
|
|
40
|
+
"type-check": "tsc --noEmit"
|
|
41
|
+
}
|
|
42
|
+
}
|