@guildai/cli 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/auth-CRMO5O3N.js +29 -0
  2. package/dist/auth-CRMO5O3N.js.map +7 -0
  3. package/dist/chat-5VX2WJH2.js +303 -0
  4. package/dist/chat-5VX2WJH2.js.map +7 -0
  5. package/dist/chat-SIKDYZQK.js +31 -0
  6. package/dist/chat-SIKDYZQK.js.map +7 -0
  7. package/dist/chunk-56YCMGL3.js +522 -0
  8. package/dist/chunk-56YCMGL3.js.map +7 -0
  9. package/dist/chunk-6EX6E7WP.js +7042 -0
  10. package/dist/chunk-6EX6E7WP.js.map +7 -0
  11. package/dist/chunk-B7VAF5UG.js +532 -0
  12. package/dist/chunk-B7VAF5UG.js.map +7 -0
  13. package/dist/chunk-DOIYVBNY.js +3057 -0
  14. package/dist/chunk-DOIYVBNY.js.map +7 -0
  15. package/dist/chunk-ENKEEJ45.js +17 -0
  16. package/dist/chunk-ENKEEJ45.js.map +7 -0
  17. package/dist/chunk-IBRKVGMZ.js +97041 -0
  18. package/dist/chunk-IBRKVGMZ.js.map +7 -0
  19. package/dist/chunk-LFMQJOKC.js +19778 -0
  20. package/dist/chunk-LFMQJOKC.js.map +7 -0
  21. package/dist/chunk-M347HP6M.js +22896 -0
  22. package/dist/chunk-M347HP6M.js.map +7 -0
  23. package/dist/chunk-OYQ476FQ.js +44 -0
  24. package/dist/chunk-OYQ476FQ.js.map +7 -0
  25. package/dist/chunk-PNCUR4OB.js +257 -0
  26. package/dist/chunk-PNCUR4OB.js.map +7 -0
  27. package/dist/chunk-RIG2HZWM.js +317 -0
  28. package/dist/chunk-RIG2HZWM.js.map +7 -0
  29. package/dist/chunk-SPZPZXUN.js +826 -0
  30. package/dist/chunk-SPZPZXUN.js.map +7 -0
  31. package/dist/chunk-VVSOU6ON.js +53 -0
  32. package/dist/chunk-VVSOU6ON.js.map +7 -0
  33. package/dist/chunk-X3ADGWOF.js +3643 -0
  34. package/dist/chunk-X3ADGWOF.js.map +7 -0
  35. package/dist/commands/agent/logs.d.ts +3 -0
  36. package/dist/commands/setup.d.ts +16 -0
  37. package/dist/commands/skill/create.d.ts +3 -0
  38. package/dist/commands/skill/get.d.ts +3 -0
  39. package/dist/commands/skill/list.d.ts +3 -0
  40. package/dist/commands/skill/update.d.ts +3 -0
  41. package/dist/commands/skill/version/create.d.ts +3 -0
  42. package/dist/commands/skill/version/get.d.ts +3 -0
  43. package/dist/commands/skill/version/list.d.ts +3 -0
  44. package/dist/devtools-AO7YSDOD.js +67 -0
  45. package/dist/devtools-AO7YSDOD.js.map +7 -0
  46. package/dist/dist-4CBK6X5H.js +1566 -0
  47. package/dist/dist-4CBK6X5H.js.map +7 -0
  48. package/dist/esm-FRAVZP4J.js +13 -0
  49. package/dist/esm-FRAVZP4J.js.map +7 -0
  50. package/dist/execa-XQMWSABC.js +35 -0
  51. package/dist/execa-XQMWSABC.js.map +7 -0
  52. package/dist/index.js +8231 -253
  53. package/dist/index.js.map +7 -0
  54. package/dist/lib/api-types.d.ts +44 -0
  55. package/dist/lib/auth.d.ts +1 -1
  56. package/dist/lib/config.d.ts +9 -0
  57. package/dist/lib/errors.d.ts +1 -1
  58. package/dist/lib/output-mode.d.ts +9 -2
  59. package/dist/lib/output.d.ts +17 -1
  60. package/dist/lib/session-events.d.ts +14 -3
  61. package/dist/lib/session-polling.d.ts +24 -1
  62. package/dist/lib/session-resume.d.ts +15 -1
  63. package/dist/lib/stdin.d.ts +5 -1
  64. package/dist/lib/websocket-client.d.ts +46 -0
  65. package/dist/open-RF4X5MOP.js +13 -0
  66. package/dist/open-RF4X5MOP.js.map +7 -0
  67. package/dist/server-JYVH64FD.js +27659 -0
  68. package/dist/server-JYVH64FD.js.map +7 -0
  69. package/dist/test-SNIYRJ32.js +692 -0
  70. package/dist/test-SNIYRJ32.js.map +7 -0
  71. package/docs/skills/codex-agent-dev.md +2 -2
  72. package/package.json +8 -12
  73. package/dist/commands/agent/chat.js +0 -278
  74. package/dist/commands/agent/clone.js +0 -116
  75. package/dist/commands/agent/code.js +0 -87
  76. package/dist/commands/agent/fork.js +0 -218
  77. package/dist/commands/agent/get.js +0 -37
  78. package/dist/commands/agent/grep.js +0 -107
  79. package/dist/commands/agent/init.js +0 -390
  80. package/dist/commands/agent/list.js +0 -110
  81. package/dist/commands/agent/owners.js +0 -74
  82. package/dist/commands/agent/publish.js +0 -91
  83. package/dist/commands/agent/pull.js +0 -198
  84. package/dist/commands/agent/revalidate.js +0 -56
  85. package/dist/commands/agent/save.js +0 -346
  86. package/dist/commands/agent/search.js +0 -61
  87. package/dist/commands/agent/tags/add.js +0 -73
  88. package/dist/commands/agent/tags/list.js +0 -43
  89. package/dist/commands/agent/tags/remove.js +0 -84
  90. package/dist/commands/agent/tags/set.js +0 -71
  91. package/dist/commands/agent/test.js +0 -486
  92. package/dist/commands/agent/unpublish.js +0 -64
  93. package/dist/commands/agent/update.js +0 -110
  94. package/dist/commands/agent/versions.js +0 -55
  95. package/dist/commands/agent/workspaces.js +0 -54
  96. package/dist/commands/auth/login.js +0 -33
  97. package/dist/commands/auth/logout.js +0 -24
  98. package/dist/commands/auth/status.js +0 -38
  99. package/dist/commands/auth/token.js +0 -19
  100. package/dist/commands/chat.js +0 -1345
  101. package/dist/commands/config/get.js +0 -64
  102. package/dist/commands/config/list.js +0 -47
  103. package/dist/commands/config/path.js +0 -38
  104. package/dist/commands/config/set.js +0 -132
  105. package/dist/commands/credentials/endpoint-list.js +0 -88
  106. package/dist/commands/credentials/list.js +0 -50
  107. package/dist/commands/credentials/policy-create.js +0 -66
  108. package/dist/commands/credentials/policy-delete.js +0 -33
  109. package/dist/commands/credentials/policy-list.js +0 -45
  110. package/dist/commands/credentials/policy-update.js +0 -66
  111. package/dist/commands/doctor.js +0 -233
  112. package/dist/commands/integration/connect.js +0 -76
  113. package/dist/commands/integration/create.js +0 -298
  114. package/dist/commands/integration/get.js +0 -95
  115. package/dist/commands/integration/list.js +0 -62
  116. package/dist/commands/integration/operation/create.js +0 -164
  117. package/dist/commands/integration/operation/list.js +0 -92
  118. package/dist/commands/integration/update.js +0 -139
  119. package/dist/commands/integration/version/build.js +0 -86
  120. package/dist/commands/integration/version/create.js +0 -45
  121. package/dist/commands/integration/version/get.js +0 -72
  122. package/dist/commands/integration/version/list.js +0 -45
  123. package/dist/commands/integration/version/publish.js +0 -79
  124. package/dist/commands/integration/version/test.js +0 -104
  125. package/dist/commands/job/get-step.js +0 -40
  126. package/dist/commands/job/get.js +0 -44
  127. package/dist/commands/mcp.js +0 -34
  128. package/dist/commands/session/create.js +0 -59
  129. package/dist/commands/session/events.js +0 -56
  130. package/dist/commands/session/get.js +0 -33
  131. package/dist/commands/session/interrupt.js +0 -33
  132. package/dist/commands/session/list.js +0 -59
  133. package/dist/commands/session/send.js +0 -54
  134. package/dist/commands/session/tasks.js +0 -45
  135. package/dist/commands/setup.js +0 -230
  136. package/dist/commands/trigger/activate.js +0 -41
  137. package/dist/commands/trigger/create.js +0 -197
  138. package/dist/commands/trigger/deactivate.js +0 -41
  139. package/dist/commands/trigger/get.js +0 -33
  140. package/dist/commands/trigger/list.js +0 -57
  141. package/dist/commands/trigger/sessions.js +0 -48
  142. package/dist/commands/trigger/update.js +0 -128
  143. package/dist/commands/version.js +0 -24
  144. package/dist/commands/workspace/agent/add.js +0 -114
  145. package/dist/commands/workspace/agent/list.js +0 -78
  146. package/dist/commands/workspace/agent/remove.js +0 -78
  147. package/dist/commands/workspace/clear.js +0 -45
  148. package/dist/commands/workspace/context/edit.js +0 -107
  149. package/dist/commands/workspace/context/get.js +0 -47
  150. package/dist/commands/workspace/context/list.js +0 -51
  151. package/dist/commands/workspace/context/publish.js +0 -42
  152. package/dist/commands/workspace/create.js +0 -51
  153. package/dist/commands/workspace/current.js +0 -63
  154. package/dist/commands/workspace/get.js +0 -39
  155. package/dist/commands/workspace/list.js +0 -70
  156. package/dist/commands/workspace/select.js +0 -184
  157. package/dist/components/AgentInstallPrompt.js +0 -97
  158. package/dist/components/SplashAnimation.js +0 -321
  159. package/dist/components/TaskView.js +0 -268
  160. package/dist/lib/agent-helpers.js +0 -306
  161. package/dist/lib/alternate-screen.js +0 -59
  162. package/dist/lib/api-client.js +0 -154
  163. package/dist/lib/api-types.js +0 -10
  164. package/dist/lib/auth.js +0 -284
  165. package/dist/lib/braille-canvas.js +0 -321
  166. package/dist/lib/colors.js +0 -46
  167. package/dist/lib/config-cache.js +0 -45
  168. package/dist/lib/config.js +0 -153
  169. package/dist/lib/did-you-mean.js +0 -144
  170. package/dist/lib/errors.js +0 -375
  171. package/dist/lib/event-filter.js +0 -91
  172. package/dist/lib/generated-types.js +0 -56
  173. package/dist/lib/git.js +0 -176
  174. package/dist/lib/gk.js +0 -91
  175. package/dist/lib/guild-config.js +0 -178
  176. package/dist/lib/iap.js +0 -117
  177. package/dist/lib/integration-helpers.js +0 -38
  178. package/dist/lib/loading-messages.js +0 -72
  179. package/dist/lib/logo.js +0 -141
  180. package/dist/lib/lottie-serverside.js +0 -181
  181. package/dist/lib/markdown.js +0 -38
  182. package/dist/lib/npmrc.js +0 -59
  183. package/dist/lib/output-mode.js +0 -33
  184. package/dist/lib/output.js +0 -591
  185. package/dist/lib/owner-helpers.js +0 -112
  186. package/dist/lib/polling.js +0 -76
  187. package/dist/lib/progress.js +0 -324
  188. package/dist/lib/session-events-fetch.js +0 -25
  189. package/dist/lib/session-events.js +0 -112
  190. package/dist/lib/session-polling.js +0 -160
  191. package/dist/lib/session-resume.js +0 -96
  192. package/dist/lib/spinners.js +0 -770
  193. package/dist/lib/splash.js +0 -41
  194. package/dist/lib/stdin.js +0 -84
  195. package/dist/lib/svg-to-braille.js +0 -76
  196. package/dist/lib/table.js +0 -59
  197. package/dist/lib/update-check.js +0 -65
  198. package/dist/lib/validate-input-schema.js +0 -208
  199. package/dist/lib/version-helpers.js +0 -121
  200. package/dist/lib/workspace-helpers.js +0 -49
  201. package/dist/mcp/resources.js +0 -67
  202. package/dist/mcp/server.js +0 -64
  203. package/dist/mcp/tools.js +0 -753
