@cursor/july 0.1.103 → 0.1.105

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 (264) hide show
  1. package/dist/channels/change-monitors/change-monitors-channel.d.ts +5 -0
  2. package/dist/channels/change-monitors/change-monitors-channel.d.ts.map +1 -0
  3. package/dist/channels/change-monitors/change-monitors-channel.js +41 -0
  4. package/dist/channels/change-monitors/index.d.ts +4 -0
  5. package/dist/channels/change-monitors/index.d.ts.map +1 -0
  6. package/dist/channels/change-monitors/index.js +2 -0
  7. package/dist/channels/change-monitors/types.d.ts +39 -0
  8. package/dist/channels/change-monitors/types.d.ts.map +1 -0
  9. package/dist/channels/change-monitors/types.js +1 -0
  10. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  11. package/dist/channels/deployments/deployments-channel.js +1 -0
  12. package/dist/channels/deployments/types.d.ts +2 -0
  13. package/dist/channels/deployments/types.d.ts.map +1 -1
  14. package/dist/channels/github/defaults.d.ts.map +1 -1
  15. package/dist/channels/github/defaults.js +4 -0
  16. package/dist/channels/github/progress.d.ts +22 -0
  17. package/dist/channels/github/progress.d.ts.map +1 -1
  18. package/dist/channels/github/progress.js +32 -5
  19. package/dist/channels/issues/index.d.ts +4 -0
  20. package/dist/channels/issues/index.d.ts.map +1 -0
  21. package/dist/channels/issues/index.js +2 -0
  22. package/dist/channels/issues/issues-channel.d.ts +5 -0
  23. package/dist/channels/issues/issues-channel.d.ts.map +1 -0
  24. package/dist/channels/issues/issues-channel.js +37 -0
  25. package/dist/channels/issues/types.d.ts +33 -0
  26. package/dist/channels/issues/types.d.ts.map +1 -0
  27. package/dist/channels/issues/types.js +1 -0
  28. package/dist/docs/404.html +2 -2
  29. package/dist/docs/ab.html +4 -4
  30. package/dist/docs/assets/{app.DW9pXkpL.js → app.BVwaffdK.js} +1 -1
  31. package/dist/docs/assets/chunks/@localSearchIndexroot.CJxMklAy.js +1 -0
  32. package/dist/docs/assets/chunks/{VPLocalSearchBox.CdEIUwDg.js → VPLocalSearchBox.WuWTZ1x8.js} +1 -1
  33. package/dist/docs/assets/chunks/{theme.YZMHgPgg.js → theme.BYdI_6sF.js} +2 -2
  34. package/dist/docs/assets/{guides_github.md.DKYiT9do.js → guides_github.md.c0gdGJ-D.js} +1 -1
  35. package/dist/docs/assets/{guides_github.md.DKYiT9do.lean.js → guides_github.md.c0gdGJ-D.lean.js} +1 -1
  36. package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.js +9 -0
  37. package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.lean.js +1 -0
  38. package/dist/docs/assets/index.md.BW_6tOgR.js +5 -0
  39. package/dist/docs/assets/index.md.BW_6tOgR.lean.js +1 -0
  40. package/dist/docs/assets/{reference_channels.md.Dz8Cnudp.js → reference_channels.md.DBGcaB7m.js} +2 -2
  41. package/dist/docs/assets/{reference_channels.md.Dz8Cnudp.lean.js → reference_channels.md.DBGcaB7m.lean.js} +1 -1
  42. package/dist/docs/assets/{reference_cli.md.CJNc_xYK.js → reference_cli.md.C6Lo8SEd.js} +2 -1
  43. package/dist/docs/assets/{reference_extensions.md.DykHW3qL.js → reference_extensions.md.CGmMLblt.js} +1 -1
  44. package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.js +3 -0
  45. package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.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/design/filesystem.md +376 -0
  50. package/dist/docs/evals.html +4 -4
  51. package/dist/docs/guides/agent-to-agent.html +4 -4
  52. package/dist/docs/guides/cloud-agents.html +5 -5
  53. package/dist/docs/guides/convert-automation.html +4 -4
  54. package/dist/docs/guides/github.html +6 -6
  55. package/dist/docs/guides/github.md +5 -0
  56. package/dist/docs/guides/grokbot-agents.html +35 -0
  57. package/dist/docs/guides/grokbot-agents.md +88 -0
  58. package/dist/docs/guides/human-in-the-loop.html +4 -4
  59. package/dist/docs/guides/mcp-oauth.html +4 -4
  60. package/dist/docs/guides/opentelemetry.html +5 -5
  61. package/dist/docs/guides/slack.html +4 -4
  62. package/dist/docs/guides/webhooks.html +4 -4
  63. package/dist/docs/hashmap.json +1 -1
  64. package/dist/docs/hillclimbing.html +4 -4
  65. package/dist/docs/index.html +6 -6
  66. package/dist/docs/index.md +6 -1
  67. package/dist/docs/llms-full.txt +562 -2
  68. package/dist/docs/llms.txt +3 -0
  69. package/dist/docs/quickstart.html +4 -4
  70. package/dist/docs/reference/agent-config.html +4 -4
  71. package/dist/docs/reference/artifacts.html +4 -4
  72. package/dist/docs/reference/channels.html +6 -6
  73. package/dist/docs/reference/channels.md +20 -0
  74. package/dist/docs/reference/cli.html +7 -6
  75. package/dist/docs/reference/cli.md +2 -1
  76. package/dist/docs/reference/connections.html +4 -4
  77. package/dist/docs/reference/extensions.html +6 -6
  78. package/dist/docs/reference/extensions.md +2 -0
  79. package/dist/docs/reference/hooks.html +4 -4
  80. package/dist/docs/reference/http-api.html +4 -4
  81. package/dist/docs/reference/instructions.html +4 -4
  82. package/dist/docs/reference/playground.html +4 -4
  83. package/dist/docs/reference/project-layout.html +4 -4
  84. package/dist/docs/reference/prompt.html +4 -4
  85. package/dist/docs/reference/result.html +4 -4
  86. package/dist/docs/reference/schedules.html +4 -4
  87. package/dist/docs/reference/sessions.html +4 -4
  88. package/dist/docs/reference/skills.html +4 -4
  89. package/dist/docs/reference/subagents.html +4 -4
  90. package/dist/docs/reference/tools.html +4 -4
  91. package/dist/docs/scaffolding-agents.html +4 -4
  92. package/dist/docs/skills/ab.html +4 -4
  93. package/dist/docs/skills/create-agent.html +4 -4
  94. package/dist/docs/skills/debug.html +4 -4
  95. package/dist/docs/skills/evals.html +4 -4
  96. package/dist/docs/skills/framework-map.html +4 -4
  97. package/dist/docs/skills/github.html +4 -4
  98. package/dist/docs/skills/hillclimb.html +4 -4
  99. package/dist/docs/skills/index.html +4 -4
  100. package/dist/docs/skills/mcp-auth.html +4 -4
  101. package/dist/docs/skills/otel.html +4 -4
  102. package/dist/docs/skills/setup-slack.html +4 -4
  103. package/dist/docs/storage.html +4 -4
  104. package/dist/docs/templates/agentic-owners.html +4 -4
  105. package/dist/docs/templates/agents-md.html +4 -4
  106. package/dist/docs/templates/code-wiki.html +5 -5
  107. package/dist/docs/templates/demo.html +5 -5
  108. package/dist/docs/templates/grokbot-agents.html +29 -0
  109. package/dist/docs/templates/grokbot-agents.md +48 -0
  110. package/dist/docs/templates/pr-autofixer.html +4 -4
  111. package/dist/docs/templates/security-help.html +4 -4
  112. package/dist/docs/templates/security-reviewer.html +4 -4
  113. package/dist/docs/templates/triage.html +4 -4
  114. package/dist/docs/troubleshooting.html +4 -4
  115. package/dist/files.d.ts +7 -2
  116. package/dist/files.d.ts.map +1 -1
  117. package/dist/files.js +7 -2
  118. package/dist/filesystem.d.ts +440 -0
  119. package/dist/filesystem.d.ts.map +1 -0
  120. package/dist/filesystem.js +1694 -0
  121. package/dist/index.d.ts +2 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -0
  124. package/dist/internal/continuation-channel.d.ts +4 -2
  125. package/dist/internal/continuation-channel.d.ts.map +1 -1
  126. package/dist/internal/continuation-channel.js +21 -12
  127. package/dist/internal/continuation-identity.d.ts +13 -5
  128. package/dist/internal/continuation-identity.d.ts.map +1 -1
  129. package/dist/internal/continuation-identity.js +74 -35
  130. package/dist/internal/cursor-agent-template.d.ts +1 -1
  131. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  132. package/dist/internal/cursor-agent-template.js +1 -0
  133. package/dist/internal/discovery/agent.d.ts.map +1 -1
  134. package/dist/internal/discovery/agent.js +80 -8
  135. package/dist/internal/discovery/info.d.ts.map +1 -1
  136. package/dist/internal/discovery/info.js +3 -0
  137. package/dist/internal/factory-resource-channel.d.ts +33 -0
  138. package/dist/internal/factory-resource-channel.d.ts.map +1 -0
  139. package/dist/internal/factory-resource-channel.js +77 -0
  140. package/dist/internal/filesystem/errors.d.ts +64 -0
  141. package/dist/internal/filesystem/errors.d.ts.map +1 -0
  142. package/dist/internal/filesystem/errors.js +175 -0
  143. package/dist/internal/filesystem/format.d.ts +28 -0
  144. package/dist/internal/filesystem/format.d.ts.map +1 -0
  145. package/dist/internal/filesystem/format.js +213 -0
  146. package/dist/internal/filesystem/merge.d.ts +34 -0
  147. package/dist/internal/filesystem/merge.d.ts.map +1 -0
  148. package/dist/internal/filesystem/merge.js +196 -0
  149. package/dist/internal/filesystem/scratch.d.ts +59 -0
  150. package/dist/internal/filesystem/scratch.d.ts.map +1 -0
  151. package/dist/internal/filesystem/scratch.js +212 -0
  152. package/dist/internal/filesystem/sdk-schemas.d.ts +29 -0
  153. package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -0
  154. package/dist/internal/filesystem/sdk-schemas.js +153 -0
  155. package/dist/internal/filesystem/tools.d.ts +42 -0
  156. package/dist/internal/filesystem/tools.d.ts.map +1 -0
  157. package/dist/internal/filesystem/tools.js +618 -0
  158. package/dist/internal/filesystem/walk.d.ts +74 -0
  159. package/dist/internal/filesystem/walk.d.ts.map +1 -0
  160. package/dist/internal/filesystem/walk.js +339 -0
  161. package/dist/internal/framework-file-storage.d.ts +3 -1
  162. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  163. package/dist/internal/framework-file-storage.js +3 -1
  164. package/dist/internal/guest-network.d.ts +5 -2
  165. package/dist/internal/guest-network.d.ts.map +1 -1
  166. package/dist/internal/guest-network.js +7 -2
  167. package/dist/internal/hosted-delivery.d.ts +7 -0
  168. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  169. package/dist/internal/hosted-delivery.js +41 -3
  170. package/dist/internal/hosted-managed-automation.d.ts.map +1 -1
  171. package/dist/internal/hosted-managed-automation.js +27 -2
  172. package/dist/internal/init-project.d.ts.map +1 -1
  173. package/dist/internal/init-project.js +4 -1
  174. package/dist/internal/sdk-runner.d.ts +13 -1
  175. package/dist/internal/sdk-runner.d.ts.map +1 -1
  176. package/dist/internal/sdk-runner.js +21 -1
  177. package/dist/internal/server.d.ts.map +1 -1
  178. package/dist/internal/server.js +11 -3
  179. package/dist/internal/session-engine.d.ts +30 -0
  180. package/dist/internal/session-engine.d.ts.map +1 -1
  181. package/dist/internal/session-engine.js +484 -82
  182. package/dist/internal/store-mirror.d.ts +2 -2
  183. package/dist/internal/store-mirror.js +2 -2
  184. package/dist/internal/tenant-slack/relay.d.ts +2 -0
  185. package/dist/internal/tenant-slack/relay.d.ts.map +1 -1
  186. package/dist/internal/tenant-slack/relay.js +18 -8
  187. package/dist/internal/testing/factory-resource-fixtures.d.ts +48 -0
  188. package/dist/internal/testing/factory-resource-fixtures.d.ts.map +1 -0
  189. package/dist/internal/testing/factory-resource-fixtures.js +41 -0
  190. package/dist/internal/workspace-sync.d.ts +31 -6
  191. package/dist/internal/workspace-sync.d.ts.map +1 -1
  192. package/dist/internal/workspace-sync.js +67 -12
  193. package/dist/internal/workspace.d.ts +9 -0
  194. package/dist/internal/workspace.d.ts.map +1 -1
  195. package/dist/internal/workspace.js +16 -0
  196. package/dist/playground/assets/{index-59KvgREd.js → index-BaQzjaNK.js} +40 -40
  197. package/dist/playground/assets/index-CceqnLTX.css +1 -0
  198. package/dist/playground/index.html +2 -2
  199. package/dist/types.d.ts +60 -11
  200. package/dist/types.d.ts.map +1 -1
  201. package/docs/README.md +6 -1
  202. package/docs/design/filesystem.md +376 -0
  203. package/docs/guides/github.md +5 -0
  204. package/docs/guides/grokbot-agents.md +93 -0
  205. package/docs/reference/channels.md +20 -0
  206. package/docs/reference/cli.md +2 -1
  207. package/docs/reference/extensions.md +2 -0
  208. package/docs/templates/grokbot-agents.md +53 -0
  209. package/package.json +25 -2
  210. package/src/channels/change-monitors/change-monitors-channel.ts +62 -0
  211. package/src/channels/change-monitors/index.ts +8 -0
  212. package/src/channels/change-monitors/types.ts +44 -0
  213. package/src/channels/deployments/deployments-channel.ts +1 -0
  214. package/src/channels/deployments/types.ts +2 -0
  215. package/src/channels/github/defaults.ts +4 -0
  216. package/src/channels/github/progress.ts +76 -10
  217. package/src/channels/issues/index.ts +9 -0
  218. package/src/channels/issues/issues-channel.ts +51 -0
  219. package/src/channels/issues/types.ts +41 -0
  220. package/src/files.ts +9 -2
  221. package/src/filesystem.ts +2074 -0
  222. package/src/index.ts +28 -0
  223. package/src/internal/continuation-channel.ts +29 -12
  224. package/src/internal/continuation-identity.ts +122 -37
  225. package/src/internal/cursor-agent-template.ts +1 -0
  226. package/src/internal/discovery/agent.ts +87 -1
  227. package/src/internal/discovery/info.ts +3 -0
  228. package/src/internal/factory-resource-channel.ts +122 -0
  229. package/src/internal/filesystem/errors.ts +220 -0
  230. package/src/internal/filesystem/format.ts +276 -0
  231. package/src/internal/filesystem/merge.ts +195 -0
  232. package/src/internal/filesystem/scratch.ts +255 -0
  233. package/src/internal/filesystem/sdk-schemas.ts +204 -0
  234. package/src/internal/filesystem/tools.ts +821 -0
  235. package/src/internal/filesystem/walk.ts +369 -0
  236. package/src/internal/framework-file-storage.ts +3 -1
  237. package/src/internal/guest-network.ts +8 -2
  238. package/src/internal/hosted-delivery.ts +71 -2
  239. package/src/internal/hosted-managed-automation.ts +49 -5
  240. package/src/internal/init-project.ts +4 -1
  241. package/src/internal/sdk-runner.ts +23 -0
  242. package/src/internal/server.ts +16 -0
  243. package/src/internal/session-engine.ts +595 -73
  244. package/src/internal/store-mirror.ts +2 -2
  245. package/src/internal/tenant-slack/relay.ts +28 -4
  246. package/src/internal/testing/factory-resource-fixtures.ts +85 -0
  247. package/src/internal/workspace-sync.ts +84 -12
  248. package/src/internal/workspace.ts +20 -0
  249. package/src/types.ts +58 -11
  250. package/templates/grokbot-agents/README.md +26 -0
  251. package/templates/grokbot-agents/agent/agent.ts +6 -0
  252. package/templates/grokbot-agents/agent/extensions/grokbot.ts +5 -0
  253. package/templates/grokbot-agents/agent/instructions.md +7 -0
  254. package/templates/grokbot-agents/evals/evals.config.ts +5 -0
  255. package/templates/grokbot-agents/evals/grokbot-agents.eval.ts +18 -0
  256. package/templates/grokbot-agents/init.json +18 -0
  257. package/templates/grokbot-agents/package.json +17 -0
  258. package/templates/grokbot-agents/tsconfig.json +12 -0
  259. package/dist/docs/assets/chunks/@localSearchIndexroot.nrl1ifBq.js +0 -1
  260. package/dist/docs/assets/index.md.D75GWhPl.js +0 -5
  261. package/dist/docs/assets/index.md.D75GWhPl.lean.js +0 -1
  262. package/dist/playground/assets/index-MbMxXg-y.css +0 -1
  263. /package/dist/docs/assets/{reference_cli.md.CJNc_xYK.lean.js → reference_cli.md.C6Lo8SEd.lean.js} +0 -0
  264. /package/dist/docs/assets/{reference_extensions.md.DykHW3qL.lean.js → reference_extensions.md.CGmMLblt.lean.js} +0 -0
