@cursor/july 0.1.16 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/README.md +9 -4
  2. package/dist/bin/agent-serve.js +60 -2
  3. package/dist/channels/slack/api.d.ts.map +1 -1
  4. package/dist/channels/slack/api.js +13 -3
  5. package/dist/channels/slack/auth.d.ts +7 -1
  6. package/dist/channels/slack/auth.d.ts.map +1 -1
  7. package/dist/channels/slack/auth.js +14 -0
  8. package/dist/channels/slack/blocks.d.ts +61 -0
  9. package/dist/channels/slack/blocks.d.ts.map +1 -0
  10. package/dist/channels/slack/blocks.js +90 -0
  11. package/dist/channels/slack/defaults.d.ts +2 -0
  12. package/dist/channels/slack/defaults.d.ts.map +1 -1
  13. package/dist/channels/slack/defaults.js +29 -3
  14. package/dist/channels/slack/dispatch.d.ts +3 -17
  15. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  16. package/dist/channels/slack/index.d.ts +1 -0
  17. package/dist/channels/slack/index.d.ts.map +1 -1
  18. package/dist/channels/slack/index.js +1 -0
  19. package/dist/channels/slack/interactive.d.ts +39 -3
  20. package/dist/channels/slack/interactive.d.ts.map +1 -1
  21. package/dist/channels/slack/interactive.js +152 -7
  22. package/dist/channels/slack/manifest.d.ts +3 -0
  23. package/dist/channels/slack/manifest.d.ts.map +1 -1
  24. package/dist/channels/slack/manifest.js +3 -0
  25. package/dist/channels/slack/setup.d.ts +4 -1
  26. package/dist/channels/slack/setup.d.ts.map +1 -1
  27. package/dist/channels/slack/setup.js +16 -2
  28. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  29. package/dist/channels/slack/slack-channel.js +24 -3
  30. package/dist/channels/slack/types.d.ts +77 -0
  31. package/dist/channels/slack/types.d.ts.map +1 -1
  32. package/dist/connections.d.ts +4 -1
  33. package/dist/connections.d.ts.map +1 -1
  34. package/dist/connections.js +4 -1
  35. package/dist/docs/404.html +2 -2
  36. package/dist/docs/ab.html +3 -3
  37. package/dist/docs/assets/{app.DjHC-Ggf.js → app.BbEXr2KO.js} +1 -1
  38. package/dist/docs/assets/chunks/@localSearchIndexroot.DCBsrfwP.js +1 -0
  39. package/dist/docs/assets/chunks/{VPLocalSearchBox.DwviwmIq.js → VPLocalSearchBox.DBEi4HDp.js} +1 -1
  40. package/dist/docs/assets/chunks/{theme.BIpeYSon.js → theme.DGfptcHw.js} +2 -2
  41. package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.js → guides_mcp-oauth.md.Dd8EgSem.js} +3 -2
  42. package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.lean.js → guides_mcp-oauth.md.Dd8EgSem.lean.js} +1 -1
  43. package/dist/docs/assets/{guides_slack.md.FWale6Ip.js → guides_slack.md.D_xFKlnF.js} +1 -1
  44. package/dist/docs/assets/{reference_connections.md.CsSr3rDz.js → reference_connections.md.B9Q3TOve.js} +12 -5
  45. package/dist/docs/assets/{reference_connections.md.CsSr3rDz.lean.js → reference_connections.md.B9Q3TOve.lean.js} +1 -1
  46. package/dist/docs/building-with-agents.html +3 -3
  47. package/dist/docs/concepts.html +3 -3
  48. package/dist/docs/deployment.html +3 -3
  49. package/dist/docs/evals.html +3 -3
  50. package/dist/docs/example-agents/approval-buddy.html +3 -3
  51. package/dist/docs/example-agents/benny.html +3 -3
  52. package/dist/docs/example-agents/bugbot.html +3 -3
  53. package/dist/docs/example-agents/codebase-wiki.html +3 -3
  54. package/dist/docs/example-agents/codeowners-review.html +3 -3
  55. package/dist/docs/example-agents/concierge.html +3 -3
  56. package/dist/docs/example-agents/fsd.html +3 -3
  57. package/dist/docs/example-agents/index.html +3 -3
  58. package/dist/docs/example-agents/knowledge-base.html +3 -3
  59. package/dist/docs/example-agents/oncall.html +3 -3
  60. package/dist/docs/example-agents/security-reviewer.html +3 -3
  61. package/dist/docs/example-agents/slack-agent.html +3 -3
  62. package/dist/docs/example-agents/weather-agent.html +3 -3
  63. package/dist/docs/guides/agent-to-agent.html +3 -3
  64. package/dist/docs/guides/cloud-runtime.html +3 -3
  65. package/dist/docs/guides/github.html +3 -3
  66. package/dist/docs/guides/human-in-the-loop.html +3 -3
  67. package/dist/docs/guides/mcp-oauth.html +6 -5
  68. package/dist/docs/guides/slack.html +5 -5
  69. package/dist/docs/guides/webhooks.html +3 -3
  70. package/dist/docs/hashmap.json +1 -1
  71. package/dist/docs/hillclimbing.html +3 -3
  72. package/dist/docs/index.html +3 -3
  73. package/dist/docs/quickstart.html +3 -3
  74. package/dist/docs/reference/agent-config.html +3 -3
  75. package/dist/docs/reference/channels.html +3 -3
  76. package/dist/docs/reference/cli.html +3 -3
  77. package/dist/docs/reference/connections.html +14 -7
  78. package/dist/docs/reference/hooks.html +3 -3
  79. package/dist/docs/reference/http-api.html +3 -3
  80. package/dist/docs/reference/instructions.html +3 -3
  81. package/dist/docs/reference/playground.html +3 -3
  82. package/dist/docs/reference/project-layout.html +3 -3
  83. package/dist/docs/reference/prompt.html +3 -3
  84. package/dist/docs/reference/schedules.html +3 -3
  85. package/dist/docs/reference/sessions.html +3 -3
  86. package/dist/docs/reference/skills.html +3 -3
  87. package/dist/docs/reference/subagents.html +3 -3
  88. package/dist/docs/reference/tools.html +3 -3
  89. package/dist/docs/scaffolding-agents.html +3 -3
  90. package/dist/docs/storage.html +3 -3
  91. package/dist/docs/troubleshooting.html +3 -3
  92. package/dist/evals/assertions.d.ts +190 -0
  93. package/dist/evals/assertions.d.ts.map +1 -0
  94. package/dist/evals/assertions.js +461 -0
  95. package/dist/evals/expect.d.ts +95 -0
  96. package/dist/evals/expect.d.ts.map +1 -0
  97. package/dist/evals/expect.js +194 -0
  98. package/dist/evals/judge.d.ts +133 -0
  99. package/dist/evals/judge.d.ts.map +1 -0
  100. package/dist/evals/judge.js +228 -0
  101. package/dist/evals/loaders.d.ts +51 -0
  102. package/dist/evals/loaders.d.ts.map +1 -0
  103. package/dist/evals/loaders.js +124 -0
  104. package/dist/evals/matchers.d.ts +95 -0
  105. package/dist/evals/matchers.d.ts.map +1 -0
  106. package/dist/evals/matchers.js +145 -0
  107. package/dist/evals/reporters.d.ts +70 -0
  108. package/dist/evals/reporters.d.ts.map +1 -0
  109. package/dist/evals/reporters.js +221 -0
  110. package/dist/evals/results.d.ts +103 -0
  111. package/dist/evals/results.d.ts.map +1 -0
  112. package/dist/evals/results.js +28 -0
  113. package/dist/evals/run-facts.d.ts +77 -0
  114. package/dist/evals/run-facts.d.ts.map +1 -0
  115. package/dist/evals/run-facts.js +187 -0
  116. package/dist/evals.d.ts +118 -31
  117. package/dist/evals.d.ts.map +1 -1
  118. package/dist/evals.js +46 -12
  119. package/dist/index.d.ts +1 -1
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +1 -1
  122. package/dist/internal/cli-ax.d.ts +27 -0
  123. package/dist/internal/cli-ax.d.ts.map +1 -1
  124. package/dist/internal/cli-ax.js +90 -12
  125. package/dist/internal/cli-mcp.d.ts +8 -0
  126. package/dist/internal/cli-mcp.d.ts.map +1 -1
  127. package/dist/internal/cli-mcp.js +98 -0
  128. package/dist/internal/cli-slack.d.ts +29 -1
  129. package/dist/internal/cli-slack.d.ts.map +1 -1
  130. package/dist/internal/cli-slack.js +777 -12
  131. package/dist/internal/deploy-client.d.ts +7 -0
  132. package/dist/internal/deploy-client.d.ts.map +1 -1
  133. package/dist/internal/deploy-client.js +9 -0
  134. package/dist/internal/discovery.d.ts.map +1 -1
  135. package/dist/internal/discovery.js +29 -9
  136. package/dist/internal/distribution.d.ts.map +1 -1
  137. package/dist/internal/distribution.js +2 -0
  138. package/dist/internal/eval-judge-model.d.ts +59 -0
  139. package/dist/internal/eval-judge-model.d.ts.map +1 -0
  140. package/dist/internal/eval-judge-model.js +131 -0
  141. package/dist/internal/eval-run-store.d.ts.map +1 -1
  142. package/dist/internal/eval-run-store.js +12 -20
  143. package/dist/internal/eval-runner.d.ts +31 -25
  144. package/dist/internal/eval-runner.d.ts.map +1 -1
  145. package/dist/internal/eval-runner.js +329 -126
  146. package/dist/internal/evals-client.d.ts.map +1 -1
  147. package/dist/internal/evals-client.js +4 -1
  148. package/dist/internal/local-env.d.ts +8 -0
  149. package/dist/internal/local-env.d.ts.map +1 -0
  150. package/dist/internal/local-env.js +47 -0
  151. package/dist/internal/playground/static.d.ts +3 -0
  152. package/dist/internal/playground/static.d.ts.map +1 -1
  153. package/dist/internal/playground/static.js +3 -0
  154. package/dist/internal/run-client.d.ts +15 -0
  155. package/dist/internal/run-client.d.ts.map +1 -1
  156. package/dist/internal/run-client.js +3 -2
  157. package/dist/internal/sdk-runner.d.ts +36 -1
  158. package/dist/internal/sdk-runner.d.ts.map +1 -1
  159. package/dist/internal/sdk-runner.js +65 -25
  160. package/dist/internal/server.d.ts.map +1 -1
  161. package/dist/internal/server.js +10 -1
  162. package/dist/internal/session-engine.d.ts +18 -5
  163. package/dist/internal/session-engine.d.ts.map +1 -1
  164. package/dist/internal/session-engine.js +72 -19
  165. package/dist/internal/slack-provision-client.d.ts +130 -0
  166. package/dist/internal/slack-provision-client.d.ts.map +1 -0
  167. package/dist/internal/slack-provision-client.js +284 -0
  168. package/dist/playground/assets/cursor-icons-16-f_W_ogc-.woff2 +0 -0
  169. package/dist/playground/assets/index-CidizGZv.css +1 -0
  170. package/dist/playground/assets/index-DNqirsrK.js +85 -0
  171. package/dist/playground/index.html +2 -2
  172. package/dist/types.d.ts +70 -4
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/types.js +26 -0
  175. package/docs/guides/mcp-oauth.md +10 -5
  176. package/docs/guides/slack.md +3 -2
  177. package/docs/reference/connections.md +28 -18
  178. package/package.json +20 -2
  179. package/skills/create-agent/SKILL.md +15 -7
  180. package/skills/debug/SKILL.md +3 -1
  181. package/skills/mcp-auth/SKILL.md +1 -1
  182. package/skills/setup-slack/SKILL.md +173 -11
  183. package/src/bin/agent-serve.ts +63 -2
  184. package/src/channels/slack/api.ts +16 -3
  185. package/src/channels/slack/auth.ts +16 -1
  186. package/src/channels/slack/blocks.ts +139 -0
  187. package/src/channels/slack/defaults.ts +32 -4
  188. package/src/channels/slack/dispatch.ts +3 -18
  189. package/src/channels/slack/index.ts +1 -0
  190. package/src/channels/slack/interactive.ts +183 -19
  191. package/src/channels/slack/manifest.ts +3 -0
  192. package/src/channels/slack/setup.ts +16 -2
  193. package/src/channels/slack/slack-channel.ts +37 -6
  194. package/src/channels/slack/types.ts +89 -0
  195. package/src/connections.ts +4 -1
  196. package/src/evals/assertions.ts +704 -0
  197. package/src/evals/expect.ts +272 -0
  198. package/src/evals/judge.ts +346 -0
  199. package/src/evals/loaders.ts +113 -0
  200. package/src/evals/matchers.ts +246 -0
  201. package/src/evals/reporters.ts +274 -0
  202. package/src/evals/results.ts +132 -0
  203. package/src/evals/run-facts.ts +274 -0
  204. package/src/evals.ts +205 -42
  205. package/src/index.ts +2 -0
  206. package/src/internal/cli-ax.ts +134 -15
  207. package/src/internal/cli-mcp.ts +118 -5
  208. package/src/internal/cli-slack.ts +993 -15
  209. package/src/internal/deploy-client.ts +10 -0
  210. package/src/internal/discovery.ts +31 -5
  211. package/src/internal/distribution.ts +2 -0
  212. package/src/internal/eval-judge-model.ts +148 -0
  213. package/src/internal/eval-run-store.ts +10 -14
  214. package/src/internal/eval-runner.ts +460 -214
  215. package/src/internal/evals-client.ts +5 -0
  216. package/src/internal/local-env.ts +53 -0
  217. package/src/internal/playground/static.ts +3 -0
  218. package/src/internal/run-client.ts +17 -1
  219. package/src/internal/sdk-runner.ts +103 -22
  220. package/src/internal/server.ts +10 -0
  221. package/src/internal/session-engine.ts +89 -21
  222. package/src/internal/slack-provision-client.ts +438 -0
  223. package/src/types.ts +92 -4
  224. package/dist/channels/slack/post-update-delivery.d.ts +0 -85
  225. package/dist/channels/slack/post-update-delivery.d.ts.map +0 -1
  226. package/dist/docs/assets/chunks/@localSearchIndexroot.DZtu0ZIc.js +0 -1
  227. package/dist/internal/json-dir-store.d.ts +0 -32
  228. package/dist/internal/json-dir-store.d.ts.map +0 -1
  229. package/dist/internal/persistence-coordinator.d.ts +0 -127
  230. package/dist/internal/persistence-coordinator.d.ts.map +0 -1
  231. package/dist/persistence.d.ts +0 -184
  232. package/dist/persistence.d.ts.map +0 -1
  233. package/dist/playground/assets/cursor-icons-16-CQ50JpfO.woff2 +0 -0
  234. package/dist/playground/assets/index-Bwl4Onx4.js +0 -85
  235. package/dist/playground/assets/index-ByV4nfch.css +0 -1
  236. /package/dist/docs/assets/{guides_slack.md.FWale6Ip.lean.js → guides_slack.md.D_xFKlnF.lean.js} +0 -0
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Loads an agent directory's `.env.local` (and each immediate child's,
3
+ * for multi-agent hosts) into process.env. Real env always wins —
4
+ * `process.loadEnvFile` never overrides. Values a previous call loaded are
5
+ * refreshed, so a reload picks up edits made since.
6
+ */
7
+ import { existsSync, readdirSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ // Not real env, so a reload has to clear them first: loadEnvFile skips
10
+ // anything already in process.env, which would pin the first-boot values.
11
+ let fileLoadedKeys = new Set();
12
+ export function loadAgentLocalEnv(dir) {
13
+ for (const key of fileLoadedKeys) {
14
+ delete process.env[key];
15
+ }
16
+ const realKeys = new Set(Object.keys(process.env));
17
+ const loaded = [];
18
+ const tryLoad = (path) => {
19
+ if (!existsSync(path)) {
20
+ return;
21
+ }
22
+ process.loadEnvFile(path);
23
+ loaded.push(path);
24
+ };
25
+ const trackLoadedKeys = () => {
26
+ fileLoadedKeys = new Set(Object.keys(process.env).filter((key) => !realKeys.has(key)));
27
+ };
28
+ tryLoad(join(dir, ".env.local"));
29
+ let children;
30
+ try {
31
+ children = readdirSync(dir, { withFileTypes: true })
32
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
33
+ .map((entry) => entry.name);
34
+ }
35
+ catch (_a) {
36
+ trackLoadedKeys();
37
+ return loaded;
38
+ }
39
+ for (const child of children) {
40
+ if (child === "node_modules") {
41
+ continue;
42
+ }
43
+ tryLoad(join(dir, child, ".env.local"));
44
+ }
45
+ trackLoadedKeys();
46
+ return loaded;
47
+ }
@@ -18,6 +18,9 @@ export declare function playgroundBundleExists(): boolean;
18
18
  * The SPA `index.html` with a `<base href>` injected so its relative asset
19
19
  * URLs resolve under the mount point (`/playground/` or `/<slug>/playground/`).
20
20
  * Falls back to a helpful placeholder page when the bundle is missing.
21
+ * The hosted alias performs the same injection for its central copy
22
+ * (`backend/server/src/agentServe/aliasPlaygroundShell.ts`) — keep them
23
+ * behaviorally aligned.
21
24
  */
22
25
  export declare function renderPlaygroundIndexHtml(baseHref: string): string;
23
26
  /** Serve one built asset from `dist/playground/assets/` by filename. */
@@ -1 +1 @@
1
- {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../../src/internal/playground/static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBvD,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAsB5D;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAiBvE"}
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../../src/internal/playground/static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBvD,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAsB5D;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAiBvE"}
@@ -45,6 +45,9 @@ export function playgroundBundleExists() {
45
45
  * The SPA `index.html` with a `<base href>` injected so its relative asset
46
46
  * URLs resolve under the mount point (`/playground/` or `/<slug>/playground/`).
47
47
  * Falls back to a helpful placeholder page when the bundle is missing.
48
+ * The hosted alias performs the same injection for its central copy
49
+ * (`backend/server/src/agentServe/aliasPlaygroundShell.ts`) — keep them
50
+ * behaviorally aligned.
48
51
  */
49
52
  export function renderPlaygroundIndexHtml(baseHref) {
50
53
  if (!playgroundBundleExists()) {
@@ -34,6 +34,11 @@ export interface RunSessionResult {
34
34
  events: SessionEvent[];
35
35
  trajectory: Trajectory;
36
36
  ok: boolean;
37
+ /**
38
+ * Index to pass as `startIndex` on the next call for this session. Undefined
39
+ * when the turn streamed nothing, in which case reuse the previous value.
40
+ */
41
+ nextEventIndex?: number;
37
42
  }
38
43
  /**
39
44
  * Run one or more messages against a live agent-serve base URL
@@ -43,6 +48,16 @@ export declare function runSession(options: RunClientOptions & {
43
48
  messages: string[];
44
49
  sessionId?: string;
45
50
  continuationToken?: string;
51
+ /**
52
+ * First event index to read when resuming an existing session.
53
+ *
54
+ * The stream replays from `startIndex` and this client stops at the first
55
+ * terminal event, so a caller that sends several turns across separate
56
+ * `runSession` calls **must** pass the index after its last consumed event
57
+ * (see {@link RunSessionResult.nextEventIndex}). Omitting it replays the
58
+ * earlier turn and returns those stale events instead of the new turn's.
59
+ */
60
+ startIndex?: number;
46
61
  /** Applied only when creating a new session (first message). */
47
62
  workspaceDir?: string;
48
63
  /** Applied only when creating a new session (first message). */
@@ -1 +1 @@
1
- {"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAF5B,YACE,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM,EAI3B;CACF;AACD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;CACb;AAQD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,gBAAgB,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,GACA,OAAO,CAAC,gBAAgB,CAAC,CAyD3B"}
1
+ {"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAF5B,YACE,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM,EAI3B;CACF;AACD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,gBAAgB,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,GACA,OAAO,CAAC,gBAAgB,CAAC,CA0D3B"}
@@ -35,6 +35,7 @@ const TERMINAL_TYPES = new Set([
35
35
  */
36
36
  export function runSession(options) {
37
37
  return __awaiter(this, void 0, void 0, function* () {
38
+ var _a;
38
39
  if (options.messages.length === 0) {
39
40
  throw new Error("runSession requires at least one message");
40
41
  }
@@ -42,7 +43,7 @@ export function runSession(options) {
42
43
  let sessionId = options.sessionId;
43
44
  let continuationToken = options.continuationToken;
44
45
  const allEvents = [];
45
- let nextEventIndex = 0;
46
+ let nextEventIndex = (_a = options.startIndex) !== null && _a !== void 0 ? _a : 0;
46
47
  const auth = {
47
48
  bearerToken: options.bearerToken,
48
49
  headers: options.headers,
@@ -78,7 +79,7 @@ export function runSession(options) {
78
79
  throw new Error("server did not return a session id");
79
80
  }
80
81
  const trajectory = buildTrajectory(allEvents);
81
- return Object.assign(Object.assign({ sessionId }, (continuationToken === undefined ? {} : { continuationToken })), { baseUrl, events: allEvents, trajectory, ok: trajectory.ok });
82
+ return Object.assign(Object.assign({ sessionId }, (continuationToken === undefined ? {} : { continuationToken })), { baseUrl, events: allEvents, trajectory, ok: trajectory.ok, nextEventIndex: allEvents.length === 0 ? undefined : nextEventIndex });
82
83
  });
83
84
  }
84
85
  function runOneTurn(args) {
@@ -5,13 +5,33 @@
5
5
  * settings; cloud agents use Cursor cloud (`bc-…` ids) with optional
6
6
  * `cloud` options from `defineAgent`.
7
7
  */
8
- import { type LocalAgentStore, type ModelSelection } from "@cursor/sdk";
8
+ import { type LocalAgentStore, type ModelSelection, type RunResult } from "@cursor/sdk";
9
9
  import { type ModelSetting, type RunnerTurnRequest, type TurnOutcome } from "../types.js";
10
10
  /** Internal seam between the session engine and the Cursor SDK harness. */
11
11
  export interface AgentRunner {
12
12
  runTurn(request: RunnerTurnRequest): Promise<TurnOutcome>;
13
+ /**
14
+ * Resolve a local workspace before any session needs it, so the first turn
15
+ * is not the one that pays for it. Best effort, hence the reported outcome:
16
+ * a runner that cannot warm must say so rather than let a caller log
17
+ * success over a workspace that was never touched.
18
+ */
19
+ prewarm?(request: RunnerPrewarmRequest): Promise<PrewarmOutcome>;
13
20
  dispose?(): Promise<void>;
14
21
  }
22
+ /**
23
+ * The parts of a turn that decide which local executor it runs on. Must stay
24
+ * a subset of {@link RunnerTurnRequest} — anything that disagrees warms an
25
+ * executor no turn will ask for.
26
+ */
27
+ export type RunnerPrewarmRequest = Pick<RunnerTurnRequest, "workspaceDir" | "runnerStateDir" | "sandbox" | "mcpServers" | "subagents" | "model">;
28
+ /** Whether a workspace was actually resolved, and why not when it wasn't. */
29
+ export type PrewarmOutcome = {
30
+ readonly warmed: true;
31
+ } | {
32
+ readonly warmed: false;
33
+ readonly reason: string;
34
+ };
15
35
  export interface CursorSdkRunnerOptions {
16
36
  /** Cursor API key. Defaults to the `CURSOR_API_KEY` environment variable. */
17
37
  apiKey?: string;
@@ -28,10 +48,24 @@ export declare class CursorSdkRunner implements AgentRunner {
28
48
  private readonly options;
29
49
  private readonly agents;
30
50
  private readonly stores;
51
+ private readonly prewarmReleases;
31
52
  constructor(options?: CursorSdkRunnerOptions);
32
53
  runTurn(request: RunnerTurnRequest): Promise<TurnOutcome>;
54
+ /**
55
+ * Build the local executor for a workspace before any session asks for it.
56
+ * The warmed executor is reference counted, so the lease is held until
57
+ * {@link dispose}; dropping it early would tear the workspace back down.
58
+ */
59
+ prewarm(request: RunnerPrewarmRequest): Promise<PrewarmOutcome>;
33
60
  dispose(): Promise<void>;
34
61
  private getAgent;
62
+ private requireApiKey;
63
+ private buildSharedOptions;
64
+ /**
65
+ * The options that decide which local executor a turn runs on. Prewarming
66
+ * goes through here too, so a warmed workspace is the one turns land on.
67
+ */
68
+ private buildLocalOptions;
35
69
  private openAgent;
36
70
  private openLocalAgent;
37
71
  private openCloudAgent;
@@ -47,4 +81,5 @@ export declare function isServerMintedCloudAgentId(id: string): boolean;
47
81
  */
48
82
  export declare function isLocalAgentNotFoundError(error: unknown, agentId: string): boolean;
49
83
  export declare function toModelSelection(model: ModelSetting): ModelSelection;
84
+ export declare function runErrorMessage(result: Pick<RunResult, "error">): string;
50
85
  //# sourceMappingURL=sdk-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../src/internal/sdk-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,cAAc,EAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAErB,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,qBAAa,eAAgB,YAAW,WAAW;IAIrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;IAEtE,YAA6B,OAAO,GAAE,sBAA2B,EAAI;IAE/D,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0D9D;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7B;IAED,OAAO,CAAC,QAAQ;YAYF,SAAS;YA2BT,cAAc;YAyCd,cAAc;IAqC5B,OAAO,CAAC,QAAQ;CAUjB;AAED,4EAA4E;AAC5E,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAMT;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CAQpE"}
1
+ {"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../src/internal/sdk-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAOL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAErB,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1D;;;;;OAKG;IACH,OAAO,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,iBAAiB,EACf,cAAc,GACd,gBAAgB,GAChB,SAAS,GACT,YAAY,GACZ,WAAW,GACX,OAAO,CACV,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAcxD,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,qBAAa,eAAgB,YAAW,WAAW;IAKrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAElE,YAA6B,OAAO,GAAE,sBAA2B,EAAI;IAE/D,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0D9D;IAED;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAepE;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAU7B;IAED,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,kBAAkB;IAc1B;;;OAGG;YACW,iBAAiB;YAkBjB,SAAS;YAOT,cAAc;YA6Bd,cAAc;IAqC5B,OAAO,CAAC,QAAQ;CAUjB;AAED,4EAA4E;AAC5E,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAMT;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CAQpE;AAmED,wBAAgB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,CAExE"}
@@ -15,13 +15,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
15
15
  });
16
16
  };
17
17
  import { mkdir } from "node:fs/promises";
18
- import { Agent, JsonlLocalAgentStore, } from "@cursor/sdk";
18
+ import { Agent, createAgentPlatform, JsonlLocalAgentStore, } from "@cursor/sdk";
19
19
  import { DEFAULT_MODEL, } from "../types.js";
20
20
  export class CursorSdkRunner {
21
21
  constructor(options = {}) {
22
22
  this.options = options;
23
23
  this.agents = new Map();
24
24
  this.stores = new Map();
25
+ this.prewarmReleases = [];
25
26
  }
26
27
  runTurn(request) {
27
28
  return __awaiter(this, void 0, void 0, function* () {
@@ -79,8 +80,30 @@ export class CursorSdkRunner {
79
80
  }
80
81
  });
81
82
  }
83
+ /**
84
+ * Build the local executor for a workspace before any session asks for it.
85
+ * The warmed executor is reference counted, so the lease is held until
86
+ * {@link dispose}; dropping it early would tear the workspace back down.
87
+ */
88
+ prewarm(request) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ const platform = (yield createAgentPlatform());
91
+ if (typeof platform.prewarmLocalWorkspace !== "function") {
92
+ // Older @cursor/sdk. Turns still work; they just pay on the first one.
93
+ return {
94
+ warmed: false,
95
+ reason: "the installed @cursor/sdk has no prewarmLocalWorkspace; upgrade it to warm the workspace before the first turn",
96
+ };
97
+ }
98
+ const release = yield platform.prewarmLocalWorkspace(yield this.buildLocalOptions(request));
99
+ this.prewarmReleases.push(release);
100
+ return { warmed: true };
101
+ });
102
+ }
82
103
  dispose() {
83
104
  return __awaiter(this, void 0, void 0, function* () {
105
+ const releases = this.prewarmReleases.splice(0);
106
+ yield Promise.allSettled(releases.map((release) => release()));
84
107
  const agents = yield Promise.allSettled([...this.agents.values()]);
85
108
  this.agents.clear();
86
109
  for (const settled of agents) {
@@ -101,37 +124,50 @@ export class CursorSdkRunner {
101
124
  }
102
125
  return agentPromise;
103
126
  }
127
+ requireApiKey() {
128
+ var _a;
129
+ const apiKey = (_a = this.options.apiKey) !== null && _a !== void 0 ? _a : process.env.CURSOR_API_KEY;
130
+ if (apiKey === undefined || apiKey.trim() === "") {
131
+ throw new Error("The Cursor SDK runner requires a Cursor credential: run `agent-serve login`, set CURSOR_API_KEY, or pass serve({ apiKey }).");
132
+ }
133
+ return apiKey;
134
+ }
135
+ buildSharedOptions(request) {
136
+ var _a;
137
+ const subagents = toAgentDefinitions(request.subagents);
138
+ return Object.assign(Object.assign({ model: toModelSelection((_a = request.model) !== null && _a !== void 0 ? _a : DEFAULT_MODEL), apiKey: this.requireApiKey() }, (Object.keys(request.mcpServers).length > 0
139
+ ? { mcpServers: request.mcpServers }
140
+ : {})), (subagents === undefined ? {} : { agents: subagents }));
141
+ }
142
+ /**
143
+ * The options that decide which local executor a turn runs on. Prewarming
144
+ * goes through here too, so a warmed workspace is the one turns land on.
145
+ */
146
+ buildLocalOptions(request) {
147
+ return __awaiter(this, void 0, void 0, function* () {
148
+ var _a;
149
+ const store = (_a = this.options.store) !== null && _a !== void 0 ? _a : (yield this.getStore(request.runnerStateDir));
150
+ return Object.assign(Object.assign({}, this.buildSharedOptions(request)), { local: Object.assign({ cwd: request.workspaceDir, settingSources: ["project"], store }, (request.sandbox === true
151
+ ? { sandboxOptions: { enabled: true } }
152
+ : {})) });
153
+ });
154
+ }
104
155
  openAgent(request) {
105
156
  return __awaiter(this, void 0, void 0, function* () {
106
- var _a, _b;
107
- const apiKey = (_a = this.options.apiKey) !== null && _a !== void 0 ? _a : process.env.CURSOR_API_KEY;
108
- if (apiKey === undefined || apiKey.trim() === "") {
109
- throw new Error("The Cursor SDK runner requires a Cursor credential: run `agent-serve login`, set CURSOR_API_KEY, or pass serve({ apiKey }).");
110
- }
111
- const model = (_b = request.model) !== null && _b !== void 0 ? _b : DEFAULT_MODEL;
112
- const subagents = toAgentDefinitions(request.subagents);
113
- const shared = Object.assign(Object.assign({ model: toModelSelection(model), apiKey }, (Object.keys(request.mcpServers).length > 0
114
- ? { mcpServers: request.mcpServers }
115
- : {})), (subagents === undefined ? {} : { agents: subagents }));
116
157
  if (request.runtime === "cloud") {
117
- return this.openCloudAgent(request, shared);
158
+ return this.openCloudAgent(request, this.buildSharedOptions(request));
118
159
  }
119
- return this.openLocalAgent(request, shared);
160
+ return this.openLocalAgent(request);
120
161
  });
121
162
  }
122
- openLocalAgent(request, shared) {
163
+ openLocalAgent(request) {
123
164
  return __awaiter(this, void 0, void 0, function* () {
124
- var _a, _b, _c, _d;
125
- const store = (_a = this.options.store) !== null && _a !== void 0 ? _a : (yield this.getStore(request.runnerStateDir));
126
- const options = Object.assign(Object.assign({}, shared), { local: {
127
- cwd: request.workspaceDir,
128
- settingSources: ["project"],
129
- store,
130
- } });
165
+ var _a, _b, _c;
166
+ const options = yield this.buildLocalOptions(request);
131
167
  if (request.isFirstTurn || request.sdkAgentId === undefined) {
132
- return Agent.create(Object.assign(Object.assign({}, options), { agentId: (_b = request.sdkAgentId) !== null && _b !== void 0 ? _b : request.sessionId }));
168
+ return Agent.create(Object.assign(Object.assign({}, options), { agentId: (_a = request.sdkAgentId) !== null && _a !== void 0 ? _a : request.sessionId }));
133
169
  }
134
- const agentId = (_c = request.sdkAgentId) !== null && _c !== void 0 ? _c : request.sessionId;
170
+ const agentId = (_b = request.sdkAgentId) !== null && _b !== void 0 ? _b : request.sessionId;
135
171
  try {
136
172
  return yield Agent.resume(agentId, options);
137
173
  }
@@ -144,7 +180,7 @@ export class CursorSdkRunner {
144
180
  // conversation under the same id beats failing this thread's turns
145
181
  // forever ("Agent … not found" on every follow-up). The channel's
146
182
  // warm-turn prompt context re-hydrates the thread history.
147
- ((_d = this.options.logger) !== null && _d !== void 0 ? _d : (() => { }))(`[agentkit] no stored conversation for ${agentId} on this host; starting a fresh one`);
183
+ ((_c = this.options.logger) !== null && _c !== void 0 ? _c : (() => { }))(`[agentkit] no stored conversation for ${agentId} on this host; starting a fresh one`);
148
184
  return Agent.create(Object.assign(Object.assign({}, options), { agentId }));
149
185
  }
150
186
  });
@@ -242,6 +278,10 @@ function toTurnOutcome(result) {
242
278
  ? {}
243
279
  : { reasoningTokens: result.usage.reasoningTokens }));
244
280
  return Object.assign(Object.assign(Object.assign({ status: result.status }, (result.result === undefined ? {} : { result: result.result })), (result.status === "error"
245
- ? { errorMessage: "The Cursor agent run failed" }
281
+ ? { errorMessage: runErrorMessage(result) }
246
282
  : {})), (usage === undefined ? {} : { usage }));
247
283
  }
284
+ export function runErrorMessage(result) {
285
+ var _a, _b;
286
+ return ((_b = (_a = result.error) === null || _a === void 0 ? void 0 : _a.message) === null || _b === void 0 ? void 0 : _b.trim()) || "The Cursor agent run failed";
287
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4BH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAOhB,YAAY,EACb,MAAM,aAAa,CAAC;AAqFrB,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAapE,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAYD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAmpB3B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4BH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAOhB,YAAY,EACb,MAAM,aAAa,CAAC;AAqFrB,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAapE,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAYD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAypB3B"}
@@ -241,6 +241,11 @@ export function startServer(mounts_1) {
241
241
  // Rehydrate sessions from the authored storage sink before any
242
242
  // channel or route can address them (continuation tokens must resolve).
243
243
  yield engine.restoreStoredSessions();
244
+ // Resolve a shared harness workspace in the background: on a large repo
245
+ // that takes seconds, and a deployment coming online should absorb it
246
+ // rather than whoever sends the first message. No-op unless the agent
247
+ // pins `local.workspaceDir`.
248
+ void engine.prewarmSharedWorkspace();
244
249
  if (!githubAuthWarmed) {
245
250
  // Soft ambient GitHub auth check before channel onStart (which may call
246
251
  // host.github). Missing auth is a warning only — serve still starts.
@@ -687,7 +692,11 @@ function mountAgentRoutes(router, runtime, args) {
687
692
  method: "GET",
688
693
  pattern: `${base}/v1/meta`,
689
694
  auth: "none",
690
- handler: () => jsonResponse(Object.assign({ name: project.name, dev, basePath: base }, (multi ? { indexPath: "/" } : {}))),
695
+ handler: () => jsonResponse(Object.assign({ name: project.name, dev, basePath: base,
696
+ // Framework version, for SPA/engine skew observability now that the
697
+ // hosted playground shell is served centrally (backend deploys)
698
+ // while engines stay on their install-time version.
699
+ version: packageVersion() }, (multi ? { indexPath: "/" } : {}))),
691
700
  });
692
701
  router.add({
693
702
  method: "GET",
@@ -227,15 +227,28 @@ export declare class SessionEngine {
227
227
  getContinuationLastBotMessageTs(channelId: string, continuationToken: string): Promise<string | undefined>;
228
228
  interruptContinuation(channelId: string, continuationToken: string): Promise<boolean>;
229
229
  /**
230
- * Local harness cwd for a session: per-send override, else
231
- * `<agent.local.cwd>/<sessionId>`, else the durable session workspace.
230
+ * Local harness cwd for a session: per-send override, else the shared
231
+ * `agent.local.workspaceDir`, else `<agent.local.cwd>/<sessionId>`, else
232
+ * the durable session workspace.
232
233
  */
233
234
  harnessCwd(record: SessionRecord): string;
234
235
  /**
235
- * Directory that receives AGENTS.md / skills / agent tools. When the
236
- * harness cwd is a one-off override (e.g. PR worktree), scaffold stays in
237
- * the durable session workspace; otherwise scaffold lands in the harness.
236
+ * True when the harness cwd is a directory the session does not own — a
237
+ * per-send override (e.g. a PR worktree) or a workspace shared by every
238
+ * session. Agent scaffold has to stay out of those, so it lands in the
239
+ * durable session workspace and the instructions travel inline instead.
238
240
  */
241
+ private hasBorrowedWorkspace;
242
+ /**
243
+ * Resolve the shared harness workspace during startup, so the first session
244
+ * is not the one that waits for it. Only possible with
245
+ * `local.workspaceDir`: every other layout gives a session its own cwd,
246
+ * which is unknowable until that session exists.
247
+ *
248
+ * Best effort — warming is an optimization, and a turn rebuilds on its own.
249
+ */
250
+ prewarmSharedWorkspace(): Promise<void>;
251
+ /** Directory that receives AGENTS.md / skills / agent tools. */
239
252
  private scaffoldDir;
240
253
  private executeTurn;
241
254
  private buildTurnRequest;
@@ -1 +1 @@
1
- {"version":3,"file":"session-engine.d.ts","sourceRoot":"","sources":["../../src/internal/session-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-engine.d.ts","sourceRoot":"","sources":["../../src/internal/session-engine.ts"],"names":[],"mappings":"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"}
@@ -666,27 +666,72 @@ export class SessionEngine {
666
666
  });
667
667
  }
668
668
  /**
669
- * Local harness cwd for a session: per-send override, else
670
- * `<agent.local.cwd>/<sessionId>`, else the durable session workspace.
669
+ * Local harness cwd for a session: per-send override, else the shared
670
+ * `agent.local.workspaceDir`, else `<agent.local.cwd>/<sessionId>`, else
671
+ * the durable session workspace.
671
672
  */
672
673
  harnessCwd(record) {
673
- var _a;
674
+ var _a, _b;
674
675
  if (record.workspaceOverride !== undefined) {
675
676
  return record.workspaceOverride;
676
677
  }
677
- const agentCwd = (_a = this.project.agent.local) === null || _a === void 0 ? void 0 : _a.cwd;
678
+ const shared = (_a = this.project.agent.local) === null || _a === void 0 ? void 0 : _a.workspaceDir;
679
+ if (shared !== undefined) {
680
+ return shared;
681
+ }
682
+ const agentCwd = (_b = this.project.agent.local) === null || _b === void 0 ? void 0 : _b.cwd;
678
683
  if (agentCwd !== undefined) {
679
684
  return join(agentCwd, record.sessionId);
680
685
  }
681
686
  return this.sessions.workspaceDir(record.sessionId);
682
687
  }
683
688
  /**
684
- * Directory that receives AGENTS.md / skills / agent tools. When the
685
- * harness cwd is a one-off override (e.g. PR worktree), scaffold stays in
686
- * the durable session workspace; otherwise scaffold lands in the harness.
689
+ * True when the harness cwd is a directory the session does not own — a
690
+ * per-send override (e.g. a PR worktree) or a workspace shared by every
691
+ * session. Agent scaffold has to stay out of those, so it lands in the
692
+ * durable session workspace and the instructions travel inline instead.
693
+ */
694
+ hasBorrowedWorkspace(record) {
695
+ var _a;
696
+ return (record.workspaceOverride !== undefined ||
697
+ ((_a = this.project.agent.local) === null || _a === void 0 ? void 0 : _a.workspaceDir) !== undefined);
698
+ }
699
+ /**
700
+ * Resolve the shared harness workspace during startup, so the first session
701
+ * is not the one that waits for it. Only possible with
702
+ * `local.workspaceDir`: every other layout gives a session its own cwd,
703
+ * which is unknowable until that session exists.
704
+ *
705
+ * Best effort — warming is an optimization, and a turn rebuilds on its own.
687
706
  */
707
+ prewarmSharedWorkspace() {
708
+ return __awaiter(this, void 0, void 0, function* () {
709
+ var _a, _b;
710
+ const agent = this.project.agent;
711
+ const workspaceDir = (_a = agent.local) === null || _a === void 0 ? void 0 : _a.workspaceDir;
712
+ if (workspaceDir === undefined ||
713
+ agent.runtime !== "local" ||
714
+ this.runner.prewarm === undefined) {
715
+ return;
716
+ }
717
+ const startedAt = Date.now();
718
+ try {
719
+ const outcome = yield this.runner.prewarm(Object.assign({ workspaceDir, runnerStateDir: join(this.stateRoot, "runner"), sandbox: ((_b = agent.local) === null || _b === void 0 ? void 0 : _b.sandbox) === true, mcpServers: this.buildMcpServers("local"), subagents: buildRunnerSubagents(agent) }, (agent.model === undefined ? {} : { model: agent.model })));
720
+ // Report what happened rather than that the call returned: a runner
721
+ // that cannot warm resolves cleanly, and logging success there would
722
+ // tell an operator the workspace is hot when nothing touched it.
723
+ this.logger(outcome.warmed
724
+ ? `[agentkit] warmed ${workspaceDir} in ${Date.now() - startedAt}ms`
725
+ : `[agentkit] did not warm ${workspaceDir}: ${outcome.reason}`);
726
+ }
727
+ catch (error) {
728
+ this.logger(`[agentkit] could not warm ${workspaceDir}: ${describeError(error)}`);
729
+ }
730
+ });
731
+ }
732
+ /** Directory that receives AGENTS.md / skills / agent tools. */
688
733
  scaffoldDir(record) {
689
- if (record.workspaceOverride !== undefined) {
734
+ if (this.hasBorrowedWorkspace(record)) {
690
735
  return this.sessions.workspaceDir(record.sessionId);
691
736
  }
692
737
  return this.harnessCwd(record);
@@ -752,12 +797,12 @@ export class SessionEngine {
752
797
  });
753
798
  }
754
799
  // The harness only loads the scaffolded AGENTS.md when the session
755
- // workspace is its own project root. With a per-session cwd override
756
- // (PR worktree) the scaffold lands elsewhere, and a workspace nested
757
- // inside a git repo re-roots harness rules at that repo — in both
758
- // cases deliver instructions inline on the first turn instead.
800
+ // workspace is its own project root. When the harness cwd is borrowed
801
+ // (PR worktree, shared checkout) the scaffold lands elsewhere, and a
802
+ // workspace nested inside a git repo re-roots harness rules at that
803
+ // repo — in both cases deliver instructions inline on the first turn.
759
804
  const instructionsInvisibleToHarness = isFirstTurn &&
760
- (record.workspaceOverride !== undefined ||
805
+ (this.hasBorrowedWorkspace(record) ||
761
806
  (yield isNestedInGitRepo(harnessCwd)));
762
807
  const request = this.buildTurnRequest(record, agent, turnId, message, isFirstTurn, instructionsInvisibleToHarness, emit, (update) => __awaiter(this, void 0, void 0, function* () {
763
808
  mapper.handleUpdate(update);
@@ -833,7 +878,7 @@ export class SessionEngine {
833
878
  });
834
879
  }
835
880
  buildTurnRequest(record, agent, turnId, prompt, isFirstTurn, instructionsInvisibleToHarness, emit, onUpdate, signal) {
836
- var _a, _b;
881
+ var _a, _b, _c;
837
882
  // Per-session cloud attach (channel/tool handoff) forces cloud runtime
838
883
  // even when the agent defaults to local for chat server tools.
839
884
  const runtime = resolveSessionRuntime({
@@ -865,17 +910,17 @@ export class SessionEngine {
865
910
  }
866
911
  else if (instructionsInvisibleToHarness) {
867
912
  // Local workspace whose AGENTS.md the harness will not load. With a
868
- // per-session harness cwd override, agent tool scripts live only in
869
- // the durable scaffold dir — embed bodies like cloud. Otherwise the
870
- // catalog can reference on-disk paths under the harness cwd.
871
- const includeScripts = record.workspaceOverride !== undefined;
913
+ // borrowed harness cwd, agent tool scripts live only in the durable
914
+ // scaffold dir — embed bodies like cloud. Otherwise the catalog can
915
+ // reference on-disk paths under the harness cwd.
916
+ const includeScripts = this.hasBorrowedWorkspace(record);
872
917
  const preamble = buildAgentsMdContent(agent, { includeScripts });
873
918
  turnPrompt = `${preamble}\n\n${turnPrompt}`;
874
919
  }
875
920
  }
876
921
  return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ sessionId: record.sessionId }, (record.sdkAgentId === undefined
877
922
  ? {}
878
- : { sdkAgentId: record.sdkAgentId })), { workspaceDir: this.harnessCwd(record), runnerStateDir: join(this.stateRoot, "runner"), prompt: turnPrompt, isFirstTurn }), (agent.model === undefined ? {} : { model: agent.model })), { runtime }), (mergedCloud === undefined ? {} : { cloud: mergedCloud })), { customTools: runtime === "local" ? this.buildCustomTools(record, turnId, emit) : {}, mcpServers: this.buildMcpServers(runtime), subagents: agent.subagents.map((subagent) => { var _a; return (Object.assign({ name: subagent.name, description: (_a = subagent.description) !== null && _a !== void 0 ? _a : subagent.name, prompt: subagentPrompt(subagent) }, (subagent.model === undefined ? {} : { model: subagent.model }))); }), onUpdate,
923
+ : { sdkAgentId: record.sdkAgentId })), { workspaceDir: this.harnessCwd(record), sandbox: ((_c = this.project.agent.local) === null || _c === void 0 ? void 0 : _c.sandbox) === true, runnerStateDir: join(this.stateRoot, "runner"), prompt: turnPrompt, isFirstTurn }), (agent.model === undefined ? {} : { model: agent.model })), { runtime }), (mergedCloud === undefined ? {} : { cloud: mergedCloud })), { customTools: runtime === "local" ? this.buildCustomTools(record, turnId, emit) : {}, mcpServers: this.buildMcpServers(runtime), subagents: buildRunnerSubagents(agent), onUpdate,
879
924
  signal,
880
925
  // Local follow-ups expire any lingering active run so a preempted turn
881
926
  // (or one orphaned by a crashed process) never blocks this send.
@@ -1897,6 +1942,14 @@ function subagentPrompt(subagent) {
1897
1942
  }
1898
1943
  return (_a = subagent.description) !== null && _a !== void 0 ? _a : subagent.name;
1899
1944
  }
1945
+ /**
1946
+ * Subagents as the runner takes them. Shared by turns and by workspace
1947
+ * warming, which has to describe the same agent a turn would to reach the
1948
+ * executor that turn will run on.
1949
+ */
1950
+ function buildRunnerSubagents(agent) {
1951
+ return agent.subagents.map((subagent) => { var _a; return (Object.assign({ name: subagent.name, description: (_a = subagent.description) !== null && _a !== void 0 ? _a : subagent.name, prompt: subagentPrompt(subagent) }, (subagent.model === undefined ? {} : { model: subagent.model }))); });
1952
+ }
1900
1953
  function describeError(error) {
1901
1954
  return error instanceof Error ? error.message : String(error);
1902
1955
  }