@cursor/july 0.1.17 → 0.1.19

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 (143) hide show
  1. package/dist/bin/agent-serve.js +20 -3
  2. package/dist/channels/slack/cursor-account.d.ts.map +1 -1
  3. package/dist/channels/slack/cursor-account.js +1 -1
  4. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  5. package/dist/channels/slack/dispatch.js +4 -1
  6. package/dist/channels/slack/inbound.d.ts.map +1 -1
  7. package/dist/channels/slack/inbound.js +6 -1
  8. package/dist/channels/slack/index.d.ts +1 -0
  9. package/dist/channels/slack/index.d.ts.map +1 -1
  10. package/dist/channels/slack/index.js +1 -0
  11. package/dist/channels/slack/init.d.ts.map +1 -1
  12. package/dist/channels/slack/init.js +4 -1
  13. package/dist/channels/slack/interactive.d.ts.map +1 -1
  14. package/dist/channels/slack/interactive.js +1 -0
  15. package/dist/channels/slack/manifest.d.ts +10 -0
  16. package/dist/channels/slack/manifest.d.ts.map +1 -1
  17. package/dist/channels/slack/manifest.js +33 -14
  18. package/dist/channels/slack/message-body.d.ts +13 -0
  19. package/dist/channels/slack/message-body.d.ts.map +1 -0
  20. package/dist/channels/slack/message-body.js +82 -0
  21. package/dist/channels/slack/thread-context.d.ts +0 -2
  22. package/dist/channels/slack/thread-context.d.ts.map +1 -1
  23. package/dist/channels/slack/thread-context.js +1 -65
  24. package/dist/channels/slack/types.d.ts +16 -1
  25. package/dist/channels/slack/types.d.ts.map +1 -1
  26. package/dist/docs/404.html +2 -2
  27. package/dist/docs/ab.html +3 -3
  28. package/dist/docs/assets/{app.BbEXr2KO.js → app.CrsWMchO.js} +1 -1
  29. package/dist/docs/assets/chunks/@localSearchIndexroot.BnHRjfoe.js +1 -0
  30. package/dist/docs/assets/chunks/{VPLocalSearchBox.DBEi4HDp.js → VPLocalSearchBox.D1JqzSh8.js} +1 -1
  31. package/dist/docs/assets/chunks/{theme.DGfptcHw.js → theme.DaBvZYwl.js} +2 -2
  32. package/dist/docs/assets/{example-agents_security-reviewer.md.BZSNycMf.js → example-agents_security-reviewer.md.Dhj_m7_B.js} +1 -1
  33. package/dist/docs/building-with-agents.html +3 -3
  34. package/dist/docs/concepts.html +3 -3
  35. package/dist/docs/deployment.html +3 -3
  36. package/dist/docs/evals.html +3 -3
  37. package/dist/docs/example-agents/approval-buddy.html +3 -3
  38. package/dist/docs/example-agents/benny.html +3 -3
  39. package/dist/docs/example-agents/bugbot.html +3 -3
  40. package/dist/docs/example-agents/codebase-wiki.html +3 -3
  41. package/dist/docs/example-agents/codeowners-review.html +3 -3
  42. package/dist/docs/example-agents/concierge.html +3 -3
  43. package/dist/docs/example-agents/fsd.html +3 -3
  44. package/dist/docs/example-agents/index.html +3 -3
  45. package/dist/docs/example-agents/knowledge-base.html +3 -3
  46. package/dist/docs/example-agents/oncall.html +3 -3
  47. package/dist/docs/example-agents/security-reviewer.html +5 -5
  48. package/dist/docs/example-agents/slack-agent.html +3 -3
  49. package/dist/docs/example-agents/weather-agent.html +3 -3
  50. package/dist/docs/guides/agent-to-agent.html +3 -3
  51. package/dist/docs/guides/cloud-runtime.html +3 -3
  52. package/dist/docs/guides/github.html +3 -3
  53. package/dist/docs/guides/human-in-the-loop.html +3 -3
  54. package/dist/docs/guides/mcp-oauth.html +3 -3
  55. package/dist/docs/guides/slack.html +3 -3
  56. package/dist/docs/guides/webhooks.html +3 -3
  57. package/dist/docs/hashmap.json +1 -1
  58. package/dist/docs/hillclimbing.html +3 -3
  59. package/dist/docs/index.html +3 -3
  60. package/dist/docs/quickstart.html +3 -3
  61. package/dist/docs/reference/agent-config.html +3 -3
  62. package/dist/docs/reference/channels.html +3 -3
  63. package/dist/docs/reference/cli.html +3 -3
  64. package/dist/docs/reference/connections.html +3 -3
  65. package/dist/docs/reference/hooks.html +3 -3
  66. package/dist/docs/reference/http-api.html +3 -3
  67. package/dist/docs/reference/instructions.html +3 -3
  68. package/dist/docs/reference/playground.html +3 -3
  69. package/dist/docs/reference/project-layout.html +3 -3
  70. package/dist/docs/reference/prompt.html +3 -3
  71. package/dist/docs/reference/schedules.html +3 -3
  72. package/dist/docs/reference/sessions.html +3 -3
  73. package/dist/docs/reference/skills.html +3 -3
  74. package/dist/docs/reference/subagents.html +3 -3
  75. package/dist/docs/reference/tools.html +3 -3
  76. package/dist/docs/scaffolding-agents.html +3 -3
  77. package/dist/docs/storage.html +3 -3
  78. package/dist/docs/troubleshooting.html +3 -3
  79. package/dist/internal/builtin-tools/index.d.ts +10 -0
  80. package/dist/internal/builtin-tools/index.d.ts.map +1 -0
  81. package/dist/internal/builtin-tools/index.js +27 -0
  82. package/dist/internal/builtin-tools/reminders.d.ts +9 -0
  83. package/dist/internal/builtin-tools/reminders.d.ts.map +1 -0
  84. package/dist/internal/builtin-tools/reminders.js +138 -0
  85. package/dist/internal/cli-skills.d.ts +19 -0
  86. package/dist/internal/cli-skills.d.ts.map +1 -0
  87. package/dist/internal/cli-skills.js +72 -0
  88. package/dist/internal/cli-slack.d.ts.map +1 -1
  89. package/dist/internal/cli-slack.js +36 -15
  90. package/dist/internal/cursor-event-relay.d.ts +30 -0
  91. package/dist/internal/cursor-event-relay.d.ts.map +1 -1
  92. package/dist/internal/cursor-event-relay.js +37 -0
  93. package/dist/internal/discovery.d.ts.map +1 -1
  94. package/dist/internal/discovery.js +41 -0
  95. package/dist/internal/install-cursor-skills.d.ts +46 -4
  96. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  97. package/dist/internal/install-cursor-skills.js +117 -49
  98. package/dist/internal/reminder-runner.d.ts +7 -0
  99. package/dist/internal/reminder-runner.d.ts.map +1 -1
  100. package/dist/internal/reminder-runner.js +21 -0
  101. package/dist/internal/sdk-runner.d.ts +15 -0
  102. package/dist/internal/sdk-runner.d.ts.map +1 -1
  103. package/dist/internal/sdk-runner.js +113 -13
  104. package/dist/internal/server.d.ts.map +1 -1
  105. package/dist/internal/server.js +1 -0
  106. package/dist/internal/session-engine.d.ts.map +1 -1
  107. package/dist/internal/session-engine.js +9 -0
  108. package/dist/internal/slack-provision-client.d.ts +6 -3
  109. package/dist/internal/slack-provision-client.d.ts.map +1 -1
  110. package/dist/internal/slack-provision-client.js +5 -3
  111. package/dist/playground/assets/{index-DNqirsrK.js → index-C2SU2xV5.js} +43 -43
  112. package/dist/playground/index.html +1 -1
  113. package/dist/types.d.ts +28 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/docs/example-agents/security-reviewer.md +1 -1
  116. package/package.json +1 -1
  117. package/skills/setup-slack/SKILL.md +4 -0
  118. package/src/bin/agent-serve.ts +21 -3
  119. package/src/channels/slack/cursor-account.ts +1 -0
  120. package/src/channels/slack/dispatch.ts +3 -1
  121. package/src/channels/slack/inbound.ts +6 -1
  122. package/src/channels/slack/index.ts +1 -0
  123. package/src/channels/slack/init.ts +3 -0
  124. package/src/channels/slack/interactive.ts +1 -0
  125. package/src/channels/slack/manifest.ts +34 -6
  126. package/src/channels/slack/message-body.ts +90 -0
  127. package/src/channels/slack/thread-context.ts +1 -69
  128. package/src/channels/slack/types.ts +16 -1
  129. package/src/internal/builtin-tools/index.ts +40 -0
  130. package/src/internal/builtin-tools/reminders.ts +158 -0
  131. package/src/internal/cli-skills.ts +95 -0
  132. package/src/internal/cli-slack.ts +38 -14
  133. package/src/internal/cursor-event-relay.ts +67 -0
  134. package/src/internal/discovery.ts +52 -0
  135. package/src/internal/install-cursor-skills.ts +168 -60
  136. package/src/internal/reminder-runner.ts +30 -0
  137. package/src/internal/sdk-runner.ts +131 -13
  138. package/src/internal/server.ts +2 -0
  139. package/src/internal/session-engine.ts +14 -0
  140. package/src/internal/slack-provision-client.ts +7 -3
  141. package/src/types.ts +33 -0
  142. package/dist/docs/assets/chunks/@localSearchIndexroot.DCBsrfwP.js +0 -1
  143. /package/dist/docs/assets/{example-agents_security-reviewer.md.BZSNycMf.lean.js → example-agents_security-reviewer.md.Dhj_m7_B.lean.js} +0 -0
