@cursor/july 0.1.2 → 0.1.3

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 (174) hide show
  1. package/AGENTS.md +16 -5
  2. package/README.md +8 -9
  3. package/dist/bin/agent-serve.d.ts +3 -1
  4. package/dist/bin/agent-serve.d.ts.map +1 -1
  5. package/dist/bin/agent-serve.js +389 -152
  6. package/dist/docs/404.html +2 -2
  7. package/dist/docs/ab.html +3 -3
  8. package/dist/docs/assets/{app.Oje4vhlk.js → app.BR0RbIdx.js} +1 -1
  9. package/dist/docs/assets/chunks/@localSearchIndexroot.DtIOQzGj.js +1 -0
  10. package/dist/docs/assets/chunks/{VPLocalSearchBox.H5XZ2zCB.js → VPLocalSearchBox.qjsVTneI.js} +1 -1
  11. package/dist/docs/assets/chunks/{theme.CTR_TuaE.js → theme.2Kg8jIp_.js} +2 -2
  12. package/dist/docs/assets/{quickstart.md.CfU8_uTC.js → quickstart.md.BU6Iwi_9.js} +18 -6
  13. package/dist/docs/assets/{reference_cli.md.DA730zCu.js → reference_cli.md.Bv6pOxcF.js} +11 -6
  14. package/dist/docs/assets/{reference_cli.md.DA730zCu.lean.js → reference_cli.md.Bv6pOxcF.lean.js} +1 -1
  15. package/dist/docs/building-with-agents.html +3 -3
  16. package/dist/docs/concepts.html +3 -3
  17. package/dist/docs/deployment.html +3 -3
  18. package/dist/docs/evals.html +3 -3
  19. package/dist/docs/guides/agent-to-agent.html +3 -3
  20. package/dist/docs/guides/cloud-runtime.html +3 -3
  21. package/dist/docs/guides/github.html +3 -3
  22. package/dist/docs/guides/human-in-the-loop.html +3 -3
  23. package/dist/docs/guides/slack.html +3 -3
  24. package/dist/docs/guides/webhooks.html +3 -3
  25. package/dist/docs/hashmap.json +1 -1
  26. package/dist/docs/hillclimbing.html +3 -3
  27. package/dist/docs/index.html +3 -3
  28. package/dist/docs/quickstart.html +22 -10
  29. package/dist/docs/reference/agent-config.html +3 -3
  30. package/dist/docs/reference/channels.html +3 -3
  31. package/dist/docs/reference/cli.html +14 -9
  32. package/dist/docs/reference/connections.html +3 -3
  33. package/dist/docs/reference/hooks.html +3 -3
  34. package/dist/docs/reference/http-api.html +3 -3
  35. package/dist/docs/reference/instructions.html +3 -3
  36. package/dist/docs/reference/playground.html +3 -3
  37. package/dist/docs/reference/project-layout.html +3 -3
  38. package/dist/docs/reference/schedules.html +3 -3
  39. package/dist/docs/reference/sessions.html +3 -3
  40. package/dist/docs/reference/skills.html +3 -3
  41. package/dist/docs/reference/subagents.html +3 -3
  42. package/dist/docs/reference/tools.html +3 -3
  43. package/dist/docs/scaffolding-agents.html +3 -3
  44. package/dist/docs/storage.html +3 -3
  45. package/dist/docs/troubleshooting.html +3 -3
  46. package/dist/internal/chat-client.d.ts +29 -3
  47. package/dist/internal/chat-client.d.ts.map +1 -1
  48. package/dist/internal/chat-client.js +180 -27
  49. package/dist/internal/cli-ax.d.ts +75 -2
  50. package/dist/internal/cli-ax.d.ts.map +1 -1
  51. package/dist/internal/cli-ax.js +600 -52
  52. package/dist/internal/cli-cursor.d.ts.map +1 -1
  53. package/dist/internal/cli-cursor.js +8 -36
  54. package/dist/internal/cli-deploy.d.ts +59 -3
  55. package/dist/internal/cli-deploy.d.ts.map +1 -1
  56. package/dist/internal/cli-deploy.js +316 -38
  57. package/dist/internal/cursor/credentials.d.ts +9 -0
  58. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  59. package/dist/internal/cursor/credentials.js +12 -0
  60. package/dist/internal/deploy-client.d.ts +9 -1
  61. package/dist/internal/deploy-client.d.ts.map +1 -1
  62. package/dist/internal/deploy-client.js +23 -3
  63. package/dist/internal/deploy-source.d.ts +35 -0
  64. package/dist/internal/deploy-source.d.ts.map +1 -0
  65. package/dist/internal/deploy-source.js +118 -0
  66. package/dist/internal/discovery.d.ts +11 -0
  67. package/dist/internal/discovery.d.ts.map +1 -1
  68. package/dist/internal/discovery.js +43 -14
  69. package/dist/internal/eval-run-store.d.ts.map +1 -1
  70. package/dist/internal/eval-run-store.js +2 -1
  71. package/dist/internal/eval-runner.d.ts +2 -0
  72. package/dist/internal/eval-runner.d.ts.map +1 -1
  73. package/dist/internal/eval-runner.js +2 -0
  74. package/dist/internal/event-mapper.d.ts +54 -1
  75. package/dist/internal/event-mapper.d.ts.map +1 -1
  76. package/dist/internal/event-mapper.js +151 -41
  77. package/dist/internal/init-project.d.ts +88 -1
  78. package/dist/internal/init-project.d.ts.map +1 -1
  79. package/dist/internal/init-project.js +221 -31
  80. package/dist/internal/install-cursor-skills.d.ts +64 -0
  81. package/dist/internal/install-cursor-skills.d.ts.map +1 -0
  82. package/dist/internal/install-cursor-skills.js +274 -0
  83. package/dist/internal/logs-client.d.ts +60 -0
  84. package/dist/internal/logs-client.d.ts.map +1 -0
  85. package/dist/internal/logs-client.js +311 -0
  86. package/dist/internal/open-browser.d.ts +5 -0
  87. package/dist/internal/open-browser.d.ts.map +1 -0
  88. package/dist/internal/open-browser.js +34 -0
  89. package/dist/internal/playground/toolchain.d.ts.map +1 -1
  90. package/dist/internal/playground/toolchain.js +16 -11
  91. package/dist/internal/playground-proxy.d.ts +69 -0
  92. package/dist/internal/playground-proxy.d.ts.map +1 -0
  93. package/dist/internal/playground-proxy.js +468 -0
  94. package/dist/internal/prompt-context.d.ts +35 -0
  95. package/dist/internal/prompt-context.d.ts.map +1 -0
  96. package/dist/internal/prompt-context.js +71 -0
  97. package/dist/internal/request-headers.d.ts +11 -0
  98. package/dist/internal/request-headers.d.ts.map +1 -0
  99. package/dist/internal/request-headers.js +14 -0
  100. package/dist/internal/resolve-prod-target.d.ts +42 -0
  101. package/dist/internal/resolve-prod-target.d.ts.map +1 -0
  102. package/dist/internal/resolve-prod-target.js +111 -0
  103. package/dist/internal/run-client.d.ts +2 -2
  104. package/dist/internal/run-client.d.ts.map +1 -1
  105. package/dist/internal/run-client.js +38 -23
  106. package/dist/internal/server.d.ts.map +1 -1
  107. package/dist/internal/server.js +10 -4
  108. package/dist/internal/session-engine.d.ts +1 -1
  109. package/dist/internal/session-engine.d.ts.map +1 -1
  110. package/dist/internal/session-engine.js +21 -6
  111. package/dist/internal/sessions-client.d.ts +21 -0
  112. package/dist/internal/sessions-client.d.ts.map +1 -0
  113. package/dist/internal/sessions-client.js +168 -0
  114. package/dist/internal/stream-progress.d.ts.map +1 -1
  115. package/dist/internal/stream-progress.js +31 -3
  116. package/dist/internal/terminal-style.d.ts +22 -0
  117. package/dist/internal/terminal-style.d.ts.map +1 -0
  118. package/dist/internal/terminal-style.js +49 -0
  119. package/dist/internal/trajectory.d.ts +10 -5
  120. package/dist/internal/trajectory.d.ts.map +1 -1
  121. package/dist/internal/trajectory.js +82 -10
  122. package/dist/internal/workspace.d.ts +11 -0
  123. package/dist/internal/workspace.d.ts.map +1 -1
  124. package/dist/internal/workspace.js +38 -4
  125. package/dist/playground/assets/index-D-vo2lV_.css +1 -0
  126. package/dist/playground/assets/index-x60b9q2j.js +312 -0
  127. package/dist/playground/index.html +2 -2
  128. package/dist/types.d.ts +26 -1
  129. package/dist/types.d.ts.map +1 -1
  130. package/docs/quickstart.md +22 -7
  131. package/docs/reference/cli.md +51 -3
  132. package/package.json +3 -1
  133. package/skills/ab/SKILL.md +8 -8
  134. package/skills/create-agent/SKILL.md +28 -22
  135. package/skills/debug/SKILL.md +11 -11
  136. package/skills/evals/SKILL.md +16 -16
  137. package/skills/framework-map/SKILL.md +6 -6
  138. package/skills/github/SKILL.md +13 -13
  139. package/skills/hillclimb/SKILL.md +10 -10
  140. package/skills/setup-slack/SKILL.md +13 -13
  141. package/src/bin/agent-serve.ts +422 -188
  142. package/src/internal/chat-client.ts +252 -37
  143. package/src/internal/cli-ax.ts +722 -72
  144. package/src/internal/cli-cursor.ts +14 -42
  145. package/src/internal/cli-deploy.ts +428 -49
  146. package/src/internal/cursor/credentials.ts +14 -0
  147. package/src/internal/deploy-client.ts +45 -4
  148. package/src/internal/deploy-source.ts +133 -0
  149. package/src/internal/discovery.ts +53 -16
  150. package/src/internal/eval-run-store.ts +2 -1
  151. package/src/internal/eval-runner.ts +5 -0
  152. package/src/internal/event-mapper.ts +222 -42
  153. package/src/internal/init-project.ts +333 -51
  154. package/src/internal/install-cursor-skills.ts +327 -0
  155. package/src/internal/logs-client.ts +442 -0
  156. package/src/internal/open-browser.ts +41 -0
  157. package/src/internal/playground/toolchain.ts +15 -13
  158. package/src/internal/playground-proxy.ts +576 -0
  159. package/src/internal/prompt-context.ts +95 -0
  160. package/src/internal/request-headers.ts +23 -0
  161. package/src/internal/resolve-prod-target.ts +150 -0
  162. package/src/internal/run-client.ts +39 -36
  163. package/src/internal/server.ts +12 -3
  164. package/src/internal/session-engine.ts +22 -3
  165. package/src/internal/sessions-client.ts +182 -0
  166. package/src/internal/stream-progress.ts +36 -2
  167. package/src/internal/terminal-style.ts +74 -0
  168. package/src/internal/trajectory.ts +91 -13
  169. package/src/internal/workspace.ts +42 -4
  170. package/src/types.ts +42 -6
  171. package/dist/docs/assets/chunks/@localSearchIndexroot.zwQ9RCQ7.js +0 -1
  172. package/dist/playground/assets/index-B1Qc9h2u.css +0 -1
  173. package/dist/playground/assets/index-CpDYCj8W.js +0 -79
  174. /package/dist/docs/assets/{quickstart.md.CfU8_uTC.lean.js → quickstart.md.BU6Iwi_9.lean.js} +0 -0
