@agentuity/cli 0.0.49 → 0.0.51
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 +17 -4
- package/README.md +26 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cmd/{capabilities → ai/capabilities}/index.d.ts +1 -1
- package/dist/cmd/ai/capabilities/index.d.ts.map +1 -0
- package/dist/cmd/{capabilities → ai/capabilities}/show.d.ts +1 -1
- package/dist/cmd/ai/capabilities/show.d.ts.map +1 -0
- package/dist/cmd/ai/index.d.ts.map +1 -0
- package/dist/cmd/ai/prompt/index.d.ts +4 -0
- package/dist/cmd/ai/prompt/index.d.ts.map +1 -0
- package/dist/cmd/ai/prompt/llm.d.ts +3 -0
- package/dist/cmd/ai/prompt/llm.d.ts.map +1 -0
- package/dist/cmd/ai/schema/index.d.ts +4 -0
- package/dist/cmd/ai/schema/index.d.ts.map +1 -0
- package/dist/cmd/ai/schema/show.d.ts +3 -0
- package/dist/cmd/ai/schema/show.d.ts.map +1 -0
- package/dist/cmd/auth/ssh/list.d.ts.map +1 -1
- package/dist/cmd/{bundle → build}/ast.d.ts +3 -1
- package/dist/cmd/build/ast.d.ts.map +1 -0
- package/dist/cmd/{bundle → build}/ast.test.d.ts.map +1 -1
- package/dist/cmd/build/bundler.d.ts.map +1 -0
- package/dist/cmd/build/file.d.ts.map +1 -0
- package/dist/cmd/build/fix-duplicate-exports.d.ts.map +1 -0
- package/dist/cmd/build/fix-duplicate-exports.test.d.ts.map +1 -0
- package/dist/cmd/build/index.d.ts.map +1 -0
- package/dist/cmd/build/patch/_util.d.ts.map +1 -0
- package/dist/cmd/build/patch/aisdk.d.ts.map +1 -0
- package/dist/cmd/build/patch/index.d.ts.map +1 -0
- package/dist/cmd/build/patch/llm.d.ts.map +1 -0
- package/dist/cmd/build/plugin.d.ts.map +1 -0
- package/dist/cmd/cloud/agents/index.d.ts +3 -0
- package/dist/cmd/cloud/agents/index.d.ts.map +1 -0
- package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
- package/dist/cmd/cloud/env/delete.d.ts +2 -0
- package/dist/cmd/cloud/env/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/env/get.d.ts +2 -0
- package/dist/cmd/cloud/env/get.d.ts.map +1 -0
- package/dist/cmd/cloud/env/import.d.ts +2 -0
- package/dist/cmd/cloud/env/import.d.ts.map +1 -0
- package/dist/cmd/cloud/env/index.d.ts +3 -0
- package/dist/cmd/cloud/env/index.d.ts.map +1 -0
- package/dist/cmd/cloud/env/list.d.ts +2 -0
- package/dist/cmd/cloud/env/list.d.ts.map +1 -0
- package/dist/cmd/cloud/env/pull.d.ts +2 -0
- package/dist/cmd/cloud/env/pull.d.ts.map +1 -0
- package/dist/cmd/cloud/env/push.d.ts +2 -0
- package/dist/cmd/cloud/env/push.d.ts.map +1 -0
- package/dist/cmd/cloud/env/set.d.ts +2 -0
- package/dist/cmd/cloud/env/set.d.ts.map +1 -0
- package/dist/cmd/cloud/index.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/create-namespace.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/delete.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/get.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/index.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/index.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/keys.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/keys.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/repl.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/repl.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/search.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/search.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/set.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -0
- package/dist/cmd/cloud/keyvalue/stats.d.ts +3 -0
- package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -0
- package/dist/cmd/{kv → cloud/keyvalue}/util.d.ts +1 -1
- package/dist/cmd/cloud/keyvalue/util.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/delete-bucket.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/delete-bucket.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/delete.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/get.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/get.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/index.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/index.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/list-buckets.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/list-buckets.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/list-keys.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/list-keys.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/put.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/put.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/repl.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/repl.d.ts.map +1 -0
- package/dist/cmd/cloud/objectstore/url.d.ts +3 -0
- package/dist/cmd/cloud/objectstore/url.d.ts.map +1 -0
- package/dist/cmd/{objectstore → cloud/objectstore}/util.d.ts +1 -1
- package/dist/cmd/cloud/objectstore/util.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/delete.d.ts +2 -0
- package/dist/cmd/cloud/secret/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/get.d.ts +2 -0
- package/dist/cmd/cloud/secret/get.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/import.d.ts +2 -0
- package/dist/cmd/cloud/secret/import.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/index.d.ts +3 -0
- package/dist/cmd/cloud/secret/index.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/list.d.ts +2 -0
- package/dist/cmd/cloud/secret/list.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/pull.d.ts +2 -0
- package/dist/cmd/cloud/secret/pull.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/push.d.ts +2 -0
- package/dist/cmd/cloud/secret/push.d.ts.map +1 -0
- package/dist/cmd/cloud/secret/set.d.ts +2 -0
- package/dist/cmd/cloud/secret/set.d.ts.map +1 -0
- package/dist/cmd/cloud/session/get.d.ts +2 -0
- package/dist/cmd/cloud/session/get.d.ts.map +1 -0
- package/dist/cmd/cloud/session/index.d.ts +2 -0
- package/dist/cmd/cloud/session/index.d.ts.map +1 -0
- package/dist/cmd/cloud/session/list.d.ts +2 -0
- package/dist/cmd/cloud/session/list.d.ts.map +1 -0
- package/dist/cmd/cloud/session/logs.d.ts +2 -0
- package/dist/cmd/cloud/session/logs.d.ts.map +1 -0
- package/dist/cmd/dev/agents.d.ts +2 -0
- package/dist/cmd/dev/agents.d.ts.map +1 -0
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/sync.d.ts +12 -0
- package/dist/cmd/dev/sync.d.ts.map +1 -0
- package/dist/cmd/profile/index.d.ts.map +1 -1
- package/dist/repl.d.ts +2 -6
- package/dist/repl.d.ts.map +1 -1
- package/dist/tui.d.ts +24 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/format.d.ts +9 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/package.json +6 -3
- package/src/cli.ts +13 -6
- package/src/cmd/{capabilities → ai/capabilities}/index.ts +2 -2
- package/src/cmd/{capabilities → ai/capabilities}/show.ts +6 -6
- package/src/cmd/ai/index.ts +11 -0
- package/src/cmd/{prompt → ai/prompt}/index.ts +2 -2
- package/src/cmd/{prompt → ai/prompt}/llm.ts +6 -6
- package/src/cmd/{schema → ai/schema}/index.ts +2 -2
- package/src/cmd/{schema → ai/schema}/show.ts +3 -3
- package/src/cmd/auth/ssh/list.ts +10 -16
- package/src/cmd/{bundle → build}/ast.test.ts +2 -2
- package/src/cmd/{bundle → build}/ast.ts +85 -17
- package/src/cmd/build/index.ts +89 -0
- package/src/cmd/{bundle → build}/plugin.ts +24 -2
- package/src/cmd/cloud/agents/index.ts +148 -0
- package/src/cmd/cloud/deploy.ts +1 -1
- package/src/cmd/cloud/deployment/list.ts +16 -22
- package/src/cmd/{env → cloud/env}/delete.ts +4 -4
- package/src/cmd/{env → cloud/env}/get.ts +5 -5
- package/src/cmd/{env → cloud/env}/import.ts +4 -4
- package/src/cmd/{env → cloud/env}/index.ts +2 -1
- package/src/cmd/{env → cloud/env}/list.ts +4 -4
- package/src/cmd/{env → cloud/env}/pull.ts +4 -4
- package/src/cmd/{env → cloud/env}/push.ts +4 -4
- package/src/cmd/{env → cloud/env}/set.ts +4 -4
- package/src/cmd/cloud/index.ts +12 -0
- package/src/cmd/{kv → cloud/keyvalue}/create-namespace.ts +3 -3
- package/src/cmd/{kv → cloud/keyvalue}/delete-namespace.ts +4 -4
- package/src/cmd/{kv → cloud/keyvalue}/delete.ts +3 -3
- package/src/cmd/{kv → cloud/keyvalue}/get.ts +4 -4
- package/src/cmd/{kv → cloud/keyvalue}/index.ts +2 -1
- package/src/cmd/{kv → cloud/keyvalue}/keys.ts +3 -3
- package/src/cmd/{kv → cloud/keyvalue}/list-namespaces.ts +3 -3
- package/src/cmd/{kv → cloud/keyvalue}/repl.ts +6 -6
- package/src/cmd/{kv → cloud/keyvalue}/search.ts +3 -3
- package/src/cmd/{kv → cloud/keyvalue}/set.ts +4 -4
- package/src/cmd/{kv → cloud/keyvalue}/stats.ts +3 -3
- package/src/cmd/{kv → cloud/keyvalue}/util.ts +4 -4
- package/src/cmd/{objectstore → cloud/objectstore}/delete-bucket.ts +3 -3
- package/src/cmd/{objectstore → cloud/objectstore}/delete.ts +3 -3
- package/src/cmd/{objectstore → cloud/objectstore}/get.ts +4 -4
- package/src/cmd/{objectstore → cloud/objectstore}/index.ts +2 -1
- package/src/cmd/{objectstore → cloud/objectstore}/list-buckets.ts +3 -3
- package/src/cmd/{objectstore → cloud/objectstore}/list-keys.ts +3 -3
- package/src/cmd/{objectstore → cloud/objectstore}/put.ts +4 -4
- package/src/cmd/{objectstore → cloud/objectstore}/repl.ts +6 -6
- package/src/cmd/{objectstore → cloud/objectstore}/url.ts +3 -3
- package/src/cmd/{objectstore → cloud/objectstore}/util.ts +3 -3
- package/src/cmd/{secret → cloud/secret}/delete.ts +4 -4
- package/src/cmd/{secret → cloud/secret}/get.ts +5 -5
- package/src/cmd/{secret → cloud/secret}/import.ts +4 -4
- package/src/cmd/{secret → cloud/secret}/index.ts +2 -1
- package/src/cmd/{secret → cloud/secret}/list.ts +4 -4
- package/src/cmd/{secret → cloud/secret}/pull.ts +4 -4
- package/src/cmd/{secret → cloud/secret}/push.ts +4 -4
- package/src/cmd/{secret → cloud/secret}/set.ts +4 -4
- package/src/cmd/cloud/session/get.ts +164 -0
- package/src/cmd/cloud/session/index.ts +11 -0
- package/src/cmd/cloud/session/list.ts +145 -0
- package/src/cmd/cloud/session/logs.ts +68 -0
- package/src/cmd/dev/agents.ts +122 -0
- package/src/cmd/dev/index.ts +103 -9
- package/src/cmd/dev/sync.ts +414 -0
- package/src/cmd/profile/index.ts +1 -0
- package/src/cmd/project/create.ts +1 -1
- package/src/cmd/project/index.ts +1 -1
- package/src/cmd/project/list.ts +1 -1
- package/src/cmd/project/show.ts +1 -1
- package/src/repl.ts +2 -12
- package/src/tui.ts +94 -0
- package/src/types.ts +13 -10
- package/src/utils/format.ts +17 -0
- package/dist/cmd/bundle/ast.d.ts.map +0 -1
- package/dist/cmd/bundle/bundler.d.ts.map +0 -1
- package/dist/cmd/bundle/file.d.ts.map +0 -1
- package/dist/cmd/bundle/fix-duplicate-exports.d.ts.map +0 -1
- package/dist/cmd/bundle/fix-duplicate-exports.test.d.ts.map +0 -1
- package/dist/cmd/bundle/index.d.ts.map +0 -1
- package/dist/cmd/bundle/patch/_util.d.ts.map +0 -1
- package/dist/cmd/bundle/patch/aisdk.d.ts.map +0 -1
- package/dist/cmd/bundle/patch/index.d.ts.map +0 -1
- package/dist/cmd/bundle/patch/llm.d.ts.map +0 -1
- package/dist/cmd/bundle/plugin.d.ts.map +0 -1
- package/dist/cmd/capabilities/index.d.ts.map +0 -1
- package/dist/cmd/capabilities/show.d.ts.map +0 -1
- package/dist/cmd/env/delete.d.ts +0 -2
- package/dist/cmd/env/delete.d.ts.map +0 -1
- package/dist/cmd/env/get.d.ts +0 -2
- package/dist/cmd/env/get.d.ts.map +0 -1
- package/dist/cmd/env/import.d.ts +0 -2
- package/dist/cmd/env/import.d.ts.map +0 -1
- package/dist/cmd/env/index.d.ts.map +0 -1
- package/dist/cmd/env/list.d.ts +0 -2
- package/dist/cmd/env/list.d.ts.map +0 -1
- package/dist/cmd/env/pull.d.ts +0 -2
- package/dist/cmd/env/pull.d.ts.map +0 -1
- package/dist/cmd/env/push.d.ts +0 -2
- package/dist/cmd/env/push.d.ts.map +0 -1
- package/dist/cmd/env/set.d.ts +0 -2
- package/dist/cmd/env/set.d.ts.map +0 -1
- package/dist/cmd/kv/create-namespace.d.ts +0 -3
- package/dist/cmd/kv/create-namespace.d.ts.map +0 -1
- package/dist/cmd/kv/delete-namespace.d.ts +0 -3
- package/dist/cmd/kv/delete-namespace.d.ts.map +0 -1
- package/dist/cmd/kv/delete.d.ts +0 -3
- package/dist/cmd/kv/delete.d.ts.map +0 -1
- package/dist/cmd/kv/get.d.ts +0 -3
- package/dist/cmd/kv/get.d.ts.map +0 -1
- package/dist/cmd/kv/index.d.ts +0 -2
- package/dist/cmd/kv/index.d.ts.map +0 -1
- package/dist/cmd/kv/keys.d.ts +0 -3
- package/dist/cmd/kv/keys.d.ts.map +0 -1
- package/dist/cmd/kv/list-namespaces.d.ts +0 -3
- package/dist/cmd/kv/list-namespaces.d.ts.map +0 -1
- package/dist/cmd/kv/repl.d.ts +0 -3
- package/dist/cmd/kv/repl.d.ts.map +0 -1
- package/dist/cmd/kv/search.d.ts +0 -3
- package/dist/cmd/kv/search.d.ts.map +0 -1
- package/dist/cmd/kv/set.d.ts +0 -3
- package/dist/cmd/kv/set.d.ts.map +0 -1
- package/dist/cmd/kv/stats.d.ts +0 -3
- package/dist/cmd/kv/stats.d.ts.map +0 -1
- package/dist/cmd/kv/util.d.ts.map +0 -1
- package/dist/cmd/objectstore/delete-bucket.d.ts +0 -3
- package/dist/cmd/objectstore/delete-bucket.d.ts.map +0 -1
- package/dist/cmd/objectstore/delete.d.ts +0 -3
- package/dist/cmd/objectstore/delete.d.ts.map +0 -1
- package/dist/cmd/objectstore/get.d.ts +0 -3
- package/dist/cmd/objectstore/get.d.ts.map +0 -1
- package/dist/cmd/objectstore/index.d.ts +0 -2
- package/dist/cmd/objectstore/index.d.ts.map +0 -1
- package/dist/cmd/objectstore/list-buckets.d.ts +0 -3
- package/dist/cmd/objectstore/list-buckets.d.ts.map +0 -1
- package/dist/cmd/objectstore/list-keys.d.ts +0 -3
- package/dist/cmd/objectstore/list-keys.d.ts.map +0 -1
- package/dist/cmd/objectstore/put.d.ts +0 -3
- package/dist/cmd/objectstore/put.d.ts.map +0 -1
- package/dist/cmd/objectstore/repl.d.ts +0 -3
- package/dist/cmd/objectstore/repl.d.ts.map +0 -1
- package/dist/cmd/objectstore/url.d.ts +0 -3
- package/dist/cmd/objectstore/url.d.ts.map +0 -1
- package/dist/cmd/objectstore/util.d.ts.map +0 -1
- package/dist/cmd/prompt/index.d.ts +0 -4
- package/dist/cmd/prompt/index.d.ts.map +0 -1
- package/dist/cmd/prompt/llm.d.ts +0 -3
- package/dist/cmd/prompt/llm.d.ts.map +0 -1
- package/dist/cmd/schema/index.d.ts +0 -4
- package/dist/cmd/schema/index.d.ts.map +0 -1
- package/dist/cmd/schema/show.d.ts +0 -3
- package/dist/cmd/schema/show.d.ts.map +0 -1
- package/dist/cmd/secret/delete.d.ts +0 -2
- package/dist/cmd/secret/delete.d.ts.map +0 -1
- package/dist/cmd/secret/get.d.ts +0 -2
- package/dist/cmd/secret/get.d.ts.map +0 -1
- package/dist/cmd/secret/import.d.ts +0 -2
- package/dist/cmd/secret/import.d.ts.map +0 -1
- package/dist/cmd/secret/index.d.ts +0 -2
- package/dist/cmd/secret/index.d.ts.map +0 -1
- package/dist/cmd/secret/list.d.ts +0 -2
- package/dist/cmd/secret/list.d.ts.map +0 -1
- package/dist/cmd/secret/pull.d.ts +0 -2
- package/dist/cmd/secret/pull.d.ts.map +0 -1
- package/dist/cmd/secret/push.d.ts +0 -2
- package/dist/cmd/secret/push.d.ts.map +0 -1
- package/dist/cmd/secret/set.d.ts +0 -2
- package/dist/cmd/secret/set.d.ts.map +0 -1
- package/src/cmd/bundle/index.ts +0 -58
- /package/dist/cmd/{bundle → ai}/index.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/ast.test.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/bundler.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/file.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/fix-duplicate-exports.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/fix-duplicate-exports.test.d.ts +0 -0
- /package/dist/cmd/{env → build}/index.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/patch/_util.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/patch/aisdk.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/patch/index.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/patch/llm.d.ts +0 -0
- /package/dist/cmd/{bundle → build}/plugin.d.ts +0 -0
- /package/src/cmd/{bundle → build}/bundler.ts +0 -0
- /package/src/cmd/{bundle → build}/file.ts +0 -0
- /package/src/cmd/{bundle → build}/fix-duplicate-exports.test.ts +0 -0
- /package/src/cmd/{bundle → build}/fix-duplicate-exports.ts +0 -0
- /package/src/cmd/{bundle → build}/patch/_util.ts +0 -0
- /package/src/cmd/{bundle → build}/patch/aisdk.ts +0 -0
- /package/src/cmd/{bundle → build}/patch/index.ts +0 -0
- /package/src/cmd/{bundle → build}/patch/llm.ts +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createSubcommand } from '../../../types';
|
|
3
|
+
import * as tui from '../../../tui';
|
|
4
|
+
import { sessionGet } from '@agentuity/server';
|
|
5
|
+
import { getCommand } from '../../../command-prefix';
|
|
6
|
+
import { ErrorCode } from '../../../errors';
|
|
7
|
+
import { getCatalystAPIClient } from '../../../config';
|
|
8
|
+
|
|
9
|
+
const SessionGetResponseSchema = z.object({
|
|
10
|
+
id: z.string().describe('Session ID'),
|
|
11
|
+
created_at: z.string().describe('Creation timestamp'),
|
|
12
|
+
start_time: z.string().describe('Start time'),
|
|
13
|
+
end_time: z.string().nullable().describe('End time'),
|
|
14
|
+
duration: z.number().nullable().describe('Duration in nanoseconds'),
|
|
15
|
+
org_id: z.string().describe('Organization ID'),
|
|
16
|
+
project_id: z.string().describe('Project ID'),
|
|
17
|
+
deployment_id: z.string().describe('Deployment ID'),
|
|
18
|
+
agent_ids: z.array(z.string()).describe('Agent IDs'),
|
|
19
|
+
trigger: z.string().describe('Trigger type'),
|
|
20
|
+
env: z.string().describe('Environment'),
|
|
21
|
+
devmode: z.boolean().describe('Dev mode'),
|
|
22
|
+
pending: z.boolean().describe('Pending'),
|
|
23
|
+
success: z.boolean().describe('Success'),
|
|
24
|
+
error: z.string().nullable().describe('Error message'),
|
|
25
|
+
method: z.string().describe('HTTP method'),
|
|
26
|
+
url: z.string().describe('Request URL'),
|
|
27
|
+
route_id: z.string().describe('Route ID'),
|
|
28
|
+
thread_id: z.string().describe('Thread ID'),
|
|
29
|
+
agentNames: z.array(z.string()).describe('Agent names'),
|
|
30
|
+
evalRuns: z.array(z.object({
|
|
31
|
+
id: z.string(),
|
|
32
|
+
created_at: z.string(),
|
|
33
|
+
eval_id: z.string(),
|
|
34
|
+
pending: z.boolean(),
|
|
35
|
+
success: z.boolean(),
|
|
36
|
+
error: z.string().nullable(),
|
|
37
|
+
result: z.string().nullable(),
|
|
38
|
+
})).describe('Eval runs'),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export const getSubcommand = createSubcommand({
|
|
42
|
+
name: 'get',
|
|
43
|
+
description: 'Get details about a specific session',
|
|
44
|
+
tags: ['read-only', 'fast', 'requires-auth'],
|
|
45
|
+
examples: [`${getCommand('cloud session get')} sess_abc123xyz`],
|
|
46
|
+
requires: { auth: true },
|
|
47
|
+
idempotent: true,
|
|
48
|
+
schema: {
|
|
49
|
+
args: z.object({
|
|
50
|
+
session_id: z.string().describe('Session ID'),
|
|
51
|
+
}),
|
|
52
|
+
response: SessionGetResponseSchema,
|
|
53
|
+
},
|
|
54
|
+
async handler(ctx) {
|
|
55
|
+
const { config, logger, auth, args, options } = ctx;
|
|
56
|
+
const catalystClient = getCatalystAPIClient(config, logger, auth);
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
const enriched = await sessionGet(catalystClient, { id: args.session_id });
|
|
60
|
+
const session = enriched.session;
|
|
61
|
+
|
|
62
|
+
const result = {
|
|
63
|
+
id: session.id,
|
|
64
|
+
created_at: session.created_at,
|
|
65
|
+
start_time: session.start_time,
|
|
66
|
+
end_time: session.end_time,
|
|
67
|
+
duration: session.duration,
|
|
68
|
+
org_id: session.org_id,
|
|
69
|
+
project_id: session.project_id,
|
|
70
|
+
deployment_id: session.deployment_id,
|
|
71
|
+
agent_ids: session.agent_ids,
|
|
72
|
+
trigger: session.trigger,
|
|
73
|
+
env: session.env,
|
|
74
|
+
devmode: session.devmode,
|
|
75
|
+
pending: session.pending,
|
|
76
|
+
success: session.success,
|
|
77
|
+
error: session.error,
|
|
78
|
+
method: session.method,
|
|
79
|
+
url: session.url,
|
|
80
|
+
route_id: session.route_id,
|
|
81
|
+
thread_id: session.thread_id,
|
|
82
|
+
agentNames: enriched.agentNames,
|
|
83
|
+
evalRuns: enriched.evalRuns.map(run => ({
|
|
84
|
+
id: run.id,
|
|
85
|
+
eval_id: run.eval_id,
|
|
86
|
+
created_at: run.created_at,
|
|
87
|
+
pending: run.pending,
|
|
88
|
+
success: run.success,
|
|
89
|
+
error: run.error,
|
|
90
|
+
result: run.result,
|
|
91
|
+
})),
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
if (options.json) {
|
|
95
|
+
console.log(JSON.stringify(result, null, 2));
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
tui.banner(`Session ${session.id}`, `Status: ${session.success ? 'Success' : 'Failed'}`);
|
|
100
|
+
|
|
101
|
+
console.log(tui.bold('ID: ') + session.id);
|
|
102
|
+
console.log(tui.bold('Project: ') + session.project_id);
|
|
103
|
+
console.log(tui.bold('Deployment: ') + (session.deployment_id || '-'));
|
|
104
|
+
console.log(tui.bold('Created: ') + new Date(session.created_at).toLocaleString());
|
|
105
|
+
console.log(tui.bold('Start: ') + new Date(session.start_time).toLocaleString());
|
|
106
|
+
if (session.end_time) {
|
|
107
|
+
console.log(tui.bold('End: ') + new Date(session.end_time).toLocaleString());
|
|
108
|
+
}
|
|
109
|
+
if (session.duration) {
|
|
110
|
+
console.log(
|
|
111
|
+
tui.bold('Duration: ') + `${(session.duration / 1_000_000).toFixed(0)}ms`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
console.log(tui.bold('Method: ') + session.method);
|
|
115
|
+
console.log(tui.bold('URL: ') + tui.link(session.url, session.url));
|
|
116
|
+
console.log(tui.bold('Trigger: ') + session.trigger);
|
|
117
|
+
console.log(tui.bold('Environment: ') + session.env);
|
|
118
|
+
console.log(tui.bold('Dev Mode: ') + (session.devmode ? 'Yes' : 'No'));
|
|
119
|
+
console.log(tui.bold('Success: ') + (session.success ? '✓' : '✗'));
|
|
120
|
+
console.log(tui.bold('Pending: ') + (session.pending ? 'Yes' : 'No'));
|
|
121
|
+
if (session.error) {
|
|
122
|
+
console.log(tui.bold('Error: ') + tui.error(session.error));
|
|
123
|
+
}
|
|
124
|
+
if (enriched.agentNames.length > 0) {
|
|
125
|
+
const agentDisplay = enriched.agentNames.map((name, idx) => {
|
|
126
|
+
const agentId = session.agent_ids[idx];
|
|
127
|
+
return `${name} ${tui.muted(`(${agentId})`)}`;
|
|
128
|
+
}).join(', ');
|
|
129
|
+
console.log(tui.bold('Agents: ') + agentDisplay);
|
|
130
|
+
}
|
|
131
|
+
console.log(tui.bold('Route ID: ') + session.route_id);
|
|
132
|
+
console.log(tui.bold('Thread ID: ') + session.thread_id);
|
|
133
|
+
|
|
134
|
+
if (enriched.evalRuns.length > 0) {
|
|
135
|
+
console.log('');
|
|
136
|
+
console.log(tui.bold('Eval Runs:'));
|
|
137
|
+
const evalTableData = enriched.evalRuns.map((run) => ({
|
|
138
|
+
ID: run.id,
|
|
139
|
+
'Eval ID': run.eval_id,
|
|
140
|
+
Success: run.success ? '✓' : '✗',
|
|
141
|
+
Pending: run.pending ? '⏳' : '✓',
|
|
142
|
+
Error: run.error || 'No',
|
|
143
|
+
Created: new Date(run.created_at).toLocaleString(),
|
|
144
|
+
}));
|
|
145
|
+
|
|
146
|
+
tui.table(evalTableData, [
|
|
147
|
+
{ name: 'ID', alignment: 'left' },
|
|
148
|
+
{ name: 'Eval ID', alignment: 'left' },
|
|
149
|
+
{ name: 'Success', alignment: 'center' },
|
|
150
|
+
{ name: 'Pending', alignment: 'center' },
|
|
151
|
+
{ name: 'Error', alignment: 'left' },
|
|
152
|
+
{ name: 'Created', alignment: 'left' },
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return result;
|
|
157
|
+
} catch (ex) {
|
|
158
|
+
tui.fatal(
|
|
159
|
+
`Failed to get session: ${ex instanceof Error ? ex.message : String(ex)}`,
|
|
160
|
+
ErrorCode.API_ERROR
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createCommand } from '../../../types';
|
|
2
|
+
import { getSubcommand } from './get';
|
|
3
|
+
import { listSubcommand } from './list';
|
|
4
|
+
import { logsSubcommand } from './logs';
|
|
5
|
+
|
|
6
|
+
export const sessionCommand = createCommand({
|
|
7
|
+
name: 'session',
|
|
8
|
+
description: 'Manage sessions',
|
|
9
|
+
tags: ['requires-auth'],
|
|
10
|
+
subcommands: [getSubcommand, listSubcommand, logsSubcommand],
|
|
11
|
+
});
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createSubcommand } from '../../../types';
|
|
3
|
+
import * as tui from '../../../tui';
|
|
4
|
+
import { sessionList } from '@agentuity/server';
|
|
5
|
+
import { getCommand } from '../../../command-prefix';
|
|
6
|
+
import { ErrorCode } from '../../../errors';
|
|
7
|
+
import { getCatalystAPIClient } from '../../../config';
|
|
8
|
+
|
|
9
|
+
const SessionListResponseSchema = z.array(
|
|
10
|
+
z.object({
|
|
11
|
+
id: z.string().describe('Session ID'),
|
|
12
|
+
created_at: z.string().describe('Creation timestamp'),
|
|
13
|
+
success: z.boolean().describe('Whether the session succeeded'),
|
|
14
|
+
duration: z.number().nullable().describe('Duration in nanoseconds'),
|
|
15
|
+
method: z.string().describe('HTTP method'),
|
|
16
|
+
url: z.string().describe('Request URL'),
|
|
17
|
+
trigger: z.string().describe('Trigger type'),
|
|
18
|
+
env: z.string().describe('Environment'),
|
|
19
|
+
})
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export const listSubcommand = createSubcommand({
|
|
23
|
+
name: 'list',
|
|
24
|
+
description: 'List recent sessions',
|
|
25
|
+
tags: ['read-only', 'fast', 'requires-auth'],
|
|
26
|
+
examples: [
|
|
27
|
+
`${getCommand('cloud session list')} # List 10 most recent sessions`,
|
|
28
|
+
`${getCommand('cloud session list')} --count=25 # List 25 most recent sessions`,
|
|
29
|
+
`${getCommand('cloud session list')} --project-id=proj_* # Filter by project`,
|
|
30
|
+
`${getCommand('cloud session list')} --deployment-id=* # Filter by deployment`,
|
|
31
|
+
`${getCommand('cloud session list')} --success=true # Only successful sessions`,
|
|
32
|
+
`${getCommand('cloud session list')} --devmode=false # Only production sessions`,
|
|
33
|
+
`${getCommand('cloud session list')} --trigger=api # Only API triggered sessions`,
|
|
34
|
+
`${getCommand('cloud session list')} --env=production # Only production environment`,
|
|
35
|
+
],
|
|
36
|
+
aliases: ['ls'],
|
|
37
|
+
requires: { auth: true },
|
|
38
|
+
optional: { project: true },
|
|
39
|
+
idempotent: true,
|
|
40
|
+
pagination: {
|
|
41
|
+
supported: true,
|
|
42
|
+
defaultLimit: 10,
|
|
43
|
+
maxLimit: 100,
|
|
44
|
+
parameters: {
|
|
45
|
+
limit: 'count',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
schema: {
|
|
49
|
+
options: z.object({
|
|
50
|
+
count: z.coerce
|
|
51
|
+
.number()
|
|
52
|
+
.int()
|
|
53
|
+
.min(1)
|
|
54
|
+
.max(100)
|
|
55
|
+
.default(10)
|
|
56
|
+
.describe('Number of sessions to list (1–100)'),
|
|
57
|
+
projectId: z.string().optional().describe('Filter by project ID'),
|
|
58
|
+
deploymentId: z.string().optional().describe('Filter by deployment ID'),
|
|
59
|
+
trigger: z.string().optional().describe('Filter by trigger type (api, cron, webhook)'),
|
|
60
|
+
env: z.string().optional().describe('Filter by environment'),
|
|
61
|
+
threadId: z.string().optional().describe('Filter by thread ID'),
|
|
62
|
+
agentIdentifier: z.string().optional().describe('Filter by agent identifier'),
|
|
63
|
+
devmode: z.coerce.boolean().optional().describe('Filter by dev mode (true/false)'),
|
|
64
|
+
success: z.coerce.boolean().optional().describe('Filter by success status (true/false)'),
|
|
65
|
+
startAfter: z.string().optional().describe('Filter by start time after (ISO 8601)'),
|
|
66
|
+
startBefore: z.string().optional().describe('Filter by start time before (ISO 8601)'),
|
|
67
|
+
}),
|
|
68
|
+
response: SessionListResponseSchema,
|
|
69
|
+
},
|
|
70
|
+
async handler(ctx) {
|
|
71
|
+
const { config, logger, auth, project, opts, options } = ctx;
|
|
72
|
+
const catalystClient = getCatalystAPIClient(config, logger, auth);
|
|
73
|
+
|
|
74
|
+
const projectId = opts.projectId || project?.projectId;
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
const sessions = await sessionList(catalystClient, {
|
|
78
|
+
count: opts.count,
|
|
79
|
+
projectId,
|
|
80
|
+
deploymentId: opts.deploymentId,
|
|
81
|
+
trigger: opts.trigger,
|
|
82
|
+
env: opts.env,
|
|
83
|
+
devmode: opts.devmode,
|
|
84
|
+
success: opts.success,
|
|
85
|
+
threadId: opts.threadId,
|
|
86
|
+
agentIdentifier: opts.agentIdentifier,
|
|
87
|
+
startAfter: opts.startAfter,
|
|
88
|
+
startBefore: opts.startBefore,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const result = sessions.map((s) => ({
|
|
92
|
+
id: s.id,
|
|
93
|
+
created_at: s.created_at,
|
|
94
|
+
success: s.success,
|
|
95
|
+
duration: s.duration,
|
|
96
|
+
method: s.method,
|
|
97
|
+
url: s.url,
|
|
98
|
+
trigger: s.trigger,
|
|
99
|
+
env: s.env,
|
|
100
|
+
}));
|
|
101
|
+
|
|
102
|
+
if (options.json) {
|
|
103
|
+
console.log(JSON.stringify(result, null, 2));
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (sessions.length === 0) {
|
|
108
|
+
tui.info('No sessions found.');
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const tableData = sessions.map((s) => {
|
|
113
|
+
const urlPath = new URL(s.url).pathname;
|
|
114
|
+
return {
|
|
115
|
+
ID: s.id,
|
|
116
|
+
Created: new Date(s.created_at).toLocaleString(),
|
|
117
|
+
Success: s.success ? '✓' : '✗',
|
|
118
|
+
Duration: s.duration ? `${(s.duration / 1_000_000).toFixed(0)}ms` : '-',
|
|
119
|
+
Method: s.method,
|
|
120
|
+
Path: urlPath.length > 50 ? urlPath.substring(0, 47) + '...' : urlPath,
|
|
121
|
+
Trigger: s.trigger,
|
|
122
|
+
Env: s.env,
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
tui.table(tableData, [
|
|
127
|
+
{ name: 'ID', alignment: 'left' },
|
|
128
|
+
{ name: 'Created', alignment: 'left' },
|
|
129
|
+
{ name: 'Success', alignment: 'center' },
|
|
130
|
+
{ name: 'Duration', alignment: 'right' },
|
|
131
|
+
{ name: 'Method', alignment: 'left' },
|
|
132
|
+
{ name: 'Path', alignment: 'left' },
|
|
133
|
+
{ name: 'Trigger', alignment: 'left' },
|
|
134
|
+
{ name: 'Env', alignment: 'left' },
|
|
135
|
+
]);
|
|
136
|
+
|
|
137
|
+
return result;
|
|
138
|
+
} catch (ex) {
|
|
139
|
+
tui.fatal(
|
|
140
|
+
`Failed to list sessions: ${ex instanceof Error ? ex.message : String(ex)}`,
|
|
141
|
+
ErrorCode.API_ERROR
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createSubcommand } from '../../../types';
|
|
3
|
+
import * as tui from '../../../tui';
|
|
4
|
+
import { sessionLogs } from '@agentuity/server';
|
|
5
|
+
import { getCommand } from '../../../command-prefix';
|
|
6
|
+
import { ErrorCode } from '../../../errors';
|
|
7
|
+
|
|
8
|
+
const SessionLogsResponseSchema = z.array(
|
|
9
|
+
z.object({
|
|
10
|
+
body: z.string().describe('Log body'),
|
|
11
|
+
severity: z.string().describe('Log severity'),
|
|
12
|
+
timestamp: z.string().describe('Log timestamp'),
|
|
13
|
+
})
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export const logsSubcommand = createSubcommand({
|
|
17
|
+
name: 'logs',
|
|
18
|
+
description: 'Get logs for a specific session',
|
|
19
|
+
tags: ['read-only', 'slow', 'requires-auth'],
|
|
20
|
+
examples: [`${getCommand('cloud session logs')} sess_abc123xyz`],
|
|
21
|
+
requires: { auth: true, apiClient: true },
|
|
22
|
+
optional: { project: true },
|
|
23
|
+
idempotent: true,
|
|
24
|
+
schema: {
|
|
25
|
+
args: z.object({
|
|
26
|
+
session_id: z.string().describe('Session ID'),
|
|
27
|
+
}),
|
|
28
|
+
options: z.object({
|
|
29
|
+
projectId: z.string().optional().describe('Project ID (for display purposes)'),
|
|
30
|
+
deploymentId: z.string().optional().describe('Deployment ID (for display purposes)'),
|
|
31
|
+
}),
|
|
32
|
+
response: SessionLogsResponseSchema,
|
|
33
|
+
},
|
|
34
|
+
async handler(ctx) {
|
|
35
|
+
const { apiClient, args } = ctx;
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
const logs = await sessionLogs(apiClient, { id: args.session_id });
|
|
39
|
+
|
|
40
|
+
if (logs.length === 0) {
|
|
41
|
+
tui.info('No logs found for this session.');
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
tui.banner(`Logs for Session ${args.session_id}`, `${logs.length} log entries`);
|
|
46
|
+
|
|
47
|
+
for (const log of logs) {
|
|
48
|
+
const timestamp = new Date(log.timestamp).toLocaleTimeString();
|
|
49
|
+
const severity = log.severity.padEnd(5);
|
|
50
|
+
const severityColor =
|
|
51
|
+
log.severity === 'ERROR'
|
|
52
|
+
? tui.error(severity)
|
|
53
|
+
: log.severity === 'WARN'
|
|
54
|
+
? tui.warning(severity)
|
|
55
|
+
: tui.muted(severity);
|
|
56
|
+
|
|
57
|
+
console.log(`${tui.muted(timestamp)} ${severityColor} ${log.body}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return logs;
|
|
61
|
+
} catch (ex) {
|
|
62
|
+
tui.fatal(
|
|
63
|
+
`Failed to get session logs: ${ex instanceof Error ? ex.message : String(ex)}`,
|
|
64
|
+
ErrorCode.API_ERROR
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createSubcommand } from '../../types';
|
|
3
|
+
import * as tui from '../../tui';
|
|
4
|
+
import { APIResponseSchema } from '@agentuity/server';
|
|
5
|
+
import { abbreviate, abbreviateDescription } from '../../utils/format';
|
|
6
|
+
|
|
7
|
+
const AgentSchema = z.object({
|
|
8
|
+
id: z.string(),
|
|
9
|
+
name: z.string(),
|
|
10
|
+
description: z.string().nullable(),
|
|
11
|
+
identifier: z.string(),
|
|
12
|
+
version: z.string().nullable(),
|
|
13
|
+
deploymentId: z.string().nullable(),
|
|
14
|
+
devmode: z.boolean(),
|
|
15
|
+
metadata: z.record(z.string(), z.unknown()).nullable(),
|
|
16
|
+
createdAt: z.string(),
|
|
17
|
+
updatedAt: z.string(),
|
|
18
|
+
evals: z.array(
|
|
19
|
+
z.object({
|
|
20
|
+
id: z.string(),
|
|
21
|
+
name: z.string(),
|
|
22
|
+
description: z.string().nullable(),
|
|
23
|
+
identifier: z.string().nullable(),
|
|
24
|
+
deploymentId: z.string().nullable(),
|
|
25
|
+
version: z.string().nullable(),
|
|
26
|
+
devmode: z.boolean(),
|
|
27
|
+
createdAt: z.string(),
|
|
28
|
+
updatedAt: z.string(),
|
|
29
|
+
})
|
|
30
|
+
),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const AgentsResponseSchema = APIResponseSchema(z.array(AgentSchema));
|
|
34
|
+
|
|
35
|
+
export const agentsSubcommand = createSubcommand({
|
|
36
|
+
name: 'agents',
|
|
37
|
+
description: 'Show devmode agent results',
|
|
38
|
+
requires: { auth: true, apiClient: true, project: true },
|
|
39
|
+
schema: {
|
|
40
|
+
options: z.object({
|
|
41
|
+
deploymentId: z.string().optional().describe('Filter by deployment ID'),
|
|
42
|
+
format: z
|
|
43
|
+
.enum(['json', 'table'])
|
|
44
|
+
.optional()
|
|
45
|
+
.default('table')
|
|
46
|
+
.describe('Output format: json or table'),
|
|
47
|
+
verbose: z.boolean().optional().default(false).describe('Show full IDs and descriptions'),
|
|
48
|
+
}),
|
|
49
|
+
},
|
|
50
|
+
async handler(ctx) {
|
|
51
|
+
const { opts, apiClient, project } = ctx;
|
|
52
|
+
const projectId = project.projectId;
|
|
53
|
+
const format = opts?.format ?? 'table';
|
|
54
|
+
const verbose = opts?.verbose ?? false;
|
|
55
|
+
|
|
56
|
+
const deploymentId = opts?.deploymentId;
|
|
57
|
+
const queryParams = deploymentId ? `?deploymentId=${deploymentId}` : '';
|
|
58
|
+
const response = await tui.spinner('Fetching agents', async () => {
|
|
59
|
+
return apiClient.request(
|
|
60
|
+
'GET',
|
|
61
|
+
`/cli/agent/${projectId}${queryParams}`,
|
|
62
|
+
AgentsResponseSchema
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (!response.success) {
|
|
67
|
+
tui.fatal(`Failed to fetch agents: ${response.message ?? 'Unknown error'}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const agents = response.data;
|
|
71
|
+
|
|
72
|
+
if (format === 'json') {
|
|
73
|
+
console.log(JSON.stringify(agents, null, 2));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
tui.info(`Agents (${agents.length})`);
|
|
78
|
+
if (agents.length === 0) {
|
|
79
|
+
tui.muted('No agents found');
|
|
80
|
+
} else {
|
|
81
|
+
console.table(
|
|
82
|
+
agents.map((agent) => ({
|
|
83
|
+
name: agent.name,
|
|
84
|
+
id: verbose ? agent.id : abbreviate(agent.id, 20),
|
|
85
|
+
identifier: verbose ? agent.identifier : abbreviate(agent.identifier, 20),
|
|
86
|
+
deployment: abbreviate(agent.deploymentId, 20),
|
|
87
|
+
version: verbose
|
|
88
|
+
? (agent.version ?? 'N/A')
|
|
89
|
+
: (abbreviate(agent.version, 20) ?? 'N/A'),
|
|
90
|
+
evals: agent.evals.length,
|
|
91
|
+
createdAt: new Date(agent.createdAt).toLocaleString(),
|
|
92
|
+
})),
|
|
93
|
+
['name', 'id', 'identifier', 'deployment', 'version', 'evals', 'createdAt']
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
// Show evals for each agent
|
|
97
|
+
for (const agent of agents) {
|
|
98
|
+
if (agent.evals.length > 0) {
|
|
99
|
+
console.log(`\n Evals for ${agent.name}:`);
|
|
100
|
+
console.table(
|
|
101
|
+
agent.evals.map((evalItem) => ({
|
|
102
|
+
name: evalItem.name,
|
|
103
|
+
id: verbose ? evalItem.id : abbreviate(evalItem.id, 20),
|
|
104
|
+
identifier: verbose
|
|
105
|
+
? (evalItem.identifier ?? 'N/A')
|
|
106
|
+
: (abbreviate(evalItem.identifier, 20) ?? 'N/A'),
|
|
107
|
+
deployment: abbreviate(evalItem.deploymentId, 20),
|
|
108
|
+
version: verbose
|
|
109
|
+
? (evalItem.version ?? 'N/A')
|
|
110
|
+
: (abbreviate(evalItem.version, 20) ?? 'N/A'),
|
|
111
|
+
description: verbose
|
|
112
|
+
? (evalItem.description ?? 'N/A')
|
|
113
|
+
: abbreviateDescription(evalItem.description),
|
|
114
|
+
createdAt: new Date(evalItem.createdAt).toLocaleString(),
|
|
115
|
+
})),
|
|
116
|
+
['name', 'id', 'identifier', 'deployment', 'version', 'description', 'createdAt']
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
});
|
package/src/cmd/dev/index.ts
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
/** biome-ignore-all lint/style/useTemplate: its easier */
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import type { BuildMetadata } from '@agentuity/server';
|
|
4
3
|
import { resolve, join } from 'node:path';
|
|
5
|
-
import { bundle } from '../
|
|
6
|
-
import { getBuildMetadata } from '../
|
|
4
|
+
import { bundle } from '../build/bundler';
|
|
5
|
+
import { getBuildMetadata } from '../build/plugin';
|
|
7
6
|
import { existsSync, type FSWatcher, watch, statSync, readdirSync } from 'node:fs';
|
|
8
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
getDefaultConfigDir,
|
|
9
|
+
loadProjectSDKKey,
|
|
10
|
+
saveProjectDir,
|
|
11
|
+
saveConfig,
|
|
12
|
+
loadBuildMetadata,
|
|
13
|
+
} from '../../config';
|
|
9
14
|
import { type Config, createCommand } from '../../types';
|
|
10
15
|
import * as tui from '../../tui';
|
|
11
16
|
import { createAgentTemplates, createAPITemplates } from './templates';
|
|
12
17
|
import { generateEndpoint, type DevmodeResponse } from './api';
|
|
13
18
|
import { APIClient, getAPIBaseURL } from '../../api';
|
|
14
19
|
import { download } from './download';
|
|
20
|
+
import { createDevmodeSyncService } from './sync';
|
|
21
|
+
import { getDevmodeDeploymentId } from '../build/ast';
|
|
22
|
+
import { BuildMetadata } from '@agentuity/server';
|
|
15
23
|
import { getCommand } from '../../command-prefix';
|
|
16
24
|
|
|
17
25
|
export const command = createCommand({
|
|
@@ -47,6 +55,11 @@ export const command = createCommand({
|
|
|
47
55
|
const { opts, logger, options, project, projectDir, auth } = ctx;
|
|
48
56
|
let { config } = ctx;
|
|
49
57
|
|
|
58
|
+
// Allow sync with mock service even without devmode endpoint
|
|
59
|
+
const useMockService = process.env.DEVMODE_SYNC_SERVICE_MOCK === 'true';
|
|
60
|
+
const apiClient = new APIClient(getAPIBaseURL(config), logger, config);
|
|
61
|
+
const syncService = createDevmodeSyncService({ logger, apiClient, mock: useMockService });
|
|
62
|
+
|
|
50
63
|
const rootDir = projectDir;
|
|
51
64
|
const appTs = join(rootDir, 'app.ts');
|
|
52
65
|
const srcDir = join(rootDir, 'src');
|
|
@@ -73,12 +86,11 @@ export const command = createCommand({
|
|
|
73
86
|
let gravityBin: string | undefined;
|
|
74
87
|
|
|
75
88
|
if (auth && project && opts.public) {
|
|
76
|
-
//
|
|
77
|
-
const apiClient = new APIClient(getAPIBaseURL(config), logger, config);
|
|
89
|
+
// Generate devmode endpoint only when using --public
|
|
78
90
|
const endpoint = await tui.spinner({
|
|
79
91
|
message: 'Connecting to Gravity',
|
|
80
92
|
callback: () => {
|
|
81
|
-
return generateEndpoint(apiClient
|
|
93
|
+
return generateEndpoint(apiClient!, project.projectId, config?.devmode?.hostname);
|
|
82
94
|
},
|
|
83
95
|
clearOnSuccess: true,
|
|
84
96
|
});
|
|
@@ -91,6 +103,13 @@ export const command = createCommand({
|
|
|
91
103
|
devmode = endpoint;
|
|
92
104
|
}
|
|
93
105
|
|
|
106
|
+
logger.debug(
|
|
107
|
+
'Getting devmode deployment id for projectId: %s, endpointId: %s',
|
|
108
|
+
project?.projectId,
|
|
109
|
+
devmode?.id
|
|
110
|
+
);
|
|
111
|
+
const deploymentId = getDevmodeDeploymentId(project?.projectId ?? '', devmode?.id ?? '');
|
|
112
|
+
|
|
94
113
|
if (devmode) {
|
|
95
114
|
const configDir = getDefaultConfigDir();
|
|
96
115
|
const gravityDir = join(configDir, 'gravity');
|
|
@@ -183,6 +202,21 @@ export const command = createCommand({
|
|
|
183
202
|
const agentuityDir = resolve(rootDir, '.agentuity');
|
|
184
203
|
const appPath = resolve(agentuityDir, 'app.js');
|
|
185
204
|
|
|
205
|
+
// Load existing metadata file to use as previousMetadata for sync
|
|
206
|
+
// This prevents reinserting agents/evals that haven't changed
|
|
207
|
+
let previousMetadata: BuildMetadata | undefined;
|
|
208
|
+
try {
|
|
209
|
+
previousMetadata = await loadBuildMetadata(agentuityDir);
|
|
210
|
+
logger.debug(
|
|
211
|
+
'Loaded previous metadata with %d agent(s)',
|
|
212
|
+
previousMetadata.agents?.length ?? 0
|
|
213
|
+
);
|
|
214
|
+
} catch (_error) {
|
|
215
|
+
// File doesn't exist yet (first run), that's okay
|
|
216
|
+
logger.debug('No previous metadata file found, will treat all agents/evals as new');
|
|
217
|
+
previousMetadata = undefined;
|
|
218
|
+
}
|
|
219
|
+
|
|
186
220
|
// Watch directories instead of files to survive atomic replacements (sed -i, cp)
|
|
187
221
|
const watches = [rootDir];
|
|
188
222
|
const watchers: FSWatcher[] = [];
|
|
@@ -394,6 +428,8 @@ export const command = createCommand({
|
|
|
394
428
|
await bundle({
|
|
395
429
|
rootDir,
|
|
396
430
|
dev: true,
|
|
431
|
+
projectId: project?.projectId,
|
|
432
|
+
deploymentId,
|
|
397
433
|
});
|
|
398
434
|
building = false;
|
|
399
435
|
buildCompletedAt = Date.now();
|
|
@@ -423,6 +459,64 @@ export const command = createCommand({
|
|
|
423
459
|
metadata = getBuildMetadata();
|
|
424
460
|
logger.trace('Build metadata retrieved');
|
|
425
461
|
|
|
462
|
+
// Sync agents and evals to API if in devmode with auth
|
|
463
|
+
if (auth && project && apiClient) {
|
|
464
|
+
try {
|
|
465
|
+
logger.debug('Loading build metadata for sync...');
|
|
466
|
+
const currentMetadata = await loadBuildMetadata(agentuityDir);
|
|
467
|
+
logger.debug(
|
|
468
|
+
'Found %d agent(s) and %d route(s) in metadata',
|
|
469
|
+
currentMetadata.agents?.length ?? 0,
|
|
470
|
+
currentMetadata.routes?.length ?? 0
|
|
471
|
+
);
|
|
472
|
+
if (currentMetadata.agents) {
|
|
473
|
+
for (const agent of currentMetadata.agents) {
|
|
474
|
+
logger.debug(
|
|
475
|
+
'Agent: id=%s, name=%s, version=%s, evals=%d',
|
|
476
|
+
agent.id,
|
|
477
|
+
agent.name,
|
|
478
|
+
agent.version,
|
|
479
|
+
agent.evals?.length ?? 0
|
|
480
|
+
);
|
|
481
|
+
if (agent.evals) {
|
|
482
|
+
for (const evalItem of agent.evals) {
|
|
483
|
+
logger.debug(
|
|
484
|
+
' Eval: id=%s, name=%s, version=%s',
|
|
485
|
+
evalItem.id,
|
|
486
|
+
evalItem.name,
|
|
487
|
+
evalItem.version
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
logger.debug('Syncing agents and evals...');
|
|
494
|
+
|
|
495
|
+
await syncService.sync(
|
|
496
|
+
currentMetadata,
|
|
497
|
+
previousMetadata,
|
|
498
|
+
project.projectId,
|
|
499
|
+
deploymentId
|
|
500
|
+
);
|
|
501
|
+
previousMetadata = currentMetadata;
|
|
502
|
+
logger.debug('Sync completed successfully');
|
|
503
|
+
} catch (error) {
|
|
504
|
+
logger.error('Failed to sync agents/evals: %s', error);
|
|
505
|
+
if (error instanceof Error) {
|
|
506
|
+
logger.error('Error stack: %s', error.stack);
|
|
507
|
+
}
|
|
508
|
+
// Don't fail the build, just log the error
|
|
509
|
+
}
|
|
510
|
+
} else {
|
|
511
|
+
logger.trace(
|
|
512
|
+
'Skipping sync - auth=%s, project=%s, devmode=%s, apiClient=%s',
|
|
513
|
+
!!auth,
|
|
514
|
+
!!project,
|
|
515
|
+
!!devmode,
|
|
516
|
+
!!apiClient
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
|
|
426
520
|
logger.trace('Starting dev server: %s', appPath);
|
|
427
521
|
// Use shell to run in a process group for proper cleanup
|
|
428
522
|
// The 'exec' ensures the shell is replaced by the actual process
|
|
@@ -558,12 +652,12 @@ export const command = createCommand({
|
|
|
558
652
|
|
|
559
653
|
const showRoutes = () => {
|
|
560
654
|
tui.info('API Route Detail');
|
|
561
|
-
|
|
655
|
+
tui.table(metadata?.routes ?? [], ['method', 'path', 'filename']);
|
|
562
656
|
};
|
|
563
657
|
|
|
564
658
|
const showAgents = () => {
|
|
565
659
|
tui.info('Agent Detail');
|
|
566
|
-
|
|
660
|
+
tui.table(metadata?.agents ?? [], ['name', 'filename', 'description']);
|
|
567
661
|
};
|
|
568
662
|
|
|
569
663
|
process.stdin.on('data', (data) => {
|