@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
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offer to install the package's coding-agent skills into the user's
|
|
3
|
+
* personal Cursor skills dir under `~/.cursor/skills/agentkit/<skill>/`.
|
|
4
|
+
*
|
|
5
|
+
* Cursor walks `~/.cursor/skills` recursively, so the `agentkit/` folder is
|
|
6
|
+
* only organizational — identity comes from the leaf folder that holds
|
|
7
|
+
* SKILL.md. Skipped for `--json` / non-TTY hosts.
|
|
8
|
+
*/
|
|
9
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
10
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
11
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
12
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
13
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
14
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
import { access, cp, mkdir, readdir, readFile, rm, writeFile, } from "node:fs/promises";
|
|
19
|
+
import { homedir } from "node:os";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { packageRootDir } from "./distribution.js";
|
|
22
|
+
import { stdoutPalette } from "./terminal-style.js";
|
|
23
|
+
/** Monorepo-only skill; excluded from the published package. */
|
|
24
|
+
const SKIP_SKILL_DIRS = new Set(["operate"]);
|
|
25
|
+
/** Category folder under ~/.cursor/skills (Cursor discovers nested skills). */
|
|
26
|
+
export const CURSOR_SKILLS_NAMESPACE = "agentkit";
|
|
27
|
+
export function cursorSkillsHome(home) {
|
|
28
|
+
var _a;
|
|
29
|
+
if (home === void 0) { home = (_a = process.env.HOME) !== null && _a !== void 0 ? _a : homedir(); }
|
|
30
|
+
const resolved = home.trim() === "" ? homedir() : home;
|
|
31
|
+
return join(resolved, ".cursor", "skills");
|
|
32
|
+
}
|
|
33
|
+
/** `~/.cursor/skills/agentkit` — where package skills are installed. */
|
|
34
|
+
export function agentkitCursorSkillsDir(skillsHome = cursorSkillsHome()) {
|
|
35
|
+
return join(skillsHome, CURSOR_SKILLS_NAMESPACE);
|
|
36
|
+
}
|
|
37
|
+
/** Absolute install path for one skill: `…/agentkit/<leafDir>`. */
|
|
38
|
+
export function skillInstallPath(skill, skillsHome = cursorSkillsHome()) {
|
|
39
|
+
return join(agentkitCursorSkillsDir(skillsHome), skill.leafDir);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Skills shipped next to the running package. Uses the frontmatter `name`
|
|
43
|
+
* when present, otherwise `agentkit-<dir>`.
|
|
44
|
+
*/
|
|
45
|
+
export function listShippedPackageSkills() {
|
|
46
|
+
return __awaiter(this, arguments, void 0, function* (packageRoot = packageRootDir()) {
|
|
47
|
+
var _a;
|
|
48
|
+
const skillsRoot = join(packageRoot, "skills");
|
|
49
|
+
let entries;
|
|
50
|
+
try {
|
|
51
|
+
entries = yield readdir(skillsRoot, { withFileTypes: true });
|
|
52
|
+
}
|
|
53
|
+
catch (_b) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const skills = [];
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
if (!entry.isDirectory() || SKIP_SKILL_DIRS.has(entry.name)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const sourceDir = join(skillsRoot, entry.name);
|
|
62
|
+
const skillMd = join(sourceDir, "SKILL.md");
|
|
63
|
+
try {
|
|
64
|
+
yield access(skillMd);
|
|
65
|
+
}
|
|
66
|
+
catch (_c) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const raw = yield readFile(skillMd, "utf8");
|
|
70
|
+
const name = (_a = parseSkillName(raw)) !== null && _a !== void 0 ? _a : `agentkit-${entry.name}`;
|
|
71
|
+
skills.push({ name, leafDir: entry.name, sourceDir });
|
|
72
|
+
}
|
|
73
|
+
skills.sort((a, b) => a.leafDir.localeCompare(b.leafDir));
|
|
74
|
+
return skills;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Skills that do not yet have a SKILL.md under ~/.cursor/skills/agentkit/.
|
|
79
|
+
* Install still overwrites every shipped skill when the user confirms — this
|
|
80
|
+
* helper is for messaging (fresh install vs update).
|
|
81
|
+
*/
|
|
82
|
+
export function findMissingCursorSkills(options) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
var _a;
|
|
85
|
+
const shipped = yield listShippedPackageSkills(options === null || options === void 0 ? void 0 : options.packageRoot);
|
|
86
|
+
const home = (_a = options === null || options === void 0 ? void 0 : options.skillsHome) !== null && _a !== void 0 ? _a : cursorSkillsHome();
|
|
87
|
+
const missing = [];
|
|
88
|
+
for (const skill of shipped) {
|
|
89
|
+
try {
|
|
90
|
+
yield access(join(skillInstallPath(skill, home), "SKILL.md"));
|
|
91
|
+
}
|
|
92
|
+
catch (_b) {
|
|
93
|
+
missing.push(skill);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return missing;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Copy each skill directory into `skillsHome/agentkit/<leafDir>/`.
|
|
101
|
+
* Always overwrites so a package upgrade refreshes local Cursor skills.
|
|
102
|
+
* Strips monorepo-only frontmatter and removes leaf dirs no longer shipped.
|
|
103
|
+
*/
|
|
104
|
+
export function installCursorSkills(skills_1) {
|
|
105
|
+
return __awaiter(this, arguments, void 0, function* (skills, skillsHome = cursorSkillsHome()) {
|
|
106
|
+
const namespaceDir = agentkitCursorSkillsDir(skillsHome);
|
|
107
|
+
yield mkdir(namespaceDir, { recursive: true });
|
|
108
|
+
const shippedLeaves = new Set(skills.map((skill) => skill.leafDir));
|
|
109
|
+
let existingLeaves = [];
|
|
110
|
+
try {
|
|
111
|
+
const entries = yield readdir(namespaceDir, { withFileTypes: true });
|
|
112
|
+
existingLeaves = entries
|
|
113
|
+
.filter((entry) => entry.isDirectory())
|
|
114
|
+
.map((entry) => entry.name);
|
|
115
|
+
}
|
|
116
|
+
catch (_a) {
|
|
117
|
+
existingLeaves = [];
|
|
118
|
+
}
|
|
119
|
+
for (const leaf of existingLeaves) {
|
|
120
|
+
if (!shippedLeaves.has(leaf)) {
|
|
121
|
+
yield rm(join(namespaceDir, leaf), { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const installed = [];
|
|
125
|
+
for (const skill of skills) {
|
|
126
|
+
const target = skillInstallPath(skill, skillsHome);
|
|
127
|
+
yield cp(skill.sourceDir, target, { recursive: true, force: true });
|
|
128
|
+
const skillMdPath = join(target, "SKILL.md");
|
|
129
|
+
const raw = yield readFile(skillMdPath, "utf8");
|
|
130
|
+
const adjusted = prepareSkillMarkdownForCursorInstall(raw);
|
|
131
|
+
if (adjusted !== raw) {
|
|
132
|
+
yield writeFile(skillMdPath, adjusted, "utf8");
|
|
133
|
+
}
|
|
134
|
+
installed.push(skill.leafDir);
|
|
135
|
+
}
|
|
136
|
+
return installed;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** Drop monorepo `paths` globs and fix package doc links for ~/.cursor installs. */
|
|
140
|
+
export function prepareSkillMarkdownForCursorInstall(content) {
|
|
141
|
+
var _a;
|
|
142
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
|
|
143
|
+
if (match === null) {
|
|
144
|
+
return content;
|
|
145
|
+
}
|
|
146
|
+
const frontmatter = stripPathsFromFrontmatter((_a = match[1]) !== null && _a !== void 0 ? _a : "");
|
|
147
|
+
const body = content.slice(match[0].length);
|
|
148
|
+
const adjustedBody = body.replace(/\[`docs\/([^`]+)`\]\(\.\.\/\.\.\/docs\/[^)]+\)/g, "docs/$1 in the @cursor/july package");
|
|
149
|
+
return `---\n${frontmatter.trimEnd()}\n---${adjustedBody}`;
|
|
150
|
+
}
|
|
151
|
+
function stripPathsFromFrontmatter(frontmatter) {
|
|
152
|
+
var _a, _b;
|
|
153
|
+
const lines = frontmatter.split(/\r?\n/);
|
|
154
|
+
const out = [];
|
|
155
|
+
for (let i = 0; i < lines.length; i++) {
|
|
156
|
+
const line = (_a = lines[i]) !== null && _a !== void 0 ? _a : "";
|
|
157
|
+
if (line.trimStart().startsWith("paths:")) {
|
|
158
|
+
i++;
|
|
159
|
+
while (i < lines.length && /^[ \t]*-/.test((_b = lines[i]) !== null && _b !== void 0 ? _b : "")) {
|
|
160
|
+
i++;
|
|
161
|
+
}
|
|
162
|
+
i--;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
out.push(line);
|
|
166
|
+
}
|
|
167
|
+
return out.join("\n");
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* On a TTY, offer to install/update every shipped package skill into
|
|
171
|
+
* ~/.cursor/skills/agentkit (always overwriting). No-op when non-interactive
|
|
172
|
+
* or the package ships no skills.
|
|
173
|
+
*/
|
|
174
|
+
export function offerInstallCursorSkills() {
|
|
175
|
+
return __awaiter(this, arguments, void 0, function* (options = {}) {
|
|
176
|
+
var _a, _b, _c, _d;
|
|
177
|
+
const out = (_a = options.out) !== null && _a !== void 0 ? _a : ((text) => process.stdout.write(text));
|
|
178
|
+
const interactive = (_b = options.interactive) !== null && _b !== void 0 ? _b : (process.stdin.isTTY === true && process.stdout.isTTY === true);
|
|
179
|
+
const shipped = yield listShippedPackageSkills(options.packageRoot);
|
|
180
|
+
if (shipped.length === 0) {
|
|
181
|
+
return { installed: [], skipped: true };
|
|
182
|
+
}
|
|
183
|
+
const home = (_c = options.skillsHome) !== null && _c !== void 0 ? _c : cursorSkillsHome();
|
|
184
|
+
const targetDir = agentkitCursorSkillsDir(home);
|
|
185
|
+
const missing = yield findMissingCursorSkills({
|
|
186
|
+
packageRoot: options.packageRoot,
|
|
187
|
+
skillsHome: home,
|
|
188
|
+
});
|
|
189
|
+
const names = shipped.map((skill) => skill.leafDir).join(", ");
|
|
190
|
+
const noun = shipped.length === 1 ? "skill" : "skills";
|
|
191
|
+
const verb = missing.length === shipped.length ? "Install" : "Update";
|
|
192
|
+
const question = `${verb} ${shipped.length} agentkit ${noun} in ${targetDir}?`;
|
|
193
|
+
if (!interactive) {
|
|
194
|
+
return { installed: [], skipped: true };
|
|
195
|
+
}
|
|
196
|
+
const c = stdoutPalette();
|
|
197
|
+
out(`${question}\n`);
|
|
198
|
+
out(c.dim(` ${names}\n`));
|
|
199
|
+
if (missing.length < shipped.length) {
|
|
200
|
+
out(c.dim(" (overwrites existing copies with the package version)\n"));
|
|
201
|
+
}
|
|
202
|
+
const confirm = (_d = options.confirm) !== null && _d !== void 0 ? _d : ((q) => promptYesNo(q, { defaultYes: true, out }));
|
|
203
|
+
const accepted = yield confirm(missing.length === shipped.length ? "Install now?" : "Update now?");
|
|
204
|
+
if (!accepted) {
|
|
205
|
+
out(c.dim("Skipped skill install.\n\n"));
|
|
206
|
+
return { installed: [], skipped: true };
|
|
207
|
+
}
|
|
208
|
+
const installed = yield installCursorSkills(shipped, home);
|
|
209
|
+
out(`${verb === "Install" ? "Installed" : "Updated"} ${installed.length} ${noun} in ${targetDir}\n\n`);
|
|
210
|
+
return { installed, skipped: false };
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
function parseSkillName(skillMd) {
|
|
214
|
+
var _a;
|
|
215
|
+
var _b;
|
|
216
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(skillMd);
|
|
217
|
+
if (match === null) {
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
const nameLine = /^name:\s*(.+)\s*$/m.exec((_b = match[1]) !== null && _b !== void 0 ? _b : "");
|
|
221
|
+
if (nameLine === null) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
const raw = (_a = nameLine[1]) === null || _a === void 0 ? void 0 : _a.trim();
|
|
225
|
+
if (raw === undefined || raw === "") {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
// Strip optional quotes around the YAML scalar.
|
|
229
|
+
return raw.replace(/^["']|["']$/g, "");
|
|
230
|
+
}
|
|
231
|
+
function promptYesNo(question, options) {
|
|
232
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
233
|
+
const hint = options.defaultYes ? "Y/n" : "y/N";
|
|
234
|
+
options.out(`${question} [${hint}] `);
|
|
235
|
+
process.stdin.resume();
|
|
236
|
+
const line = yield readOneLine(process.stdin);
|
|
237
|
+
process.stdin.pause();
|
|
238
|
+
if (line === undefined || line.trim() === "") {
|
|
239
|
+
return options.defaultYes;
|
|
240
|
+
}
|
|
241
|
+
const answer = line.trim().toLowerCase();
|
|
242
|
+
if (answer === "y" || answer === "yes") {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
if (answer === "n" || answer === "no") {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
return options.defaultYes;
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
function readOneLine(stream) {
|
|
252
|
+
return new Promise((resolve) => {
|
|
253
|
+
let buffer = "";
|
|
254
|
+
const onData = (chunk) => {
|
|
255
|
+
buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
256
|
+
const newline = buffer.indexOf("\n");
|
|
257
|
+
if (newline === -1) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
cleanup();
|
|
261
|
+
resolve(buffer.slice(0, newline).replace(/\r$/, ""));
|
|
262
|
+
};
|
|
263
|
+
const onEnd = () => {
|
|
264
|
+
cleanup();
|
|
265
|
+
resolve(buffer === "" ? undefined : buffer.replace(/\r$/, ""));
|
|
266
|
+
};
|
|
267
|
+
const cleanup = () => {
|
|
268
|
+
stream.off("data", onData);
|
|
269
|
+
stream.off("end", onEnd);
|
|
270
|
+
};
|
|
271
|
+
stream.on("data", onData);
|
|
272
|
+
stream.on("end", onEnd);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
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
|
+
import { type DeploymentDetail, type DeploymentProgress } from "./deploy-client.js";
|
|
7
|
+
import { type RequestAuth } from "./request-headers.js";
|
|
8
|
+
export interface LogRingEntry {
|
|
9
|
+
index: number;
|
|
10
|
+
at: string;
|
|
11
|
+
line: string;
|
|
12
|
+
}
|
|
13
|
+
export interface LogsResponse {
|
|
14
|
+
entries: LogRingEntry[];
|
|
15
|
+
nextAfter: number;
|
|
16
|
+
}
|
|
17
|
+
export type LogsProgress = DeploymentProgress | "queued" | "preparing" | "building" | "finalizing" | "running" | "failed" | "stopping" | "stopped" | "degraded";
|
|
18
|
+
export declare function progressMessage(progress: LogsProgress, lastError?: string | null): string;
|
|
19
|
+
/** Strip obvious hosting internals from error text shown to customers. */
|
|
20
|
+
export declare function sanitizeCustomerError(message: string): string;
|
|
21
|
+
export declare function fetchLogs(args: {
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
after?: number;
|
|
24
|
+
auth?: RequestAuth;
|
|
25
|
+
fetchImpl?: typeof fetch;
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
}): Promise<LogsResponse>;
|
|
28
|
+
export interface RunLogsTailOptions {
|
|
29
|
+
/** When true, use hosted deploy progress then runtime logs. */
|
|
30
|
+
prod?: boolean;
|
|
31
|
+
dir: string;
|
|
32
|
+
cwd?: string;
|
|
33
|
+
slug?: string;
|
|
34
|
+
team?: string;
|
|
35
|
+
apiKey?: string;
|
|
36
|
+
url?: string;
|
|
37
|
+
bearerToken?: string;
|
|
38
|
+
once?: boolean;
|
|
39
|
+
json?: boolean;
|
|
40
|
+
fetchImpl?: typeof fetch;
|
|
41
|
+
signal?: AbortSignal;
|
|
42
|
+
intervalMs?: number;
|
|
43
|
+
/** stdout writer (test seam). */
|
|
44
|
+
write?: (text: string) => void;
|
|
45
|
+
/** stderr writer (test seam). */
|
|
46
|
+
err?: (text: string) => void;
|
|
47
|
+
/**
|
|
48
|
+
* Deploy detail fetcher for `--prod` progress (test seam). Defaults to
|
|
49
|
+
* management API via resolveProdTarget's auth path.
|
|
50
|
+
*/
|
|
51
|
+
getDeployment?: () => Promise<DeploymentDetail>;
|
|
52
|
+
/** After deploy is running, resolve runtime base URL + headers. */
|
|
53
|
+
resolveRuntime?: () => Promise<{
|
|
54
|
+
agentUrl: string;
|
|
55
|
+
headers?: Record<string, string>;
|
|
56
|
+
}>;
|
|
57
|
+
sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
export declare function runLogsTail(options: RunLogsTailOptions): Promise<void>;
|
|
60
|
+
//# sourceMappingURL=logs-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs-client.d.ts","sourceRoot":"","sources":["../../src/internal/logs-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAW7E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,QAAQ,GACR,WAAW,GACX,UAAU,GACV,YAAY,GACZ,SAAS,GACT,QAAQ,GACR,UAAU,GACV,SAAS,GACT,UAAU,CAAC;AAcf,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,CAgBR;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CA0BxB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,iCAAiC;IACjC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChD,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC5E"}
|
|
@@ -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
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-endpoint.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AAEzH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AACvE,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAU3C,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvE;AAED,yEAAyE;AACzE,UAAU,oBAAoB;IAC5B,OAAO,CAAC,SAAS,EAAE,wCAAwC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,oBAAoB,CAAC;IACxC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"mcp-endpoint.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AAEzH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AACvE,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAU3C,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvE;AAED,yEAAyE;AACzE,UAAU,oBAAoB;IAC5B,OAAO,CAAC,SAAS,EAAE,wCAAwC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,oBAAoB,CAAC;IACxC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyCpB;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAMpE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,gBAAgB,CAanB"}
|
|
@@ -75,7 +75,7 @@ export function handleStatelessMcpRequest(args) {
|
|
|
75
75
|
return yield transport.handleRequest(args.request);
|
|
76
76
|
}
|
|
77
77
|
catch (error) {
|
|
78
|
-
logger(`[
|
|
78
|
+
logger(`[agentkit] ${args.label} request failed: ${describeError(error)}`);
|
|
79
79
|
return new Response(JSON.stringify({
|
|
80
80
|
jsonrpc: "2.0",
|
|
81
81
|
error: { code: -32603, message: "Internal server error." },
|
|
@@ -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"}
|