@@ -4,11 +4,63 @@
4
4
  * (`SessionEvent` payloads). One mapper instance covers one turn.
5
5
  */
6
6
 
7
- import type { InteractionUpdate, ToolCall } from "@cursor/sdk";
7
+ import type {
8
+ InteractionUpdate as SdkInteractionUpdate,
9
+ ToolCall,
10
+ } from "@cursor/sdk";
8
11
  import type { SessionEventPayload, TurnUsage } from "../types.js";
9
12
 
10
13
  const CUSTOM_TOOLS_PROVIDER = "custom-user-tools";
11
14
 
15
+ /**
16
+ * Nested interaction updates from a task/subagent tool-call-delta.
17
+ * Mirrored locally so agent-serve typechecks against published `@cursor/sdk`
18
+ * versions that do not yet export `NestedTaskUpdate` / `tool-call-delta`.
19
+ */
20
+ type NestedTaskUpdate =
21
+ | { type: "text-delta"; text: string }
22
+ | { type: "thinking-delta"; text: string }
23
+ | { type: "thinking-completed"; thinkingDurationMs: number }
24
+ | {
25
+ type: "tool-call-started";
26
+ callId: string;
27
+ toolCall: ToolCall;
28
+ modelCallId: string;
29
+ }
30
+ | {
31
+ type: "tool-call-completed";
32
+ callId: string;
33
+ toolCall: ToolCall;
34
+ modelCallId: string;
35
+ }
36
+ | {
37
+ type: "partial-tool-call";
38
+ callId: string;
39
+ toolCall: ToolCall;
40
+ modelCallId: string;
41
+ }
42
+ | { type: "step-started"; stepId: number }
43
+ | { type: "step-completed"; stepId: number; stepDurationMs: number };
44
+
45
+ type ToolCallDeltaUpdate = {
46
+ type: "tool-call-delta";
47
+ callId: string;
48
+ modelCallId: string;
49
+ taskUpdate: NestedTaskUpdate;
50
+ };
51
+
52
+ /** SDK updates plus nested task deltas once the SDK exposes them. */
53
+ type InteractionUpdate = SdkInteractionUpdate | ToolCallDeltaUpdate;
54
+
55
+ function asToolCallDelta(
56
+ update: InteractionUpdate
57
+ ): ToolCallDeltaUpdate | undefined {
58
+ if ((update as { type: string }).type !== "tool-call-delta") {
59
+ return undefined;
60
+ }
61
+ return update as ToolCallDeltaUpdate;
62
+ }
63
+
12
64
  export interface ToolCallDescription {
13
65
  toolName: string;
14
66
  args?: unknown;
@@ -20,12 +72,19 @@ export interface ToolResultDescription {
20
72
  isError: boolean;
21
73
  }
22
74
 
75
+ interface NestedAccumulators {
76
+ text: string;
77
+ reasoning: string;
78
+ }
79
+
23
80
  export class TurnEventMapper {
24
81
  private textAccumulator = "";
25
82
  private reasoningAccumulator = "";
26
83
  private usageTotal: TurnUsage | undefined;
27
84
  private lastAssistantText: string | undefined;
28
85
  private summaryTitle: string | undefined;
86
+ /** Per-parent-call accumulators for nested subagent streams. */
87
+ private readonly nested = new Map<string, NestedAccumulators>();
29
88
 
30
89
  constructor(private readonly emit: (payload: SessionEventPayload) => void) {}
31
90
 
@@ -74,49 +133,11 @@ export class TurnEventMapper {
74
133
  }
75
134
  case "tool-call-started": {
76
135
  this.flushAssistantText("tool_call");
77
- const description = describeToolCall(update.toolCall);
78
- this.emit({
79
- type: "actions.requested",
80
- data: {
81
- calls: [
82
- {
83
- callId: update.callId,
84
- toolName: description.toolName,
85
- args: description.args,
86
- },
87
- ],
88
- },
89
- });
90
- if (description.subagent !== undefined) {
91
- this.emit({
92
- type: "subagent.called",
93
- data: {
94
- callId: update.callId,
95
- name: description.subagent.name,
96
- description: description.subagent.description,
97
- },
98
- });
99
- }
136
+ this.emitToolStarted(update.callId, update.toolCall);
100
137
  return;
101
138
  }
102
139
  case "tool-call-completed": {
103
- const description = describeToolCall(update.toolCall);
104
- const result = describeToolResult(update.toolCall);
105
- this.emit({
106
- type: "action.result",
107
- data: {
108
- callId: update.callId,
109
- toolName: description.toolName,
110
- output: result.output,
111
- isError: result.isError,
112
- },
113
- });
114
- if (description.subagent !== undefined) {
115
- this.emit({
116
- type: "subagent.completed",
117
- data: { callId: update.callId, name: description.subagent.name },
118
- });
119
- }
140
+ this.emitToolCompleted(update.callId, update.toolCall);
120
141
  return;
121
142
  }
122
143
  case "step-started": {
@@ -148,7 +169,13 @@ export class TurnEventMapper {
148
169
  case "shell-output-delta":
149
170
  return;
150
171
  default: {
151
- // Future harness update types are ignored rather than fatal.
172
+ // Nested task/subagent progress (tool-call-delta) accepted via
173
+ // structural check so we typecheck against older published SDKs.
174
+ const delta = asToolCallDelta(update);
175
+ if (delta !== undefined) {
176
+ this.handleNestedTaskUpdate(delta.callId, delta.taskUpdate);
177
+ return;
178
+ }
152
179
  return;
153
180
  }
154
181
  }
@@ -157,6 +184,143 @@ export class TurnEventMapper {
157
184
  /** Close out the turn: finalize any open assistant text block. */
158
185
  finish(): void {
159
186
  this.flushAssistantText("stop");
187
+ for (const parentCallId of this.nested.keys()) {
188
+ this.flushNestedAssistantText(parentCallId, "stop");
189
+ }
190
+ }
191
+
192
+ private handleNestedTaskUpdate(
193
+ parentCallId: string,
194
+ update: NestedTaskUpdate
195
+ ): void {
196
+ switch (update.type) {
197
+ case "text-delta": {
198
+ const acc = this.ensureNested(parentCallId);
199
+ acc.text += update.text;
200
+ this.emit({
201
+ type: "message.appended",
202
+ data: {
203
+ delta: update.text,
204
+ text: acc.text,
205
+ parentCallId,
206
+ },
207
+ });
208
+ return;
209
+ }
210
+ case "thinking-delta": {
211
+ const acc = this.ensureNested(parentCallId);
212
+ acc.reasoning += update.text;
213
+ this.emit({
214
+ type: "reasoning.appended",
215
+ data: {
216
+ delta: update.text,
217
+ text: acc.reasoning,
218
+ parentCallId,
219
+ },
220
+ });
221
+ return;
222
+ }
223
+ case "thinking-completed": {
224
+ const acc = this.nested.get(parentCallId);
225
+ if (acc !== undefined && acc.reasoning !== "") {
226
+ acc.reasoning = "";
227
+ }
228
+ this.emit({
229
+ type: "reasoning.completed",
230
+ data: {
231
+ durationMs: update.thinkingDurationMs,
232
+ parentCallId,
233
+ },
234
+ });
235
+ return;
236
+ }
237
+ case "tool-call-started": {
238
+ this.flushNestedAssistantText(parentCallId, "tool_call");
239
+ this.emitToolStarted(update.callId, update.toolCall, parentCallId);
240
+ return;
241
+ }
242
+ case "tool-call-completed": {
243
+ this.emitToolCompleted(update.callId, update.toolCall, parentCallId);
244
+ return;
245
+ }
246
+ case "partial-tool-call":
247
+ case "step-started":
248
+ case "step-completed":
249
+ return;
250
+ default: {
251
+ return;
252
+ }
253
+ }
254
+ }
255
+
256
+ private emitToolStarted(
257
+ callId: string,
258
+ toolCall: ToolCall,
259
+ parentCallId?: string
260
+ ): void {
261
+ const description = describeToolCall(toolCall);
262
+ this.emit({
263
+ type: "actions.requested",
264
+ data: {
265
+ calls: [
266
+ {
267
+ callId,
268
+ toolName: description.toolName,
269
+ args: description.args,
270
+ parentCallId,
271
+ },
272
+ ],
273
+ parentCallId,
274
+ },
275
+ });
276
+ // Subagent bookends only fire for the top-level task tool, not nested
277
+ // tools inside a subagent (nested subagents aren't supported).
278
+ if (description.subagent !== undefined && parentCallId === undefined) {
279
+ this.emit({
280
+ type: "subagent.called",
281
+ data: {
282
+ callId,
283
+ name: description.subagent.name,
284
+ description: description.subagent.description,
285
+ },
286
+ });
287
+ }
288
+ }
289
+
290
+ private emitToolCompleted(
291
+ callId: string,
292
+ toolCall: ToolCall,
293
+ parentCallId?: string
294
+ ): void {
295
+ const description = describeToolCall(toolCall);
296
+ const result = describeToolResult(toolCall);
297
+ this.emit({
298
+ type: "action.result",
299
+ data: {
300
+ callId,
301
+ toolName: description.toolName,
302
+ output: result.output,
303
+ isError: result.isError,
304
+ parentCallId,
305
+ },
306
+ });
307
+ if (description.subagent !== undefined && parentCallId === undefined) {
308
+ this.flushNestedAssistantText(callId, "stop");
309
+ this.nested.delete(callId);
310
+ this.emit({
311
+ type: "subagent.completed",
312
+ data: { callId, name: description.subagent.name },
313
+ });
314
+ }
315
+ }
316
+
317
+ private ensureNested(parentCallId: string): NestedAccumulators {
318
+ let acc = this.nested.get(parentCallId);
319
+ if (acc === undefined) {
320
+ acc = { text: "", reasoning: "" };
321
+ this.nested.set(parentCallId, acc);
322
+ }
323
+ return acc;
160
324
  }
161
325
 
162
326
  private flushAssistantText(finishReason: "stop" | "tool_call"): void {
@@ -171,6 +335,22 @@ export class TurnEventMapper {
171
335
  data: { text, finishReason },
172
336
  });
173
337
  }
338
+
339
+ private flushNestedAssistantText(
340
+ parentCallId: string,
341
+ finishReason: "stop" | "tool_call"
342
+ ): void {
343
+ const acc = this.nested.get(parentCallId);
344
+ if (acc === undefined || acc.text === "") {
345
+ return;
346
+ }
347
+ const text = acc.text;
348
+ acc.text = "";
349
+ this.emit({
350
+ type: "message.completed",
351
+ data: { text, finishReason, parentCallId },
352
+ });
353
+ }
174
354
  }
175
355
 
176
356
  /**