@cursor/july 0.1.15 → 0.1.17
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/README.md +9 -4
- package/dist/bin/agent-serve.js +60 -2
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +13 -3
- package/dist/channels/slack/auth.d.ts +7 -1
- package/dist/channels/slack/auth.d.ts.map +1 -1
- package/dist/channels/slack/auth.js +14 -0
- package/dist/channels/slack/blocks.d.ts +61 -0
- package/dist/channels/slack/blocks.d.ts.map +1 -0
- package/dist/channels/slack/blocks.js +90 -0
- package/dist/channels/slack/defaults.d.ts +2 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +29 -3
- package/dist/channels/slack/dispatch.d.ts +3 -17
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/index.d.ts +1 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +1 -0
- package/dist/channels/slack/interactive.d.ts +39 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +152 -7
- package/dist/channels/slack/manifest.d.ts +3 -0
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +3 -0
- package/dist/channels/slack/setup.d.ts +4 -1
- package/dist/channels/slack/setup.d.ts.map +1 -1
- package/dist/channels/slack/setup.js +16 -2
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +24 -3
- package/dist/channels/slack/types.d.ts +77 -0
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/connections.d.ts +4 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +4 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.DpdGZTLe.js → app.BbEXr2KO.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DCBsrfwP.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.IB-0QqIT.js → VPLocalSearchBox.DBEi4HDp.js} +1 -1
- package/dist/docs/assets/chunks/{theme.-fYBoNtR.js → theme.DGfptcHw.js} +2 -2
- package/dist/docs/assets/{example-agents_index.md.BPXjUtRB.js → example-agents_index.md.D2PEVSXl.js} +2 -2
- package/dist/docs/assets/{example-agents_index.md.BPXjUtRB.lean.js → example-agents_index.md.D2PEVSXl.lean.js} +1 -1
- package/dist/docs/assets/example-agents_security-reviewer.md.BZSNycMf.js +19 -0
- package/dist/docs/assets/{example-agents_security-reviewer.md.CE9v-aKm.lean.js → example-agents_security-reviewer.md.BZSNycMf.lean.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.js → guides_mcp-oauth.md.Dd8EgSem.js} +3 -2
- package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.lean.js → guides_mcp-oauth.md.Dd8EgSem.lean.js} +1 -1
- package/dist/docs/assets/{guides_slack.md.FWale6Ip.js → guides_slack.md.D_xFKlnF.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.CsSr3rDz.js → reference_connections.md.B9Q3TOve.js} +12 -5
- package/dist/docs/assets/{reference_connections.md.CsSr3rDz.lean.js → reference_connections.md.B9Q3TOve.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/example-agents/approval-buddy.html +3 -3
- package/dist/docs/example-agents/benny.html +3 -3
- package/dist/docs/example-agents/bugbot.html +3 -3
- package/dist/docs/example-agents/codebase-wiki.html +3 -3
- package/dist/docs/example-agents/codeowners-review.html +3 -3
- package/dist/docs/example-agents/concierge.html +3 -3
- package/dist/docs/example-agents/fsd.html +3 -3
- package/dist/docs/example-agents/index.html +5 -5
- package/dist/docs/example-agents/knowledge-base.html +3 -3
- package/dist/docs/example-agents/oncall.html +3 -3
- package/dist/docs/example-agents/security-reviewer.html +14 -14
- package/dist/docs/example-agents/slack-agent.html +3 -3
- package/dist/docs/example-agents/weather-agent.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/mcp-oauth.html +6 -5
- package/dist/docs/guides/slack.html +5 -5
- 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 +3 -3
- package/dist/docs/reference/agent-config.html +3 -3
- package/dist/docs/reference/channels.html +3 -3
- package/dist/docs/reference/cli.html +3 -3
- package/dist/docs/reference/connections.html +14 -7
- 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/prompt.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/evals/assertions.d.ts +190 -0
- package/dist/evals/assertions.d.ts.map +1 -0
- package/dist/evals/assertions.js +461 -0
- package/dist/evals/expect.d.ts +95 -0
- package/dist/evals/expect.d.ts.map +1 -0
- package/dist/evals/expect.js +194 -0
- package/dist/evals/judge.d.ts +133 -0
- package/dist/evals/judge.d.ts.map +1 -0
- package/dist/evals/judge.js +228 -0
- package/dist/evals/loaders.d.ts +51 -0
- package/dist/evals/loaders.d.ts.map +1 -0
- package/dist/evals/loaders.js +124 -0
- package/dist/evals/matchers.d.ts +95 -0
- package/dist/evals/matchers.d.ts.map +1 -0
- package/dist/evals/matchers.js +145 -0
- package/dist/evals/reporters.d.ts +70 -0
- package/dist/evals/reporters.d.ts.map +1 -0
- package/dist/evals/reporters.js +221 -0
- package/dist/evals/results.d.ts +103 -0
- package/dist/evals/results.d.ts.map +1 -0
- package/dist/evals/results.js +28 -0
- package/dist/evals/run-facts.d.ts +77 -0
- package/dist/evals/run-facts.d.ts.map +1 -0
- package/dist/evals/run-facts.js +187 -0
- package/dist/evals.d.ts +136 -31
- package/dist/evals.d.ts.map +1 -1
- package/dist/evals.js +76 -12
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/cli-ax.d.ts +27 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +90 -12
- package/dist/internal/cli-mcp.d.ts +8 -0
- package/dist/internal/cli-mcp.d.ts.map +1 -1
- package/dist/internal/cli-mcp.js +98 -0
- package/dist/internal/cli-slack.d.ts +29 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +777 -12
- package/dist/internal/deploy-client.d.ts +7 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +9 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +29 -9
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +2 -0
- package/dist/internal/eval-judge-model.d.ts +59 -0
- package/dist/internal/eval-judge-model.d.ts.map +1 -0
- package/dist/internal/eval-judge-model.js +131 -0
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +12 -20
- package/dist/internal/eval-runner.d.ts +31 -25
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +332 -128
- package/dist/internal/evals-client.d.ts.map +1 -1
- package/dist/internal/evals-client.js +7 -3
- package/dist/internal/local-env.d.ts +8 -0
- package/dist/internal/local-env.d.ts.map +1 -0
- package/dist/internal/local-env.js +47 -0
- package/dist/internal/playground/static.d.ts +3 -0
- package/dist/internal/playground/static.d.ts.map +1 -1
- package/dist/internal/playground/static.js +3 -0
- package/dist/internal/run-client.d.ts +15 -0
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +3 -2
- package/dist/internal/sdk-runner.d.ts +36 -1
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +65 -25
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +10 -1
- package/dist/internal/session-engine.d.ts +18 -5
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +72 -19
- package/dist/internal/slack-provision-client.d.ts +130 -0
- package/dist/internal/slack-provision-client.d.ts.map +1 -0
- package/dist/internal/slack-provision-client.js +284 -0
- package/dist/playground/assets/cursor-icons-16-f_W_ogc-.woff2 +0 -0
- package/dist/playground/assets/index-CidizGZv.css +1 -0
- package/dist/playground/assets/index-DNqirsrK.js +85 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +70 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +26 -0
- package/docs/example-agents/index.md +1 -1
- package/docs/example-agents/security-reviewer.md +23 -21
- package/docs/guides/mcp-oauth.md +10 -5
- package/docs/guides/slack.md +3 -2
- package/docs/reference/connections.md +28 -18
- package/package.json +20 -2
- package/skills/create-agent/SKILL.md +15 -7
- package/skills/debug/SKILL.md +3 -1
- package/skills/mcp-auth/SKILL.md +1 -1
- package/skills/setup-slack/SKILL.md +173 -11
- package/src/bin/agent-serve.ts +63 -2
- package/src/channels/slack/api.ts +16 -3
- package/src/channels/slack/auth.ts +16 -1
- package/src/channels/slack/blocks.ts +139 -0
- package/src/channels/slack/defaults.ts +32 -4
- package/src/channels/slack/dispatch.ts +3 -18
- package/src/channels/slack/index.ts +1 -0
- package/src/channels/slack/interactive.ts +183 -19
- package/src/channels/slack/manifest.ts +3 -0
- package/src/channels/slack/setup.ts +16 -2
- package/src/channels/slack/slack-channel.ts +37 -6
- package/src/channels/slack/types.ts +89 -0
- package/src/connections.ts +4 -1
- package/src/evals/assertions.ts +704 -0
- package/src/evals/expect.ts +272 -0
- package/src/evals/judge.ts +346 -0
- package/src/evals/loaders.ts +113 -0
- package/src/evals/matchers.ts +246 -0
- package/src/evals/reporters.ts +274 -0
- package/src/evals/results.ts +132 -0
- package/src/evals/run-facts.ts +274 -0
- package/src/evals.ts +249 -42
- package/src/index.ts +2 -0
- package/src/internal/cli-ax.ts +134 -15
- package/src/internal/cli-mcp.ts +118 -5
- package/src/internal/cli-slack.ts +993 -15
- package/src/internal/deploy-client.ts +10 -0
- package/src/internal/discovery.ts +31 -5
- package/src/internal/distribution.ts +2 -0
- package/src/internal/eval-judge-model.ts +148 -0
- package/src/internal/eval-run-store.ts +10 -14
- package/src/internal/eval-runner.ts +466 -215
- package/src/internal/evals-client.ts +14 -2
- package/src/internal/local-env.ts +53 -0
- package/src/internal/playground/static.ts +3 -0
- package/src/internal/run-client.ts +17 -1
- package/src/internal/sdk-runner.ts +103 -22
- package/src/internal/server.ts +10 -0
- package/src/internal/session-engine.ts +89 -21
- package/src/internal/slack-provision-client.ts +438 -0
- package/src/types.ts +92 -4
- package/dist/channels/slack/post-update-delivery.d.ts +0 -85
- package/dist/channels/slack/post-update-delivery.d.ts.map +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.D2d8CfFS.js +0 -1
- package/dist/docs/assets/example-agents_security-reviewer.md.CE9v-aKm.js +0 -19
- package/dist/internal/json-dir-store.d.ts +0 -32
- package/dist/internal/json-dir-store.d.ts.map +0 -1
- package/dist/internal/persistence-coordinator.d.ts +0 -127
- package/dist/internal/persistence-coordinator.d.ts.map +0 -1
- package/dist/persistence.d.ts +0 -184
- package/dist/persistence.d.ts.map +0 -1
- package/dist/playground/assets/cursor-icons-16-CQ50JpfO.woff2 +0 -0
- package/dist/playground/assets/index-BVMOoiek.js +0 -86
- package/dist/playground/assets/index-DYmP4b--.css +0 -1
- /package/dist/docs/assets/{guides_slack.md.FWale6Ip.lean.js → guides_slack.md.D_xFKlnF.lean.js} +0 -0
package/dist/internal/cli-ax.js
CHANGED
|
@@ -18,6 +18,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
18
18
|
import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
|
|
19
19
|
import { tmpdir } from "node:os";
|
|
20
20
|
import { join, resolve } from "node:path";
|
|
21
|
+
import { Artifacts, JUnit } from "../evals/reporters.js";
|
|
21
22
|
import { serve } from "../index.js";
|
|
22
23
|
import { lookupSessionContinuation, runChat } from "./chat-client.js";
|
|
23
24
|
import { cmdLogin } from "./cli-cursor.js";
|
|
@@ -616,6 +617,7 @@ export function cmdEval(options) {
|
|
|
616
617
|
// batch lands in playground history and defineStorage evals (when set).
|
|
617
618
|
if (mode === "local") {
|
|
618
619
|
const progress = stream ? createStreamProgress() : undefined;
|
|
620
|
+
const artifactsDir = resolveEvalArtifactsDir(projectRoot, options);
|
|
619
621
|
try {
|
|
620
622
|
const results = yield runDiscoveredEvals({
|
|
621
623
|
projectRoot,
|
|
@@ -623,6 +625,11 @@ export function cmdEval(options) {
|
|
|
623
625
|
filterIds,
|
|
624
626
|
tags,
|
|
625
627
|
timeoutMs: options.timeoutMs,
|
|
628
|
+
maxConcurrency: options.maxConcurrency,
|
|
629
|
+
strict: options.strict === true,
|
|
630
|
+
skipReport: options.skipReport === true,
|
|
631
|
+
reporters: buildCliEvalReporters(options, artifactsDir),
|
|
632
|
+
target: { baseUrl: target.agentUrl, mode: "local" },
|
|
626
633
|
bearerToken: options.bearerToken,
|
|
627
634
|
headers: target.headers,
|
|
628
635
|
verbose: Boolean(options.verbose) || stream,
|
|
@@ -632,7 +639,7 @@ export function cmdEval(options) {
|
|
|
632
639
|
process.stderr.write("No matching evals found.\n");
|
|
633
640
|
return 2;
|
|
634
641
|
}
|
|
635
|
-
return printEvalResults(results, options);
|
|
642
|
+
return printEvalResults(results, options, undefined, artifactsDir);
|
|
636
643
|
}
|
|
637
644
|
finally {
|
|
638
645
|
progress === null || progress === void 0 ? void 0 : progress.close();
|
|
@@ -1031,33 +1038,76 @@ function createRemoteEvalProgress(enabled) {
|
|
|
1031
1038
|
},
|
|
1032
1039
|
};
|
|
1033
1040
|
}
|
|
1034
|
-
|
|
1041
|
+
/**
|
|
1042
|
+
* Where a local run writes its artifacts.
|
|
1043
|
+
*
|
|
1044
|
+
* Defaults to a timestamped directory under the project's gitignored
|
|
1045
|
+
* `.agent-serve/evals/`, so the full story of a failure is always on disk
|
|
1046
|
+
* without the eval author opting in. `--no-artifacts` turns it off.
|
|
1047
|
+
*/
|
|
1048
|
+
export function resolveEvalArtifactsDir(projectRoot, options) {
|
|
1049
|
+
if (options.artifacts === false) {
|
|
1050
|
+
return undefined;
|
|
1051
|
+
}
|
|
1052
|
+
if (typeof options.artifacts === "string" && options.artifacts !== "") {
|
|
1053
|
+
return resolve(options.artifacts);
|
|
1054
|
+
}
|
|
1055
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
1056
|
+
return join(projectRoot, ".agent-serve", "evals", stamp);
|
|
1057
|
+
}
|
|
1058
|
+
/** JUnit / artifacts reporters requested via CLI flags. */
|
|
1059
|
+
function buildCliEvalReporters(options, artifactsDir) {
|
|
1060
|
+
const reporters = [];
|
|
1061
|
+
if (artifactsDir !== undefined) {
|
|
1062
|
+
reporters.push(Artifacts({ dir: artifactsDir }));
|
|
1063
|
+
}
|
|
1064
|
+
if (options.junit !== undefined && options.junit !== "") {
|
|
1065
|
+
reporters.push(JUnit({ filePath: options.junit }));
|
|
1066
|
+
}
|
|
1067
|
+
return reporters;
|
|
1068
|
+
}
|
|
1069
|
+
function evalVerdictOf(result) {
|
|
1070
|
+
var _a;
|
|
1071
|
+
return (_a = result.verdict) !== null && _a !== void 0 ? _a : (result.ok ? "passed" : "failed");
|
|
1072
|
+
}
|
|
1073
|
+
const EVAL_VERDICT_LABEL = {
|
|
1074
|
+
passed: "PASS",
|
|
1075
|
+
failed: "FAIL",
|
|
1076
|
+
scored: "SCORED",
|
|
1077
|
+
skipped: "SKIP",
|
|
1078
|
+
};
|
|
1079
|
+
function printEvalResults(results, options, batch, artifactsDir) {
|
|
1035
1080
|
var _a, _b;
|
|
1036
|
-
const
|
|
1037
|
-
const
|
|
1081
|
+
const strict = options.strict === true;
|
|
1082
|
+
const counts = { passed: 0, failed: 0, scored: 0, skipped: 0 };
|
|
1083
|
+
for (const result of results) {
|
|
1084
|
+
counts[evalVerdictOf(result)]++;
|
|
1085
|
+
}
|
|
1038
1086
|
const batchFailed = (batch === null || batch === void 0 ? void 0 : batch.status) === "failed";
|
|
1039
|
-
const ok = failed === 0 && !batchFailed;
|
|
1087
|
+
const ok = counts.failed === 0 && !(strict && counts.scored > 0) && !batchFailed;
|
|
1040
1088
|
if ((batch === null || batch === void 0 ? void 0 : batch.error) !== undefined && batch.error !== "" && !options.json) {
|
|
1041
1089
|
// Always surface harness-level failures (not only --verbose).
|
|
1042
1090
|
process.stderr.write(`eval run error: ${batch.error}\n`);
|
|
1043
1091
|
}
|
|
1044
1092
|
if (options.json) {
|
|
1045
|
-
console.log(JSON.stringify(Object.assign(Object.assign(Object.assign({ ok,
|
|
1046
|
-
|
|
1047
|
-
failed,
|
|
1048
|
-
results }, ((batch === null || batch === void 0 ? void 0 : batch.runId) === undefined ? {} : { runId: batch.runId })), ((batch === null || batch === void 0 ? void 0 : batch.status) === undefined ? {} : { status: batch.status })), ((batch === null || batch === void 0 ? void 0 : batch.error) === undefined || batch.error === ""
|
|
1093
|
+
console.log(JSON.stringify(Object.assign(Object.assign(Object.assign(Object.assign({ ok, passed: counts.passed, failed: counts.failed, scored: counts.scored, skipped: counts.skipped, strict,
|
|
1094
|
+
results }, (artifactsDir === undefined ? {} : { artifactsDir })), ((batch === null || batch === void 0 ? void 0 : batch.runId) === undefined ? {} : { runId: batch.runId })), ((batch === null || batch === void 0 ? void 0 : batch.status) === undefined ? {} : { status: batch.status })), ((batch === null || batch === void 0 ? void 0 : batch.error) === undefined || batch.error === ""
|
|
1049
1095
|
? {}
|
|
1050
1096
|
: { error: batch.error })), null, 2));
|
|
1051
1097
|
}
|
|
1052
1098
|
else {
|
|
1053
1099
|
for (const r of results) {
|
|
1054
|
-
|
|
1100
|
+
const verdict = evalVerdictOf(r);
|
|
1101
|
+
process.stdout.write(`${EVAL_VERDICT_LABEL[verdict]} ${r.id} (${(r.durationMs / 1000).toFixed(1)}s)`);
|
|
1055
1102
|
if (r.description !== undefined) {
|
|
1056
1103
|
process.stdout.write(` — ${r.description}`);
|
|
1057
1104
|
}
|
|
1058
1105
|
process.stdout.write("\n");
|
|
1106
|
+
if (r.skipReason !== undefined) {
|
|
1107
|
+
process.stdout.write(` skipped: ${r.skipReason}\n`);
|
|
1108
|
+
}
|
|
1059
1109
|
for (const a of r.assertions) {
|
|
1060
|
-
process.stdout.write(` ${
|
|
1110
|
+
process.stdout.write(` ${formatEvalAssertionLine(a)}\n`);
|
|
1061
1111
|
}
|
|
1062
1112
|
for (const [name, value] of Object.entries((_a = r.metrics) !== null && _a !== void 0 ? _a : {})) {
|
|
1063
1113
|
process.stdout.write(` metric ${name}=${String(value)}\n`);
|
|
@@ -1072,10 +1122,38 @@ function printEvalResults(results, options, batch) {
|
|
|
1072
1122
|
process.stdout.write(` reply: ${r.finalText.slice(0, 200).replace(/\s+/g, " ")}\n`);
|
|
1073
1123
|
}
|
|
1074
1124
|
}
|
|
1075
|
-
|
|
1125
|
+
const extra = [];
|
|
1126
|
+
if (counts.scored > 0) {
|
|
1127
|
+
extra.push(`${counts.scored} scored${strict ? " (fatal: --strict)" : ""}`);
|
|
1128
|
+
}
|
|
1129
|
+
if (counts.skipped > 0) {
|
|
1130
|
+
extra.push(`${counts.skipped} skipped`);
|
|
1131
|
+
}
|
|
1132
|
+
process.stdout.write(`\n${counts.passed} passed, ${counts.failed} failed${extra.length === 0 ? "" : `, ${extra.join(", ")}`}, ${results.length} total\n`);
|
|
1133
|
+
if (artifactsDir !== undefined) {
|
|
1134
|
+
process.stdout.write(`artifacts: ${artifactsDir}\n`);
|
|
1135
|
+
}
|
|
1076
1136
|
}
|
|
1077
1137
|
return ok ? 0 : 1;
|
|
1078
1138
|
}
|
|
1139
|
+
/**
|
|
1140
|
+
* One assertion line. Soft assertions read `~` rather than `✗` when they miss,
|
|
1141
|
+
* so a tracked score is visibly different from a failed gate.
|
|
1142
|
+
*/
|
|
1143
|
+
export function formatEvalAssertionLine(assertion) {
|
|
1144
|
+
var _a;
|
|
1145
|
+
const soft = ((_a = assertion.severity) !== null && _a !== void 0 ? _a : "gate") === "soft";
|
|
1146
|
+
const mark = assertion.passed ? "✓" : soft ? "~" : "✗";
|
|
1147
|
+
const parts = [];
|
|
1148
|
+
if (assertion.score !== undefined) {
|
|
1149
|
+
parts.push(`score=${assertion.score.toFixed(3)}${assertion.threshold === undefined ? "" : ` >= ${assertion.threshold}`}`);
|
|
1150
|
+
}
|
|
1151
|
+
if (assertion.detail !== undefined) {
|
|
1152
|
+
parts.push(assertion.detail);
|
|
1153
|
+
}
|
|
1154
|
+
const suffix = parts.length === 0 ? "" : ` (${parts.join(", ")})`;
|
|
1155
|
+
return `${mark} ${assertion.name}${soft ? " [soft]" : ""}${suffix}`;
|
|
1156
|
+
}
|
|
1079
1157
|
/**
|
|
1080
1158
|
* `logs` — follow deploy progress (`--prod`) then runtime agent logs.
|
|
1081
1159
|
* Local / `--url` tails `/v1/logs` only.
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
* stdout is reserved for the MCP wire in serve mode; all logging goes to
|
|
26
26
|
* stderr.
|
|
27
27
|
*/
|
|
28
|
+
import { resolveDeployAuth } from "./cli-deploy.js";
|
|
28
29
|
import { resolveProdTarget } from "./resolve-prod-target.js";
|
|
29
30
|
export interface McpCliOptions {
|
|
30
31
|
dir: string;
|
|
@@ -43,9 +44,16 @@ export interface McpCliOptions {
|
|
|
43
44
|
print?: boolean;
|
|
44
45
|
/** `install`: machine-readable output. */
|
|
45
46
|
json?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* `install --prod`: write a REMOTE HTTP entry pointing at the stable Cursor
|
|
49
|
+
* MCP gateway (`<api>/…/mcp/<team>/<slug>`) instead of the local stdio
|
|
50
|
+
* proxy. For remote-only MCP hosts (Glass) that cannot spawn stdio.
|
|
51
|
+
*/
|
|
52
|
+
remote?: boolean;
|
|
46
53
|
/** Injected seams for tests. */
|
|
47
54
|
fetchImpl?: typeof fetch;
|
|
48
55
|
resolveProdTargetImpl?: typeof resolveProdTarget;
|
|
56
|
+
resolveDeployAuthImpl?: typeof resolveDeployAuth;
|
|
49
57
|
stdin?: NodeJS.ReadableStream;
|
|
50
58
|
stdout?: {
|
|
51
59
|
write(chunk: string): unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-mcp.d.ts","sourceRoot":"","sources":["../../src/internal/cli-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"cli-mcp.d.ts","sourceRoot":"","sources":["../../src/internal/cli-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAGL,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AA0BlC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IACjD,qBAAqB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC3C,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,MAAM,CAC1B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,aAAa,GAAG;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAMD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFzE;AAwRD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA4G3E;AAoGD,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAC/B,IAAI,GAAE,MAAsC,GAC3C,MAAM,CAGR;AAqED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQnD"}
|
package/dist/internal/cli-mcp.js
CHANGED
|
@@ -37,6 +37,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
37
37
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
38
38
|
import { homedir } from "node:os";
|
|
39
39
|
import { dirname, join } from "node:path";
|
|
40
|
+
import { resolveDeployAuth } from "./cli-deploy.js";
|
|
41
|
+
import { DeployApiError } from "./deploy-client.js";
|
|
40
42
|
import { CLI_COMMAND_NAME as CLI, LOG_PREFIX } from "./distribution.js";
|
|
41
43
|
import { ProdTargetError, resolveProdSlug, resolveProdTarget, } from "./resolve-prod-target.js";
|
|
42
44
|
/** Mount path of the MCP surface relative to an agent base URL. */
|
|
@@ -388,6 +390,13 @@ export function cmdMcpInstall(options) {
|
|
|
388
390
|
err("--prod and --url are mutually exclusive\n");
|
|
389
391
|
return 1;
|
|
390
392
|
}
|
|
393
|
+
if (options.remote === true) {
|
|
394
|
+
if (options.prod !== true) {
|
|
395
|
+
err("--remote requires --prod (the hosted deployment MCP gateway)\n");
|
|
396
|
+
return 1;
|
|
397
|
+
}
|
|
398
|
+
return cmdMcpInstallRemote(options);
|
|
399
|
+
}
|
|
391
400
|
let name;
|
|
392
401
|
let entry;
|
|
393
402
|
if (options.prod === true) {
|
|
@@ -475,6 +484,95 @@ export function cmdMcpInstall(options) {
|
|
|
475
484
|
return 0;
|
|
476
485
|
});
|
|
477
486
|
}
|
|
487
|
+
/**
|
|
488
|
+
* `mcp install --prod --remote` — write a REMOTE HTTP entry pointing at the
|
|
489
|
+
* stable Cursor MCP gateway for the hosted deployment, for MCP hosts that
|
|
490
|
+
* cannot spawn the stdio proxy (Glass / Sand). The gateway mints/refreshes
|
|
491
|
+
* engineAccess server-side, so the entry never carries a pod hostname or a
|
|
492
|
+
* short-lived port token — only the durable, stable gateway URL.
|
|
493
|
+
*
|
|
494
|
+
* Auth: this headless/CLI entry sends the `agentkit login` API key as a
|
|
495
|
+
* bearer against the user-API-key gateway surface. That key is written to
|
|
496
|
+
* `mcp.json` in plain text (flagged below); a signed-in Cursor client
|
|
497
|
+
* (Glass) can instead use the session gateway surface with no header at all
|
|
498
|
+
* once first-party session attachment ships (see PR follow-ups).
|
|
499
|
+
*/
|
|
500
|
+
function cmdMcpInstallRemote(options) {
|
|
501
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
502
|
+
var _a, _b, _c;
|
|
503
|
+
const err = (_a = options.err) !== null && _a !== void 0 ? _a : defaultErr;
|
|
504
|
+
const stdout = (_b = options.stdout) !== null && _b !== void 0 ? _b : process.stdout;
|
|
505
|
+
let slug;
|
|
506
|
+
try {
|
|
507
|
+
slug = resolveProdSlug({
|
|
508
|
+
dir: options.dir,
|
|
509
|
+
cwd: options.cwd,
|
|
510
|
+
slug: options.slug,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
catch (error) {
|
|
514
|
+
err(`${describeError(error)}\n`);
|
|
515
|
+
return 1;
|
|
516
|
+
}
|
|
517
|
+
const resolveAuthImpl = (_c = options.resolveDeployAuthImpl) !== null && _c !== void 0 ? _c : resolveDeployAuth;
|
|
518
|
+
const auth = yield resolveAuthImpl({
|
|
519
|
+
team: options.team,
|
|
520
|
+
apiKey: options.apiKey,
|
|
521
|
+
fetchImpl: options.fetchImpl,
|
|
522
|
+
err,
|
|
523
|
+
});
|
|
524
|
+
if (typeof auth === "number") {
|
|
525
|
+
return auth;
|
|
526
|
+
}
|
|
527
|
+
// Verify the deployment resolves before writing config that cannot work.
|
|
528
|
+
// This read is admin-tier, but calling the gateway only needs team
|
|
529
|
+
// membership — so a 403 means "cannot verify", not "cannot use": warn and
|
|
530
|
+
// still write the entry rather than locking members out of their own agent.
|
|
531
|
+
try {
|
|
532
|
+
yield auth.client.getDeployment({ teamId: auth.teamId, slug });
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
if (error instanceof DeployApiError && error.status === 403) {
|
|
536
|
+
err(`Could not verify deployment "${slug}" (reading deployments needs team-admin); writing the entry anyway.\n`);
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
err(`${describeError(error)}\n`);
|
|
540
|
+
if (error instanceof DeployApiError && error.status === 404) {
|
|
541
|
+
err(`Deploy it first: ${CLI} deploy --slug ${slug}\n`);
|
|
542
|
+
}
|
|
543
|
+
return 1;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
const name = resolveServerName(options.name, slug);
|
|
547
|
+
const url = auth.client.mcpGatewayUrl(auth.teamId, slug);
|
|
548
|
+
const entry = {
|
|
549
|
+
url,
|
|
550
|
+
headers: { Authorization: `Bearer ${auth.apiKey}` },
|
|
551
|
+
};
|
|
552
|
+
if (options.print === true) {
|
|
553
|
+
stdout.write(`${JSON.stringify({ mcpServers: { [name]: entry } }, null, 2)}\n`);
|
|
554
|
+
return 0;
|
|
555
|
+
}
|
|
556
|
+
const path = cursorMcpJsonPath();
|
|
557
|
+
try {
|
|
558
|
+
yield upsertMcpJsonEntry(path, name, entry);
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
err(`${describeError(error)}\n`);
|
|
562
|
+
return 1;
|
|
563
|
+
}
|
|
564
|
+
err("note: the API key is written to mcp.json in plain text; it is a durable " +
|
|
565
|
+
"credential for a remote MCP host that cannot spawn the stdio proxy.\n");
|
|
566
|
+
if (options.json === true) {
|
|
567
|
+
stdout.write(`${JSON.stringify({ ok: true, path, name, entry })}\n`);
|
|
568
|
+
return 0;
|
|
569
|
+
}
|
|
570
|
+
stdout.write(`Installed remote MCP server "${name}" in ${path}\n` +
|
|
571
|
+
` ${url}\n` +
|
|
572
|
+
"Cursor watches this file; the server appears without a restart.\n");
|
|
573
|
+
return 0;
|
|
574
|
+
});
|
|
575
|
+
}
|
|
478
576
|
/** `~/.cursor/mcp.json` — the user-level Cursor MCP config. */
|
|
479
577
|
export function cursorMcpJsonPath(home) {
|
|
480
578
|
var _a;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `agent-serve slack …` CLI — manifests, setup, doctor (Socket Mode)
|
|
2
|
+
* `agent-serve slack …` CLI — manifests, setup, doctor (Socket Mode), and
|
|
3
|
+
* managed provisioning (`create` / `destroy`) through Cursor's
|
|
4
|
+
* "Add to Slack" API (`slack-provision-client.ts`).
|
|
3
5
|
*/
|
|
6
|
+
import { runSlackDoctor } from "../channels/slack/index.js";
|
|
4
7
|
export interface SlackCliOptions {
|
|
5
8
|
dir: string;
|
|
6
9
|
name?: string;
|
|
@@ -13,6 +16,31 @@ export interface SlackCliOptions {
|
|
|
13
16
|
noPrefix?: boolean;
|
|
14
17
|
/** Subscribe manifests to channel-post events (opt-in channel watch). */
|
|
15
18
|
channelPosts?: boolean;
|
|
19
|
+
/** create/destroy: target Slack workspace id (`T…`). */
|
|
20
|
+
slackTeam?: string;
|
|
21
|
+
/** create/destroy: target the prod app (default dev). */
|
|
22
|
+
prod?: boolean;
|
|
23
|
+
/** create/destroy: Cursor team id; resolved from the account when omitted. */
|
|
24
|
+
team?: string;
|
|
25
|
+
/** create/destroy: Cursor API key (defaults to the stored login / env). */
|
|
26
|
+
apiKey?: string;
|
|
27
|
+
/** create: app icon — an https image URL or a local png/jpg/gif ≤512KB. */
|
|
28
|
+
icon?: string;
|
|
29
|
+
/** create: overwrite manifest edits made in Slack (skip the drift check). */
|
|
30
|
+
force?: boolean;
|
|
31
|
+
/** `slack icon <source>` positional (same URL-or-file forms as --icon). */
|
|
32
|
+
iconSource?: string;
|
|
33
|
+
/** Test seams. */
|
|
34
|
+
fetchImpl?: typeof fetch;
|
|
35
|
+
openBrowserImpl?: (url: string) => void;
|
|
36
|
+
connectPollIntervalMs?: number;
|
|
37
|
+
connectPollTimeoutMs?: number;
|
|
38
|
+
doctorImpl?: typeof runSlackDoctor;
|
|
39
|
+
out?: (text: string) => void;
|
|
40
|
+
err?: (text: string) => void;
|
|
16
41
|
}
|
|
17
42
|
export declare function cmdSlack(subcommand: string | undefined, options: SlackCliOptions): Promise<number>;
|
|
43
|
+
export declare function cmdSlackCreate(options: SlackCliOptions): Promise<number>;
|
|
44
|
+
export declare function cmdSlackDestroy(options: SlackCliOptions): Promise<number>;
|
|
45
|
+
export declare function cmdSlackIcon(options: SlackCliOptions): Promise<number>;
|
|
18
46
|
//# sourceMappingURL=cli-slack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-slack.d.ts","sourceRoot":"","sources":["../../src/internal/cli-slack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli-slack.d.ts","sourceRoot":"","sources":["../../src/internal/cli-slack.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAML,cAAc,EAGf,MAAM,4BAA4B,CAAC;AAoBpC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,cAAc,CAAC;IACnC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AA6CD,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAsaD,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CA6NjB;AAiDD,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD5E"}
|