@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.
- package/dist/auth-CRMO5O3N.js +29 -0
- package/dist/auth-CRMO5O3N.js.map +7 -0
- package/dist/chat-5VX2WJH2.js +303 -0
- package/dist/chat-5VX2WJH2.js.map +7 -0
- package/dist/chat-SIKDYZQK.js +31 -0
- package/dist/chat-SIKDYZQK.js.map +7 -0
- package/dist/chunk-56YCMGL3.js +522 -0
- package/dist/chunk-56YCMGL3.js.map +7 -0
- package/dist/chunk-6EX6E7WP.js +7042 -0
- package/dist/chunk-6EX6E7WP.js.map +7 -0
- package/dist/chunk-B7VAF5UG.js +532 -0
- package/dist/chunk-B7VAF5UG.js.map +7 -0
- package/dist/chunk-DOIYVBNY.js +3057 -0
- package/dist/chunk-DOIYVBNY.js.map +7 -0
- package/dist/chunk-ENKEEJ45.js +17 -0
- package/dist/chunk-ENKEEJ45.js.map +7 -0
- package/dist/chunk-IBRKVGMZ.js +97041 -0
- package/dist/chunk-IBRKVGMZ.js.map +7 -0
- package/dist/chunk-LFMQJOKC.js +19778 -0
- package/dist/chunk-LFMQJOKC.js.map +7 -0
- package/dist/chunk-M347HP6M.js +22896 -0
- package/dist/chunk-M347HP6M.js.map +7 -0
- package/dist/chunk-OYQ476FQ.js +44 -0
- package/dist/chunk-OYQ476FQ.js.map +7 -0
- package/dist/chunk-PNCUR4OB.js +257 -0
- package/dist/chunk-PNCUR4OB.js.map +7 -0
- package/dist/chunk-RIG2HZWM.js +317 -0
- package/dist/chunk-RIG2HZWM.js.map +7 -0
- package/dist/chunk-SPZPZXUN.js +826 -0
- package/dist/chunk-SPZPZXUN.js.map +7 -0
- package/dist/chunk-VVSOU6ON.js +53 -0
- package/dist/chunk-VVSOU6ON.js.map +7 -0
- package/dist/chunk-X3ADGWOF.js +3643 -0
- package/dist/chunk-X3ADGWOF.js.map +7 -0
- package/dist/commands/agent/logs.d.ts +3 -0
- package/dist/commands/setup.d.ts +16 -0
- package/dist/commands/skill/create.d.ts +3 -0
- package/dist/commands/skill/get.d.ts +3 -0
- package/dist/commands/skill/list.d.ts +3 -0
- package/dist/commands/skill/update.d.ts +3 -0
- package/dist/commands/skill/version/create.d.ts +3 -0
- package/dist/commands/skill/version/get.d.ts +3 -0
- package/dist/commands/skill/version/list.d.ts +3 -0
- package/dist/devtools-AO7YSDOD.js +67 -0
- package/dist/devtools-AO7YSDOD.js.map +7 -0
- package/dist/dist-4CBK6X5H.js +1566 -0
- package/dist/dist-4CBK6X5H.js.map +7 -0
- package/dist/esm-FRAVZP4J.js +13 -0
- package/dist/esm-FRAVZP4J.js.map +7 -0
- package/dist/execa-XQMWSABC.js +35 -0
- package/dist/execa-XQMWSABC.js.map +7 -0
- package/dist/index.js +8231 -253
- package/dist/index.js.map +7 -0
- package/dist/lib/api-types.d.ts +44 -0
- package/dist/lib/auth.d.ts +1 -1
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/errors.d.ts +1 -1
- package/dist/lib/output-mode.d.ts +9 -2
- package/dist/lib/output.d.ts +17 -1
- package/dist/lib/session-events.d.ts +14 -3
- package/dist/lib/session-polling.d.ts +24 -1
- package/dist/lib/session-resume.d.ts +15 -1
- package/dist/lib/stdin.d.ts +5 -1
- package/dist/lib/websocket-client.d.ts +46 -0
- package/dist/open-RF4X5MOP.js +13 -0
- package/dist/open-RF4X5MOP.js.map +7 -0
- package/dist/server-JYVH64FD.js +27659 -0
- package/dist/server-JYVH64FD.js.map +7 -0
- package/dist/test-SNIYRJ32.js +692 -0
- package/dist/test-SNIYRJ32.js.map +7 -0
- package/docs/skills/codex-agent-dev.md +2 -2
- package/package.json +8 -12
- package/dist/commands/agent/chat.js +0 -278
- package/dist/commands/agent/clone.js +0 -116
- package/dist/commands/agent/code.js +0 -87
- package/dist/commands/agent/fork.js +0 -218
- package/dist/commands/agent/get.js +0 -37
- package/dist/commands/agent/grep.js +0 -107
- package/dist/commands/agent/init.js +0 -390
- package/dist/commands/agent/list.js +0 -110
- package/dist/commands/agent/owners.js +0 -74
- package/dist/commands/agent/publish.js +0 -91
- package/dist/commands/agent/pull.js +0 -198
- package/dist/commands/agent/revalidate.js +0 -56
- package/dist/commands/agent/save.js +0 -346
- package/dist/commands/agent/search.js +0 -61
- package/dist/commands/agent/tags/add.js +0 -73
- package/dist/commands/agent/tags/list.js +0 -43
- package/dist/commands/agent/tags/remove.js +0 -84
- package/dist/commands/agent/tags/set.js +0 -71
- package/dist/commands/agent/test.js +0 -486
- package/dist/commands/agent/unpublish.js +0 -64
- package/dist/commands/agent/update.js +0 -110
- package/dist/commands/agent/versions.js +0 -55
- package/dist/commands/agent/workspaces.js +0 -54
- package/dist/commands/auth/login.js +0 -33
- package/dist/commands/auth/logout.js +0 -24
- package/dist/commands/auth/status.js +0 -38
- package/dist/commands/auth/token.js +0 -19
- package/dist/commands/chat.js +0 -1345
- package/dist/commands/config/get.js +0 -64
- package/dist/commands/config/list.js +0 -47
- package/dist/commands/config/path.js +0 -38
- package/dist/commands/config/set.js +0 -132
- package/dist/commands/credentials/endpoint-list.js +0 -88
- package/dist/commands/credentials/list.js +0 -50
- package/dist/commands/credentials/policy-create.js +0 -66
- package/dist/commands/credentials/policy-delete.js +0 -33
- package/dist/commands/credentials/policy-list.js +0 -45
- package/dist/commands/credentials/policy-update.js +0 -66
- package/dist/commands/doctor.js +0 -233
- package/dist/commands/integration/connect.js +0 -76
- package/dist/commands/integration/create.js +0 -298
- package/dist/commands/integration/get.js +0 -95
- package/dist/commands/integration/list.js +0 -62
- package/dist/commands/integration/operation/create.js +0 -164
- package/dist/commands/integration/operation/list.js +0 -92
- package/dist/commands/integration/update.js +0 -139
- package/dist/commands/integration/version/build.js +0 -86
- package/dist/commands/integration/version/create.js +0 -45
- package/dist/commands/integration/version/get.js +0 -72
- package/dist/commands/integration/version/list.js +0 -45
- package/dist/commands/integration/version/publish.js +0 -79
- package/dist/commands/integration/version/test.js +0 -104
- package/dist/commands/job/get-step.js +0 -40
- package/dist/commands/job/get.js +0 -44
- package/dist/commands/mcp.js +0 -34
- package/dist/commands/session/create.js +0 -59
- package/dist/commands/session/events.js +0 -56
- package/dist/commands/session/get.js +0 -33
- package/dist/commands/session/interrupt.js +0 -33
- package/dist/commands/session/list.js +0 -59
- package/dist/commands/session/send.js +0 -54
- package/dist/commands/session/tasks.js +0 -45
- package/dist/commands/setup.js +0 -230
- package/dist/commands/trigger/activate.js +0 -41
- package/dist/commands/trigger/create.js +0 -197
- package/dist/commands/trigger/deactivate.js +0 -41
- package/dist/commands/trigger/get.js +0 -33
- package/dist/commands/trigger/list.js +0 -57
- package/dist/commands/trigger/sessions.js +0 -48
- package/dist/commands/trigger/update.js +0 -128
- package/dist/commands/version.js +0 -24
- package/dist/commands/workspace/agent/add.js +0 -114
- package/dist/commands/workspace/agent/list.js +0 -78
- package/dist/commands/workspace/agent/remove.js +0 -78
- package/dist/commands/workspace/clear.js +0 -45
- package/dist/commands/workspace/context/edit.js +0 -107
- package/dist/commands/workspace/context/get.js +0 -47
- package/dist/commands/workspace/context/list.js +0 -51
- package/dist/commands/workspace/context/publish.js +0 -42
- package/dist/commands/workspace/create.js +0 -51
- package/dist/commands/workspace/current.js +0 -63
- package/dist/commands/workspace/get.js +0 -39
- package/dist/commands/workspace/list.js +0 -70
- package/dist/commands/workspace/select.js +0 -184
- package/dist/components/AgentInstallPrompt.js +0 -97
- package/dist/components/SplashAnimation.js +0 -321
- package/dist/components/TaskView.js +0 -268
- package/dist/lib/agent-helpers.js +0 -306
- package/dist/lib/alternate-screen.js +0 -59
- package/dist/lib/api-client.js +0 -154
- package/dist/lib/api-types.js +0 -10
- package/dist/lib/auth.js +0 -284
- package/dist/lib/braille-canvas.js +0 -321
- package/dist/lib/colors.js +0 -46
- package/dist/lib/config-cache.js +0 -45
- package/dist/lib/config.js +0 -153
- package/dist/lib/did-you-mean.js +0 -144
- package/dist/lib/errors.js +0 -375
- package/dist/lib/event-filter.js +0 -91
- package/dist/lib/generated-types.js +0 -56
- package/dist/lib/git.js +0 -176
- package/dist/lib/gk.js +0 -91
- package/dist/lib/guild-config.js +0 -178
- package/dist/lib/iap.js +0 -117
- package/dist/lib/integration-helpers.js +0 -38
- package/dist/lib/loading-messages.js +0 -72
- package/dist/lib/logo.js +0 -141
- package/dist/lib/lottie-serverside.js +0 -181
- package/dist/lib/markdown.js +0 -38
- package/dist/lib/npmrc.js +0 -59
- package/dist/lib/output-mode.js +0 -33
- package/dist/lib/output.js +0 -591
- package/dist/lib/owner-helpers.js +0 -112
- package/dist/lib/polling.js +0 -76
- package/dist/lib/progress.js +0 -324
- package/dist/lib/session-events-fetch.js +0 -25
- package/dist/lib/session-events.js +0 -112
- package/dist/lib/session-polling.js +0 -160
- package/dist/lib/session-resume.js +0 -96
- package/dist/lib/spinners.js +0 -770
- package/dist/lib/splash.js +0 -41
- package/dist/lib/stdin.js +0 -84
- package/dist/lib/svg-to-braille.js +0 -76
- package/dist/lib/table.js +0 -59
- package/dist/lib/update-check.js +0 -65
- package/dist/lib/validate-input-schema.js +0 -208
- package/dist/lib/version-helpers.js +0 -121
- package/dist/lib/workspace-helpers.js +0 -49
- package/dist/mcp/resources.js +0 -67
- package/dist/mcp/server.js +0 -64
- package/dist/mcp/tools.js +0 -753
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
import { createRequire as _cjsReq } from 'module'; if(typeof require === 'undefined') var require = _cjsReq(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
execa
|
|
4
|
+
} from "./chunk-6EX6E7WP.js";
|
|
5
|
+
import {
|
|
6
|
+
GuildAPIClient,
|
|
7
|
+
loadGlobalConfig,
|
|
8
|
+
loadLocalConfig
|
|
9
|
+
} from "./chunk-RIG2HZWM.js";
|
|
10
|
+
import {
|
|
11
|
+
createSpinner,
|
|
12
|
+
debug
|
|
13
|
+
} from "./chunk-LFMQJOKC.js";
|
|
14
|
+
import {
|
|
15
|
+
esm_default
|
|
16
|
+
} from "./chunk-M347HP6M.js";
|
|
17
|
+
|
|
18
|
+
// src/lib/git.ts
|
|
19
|
+
import * as fs from "fs/promises";
|
|
20
|
+
import * as path from "path";
|
|
21
|
+
var GitError = class extends Error {
|
|
22
|
+
constructor(command, args, stderr, stdout, exitCode, timedOut) {
|
|
23
|
+
const output = stderr.trim() || stdout.trim();
|
|
24
|
+
const baseMessage = timedOut ? `Git command timed out: git ${args.join(" ")}` : `Git command failed: git ${args.join(" ")}`;
|
|
25
|
+
super(output ? `${baseMessage}
|
|
26
|
+
${output}` : baseMessage);
|
|
27
|
+
this.command = command;
|
|
28
|
+
this.args = args;
|
|
29
|
+
this.stderr = stderr;
|
|
30
|
+
this.stdout = stdout;
|
|
31
|
+
this.exitCode = exitCode;
|
|
32
|
+
this.timedOut = timedOut;
|
|
33
|
+
this.name = "GitError";
|
|
34
|
+
}
|
|
35
|
+
command;
|
|
36
|
+
args;
|
|
37
|
+
stderr;
|
|
38
|
+
stdout;
|
|
39
|
+
exitCode;
|
|
40
|
+
timedOut;
|
|
41
|
+
};
|
|
42
|
+
var DEFAULT_TIMEOUT = 3e4;
|
|
43
|
+
var NETWORK_TIMEOUT = 12e4;
|
|
44
|
+
var NETWORK_COMMANDS = ["clone", "push", "pull", "fetch"];
|
|
45
|
+
async function runGit(args, options = {}) {
|
|
46
|
+
const { cwd, timeout: customTimeout, env: extraEnv } = options;
|
|
47
|
+
const isNetworkCommand = args.length > 0 && NETWORK_COMMANDS.includes(args[0]);
|
|
48
|
+
const timeout = customTimeout ?? (isNetworkCommand ? NETWORK_TIMEOUT : DEFAULT_TIMEOUT);
|
|
49
|
+
debug(`Running git command: git ${args.join(" ")} (timeout: ${timeout}ms)`);
|
|
50
|
+
let result;
|
|
51
|
+
try {
|
|
52
|
+
result = await execa("git", args, {
|
|
53
|
+
cwd,
|
|
54
|
+
timeout,
|
|
55
|
+
reject: false,
|
|
56
|
+
env: {
|
|
57
|
+
...process.env,
|
|
58
|
+
// Prevent git from prompting for credentials - fail fast instead
|
|
59
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
60
|
+
// Prevent SSH from prompting for passwords/passphrases
|
|
61
|
+
GIT_SSH_COMMAND: "ssh -o BatchMode=yes",
|
|
62
|
+
...extraEnv
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
} catch (error) {
|
|
66
|
+
const execaError = error;
|
|
67
|
+
if (execaError.timedOut) {
|
|
68
|
+
throw new GitError(
|
|
69
|
+
"git",
|
|
70
|
+
args,
|
|
71
|
+
String(execaError.stderr || ""),
|
|
72
|
+
String(execaError.stdout || ""),
|
|
73
|
+
null,
|
|
74
|
+
true
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
const stdout = String(result.stdout ?? "");
|
|
80
|
+
const stderr = String(result.stderr ?? "");
|
|
81
|
+
const exitCode = result.exitCode ?? 0;
|
|
82
|
+
if (result.timedOut) {
|
|
83
|
+
throw new GitError("git", args, stderr, stdout, null, true);
|
|
84
|
+
}
|
|
85
|
+
if (exitCode !== 0) {
|
|
86
|
+
throw new GitError("git", args, stderr, stdout, exitCode, false);
|
|
87
|
+
}
|
|
88
|
+
return { stdout, stderr, exitCode };
|
|
89
|
+
}
|
|
90
|
+
function formatGitError(error) {
|
|
91
|
+
const lines = [];
|
|
92
|
+
if (error.timedOut) {
|
|
93
|
+
lines.push("Git command timed out");
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("This usually means git is waiting for input that cannot be provided.");
|
|
96
|
+
lines.push("Common causes:");
|
|
97
|
+
lines.push(" \u2022 GPG signing requires a passphrase - run `gpg --sign` to cache it");
|
|
98
|
+
lines.push(" \u2022 SSH key requires a passphrase - run `ssh-add` to cache it");
|
|
99
|
+
lines.push(" \u2022 Git credentials are needed - configure a credential helper");
|
|
100
|
+
} else {
|
|
101
|
+
lines.push("Git operation failed");
|
|
102
|
+
}
|
|
103
|
+
lines.push("");
|
|
104
|
+
lines.push(`Command: git ${error.args.join(" ")}`);
|
|
105
|
+
if (error.stderr) {
|
|
106
|
+
lines.push("");
|
|
107
|
+
lines.push("Output:");
|
|
108
|
+
lines.push(error.stderr.trim());
|
|
109
|
+
} else if (error.stdout) {
|
|
110
|
+
lines.push("");
|
|
111
|
+
lines.push("Output:");
|
|
112
|
+
lines.push(error.stdout.trim());
|
|
113
|
+
}
|
|
114
|
+
if (error.exitCode !== null) {
|
|
115
|
+
lines.push("");
|
|
116
|
+
lines.push(`Exit code: ${error.exitCode}`);
|
|
117
|
+
}
|
|
118
|
+
return lines.join("\n");
|
|
119
|
+
}
|
|
120
|
+
var PRE_PUSH_HOOK = `#!/bin/sh
|
|
121
|
+
if [ "$GUILD_AGENT_SAVE" != "1" ]; then
|
|
122
|
+
echo "Please use \\\`guild agent save\\\` to push."
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
125
|
+
exit 0
|
|
126
|
+
`;
|
|
127
|
+
async function installPrePushHook(targetDir) {
|
|
128
|
+
const hooksDir = path.join(targetDir, ".git", "hooks");
|
|
129
|
+
await fs.mkdir(hooksDir, { recursive: true });
|
|
130
|
+
await fs.writeFile(path.join(hooksDir, "pre-push"), PRE_PUSH_HOOK, {
|
|
131
|
+
mode: 493
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/lib/agent-helpers.ts
|
|
136
|
+
import { createHash } from "crypto";
|
|
137
|
+
import * as fs2 from "fs/promises";
|
|
138
|
+
import * as path2 from "path";
|
|
139
|
+
|
|
140
|
+
// src/lib/owner-helpers.ts
|
|
141
|
+
async function lookupOwner(client, val) {
|
|
142
|
+
const me = await client.get("/me");
|
|
143
|
+
if (me.id === val || me.name === val) {
|
|
144
|
+
return { id: me.id, name: me.name, type: "user" };
|
|
145
|
+
}
|
|
146
|
+
const orgs = await client.fetchAll("/me/organizations");
|
|
147
|
+
const org = orgs.find((o) => o.id === val || o.name === val);
|
|
148
|
+
if (org) {
|
|
149
|
+
return { id: org.id, name: org.name, type: "organization" };
|
|
150
|
+
}
|
|
151
|
+
return void 0;
|
|
152
|
+
}
|
|
153
|
+
async function resolveOwnerId(options) {
|
|
154
|
+
const { ownerFlag, client, interactive, requireExplicitOwner = false } = options;
|
|
155
|
+
if (ownerFlag) {
|
|
156
|
+
debug("Using owner from --owner flag: %s", ownerFlag);
|
|
157
|
+
const match = await lookupOwner(client, ownerFlag);
|
|
158
|
+
if (match) return match;
|
|
159
|
+
return { id: ownerFlag, name: ownerFlag, type: "organization" };
|
|
160
|
+
}
|
|
161
|
+
if (process.env.GUILD_OWNER_ID) {
|
|
162
|
+
debug("Using owner from GUILD_OWNER_ID env var: %s", process.env.GUILD_OWNER_ID);
|
|
163
|
+
const match = await lookupOwner(client, process.env.GUILD_OWNER_ID);
|
|
164
|
+
if (match) return match;
|
|
165
|
+
return {
|
|
166
|
+
id: process.env.GUILD_OWNER_ID,
|
|
167
|
+
name: process.env.GUILD_OWNER_ID,
|
|
168
|
+
type: "organization"
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const globalConfig = await loadGlobalConfig();
|
|
172
|
+
if (globalConfig?.default_owner) {
|
|
173
|
+
debug("Using owner from global config: %s", globalConfig.default_owner);
|
|
174
|
+
const match = await lookupOwner(client, globalConfig.default_owner);
|
|
175
|
+
if (match) return match;
|
|
176
|
+
const name = globalConfig.default_owner_name || globalConfig.default_owner;
|
|
177
|
+
return { id: globalConfig.default_owner, name, type: "organization" };
|
|
178
|
+
}
|
|
179
|
+
const me = await client.get("/me");
|
|
180
|
+
const orgs = await client.fetchAll("/me/organizations");
|
|
181
|
+
if (orgs.length === 0 && !interactive) {
|
|
182
|
+
debug("No organizations found, using current user as owner");
|
|
183
|
+
return { id: me.id, name: me.name, type: "user" };
|
|
184
|
+
}
|
|
185
|
+
if (orgs.length > 0 && !interactive) {
|
|
186
|
+
if (requireExplicitOwner) {
|
|
187
|
+
debug("Non-interactive mode with multiple accounts available, requiring --owner");
|
|
188
|
+
throw new Error(
|
|
189
|
+
"Owner is required in non-interactive mode when multiple accounts are available.\n\nUse --owner <name-or-id> to specify an owner, or set a default:\n guild config set default_owner <name-or-id>"
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
debug("Multiple accounts available, defaulting to current user");
|
|
193
|
+
return { id: me.id, name: me.name, type: "user" };
|
|
194
|
+
}
|
|
195
|
+
const choices = [
|
|
196
|
+
{
|
|
197
|
+
name: `${me.name} (personal)`,
|
|
198
|
+
value: { id: me.id, name: me.name, type: "user" }
|
|
199
|
+
},
|
|
200
|
+
...orgs.map((org) => ({
|
|
201
|
+
name: org.name,
|
|
202
|
+
value: { id: org.id, name: org.name, type: "organization" }
|
|
203
|
+
}))
|
|
204
|
+
];
|
|
205
|
+
const { owner } = await esm_default.prompt([
|
|
206
|
+
{
|
|
207
|
+
type: "list",
|
|
208
|
+
name: "owner",
|
|
209
|
+
message: "Select owner for this agent:",
|
|
210
|
+
choices
|
|
211
|
+
}
|
|
212
|
+
]);
|
|
213
|
+
return owner;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// src/lib/polling.ts
|
|
217
|
+
async function pollUntilComplete(options) {
|
|
218
|
+
const {
|
|
219
|
+
endpoint,
|
|
220
|
+
isComplete,
|
|
221
|
+
message = "Waiting for operation to complete...",
|
|
222
|
+
maxAttempts = 60,
|
|
223
|
+
delayMs = 1e3,
|
|
224
|
+
successMessage = "Operation complete",
|
|
225
|
+
timeoutMessage = "Operation timed out",
|
|
226
|
+
onPoll
|
|
227
|
+
} = options;
|
|
228
|
+
const client = new GuildAPIClient();
|
|
229
|
+
const spinner = createSpinner(message);
|
|
230
|
+
spinner.start();
|
|
231
|
+
let attempts = 0;
|
|
232
|
+
let lastResponse;
|
|
233
|
+
for (attempts = 1; attempts <= maxAttempts; attempts++) {
|
|
234
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
235
|
+
try {
|
|
236
|
+
const response = await client.get(endpoint);
|
|
237
|
+
lastResponse = response;
|
|
238
|
+
if (isComplete(response)) {
|
|
239
|
+
spinner.succeed(successMessage);
|
|
240
|
+
return {
|
|
241
|
+
success: true,
|
|
242
|
+
response,
|
|
243
|
+
attempts
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
let spinnerText = null;
|
|
247
|
+
if (onPoll) {
|
|
248
|
+
try {
|
|
249
|
+
spinnerText = await onPoll(response, attempts);
|
|
250
|
+
} catch {
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
spinner.text = spinnerText ?? `${message} (${attempts}/${maxAttempts})`;
|
|
254
|
+
} catch {
|
|
255
|
+
if (attempts === maxAttempts) {
|
|
256
|
+
spinner.warn("Could not verify operation status");
|
|
257
|
+
return {
|
|
258
|
+
success: false,
|
|
259
|
+
response: lastResponse,
|
|
260
|
+
attempts
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
spinner.warn(timeoutMessage);
|
|
266
|
+
return {
|
|
267
|
+
success: false,
|
|
268
|
+
response: lastResponse,
|
|
269
|
+
attempts
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// src/lib/agent-helpers.ts
|
|
274
|
+
var BuildTimeoutError = class extends Error {
|
|
275
|
+
constructor(message = "The agent version build timed out or failed to report status.") {
|
|
276
|
+
super(message);
|
|
277
|
+
this.name = "BuildTimeoutError";
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
var BuildFailedError = class extends Error {
|
|
281
|
+
failedSteps;
|
|
282
|
+
constructor(failedSteps) {
|
|
283
|
+
const stepSummary = failedSteps.length > 0 ? failedSteps.map((s) => `Step "${s.name}" failed:${s.content ? `
|
|
284
|
+
${s.content}` : ""}`).join("\n") : "No failed steps found. Check validation logs for details.";
|
|
285
|
+
super(`Build failed
|
|
286
|
+
|
|
287
|
+
${stepSummary}
|
|
288
|
+
|
|
289
|
+
Fix the issues and retry.`);
|
|
290
|
+
this.name = "BuildFailedError";
|
|
291
|
+
this.failedSteps = failedSteps;
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
295
|
+
async function resolveAgentRef(client, identifier) {
|
|
296
|
+
if (identifier.includes("~") || UUID_RE.test(identifier)) {
|
|
297
|
+
return identifier;
|
|
298
|
+
}
|
|
299
|
+
if (identifier.includes("/")) {
|
|
300
|
+
return identifier.replace("/", "~");
|
|
301
|
+
}
|
|
302
|
+
const owner = await resolveOwnerId({ client, interactive: false });
|
|
303
|
+
return `${owner.name}~${identifier}`;
|
|
304
|
+
}
|
|
305
|
+
async function getAgentId(agentIdArg, cwd = process.cwd()) {
|
|
306
|
+
if (agentIdArg) {
|
|
307
|
+
return { agentId: agentIdArg };
|
|
308
|
+
}
|
|
309
|
+
const config = await loadLocalConfig(cwd);
|
|
310
|
+
if (!config) {
|
|
311
|
+
console.error("Error: No agent ID provided and not in an agent directory");
|
|
312
|
+
console.error("");
|
|
313
|
+
console.error("Either provide an agent ID:");
|
|
314
|
+
console.error(" guild agent <command> <agent-id>");
|
|
315
|
+
console.error("");
|
|
316
|
+
console.error("Or run from an agent directory with guild.json:");
|
|
317
|
+
console.error(" cd <agent-directory>");
|
|
318
|
+
console.error(" guild agent <command>");
|
|
319
|
+
console.error("");
|
|
320
|
+
console.error("To initialize an agent directory:");
|
|
321
|
+
console.error(" guild agent init --name my-agent");
|
|
322
|
+
console.error("");
|
|
323
|
+
console.error("Or clone an existing agent:");
|
|
324
|
+
console.error(" guild agent clone <agent-id>");
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
if (!config.agent_id) {
|
|
328
|
+
console.error("Error: guild.json is missing agent_id field");
|
|
329
|
+
console.error("");
|
|
330
|
+
console.error("Your guild.json file appears to be corrupted.");
|
|
331
|
+
console.error("Expected format:");
|
|
332
|
+
console.error(" {");
|
|
333
|
+
console.error(' "agent_id": "...",');
|
|
334
|
+
console.error(' "name": "..."');
|
|
335
|
+
console.error(" }");
|
|
336
|
+
process.exit(1);
|
|
337
|
+
}
|
|
338
|
+
return { agentId: config.agent_id, config };
|
|
339
|
+
}
|
|
340
|
+
var REQUIRED_AGENT_FILES = ["agent.ts", "package.json"];
|
|
341
|
+
async function readAgentFiles(cwd) {
|
|
342
|
+
const { stdout } = await runGit(
|
|
343
|
+
["ls-files", "--cached", "--others", "--exclude-standard"],
|
|
344
|
+
{ cwd }
|
|
345
|
+
);
|
|
346
|
+
const gitFiles = stdout.split("\n").filter((f) => f.trim().length > 0);
|
|
347
|
+
const relevantFiles = gitFiles.filter((f) => !f.startsWith(".guild/"));
|
|
348
|
+
const files = [];
|
|
349
|
+
for (const filePath of relevantFiles) {
|
|
350
|
+
const fullPath = path2.join(cwd, filePath);
|
|
351
|
+
const content = await fs2.readFile(fullPath, "utf-8");
|
|
352
|
+
files.push({ path: filePath, content });
|
|
353
|
+
}
|
|
354
|
+
const filePaths = files.map((f) => f.path);
|
|
355
|
+
const missing = REQUIRED_AGENT_FILES.filter(
|
|
356
|
+
(req) => !filePaths.some((fp) => fp === req || fp.endsWith(`/${req}`))
|
|
357
|
+
);
|
|
358
|
+
if (missing.length > 0) {
|
|
359
|
+
throw new Error(`Missing required files: ${missing.join(", ")}`);
|
|
360
|
+
}
|
|
361
|
+
return files;
|
|
362
|
+
}
|
|
363
|
+
var CACHE_DIR = path2.join(".guild", "cache");
|
|
364
|
+
var CACHE_FILE = "last-ephemeral.json";
|
|
365
|
+
function hashAgentFiles(files) {
|
|
366
|
+
const sorted = [...files].sort((a, b) => a.path.localeCompare(b.path));
|
|
367
|
+
const hash = createHash("sha256");
|
|
368
|
+
for (const file of sorted) {
|
|
369
|
+
hash.update(file.path);
|
|
370
|
+
hash.update("\0");
|
|
371
|
+
hash.update(file.content);
|
|
372
|
+
hash.update("\0");
|
|
373
|
+
}
|
|
374
|
+
return hash.digest("hex");
|
|
375
|
+
}
|
|
376
|
+
async function readEphemeralCache(cwd) {
|
|
377
|
+
try {
|
|
378
|
+
const cachePath = path2.join(cwd, CACHE_DIR, CACHE_FILE);
|
|
379
|
+
const raw = await fs2.readFile(cachePath, "utf-8");
|
|
380
|
+
const parsed = JSON.parse(raw);
|
|
381
|
+
if (typeof parsed.hash === "string" && typeof parsed.version_id === "string") {
|
|
382
|
+
return { hash: parsed.hash, version_id: parsed.version_id };
|
|
383
|
+
}
|
|
384
|
+
return null;
|
|
385
|
+
} catch {
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
async function writeEphemeralCache(cwd, cache) {
|
|
390
|
+
const dir = path2.join(cwd, CACHE_DIR);
|
|
391
|
+
await fs2.mkdir(dir, { recursive: true });
|
|
392
|
+
await fs2.writeFile(path2.join(dir, CACHE_FILE), JSON.stringify(cache, null, 2) + "\n");
|
|
393
|
+
}
|
|
394
|
+
async function getOrCreateEphemeral(client, agentId, files, cwd, summary, options) {
|
|
395
|
+
const hash = hashAgentFiles(files);
|
|
396
|
+
if (options?.noCache) {
|
|
397
|
+
const version2 = await client.post(`/agents/${agentId}/versions`, {
|
|
398
|
+
files,
|
|
399
|
+
summary,
|
|
400
|
+
version_type: "EPHEMERAL"
|
|
401
|
+
});
|
|
402
|
+
return { version: version2, cached: false, hash };
|
|
403
|
+
}
|
|
404
|
+
const cache = await readEphemeralCache(cwd);
|
|
405
|
+
if (cache && cache.hash === hash) {
|
|
406
|
+
try {
|
|
407
|
+
const version2 = await client.get(
|
|
408
|
+
`/versions/${cache.version_id}`
|
|
409
|
+
);
|
|
410
|
+
if (version2.validation_status === "PASSED") {
|
|
411
|
+
return { version: version2, cached: true, hash };
|
|
412
|
+
}
|
|
413
|
+
} catch {
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
const version = await client.post(`/agents/${agentId}/versions`, {
|
|
417
|
+
files,
|
|
418
|
+
summary,
|
|
419
|
+
version_type: "EPHEMERAL"
|
|
420
|
+
});
|
|
421
|
+
return { version, cached: false, hash };
|
|
422
|
+
}
|
|
423
|
+
async function buildEphemeralVersion(client, agentId, files, cwd, summary, options) {
|
|
424
|
+
const {
|
|
425
|
+
version: initial,
|
|
426
|
+
cached,
|
|
427
|
+
hash
|
|
428
|
+
} = await getOrCreateEphemeral(client, agentId, files, cwd, summary, options);
|
|
429
|
+
if (cached) {
|
|
430
|
+
return { version: initial, cached: true };
|
|
431
|
+
}
|
|
432
|
+
const pollResult = await pollUntilComplete({
|
|
433
|
+
resourceId: initial.id,
|
|
434
|
+
endpoint: `/versions/${initial.id}`,
|
|
435
|
+
isComplete: (r) => r.validation_status !== "PENDING" && r.validation_status !== "RUNNING",
|
|
436
|
+
message: "Building...",
|
|
437
|
+
successMessage: "Build finished",
|
|
438
|
+
timeoutMessage: "Build timed out",
|
|
439
|
+
maxAttempts: 120,
|
|
440
|
+
delayMs: 1e3
|
|
441
|
+
});
|
|
442
|
+
if (!pollResult.success || !pollResult.response) {
|
|
443
|
+
throw new BuildTimeoutError();
|
|
444
|
+
}
|
|
445
|
+
const version = pollResult.response;
|
|
446
|
+
if (version.validation_status === "PASSED") {
|
|
447
|
+
await writeEphemeralCache(cwd, { hash, version_id: version.id });
|
|
448
|
+
}
|
|
449
|
+
if (version.validation_status === "FAILED") {
|
|
450
|
+
let failedSteps = [];
|
|
451
|
+
try {
|
|
452
|
+
const stepsResponse = await client.get(
|
|
453
|
+
`/versions/${version.id}/validation/steps`
|
|
454
|
+
);
|
|
455
|
+
failedSteps = stepsResponse.steps.filter((step) => step.status === "FAILED").map((step) => ({ name: step.name, content: step.content ?? void 0 }));
|
|
456
|
+
} catch {
|
|
457
|
+
}
|
|
458
|
+
throw new BuildFailedError(failedSteps);
|
|
459
|
+
}
|
|
460
|
+
return { version, cached: false };
|
|
461
|
+
}
|
|
462
|
+
var BundleNotFoundError = class extends Error {
|
|
463
|
+
constructor(filePath) {
|
|
464
|
+
super(`Bundle file not found: ${filePath}`);
|
|
465
|
+
this.name = "BundleNotFoundError";
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
async function buildBundledVersion(client, agentId, bundlePath, cwd, summary) {
|
|
469
|
+
try {
|
|
470
|
+
await fs2.access(bundlePath);
|
|
471
|
+
} catch {
|
|
472
|
+
throw new BundleNotFoundError(bundlePath);
|
|
473
|
+
}
|
|
474
|
+
const bundle = (await fs2.readFile(bundlePath, "utf-8")).trim();
|
|
475
|
+
let files = [];
|
|
476
|
+
try {
|
|
477
|
+
files = await readAgentFiles(cwd);
|
|
478
|
+
} catch {
|
|
479
|
+
}
|
|
480
|
+
const initial = await client.post(`/agents/${agentId}/versions`, {
|
|
481
|
+
version_type: "EPHEMERAL",
|
|
482
|
+
bundle,
|
|
483
|
+
encoding: "gzip;base64",
|
|
484
|
+
files,
|
|
485
|
+
summary
|
|
486
|
+
});
|
|
487
|
+
const pollResult = await pollUntilComplete({
|
|
488
|
+
resourceId: initial.id,
|
|
489
|
+
endpoint: `/versions/${initial.id}`,
|
|
490
|
+
isComplete: (r) => r.validation_status !== "PENDING" && r.validation_status !== "RUNNING",
|
|
491
|
+
message: "Validating bundle...",
|
|
492
|
+
successMessage: "Bundle validated",
|
|
493
|
+
timeoutMessage: "Bundle validation timed out",
|
|
494
|
+
maxAttempts: 120,
|
|
495
|
+
delayMs: 1e3
|
|
496
|
+
});
|
|
497
|
+
if (!pollResult.success || !pollResult.response) {
|
|
498
|
+
throw new BuildTimeoutError("Bundle validation timed out.");
|
|
499
|
+
}
|
|
500
|
+
const version = pollResult.response;
|
|
501
|
+
if (version.validation_status === "FAILED") {
|
|
502
|
+
let failedSteps = [];
|
|
503
|
+
try {
|
|
504
|
+
const stepsResponse = await client.get(
|
|
505
|
+
`/versions/${version.id}/validation/steps`
|
|
506
|
+
);
|
|
507
|
+
failedSteps = stepsResponse.steps.filter((step) => step.status === "FAILED").map((step) => ({ name: step.name, content: step.content ?? void 0 }));
|
|
508
|
+
} catch {
|
|
509
|
+
}
|
|
510
|
+
throw new BuildFailedError(failedSteps);
|
|
511
|
+
}
|
|
512
|
+
return { version };
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
export {
|
|
516
|
+
GitError,
|
|
517
|
+
runGit,
|
|
518
|
+
formatGitError,
|
|
519
|
+
installPrePushHook,
|
|
520
|
+
lookupOwner,
|
|
521
|
+
resolveOwnerId,
|
|
522
|
+
pollUntilComplete,
|
|
523
|
+
BuildTimeoutError,
|
|
524
|
+
BuildFailedError,
|
|
525
|
+
resolveAgentRef,
|
|
526
|
+
getAgentId,
|
|
527
|
+
readAgentFiles,
|
|
528
|
+
buildEphemeralVersion,
|
|
529
|
+
BundleNotFoundError,
|
|
530
|
+
buildBundledVersion
|
|
531
|
+
};
|
|
532
|
+
//# sourceMappingURL=chunk-B7VAF5UG.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/git.ts", "../src/lib/agent-helpers.ts", "../src/lib/owner-helpers.ts", "../src/lib/polling.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright 2026 Guild.ai\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Git command utilities for Guild CLI\n *\n * These helpers ensure git commands work reliably in non-interactive environments\n * by preventing interactive prompts and providing clear error messages.\n */\n\nimport { execa, type Result } from 'execa';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { debug } from './errors.js';\n\n/**\n * Options for running git commands\n */\nexport interface GitOptions {\n /** Working directory for the command */\n cwd?: string;\n /** Timeout in milliseconds (default: 30000 for most commands) */\n timeout?: number;\n /** Extra environment variables to pass to the git subprocess */\n env?: Record<string, string>;\n}\n\n/**\n * Result from a git command\n */\nexport interface GitResult {\n /** Standard output */\n stdout: string;\n /** Standard error */\n stderr: string;\n /** Exit code */\n exitCode: number;\n}\n\n/**\n * Error thrown when a git command fails\n */\nexport class GitError extends Error {\n constructor(\n public readonly command: string,\n public readonly args: string[],\n public readonly stderr: string,\n public readonly stdout: string,\n public readonly exitCode: number | null,\n public readonly timedOut: boolean\n ) {\n // Use stderr as the primary message, fall back to stdout\n const output = stderr.trim() || stdout.trim();\n const baseMessage = timedOut\n ? `Git command timed out: git ${args.join(' ')}`\n : `Git command failed: git ${args.join(' ')}`;\n\n super(output ? `${baseMessage}\\n${output}` : baseMessage);\n this.name = 'GitError';\n }\n}\n\n/**\n * Default timeout for git commands (30 seconds)\n *\n * This is long enough for most operations but short enough to fail fast\n * if something is waiting for interactive input.\n */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Longer timeout for network operations (2 minutes)\n *\n * Clone, push, pull, and fetch can take longer over slow connections.\n */\nconst NETWORK_TIMEOUT = 120000;\n\n/**\n * Git commands that involve network operations\n */\nconst NETWORK_COMMANDS = ['clone', 'push', 'pull', 'fetch'];\n\n/**\n * Run a git command with non-interactive settings\n *\n * This function:\n * - Sets GIT_TERMINAL_PROMPT=0 to prevent credential prompts from hanging\n * - Applies a timeout to prevent indefinite hangs\n * - Bubbles up errors with the actual git output\n *\n * @example\n * const { stdout } = await runGit(['status', '--porcelain'], { cwd: '/path/to/repo' });\n *\n * @example\n * try {\n * await runGit(['commit', '-m', 'message'], { cwd });\n * } catch (error) {\n * if (error instanceof GitError) {\n * console.error('Git failed:', error.message);\n * }\n * }\n */\nexport async function runGit(\n args: string[],\n options: GitOptions = {}\n): Promise<GitResult> {\n const { cwd, timeout: customTimeout, env: extraEnv } = options;\n\n // Determine timeout based on command type\n const isNetworkCommand = args.length > 0 && NETWORK_COMMANDS.includes(args[0]);\n const timeout =\n customTimeout ?? (isNetworkCommand ? NETWORK_TIMEOUT : DEFAULT_TIMEOUT);\n\n debug(`Running git command: git ${args.join(' ')} (timeout: ${timeout}ms)`);\n\n let result: Result;\n try {\n result = await execa('git', args, {\n cwd,\n timeout,\n reject: false,\n env: {\n ...process.env,\n // Prevent git from prompting for credentials - fail fast instead\n GIT_TERMINAL_PROMPT: '0',\n // Prevent SSH from prompting for passwords/passphrases\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n ...extraEnv,\n },\n });\n } catch (error) {\n // Handle timeout errors from execa\n const execaError = error as {\n timedOut?: boolean;\n stderr?: string;\n stdout?: string;\n };\n if (execaError.timedOut) {\n throw new GitError(\n 'git',\n args,\n String(execaError.stderr || ''),\n String(execaError.stdout || ''),\n null,\n true\n );\n }\n throw error;\n }\n\n const stdout = String(result.stdout ?? '');\n const stderr = String(result.stderr ?? '');\n const exitCode = result.exitCode ?? 0;\n\n // Check for timeout (execa sets timedOut property)\n if ((result as { timedOut?: boolean }).timedOut) {\n throw new GitError('git', args, stderr, stdout, null, true);\n }\n\n // Check for non-zero exit code\n if (exitCode !== 0) {\n throw new GitError('git', args, stderr, stdout, exitCode, false);\n }\n\n return { stdout, stderr, exitCode };\n}\n\n/**\n * Format a GitError for display to the user\n *\n * Returns a user-friendly error message with the git output.\n */\nexport function formatGitError(error: GitError): string {\n const lines: string[] = [];\n\n if (error.timedOut) {\n lines.push('Git command timed out');\n lines.push('');\n lines.push('This usually means git is waiting for input that cannot be provided.');\n lines.push('Common causes:');\n lines.push(' \u2022 GPG signing requires a passphrase - run `gpg --sign` to cache it');\n lines.push(' \u2022 SSH key requires a passphrase - run `ssh-add` to cache it');\n lines.push(' \u2022 Git credentials are needed - configure a credential helper');\n } else {\n lines.push('Git operation failed');\n }\n\n lines.push('');\n lines.push(`Command: git ${error.args.join(' ')}`);\n\n if (error.stderr) {\n lines.push('');\n lines.push('Output:');\n lines.push(error.stderr.trim());\n } else if (error.stdout) {\n lines.push('');\n lines.push('Output:');\n lines.push(error.stdout.trim());\n }\n\n if (error.exitCode !== null) {\n lines.push('');\n lines.push(`Exit code: ${error.exitCode}`);\n }\n\n return lines.join('\\n');\n}\n\nconst PRE_PUSH_HOOK = `#!/bin/sh\nif [ \"$GUILD_AGENT_SAVE\" != \"1\" ]; then\n echo \"Please use \\\\\\`guild agent save\\\\\\` to push.\"\n exit 1\nfi\nexit 0\n`;\n\n/**\n * Install a pre-push hook that blocks direct git push.\n *\n * The hook allows pushes only when the GUILD_AGENT_SAVE env var is set,\n * which guild agent save sets automatically.\n */\nexport async function installPrePushHook(targetDir: string): Promise<void> {\n const hooksDir = path.join(targetDir, '.git', 'hooks');\n await fs.mkdir(hooksDir, { recursive: true });\n await fs.writeFile(path.join(hooksDir, 'pre-push'), PRE_PUSH_HOOK, {\n mode: 0o755,\n });\n}\n", "// Copyright 2026 Guild.ai\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createHash } from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { loadLocalConfig, LocalConfig } from './guild-config.js';\nimport { runGit } from './git.js';\nimport { GuildAPIClient } from './api-client.js';\nimport { resolveOwnerId } from './owner-helpers.js';\nimport { pollUntilComplete } from './polling.js';\nimport type { AgentVersion, ValidationStepsResponse } from './api-types.js';\n\n// ---------------------------------------------------------------------------\n// Build error types\n// ---------------------------------------------------------------------------\n\n/** Thrown when the ephemeral version build times out or polling fails. */\nexport class BuildTimeoutError extends Error {\n constructor(\n message = 'The agent version build timed out or failed to report status.'\n ) {\n super(message);\n this.name = 'BuildTimeoutError';\n }\n}\n\n/** Thrown when the ephemeral version build fails validation. */\nexport class BuildFailedError extends Error {\n readonly failedSteps: { name: string; content?: string }[];\n constructor(failedSteps: { name: string; content?: string }[]) {\n const stepSummary =\n failedSteps.length > 0\n ? failedSteps\n .map((s) => `Step \"${s.name}\" failed:${s.content ? `\\n${s.content}` : ''}`)\n .join('\\n')\n : 'No failed steps found. Check validation logs for details.';\n super(`Build failed\\n\\n${stepSummary}\\n\\nFix the issues and retry.`);\n this.name = 'BuildFailedError';\n this.failedSteps = failedSteps;\n }\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Resolve an agent identifier to a fully-qualified form.\n *\n * If the identifier already contains `~` or is a UUID, return it verbatim.\n * Otherwise, resolve the default owner and prepend `owner.name~`.\n */\nexport async function resolveAgentRef(\n client: GuildAPIClient,\n identifier: string\n): Promise<string> {\n if (identifier.includes('~') || UUID_RE.test(identifier)) {\n return identifier;\n }\n if (identifier.includes('/')) {\n return identifier.replace('/', '~');\n }\n const owner = await resolveOwnerId({ client, interactive: false });\n return `${owner.name}~${identifier}`;\n}\n\n/**\n * Get agent ID from argument or guild.json in current directory\n * @param agentIdArg - Optional agent ID from command argument\n * @param cwd - Current working directory (defaults to process.cwd())\n * @returns Agent ID and config (if from guild.json)\n * @throws Error if neither argument nor guild.json provides an agent ID\n */\nexport async function getAgentId(\n agentIdArg?: string,\n cwd: string = process.cwd()\n): Promise<{ agentId: string; config?: LocalConfig }> {\n // If agent ID provided as argument, use it\n if (agentIdArg) {\n return { agentId: agentIdArg };\n }\n\n // Try to read from guild.json\n const config = await loadLocalConfig(cwd);\n\n if (!config) {\n console.error('Error: No agent ID provided and not in an agent directory');\n console.error('');\n console.error('Either provide an agent ID:');\n console.error(' guild agent <command> <agent-id>');\n console.error('');\n console.error('Or run from an agent directory with guild.json:');\n console.error(' cd <agent-directory>');\n console.error(' guild agent <command>');\n console.error('');\n console.error('To initialize an agent directory:');\n console.error(' guild agent init --name my-agent');\n console.error('');\n console.error('Or clone an existing agent:');\n console.error(' guild agent clone <agent-id>');\n process.exit(1);\n }\n\n if (!config.agent_id) {\n console.error('Error: guild.json is missing agent_id field');\n console.error('');\n console.error('Your guild.json file appears to be corrupted.');\n console.error('Expected format:');\n console.error(' {');\n console.error(' \"agent_id\": \"...\",');\n console.error(' \"name\": \"...\"');\n console.error(' }');\n process.exit(1);\n }\n\n return { agentId: config.agent_id, config };\n}\n\nconst REQUIRED_AGENT_FILES = ['agent.ts', 'package.json'];\n\n/**\n * Read agent files from disk for ephemeral version creation.\n * Uses git ls-files to respect .gitignore.\n * @returns Array of {path, content} objects\n */\nexport async function readAgentFiles(\n cwd: string\n): Promise<{ path: string; content: string }[]> {\n const { stdout } = await runGit(\n ['ls-files', '--cached', '--others', '--exclude-standard'],\n { cwd }\n );\n\n const gitFiles = stdout.split('\\n').filter((f) => f.trim().length > 0);\n\n const relevantFiles = gitFiles.filter((f) => !f.startsWith('.guild/'));\n\n const files: { path: string; content: string }[] = [];\n for (const filePath of relevantFiles) {\n const fullPath = path.join(cwd, filePath);\n const content = await fs.readFile(fullPath, 'utf-8');\n files.push({ path: filePath, content });\n }\n\n const filePaths = files.map((f) => f.path);\n const missing = REQUIRED_AGENT_FILES.filter(\n (req) => !filePaths.some((fp) => fp === req || fp.endsWith(`/${req}`))\n );\n if (missing.length > 0) {\n throw new Error(`Missing required files: ${missing.join(', ')}`);\n }\n\n return files;\n}\n\n// ---------------------------------------------------------------------------\n// Ephemeral version caching\n// ---------------------------------------------------------------------------\n\ninterface EphemeralCache {\n hash: string;\n version_id: string;\n}\n\nconst CACHE_DIR = path.join('.guild', 'cache');\nconst CACHE_FILE = 'last-ephemeral.json';\n\n/**\n * Compute a deterministic hash of agent files.\n * Sorts by path to ensure consistent ordering.\n */\nexport function hashAgentFiles(files: { path: string; content: string }[]): string {\n const sorted = [...files].sort((a, b) => a.path.localeCompare(b.path));\n const hash = createHash('sha256');\n for (const file of sorted) {\n hash.update(file.path);\n hash.update('\\0');\n hash.update(file.content);\n hash.update('\\0');\n }\n return hash.digest('hex');\n}\n\nasync function readEphemeralCache(cwd: string): Promise<EphemeralCache | null> {\n try {\n const cachePath = path.join(cwd, CACHE_DIR, CACHE_FILE);\n const raw = await fs.readFile(cachePath, 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.hash === 'string' && typeof parsed.version_id === 'string') {\n return { hash: parsed.hash, version_id: parsed.version_id };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function writeEphemeralCache(cwd: string, cache: EphemeralCache): Promise<void> {\n const dir = path.join(cwd, CACHE_DIR);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(path.join(dir, CACHE_FILE), JSON.stringify(cache, null, 2) + '\\n');\n}\n\n/**\n * Get or create an ephemeral version, skipping the build if files haven't\n * changed since the last successful ephemeral build.\n *\n * Returns the version (cached or newly created), a cache hit flag, and the\n * computed hash (used by buildEphemeralVersion to write the cache on success).\n */\nexport async function getOrCreateEphemeral(\n client: GuildAPIClient,\n agentId: string,\n files: { path: string; content: string }[],\n cwd: string,\n summary: string,\n options?: { noCache?: boolean }\n): Promise<{ version: AgentVersion; cached: boolean; hash: string }> {\n const hash = hashAgentFiles(files);\n\n if (options?.noCache) {\n const version = (await client.post(`/agents/${agentId}/versions`, {\n files,\n summary,\n version_type: 'EPHEMERAL',\n })) as AgentVersion;\n return { version, cached: false, hash };\n }\n\n const cache = await readEphemeralCache(cwd);\n\n if (cache && cache.hash === hash) {\n // Verify the cached version still exists on the server\n try {\n const version = (await client.get(\n `/versions/${cache.version_id}`\n )) as AgentVersion;\n if (version.validation_status === 'PASSED') {\n return { version, cached: true, hash };\n }\n } catch {\n // Version gone or inaccessible \u2014 fall through to create new one\n }\n }\n\n const version = (await client.post(`/agents/${agentId}/versions`, {\n files,\n summary,\n version_type: 'EPHEMERAL',\n })) as AgentVersion;\n\n return { version, cached: false, hash };\n}\n\n/**\n * Build an ephemeral version end-to-end: get-or-create, poll for validation,\n * cache on success, and report build failures.\n *\n * Consolidates the build/poll/cache pattern used by both `guild agent test`\n * and `guild agent chat`.\n */\nexport async function buildEphemeralVersion(\n client: GuildAPIClient,\n agentId: string,\n files: { path: string; content: string }[],\n cwd: string,\n summary: string,\n options?: { noCache?: boolean }\n): Promise<{ version: AgentVersion; cached: boolean }> {\n const {\n version: initial,\n cached,\n hash,\n } = await getOrCreateEphemeral(client, agentId, files, cwd, summary, options);\n\n if (cached) {\n return { version: initial, cached: true };\n }\n\n // Poll for validation to complete\n const pollResult = await pollUntilComplete<AgentVersion>({\n resourceId: initial.id,\n endpoint: `/versions/${initial.id}`,\n isComplete: (r) =>\n r.validation_status !== 'PENDING' && r.validation_status !== 'RUNNING',\n message: 'Building...',\n successMessage: 'Build finished',\n timeoutMessage: 'Build timed out',\n maxAttempts: 120,\n delayMs: 1000,\n });\n\n if (!pollResult.success || !pollResult.response) {\n throw new BuildTimeoutError();\n }\n\n const version = pollResult.response;\n\n // Cache the successful build so we can skip it next time\n if (version.validation_status === 'PASSED') {\n await writeEphemeralCache(cwd, { hash, version_id: version.id });\n }\n\n if (version.validation_status === 'FAILED') {\n let failedSteps: { name: string; content?: string }[] = [];\n try {\n const stepsResponse = await client.get<ValidationStepsResponse>(\n `/versions/${version.id}/validation/steps`\n );\n failedSteps = stepsResponse.steps\n .filter((step) => step.status === 'FAILED')\n .map((step) => ({ name: step.name, content: step.content ?? undefined }));\n } catch {\n // Could not fetch validation details \u2014 throw with empty steps\n }\n throw new BuildFailedError(failedSteps);\n }\n\n return { version, cached: false };\n}\n\n// ---------------------------------------------------------------------------\n// Bundle version\n// ---------------------------------------------------------------------------\n\n/** Thrown when the specified bundle file cannot be found on disk. */\nexport class BundleNotFoundError extends Error {\n constructor(filePath: string) {\n super(`Bundle file not found: ${filePath}`);\n this.name = 'BundleNotFoundError';\n }\n}\n\n/**\n * Upload a pre-built bundle as an ephemeral version.\n *\n * The bundle file must be gzip+base64 encoded (the output of\n * `esbuild ... | gzip | base64`). Source files are included for\n * dashboard viewing, but the server skips its own build step because\n * the ready-to-run artifact is already provided.\n */\nexport async function buildBundledVersion(\n client: GuildAPIClient,\n agentId: string,\n bundlePath: string,\n cwd: string,\n summary: string\n): Promise<{ version: AgentVersion }> {\n try {\n await fs.access(bundlePath);\n } catch {\n throw new BundleNotFoundError(bundlePath);\n }\n\n const bundle = (await fs.readFile(bundlePath, 'utf-8')).trim();\n\n let files: { path: string; content: string }[] = [];\n try {\n files = await readAgentFiles(cwd);\n } catch {\n // No git or missing required files \u2014 proceed with bundle-only upload\n }\n\n const initial = (await client.post(`/agents/${agentId}/versions`, {\n version_type: 'EPHEMERAL',\n bundle,\n encoding: 'gzip;base64',\n files,\n summary,\n })) as AgentVersion;\n\n const pollResult = await pollUntilComplete<AgentVersion>({\n resourceId: initial.id,\n endpoint: `/versions/${initial.id}`,\n isComplete: (r) =>\n r.validation_status !== 'PENDING' && r.validation_status !== 'RUNNING',\n message: 'Validating bundle...',\n successMessage: 'Bundle validated',\n timeoutMessage: 'Bundle validation timed out',\n maxAttempts: 120,\n delayMs: 1000,\n });\n\n if (!pollResult.success || !pollResult.response) {\n throw new BuildTimeoutError('Bundle validation timed out.');\n }\n\n const version = pollResult.response;\n\n if (version.validation_status === 'FAILED') {\n let failedSteps: { name: string; content?: string }[] = [];\n try {\n const stepsResponse = await client.get<ValidationStepsResponse>(\n `/versions/${version.id}/validation/steps`\n );\n failedSteps = stepsResponse.steps\n .filter((step) => step.status === 'FAILED')\n .map((step) => ({ name: step.name, content: step.content ?? undefined }));\n } catch {\n // Could not fetch validation details \u2014 throw with empty steps\n }\n throw new BuildFailedError(failedSteps);\n }\n\n return { version };\n}\n", "// Copyright 2026 Guild.ai\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Owner resolution helper for agent creation commands.\n *\n * Resolves the owner (user or organization) to use when creating agents.\n * Used by `guild agent init` and `guild agent fork`.\n *\n * Resolution priority:\n * 1. --owner flag (explicit)\n * 2. GUILD_OWNER_ID environment variable\n * 3. default_owner from ~/.guild/config.json\n * 4. Fetch user + orgs from API:\n * - No orgs + non-interactive \u2192 use current user (single-account, stated explicitly)\n * - No orgs + interactive \u2192 prompt with personal account as only choice\n * - Has orgs + interactive \u2192 prompt to select from all accounts\n * - Has orgs + non-interactive \u2192 error: require --owner flag\n */\n\nimport inquirer from 'inquirer';\nimport { GuildAPIClient } from './api-client.js';\nimport { loadGlobalConfig } from './guild-config.js';\nimport { debug } from './errors.js';\nimport type { MeResponse, Organization } from './api-types.js';\n\nexport interface OwnerChoice {\n id: string;\n name: string;\n type: 'user' | 'organization';\n}\n\n/**\n * Look up an owner by ID or name against the current user and their organizations.\n * Returns the resolved owner, or undefined if no match is found.\n */\nexport async function lookupOwner(\n client: GuildAPIClient,\n val: string\n): Promise<OwnerChoice | undefined> {\n const me = await client.get<MeResponse>('/me');\n if (me.id === val || me.name === val) {\n return { id: me.id, name: me.name, type: 'user' };\n }\n const orgs = await client.fetchAll<Organization>('/me/organizations');\n const org = orgs.find((o) => o.id === val || o.name === val);\n if (org) {\n return { id: org.id, name: org.name, type: 'organization' };\n }\n return undefined;\n}\n\nexport interface ResolveOwnerOptions {\n ownerFlag?: string;\n client: GuildAPIClient;\n interactive: boolean;\n /** When true, error if multiple accounts and no explicit owner in non-interactive mode.\n * When false (default), fall back to current user. */\n requireExplicitOwner?: boolean;\n}\n\nexport async function resolveOwnerId(\n options: ResolveOwnerOptions\n): Promise<OwnerChoice> {\n const { ownerFlag, client, interactive, requireExplicitOwner = false } = options;\n\n // Priority 1: --owner flag\n if (ownerFlag) {\n debug('Using owner from --owner flag: %s', ownerFlag);\n const match = await lookupOwner(client, ownerFlag);\n if (match) return match;\n // Not found in user or orgs \u2014 pass through and let backend validate\n return { id: ownerFlag, name: ownerFlag, type: 'organization' };\n }\n\n // Priority 2: GUILD_OWNER_ID environment variable\n if (process.env.GUILD_OWNER_ID) {\n debug('Using owner from GUILD_OWNER_ID env var: %s', process.env.GUILD_OWNER_ID);\n const match = await lookupOwner(client, process.env.GUILD_OWNER_ID);\n if (match) return match;\n // Not found in user or orgs \u2014 pass through and let backend validate\n return {\n id: process.env.GUILD_OWNER_ID,\n name: process.env.GUILD_OWNER_ID,\n type: 'organization',\n };\n }\n\n // Priority 3: default_owner from config\n const globalConfig = await loadGlobalConfig();\n if (globalConfig?.default_owner) {\n debug('Using owner from global config: %s', globalConfig.default_owner);\n const match = await lookupOwner(client, globalConfig.default_owner);\n if (match) return match;\n const name = globalConfig.default_owner_name || globalConfig.default_owner;\n return { id: globalConfig.default_owner, name, type: 'organization' };\n }\n\n // Priority 4: Fetch user + orgs\n const me = await client.get<MeResponse>('/me');\n const orgs = await client.fetchAll<Organization>('/me/organizations');\n\n // No orgs + non-interactive \u2192 use current user (single account, stated explicitly by caller)\n if (orgs.length === 0 && !interactive) {\n debug('No organizations found, using current user as owner');\n return { id: me.id, name: me.name, type: 'user' };\n }\n\n // Has orgs + non-interactive\n if (orgs.length > 0 && !interactive) {\n if (requireExplicitOwner) {\n debug('Non-interactive mode with multiple accounts available, requiring --owner');\n throw new Error(\n 'Owner is required in non-interactive mode when multiple accounts are available.\\n\\n' +\n 'Use --owner <name-or-id> to specify an owner, or set a default:\\n' +\n ' guild config set default_owner <name-or-id>'\n );\n }\n debug('Multiple accounts available, defaulting to current user');\n return { id: me.id, name: me.name, type: 'user' };\n }\n\n // Interactive \u2192 prompt (always, even with single account)\n const choices = [\n {\n name: `${me.name} (personal)`,\n value: { id: me.id, name: me.name, type: 'user' as const },\n },\n ...orgs.map((org) => ({\n name: org.name,\n value: { id: org.id, name: org.name, type: 'organization' as const },\n })),\n ];\n\n const { owner } = await inquirer.prompt([\n {\n type: 'list',\n name: 'owner',\n message: 'Select owner for this agent:',\n choices,\n },\n ]);\n\n return owner;\n}\n", "// Copyright 2026 Guild.ai\n// SPDX-License-Identifier: Apache-2.0\n\nimport { GuildAPIClient } from './api-client.js';\nimport { createSpinner } from './progress.js';\n\nexport interface PollOptions<T = unknown> {\n /**\n * Resource ID to poll (e.g., agent ID, version ID)\n */\n resourceId: string;\n\n /**\n * API endpoint to poll (e.g., `/agents/{id}`)\n */\n endpoint: string;\n\n /**\n * Function to check if the operation is complete\n * Returns true when done, false to continue polling\n */\n isComplete: (response: T) => boolean;\n\n /**\n * Message to display while polling\n * @default \"Waiting for operation to complete...\"\n */\n message?: string;\n\n /**\n * Maximum number of poll attempts\n * @default 60\n */\n maxAttempts?: number;\n\n /**\n * Delay between poll attempts in milliseconds\n * @default 1000\n */\n delayMs?: number;\n\n /**\n * Message to display on success\n * @default \"Operation complete\"\n */\n successMessage?: string;\n\n /**\n * Message to display on timeout\n * @default \"Operation timed out\"\n */\n timeoutMessage?: string;\n\n /**\n * Optional callback invoked after each poll when the operation is not yet\n * complete. Return a non-null string to override the default spinner text\n * (`${message} (${attempts}/${maxAttempts})`). Return null to keep the\n * default. Errors thrown by the callback are silently ignored.\n */\n onPoll?: (response: T, attempts: number) => Promise<string | null>;\n}\n\nexport interface PollResult<T = unknown> {\n /**\n * Whether the operation completed successfully\n */\n success: boolean;\n\n /**\n * Final response from the polled endpoint (if available)\n */\n response?: T;\n\n /**\n * Number of attempts made\n */\n attempts: number;\n}\n\n/**\n * Poll an endpoint until a condition is met or timeout occurs\n *\n * @example\n * ```typescript\n * const result = await pollUntilComplete({\n * resourceId: agentId,\n * endpoint: `/agents/${agentId}`,\n * isComplete: (response) => response.status === 'READY',\n * message: 'Waiting for agent initialization...',\n * successMessage: 'Agent initialization complete'\n * });\n *\n * if (result.success) {\n * console.log('Agent is ready:', result.response);\n * }\n * ```\n */\nexport async function pollUntilComplete<T = unknown>(\n options: PollOptions<T>\n): Promise<PollResult<T>> {\n const {\n endpoint,\n isComplete,\n message = 'Waiting for operation to complete...',\n maxAttempts = 60,\n delayMs = 1000,\n successMessage = 'Operation complete',\n timeoutMessage = 'Operation timed out',\n onPoll,\n } = options;\n\n const client = new GuildAPIClient();\n const spinner = createSpinner(message);\n spinner.start();\n\n let attempts = 0;\n let lastResponse: T | undefined;\n\n for (attempts = 1; attempts <= maxAttempts; attempts++) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n\n try {\n const response = await client.get<T>(endpoint);\n lastResponse = response;\n\n if (isComplete(response)) {\n spinner.succeed(successMessage);\n return {\n success: true,\n response,\n attempts,\n };\n }\n\n // Update spinner with progress \u2014 prefer onPoll text when available\n let spinnerText: string | null = null;\n if (onPoll) {\n try {\n spinnerText = await onPoll(response, attempts);\n } catch {\n // Silently ignore step-fetch errors; fall back to default text\n }\n }\n spinner.text = spinnerText ?? `${message} (${attempts}/${maxAttempts})`;\n } catch {\n // If we can't fetch the resource, continue polling\n // Only fail on the last attempt\n if (attempts === maxAttempts) {\n spinner.warn('Could not verify operation status');\n return {\n success: false,\n response: lastResponse,\n attempts,\n };\n }\n }\n }\n\n // Timed out\n spinner.warn(timeoutMessage);\n return {\n success: false,\n response: lastResponse,\n attempts,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs", "path", "version"]
|
|
7
|
+
}
|