@@ -1,486 +0,0 @@
1
- // Copyright 2026 Guild.ai
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { Command } from 'commander';
4
- import { render } from 'ink';
5
- import React from 'react';
6
- import { readFileSync } from 'fs';
7
- import { access } from 'fs/promises';
8
- import path from 'path';
9
- import { fileURLToPath } from 'url';
10
- import open from 'open';
11
- import { hyperlink } from '../../lib/colors.js';
12
- import { GuildAPIClient } from '../../lib/api-client.js';
13
- import { handleAxiosError, ErrorCodes } from '../../lib/errors.js';
14
- import { format } from '../../lib/progress.js';
15
- import { parseEventFilter } from '../../lib/event-filter.js';
16
- import { isQuietMode, getOutputMode } from '../../lib/output-mode.js';
17
- import { pollForResponse, pollForResponseWithEvents, } from '../../lib/session-polling.js';
18
- import { readStdinAsJSON, readStdinAsText, ensureInteractiveStdin, } from '../../lib/stdin.js';
19
- import { loadLocalConfig, getWorkspaceId, getWorkspaceSourceLabel, } from '../../lib/guild-config.js';
20
- import { GitError, formatGitError } from '../../lib/git.js';
21
- import { readAgentFiles, buildEphemeralVersion, buildBundledVersion, BundleNotFoundError, BuildTimeoutError, BuildFailedError, } from '../../lib/agent-helpers.js';
22
- import { validateInputSchema } from '../../lib/validate-input-schema.js';
23
- import { fetchSession, fetchSessionEvents } from '../../lib/session-resume.js';
24
- import { ChatApp, ensureAuthenticated } from '../chat.js';
25
- import { suppressScrollbackClear } from '../../lib/alternate-screen.js';
26
- // ESM equivalent of __dirname
27
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
28
- // Read version from package.json
29
- const packageJson = JSON.parse(readFileSync(path.join(__dirname, '../../../package.json'), 'utf-8'));
30
- export function createAgentTestCommand() {
31
- const cmd = new Command('test');
32
- cmd
33
- .description('Test agent in interactive REPL session')
34
- .option('--workspace <identifier>', 'Workspace ID or full name (e.g., owner/workspace-name)')
35
- .option('--mode <format>', 'Input mode: json (one-shot) or jsonl (line-by-line)')
36
- .option('--agent-version <id>', 'Test a specific version (UUID or version number)')
37
- .option('--resume <session-id>', 'Resume an existing test session')
38
- .option('--open', 'Open session in web dashboard')
39
- .option('--events <types>', 'Event types to stream (default: user). Shorthands: none, user, system, all, or comma-separated type names')
40
- .option('--bundle <file>', 'Path to a pre-built gzip+base64 bundle file')
41
- .option('--no-cache', 'Skip ephemeral build cache (force a fresh build)')
42
- .action(async (options) => {
43
- const cwd = process.cwd();
44
- // Parse --events filter once, before any branching
45
- const eventFilter = options.events
46
- ? parseEventFilter(options.events)
47
- : undefined;
48
- try {
49
- // Handle --resume: skip build, fetch existing session, hand off to ChatApp
50
- if (options.resume) {
51
- await ensureAuthenticated();
52
- const client = new GuildAPIClient();
53
- const resumeSession = await fetchSession(client, options.resume);
54
- const resumeEvents = await fetchSessionEvents(client, options.resume);
55
- const resumeCommand = 'guild agent test';
56
- const isInteractive = getOutputMode() === 'interactive' && !isQuietMode();
57
- if (isInteractive) {
58
- suppressScrollbackClear();
59
- }
60
- const { waitUntilExit } = render(React.createElement(ChatApp, {
61
- initialPrompt: '',
62
- version: packageJson.version,
63
- showSplash: false,
64
- resumeSession,
65
- resumeEvents,
66
- resumeCommand,
67
- eventFilter,
68
- }), { exitOnCtrlC: false });
69
- await waitUntilExit();
70
- return;
71
- }
72
- // Load local config (guild.json)
73
- const guildConfig = await loadLocalConfig(cwd);
74
- if (!guildConfig) {
75
- console.error('Error: Not in an agent directory');
76
- console.error('');
77
- console.error('guild.json not found in current directory.');
78
- console.error('');
79
- console.error('Initialize an agent directory:');
80
- console.error(' guild agent init --name my-agent');
81
- console.error('');
82
- console.error('Or clone an existing agent:');
83
- console.error(' guild agent clone <agent-id>');
84
- process.exit(1);
85
- }
86
- // If using JSON/JSONL input, read and validate it early (before auth/session creation)
87
- // This provides better UX - fail fast on bad input without needing auth
88
- let inputData;
89
- let jsonlInputs;
90
- if (options.mode === 'json') {
91
- try {
92
- inputData = await readStdinAsJSON();
93
- }
94
- catch (error) {
95
- const err = error;
96
- console.error(`Error: ${err.message}`);
97
- console.error('');
98
- console.error('Example usage:');
99
- console.error(' echo \'{"prompt": "test"}\' | guild agent test --mode json');
100
- console.error(' guild agent test --mode json < input.json');
101
- process.exit(1);
102
- }
103
- }
104
- else if (options.mode === 'jsonl') {
105
- try {
106
- const stdinContent = await readStdinAsText();
107
- jsonlInputs = [];
108
- const lines = stdinContent.split('\n');
109
- for (let i = 0; i < lines.length; i++) {
110
- const line = lines[i].trim();
111
- if (!line)
112
- continue;
113
- try {
114
- jsonlInputs.push(JSON.parse(line));
115
- }
116
- catch {
117
- console.error(`Error: Invalid JSON on line ${i + 1}`);
118
- console.error('');
119
- console.error('Each line must be valid JSON.');
120
- console.error(' cat inputs.jsonl | guild agent test --mode jsonl');
121
- process.exit(1);
122
- }
123
- }
124
- if (jsonlInputs.length === 0) {
125
- console.error('Error: No JSON input provided');
126
- console.error('');
127
- console.error('Example usage:');
128
- console.error(' cat inputs.jsonl | guild agent test --mode jsonl');
129
- process.exit(1);
130
- }
131
- }
132
- catch (error) {
133
- const err = error;
134
- console.error(`Error: ${err.message}`);
135
- process.exit(1);
136
- }
137
- }
138
- // Validate input against agent's schema locally (before build)
139
- // Skip when --agent-version is set since local source may differ from that version
140
- const inputsToValidate = inputData !== undefined ? [inputData] : (jsonlInputs ?? []);
141
- if (inputsToValidate.length > 0 && !options.agentVersion) {
142
- const validationResult = await validateInputSchema(cwd, inputsToValidate);
143
- if (!validationResult.valid) {
144
- console.error('Input validation failed:');
145
- for (const err of validationResult.errors) {
146
- const pathStr = err.path?.length ? ` (at ${err.path.join('.')})` : '';
147
- console.error(` - ${err.message}${pathStr}`);
148
- }
149
- process.exit(1);
150
- }
151
- if ('skipped' in validationResult && validationResult.skipped) {
152
- format.warn(`Skipping local validation: ${validationResult.reason}`);
153
- }
154
- }
155
- // If using bundle, verify the file exists early (before auth/session creation)
156
- // so we fail fast without needing auth if the path is wrong.
157
- if (options.bundle) {
158
- try {
159
- await access(options.bundle);
160
- }
161
- catch {
162
- console.error(`Error: Bundle file not found: ${options.bundle}`);
163
- console.error('');
164
- console.error('Ensure the bundle file exists and the path is correct:');
165
- console.error(' npm run build');
166
- console.error(' guild agent test --bundle agent.js.gz');
167
- process.exit(1);
168
- }
169
- }
170
- // Determine workspace (priority: flag > local config > global config)
171
- let workspaceId = options.workspace;
172
- let workspaceSourceLabel;
173
- if (!workspaceId) {
174
- const resolved = await getWorkspaceId(cwd);
175
- workspaceId = resolved?.workspaceId;
176
- workspaceSourceLabel = resolved
177
- ? getWorkspaceSourceLabel(resolved.source)
178
- : undefined;
179
- if (!workspaceId) {
180
- console.error('Error: No default workspace configured');
181
- console.error('');
182
- console.error('Set a default workspace interactively:');
183
- console.error(' guild workspace select');
184
- console.error('');
185
- console.error('Or specify a workspace for this test:');
186
- console.error(' guild agent test --workspace <workspace-id>');
187
- console.error('');
188
- console.error('List available workspaces:');
189
- console.error(' guild workspace list');
190
- process.exit(1);
191
- }
192
- }
193
- // Validate auth before any API calls or UI rendering
194
- await ensureAuthenticated();
195
- // Resolve version for testing
196
- const client = new GuildAPIClient();
197
- let version;
198
- let ephemeralCached = false;
199
- try {
200
- if (options.agentVersion) {
201
- // Explicit version: look it up by ID or version number
202
- const existingVersions = (await client.get(`/agents/${guildConfig.agent_id}/versions`));
203
- const match = existingVersions.items.find((v) => v.id === options.agentVersion ||
204
- v.version_number === options.agentVersion);
205
- if (!match) {
206
- console.error(`Error: Version not found: ${options.agentVersion}`);
207
- console.error('');
208
- console.error('List available versions:');
209
- console.error(` guild agent versions ${guildConfig.agent_id}`);
210
- process.exit(1);
211
- }
212
- version = match;
213
- }
214
- else if (options.bundle) {
215
- // Pre-built bundle: skip server-side compilation entirely.
216
- const result = await buildBundledVersion(client, guildConfig.agent_id, options.bundle, cwd, '[Test] Pre-built bundle');
217
- version = result.version;
218
- }
219
- else {
220
- // Default: build ephemeral version from working directory,
221
- // reusing the last build if files haven't changed.
222
- const agentFiles = await readAgentFiles(cwd);
223
- const noCache = options.cache === false;
224
- const result = await buildEphemeralVersion(client, guildConfig.agent_id, agentFiles, cwd, '[Test] Ephemeral development version', { noCache });
225
- version = result.version;
226
- ephemeralCached = result.cached;
227
- }
228
- }
229
- catch (error) {
230
- if (error instanceof BundleNotFoundError) {
231
- console.error(`Error: ${error.message}`);
232
- console.error('');
233
- console.error('Ensure the bundle file exists and the path is correct:');
234
- console.error(' npm run build');
235
- console.error(' guild agent test --bundle agent.js.gz');
236
- process.exit(1);
237
- }
238
- if (error instanceof BuildTimeoutError) {
239
- console.error('Error: Build did not complete');
240
- console.error('');
241
- console.error(error.message);
242
- console.error('');
243
- console.error('Check build status:');
244
- console.error(' guild agent versions');
245
- process.exit(1);
246
- }
247
- if (error instanceof BuildFailedError) {
248
- console.error(`Error: ${error.message}`);
249
- process.exit(1);
250
- }
251
- if (error instanceof Error &&
252
- error.message.startsWith('Missing required')) {
253
- console.error('Error: Could not read agent files');
254
- console.error('');
255
- console.error(error.message);
256
- console.error('');
257
- console.error('Ensure you are in an agent directory with:');
258
- console.error(' - agent.ts (required)');
259
- console.error(' - package.json (required)');
260
- process.exit(1);
261
- }
262
- const formattedError = handleAxiosError(error);
263
- if (formattedError.code === ErrorCodes.NOT_FOUND) {
264
- console.error(`Error: Agent not found: ${guildConfig.agent_id}`);
265
- console.error('');
266
- console.error('This agent may have been deleted from the backend.');
267
- console.error('');
268
- console.error('Verify the agent exists:');
269
- console.error(` guild agent get ${guildConfig.agent_id}`);
270
- console.error('');
271
- console.error('Or initialize a new agent:');
272
- console.error(' guild agent init --name my-agent');
273
- process.exit(1);
274
- }
275
- throw error;
276
- }
277
- // Create test session
278
- let session;
279
- try {
280
- session = (await client.post(`/workspaces/${workspaceId}/sessions`, {
281
- session_type: 'agent_test',
282
- agent_version_id: version.id,
283
- }));
284
- }
285
- catch (error) {
286
- const formattedError = handleAxiosError(error);
287
- if (formattedError.code === ErrorCodes.NOT_FOUND) {
288
- console.error(`Error: Workspace not found: ${workspaceId}`);
289
- console.error('');
290
- console.error('Set a different default workspace:');
291
- console.error(' guild workspace select');
292
- console.error('');
293
- console.error('Or list available workspaces:');
294
- console.error(' guild workspace list');
295
- process.exit(1);
296
- }
297
- throw error;
298
- }
299
- const quiet = isQuietMode();
300
- if (!quiet) {
301
- console.log(`✓ Agent: ${guildConfig.name} (${guildConfig.agent_id})`);
302
- const versionDisplay = options.agentVersion
303
- ? options.agentVersion
304
- : options.bundle
305
- ? `bundle (${path.basename(options.bundle)})`
306
- : ephemeralCached
307
- ? 'ephemeral (cached, no changes)'
308
- : 'ephemeral (working directory)';
309
- console.log(`✓ Version: ${versionDisplay}`);
310
- const workspaceDisplay = workspaceSourceLabel
311
- ? `${workspaceId} (from ${workspaceSourceLabel})`
312
- : workspaceId;
313
- console.log(`✓ Workspace: ${workspaceDisplay}`);
314
- const sessionLink = session.session_url
315
- ? hyperlink(session.id, session.session_url)
316
- : session.id;
317
- console.log(`✓ Session: ${sessionLink}`);
318
- console.log('');
319
- }
320
- if (options.open && session.session_url) {
321
- await open(session.session_url);
322
- }
323
- // Branch: JSON input mode vs interactive REPL
324
- if (options.mode === 'json' && inputData) {
325
- // JSON input mode: one-shot test
326
- try {
327
- // Send JSON as event content (inputData already read earlier)
328
- await client.post(`/sessions/${session.id}/events`, {
329
- mode: 'json',
330
- content: inputData,
331
- });
332
- // Poll for response (starting from beginning)
333
- // 3 minutes - allow time for agents that use LLM calls for input parsing
334
- const { response } = eventFilter
335
- ? await pollForResponseWithEvents(client, session.id, eventFilter, undefined, 180000)
336
- : await pollForResponse(client, session.id, undefined, 180000);
337
- if (!response) {
338
- console.error('Error: No response received from agent within timeout');
339
- console.error('');
340
- console.error('The agent did not produce a response in time.');
341
- console.error('');
342
- console.error('Possible causes:');
343
- console.error(' - The agent is still processing (try a longer timeout)');
344
- console.error(' - The agent encountered an error during execution');
345
- console.error(" - The input format does not match the agent's input schema");
346
- console.error('');
347
- console.error('Check agent logs in the web UI or try interactive mode:');
348
- console.error(' guild agent test');
349
- process.exit(1);
350
- }
351
- if (quiet) {
352
- console.log(response);
353
- }
354
- else {
355
- console.log(`< ${response}`);
356
- console.log('');
357
- }
358
- if (!quiet) {
359
- console.log('✓ Test complete');
360
- }
361
- process.exit(0);
362
- }
363
- catch (error) {
364
- const formattedErr = handleAxiosError(error);
365
- console.error(`Error: ${formattedErr.details}`);
366
- console.error('');
367
- if (formattedErr.code === ErrorCodes.SERVER_ERROR) {
368
- console.error('The server returned an error while processing the event.');
369
- console.error('');
370
- console.error('Possible causes:');
371
- console.error(" - The input format does not match the agent's input schema");
372
- console.error(' - The agent runtime encountered an error');
373
- console.error('');
374
- console.error('Try testing interactively to see more detail:');
375
- console.error(' guild agent test');
376
- }
377
- else {
378
- console.error('Failed to send event to agent session.');
379
- console.error('');
380
- console.error('Example usage:');
381
- console.error(' echo \'{"type":"text","text":"hello"}\' | guild agent test --mode json');
382
- console.error(' guild agent test --mode json < input.json');
383
- }
384
- process.exit(1);
385
- }
386
- }
387
- else if (options.mode === 'jsonl' && jsonlInputs) {
388
- // JSONL input mode: line-by-line processing (inputs already parsed and validated)
389
- let processedCount = 0;
390
- let lastEventId;
391
- for (let inputIndex = 0; inputIndex < jsonlInputs.length; inputIndex++) {
392
- const jsonInput = jsonlInputs[inputIndex];
393
- if (!quiet) {
394
- console.error(`Processing input ${inputIndex + 1}/${jsonlInputs.length}...`);
395
- }
396
- try {
397
- // Send message
398
- await client.post(`/sessions/${session.id}/events`, {
399
- mode: 'json',
400
- content: jsonInput,
401
- });
402
- // Wait for response (looking for events after last seen)
403
- const result = eventFilter
404
- ? await pollForResponseWithEvents(client, session.id, eventFilter, lastEventId, 180000)
405
- : await pollForResponse(client, session.id, lastEventId, 180000);
406
- lastEventId = result.lastEventId;
407
- if (!result.response) {
408
- console.error(`Timeout: No response for input ${inputIndex + 1}`);
409
- continue;
410
- }
411
- const response = result.response;
412
- // Output response
413
- if (quiet) {
414
- console.log(response);
415
- }
416
- else {
417
- console.log(`< ${response}`);
418
- console.log('');
419
- }
420
- processedCount++;
421
- }
422
- catch (error) {
423
- const formattedErr = handleAxiosError(error);
424
- console.error(`Error processing input ${inputIndex + 1}: ${formattedErr.details}`);
425
- }
426
- }
427
- if (!quiet) {
428
- console.log(`\n✓ Processed ${processedCount} messages`);
429
- }
430
- process.exit(0);
431
- }
432
- // Interactive mode: use shared ChatApp (spinner, progress, prompt)
433
- ensureInteractiveStdin('guild agent test');
434
- const resumeCommand = 'guild agent test';
435
- const isInteractive = getOutputMode() === 'interactive' && !isQuietMode();
436
- if (isInteractive) {
437
- suppressScrollbackClear();
438
- }
439
- // Pass the already-created test session as resumeSession so ChatApp
440
- // skips its own session creation and uses our agent_test session.
441
- const { waitUntilExit } = render(React.createElement(ChatApp, {
442
- initialPrompt: '',
443
- version: packageJson.version,
444
- workspaceId,
445
- versionId: version.id,
446
- agentName: guildConfig.name,
447
- showSplash: false,
448
- resumeSession: session,
449
- resumeEvents: [],
450
- resumeCommand,
451
- eventFilter,
452
- }), { exitOnCtrlC: false });
453
- await waitUntilExit();
454
- }
455
- catch (error) {
456
- if (error instanceof GitError) {
457
- console.error('Error: Git operation failed');
458
- console.error('');
459
- console.error(formatGitError(error));
460
- process.exit(1);
461
- }
462
- const formattedError = handleAxiosError(error);
463
- if (formattedError.code === ErrorCodes.AUTH_REQUIRED ||
464
- formattedError.code === ErrorCodes.AUTH_TOKEN_INVALID) {
465
- format.error('Not authenticated. Run: guild auth login');
466
- process.exit(1);
467
- }
468
- console.error(`Error: ${formattedError.details}`);
469
- console.error('');
470
- console.error('Failed to start test session. Troubleshooting:');
471
- console.error(' - Verify the agent exists: guild agent get');
472
- console.error(' - Check your workspace: guild workspace list');
473
- if (formattedError.code) {
474
- console.error(` - Error code: ${formattedError.code}`);
475
- }
476
- process.exit(1);
477
- }
478
- });
479
- return cmd;
480
- }
481
- // Thin wrapper for lazy-loading from index.ts (avoids importing React at startup)
482
- export async function handleAgentTestAction(_options) {
483
- const cmd = createAgentTestCommand();
484
- await cmd.parseAsync(process.argv.slice(3), { from: 'user' });
485
- }
486
- //# sourceMappingURL=test.js.map
@@ -1,64 +0,0 @@
1
- // Copyright 2026 Guild.ai
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { Command } from 'commander';
4
- import { GuildAPIClient } from '../../lib/api-client.js';
5
- import { getAgentId, resolveAgentRef } from '../../lib/agent-helpers.js';
6
- import { handleAxiosError, ErrorCodes } from '../../lib/errors.js';
7
- import { createOutputWriter } from '../../lib/output.js';
8
- export function createAgentUnpublishCommand() {
9
- const cmd = new Command('unpublish');
10
- cmd
11
- .description('Unpublish the latest published version of an agent')
12
- .argument('[identifier]', 'Agent ID or full name (e.g., owner~agent-name)')
13
- .action(async (agentIdArg) => {
14
- const output = createOutputWriter();
15
- try {
16
- const client = new GuildAPIClient();
17
- // Resolve agent ID
18
- const { agentId, config } = await getAgentId(agentIdArg);
19
- const resolvedId = await resolveAgentRef(client, agentId);
20
- // Fetch all versions
21
- const response = await client.get(`/agents/${resolvedId}/versions`);
22
- // Find latest PUBLISHED version
23
- const publishedVersions = response.items
24
- .filter((v) => v.status === 'PUBLISHED')
25
- .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
26
- if (publishedVersions.length === 0) {
27
- const agentName = config?.name || agentId;
28
- output.error(`No published versions available for agent: ${agentName}`, 'Publish a draft version:\n guild agent publish');
29
- process.exit(1);
30
- }
31
- const versionToUnpublish = publishedVersions[0];
32
- // Check if already draft
33
- if (versionToUnpublish.status === 'DRAFT') {
34
- output.error(`Version ${versionToUnpublish.id} is already a draft`, 'To publish:\n guild agent publish');
35
- process.exit(1);
36
- }
37
- // Unpublish version
38
- await client.post(`/versions/${versionToUnpublish.id}/unpublish`, {});
39
- output.success(`Unpublished version ${versionToUnpublish.id}`, {
40
- agent: `${versionToUnpublish.agent?.name || config?.name || agentId}${config ? '' : ` (${agentId})`}`,
41
- status: 'PUBLISHED → DRAFT',
42
- });
43
- }
44
- catch (error) {
45
- const formattedError = handleAxiosError(error);
46
- if (formattedError.code === ErrorCodes.AUTH_REQUIRED) {
47
- output.error('Not authenticated. Run: guild auth login');
48
- process.exit(1);
49
- }
50
- if (formattedError.code === ErrorCodes.NOT_FOUND) {
51
- output.error('Agent not found', 'Run: guild agent list');
52
- process.exit(1);
53
- }
54
- if (formattedError.code === ErrorCodes.CONN_REFUSED) {
55
- output.error('Cannot connect to Guild servers');
56
- process.exit(1);
57
- }
58
- output.error(`Failed to unpublish version: ${formattedError.details}`);
59
- process.exit(1);
60
- }
61
- });
62
- return cmd;
63
- }
64
- //# sourceMappingURL=unpublish.js.map
@@ -1,110 +0,0 @@
1
- // Copyright 2026 Guild.ai
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { Command } from 'commander';
4
- import * as readline from 'readline';
5
- import { GuildAPIClient } from '../../lib/api-client.js';
6
- import { getAgentId, resolveAgentRef } from '../../lib/agent-helpers.js';
7
- import { handleAxiosError, ErrorCodes } from '../../lib/errors.js';
8
- import { createOutputWriter } from '../../lib/output.js';
9
- async function confirmVisibilityChange(agentName, makePublic) {
10
- const rl = readline.createInterface({
11
- input: process.stdin,
12
- output: process.stdout,
13
- });
14
- const action = makePublic ? 'PUBLIC' : 'PRIVATE';
15
- const warning = makePublic
16
- ? 'This will make the agent visible to everyone.'
17
- : 'This will hide the agent from public discovery.';
18
- return new Promise((resolve) => {
19
- rl.question(`\nAre you sure you want to make "${agentName}" ${action}?\n${warning}\n\nContinue? [y/N] `, (answer) => {
20
- rl.close();
21
- resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
22
- });
23
- });
24
- }
25
- export function createAgentUpdateCommand() {
26
- const cmd = new Command('update');
27
- cmd
28
- .description('Update agent properties (visibility)')
29
- .argument('[identifier]', 'Agent ID or full name (e.g., owner~agent-name)')
30
- .option('--public', 'Make the agent public (visible to everyone)')
31
- .option('--private', 'Make the agent private (only visible to owner)')
32
- .option('--yes', 'Skip confirmation prompt for visibility changes')
33
- .action(async (identifierArg, options) => {
34
- const output = createOutputWriter();
35
- // Validate that at least one option is provided
36
- if (!options.public && !options.private) {
37
- output.error('No update options provided.', 'Usage: guild agent update [identifier] [options]\n\nOptions:\n --public Make the agent public\n --private Make the agent private\n --yes Skip confirmation prompt\n\nExamples:\n guild agent update my-agent --public\n guild agent update my-agent --private --yes\n guild agent update --public (uses guild.json)\n\nNote: Agent descriptions are set from README.md when publishing.');
38
- process.exit(1);
39
- }
40
- // Validate that --public and --private are not both specified
41
- if (options.public && options.private) {
42
- output.error('Cannot specify both --public and --private');
43
- process.exit(1);
44
- }
45
- const { agentId } = await getAgentId(identifierArg);
46
- const client = new GuildAPIClient();
47
- try {
48
- const resolvedId = await resolveAgentRef(client, agentId);
49
- // Fetch current agent info for confirmation prompts
50
- const agent = await client.get(`/agents/${resolvedId}`);
51
- // Handle visibility change confirmation
52
- const changingVisibility = options.public || options.private;
53
- if (changingVisibility) {
54
- const makePublic = Boolean(options.public);
55
- // Check if already in desired state
56
- if (agent.is_public === makePublic) {
57
- output.progress(`Agent "${agent.full_name}" is already ${makePublic ? 'public' : 'private'}.`);
58
- process.exit(0);
59
- }
60
- // Confirm unless --yes is specified
61
- if (!options.yes) {
62
- const confirmed = await confirmVisibilityChange(agent.full_name, makePublic);
63
- if (!confirmed) {
64
- output.progress('Cancelled.');
65
- process.exit(0);
66
- }
67
- }
68
- }
69
- // Build update payload
70
- const updatePayload = {};
71
- if (options.public) {
72
- updatePayload.is_public = true;
73
- }
74
- if (options.private) {
75
- updatePayload.is_public = false;
76
- }
77
- const result = await client.patch(`/agents/${resolvedId}`, updatePayload);
78
- // Build success message
79
- const changes = [];
80
- if (changingVisibility) {
81
- changes.push(`visibility: ${result.is_public ? 'public' : 'private'}`);
82
- }
83
- output.data({
84
- success: 'Agent updated',
85
- id: result.id,
86
- full_name: result.full_name,
87
- is_public: result.is_public,
88
- changes: changes,
89
- });
90
- }
91
- catch (error) {
92
- const formattedError = handleAxiosError(error);
93
- if (formattedError.code === ErrorCodes.AUTH_REQUIRED) {
94
- output.error('Not logged in.', 'Please authenticate first:\n guild auth login');
95
- }
96
- else if (formattedError.code === ErrorCodes.CONN_REFUSED) {
97
- output.error('Cannot connect to Guild servers');
98
- }
99
- else if (formattedError.code === ErrorCodes.NOT_FOUND) {
100
- output.error(`Agent not found: ${agentId}`, 'Check the agent ID:\n guild agent list');
101
- }
102
- else {
103
- output.error(`Failed to update agent: ${formattedError.details}`);
104
- }
105
- process.exit(1);
106
- }
107
- });
108
- return cmd;
109
- }
110
- //# sourceMappingURL=update.js.map