@agentuity/cli 0.0.69 → 0.0.71
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/AGENTS.md +1 -1
- package/README.md +1 -1
- package/dist/cmd/ai/capabilities/show.d.ts.map +1 -1
- package/dist/cmd/ai/capabilities/show.js +0 -13
- package/dist/cmd/ai/capabilities/show.js.map +1 -1
- package/dist/cmd/ai/prompt/agent.js +1 -1
- package/dist/cmd/ai/prompt/api.js +1 -1
- package/dist/cmd/build/ast.d.ts +1 -2
- package/dist/cmd/build/ast.d.ts.map +1 -1
- package/dist/cmd/build/ast.js +261 -260
- package/dist/cmd/build/ast.js.map +1 -1
- package/dist/cmd/build/bundler.d.ts +4 -1
- package/dist/cmd/build/bundler.d.ts.map +1 -1
- package/dist/cmd/build/bundler.js +89 -6
- package/dist/cmd/build/bundler.js.map +1 -1
- package/dist/cmd/build/index.d.ts.map +1 -1
- package/dist/cmd/build/index.js +2 -1
- package/dist/cmd/build/index.js.map +1 -1
- package/dist/cmd/build/plugin.d.ts.map +1 -1
- package/dist/cmd/build/plugin.js +152 -414
- package/dist/cmd/build/plugin.js.map +1 -1
- package/dist/cmd/build/route-registry.d.ts +36 -0
- package/dist/cmd/build/route-registry.d.ts.map +1 -0
- package/dist/cmd/build/route-registry.js +151 -0
- package/dist/cmd/build/route-registry.js.map +1 -0
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +2 -0
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/index.d.ts.map +1 -1
- package/dist/cmd/cloud/index.js +0 -2
- package/dist/cmd/cloud/index.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +4 -3
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/dev/sync.d.ts.map +1 -1
- package/dist/cmd/dev/sync.js +0 -15
- package/dist/cmd/dev/sync.js.map +1 -1
- package/dist/cmd/dev/templates.d.ts.map +1 -1
- package/dist/cmd/dev/templates.js +11 -35
- package/dist/cmd/dev/templates.js.map +1 -1
- package/dist/cmd/profile/create.d.ts.map +1 -1
- package/dist/cmd/profile/create.js +0 -1
- package/dist/cmd/profile/create.js.map +1 -1
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +64 -53
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -3
- package/dist/config.js.map +1 -1
- package/dist/env-util.d.ts.map +1 -1
- package/dist/env-util.js +0 -3
- package/dist/env-util.js.map +1 -1
- package/dist/tui/box.d.ts +19 -0
- package/dist/tui/box.d.ts.map +1 -0
- package/dist/tui/box.js +160 -0
- package/dist/tui/box.js.map +1 -0
- package/dist/tui/colors.d.ts +20 -0
- package/dist/tui/colors.d.ts.map +1 -0
- package/dist/tui/colors.js +52 -0
- package/dist/tui/colors.js.map +1 -0
- package/dist/tui/group.d.ts +25 -0
- package/dist/tui/group.d.ts.map +1 -0
- package/dist/tui/group.js +32 -0
- package/dist/tui/group.js.map +1 -0
- package/dist/tui/prompt.d.ts +65 -0
- package/dist/tui/prompt.d.ts.map +1 -0
- package/dist/tui/prompt.js +377 -0
- package/dist/tui/prompt.js.map +1 -0
- package/dist/tui/symbols.d.ts +32 -0
- package/dist/tui/symbols.d.ts.map +1 -0
- package/dist/tui/symbols.js +52 -0
- package/dist/tui/symbols.js.map +1 -0
- package/dist/tui.d.ts +6 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +6 -0
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +0 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
- package/src/cmd/ai/capabilities/show.ts +0 -13
- package/src/cmd/ai/prompt/agent.ts +1 -1
- package/src/cmd/ai/prompt/api.ts +1 -1
- package/src/cmd/build/ast.ts +364 -334
- package/src/cmd/build/bundler.ts +123 -9
- package/src/cmd/build/index.ts +2 -1
- package/src/cmd/build/plugin.ts +171 -493
- package/src/cmd/build/route-registry.ts +198 -0
- package/src/cmd/cloud/deploy.ts +2 -0
- package/src/cmd/cloud/index.ts +0 -2
- package/src/cmd/dev/index.ts +4 -3
- package/src/cmd/dev/sync.ts +0 -28
- package/src/cmd/dev/templates.ts +11 -35
- package/src/cmd/profile/create.ts +0 -1
- package/src/cmd/project/template-flow.ts +77 -57
- package/src/config.ts +0 -3
- package/src/env-util.ts +0 -3
- package/src/tui/box.ts +202 -0
- package/src/tui/colors.ts +55 -0
- package/src/tui/group.ts +56 -0
- package/src/tui/prompt.ts +506 -0
- package/src/tui/symbols.ts +64 -0
- package/src/tui.ts +14 -0
- package/src/types.ts +0 -1
- package/dist/cmd/cloud/objectstore/delete-bucket.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/delete-bucket.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/delete-bucket.js +0 -72
- package/dist/cmd/cloud/objectstore/delete-bucket.js.map +0 -1
- package/dist/cmd/cloud/objectstore/delete.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/delete.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/delete.js +0 -65
- package/dist/cmd/cloud/objectstore/delete.js.map +0 -1
- package/dist/cmd/cloud/objectstore/get.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/get.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/get.js +0 -75
- package/dist/cmd/cloud/objectstore/get.js.map +0 -1
- package/dist/cmd/cloud/objectstore/index.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/index.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/index.js +0 -36
- package/dist/cmd/cloud/objectstore/index.js.map +0 -1
- package/dist/cmd/cloud/objectstore/list-buckets.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/list-buckets.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/list-buckets.js +0 -46
- package/dist/cmd/cloud/objectstore/list-buckets.js.map +0 -1
- package/dist/cmd/cloud/objectstore/list-keys.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/list-keys.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/list-keys.js +0 -58
- package/dist/cmd/cloud/objectstore/list-keys.js.map +0 -1
- package/dist/cmd/cloud/objectstore/put.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/put.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/put.js +0 -66
- package/dist/cmd/cloud/objectstore/put.js.map +0 -1
- package/dist/cmd/cloud/objectstore/repl.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/repl.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/repl.js +0 -224
- package/dist/cmd/cloud/objectstore/repl.js.map +0 -1
- package/dist/cmd/cloud/objectstore/url.d.ts +0 -3
- package/dist/cmd/cloud/objectstore/url.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/url.js +0 -64
- package/dist/cmd/cloud/objectstore/url.js.map +0 -1
- package/dist/cmd/cloud/objectstore/util.d.ts +0 -11
- package/dist/cmd/cloud/objectstore/util.d.ts.map +0 -1
- package/dist/cmd/cloud/objectstore/util.js +0 -18
- package/dist/cmd/cloud/objectstore/util.js.map +0 -1
- package/src/cmd/build/ast.test.ts +0 -418
- package/src/cmd/build/fix-duplicate-exports.test.ts +0 -387
- package/src/cmd/cloud/objectstore/delete-bucket.ts +0 -77
- package/src/cmd/cloud/objectstore/delete.ts +0 -67
- package/src/cmd/cloud/objectstore/get.ts +0 -77
- package/src/cmd/cloud/objectstore/index.ts +0 -36
- package/src/cmd/cloud/objectstore/list-buckets.ts +0 -51
- package/src/cmd/cloud/objectstore/list-keys.ts +0 -63
- package/src/cmd/cloud/objectstore/put.ts +0 -74
- package/src/cmd/cloud/objectstore/repl.ts +0 -239
- package/src/cmd/cloud/objectstore/url.ts +0 -67
- package/src/cmd/cloud/objectstore/util.ts +0 -29
- package/src/crypto/box.test.ts +0 -431
- package/src/env-util.test.ts +0 -194
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { createCommand } from '../../../types';
|
|
3
|
-
import * as tui from '../../../tui';
|
|
4
|
-
import { createStorageAdapter } from './util';
|
|
5
|
-
import { getCommand } from '../../../command-prefix';
|
|
6
|
-
export const listKeysSubcommand = createCommand({
|
|
7
|
-
name: 'list-keys',
|
|
8
|
-
aliases: ['ls', 'list'],
|
|
9
|
-
description: 'List all keys in an object storage bucket',
|
|
10
|
-
tags: ['read-only', 'slow', 'requires-auth'],
|
|
11
|
-
requires: { auth: true, project: true },
|
|
12
|
-
idempotent: true,
|
|
13
|
-
examples: [
|
|
14
|
-
{
|
|
15
|
-
command: getCommand('objectstore list-keys uploads'),
|
|
16
|
-
description: 'List all uploaded files',
|
|
17
|
-
},
|
|
18
|
-
{ command: getCommand('objectstore ls assets'), description: 'List assets (using alias)' },
|
|
19
|
-
{ command: getCommand('objectstore list backups'), description: 'List all backups' },
|
|
20
|
-
],
|
|
21
|
-
schema: {
|
|
22
|
-
args: z.object({
|
|
23
|
-
bucket: z.string().min(1),
|
|
24
|
-
}),
|
|
25
|
-
response: z.object({
|
|
26
|
-
bucket: z.string().describe('Bucket name'),
|
|
27
|
-
objects: z
|
|
28
|
-
.array(
|
|
29
|
-
z.object({
|
|
30
|
-
key: z.string().describe('Object key'),
|
|
31
|
-
size: z.number().describe('Object size in bytes'),
|
|
32
|
-
updated_at: z.string().describe('Last update timestamp'),
|
|
33
|
-
})
|
|
34
|
-
)
|
|
35
|
-
.describe('List of objects in the bucket'),
|
|
36
|
-
count: z.number().describe('Number of objects found'),
|
|
37
|
-
}),
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
async handler(ctx) {
|
|
41
|
-
const { args, options } = ctx;
|
|
42
|
-
const objectStore = await createStorageAdapter(ctx);
|
|
43
|
-
|
|
44
|
-
const objects = await objectStore.listKeys(args.bucket);
|
|
45
|
-
|
|
46
|
-
if (!options.json) {
|
|
47
|
-
if (objects.length === 0) {
|
|
48
|
-
tui.info(`No objects found in bucket ${tui.bold(args.bucket)}`);
|
|
49
|
-
} else {
|
|
50
|
-
tui.info(`Found ${objects.length} object(s) in ${tui.bold(args.bucket)}:`);
|
|
51
|
-
for (const obj of objects) {
|
|
52
|
-
const sizeMB = (obj.size / (1024 * 1024)).toFixed(2);
|
|
53
|
-
const date = new Date(obj.updated_at).toLocaleString();
|
|
54
|
-
tui.info(` ${tui.bold(obj.key)}: ${sizeMB} MB, updated ${date}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return { bucket: args.bucket, objects, count: objects.length };
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
export default listKeysSubcommand;
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { createCommand } from '../../../types';
|
|
3
|
-
import * as tui from '../../../tui';
|
|
4
|
-
import { isPossiblyJSON } from '../../../json';
|
|
5
|
-
import { createStorageAdapter } from './util';
|
|
6
|
-
import { getCommand } from '../../../command-prefix';
|
|
7
|
-
const ObjectStorePutResponseSchema = z.object({
|
|
8
|
-
success: z.boolean().describe('Whether the operation succeeded'),
|
|
9
|
-
bucket: z.string().describe('Bucket name'),
|
|
10
|
-
key: z.string().describe('Object key'),
|
|
11
|
-
size: z.number().describe('Size in bytes'),
|
|
12
|
-
contentType: z.string().describe('Content type'),
|
|
13
|
-
durationMs: z.number().describe('Operation duration in milliseconds'),
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
export const putSubcommand = createCommand({
|
|
17
|
-
name: 'put',
|
|
18
|
-
description: 'Put an object into the object storage',
|
|
19
|
-
tags: ['mutating', 'creates-resource', 'slow', 'requires-auth'],
|
|
20
|
-
idempotent: true,
|
|
21
|
-
requires: { auth: true, project: true },
|
|
22
|
-
examples: [
|
|
23
|
-
{
|
|
24
|
-
command: getCommand('objectstore put uploads images/logo.png @./logo.png'),
|
|
25
|
-
description: 'Upload logo from file',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
command: getCommand(
|
|
29
|
-
'objectstore put assets data/config.json \'{"api":"https://api.example.com"}\''
|
|
30
|
-
),
|
|
31
|
-
description: 'Store JSON config',
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
command: getCommand(
|
|
35
|
-
'objectstore put backups db-2024.sql @~/Downloads/backup.sql --content-type application/sql'
|
|
36
|
-
),
|
|
37
|
-
description: 'Upload SQL backup',
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
schema: {
|
|
41
|
-
args: z.object({
|
|
42
|
-
bucket: z.string().min(1).max(64).describe('the bucket name'),
|
|
43
|
-
key: z.string().min(1).max(64).describe('the key name'),
|
|
44
|
-
value: z.string().min(1).describe('the value'),
|
|
45
|
-
contentType: z.string().optional().describe('an optional content type'),
|
|
46
|
-
}),
|
|
47
|
-
response: ObjectStorePutResponseSchema,
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
async handler(ctx) {
|
|
51
|
-
const { args } = ctx;
|
|
52
|
-
const started = Date.now();
|
|
53
|
-
const storage = await createStorageAdapter(ctx);
|
|
54
|
-
const contentType =
|
|
55
|
-
args.contentType ?? (isPossiblyJSON(args.value) ? 'application/json' : 'text/plain');
|
|
56
|
-
const data = new TextEncoder().encode(args.value);
|
|
57
|
-
await storage.put(args.bucket, args.key, data, {
|
|
58
|
-
contentType,
|
|
59
|
-
});
|
|
60
|
-
const durationMs = Date.now() - started;
|
|
61
|
-
tui.success(`saved in ${durationMs.toFixed(1)}ms (${contentType})`);
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
success: true,
|
|
65
|
-
bucket: args.bucket,
|
|
66
|
-
key: args.key,
|
|
67
|
-
size: data.length,
|
|
68
|
-
contentType,
|
|
69
|
-
durationMs,
|
|
70
|
-
};
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
export default putSubcommand;
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { createCommand } from '../../../types';
|
|
3
|
-
import { createRepl, type ReplCommand } from '../../../repl';
|
|
4
|
-
import { showBanner } from '../../../banner';
|
|
5
|
-
import * as tui from '../../../tui';
|
|
6
|
-
import { isPossiblyJSON, tryParseJSON } from '../../../json';
|
|
7
|
-
import { createStorageAdapter } from './util';
|
|
8
|
-
import { getCommand } from '../../../command-prefix';
|
|
9
|
-
export const replSubcommand = createCommand({
|
|
10
|
-
name: 'repl',
|
|
11
|
-
description: 'Start an interactive repl for working with object storage',
|
|
12
|
-
tags: ['slow', 'requires-auth'],
|
|
13
|
-
idempotent: false,
|
|
14
|
-
requires: { auth: true, project: true },
|
|
15
|
-
examples: [
|
|
16
|
-
{
|
|
17
|
-
command: getCommand('objectstore repl'),
|
|
18
|
-
description: 'Start interactive object storage session',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
|
|
22
|
-
async handler(ctx) {
|
|
23
|
-
showBanner(undefined, true);
|
|
24
|
-
tui.info('Managing object store for project');
|
|
25
|
-
tui.newline();
|
|
26
|
-
console.log(tui.bold('Org:'.padEnd(10, ' ')), ' ', tui.muted(ctx.project.orgId));
|
|
27
|
-
console.log(tui.bold('Project:'.padEnd(10, ' ')), ' ', tui.muted(ctx.project.projectId));
|
|
28
|
-
tui.newline();
|
|
29
|
-
|
|
30
|
-
const storage = await createStorageAdapter(ctx);
|
|
31
|
-
|
|
32
|
-
const commands: ReplCommand[] = [
|
|
33
|
-
{
|
|
34
|
-
name: 'put',
|
|
35
|
-
description: 'Put an object into a bucket',
|
|
36
|
-
schema: {
|
|
37
|
-
args: z.tuple([z.string().min(1), z.string().min(1), z.string().min(1)]),
|
|
38
|
-
argNames: ['bucket', 'key', 'value'],
|
|
39
|
-
},
|
|
40
|
-
handler: async (ctx) => {
|
|
41
|
-
ctx.setProgress('saving');
|
|
42
|
-
const started = Date.now();
|
|
43
|
-
const contentType = isPossiblyJSON(ctx.parsed.args[2]!)
|
|
44
|
-
? 'application/json'
|
|
45
|
-
: 'text/plain';
|
|
46
|
-
const data = new TextEncoder().encode(ctx.parsed.args[2]!);
|
|
47
|
-
await storage.put(ctx.parsed.args[0]!, ctx.parsed.args[1]!, data, {
|
|
48
|
-
contentType,
|
|
49
|
-
});
|
|
50
|
-
ctx.success(`saved in ${(Date.now() - started).toFixed(1)}ms (${contentType})`);
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
name: 'get',
|
|
55
|
-
description: 'Get an object from a bucket',
|
|
56
|
-
schema: {
|
|
57
|
-
args: z.tuple([z.string().min(1), z.string().min(1)]),
|
|
58
|
-
argNames: ['bucket', 'key'],
|
|
59
|
-
},
|
|
60
|
-
handler: async (ctx) => {
|
|
61
|
-
ctx.setProgress('fetching');
|
|
62
|
-
const started = Date.now();
|
|
63
|
-
const res = await storage.get(ctx.parsed.args[0]!, ctx.parsed.args[1]!);
|
|
64
|
-
if (res.exists) {
|
|
65
|
-
if (res.data) {
|
|
66
|
-
if (res.contentType?.includes('json')) {
|
|
67
|
-
const val = tryParseJSON(new TextDecoder().decode(res.data));
|
|
68
|
-
ctx.json(val);
|
|
69
|
-
} else if (res.contentType?.includes('text')) {
|
|
70
|
-
ctx.write(new TextDecoder().decode(res.data));
|
|
71
|
-
} else {
|
|
72
|
-
ctx.info(`Read ${res.data.byteLength} bytes (${res.contentType})`);
|
|
73
|
-
}
|
|
74
|
-
ctx.success(
|
|
75
|
-
`retrieved in ${(Date.now() - started).toFixed(1)}ms (${res.contentType})`
|
|
76
|
-
);
|
|
77
|
-
} else {
|
|
78
|
-
ctx.warning(
|
|
79
|
-
`${ctx.parsed.args[1]!} returned empty data for bucket ${ctx.parsed.args[0]!}`
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
} else {
|
|
83
|
-
ctx.warning(
|
|
84
|
-
`${ctx.parsed.args[1]!} does not exist in bucket ${ctx.parsed.args[0]!}`
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
name: 'delete',
|
|
91
|
-
aliases: ['rm', 'remove', 'del'],
|
|
92
|
-
description: 'Delete an object from a bucket',
|
|
93
|
-
schema: {
|
|
94
|
-
args: z.tuple([z.string().min(1), z.string().min(1)]),
|
|
95
|
-
argNames: ['bucket', 'key'],
|
|
96
|
-
},
|
|
97
|
-
handler: async (ctx) => {
|
|
98
|
-
ctx.setProgress('deleting');
|
|
99
|
-
const started = Date.now();
|
|
100
|
-
const deleted = await storage.delete(ctx.parsed.args[0]!, ctx.parsed.args[1]!);
|
|
101
|
-
if (deleted) {
|
|
102
|
-
ctx.success(`deleted in ${(Date.now() - started).toFixed(1)}ms`);
|
|
103
|
-
} else {
|
|
104
|
-
ctx.warning(
|
|
105
|
-
`${ctx.parsed.args[1]!} did not exist in bucket ${ctx.parsed.args[0]!}`
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
name: 'url',
|
|
112
|
-
aliases: ['publicurl', 'presigned'],
|
|
113
|
-
description: 'Create a public URL for an object',
|
|
114
|
-
schema: {
|
|
115
|
-
args: z.tuple([
|
|
116
|
-
z.string().min(1),
|
|
117
|
-
z.string().min(1),
|
|
118
|
-
z.coerce.number().min(60).optional(),
|
|
119
|
-
]),
|
|
120
|
-
argNames: ['bucket', 'key', 'expires'],
|
|
121
|
-
},
|
|
122
|
-
handler: async (ctx) => {
|
|
123
|
-
ctx.setProgress('creating url');
|
|
124
|
-
const started = Date.now();
|
|
125
|
-
const expires =
|
|
126
|
-
ctx.parsed.args.length > 2 ? parseInt(ctx.parsed.args[2]!) : undefined;
|
|
127
|
-
const url = await storage.createPublicURL(
|
|
128
|
-
ctx.parsed.args[0]!,
|
|
129
|
-
ctx.parsed.args[1]!,
|
|
130
|
-
expires ? { expiresDuration: expires } : undefined
|
|
131
|
-
);
|
|
132
|
-
ctx.write(url);
|
|
133
|
-
ctx.success(`created in ${(Date.now() - started).toFixed(1)}ms`);
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
name: 'list-buckets',
|
|
138
|
-
aliases: ['buckets', 'lb'],
|
|
139
|
-
description: 'List all buckets',
|
|
140
|
-
handler: async (ctx) => {
|
|
141
|
-
ctx.setProgress('listing buckets');
|
|
142
|
-
const started = Date.now();
|
|
143
|
-
const buckets = await storage.listBuckets();
|
|
144
|
-
if (buckets.length === 0) {
|
|
145
|
-
ctx.info('No buckets found');
|
|
146
|
-
} else {
|
|
147
|
-
ctx.info(`Found ${buckets.length} bucket(s):`);
|
|
148
|
-
for (const bucket of buckets) {
|
|
149
|
-
const sizeMB = (bucket.total_bytes / (1024 * 1024)).toFixed(2);
|
|
150
|
-
ctx.write(
|
|
151
|
-
` ${tui.bold(bucket.name)}: ${bucket.object_count} objects, ${sizeMB} MB`
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
ctx.success(`retrieved in ${(Date.now() - started).toFixed(1)}ms`);
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
name: 'list-keys',
|
|
160
|
-
aliases: ['keys', 'ls'],
|
|
161
|
-
description: 'List all keys in a bucket',
|
|
162
|
-
schema: {
|
|
163
|
-
args: z.tuple([z.string().min(1)]),
|
|
164
|
-
argNames: ['bucket'],
|
|
165
|
-
},
|
|
166
|
-
handler: async (ctx) => {
|
|
167
|
-
ctx.setProgress('listing keys');
|
|
168
|
-
const started = Date.now();
|
|
169
|
-
const objects = await storage.listKeys(ctx.parsed.args[0]!);
|
|
170
|
-
if (objects.length === 0) {
|
|
171
|
-
ctx.info(`No objects found in bucket ${tui.bold(ctx.parsed.args[0]!)}`);
|
|
172
|
-
} else {
|
|
173
|
-
ctx.info(
|
|
174
|
-
`Found ${objects.length} object(s) in ${tui.bold(ctx.parsed.args[0]!)}:`
|
|
175
|
-
);
|
|
176
|
-
for (const obj of objects) {
|
|
177
|
-
const sizeMB = (obj.size / (1024 * 1024)).toFixed(2);
|
|
178
|
-
const date = new Date(obj.updated_at).toLocaleString();
|
|
179
|
-
ctx.write(` ${tui.bold(obj.key)}: ${sizeMB} MB, updated ${date}`);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
ctx.success(`retrieved in ${(Date.now() - started).toFixed(1)}ms`);
|
|
183
|
-
},
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
name: 'delete-bucket',
|
|
187
|
-
aliases: ['rmbucket', 'delbucket'],
|
|
188
|
-
description: 'Delete a bucket and all its contents',
|
|
189
|
-
schema: {
|
|
190
|
-
args: z.tuple([z.string().min(1)]),
|
|
191
|
-
argNames: ['bucket'],
|
|
192
|
-
},
|
|
193
|
-
handler: async (ctx) => {
|
|
194
|
-
ctx.warning(
|
|
195
|
-
`This will delete bucket ${tui.bold(ctx.parsed.args[0]!)} and ALL its contents.`
|
|
196
|
-
);
|
|
197
|
-
const confirm = await new Promise<boolean>((resolve) => {
|
|
198
|
-
process.stdout.write('Are you sure? (yes/no): ');
|
|
199
|
-
process.stdin.once('data', (data) => {
|
|
200
|
-
const answer = data.toString().trim().toLowerCase();
|
|
201
|
-
resolve(answer === 'yes' || answer === 'y');
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
if (!confirm) {
|
|
205
|
-
ctx.info('Cancelled');
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
ctx.setProgress('deleting bucket');
|
|
209
|
-
const started = Date.now();
|
|
210
|
-
const deleted = await storage.deleteBucket(ctx.parsed.args[0]!);
|
|
211
|
-
if (deleted) {
|
|
212
|
-
ctx.success(`deleted in ${(Date.now() - started).toFixed(1)}ms`);
|
|
213
|
-
} else {
|
|
214
|
-
ctx.warning(`Bucket ${tui.bold(ctx.parsed.args[0]!)} not found`);
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
name: 'exit',
|
|
220
|
-
aliases: ['quit'],
|
|
221
|
-
description: 'Exit the repl',
|
|
222
|
-
handler: async (ctx) => {
|
|
223
|
-
return ctx.exit();
|
|
224
|
-
},
|
|
225
|
-
},
|
|
226
|
-
];
|
|
227
|
-
|
|
228
|
-
// Start the REPL
|
|
229
|
-
await createRepl({
|
|
230
|
-
name: 'objectstore',
|
|
231
|
-
prompt: '> ',
|
|
232
|
-
welcome: tui.muted('Type "help" or / for available commands.'),
|
|
233
|
-
exitMessage: 'Goodbye!',
|
|
234
|
-
commands,
|
|
235
|
-
});
|
|
236
|
-
},
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
export default replSubcommand;
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { createCommand } from '../../../types';
|
|
3
|
-
import * as tui from '../../../tui';
|
|
4
|
-
import { createStorageAdapter } from './util';
|
|
5
|
-
import { getCommand } from '../../../command-prefix';
|
|
6
|
-
const ObjectStoreURLResponseSchema = z.object({
|
|
7
|
-
success: z.boolean().describe('Whether the operation succeeded'),
|
|
8
|
-
bucket: z.string().describe('Bucket name'),
|
|
9
|
-
key: z.string().describe('Object key'),
|
|
10
|
-
url: z.string().describe('Public or presigned URL'),
|
|
11
|
-
expires: z.number().optional().describe('URL expiration time in seconds'),
|
|
12
|
-
durationMs: z.number().describe('Operation duration in milliseconds'),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
export const urlSubcommand = createCommand({
|
|
16
|
-
name: 'url',
|
|
17
|
-
aliases: ['publicurl', 'presigned'],
|
|
18
|
-
description: 'Create a public URL for an object',
|
|
19
|
-
tags: ['read-only', 'fast', 'requires-auth'],
|
|
20
|
-
requires: { auth: true, project: true },
|
|
21
|
-
idempotent: true,
|
|
22
|
-
examples: [
|
|
23
|
-
{
|
|
24
|
-
command: getCommand('objectstore url uploads images/logo.png'),
|
|
25
|
-
description: 'Get public URL for logo',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
command: getCommand('objectstore url assets data/export.json --expires 3600'),
|
|
29
|
-
description: 'Get 1h temporary URL',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
command: getCommand('objectstore presigned backups db-2024.sql --expires 300'),
|
|
33
|
-
description: 'Get 5m presigned URL',
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
schema: {
|
|
37
|
-
args: z.object({
|
|
38
|
-
bucket: z.string().min(1).describe('the bucket name'),
|
|
39
|
-
key: z.string().min(1).describe('the key name'),
|
|
40
|
-
expires: z.coerce.number().min(60).optional().describe('the expiration in seconds'),
|
|
41
|
-
}),
|
|
42
|
-
response: ObjectStoreURLResponseSchema,
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
async handler(ctx) {
|
|
46
|
-
const { args } = ctx;
|
|
47
|
-
const started = Date.now();
|
|
48
|
-
const storage = await createStorageAdapter(ctx);
|
|
49
|
-
const url = await storage.createPublicURL(args.bucket, args.key, {
|
|
50
|
-
expiresDuration: args.expires,
|
|
51
|
-
});
|
|
52
|
-
const durationMs = Date.now() - started;
|
|
53
|
-
console.log(url);
|
|
54
|
-
tui.success(`created in ${durationMs.toFixed(1)}ms`);
|
|
55
|
-
|
|
56
|
-
return {
|
|
57
|
-
success: true,
|
|
58
|
-
bucket: args.bucket,
|
|
59
|
-
key: args.key,
|
|
60
|
-
url,
|
|
61
|
-
expires: args.expires,
|
|
62
|
-
durationMs,
|
|
63
|
-
};
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
export default urlSubcommand;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Logger, ObjectStorageService } from '@agentuity/core';
|
|
2
|
-
import { createServerFetchAdapter, getServiceUrls } from '@agentuity/server';
|
|
3
|
-
import { loadProjectSDKKey } from '../../../config';
|
|
4
|
-
import type { Config } from '../../../types';
|
|
5
|
-
import * as tui from '../../../tui';
|
|
6
|
-
|
|
7
|
-
export async function createStorageAdapter(ctx: {
|
|
8
|
-
logger: Logger;
|
|
9
|
-
projectDir: string;
|
|
10
|
-
config: Config | null;
|
|
11
|
-
project: { region: string };
|
|
12
|
-
}) {
|
|
13
|
-
const sdkKey = await loadProjectSDKKey(ctx.logger, ctx.projectDir);
|
|
14
|
-
if (!sdkKey) {
|
|
15
|
-
tui.fatal(`Couldn't find the AGENTUITY_SDK_KEY in ${ctx.projectDir} .env file`);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const adapter = createServerFetchAdapter(
|
|
19
|
-
{
|
|
20
|
-
headers: {
|
|
21
|
-
Authorization: `Bearer ${sdkKey}`,
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
ctx.logger
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
const baseUrl = getServiceUrls(ctx.project.region).catalyst;
|
|
28
|
-
return new ObjectStorageService(baseUrl, adapter);
|
|
29
|
-
}
|