@cursor/july 0.1.95 → 0.1.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/AGENTS.md +3 -4
  2. package/dist/channels/deployments/types.d.ts +1 -1
  3. package/dist/channels/deployments/types.d.ts.map +1 -1
  4. package/dist/channels/deployments/types.js +1 -0
  5. package/dist/channels/origin/api.d.ts +59 -13
  6. package/dist/channels/origin/api.d.ts.map +1 -1
  7. package/dist/channels/origin/api.js +168 -27
  8. package/dist/channels/origin/binding.d.ts +2 -2
  9. package/dist/channels/origin/checks.d.ts +6 -6
  10. package/dist/channels/origin/checks.js +6 -6
  11. package/dist/channels/origin/cursor-account.d.ts +5 -3
  12. package/dist/channels/origin/cursor-account.d.ts.map +1 -1
  13. package/dist/channels/origin/cursor-account.js +5 -3
  14. package/dist/channels/slack/api.d.ts +9 -0
  15. package/dist/channels/slack/api.d.ts.map +1 -1
  16. package/dist/channels/slack/api.js +36 -5
  17. package/dist/channels/slack/defaults.d.ts.map +1 -1
  18. package/dist/channels/slack/defaults.js +17 -46
  19. package/dist/channels/slack/dispatch.d.ts +7 -1
  20. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  21. package/dist/channels/slack/dispatch.js +47 -23
  22. package/dist/channels/slack/inbound.d.ts +8 -0
  23. package/dist/channels/slack/inbound.d.ts.map +1 -1
  24. package/dist/channels/slack/inbound.js +32 -0
  25. package/dist/channels/slack/live-delivery.d.ts +26 -29
  26. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  27. package/dist/channels/slack/live-delivery.js +172 -73
  28. package/dist/channels/slack/manifest.d.ts.map +1 -1
  29. package/dist/channels/slack/manifest.js +5 -1
  30. package/dist/channels/slack/nudge-carrier.d.ts +2 -0
  31. package/dist/channels/slack/nudge-carrier.d.ts.map +1 -1
  32. package/dist/channels/slack/nudge-carrier.js +48 -1
  33. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  34. package/dist/channels/slack/slack-channel.js +2 -2
  35. package/dist/docs/404.html +2 -2
  36. package/dist/docs/ab.html +4 -4
  37. package/dist/docs/assets/{app.BBj0klBO.js → app.jXleCmOc.js} +1 -1
  38. package/dist/docs/assets/chunks/@localSearchIndexroot.DFoGuETX.js +1 -0
  39. package/dist/docs/assets/chunks/{VPLocalSearchBox.CUEXpL78.js → VPLocalSearchBox.8LhyglIT.js} +1 -1
  40. package/dist/docs/assets/chunks/{theme.DabmQnia.js → theme.9ged-pr2.js} +2 -2
  41. package/dist/docs/assets/index.md.CI93Ltlb.js +5 -0
  42. package/dist/docs/assets/{index.md.BoHaMdeZ.lean.js → index.md.CI93Ltlb.lean.js} +1 -1
  43. package/dist/docs/assets/{reference_cli.md.BsMOxDvh.js → reference_cli.md.CCnG-nJx.js} +2 -1
  44. package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.js +2 -0
  45. package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.lean.js +1 -0
  46. package/dist/docs/building-with-agents.html +4 -4
  47. package/dist/docs/concepts.html +4 -4
  48. package/dist/docs/deployment.html +4 -4
  49. package/dist/docs/evals.html +4 -4
  50. package/dist/docs/guides/agent-to-agent.html +4 -4
  51. package/dist/docs/guides/cloud-runtime.html +4 -4
  52. package/dist/docs/guides/convert-automation.html +4 -4
  53. package/dist/docs/guides/github.html +4 -4
  54. package/dist/docs/guides/human-in-the-loop.html +4 -4
  55. package/dist/docs/guides/mcp-oauth.html +4 -4
  56. package/dist/docs/guides/opentelemetry.html +4 -4
  57. package/dist/docs/guides/slack.html +4 -4
  58. package/dist/docs/guides/webhooks.html +4 -4
  59. package/dist/docs/hashmap.json +1 -1
  60. package/dist/docs/hillclimbing.html +4 -4
  61. package/dist/docs/index.html +6 -6
  62. package/dist/docs/index.md +3 -1
  63. package/dist/docs/llms-full.txt +102 -3
  64. package/dist/docs/llms.txt +1 -0
  65. package/dist/docs/quickstart.html +4 -4
  66. package/dist/docs/reference/agent-config.html +4 -4
  67. package/dist/docs/reference/artifacts.html +4 -4
  68. package/dist/docs/reference/channels.html +4 -4
  69. package/dist/docs/reference/cli.html +7 -6
  70. package/dist/docs/reference/cli.md +3 -2
  71. package/dist/docs/reference/connections.html +4 -4
  72. package/dist/docs/reference/hooks.html +4 -4
  73. package/dist/docs/reference/http-api.html +4 -4
  74. package/dist/docs/reference/instructions.html +4 -4
  75. package/dist/docs/reference/playground.html +4 -4
  76. package/dist/docs/reference/project-layout.html +4 -4
  77. package/dist/docs/reference/prompt.html +4 -4
  78. package/dist/docs/reference/schedules.html +4 -4
  79. package/dist/docs/reference/sessions.html +4 -4
  80. package/dist/docs/reference/skills.html +4 -4
  81. package/dist/docs/reference/subagents.html +4 -4
  82. package/dist/docs/reference/tools.html +4 -4
  83. package/dist/docs/scaffolding-agents.html +4 -4
  84. package/dist/docs/storage.html +4 -4
  85. package/dist/docs/templates/agentic-owners.html +4 -4
  86. package/dist/docs/templates/code-wiki.html +28 -0
  87. package/dist/docs/templates/code-wiki.md +91 -0
  88. package/dist/docs/templates/demo.html +5 -5
  89. package/dist/docs/templates/pr-autofixer.html +4 -4
  90. package/dist/docs/templates/security-help.html +4 -4
  91. package/dist/docs/templates/security-reviewer.html +5 -5
  92. package/dist/docs/templates/triage.html +4 -4
  93. package/dist/docs/troubleshooting.html +4 -4
  94. package/dist/files-backends/cursor-hosted.d.ts +26 -4
  95. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  96. package/dist/files-backends/cursor-hosted.js +32 -4
  97. package/dist/internal/advertise-tools.d.ts +2 -0
  98. package/dist/internal/advertise-tools.d.ts.map +1 -1
  99. package/dist/internal/advertise-tools.js +15 -1
  100. package/dist/internal/bounded.d.ts +7 -0
  101. package/dist/internal/bounded.d.ts.map +1 -0
  102. package/dist/internal/bounded.js +32 -0
  103. package/dist/internal/cli-deploy.d.ts.map +1 -1
  104. package/dist/internal/cli-deploy.js +7 -1
  105. package/dist/internal/conversation-mirror.d.ts +11 -8
  106. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  107. package/dist/internal/conversation-mirror.js +116 -55
  108. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  109. package/dist/internal/cursor/backend-client.js +22 -48
  110. package/dist/internal/cursor/session-token.d.ts +45 -0
  111. package/dist/internal/cursor/session-token.d.ts.map +1 -0
  112. package/dist/internal/cursor/session-token.js +99 -0
  113. package/dist/internal/cursor-agent-template.d.ts +1 -1
  114. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  115. package/dist/internal/cursor-agent-template.js +1 -0
  116. package/dist/internal/framework-file-storage.d.ts +61 -0
  117. package/dist/internal/framework-file-storage.d.ts.map +1 -0
  118. package/dist/internal/framework-file-storage.js +204 -0
  119. package/dist/internal/framework-storage-selection.d.ts +11 -5
  120. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  121. package/dist/internal/framework-storage-selection.js +38 -11
  122. package/dist/internal/hosted-delivery.d.ts +7 -0
  123. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  124. package/dist/internal/hosted-delivery.js +4 -0
  125. package/dist/internal/init-project.d.ts.map +1 -1
  126. package/dist/internal/init-project.js +2 -0
  127. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  128. package/dist/internal/install-cursor-skills.js +1 -3
  129. package/dist/internal/managed-delivery.d.ts +80 -0
  130. package/dist/internal/managed-delivery.d.ts.map +1 -0
  131. package/dist/internal/managed-delivery.js +86 -0
  132. package/dist/internal/runtime-dispatch-runner.d.ts +5 -1
  133. package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
  134. package/dist/internal/runtime-dispatch-runner.js +7 -0
  135. package/dist/internal/sdk-runner.d.ts +11 -0
  136. package/dist/internal/sdk-runner.d.ts.map +1 -1
  137. package/dist/internal/sdk-runner.js +39 -8
  138. package/dist/internal/server.js +1 -0
  139. package/dist/internal/session-engine.d.ts +13 -0
  140. package/dist/internal/session-engine.d.ts.map +1 -1
  141. package/dist/internal/session-engine.js +62 -3
  142. package/dist/internal/steering.d.ts +15 -0
  143. package/dist/internal/steering.d.ts.map +1 -0
  144. package/dist/internal/steering.js +18 -0
  145. package/dist/playground/assets/index-B1DDvBeC.css +1 -0
  146. package/dist/playground/assets/{index-CZA1uEWA.js → index-Cx9CclK_.js} +51 -51
  147. package/dist/playground/index.html +2 -2
  148. package/dist/storage-backends/cursor-hosted.d.ts +8 -5
  149. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  150. package/dist/storage-backends/cursor-hosted.js +4 -3
  151. package/dist/types.d.ts +2 -1
  152. package/dist/types.d.ts.map +1 -1
  153. package/docs/README.md +3 -1
  154. package/docs/reference/cli.md +3 -2
  155. package/docs/templates/code-wiki.md +96 -0
  156. package/package.json +2 -2
  157. package/skills/ab/SKILL.md +13 -97
  158. package/skills/create-agent/SKILL.md +123 -223
  159. package/skills/debug/SKILL.md +34 -68
  160. package/skills/evals/SKILL.md +55 -180
  161. package/skills/framework-map/SKILL.md +83 -145
  162. package/skills/github/SKILL.md +53 -111
  163. package/skills/hillclimb/SKILL.md +40 -163
  164. package/skills/mcp-auth/SKILL.md +48 -107
  165. package/skills/otel/SKILL.md +22 -68
  166. package/skills/setup-slack/SKILL.md +77 -208
  167. package/src/channels/deployments/types.ts +1 -0
  168. package/src/channels/origin/api.ts +242 -30
  169. package/src/channels/origin/binding.ts +2 -2
  170. package/src/channels/origin/checks.ts +6 -6
  171. package/src/channels/origin/cursor-account.ts +5 -3
  172. package/src/channels/slack/api.ts +41 -5
  173. package/src/channels/slack/defaults.ts +15 -49
  174. package/src/channels/slack/dispatch.ts +56 -22
  175. package/src/channels/slack/inbound.ts +43 -0
  176. package/src/channels/slack/live-delivery.ts +235 -114
  177. package/src/channels/slack/manifest.ts +5 -1
  178. package/src/channels/slack/nudge-carrier.ts +48 -1
  179. package/src/channels/slack/slack-channel.ts +2 -0
  180. package/src/files-backends/cursor-hosted.ts +40 -7
  181. package/src/internal/advertise-tools.ts +18 -2
  182. package/src/internal/bounded.ts +28 -0
  183. package/src/internal/cli-deploy.ts +12 -0
  184. package/src/internal/conversation-mirror.ts +145 -69
  185. package/src/internal/cursor/backend-client.ts +34 -58
  186. package/src/internal/cursor/session-token.ts +115 -0
  187. package/src/internal/cursor-agent-template.ts +1 -0
  188. package/src/internal/framework-file-storage.ts +222 -0
  189. package/src/internal/framework-storage-selection.ts +51 -11
  190. package/src/internal/hosted-delivery.ts +10 -0
  191. package/src/internal/init-project.ts +2 -0
  192. package/src/internal/install-cursor-skills.ts +1 -4
  193. package/src/internal/managed-delivery.ts +125 -0
  194. package/src/internal/runtime-dispatch-runner.ts +10 -0
  195. package/src/internal/sdk-runner.ts +56 -8
  196. package/src/internal/server.ts +2 -0
  197. package/src/internal/session-engine.ts +64 -4
  198. package/src/internal/steering.ts +17 -0
  199. package/src/storage-backends/cursor-hosted.ts +9 -7
  200. package/src/types.ts +2 -1
  201. package/templates/code-wiki/README.md +34 -0
  202. package/templates/code-wiki/agent/agent.ts +8 -0
  203. package/templates/code-wiki/agent/channels/github.ts +144 -0
  204. package/templates/code-wiki/agent/instructions.md +39 -0
  205. package/templates/code-wiki/agent/lib/repos.ts +5 -0
  206. package/templates/code-wiki/agent/lib/wiki.ts +22 -0
  207. package/templates/code-wiki/agent/tools/apply_wiki.ts +219 -0
  208. package/templates/code-wiki/evals/evals.config.ts +5 -0
  209. package/templates/code-wiki/evals/wiki.eval.ts +132 -0
  210. package/templates/code-wiki/init.json +25 -0
  211. package/templates/code-wiki/package.json +18 -0
  212. package/templates/code-wiki/tsconfig.json +12 -0
  213. package/dist/docs/assets/chunks/@localSearchIndexroot.oqPawjiD.js +0 -1
  214. package/dist/docs/assets/index.md.BoHaMdeZ.js +0 -5
  215. package/dist/internal/deployment-scm-event-stream.d.ts +0 -116
  216. package/dist/internal/deployment-scm-event-stream.d.ts.map +0 -1
  217. package/dist/internal/deployment-scm-event-stream.js +0 -474
  218. package/dist/playground/assets/index-CF7hUDnQ.css +0 -1
  219. package/src/internal/deployment-scm-event-stream.ts +0 -593
  220. /package/dist/docs/assets/{reference_cli.md.BsMOxDvh.lean.js → reference_cli.md.CCnG-nJx.lean.js} +0 -0