@@ -11,6 +11,28 @@
11
11
  */
12
12
  import { RelayOffsetStore } from "./cursor-relay-core.js";
13
13
  export { RelayOffsetStore };
14
+ /**
15
+ * Comment snapshot from scm-events compact metadata. Carries what the GitHub
16
+ * channel's `issue_comment` / `pull_request_review_comment` Zod schemas
17
+ * require so relayed comment wakes parse without re-fetching the comment.
18
+ */
19
+ export type CursorScmCommentMeta = {
20
+ id: number;
21
+ body: string;
22
+ htmlUrl: string;
23
+ authorLogin?: string;
24
+ /**
25
+ * GitHub `user.type` ("User", "Bot", …). Carried onto the stubbed
26
+ * `comment.user` / `sender` so `isGitHubAppBotAuthor` keeps recognizing
27
+ * the agent's own comments on the relay path (self/bot-loop gate).
28
+ */
29
+ authorType?: string;
30
+ /** Review comments only. */
31
+ path?: string;
32
+ line?: number;
33
+ pullRequestReviewId?: number;
34
+ inReplyToId?: number;
35
+ };
14
36
  /** PR snapshot from scm-events compact metadata (Sand-style; no raw body). */
15
37
  export type CursorScmPullRequestMeta = {
16
38
  number: number;
@@ -45,6 +67,11 @@ export interface CursorScmEvent {
45
67
  * stub a Zod-valid GitHub `pull_request` webhook body.
46
68
  */
47
69
  pullRequest?: CursorScmPullRequestMeta;
70
+ /**
71
+ * Comment snapshot when the backend saw `body.comment`. Enough to stub a
72
+ * Zod-valid `issue_comment` / `pull_request_review_comment` webhook body.
73
+ */
74
+ comment?: CursorScmCommentMeta;
48
75
  /** GitHub-side event time from the payload, when present. */
49
76
  occurredAtMs?: number;
50
77
  }
@@ -80,6 +107,8 @@ export declare function formatCursorScmEventLog(event: {
80
107
  * Minimal GitHub webhook body from an SCM-events metadata envelope.
81
108
  * When `pullRequest` has title + head/base refs+shas, emits a Zod-valid
82
109
  * `pull_request` object for `onPullRequest`; otherwise identity-only stubs.
110
+ * When `comment` is present, emits a Zod-valid `comment` object so relayed
111
+ * `issue_comment` / `pull_request_review_comment` deliveries dispatch.
83
112
  */
84
113
  export declare function scmMetadataToGitHubPayload(event: {
85
114
  repo: string;
@@ -87,6 +116,7 @@ export declare function scmMetadataToGitHubPayload(event: {
87
116
  prNumber?: number;
88
117
  prUrl?: string;
89
118
  pullRequest?: CursorScmPullRequestMeta;
119
+ comment?: CursorScmCommentMeta;
90
120
  }): Record<string, unknown>;
91
121
  /**
92
122
  * GitHub SCM-events relay: a thin {@link CursorRelayCore} adapter. Consumers
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-event-relay.d.ts","sourceRoot":"","sources":["../../src/internal/cursor-event-relay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor-event-relay.d.ts","sourceRoot":"","sources":["../../src/internal/cursor-event-relay.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,8 @@ export function formatCursorScmEventLog(event) {
40
40
  * Minimal GitHub webhook body from an SCM-events metadata envelope.
41
41
  * When `pullRequest` has title + head/base refs+shas, emits a Zod-valid
42
42
  * `pull_request` object for `onPullRequest`; otherwise identity-only stubs.
43
+ * When `comment` is present, emits a Zod-valid `comment` object so relayed
44
+ * `issue_comment` / `pull_request_review_comment` deliveries dispatch.
43
45
  */
44
46
  export function scmMetadataToGitHubPayload(event) {
45
47
  var _a, _b, _c;
@@ -59,6 +61,41 @@ export function scmMetadataToGitHubPayload(event) {
59
61
  },
60
62
  };
61
63
  payload.action = event.action;
64
+ const commentMeta = event.comment;
65
+ if (commentMeta !== undefined) {
66
+ const comment = {
67
+ id: commentMeta.id,
68
+ body: commentMeta.body,
69
+ html_url: commentMeta.htmlUrl,
70
+ };
71
+ if (commentMeta.authorLogin !== undefined) {
72
+ const author = {
73
+ login: commentMeta.authorLogin,
74
+ };
75
+ if (commentMeta.authorType !== undefined) {
76
+ // Without user.type the isGitHubAppBotAuthor gate fails open and the
77
+ // agent's own relayed comments could wake it again (bot loop).
78
+ author.type = commentMeta.authorType;
79
+ }
80
+ comment.user = author;
81
+ // The comment author is the closest thing the envelope has to the
82
+ // webhook sender; channels use it for self/bot-loop gates.
83
+ payload.sender = Object.assign({}, author);
84
+ }
85
+ if (commentMeta.path !== undefined) {
86
+ comment.path = commentMeta.path;
87
+ }
88
+ if (commentMeta.line !== undefined) {
89
+ comment.line = commentMeta.line;
90
+ }
91
+ if (commentMeta.pullRequestReviewId !== undefined) {
92
+ comment.pull_request_review_id = commentMeta.pullRequestReviewId;
93
+ }
94
+ if (commentMeta.inReplyToId !== undefined) {
95
+ comment.in_reply_to_id = commentMeta.inReplyToId;
96
+ }
97
+ payload.comment = comment;
98
+ }
62
99
  const title = prMeta === null || prMeta === void 0 ? void 0 : prMeta.title;
63
100
  const headRef = prMeta === null || prMeta === void 0 ? void 0 : prMeta.headRef;
64
101
  const headSha = prMeta === null || prMeta === void 0 ? void 0 : prMeta.headSha;
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/internal/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAMrB,KAAK,UAAU,EAqBhB,MAAM,aAAa,CAAC;AAqBrB,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3E;AAmBD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,EAAE,CAAC,CA2B1B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAoBzD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAAuB,GAAG;IACjC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACtB,GACL,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAgBzD;AAWD,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAIrC,CAAC;AAEH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,CAAC,CA8DvB;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAElE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAOnE;AA8nBD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB3E;AAgmBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,CAoInE"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/internal/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAQrB,KAAK,UAAU,EAqBhB,MAAM,aAAa,CAAC;AAsBrB,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3E;AAmBD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,EAAE,CAAC,CA2B1B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAoBzD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAAuB,GAAG;IACjC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACtB,GACL,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAgBzD;AAWD,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAIrC,CAAC;AAEH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,CAAC,CA8DvB;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAElE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAOnE;AAuoBD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB3E;AAwoBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,CAoInE"}
@@ -34,6 +34,7 @@ import { cursorAccountServersHasMixedWildcard, DEFAULT_MODEL, MAX_RUNNING_TURNS_
34
34
  import { registerAuthoredModuleLoaders } from "./authored-loaders.js";
35
35
  import { normalizePositiveInt } from "./bounded-int.js";
36
36
  import { getDefinitionKind } from "./brand.js";
37
+ import { builtinTools } from "./builtin-tools/index.js";
37
38
  import { isValidCron } from "./cron.js";
38
39
  import { parseFrontmatter } from "./frontmatter.js";
39
40
  import { isReservedSecretName, MAX_EGRESS_DOMAINS, validateEgressDomain, validateSecretName, } from "./hosting.js";
@@ -253,6 +254,13 @@ function loadAgent(ctx, agentDir, options) {
253
254
  // warn that they exist.
254
255
  if (!options.isRoot) {
255
256
  yield warnUnsupportedSubagentSlots(ctx, agentDir);
257
+ if ((config === null || config === void 0 ? void 0 : config.builtinTools) !== undefined) {
258
+ ctx.diagnostics.push({
259
+ severity: "warning",
260
+ path: displayPath(ctx, join(agentDir, "agent.ts")),
261
+ message: "builtinTools is not supported on subagents; ignoring.",
262
+ });
263
+ }
256
264
  return Object.assign(Object.assign(Object.assign(Object.assign({ name }, ((config === null || config === void 0 ? void 0 : config.description) === undefined
257
265
  ? {}
258
266
  : { description: config.description })), ((config === null || config === void 0 ? void 0 : config.model) === undefined ? {} : { model: config.model })), (instructions === undefined ? {} : { instructions })), { runtime: "local", tools: [], skills: [], connections: [], subagents: [], seedFiles: [] });
@@ -294,6 +302,7 @@ function loadAgent(ctx, agentDir, options) {
294
302
  hasCloudOptions: cloud !== undefined,
295
303
  });
296
304
  }
305
+ appendBuiltinTools(ctx, agentDir, tools, config === null || config === void 0 ? void 0 : config.builtinTools, runtime);
297
306
  return {
298
307
  name,
299
308
  description: config === null || config === void 0 ? void 0 : config.description,
@@ -939,6 +948,38 @@ function warnUnsupportedSubagentSlots(ctx, subagentDir) {
939
948
  }
940
949
  });
941
950
  }
951
+ /**
952
+ * Append enabled built-in tools after authored tools. Authored tools with
953
+ * the same name win; built-ins are server tools, so cloud runtimes get a
954
+ * warning instead of tools.
955
+ */
956
+ function appendBuiltinTools(ctx, agentDir, tools, config, runtime) {
957
+ const builtin = builtinTools(config);
958
+ if (builtin.length === 0) {
959
+ return;
960
+ }
961
+ const agentPath = displayPath(ctx, join(agentDir, "agent.ts"));
962
+ if (runtime === "cloud") {
963
+ ctx.diagnostics.push({
964
+ severity: "warning",
965
+ path: agentPath,
966
+ message: "builtinTools are in-process server tools and are not available on cloud agents; they are skipped.",
967
+ });
968
+ return;
969
+ }
970
+ const authored = new Set(tools.map((tool) => tool.name));
971
+ for (const tool of builtin) {
972
+ if (authored.has(tool.name)) {
973
+ ctx.diagnostics.push({
974
+ severity: "warning",
975
+ path: agentPath,
976
+ message: `Authored tool "${tool.name}" shadows the built-in tool of the same name; the authored tool wins.`,
977
+ });
978
+ continue;
979
+ }
980
+ tools.push(tool);
981
+ }
982
+ }
942
983
  function warnCloudRuntimeLimitations(ctx, agentDir, counts) {
943
984
  const agentPath = displayPath(ctx, join(agentDir, "agent.ts"));
944
985
  if (!counts.hasCloudOptions) {
@@ -8,6 +8,8 @@
8
8
  */
9
9
  /** Category folder under ~/.cursor/skills (Cursor discovers nested skills). */
10
10
  export declare const CURSOR_SKILLS_NAMESPACE = "agentkit";
11
+ /** How long the `init` offer waits for an answer before skipping the install. */
12
+ export declare const SKILL_PROMPT_TIMEOUT_MS = 45000;
11
13
  export interface PackageSkill {
12
14
  /** Frontmatter `name` (e.g. agentkit-create-agent). */
13
15
  name: string;
@@ -35,30 +37,70 @@ export declare function findMissingCursorSkills(options?: {
35
37
  packageRoot?: string;
36
38
  skillsHome?: string;
37
39
  }): Promise<PackageSkill[]>;
40
+ export interface SkillInstallResult {
41
+ /** Leaf dirs written. */
42
+ installed: string[];
43
+ /** Leaf dirs deleted because the package no longer ships them. */
44
+ removed: string[];
45
+ }
38
46
  /**
39
47
  * Copy each skill directory into `skillsHome/agentkit/<leafDir>/`.
40
48
  * Always overwrites so a package upgrade refreshes local Cursor skills.
41
49
  * Strips monorepo-only frontmatter and removes leaf dirs no longer shipped.
42
50
  */
43
- export declare function installCursorSkills(skills: readonly PackageSkill[], skillsHome?: string): Promise<string[]>;
51
+ export declare function installCursorSkills(skills: readonly PackageSkill[], skillsHome?: string): Promise<SkillInstallResult>;
44
52
  /** Drop monorepo `paths` globs and fix package doc links for ~/.cursor installs. */
45
53
  export declare function prepareSkillMarkdownForCursorInstall(content: string): string;
54
+ export interface SkillInstallPlan {
55
+ shipped: PackageSkill[];
56
+ /** Resolved `~/.cursor/skills`, to install into. */
57
+ skillsHome: string;
58
+ /** Install target: `<skillsHome>/agentkit`. */
59
+ directory: string;
60
+ /** Leaf dirs the package ships. */
61
+ leaves: string[];
62
+ /** Nothing installed yet, so this is a fresh install rather than a refresh. */
63
+ firstInstall: boolean;
64
+ /** Installed leaf dirs the package dropped; installing deletes them. */
65
+ orphans: string[];
66
+ }
67
+ /** What an install would do, for the offer and for `install-skills`. */
68
+ export declare function planSkillInstall(options?: {
69
+ packageRoot?: string;
70
+ skillsHome?: string;
71
+ }): Promise<SkillInstallPlan>;
72
+ /** `Installed 9 agentkit skills`, what it dropped, and where it went. */
73
+ export declare function formatSkillInstall(plan: SkillInstallPlan, result: SkillInstallResult): string;
46
74
  export interface OfferInstallCursorSkillsOptions {
47
75
  /** Skip when false (non-TTY / `--json`). */
48
76
  interactive?: boolean;
49
77
  packageRoot?: string;
50
78
  skillsHome?: string;
51
- /** Injected yes/no for tests. */
52
- confirm?: (question: string) => Promise<boolean>;
79
+ /** Injected yes/no for tests. `undefined` means the prompt went unanswered. */
80
+ confirm?: (question: string) => Promise<boolean | undefined>;
53
81
  out?: (text: string) => void;
54
82
  }
55
83
  /**
56
84
  * On a TTY, offer to install/update every shipped package skill into
57
85
  * ~/.cursor/skills/agentkit (always overwriting). No-op when non-interactive
58
- * or the package ships no skills.
86
+ * or the package ships no skills. An unanswered prompt skips the install
87
+ * rather than blocking the caller — see `SKILL_PROMPT_TIMEOUT_MS`.
59
88
  */
60
89
  export declare function offerInstallCursorSkills(options?: OfferInstallCursorSkillsOptions): Promise<{
61
90
  installed: string[];
62
91
  skipped: boolean;
63
92
  }>;
93
+ export interface PromptYesNoOptions {
94
+ defaultYes: boolean;
95
+ out: (text: string) => void;
96
+ /** Give up after this long; `0` (or omitted) waits forever. */
97
+ timeoutMs?: number;
98
+ /** Answer source; defaults to `process.stdin`. */
99
+ input?: NodeJS.ReadableStream;
100
+ }
101
+ /**
102
+ * Ask a yes/no question. Resolves `undefined` when the answer never comes —
103
+ * the prompt timed out, or stdin closed on an empty line.
104
+ */
105
+ export declare function promptYesNo(question: string, options: PromptYesNoOptions): Promise<boolean | undefined>;
64
106
  //# sourceMappingURL=install-cursor-skills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,GAAE,MAAsC,GAC3C,MAAM,CAGR;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,CACrC,UAAU,GAAE,MAA2B,GACtC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EACpC,UAAU,GAAE,MAA2B,GACtC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,GAAE,MAAyB,GACrC,OAAO,CAAC,YAAY,EAAE,CAAC,CA2BzB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAY1B;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,UAAU,GAAE,MAA2B,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCnB;AAED,oFAAoF;AACpF,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY5E;AAoBD,MAAM,WAAW,+BAA+B;IAC9C,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+CpD"}
1
+ {"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,GAAE,MAAsC,GAC3C,MAAM,CAGR;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,CACrC,UAAU,GAAE,MAA2B,GACtC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EACpC,UAAU,GAAE,MAA2B,GACtC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,GAAE,MAAyB,GACrC,OAAO,CAAC,YAAY,EAAE,CAAC,CA2BzB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAY1B;AAED,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,UAAU,GAAE,MAA2B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CAsB7B;AAmBD,oFAAoF;AACpF,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY5E;AAoBD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+EAA+E;IAC/E,YAAY,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgB5B;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,kBAAkB,GACzB,MAAM,CASR;AAED,MAAM,WAAW,+BAA+B;IAC9C,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA2DpD;AAmBD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAsB9B"}
@@ -18,12 +18,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
18
18
  import { access, cp, mkdir, readdir, readFile, rm, writeFile, } from "node:fs/promises";
19
19
  import { homedir } from "node:os";
20
20
  import { join } from "node:path";
21
- import { packageRootDir } from "./distribution.js";
21
+ import { CLI_COMMAND_NAME, packageRootDir } from "./distribution.js";
22
22
  import { stdoutPalette } from "./terminal-style.js";
23
23
  /** Monorepo-only skill; excluded from the published package. */
24
24
  const SKIP_SKILL_DIRS = new Set(["operate"]);
25
25
  /** Category folder under ~/.cursor/skills (Cursor discovers nested skills). */
26
26
  export const CURSOR_SKILLS_NAMESPACE = "agentkit";
27
+ /** How long the `init` offer waits for an answer before skipping the install. */
28
+ export const SKILL_PROMPT_TIMEOUT_MS = 45000;
27
29
  export function cursorSkillsHome(home) {
28
30
  var _a;
29
31
  if (home === void 0) { home = (_a = process.env.HOME) !== null && _a !== void 0 ? _a : homedir(); }
@@ -105,21 +107,9 @@ export function installCursorSkills(skills_1) {
105
107
  return __awaiter(this, arguments, void 0, function* (skills, skillsHome = cursorSkillsHome()) {
106
108
  const namespaceDir = agentkitCursorSkillsDir(skillsHome);
107
109
  yield mkdir(namespaceDir, { recursive: true });
108
- const shippedLeaves = new Set(skills.map((skill) => skill.leafDir));
109
- let existingLeaves = [];
110
- try {
111
- const entries = yield readdir(namespaceDir, { withFileTypes: true });
112
- existingLeaves = entries
113
- .filter((entry) => entry.isDirectory())
114
- .map((entry) => entry.name);
115
- }
116
- catch (_a) {
117
- existingLeaves = [];
118
- }
119
- for (const leaf of existingLeaves) {
120
- if (!shippedLeaves.has(leaf)) {
121
- yield rm(join(namespaceDir, leaf), { recursive: true, force: true });
122
- }
110
+ const removed = yield orphanLeaves(namespaceDir, skills);
111
+ for (const leaf of removed) {
112
+ yield rm(join(namespaceDir, leaf), { recursive: true, force: true });
123
113
  }
124
114
  const installed = [];
125
115
  for (const skill of skills) {
@@ -133,7 +123,23 @@ export function installCursorSkills(skills_1) {
133
123
  }
134
124
  installed.push(skill.leafDir);
135
125
  }
136
- return installed;
126
+ return { installed, removed };
127
+ });
128
+ }
129
+ /** Installed leaf dirs the package no longer ships. Installing deletes these. */
130
+ function orphanLeaves(namespaceDir, skills) {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ const shipped = new Set(skills.map((skill) => skill.leafDir));
133
+ let entries;
134
+ try {
135
+ entries = yield readdir(namespaceDir, { withFileTypes: true });
136
+ }
137
+ catch (_a) {
138
+ return [];
139
+ }
140
+ return entries
141
+ .filter((entry) => entry.isDirectory() && !shipped.has(entry.name))
142
+ .map((entry) => entry.name);
137
143
  });
138
144
  }
139
145
  /** Drop monorepo `paths` globs and fix package doc links for ~/.cursor installs. */
@@ -166,48 +172,88 @@ function stripPathsFromFrontmatter(frontmatter) {
166
172
  }
167
173
  return out.join("\n");
168
174
  }
175
+ /** What an install would do, for the offer and for `install-skills`. */
176
+ export function planSkillInstall(options) {
177
+ return __awaiter(this, void 0, void 0, function* () {
178
+ var _a;
179
+ const skillsHome = (_a = options === null || options === void 0 ? void 0 : options.skillsHome) !== null && _a !== void 0 ? _a : cursorSkillsHome();
180
+ const directory = agentkitCursorSkillsDir(skillsHome);
181
+ const shipped = yield listShippedPackageSkills(options === null || options === void 0 ? void 0 : options.packageRoot);
182
+ const missing = yield findMissingCursorSkills({
183
+ packageRoot: options === null || options === void 0 ? void 0 : options.packageRoot,
184
+ skillsHome,
185
+ });
186
+ return {
187
+ shipped,
188
+ skillsHome,
189
+ directory,
190
+ leaves: shipped.map((skill) => skill.leafDir),
191
+ firstInstall: missing.length === shipped.length,
192
+ orphans: yield orphanLeaves(directory, shipped),
193
+ };
194
+ });
195
+ }
196
+ /** `Installed 9 agentkit skills`, what it dropped, and where it went. */
197
+ export function formatSkillInstall(plan, result) {
198
+ const noun = result.installed.length === 1 ? "skill" : "skills";
199
+ const verb = plan.firstInstall ? "Installed" : "Updated";
200
+ const lines = [`${verb} ${result.installed.length} agentkit ${noun}`];
201
+ if (result.removed.length > 0) {
202
+ lines.push(` removed: ${result.removed.join(", ")}`);
203
+ }
204
+ lines.push(` location: ${plan.directory}`);
205
+ return `${lines.join("\n")}\n`;
206
+ }
169
207
  /**
170
208
  * On a TTY, offer to install/update every shipped package skill into
171
209
  * ~/.cursor/skills/agentkit (always overwriting). No-op when non-interactive
172
- * or the package ships no skills.
210
+ * or the package ships no skills. An unanswered prompt skips the install
211
+ * rather than blocking the caller — see `SKILL_PROMPT_TIMEOUT_MS`.
173
212
  */
174
213
  export function offerInstallCursorSkills() {
175
214
  return __awaiter(this, arguments, void 0, function* (options = {}) {
176
- var _a, _b, _c, _d;
215
+ var _a, _b, _c;
177
216
  const out = (_a = options.out) !== null && _a !== void 0 ? _a : ((text) => process.stdout.write(text));
178
217
  const interactive = (_b = options.interactive) !== null && _b !== void 0 ? _b : (process.stdin.isTTY === true && process.stdout.isTTY === true);
179
- const shipped = yield listShippedPackageSkills(options.packageRoot);
180
- if (shipped.length === 0) {
218
+ if (!interactive) {
181
219
  return { installed: [], skipped: true };
182
220
  }
183
- const home = (_c = options.skillsHome) !== null && _c !== void 0 ? _c : cursorSkillsHome();
184
- const targetDir = agentkitCursorSkillsDir(home);
185
- const missing = yield findMissingCursorSkills({
221
+ const plan = yield planSkillInstall({
186
222
  packageRoot: options.packageRoot,
187
- skillsHome: home,
223
+ skillsHome: options.skillsHome,
188
224
  });
189
- const names = shipped.map((skill) => skill.leafDir).join(", ");
190
- const noun = shipped.length === 1 ? "skill" : "skills";
191
- const verb = missing.length === shipped.length ? "Install" : "Update";
192
- const question = `${verb} ${shipped.length} agentkit ${noun} in ${targetDir}?`;
193
- if (!interactive) {
225
+ if (plan.shipped.length === 0) {
194
226
  return { installed: [], skipped: true };
195
227
  }
228
+ const noun = plan.shipped.length === 1 ? "skill" : "skills";
229
+ const verb = plan.firstInstall ? "Install" : "Update";
196
230
  const c = stdoutPalette();
197
- out(`${question}\n`);
198
- out(c.dim(` ${names}\n`));
199
- if (missing.length < shipped.length) {
231
+ out(`${verb} ${plan.shipped.length} agentkit ${noun} in ${plan.directory}?\n`);
232
+ out(c.dim(` ${plan.leaves.join(", ")}\n`));
233
+ if (!plan.firstInstall) {
200
234
  out(c.dim(" (overwrites existing copies with the package version)\n"));
201
235
  }
202
- const confirm = (_d = options.confirm) !== null && _d !== void 0 ? _d : ((q) => promptYesNo(q, { defaultYes: true, out }));
203
- const accepted = yield confirm(missing.length === shipped.length ? "Install now?" : "Update now?");
204
- if (!accepted) {
205
- out(c.dim("Skipped skill install.\n\n"));
236
+ if (plan.orphans.length > 0) {
237
+ out(c.dim(` (deletes ${plan.orphans.join(", ")})\n`));
238
+ }
239
+ const confirm = (_c = options.confirm) !== null && _c !== void 0 ? _c : ((q) => promptYesNo(q, {
240
+ defaultYes: true,
241
+ out,
242
+ timeoutMs: SKILL_PROMPT_TIMEOUT_MS,
243
+ }));
244
+ const accepted = yield confirm(`${verb} now?`);
245
+ if (accepted !== true) {
246
+ // `undefined` is the prompt timing out or stdin closing; both mean nobody
247
+ // said yes, so do not claim a duration neither case is guaranteed to have.
248
+ const why = accepted === undefined
249
+ ? "No answer — skipped the skill install."
250
+ : "Skipped skill install.";
251
+ out(c.dim(`${why}\nInstall later: ${CLI_COMMAND_NAME} install-skills (${plan.directory})\n\n`));
206
252
  return { installed: [], skipped: true };
207
253
  }
208
- const installed = yield installCursorSkills(shipped, home);
209
- out(`${verb === "Install" ? "Installed" : "Updated"} ${installed.length} ${noun} in ${targetDir}\n\n`);
210
- return { installed, skipped: false };
254
+ const result = yield installCursorSkills(plan.shipped, plan.skillsHome);
255
+ out(`${formatSkillInstall(plan, result)}\n`);
256
+ return { installed: result.installed, skipped: false };
211
257
  });
212
258
  }
213
259
  function parseSkillName(skillMd) {
@@ -228,14 +274,24 @@ function parseSkillName(skillMd) {
228
274
  // Strip optional quotes around the YAML scalar.
229
275
  return raw.replace(/^["']|["']$/g, "");
230
276
  }
231
- function promptYesNo(question, options) {
277
+ /**
278
+ * Ask a yes/no question. Resolves `undefined` when the answer never comes —
279
+ * the prompt timed out, or stdin closed on an empty line.
280
+ */
281
+ export function promptYesNo(question, options) {
232
282
  return __awaiter(this, void 0, void 0, function* () {
283
+ var _a;
233
284
  const hint = options.defaultYes ? "Y/n" : "y/N";
285
+ const input = (_a = options.input) !== null && _a !== void 0 ? _a : process.stdin;
234
286
  options.out(`${question} [${hint}] `);
235
- process.stdin.resume();
236
- const line = yield readOneLine(process.stdin);
237
- process.stdin.pause();
238
- if (line === undefined || line.trim() === "") {
287
+ input.resume();
288
+ const line = yield readOneLine(input, options.timeoutMs);
289
+ input.pause();
290
+ if (line === undefined) {
291
+ options.out("\n");
292
+ return undefined;
293
+ }
294
+ if (line.trim() === "") {
239
295
  return options.defaultYes;
240
296
  }
241
297
  const answer = line.trim().toLowerCase();
@@ -248,9 +304,11 @@ function promptYesNo(question, options) {
248
304
  return options.defaultYes;
249
305
  });
250
306
  }
251
- function readOneLine(stream) {
307
+ /** The line, or `undefined` when the stream ends or the clock runs out first. */
308
+ function readOneLine(stream, timeoutMs) {
252
309
  return new Promise((resolve) => {
253
310
  let buffer = "";
311
+ let timer;
254
312
  const onData = (chunk) => {
255
313
  buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
256
314
  const newline = buffer.indexOf("\n");
@@ -260,15 +318,25 @@ function readOneLine(stream) {
260
318
  cleanup();
261
319
  resolve(buffer.slice(0, newline).replace(/\r$/, ""));
262
320
  };
263
- const onEnd = () => {
321
+ // EOF and the timeout both land here. A tty holds a half-typed line until
322
+ // Enter, so a non-empty buffer only ever happens on piped input.
323
+ const giveUp = () => {
264
324
  cleanup();
265
325
  resolve(buffer === "" ? undefined : buffer.replace(/\r$/, ""));
266
326
  };
267
327
  const cleanup = () => {
328
+ if (timer !== undefined) {
329
+ clearTimeout(timer);
330
+ }
268
331
  stream.off("data", onData);
269
- stream.off("end", onEnd);
332
+ stream.off("end", giveUp);
270
333
  };
271
334
  stream.on("data", onData);
272
- stream.on("end", onEnd);
335
+ stream.on("end", giveUp);
336
+ if (timeoutMs !== undefined && timeoutMs > 0) {
337
+ timer = setTimeout(giveUp, timeoutMs);
338
+ // Never keep the process alive purely to wait for an answer.
339
+ timer.unref();
340
+ }
273
341
  });
274
342
  }
@@ -42,6 +42,13 @@ export declare class ReminderRunner {
42
42
  cancel(id: string, reason?: string): Promise<ReminderInfo | undefined>;
43
43
  /** Cancel all armed reminders matching a continuation token (e.g. PR closed). */
44
44
  cancelForContinuation(continuationToken: string, reason: string): Promise<number>;
45
+ /**
46
+ * Re-key armed reminders when a channel rotates a session's continuation
47
+ * token (the built-in HTTP channel rotates after every follow-up). Without
48
+ * this, a reminder armed before the rotation misses its session at fire
49
+ * time and disarms as `session_gone`.
50
+ */
51
+ rekeyContinuation(channelId: string, oldToken: string, newToken: string): Promise<number>;
45
52
  /** Fire one reminder immediately (dev / hillclimb). */
46
53
  dispatch(reminderId: string): Promise<{
47
54
  reminderId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"reminder-runner.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAEV,mBAAmB,EAGnB,YAAY,EAEb,MAAM,aAAa,CAAC;AASrB,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE;IAFzC,YACE,UAAU,EAAE,MAAM,EACT,oBAAoB,EAAE,MAAM,EAAE,EAIxC;CACF;AAyDD,qBAAa,cAAc;IAUvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,OAAO,CAAS;IAExB,YACmB,MAAM,EAAE,aAAa,EACrB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe,EAG3D;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B3B;IAED;;;OAGG;YACW,kBAAkB;IA6BhC,8EAA8E;YAChE,OAAO;IAKrB,IAAI,IAAI,IAAI,CAOX;IAEK,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8D9D;IAEK,IAAI,CAAC,MAAM,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA4B1B;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,SAAoB,GACzB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAkBnC;IAED,iFAAiF;IAC3E,qBAAqB,CACzB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAUjB;IAED,uDAAuD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1C,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAQD;IAED,OAAO,CAAC,QAAQ;IA4ChB,OAAO,CAAC,UAAU;YAQJ,IAAI;YA6GJ,aAAa;IAY3B,OAAO,CAAC,eAAe;IAsBvB;;;OAGG;YACW,mBAAmB;YAcnB,aAAa;YAcb,YAAY;IA0C1B,OAAO,CAAC,gBAAgB;IAyDxB,OAAO,CAAC,iBAAiB;YAeX,MAAM;YAYN,SAAS;CAoFxB;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"reminder-runner.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAEV,mBAAmB,EAGnB,YAAY,EAEb,MAAM,aAAa,CAAC;AASrB,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE;IAFzC,YACE,UAAU,EAAE,MAAM,EACT,oBAAoB,EAAE,MAAM,EAAE,EAIxC;CACF;AAyDD,qBAAa,cAAc;IAUvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,OAAO,CAAS;IAExB,YACmB,MAAM,EAAE,aAAa,EACrB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe,EAG3D;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B3B;IAED;;;OAGG;YACW,kBAAkB;IA6BhC,8EAA8E;YAChE,OAAO;IAKrB,IAAI,IAAI,IAAI,CAOX;IAEK,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8D9D;IAEK,IAAI,CAAC,MAAM,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA4B1B;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,SAAoB,GACzB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAkBnC;IAED,iFAAiF;IAC3E,qBAAqB,CACzB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAUjB;IAED;;;;;OAKG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAkBjB;IAED,uDAAuD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1C,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAQD;IAED,OAAO,CAAC,QAAQ;IA4ChB,OAAO,CAAC,UAAU;YAQJ,IAAI;YA6GJ,aAAa;IAY3B,OAAO,CAAC,eAAe;IAsBvB;;;OAGG;YACW,mBAAmB;YAcnB,aAAa;YAcb,YAAY;IA0C1B,OAAO,CAAC,gBAAgB;IAyDxB,OAAO,CAAC,iBAAiB;YAeX,MAAM;YAYN,SAAS;CAoFxB;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -279,6 +279,27 @@ export class ReminderRunner {
279
279
  return n;
280
280
  });
281
281
  }
282
+ /**
283
+ * Re-key armed reminders when a channel rotates a session's continuation
284
+ * token (the built-in HTTP channel rotates after every follow-up). Without
285
+ * this, a reminder armed before the rotation misses its session at fire
286
+ * time and disarms as `session_gone`.
287
+ */
288
+ rekeyContinuation(channelId, oldToken, newToken) {
289
+ return __awaiter(this, void 0, void 0, function* () {
290
+ const armed = yield this.store.listArmed();
291
+ let n = 0;
292
+ for (const record of armed) {
293
+ if (record.channelId !== channelId ||
294
+ record.continuationToken !== oldToken) {
295
+ continue;
296
+ }
297
+ yield this.persist(Object.assign(Object.assign({}, record), { continuationToken: newToken, updatedAt: new Date().toISOString() }));
298
+ n += 1;
299
+ }
300
+ return n;
301
+ });
302
+ }
282
303
  /** Fire one reminder immediately (dev / hillclimb). */
283
304
  dispatch(reminderId) {
284
305
  return __awaiter(this, void 0, void 0, function* () {
@@ -44,6 +44,13 @@ export interface CursorSdkRunnerOptions {
44
44
  /** Diagnostics for degraded paths (resume-miss fallback). */
45
45
  logger?: (line: string) => void;
46
46
  }
47
+ /**
48
+ * The backend's `NotLoggedIn` copy ("Authentication error" title, "try
49
+ * logging out and back in." detail) as it surfaces through SDK RunResults.
50
+ * Deliberately narrow: this gates a one-shot in-place retry, and matching
51
+ * broader error text would retry turns that a fresh transport cannot fix.
52
+ */
53
+ export declare function isAuthErrorMessage(message: string | undefined): boolean;
47
54
  export declare class CursorSdkRunner implements AgentRunner {
48
55
  private readonly options;
49
56
  private readonly agents;
@@ -51,6 +58,7 @@ export declare class CursorSdkRunner implements AgentRunner {
51
58
  private readonly prewarmReleases;
52
59
  constructor(options?: CursorSdkRunnerOptions);
53
60
  runTurn(request: RunnerTurnRequest): Promise<TurnOutcome>;
61
+ private runTurnAttempt;
54
62
  /**
55
63
  * Build the local executor for a workspace before any session asks for it.
56
64
  * The warmed executor is reference counted, so the lease is held until
@@ -59,6 +67,13 @@ export declare class CursorSdkRunner implements AgentRunner {
59
67
  prewarm(request: RunnerPrewarmRequest): Promise<PrewarmOutcome>;
60
68
  dispose(): Promise<void>;
61
69
  private getAgent;
70
+ /**
71
+ * Drop a cached handle and close it best-effort to release its transport
72
+ * and executor lease. Identity-checked so a turn that lost a race with a
73
+ * newer open cannot evict the replacement handle.
74
+ */
75
+ private evictAgent;
76
+ private log;
62
77
  private requireApiKey;
63
78
  private buildSharedOptions;
64
79
  /**
@@ -1 +1 @@
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"}
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;AAwBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKvE;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,CAkC9D;YAEa,cAAc;IAyE5B;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAepE;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAY7B;IAED,OAAO,CAAC,QAAQ;IA0BhB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,GAAG;IAIX,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"}