@@ -0,0 +1,62 @@
1
+ import { z } from "zod";
2
+ import { createFactoryResourceChannel } from "../../internal/factory-resource-channel.js";
3
+ import type { ChannelDefinition } from "../../types.js";
4
+ import {
5
+ CHECKPOINT_CREATED_EVENT_TYPE,
6
+ type ChangeMonitorsChannelOptions,
7
+ type CheckpointCreatedEvent,
8
+ } from "./types.js";
9
+
10
+ const checkpointResourceSchema = z
11
+ .object({
12
+ name: z.string().min(1),
13
+ deployment: z.string().min(1),
14
+ runKey: z.string().min(1),
15
+ evidenceSummary: z.string().min(1),
16
+ planRevision: z.string().optional(),
17
+ createTime: z.string().min(1).optional(),
18
+ description: z.string().optional(),
19
+ clear: z.object({}).passthrough().optional(),
20
+ issues: z
21
+ .object({ title: z.string().min(1) })
22
+ .passthrough()
23
+ .optional(),
24
+ inconclusive: z.object({}).passthrough().optional(),
25
+ })
26
+ .passthrough()
27
+ .refine(
28
+ (checkpoint) =>
29
+ [checkpoint.clear, checkpoint.issues, checkpoint.inconclusive].filter(
30
+ (arm) => arm !== undefined
31
+ ).length === 1,
32
+ { message: "checkpoint must have exactly one result arm" }
33
+ );
34
+
35
+ const checkpointCreatedEventSchema: z.ZodType<CheckpointCreatedEvent> =
36
+ z.object({
37
+ eventId: z.string().min(1),
38
+ eventType: z.literal(CHECKPOINT_CREATED_EVENT_TYPE),
39
+ teamId: z.string().min(1),
40
+ occurredAtMs: z.number().int().nonnegative(),
41
+ checkpoint: checkpointResourceSchema,
42
+ });
43
+
44
+ const pack = createFactoryResourceChannel({
45
+ kind: "change_monitors",
46
+ eventTypes: [CHECKPOINT_CREATED_EVENT_TYPE],
47
+ eventSchema: checkpointCreatedEventSchema,
48
+ replayDescription: "Replay a Change Monitor checkpoint-created event.",
49
+ invalidError: "invalid change-monitor checkpoint event",
50
+ });
51
+
52
+ export function changeMonitorsChannel(
53
+ options: ChangeMonitorsChannelOptions
54
+ ): ChannelDefinition {
55
+ return pack.channel(options);
56
+ }
57
+
58
+ export function getChangeMonitorsChannelOptions(
59
+ definition: object
60
+ ): ChangeMonitorsChannelOptions | undefined {
61
+ return pack.getOptions(definition);
62
+ }
@@ -0,0 +1,8 @@
1
+ export { changeMonitorsChannel } from "./change-monitors-channel.js";
2
+ export type {
3
+ ChangeMonitorsChannelOptions,
4
+ CheckpointCreatedEvent,
5
+ CheckpointCreatedEventType,
6
+ CheckpointResource,
7
+ } from "./types.js";
8
+ export { CHECKPOINT_CREATED_EVENT_TYPE } from "./types.js";
@@ -0,0 +1,44 @@
1
+ import type { ContinuationIdentity } from "../../internal/continuation-identity.js";
2
+ import type { ChannelDefinition, ChannelHandlerArgs } from "../../types.js";
3
+
4
+ export const CHECKPOINT_CREATED_EVENT_TYPE = "checkpoint.created" as const;
5
+
6
+ export type CheckpointCreatedEventType = typeof CHECKPOINT_CREATED_EVENT_TYPE;
7
+
8
+ /**
9
+ * Factory Checkpoint JSON (camelCase proto JSON). Exactly one result arm is
10
+ * set: `clear`, `issues`, or `inconclusive`. The channel does not pre-filter.
11
+ */
12
+ export type CheckpointResource = {
13
+ name: string;
14
+ deployment: string;
15
+ runKey: string;
16
+ evidenceSummary: string;
17
+ planRevision?: string;
18
+ createTime?: string;
19
+ description?: string;
20
+ clear?: Record<string, unknown>;
21
+ issues?: { title: string };
22
+ inconclusive?: Record<string, unknown>;
23
+ };
24
+
25
+ /** Factory `checkpoint.created` for every Change Monitor Checkpoint create. */
26
+ export type CheckpointCreatedEvent = {
27
+ eventId: string;
28
+ eventType: CheckpointCreatedEventType;
29
+ teamId: string;
30
+ occurredAtMs: number;
31
+ checkpoint: CheckpointResource;
32
+ };
33
+
34
+ export type ChangeMonitorsChannelOptions = {
35
+ onEvent: (
36
+ event: CheckpointCreatedEvent,
37
+ args: ChannelHandlerArgs
38
+ ) => Promise<unknown> | unknown;
39
+ continuation?: ContinuationIdentity;
40
+ path?: string;
41
+ auth?: ChannelDefinition["auth"];
42
+ onStart?: ChannelDefinition["onStart"];
43
+ onStop?: ChannelDefinition["onStop"];
44
+ };
@@ -25,6 +25,7 @@ const deploymentEventSchema = z.object({
25
25
  environment: z.string().min(1),
26
26
  service: z.string().min(1).optional(),
27
27
  deployVersion: z.string().min(1),
28
+ previousVersion: z.string().min(1).optional(),
28
29
  status: z.enum(["pending", "in_progress", "success", "failed"]),
29
30
  occurredAtMs: z.number(),
30
31
  });