@@ -4,6 +4,10 @@
4
4
  * Cursor-account channels do not use this path — they reply with a single
5
5
  * final `chat.postMessage` and put thinking on `assistant.threads.setStatus`
6
6
  * (no message edits).
7
+ *
8
+ * Assistant-pane threads only render stream APIs. Start lazily with the
9
+ * first real markdown/chunks plus recipient ids — empty startStream is
10
+ * rejected or never attaches.
7
11
  */
8
12
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
13
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -16,43 +20,115 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
16
20
  };
17
21
  import { appendChatStream, startChatStream, stopChatStream } from "./api.js";
18
22
  import { computeStreamAppend } from "./stream.js";
23
+ function streamRecipients(channel) {
24
+ const user = channel.state.triggeringUserId;
25
+ const team = channel.state.teamId;
26
+ return {
27
+ recipient_user_id: user === null || user === "" ? undefined : user,
28
+ recipient_team_id: team === null || team === "" ? undefined : team,
29
+ };
30
+ }
31
+ function activeStreamTs(channel) {
32
+ const ts = channel.state.streamTs;
33
+ return ts === null || ts === "" ? null : ts;
34
+ }
19
35
  export function createStreamDeliveryStrategy(deps) {
20
36
  const { botToken, getLog } = deps;
37
+ const open = (_a) => __awaiter(this, [_a], void 0, function* ({ channel, channelId, threadTs, sessionId, markdown_text, chunks, }) {
38
+ if (activeStreamTs(channel) !== null) {
39
+ return true;
40
+ }
41
+ const hasMarkdown = markdown_text !== undefined && markdown_text !== "";
42
+ const hasChunks = chunks !== undefined && chunks.length > 0;
43
+ if (!hasMarkdown && !hasChunks) {
44
+ return false;
45
+ }
46
+ const log = getLog();
47
+ const started = yield startChatStream(Object.assign({ botToken, channel: channelId, thread_ts: threadTs, markdown_text: hasMarkdown ? markdown_text : undefined, chunks: hasChunks ? chunks : undefined }, streamRecipients(channel)));
48
+ if (!started.ok) {
49
+ log.warn("chat.startStream unavailable", {
50
+ error: started.error,
51
+ channel: channelId,
52
+ thread_ts: threadTs,
53
+ session: sessionId,
54
+ });
55
+ if (started.unsupported === true) {
56
+ channel.state.streamingUnavailable = true;
57
+ }
58
+ return false;
59
+ }
60
+ channel.state.streamTs = started.ts;
61
+ channel.state.streamChannelId = started.channel;
62
+ channel.state.lastPostedText = hasMarkdown ? (markdown_text !== null && markdown_text !== void 0 ? markdown_text : "") : "";
63
+ log.info("chat.startStream ok", {
64
+ channel: started.channel,
65
+ stream_ts: started.ts,
66
+ session: sessionId,
67
+ });
68
+ return true;
69
+ });
70
+ const ensureOpen = (args) => __awaiter(this, void 0, void 0, function* () {
71
+ const existing = activeStreamTs(args.channel);
72
+ if (existing !== null) {
73
+ return existing;
74
+ }
75
+ const threadTs = args.channel.state.threadTs;
76
+ if (threadTs === null || threadTs === "") {
77
+ return null;
78
+ }
79
+ const opened = yield open({
80
+ channel: args.channel,
81
+ channelId: args.channelId,
82
+ threadTs,
83
+ sessionId: args.sessionId,
84
+ markdown_text: args.markdown_text,
85
+ chunks: args.chunks,
86
+ });
87
+ return opened ? activeStreamTs(args.channel) : null;
88
+ });
89
+ const stopWithSuffix = (args) => __awaiter(this, void 0, void 0, function* () {
90
+ const appendText = computeStreamAppend(args.channel.state.lastPostedText, args.text);
91
+ const stopped = yield stopChatStream({
92
+ botToken,
93
+ channel: args.channelId,
94
+ ts: args.ts,
95
+ markdown_text: appendText === "" ? undefined : appendText,
96
+ });
97
+ args.channel.state.streamTs = null;
98
+ if (stopped.ok) {
99
+ args.channel.state.lastPostedText = args.text;
100
+ args.channel.state.lastBotMessageTs = args.ts;
101
+ return { ok: true };
102
+ }
103
+ if (stopped.unsupported === true) {
104
+ args.channel.state.streamingUnavailable = true;
105
+ }
106
+ return { ok: false, error: stopped.error };
107
+ });
108
+ const closeOrphan = (channel) => __awaiter(this, void 0, void 0, function* () {
109
+ var _a;
110
+ const orphanTs = activeStreamTs(channel);
111
+ const channelId = (_a = channel.state.streamChannelId) !== null && _a !== void 0 ? _a : channel.state.channelId;
112
+ if (orphanTs === null || channelId === null || channelId === "") {
113
+ return;
114
+ }
115
+ yield stopChatStream({ botToken, channel: channelId, ts: orphanTs });
116
+ channel.state.streamTs = null;
117
+ });
21
118
  return {
22
119
  inlineToolSteps: true,
23
- start(_a) {
24
- return __awaiter(this, arguments, void 0, function* ({ channel, channelId, threadTs, sessionId }) {
25
- const log = getLog();
26
- const started = yield startChatStream({
27
- botToken,
28
- channel: channelId,
29
- thread_ts: threadTs,
30
- markdown_text: "",
120
+ open,
121
+ append(_a) {
122
+ return __awaiter(this, arguments, void 0, function* ({ channel, channelId, text, sessionId }) {
123
+ const ts = yield ensureOpen({
124
+ channel,
125
+ channelId,
126
+ sessionId,
127
+ markdown_text: text,
31
128
  });
32
- if (!started.ok) {
33
- log.warn("chat.startStream unavailable", {
34
- error: started.error,
35
- channel: channelId,
36
- thread_ts: threadTs,
37
- session: sessionId,
38
- });
39
- if (started.unsupported === true) {
40
- channel.state.streamingUnavailable = true;
41
- }
129
+ if (ts === null) {
42
130
  return;
43
131
  }
44
- channel.state.streamTs = started.ts;
45
- channel.state.streamChannelId = started.channel;
46
- channel.state.lastPostedText = "";
47
- log.info("chat.startStream ok", {
48
- channel: started.channel,
49
- stream_ts: started.ts,
50
- session: sessionId,
51
- });
52
- });
53
- },
54
- append(_a) {
55
- return __awaiter(this, arguments, void 0, function* ({ channel, channelId, streamTs, text, sessionId }) {
56
132
  const appendText = computeStreamAppend(channel.state.lastPostedText, text);
57
133
  if (appendText === "") {
58
134
  return;
@@ -60,14 +136,14 @@ export function createStreamDeliveryStrategy(deps) {
60
136
  const result = yield appendChatStream({
61
137
  botToken,
62
138
  channel: channelId,
63
- ts: streamTs,
139
+ ts,
64
140
  markdown_text: appendText,
65
141
  });
66
142
  if (!result.ok) {
67
143
  getLog().warn("appendStream failed", {
68
144
  error: result.error,
69
145
  channel: channelId,
70
- stream_ts: streamTs,
146
+ stream_ts: ts,
71
147
  session: sessionId,
72
148
  });
73
149
  if (result.unsupported === true) {
@@ -78,24 +154,52 @@ export function createStreamDeliveryStrategy(deps) {
78
154
  channel.state.lastPostedText = text;
79
155
  });
80
156
  },
81
- finalize(_a) {
82
- return __awaiter(this, arguments, void 0, function* ({ channel, channelId, streamTs, text, sessionId }) {
83
- const log = getLog();
84
- // Only send the unsent suffix — full text was already appended.
85
- const appendText = computeStreamAppend(channel.state.lastPostedText, text);
86
- const stopped = yield stopChatStream({
157
+ appendChunks(_a) {
158
+ return __awaiter(this, arguments, void 0, function* ({ channel, channelId, chunks, sessionId }) {
159
+ const hadStream = activeStreamTs(channel) !== null;
160
+ const ts = yield ensureOpen({
161
+ channel,
162
+ channelId,
163
+ sessionId,
164
+ chunks,
165
+ });
166
+ if (ts === null) {
167
+ return false;
168
+ }
169
+ if (!hadStream) {
170
+ return true;
171
+ }
172
+ const result = yield appendChatStream({
87
173
  botToken,
88
174
  channel: channelId,
89
- ts: streamTs,
90
- markdown_text: appendText === "" ? undefined : appendText,
175
+ ts,
176
+ chunks,
177
+ });
178
+ return result.ok;
179
+ });
180
+ },
181
+ finalize(_a) {
182
+ return __awaiter(this, arguments, void 0, function* ({ channel, channelId, text, sessionId }) {
183
+ const log = getLog();
184
+ const ts = yield ensureOpen({
185
+ channel,
186
+ channelId,
187
+ sessionId,
188
+ markdown_text: text,
189
+ });
190
+ if (ts === null) {
191
+ return { delivered: false };
192
+ }
193
+ const stopped = yield stopWithSuffix({
194
+ channel,
195
+ channelId,
196
+ ts,
197
+ text,
91
198
  });
92
199
  if (stopped.ok) {
93
- channel.state.streamTs = null;
94
- channel.state.lastPostedText = text;
95
- channel.state.lastBotMessageTs = streamTs;
96
200
  log.info("reply delivered via stream", {
97
201
  channel: channelId,
98
- stream_ts: streamTs,
202
+ stream_ts: ts,
99
203
  session: sessionId,
100
204
  chars: text.length,
101
205
  });
@@ -104,52 +208,47 @@ export function createStreamDeliveryStrategy(deps) {
104
208
  log.warn("chat.stopStream failed; falling back to postMessage", {
105
209
  error: stopped.error,
106
210
  channel: channelId,
107
- stream_ts: streamTs,
211
+ stream_ts: ts,
108
212
  session: sessionId,
109
213
  });
110
- if (stopped.unsupported === true) {
111
- channel.state.streamingUnavailable = true;
112
- }
113
- channel.state.streamTs = null;
114
- // If we already streamed content, do not post the full reply again.
115
214
  const alreadyStreamed = typeof channel.state.lastPostedText === "string" &&
116
215
  channel.state.lastPostedText.length > 0;
117
216
  return { delivered: alreadyStreamed };
118
217
  });
119
218
  },
120
219
  finalizeEmpty(_a) {
121
- return __awaiter(this, arguments, void 0, function* ({ channelId, streamTs }) {
122
- yield stopChatStream({ botToken, channel: channelId, ts: streamTs });
220
+ return __awaiter(this, arguments, void 0, function* ({ channel }) {
221
+ yield closeOrphan(channel);
123
222
  });
124
223
  },
125
224
  cleanupOrphan(_a) {
126
225
  return __awaiter(this, arguments, void 0, function* ({ channel }) {
127
- var _b;
128
- // message.completed / turn.failed already stop the stream. If the
129
- // turn ended without a final assistant message, close it here so
130
- // Slack does not leave the live reply in a streaming state.
131
- const streamTs = channel.state.streamTs;
132
- const channelId = (_b = channel.state.streamChannelId) !== null && _b !== void 0 ? _b : channel.state.channelId;
133
- if (streamTs === null ||
134
- streamTs === "" ||
135
- channelId === null ||
136
- channelId === "") {
137
- return;
138
- }
139
- yield stopChatStream({ botToken, channel: channelId, ts: streamTs });
140
- channel.state.streamTs = null;
226
+ yield closeOrphan(channel);
141
227
  });
142
228
  },
143
229
  fail(_a) {
144
- return __awaiter(this, arguments, void 0, function* ({ channel, channelId, streamTs, errorText }) {
145
- const stopped = yield stopChatStream({
146
- botToken,
147
- channel: channelId,
148
- ts: streamTs,
230
+ return __awaiter(this, arguments, void 0, function* ({ channel, channelId, errorText, sessionId }) {
231
+ const ts = yield ensureOpen({
232
+ channel,
233
+ channelId,
234
+ sessionId,
149
235
  markdown_text: errorText,
150
236
  });
151
- channel.state.streamTs = null;
152
- return { delivered: stopped.ok };
237
+ if (ts === null) {
238
+ return { delivered: false };
239
+ }
240
+ const stopped = yield stopWithSuffix({
241
+ channel,
242
+ channelId,
243
+ ts,
244
+ text: errorText,
245
+ });
246
+ if (stopped.ok) {
247
+ return { delivered: true };
248
+ }
249
+ const alreadyStreamed = typeof channel.state.lastPostedText === "string" &&
250
+ channel.state.lastPostedText.length > 0;
251
+ return { delivered: alreadyStreamed };
153
252
  });
154
253
  },
155
254
  };
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,iDACE,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,YAAY,EAAE,MAAM,CAAC;YACrB,aAAa,EAAE,OAAO,CAAC;SACxB,CAAC;QACF,UAAU,CAAC,EAAE;YACX,iBAAiB,EAAE,MAAM,CAAC;YAC1B,iBAAiB,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SAC9D,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,gBAAgB,EAAE,OAAO,CAAC;YAC1B,oBAAoB,EAAE,OAAO,CAAC;YAC9B,8BAA8B,EAAE,OAAO,CAAC;SACzC,CAAC;KACH,CAAC;IACF,YAAY,EAAE;QACZ,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,EAAE,CAAC;SACf,CAAC;QACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE;QACR,mBAAmB,EAAE;YACnB,UAAU,EAAE,MAAM,EAAE,CAAC;SACtB,CAAC;QACF,aAAa,EAAE;YACb,UAAU,EAAE,OAAO,CAAC;SACrB,CAAC;QACF,kBAAkB,EAAE,OAAO,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,sBAAsB,EAAE,OAAO,CAAC;QAChC,cAAc,EAAE,OAAO,CAAC;QACxB,oBAAoB,CAAC,EAAE;YACrB,8BAA8B,EAAE,OAAO,CAAC;YACxC,2BAA2B,EAAE,MAAM,CAAC;SACrC,CAAC;KACH,CAAC;CACH;AAyDD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,GAC5B,gBAAgB,CAiFlB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,GACzC;IACD,GAAG,EAAE,gBAAgB,CAAC;IACtB,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAKA;AAED,kDAAkD;AAClD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE;IAAE,GAAG,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,EACvD,GAAG,GAAE,KAAK,GAAG,MAAM,GAAG,MAAe,GACpC,aAAa,CAAC;IACf,IAAI,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAkBD"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,iDACE,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,YAAY,EAAE,MAAM,CAAC;YACrB,aAAa,EAAE,OAAO,CAAC;SACxB,CAAC;QACF,UAAU,CAAC,EAAE;YACX,iBAAiB,EAAE,MAAM,CAAC;YAC1B,iBAAiB,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SAC9D,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,gBAAgB,EAAE,OAAO,CAAC;YAC1B,oBAAoB,EAAE,OAAO,CAAC;YAC9B,8BAA8B,EAAE,OAAO,CAAC;SACzC,CAAC;KACH,CAAC;IACF,YAAY,EAAE;QACZ,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,EAAE,CAAC;SACf,CAAC;QACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE;QACR,mBAAmB,EAAE;YACnB,UAAU,EAAE,MAAM,EAAE,CAAC;SACtB,CAAC;QACF,aAAa,EAAE;YACb,UAAU,EAAE,OAAO,CAAC;SACrB,CAAC;QACF,kBAAkB,EAAE,OAAO,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,sBAAsB,EAAE,OAAO,CAAC;QAChC,cAAc,EAAE,OAAO,CAAC;QACxB,oBAAoB,CAAC,EAAE;YACrB,8BAA8B,EAAE,OAAO,CAAC;YACxC,2BAA2B,EAAE,MAAM,CAAC;SACrC,CAAC;KACH,CAAC;CACH;AA6DD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,GAC5B,gBAAgB,CAiFlB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,GACzC;IACD,GAAG,EAAE,gBAAgB,CAAC;IACtB,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAKA;AAED,kDAAkD;AAClD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE;IAAE,GAAG,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,EACvD,GAAG,GAAE,KAAK,GAAG,MAAM,GAAG,MAAe,GACpC,aAAa,CAAC;IACf,IAAI,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAkBD"}
@@ -31,7 +31,11 @@ const BOT_SCOPES = [
31
31
  "reactions:write",
32
32
  "users:read",
33
33
  ];
34
- const BOT_EVENTS = ["app_mention", "message.im"];
34
+ const BOT_EVENTS = [
35
+ "app_mention",
36
+ "message.im",
37
+ "assistant_thread_started",
38
+ ];
35
39
  /** Slack's display_information.description bound. */
36
40
  const MAX_DESCRIPTION_LENGTH = 140;
37
41
  const DESCRIPTION_SUFFIX = " — an AI agent built with Cursor";
@@ -5,6 +5,8 @@
5
5
  export declare const SLACK_NUDGE_ROOT_REL = ".agent-serve/slack-nudge-root";
6
6
  export declare const SLACK_NUDGE_CONTINUATION_REL = ".agent-serve/slack-nudge-continuation";
7
7
  export declare const SLACK_NUDGE_CARRIER_REL = ".agent-serve/slack-nudge-carrier.mjs";
8
+ /** Conversation allowed to claim nudges; subagents share the cwd and would otherwise take the parent's. */
9
+ export declare const SLACK_NUDGE_OWNER_REL = ".agent-serve/slack-nudge-owner";
8
10
  /** Carrier script body — reads nudge-root + continuation, drains pending. */
9
11
  export declare const SLACK_NUDGE_CARRIER_SCRIPT: string;
10
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"nudge-carrier.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/nudge-carrier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,oBAAoB,kCAAkC,CAAC;AACpE,eAAO,MAAM,4BAA4B,0CACA,CAAC;AAC1C,eAAO,MAAM,uBAAuB,yCAAyC,CAAC;AAE9E,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,EAAE,MA6GxC,CAAC;AAOF;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ChB"}
1
+ {"version":3,"file":"nudge-carrier.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/nudge-carrier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,oBAAoB,kCAAkC,CAAC;AACpE,eAAO,MAAM,4BAA4B,0CACA,CAAC;AAC1C,eAAO,MAAM,uBAAuB,yCAAyC,CAAC;AAC9E,2GAA2G;AAC3G,eAAO,MAAM,qBAAqB,mCAAmC,CAAC;AAEtE,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,EAAE,MAyJxC,CAAC;AAOF;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ChB"}
@@ -11,11 +11,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  step((generator = generator.apply(thisArg, _arguments || [])).next());
12
12
  });
13
13
  };
14
- import { mkdir, readFile, writeFile } from "node:fs/promises";
14
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
15
15
  import { join } from "node:path";
16
16
  export const SLACK_NUDGE_ROOT_REL = ".agent-serve/slack-nudge-root";
17
17
  export const SLACK_NUDGE_CONTINUATION_REL = ".agent-serve/slack-nudge-continuation";
18
18
  export const SLACK_NUDGE_CARRIER_REL = ".agent-serve/slack-nudge-carrier.mjs";
19
+ /** Conversation allowed to claim nudges; subagents share the cwd and would otherwise take the parent's. */
20
+ export const SLACK_NUDGE_OWNER_REL = ".agent-serve/slack-nudge-owner";
19
21
  /** Carrier script body — reads nudge-root + continuation, drains pending. */
20
22
  export const SLACK_NUDGE_CARRIER_SCRIPT = `#!/usr/bin/env node
21
23
  import { mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
@@ -45,7 +47,46 @@ async function readText(rel) {
45
47
  }
46
48
  }
47
49
 
50
+ async function readStdin() {
51
+ const chunks = [];
52
+ const read = (async () => {
53
+ for await (const chunk of process.stdin) chunks.push(chunk);
54
+ })().catch(() => {});
55
+ await Promise.race([
56
+ read,
57
+ new Promise((resolve) => setTimeout(resolve, 250).unref?.()),
58
+ ]);
59
+ process.stdin.destroy();
60
+ return Buffer.concat(chunks).toString("utf8");
61
+ }
62
+
63
+ /** First caller pins ownership; a subagent cannot call a tool before its parent's Task call. */
64
+ async function ownsStore(caller) {
65
+ if (caller === "") return true;
66
+ const ownerPath = join(workspace, ${JSON.stringify(SLACK_NUDGE_OWNER_REL)});
67
+ try {
68
+ // wx is O_CREAT|O_EXCL, so creating the file is the claim: concurrent hooks cannot both win.
69
+ await writeFile(ownerPath, caller + "\\n", { encoding: "utf8", flag: "wx" });
70
+ return true;
71
+ } catch (error) {
72
+ if (error && error.code !== "EEXIST") return false;
73
+ }
74
+ // Claimed already — the only question left is whether we are the claimant.
75
+ const owner = await readText(${JSON.stringify(SLACK_NUDGE_OWNER_REL)});
76
+ return owner === "" || owner === caller;
77
+ }
78
+
48
79
  async function main() {
80
+ const raw = await readStdin();
81
+ let caller = "";
82
+ try {
83
+ const parsed = JSON.parse(raw);
84
+ if (parsed && typeof parsed.conversation_id === "string") {
85
+ caller = parsed.conversation_id.trim();
86
+ }
87
+ } catch {
88
+ // Fail open: an unparseable payload must not strand the follow-up.
89
+ }
49
90
  const root = await readText(${JSON.stringify(SLACK_NUDGE_ROOT_REL)});
50
91
  const continuation = await readText(
51
92
  ${JSON.stringify(SLACK_NUDGE_CONTINUATION_REL)}
@@ -54,6 +95,11 @@ async function main() {
54
95
  process.stdout.write("{}\\n");
55
96
  return;
56
97
  }
98
+ // Not ours: leave it pending for the parent or the turn-boundary drain.
99
+ if (!(await ownsStore(caller))) {
100
+ process.stdout.write("{}\\n");
101
+ return;
102
+ }
57
103
  const pendingDir = join(root, safeKey(continuation), "pending");
58
104
  const deliveredDir = join(root, safeKey(continuation), "delivered");
59
105
  let names = [];
@@ -142,6 +188,7 @@ export function materializeSlackNudgeCarrier(args) {
142
188
  yield writeFile(join(args.harnessCwd, SLACK_NUDGE_ROOT_REL), `${args.nudgeRootDir}\n`, "utf8");
143
189
  yield writeFile(join(args.harnessCwd, SLACK_NUDGE_CONTINUATION_REL), `${args.continuationKey}\n`, "utf8");
144
190
  yield writeFile(join(args.harnessCwd, SLACK_NUDGE_CARRIER_REL), SLACK_NUDGE_CARRIER_SCRIPT, "utf8");
191
+ yield rm(join(args.harnessCwd, SLACK_NUDGE_OWNER_REL), { force: true });
145
192
  const hooksPath = join(args.harnessCwd, ".cursor", "hooks.json");
146
193
  let existing = { version: 1, hooks: {} };
147
194
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"slack-channel.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/slack-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAEV,iBAAiB,EAMlB,MAAM,gBAAgB,CAAC;AA2CxB,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GACjB,mBAAmB,GAAG,SAAS,CAEjC;AAED,0EAA0E;AAC1E,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,aAAa,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,uBAAuB,GAAG,SAAS,CAYrC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,GAAE,mBAAwB,GACjC,iBAAiB,CAAC,iBAAiB,CAAC,CAyatC"}
1
+ {"version":3,"file":"slack-channel.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/slack-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAEV,iBAAiB,EAMlB,MAAM,gBAAgB,CAAC;AA2CxB,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GACjB,mBAAmB,GAAG,SAAS,CAEjC;AAED,0EAA0E;AAC1E,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,aAAa,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,uBAAuB,GAAG,SAAS,CAYrC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,GAAE,mBAAwB,GACjC,iBAAiB,CAAC,iBAAiB,CAAC,CA2atC"}
@@ -123,7 +123,7 @@ export function slackChannel(authored = {}) {
123
123
  let channelWatch;
124
124
  let botMentionGate;
125
125
  function inboundDeps(args) {
126
- return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ send: args.send, continuation: options.continuation, waitUntil: args.waitUntil, onAppMention,
126
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ send: args.send, continuation: options.continuation, waitUntil: args.waitUntil, onAppMention,
127
127
  onDirectMessage }, (onReactionAdded === undefined ? {} : { onReactionAdded })), { credentials,
128
128
  eventIds, host: args.host, artifacts: args.artifacts, log: getLog(), mentionsEnabled,
129
129
  directMessagesEnabled,
@@ -139,7 +139,7 @@ export function slackChannel(authored = {}) {
139
139
  getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
140
140
  })), (args.interruptContinuation === undefined
141
141
  ? {}
142
- : { interruptContinuation: args.interruptContinuation })), (channelWatch === undefined ? {} : { channelWatch })), (botMentionGate === undefined ? {} : { botMentionGate }));
142
+ : { interruptContinuation: args.interruptContinuation })), (channelWatch === undefined ? {} : { channelWatch })), (botMentionGate === undefined ? {} : { botMentionGate })), { suggestedPrompts: options.suggestedPrompts, suggestedPromptsTitle: options.suggestedPromptsTitle });
143
143
  }
144
144
  const definition = defineChannel({
145
145
  auth: [allowAll()],
@@ -9,7 +9,7 @@
9
9
  <link rel="preload stylesheet" href="/docs/assets/style.BRuM8477.css" as="style">
10
10
  <link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
11
11
 
12
- <script type="module" src="/docs/assets/app.BBj0klBO.js"></script>
12
+ <script type="module" src="/docs/assets/app.jXleCmOc.js"></script>
13
13
  <link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
14
  <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
15
15
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
@@ -18,7 +18,7 @@
18
18
  </head>
19
19
  <body>
20
20
  <div id="app"></div>
21
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"ab.md\":\"DJo5r4R-\",\"building-with-agents.md\":\"DI4mEzlt\",\"concepts.md\":\"lwAgBIMI\",\"deployment.md\":\"D9msOFOW\",\"evals.md\":\"lfJoEVc8\",\"guides_agent-to-agent.md\":\"BDb0t1QV\",\"guides_cloud-runtime.md\":\"CkYbjnAX\",\"guides_convert-automation.md\":\"B4sjlodG\",\"guides_github.md\":\"Cnh2mL4a\",\"guides_human-in-the-loop.md\":\"By1G2T3_\",\"guides_mcp-oauth.md\":\"DPYmBCbV\",\"guides_opentelemetry.md\":\"bmPmkvJu\",\"guides_slack.md\":\"C32HsdKk\",\"guides_webhooks.md\":\"DKdA43Qm\",\"hillclimbing.md\":\"DhESf3OO\",\"index.md\":\"BoHaMdeZ\",\"quickstart.md\":\"Nj_LjW_a\",\"reference_agent-config.md\":\"Cp_x38Nl\",\"reference_artifacts.md\":\"Dior32Qw\",\"reference_channels.md\":\"Cd2f2iyV\",\"reference_cli.md\":\"BsMOxDvh\",\"reference_connections.md\":\"BH8Oc0D0\",\"reference_hooks.md\":\"a8BJxMR5\",\"reference_http-api.md\":\"D89k1mdm\",\"reference_instructions.md\":\"CR7XSsGk\",\"reference_playground.md\":\"DnX5nL-B\",\"reference_project-layout.md\":\"Bv4KOtlB\",\"reference_prompt.md\":\"DnaD5dNK\",\"reference_schedules.md\":\"DI_JrHgq\",\"reference_sessions.md\":\"D0mIh4KK\",\"reference_skills.md\":\"BFW9retM\",\"reference_subagents.md\":\"CfsIloPm\",\"reference_tools.md\":\"BHeXn2id\",\"scaffolding-agents.md\":\"D7UUkWw0\",\"storage.md\":\"BOHeqk2M\",\"templates_agentic-owners.md\":\"BZSH4N9z\",\"templates_demo.md\":\"BeQX9V3H\",\"templates_pr-autofixer.md\":\"x5zl6-GT\",\"templates_security-help.md\":\"C3Ny_Qr2\",\"templates_security-reviewer.md\":\"lshxbCLK\",\"templates_triage.md\":\"Co4UNzkZ\",\"troubleshooting.md\":\"Ctv3T8C2\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Agent SDK\",\"description\":\"Filesystem-first framework for building and serving Cursor agents.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"sdkVersion\":\"0.1.95\",\"nav\":[{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Guides\",\"link\":\"/guides/webhooks\"},{\"text\":\"Templates\",\"link\":\"/templates/demo\"},{\"text\":\"Reference\",\"link\":\"/reference/project-layout\"}],\"search\":{\"provider\":\"local\"},\"outline\":{\"level\":[2,3]},\"sidebar\":[{\"text\":\"Getting started\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Scaffold an agent with Cursor\",\"link\":\"/scaffolding-agents\"},{\"text\":\"Convert a Cursor Automation\",\"link\":\"/guides/convert-automation\"},{\"text\":\"Concepts\",\"link\":\"/concepts\"}]},{\"text\":\"Templates\",\"items\":[{\"text\":\"Demo agent\",\"link\":\"/templates/demo\"},{\"text\":\"Security reviewer\",\"link\":\"/templates/security-reviewer\"},{\"text\":\"Security help\",\"link\":\"/templates/security-help\"},{\"text\":\"Agentic Owners\",\"link\":\"/templates/agentic-owners\"},{\"text\":\"PR autofixer\",\"link\":\"/templates/pr-autofixer\"},{\"text\":\"Triage agent\",\"link\":\"/templates/triage\"}]},{\"text\":\"Improving agents\",\"items\":[{\"text\":\"Building agents with agents\",\"link\":\"/building-with-agents\"},{\"text\":\"Evals\",\"link\":\"/evals\"},{\"text\":\"Live A/B metrics\",\"link\":\"/ab\"},{\"text\":\"Storage\",\"link\":\"/storage\"},{\"text\":\"Hillclimbing\",\"link\":\"/hillclimbing\"}]},{\"text\":\"Guides\",\"items\":[{\"text\":\"Webhooks & custom channels\",\"link\":\"/guides/webhooks\"},{\"text\":\"GitHub\",\"link\":\"/guides/github\"},{\"text\":\"Slack\",\"link\":\"/guides/slack\"},{\"text\":\"Human-in-the-loop approvals\",\"link\":\"/guides/human-in-the-loop\"},{\"text\":\"Agent-to-agent\",\"link\":\"/guides/agent-to-agent\"},{\"text\":\"Host MCP OAuth\",\"link\":\"/guides/mcp-oauth\"},{\"text\":\"Cloud runtime\",\"link\":\"/guides/cloud-runtime\"},{\"text\":\"OpenTelemetry\",\"link\":\"/guides/opentelemetry\"}]},{\"text\":\"Operating\",\"items\":[{\"text\":\"Deployment\",\"link\":\"/deployment\"},{\"text\":\"Fix common problems\",\"link\":\"/troubleshooting\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Project layout\",\"link\":\"/reference/project-layout\"},{\"text\":\"Agent config\",\"link\":\"/reference/agent-config\"},{\"text\":\"Instructions\",\"link\":\"/reference/instructions\"},{\"text\":\"Tools\",\"link\":\"/reference/tools\"},{\"text\":\"prompt\",\"link\":\"/reference/prompt\"},{\"text\":\"Skills\",\"link\":\"/reference/skills\"},{\"text\":\"MCP Connections\",\"link\":\"/reference/connections\"},{\"text\":\"Subagents\",\"link\":\"/reference/subagents\"},{\"text\":\"Channels\",\"link\":\"/reference/channels\"},{\"text\":\"Schedules & reminders\",\"link\":\"/reference/schedules\"},{\"text\":\"Hooks\",\"link\":\"/reference/hooks\"},{\"text\":\"Artifacts\",\"link\":\"/reference/artifacts\"},{\"text\":\"Sessions & streaming\",\"link\":\"/reference/sessions\"},{\"text\":\"Playground\",\"link\":\"/reference/playground\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"HTTP API\",\"link\":\"/reference/http-api\"}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
21
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"ab.md\":\"DJo5r4R-\",\"building-with-agents.md\":\"DI4mEzlt\",\"concepts.md\":\"lwAgBIMI\",\"deployment.md\":\"D9msOFOW\",\"evals.md\":\"lfJoEVc8\",\"guides_agent-to-agent.md\":\"BDb0t1QV\",\"guides_cloud-runtime.md\":\"CkYbjnAX\",\"guides_convert-automation.md\":\"B4sjlodG\",\"guides_github.md\":\"Cnh2mL4a\",\"guides_human-in-the-loop.md\":\"By1G2T3_\",\"guides_mcp-oauth.md\":\"DPYmBCbV\",\"guides_opentelemetry.md\":\"bmPmkvJu\",\"guides_slack.md\":\"C32HsdKk\",\"guides_webhooks.md\":\"DKdA43Qm\",\"hillclimbing.md\":\"DhESf3OO\",\"index.md\":\"CI93Ltlb\",\"quickstart.md\":\"Nj_LjW_a\",\"reference_agent-config.md\":\"Cp_x38Nl\",\"reference_artifacts.md\":\"Dior32Qw\",\"reference_channels.md\":\"Cd2f2iyV\",\"reference_cli.md\":\"CCnG-nJx\",\"reference_connections.md\":\"BH8Oc0D0\",\"reference_hooks.md\":\"a8BJxMR5\",\"reference_http-api.md\":\"D89k1mdm\",\"reference_instructions.md\":\"CR7XSsGk\",\"reference_playground.md\":\"DnX5nL-B\",\"reference_project-layout.md\":\"Bv4KOtlB\",\"reference_prompt.md\":\"DnaD5dNK\",\"reference_schedules.md\":\"DI_JrHgq\",\"reference_sessions.md\":\"D0mIh4KK\",\"reference_skills.md\":\"BFW9retM\",\"reference_subagents.md\":\"CfsIloPm\",\"reference_tools.md\":\"BHeXn2id\",\"scaffolding-agents.md\":\"D7UUkWw0\",\"storage.md\":\"BOHeqk2M\",\"templates_agentic-owners.md\":\"BZSH4N9z\",\"templates_code-wiki.md\":\"CDYZIBFN\",\"templates_demo.md\":\"BeQX9V3H\",\"templates_pr-autofixer.md\":\"x5zl6-GT\",\"templates_security-help.md\":\"C3Ny_Qr2\",\"templates_security-reviewer.md\":\"lshxbCLK\",\"templates_triage.md\":\"Co4UNzkZ\",\"troubleshooting.md\":\"Ctv3T8C2\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Agent SDK\",\"description\":\"Filesystem-first framework for building and serving Cursor agents.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"sdkVersion\":\"0.1.96\",\"nav\":[{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Guides\",\"link\":\"/guides/webhooks\"},{\"text\":\"Templates\",\"link\":\"/templates/demo\"},{\"text\":\"Reference\",\"link\":\"/reference/project-layout\"}],\"search\":{\"provider\":\"local\"},\"outline\":{\"level\":[2,3]},\"sidebar\":[{\"text\":\"Getting started\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Scaffold an agent with Cursor\",\"link\":\"/scaffolding-agents\"},{\"text\":\"Convert a Cursor Automation\",\"link\":\"/guides/convert-automation\"},{\"text\":\"Concepts\",\"link\":\"/concepts\"}]},{\"text\":\"Templates\",\"items\":[{\"text\":\"Demo agent\",\"link\":\"/templates/demo\"},{\"text\":\"Code wiki\",\"link\":\"/templates/code-wiki\"},{\"text\":\"Security reviewer\",\"link\":\"/templates/security-reviewer\"},{\"text\":\"Security help\",\"link\":\"/templates/security-help\"},{\"text\":\"Agentic Owners\",\"link\":\"/templates/agentic-owners\"},{\"text\":\"PR autofixer\",\"link\":\"/templates/pr-autofixer\"},{\"text\":\"Triage agent\",\"link\":\"/templates/triage\"}]},{\"text\":\"Improving agents\",\"items\":[{\"text\":\"Building agents with agents\",\"link\":\"/building-with-agents\"},{\"text\":\"Evals\",\"link\":\"/evals\"},{\"text\":\"Live A/B metrics\",\"link\":\"/ab\"},{\"text\":\"Storage\",\"link\":\"/storage\"},{\"text\":\"Hillclimbing\",\"link\":\"/hillclimbing\"}]},{\"text\":\"Guides\",\"items\":[{\"text\":\"Webhooks & custom channels\",\"link\":\"/guides/webhooks\"},{\"text\":\"GitHub\",\"link\":\"/guides/github\"},{\"text\":\"Slack\",\"link\":\"/guides/slack\"},{\"text\":\"Human-in-the-loop approvals\",\"link\":\"/guides/human-in-the-loop\"},{\"text\":\"Agent-to-agent\",\"link\":\"/guides/agent-to-agent\"},{\"text\":\"Host MCP OAuth\",\"link\":\"/guides/mcp-oauth\"},{\"text\":\"Cloud runtime\",\"link\":\"/guides/cloud-runtime\"},{\"text\":\"OpenTelemetry\",\"link\":\"/guides/opentelemetry\"}]},{\"text\":\"Operating\",\"items\":[{\"text\":\"Deployment\",\"link\":\"/deployment\"},{\"text\":\"Fix common problems\",\"link\":\"/troubleshooting\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Project layout\",\"link\":\"/reference/project-layout\"},{\"text\":\"Agent config\",\"link\":\"/reference/agent-config\"},{\"text\":\"Instructions\",\"link\":\"/reference/instructions\"},{\"text\":\"Tools\",\"link\":\"/reference/tools\"},{\"text\":\"prompt\",\"link\":\"/reference/prompt\"},{\"text\":\"Skills\",\"link\":\"/reference/skills\"},{\"text\":\"MCP Connections\",\"link\":\"/reference/connections\"},{\"text\":\"Subagents\",\"link\":\"/reference/subagents\"},{\"text\":\"Channels\",\"link\":\"/reference/channels\"},{\"text\":\"Schedules & reminders\",\"link\":\"/reference/schedules\"},{\"text\":\"Hooks\",\"link\":\"/reference/hooks\"},{\"text\":\"Artifacts\",\"link\":\"/reference/artifacts\"},{\"text\":\"Sessions & streaming\",\"link\":\"/reference/sessions\"},{\"text\":\"Playground\",\"link\":\"/reference/playground\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"HTTP API\",\"link\":\"/reference/http-api\"}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
22
22
 
23
23
  </body>
24
24
  </html>