@agentuity/cli 0.1.9 → 0.1.10
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/README.md +2 -2
- package/bin/cli.ts +8 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/resource-region.d.ts +46 -0
- package/dist/cache/resource-region.d.ts.map +1 -0
- package/dist/cache/resource-region.js +115 -0
- package/dist/cache/resource-region.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +44 -32
- package/dist/cli.js.map +1 -1
- package/dist/cmd/ai/capabilities/show.d.ts.map +1 -1
- package/dist/cmd/ai/capabilities/show.js +12 -15
- package/dist/cmd/ai/capabilities/show.js.map +1 -1
- package/dist/cmd/ai/prompt/llm.js +5 -5
- package/dist/cmd/ai/prompt/llm.js.map +1 -1
- package/dist/cmd/auth/logout.d.ts.map +1 -1
- package/dist/cmd/auth/logout.js +5 -2
- package/dist/cmd/auth/logout.js.map +1 -1
- package/dist/cmd/build/ast.d.ts.map +1 -1
- package/dist/cmd/build/ast.js +87 -1
- package/dist/cmd/build/ast.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +8 -3
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server.js +5 -3
- package/dist/cmd/build/vite/vite-asset-server.js.map +1 -1
- package/dist/cmd/cloud/db/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/db/delete.js +69 -11
- package/dist/cmd/cloud/db/delete.js.map +1 -1
- package/dist/cmd/cloud/db/get.d.ts.map +1 -1
- package/dist/cmd/cloud/db/get.js +23 -7
- package/dist/cmd/cloud/db/get.js.map +1 -1
- package/dist/cmd/cloud/db/list.d.ts.map +1 -1
- package/dist/cmd/cloud/db/list.js +15 -7
- package/dist/cmd/cloud/db/list.js.map +1 -1
- package/dist/cmd/cloud/db/logs.d.ts.map +1 -1
- package/dist/cmd/cloud/db/logs.js +24 -4
- package/dist/cmd/cloud/db/logs.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +38 -0
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/env/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/env/delete.js +30 -13
- package/dist/cmd/cloud/env/delete.js.map +1 -1
- package/dist/cmd/cloud/env/get.d.ts.map +1 -1
- package/dist/cmd/cloud/env/get.js +27 -30
- package/dist/cmd/cloud/env/get.js.map +1 -1
- package/dist/cmd/cloud/env/import.d.ts.map +1 -1
- package/dist/cmd/cloud/env/import.js +41 -48
- package/dist/cmd/cloud/env/import.js.map +1 -1
- package/dist/cmd/cloud/env/index.d.ts.map +1 -1
- package/dist/cmd/cloud/env/index.js +6 -2
- package/dist/cmd/cloud/env/index.js.map +1 -1
- package/dist/cmd/cloud/env/list.d.ts.map +1 -1
- package/dist/cmd/cloud/env/list.js +51 -28
- package/dist/cmd/cloud/env/list.js.map +1 -1
- package/dist/cmd/cloud/env/pull.d.ts.map +1 -1
- package/dist/cmd/cloud/env/pull.js +3 -3
- package/dist/cmd/cloud/env/pull.js.map +1 -1
- package/dist/cmd/cloud/env/push.d.ts.map +1 -1
- package/dist/cmd/cloud/env/push.js +31 -11
- package/dist/cmd/cloud/env/push.js.map +1 -1
- package/dist/cmd/cloud/env/set.d.ts.map +1 -1
- package/dist/cmd/cloud/env/set.js +41 -26
- package/dist/cmd/cloud/env/set.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/cloud/region-lookup.d.ts +18 -0
- package/dist/cmd/cloud/region-lookup.d.ts.map +1 -0
- package/dist/cmd/cloud/region-lookup.js +64 -0
- package/dist/cmd/cloud/region-lookup.js.map +1 -0
- package/dist/cmd/cloud/sandbox/cp.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/cp.js +5 -3
- package/dist/cmd/cloud/sandbox/cp.js.map +1 -1
- package/dist/cmd/cloud/sandbox/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/create.js +43 -6
- package/dist/cmd/cloud/sandbox/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/delete.js +5 -3
- package/dist/cmd/cloud/sandbox/delete.js.map +1 -1
- package/dist/cmd/cloud/sandbox/download.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/download.js +4 -3
- package/dist/cmd/cloud/sandbox/download.js.map +1 -1
- package/dist/cmd/cloud/sandbox/env.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/env.js +4 -3
- package/dist/cmd/cloud/sandbox/env.js.map +1 -1
- package/dist/cmd/cloud/sandbox/exec.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/exec.js +4 -3
- package/dist/cmd/cloud/sandbox/exec.js.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/get.js +4 -4
- package/dist/cmd/cloud/sandbox/execution/get.js.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/index.js +1 -1
- package/dist/cmd/cloud/sandbox/execution/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/list.js +4 -3
- package/dist/cmd/cloud/sandbox/execution/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/get.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/get.js +9 -4
- package/dist/cmd/cloud/sandbox/get.js.map +1 -1
- package/dist/cmd/cloud/sandbox/index.js +1 -1
- package/dist/cmd/cloud/sandbox/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/list.js +4 -4
- package/dist/cmd/cloud/sandbox/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/ls.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/ls.js +4 -3
- package/dist/cmd/cloud/sandbox/ls.js.map +1 -1
- package/dist/cmd/cloud/sandbox/mkdir.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/mkdir.js +4 -3
- package/dist/cmd/cloud/sandbox/mkdir.js.map +1 -1
- package/dist/cmd/cloud/sandbox/rm.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/rm.js +4 -3
- package/dist/cmd/cloud/sandbox/rm.js.map +1 -1
- package/dist/cmd/cloud/sandbox/rmdir.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/rmdir.js +4 -3
- package/dist/cmd/cloud/sandbox/rmdir.js.map +1 -1
- package/dist/cmd/cloud/sandbox/run.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/run.js +44 -6
- package/dist/cmd/cloud/sandbox/run.js.map +1 -1
- package/dist/cmd/cloud/sandbox/runtime/index.js +1 -1
- package/dist/cmd/cloud/sandbox/runtime/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/runtime/list.js +4 -4
- package/dist/cmd/cloud/sandbox/runtime/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/create.js +5 -3
- package/dist/cmd/cloud/sandbox/snapshot/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/delete.js +4 -4
- package/dist/cmd/cloud/sandbox/snapshot/delete.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/get.js +4 -4
- package/dist/cmd/cloud/sandbox/snapshot/get.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/index.js +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/list.js +4 -4
- package/dist/cmd/cloud/sandbox/snapshot/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/tag.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/tag.js +4 -4
- package/dist/cmd/cloud/sandbox/snapshot/tag.js.map +1 -1
- package/dist/cmd/cloud/sandbox/upload.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/upload.js +4 -3
- package/dist/cmd/cloud/sandbox/upload.js.map +1 -1
- package/dist/cmd/cloud/sandbox/util.d.ts +13 -0
- package/dist/cmd/cloud/sandbox/util.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/util.js +40 -1
- package/dist/cmd/cloud/sandbox/util.js.map +1 -1
- package/dist/cmd/cloud/scp/download.d.ts.map +1 -1
- package/dist/cmd/cloud/scp/download.js +6 -2
- package/dist/cmd/cloud/scp/download.js.map +1 -1
- package/dist/cmd/cloud/scp/upload.d.ts.map +1 -1
- package/dist/cmd/cloud/scp/upload.js +6 -2
- package/dist/cmd/cloud/scp/upload.js.map +1 -1
- package/dist/cmd/cloud/session/get.js +4 -4
- package/dist/cmd/cloud/session/get.js.map +1 -1
- package/dist/cmd/cloud/session/list.js +4 -4
- package/dist/cmd/cloud/session/list.js.map +1 -1
- package/dist/cmd/cloud/ssh.d.ts.map +1 -1
- package/dist/cmd/cloud/ssh.js +7 -2
- package/dist/cmd/cloud/ssh.js.map +1 -1
- package/dist/cmd/cloud/storage/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/delete.js +46 -10
- package/dist/cmd/cloud/storage/delete.js.map +1 -1
- package/dist/cmd/cloud/storage/download.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/download.js +19 -6
- package/dist/cmd/cloud/storage/download.js.map +1 -1
- package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/get.js +19 -6
- package/dist/cmd/cloud/storage/get.js.map +1 -1
- package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/list.js +17 -7
- package/dist/cmd/cloud/storage/list.js.map +1 -1
- package/dist/cmd/cloud/storage/upload.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/upload.js +19 -6
- package/dist/cmd/cloud/storage/upload.js.map +1 -1
- package/dist/cmd/cloud/thread/delete.js +4 -4
- package/dist/cmd/cloud/thread/delete.js.map +1 -1
- package/dist/cmd/cloud/thread/get.js +4 -4
- package/dist/cmd/cloud/thread/get.js.map +1 -1
- package/dist/cmd/cloud/thread/list.js +4 -4
- package/dist/cmd/cloud/thread/list.js.map +1 -1
- package/dist/cmd/project/auth/init.d.ts.map +1 -1
- package/dist/cmd/project/auth/init.js +6 -3
- package/dist/cmd/project/auth/init.js.map +1 -1
- package/dist/cmd/project/auth/shared.d.ts +6 -2
- package/dist/cmd/project/auth/shared.d.ts.map +1 -1
- package/dist/cmd/project/auth/shared.js +40 -12
- package/dist/cmd/project/auth/shared.js.map +1 -1
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +51 -8
- package/dist/config.js.map +1 -1
- package/dist/env-util.d.ts +25 -2
- package/dist/env-util.d.ts.map +1 -1
- package/dist/env-util.js +44 -4
- package/dist/env-util.js.map +1 -1
- package/dist/utils/apt-validator.d.ts +20 -0
- package/dist/utils/apt-validator.d.ts.map +1 -0
- package/dist/utils/apt-validator.js +157 -0
- package/dist/utils/apt-validator.js.map +1 -0
- package/package.json +6 -6
- package/src/cache/index.ts +11 -0
- package/src/cache/resource-region.ts +183 -0
- package/src/cli.ts +47 -38
- package/src/cmd/ai/capabilities/show.ts +12 -15
- package/src/cmd/ai/prompt/llm.ts +5 -5
- package/src/cmd/auth/logout.ts +5 -2
- package/src/cmd/build/ast.ts +160 -1
- package/src/cmd/build/vite/vite-asset-server-config.ts +7 -3
- package/src/cmd/build/vite/vite-asset-server.ts +6 -3
- package/src/cmd/cloud/db/delete.ts +83 -11
- package/src/cmd/cloud/db/get.ts +29 -7
- package/src/cmd/cloud/db/list.ts +16 -7
- package/src/cmd/cloud/db/logs.ts +33 -4
- package/src/cmd/cloud/deploy.ts +49 -0
- package/src/cmd/cloud/env/delete.ts +36 -12
- package/src/cmd/cloud/env/get.ts +28 -27
- package/src/cmd/cloud/env/import.ts +43 -56
- package/src/cmd/cloud/env/index.ts +6 -2
- package/src/cmd/cloud/env/list.ts +57 -30
- package/src/cmd/cloud/env/pull.ts +9 -3
- package/src/cmd/cloud/env/push.ts +44 -11
- package/src/cmd/cloud/env/set.ts +49 -30
- package/src/cmd/cloud/index.ts +0 -2
- package/src/cmd/cloud/region-lookup.ts +89 -0
- package/src/cmd/cloud/sandbox/cp.ts +5 -3
- package/src/cmd/cloud/sandbox/create.ts +50 -6
- package/src/cmd/cloud/sandbox/delete.ts +6 -3
- package/src/cmd/cloud/sandbox/download.ts +4 -3
- package/src/cmd/cloud/sandbox/env.ts +4 -3
- package/src/cmd/cloud/sandbox/exec.ts +4 -3
- package/src/cmd/cloud/sandbox/execution/get.ts +4 -4
- package/src/cmd/cloud/sandbox/execution/index.ts +1 -1
- package/src/cmd/cloud/sandbox/execution/list.ts +4 -3
- package/src/cmd/cloud/sandbox/get.ts +10 -4
- package/src/cmd/cloud/sandbox/index.ts +1 -1
- package/src/cmd/cloud/sandbox/list.ts +4 -4
- package/src/cmd/cloud/sandbox/ls.ts +4 -3
- package/src/cmd/cloud/sandbox/mkdir.ts +4 -3
- package/src/cmd/cloud/sandbox/rm.ts +4 -3
- package/src/cmd/cloud/sandbox/rmdir.ts +4 -3
- package/src/cmd/cloud/sandbox/run.ts +51 -6
- package/src/cmd/cloud/sandbox/runtime/index.ts +1 -1
- package/src/cmd/cloud/sandbox/runtime/list.ts +4 -4
- package/src/cmd/cloud/sandbox/snapshot/create.ts +11 -5
- package/src/cmd/cloud/sandbox/snapshot/delete.ts +4 -4
- package/src/cmd/cloud/sandbox/snapshot/get.ts +4 -4
- package/src/cmd/cloud/sandbox/snapshot/index.ts +1 -1
- package/src/cmd/cloud/sandbox/snapshot/list.ts +4 -4
- package/src/cmd/cloud/sandbox/snapshot/tag.ts +7 -5
- package/src/cmd/cloud/sandbox/upload.ts +4 -3
- package/src/cmd/cloud/sandbox/util.ts +60 -1
- package/src/cmd/cloud/scp/download.ts +14 -2
- package/src/cmd/cloud/scp/upload.ts +14 -2
- package/src/cmd/cloud/session/get.ts +4 -4
- package/src/cmd/cloud/session/list.ts +4 -4
- package/src/cmd/cloud/ssh.ts +15 -2
- package/src/cmd/cloud/storage/delete.ts +61 -10
- package/src/cmd/cloud/storage/download.ts +31 -6
- package/src/cmd/cloud/storage/get.ts +31 -6
- package/src/cmd/cloud/storage/list.ts +18 -7
- package/src/cmd/cloud/storage/upload.ts +31 -6
- package/src/cmd/cloud/thread/delete.ts +4 -4
- package/src/cmd/cloud/thread/get.ts +4 -4
- package/src/cmd/cloud/thread/list.ts +4 -4
- package/src/cmd/project/auth/init.ts +7 -3
- package/src/cmd/project/auth/shared.ts +52 -13
- package/src/config.ts +64 -8
- package/src/env-util.ts +50 -5
- package/src/utils/apt-validator.ts +215 -0
- package/dist/cmd/cloud/secret/delete.d.ts +0 -2
- package/dist/cmd/cloud/secret/delete.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/delete.js +0 -53
- package/dist/cmd/cloud/secret/delete.js.map +0 -1
- package/dist/cmd/cloud/secret/get.d.ts +0 -2
- package/dist/cmd/cloud/secret/get.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/get.js +0 -73
- package/dist/cmd/cloud/secret/get.js.map +0 -1
- package/dist/cmd/cloud/secret/import.d.ts +0 -2
- package/dist/cmd/cloud/secret/import.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/import.js +0 -91
- package/dist/cmd/cloud/secret/import.js.map +0 -1
- package/dist/cmd/cloud/secret/index.d.ts +0 -3
- package/dist/cmd/cloud/secret/index.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/index.js +0 -33
- package/dist/cmd/cloud/secret/index.js.map +0 -1
- package/dist/cmd/cloud/secret/list.d.ts +0 -2
- package/dist/cmd/cloud/secret/list.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/list.js +0 -65
- package/dist/cmd/cloud/secret/list.js.map +0 -1
- package/dist/cmd/cloud/secret/pull.d.ts +0 -2
- package/dist/cmd/cloud/secret/pull.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/pull.js +0 -82
- package/dist/cmd/cloud/secret/pull.js.map +0 -1
- package/dist/cmd/cloud/secret/push.d.ts +0 -2
- package/dist/cmd/cloud/secret/push.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/push.js +0 -61
- package/dist/cmd/cloud/secret/push.js.map +0 -1
- package/dist/cmd/cloud/secret/set.d.ts +0 -2
- package/dist/cmd/cloud/secret/set.d.ts.map +0 -1
- package/dist/cmd/cloud/secret/set.js +0 -63
- package/dist/cmd/cloud/secret/set.js.map +0 -1
- package/src/cmd/cloud/secret/delete.ts +0 -65
- package/src/cmd/cloud/secret/get.ts +0 -77
- package/src/cmd/cloud/secret/import.ts +0 -110
- package/src/cmd/cloud/secret/index.ts +0 -33
- package/src/cmd/cloud/secret/list.ts +0 -70
- package/src/cmd/cloud/secret/pull.ts +0 -92
- package/src/cmd/cloud/secret/push.ts +0 -69
- package/src/cmd/cloud/secret/set.ts +0 -76
|
@@ -4,7 +4,7 @@ import * as tui from '../../../tui';
|
|
|
4
4
|
import { threadList, type Thread } from '@agentuity/server';
|
|
5
5
|
import { getCommand } from '../../../command-prefix';
|
|
6
6
|
import { ErrorCode } from '../../../errors';
|
|
7
|
-
import {
|
|
7
|
+
import { getGlobalCatalystAPIClient } from '../../../config';
|
|
8
8
|
|
|
9
9
|
const ThreadListResponseSchema = z.array(
|
|
10
10
|
z.object({
|
|
@@ -36,7 +36,7 @@ export const listSubcommand = createSubcommand({
|
|
|
36
36
|
},
|
|
37
37
|
],
|
|
38
38
|
aliases: ['ls'],
|
|
39
|
-
requires: { auth: true
|
|
39
|
+
requires: { auth: true },
|
|
40
40
|
optional: { project: true },
|
|
41
41
|
idempotent: true,
|
|
42
42
|
pagination: {
|
|
@@ -62,8 +62,8 @@ export const listSubcommand = createSubcommand({
|
|
|
62
62
|
response: ThreadListResponseSchema,
|
|
63
63
|
},
|
|
64
64
|
async handler(ctx) {
|
|
65
|
-
const { logger, auth, project, opts, options,
|
|
66
|
-
const catalystClient =
|
|
65
|
+
const { logger, auth, project, opts, options, config } = ctx;
|
|
66
|
+
const catalystClient = await getGlobalCatalystAPIClient(logger, auth, config?.name);
|
|
67
67
|
|
|
68
68
|
const projectId = opts.projectId || project?.projectId;
|
|
69
69
|
const orgId = opts.orgId;
|
|
@@ -20,7 +20,7 @@ export const initSubcommand = createSubcommand({
|
|
|
20
20
|
name: 'init',
|
|
21
21
|
description: 'Set up Agentuity Auth for your project',
|
|
22
22
|
tags: ['mutating', 'slow', 'requires-auth'],
|
|
23
|
-
requires: { auth: true, org: true
|
|
23
|
+
requires: { auth: true, org: true },
|
|
24
24
|
idempotent: false,
|
|
25
25
|
examples: [
|
|
26
26
|
{
|
|
@@ -46,7 +46,7 @@ export const initSubcommand = createSubcommand({
|
|
|
46
46
|
},
|
|
47
47
|
|
|
48
48
|
async handler(ctx) {
|
|
49
|
-
const { logger, opts, auth, orgId,
|
|
49
|
+
const { logger, opts, auth, orgId, config } = ctx;
|
|
50
50
|
|
|
51
51
|
tui.newline();
|
|
52
52
|
tui.info(tui.bold('Agentuity Auth Setup'));
|
|
@@ -86,10 +86,14 @@ export const initSubcommand = createSubcommand({
|
|
|
86
86
|
logger,
|
|
87
87
|
auth,
|
|
88
88
|
orgId,
|
|
89
|
-
|
|
89
|
+
config,
|
|
90
90
|
existingUrl: databaseUrl,
|
|
91
|
+
projectDir,
|
|
91
92
|
});
|
|
92
93
|
|
|
94
|
+
// Get the region from the selected database
|
|
95
|
+
const region = dbInfo.region;
|
|
96
|
+
|
|
93
97
|
const databaseName = dbInfo.name;
|
|
94
98
|
|
|
95
99
|
// Update .env with database URL
|
|
@@ -3,11 +3,17 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as path from 'node:path';
|
|
6
|
-
import {
|
|
6
|
+
import { listOrgResources, createResources, dbQuery } from '@agentuity/server';
|
|
7
7
|
import * as tui from '../../../tui';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
getCatalystAPIClient,
|
|
10
|
+
getGlobalCatalystAPIClient,
|
|
11
|
+
loadProjectConfig,
|
|
12
|
+
ProjectConfigNotFoundException,
|
|
13
|
+
} from '../../../config';
|
|
9
14
|
import type { Logger } from '../../../types';
|
|
10
15
|
import type { AuthData } from '../../../types';
|
|
16
|
+
import type { Config } from '../../../types';
|
|
11
17
|
import enquirer from 'enquirer';
|
|
12
18
|
|
|
13
19
|
/**
|
|
@@ -16,25 +22,29 @@ import enquirer from 'enquirer';
|
|
|
16
22
|
export interface DatabaseInfo {
|
|
17
23
|
name: string;
|
|
18
24
|
url: string;
|
|
25
|
+
region: string;
|
|
19
26
|
}
|
|
20
27
|
|
|
21
28
|
/**
|
|
22
|
-
* Select an existing database or create a new one
|
|
29
|
+
* Select an existing database or create a new one.
|
|
30
|
+
* When creating a new database, uses the project's region from agentuity.json if available.
|
|
23
31
|
*/
|
|
24
32
|
export async function selectOrCreateDatabase(options: {
|
|
25
33
|
logger: Logger;
|
|
26
34
|
auth: AuthData;
|
|
27
35
|
orgId: string;
|
|
28
|
-
|
|
36
|
+
config: Config | null;
|
|
29
37
|
existingUrl?: string;
|
|
38
|
+
projectDir?: string;
|
|
30
39
|
}): Promise<DatabaseInfo> {
|
|
31
|
-
const { logger, auth, orgId,
|
|
32
|
-
const
|
|
40
|
+
const { logger, auth, orgId, config, existingUrl, projectDir } = options;
|
|
41
|
+
const profileName = config?.name;
|
|
42
|
+
const globalClient = await getGlobalCatalystAPIClient(logger, auth, profileName);
|
|
33
43
|
|
|
34
44
|
const resources = await tui.spinner({
|
|
35
|
-
message: `Fetching databases for ${orgId}
|
|
45
|
+
message: `Fetching databases for ${orgId}`,
|
|
36
46
|
clearOnSuccess: true,
|
|
37
|
-
callback: async () =>
|
|
47
|
+
callback: async () => listOrgResources(globalClient, { type: 'db', orgId }),
|
|
38
48
|
});
|
|
39
49
|
|
|
40
50
|
const databases = resources.db;
|
|
@@ -81,14 +91,42 @@ export async function selectOrCreateDatabase(options: {
|
|
|
81
91
|
|
|
82
92
|
// Handle "use existing" selection
|
|
83
93
|
if (response.database === '__existing__' && existingUrl && existingDbName) {
|
|
84
|
-
|
|
94
|
+
// Find the database to get its region
|
|
95
|
+
const existingDb = databases.find((d) => d.name === existingDbName);
|
|
96
|
+
const region = existingDb?.cloud_region ?? 'usc';
|
|
97
|
+
return { name: existingDbName, url: existingUrl, region };
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
if (response.database === '__create__') {
|
|
101
|
+
// For creating a new database, determine the region:
|
|
102
|
+
// 1. Try to get from project's agentuity.json
|
|
103
|
+
// 2. Fall back to first existing database's region
|
|
104
|
+
// 3. Fall back to 'usc' as default
|
|
105
|
+
let region: string | undefined;
|
|
106
|
+
|
|
107
|
+
if (projectDir) {
|
|
108
|
+
try {
|
|
109
|
+
const projectConfig = await loadProjectConfig(projectDir, config);
|
|
110
|
+
region = projectConfig.region;
|
|
111
|
+
logger.trace(`[auth init] Using region from project config: ${region}`);
|
|
112
|
+
} catch (err) {
|
|
113
|
+
if (!(err instanceof ProjectConfigNotFoundException)) {
|
|
114
|
+
logger.trace(`[auth init] Error loading project config: ${err}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!region) {
|
|
120
|
+
region = databases.length > 0 ? databases[0].cloud_region : 'usc';
|
|
121
|
+
logger.trace(`[auth init] Using fallback region: ${region}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const regionalClient = getCatalystAPIClient(logger, auth, region);
|
|
125
|
+
|
|
88
126
|
const created = await tui.spinner({
|
|
89
127
|
message: `Creating database in ${region}`,
|
|
90
128
|
clearOnSuccess: true,
|
|
91
|
-
callback: async () => createResources(
|
|
129
|
+
callback: async () => createResources(regionalClient, orgId, region, [{ type: 'db' }]),
|
|
92
130
|
});
|
|
93
131
|
|
|
94
132
|
if (created.length === 0) {
|
|
@@ -98,14 +136,15 @@ export async function selectOrCreateDatabase(options: {
|
|
|
98
136
|
const newDb = created[0];
|
|
99
137
|
tui.success(`Created database: ${tui.bold(newDb.name)}`);
|
|
100
138
|
|
|
101
|
-
|
|
139
|
+
// Fetch updated list to get the URL
|
|
140
|
+
const updatedResources = await listOrgResources(globalClient, { type: 'db', orgId });
|
|
102
141
|
const dbInfo = updatedResources.db.find((d) => d.name === newDb.name);
|
|
103
142
|
|
|
104
143
|
if (!dbInfo?.url) {
|
|
105
144
|
tui.fatal('Failed to retrieve database connection URL');
|
|
106
145
|
}
|
|
107
146
|
|
|
108
|
-
return { name: newDb.name, url: dbInfo.url };
|
|
147
|
+
return { name: newDb.name, url: dbInfo.url, region };
|
|
109
148
|
}
|
|
110
149
|
|
|
111
150
|
const selectedDb = databases.find((d) => d.name === response.database);
|
|
@@ -113,7 +152,7 @@ export async function selectOrCreateDatabase(options: {
|
|
|
113
152
|
tui.fatal('Failed to retrieve database connection URL');
|
|
114
153
|
}
|
|
115
154
|
|
|
116
|
-
return { name: selectedDb.name, url: selectedDb.url };
|
|
155
|
+
return { name: selectedDb.name, url: selectedDb.url, region: selectedDb.cloud_region };
|
|
117
156
|
}
|
|
118
157
|
|
|
119
158
|
/**
|
package/src/config.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
getAuthFromKeychain,
|
|
22
22
|
deleteAuthFromKeychain,
|
|
23
23
|
} from './keychain';
|
|
24
|
+
import { clearProfileCache } from './cache';
|
|
24
25
|
|
|
25
26
|
export const defaultProfileName = 'production';
|
|
26
27
|
|
|
@@ -330,6 +331,9 @@ export async function clearAuth(): Promise<void> {
|
|
|
330
331
|
}
|
|
331
332
|
}
|
|
332
333
|
|
|
334
|
+
// Clear resource cache for this profile
|
|
335
|
+
await clearProfileCache(profileName);
|
|
336
|
+
|
|
333
337
|
// Also clear from config file (for backwards compatibility)
|
|
334
338
|
if (config.auth) {
|
|
335
339
|
delete config.auth;
|
|
@@ -381,6 +385,13 @@ export async function getAuth(): Promise<AuthData | null> {
|
|
|
381
385
|
try {
|
|
382
386
|
const keychainAuth = await getAuthFromKeychain(profileName);
|
|
383
387
|
if (keychainAuth) {
|
|
388
|
+
// If there's auth api_key in the config file, remove it since we have it in keychain
|
|
389
|
+
if (config?.auth?.api_key) {
|
|
390
|
+
const { api_key: _, ...authWithoutApiKey } = config.auth;
|
|
391
|
+
const configCopy = { ...config, auth: authWithoutApiKey };
|
|
392
|
+
cachedConfig = null; // Force cache refresh
|
|
393
|
+
await saveConfig(configCopy);
|
|
394
|
+
}
|
|
384
395
|
return {
|
|
385
396
|
apiKey: keychainAuth.api_key,
|
|
386
397
|
userId: keychainAuth.user_id,
|
|
@@ -499,13 +510,7 @@ export function generateYAMLTemplate(name: string): string {
|
|
|
499
510
|
return lines.join('\n');
|
|
500
511
|
}
|
|
501
512
|
|
|
502
|
-
|
|
503
|
-
public name: string;
|
|
504
|
-
constructor() {
|
|
505
|
-
super('project not found');
|
|
506
|
-
this.name = 'ProjectConfigNotFoundExpection';
|
|
507
|
-
}
|
|
508
|
-
}
|
|
513
|
+
export const ProjectConfigNotFoundException = StructuredError('ProjectConfigNotFoundException');
|
|
509
514
|
|
|
510
515
|
type ProjectConfig = z.infer<typeof ProjectSchema>;
|
|
511
516
|
|
|
@@ -529,7 +534,7 @@ export async function loadProjectConfig(
|
|
|
529
534
|
// and then if so:
|
|
530
535
|
// 1. if authentication, offer to import the project
|
|
531
536
|
// 2. tell them that they need to login to use the command and import the project
|
|
532
|
-
throw new
|
|
537
|
+
throw new ProjectConfigNotFoundException({ message: 'project config not found' });
|
|
533
538
|
}
|
|
534
539
|
const text = await file.text();
|
|
535
540
|
const parsedConfig = JSON5.parse(text);
|
|
@@ -707,6 +712,57 @@ export function getCatalystAPIClient(logger: Logger, auth: AuthData, region: str
|
|
|
707
712
|
return new ServerAPIClient(catalystUrl, logger, auth.apiKey);
|
|
708
713
|
}
|
|
709
714
|
|
|
715
|
+
interface RegionsCacheData {
|
|
716
|
+
timestamp: number;
|
|
717
|
+
regions: Array<{ region: string; description: string }>;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
/**
|
|
721
|
+
* Get the default region using priority ordering:
|
|
722
|
+
* 1. AGENTUITY_REGION environment variable
|
|
723
|
+
* 2. First entry in region-{profile}.json (nearest region, sorted by distance)
|
|
724
|
+
* 3. 'local' for local profile, 'usc' otherwise
|
|
725
|
+
*
|
|
726
|
+
* Used for API calls that can hit any Catalyst instance (global database operations).
|
|
727
|
+
* Note: This is NOT called when --region flag is provided (handled at command level).
|
|
728
|
+
*/
|
|
729
|
+
export async function getDefaultRegion(profileName = 'production'): Promise<string> {
|
|
730
|
+
// 1. Check environment variable first
|
|
731
|
+
if (process.env.AGENTUITY_REGION) {
|
|
732
|
+
return process.env.AGENTUITY_REGION;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// 2. Check cached regions file (sorted by distance)
|
|
736
|
+
try {
|
|
737
|
+
const cachePath = join(getDefaultConfigDir(), `regions-${profileName}.json`);
|
|
738
|
+
const file = Bun.file(cachePath);
|
|
739
|
+
if (await file.exists()) {
|
|
740
|
+
const data: RegionsCacheData = await file.json();
|
|
741
|
+
if (data.regions && data.regions.length > 0) {
|
|
742
|
+
return data.regions[0].region;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
} catch {
|
|
746
|
+
// Fall through to default
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
// 3. Final fallback - 'local' for local profile, 'usc' otherwise
|
|
750
|
+
return profileName === 'local' ? 'local' : 'usc';
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* Get a Catalyst API client for global database operations.
|
|
755
|
+
* Uses the default region since the admin DB is global.
|
|
756
|
+
*/
|
|
757
|
+
export async function getGlobalCatalystAPIClient(
|
|
758
|
+
logger: Logger,
|
|
759
|
+
auth: AuthData,
|
|
760
|
+
profileName = 'production'
|
|
761
|
+
) {
|
|
762
|
+
const region = await getDefaultRegion(profileName);
|
|
763
|
+
return getCatalystAPIClient(logger, auth, region);
|
|
764
|
+
}
|
|
765
|
+
|
|
710
766
|
export function getIONHost(config: Config | null, region: string) {
|
|
711
767
|
if (config?.overrides?.ion_url) {
|
|
712
768
|
const url = new URL(config.overrides.ion_url);
|
package/src/env-util.ts
CHANGED
|
@@ -8,6 +8,42 @@ export interface EnvVars {
|
|
|
8
8
|
[key: string]: string;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Prefixes for public/frontend-exposed environment variables
|
|
13
|
+
*/
|
|
14
|
+
export const PUBLIC_VAR_PREFIXES = ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'] as const;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Check if a key is a public variable (exposed to frontend)
|
|
18
|
+
*/
|
|
19
|
+
export function isPublicVarKey(key: string): boolean {
|
|
20
|
+
const upperKey = key.toUpperCase();
|
|
21
|
+
return PUBLIC_VAR_PREFIXES.some((prefix) => upperKey.startsWith(prefix));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Check if a key is a reserved AGENTUITY key (except AGENTUITY_PUBLIC_)
|
|
26
|
+
*/
|
|
27
|
+
export function isReservedAgentuityKey(key: string): boolean {
|
|
28
|
+
const upperKey = key.toUpperCase();
|
|
29
|
+
return upperKey.startsWith('AGENTUITY_') && !upperKey.startsWith('AGENTUITY_PUBLIC_');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Get public variable keys from secrets that should not be secrets
|
|
34
|
+
*/
|
|
35
|
+
export function getPublicSecretKeys(secrets: EnvVars): string[] {
|
|
36
|
+
return Object.keys(secrets).filter(isPublicVarKey);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Validate that no public variables are being added as secrets
|
|
41
|
+
* Returns the list of invalid keys, or empty array if valid
|
|
42
|
+
*/
|
|
43
|
+
export function validateNoPublicSecrets(secrets: EnvVars): string[] {
|
|
44
|
+
return getPublicSecretKeys(secrets);
|
|
45
|
+
}
|
|
46
|
+
|
|
11
47
|
/**
|
|
12
48
|
* Find an existing .env file for reading.
|
|
13
49
|
*/
|
|
@@ -162,14 +198,16 @@ export function mergeEnvVars(
|
|
|
162
198
|
}
|
|
163
199
|
|
|
164
200
|
/**
|
|
165
|
-
* Filter out AGENTUITY_ prefixed keys from env vars
|
|
201
|
+
* Filter out reserved AGENTUITY_ prefixed keys from env vars
|
|
166
202
|
* This is used when pushing to the cloud to avoid sending SDK keys
|
|
203
|
+
* Note: AGENTUITY_PUBLIC_* keys are allowed (they are public env vars)
|
|
167
204
|
*/
|
|
168
|
-
export function filterAgentuitySdkKeys(vars
|
|
205
|
+
export function filterAgentuitySdkKeys(vars?: EnvVars): EnvVars {
|
|
206
|
+
if (!vars) return {};
|
|
169
207
|
const filtered: EnvVars = {};
|
|
170
208
|
|
|
171
209
|
for (const [key, value] of Object.entries(vars)) {
|
|
172
|
-
if (!key
|
|
210
|
+
if (!isReservedAgentuityKey(key)) {
|
|
173
211
|
filtered[key] = value;
|
|
174
212
|
}
|
|
175
213
|
}
|
|
@@ -186,6 +224,7 @@ const secretExactKeys = ['DATABASE_URL'];
|
|
|
186
224
|
* Split env vars into env and secrets based on key names
|
|
187
225
|
* Convention: Keys ending with _SECRET, _KEY, _TOKEN, _PASSWORD are secrets
|
|
188
226
|
* Also treats DATABASE_URL as a secret since it contains credentials
|
|
227
|
+
* Note: Public vars (VITE_, AGENTUITY_PUBLIC_, PUBLIC_) always go to env, never secrets
|
|
189
228
|
*/
|
|
190
229
|
export function splitEnvAndSecrets(vars: EnvVars): {
|
|
191
230
|
env: EnvVars;
|
|
@@ -197,8 +236,14 @@ export function splitEnvAndSecrets(vars: EnvVars): {
|
|
|
197
236
|
const secretSuffixes = ['_SECRET', '_KEY', '_TOKEN', '_PASSWORD', '_PRIVATE'];
|
|
198
237
|
|
|
199
238
|
for (const [key, value] of Object.entries(vars)) {
|
|
200
|
-
// Skip AGENTUITY_ prefixed keys
|
|
201
|
-
if (key
|
|
239
|
+
// Skip reserved AGENTUITY_ prefixed keys (except AGENTUITY_PUBLIC_)
|
|
240
|
+
if (isReservedAgentuityKey(key)) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Public vars always go to env, never secrets
|
|
245
|
+
if (isPublicVarKey(key)) {
|
|
246
|
+
env[key] = value;
|
|
202
247
|
continue;
|
|
203
248
|
}
|
|
204
249
|
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { StructuredError, type Logger } from '@agentuity/core';
|
|
2
|
+
import type { Config } from '../types';
|
|
3
|
+
import { getAppBaseURL } from '@agentuity/server';
|
|
4
|
+
import { getUserAgent } from '../api';
|
|
5
|
+
import { getDefaultConfigDir } from '../config';
|
|
6
|
+
import { join, dirname } from 'node:path';
|
|
7
|
+
import { mkdir } from 'node:fs/promises';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
|
|
10
|
+
const AptValidationError = StructuredError('AptValidationError');
|
|
11
|
+
const AptValidationAPIError = StructuredError('AptValidationAPIError')<{
|
|
12
|
+
status?: number;
|
|
13
|
+
body?: string;
|
|
14
|
+
}>();
|
|
15
|
+
const AptValidationResponseError = StructuredError('AptValidationResponseError')<{
|
|
16
|
+
parseError?: string;
|
|
17
|
+
}>();
|
|
18
|
+
|
|
19
|
+
export interface InvalidPackage {
|
|
20
|
+
package: string;
|
|
21
|
+
error: string;
|
|
22
|
+
requestedVersion?: string;
|
|
23
|
+
availableVersions?: string[];
|
|
24
|
+
searchUrl: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface AptValidationResult {
|
|
28
|
+
valid: string[];
|
|
29
|
+
invalid: InvalidPackage[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const InvalidPackageSchema = z.object({
|
|
33
|
+
package: z.string(),
|
|
34
|
+
error: z.string(),
|
|
35
|
+
requestedVersion: z.string().optional(),
|
|
36
|
+
availableVersions: z.array(z.string()).optional(),
|
|
37
|
+
searchUrl: z.string(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const ValidateAptDependenciesResponseSchema = z.object({
|
|
41
|
+
success: z.boolean(),
|
|
42
|
+
data: z
|
|
43
|
+
.object({
|
|
44
|
+
valid: z.array(z.string()),
|
|
45
|
+
invalid: z.array(InvalidPackageSchema),
|
|
46
|
+
})
|
|
47
|
+
.optional(),
|
|
48
|
+
message: z.string().optional(),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const REQUEST_TIMEOUT_MS = 30000; // 30 seconds client-side timeout
|
|
52
|
+
|
|
53
|
+
const CacheEntrySchema = z.object({
|
|
54
|
+
timestamp: z.number(),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const ValidationCacheSchema = z.object({
|
|
58
|
+
version: z.number(),
|
|
59
|
+
entries: z.record(z.string(), CacheEntrySchema),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
type ValidationCache = z.infer<typeof ValidationCacheSchema>;
|
|
63
|
+
|
|
64
|
+
const CACHE_VERSION = 1;
|
|
65
|
+
const CACHE_TTL_MS = 90 * 24 * 60 * 60 * 1000; // 90 days
|
|
66
|
+
|
|
67
|
+
function getCachePath(): string {
|
|
68
|
+
return join(getDefaultConfigDir(), 'dependency-validation.json');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function loadCache(logger: Logger): Promise<ValidationCache> {
|
|
72
|
+
const cachePath = getCachePath();
|
|
73
|
+
try {
|
|
74
|
+
const file = Bun.file(cachePath);
|
|
75
|
+
if (await file.exists()) {
|
|
76
|
+
const content = await file.json();
|
|
77
|
+
const parsed = ValidationCacheSchema.safeParse(content);
|
|
78
|
+
if (parsed.success && parsed.data.version === CACHE_VERSION) {
|
|
79
|
+
return parsed.data;
|
|
80
|
+
}
|
|
81
|
+
logger.debug('Cache invalid or version mismatch, starting fresh');
|
|
82
|
+
}
|
|
83
|
+
} catch (err) {
|
|
84
|
+
logger.debug('Failed to load validation cache: %s', err);
|
|
85
|
+
}
|
|
86
|
+
return { version: CACHE_VERSION, entries: {} };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function saveCache(cache: ValidationCache, logger: Logger): Promise<void> {
|
|
90
|
+
const cachePath = getCachePath();
|
|
91
|
+
try {
|
|
92
|
+
await mkdir(dirname(cachePath), { recursive: true });
|
|
93
|
+
await Bun.write(cachePath, JSON.stringify(cache, null, 2));
|
|
94
|
+
} catch (err) {
|
|
95
|
+
logger.debug('Failed to save validation cache: %s', err);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function isCacheEntryValid(entry: z.infer<typeof CacheEntrySchema>): boolean {
|
|
100
|
+
return Date.now() - entry.timestamp < CACHE_TTL_MS;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Validate apt dependencies against the Debian package repository.
|
|
105
|
+
* Uses a local cache to avoid redundant API calls.
|
|
106
|
+
* Calls the app API which checks packages against snapshot.debian.org.
|
|
107
|
+
*/
|
|
108
|
+
export async function validateAptDependencies(
|
|
109
|
+
packages: string[],
|
|
110
|
+
region: string,
|
|
111
|
+
config: Config | null,
|
|
112
|
+
logger: Logger
|
|
113
|
+
): Promise<AptValidationResult> {
|
|
114
|
+
if (packages.length === 0) {
|
|
115
|
+
return { valid: [], invalid: [] };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const cache = await loadCache(logger);
|
|
119
|
+
const now = Date.now();
|
|
120
|
+
|
|
121
|
+
const cachedValid: string[] = [];
|
|
122
|
+
const uncachedPackages: string[] = [];
|
|
123
|
+
|
|
124
|
+
// Check cache for each package (only valid packages are cached)
|
|
125
|
+
for (const pkg of packages) {
|
|
126
|
+
const entry = cache.entries[pkg];
|
|
127
|
+
if (entry && isCacheEntryValid(entry)) {
|
|
128
|
+
cachedValid.push(pkg);
|
|
129
|
+
logger.debug('Cache hit (valid): %s', pkg);
|
|
130
|
+
} else {
|
|
131
|
+
uncachedPackages.push(pkg);
|
|
132
|
+
logger.debug('Cache miss: %s', pkg);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// If all packages are cached, return immediately
|
|
137
|
+
if (uncachedPackages.length === 0) {
|
|
138
|
+
logger.debug('All %d packages found in cache', packages.length);
|
|
139
|
+
return { valid: cachedValid, invalid: [] };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
logger.debug(
|
|
143
|
+
'Validating %d uncached packages (%d cached)',
|
|
144
|
+
uncachedPackages.length,
|
|
145
|
+
packages.length - uncachedPackages.length
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const appBaseUrl = getAppBaseURL(region, config?.overrides);
|
|
149
|
+
const url = `${appBaseUrl}/api/cli/validate/apt-dependencies`;
|
|
150
|
+
|
|
151
|
+
const response = await fetch(url, {
|
|
152
|
+
method: 'POST',
|
|
153
|
+
headers: {
|
|
154
|
+
'Content-Type': 'application/json',
|
|
155
|
+
'User-Agent': getUserAgent(config),
|
|
156
|
+
},
|
|
157
|
+
body: JSON.stringify({ packages: uncachedPackages }),
|
|
158
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
if (!response.ok) {
|
|
162
|
+
const text = await response.text();
|
|
163
|
+
throw new AptValidationAPIError({
|
|
164
|
+
message: `Failed to validate apt dependencies: HTTP ${response.status}`,
|
|
165
|
+
status: response.status,
|
|
166
|
+
body: text,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
let json: unknown;
|
|
171
|
+
try {
|
|
172
|
+
json = await response.json();
|
|
173
|
+
} catch (err) {
|
|
174
|
+
throw new AptValidationResponseError({
|
|
175
|
+
message: 'Invalid JSON in API response',
|
|
176
|
+
parseError: err instanceof Error ? err.message : String(err),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const parsed = ValidateAptDependenciesResponseSchema.safeParse(json);
|
|
181
|
+
|
|
182
|
+
if (!parsed.success) {
|
|
183
|
+
throw new AptValidationResponseError({
|
|
184
|
+
message: 'Invalid API response structure',
|
|
185
|
+
parseError: parsed.error.message,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const result = parsed.data;
|
|
190
|
+
|
|
191
|
+
if (!result.success || !result.data) {
|
|
192
|
+
throw new AptValidationError({
|
|
193
|
+
message: result.message ?? 'Failed to validate apt dependencies',
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Update cache with valid results only (don't cache invalid packages)
|
|
198
|
+
for (const pkg of result.data.valid) {
|
|
199
|
+
cache.entries[pkg] = { timestamp: now };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
await saveCache(cache, logger);
|
|
203
|
+
|
|
204
|
+
logger.debug(
|
|
205
|
+
'Apt validation complete: %d valid, %d invalid (from API)',
|
|
206
|
+
result.data.valid.length,
|
|
207
|
+
result.data.invalid.length
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
// Combine cached and fresh results
|
|
211
|
+
return {
|
|
212
|
+
valid: [...cachedValid, ...result.data.valid],
|
|
213
|
+
invalid: result.data.invalid,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/secret/delete.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,gBAAgB,yCA8C3B,CAAC"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { createSubcommand } from '../../../types';
|
|
3
|
-
import * as tui from '../../../tui';
|
|
4
|
-
import { projectEnvDelete } from '@agentuity/server';
|
|
5
|
-
import { findExistingEnvFile, readEnvFile, writeEnvFile, filterAgentuitySdkKeys, } from '../../../env-util';
|
|
6
|
-
import { getCommand } from '../../../command-prefix';
|
|
7
|
-
const SecretDeleteResponseSchema = z.object({
|
|
8
|
-
success: z.boolean().describe('Whether the operation succeeded'),
|
|
9
|
-
key: z.string().describe('Secret key name that was deleted'),
|
|
10
|
-
path: z.string().describe('Local file path where secret was removed'),
|
|
11
|
-
});
|
|
12
|
-
export const deleteSubcommand = createSubcommand({
|
|
13
|
-
name: 'delete',
|
|
14
|
-
aliases: ['del', 'remove', 'rm'],
|
|
15
|
-
description: 'Delete a secret',
|
|
16
|
-
tags: ['destructive', 'deletes-resource', 'slow', 'requires-auth', 'requires-project'],
|
|
17
|
-
idempotent: true,
|
|
18
|
-
examples: [
|
|
19
|
-
{ command: getCommand('secret delete OLD_API_KEY'), description: 'Delete item' },
|
|
20
|
-
{ command: getCommand('secret rm DATABASE_URL'), description: 'Delete item' },
|
|
21
|
-
],
|
|
22
|
-
requires: { auth: true, project: true, apiClient: true },
|
|
23
|
-
schema: {
|
|
24
|
-
args: z.object({
|
|
25
|
-
key: z.string().describe('the secret key to delete'),
|
|
26
|
-
}),
|
|
27
|
-
response: SecretDeleteResponseSchema,
|
|
28
|
-
},
|
|
29
|
-
async handler(ctx) {
|
|
30
|
-
const { args, apiClient, project, projectDir } = ctx;
|
|
31
|
-
// Delete from cloud (using secrets field)
|
|
32
|
-
await tui.spinner('Deleting secret from cloud', () => {
|
|
33
|
-
return projectEnvDelete(apiClient, {
|
|
34
|
-
id: project.projectId,
|
|
35
|
-
secrets: [args.key],
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
// Update local .env file
|
|
39
|
-
const envFilePath = await findExistingEnvFile(projectDir);
|
|
40
|
-
const currentEnv = await readEnvFile(envFilePath);
|
|
41
|
-
delete currentEnv[args.key];
|
|
42
|
-
// Filter out AGENTUITY_ keys before writing
|
|
43
|
-
const filteredEnv = filterAgentuitySdkKeys(currentEnv);
|
|
44
|
-
await writeEnvFile(envFilePath, filteredEnv);
|
|
45
|
-
tui.success(`Secret '${args.key}' deleted successfully (cloud + ${envFilePath})`);
|
|
46
|
-
return {
|
|
47
|
-
success: true,
|
|
48
|
-
key: args.key,
|
|
49
|
-
path: envFilePath,
|
|
50
|
-
};
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
//# sourceMappingURL=delete.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/secret/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACN,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,sBAAsB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAChE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CACrE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;IAChD,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;IAChC,WAAW,EAAE,iBAAiB;IAC9B,IAAI,EAAE,CAAC,aAAa,EAAE,kBAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,kBAAkB,CAAC;IACtF,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE;QACT,EAAE,OAAO,EAAE,UAAU,CAAC,2BAA2B,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE;QAChF,EAAE,OAAO,EAAE,UAAU,CAAC,wBAAwB,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE;KAC7E;IACD,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;IACxD,MAAM,EAAE;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;SACpD,CAAC;QACF,QAAQ,EAAE,0BAA0B;KACpC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;QAErD,0CAA0C;QAC1C,MAAM,GAAG,CAAC,OAAO,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpD,OAAO,gBAAgB,CAAC,SAAS,EAAE;gBAClC,EAAE,EAAE,OAAO,CAAC,SAAS;gBACrB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE5B,4CAA4C;QAC5C,MAAM,WAAW,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE7C,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,mCAAmC,WAAW,GAAG,CAAC,CAAC;QAElF,OAAO;YACN,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,WAAW;SACjB,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/secret/get.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,yCAgExB,CAAC"}
|