@nairon-ai/aegis 0.5.12 → 0.6.1
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/.flue/agents/bug-fix.ts +24 -10
- package/.flue/app.ts +41 -2
- package/README.md +46 -0
- package/dist-node/agent/client.d.ts +3 -1
- package/dist-node/agent/client.d.ts.map +1 -1
- package/dist-node/agent/client.js +5 -4
- package/dist-node/agent/client.js.map +1 -1
- package/dist-node/cli/binaries.d.ts +2 -0
- package/dist-node/cli/binaries.d.ts.map +1 -0
- package/dist-node/cli/binaries.js +18 -0
- package/dist-node/cli/binaries.js.map +1 -0
- package/dist-node/cli/commands/deploy.d.ts.map +1 -1
- package/dist-node/cli/commands/deploy.js +3 -17
- package/dist-node/cli/commands/deploy.js.map +1 -1
- package/dist-node/cli/commands/logs.d.ts +9 -0
- package/dist-node/cli/commands/logs.d.ts.map +1 -0
- package/dist-node/cli/commands/logs.js +56 -0
- package/dist-node/cli/commands/logs.js.map +1 -0
- package/dist-node/cli/commands/peek.d.ts +9 -0
- package/dist-node/cli/commands/peek.d.ts.map +1 -0
- package/dist-node/cli/commands/peek.js +56 -0
- package/dist-node/cli/commands/peek.js.map +1 -0
- package/dist-node/cli/commands/recover.d.ts +11 -0
- package/dist-node/cli/commands/recover.d.ts.map +1 -0
- package/dist-node/cli/commands/recover.js +46 -0
- package/dist-node/cli/commands/recover.js.map +1 -0
- package/dist-node/cli/commands/runs.d.ts +11 -0
- package/dist-node/cli/commands/runs.d.ts.map +1 -0
- package/dist-node/cli/commands/runs.js +42 -0
- package/dist-node/cli/commands/runs.js.map +1 -0
- package/dist-node/cli/index.js +8 -0
- package/dist-node/cli/index.js.map +1 -1
- package/dist-node/cli/state.d.ts.map +1 -1
- package/dist-node/cli/state.js +10 -0
- package/dist-node/cli/state.js.map +1 -1
- package/dist-node/core/runs.d.ts +16 -0
- package/dist-node/core/runs.d.ts.map +1 -0
- package/dist-node/core/runs.js +139 -0
- package/dist-node/core/runs.js.map +1 -0
- package/dist-node/integrations/github.d.ts +3 -0
- package/dist-node/integrations/github.d.ts.map +1 -1
- package/dist-node/integrations/github.js +12 -15
- package/dist-node/integrations/github.js.map +1 -1
- package/dist-node/integrations/linear.d.ts +3 -0
- package/dist-node/integrations/linear.d.ts.map +1 -1
- package/dist-node/integrations/linear.js +41 -30
- package/dist-node/integrations/linear.js.map +1 -1
- package/dist-node/server/app.d.ts +2 -1
- package/dist-node/server/app.d.ts.map +1 -1
- package/dist-node/server/app.js +79 -2
- package/dist-node/server/app.js.map +1 -1
- package/dist-node/shared/types.d.ts +28 -1
- package/dist-node/shared/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agent/client.ts +8 -1
- package/src/cli/binaries.ts +21 -0
- package/src/cli/commands/deploy.ts +3 -21
- package/src/cli/commands/logs.ts +60 -0
- package/src/cli/commands/peek.ts +64 -0
- package/src/cli/commands/recover.ts +52 -0
- package/src/cli/commands/runs.ts +47 -0
- package/src/cli/index.ts +8 -0
- package/src/cli/state.ts +10 -0
- package/src/core/runs.ts +171 -0
- package/src/integrations/github.ts +29 -25
- package/src/integrations/linear.ts +45 -34
- package/src/server/app.ts +103 -3
- package/src/shared/types.ts +31 -1
package/.flue/agents/bug-fix.ts
CHANGED
|
@@ -55,24 +55,24 @@ export default async function ({ init, id, payload, env }: FlueContext) {
|
|
|
55
55
|
});
|
|
56
56
|
const setup = await setupHarness.session();
|
|
57
57
|
|
|
58
|
+
const { cloneUrl, gitCredentials } = splitCloneCredentials(context.repoCloneUrl);
|
|
58
59
|
await setup.shell(`rm -rf ${SANDBOX_REPO_PATH}`);
|
|
59
|
-
|
|
60
|
+
if (gitCredentials) {
|
|
61
|
+
await sandbox.writeFile("/tmp/aegis-git-credentials", gitCredentials);
|
|
62
|
+
await setup.shell(
|
|
63
|
+
'git config --global credential.helper store && mv /tmp/aegis-git-credentials "$HOME/.git-credentials" && chmod 600 "$HOME/.git-credentials"',
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
await setup.shell(`git clone ${shellQuote(cloneUrl)} ${SANDBOX_REPO_PATH}`);
|
|
60
67
|
await setup.shell(`git checkout ${shellQuote(context.baseBranch)}`, { cwd: SANDBOX_REPO_PATH });
|
|
61
68
|
await setup.shell(`git checkout -B ${shellQuote(context.branchName)}`, {
|
|
62
69
|
cwd: SANDBOX_REPO_PATH,
|
|
63
70
|
});
|
|
64
71
|
await setup.shell(`mkdir -p $(dirname ${shellQuote(AGENT_CONTEXT_PATH)})`);
|
|
65
|
-
await
|
|
66
|
-
`cat > ${shellQuote(AGENT_CONTEXT_PATH)} <<'AEGIS_CONTEXT'\n${JSON.stringify(
|
|
67
|
-
context,
|
|
68
|
-
null,
|
|
69
|
-
2,
|
|
70
|
-
)}\nAEGIS_CONTEXT`,
|
|
71
|
-
);
|
|
72
|
+
await sandbox.writeFile(AGENT_CONTEXT_PATH, JSON.stringify(context, null, 2));
|
|
72
73
|
const skillPath = `${SANDBOX_REPO_PATH}/.agents/skills/bug-fix/SKILL.md`;
|
|
73
|
-
const skillB64 = btoa(unescape(encodeURIComponent(BUG_FIX_SKILL_TEXT)));
|
|
74
74
|
await setup.shell(`mkdir -p ${shellQuote(`${SANDBOX_REPO_PATH}/.agents/skills/bug-fix`)}`);
|
|
75
|
-
await
|
|
75
|
+
await sandbox.writeFile(skillPath, BUG_FIX_SKILL_TEXT);
|
|
76
76
|
|
|
77
77
|
const projectHarness = await init({
|
|
78
78
|
name: "project",
|
|
@@ -106,3 +106,17 @@ export default async function ({ init, id, payload, env }: FlueContext) {
|
|
|
106
106
|
function shellQuote(value: string): string {
|
|
107
107
|
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
108
108
|
}
|
|
109
|
+
|
|
110
|
+
function splitCloneCredentials(repoCloneUrl: string): {
|
|
111
|
+
cloneUrl: string;
|
|
112
|
+
gitCredentials?: string;
|
|
113
|
+
} {
|
|
114
|
+
const url = new URL(repoCloneUrl);
|
|
115
|
+
const credentialMatch = repoCloneUrl.match(/^https:\/\/([^@]+)@([^/]+)\//);
|
|
116
|
+
const cloneUrl = `${url.protocol}//${url.host}${url.pathname}`;
|
|
117
|
+
if (!credentialMatch) return { cloneUrl };
|
|
118
|
+
return {
|
|
119
|
+
cloneUrl,
|
|
120
|
+
gitCredentials: `https://${credentialMatch[1]}@${credentialMatch[2]}\n`,
|
|
121
|
+
};
|
|
122
|
+
}
|
package/.flue/app.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { getSandbox } from "@cloudflare/sandbox";
|
|
1
2
|
import { configureProvider, flue } from "@flue/sdk/app";
|
|
2
3
|
import { refreshOpenAICodexToken } from "@mariozechner/pi-ai/oauth";
|
|
3
4
|
import { createAegisApp, scheduledPickup } from "../src/server/app.js";
|
|
4
|
-
import
|
|
5
|
+
import { SANDBOX_REPO_PATH } from "../src/shared/constants.js";
|
|
6
|
+
import type { AgentRunContext, Bindings, SandboxPeekResult } from "../src/shared/types.js";
|
|
5
7
|
|
|
6
8
|
const flueApp = flue();
|
|
7
|
-
const app = createAegisApp({
|
|
9
|
+
const app = createAegisApp({
|
|
10
|
+
callBugFixAgent: appCallBugFixAgent,
|
|
11
|
+
peekSandbox: peekRunSandbox,
|
|
12
|
+
});
|
|
8
13
|
|
|
9
14
|
export default {
|
|
10
15
|
async fetch(request: Request, env?: Bindings, ctx?: ExecutionContext) {
|
|
@@ -24,12 +29,14 @@ async function appCallBugFixAgent<T>(
|
|
|
24
29
|
context: AgentRunContext,
|
|
25
30
|
env?: Bindings,
|
|
26
31
|
ctx?: ExecutionContext,
|
|
32
|
+
signal?: AbortSignal,
|
|
27
33
|
): Promise<T> {
|
|
28
34
|
const response = await flueApp.fetch(
|
|
29
35
|
new Request(`https://aegis.internal/agents/bug-fix/${context.runId}`, {
|
|
30
36
|
method: "POST",
|
|
31
37
|
headers: { "Content-Type": "application/json" },
|
|
32
38
|
body: JSON.stringify(context),
|
|
39
|
+
signal,
|
|
33
40
|
}),
|
|
34
41
|
env,
|
|
35
42
|
ctx,
|
|
@@ -41,6 +48,34 @@ async function appCallBugFixAgent<T>(
|
|
|
41
48
|
return (await response.json()) as T;
|
|
42
49
|
}
|
|
43
50
|
|
|
51
|
+
async function peekRunSandbox(runId: string, env: Bindings): Promise<SandboxPeekResult> {
|
|
52
|
+
const sandbox = getSandbox(env.Sandbox, runId.toLowerCase());
|
|
53
|
+
const [workspace, git, processes] = await Promise.all([
|
|
54
|
+
sandbox.exec(
|
|
55
|
+
`ls -la /workspace && ls -la ${shellQuote(SANDBOX_REPO_PATH)} 2>/dev/null || true`,
|
|
56
|
+
),
|
|
57
|
+
sandbox.exec(
|
|
58
|
+
`if [ -d ${shellQuote(SANDBOX_REPO_PATH)}/.git ]; then cd ${shellQuote(SANDBOX_REPO_PATH)} && git status --short --branch && git --no-pager log --oneline -5; else echo "Project repo is not cloned yet."; fi`,
|
|
59
|
+
),
|
|
60
|
+
sandbox.exec("ps -eo pid,ppid,stat,comm | head -40 || true"),
|
|
61
|
+
]);
|
|
62
|
+
return {
|
|
63
|
+
runId,
|
|
64
|
+
checkedAt: new Date().toISOString(),
|
|
65
|
+
workspace: compactExecResult(workspace),
|
|
66
|
+
git: compactExecResult(git),
|
|
67
|
+
processes: compactExecResult(processes),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function compactExecResult(result: { exitCode: number; stdout: string; stderr: string }) {
|
|
72
|
+
return {
|
|
73
|
+
exitCode: result.exitCode,
|
|
74
|
+
stdout: result.stdout,
|
|
75
|
+
stderr: result.stderr,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
44
79
|
async function configureAgentProviders(env?: Bindings): Promise<void> {
|
|
45
80
|
if (env?.AGENT_AUTH_METHOD !== "codex-account" || !env.CODEX_OAUTH_CREDENTIALS_B64) return;
|
|
46
81
|
const credentials = decodeCodexCredentials(env.CODEX_OAUTH_CREDENTIALS_B64);
|
|
@@ -51,6 +86,10 @@ async function configureAgentProviders(env?: Bindings): Promise<void> {
|
|
|
51
86
|
configureProvider("openai-codex", { apiKey: refreshed.access });
|
|
52
87
|
}
|
|
53
88
|
|
|
89
|
+
function shellQuote(value: string): string {
|
|
90
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
91
|
+
}
|
|
92
|
+
|
|
54
93
|
function decodeCodexCredentials(value: string): {
|
|
55
94
|
access: string;
|
|
56
95
|
refresh: string;
|
package/README.md
CHANGED
|
@@ -227,6 +227,52 @@ For each ticket:
|
|
|
227
227
|
|
|
228
228
|
If context is too thin, Aegis comments with one concrete question and does not burn a sandbox run.
|
|
229
229
|
|
|
230
|
+
## Watching Runs
|
|
231
|
+
|
|
232
|
+
Run these from the product repo.
|
|
233
|
+
|
|
234
|
+
See tickets Aegis is currently working on:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
npx --yes @nairon-ai/aegis@latest runs
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Include blocked, needs-info, and PR-opened tickets:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
npx --yes @nairon-ai/aegis@latest runs --all
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Peek inside one run's Cloudflare Sandbox:
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
npx --yes @nairon-ai/aegis@latest peek eng-950
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
This shows the sandbox workspace, git state, recent commits, and running processes without printing GitHub tokens or the full agent context.
|
|
253
|
+
|
|
254
|
+
Tail live Worker/Sandbox logs for one run:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
npx --yes @nairon-ai/aegis@latest logs eng-950
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Tail all Aegis Worker logs:
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
npx --yes @nairon-ai/aegis@latest logs
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
`logs` is live. Press `Ctrl-C` to stop it.
|
|
267
|
+
|
|
268
|
+
Recover stuck runs:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
npx --yes @nairon-ai/aegis@latest recover
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
This marks any run that has been stuck without a tracker update for 20+ minutes as blocked, posts a plain-English failure note on the ticket, and sends Telegram a short failure message when Telegram is configured. Deployed Aegis also runs this watchdog before cron/manual pickup.
|
|
275
|
+
|
|
230
276
|
## Approval Flow
|
|
231
277
|
|
|
232
278
|
Aegis posts the full RCA to GitHub/Linear.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AegisConfig, AgentRunContext, Bindings, ReadinessDecision, WorkItem, WorkRun } from "../shared/types.js";
|
|
2
|
-
export type BugFixAgentCaller = <T>(context: AgentRunContext, env?: Bindings, ctx?: ExecutionContext) => Promise<T>;
|
|
2
|
+
export type BugFixAgentCaller = <T>(context: AgentRunContext, env?: Bindings, ctx?: ExecutionContext, signal?: AbortSignal) => Promise<T>;
|
|
3
3
|
export declare function startPlanRun(params: {
|
|
4
4
|
config: AegisConfig;
|
|
5
5
|
item: WorkItem;
|
|
@@ -8,6 +8,7 @@ export declare function startPlanRun(params: {
|
|
|
8
8
|
callAgent?: BugFixAgentCaller;
|
|
9
9
|
env?: Bindings;
|
|
10
10
|
ctx?: ExecutionContext;
|
|
11
|
+
signal?: AbortSignal;
|
|
11
12
|
}): Promise<void>;
|
|
12
13
|
export declare function startImplementationRun(params: {
|
|
13
14
|
config: AegisConfig;
|
|
@@ -17,5 +18,6 @@ export declare function startImplementationRun(params: {
|
|
|
17
18
|
callAgent?: BugFixAgentCaller;
|
|
18
19
|
env?: Bindings;
|
|
19
20
|
ctx?: ExecutionContext;
|
|
21
|
+
signal?: AbortSignal;
|
|
20
22
|
}): Promise<void>;
|
|
21
23
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/agent/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,WAAW,EAGX,eAAe,EACf,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,EACjC,OAAO,EAAE,eAAe,EACxB,GAAG,CAAC,EAAE,QAAQ,EACd,GAAG,CAAC,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/agent/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,WAAW,EAGX,eAAe,EACf,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,EACjC,OAAO,EAAE,eAAe,EACxB,GAAG,CAAC,EAAE,QAAQ,EACd,GAAG,CAAC,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhB,wBAAsB,YAAY,CAAC,MAAM,EAAE;IAC1C,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACpD,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyChB"}
|
|
@@ -8,7 +8,7 @@ export async function startPlanRun(params) {
|
|
|
8
8
|
item: params.item,
|
|
9
9
|
run: params.run,
|
|
10
10
|
command: "plan",
|
|
11
|
-
}), params.callAgent, params.env, params.ctx);
|
|
11
|
+
}), params.callAgent, params.env, params.ctx, params.signal);
|
|
12
12
|
const source = sourceFor(params.config, params.item.source);
|
|
13
13
|
if (result.outcome === "needs-info") {
|
|
14
14
|
await source.postNeedsInfo(params.item, result.question ?? result.humanSummary);
|
|
@@ -29,7 +29,7 @@ export async function startImplementationRun(params) {
|
|
|
29
29
|
command: "implement",
|
|
30
30
|
approval: { approvedBy: params.approvedBy, approvedAt: new Date().toISOString() },
|
|
31
31
|
});
|
|
32
|
-
const result = await callBugFixAgent(params.config, context, params.callAgent, params.env, params.ctx);
|
|
32
|
+
const result = await callBugFixAgent(params.config, context, params.callAgent, params.env, params.ctx, params.signal);
|
|
33
33
|
const source = sourceFor(params.config, params.item.source);
|
|
34
34
|
if (result.outcome !== "implemented" || result.confidence === "low") {
|
|
35
35
|
await source.markBlocked(params.item, result.blocker ??
|
|
@@ -71,9 +71,9 @@ async function buildAgentContext(params) {
|
|
|
71
71
|
approval: params.approval,
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
|
-
async function callBugFixAgent(config, context, callAgent, env, ctx) {
|
|
74
|
+
async function callBugFixAgent(config, context, callAgent, env, ctx, signal) {
|
|
75
75
|
if (callAgent)
|
|
76
|
-
return await callAgent(context, env, ctx);
|
|
76
|
+
return await callAgent(context, env, ctx, signal);
|
|
77
77
|
if (!config.workerUrl) {
|
|
78
78
|
throw new Error("AEGIS_WORKER_URL is required so the Worker can invoke its Flue agent");
|
|
79
79
|
}
|
|
@@ -81,6 +81,7 @@ async function callBugFixAgent(config, context, callAgent, env, ctx) {
|
|
|
81
81
|
method: "POST",
|
|
82
82
|
headers: { "Content-Type": "application/json" },
|
|
83
83
|
body: JSON.stringify(context),
|
|
84
|
+
signal,
|
|
84
85
|
});
|
|
85
86
|
if (!response.ok) {
|
|
86
87
|
const text = await response.text();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/agent/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAWxF,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/agent/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binaries.d.ts","sourceRoot":"","sources":["../../src/cli/binaries.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB9E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
export function resolvePackageBinary(packageRoot, name) {
|
|
4
|
+
const candidates = [
|
|
5
|
+
resolve(packageRoot, "node_modules/.bin", name),
|
|
6
|
+
resolve(dirname(dirname(packageRoot)), ".bin", name),
|
|
7
|
+
];
|
|
8
|
+
let current = packageRoot;
|
|
9
|
+
while (current !== dirname(current)) {
|
|
10
|
+
candidates.push(resolve(current, "node_modules/.bin", name));
|
|
11
|
+
current = dirname(current);
|
|
12
|
+
}
|
|
13
|
+
const binary = candidates.find((candidate) => existsSync(candidate));
|
|
14
|
+
if (binary)
|
|
15
|
+
return binary;
|
|
16
|
+
throw new Error(`Could not find ${name}. Re-run with npx --yes @nairon-ai/aegis@latest, or install dependencies in the Aegis package.`);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=binaries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binaries.js","sourceRoot":"","sources":["../../src/cli/binaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,IAAY;IACrE,MAAM,UAAU,GAAG;QAClB,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,IAAI,CAAC;QAC/C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;KACpD,CAAC;IACF,IAAI,OAAO,GAAG,WAAW,CAAC;IAC1B,OAAO,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,IAAI,KAAK,CACd,kBAAkB,IAAI,gGAAgG,CACtH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,aAAa,qDAKxB,CAAC;AAEH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC/C"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { execFileSync, spawnSync } from "node:child_process";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import { consola } from "consola";
|
|
6
|
+
import { resolvePackageBinary } from "../binaries.js";
|
|
6
7
|
import { findPackageRoot } from "../paths.js";
|
|
7
8
|
import { loadConfig, saveConfig } from "../state.js";
|
|
8
9
|
export const deployCommand = defineCommand({
|
|
@@ -111,21 +112,6 @@ function checkWranglerAuth(packageRoot, wranglerBin) {
|
|
|
111
112
|
consola.warn("Wrangler is logged in, but Aegis could not confirm Cloudflare Containers/Sandbox access. If deploy fails, check Workers Paid plan access.");
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
|
-
function resolvePackageBinary(packageRoot, name) {
|
|
115
|
-
const candidates = [
|
|
116
|
-
resolve(packageRoot, "node_modules/.bin", name),
|
|
117
|
-
resolve(dirname(dirname(packageRoot)), ".bin", name),
|
|
118
|
-
];
|
|
119
|
-
let current = packageRoot;
|
|
120
|
-
while (current !== dirname(current)) {
|
|
121
|
-
candidates.push(resolve(current, "node_modules/.bin", name));
|
|
122
|
-
current = dirname(current);
|
|
123
|
-
}
|
|
124
|
-
const binary = candidates.find((candidate) => existsSync(candidate));
|
|
125
|
-
if (binary)
|
|
126
|
-
return binary;
|
|
127
|
-
throw new Error(`Could not find ${name}. Re-run with npx --yes @nairon-ai/aegis@latest deploy, or install dependencies in the Aegis package.`);
|
|
128
|
-
}
|
|
129
115
|
function pushSecrets(secrets, packageRoot, wranglerBin) {
|
|
130
116
|
consola.start("Pushing Cloudflare secrets...");
|
|
131
117
|
const wranglerConfig = resolve(packageRoot, "wrangler.jsonc");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;IAC1E,KAAK,CAAC,GAAG;QACR,MAAM,SAAS,EAAE,CAAC;IACnB,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC9B,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,oBAAoB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAElE,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAE7C,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACzC,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE;QAC1D,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,SAAS;KAChB,CAAC,CAAC;IACH,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAEvC,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAEzD,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,YAAY,CAC1B,WAAW,EACX,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC,EACnE;QACC,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,OAAO;KACjB,CACD,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC7D,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,WAAW,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACtE,OAAO,CAAC,OAAO,CAAC,qBAAqB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;AACF,CAAC;AAED,SAAS,yBAAyB,CAAC,WAAmB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG;;;;GAId,CAAC;IACH,MAAM,OAAO,GAAG;;;;;;;;GAQd,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CACX,uIAAuI,CACvI,CAAC;QACF,OAAO;IACR,CAAC;IAED,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB,EAAE,MAAsB;IACnE,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAE1E,CAAC;IACF,cAAc,CAAC,IAAI,GAAG;QACrB,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,GAAG,MAAM,CAAC,MAAM,CAAC;KACjB,CAAC;IACF,aAAa,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,WAAmB;IACnE,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC7D,WAAW,EAAE,CAAC;IACd,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CACX,iIAAiI,CACjI,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW;IACnB,IAAI,CAAC;QACJ,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;YAChC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;SACnC,CAAC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CACd,8IAA8I,CAC9I,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmB,EAAE,WAAmB;IAClE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACJ,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE;YAC9C,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,QAAQ,EAAE,OAAO;SACjB,CAAC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CACd,wJAAwJ,CACxJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CACX,2HAA2H,CAC3H,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACxF,OAAO,CAAC,IAAI,CACX,2IAA2I,CAC3I,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CACnB,OAA2C,EAC3C,WAAmB,EACnB,WAAmB;IAEnB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE;YACzF,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,QAAQ,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;IACF,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,MAAM,CAAC,MAAsB;IACrC,OAAO,OAAO,CAAC;QACd,cAAc,EAAE,MAAM,CAAC,aAAa;QACpC,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,eAAe,EAAE,MAAM,CAAC,cAAc;QACtC,eAAe,EAAE,MAAM,CAAC,cAAc;QACtC,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,aAAa,EAAE,MAAM,CAAC,WAAW;QACjC,sBAAsB,EAAE,MAAM,CAAC,oBAAoB;QACnD,cAAc,EAAE,MAAM,CAAC,YAAY;QACnC,iBAAiB,EAAE,MAAM,CAAC,eAAe;QACzC,mBAAmB,EAAE,MAAM,CAAC,iBAAiB;QAC7C,yBAAyB,EAAE,MAAM,CAAC,sBAAsB;QACxD,wBAAwB,EAAE,MAAM,CAAC,qBAAqB;QACtD,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;QACjD,gBAAgB,EAAE,MAAM,CAAC,cAAc;QACvC,gBAAgB,EAAE,MAAM,CAAC,cAAc;QACvC,iBAAiB,EAAE,MAAM,CAAC,eAAe;QACzC,cAAc,EAAE,MAAM,CAAC,YAAY;QACnC,iBAAiB,EAAE,MAAM,CAAC,eAAe;QACzC,WAAW,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAqC;IACvD,OAAO;QACN,gBAAgB,EAAE,MAAM,CAAC,SAAS;QAClC,sBAAsB,EAAE,MAAM,CAAC,mBAAmB;QAClD,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;QACjD,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,cAAc,EAAE,MAAM,CAAC,YAAY;QACnC,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;QACjD,kBAAkB,EAAE,MAAM,CAAC,gBAAgB;QAC3C,uBAAuB,EAAE,MAAM,CAAC,qBAAqB;QACrD,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,cAAc,EAAE,MAAM,CAAC,YAAY;QACnC,2BAA2B,EAAE,MAAM,CAAC,qBAAqB;KACzD,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAyC;IACzD,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CACrF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const logsCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly run: {
|
|
3
|
+
readonly type: "positional";
|
|
4
|
+
readonly description: "Optional run ID, for example eng-950";
|
|
5
|
+
readonly required: false;
|
|
6
|
+
};
|
|
7
|
+
}>;
|
|
8
|
+
export declare function runLogs(run?: string): void;
|
|
9
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,WAAW;;;;;;EAYtB,CAAC;AAEH,wBAAgB,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAsB1C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { defineCommand } from "citty";
|
|
3
|
+
import { consola } from "consola";
|
|
4
|
+
import { resolvePackageBinary } from "../binaries.js";
|
|
5
|
+
import { findPackageRoot } from "../paths.js";
|
|
6
|
+
import { loadConfig } from "../state.js";
|
|
7
|
+
export const logsCommand = defineCommand({
|
|
8
|
+
meta: { name: "logs", description: "Tail live Worker and sandbox logs" },
|
|
9
|
+
args: {
|
|
10
|
+
run: {
|
|
11
|
+
type: "positional",
|
|
12
|
+
description: "Optional run ID, for example eng-950",
|
|
13
|
+
required: false,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
async run({ args }) {
|
|
17
|
+
runLogs(args.run ? String(args.run) : undefined);
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
export function runLogs(run) {
|
|
21
|
+
const config = loadConfig();
|
|
22
|
+
const workerName = workerNameFromUrl(config.workerUrl);
|
|
23
|
+
if (!workerName) {
|
|
24
|
+
consola.error("Worker URL is missing. Run `aegis deploy` first.");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const packageRoot = findPackageRoot(import.meta.url);
|
|
28
|
+
const wranglerBin = resolvePackageBinary(packageRoot, "wrangler");
|
|
29
|
+
const args = ["tail", workerName, "--format", "pretty"];
|
|
30
|
+
if (run)
|
|
31
|
+
args.push("--search", normalizeRunId(run));
|
|
32
|
+
consola.info(run
|
|
33
|
+
? `Tailing ${workerName} logs for ${normalizeRunId(run)}. Press Ctrl-C to stop.`
|
|
34
|
+
: `Tailing ${workerName} logs. Press Ctrl-C to stop.`);
|
|
35
|
+
const result = spawnSync(wranglerBin, args, { stdio: "inherit" });
|
|
36
|
+
if (typeof result.status === "number" && result.status !== 0) {
|
|
37
|
+
process.exitCode = result.status;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function workerNameFromUrl(workerUrl) {
|
|
41
|
+
if (!workerUrl)
|
|
42
|
+
return undefined;
|
|
43
|
+
try {
|
|
44
|
+
return new URL(workerUrl).hostname.split(".")[0];
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function normalizeRunId(value) {
|
|
51
|
+
return value
|
|
52
|
+
.trim()
|
|
53
|
+
.toLowerCase()
|
|
54
|
+
.replace(/[^a-z0-9-]+/g, "-");
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,mCAAmC,EAAE;IACxE,IAAI,EAAE;QACL,GAAG,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE,KAAK;SACf;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,UAAU,OAAO,CAAC,GAAY;IACnC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO;IACR,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,oBAAoB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,GAAG;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpD,OAAO,CAAC,IAAI,CACX,GAAG;QACF,CAAC,CAAC,WAAW,UAAU,aAAa,cAAc,CAAC,GAAG,CAAC,yBAAyB;QAChF,CAAC,CAAC,WAAW,UAAU,8BAA8B,CACtD,CAAC;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA6B;IACvD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,CAAC;QACJ,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACpC,OAAO,KAAK;SACV,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const peekCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly run: {
|
|
3
|
+
readonly type: "positional";
|
|
4
|
+
readonly description: "Run ID, for example eng-950";
|
|
5
|
+
readonly required: true;
|
|
6
|
+
};
|
|
7
|
+
}>;
|
|
8
|
+
export declare function runPeek(run: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=peek.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peek.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/peek.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW;;;;;;EAYtB,CAAC;AAEH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { consola } from "consola";
|
|
3
|
+
import { loadConfig } from "../state.js";
|
|
4
|
+
export const peekCommand = defineCommand({
|
|
5
|
+
meta: { name: "peek", description: "Show a snapshot of one Aegis sandbox" },
|
|
6
|
+
args: {
|
|
7
|
+
run: {
|
|
8
|
+
type: "positional",
|
|
9
|
+
description: "Run ID, for example eng-950",
|
|
10
|
+
required: true,
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
async run({ args }) {
|
|
14
|
+
await runPeek(String(args.run));
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
export async function runPeek(run) {
|
|
18
|
+
const config = loadConfig();
|
|
19
|
+
if (!config.workerUrl) {
|
|
20
|
+
consola.error("Worker URL is missing. Run `aegis deploy` first.");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const runId = normalizeRunId(run);
|
|
24
|
+
consola.start(`Peeking into ${runId}...`);
|
|
25
|
+
const response = await fetch(`${config.workerUrl}/api/runs/${encodeURIComponent(runId)}/peek`);
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
consola.error(`Peek failed: ${response.status} ${await response.text()}`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const result = (await response.json());
|
|
31
|
+
consola.log(`\n Run: ${result.runId}`);
|
|
32
|
+
consola.log(` Checked: ${result.checkedAt}`);
|
|
33
|
+
printSection("Workspace", result.workspace);
|
|
34
|
+
printSection("Git", result.git);
|
|
35
|
+
printSection("Processes", result.processes);
|
|
36
|
+
}
|
|
37
|
+
function printSection(title, result) {
|
|
38
|
+
consola.log(`\n${title} (exit ${result.exitCode})`);
|
|
39
|
+
if (result.stdout.trim())
|
|
40
|
+
consola.log(redactSecrets(result.stdout.trimEnd()));
|
|
41
|
+
if (result.stderr.trim())
|
|
42
|
+
consola.warn(redactSecrets(result.stderr.trimEnd()));
|
|
43
|
+
}
|
|
44
|
+
function normalizeRunId(value) {
|
|
45
|
+
return value
|
|
46
|
+
.trim()
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.replace(/[^a-z0-9-]+/g, "-");
|
|
49
|
+
}
|
|
50
|
+
function redactSecrets(value) {
|
|
51
|
+
return value
|
|
52
|
+
.replace(/x-access-token:[^@\s]+@/g, "x-access-token:***@")
|
|
53
|
+
.replace(/ghs_[A-Za-z0-9_]+/g, "ghs_***")
|
|
54
|
+
.replace(/ghp_[A-Za-z0-9_]+/g, "ghp_***");
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=peek.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peek.js","sourceRoot":"","sources":["../../../src/cli/commands/peek.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,sCAAsC,EAAE;IAC3E,IAAI,EAAE;QACL,GAAG,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,6BAA6B;YAC1C,QAAQ,EAAE,IAAI;SACd;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACxC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO;IACR,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,gBAAgB,KAAK,KAAK,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,SAAS,aAAa,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,gBAAgB,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1E,OAAO;IACR,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CACpB,KAAa,EACb,MAA4D;IAE5D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,UAAU,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACpC,OAAO,KAAK;SACV,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IACnC,OAAO,KAAK;SACV,OAAO,CAAC,0BAA0B,EAAE,qBAAqB,CAAC;SAC1D,OAAO,CAAC,oBAAoB,EAAE,SAAS,CAAC;SACxC,OAAO,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const recoverCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "older-than-minutes": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Only recover runs with no tracker update for this many minutes";
|
|
5
|
+
readonly default: string;
|
|
6
|
+
};
|
|
7
|
+
}>;
|
|
8
|
+
export declare function runRecover(options: {
|
|
9
|
+
olderThanMinutes: number;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=recover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/recover.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc;;;;;;EAiBzB,CAAC;AAEH,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { consola } from "consola";
|
|
3
|
+
import { recoverStaleRuns } from "../../core/runs.js";
|
|
4
|
+
import { configFromCli } from "../../shared/config.js";
|
|
5
|
+
import { loadConfig } from "../state.js";
|
|
6
|
+
const DEFAULT_STALE_RUN_MINUTES = 20;
|
|
7
|
+
export const recoverCommand = defineCommand({
|
|
8
|
+
meta: { name: "recover", description: "Mark stale Aegis runs as blocked" },
|
|
9
|
+
args: {
|
|
10
|
+
"older-than-minutes": {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "Only recover runs with no tracker update for this many minutes",
|
|
13
|
+
default: String(DEFAULT_STALE_RUN_MINUTES),
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
async run({ args }) {
|
|
17
|
+
await runRecover({
|
|
18
|
+
olderThanMinutes: parsePositiveInteger(String(args["older-than-minutes"] ?? DEFAULT_STALE_RUN_MINUTES), DEFAULT_STALE_RUN_MINUTES),
|
|
19
|
+
});
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
export async function runRecover(options) {
|
|
23
|
+
const config = configFromCli(loadConfig());
|
|
24
|
+
if (!config.monitoredRepo) {
|
|
25
|
+
consola.error("MONITORED_REPO is missing. Run `aegis setup` first.");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
consola.start(`Checking for Aegis runs stale for ${options.olderThanMinutes}+ minutes...`);
|
|
29
|
+
const results = await recoverStaleRuns(config, options);
|
|
30
|
+
if (!results.length) {
|
|
31
|
+
consola.info("No active Aegis runs found.");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
for (const result of results) {
|
|
35
|
+
const line = `${result.runId} ${result.identifier} ${result.status} - ${result.reason}`;
|
|
36
|
+
if (result.status === "blocked")
|
|
37
|
+
consola.warn(line);
|
|
38
|
+
else
|
|
39
|
+
consola.info(line);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function parsePositiveInteger(value, fallback) {
|
|
43
|
+
const parsed = Number.parseInt(value, 10);
|
|
44
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=recover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover.js","sourceRoot":"","sources":["../../../src/cli/commands/recover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kCAAkC,EAAE;IAC1E,IAAI,EAAE;QACL,oBAAoB,EAAE;YACrB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gEAAgE;YAC7E,OAAO,EAAE,MAAM,CAAC,yBAAyB,CAAC;SAC1C;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,MAAM,UAAU,CAAC;YAChB,gBAAgB,EAAE,oBAAoB,CACrC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,yBAAyB,CAAC,EAC/D,yBAAyB,CACzB;SACD,CAAC,CAAC;IACJ,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAqC;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO;IACR,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,qCAAqC,OAAO,CAAC,gBAAgB,cAAc,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO;IACR,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACxF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YAC/C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,QAAgB;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const runsCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly all: {
|
|
3
|
+
readonly type: "boolean";
|
|
4
|
+
readonly description: "Include needs-info, blocked, and PR-opened tickets";
|
|
5
|
+
readonly default: false;
|
|
6
|
+
};
|
|
7
|
+
}>;
|
|
8
|
+
export declare function runRuns(options?: {
|
|
9
|
+
all?: boolean;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/runs.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW;;;;;;EAYtB,CAAC;AAEH,wBAAsB,OAAO,CAAC,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5E"}
|