suzi-cli 0.1.4 → 0.1.5
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/commands/env.d.ts +3 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +295 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +113 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/share.d.ts +3 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +233 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/history.d.ts +11 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +94 -0
- package/dist/lib/history.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6QzD"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerEnvCommand = registerEnvCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
10
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
11
|
+
const api_1 = require("../lib/api");
|
|
12
|
+
const ui_1 = require("../utils/ui");
|
|
13
|
+
const NAME_REGEX = /^[A-Z][A-Z0-9_]*$/;
|
|
14
|
+
function withSpinner(spinner, fn) {
|
|
15
|
+
return fn().catch((err) => {
|
|
16
|
+
spinner.fail();
|
|
17
|
+
(0, ui_1.error)(err.message || 'An unexpected error occurred.');
|
|
18
|
+
throw err;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function formatDate(iso) {
|
|
22
|
+
const d = new Date(iso);
|
|
23
|
+
return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
|
|
24
|
+
}
|
|
25
|
+
function displayTable(vars) {
|
|
26
|
+
const table = new cli_table3_1.default({
|
|
27
|
+
head: [
|
|
28
|
+
chalk_1.default.gray('Name'),
|
|
29
|
+
chalk_1.default.gray('Scope'),
|
|
30
|
+
chalk_1.default.gray('Created'),
|
|
31
|
+
],
|
|
32
|
+
style: { head: [], border: ['gray'] },
|
|
33
|
+
});
|
|
34
|
+
for (const v of vars) {
|
|
35
|
+
table.push([
|
|
36
|
+
chalk_1.default.bold(v.name),
|
|
37
|
+
v.agentId ? `Agent ${v.agentId.slice(0, 8)}...` : 'User',
|
|
38
|
+
formatDate(v.createdAt),
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
console.log(table.toString());
|
|
42
|
+
}
|
|
43
|
+
async function fetchEnvVars(agentId) {
|
|
44
|
+
const path = agentId ? `/api/env-vars/agent/${agentId}` : '/api/env-vars';
|
|
45
|
+
const resp = await (0, api_1.get)(path);
|
|
46
|
+
if (!resp.ok) {
|
|
47
|
+
(0, ui_1.error)(`Failed to fetch environment variables: ${resp.data?.error || resp.status}`);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return resp.data.envVars || [];
|
|
51
|
+
}
|
|
52
|
+
function registerEnvCommand(program) {
|
|
53
|
+
const env = program
|
|
54
|
+
.command('env')
|
|
55
|
+
.description('Manage environment variables');
|
|
56
|
+
// suzi env (bare) — interactive mode
|
|
57
|
+
env.action(async () => {
|
|
58
|
+
if (!(0, ui_1.requireAuth)())
|
|
59
|
+
return;
|
|
60
|
+
const spinner = (0, ora_1.default)('Fetching environment variables...').start();
|
|
61
|
+
try {
|
|
62
|
+
const vars = await withSpinner(spinner, () => fetchEnvVars());
|
|
63
|
+
spinner.stop();
|
|
64
|
+
if (vars === null)
|
|
65
|
+
return;
|
|
66
|
+
(0, ui_1.header)('Environment Variables');
|
|
67
|
+
console.log();
|
|
68
|
+
if (vars.length > 0) {
|
|
69
|
+
displayTable(vars);
|
|
70
|
+
console.log();
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
(0, ui_1.info)('No environment variables set.');
|
|
74
|
+
console.log();
|
|
75
|
+
}
|
|
76
|
+
// Interactive menu
|
|
77
|
+
const { action } = await inquirer_1.default.prompt([
|
|
78
|
+
{
|
|
79
|
+
type: 'list',
|
|
80
|
+
name: 'action',
|
|
81
|
+
message: 'What would you like to do?',
|
|
82
|
+
choices: [
|
|
83
|
+
{ name: 'Set a variable', value: 'set' },
|
|
84
|
+
{ name: 'Remove a variable', value: 'remove' },
|
|
85
|
+
new inquirer_1.default.Separator(),
|
|
86
|
+
{ name: chalk_1.default.gray('Done'), value: 'done' },
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
]);
|
|
90
|
+
if (action === 'done')
|
|
91
|
+
return;
|
|
92
|
+
if (action === 'set') {
|
|
93
|
+
const { name } = await inquirer_1.default.prompt([
|
|
94
|
+
{
|
|
95
|
+
type: 'input',
|
|
96
|
+
name: 'name',
|
|
97
|
+
message: 'Variable name (e.g. MY_API_KEY):',
|
|
98
|
+
validate: (input) => {
|
|
99
|
+
if (!NAME_REGEX.test(input)) {
|
|
100
|
+
return 'Must start with A-Z and contain only A-Z, 0-9, _ (e.g. MY_API_KEY)';
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
]);
|
|
106
|
+
const { value } = await inquirer_1.default.prompt([
|
|
107
|
+
{
|
|
108
|
+
type: 'password',
|
|
109
|
+
name: 'value',
|
|
110
|
+
message: `Value for ${chalk_1.default.bold(name)}:`,
|
|
111
|
+
mask: '*',
|
|
112
|
+
validate: (input) => input.length > 0 || 'Value cannot be empty',
|
|
113
|
+
},
|
|
114
|
+
]);
|
|
115
|
+
const { agentId } = await inquirer_1.default.prompt([
|
|
116
|
+
{
|
|
117
|
+
type: 'input',
|
|
118
|
+
name: 'agentId',
|
|
119
|
+
message: 'Agent ID (leave empty for user-level):',
|
|
120
|
+
},
|
|
121
|
+
]);
|
|
122
|
+
const body = { name, value };
|
|
123
|
+
if (agentId.trim())
|
|
124
|
+
body.agentId = agentId.trim();
|
|
125
|
+
const setSpinner = (0, ora_1.default)(`Setting ${name}...`).start();
|
|
126
|
+
const resp = await withSpinner(setSpinner, () => (0, api_1.post)('/api/env-vars', body));
|
|
127
|
+
setSpinner.stop();
|
|
128
|
+
if (!resp.ok) {
|
|
129
|
+
(0, ui_1.error)(`Failed to set variable: ${resp.data?.error || resp.status}`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
(0, ui_1.success)(`Set ${chalk_1.default.bold(name)}${body.agentId ? ` for agent ${body.agentId.slice(0, 8)}...` : ''}`);
|
|
133
|
+
}
|
|
134
|
+
if (action === 'remove') {
|
|
135
|
+
if (vars.length === 0) {
|
|
136
|
+
(0, ui_1.info)('No variables to remove.');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const { selected } = await inquirer_1.default.prompt([
|
|
140
|
+
{
|
|
141
|
+
type: 'list',
|
|
142
|
+
name: 'selected',
|
|
143
|
+
message: 'Select a variable to remove:',
|
|
144
|
+
choices: [
|
|
145
|
+
...vars.map(v => ({
|
|
146
|
+
name: `${v.name}${v.agentId ? ` (agent ${v.agentId.slice(0, 8)}...)` : ''}`,
|
|
147
|
+
value: v,
|
|
148
|
+
})),
|
|
149
|
+
new inquirer_1.default.Separator(),
|
|
150
|
+
{ name: chalk_1.default.gray('Cancel'), value: null },
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
]);
|
|
154
|
+
if (!selected)
|
|
155
|
+
return;
|
|
156
|
+
const { confirmed } = await inquirer_1.default.prompt([
|
|
157
|
+
{
|
|
158
|
+
type: 'confirm',
|
|
159
|
+
name: 'confirmed',
|
|
160
|
+
message: `Remove ${chalk_1.default.bold(selected.name)}? This cannot be undone.`,
|
|
161
|
+
default: false,
|
|
162
|
+
},
|
|
163
|
+
]);
|
|
164
|
+
if (!confirmed) {
|
|
165
|
+
(0, ui_1.info)('Cancelled.');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const delSpinner = (0, ora_1.default)(`Removing ${selected.name}...`).start();
|
|
169
|
+
const resp = await withSpinner(delSpinner, () => (0, api_1.del)(`/api/env-vars/${selected.id}`));
|
|
170
|
+
delSpinner.stop();
|
|
171
|
+
if (!resp.ok) {
|
|
172
|
+
(0, ui_1.error)(`Failed to remove variable: ${resp.data?.error || resp.status}`);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
(0, ui_1.success)(`Removed ${chalk_1.default.bold(selected.name)}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// Error already displayed by withSpinner
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// suzi env list [--agent <id>]
|
|
183
|
+
env
|
|
184
|
+
.command('list')
|
|
185
|
+
.description('List environment variable names')
|
|
186
|
+
.option('-a, --agent <id>', 'Scope to a specific agent')
|
|
187
|
+
.action(async (opts) => {
|
|
188
|
+
if (!(0, ui_1.requireAuth)())
|
|
189
|
+
return;
|
|
190
|
+
const spinner = (0, ora_1.default)('Fetching environment variables...').start();
|
|
191
|
+
try {
|
|
192
|
+
const vars = await withSpinner(spinner, () => fetchEnvVars(opts.agent));
|
|
193
|
+
spinner.stop();
|
|
194
|
+
if (vars === null)
|
|
195
|
+
return;
|
|
196
|
+
if (vars.length === 0) {
|
|
197
|
+
(0, ui_1.info)('No environment variables found.');
|
|
198
|
+
(0, ui_1.info)('Set one with `suzi env set MY_KEY`.');
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
(0, ui_1.header)(opts.agent ? `Environment Variables (Agent ${opts.agent.slice(0, 8)}...)` : 'Environment Variables');
|
|
202
|
+
console.log();
|
|
203
|
+
displayTable(vars);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Error already displayed by withSpinner
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
// suzi env set <KEY> [--agent <id>]
|
|
210
|
+
env
|
|
211
|
+
.command('set <key>')
|
|
212
|
+
.description('Set an environment variable (prompts for value)')
|
|
213
|
+
.option('-a, --agent <id>', 'Scope to a specific agent')
|
|
214
|
+
.action(async (key, opts) => {
|
|
215
|
+
if (!(0, ui_1.requireAuth)())
|
|
216
|
+
return;
|
|
217
|
+
if (!NAME_REGEX.test(key)) {
|
|
218
|
+
(0, ui_1.error)('Invalid variable name. Must start with A-Z and contain only A-Z, 0-9, _ (e.g. MY_API_KEY)');
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const { value } = await inquirer_1.default.prompt([
|
|
222
|
+
{
|
|
223
|
+
type: 'password',
|
|
224
|
+
name: 'value',
|
|
225
|
+
message: `Value for ${chalk_1.default.bold(key)}:`,
|
|
226
|
+
mask: '*',
|
|
227
|
+
validate: (input) => input.length > 0 || 'Value cannot be empty',
|
|
228
|
+
},
|
|
229
|
+
]);
|
|
230
|
+
const body = { name: key, value };
|
|
231
|
+
if (opts.agent)
|
|
232
|
+
body.agentId = opts.agent;
|
|
233
|
+
const spinner = (0, ora_1.default)(`Setting ${key}...`).start();
|
|
234
|
+
try {
|
|
235
|
+
const resp = await withSpinner(spinner, () => (0, api_1.post)('/api/env-vars', body));
|
|
236
|
+
spinner.stop();
|
|
237
|
+
if (!resp.ok) {
|
|
238
|
+
(0, ui_1.error)(`Failed to set variable: ${resp.data?.error || resp.status}`);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
(0, ui_1.success)(`Set ${chalk_1.default.bold(key)}${opts.agent ? ` for agent ${opts.agent.slice(0, 8)}...` : ''}`);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// Error already displayed by withSpinner
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
// suzi env remove <KEY> [--agent <id>]
|
|
248
|
+
env
|
|
249
|
+
.command('remove <key>')
|
|
250
|
+
.description('Remove an environment variable')
|
|
251
|
+
.option('-a, --agent <id>', 'Scope to a specific agent')
|
|
252
|
+
.action(async (key, opts) => {
|
|
253
|
+
if (!(0, ui_1.requireAuth)())
|
|
254
|
+
return;
|
|
255
|
+
const spinner = (0, ora_1.default)('Fetching environment variables...').start();
|
|
256
|
+
try {
|
|
257
|
+
const vars = await withSpinner(spinner, () => fetchEnvVars(opts.agent));
|
|
258
|
+
spinner.stop();
|
|
259
|
+
if (vars === null)
|
|
260
|
+
return;
|
|
261
|
+
const match = vars.find(v => v.name === key);
|
|
262
|
+
if (!match) {
|
|
263
|
+
(0, ui_1.error)(`Variable "${key}" not found.`);
|
|
264
|
+
if (vars.length > 0) {
|
|
265
|
+
(0, ui_1.info)(`Available variables: ${vars.map(v => v.name).join(', ')}`);
|
|
266
|
+
}
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const { confirmed } = await inquirer_1.default.prompt([
|
|
270
|
+
{
|
|
271
|
+
type: 'confirm',
|
|
272
|
+
name: 'confirmed',
|
|
273
|
+
message: `Remove ${chalk_1.default.bold(key)}? This cannot be undone.`,
|
|
274
|
+
default: false,
|
|
275
|
+
},
|
|
276
|
+
]);
|
|
277
|
+
if (!confirmed) {
|
|
278
|
+
(0, ui_1.info)('Cancelled.');
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
const delSpinner = (0, ora_1.default)(`Removing ${key}...`).start();
|
|
282
|
+
const resp = await withSpinner(delSpinner, () => (0, api_1.del)(`/api/env-vars/${match.id}`));
|
|
283
|
+
delSpinner.stop();
|
|
284
|
+
if (!resp.ok) {
|
|
285
|
+
(0, ui_1.error)(`Failed to remove variable: ${resp.data?.error || resp.status}`);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
(0, ui_1.success)(`Removed ${chalk_1.default.bold(key)}`);
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Error already displayed by withSpinner
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyDpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkE9D"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerFeedbackCommand = registerFeedbackCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const readline_1 = __importDefault(require("readline"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const api_1 = require("../lib/api");
|
|
12
|
+
const history_1 = require("../lib/history");
|
|
13
|
+
const ui_1 = require("../utils/ui");
|
|
14
|
+
const pkg = require('../../package.json');
|
|
15
|
+
const CATEGORIES = [
|
|
16
|
+
{ name: `${ui_1.colors.error('●')} Bug Report`, value: 'bug' },
|
|
17
|
+
{ name: `${ui_1.colors.warning('●')} Feature Request`, value: 'feature' },
|
|
18
|
+
{ name: `${ui_1.colors.secondary('●')} General Feedback`, value: 'general' },
|
|
19
|
+
];
|
|
20
|
+
function collectMultiLineInput() {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const lines = [];
|
|
23
|
+
let hasContent = false;
|
|
24
|
+
console.log(ui_1.colors.muted(' Type your message below. Press Enter twice to submit (or Ctrl+D).'));
|
|
25
|
+
console.log();
|
|
26
|
+
const rl = readline_1.default.createInterface({
|
|
27
|
+
input: process.stdin,
|
|
28
|
+
output: process.stdout,
|
|
29
|
+
prompt: ' ',
|
|
30
|
+
});
|
|
31
|
+
rl.prompt();
|
|
32
|
+
rl.on('line', (line) => {
|
|
33
|
+
if (line.trim() === '' && hasContent) {
|
|
34
|
+
// Empty line after content: submit
|
|
35
|
+
rl.close();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (line.trim() !== '') {
|
|
39
|
+
hasContent = true;
|
|
40
|
+
}
|
|
41
|
+
lines.push(line);
|
|
42
|
+
rl.prompt();
|
|
43
|
+
});
|
|
44
|
+
rl.on('close', () => {
|
|
45
|
+
// Trim trailing empty lines
|
|
46
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === '') {
|
|
47
|
+
lines.pop();
|
|
48
|
+
}
|
|
49
|
+
resolve(lines.join('\n'));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function registerFeedbackCommand(program) {
|
|
54
|
+
program
|
|
55
|
+
.command('feedback')
|
|
56
|
+
.description('Send feedback to the Suzi team')
|
|
57
|
+
.option('-c, --category <category>', 'Feedback category (bug, feature, general)')
|
|
58
|
+
.option('-m, --message <message>', 'Feedback message (non-interactive)')
|
|
59
|
+
.action(async (opts) => {
|
|
60
|
+
if (!(0, ui_1.requireAuth)())
|
|
61
|
+
return;
|
|
62
|
+
(0, ui_1.header)('Send Feedback');
|
|
63
|
+
let category;
|
|
64
|
+
let message;
|
|
65
|
+
// Category selection
|
|
66
|
+
if (opts.category && ['bug', 'feature', 'general'].includes(opts.category)) {
|
|
67
|
+
category = opts.category;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const answer = await inquirer_1.default.prompt([
|
|
71
|
+
{
|
|
72
|
+
type: 'list',
|
|
73
|
+
name: 'category',
|
|
74
|
+
message: 'What type of feedback?',
|
|
75
|
+
choices: CATEGORIES,
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
category = answer.category;
|
|
79
|
+
}
|
|
80
|
+
// Message input
|
|
81
|
+
if (opts.message) {
|
|
82
|
+
message = opts.message;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log();
|
|
86
|
+
message = await collectMultiLineInput();
|
|
87
|
+
}
|
|
88
|
+
if (!message.trim()) {
|
|
89
|
+
(0, ui_1.error)('Feedback message cannot be empty.');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
console.log();
|
|
93
|
+
const spinner = (0, ora_1.default)('Sending feedback...').start();
|
|
94
|
+
const resp = await (0, api_1.post)('/api/feedback', {
|
|
95
|
+
category,
|
|
96
|
+
message: message.trim(),
|
|
97
|
+
cliHistory: (0, history_1.getRecentHistory)(20),
|
|
98
|
+
cliVersion: pkg.version,
|
|
99
|
+
platform: `${os_1.default.platform()} ${os_1.default.release()}`,
|
|
100
|
+
nodeVersion: process.version,
|
|
101
|
+
});
|
|
102
|
+
if (!resp.ok) {
|
|
103
|
+
spinner.fail();
|
|
104
|
+
(0, ui_1.error)(`Failed to send feedback: ${resp.data?.message || resp.data?.error || 'Unknown error'}`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
spinner.succeed('Feedback sent!');
|
|
108
|
+
console.log();
|
|
109
|
+
(0, ui_1.success)('Thank you for your feedback! The Suzi team will review it.');
|
|
110
|
+
console.log();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsP3D"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerShareCommand = registerShareCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
10
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
+
const api_1 = require("../lib/api");
|
|
12
|
+
const ui_1 = require("../utils/ui");
|
|
13
|
+
function registerShareCommand(program) {
|
|
14
|
+
const share = program
|
|
15
|
+
.command('share')
|
|
16
|
+
.description('Share and manage shared agents');
|
|
17
|
+
// suzi share create [agentId] — create a shareable snapshot
|
|
18
|
+
share
|
|
19
|
+
.command('create [agentId]')
|
|
20
|
+
.description('Create a shareable link for an agent')
|
|
21
|
+
.option('-s, --slug <slug>', 'Custom slug for the share URL')
|
|
22
|
+
.option('-e, --expires <days>', 'Expiry in days')
|
|
23
|
+
.action(async (agentId, opts) => {
|
|
24
|
+
if (!(0, ui_1.requireAuth)())
|
|
25
|
+
return;
|
|
26
|
+
// If no agentId provided, fetch agents and let user pick
|
|
27
|
+
if (!agentId) {
|
|
28
|
+
const listSpinner = (0, ora_1.default)('Loading agents...').start();
|
|
29
|
+
let listResp;
|
|
30
|
+
try {
|
|
31
|
+
listResp = await (0, api_1.get)('/api/agent?limit=50');
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
listSpinner.fail();
|
|
35
|
+
(0, ui_1.error)(`Network error: ${err.message}`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!listResp.ok) {
|
|
39
|
+
listSpinner.fail();
|
|
40
|
+
(0, ui_1.error)(`Failed to load agents: ${listResp.data?.error || 'Unknown error'}`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
listSpinner.stop();
|
|
44
|
+
const agents = listResp.data.agents || [];
|
|
45
|
+
if (agents.length === 0) {
|
|
46
|
+
(0, ui_1.info)('No agents found. Create one with `suzi deploy <file>`.');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const { selected } = await inquirer_1.default.prompt([
|
|
50
|
+
{
|
|
51
|
+
type: 'list',
|
|
52
|
+
name: 'selected',
|
|
53
|
+
message: 'Which agent do you want to share?',
|
|
54
|
+
choices: agents.map((a) => ({
|
|
55
|
+
name: `${a.title || 'Untitled'} ${ui_1.colors.muted(`(${a.id.slice(0, 8)}...)`)}`,
|
|
56
|
+
value: a.id,
|
|
57
|
+
})),
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
agentId = selected;
|
|
61
|
+
}
|
|
62
|
+
const body = {};
|
|
63
|
+
if (opts.slug)
|
|
64
|
+
body.customSlug = opts.slug;
|
|
65
|
+
if (opts.expires) {
|
|
66
|
+
const days = parseInt(opts.expires, 10);
|
|
67
|
+
if (isNaN(days) || days < 1) {
|
|
68
|
+
(0, ui_1.error)('--expires must be a positive number of days.');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
body.expiresInDays = days;
|
|
72
|
+
}
|
|
73
|
+
const spinner = (0, ora_1.default)('Creating share link...').start();
|
|
74
|
+
let resp;
|
|
75
|
+
try {
|
|
76
|
+
resp = await (0, api_1.post)(`/api/agent/${encodeURIComponent(agentId)}/share`, body);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
spinner.fail();
|
|
80
|
+
(0, ui_1.error)(`Network error: ${err.message}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!resp.ok) {
|
|
84
|
+
spinner.fail();
|
|
85
|
+
(0, ui_1.error)(`Failed to share: ${resp.data?.message || resp.data?.error || 'Unknown error'}`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const snapshot = resp.data?.snapshot;
|
|
89
|
+
if (!snapshot) {
|
|
90
|
+
spinner.fail('Share created but returned no snapshot data.');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
spinner.succeed('Share link created!');
|
|
94
|
+
console.log();
|
|
95
|
+
(0, ui_1.label)('Slug', snapshot.slug);
|
|
96
|
+
if (snapshot.expiresAt) {
|
|
97
|
+
(0, ui_1.label)('Expires', new Date(snapshot.expiresAt).toLocaleString());
|
|
98
|
+
}
|
|
99
|
+
console.log();
|
|
100
|
+
(0, ui_1.divider)();
|
|
101
|
+
(0, ui_1.info)(`Import with: suzi import ${snapshot.slug}`);
|
|
102
|
+
});
|
|
103
|
+
// suzi share list — list user's shared agents
|
|
104
|
+
share
|
|
105
|
+
.command('list')
|
|
106
|
+
.alias('ls')
|
|
107
|
+
.description('List your shared agents')
|
|
108
|
+
.action(async () => {
|
|
109
|
+
if (!(0, ui_1.requireAuth)())
|
|
110
|
+
return;
|
|
111
|
+
const spinner = (0, ora_1.default)('Loading shared agents...').start();
|
|
112
|
+
let resp;
|
|
113
|
+
try {
|
|
114
|
+
resp = await (0, api_1.get)('/api/agent/shared');
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
spinner.fail();
|
|
118
|
+
(0, ui_1.error)(`Network error: ${err.message}`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (!resp.ok) {
|
|
122
|
+
spinner.fail();
|
|
123
|
+
(0, ui_1.error)(`Failed to load shares: ${resp.data?.message || resp.data?.error || 'Unknown error'}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
spinner.stop();
|
|
127
|
+
const snapshots = resp.data?.snapshots || [];
|
|
128
|
+
if (snapshots.length === 0) {
|
|
129
|
+
(0, ui_1.header)('Shared Agents');
|
|
130
|
+
console.log();
|
|
131
|
+
(0, ui_1.info)('No shared agents. Share one with `suzi share create <agentId>`.');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
(0, ui_1.header)(`Shared Agents (${snapshots.length})`);
|
|
135
|
+
console.log();
|
|
136
|
+
const table = new cli_table3_1.default({
|
|
137
|
+
head: [
|
|
138
|
+
chalk_1.default.gray('Slug'),
|
|
139
|
+
chalk_1.default.gray('Title'),
|
|
140
|
+
chalk_1.default.gray('Clones'),
|
|
141
|
+
chalk_1.default.gray('Active'),
|
|
142
|
+
chalk_1.default.gray('Created'),
|
|
143
|
+
],
|
|
144
|
+
style: { head: [], border: ['gray'] },
|
|
145
|
+
});
|
|
146
|
+
for (const snap of snapshots) {
|
|
147
|
+
table.push([
|
|
148
|
+
ui_1.colors.primary(snap.slug),
|
|
149
|
+
snap.title || 'Untitled',
|
|
150
|
+
String(snap.cloneCount || 0),
|
|
151
|
+
snap.isActive ? chalk_1.default.green('yes') : chalk_1.default.red('no'),
|
|
152
|
+
ui_1.colors.muted(new Date(snap.createdAt).toLocaleDateString()),
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
155
|
+
console.log(table.toString());
|
|
156
|
+
});
|
|
157
|
+
// suzi share update <agentId> — publish a new version
|
|
158
|
+
share
|
|
159
|
+
.command('update <agentId>')
|
|
160
|
+
.description('Publish a new version of a shared agent')
|
|
161
|
+
.requiredOption('--slug <slug>', 'Slug of the share to update')
|
|
162
|
+
.action(async (agentId, opts) => {
|
|
163
|
+
if (!(0, ui_1.requireAuth)())
|
|
164
|
+
return;
|
|
165
|
+
const spinner = (0, ora_1.default)('Publishing update...').start();
|
|
166
|
+
let resp;
|
|
167
|
+
try {
|
|
168
|
+
resp = await (0, api_1.post)(`/api/agent/${encodeURIComponent(agentId)}/share/update`, { slug: opts.slug });
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
spinner.fail();
|
|
172
|
+
(0, ui_1.error)(`Network error: ${err.message}`);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (!resp.ok) {
|
|
176
|
+
spinner.fail();
|
|
177
|
+
(0, ui_1.error)(`Failed to publish update: ${resp.data?.message || resp.data?.error || 'Unknown error'}`);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const snapshot = resp.data?.snapshot;
|
|
181
|
+
if (!snapshot) {
|
|
182
|
+
spinner.fail('Update published but returned no snapshot data.');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
spinner.succeed('Update published!');
|
|
186
|
+
console.log();
|
|
187
|
+
(0, ui_1.label)('Slug', snapshot.slug);
|
|
188
|
+
(0, ui_1.label)('Version', String(snapshot.version));
|
|
189
|
+
(0, ui_1.label)('Created', new Date(snapshot.createdAt).toLocaleString());
|
|
190
|
+
console.log();
|
|
191
|
+
(0, ui_1.info)('Clones of this agent can now apply the update.');
|
|
192
|
+
});
|
|
193
|
+
// suzi share revoke <snapshotId> — deactivate a share
|
|
194
|
+
share
|
|
195
|
+
.command('revoke <snapshotId>')
|
|
196
|
+
.description('Revoke a shared agent snapshot')
|
|
197
|
+
.option('-f, --force', 'Skip confirmation')
|
|
198
|
+
.action(async (snapshotId, opts) => {
|
|
199
|
+
if (!(0, ui_1.requireAuth)())
|
|
200
|
+
return;
|
|
201
|
+
if (!opts.force) {
|
|
202
|
+
const answers = await inquirer_1.default.prompt([
|
|
203
|
+
{
|
|
204
|
+
type: 'confirm',
|
|
205
|
+
name: 'confirm',
|
|
206
|
+
message: `Revoke share ${snapshotId.slice(0, 8)}...? This will prevent new clones.`,
|
|
207
|
+
default: false,
|
|
208
|
+
},
|
|
209
|
+
]);
|
|
210
|
+
if (!answers.confirm) {
|
|
211
|
+
(0, ui_1.info)('Cancelled.');
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const spinner = (0, ora_1.default)('Revoking share...').start();
|
|
216
|
+
let resp;
|
|
217
|
+
try {
|
|
218
|
+
resp = await (0, api_1.del)(`/api/share/${encodeURIComponent(snapshotId)}`);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
spinner.fail();
|
|
222
|
+
(0, ui_1.error)(`Network error: ${err.message}`);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (!resp.ok) {
|
|
226
|
+
spinner.fail();
|
|
227
|
+
(0, ui_1.error)(`Failed to revoke: ${resp.data?.message || resp.data?.error || 'Unknown error'}`);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
spinner.succeed('Share revoked.');
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":";;;;;AAQA,oDAsPC;AA7PD,kDAA0B;AAC1B,8CAAsB;AACtB,4DAA+B;AAC/B,wDAAgC;AAChC,oCAA4C;AAC5C,oCAAgG;AAEhG,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEjD,4DAA4D;IAC5D,KAAK;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;SAC5D,MAAM,CAAC,sBAAsB,EAAE,gBAAgB,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,IAAS,EAAE,EAAE;QACvD,IAAI,CAAC,IAAA,gBAAW,GAAE;YAAE,OAAO;QAE3B,yDAAyD;QACzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,WAAW,GAAG,IAAA,aAAG,EAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;YACrD,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAA,SAAG,EAAC,qBAAqB,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnB,IAAA,UAAK,EAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnB,IAAA,UAAK,EAAC,0BAA0B,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;gBAC3E,OAAO;YACT,CAAC;YACD,WAAW,CAAC,IAAI,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAA,SAAI,EAAC,wDAAwD,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACzC;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,mCAAmC;oBAC5C,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;wBAC/B,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,UAAU,KAAK,WAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE;wBAC7E,KAAK,EAAE,CAAC,CAAC,EAAE;qBACZ,CAAC,CAAC;iBACJ;aACF,CAAC,CAAC;YACH,OAAO,GAAG,QAAQ,CAAC;QACrB,CAAC;QAED,MAAM,IAAI,GAAQ,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAA,UAAK,EAAC,8CAA8C,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEtD,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAA,UAAI,EAAC,cAAc,kBAAkB,CAAC,OAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAA,UAAK,EAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,IAAA,UAAK,EAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAA,YAAO,GAAE,CAAC;QACV,IAAA,SAAI,EAAC,4BAA4B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEL,8CAA8C;IAC9C,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC,IAAA,gBAAW,GAAE;YAAE,OAAO;QAE3B,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QAExD,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAA,SAAG,EAAC,mBAAmB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;QAE7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAA,WAAM,EAAC,eAAe,CAAC,CAAC;YACxB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAA,SAAI,EAAC,iEAAiE,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,IAAA,WAAM,EAAC,kBAAkB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;YACtB,IAAI,EAAE;gBACJ,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClB,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC;gBACnB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;aACtB;YACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;SACtC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC;gBACT,WAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzB,IAAI,CAAC,KAAK,IAAI,UAAU;gBACxB,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC;gBACpD,WAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,sDAAsD;IACtD,KAAK;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,yCAAyC,CAAC;SACtD,cAAc,CAAC,eAAe,EAAE,6BAA6B,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAS,EAAE,EAAE;QAC3C,IAAI,CAAC,IAAA,gBAAW,GAAE;YAAE,OAAO;QAE3B,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEpD,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAA,UAAI,EAAC,cAAc,kBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,6BAA6B,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAA,UAAK,EAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAA,UAAK,EAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,IAAA,UAAK,EAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QAEhE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAA,SAAI,EAAC,gDAAgD,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,sDAAsD;IACtD,KAAK;SACF,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAAS,EAAE,EAAE;QAC9C,IAAI,CAAC,IAAA,gBAAW,GAAE;YAAE,OAAO;QAE3B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,gBAAgB,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,oCAAoC;oBACnF,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAA,SAAI,EAAC,YAAY,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjD,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAA,SAAG,EAAC,cAAc,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAA,UAAK,EAAC,qBAAqB,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YACxF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,14 +17,18 @@ const list_tools_1 = require("./commands/list-tools");
|
|
|
17
17
|
const agents_1 = require("./commands/agents");
|
|
18
18
|
const deploy_1 = require("./commands/deploy");
|
|
19
19
|
const import_1 = require("./commands/import");
|
|
20
|
+
const share_1 = require("./commands/share");
|
|
20
21
|
const subagents_1 = require("./commands/subagents");
|
|
21
22
|
const transactions_1 = require("./commands/transactions");
|
|
22
23
|
const prompt_suggestions_1 = require("./commands/prompt-suggestions");
|
|
23
24
|
const skills_1 = require("./commands/skills");
|
|
24
25
|
const create_1 = require("./commands/create");
|
|
25
26
|
const accounts_1 = require("./commands/accounts");
|
|
27
|
+
const feedback_1 = require("./commands/feedback");
|
|
28
|
+
const env_1 = require("./commands/env");
|
|
26
29
|
const ui_1 = require("./utils/ui");
|
|
27
30
|
const config_1 = require("./lib/config");
|
|
31
|
+
const history_1 = require("./lib/history");
|
|
28
32
|
const program = new commander_1.Command();
|
|
29
33
|
program
|
|
30
34
|
.name('suzi')
|
|
@@ -56,12 +60,15 @@ program
|
|
|
56
60
|
(0, agents_1.registerAgentsCommand)(program); // agents, agents view, agents activate, agents deactivate, agents execute, agents logs, agents delete
|
|
57
61
|
(0, deploy_1.registerDeployCommand)(program); // deploy
|
|
58
62
|
(0, import_1.registerImportCommand)(program); // import
|
|
63
|
+
(0, share_1.registerShareCommand)(program); // share, share list, share update, share revoke
|
|
59
64
|
(0, subagents_1.registerSubagentsCommand)(program); // subagents, subagents init, subagents validate
|
|
60
65
|
(0, transactions_1.registerTransactionsCommand)(program); // transactions / txns, tx-confirm
|
|
61
66
|
(0, prompt_suggestions_1.registerPromptSuggestions)(program); // suggest / help-me
|
|
62
67
|
(0, skills_1.registerSkillsCommand)(program); // skills, skills add
|
|
63
68
|
(0, create_1.registerCreateCommand)(program); // create
|
|
64
69
|
(0, accounts_1.registerAccountsCommand)(program); // accounts, accounts switch, accounts create, accounts rename, accounts delete
|
|
70
|
+
(0, feedback_1.registerFeedbackCommand)(program); // feedback
|
|
71
|
+
(0, env_1.registerEnvCommand)(program); // env, env set, env list, env remove
|
|
65
72
|
// Default action: show quick status + suggestions
|
|
66
73
|
program.action(() => {
|
|
67
74
|
console.log((0, ui_1.logo)());
|
|
@@ -99,9 +106,55 @@ program.action(() => {
|
|
|
99
106
|
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white('suzi deploy')} ${ui_1.colors.muted('Deploy an agent')}`);
|
|
100
107
|
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white('suzi list-tools')} ${ui_1.colors.muted('Browse available tools')}`);
|
|
101
108
|
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white('suzi suggest')} ${ui_1.colors.muted('Get command suggestions')}`);
|
|
109
|
+
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white('suzi feedback')} ${ui_1.colors.muted('Send feedback to the team')}`);
|
|
102
110
|
console.log();
|
|
103
111
|
(0, ui_1.info)('Run `suzi --help` for all commands.');
|
|
104
112
|
console.log();
|
|
105
113
|
});
|
|
114
|
+
// Track command history via Commander's public hook API
|
|
115
|
+
const historyState = { start: 0, command: '', args: [] };
|
|
116
|
+
const HISTORY_EXCLUDED_COMMANDS = new Set(['feedback']);
|
|
117
|
+
function attachHistoryHooks(cmd) {
|
|
118
|
+
for (const sub of cmd.commands) {
|
|
119
|
+
attachHistoryHooks(sub);
|
|
120
|
+
if (HISTORY_EXCLUDED_COMMANDS.has(sub.name()))
|
|
121
|
+
continue;
|
|
122
|
+
sub.hook('preAction', (thisCommand) => {
|
|
123
|
+
historyState.start = Date.now();
|
|
124
|
+
const parts = [];
|
|
125
|
+
let c = thisCommand;
|
|
126
|
+
while (c && c !== program) {
|
|
127
|
+
parts.unshift(c.name());
|
|
128
|
+
c = c.parent;
|
|
129
|
+
}
|
|
130
|
+
historyState.command = parts.join(' ');
|
|
131
|
+
historyState.args = process.argv.slice(2).filter((a) => !a.startsWith('-'));
|
|
132
|
+
});
|
|
133
|
+
sub.hook('postAction', () => {
|
|
134
|
+
(0, history_1.appendHistory)({
|
|
135
|
+
command: historyState.command,
|
|
136
|
+
args: historyState.args,
|
|
137
|
+
status: 'success',
|
|
138
|
+
durationMs: Date.now() - historyState.start,
|
|
139
|
+
timestamp: new Date().toISOString(),
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
attachHistoryHooks(program);
|
|
145
|
+
// Catch unhandled errors from async actions to record failures
|
|
146
|
+
process.on('uncaughtException', (err) => {
|
|
147
|
+
if (historyState.start > 0) {
|
|
148
|
+
(0, history_1.appendHistory)({
|
|
149
|
+
command: historyState.command,
|
|
150
|
+
args: historyState.args,
|
|
151
|
+
status: 'error',
|
|
152
|
+
durationMs: Date.now() - historyState.start,
|
|
153
|
+
errorOutput: String(err?.message || err),
|
|
154
|
+
timestamp: new Date().toISOString(),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
throw err;
|
|
158
|
+
});
|
|
106
159
|
program.parse(process.argv);
|
|
107
160
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,sEAA6C;AAE7C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACvC,IAAA,yBAAc,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEjC,4CAAwD;AACxD,8CAA0D;AAC1D,oDAAgE;AAChE,wDAAoE;AACpE,sDAAiE;AACjE,8CAA0D;AAC1D,8CAA0D;AAC1D,8CAA0D;AAC1D,oDAAgE;AAChE,0DAAsE;AACtE,sEAA0E;AAC1E,8CAA0D;AAC1D,8CAA0D;AAC1D,kDAA8D;AAC9D,mCAAyD;AACzD,yCAAuE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface HistoryEntry {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
status: 'success' | 'error';
|
|
5
|
+
durationMs: number;
|
|
6
|
+
errorOutput?: string;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function appendHistory(entry: HistoryEntry): void;
|
|
10
|
+
export declare function getRecentHistory(count?: number): HistoryEntry[];
|
|
11
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwDD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAqBvD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE,CAOnE"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.appendHistory = appendHistory;
|
|
7
|
+
exports.getRecentHistory = getRecentHistory;
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.suzi');
|
|
12
|
+
const HISTORY_PATH = path_1.default.join(CONFIG_DIR, 'history.json');
|
|
13
|
+
const MAX_ENTRIES = 100;
|
|
14
|
+
const MAX_ERROR_LENGTH = 500;
|
|
15
|
+
const SENSITIVE_PATTERN = /^--.*(token|key|secret|password|auth|credential|private)/i;
|
|
16
|
+
const JWT_PATTERN = /eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g;
|
|
17
|
+
function sanitizeArgs(args) {
|
|
18
|
+
const sanitized = [];
|
|
19
|
+
let redactNext = false;
|
|
20
|
+
for (const arg of args) {
|
|
21
|
+
if (redactNext) {
|
|
22
|
+
sanitized.push('<REDACTED>');
|
|
23
|
+
redactNext = false;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (SENSITIVE_PATTERN.test(arg)) {
|
|
27
|
+
if (arg.includes('=')) {
|
|
28
|
+
sanitized.push(arg.split('=')[0] + '=<REDACTED>');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
sanitized.push(arg);
|
|
32
|
+
redactNext = true;
|
|
33
|
+
}
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
sanitized.push(arg.replace(JWT_PATTERN, '<TOKEN>'));
|
|
37
|
+
}
|
|
38
|
+
return sanitized;
|
|
39
|
+
}
|
|
40
|
+
function readHistory() {
|
|
41
|
+
try {
|
|
42
|
+
if (fs_1.default.existsSync(HISTORY_PATH)) {
|
|
43
|
+
const raw = fs_1.default.readFileSync(HISTORY_PATH, 'utf-8');
|
|
44
|
+
const parsed = JSON.parse(raw);
|
|
45
|
+
if (Array.isArray(parsed))
|
|
46
|
+
return parsed;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Corrupted file — start fresh
|
|
51
|
+
}
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
function writeHistory(entries) {
|
|
55
|
+
try {
|
|
56
|
+
if (!fs_1.default.existsSync(CONFIG_DIR)) {
|
|
57
|
+
fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
fs_1.default.writeFileSync(HISTORY_PATH, JSON.stringify(entries, null, 2));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Silent failure — never break CLI commands
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function appendHistory(entry) {
|
|
66
|
+
try {
|
|
67
|
+
const history = readHistory();
|
|
68
|
+
// Sanitize before storing
|
|
69
|
+
const sanitized = {
|
|
70
|
+
...entry,
|
|
71
|
+
args: sanitizeArgs(entry.args),
|
|
72
|
+
errorOutput: entry.errorOutput
|
|
73
|
+
? entry.errorOutput.replace(JWT_PATTERN, '<TOKEN>').slice(0, MAX_ERROR_LENGTH)
|
|
74
|
+
: undefined,
|
|
75
|
+
};
|
|
76
|
+
history.push(sanitized);
|
|
77
|
+
// Trim to max entries
|
|
78
|
+
const trimmed = history.slice(-MAX_ENTRIES);
|
|
79
|
+
writeHistory(trimmed);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Silent failure
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function getRecentHistory(count = 20) {
|
|
86
|
+
try {
|
|
87
|
+
const history = readHistory();
|
|
88
|
+
return history.slice(-count);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"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"}
|