@cursor/july 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +16 -5
- package/README.md +8 -9
- package/dist/bin/agent-serve.d.ts +3 -1
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +389 -152
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.Oje4vhlk.js → app.BR0RbIdx.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DtIOQzGj.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.H5XZ2zCB.js → VPLocalSearchBox.qjsVTneI.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CTR_TuaE.js → theme.2Kg8jIp_.js} +2 -2
- package/dist/docs/assets/{quickstart.md.CfU8_uTC.js → quickstart.md.BU6Iwi_9.js} +18 -6
- package/dist/docs/assets/{reference_cli.md.DA730zCu.js → reference_cli.md.Bv6pOxcF.js} +11 -6
- package/dist/docs/assets/{reference_cli.md.DA730zCu.lean.js → reference_cli.md.Bv6pOxcF.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +3 -3
- package/dist/docs/concepts.html +3 -3
- package/dist/docs/deployment.html +3 -3
- package/dist/docs/evals.html +3 -3
- package/dist/docs/guides/agent-to-agent.html +3 -3
- package/dist/docs/guides/cloud-runtime.html +3 -3
- package/dist/docs/guides/github.html +3 -3
- package/dist/docs/guides/human-in-the-loop.html +3 -3
- package/dist/docs/guides/slack.html +3 -3
- package/dist/docs/guides/webhooks.html +3 -3
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +3 -3
- package/dist/docs/index.html +3 -3
- package/dist/docs/quickstart.html +22 -10
- package/dist/docs/reference/agent-config.html +3 -3
- package/dist/docs/reference/channels.html +3 -3
- package/dist/docs/reference/cli.html +14 -9
- package/dist/docs/reference/connections.html +3 -3
- package/dist/docs/reference/hooks.html +3 -3
- package/dist/docs/reference/http-api.html +3 -3
- package/dist/docs/reference/instructions.html +3 -3
- package/dist/docs/reference/playground.html +3 -3
- package/dist/docs/reference/project-layout.html +3 -3
- package/dist/docs/reference/schedules.html +3 -3
- package/dist/docs/reference/sessions.html +3 -3
- package/dist/docs/reference/skills.html +3 -3
- package/dist/docs/reference/subagents.html +3 -3
- package/dist/docs/reference/tools.html +3 -3
- package/dist/docs/scaffolding-agents.html +3 -3
- package/dist/docs/storage.html +3 -3
- package/dist/docs/troubleshooting.html +3 -3
- package/dist/internal/chat-client.d.ts +29 -3
- package/dist/internal/chat-client.d.ts.map +1 -1
- package/dist/internal/chat-client.js +180 -27
- package/dist/internal/cli-ax.d.ts +75 -2
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +600 -52
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +8 -36
- package/dist/internal/cli-deploy.d.ts +59 -3
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +316 -38
- package/dist/internal/cursor/credentials.d.ts +9 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +12 -0
- package/dist/internal/deploy-client.d.ts +9 -1
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +23 -3
- package/dist/internal/deploy-source.d.ts +35 -0
- package/dist/internal/deploy-source.d.ts.map +1 -0
- package/dist/internal/deploy-source.js +118 -0
- package/dist/internal/discovery.d.ts +11 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +43 -14
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +2 -1
- package/dist/internal/eval-runner.d.ts +2 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +2 -0
- package/dist/internal/event-mapper.d.ts +54 -1
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +151 -41
- package/dist/internal/init-project.d.ts +88 -1
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +221 -31
- package/dist/internal/install-cursor-skills.d.ts +64 -0
- package/dist/internal/install-cursor-skills.d.ts.map +1 -0
- package/dist/internal/install-cursor-skills.js +274 -0
- package/dist/internal/logs-client.d.ts +60 -0
- package/dist/internal/logs-client.d.ts.map +1 -0
- package/dist/internal/logs-client.js +311 -0
- package/dist/internal/open-browser.d.ts +5 -0
- package/dist/internal/open-browser.d.ts.map +1 -0
- package/dist/internal/open-browser.js +34 -0
- package/dist/internal/playground/toolchain.d.ts.map +1 -1
- package/dist/internal/playground/toolchain.js +16 -11
- package/dist/internal/playground-proxy.d.ts +69 -0
- package/dist/internal/playground-proxy.d.ts.map +1 -0
- package/dist/internal/playground-proxy.js +468 -0
- package/dist/internal/prompt-context.d.ts +35 -0
- package/dist/internal/prompt-context.d.ts.map +1 -0
- package/dist/internal/prompt-context.js +71 -0
- package/dist/internal/request-headers.d.ts +11 -0
- package/dist/internal/request-headers.d.ts.map +1 -0
- package/dist/internal/request-headers.js +14 -0
- package/dist/internal/resolve-prod-target.d.ts +42 -0
- package/dist/internal/resolve-prod-target.d.ts.map +1 -0
- package/dist/internal/resolve-prod-target.js +111 -0
- package/dist/internal/run-client.d.ts +2 -2
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +38 -23
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +10 -4
- package/dist/internal/session-engine.d.ts +1 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +21 -6
- package/dist/internal/sessions-client.d.ts +21 -0
- package/dist/internal/sessions-client.d.ts.map +1 -0
- package/dist/internal/sessions-client.js +168 -0
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +31 -3
- package/dist/internal/terminal-style.d.ts +22 -0
- package/dist/internal/terminal-style.d.ts.map +1 -0
- package/dist/internal/terminal-style.js +49 -0
- package/dist/internal/trajectory.d.ts +10 -5
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +82 -10
- package/dist/internal/workspace.d.ts +11 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +38 -4
- package/dist/playground/assets/index-D-vo2lV_.css +1 -0
- package/dist/playground/assets/index-x60b9q2j.js +312 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +26 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/quickstart.md +22 -7
- package/docs/reference/cli.md +51 -3
- package/package.json +3 -1
- package/skills/ab/SKILL.md +8 -8
- package/skills/create-agent/SKILL.md +28 -22
- package/skills/debug/SKILL.md +11 -11
- package/skills/evals/SKILL.md +16 -16
- package/skills/framework-map/SKILL.md +6 -6
- package/skills/github/SKILL.md +13 -13
- package/skills/hillclimb/SKILL.md +10 -10
- package/skills/setup-slack/SKILL.md +13 -13
- package/src/bin/agent-serve.ts +422 -188
- package/src/internal/chat-client.ts +252 -37
- package/src/internal/cli-ax.ts +722 -72
- package/src/internal/cli-cursor.ts +14 -42
- package/src/internal/cli-deploy.ts +428 -49
- package/src/internal/cursor/credentials.ts +14 -0
- package/src/internal/deploy-client.ts +45 -4
- package/src/internal/deploy-source.ts +133 -0
- package/src/internal/discovery.ts +53 -16
- package/src/internal/eval-run-store.ts +2 -1
- package/src/internal/eval-runner.ts +5 -0
- package/src/internal/event-mapper.ts +222 -42
- package/src/internal/init-project.ts +333 -51
- package/src/internal/install-cursor-skills.ts +327 -0
- package/src/internal/logs-client.ts +442 -0
- package/src/internal/open-browser.ts +41 -0
- package/src/internal/playground/toolchain.ts +15 -13
- package/src/internal/playground-proxy.ts +576 -0
- package/src/internal/prompt-context.ts +95 -0
- package/src/internal/request-headers.ts +23 -0
- package/src/internal/resolve-prod-target.ts +150 -0
- package/src/internal/run-client.ts +39 -36
- package/src/internal/server.ts +12 -3
- package/src/internal/session-engine.ts +22 -3
- package/src/internal/sessions-client.ts +182 -0
- package/src/internal/stream-progress.ts +36 -2
- package/src/internal/terminal-style.ts +74 -0
- package/src/internal/trajectory.ts +91 -13
- package/src/internal/workspace.ts +42 -4
- package/src/types.ts +42 -6
- package/dist/docs/assets/chunks/@localSearchIndexroot.zwQ9RCQ7.js +0 -1
- package/dist/playground/assets/index-B1Qc9h2u.css +0 -1
- package/dist/playground/assets/index-CpDYCj8W.js +0 -79
- /package/dist/docs/assets/{quickstart.md.CfU8_uTC.lean.js → quickstart.md.BU6Iwi_9.lean.js} +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentkit logs` — follow deploy progress (hosted) then runtime `/v1/logs`.
|
|
3
|
+
*
|
|
4
|
+
* Customer-facing output never includes hosting URLs, tokens, or infra jargon.
|
|
5
|
+
*/
|
|
6
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
import { DeployApiError, } from "./deploy-client.js";
|
|
16
|
+
import { mergeRequestHeaders } from "./request-headers.js";
|
|
17
|
+
import { resolveProdTarget } from "./resolve-prod-target.js";
|
|
18
|
+
import { stderrPalette } from "./terminal-style.js";
|
|
19
|
+
const DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
20
|
+
/** Re-read abort state after await (loop narrowing would hide async abort). */
|
|
21
|
+
function isAborted(signal) {
|
|
22
|
+
return (signal === null || signal === void 0 ? void 0 : signal.aborted) === true;
|
|
23
|
+
}
|
|
24
|
+
const PROGRESS_MESSAGES = {
|
|
25
|
+
queued: "Waiting to start…",
|
|
26
|
+
preparing: "Preparing runtime…",
|
|
27
|
+
building: "Building and starting agent…",
|
|
28
|
+
finalizing: "Finishing deployment…",
|
|
29
|
+
running: "Deployment running",
|
|
30
|
+
failed: "Deploy failed",
|
|
31
|
+
stopping: "Stopping deployment…",
|
|
32
|
+
stopped: "Deployment stopped",
|
|
33
|
+
degraded: "Deployment degraded",
|
|
34
|
+
};
|
|
35
|
+
export function progressMessage(progress, lastError) {
|
|
36
|
+
if (progress === "failed") {
|
|
37
|
+
const detail = lastError === null || lastError === undefined || lastError.trim() === ""
|
|
38
|
+
? ""
|
|
39
|
+
: `: ${sanitizeCustomerError(lastError)}`;
|
|
40
|
+
return `Deploy failed${detail}`;
|
|
41
|
+
}
|
|
42
|
+
if (progress === "degraded") {
|
|
43
|
+
const detail = lastError === null || lastError === undefined || lastError.trim() === ""
|
|
44
|
+
? ""
|
|
45
|
+
: `: ${sanitizeCustomerError(lastError)}`;
|
|
46
|
+
return `Deployment degraded${detail}`;
|
|
47
|
+
}
|
|
48
|
+
return PROGRESS_MESSAGES[progress];
|
|
49
|
+
}
|
|
50
|
+
/** Strip obvious hosting internals from error text shown to customers. */
|
|
51
|
+
export function sanitizeCustomerError(message) {
|
|
52
|
+
return message
|
|
53
|
+
.replace(/https?:\/\/\S+/gi, "[url]")
|
|
54
|
+
.replace(/\bpod-[a-z0-9]+\b/gi, "[runtime]")
|
|
55
|
+
.replace(/\banyrun\b/gi, "runtime")
|
|
56
|
+
.replace(/\bcursorvm\.com\b/gi, "host")
|
|
57
|
+
.replace(/\bx-anyrun-[a-z0-9-]+\b/gi, "header")
|
|
58
|
+
.replace(/\bPROVISIONING\b/g, "building")
|
|
59
|
+
.replace(/\bPLANNED\b/g, "preparing");
|
|
60
|
+
}
|
|
61
|
+
export function fetchLogs(args) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
var _a;
|
|
64
|
+
var _b, _c, _d;
|
|
65
|
+
const fetchImpl = (_b = args.fetchImpl) !== null && _b !== void 0 ? _b : fetch;
|
|
66
|
+
const after = (_c = args.after) !== null && _c !== void 0 ? _c : -1;
|
|
67
|
+
const url = new URL(`${args.baseUrl.replace(/\/$/, "")}/v1/logs`);
|
|
68
|
+
if (after >= 0) {
|
|
69
|
+
url.searchParams.set("after", String(after));
|
|
70
|
+
}
|
|
71
|
+
const resp = yield fetchImpl(url, {
|
|
72
|
+
headers: mergeRequestHeaders(args.auth),
|
|
73
|
+
signal: args.signal,
|
|
74
|
+
});
|
|
75
|
+
if (!resp.ok) {
|
|
76
|
+
throw new Error(`Could not fetch logs (HTTP ${resp.status}).`);
|
|
77
|
+
}
|
|
78
|
+
const body = (yield resp.json());
|
|
79
|
+
const entries = Array.isArray(body.entries) ? body.entries : [];
|
|
80
|
+
const nextAfter = typeof body.nextAfter === "number"
|
|
81
|
+
? body.nextAfter
|
|
82
|
+
: entries.length === 0
|
|
83
|
+
? after
|
|
84
|
+
: ((_d = (_a = entries[entries.length - 1]) === null || _a === void 0 ? void 0 : _a.index) !== null && _d !== void 0 ? _d : after);
|
|
85
|
+
return { entries, nextAfter };
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export function runLogsTail(options) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
var _a, _b, _c, _d, _e;
|
|
91
|
+
const write = (_a = options.write) !== null && _a !== void 0 ? _a : ((text) => void process.stdout.write(text));
|
|
92
|
+
const err = (_b = options.err) !== null && _b !== void 0 ? _b : ((text) => void process.stderr.write(text));
|
|
93
|
+
const sleep = (_c = options.sleep) !== null && _c !== void 0 ? _c : sleepMs;
|
|
94
|
+
const intervalMs = (_d = options.intervalMs) !== null && _d !== void 0 ? _d : DEFAULT_POLL_INTERVAL_MS;
|
|
95
|
+
const c = stderrPalette();
|
|
96
|
+
if (options.prod === true) {
|
|
97
|
+
yield followProdLogs(Object.assign(Object.assign({}, options), { write,
|
|
98
|
+
err,
|
|
99
|
+
sleep,
|
|
100
|
+
intervalMs, palette: c }));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const baseUrl = ((_e = options.url) !== null && _e !== void 0 ? _e : "http://127.0.0.1:3000").replace(/\/$/, "");
|
|
104
|
+
if (options.once !== true) {
|
|
105
|
+
err(c.dim("Tailing logs… (Ctrl-C to stop)\n"));
|
|
106
|
+
}
|
|
107
|
+
yield followRuntimeLogs({
|
|
108
|
+
baseUrl,
|
|
109
|
+
auth: { bearerToken: options.bearerToken },
|
|
110
|
+
once: options.once === true,
|
|
111
|
+
json: options.json === true,
|
|
112
|
+
fetchImpl: options.fetchImpl,
|
|
113
|
+
signal: options.signal,
|
|
114
|
+
intervalMs,
|
|
115
|
+
write,
|
|
116
|
+
sleep,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function followProdLogs(args) {
|
|
121
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
var _a, _b;
|
|
123
|
+
const resolveRuntime = (_a = args.resolveRuntime) !== null && _a !== void 0 ? _a : (() => __awaiter(this, void 0, void 0, function* () {
|
|
124
|
+
const target = yield resolveProdTarget({
|
|
125
|
+
dir: args.dir,
|
|
126
|
+
cwd: args.cwd,
|
|
127
|
+
slug: args.slug,
|
|
128
|
+
team: args.team,
|
|
129
|
+
apiKey: args.apiKey,
|
|
130
|
+
fetchImpl: args.fetchImpl,
|
|
131
|
+
err: () => { },
|
|
132
|
+
});
|
|
133
|
+
return { agentUrl: target.agentUrl, headers: target.headers };
|
|
134
|
+
}));
|
|
135
|
+
const getDeployment = (_b = args.getDeployment) !== null && _b !== void 0 ? _b : (() => __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
// Lazy import path via resolveProdTarget side: re-fetch through a
|
|
137
|
+
// one-shot resolve that throws if not running is wrong for progress.
|
|
138
|
+
// Callers that omit getDeployment must provide it in production via
|
|
139
|
+
// cmdLogs (which wires deploy auth).
|
|
140
|
+
throw new Error("Internal error: deploy progress requires a deployment lookup.");
|
|
141
|
+
}));
|
|
142
|
+
let lastProgress;
|
|
143
|
+
const slugHint = args.slug !== undefined && args.slug !== "" ? args.slug : "";
|
|
144
|
+
if (args.once !== true) {
|
|
145
|
+
const label = slugHint !== "" ? slugHint : "deployment";
|
|
146
|
+
args.err(args.palette.dim(`Tailing logs for ${label}… (Ctrl-C to stop)\n`));
|
|
147
|
+
}
|
|
148
|
+
while (!isAborted(args.signal)) {
|
|
149
|
+
let detail;
|
|
150
|
+
try {
|
|
151
|
+
detail = yield getDeployment();
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (isAborted(args.signal)) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
throw customerDeployLookupError(error);
|
|
158
|
+
}
|
|
159
|
+
const progress = resolveProgress(detail);
|
|
160
|
+
if (progress === "failed") {
|
|
161
|
+
const message = progressMessage(progress, detail.lastError);
|
|
162
|
+
if (progress !== lastProgress) {
|
|
163
|
+
lastProgress = progress;
|
|
164
|
+
emitProgress(args.write, args.json === true, progress, message);
|
|
165
|
+
}
|
|
166
|
+
throw new Error(`Deployment "${detail.slug}" failed.`);
|
|
167
|
+
}
|
|
168
|
+
if (progress === "stopped") {
|
|
169
|
+
const message = progressMessage(progress, detail.lastError);
|
|
170
|
+
if (progress !== lastProgress) {
|
|
171
|
+
lastProgress = progress;
|
|
172
|
+
emitProgress(args.write, args.json === true, progress, message);
|
|
173
|
+
}
|
|
174
|
+
throw new Error(`Deployment "${detail.slug}" is stopped.`);
|
|
175
|
+
}
|
|
176
|
+
if (progress === "running" || progress === "degraded") {
|
|
177
|
+
// Hand off to runtime logs. Print degraded once; skip a "running" line.
|
|
178
|
+
if (progress === "degraded" && progress !== lastProgress) {
|
|
179
|
+
lastProgress = progress;
|
|
180
|
+
emitProgress(args.write, args.json === true, progress, progressMessage(progress, detail.lastError));
|
|
181
|
+
}
|
|
182
|
+
const runtime = yield resolveRuntime();
|
|
183
|
+
yield followRuntimeLogs({
|
|
184
|
+
baseUrl: runtime.agentUrl,
|
|
185
|
+
auth: {
|
|
186
|
+
bearerToken: args.bearerToken,
|
|
187
|
+
headers: runtime.headers,
|
|
188
|
+
},
|
|
189
|
+
once: args.once === true,
|
|
190
|
+
json: args.json === true,
|
|
191
|
+
fetchImpl: args.fetchImpl,
|
|
192
|
+
signal: args.signal,
|
|
193
|
+
intervalMs: args.intervalMs,
|
|
194
|
+
write: args.write,
|
|
195
|
+
sleep: args.sleep,
|
|
196
|
+
});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const message = progressMessage(progress, detail.lastError);
|
|
200
|
+
if (progress !== lastProgress) {
|
|
201
|
+
lastProgress = progress;
|
|
202
|
+
emitProgress(args.write, args.json === true, progress, message);
|
|
203
|
+
}
|
|
204
|
+
if (args.once === true) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
yield args.sleep(args.intervalMs, args.signal);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function resolveProgress(detail) {
|
|
212
|
+
if (detail.progress !== undefined) {
|
|
213
|
+
return detail.progress;
|
|
214
|
+
}
|
|
215
|
+
switch (detail.status) {
|
|
216
|
+
case "pending":
|
|
217
|
+
return "queued";
|
|
218
|
+
case "deploying":
|
|
219
|
+
return "building";
|
|
220
|
+
case "running":
|
|
221
|
+
return "running";
|
|
222
|
+
case "failed":
|
|
223
|
+
return "failed";
|
|
224
|
+
case "degraded":
|
|
225
|
+
return "degraded";
|
|
226
|
+
case "stopping":
|
|
227
|
+
return "stopping";
|
|
228
|
+
case "stopped":
|
|
229
|
+
return "stopped";
|
|
230
|
+
default:
|
|
231
|
+
return "queued";
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function emitProgress(write, json, progress, message) {
|
|
235
|
+
if (json) {
|
|
236
|
+
write(`${JSON.stringify({ type: "progress", progress, message })}\n`);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
write(`${message}\n`);
|
|
240
|
+
}
|
|
241
|
+
function followRuntimeLogs(args) {
|
|
242
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
243
|
+
let after = -1;
|
|
244
|
+
for (;;) {
|
|
245
|
+
if (isAborted(args.signal)) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
let batch;
|
|
249
|
+
try {
|
|
250
|
+
batch = yield fetchLogs({
|
|
251
|
+
baseUrl: args.baseUrl,
|
|
252
|
+
after,
|
|
253
|
+
auth: args.auth,
|
|
254
|
+
fetchImpl: args.fetchImpl,
|
|
255
|
+
signal: args.signal,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
if (isAborted(args.signal)) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
throw error instanceof Error ? error : new Error("Could not fetch logs.");
|
|
263
|
+
}
|
|
264
|
+
for (const entry of batch.entries) {
|
|
265
|
+
if (args.json) {
|
|
266
|
+
args.write(`${JSON.stringify({
|
|
267
|
+
type: "log",
|
|
268
|
+
index: entry.index,
|
|
269
|
+
at: entry.at,
|
|
270
|
+
line: entry.line,
|
|
271
|
+
})}\n`);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
args.write(`${entry.line}\n`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
after = batch.nextAfter;
|
|
278
|
+
if (args.once) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
yield args.sleep(args.intervalMs, args.signal);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
function customerDeployLookupError(error) {
|
|
286
|
+
if (error instanceof DeployApiError) {
|
|
287
|
+
return new Error(`Could not look up deployment: ${sanitizeCustomerError(error.message)}`);
|
|
288
|
+
}
|
|
289
|
+
if (error instanceof Error) {
|
|
290
|
+
return new Error(sanitizeCustomerError(error.message));
|
|
291
|
+
}
|
|
292
|
+
return new Error("Could not look up deployment.");
|
|
293
|
+
}
|
|
294
|
+
function sleepMs(ms, signal) {
|
|
295
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
296
|
+
if (isAborted(signal)) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
yield new Promise((resolve) => {
|
|
300
|
+
const timer = setTimeout(() => {
|
|
301
|
+
signal === null || signal === void 0 ? void 0 : signal.removeEventListener("abort", onAbort);
|
|
302
|
+
resolve();
|
|
303
|
+
}, ms);
|
|
304
|
+
const onAbort = () => {
|
|
305
|
+
clearTimeout(timer);
|
|
306
|
+
resolve();
|
|
307
|
+
};
|
|
308
|
+
signal === null || signal === void 0 ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.d.ts","sourceRoot":"","sources":["../../src/internal/open-browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiC7C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort browser open; callers should always print the URL as fallback.
|
|
3
|
+
*/
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
export function openBrowser(url) {
|
|
7
|
+
var _a;
|
|
8
|
+
const command = process.platform === "darwin"
|
|
9
|
+
? { cmd: "open", args: [url] }
|
|
10
|
+
: process.platform === "win32"
|
|
11
|
+
? {
|
|
12
|
+
cmd: join((_a = process.env.SYSTEMROOT) !== null && _a !== void 0 ? _a : "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe"),
|
|
13
|
+
args: [
|
|
14
|
+
"-NoProfile",
|
|
15
|
+
"-NonInteractive",
|
|
16
|
+
"-WindowStyle",
|
|
17
|
+
"Hidden",
|
|
18
|
+
"-Command",
|
|
19
|
+
`Start-Process '${url.replace(/'/g, "''")}'`,
|
|
20
|
+
],
|
|
21
|
+
}
|
|
22
|
+
: { cmd: "xdg-open", args: [url] };
|
|
23
|
+
try {
|
|
24
|
+
const child = spawn(command.cmd, command.args, {
|
|
25
|
+
stdio: "ignore",
|
|
26
|
+
detached: true,
|
|
27
|
+
});
|
|
28
|
+
child.on("error", () => { });
|
|
29
|
+
child.unref();
|
|
30
|
+
}
|
|
31
|
+
catch (_b) {
|
|
32
|
+
// Printed URL is the fallback.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchain.d.ts","sourceRoot":"","sources":["../../../src/internal/playground/toolchain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,4EAA4E;AAC5E,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmCD,0EAA0E;AAC1E,wBAAgB,0BAA0B,IAAI,mBAAmB,GAAG,SAAS,CAW5E;AAED,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACtC,MAAM,GAAG,SAAS,CAKpB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAUpB;AAED,oEAAoE;AACpE,wBAAsB,kBAAkB,CACtC,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,mBAAmB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"toolchain.d.ts","sourceRoot":"","sources":["../../../src/internal/playground/toolchain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,4EAA4E;AAC5E,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmCD,0EAA0E;AAC1E,wBAAgB,0BAA0B,IAAI,mBAAmB,GAAG,SAAS,CAW5E;AAED,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACtC,MAAM,GAAG,SAAS,CAKpB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAUpB;AAED,oEAAoE;AACpE,wBAAsB,kBAAkB,CACtC,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,mBAAmB,GAAG,SAAS,CA8ElC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C"}
|
|
@@ -146,7 +146,8 @@ export function ensurePlaygroundBundle() {
|
|
|
146
146
|
*/
|
|
147
147
|
export function startPlaygroundDevServer(options) {
|
|
148
148
|
var _a;
|
|
149
|
-
|
|
149
|
+
var _b;
|
|
150
|
+
const logger = (_b = options.logger) !== null && _b !== void 0 ? _b : console.log;
|
|
150
151
|
const toolchain = resolvePlaygroundToolchain();
|
|
151
152
|
if (toolchain === undefined) {
|
|
152
153
|
return undefined;
|
|
@@ -167,30 +168,34 @@ export function startPlaygroundDevServer(options) {
|
|
|
167
168
|
delete env.AGENT_SERVE_BASE;
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
logger(`[agent-serve] playground HMR starting on http://127.0.0.1:${port}${modeNote}`);
|
|
176
|
-
const child = spawn(process.execPath, [toolchain.viteCli, "--config", VITE_CONFIG], {
|
|
171
|
+
// Quiet + isolated from the TTY: the serve banner owns the terminal.
|
|
172
|
+
// Piped stdio keeps Vite from seeing a TTY (so it cannot clearScreen), and
|
|
173
|
+
// silent logging drops the "VITE ready" / URL spam. Errors still surface via
|
|
174
|
+
// spawn/exit handlers below.
|
|
175
|
+
const child = spawn(process.execPath, [toolchain.viteCli, "--config", VITE_CONFIG, "--logLevel", "silent"], {
|
|
177
176
|
cwd: toolchain.packageRoot,
|
|
178
177
|
env,
|
|
179
|
-
stdio: "
|
|
178
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
179
|
+
});
|
|
180
|
+
(_a = child.stderr) === null || _a === void 0 ? void 0 : _a.on("data", (chunk) => {
|
|
181
|
+
const text = chunk.toString().trimEnd();
|
|
182
|
+
if (text !== "") {
|
|
183
|
+
logger(`[agent-serve] playground: ${text}`);
|
|
184
|
+
}
|
|
180
185
|
});
|
|
181
186
|
let stopped = false;
|
|
182
187
|
child.on("error", (err) => {
|
|
183
188
|
if (stopped) {
|
|
184
189
|
return;
|
|
185
190
|
}
|
|
186
|
-
logger(`[agent-serve] playground
|
|
191
|
+
logger(`[agent-serve] playground spawn failed: ${err.message} — static /playground still served when built`);
|
|
187
192
|
});
|
|
188
193
|
child.on("exit", (code, signal) => {
|
|
189
194
|
if (stopped) {
|
|
190
195
|
return;
|
|
191
196
|
}
|
|
192
197
|
if (code !== 0 && code !== null) {
|
|
193
|
-
logger(`[agent-serve] playground
|
|
198
|
+
logger(`[agent-serve] playground exited (code ${code}${signal ? `, signal ${signal}` : ""}) — static /playground still served when built`);
|
|
194
199
|
}
|
|
195
200
|
});
|
|
196
201
|
return {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loopback reverse proxy that injects engine / bearer auth so a normal
|
|
3
|
+
* browser can use the hosted (or remote) playground SPA.
|
|
4
|
+
*
|
|
5
|
+
* Hosted engines sit behind short-lived `engineAccess` headers that a
|
|
6
|
+
* browser cannot set; alias tokens are header-only too. This proxy binds
|
|
7
|
+
* `127.0.0.1` only and forwards every request upstream with those headers.
|
|
8
|
+
*
|
|
9
|
+
* Access is gated by a per-proxy `accessToken` (query on first hit → HttpOnly
|
|
10
|
+
* cookie): other local processes cannot upgrade to injected credentials just
|
|
11
|
+
* by knowing the port. Mutating requests also require Origin/Referer to match
|
|
12
|
+
* this proxy's own origin so another `http://127.0.0.1:<port>` page cannot
|
|
13
|
+
* CSRF the cookie (cookies are host-scoped across ports). Absolute-form
|
|
14
|
+
* request-targets are rejected so injected headers never leave the configured
|
|
15
|
+
* upstream.
|
|
16
|
+
*
|
|
17
|
+
* When `refreshUpstream` is provided (hosted `--prod`), credentials are
|
|
18
|
+
* re-minted shortly before `expiresAt` and once on upstream 401 so a long
|
|
19
|
+
* playground session does not require restarting the CLI.
|
|
20
|
+
*/
|
|
21
|
+
import { createServer } from "node:http";
|
|
22
|
+
import { openBrowser } from "./open-browser.js";
|
|
23
|
+
export { openBrowser };
|
|
24
|
+
export interface PlaygroundProxyHandle {
|
|
25
|
+
/** e.g. `http://127.0.0.1:54321` (no trailing slash). */
|
|
26
|
+
localUrl: string;
|
|
27
|
+
port: number;
|
|
28
|
+
/** Random token required via query (first hit) or cookie thereafter. */
|
|
29
|
+
accessToken: string;
|
|
30
|
+
/**
|
|
31
|
+
* Build a browser entry URL for `/playground` that includes the access
|
|
32
|
+
* token (and optional sessionId).
|
|
33
|
+
*/
|
|
34
|
+
playgroundUrl: (sessionId?: string) => string;
|
|
35
|
+
close: () => Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export interface PlaygroundUpstreamAccess {
|
|
38
|
+
upstreamUrl: string;
|
|
39
|
+
headers?: Record<string, string>;
|
|
40
|
+
expiresAt?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface StartPlaygroundProxyArgs {
|
|
43
|
+
/** Upstream agent base URL (engineAccess or --url). */
|
|
44
|
+
upstreamUrl: string;
|
|
45
|
+
/** Headers injected on every upstream request (engine tokens, wake, …). */
|
|
46
|
+
headers?: Record<string, string>;
|
|
47
|
+
/** Optional bearer for local servers that require it. */
|
|
48
|
+
bearerToken?: string;
|
|
49
|
+
/** Initial engineAccess expiry (ISO); enables proactive refresh. */
|
|
50
|
+
expiresAt?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Re-mint upstream URL + headers (hosted `--prod`). Single-flighted across
|
|
53
|
+
* concurrent browser requests; called near expiry and once on 401.
|
|
54
|
+
*/
|
|
55
|
+
refreshUpstream?: () => Promise<PlaygroundUpstreamAccess>;
|
|
56
|
+
/** Bind port; `0` = ephemeral. */
|
|
57
|
+
port?: number;
|
|
58
|
+
/** Injected for tests. */
|
|
59
|
+
createServerImpl?: typeof createServer;
|
|
60
|
+
/** Injected clock for expiry tests. */
|
|
61
|
+
now?: () => number;
|
|
62
|
+
/** Injected token for tests (defaults to a random 32-byte value). */
|
|
63
|
+
accessToken?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Start a loopback proxy. Resolves once listening.
|
|
67
|
+
*/
|
|
68
|
+
export declare function startPlaygroundProxy(args: StartPlaygroundProxyArgs): Promise<PlaygroundProxyHandle>;
|
|
69
|
+
//# sourceMappingURL=playground-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playground-proxy.d.ts","sourceRoot":"","sources":["../../src/internal/playground-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EACL,YAAY,EAMb,MAAM,WAAW,CAAC;AAInB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,CAAC;AAqBvB,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,aAAa,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC1D,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,gBAAgB,CAAC,EAAE,OAAO,YAAY,CAAC;IACvC,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CAmGhC"}
|