@cursor/july 0.1.1 → 0.1.2
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 +24 -2
- package/README.md +25 -15
- package/dist/bin/agent-serve.js +101 -12
- package/dist/channels/github/api.d.ts.map +1 -1
- package/dist/channels/github/api.js +31 -14
- package/dist/channels/github/cursor-account.d.ts +43 -0
- package/dist/channels/github/cursor-account.d.ts.map +1 -0
- package/dist/channels/github/cursor-account.js +95 -0
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +46 -9
- package/dist/channels/github/index.d.ts +2 -2
- package/dist/channels/github/index.js +2 -2
- package/dist/channels/github/types.d.ts +17 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.d.ts +8 -2
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +8 -0
- package/dist/channels/slack/types.d.ts +24 -3
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/types.js +15 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +8 -8
- package/dist/docs/assets/{ab.md.COdXkces.js → ab.md.BMCZ6Hd7.js} +3 -3
- package/dist/docs/assets/{ab.md.COdXkces.lean.js → ab.md.BMCZ6Hd7.lean.js} +1 -1
- package/dist/docs/assets/{app.DqfFEmJd.js → app.Oje4vhlk.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.zwQ9RCQ7.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BaLEdS15.js → VPLocalSearchBox.H5XZ2zCB.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CZRvu_0q.js → theme.CTR_TuaE.js} +2 -2
- package/dist/docs/assets/{deployment.md.Dx1TYNk5.js → deployment.md.DTKwE15Z.js} +3 -3
- package/dist/docs/assets/{deployment.md.Dx1TYNk5.lean.js → deployment.md.DTKwE15Z.lean.js} +1 -1
- package/dist/docs/assets/{evals.md.DPZ_MAnI.js → evals.md.DAgEc_hL.js} +3 -3
- package/dist/docs/assets/{guides_agent-to-agent.md.CrtrsySy.js → guides_agent-to-agent.md.Bpzgq2Pq.js} +1 -1
- package/dist/docs/assets/{guides_cloud-runtime.md.CYlNMTNp.js → guides_cloud-runtime.md.gVzabdQL.js} +1 -1
- package/dist/docs/assets/{guides_github.md.DwbKhCeS.js → guides_github.md.DOOCpqsW.js} +11 -4
- package/dist/docs/assets/{guides_github.md.DwbKhCeS.lean.js → guides_github.md.DOOCpqsW.lean.js} +1 -1
- package/dist/docs/assets/{guides_human-in-the-loop.md.Dvuctx7s.js → guides_human-in-the-loop.md.DlUqsp1S.js} +2 -2
- package/dist/docs/assets/{guides_slack.md.bv41fHfW.js → guides_slack.md.CCwqHvSV.js} +4 -4
- package/dist/docs/assets/{guides_slack.md.bv41fHfW.lean.js → guides_slack.md.CCwqHvSV.lean.js} +1 -1
- package/dist/docs/assets/{guides_webhooks.md.hFTik3lf.js → guides_webhooks.md.B1EswtUu.js} +2 -2
- package/dist/docs/assets/index.md.m81y7TY7.js +20 -0
- package/dist/docs/assets/{index.md.BPKcj5AI.lean.js → index.md.m81y7TY7.lean.js} +1 -1
- package/dist/docs/assets/quickstart.md.CfU8_uTC.js +192 -0
- package/dist/docs/assets/quickstart.md.CfU8_uTC.lean.js +1 -0
- package/dist/docs/assets/{reference_agent-config.md.Bpd7HQwf.js → reference_agent-config.md.DrW2JUM8.js} +4 -4
- package/dist/docs/assets/{reference_agent-config.md.Bpd7HQwf.lean.js → reference_agent-config.md.DrW2JUM8.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.D7JTR03W.js → reference_channels.md.DdmiKgqf.js} +4 -4
- package/dist/docs/assets/{reference_channels.md.D7JTR03W.lean.js → reference_channels.md.DdmiKgqf.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.C3vNH_DE.js → reference_connections.md.zaEYCLHT.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.BCEc3MyM.js → reference_hooks.md.DyLVfE1O.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.BCEc3MyM.lean.js → reference_hooks.md.DyLVfE1O.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.DBAahtdz.js → reference_http-api.md.Dx_nmDG6.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.BC05LEQ8.js → reference_instructions.md.CgoV-YEb.js} +9 -7
- package/dist/docs/assets/{reference_instructions.md.BC05LEQ8.lean.js → reference_instructions.md.CgoV-YEb.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.D7qijxLk.js → reference_schedules.md.w_F2mXB6.js} +2 -2
- package/dist/docs/assets/{reference_skills.md.VQnlBT3Q.js → reference_skills.md.B_jHN7JL.js} +3 -3
- package/dist/docs/assets/{reference_skills.md.VQnlBT3Q.lean.js → reference_skills.md.B_jHN7JL.lean.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.CIRAVcPK.js → reference_subagents.md.zWAMNfi1.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.DF5kwlt0.js → reference_tools.md.CqgJroI0.js} +2 -2
- package/dist/docs/assets/scaffolding-agents.md.C3pTrmoE.js +1 -0
- package/dist/docs/assets/scaffolding-agents.md.C3pTrmoE.lean.js +1 -0
- package/dist/docs/assets/storage.md.CVnInNiN.js +17 -0
- package/dist/docs/assets/storage.md.CVnInNiN.lean.js +1 -0
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +7 -7
- package/dist/docs/evals.html +7 -7
- package/dist/docs/guides/agent-to-agent.html +6 -6
- package/dist/docs/guides/cloud-runtime.html +5 -5
- package/dist/docs/guides/github.html +14 -7
- package/dist/docs/guides/human-in-the-loop.html +6 -6
- package/dist/docs/guides/slack.html +8 -8
- package/dist/docs/guides/webhooks.html +6 -6
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +5 -5
- package/dist/docs/index.html +7 -7
- package/dist/docs/quickstart.html +180 -23
- package/dist/docs/reference/agent-config.html +7 -7
- package/dist/docs/reference/channels.html +8 -8
- package/dist/docs/reference/cli.html +4 -4
- package/dist/docs/reference/connections.html +5 -5
- package/dist/docs/reference/hooks.html +5 -5
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/instructions.html +13 -11
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/schedules.html +7 -7
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +6 -6
- package/dist/docs/reference/subagents.html +6 -6
- package/dist/docs/reference/tools.html +7 -7
- package/dist/docs/scaffolding-agents.html +5 -5
- package/dist/docs/storage.html +41 -0
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/internal/cli-deploy.d.ts +52 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -0
- package/dist/internal/cli-deploy.js +731 -0
- package/dist/internal/cursor/backend-client.d.ts +10 -1
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +79 -1
- package/dist/internal/cursor/github-credentials.d.ts +44 -0
- package/dist/internal/cursor/github-credentials.d.ts.map +1 -0
- package/dist/internal/cursor/github-credentials.js +195 -0
- package/dist/internal/deploy-client.d.ts +176 -0
- package/dist/internal/deploy-client.d.ts.map +1 -0
- package/dist/internal/deploy-client.js +375 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +73 -5
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +1 -0
- package/dist/internal/eval-run-store.d.ts +22 -3
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +37 -19
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
- package/dist/internal/handleAgentServeTrigger.js +10 -12
- package/dist/internal/host-platforms.d.ts +7 -2
- package/dist/internal/host-platforms.d.ts.map +1 -1
- package/dist/internal/host-platforms.js +15 -10
- package/dist/internal/hosting.d.ts +37 -0
- package/dist/internal/hosting.d.ts.map +1 -0
- package/dist/internal/hosting.js +67 -0
- package/dist/internal/reminder-runner.d.ts +7 -0
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +50 -6
- package/dist/internal/reminder-store.d.ts +2 -0
- package/dist/internal/reminder-store.d.ts.map +1 -1
- package/dist/internal/reminder-store.js +18 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +173 -42
- package/dist/internal/session-engine.d.ts +49 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +246 -17
- package/dist/internal/storage-coordinator.d.ts +139 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -0
- package/dist/internal/storage-coordinator.js +499 -0
- package/dist/playground/assets/cursor-icons-outline-BxTT_FVJ.woff2 +0 -0
- package/dist/playground/assets/index-B1Qc9h2u.css +1 -0
- package/dist/playground/assets/{index-FlWjhg3x.js → index-CpDYCj8W.js} +42 -42
- package/dist/playground/index.html +2 -2
- package/dist/storage.d.ts +204 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +153 -0
- package/dist/types.d.ts +44 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +3 -2
- package/docs/guides/github.md +43 -8
- package/docs/guides/slack.md +1 -1
- package/docs/quickstart.md +329 -51
- package/docs/reference/instructions.md +8 -6
- package/docs/scaffolding-agents.md +1 -1
- package/docs/storage.md +98 -0
- package/package.json +8 -1
- package/skills/github/SKILL.md +9 -1
- package/src/bin/agent-serve.ts +139 -0
- package/src/channels/github/api.ts +42 -23
- package/src/channels/github/cursor-account.ts +165 -0
- package/src/channels/github/github-channel.ts +66 -6
- package/src/channels/github/index.ts +2 -2
- package/src/channels/github/types.ts +19 -0
- package/src/channels/slack/slack-channel.ts +17 -3
- package/src/channels/slack/types.ts +44 -3
- package/src/index.ts +13 -0
- package/src/internal/cli-deploy.ts +940 -0
- package/src/internal/cursor/backend-client.ts +103 -1
- package/src/internal/cursor/github-credentials.ts +248 -0
- package/src/internal/deploy-client.ts +591 -0
- package/src/internal/discovery.ts +88 -1
- package/src/internal/distribution.ts +1 -0
- package/src/internal/eval-run-store.ts +48 -19
- package/src/internal/handleAgentServeTrigger.ts +10 -12
- package/src/internal/host-platforms.ts +28 -11
- package/src/internal/hosting.ts +77 -0
- package/src/internal/reminder-runner.ts +50 -6
- package/src/internal/reminder-store.ts +21 -0
- package/src/internal/server.ts +213 -27
- package/src/internal/session-engine.ts +285 -7
- package/src/internal/storage-coordinator.ts +615 -0
- package/src/storage.ts +325 -0
- package/src/types.ts +40 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.CcVk1uKq.js +0 -1
- package/dist/docs/assets/index.md.BPKcj5AI.js +0 -20
- package/dist/docs/assets/quickstart.md.tVPiGK_L.js +0 -35
- package/dist/docs/assets/quickstart.md.tVPiGK_L.lean.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.lean.js +0 -1
- package/dist/playground/assets/cursor-icons-outline-oY2V_mvK.woff2 +0 -0
- package/dist/playground/assets/index-1K-hG-7p.css +0 -1
- /package/dist/docs/assets/{evals.md.DPZ_MAnI.lean.js → evals.md.DAgEc_hL.lean.js} +0 -0
- /package/dist/docs/assets/{guides_agent-to-agent.md.CrtrsySy.lean.js → guides_agent-to-agent.md.Bpzgq2Pq.lean.js} +0 -0
- /package/dist/docs/assets/{guides_cloud-runtime.md.CYlNMTNp.lean.js → guides_cloud-runtime.md.gVzabdQL.lean.js} +0 -0
- /package/dist/docs/assets/{guides_human-in-the-loop.md.Dvuctx7s.lean.js → guides_human-in-the-loop.md.DlUqsp1S.lean.js} +0 -0
- /package/dist/docs/assets/{guides_webhooks.md.hFTik3lf.lean.js → guides_webhooks.md.B1EswtUu.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.C3vNH_DE.lean.js → reference_connections.md.zaEYCLHT.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.DBAahtdz.lean.js → reference_http-api.md.Dx_nmDG6.lean.js} +0 -0
- /package/dist/docs/assets/{reference_schedules.md.D7qijxLk.lean.js → reference_schedules.md.w_F2mXB6.lean.js} +0 -0
- /package/dist/docs/assets/{reference_subagents.md.CIRAVcPK.lean.js → reference_subagents.md.zWAMNfi1.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.DF5kwlt0.lean.js → reference_tools.md.CqgJroI0.lean.js} +0 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin client for the Agent Serve deployment management API
|
|
3
|
+
* (`/internal/agent-serve/deployments` on the Cursor backend). Pure
|
|
4
|
+
* request/response + error mapping — no console I/O, no polling loops;
|
|
5
|
+
* rendering lives in `cli-deploy.ts`.
|
|
6
|
+
*
|
|
7
|
+
* Auth is the user API key sent directly as the bearer (the routes are
|
|
8
|
+
* `wrapUserApiRoute` on the backend); there is no token exchange here.
|
|
9
|
+
* The endpoints are gated on the `agent_serve_mvp` Statsig gate and 404
|
|
10
|
+
* when it is off — the error mapping says so instead of "not found".
|
|
11
|
+
*/
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
import { MAX_SECRET_VALUE_BYTES, MAX_SECRETS, validateEgressDomain, validateSettableSecretName, } from "./hosting.js";
|
|
23
|
+
export const TERMINAL_DEPLOY_STATUSES = new Set([
|
|
24
|
+
"running",
|
|
25
|
+
"degraded",
|
|
26
|
+
"failed",
|
|
27
|
+
"stopped",
|
|
28
|
+
]);
|
|
29
|
+
const SLUG_PATTERN = /^[a-z0-9_-]{1,64}$/;
|
|
30
|
+
/** Returns a human error message, or undefined when the slug is valid. */
|
|
31
|
+
export function validateDeploymentSlug(slug) {
|
|
32
|
+
if (SLUG_PATTERN.test(slug)) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
return `Invalid slug ${JSON.stringify(slug)}: use lowercase letters, digits, '-' or '_' (max 64 chars)`;
|
|
36
|
+
}
|
|
37
|
+
/** Derive a valid slug from a directory name, or undefined if impossible. */
|
|
38
|
+
export function slugFromDirectoryName(name) {
|
|
39
|
+
const slug = name
|
|
40
|
+
.toLowerCase()
|
|
41
|
+
.replace(/[^a-z0-9_-]+/g, "-")
|
|
42
|
+
.replace(/^-+|-+$/g, "")
|
|
43
|
+
.slice(0, 64);
|
|
44
|
+
return SLUG_PATTERN.test(slug) ? slug : undefined;
|
|
45
|
+
}
|
|
46
|
+
export class DeployApiError extends Error {
|
|
47
|
+
constructor(message, status,
|
|
48
|
+
/** Seconds to wait before retrying (from `Retry-After` on 429s). */
|
|
49
|
+
retryAfterSeconds) {
|
|
50
|
+
super(message);
|
|
51
|
+
this.status = status;
|
|
52
|
+
this.retryAfterSeconds = retryAfterSeconds;
|
|
53
|
+
this.name = "DeployApiError";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// All response schemas are `.passthrough()`: the backend keeps growing the
|
|
57
|
+
// deployment payload (serviceAccountId, egressAllowedDomains, secret
|
|
58
|
+
// metadata, ...) and unknown fields must flow through untouched — both so
|
|
59
|
+
// parsing never breaks on a newer backend and so `--json` output stays
|
|
60
|
+
// faithful to the API instead of silently dropping fields.
|
|
61
|
+
const deployAcceptedSchema = z
|
|
62
|
+
.object({
|
|
63
|
+
id: z.number(),
|
|
64
|
+
slug: z.string(),
|
|
65
|
+
teamId: z.number(),
|
|
66
|
+
status: z.string(),
|
|
67
|
+
generation: z.number(),
|
|
68
|
+
deploymentKind: z.string(),
|
|
69
|
+
engineAlias: z.string(),
|
|
70
|
+
aliasToken: z.string().optional(),
|
|
71
|
+
})
|
|
72
|
+
.passthrough();
|
|
73
|
+
const deploymentSchema = z.object({
|
|
74
|
+
id: z.number(),
|
|
75
|
+
slug: z.string(),
|
|
76
|
+
teamId: z.number(),
|
|
77
|
+
deploymentKind: z.string(),
|
|
78
|
+
gitRepoUrl: z.string().nullable().optional(),
|
|
79
|
+
gitRef: z.string().optional(),
|
|
80
|
+
agentPath: z.string().optional(),
|
|
81
|
+
desiredState: z.string().optional(),
|
|
82
|
+
status: z.enum([
|
|
83
|
+
"pending",
|
|
84
|
+
"deploying",
|
|
85
|
+
"running",
|
|
86
|
+
"degraded",
|
|
87
|
+
"failed",
|
|
88
|
+
"stopping",
|
|
89
|
+
"stopped",
|
|
90
|
+
]),
|
|
91
|
+
generation: z.number(),
|
|
92
|
+
observedGeneration: z.number().nullable().optional(),
|
|
93
|
+
engineGeneration: z.number().nullable().optional(),
|
|
94
|
+
publicId: z.string().optional(),
|
|
95
|
+
engineUrl: z.string().nullable().optional(),
|
|
96
|
+
lastError: z.string().nullable().optional(),
|
|
97
|
+
engineAlias: z.string(),
|
|
98
|
+
desiredUpdatedAt: z.string().optional(),
|
|
99
|
+
lastReconciledAt: z.string().nullable().optional(),
|
|
100
|
+
cursorEventRepos: z.array(z.string()).optional(),
|
|
101
|
+
egressAllowedDomains: z.array(z.string()).optional(),
|
|
102
|
+
// Null on legacy rows that predate service-account-backed deploys.
|
|
103
|
+
serviceAccountId: z.number().nullable().optional(),
|
|
104
|
+
podCredentialMaskedKey: z.string().nullable().optional(),
|
|
105
|
+
secretNames: z.array(z.string()).optional(),
|
|
106
|
+
});
|
|
107
|
+
const deploymentListItemSchema = deploymentSchema.passthrough();
|
|
108
|
+
const deploymentDetailSchema = deploymentSchema
|
|
109
|
+
.extend({
|
|
110
|
+
engineAccess: z
|
|
111
|
+
.object({
|
|
112
|
+
url: z.string(),
|
|
113
|
+
headers: z.record(z.string()),
|
|
114
|
+
expiresAt: z.string(),
|
|
115
|
+
})
|
|
116
|
+
.nullable()
|
|
117
|
+
.optional(),
|
|
118
|
+
})
|
|
119
|
+
.passthrough();
|
|
120
|
+
const listResponseSchema = z.object({
|
|
121
|
+
deployments: z.array(deploymentListItemSchema),
|
|
122
|
+
});
|
|
123
|
+
const stopAcceptedSchema = z
|
|
124
|
+
.object({
|
|
125
|
+
id: z.number(),
|
|
126
|
+
status: z.string(),
|
|
127
|
+
})
|
|
128
|
+
.passthrough();
|
|
129
|
+
const rotateResponseSchema = z
|
|
130
|
+
.object({
|
|
131
|
+
aliasToken: z.string().min(1),
|
|
132
|
+
})
|
|
133
|
+
.passthrough();
|
|
134
|
+
const rotatePodCredentialResponseSchema = z
|
|
135
|
+
.object({
|
|
136
|
+
podCredentialMaskedKey: z.string().min(1),
|
|
137
|
+
})
|
|
138
|
+
.passthrough();
|
|
139
|
+
const setSecretsResponseSchema = z
|
|
140
|
+
.object({
|
|
141
|
+
secretNames: z.array(z.string()),
|
|
142
|
+
})
|
|
143
|
+
.passthrough();
|
|
144
|
+
const listSecretsResponseSchema = z
|
|
145
|
+
.object({
|
|
146
|
+
secrets: z.array(z.object({ name: z.string(), createdAt: z.string() }).passthrough()),
|
|
147
|
+
})
|
|
148
|
+
.passthrough();
|
|
149
|
+
export class AgentServeDeployClient {
|
|
150
|
+
constructor(options) {
|
|
151
|
+
var _a;
|
|
152
|
+
this.backendUrl = options.backendUrl.endsWith("/")
|
|
153
|
+
? options.backendUrl.slice(0, -1)
|
|
154
|
+
: options.backendUrl;
|
|
155
|
+
this.apiKey = options.apiKey;
|
|
156
|
+
this.fetchImpl = (_a = options.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
|
|
157
|
+
}
|
|
158
|
+
/** Create or redeploy; 202 means accepted, not running (poll status). */
|
|
159
|
+
deploy(args) {
|
|
160
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
+
var _a;
|
|
162
|
+
const slugError = validateDeploymentSlug(args.slug);
|
|
163
|
+
if (slugError !== undefined) {
|
|
164
|
+
throw new DeployApiError(slugError, 400);
|
|
165
|
+
}
|
|
166
|
+
for (const domain of (_a = args.source.egressAllowedDomains) !== null && _a !== void 0 ? _a : []) {
|
|
167
|
+
const domainError = validateEgressDomain(domain);
|
|
168
|
+
if (domainError !== undefined) {
|
|
169
|
+
throw new DeployApiError(domainError, 400);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Only the git-ref member exists today; a future artifact member would
|
|
173
|
+
// upload the build first and post a different body from this branch.
|
|
174
|
+
const body = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ teamId: args.teamId, slug: args.slug }, (args.source.gitRepoUrl === undefined
|
|
175
|
+
? {}
|
|
176
|
+
: { gitRepoUrl: args.source.gitRepoUrl })), (args.source.gitRef === undefined
|
|
177
|
+
? {}
|
|
178
|
+
: { gitRef: args.source.gitRef })), (args.source.agentPath === undefined
|
|
179
|
+
? {}
|
|
180
|
+
: { agentPath: args.source.agentPath })), (args.source.cursorEventRepos === undefined
|
|
181
|
+
? {}
|
|
182
|
+
: { cursorEventRepos: args.source.cursorEventRepos })), (args.source.egressAllowedDomains === undefined
|
|
183
|
+
? {}
|
|
184
|
+
: { egressAllowedDomains: args.source.egressAllowedDomains }));
|
|
185
|
+
const raw = yield this.request({
|
|
186
|
+
method: "POST",
|
|
187
|
+
path: "/internal/agent-serve/deployments",
|
|
188
|
+
body,
|
|
189
|
+
context: { verb: "deploy", slug: args.slug },
|
|
190
|
+
});
|
|
191
|
+
return deployAcceptedSchema.parse(raw);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
listDeployments(args) {
|
|
195
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
196
|
+
const raw = yield this.request({
|
|
197
|
+
method: "GET",
|
|
198
|
+
path: `/internal/agent-serve/deployments?teamId=${args.teamId}`,
|
|
199
|
+
context: { verb: "list deployments" },
|
|
200
|
+
});
|
|
201
|
+
return listResponseSchema.parse(raw).deployments;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
getDeployment(args) {
|
|
205
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
206
|
+
const raw = yield this.request({
|
|
207
|
+
method: "GET",
|
|
208
|
+
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}?teamId=${args.teamId}`,
|
|
209
|
+
context: { verb: "get deployment", slug: args.slug },
|
|
210
|
+
});
|
|
211
|
+
return deploymentDetailSchema.parse(raw);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
stopDeployment(args) {
|
|
215
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
216
|
+
const raw = yield this.request({
|
|
217
|
+
method: "POST",
|
|
218
|
+
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/stop?teamId=${args.teamId}`,
|
|
219
|
+
context: { verb: "stop", slug: args.slug },
|
|
220
|
+
});
|
|
221
|
+
return stopAcceptedSchema.parse(raw);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/** Returns the new alias token exactly once; the old one dies now. */
|
|
225
|
+
rotateAliasToken(args) {
|
|
226
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
227
|
+
const raw = yield this.request({
|
|
228
|
+
method: "POST",
|
|
229
|
+
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/rotate-alias-token?teamId=${args.teamId}`,
|
|
230
|
+
context: { verb: "rotate alias token", slug: args.slug },
|
|
231
|
+
});
|
|
232
|
+
return rotateResponseSchema.parse(raw).aliasToken;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Upsert secrets by name (unlisted names stay untouched). Returns the
|
|
237
|
+
* post-write union of secret names, sorted. Validates names and value
|
|
238
|
+
* sizes client-side with the backend's grammar before any network call.
|
|
239
|
+
*/
|
|
240
|
+
setSecrets(args) {
|
|
241
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
242
|
+
for (const { name, value } of args.secrets) {
|
|
243
|
+
const nameError = validateSettableSecretName(name);
|
|
244
|
+
if (nameError !== undefined) {
|
|
245
|
+
throw new DeployApiError(nameError, 400);
|
|
246
|
+
}
|
|
247
|
+
if (Buffer.byteLength(value, "utf8") > MAX_SECRET_VALUE_BYTES) {
|
|
248
|
+
throw new DeployApiError(`The value for ${name} is too large (max ${MAX_SECRET_VALUE_BYTES} bytes).`, 400);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (args.secrets.length > MAX_SECRETS) {
|
|
252
|
+
throw new DeployApiError(`Too many secrets in one request (${args.secrets.length}); deployments hold at most ${MAX_SECRETS}.`, 400);
|
|
253
|
+
}
|
|
254
|
+
const raw = yield this.request({
|
|
255
|
+
method: "PUT",
|
|
256
|
+
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/secrets`,
|
|
257
|
+
body: { teamId: args.teamId, secrets: args.secrets },
|
|
258
|
+
context: { verb: "set secrets", slug: args.slug },
|
|
259
|
+
});
|
|
260
|
+
return setSecretsResponseSchema.parse(raw).secretNames;
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
/** Secret names + creation times; values are never returned. */
|
|
264
|
+
listSecrets(args) {
|
|
265
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
266
|
+
const raw = yield this.request({
|
|
267
|
+
method: "GET",
|
|
268
|
+
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/secrets?teamId=${args.teamId}`,
|
|
269
|
+
context: { verb: "list secrets", slug: args.slug },
|
|
270
|
+
});
|
|
271
|
+
return listSecretsResponseSchema.parse(raw).secrets;
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/** Remove one secret by name; 404 when it is not set. */
|
|
275
|
+
deleteSecret(args) {
|
|
276
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
277
|
+
const nameError = validateSettableSecretName(args.name);
|
|
278
|
+
if (nameError !== undefined) {
|
|
279
|
+
throw new DeployApiError(nameError, 400);
|
|
280
|
+
}
|
|
281
|
+
yield this.request({
|
|
282
|
+
method: "DELETE",
|
|
283
|
+
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/secrets/${encodeURIComponent(args.name)}?teamId=${args.teamId}`,
|
|
284
|
+
context: { verb: "unset secret", slug: args.slug },
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Rotate the deployment's pod credential. Returns the masked new key —
|
|
290
|
+
* the raw key is injected into the pod on the next deploy, never
|
|
291
|
+
* returned to clients.
|
|
292
|
+
*/
|
|
293
|
+
rotatePodCredential(args) {
|
|
294
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
295
|
+
const raw = yield this.request({
|
|
296
|
+
method: "POST",
|
|
297
|
+
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/rotate-pod-credential?teamId=${args.teamId}`,
|
|
298
|
+
context: { verb: "rotate pod credential", slug: args.slug },
|
|
299
|
+
});
|
|
300
|
+
return rotatePodCredentialResponseSchema.parse(raw).podCredentialMaskedKey;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
/** Full URL of the stable engine alias for a deployment. */
|
|
304
|
+
aliasUrl(engineAlias) {
|
|
305
|
+
return `${this.backendUrl}${engineAlias}`;
|
|
306
|
+
}
|
|
307
|
+
request(args) {
|
|
308
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
309
|
+
let response;
|
|
310
|
+
try {
|
|
311
|
+
response = yield this.fetchImpl(`${this.backendUrl}${args.path}`, Object.assign(Object.assign({ method: args.method, headers: Object.assign({ accept: "application/json", authorization: `Bearer ${this.apiKey}` }, (args.body === undefined
|
|
312
|
+
? {}
|
|
313
|
+
: { "content-type": "application/json" })) }, (args.body === undefined ? {} : { body: JSON.stringify(args.body) })), { signal: AbortSignal.timeout(60000) }));
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
throw new DeployApiError(`Could not reach the Cursor backend at ${this.backendUrl}: ${error instanceof Error ? error.message : String(error)}`, 0);
|
|
317
|
+
}
|
|
318
|
+
const text = yield response.text();
|
|
319
|
+
if (!response.ok) {
|
|
320
|
+
throw mapErrorResponse(response, text, args.context);
|
|
321
|
+
}
|
|
322
|
+
try {
|
|
323
|
+
return JSON.parse(text);
|
|
324
|
+
}
|
|
325
|
+
catch (_a) {
|
|
326
|
+
throw new DeployApiError(`The Cursor backend returned a non-JSON response to ${args.context.verb}.`, response.status);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// ============================================================================
|
|
332
|
+
// Error mapping (HTTP → actionable human messages)
|
|
333
|
+
// ============================================================================
|
|
334
|
+
function serverErrorText(bodyText) {
|
|
335
|
+
try {
|
|
336
|
+
const parsed = JSON.parse(bodyText);
|
|
337
|
+
if (typeof parsed.error === "string" && parsed.error !== "") {
|
|
338
|
+
return parsed.error;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (_a) {
|
|
342
|
+
// Non-JSON body — fall through.
|
|
343
|
+
}
|
|
344
|
+
return undefined;
|
|
345
|
+
}
|
|
346
|
+
function mapErrorResponse(response, bodyText, context) {
|
|
347
|
+
var _a;
|
|
348
|
+
const serverError = serverErrorText(bodyText);
|
|
349
|
+
const slugPart = context.slug === undefined ? "" : ` "${context.slug}"`;
|
|
350
|
+
switch (response.status) {
|
|
351
|
+
case 400:
|
|
352
|
+
return new DeployApiError(serverError !== null && serverError !== void 0 ? serverError : `The ${context.verb} request was rejected as invalid.`, 400);
|
|
353
|
+
case 401:
|
|
354
|
+
return new DeployApiError("The Cursor API key was rejected. Run `agentkit login` again or update CURSOR_API_KEY.", 401);
|
|
355
|
+
case 403:
|
|
356
|
+
return new DeployApiError(`${serverError !== null && serverError !== void 0 ? serverError : "Not authorized"} — deploying needs team-admin permission and the cloud-agent entitlement on that team.`, 403);
|
|
357
|
+
case 404:
|
|
358
|
+
return new DeployApiError(context.slug === undefined
|
|
359
|
+
? `Not found — the agent_serve_mvp feature gate may not be enabled for your team.`
|
|
360
|
+
: `Deployment${slugPart} was not found — check the slug and --team, or the agent_serve_mvp feature gate may not be enabled for your team.`, 404);
|
|
361
|
+
case 409:
|
|
362
|
+
return new DeployApiError(`A concurrent deploy or stop is changing deployment${slugPart}; retry in a moment.`, 409);
|
|
363
|
+
case 429: {
|
|
364
|
+
const retryAfterHeader = response.headers.get("retry-after");
|
|
365
|
+
const retryAfterSeconds = retryAfterHeader !== null && /^\d+$/.test(retryAfterHeader)
|
|
366
|
+
? Number(retryAfterHeader)
|
|
367
|
+
: undefined;
|
|
368
|
+
return new DeployApiError(`${serverError !== null && serverError !== void 0 ? serverError : "Rate limited"}${retryAfterSeconds === undefined
|
|
369
|
+
? ""
|
|
370
|
+
: ` — retry in ${retryAfterSeconds}s`}`, 429, retryAfterSeconds);
|
|
371
|
+
}
|
|
372
|
+
default:
|
|
373
|
+
return new DeployApiError(`The ${context.verb} request failed (${response.status}): ${(_a = serverError !== null && serverError !== void 0 ? serverError : bodyText.slice(0, 300)) !== null && _a !== void 0 ? _a : "(empty body)"}`, response.status);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/internal/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/internal/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAKrB,KAAK,UAAU,EAmBhB,MAAM,aAAa,CAAC;AAmBrB,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3E;AAmBD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAiCzD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAAuB,GAAG;IACjC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACtB,GACL,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAgBzD;AAWD,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAIrC,CAAC;AAEH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,CAAC,CA8DvB;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAElE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAOnE;AA+jBD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB3E;AAukBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,CAkInE"}
|
|
@@ -35,6 +35,7 @@ import { registerAuthoredModuleLoaders } from "./authored-loaders.js";
|
|
|
35
35
|
import { getDefinitionKind } from "./brand.js";
|
|
36
36
|
import { isValidCron } from "./cron.js";
|
|
37
37
|
import { parseFrontmatter } from "./frontmatter.js";
|
|
38
|
+
import { isReservedSecretName, MAX_EGRESS_DOMAINS, validateEgressDomain, validateSecretName, } from "./hosting.js";
|
|
38
39
|
import { toolInputJsonSchema } from "./json-schema.js";
|
|
39
40
|
import { MCP_ENDPOINT_PATH, mcpEndpointToolNames } from "./mcp-endpoint.js";
|
|
40
41
|
const MODULE_EXTENSIONS = new Set([".ts", ".mts", ".js", ".mjs"]);
|
|
@@ -176,14 +177,24 @@ export function loadAgentProject(dir_1) {
|
|
|
176
177
|
const hooks = yield loadHooks(ctx, join(agentDir, "hooks"));
|
|
177
178
|
const abs = yield loadABs(ctx, agentDir);
|
|
178
179
|
const abConfig = yield loadABConfig(ctx, agentDir);
|
|
180
|
+
const storage = yield loadStorage(ctx, agentDir);
|
|
179
181
|
if (agentDir !== rootDir) {
|
|
180
182
|
yield warnUnknownSlots(ctx, agentDir);
|
|
181
183
|
}
|
|
182
|
-
return
|
|
183
|
-
|
|
184
|
+
return {
|
|
185
|
+
rootDir,
|
|
186
|
+
agentDir,
|
|
187
|
+
name: agent.name,
|
|
188
|
+
agent,
|
|
189
|
+
httpChannel: httpChannelDefinition !== null && httpChannelDefinition !== void 0 ? httpChannelDefinition : httpChannel(),
|
|
190
|
+
channels,
|
|
184
191
|
schedules,
|
|
185
192
|
hooks,
|
|
186
|
-
abs
|
|
193
|
+
abs,
|
|
194
|
+
abConfig,
|
|
195
|
+
storage,
|
|
196
|
+
diagnostics,
|
|
197
|
+
};
|
|
187
198
|
});
|
|
188
199
|
}
|
|
189
200
|
/** True when the project has diagnostics that must block serving. */
|
|
@@ -231,6 +242,7 @@ function loadAgent(ctx, agentDir, options) {
|
|
|
231
242
|
: {
|
|
232
243
|
cwd: localCwd,
|
|
233
244
|
};
|
|
245
|
+
const hosting = resolveHosting(ctx, agentDir, config === null || config === void 0 ? void 0 : config.hosting);
|
|
234
246
|
if (runtime === "cloud") {
|
|
235
247
|
warnCloudRuntimeLimitations(ctx, agentDir, {
|
|
236
248
|
serverTools: tools.filter((tool) => tool.execution === "server").length,
|
|
@@ -249,6 +261,7 @@ function loadAgent(ctx, agentDir, options) {
|
|
|
249
261
|
runtime,
|
|
250
262
|
cloud,
|
|
251
263
|
local,
|
|
264
|
+
hosting,
|
|
252
265
|
tools,
|
|
253
266
|
skills,
|
|
254
267
|
connections,
|
|
@@ -268,6 +281,46 @@ function resolveAgentCwd(ctx, authored) {
|
|
|
268
281
|
}
|
|
269
282
|
return isAbsolute(trimmed) ? trimmed : resolve(ctx.rootDir, trimmed);
|
|
270
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* Validate the authored `hosting` block against the same grammar the
|
|
286
|
+
* backend enforces on deploy. Violations are warning diagnostics (reported
|
|
287
|
+
* by `agentkit validate`), not hard failures: the backend stays
|
|
288
|
+
* authoritative and `agentkit deploy` re-checks before any network call.
|
|
289
|
+
*/
|
|
290
|
+
function resolveHosting(ctx, agentDir, hosting) {
|
|
291
|
+
var _a, _b;
|
|
292
|
+
if (hosting === undefined) {
|
|
293
|
+
return undefined;
|
|
294
|
+
}
|
|
295
|
+
const agentPath = displayPath(ctx, join(agentDir, "agent.ts"));
|
|
296
|
+
const warn = (message) => {
|
|
297
|
+
ctx.diagnostics.push({ severity: "warning", path: agentPath, message });
|
|
298
|
+
};
|
|
299
|
+
const egressDomains = (_a = hosting.egressDomains) !== null && _a !== void 0 ? _a : [];
|
|
300
|
+
for (const domain of egressDomains) {
|
|
301
|
+
const domainError = validateEgressDomain(domain);
|
|
302
|
+
if (domainError !== undefined) {
|
|
303
|
+
warn(`hosting.egressDomains: ${domainError}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (egressDomains.length > MAX_EGRESS_DOMAINS) {
|
|
307
|
+
warn(`hosting.egressDomains lists ${egressDomains.length} domains; deploys are capped at ${MAX_EGRESS_DOMAINS}.`);
|
|
308
|
+
}
|
|
309
|
+
for (const name of (_b = hosting.secretNames) !== null && _b !== void 0 ? _b : []) {
|
|
310
|
+
const nameError = validateSecretName(name);
|
|
311
|
+
if (nameError !== undefined) {
|
|
312
|
+
warn(`hosting.secretNames: ${nameError}`);
|
|
313
|
+
}
|
|
314
|
+
else if (isReservedSecretName(name)) {
|
|
315
|
+
warn(`hosting.secretNames: ${JSON.stringify(name)} is platform-reserved (CURSOR_*) and injected automatically; it cannot be set with \`secrets set\`.`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return Object.assign(Object.assign({}, (hosting.egressDomains === undefined
|
|
319
|
+
? {}
|
|
320
|
+
: { egressDomains: [...hosting.egressDomains] })), (hosting.secretNames === undefined
|
|
321
|
+
? {}
|
|
322
|
+
: { secretNames: [...hosting.secretNames] }));
|
|
323
|
+
}
|
|
271
324
|
function loadAgentConfig(ctx, agentDir, isRoot) {
|
|
272
325
|
return __awaiter(this, void 0, void 0, function* () {
|
|
273
326
|
const configPath = yield findModuleFile(agentDir, "agent");
|
|
@@ -1088,6 +1141,19 @@ function loadABConfig(ctx, agentDir) {
|
|
|
1088
1141
|
}
|
|
1089
1142
|
});
|
|
1090
1143
|
}
|
|
1144
|
+
// ============================================================================
|
|
1145
|
+
// Storage (agent/storage.ts)
|
|
1146
|
+
// ============================================================================
|
|
1147
|
+
function loadStorage(ctx, agentDir) {
|
|
1148
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1149
|
+
const path = yield findModuleFile(agentDir, "storage");
|
|
1150
|
+
if (path === undefined) {
|
|
1151
|
+
return undefined;
|
|
1152
|
+
}
|
|
1153
|
+
const definition = yield importDefault(ctx, path, "storage");
|
|
1154
|
+
return definition;
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1091
1157
|
function resolveABName(definition, fallback) {
|
|
1092
1158
|
if (typeof definition === "object" &&
|
|
1093
1159
|
definition !== null &&
|
|
@@ -1161,7 +1227,7 @@ export function projectInfo(project) {
|
|
|
1161
1227
|
url: "/v1/session/:sessionId/approvals/:callId",
|
|
1162
1228
|
},
|
|
1163
1229
|
];
|
|
1164
|
-
return Object.assign(Object.assign({ name: project.name, model: agent.model, runtime: agent.runtime, cloud: agent.cloud === undefined ? undefined : toPublicCloudInfo(agent.cloud), local: agent.local, mcp: { path: MCP_ENDPOINT_PATH, tools: mcpEndpointToolNames(project) }, instructions: agent.instructions === undefined
|
|
1230
|
+
return Object.assign(Object.assign({ name: project.name, model: agent.model, runtime: agent.runtime, cloud: agent.cloud === undefined ? undefined : toPublicCloudInfo(agent.cloud), local: agent.local, hosting: agent.hosting, mcp: { path: MCP_ENDPOINT_PATH, tools: mcpEndpointToolNames(project) }, instructions: agent.instructions === undefined
|
|
1165
1231
|
? undefined
|
|
1166
1232
|
: {
|
|
1167
1233
|
chars: agent.instructions.length,
|
|
@@ -1232,7 +1298,9 @@ export function projectInfo(project) {
|
|
|
1232
1298
|
durableSamples: ((_b = project.abConfig) === null || _b === void 0 ? void 0 : _b.persistSamples) !== undefined,
|
|
1233
1299
|
durableSnapshots: ((_c = project.abConfig) === null || _c === void 0 ? void 0 : _c.persistSnapshots) !== undefined,
|
|
1234
1300
|
},
|
|
1235
|
-
})), {
|
|
1301
|
+
})), { storage: project.storage === undefined
|
|
1302
|
+
? undefined
|
|
1303
|
+
: { name: project.storage.name }, diagnostics: project.diagnostics });
|
|
1236
1304
|
}
|
|
1237
1305
|
// ============================================================================
|
|
1238
1306
|
// Shared helpers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../../src/internal/distribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,qEAAqE;AACrE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAA+B,CAAC;AAc/D;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAGhD;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAC/C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../../src/internal/distribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,qEAAqE;AACrE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAA+B,CAAC;AAc/D;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAGhD;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAC/C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAezC,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Runs against the live mount's loopback URL so case sessions appear in
|
|
7
7
|
* the playground session list.
|
|
8
8
|
*/
|
|
9
|
-
import { type EvalRunSnapshot } from "../evals.js";
|
|
9
|
+
import { type EvalRunPersistence, type EvalRunSnapshot } from "../evals.js";
|
|
10
10
|
export type { EvalBatchStatus, EvalCaseRunStatus as EvalCaseStatus, EvalCaseSnapshot, EvalRunSnapshot, } from "../evals.js";
|
|
11
11
|
export interface StartEvalRunInput {
|
|
12
12
|
filterIds?: string[];
|
|
@@ -24,6 +24,11 @@ export type EvalListConfig = {
|
|
|
24
24
|
export declare class EvalRunStore {
|
|
25
25
|
private readonly projectRoot;
|
|
26
26
|
private readonly logger;
|
|
27
|
+
/**
|
|
28
|
+
* Project-wide sink from `agent/storage.ts` (`defineStorage`),
|
|
29
|
+
* used when `evals.config.ts` sets no `persistRuns` of its own.
|
|
30
|
+
*/
|
|
31
|
+
private readonly fallbackPersistence?;
|
|
27
32
|
private readonly runs;
|
|
28
33
|
private activeRunId;
|
|
29
34
|
private hydratePromise;
|
|
@@ -32,7 +37,14 @@ export declare class EvalRunStore {
|
|
|
32
37
|
private readonly persistChains;
|
|
33
38
|
/** Filled after listen — e.g. `http://127.0.0.1:3000/weather-agent`. */
|
|
34
39
|
loopbackUrl: string | undefined;
|
|
35
|
-
constructor(projectRoot: string, logger: (line: string) => void
|
|
40
|
+
constructor(projectRoot: string, logger: (line: string) => void,
|
|
41
|
+
/**
|
|
42
|
+
* Project-wide sink from `agent/storage.ts` (`defineStorage`),
|
|
43
|
+
* used when `evals.config.ts` sets no `persistRuns` of its own.
|
|
44
|
+
*/
|
|
45
|
+
fallbackPersistence?: EvalRunPersistence | undefined);
|
|
46
|
+
/** `evals.config.ts` `persistRuns` wins; `defineStorage` is fallback. */
|
|
47
|
+
private resolvePersist;
|
|
36
48
|
list(): Promise<{
|
|
37
49
|
evals: Array<{
|
|
38
50
|
id: string;
|
|
@@ -57,7 +69,14 @@ export declare class EvalRunStore {
|
|
|
57
69
|
getActiveRunId(): string | undefined;
|
|
58
70
|
start(input?: StartEvalRunInput): Promise<EvalRunSnapshot>;
|
|
59
71
|
private sortedRuns;
|
|
60
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Hydrate playground eval history from durable persistence
|
|
74
|
+
* (`evals.config.ts` `persistRuns`, else the `defineStorage`
|
|
75
|
+
* fallback). Called eagerly from the serve startup restore step —
|
|
76
|
+
* alongside session restore — and lazily as a safety net by every read.
|
|
77
|
+
* Idempotent; concurrent callers share one pass.
|
|
78
|
+
*/
|
|
79
|
+
hydrate(): Promise<void>;
|
|
61
80
|
private hydrateFromPersistence;
|
|
62
81
|
private pruneOldRuns;
|
|
63
82
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eval-run-store.d.ts","sourceRoot":"","sources":["../../src/internal/eval-run-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"eval-run-store.d.ts","sourceRoot":"","sources":["../../src/internal/eval-run-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAErB,MAAM,aAAa,CAAC;AASrB,YAAY,EACV,eAAe,EACf,iBAAiB,IAAI,cAAc,EACnC,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAOF,qBAAa,YAAY;IAWrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAhBvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;IAC3D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAClE,wEAAwE;IACxE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC,YACmB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAC/C;;;OAGG;IACc,mBAAmB,CAAC,EAAE,kBAAkB,YAAA,EACvD;IAEJ,yEAAyE;IACzE,OAAO,CAAC,cAAc;IAMhB,IAAI,IAAI,OAAO,CAAC;QACpB,KAAK,EAAE,KAAK,CAAC;YACX,EAAE,EAAE,MAAM,CAAC;YACX,MAAM,EAAE,MAAM,CAAC;YACf,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;SACjB,CAAC,CAAC;QACH,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC,CAiBD;IAEK,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAG7D;IAED,+EAA+E;IACzE,QAAQ,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAG3C;IAED;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC;QAClC,IAAI,EAAE,eAAe,EAAE,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAOD;IAED,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnC;IAEK,KAAK,CAAC,KAAK,GAAE,iBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+DnE;IAED,OAAO,CAAC,UAAU;IAMlB;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7B;YAEa,sBAAsB;YAkDtB,YAAY;IAe1B;;;;OAIG;IACH,OAAO,CAAC,cAAc;YAgBR,WAAW;YAcX,aAAa;YAiBb,OAAO;IAmGrB,OAAO,CAAC,eAAe;CAqCxB;AAwDD,qBAAa,oBAAqB,SAAQ,KAAK;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM;IAAxC,YAAqB,WAAW,EAAE,MAAM,EAGvC;CACF;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,cAGC;CACF"}
|