@some-useful-agents/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/commands/cancel.d.ts +3 -0
  2. package/dist/commands/cancel.d.ts.map +1 -0
  3. package/dist/commands/cancel.js +30 -0
  4. package/dist/commands/cancel.js.map +1 -0
  5. package/dist/commands/doctor.d.ts +3 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +132 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/init.d.ts +3 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +34 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/list.d.ts +3 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +36 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/logs.d.ts +3 -0
  18. package/dist/commands/logs.d.ts.map +1 -0
  19. package/dist/commands/logs.js +26 -0
  20. package/dist/commands/logs.js.map +1 -0
  21. package/dist/commands/mcp.d.ts +3 -0
  22. package/dist/commands/mcp.d.ts.map +1 -0
  23. package/dist/commands/mcp.js +29 -0
  24. package/dist/commands/mcp.js.map +1 -0
  25. package/dist/commands/run.d.ts +3 -0
  26. package/dist/commands/run.d.ts.map +1 -0
  27. package/dist/commands/run.js +63 -0
  28. package/dist/commands/run.js.map +1 -0
  29. package/dist/commands/secrets.d.ts +3 -0
  30. package/dist/commands/secrets.d.ts.map +1 -0
  31. package/dist/commands/secrets.js +145 -0
  32. package/dist/commands/secrets.js.map +1 -0
  33. package/dist/commands/status.d.ts +3 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +68 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/commands/worker.d.ts +3 -0
  38. package/dist/commands/worker.d.ts.map +1 -0
  39. package/dist/commands/worker.js +42 -0
  40. package/dist/commands/worker.js.map +1 -0
  41. package/dist/config.d.ts +22 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +50 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +32 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/provider-factory.d.ts +4 -0
  50. package/dist/provider-factory.d.ts.map +1 -0
  51. package/dist/provider-factory.js +23 -0
  52. package/dist/provider-factory.js.map +1 -0
  53. package/package.json +36 -0
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const cancelCommand: Command;
3
+ //# sourceMappingURL=cancel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAyBtB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { LocalProvider, EncryptedFileStore } from '@some-useful-agents/core';
4
+ import { loadConfig, getDbPath, getSecretsPath } from '../config.js';
5
+ export const cancelCommand = new Command('cancel')
6
+ .description('Cancel a running agent')
7
+ .argument('<runId>', 'Run ID')
8
+ .action(async (runId) => {
9
+ const config = loadConfig();
10
+ const secretsStore = new EncryptedFileStore(getSecretsPath(config));
11
+ const provider = new LocalProvider(getDbPath(config), secretsStore);
12
+ await provider.initialize();
13
+ try {
14
+ const run = await provider.getRun(runId);
15
+ if (!run) {
16
+ console.error(chalk.red(`Run "${runId}" not found.`));
17
+ process.exit(1);
18
+ }
19
+ if (run.status !== 'running' && run.status !== 'pending') {
20
+ console.log(chalk.yellow(`Run is already ${run.status}.`));
21
+ return;
22
+ }
23
+ await provider.cancelRun(runId);
24
+ console.log(chalk.green(`Cancelled run ${chalk.dim(runId.slice(0, 8))}.`));
25
+ }
26
+ finally {
27
+ await provider.shutdown();
28
+ }
29
+ });
30
+ //# sourceMappingURL=cancel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;KAC7B,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;IACpE,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const doctorCommand: Command;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,aAAa,SA4HtB,CAAC"}
@@ -0,0 +1,132 @@
1
+ import { Command } from 'commander';
2
+ import { execSync } from 'node:child_process';
3
+ import { existsSync } from 'node:fs';
4
+ import chalk from 'chalk';
5
+ import { loadConfig, getAgentDirs, getSecretsPath } from '../config.js';
6
+ import { loadAgents, EncryptedFileStore } from '@some-useful-agents/core';
7
+ export const doctorCommand = new Command('doctor')
8
+ .description('Check prerequisites and system health')
9
+ .action(() => {
10
+ const config = loadConfig();
11
+ const checks = [
12
+ {
13
+ name: 'Node.js >= 22.5',
14
+ run: () => {
15
+ const version = process.versions.node;
16
+ const [major, minor] = version.split('.').map(Number);
17
+ const ok = major > 22 || (major === 22 && minor >= 5);
18
+ return { ok, message: ok ? `v${version}` : `v${version} (need >= 22.5)` };
19
+ },
20
+ },
21
+ {
22
+ name: 'npm available',
23
+ run: () => {
24
+ try {
25
+ const version = execSync('npm --version', { encoding: 'utf-8' }).trim();
26
+ return { ok: true, message: `v${version}` };
27
+ }
28
+ catch {
29
+ return { ok: false, message: 'not found' };
30
+ }
31
+ },
32
+ },
33
+ {
34
+ name: 'Claude Code CLI',
35
+ run: () => {
36
+ try {
37
+ const version = execSync('claude --version', { encoding: 'utf-8' }).trim();
38
+ return { ok: true, message: version };
39
+ }
40
+ catch {
41
+ return { ok: false, message: 'not found (needed for claude-code agents)' };
42
+ }
43
+ },
44
+ },
45
+ {
46
+ name: 'Docker available',
47
+ run: () => {
48
+ if (config.provider !== 'temporal') {
49
+ return { ok: true, message: 'skipped (not using temporal provider)' };
50
+ }
51
+ try {
52
+ execSync('docker info', { encoding: 'utf-8', stdio: 'pipe' });
53
+ return { ok: true, message: 'running' };
54
+ }
55
+ catch {
56
+ return { ok: false, message: 'not running (needed for temporal provider)' };
57
+ }
58
+ },
59
+ },
60
+ {
61
+ name: 'Agents directory',
62
+ run: () => {
63
+ const dirs = getAgentDirs(config);
64
+ const { agents, warnings } = loadAgents({ directories: dirs.runnable });
65
+ if (agents.size === 0 && warnings.length > 0) {
66
+ return { ok: false, message: `No agents found (${warnings.length} warning(s))` };
67
+ }
68
+ return { ok: agents.size > 0, message: `${agents.size} agent(s) found` };
69
+ },
70
+ },
71
+ {
72
+ name: 'Config file',
73
+ run: () => {
74
+ const exists = existsSync('sua.config.json');
75
+ return { ok: exists, message: exists ? 'found' : 'not found (run "sua init")' };
76
+ },
77
+ },
78
+ {
79
+ name: 'Secrets backend',
80
+ run: () => {
81
+ try {
82
+ const store = new EncryptedFileStore(getSecretsPath(config));
83
+ // Trigger a read to verify encryption key works
84
+ void store.list();
85
+ return { ok: true, message: 'encrypted file store (machine-bound key)' };
86
+ }
87
+ catch (err) {
88
+ return { ok: false, message: err.message };
89
+ }
90
+ },
91
+ },
92
+ {
93
+ name: 'Agent secrets',
94
+ run: () => {
95
+ const dirs = getAgentDirs(config);
96
+ const { agents } = loadAgents({ directories: dirs.runnable });
97
+ const store = new EncryptedFileStore(getSecretsPath(config));
98
+ const declaredSecrets = new Set();
99
+ for (const [, agent] of agents) {
100
+ for (const s of agent.secrets ?? [])
101
+ declaredSecrets.add(s);
102
+ }
103
+ if (declaredSecrets.size === 0) {
104
+ return { ok: true, message: 'no agents declare secrets' };
105
+ }
106
+ // Check synchronously by accessing private state — use hasSync via list()
107
+ // Note: we use a sync approach by reading the file directly via store.list()'s promise
108
+ // Since run() is sync, we check count only
109
+ return { ok: true, message: `${declaredSecrets.size} secret(s) declared by agents` };
110
+ },
111
+ },
112
+ ];
113
+ console.log(chalk.bold('\nsome-useful-agents doctor\n'));
114
+ let allOk = true;
115
+ for (const check of checks) {
116
+ const result = check.run();
117
+ const icon = result.ok ? chalk.green('✓') : chalk.red('✗');
118
+ const msg = result.ok ? chalk.dim(result.message) : chalk.red(result.message);
119
+ console.log(` ${icon} ${check.name} ${msg}`);
120
+ if (!result.ok)
121
+ allOk = false;
122
+ }
123
+ console.log('');
124
+ if (allOk) {
125
+ console.log(chalk.green('All checks passed.'));
126
+ }
127
+ else {
128
+ console.log(chalk.yellow('Some checks failed. See above.'));
129
+ process.exit(1);
130
+ }
131
+ });
132
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SAkCpB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { Command } from 'commander';
2
+ import { writeFileSync, existsSync, mkdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import chalk from 'chalk';
5
+ export const initCommand = new Command('init')
6
+ .description('Initialize some-useful-agents in the current directory')
7
+ .action(() => {
8
+ const configPath = join(process.cwd(), 'sua.config.json');
9
+ if (existsSync(configPath)) {
10
+ console.log(chalk.yellow('sua.config.json already exists. Skipping.'));
11
+ return;
12
+ }
13
+ const config = {
14
+ provider: 'local',
15
+ agentsDir: './agents',
16
+ dataDir: './data',
17
+ mcpPort: 3003,
18
+ };
19
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
20
+ console.log(chalk.green('Created sua.config.json'));
21
+ // Ensure directories exist
22
+ const agentsLocal = join(config.agentsDir, 'local');
23
+ if (!existsSync(agentsLocal)) {
24
+ mkdirSync(agentsLocal, { recursive: true });
25
+ console.log(chalk.green(`Created ${agentsLocal}/`));
26
+ }
27
+ if (!existsSync(config.dataDir)) {
28
+ mkdirSync(config.dataDir, { recursive: true });
29
+ console.log(chalk.green(`Created ${config.dataDir}/`));
30
+ }
31
+ console.log(chalk.dim('\nRun "sua agent list" to see available agents.'));
32
+ console.log(chalk.dim('Run "sua agent run hello-shell" to test your first agent.'));
33
+ });
34
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAE1D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEpD,2BAA2B;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,WAAW,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;AACtF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const listCommand: Command;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SAoCpB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import { loadAgents } from '@some-useful-agents/core';
5
+ import { loadConfig, getAgentDirs } from '../config.js';
6
+ export const listCommand = new Command('list')
7
+ .description('List available agents')
8
+ .option('--catalog', 'Show community catalog agents')
9
+ .action((options) => {
10
+ const config = loadConfig();
11
+ const dirs = getAgentDirs(config);
12
+ const directories = options.catalog ? dirs.catalog : dirs.runnable;
13
+ const label = options.catalog ? 'Community Catalog' : 'Available Agents';
14
+ const { agents, warnings } = loadAgents({ directories });
15
+ for (const w of warnings) {
16
+ console.error(chalk.yellow(`Warning: ${w.file}: ${w.message}`));
17
+ }
18
+ if (agents.size === 0) {
19
+ console.log(chalk.dim(`No agents found. ${options.catalog ? '' : 'Run "sua init" to get started.'}`));
20
+ return;
21
+ }
22
+ const table = new Table({
23
+ head: [chalk.bold('Name'), chalk.bold('Type'), chalk.bold('Description')],
24
+ });
25
+ for (const [, agent] of agents) {
26
+ table.push([
27
+ chalk.cyan(agent.name),
28
+ agent.type === 'shell' ? chalk.green('shell') : chalk.magenta('claude-code'),
29
+ agent.description ?? chalk.dim('(no description)'),
30
+ ]);
31
+ }
32
+ console.log(`\n${chalk.bold(label)}\n`);
33
+ console.log(table.toString());
34
+ console.log(chalk.dim(`\n${agents.size} agent(s)`));
35
+ });
36
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;KACpD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAEzE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAEzD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gCAAgC,EAAE,CAAC,CAAC,CAAC;QACtG,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KAC1E,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACtB,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC5E,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const logsCommand: Command;
3
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SAmBpB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { LocalProvider, EncryptedFileStore } from '@some-useful-agents/core';
4
+ import { loadConfig, getDbPath, getSecretsPath } from '../config.js';
5
+ export const logsCommand = new Command('logs')
6
+ .description('Show logs for a run')
7
+ .argument('<runId>', 'Run ID')
8
+ .action(async (runId) => {
9
+ const config = loadConfig();
10
+ const secretsStore = new EncryptedFileStore(getSecretsPath(config));
11
+ const provider = new LocalProvider(getDbPath(config), secretsStore);
12
+ await provider.initialize();
13
+ try {
14
+ const logs = await provider.getRunLogs(runId);
15
+ if (!logs || logs === '(no output)') {
16
+ console.log(chalk.dim('No output for this run.'));
17
+ }
18
+ else {
19
+ console.log(logs);
20
+ }
21
+ }
22
+ finally {
23
+ await provider.shutdown();
24
+ }
25
+ });
26
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,qBAAqB,CAAC;KAClC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;KAC7B,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;IACpE,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const mcpCommand: Command;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,UAAU,SACgB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { loadConfig, getAgentDirs, getDbPath, getSecretsPath } from '../config.js';
4
+ export const mcpCommand = new Command('mcp')
5
+ .description('MCP server management');
6
+ mcpCommand
7
+ .command('start')
8
+ .description('Start the MCP server')
9
+ .option('-p, --port <port>', 'Port to listen on')
10
+ .action(async (options) => {
11
+ const config = loadConfig();
12
+ const port = options.port ? parseInt(options.port, 10) : config.mcpPort;
13
+ const dirs = getAgentDirs(config);
14
+ const dbPath = getDbPath(config);
15
+ // Dynamic import to avoid loading MCP deps when not needed
16
+ const { startMcpServer } = await import('@some-useful-agents/mcp-server');
17
+ console.log(chalk.bold('Starting MCP server...'));
18
+ console.log(chalk.dim(` Port: ${port}`));
19
+ console.log(chalk.dim(` Agents: ${dirs.runnable.join(', ')}`));
20
+ console.log(chalk.dim(` DB: ${dbPath}`));
21
+ console.log('');
22
+ await startMcpServer({
23
+ port,
24
+ agentDirs: dirs.runnable,
25
+ dbPath,
26
+ secretsPath: getSecretsPath(config),
27
+ });
28
+ });
29
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,uBAAuB,CAAC,CAAC;AAExC,UAAU;KACP,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACxE,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEjC,2DAA2D;IAC3D,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,cAAc,CAAC;QACnB,IAAI;QACJ,SAAS,EAAE,IAAI,CAAC,QAAQ;QACxB,MAAM;QACN,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const runCommand: Command;
3
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SA6DnB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { loadAgents } from '@some-useful-agents/core';
5
+ import { loadConfig, getAgentDirs } from '../config.js';
6
+ import { createProvider } from '../provider-factory.js';
7
+ export const runCommand = new Command('run')
8
+ .description('Run an agent')
9
+ .argument('<name>', 'Agent name')
10
+ .option('--provider <provider>', 'Override provider (local | temporal)')
11
+ .option('--verbose', 'Show detailed output')
12
+ .action(async (name, options) => {
13
+ const config = loadConfig();
14
+ const dirs = getAgentDirs(config);
15
+ const { agents } = loadAgents({ directories: dirs.runnable });
16
+ const agent = agents.get(name);
17
+ if (!agent) {
18
+ console.error(chalk.red(`Agent "${name}" not found.`));
19
+ console.error(chalk.dim('Run "sua agent list" to see available agents.'));
20
+ process.exit(1);
21
+ }
22
+ const provider = await createProvider(config, options.provider);
23
+ const spinner = ora(`Running ${chalk.cyan(name)} via ${chalk.dim(provider.name)}...`).start();
24
+ try {
25
+ const run = await provider.submitRun({ agent, triggeredBy: 'cli' });
26
+ spinner.text = `Running ${chalk.cyan(name)} (${chalk.dim(run.id.slice(0, 8))})...`;
27
+ // Poll for completion
28
+ let current = run;
29
+ let pendingWarned = false;
30
+ const startedAt = Date.now();
31
+ while (current.status === 'running' || current.status === 'pending') {
32
+ await new Promise(r => setTimeout(r, 250));
33
+ const updated = await provider.getRun(run.id);
34
+ if (updated)
35
+ current = updated;
36
+ // Warn if workflow stays pending > 5s (likely no worker running for temporal)
37
+ if (!pendingWarned && provider.name === 'temporal' && current.status === 'pending' && Date.now() - startedAt > 5000) {
38
+ spinner.warn(`Run still pending after 5s. Is the worker running? Start it with: ${chalk.cyan('sua worker start')}`);
39
+ pendingWarned = true;
40
+ spinner.start();
41
+ }
42
+ }
43
+ if (current.status === 'completed') {
44
+ spinner.succeed(`${chalk.cyan(name)} completed`);
45
+ if (current.result) {
46
+ console.log(chalk.dim('\n--- output ---'));
47
+ console.log(current.result.trimEnd());
48
+ console.log(chalk.dim('--- end ---'));
49
+ }
50
+ }
51
+ else {
52
+ spinner.fail(`${chalk.cyan(name)} ${current.status}`);
53
+ if (current.error) {
54
+ console.error(chalk.red(current.error));
55
+ }
56
+ }
57
+ console.log(chalk.dim(`\nRun ID: ${current.id}`));
58
+ }
59
+ finally {
60
+ await provider.shutdown();
61
+ }
62
+ });
63
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const secretsCommand: Command;
3
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,cAAc,SACoB,CAAC"}
@@ -0,0 +1,145 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import { createInterface } from 'node:readline';
5
+ import { EncryptedFileStore, loadAgents } from '@some-useful-agents/core';
6
+ import { loadConfig, getSecretsPath, getAgentDirs } from '../config.js';
7
+ function getStore() {
8
+ const config = loadConfig();
9
+ return new EncryptedFileStore(getSecretsPath(config));
10
+ }
11
+ async function promptSecret(name) {
12
+ // Support piped input (echo "val" | sua secrets set KEY)
13
+ if (!process.stdin.isTTY) {
14
+ const chunks = [];
15
+ for await (const chunk of process.stdin) {
16
+ chunks.push(chunk);
17
+ }
18
+ return Buffer.concat(chunks).toString('utf-8').trim();
19
+ }
20
+ // Interactive: read with echo suppression
21
+ process.stdout.write(chalk.dim(`Enter value for ${name} (input hidden): `));
22
+ return new Promise((resolve) => {
23
+ const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: true });
24
+ // Suppress echo
25
+ const stdin = process.stdin;
26
+ stdin.setRawMode?.(true);
27
+ let value = '';
28
+ const onData = (chunk) => {
29
+ const str = chunk.toString('utf-8');
30
+ for (const ch of str) {
31
+ if (ch === '\r' || ch === '\n') {
32
+ stdin.setRawMode?.(false);
33
+ stdin.removeListener('data', onData);
34
+ rl.close();
35
+ process.stdout.write('\n');
36
+ resolve(value);
37
+ return;
38
+ }
39
+ else if (ch === '\x03') { // Ctrl-C
40
+ process.exit(130);
41
+ }
42
+ else if (ch === '\x7f') { // backspace
43
+ value = value.slice(0, -1);
44
+ }
45
+ else {
46
+ value += ch;
47
+ }
48
+ }
49
+ };
50
+ stdin.on('data', onData);
51
+ });
52
+ }
53
+ export const secretsCommand = new Command('secrets')
54
+ .description('Manage secrets used by agents');
55
+ secretsCommand
56
+ .command('set')
57
+ .description('Set a secret value')
58
+ .argument('<name>', 'Secret name (e.g. MY_API_KEY)')
59
+ .action(async (name) => {
60
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(name)) {
61
+ console.error(chalk.red(`Invalid secret name "${name}". Must be uppercase with underscores (e.g. MY_API_KEY).`));
62
+ process.exit(1);
63
+ }
64
+ const value = await promptSecret(name);
65
+ if (!value) {
66
+ console.error(chalk.red('No value provided.'));
67
+ process.exit(1);
68
+ }
69
+ const store = getStore();
70
+ await store.set(name, value);
71
+ console.log(chalk.green(`Set secret ${chalk.cyan(name)}`));
72
+ });
73
+ secretsCommand
74
+ .command('get')
75
+ .description('Print a secret value')
76
+ .argument('<name>', 'Secret name')
77
+ .action(async (name) => {
78
+ const store = getStore();
79
+ const value = await store.get(name);
80
+ if (value === undefined) {
81
+ console.error(chalk.red(`Secret "${name}" not set.`));
82
+ process.exit(1);
83
+ }
84
+ console.log(value);
85
+ });
86
+ secretsCommand
87
+ .command('list')
88
+ .description('List secret names (values not shown)')
89
+ .action(async () => {
90
+ const store = getStore();
91
+ const names = await store.list();
92
+ if (names.length === 0) {
93
+ console.log(chalk.dim('No secrets set. Run `sua secrets set <NAME>` to add one.'));
94
+ return;
95
+ }
96
+ const table = new Table({ head: [chalk.bold('Name')] });
97
+ for (const name of names) {
98
+ table.push([chalk.cyan(name)]);
99
+ }
100
+ console.log(table.toString());
101
+ console.log(chalk.dim(`\n${names.length} secret(s)`));
102
+ });
103
+ secretsCommand
104
+ .command('delete')
105
+ .description('Delete a secret')
106
+ .argument('<name>', 'Secret name')
107
+ .action(async (name) => {
108
+ const store = getStore();
109
+ if (!(await store.has(name))) {
110
+ console.error(chalk.yellow(`Secret "${name}" not found.`));
111
+ process.exit(1);
112
+ }
113
+ await store.delete(name);
114
+ console.log(chalk.green(`Deleted secret ${chalk.cyan(name)}`));
115
+ });
116
+ secretsCommand
117
+ .command('check')
118
+ .description('Show which secrets an agent needs and their status')
119
+ .argument('<agent>', 'Agent name')
120
+ .action(async (agentName) => {
121
+ const config = loadConfig();
122
+ const dirs = getAgentDirs(config);
123
+ const { agents } = loadAgents({ directories: dirs.runnable });
124
+ const agent = agents.get(agentName);
125
+ if (!agent) {
126
+ console.error(chalk.red(`Agent "${agentName}" not found.`));
127
+ process.exit(1);
128
+ }
129
+ const declared = agent.secrets ?? [];
130
+ if (declared.length === 0) {
131
+ console.log(chalk.dim(`Agent "${agentName}" declares no secrets.`));
132
+ return;
133
+ }
134
+ const store = getStore();
135
+ const table = new Table({ head: [chalk.bold('Secret'), chalk.bold('Status')] });
136
+ for (const name of declared) {
137
+ const has = await store.has(name);
138
+ table.push([
139
+ chalk.cyan(name),
140
+ has ? chalk.green('set') : chalk.red('missing'),
141
+ ]);
142
+ }
143
+ console.log(table.toString());
144
+ });
145
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const statusCommand: Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,aAAa,SAuDtB,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import { LocalProvider, EncryptedFileStore } from '@some-useful-agents/core';
5
+ import { loadConfig, getDbPath, getSecretsPath } from '../config.js';
6
+ const STATUS_COLORS = {
7
+ completed: chalk.green,
8
+ running: chalk.blue,
9
+ pending: chalk.yellow,
10
+ failed: chalk.red,
11
+ cancelled: chalk.gray,
12
+ };
13
+ export const statusCommand = new Command('status')
14
+ .description('Show run status')
15
+ .argument('[runId]', 'Specific run ID (shows all recent if omitted)')
16
+ .option('-n, --limit <n>', 'Number of recent runs to show', '10')
17
+ .action(async (runId, options) => {
18
+ const config = loadConfig();
19
+ const secretsStore = new EncryptedFileStore(getSecretsPath(config));
20
+ const provider = new LocalProvider(getDbPath(config), secretsStore);
21
+ await provider.initialize();
22
+ try {
23
+ if (runId) {
24
+ const run = await provider.getRun(runId);
25
+ if (!run) {
26
+ console.error(chalk.red(`Run "${runId}" not found.`));
27
+ process.exit(1);
28
+ }
29
+ const colorFn = STATUS_COLORS[run.status] ?? chalk.white;
30
+ console.log(`\n${chalk.bold('Run')} ${chalk.dim(run.id)}`);
31
+ console.log(` Agent: ${chalk.cyan(run.agentName)}`);
32
+ console.log(` Status: ${colorFn(run.status)}`);
33
+ console.log(` Started: ${run.startedAt}`);
34
+ if (run.completedAt)
35
+ console.log(` Completed: ${run.completedAt}`);
36
+ if (run.exitCode !== undefined)
37
+ console.log(` Exit code: ${run.exitCode}`);
38
+ if (run.error)
39
+ console.log(` Error: ${chalk.red(run.error)}`);
40
+ }
41
+ else {
42
+ const limit = parseInt(options?.limit ?? '10', 10);
43
+ const runs = await provider.listRuns({ limit });
44
+ if (runs.length === 0) {
45
+ console.log(chalk.dim('No runs yet.'));
46
+ return;
47
+ }
48
+ const table = new Table({
49
+ head: [chalk.bold('ID'), chalk.bold('Agent'), chalk.bold('Status'), chalk.bold('Started')],
50
+ });
51
+ for (const run of runs) {
52
+ const colorFn = STATUS_COLORS[run.status] ?? chalk.white;
53
+ table.push([
54
+ chalk.dim(run.id.slice(0, 8)),
55
+ chalk.cyan(run.agentName),
56
+ colorFn(run.status),
57
+ run.startedAt,
58
+ ]);
59
+ }
60
+ console.log(`\n${chalk.bold('Recent Runs')}\n`);
61
+ console.log(table.toString());
62
+ }
63
+ }
64
+ finally {
65
+ await provider.shutdown();
66
+ }
67
+ });
68
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,aAAa,GAA0C;IAC3D,SAAS,EAAE,KAAK,CAAC,KAAK;IACtB,OAAO,EAAE,KAAK,CAAC,IAAI;IACnB,OAAO,EAAE,KAAK,CAAC,MAAM;IACrB,MAAM,EAAE,KAAK,CAAC,GAAG;IACjB,SAAS,EAAE,KAAK,CAAC,IAAI;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,iBAAiB,CAAC;KAC9B,QAAQ,CAAC,SAAS,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,IAAI,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,KAAc,EAAE,OAA2B,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;IACpE,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7C,IAAI,GAAG,CAAC,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACpE,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5E,IAAI,GAAG,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAEhD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC3F,CAAC,CAAC;YAEH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;gBACzD,KAAK,CAAC,IAAI,CAAC;oBACT,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;oBACnB,GAAG,CAAC,SAAS;iBACd,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const workerCommand: Command;
3
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/commands/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SACkB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { loadConfig } from '../config.js';
4
+ export const workerCommand = new Command('worker')
5
+ .description('Temporal worker management');
6
+ workerCommand
7
+ .command('start')
8
+ .description('Start the Temporal worker (runs on host, needs access to shell + Claude CLI)')
9
+ .option('--address <address>', 'Temporal server address')
10
+ .option('--namespace <namespace>', 'Temporal namespace')
11
+ .option('--task-queue <queue>', 'Task queue name')
12
+ .action(async (options) => {
13
+ const config = loadConfig();
14
+ const address = options.address ?? config.temporalAddress ?? 'localhost:7233';
15
+ const namespace = options.namespace ?? config.temporalNamespace ?? 'default';
16
+ const taskQueue = options.taskQueue ?? config.temporalTaskQueue ?? 'sua-agents';
17
+ const { startWorker } = await import('@some-useful-agents/temporal-provider');
18
+ console.log(chalk.bold('Starting Temporal worker...'));
19
+ console.log(chalk.dim(` Address: ${address}`));
20
+ console.log(chalk.dim(` Namespace: ${namespace}`));
21
+ console.log(chalk.dim(` Task queue: ${taskQueue}`));
22
+ console.log('');
23
+ try {
24
+ const worker = await startWorker({ address, namespace, taskQueue });
25
+ console.log(chalk.green('Worker connected. Listening for agent runs...'));
26
+ console.log(chalk.dim('Press Ctrl+C to stop.\n'));
27
+ process.on('SIGINT', () => {
28
+ console.log('\nShutting down worker...');
29
+ worker.shutdown();
30
+ });
31
+ await worker.run();
32
+ }
33
+ catch (err) {
34
+ const msg = err instanceof Error ? err.message : String(err);
35
+ console.error(chalk.red(`Worker failed: ${msg}`));
36
+ if (msg.includes('ECONNREFUSED') || msg.includes('connection refused')) {
37
+ console.error(chalk.dim(`\nIs Temporal running? Start it with: ${chalk.cyan('docker compose up -d')}`));
38
+ }
39
+ process.exit(1);
40
+ }
41
+ });
42
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/commands/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAE7C,aAAa;KACV,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,8EAA8E,CAAC;KAC3F,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,yBAAyB,EAAE,oBAAoB,CAAC;KACvD,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,eAAe,IAAI,gBAAgB,CAAC;IAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,iBAAiB,IAAI,SAAS,CAAC;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,iBAAiB,IAAI,YAAY,CAAC;IAEhF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAE9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAElD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1G,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface SuaConfig {
2
+ provider: 'local' | 'temporal';
3
+ agentsDir: string;
4
+ dataDir: string;
5
+ mcpPort: number;
6
+ temporalAddress?: string;
7
+ temporalNamespace?: string;
8
+ temporalTaskQueue?: string;
9
+ }
10
+ export declare function loadConfig(): SuaConfig;
11
+ /**
12
+ * Resolve which provider to use. Env var SUA_PROVIDER wins over config.
13
+ * CLI --provider flag passed to commands wins over both (handled per-command).
14
+ */
15
+ export declare function resolveProvider(config: SuaConfig, override?: string): 'local' | 'temporal';
16
+ export declare function getAgentDirs(config: SuaConfig): {
17
+ runnable: string[];
18
+ catalog: string[];
19
+ };
20
+ export declare function getDbPath(config: SuaConfig): string;
21
+ export declare function getSecretsPath(config: SuaConfig): string;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAYD,wBAAgB,UAAU,IAAI,SAAS,CAatC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAM1F;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAMzF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAExD"}
package/dist/config.js ADDED
@@ -0,0 +1,50 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ const DEFAULT_CONFIG = {
4
+ provider: 'local',
5
+ agentsDir: './agents',
6
+ dataDir: './data',
7
+ mcpPort: 3003,
8
+ temporalAddress: 'localhost:7233',
9
+ temporalNamespace: 'default',
10
+ temporalTaskQueue: 'sua-agents',
11
+ };
12
+ export function loadConfig() {
13
+ const configPath = join(process.cwd(), 'sua.config.json');
14
+ if (!existsSync(configPath)) {
15
+ return DEFAULT_CONFIG;
16
+ }
17
+ try {
18
+ const raw = readFileSync(configPath, 'utf-8');
19
+ const parsed = JSON.parse(raw);
20
+ return { ...DEFAULT_CONFIG, ...parsed };
21
+ }
22
+ catch {
23
+ return DEFAULT_CONFIG;
24
+ }
25
+ }
26
+ /**
27
+ * Resolve which provider to use. Env var SUA_PROVIDER wins over config.
28
+ * CLI --provider flag passed to commands wins over both (handled per-command).
29
+ */
30
+ export function resolveProvider(config, override) {
31
+ const choice = override ?? process.env.SUA_PROVIDER ?? config.provider;
32
+ if (choice !== 'local' && choice !== 'temporal') {
33
+ throw new Error(`Invalid provider "${choice}". Must be "local" or "temporal".`);
34
+ }
35
+ return choice;
36
+ }
37
+ export function getAgentDirs(config) {
38
+ const base = resolve(config.agentsDir);
39
+ return {
40
+ runnable: [join(base, 'examples'), join(base, 'local')],
41
+ catalog: [join(base, 'community')],
42
+ };
43
+ }
44
+ export function getDbPath(config) {
45
+ return join(resolve(config.dataDir), 'runs.db');
46
+ }
47
+ export function getSecretsPath(config) {
48
+ return join(resolve(config.dataDir), 'secrets.enc');
49
+ }
50
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAY1C,MAAM,cAAc,GAAc;IAChC,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,UAAU;IACrB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,gBAAgB;IACjC,iBAAiB,EAAE,SAAS;IAC5B,iBAAiB,EAAE,YAAY;CAChC,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,QAAiB;IAClE,MAAM,MAAM,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC;IACvE,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,mCAAmC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO;QACL,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAiB;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { listCommand } from './commands/list.js';
4
+ import { runCommand } from './commands/run.js';
5
+ import { statusCommand } from './commands/status.js';
6
+ import { logsCommand } from './commands/logs.js';
7
+ import { cancelCommand } from './commands/cancel.js';
8
+ import { initCommand } from './commands/init.js';
9
+ import { doctorCommand } from './commands/doctor.js';
10
+ import { mcpCommand } from './commands/mcp.js';
11
+ import { secretsCommand } from './commands/secrets.js';
12
+ import { workerCommand } from './commands/worker.js';
13
+ const program = new Command();
14
+ program
15
+ .name('sua')
16
+ .description('some-useful-agents — a local-first agent playground')
17
+ .version('0.1.0');
18
+ const agent = program
19
+ .command('agent')
20
+ .description('Manage and run agents');
21
+ agent.addCommand(listCommand);
22
+ agent.addCommand(runCommand);
23
+ agent.addCommand(statusCommand);
24
+ agent.addCommand(logsCommand);
25
+ agent.addCommand(cancelCommand);
26
+ program.addCommand(initCommand);
27
+ program.addCommand(doctorCommand);
28
+ program.addCommand(mcpCommand);
29
+ program.addCommand(secretsCommand);
30
+ program.addCommand(workerCommand);
31
+ program.parse();
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,MAAM,KAAK,GAAG,OAAO;KAClB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uBAAuB,CAAC,CAAC;AAExC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAC9B,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC7B,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAChC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAC9B,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAEhC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from '@some-useful-agents/core';
2
+ import type { SuaConfig } from './config.js';
3
+ export declare function createProvider(config: SuaConfig, override?: string): Promise<Provider>;
4
+ //# sourceMappingURL=provider-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.d.ts","sourceRoot":"","sources":["../src/provider-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqB5F"}
@@ -0,0 +1,23 @@
1
+ import { LocalProvider, EncryptedFileStore } from '@some-useful-agents/core';
2
+ import { getDbPath, getSecretsPath, resolveProvider } from './config.js';
3
+ export async function createProvider(config, override) {
4
+ const kind = resolveProvider(config, override);
5
+ const secretsStore = new EncryptedFileStore(getSecretsPath(config));
6
+ if (kind === 'local') {
7
+ const provider = new LocalProvider(getDbPath(config), secretsStore);
8
+ await provider.initialize();
9
+ return provider;
10
+ }
11
+ // Dynamic import to avoid loading Temporal SDK when not needed
12
+ const { TemporalProvider } = await import('@some-useful-agents/temporal-provider');
13
+ const provider = new TemporalProvider({
14
+ dbPath: getDbPath(config),
15
+ secretsPath: getSecretsPath(config),
16
+ address: config.temporalAddress,
17
+ namespace: config.temporalNamespace,
18
+ taskQueue: config.temporalTaskQueue,
19
+ });
20
+ await provider.initialize();
21
+ return provider;
22
+ }
23
+ //# sourceMappingURL=provider-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../src/provider-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAiB,EAAE,QAAiB;IACvE,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;QACpE,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,+DAA+D;IAC/D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC;QACpC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;QACzB,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,MAAM,CAAC,eAAe;QAC/B,SAAS,EAAE,MAAM,CAAC,iBAAiB;QACnC,SAAS,EAAE,MAAM,CAAC,iBAAiB;KACpC,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@some-useful-agents/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for some-useful-agents",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "sua": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "clean": "rm -rf dist"
13
+ },
14
+ "dependencies": {
15
+ "@some-useful-agents/core": "*",
16
+ "@some-useful-agents/mcp-server": "*",
17
+ "@some-useful-agents/temporal-provider": "*",
18
+ "commander": "^13.1.0",
19
+ "chalk": "^5.4.0",
20
+ "ora": "^8.2.0",
21
+ "cli-table3": "^0.6.5"
22
+ },
23
+ "devDependencies": {
24
+ "typescript": "^5.8.0"
25
+ },
26
+ "license": "MIT",
27
+ "type": "module",
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "LICENSE"
35
+ ]
36
+ }