@@ -28,6 +28,8 @@ export interface DeploymentEvent {
28
28
  /** Absent when the deployment records no service. */
29
29
  service?: string;
30
30
  deployVersion: string;
31
+ /** Last succeeded different SHA; omitted on the first ship. */
32
+ previousVersion?: string;
31
33
  status: DeploymentStatus;
32
34
  occurredAtMs: number;
33
35
  }
@@ -41,6 +41,7 @@ export function buildDefaultGitHubEvents(
41
41
  }
42
42
  await applyGitHubProgress({
43
43
  phase: "pending",
44
+ sessionId: event.sessionId,
44
45
  channel,
45
46
  options,
46
47
  });
@@ -86,6 +87,7 @@ export function buildDefaultGitHubEvents(
86
87
  toolOutcomesBySession.delete(event.sessionId);
87
88
  await applyGitHubProgress({
88
89
  phase: pipelineSucceeded ? "success" : "failure",
90
+ sessionId: event.sessionId,
89
91
  channel,
90
92
  options,
91
93
  });
@@ -116,6 +118,7 @@ export function buildDefaultGitHubEvents(
116
118
  toolOutcomesBySession.delete(event.sessionId);
117
119
  await applyGitHubProgress({
118
120
  phase: "failure",
121
+ sessionId: event.sessionId,
119
122
  channel,
120
123
  options,
121
124
  });
@@ -126,6 +129,7 @@ export function buildDefaultGitHubEvents(
126
129
  toolOutcomesBySession.delete(event.sessionId);
127
130
  await applyGitHubProgress({
128
131
  phase: "failure",
132
+ sessionId: event.sessionId,
129
133
  channel,
130
134
  options,
131
135
  });
@@ -28,6 +28,27 @@ export interface GitHubProgressPhaseCopy {
28
28
  export interface GitHubCommitStatusProgress extends GitHubProgressPhaseCopy {
29
29
  /** Check run name (unique per check in the merge box). */
30
30
  context: string;
31
+ /**
32
+ * Check Details URL for this session. When it resolves, it is written as
33
+ * `details_url` and (with {@link summaryLinkText}) appended to the summary.
34
+ */
35
+ detailsUrl?: (sessionId: string) => string | undefined;
36
+ /**
37
+ * `output.title` source. `"phase"` (default) uses the pending/success/
38
+ * failure copy. `"context"` uses the check name — the dashboard automation
39
+ * shape (`Cursor Security Agent: …`).
40
+ */
41
+ outputTitle?: "phase" | "context";
42
+ /**
43
+ * Markdown link label appended to the summary when {@link detailsUrl}
44
+ * resolves, e.g. `"View agent"`.
45
+ */
46
+ summaryLinkText?: string;
47
+ /**
48
+ * Conclusion for the failure phase. Default `"failure"`. Use `"neutral"`
49
+ * when a red merge-box check must not gate merge (findings live on the PR).
50
+ */
51
+ failureConclusion?: "failure" | "neutral";
31
52
  }
32
53
 
33
54
  export type GitHubBannerProgress = GitHubProgressPhaseCopy;
@@ -125,6 +146,7 @@ function progressLabel(
125
146
  */
126
147
  export async function applyGitHubProgress(input: {
127
148
  phase: GitHubProgressPhase;
149
+ sessionId?: string;
128
150
  channel: { state: GitHubChannelState };
129
151
  options: GitHubProgressOptions;
130
152
  }): Promise<void> {
@@ -139,6 +161,7 @@ export async function applyGitHubProgress(input: {
139
161
  tasks.push(
140
162
  postProgressCheckRun({
141
163
  phase: input.phase,
164
+ sessionId: input.sessionId,
142
165
  channel: input.channel,
143
166
  options: input.options,
144
167
  commitStatus,
@@ -159,8 +182,35 @@ export async function applyGitHubProgress(input: {
159
182
  await Promise.all(tasks);
160
183
  }
161
184
 
185
+ function resolveProgressDetailsUrl(input: {
186
+ sessionId: string | undefined;
187
+ commitStatus: GitHubCommitStatusProgress;
188
+ }): string | undefined {
189
+ if (
190
+ input.sessionId === undefined ||
191
+ input.commitStatus.detailsUrl === undefined
192
+ ) {
193
+ return undefined;
194
+ }
195
+ const url = input.commitStatus.detailsUrl(input.sessionId)?.trim();
196
+ return url === "" ? undefined : url;
197
+ }
198
+
199
+ function appendSummaryLink(
200
+ summary: string,
201
+ detailsUrl?: string,
202
+ linkText?: string
203
+ ): string {
204
+ const label = linkText?.trim();
205
+ if (detailsUrl === undefined || label === undefined || label === "") {
206
+ return summary;
207
+ }
208
+ return `${summary}\n\n[${label}](${detailsUrl})`;
209
+ }
210
+
162
211
  async function postProgressCheckRun(input: {
163
212
  phase: GitHubProgressPhase;
213
+ sessionId?: string;
164
214
  channel: { state: GitHubChannelState };
165
215
  options: GitHubProgressOptions;
166
216
  commitStatus: GitHubCommitStatusProgress;
@@ -175,17 +225,32 @@ async function postProgressCheckRun(input: {
175
225
  return;
176
226
  }
177
227
  const sha = state.headSha;
178
- const description = clipStatusDescription(
179
- progressPhaseCopy({
180
- copy: input.commitStatus,
181
- phase: input.phase,
182
- label: progressLabel(input.options, input.commitStatus.context),
183
- })
228
+ const phaseCopy = progressPhaseCopy({
229
+ copy: input.commitStatus,
230
+ phase: input.phase,
231
+ label: progressLabel(input.options, input.commitStatus.context),
232
+ });
233
+ const title = clipStatusDescription(
234
+ input.commitStatus.outputTitle === "context"
235
+ ? input.commitStatus.context
236
+ : phaseCopy
184
237
  );
238
+ const detailsUrl = resolveProgressDetailsUrl({
239
+ sessionId: input.sessionId,
240
+ commitStatus: input.commitStatus,
241
+ });
185
242
  const write: GitHubCheckRunWriteInput = {
186
243
  name: input.commitStatus.context,
187
- ...checkRunPhaseFields(input.phase),
188
- output: { title: description, summary: description },
244
+ ...checkRunPhaseFields(input.phase, input.commitStatus.failureConclusion),
245
+ ...(detailsUrl === undefined ? {} : { detailsUrl }),
246
+ output: {
247
+ title,
248
+ summary: appendSummaryLink(
249
+ phaseCopy,
250
+ detailsUrl,
251
+ input.commitStatus.summaryLinkText
252
+ ),
253
+ },
189
254
  };
190
255
  const resource = {
191
256
  api: input.options.api,
@@ -249,14 +314,15 @@ function shouldRecreateCheckRun(
249
314
  }
250
315
 
251
316
  function checkRunPhaseFields(
252
- phase: GitHubProgressPhase
317
+ phase: GitHubProgressPhase,
318
+ failureConclusion: "failure" | "neutral" = "failure"
253
319
  ): Pick<GitHubCheckRunWriteInput, "conclusion" | "status"> {
254
320
  if (phase === "pending") {
255
321
  return { status: "in_progress" };
256
322
  }
257
323
  return {
258
324
  status: "completed",
259
- conclusion: phase === "success" ? "success" : "failure",
325
+ conclusion: phase === "success" ? "success" : failureConclusion,
260
326
  };
261
327
  }
262
328
 
@@ -0,0 +1,9 @@
1
+ export { issuesChannel } from "./issues-channel.js";
2
+ export type {
3
+ IssueCreatedEvent,
4
+ IssueCreatedEventType,
5
+ IssueResource,
6
+ IssueState,
7
+ IssuesChannelOptions,
8
+ } from "./types.js";
9
+ export { ISSUE_CREATED_EVENT_TYPE } from "./types.js";
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ import { createFactoryResourceChannel } from "../../internal/factory-resource-channel.js";
3
+ import type { ChannelDefinition } from "../../types.js";
4
+ import {
5
+ ISSUE_CREATED_EVENT_TYPE,
6
+ type IssueCreatedEvent,
7
+ type IssuesChannelOptions,
8
+ } from "./types.js";
9
+
10
+ const issueResourceSchema = z
11
+ .object({
12
+ name: z.string().min(1),
13
+ title: z.string().min(1),
14
+ body: z.string().min(1),
15
+ state: z
16
+ .enum(["STATE_UNSPECIFIED", "STATE_OPEN", "STATE_CLOSED"])
17
+ .optional(),
18
+ createTime: z.string().min(1).optional(),
19
+ updateTime: z.string().min(1).optional(),
20
+ path: z.string().optional(),
21
+ etag: z.string().optional(),
22
+ })
23
+ .passthrough();
24
+
25
+ const issueCreatedEventSchema: z.ZodType<IssueCreatedEvent> = z.object({
26
+ eventId: z.string().min(1),
27
+ eventType: z.literal(ISSUE_CREATED_EVENT_TYPE),
28
+ teamId: z.string().min(1),
29
+ occurredAtMs: z.number().int().nonnegative(),
30
+ issue: issueResourceSchema,
31
+ });
32
+
33
+ const pack = createFactoryResourceChannel({
34
+ kind: "issues",
35
+ eventTypes: [ISSUE_CREATED_EVENT_TYPE],
36
+ eventSchema: issueCreatedEventSchema,
37
+ replayDescription: "Replay a Factory issue-created event.",
38
+ invalidError: "invalid issue event",
39
+ });
40
+
41
+ export function issuesChannel(
42
+ options: IssuesChannelOptions
43
+ ): ChannelDefinition {
44
+ return pack.channel(options);
45
+ }
46
+
47
+ export function getIssuesChannelOptions(
48
+ definition: object
49
+ ): IssuesChannelOptions | undefined {
50
+ return pack.getOptions(definition);
51
+ }
@@ -0,0 +1,41 @@
1
+ import type { ContinuationIdentity } from "../../internal/continuation-identity.js";
2
+ import type { ChannelDefinition, ChannelHandlerArgs } from "../../types.js";
3
+
4
+ export const ISSUE_CREATED_EVENT_TYPE = "issue.created" as const;
5
+
6
+ export type IssueCreatedEventType = typeof ISSUE_CREATED_EVENT_TYPE;
7
+
8
+ export type IssueState = "STATE_UNSPECIFIED" | "STATE_OPEN" | "STATE_CLOSED";
9
+
10
+ /** Factory Issue JSON (camelCase proto JSON). */
11
+ export type IssueResource = {
12
+ name: string;
13
+ title: string;
14
+ body: string;
15
+ state?: IssueState;
16
+ createTime?: string;
17
+ updateTime?: string;
18
+ path?: string;
19
+ etag?: string;
20
+ };
21
+
22
+ /** Factory `issue.created` for every Issue create. */
23
+ export type IssueCreatedEvent = {
24
+ eventId: string;
25
+ eventType: IssueCreatedEventType;
26
+ teamId: string;
27
+ occurredAtMs: number;
28
+ issue: IssueResource;
29
+ };
30
+
31
+ export type IssuesChannelOptions = {
32
+ onEvent: (
33
+ event: IssueCreatedEvent,
34
+ args: ChannelHandlerArgs
35
+ ) => Promise<unknown> | unknown;
36
+ continuation?: ContinuationIdentity;
37
+ path?: string;
38
+ auth?: ChannelDefinition["auth"];
39
+ onStart?: ChannelDefinition["onStart"];
40
+ onStop?: ChannelDefinition["onStop"];
41
+ };
package/src/files.ts CHANGED
@@ -163,8 +163,10 @@ export const AGENT_SERVE_USER_STORE_KEY_PREFIX = "agent-serve";
163
163
  * Skills sit at store-root `skills/<name>/…` so exec-daemon's
164
164
  * `--agent-store-skills-dir` walk finds them the same way it finds user-store
165
165
  * skills. Workspace seeds sit at store-root `workspace/…` so the mount path
166
- * the first cloud prompt names stays short. Memory and artifacts stay under
167
- * {@link STORAGE_KEY_ROOT}.
166
+ * the first cloud prompt names stays short. Per-turn `workspaceFiles` sit at
167
+ * `sessions/<sessionId>/workspace/…` on that same shared mount (replace on
168
+ * later sends; wipe when a task session ends). Memory and artifacts stay
169
+ * under {@link STORAGE_KEY_ROOT}.
168
170
  */
169
171
  function createAgentStoreKeys(root: string) {
170
172
  return {
@@ -191,6 +193,11 @@ function createAgentStoreKeys(root: string) {
191
193
  /** Personal-key cloud agents: namespaced like {@link userSkillsPrefix}. */
192
194
  userWorkspacePrefix: (agent: string): string =>
193
195
  `${AGENT_SERVE_USER_STORE_KEY_PREFIX}/${agent}/workspace/`,
196
+ sessionWorkspacePrefix: (sessionId: string): string =>
197
+ `sessions/${sessionId}/workspace/`,
198
+ /** Personal-key cloud agents: namespaced like {@link sessionWorkspacePrefix}. */
199
+ userSessionWorkspacePrefix: (agent: string, sessionId: string): string =>
200
+ `${AGENT_SERVE_USER_STORE_KEY_PREFIX}/${agent}/sessions/${sessionId}/workspace/`,
194
201
  memoryDir: (agent: string): string => `${root}/${agent}/memory`,
195
202
  memoryJournal: (agent: string): string =>
196
203
  `${root}/${agent}/memory/journal.jsonl`,