@cursor/july 0.1.95 → 0.1.96
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 +3 -4
- package/dist/channels/deployments/types.d.ts +1 -1
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/deployments/types.js +1 -0
- package/dist/channels/origin/api.d.ts +59 -13
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +168 -27
- package/dist/channels/origin/binding.d.ts +2 -2
- package/dist/channels/origin/checks.d.ts +6 -6
- package/dist/channels/origin/checks.js +6 -6
- package/dist/channels/origin/cursor-account.d.ts +5 -3
- package/dist/channels/origin/cursor-account.d.ts.map +1 -1
- package/dist/channels/origin/cursor-account.js +5 -3
- package/dist/channels/slack/api.d.ts +9 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +36 -5
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +17 -46
- package/dist/channels/slack/dispatch.d.ts +7 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +47 -23
- package/dist/channels/slack/inbound.d.ts +8 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +32 -0
- package/dist/channels/slack/live-delivery.d.ts +26 -29
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +172 -73
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +5 -1
- package/dist/channels/slack/nudge-carrier.d.ts +2 -0
- package/dist/channels/slack/nudge-carrier.d.ts.map +1 -1
- package/dist/channels/slack/nudge-carrier.js +48 -1
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +2 -2
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.BBj0klBO.js → app.jXleCmOc.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DFoGuETX.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CUEXpL78.js → VPLocalSearchBox.8LhyglIT.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DabmQnia.js → theme.9ged-pr2.js} +2 -2
- package/dist/docs/assets/index.md.CI93Ltlb.js +5 -0
- package/dist/docs/assets/{index.md.BoHaMdeZ.lean.js → index.md.CI93Ltlb.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.BsMOxDvh.js → reference_cli.md.CCnG-nJx.js} +2 -1
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.js +2 -0
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.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 +4 -4
- package/dist/docs/evals.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +4 -4
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +4 -4
- package/dist/docs/guides/opentelemetry.html +4 -4
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +3 -1
- package/dist/docs/llms-full.txt +102 -3
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +7 -6
- package/dist/docs/reference/cli.md +3 -2
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +4 -4
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/code-wiki.html +28 -0
- package/dist/docs/templates/code-wiki.md +91 -0
- package/dist/docs/templates/demo.html +5 -5
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +5 -5
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/files-backends/cursor-hosted.d.ts +26 -4
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +32 -4
- package/dist/internal/advertise-tools.d.ts +2 -0
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +15 -1
- package/dist/internal/bounded.d.ts +7 -0
- package/dist/internal/bounded.d.ts.map +1 -0
- package/dist/internal/bounded.js +32 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +7 -1
- package/dist/internal/conversation-mirror.d.ts +11 -8
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +116 -55
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +22 -48
- package/dist/internal/cursor/session-token.d.ts +45 -0
- package/dist/internal/cursor/session-token.d.ts.map +1 -0
- package/dist/internal/cursor/session-token.js +99 -0
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +1 -0
- package/dist/internal/framework-file-storage.d.ts +61 -0
- package/dist/internal/framework-file-storage.d.ts.map +1 -0
- package/dist/internal/framework-file-storage.js +204 -0
- package/dist/internal/framework-storage-selection.d.ts +11 -5
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +38 -11
- package/dist/internal/hosted-delivery.d.ts +7 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +4 -0
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +2 -0
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +1 -3
- package/dist/internal/managed-delivery.d.ts +80 -0
- package/dist/internal/managed-delivery.d.ts.map +1 -0
- package/dist/internal/managed-delivery.js +86 -0
- package/dist/internal/runtime-dispatch-runner.d.ts +5 -1
- package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
- package/dist/internal/runtime-dispatch-runner.js +7 -0
- package/dist/internal/sdk-runner.d.ts +11 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +39 -8
- package/dist/internal/server.js +1 -0
- package/dist/internal/session-engine.d.ts +13 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +62 -3
- package/dist/internal/steering.d.ts +15 -0
- package/dist/internal/steering.d.ts.map +1 -0
- package/dist/internal/steering.js +18 -0
- package/dist/playground/assets/index-B1DDvBeC.css +1 -0
- package/dist/playground/assets/{index-CZA1uEWA.js → index-Cx9CclK_.js} +51 -51
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted.d.ts +8 -5
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +4 -3
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +3 -1
- package/docs/reference/cli.md +3 -2
- package/docs/templates/code-wiki.md +96 -0
- package/package.json +2 -2
- package/skills/ab/SKILL.md +13 -97
- package/skills/create-agent/SKILL.md +123 -223
- package/skills/debug/SKILL.md +34 -68
- package/skills/evals/SKILL.md +55 -180
- package/skills/framework-map/SKILL.md +83 -145
- package/skills/github/SKILL.md +53 -111
- package/skills/hillclimb/SKILL.md +40 -163
- package/skills/mcp-auth/SKILL.md +48 -107
- package/skills/otel/SKILL.md +22 -68
- package/skills/setup-slack/SKILL.md +77 -208
- package/src/channels/deployments/types.ts +1 -0
- package/src/channels/origin/api.ts +242 -30
- package/src/channels/origin/binding.ts +2 -2
- package/src/channels/origin/checks.ts +6 -6
- package/src/channels/origin/cursor-account.ts +5 -3
- package/src/channels/slack/api.ts +41 -5
- package/src/channels/slack/defaults.ts +15 -49
- package/src/channels/slack/dispatch.ts +56 -22
- package/src/channels/slack/inbound.ts +43 -0
- package/src/channels/slack/live-delivery.ts +235 -114
- package/src/channels/slack/manifest.ts +5 -1
- package/src/channels/slack/nudge-carrier.ts +48 -1
- package/src/channels/slack/slack-channel.ts +2 -0
- package/src/files-backends/cursor-hosted.ts +40 -7
- package/src/internal/advertise-tools.ts +18 -2
- package/src/internal/bounded.ts +28 -0
- package/src/internal/cli-deploy.ts +12 -0
- package/src/internal/conversation-mirror.ts +145 -69
- package/src/internal/cursor/backend-client.ts +34 -58
- package/src/internal/cursor/session-token.ts +115 -0
- package/src/internal/cursor-agent-template.ts +1 -0
- package/src/internal/framework-file-storage.ts +222 -0
- package/src/internal/framework-storage-selection.ts +51 -11
- package/src/internal/hosted-delivery.ts +10 -0
- package/src/internal/init-project.ts +2 -0
- package/src/internal/install-cursor-skills.ts +1 -4
- package/src/internal/managed-delivery.ts +125 -0
- package/src/internal/runtime-dispatch-runner.ts +10 -0
- package/src/internal/sdk-runner.ts +56 -8
- package/src/internal/server.ts +2 -0
- package/src/internal/session-engine.ts +64 -4
- package/src/internal/steering.ts +17 -0
- package/src/storage-backends/cursor-hosted.ts +9 -7
- package/src/types.ts +2 -1
- package/templates/code-wiki/README.md +34 -0
- package/templates/code-wiki/agent/agent.ts +8 -0
- package/templates/code-wiki/agent/channels/github.ts +144 -0
- package/templates/code-wiki/agent/instructions.md +39 -0
- package/templates/code-wiki/agent/lib/repos.ts +5 -0
- package/templates/code-wiki/agent/lib/wiki.ts +22 -0
- package/templates/code-wiki/agent/tools/apply_wiki.ts +219 -0
- package/templates/code-wiki/evals/evals.config.ts +5 -0
- package/templates/code-wiki/evals/wiki.eval.ts +132 -0
- package/templates/code-wiki/init.json +25 -0
- package/templates/code-wiki/package.json +18 -0
- package/templates/code-wiki/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.oqPawjiD.js +0 -1
- package/dist/docs/assets/index.md.BoHaMdeZ.js +0 -5
- package/dist/internal/deployment-scm-event-stream.d.ts +0 -116
- package/dist/internal/deployment-scm-event-stream.d.ts.map +0 -1
- package/dist/internal/deployment-scm-event-stream.js +0 -474
- package/dist/playground/assets/index-CF7hUDnQ.css +0 -1
- package/src/internal/deployment-scm-event-stream.ts +0 -593
- /package/dist/docs/assets/{reference_cli.md.BsMOxDvh.lean.js → reference_cli.md.CCnG-nJx.lean.js} +0 -0
|
@@ -51,6 +51,17 @@ import { type FileSink, type FileSinkBody } from "../files.js";
|
|
|
51
51
|
* service account yet) has no store, and this backend is not selected.
|
|
52
52
|
*/
|
|
53
53
|
export declare const AGENT_SERVE_STORE_SOURCE_ID_ENV_VAR = "AGENT_SERVE_STORE_SOURCE_ID";
|
|
54
|
+
/**
|
|
55
|
+
* The deployment's **framework-level** file store, distinct from the
|
|
56
|
+
* user-level store above. The user store carries author-facing bytes
|
|
57
|
+
* (`ctx.host.files`, skills, memory, artifacts) and is browsable and
|
|
58
|
+
* mountable; the framework store carries engine-owned session state —
|
|
59
|
+
* session records, event transcripts, continuation index, and the SDK
|
|
60
|
+
* conversation mirror — and is never exposed to authors or models.
|
|
61
|
+
* Provisioned by the v2 deploy pipeline alongside the user store; v1
|
|
62
|
+
* deployments have only the user store.
|
|
63
|
+
*/
|
|
64
|
+
export declare const AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_ENV_VAR = "AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID";
|
|
54
65
|
/**
|
|
55
66
|
* True on Cursor-managed hosting with a provisioned file store.
|
|
56
67
|
*
|
|
@@ -61,6 +72,14 @@ export declare const AGENT_SERVE_STORE_SOURCE_ID_ENV_VAR = "AGENT_SERVE_STORE_SO
|
|
|
61
72
|
* loudly when the sink is used.
|
|
62
73
|
*/
|
|
63
74
|
export declare function isCursorHostedFilesAvailable(env?: NodeJS.ProcessEnv): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* The framework-level store's source id, or `undefined` when the deployment
|
|
77
|
+
* has none (v1, self-hosted, or a v2 deploy predating framework-store
|
|
78
|
+
* provisioning). Same detection posture as
|
|
79
|
+
* {@link isCursorHostedFilesAvailable}: keyed on the id alone — a missing
|
|
80
|
+
* credential must fail loudly at use, not silently deselect the store.
|
|
81
|
+
*/
|
|
82
|
+
export declare function cursorFrameworkStoreSourceId(env?: NodeJS.ProcessEnv): string | undefined;
|
|
64
83
|
/**
|
|
65
84
|
* Local `serve`/`run` with a personal `CURSOR_API_KEY` can address
|
|
66
85
|
* `/v0/agent-serve-files/user`. Hosted deployments have a store source id
|
|
@@ -70,12 +89,15 @@ export declare function isCursorUserStoreFilesAvailable(env?: NodeJS.ProcessEnv)
|
|
|
70
89
|
export interface CursorHostedFilesOptions {
|
|
71
90
|
/** Control-plane base URL (default: `CURSOR_API_BASE_URL`, else api.cursor.com). */
|
|
72
91
|
baseUrl?: string;
|
|
92
|
+
/** Bearer credential (default: `CURSOR_API_KEY`). */
|
|
93
|
+
apiKey?: string;
|
|
73
94
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* file after serve start.
|
|
95
|
+
* Lazy credential, re-resolved on every call and preferred over
|
|
96
|
+
* {@link apiKey} — hosted freeze snapshots listen unsigned and bind the
|
|
97
|
+
* key file after serve start. Kept separate so `apiKey` stays a plain
|
|
98
|
+
* string.
|
|
77
99
|
*/
|
|
78
|
-
|
|
100
|
+
resolveApiKey?: () => string | undefined;
|
|
79
101
|
/** File store to address (default: `AGENT_SERVE_STORE_SOURCE_ID`). */
|
|
80
102
|
storeSourceId?: string;
|
|
81
103
|
/** Test seam; defaults to global fetch. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-hosted.d.ts","sourceRoot":"","sources":["../../src/files-backends/cursor-hosted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAGH,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,YAAY,EAGlB,MAAM,aAAa,CAAC;AAWrB;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,gCACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor-hosted.d.ts","sourceRoot":"","sources":["../../src/files-backends/cursor-hosted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAGH,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,YAAY,EAGlB,MAAM,aAAa,CAAC;AAWrB;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,gCACjB,CAAC;AAEhC;;;;;;;;;GASG;AACH,eAAO,MAAM,6CAA6C,0CACjB,CAAC;AAgB1C;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAGT;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAYT;AAED,MAAM,WAAW,wBAAwB;IACvC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAuCD,KAAK,kBAAkB,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG;IAChD,gFAAgF;IAChF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;CACrD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,kBAAkB,CAwXpB"}
|
|
@@ -68,6 +68,17 @@ const AGENT_SERVE_FILES_PATH = "/v0/agent-serve-files";
|
|
|
68
68
|
* service account yet) has no store, and this backend is not selected.
|
|
69
69
|
*/
|
|
70
70
|
export const AGENT_SERVE_STORE_SOURCE_ID_ENV_VAR = "AGENT_SERVE_STORE_SOURCE_ID";
|
|
71
|
+
/**
|
|
72
|
+
* The deployment's **framework-level** file store, distinct from the
|
|
73
|
+
* user-level store above. The user store carries author-facing bytes
|
|
74
|
+
* (`ctx.host.files`, skills, memory, artifacts) and is browsable and
|
|
75
|
+
* mountable; the framework store carries engine-owned session state —
|
|
76
|
+
* session records, event transcripts, continuation index, and the SDK
|
|
77
|
+
* conversation mirror — and is never exposed to authors or models.
|
|
78
|
+
* Provisioned by the v2 deploy pipeline alongside the user store; v1
|
|
79
|
+
* deployments have only the user store.
|
|
80
|
+
*/
|
|
81
|
+
export const AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_ENV_VAR = "AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID";
|
|
71
82
|
/** Cap on the per-process etag cache; a miss costs a lookup, not correctness. */
|
|
72
83
|
const MAX_REMEMBERED_ETAGS = 1000;
|
|
73
84
|
/** Bounded directory page for point lookups. */
|
|
@@ -94,6 +105,18 @@ export function isCursorHostedFilesAvailable(env = process.env) {
|
|
|
94
105
|
const sourceId = (_a = env[AGENT_SERVE_STORE_SOURCE_ID_ENV_VAR]) === null || _a === void 0 ? void 0 : _a.trim();
|
|
95
106
|
return sourceId !== undefined && sourceId !== "";
|
|
96
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* The framework-level store's source id, or `undefined` when the deployment
|
|
110
|
+
* has none (v1, self-hosted, or a v2 deploy predating framework-store
|
|
111
|
+
* provisioning). Same detection posture as
|
|
112
|
+
* {@link isCursorHostedFilesAvailable}: keyed on the id alone — a missing
|
|
113
|
+
* credential must fail loudly at use, not silently deselect the store.
|
|
114
|
+
*/
|
|
115
|
+
export function cursorFrameworkStoreSourceId(env = process.env) {
|
|
116
|
+
var _a;
|
|
117
|
+
const sourceId = (_a = env[AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_ENV_VAR]) === null || _a === void 0 ? void 0 : _a.trim();
|
|
118
|
+
return sourceId === undefined || sourceId === "" ? undefined : sourceId;
|
|
119
|
+
}
|
|
97
120
|
/**
|
|
98
121
|
* Local `serve`/`run` with a personal `CURSOR_API_KEY` can address
|
|
99
122
|
* `/v0/agent-serve-files/user`. Hosted deployments have a store source id
|
|
@@ -179,7 +202,11 @@ export function cursorHostedFiles(options = {}) {
|
|
|
179
202
|
}
|
|
180
203
|
out.push(toEntry(file, file.path));
|
|
181
204
|
}
|
|
182
|
-
|
|
205
|
+
// The FileSink contract promises key order, and transcript-chunk
|
|
206
|
+
// consumers depend on it (chunk keys are zero-padded so key order
|
|
207
|
+
// is append order). The server happens to scan in order today; do
|
|
208
|
+
// not let that be the only thing holding the contract.
|
|
209
|
+
return out.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
183
210
|
}
|
|
184
211
|
// The unscoped listing was truncated (`complete: false`) and has no
|
|
185
212
|
// continuation to follow. `list()` promises the whole scope, so rather
|
|
@@ -504,9 +531,10 @@ function resolveStoreSourceId(options) {
|
|
|
504
531
|
return id;
|
|
505
532
|
}
|
|
506
533
|
function resolveApiKey(options) {
|
|
507
|
-
var _a;
|
|
508
|
-
|
|
509
|
-
const
|
|
534
|
+
var _a, _b;
|
|
535
|
+
var _c;
|
|
536
|
+
const configured = (_c = (_a = options.resolveApiKey) === null || _a === void 0 ? void 0 : _a.call(options)) !== null && _c !== void 0 ? _c : options.apiKey;
|
|
537
|
+
const key = (_b = (configured !== null && configured !== void 0 ? configured : process.env.CURSOR_API_KEY)) === null || _b === void 0 ? void 0 : _b.trim();
|
|
510
538
|
if (key === undefined || key === "") {
|
|
511
539
|
throw new Error("cursorHostedFiles requires CURSOR_API_KEY (deployment pod credential on Cursor hosting)");
|
|
512
540
|
}
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
* `defineConnection({ effects })` filters the listing before names are
|
|
28
28
|
* assigned: only tools whose MCP annotations classify as an intended
|
|
29
29
|
* effect are advertised. Unclassified tools are omitted, not guessed.
|
|
30
|
+
* Tools whose `annotations.title` is `do-not-call` are dropped as well
|
|
31
|
+
* (vendor host-UI / MCP Apps helpers that still carry `readOnlyHint`).
|
|
30
32
|
*/
|
|
31
33
|
import type { DiscoveredConnection, DiscoveredTool, HostMcpCallResult, HostMcpToolInfo, ResolvedAgent, SessionInfo } from "../types.js";
|
|
32
34
|
import type { HostMcpOneOff } from "./mcp-host.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advertise-tools.d.ts","sourceRoot":"","sources":["../../src/internal/advertise-tools.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"advertise-tools.d.ts","sourceRoot":"","sources":["../../src/internal/advertise-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,eAAe,EAGf,aAAa,EACb,WAAW,EAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAOnD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9D,QAAQ,CACN,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,MAAM,CAAC,UAAU,EAAE,oBAAoB,GAAG,aAAa,CAAC;CACzD;AAED;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAiC,CAAC;AAO7E,2DAA2D;AAC3D,MAAM,WAAW,oBAAoB;IACnC,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxC,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,gBAAgB,CAAC;IAC1B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE,0DAA0D;IAC1D,SAAS,CAAC,EAAE,CACV,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,gBAAgB,KACtB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACpC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAsC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAwB/B;AAsHD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAkBR"}
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
* `defineConnection({ effects })` filters the listing before names are
|
|
28
28
|
* assigned: only tools whose MCP annotations classify as an intended
|
|
29
29
|
* effect are advertised. Unclassified tools are omitted, not guessed.
|
|
30
|
+
* Tools whose `annotations.title` is `do-not-call` are dropped as well
|
|
31
|
+
* (vendor host-UI / MCP Apps helpers that still carry `readOnlyHint`).
|
|
30
32
|
*/
|
|
31
33
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
32
34
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -80,7 +82,8 @@ export function resolveAdvertisedTools(args) {
|
|
|
80
82
|
}
|
|
81
83
|
throw new Error(`Failed to list tools on advertised connection "${connection.name}": ${describeError(error)}`, { cause: error });
|
|
82
84
|
}
|
|
83
|
-
const intended = listed.filter((info) =>
|
|
85
|
+
const intended = listed.filter((info) => !isDoNotCallTool(info.annotations) &&
|
|
86
|
+
matchesIntendedEffects(info.annotations, connection.effects));
|
|
84
87
|
const exposed = exposeListedTools(intended, claimed);
|
|
85
88
|
for (const { info, exposedName } of exposed) {
|
|
86
89
|
resolved.push(toDiscoveredTool(connection, info, exposedName, source));
|
|
@@ -157,6 +160,17 @@ function exposeListedTools(listed, claimed) {
|
|
|
157
160
|
exposedName: exposedNameByInfo.get(info),
|
|
158
161
|
}));
|
|
159
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Vendors (Datadog MCP Apps) stamp host-UI-only helpers with this title.
|
|
165
|
+
* They still look like reads (`readOnlyHint: true`), so the effects
|
|
166
|
+
* filter would keep them. The model and agsh should not see them; the
|
|
167
|
+
* raw MCP listing stays intact for the host.
|
|
168
|
+
*/
|
|
169
|
+
const DO_NOT_CALL_TITLE = "do-not-call";
|
|
170
|
+
function isDoNotCallTool(annotations) {
|
|
171
|
+
var _a;
|
|
172
|
+
return ((_a = annotations === null || annotations === void 0 ? void 0 : annotations.title) === null || _a === void 0 ? void 0 : _a.trim()) === DO_NOT_CALL_TITLE;
|
|
173
|
+
}
|
|
160
174
|
function matchesIntendedEffects(annotations, effects) {
|
|
161
175
|
if (effects === undefined) {
|
|
162
176
|
return true;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded-concurrency map, in input order. Local rather than
|
|
3
|
+
* `@anysphere/utils`: this published package cannot depend on monorepo
|
|
4
|
+
* internals.
|
|
5
|
+
*/
|
|
6
|
+
export declare function mapBounded<T, R>(items: readonly T[], max: number, run: (item: T) => Promise<R>): Promise<R[]>;
|
|
7
|
+
//# sourceMappingURL=bounded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded.d.ts","sourceRoot":"","sources":["../../src/internal/bounded.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,CAAC,EACnC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,CAAC,EAAE,CAAC,CAkBd"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Bounded-concurrency map, in input order. Local rather than
|
|
12
|
+
* `@anysphere/utils`: this published package cannot depend on monorepo
|
|
13
|
+
* internals.
|
|
14
|
+
*/
|
|
15
|
+
export function mapBounded(items, max, run) {
|
|
16
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17
|
+
const out = new Array(items.length);
|
|
18
|
+
let nextIndex = 0;
|
|
19
|
+
const workers = Array.from({ length: Math.min(max, items.length) }, () => __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
for (;;) {
|
|
21
|
+
const index = nextIndex;
|
|
22
|
+
nextIndex += 1;
|
|
23
|
+
if (index >= items.length) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
out[index] = yield run(items[index]);
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
yield Promise.all(workers);
|
|
30
|
+
return out;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,OAAO,EAKL,sBAAsB,EAevB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ import { authorizeCursorAccountConnectors } from "./cursor-account-mcp-auth.js";
|
|
|
27
27
|
import { readDeployTemplate } from "./cursor-agent-template.js";
|
|
28
28
|
import { AgentServeDeployClient, DeployApiError, deploymentServiceAccountId, slugFromDirectoryName, TERMINAL_AGENTKIT_DEPLOY_STATUSES, TERMINAL_DEPLOY_STATUSES, validateDeploymentSlug, } from "./deploy-client.js";
|
|
29
29
|
import { inferDeployGitSource } from "./deploy-source.js";
|
|
30
|
-
import { isAgentProjectDir, listChildAgentDirs, loadAgentProject, } from "./discovery.js";
|
|
30
|
+
import { formatDiagnostics, hasErrorDiagnostics, isAgentProjectDir, listChildAgentDirs, loadAgentProject, } from "./discovery.js";
|
|
31
31
|
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
32
32
|
import { isReservedSecretName, isValidCursorEventRepo, validateSettableSecretName, } from "./hosting.js";
|
|
33
33
|
import { deployProgressLabel, sanitizeCustomerError } from "./logs-client.js";
|
|
@@ -790,6 +790,12 @@ function readDeployManifest(dir) {
|
|
|
790
790
|
return __awaiter(this, void 0, void 0, function* () {
|
|
791
791
|
var _a;
|
|
792
792
|
const project = yield loadAgentProject(dir);
|
|
793
|
+
// Fail here, before anything is dispatched: a project with error
|
|
794
|
+
// diagnostics (e.g. agent/storage.ts on architecture v2) would only be
|
|
795
|
+
// refused later by `serve` inside the hosted build, wasting a bake.
|
|
796
|
+
if (hasErrorDiagnostics(project)) {
|
|
797
|
+
throw new Error(`Refusing to deploy ${project.name} — it has errors:\n${formatDiagnostics(project.diagnostics.filter((d) => d.severity === "error"))}`);
|
|
798
|
+
}
|
|
793
799
|
return {
|
|
794
800
|
hosting: project.agent.hosting,
|
|
795
801
|
architecture: project.agent.architecture,
|
|
@@ -12,12 +12,13 @@
|
|
|
12
12
|
* This module mirrors the conversation through the SDK's own store APIs —
|
|
13
13
|
* the agent document (which carries `sdkMetadata.blobEncryptionKey`, without
|
|
14
14
|
* which the checkpoint blobs cannot be decrypted) plus its content-addressed
|
|
15
|
-
* checkpoint blobs — into the deployment's
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* checkpoint blobs — into the deployment's **framework-level** file store
|
|
16
|
+
* (`AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID`), alongside session records and
|
|
17
|
+
* transcripts and apart from the author-facing user store. The store is an
|
|
18
|
+
* Agent Store reached over `/v0/agent-serve-files` presigned URLs — **not
|
|
19
|
+
* mounted** as a filesystem in the engine VM (the FUSE mount at
|
|
20
|
+
* {@link DEPLOYMENT_STORE_MOUNT_PATH} exists only on cloud-runtime VMs) —
|
|
21
|
+
* so the mirror moves bytes through the {@link FileSink} contract instead.
|
|
21
22
|
*
|
|
22
23
|
* Going through the store APIs rather than copying `store.db` files sidesteps
|
|
23
24
|
* WAL consistency and the shared `index.db` (per-session raw copies would
|
|
@@ -71,8 +72,10 @@ export declare function createConversationMirror(options: CreateConversationMirr
|
|
|
71
72
|
*
|
|
72
73
|
* Selected for architecture-v2 agents on Cursor-managed hosting — the same
|
|
73
74
|
* generation signal as framework-storage-selection.ts, plus a provisioned
|
|
74
|
-
*
|
|
75
|
-
*
|
|
75
|
+
* **framework-level** file store: conversation state is engine-owned, so it
|
|
76
|
+
* lives with session records and transcripts, never on the author-facing
|
|
77
|
+
* user store. Self-hosted v2 keeps everything on the state root (the
|
|
78
|
+
* operator owns the disk), and v1 keeps today's behavior while it runs.
|
|
76
79
|
*/
|
|
77
80
|
export declare function selectConversationMirror(input: {
|
|
78
81
|
project: AgentProject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-mirror.d.ts","sourceRoot":"","sources":["../../src/internal/conversation-mirror.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"conversation-mirror.d.ts","sourceRoot":"","sources":["../../src/internal/conversation-mirror.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAsB,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAYD,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,QAAQ,CAAC;IACf,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,kEAAkE;AAClE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,kBAAkB,CAqMpB;AA6ED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C,GAAG,kBAAkB,GAAG,SAAS,CAyBjC"}
|
|
@@ -12,12 +12,13 @@
|
|
|
12
12
|
* This module mirrors the conversation through the SDK's own store APIs —
|
|
13
13
|
* the agent document (which carries `sdkMetadata.blobEncryptionKey`, without
|
|
14
14
|
* which the checkpoint blobs cannot be decrypted) plus its content-addressed
|
|
15
|
-
* checkpoint blobs — into the deployment's
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* checkpoint blobs — into the deployment's **framework-level** file store
|
|
16
|
+
* (`AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID`), alongside session records and
|
|
17
|
+
* transcripts and apart from the author-facing user store. The store is an
|
|
18
|
+
* Agent Store reached over `/v0/agent-serve-files` presigned URLs — **not
|
|
19
|
+
* mounted** as a filesystem in the engine VM (the FUSE mount at
|
|
20
|
+
* {@link DEPLOYMENT_STORE_MOUNT_PATH} exists only on cloud-runtime VMs) —
|
|
21
|
+
* so the mirror moves bytes through the {@link FileSink} contract instead.
|
|
21
22
|
*
|
|
22
23
|
* Going through the store APIs rather than copying `store.db` files sidesteps
|
|
23
24
|
* WAL consistency and the shared `index.db` (per-session raw copies would
|
|
@@ -44,7 +45,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
44
45
|
});
|
|
45
46
|
};
|
|
46
47
|
import { agentStoreKeys } from "../files.js";
|
|
47
|
-
import {
|
|
48
|
+
import { cursorFrameworkStoreSourceId, cursorHostedFiles, } from "../files-backends/cursor-hosted.js";
|
|
49
|
+
import { mapBounded } from "./bounded.js";
|
|
48
50
|
import { resolveApiKeySync } from "./cursor/credentials.js";
|
|
49
51
|
import { AGENT_SERVE_GENERATION_ENV_VAR } from "./cursor-relay-core.js";
|
|
50
52
|
import { describeError } from "./describe-error.js";
|
|
@@ -53,41 +55,66 @@ export function createConversationMirror(options) {
|
|
|
53
55
|
var _a;
|
|
54
56
|
const { sink, agentName } = options;
|
|
55
57
|
const logger = (_a = options.logger) !== null && _a !== void 0 ? _a : (() => { });
|
|
56
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Blob ids known to be in the sink, per SDK agent id (upload dedupe).
|
|
60
|
+
* Bounded oldest-out like the files backend's etag cache: a resident
|
|
61
|
+
* engine touches an unbounded number of conversations over its lifetime,
|
|
62
|
+
* and a miss costs one manifest read, never correctness.
|
|
63
|
+
*/
|
|
57
64
|
const mirrored = new Map();
|
|
65
|
+
const rememberMirrored = (sdkAgentId, blobIds) => {
|
|
66
|
+
if (!mirrored.has(sdkAgentId) &&
|
|
67
|
+
mirrored.size >= MAX_TRACKED_CONVERSATIONS) {
|
|
68
|
+
const oldest = mirrored.keys().next();
|
|
69
|
+
if (!oldest.done) {
|
|
70
|
+
mirrored.delete(oldest.value);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
mirrored.set(sdkAgentId, blobIds);
|
|
74
|
+
};
|
|
58
75
|
/**
|
|
59
76
|
* Per-conversation serialization so a persist cannot interleave with a
|
|
60
|
-
* hydrate (or another persist) for the same conversation.
|
|
77
|
+
* hydrate (or another persist) for the same conversation. Entries are
|
|
78
|
+
* removed once their chain settles as the tail, so the map tracks only
|
|
79
|
+
* conversations with work in flight.
|
|
61
80
|
*/
|
|
62
81
|
const chains = new Map();
|
|
63
82
|
function serialize(sdkAgentId, run) {
|
|
64
83
|
var _a;
|
|
65
84
|
const previous = (_a = chains.get(sdkAgentId)) !== null && _a !== void 0 ? _a : Promise.resolve();
|
|
66
85
|
const next = previous.then(run, run);
|
|
67
|
-
|
|
86
|
+
const stored = next
|
|
87
|
+
.catch(() => { })
|
|
88
|
+
.then(() => {
|
|
89
|
+
if (chains.get(sdkAgentId) === stored) {
|
|
90
|
+
chains.delete(sdkAgentId);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
chains.set(sdkAgentId, stored);
|
|
68
94
|
return next;
|
|
69
95
|
}
|
|
70
96
|
function mirroredBlobIds(sdkAgentId) {
|
|
71
97
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
var _a;
|
|
73
98
|
const cached = mirrored.get(sdkAgentId);
|
|
74
99
|
if (cached !== undefined) {
|
|
75
100
|
return cached;
|
|
76
101
|
}
|
|
77
102
|
// Seed from the previous manifest so a fresh pod does not re-upload the
|
|
78
|
-
// whole history on its first persist. A miss
|
|
79
|
-
// empty — re-uploading is wasteful, never wrong.
|
|
103
|
+
// whole history on its first persist. A miss, an unusable manifest, or
|
|
104
|
+
// a failed read seeds empty — re-uploading is wasteful, never wrong.
|
|
80
105
|
const seeded = new Set();
|
|
81
106
|
try {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
107
|
+
const read = yield readManifest(sink, agentName, sdkAgentId);
|
|
108
|
+
if (read.outcome === "found") {
|
|
109
|
+
for (const blobId of read.manifest.blobIds) {
|
|
110
|
+
seeded.add(blobId);
|
|
111
|
+
}
|
|
85
112
|
}
|
|
86
113
|
}
|
|
87
114
|
catch (error) {
|
|
88
115
|
logger(`[agent-sdk] conversation mirror: could not read the prior manifest for ${sdkAgentId} (${describeError(error)}); re-uploading blobs`);
|
|
89
116
|
}
|
|
90
|
-
|
|
117
|
+
rememberMirrored(sdkAgentId, seeded);
|
|
91
118
|
return seeded;
|
|
92
119
|
});
|
|
93
120
|
}
|
|
@@ -135,75 +162,105 @@ export function createConversationMirror(options) {
|
|
|
135
162
|
if (existing !== null) {
|
|
136
163
|
return false;
|
|
137
164
|
}
|
|
138
|
-
const
|
|
139
|
-
if (
|
|
165
|
+
const read = yield readManifest(sink, agentName, sdkAgentId);
|
|
166
|
+
if (read.outcome === "miss") {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
if (read.outcome === "unusable") {
|
|
170
|
+
// Definitive, non-transient state (a future manifest version
|
|
171
|
+
// during a rolling redeploy, or corruption): retrying would fail
|
|
172
|
+
// identically forever, so fall through to the caller's
|
|
173
|
+
// fresh-conversation path instead of wedging the session.
|
|
174
|
+
logger(`[agent-sdk] conversation mirror: the manifest for ${sdkAgentId} is unusable (${read.reason}); treating the conversation as unrestorable`);
|
|
140
175
|
return false;
|
|
141
176
|
}
|
|
177
|
+
const manifest = read.manifest;
|
|
142
178
|
const rootBlobId = (_a = manifest.agent.latestCheckpoint) === null || _a === void 0 ? void 0 : _a.rootBlobId;
|
|
179
|
+
if (rootBlobId === undefined ||
|
|
180
|
+
!manifest.blobIds.includes(rootBlobId)) {
|
|
181
|
+
logger(`[agent-sdk] conversation mirror: the manifest for ${sdkAgentId} does not list its root checkpoint blob; treating the conversation as unrestorable`);
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
// Bounded-parallel downloads: this sits on the resume critical path
|
|
185
|
+
// (a presign plus an object GET per blob against the hosted sink).
|
|
186
|
+
const bodies = yield mapBounded(manifest.blobIds, HYDRATE_DOWNLOAD_CONCURRENCY, (blobId) => __awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
return ({
|
|
188
|
+
blobId,
|
|
189
|
+
body: yield sink.get(agentStoreKeys.conversationBlob(agentName, sdkAgentId, blobId)),
|
|
190
|
+
});
|
|
191
|
+
}));
|
|
192
|
+
const missing = bodies.filter((entry) => entry.body === undefined);
|
|
193
|
+
if (missing.length > 0) {
|
|
194
|
+
// The manifest lists exactly what a previous persist uploaded, so
|
|
195
|
+
// any definitive absence is store loss — and the checkpoint graph
|
|
196
|
+
// may reach any listed blob, not just the root. Restoring a
|
|
197
|
+
// partial graph would create an agent row whose resume succeeds
|
|
198
|
+
// and whose checkpoint walk then fails unrecoverably.
|
|
199
|
+
logger(`[agent-sdk] conversation mirror: ${missing.length} checkpoint blob(s) for ${sdkAgentId} are missing from the sink; treating the conversation as unrestorable`);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
143
202
|
const restored = new Set();
|
|
144
|
-
for (const
|
|
145
|
-
const body =
|
|
146
|
-
const bytes = body
|
|
147
|
-
|
|
148
|
-
:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (bytes === undefined) {
|
|
152
|
-
// Definitive absence (never uploaded, or deleted). A missing
|
|
153
|
-
// root blob makes the conversation unrestorable — fall through
|
|
154
|
-
// to the caller's fresh-conversation path rather than creating
|
|
155
|
-
// an agent row whose checkpoint cannot load.
|
|
156
|
-
if (blobId === rootBlobId) {
|
|
157
|
-
logger(`[agent-sdk] conversation mirror: the root checkpoint blob for ${sdkAgentId} is missing from the sink; treating the conversation as unrestorable`);
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
if ((yield store.checkpoints.get({ agentId: sdkAgentId, blobId })) ===
|
|
163
|
-
null) {
|
|
203
|
+
for (const entry of bodies) {
|
|
204
|
+
const body = entry.body;
|
|
205
|
+
const bytes = body instanceof Uint8Array ? body : body.body;
|
|
206
|
+
if ((yield store.checkpoints.get({
|
|
207
|
+
agentId: sdkAgentId,
|
|
208
|
+
blobId: entry.blobId,
|
|
209
|
+
})) === null) {
|
|
164
210
|
yield store.checkpoints.create({
|
|
165
211
|
agentId: sdkAgentId,
|
|
166
|
-
blobId,
|
|
212
|
+
blobId: entry.blobId,
|
|
167
213
|
data: bytes,
|
|
168
214
|
});
|
|
169
215
|
}
|
|
170
|
-
restored.add(blobId);
|
|
171
|
-
}
|
|
172
|
-
if (rootBlobId !== undefined && !restored.has(rootBlobId)) {
|
|
173
|
-
logger(`[agent-sdk] conversation mirror: the manifest for ${sdkAgentId} does not list its root checkpoint blob; treating the conversation as unrestorable`);
|
|
174
|
-
return false;
|
|
216
|
+
restored.add(entry.blobId);
|
|
175
217
|
}
|
|
176
218
|
yield store.agents.create({
|
|
177
219
|
agent: Object.assign(Object.assign({}, manifest.agent), { activeRunId: null }),
|
|
178
220
|
});
|
|
179
|
-
|
|
221
|
+
rememberMirrored(sdkAgentId, restored);
|
|
180
222
|
logger(`[agent-sdk] conversation mirror: restored the conversation for ${sdkAgentId} (${restored.size} checkpoint blob(s))`);
|
|
181
223
|
return true;
|
|
182
224
|
}));
|
|
183
225
|
},
|
|
184
226
|
};
|
|
185
227
|
}
|
|
228
|
+
/** Oldest-out cap on the per-conversation upload-dedupe cache. */
|
|
229
|
+
const MAX_TRACKED_CONVERSATIONS = 1000;
|
|
230
|
+
/** Parallel blob downloads during hydrate (resume critical path). */
|
|
231
|
+
const HYDRATE_DOWNLOAD_CONCURRENCY = 8;
|
|
232
|
+
/**
|
|
233
|
+
* Read the persisted manifest. Sink transport failures propagate (an
|
|
234
|
+
* outage must fail the follow-up, not fork the thread); everything the
|
|
235
|
+
* bytes themselves can be wrong about is reported as `unusable`.
|
|
236
|
+
*/
|
|
186
237
|
function readManifest(sink, agentName, sdkAgentId) {
|
|
187
238
|
return __awaiter(this, void 0, void 0, function* () {
|
|
188
239
|
const body = yield sink.get(agentStoreKeys.conversationManifest(agentName, sdkAgentId));
|
|
189
240
|
if (body === undefined) {
|
|
190
|
-
return
|
|
241
|
+
return { outcome: "miss" };
|
|
191
242
|
}
|
|
192
243
|
const bytes = body instanceof Uint8Array ? body : body.body;
|
|
193
|
-
|
|
244
|
+
let parsed;
|
|
245
|
+
try {
|
|
246
|
+
parsed = JSON.parse(new TextDecoder().decode(bytes));
|
|
247
|
+
}
|
|
248
|
+
catch (_a) {
|
|
249
|
+
return { outcome: "unusable", reason: "not JSON" };
|
|
250
|
+
}
|
|
194
251
|
if (parsed === null ||
|
|
195
252
|
typeof parsed !== "object" ||
|
|
196
253
|
parsed.v !== 1) {
|
|
197
|
-
|
|
254
|
+
return { outcome: "unusable", reason: "unsupported manifest version" };
|
|
198
255
|
}
|
|
199
256
|
const manifest = parsed;
|
|
200
257
|
if (manifest.agent === null ||
|
|
201
258
|
typeof manifest.agent !== "object" ||
|
|
202
259
|
manifest.agent.agentId !== sdkAgentId ||
|
|
203
260
|
!Array.isArray(manifest.blobIds)) {
|
|
204
|
-
|
|
261
|
+
return { outcome: "unusable", reason: "malformed manifest" };
|
|
205
262
|
}
|
|
206
|
-
return manifest;
|
|
263
|
+
return { outcome: "found", manifest };
|
|
207
264
|
});
|
|
208
265
|
}
|
|
209
266
|
function listCheckpointBlobIds(store, sdkAgentId) {
|
|
@@ -225,8 +282,10 @@ function listCheckpointBlobIds(store, sdkAgentId) {
|
|
|
225
282
|
*
|
|
226
283
|
* Selected for architecture-v2 agents on Cursor-managed hosting — the same
|
|
227
284
|
* generation signal as framework-storage-selection.ts, plus a provisioned
|
|
228
|
-
*
|
|
229
|
-
*
|
|
285
|
+
* **framework-level** file store: conversation state is engine-owned, so it
|
|
286
|
+
* lives with session records and transcripts, never on the author-facing
|
|
287
|
+
* user store. Self-hosted v2 keeps everything on the state root (the
|
|
288
|
+
* operator owns the disk), and v1 keeps today's behavior while it runs.
|
|
230
289
|
*/
|
|
231
290
|
export function selectConversationMirror(input) {
|
|
232
291
|
var _a;
|
|
@@ -234,16 +293,18 @@ export function selectConversationMirror(input) {
|
|
|
234
293
|
return undefined;
|
|
235
294
|
}
|
|
236
295
|
const env = (_a = input.env) !== null && _a !== void 0 ? _a : process.env;
|
|
296
|
+
const frameworkStoreId = cursorFrameworkStoreSourceId(env);
|
|
237
297
|
if (env[AGENT_SERVE_GENERATION_ENV_VAR] === undefined ||
|
|
238
|
-
|
|
298
|
+
frameworkStoreId === undefined) {
|
|
239
299
|
return undefined;
|
|
240
300
|
}
|
|
241
301
|
return createConversationMirror({
|
|
242
302
|
sink: cursorHostedFiles({
|
|
303
|
+
storeSourceId: frameworkStoreId,
|
|
243
304
|
// Full chain (env → key file → stored login): frozen engines listen
|
|
244
305
|
// unsigned and bind CURSOR_API_KEY_FILE at task time, after this sink
|
|
245
306
|
// is constructed.
|
|
246
|
-
|
|
307
|
+
resolveApiKey: () => { var _a; return (_a = resolveApiKeySync()) === null || _a === void 0 ? void 0 : _a.apiKey; },
|
|
247
308
|
}),
|
|
248
309
|
agentName: input.project.name,
|
|
249
310
|
logger: input.logger,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-client.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/backend-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"backend-client.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/backend-client.ts"],"names":[],"mappings":"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"}
|