@cursor/july 0.1.2 → 0.1.4
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 +416 -155
- package/dist/channels/slack/log.d.ts +1 -1
- package/dist/channels/slack/log.d.ts.map +1 -1
- package/dist/channels/slack/log.js +4 -5
- package/dist/channels/slack/setup.js +1 -1
- package/dist/channels/slack/socket-mode.d.ts.map +1 -1
- package/dist/channels/slack/socket-mode.js +10 -9
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.Oje4vhlk.js → app.DF-Yx4OP.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.0XrheBv2.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.H5XZ2zCB.js → VPLocalSearchBox.DSeJSudL.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CTR_TuaE.js → theme.DZVLTXOC.js} +2 -2
- package/dist/docs/assets/{index.md.m81y7TY7.js → index.md.Cylk70gg.js} +1 -1
- 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 +5 -5
- 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/ab-collector.js +3 -3
- package/dist/internal/ab-fold.js +1 -1
- 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 +83 -2
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +626 -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/cli-github.js +13 -13
- package/dist/internal/cursor/account-mcp.js +3 -3
- package/dist/internal/cursor/backend-client.js +1 -1
- package/dist/internal/cursor/credentials.d.ts +14 -3
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +21 -6
- package/dist/internal/cursor/github-credentials.js +3 -3
- package/dist/internal/cursor-event-relay.js +1 -1
- package/dist/internal/cursor-relay-core.d.ts +1 -1
- package/dist/internal/cursor-relay-core.d.ts.map +1 -1
- package/dist/internal/cursor-relay-core.js +2 -1
- package/dist/internal/cursor-slack-relay.js +1 -1
- 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/distribution.d.ts +7 -0
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +7 -0
- package/dist/internal/docs-site.js +3 -3
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +10 -9
- 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/github-fanout.js +2 -2
- package/dist/internal/host-platforms.js +5 -5
- 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/mcp-endpoint.d.ts.map +1 -1
- package/dist/internal/mcp-endpoint.js +1 -1
- 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 +19 -14
- 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/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +11 -11
- 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 +44 -0
- package/dist/internal/resolve-prod-target.d.ts.map +1 -0
- package/dist/internal/resolve-prod-target.js +134 -0
- package/dist/internal/resolved-connections.js +5 -5
- 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/schedule-runner.js +1 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +23 -17
- 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 +34 -19
- package/dist/internal/sessions-client.d.ts +34 -0
- package/dist/internal/sessions-client.d.ts.map +1 -0
- package/dist/internal/sessions-client.js +193 -0
- package/dist/internal/storage-coordinator.js +6 -6
- 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/update-check.d.ts +93 -0
- package/dist/internal/update-check.d.ts.map +1 -0
- package/dist/internal/update-check.js +431 -0
- 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-Ct_Usdm8.css +1 -0
- package/dist/playground/assets/index-Dsyb-Vaj.js +319 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +29 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +0 -1
- package/docs/quickstart.md +22 -7
- package/docs/reference/cli.md +51 -3
- package/package.json +4 -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 +14 -14
- package/src/bin/agent-serve.ts +451 -191
- package/src/channels/slack/log.ts +5 -5
- package/src/channels/slack/setup.ts +1 -1
- package/src/channels/slack/socket-mode.ts +11 -9
- package/src/internal/ab-collector.ts +3 -3
- package/src/internal/ab-fold.ts +1 -1
- package/src/internal/chat-client.ts +252 -37
- package/src/internal/cli-ax.ts +761 -72
- package/src/internal/cli-cursor.ts +14 -42
- package/src/internal/cli-deploy.ts +428 -49
- package/src/internal/cli-github.ts +13 -15
- package/src/internal/cursor/account-mcp.ts +3 -3
- package/src/internal/cursor/backend-client.ts +1 -1
- package/src/internal/cursor/credentials.ts +26 -7
- package/src/internal/cursor/github-credentials.ts +3 -3
- package/src/internal/cursor-event-relay.ts +1 -1
- package/src/internal/cursor-relay-core.ts +4 -2
- package/src/internal/cursor-slack-relay.ts +1 -1
- 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/distribution.ts +8 -0
- package/src/internal/docs-site.ts +3 -3
- package/src/internal/eval-run-store.ts +10 -11
- package/src/internal/eval-runner.ts +5 -0
- package/src/internal/event-mapper.ts +222 -42
- package/src/internal/github-fanout.ts +2 -2
- package/src/internal/host-platforms.ts +5 -5
- 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/mcp-endpoint.ts +1 -3
- package/src/internal/open-browser.ts +41 -0
- package/src/internal/playground/toolchain.ts +18 -16
- package/src/internal/playground-proxy.ts +576 -0
- package/src/internal/prompt-context.ts +95 -0
- package/src/internal/reminder-runner.ts +11 -17
- package/src/internal/request-headers.ts +23 -0
- package/src/internal/resolve-prod-target.ts +182 -0
- package/src/internal/resolved-connections.ts +5 -5
- package/src/internal/run-client.ts +39 -36
- package/src/internal/schedule-runner.ts +1 -1
- package/src/internal/server.ts +25 -16
- package/src/internal/session-engine.ts +35 -18
- package/src/internal/sessions-client.ts +216 -0
- package/src/internal/storage-coordinator.ts +6 -6
- 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/update-check.ts +552 -0
- package/src/internal/workspace.ts +42 -4
- package/src/types.ts +45 -7
- 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/{index.md.m81y7TY7.lean.js → index.md.Cylk70gg.lean.js} +0 -0
- /package/dist/docs/assets/{quickstart.md.CfU8_uTC.lean.js → quickstart.md.BU6Iwi_9.lean.js} +0 -0
package/dist/internal/cli-ax.js
CHANGED
|
@@ -19,12 +19,22 @@ import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
|
|
|
19
19
|
import { tmpdir } from "node:os";
|
|
20
20
|
import { join, resolve } from "node:path";
|
|
21
21
|
import { serve } from "../index.js";
|
|
22
|
+
import { lookupSessionContinuation, runChat } from "./chat-client.js";
|
|
23
|
+
import { cmdLogin } from "./cli-cursor.js";
|
|
24
|
+
import { resolveDeployAuth } from "./cli-deploy.js";
|
|
25
|
+
import { resolveApiKey } from "./cursor/credentials.js";
|
|
22
26
|
import { CLI_COMMAND_NAME } from "./distribution.js";
|
|
23
27
|
import { discoverEvals, filterDiscoveredEvals, runDiscoveredEvals, } from "./eval-runner.js";
|
|
24
|
-
import { initProject, printInitGuide } from "./init-project.js";
|
|
28
|
+
import { formatInitNextSteps, formatInitScaffoldSummary, initNextCommands, initProject, installScaffoldDependencies, printInitGuide, } from "./init-project.js";
|
|
29
|
+
import { offerInstallCursorSkills } from "./install-cursor-skills.js";
|
|
30
|
+
import { runLogsTail, sanitizeCustomerError } from "./logs-client.js";
|
|
31
|
+
import { openBrowser } from "./open-browser.js";
|
|
32
|
+
import { startPlaygroundProxy } from "./playground-proxy.js";
|
|
33
|
+
import { resolveProdSlug, resolveProdTarget } from "./resolve-prod-target.js";
|
|
25
34
|
import { runSession } from "./run-client.js";
|
|
35
|
+
import { fetchSessionEvents, formatSessionsTable, listSessions, resolvePreviousSessionId, } from "./sessions-client.js";
|
|
26
36
|
import { createStreamProgress } from "./stream-progress.js";
|
|
27
|
-
import { formatTrajectoryText, loadTrajectoryFromEventsFile, } from "./trajectory.js";
|
|
37
|
+
import { buildTrajectory, formatTrajectoryText, loadTrajectoryFromEventsFile, } from "./trajectory.js";
|
|
28
38
|
function shouldStreamProgress(options) {
|
|
29
39
|
if (options.stream === false) {
|
|
30
40
|
return false;
|
|
@@ -78,11 +88,25 @@ function startEphemeral(options) {
|
|
|
78
88
|
};
|
|
79
89
|
});
|
|
80
90
|
}
|
|
81
|
-
function resolveTarget(options) {
|
|
91
|
+
export function resolveTarget(options) {
|
|
82
92
|
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
if (options.prod === true && options.url !== undefined) {
|
|
94
|
+
die("--prod and --url are mutually exclusive");
|
|
95
|
+
}
|
|
83
96
|
if (options.url !== undefined) {
|
|
84
97
|
return { agentUrl: options.url.replace(/\/$/, "") };
|
|
85
98
|
}
|
|
99
|
+
if (options.prod === true) {
|
|
100
|
+
const prod = yield resolveProdTarget({
|
|
101
|
+
dir: options.dir,
|
|
102
|
+
cwd: options.cwd,
|
|
103
|
+
slug: options.slug,
|
|
104
|
+
team: options.team,
|
|
105
|
+
apiKey: options.apiKey,
|
|
106
|
+
fetchImpl: options.fetchImpl,
|
|
107
|
+
});
|
|
108
|
+
return { agentUrl: prod.agentUrl, headers: prod.headers };
|
|
109
|
+
}
|
|
86
110
|
return startEphemeral(options);
|
|
87
111
|
});
|
|
88
112
|
}
|
|
@@ -94,21 +118,192 @@ export function cmdInit(options) {
|
|
|
94
118
|
printInitGuide();
|
|
95
119
|
return 0;
|
|
96
120
|
}
|
|
97
|
-
const
|
|
121
|
+
const cwd = (_a = options.cwd) !== null && _a !== void 0 ? _a : process.cwd();
|
|
122
|
+
const dir = resolve(cwd, target);
|
|
98
123
|
const result = yield initProject({ dir });
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
124
|
+
let signedIn = (yield resolveApiKey()) !== undefined;
|
|
125
|
+
// Machine-readable path: install deps (piped), never block on browser login.
|
|
126
|
+
if (options.json) {
|
|
127
|
+
const install = yield installScaffoldDependencies(result.rootDir, {
|
|
128
|
+
stdio: "pipe",
|
|
129
|
+
});
|
|
130
|
+
process.stdout.write(`${JSON.stringify({
|
|
131
|
+
ok: install.ok,
|
|
132
|
+
directory: result.rootDir,
|
|
133
|
+
created: result.created,
|
|
134
|
+
skipped: result.skipped,
|
|
135
|
+
installed: install.ok,
|
|
136
|
+
installError: install.ok
|
|
137
|
+
? null
|
|
138
|
+
: install.stderr.trim() || `npm install exited ${install.exitCode}`,
|
|
139
|
+
next: initNextCommands({
|
|
140
|
+
rootDir: result.rootDir,
|
|
141
|
+
cwd,
|
|
142
|
+
signedIn,
|
|
143
|
+
}),
|
|
144
|
+
}, null, 2)}\n`);
|
|
145
|
+
return install.ok ? 0 : 1;
|
|
146
|
+
}
|
|
147
|
+
process.stdout.write(formatInitScaffoldSummary({
|
|
148
|
+
rootDir: result.rootDir,
|
|
149
|
+
files: result.files,
|
|
150
|
+
}));
|
|
151
|
+
process.stdout.write("Installing npm packages\n\n");
|
|
152
|
+
const install = yield installScaffoldDependencies(result.rootDir, {
|
|
153
|
+
stdio: "inherit",
|
|
154
|
+
});
|
|
155
|
+
if (!install.ok) {
|
|
156
|
+
process.stderr.write(`\nnpm install failed (exit ${install.exitCode}). Fix the install, then run ${CLI_COMMAND_NAME} dev.\n`);
|
|
157
|
+
return install.exitCode || 1;
|
|
158
|
+
}
|
|
159
|
+
process.stdout.write("\n");
|
|
160
|
+
// Personal Cursor skills so coding agents can pick up create-agent / debug / …
|
|
161
|
+
try {
|
|
162
|
+
yield offerInstallCursorSkills();
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
166
|
+
process.stderr.write(`\nCould not install Cursor skills (${message}). Continuing init.\n\n`);
|
|
167
|
+
}
|
|
168
|
+
let loginExit = 0;
|
|
169
|
+
if (!signedIn) {
|
|
170
|
+
process.stdout.write("Signing you in to Cursor\n\n");
|
|
171
|
+
loginExit = yield cmdLogin({});
|
|
172
|
+
signedIn = loginExit === 0 && (yield resolveApiKey()) !== undefined;
|
|
173
|
+
process.stdout.write("\n");
|
|
174
|
+
}
|
|
175
|
+
process.stdout.write(formatInitNextSteps({
|
|
176
|
+
rootDir: result.rootDir,
|
|
177
|
+
cwd,
|
|
178
|
+
signedIn,
|
|
179
|
+
}));
|
|
180
|
+
return loginExit;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* `chat` — talk to a running (or `--prod` hosted) agent. With `--json`,
|
|
185
|
+
* prints a trajectory instead of the interactive UI.
|
|
186
|
+
*/
|
|
187
|
+
/**
|
|
188
|
+
* `resume [sessionId]` — reattach the interactive chat REPL to an existing
|
|
189
|
+
* session. When the id is omitted, picks the most recently updated
|
|
190
|
+
* followable session from `/v1/sessions` (same as `chat --resume`).
|
|
191
|
+
* Looks up the continuation token via `/v1/sessions` when
|
|
192
|
+
* `--continuation-token` is omitted. Same flags as `chat` (`--prod`,
|
|
193
|
+
* `--message`, `--json`, …). `--session` is accepted as a redundant
|
|
194
|
+
* alias for the positional id.
|
|
195
|
+
*/
|
|
196
|
+
export function cmdResume(sessionId, options) {
|
|
197
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
198
|
+
var _a;
|
|
199
|
+
const resolved = (_a = trimNonEmpty(sessionId)) !== null && _a !== void 0 ? _a : trimNonEmpty(options.sessionId);
|
|
200
|
+
if (resolved !== undefined) {
|
|
201
|
+
return cmdChat(Object.assign(Object.assign({}, options), { sessionId: resolved, resume: false }));
|
|
202
|
+
}
|
|
203
|
+
return cmdChat(Object.assign(Object.assign({}, options), { sessionId: undefined, resume: true }));
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function trimNonEmpty(value) {
|
|
207
|
+
if (value === undefined) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
const trimmed = value.trim();
|
|
211
|
+
return trimmed === "" ? undefined : trimmed;
|
|
212
|
+
}
|
|
213
|
+
export function cmdChat(options) {
|
|
214
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
+
var _a;
|
|
216
|
+
var _b, _c;
|
|
217
|
+
const message = (_a = options.messages) === null || _a === void 0 ? void 0 : _a[0];
|
|
218
|
+
// chat never starts an ephemeral server — default to local serve URL.
|
|
219
|
+
const target = yield resolveTarget(Object.assign(Object.assign({}, options), { url: options.prod === true
|
|
220
|
+
? undefined
|
|
221
|
+
: ((_b = options.url) !== null && _b !== void 0 ? _b : "http://127.0.0.1:3000") }));
|
|
222
|
+
let sessionId = trimNonEmpty(options.sessionId);
|
|
223
|
+
// `--resume` without an id → most recently updated followable session.
|
|
224
|
+
// An explicit `--session` / positional id always wins.
|
|
225
|
+
if (options.resume === true && sessionId === undefined) {
|
|
226
|
+
try {
|
|
227
|
+
const previous = yield resolvePreviousSessionId({
|
|
228
|
+
baseUrl: target.agentUrl,
|
|
229
|
+
auth: {
|
|
230
|
+
bearerToken: options.bearerToken,
|
|
231
|
+
headers: target.headers,
|
|
232
|
+
},
|
|
233
|
+
fetchImpl: options.fetchImpl,
|
|
234
|
+
});
|
|
235
|
+
if (previous === undefined) {
|
|
236
|
+
process.stderr.write("No previous followable session found. Start one with " +
|
|
237
|
+
`\`${CLI_COMMAND_NAME} chat\` or pass a session id.\n`);
|
|
238
|
+
return 1;
|
|
239
|
+
}
|
|
240
|
+
sessionId = previous;
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
244
|
+
return 1;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (options.json) {
|
|
248
|
+
if (message === undefined) {
|
|
249
|
+
process.stderr.write("chat --json requires --message\n");
|
|
250
|
+
return 2;
|
|
251
|
+
}
|
|
252
|
+
let continuationToken = options.continuationToken;
|
|
253
|
+
if (sessionId !== undefined &&
|
|
254
|
+
(continuationToken === undefined || continuationToken === "")) {
|
|
255
|
+
try {
|
|
256
|
+
continuationToken = yield lookupSessionContinuation({
|
|
257
|
+
baseUrl: target.agentUrl,
|
|
258
|
+
sessionId,
|
|
259
|
+
auth: {
|
|
260
|
+
bearerToken: options.bearerToken,
|
|
261
|
+
headers: target.headers,
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
267
|
+
return 1;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const result = yield runSession({
|
|
271
|
+
baseUrl: target.agentUrl,
|
|
272
|
+
messages: [message],
|
|
273
|
+
sessionId,
|
|
274
|
+
continuationToken,
|
|
275
|
+
bearerToken: options.bearerToken,
|
|
276
|
+
headers: target.headers,
|
|
277
|
+
});
|
|
278
|
+
if (options.text) {
|
|
279
|
+
process.stdout.write(formatTrajectoryText(result.trajectory));
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
console.log(JSON.stringify({
|
|
283
|
+
ok: result.ok,
|
|
284
|
+
sessionId: result.sessionId,
|
|
285
|
+
continuationToken: (_c = result.continuationToken) !== null && _c !== void 0 ? _c : null,
|
|
286
|
+
trajectory: result.trajectory,
|
|
287
|
+
}, null, 2));
|
|
288
|
+
}
|
|
289
|
+
return result.ok ? 0 : 1;
|
|
290
|
+
}
|
|
291
|
+
try {
|
|
292
|
+
yield runChat({
|
|
293
|
+
baseUrl: target.agentUrl,
|
|
294
|
+
message,
|
|
295
|
+
sessionId,
|
|
296
|
+
continuationToken: options.continuationToken,
|
|
297
|
+
bearerToken: options.bearerToken,
|
|
298
|
+
headers: target.headers,
|
|
299
|
+
noColor: options.noColor,
|
|
300
|
+
});
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
305
|
+
return 1;
|
|
306
|
+
}
|
|
112
307
|
});
|
|
113
308
|
}
|
|
114
309
|
export function cmdRun(options) {
|
|
@@ -125,17 +320,16 @@ export function cmdRun(options) {
|
|
|
125
320
|
if (stream) {
|
|
126
321
|
process.stderr.write(`→ ${target.agentUrl}\n`);
|
|
127
322
|
}
|
|
128
|
-
const result = yield runSession(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
:
|
|
135
|
-
|
|
136
|
-
:
|
|
137
|
-
|
|
138
|
-
: { onEvent: (e) => progress.onEvent(e) })));
|
|
323
|
+
const result = yield runSession({
|
|
324
|
+
baseUrl: target.agentUrl,
|
|
325
|
+
messages,
|
|
326
|
+
sessionId: options.sessionId,
|
|
327
|
+
continuationToken: options.continuationToken,
|
|
328
|
+
bearerToken: options.bearerToken,
|
|
329
|
+
headers: target.headers,
|
|
330
|
+
timeoutMs: options.timeoutMs,
|
|
331
|
+
onEvent: progress === undefined ? undefined : (e) => progress.onEvent(e),
|
|
332
|
+
});
|
|
139
333
|
let eventsPath;
|
|
140
334
|
const writeEvents = options.events !== false;
|
|
141
335
|
if (writeEvents) {
|
|
@@ -150,8 +344,25 @@ export function cmdRun(options) {
|
|
|
150
344
|
}
|
|
151
345
|
yield writeFile(eventsPath, `${result.events.map((e) => JSON.stringify(e)).join("\n")}\n`, "utf8");
|
|
152
346
|
}
|
|
153
|
-
const playgroundUrl = options.
|
|
154
|
-
?
|
|
347
|
+
const playgroundUrl = options.prod === true
|
|
348
|
+
? null
|
|
349
|
+
: options.url !== undefined
|
|
350
|
+
? `${target.agentUrl.replace(/\/$/, "")}/playground?sessionId=${encodeURIComponent(result.sessionId)}`
|
|
351
|
+
: null;
|
|
352
|
+
const playgroundHint = options.prod === true
|
|
353
|
+
? [
|
|
354
|
+
CLI_COMMAND_NAME,
|
|
355
|
+
"playground",
|
|
356
|
+
"--prod",
|
|
357
|
+
...(options.slug !== undefined && options.slug.trim() !== ""
|
|
358
|
+
? ["--slug", options.slug.trim()]
|
|
359
|
+
: []),
|
|
360
|
+
...(options.team !== undefined && options.team.trim() !== ""
|
|
361
|
+
? ["--team", options.team.trim()]
|
|
362
|
+
: []),
|
|
363
|
+
"--session",
|
|
364
|
+
result.sessionId,
|
|
365
|
+
].join(" ")
|
|
155
366
|
: null;
|
|
156
367
|
if (options.text) {
|
|
157
368
|
process.stdout.write(formatTrajectoryText(result.trajectory));
|
|
@@ -161,6 +372,9 @@ export function cmdRun(options) {
|
|
|
161
372
|
if (playgroundUrl !== null) {
|
|
162
373
|
process.stderr.write(`playground: ${playgroundUrl}\n`);
|
|
163
374
|
}
|
|
375
|
+
else if (playgroundHint !== null) {
|
|
376
|
+
process.stderr.write(`playground: ${playgroundHint}\n`);
|
|
377
|
+
}
|
|
164
378
|
}
|
|
165
379
|
else {
|
|
166
380
|
console.log(JSON.stringify({
|
|
@@ -169,11 +383,14 @@ export function cmdRun(options) {
|
|
|
169
383
|
continuationToken: (_c = result.continuationToken) !== null && _c !== void 0 ? _c : null,
|
|
170
384
|
trace: eventsPath !== null && eventsPath !== void 0 ? eventsPath : null,
|
|
171
385
|
playgroundUrl,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
386
|
+
playgroundHint,
|
|
387
|
+
visualize: playgroundHint !== null
|
|
388
|
+
? `Run ${playgroundHint}`
|
|
389
|
+
: playgroundUrl !== null
|
|
390
|
+
? `Open ${playgroundUrl}`
|
|
391
|
+
: eventsPath !== undefined
|
|
392
|
+
? `Start the playground (${CLI_COMMAND_NAME} serve --dir ${options.dir}), then Open trace → ${eventsPath}`
|
|
393
|
+
: null,
|
|
177
394
|
trajectory: result.trajectory,
|
|
178
395
|
}, null, 2));
|
|
179
396
|
}
|
|
@@ -208,14 +425,23 @@ export function cmdCall(options) {
|
|
|
208
425
|
}
|
|
209
426
|
const target = yield resolveTarget(options);
|
|
210
427
|
try {
|
|
428
|
+
const headers = {
|
|
429
|
+
"content-type": "application/json",
|
|
430
|
+
};
|
|
431
|
+
if (target.headers !== undefined) {
|
|
432
|
+
Object.assign(headers, target.headers);
|
|
433
|
+
}
|
|
434
|
+
if (options.bearerToken !== undefined) {
|
|
435
|
+
headers.authorization = `Bearer ${options.bearerToken}`;
|
|
436
|
+
}
|
|
437
|
+
const body = { input };
|
|
438
|
+
if (options.sessionId !== undefined) {
|
|
439
|
+
body.sessionId = options.sessionId;
|
|
440
|
+
}
|
|
211
441
|
const response = yield fetch(`${target.agentUrl}/v1/tools/${encodeURIComponent(toolName)}`, {
|
|
212
442
|
method: "POST",
|
|
213
|
-
headers
|
|
214
|
-
|
|
215
|
-
: { authorization: `Bearer ${options.bearerToken}` })),
|
|
216
|
-
body: JSON.stringify(Object.assign({ input }, (options.sessionId === undefined
|
|
217
|
-
? {}
|
|
218
|
-
: { sessionId: options.sessionId }))),
|
|
443
|
+
headers,
|
|
444
|
+
body: JSON.stringify(body),
|
|
219
445
|
});
|
|
220
446
|
const payload = yield response
|
|
221
447
|
.json()
|
|
@@ -291,17 +517,21 @@ export function cmdEval(options) {
|
|
|
291
517
|
if (options.verbose || stream) {
|
|
292
518
|
process.stderr.write(`eval target: ${target.agentUrl}\n`);
|
|
293
519
|
}
|
|
294
|
-
const results = yield runDiscoveredEvals(
|
|
295
|
-
|
|
296
|
-
:
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
:
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
:
|
|
520
|
+
const results = yield runDiscoveredEvals({
|
|
521
|
+
projectRoot,
|
|
522
|
+
baseUrl: target.agentUrl,
|
|
523
|
+
filterIds: options.evalIds === undefined || options.evalIds.length === 0
|
|
524
|
+
? undefined
|
|
525
|
+
: options.evalIds,
|
|
526
|
+
tags: options.tags === undefined || options.tags.length === 0
|
|
527
|
+
? undefined
|
|
528
|
+
: options.tags,
|
|
529
|
+
timeoutMs: options.timeoutMs,
|
|
530
|
+
bearerToken: options.bearerToken,
|
|
531
|
+
headers: target.headers,
|
|
532
|
+
verbose: Boolean(options.verbose) || stream,
|
|
533
|
+
onEvent: progress === undefined ? undefined : (e) => progress.onEvent(e),
|
|
534
|
+
});
|
|
305
535
|
if (results.length === 0) {
|
|
306
536
|
process.stderr.write("No matching evals found.\n");
|
|
307
537
|
return 2;
|
|
@@ -343,3 +573,347 @@ function printEvalResults(results, options) {
|
|
|
343
573
|
}
|
|
344
574
|
return failed === 0 ? 0 : 1;
|
|
345
575
|
}
|
|
576
|
+
/**
|
|
577
|
+
* `logs` — follow deploy progress (`--prod`) then runtime agent logs.
|
|
578
|
+
* Local / `--url` tails `/v1/logs` only.
|
|
579
|
+
*/
|
|
580
|
+
export function cmdLogs(options) {
|
|
581
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
582
|
+
var _a;
|
|
583
|
+
if (options.prod === true && options.url !== undefined) {
|
|
584
|
+
process.stderr.write("--prod and --url are mutually exclusive\n");
|
|
585
|
+
return 2;
|
|
586
|
+
}
|
|
587
|
+
const controller = new AbortController();
|
|
588
|
+
const onSignal = () => {
|
|
589
|
+
controller.abort();
|
|
590
|
+
};
|
|
591
|
+
process.on("SIGINT", onSignal);
|
|
592
|
+
process.on("SIGTERM", onSignal);
|
|
593
|
+
try {
|
|
594
|
+
if (options.prod === true) {
|
|
595
|
+
const slug = resolveProdSlug({
|
|
596
|
+
dir: options.dir,
|
|
597
|
+
cwd: options.cwd,
|
|
598
|
+
slug: options.slug,
|
|
599
|
+
});
|
|
600
|
+
const auth = yield resolveDeployAuth({
|
|
601
|
+
team: options.team,
|
|
602
|
+
apiKey: options.apiKey,
|
|
603
|
+
fetchImpl: options.fetchImpl,
|
|
604
|
+
});
|
|
605
|
+
if (typeof auth === "number") {
|
|
606
|
+
return auth;
|
|
607
|
+
}
|
|
608
|
+
yield runLogsTail({
|
|
609
|
+
prod: true,
|
|
610
|
+
dir: options.dir,
|
|
611
|
+
cwd: options.cwd,
|
|
612
|
+
slug,
|
|
613
|
+
team: options.team,
|
|
614
|
+
apiKey: options.apiKey,
|
|
615
|
+
bearerToken: options.bearerToken,
|
|
616
|
+
once: options.once,
|
|
617
|
+
json: options.json,
|
|
618
|
+
fetchImpl: options.fetchImpl,
|
|
619
|
+
signal: controller.signal,
|
|
620
|
+
getDeployment: () => auth.client.getDeployment({ teamId: auth.teamId, slug }),
|
|
621
|
+
resolveRuntime: () => __awaiter(this, void 0, void 0, function* () {
|
|
622
|
+
const target = yield resolveProdTarget({
|
|
623
|
+
dir: options.dir,
|
|
624
|
+
cwd: options.cwd,
|
|
625
|
+
slug,
|
|
626
|
+
team: options.team,
|
|
627
|
+
apiKey: options.apiKey,
|
|
628
|
+
fetchImpl: options.fetchImpl,
|
|
629
|
+
err: () => { },
|
|
630
|
+
});
|
|
631
|
+
return { agentUrl: target.agentUrl, headers: target.headers };
|
|
632
|
+
}),
|
|
633
|
+
});
|
|
634
|
+
return 0;
|
|
635
|
+
}
|
|
636
|
+
yield runLogsTail({
|
|
637
|
+
dir: options.dir,
|
|
638
|
+
cwd: options.cwd,
|
|
639
|
+
url: (_a = options.url) !== null && _a !== void 0 ? _a : "http://127.0.0.1:3000",
|
|
640
|
+
bearerToken: options.bearerToken,
|
|
641
|
+
once: options.once,
|
|
642
|
+
json: options.json,
|
|
643
|
+
fetchImpl: options.fetchImpl,
|
|
644
|
+
signal: controller.signal,
|
|
645
|
+
});
|
|
646
|
+
return 0;
|
|
647
|
+
}
|
|
648
|
+
catch (error) {
|
|
649
|
+
if (controller.signal.aborted) {
|
|
650
|
+
return 0;
|
|
651
|
+
}
|
|
652
|
+
const raw = error instanceof Error ? error.message : String(error);
|
|
653
|
+
process.stderr.write(`${sanitizeCustomerError(raw)}\n`);
|
|
654
|
+
return 1;
|
|
655
|
+
}
|
|
656
|
+
finally {
|
|
657
|
+
process.off("SIGINT", onSignal);
|
|
658
|
+
process.off("SIGTERM", onSignal);
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
/** Resolve local / `--url` / `--prod` agent base URL + request headers. */
|
|
663
|
+
function resolveSessionTarget(options) {
|
|
664
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
665
|
+
var _a;
|
|
666
|
+
if (options.prod === true && options.url !== undefined) {
|
|
667
|
+
process.stderr.write("--prod and --url are mutually exclusive\n");
|
|
668
|
+
return 2;
|
|
669
|
+
}
|
|
670
|
+
if (options.prod === true) {
|
|
671
|
+
try {
|
|
672
|
+
const target = yield resolveProdTarget({
|
|
673
|
+
dir: options.dir,
|
|
674
|
+
cwd: options.cwd,
|
|
675
|
+
slug: options.slug,
|
|
676
|
+
team: options.team,
|
|
677
|
+
apiKey: options.apiKey,
|
|
678
|
+
fetchImpl: options.fetchImpl,
|
|
679
|
+
});
|
|
680
|
+
return { agentUrl: target.agentUrl, headers: target.headers };
|
|
681
|
+
}
|
|
682
|
+
catch (error) {
|
|
683
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
684
|
+
return 1;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
return {
|
|
688
|
+
agentUrl: ((_a = options.url) !== null && _a !== void 0 ? _a : "http://127.0.0.1:3000").replace(/\/$/, ""),
|
|
689
|
+
};
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* `sessions` — list sessions on a running (or `--prod` hosted) agent.
|
|
694
|
+
*/
|
|
695
|
+
export function cmdSessions(options) {
|
|
696
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
697
|
+
const target = yield resolveSessionTarget(options);
|
|
698
|
+
if (typeof target === "number") {
|
|
699
|
+
return target;
|
|
700
|
+
}
|
|
701
|
+
try {
|
|
702
|
+
const sessions = yield listSessions({
|
|
703
|
+
baseUrl: target.agentUrl,
|
|
704
|
+
auth: {
|
|
705
|
+
bearerToken: options.bearerToken,
|
|
706
|
+
headers: target.headers,
|
|
707
|
+
},
|
|
708
|
+
fetchImpl: options.fetchImpl,
|
|
709
|
+
});
|
|
710
|
+
if (options.json === true) {
|
|
711
|
+
process.stdout.write(`${JSON.stringify({ sessions }, null, 2)}\n`);
|
|
712
|
+
return 0;
|
|
713
|
+
}
|
|
714
|
+
process.stdout.write(formatSessionsTable(sessions));
|
|
715
|
+
return 0;
|
|
716
|
+
}
|
|
717
|
+
catch (error) {
|
|
718
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
719
|
+
return 1;
|
|
720
|
+
}
|
|
721
|
+
});
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* `session <id>` — view a full session (trajectory text by default).
|
|
725
|
+
* `--json` → trajectory JSON; `--events` (`rawEvents`) → raw event list.
|
|
726
|
+
* Interactive reattach: `resume [id]` / `chat --resume` (or `chat --session`).
|
|
727
|
+
*/
|
|
728
|
+
export function cmdSession(sessionId, options) {
|
|
729
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
730
|
+
if (sessionId === undefined || sessionId.trim() === "") {
|
|
731
|
+
process.stderr.write(`Usage: ${CLI_COMMAND_NAME} session <sessionId> [--url | --prod] [--json | --text | --events]\n`);
|
|
732
|
+
return 2;
|
|
733
|
+
}
|
|
734
|
+
if (options.rawEvents === true && options.json === true) {
|
|
735
|
+
process.stderr.write("--events and --json are mutually exclusive\n");
|
|
736
|
+
return 2;
|
|
737
|
+
}
|
|
738
|
+
const target = yield resolveSessionTarget(options);
|
|
739
|
+
if (typeof target === "number") {
|
|
740
|
+
return target;
|
|
741
|
+
}
|
|
742
|
+
try {
|
|
743
|
+
const events = yield fetchSessionEvents({
|
|
744
|
+
baseUrl: target.agentUrl,
|
|
745
|
+
sessionId,
|
|
746
|
+
auth: {
|
|
747
|
+
bearerToken: options.bearerToken,
|
|
748
|
+
headers: target.headers,
|
|
749
|
+
},
|
|
750
|
+
fetchImpl: options.fetchImpl,
|
|
751
|
+
});
|
|
752
|
+
if (options.rawEvents === true) {
|
|
753
|
+
process.stdout.write(`${JSON.stringify({ sessionId, events }, null, 2)}\n`);
|
|
754
|
+
return 0;
|
|
755
|
+
}
|
|
756
|
+
const trajectory = buildTrajectory(events);
|
|
757
|
+
if (options.json === true) {
|
|
758
|
+
process.stdout.write(`${JSON.stringify(trajectory, null, 2)}\n`);
|
|
759
|
+
return 0;
|
|
760
|
+
}
|
|
761
|
+
process.stdout.write(formatTrajectoryText(trajectory));
|
|
762
|
+
return 0;
|
|
763
|
+
}
|
|
764
|
+
catch (error) {
|
|
765
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
766
|
+
return 1;
|
|
767
|
+
}
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
/**
|
|
771
|
+
* `playground` — open the web UI against local / `--url` / `--prod`.
|
|
772
|
+
*
|
|
773
|
+
* Hosted engines need short-lived access headers a browser cannot set, so
|
|
774
|
+
* `--prod` (and `--bearer-token`) run a loopback reverse proxy that injects
|
|
775
|
+
* them. Ctrl-C stops the proxy.
|
|
776
|
+
*/
|
|
777
|
+
export function cmdPlayground(options) {
|
|
778
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
779
|
+
if (options.prod === true && options.url !== undefined) {
|
|
780
|
+
process.stderr.write("--prod and --url are mutually exclusive\n");
|
|
781
|
+
return 2;
|
|
782
|
+
}
|
|
783
|
+
const sessionId = options.sessionId !== undefined && options.sessionId.trim() !== ""
|
|
784
|
+
? options.sessionId.trim()
|
|
785
|
+
: undefined;
|
|
786
|
+
// Hosted: mint engineAccess and refresh it for the life of the proxy.
|
|
787
|
+
if (options.prod === true) {
|
|
788
|
+
let initial;
|
|
789
|
+
try {
|
|
790
|
+
initial = yield resolveProdTarget({
|
|
791
|
+
dir: options.dir,
|
|
792
|
+
cwd: options.cwd,
|
|
793
|
+
slug: options.slug,
|
|
794
|
+
team: options.team,
|
|
795
|
+
apiKey: options.apiKey,
|
|
796
|
+
fetchImpl: options.fetchImpl,
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
catch (error) {
|
|
800
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
801
|
+
return 1;
|
|
802
|
+
}
|
|
803
|
+
let proxy;
|
|
804
|
+
try {
|
|
805
|
+
proxy = yield startPlaygroundProxy({
|
|
806
|
+
upstreamUrl: initial.agentUrl,
|
|
807
|
+
headers: initial.headers,
|
|
808
|
+
expiresAt: initial.expiresAt,
|
|
809
|
+
refreshUpstream: () => __awaiter(this, void 0, void 0, function* () {
|
|
810
|
+
var _a;
|
|
811
|
+
const next = yield resolveProdTarget({
|
|
812
|
+
dir: options.dir,
|
|
813
|
+
cwd: options.cwd,
|
|
814
|
+
slug: (_a = options.slug) !== null && _a !== void 0 ? _a : initial.slug,
|
|
815
|
+
team: options.team,
|
|
816
|
+
apiKey: options.apiKey,
|
|
817
|
+
fetchImpl: options.fetchImpl,
|
|
818
|
+
err: () => { },
|
|
819
|
+
});
|
|
820
|
+
return {
|
|
821
|
+
upstreamUrl: next.agentUrl,
|
|
822
|
+
headers: next.headers,
|
|
823
|
+
expiresAt: next.expiresAt,
|
|
824
|
+
};
|
|
825
|
+
}),
|
|
826
|
+
});
|
|
827
|
+
}
|
|
828
|
+
catch (error) {
|
|
829
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
830
|
+
return 1;
|
|
831
|
+
}
|
|
832
|
+
return yield runPlaygroundProxySession({
|
|
833
|
+
proxy,
|
|
834
|
+
sessionId,
|
|
835
|
+
print: options.print === true,
|
|
836
|
+
signal: options.signal,
|
|
837
|
+
});
|
|
838
|
+
}
|
|
839
|
+
const target = yield resolveSessionTarget(options);
|
|
840
|
+
if (typeof target === "number") {
|
|
841
|
+
return target;
|
|
842
|
+
}
|
|
843
|
+
const needsProxy = (target.headers !== undefined && Object.keys(target.headers).length > 0) ||
|
|
844
|
+
(options.bearerToken !== undefined && options.bearerToken.trim() !== "");
|
|
845
|
+
if (!needsProxy) {
|
|
846
|
+
const base = `${target.agentUrl.replace(/\/$/, "")}/playground`;
|
|
847
|
+
const playgroundUrl = sessionId === undefined
|
|
848
|
+
? base
|
|
849
|
+
: `${base}?sessionId=${encodeURIComponent(sessionId)}`;
|
|
850
|
+
process.stdout.write(`${playgroundUrl}\n`);
|
|
851
|
+
if (options.print !== true) {
|
|
852
|
+
openBrowser(playgroundUrl);
|
|
853
|
+
}
|
|
854
|
+
return 0;
|
|
855
|
+
}
|
|
856
|
+
let proxy;
|
|
857
|
+
try {
|
|
858
|
+
proxy = yield startPlaygroundProxy({
|
|
859
|
+
upstreamUrl: target.agentUrl,
|
|
860
|
+
headers: target.headers,
|
|
861
|
+
bearerToken: options.bearerToken,
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
catch (error) {
|
|
865
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
866
|
+
return 1;
|
|
867
|
+
}
|
|
868
|
+
return yield runPlaygroundProxySession({
|
|
869
|
+
proxy,
|
|
870
|
+
sessionId,
|
|
871
|
+
print: options.print === true,
|
|
872
|
+
signal: options.signal,
|
|
873
|
+
});
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
function runPlaygroundProxySession(args) {
|
|
877
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
878
|
+
const { proxy } = args;
|
|
879
|
+
const playgroundUrl = proxy.playgroundUrl(args.sessionId);
|
|
880
|
+
process.stdout.write(`${playgroundUrl}\n`);
|
|
881
|
+
process.stderr.write(`Playground proxy on loopback (Ctrl-C to stop).\n`);
|
|
882
|
+
if (args.print !== true) {
|
|
883
|
+
openBrowser(playgroundUrl);
|
|
884
|
+
}
|
|
885
|
+
const controller = new AbortController();
|
|
886
|
+
const onSignal = () => {
|
|
887
|
+
controller.abort();
|
|
888
|
+
};
|
|
889
|
+
process.on("SIGINT", onSignal);
|
|
890
|
+
process.on("SIGTERM", onSignal);
|
|
891
|
+
const external = args.signal;
|
|
892
|
+
if (external !== undefined) {
|
|
893
|
+
if (external.aborted) {
|
|
894
|
+
controller.abort();
|
|
895
|
+
}
|
|
896
|
+
else {
|
|
897
|
+
external.addEventListener("abort", onSignal, { once: true });
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
try {
|
|
901
|
+
yield new Promise((resolve) => {
|
|
902
|
+
if (controller.signal.aborted) {
|
|
903
|
+
resolve();
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
906
|
+
controller.signal.addEventListener("abort", () => resolve(), {
|
|
907
|
+
once: true,
|
|
908
|
+
});
|
|
909
|
+
});
|
|
910
|
+
return 0;
|
|
911
|
+
}
|
|
912
|
+
finally {
|
|
913
|
+
process.off("SIGINT", onSignal);
|
|
914
|
+
process.off("SIGTERM", onSignal);
|
|
915
|
+
external === null || external === void 0 ? void 0 : external.removeEventListener("abort", onSignal);
|
|
916
|
+
yield proxy.close().catch(() => { });
|
|
917
|
+
}
|
|
918
|
+
});
|
|
919
|
+
}
|