@cursor/july 0.1.105 → 0.1.107

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 (217) hide show
  1. package/dist/bin/agent-serve.js +1 -8
  2. package/dist/channels/bitbucket/types.d.ts +2 -4
  3. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  4. package/dist/channels/deployments/types.d.ts +5 -8
  5. package/dist/channels/deployments/types.d.ts.map +1 -1
  6. package/dist/channels/github/types.d.ts +2 -4
  7. package/dist/channels/github/types.d.ts.map +1 -1
  8. package/dist/channels/gitlab/types.d.ts +2 -5
  9. package/dist/channels/gitlab/types.d.ts.map +1 -1
  10. package/dist/channels/origin/types.d.ts +2 -3
  11. package/dist/channels/origin/types.d.ts.map +1 -1
  12. package/dist/channels/slack/defaults.d.ts.map +1 -1
  13. package/dist/channels/slack/defaults.js +3 -0
  14. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  15. package/dist/channels/slack/dispatch.js +1 -1
  16. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  17. package/dist/channels/slack/live-delivery.js +48 -11
  18. package/dist/channels/slack/types.d.ts +4 -3
  19. package/dist/channels/slack/types.d.ts.map +1 -1
  20. package/dist/docs/404.html +3 -3
  21. package/dist/docs/ab.html +6 -6
  22. package/dist/docs/assets/{app.BVwaffdK.js → app.CtuckIiL.js} +1 -1
  23. package/dist/docs/assets/chunks/@localSearchIndexroot.DXXZxiMv.js +1 -0
  24. package/dist/docs/assets/chunks/{VPLocalSearchBox.WuWTZ1x8.js → VPLocalSearchBox.Bkkhnu8K.js} +2 -2
  25. package/dist/docs/assets/chunks/{theme.BYdI_6sF.js → theme.DhpIe0Pa.js} +2 -2
  26. package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.js → guides_opentelemetry.md.SCRMskno.js} +3 -3
  27. package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.lean.js → guides_opentelemetry.md.SCRMskno.lean.js} +1 -1
  28. package/dist/docs/assets/{reference_channels.md.DBGcaB7m.js → reference_channels.md.D-qTqwcq.js} +2 -2
  29. package/dist/docs/assets/{reference_channels.md.DBGcaB7m.lean.js → reference_channels.md.D-qTqwcq.lean.js} +1 -1
  30. package/dist/docs/assets/{reference_cli.md.C6Lo8SEd.js → reference_cli.md.Dm67hd2D.js} +1 -1
  31. package/dist/docs/assets/{skills_otel.md.CqhobH3B.js → skills_otel.md.B5Ddv1xH.js} +1 -1
  32. package/dist/docs/assets/{style.BRuM8477.css → style.DCD_zyg3.css} +1 -1
  33. package/dist/docs/building-with-agents.html +6 -6
  34. package/dist/docs/concepts.html +5 -5
  35. package/dist/docs/deployment.html +6 -6
  36. package/dist/docs/evals.html +6 -6
  37. package/dist/docs/guides/agent-to-agent.html +6 -6
  38. package/dist/docs/guides/cloud-agents.html +6 -6
  39. package/dist/docs/guides/convert-automation.html +6 -6
  40. package/dist/docs/guides/github.html +6 -6
  41. package/dist/docs/guides/grokbot-agents.html +6 -6
  42. package/dist/docs/guides/human-in-the-loop.html +6 -6
  43. package/dist/docs/guides/mcp-oauth.html +6 -6
  44. package/dist/docs/guides/opentelemetry.html +8 -8
  45. package/dist/docs/guides/opentelemetry.md +3 -4
  46. package/dist/docs/guides/slack.html +6 -6
  47. package/dist/docs/guides/webhooks.html +6 -6
  48. package/dist/docs/hashmap.json +1 -1
  49. package/dist/docs/hillclimbing.html +6 -6
  50. package/dist/docs/index.html +6 -6
  51. package/dist/docs/llms-full.txt +22 -28
  52. package/dist/docs/quickstart.html +6 -6
  53. package/dist/docs/reference/agent-config.html +6 -6
  54. package/dist/docs/reference/artifacts.html +6 -6
  55. package/dist/docs/reference/channels.html +7 -7
  56. package/dist/docs/reference/channels.md +11 -19
  57. package/dist/docs/reference/cli.html +8 -8
  58. package/dist/docs/reference/cli.md +5 -2
  59. package/dist/docs/reference/connections.html +6 -6
  60. package/dist/docs/reference/extensions.html +6 -6
  61. package/dist/docs/reference/hooks.html +6 -6
  62. package/dist/docs/reference/http-api.html +6 -6
  63. package/dist/docs/reference/instructions.html +6 -6
  64. package/dist/docs/reference/playground.html +5 -5
  65. package/dist/docs/reference/project-layout.html +6 -6
  66. package/dist/docs/reference/prompt.html +6 -6
  67. package/dist/docs/reference/result.html +6 -6
  68. package/dist/docs/reference/schedules.html +6 -6
  69. package/dist/docs/reference/sessions.html +5 -5
  70. package/dist/docs/reference/skills.html +6 -6
  71. package/dist/docs/reference/subagents.html +6 -6
  72. package/dist/docs/reference/tools.html +6 -6
  73. package/dist/docs/scaffolding-agents.html +5 -5
  74. package/dist/docs/skills/ab.html +6 -6
  75. package/dist/docs/skills/create-agent.html +6 -6
  76. package/dist/docs/skills/debug.html +5 -5
  77. package/dist/docs/skills/evals.html +6 -6
  78. package/dist/docs/skills/framework-map.html +5 -5
  79. package/dist/docs/skills/github.html +6 -6
  80. package/dist/docs/skills/hillclimb.html +6 -6
  81. package/dist/docs/skills/index.html +5 -5
  82. package/dist/docs/skills/mcp-auth.html +6 -6
  83. package/dist/docs/skills/otel.html +8 -8
  84. package/dist/docs/skills/otel.md +3 -3
  85. package/dist/docs/skills/setup-slack.html +6 -6
  86. package/dist/docs/storage.html +6 -6
  87. package/dist/docs/templates/agentic-owners.html +6 -6
  88. package/dist/docs/templates/agents-md.html +6 -6
  89. package/dist/docs/templates/code-wiki.html +6 -6
  90. package/dist/docs/templates/demo.html +6 -6
  91. package/dist/docs/templates/grokbot-agents.html +6 -6
  92. package/dist/docs/templates/pr-autofixer.html +6 -6
  93. package/dist/docs/templates/security-help.html +6 -6
  94. package/dist/docs/templates/security-reviewer.html +6 -6
  95. package/dist/docs/templates/triage.html +6 -6
  96. package/dist/docs/troubleshooting.html +5 -5
  97. package/dist/index.d.ts +4 -5
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +3 -4
  100. package/dist/internal/cli-deploy.d.ts.map +1 -1
  101. package/dist/internal/cli-deploy.js +23 -11
  102. package/dist/internal/cursor/backend-client.d.ts +25 -0
  103. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  104. package/dist/internal/cursor/backend-client.js +57 -2
  105. package/dist/internal/deploy-client.d.ts +8 -0
  106. package/dist/internal/deploy-client.d.ts.map +1 -1
  107. package/dist/internal/deploy-client.js +14 -0
  108. package/dist/internal/deploy-manifest.d.ts +3 -0
  109. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  110. package/dist/internal/deploy-manifest.js +15 -12
  111. package/dist/internal/discovery/agent.d.ts.map +1 -1
  112. package/dist/internal/discovery/agent.js +1 -0
  113. package/dist/internal/discovery/info.d.ts.map +1 -1
  114. package/dist/internal/discovery/info.js +7 -3
  115. package/dist/internal/discovery/modules.d.ts +1 -1
  116. package/dist/internal/discovery/modules.d.ts.map +1 -1
  117. package/dist/internal/discovery/modules.js +1 -0
  118. package/dist/internal/discovery/project.d.ts.map +1 -1
  119. package/dist/internal/discovery/project.js +3 -0
  120. package/dist/internal/discovery/reminders.d.ts +7 -0
  121. package/dist/internal/discovery/reminders.d.ts.map +1 -0
  122. package/dist/internal/discovery/reminders.js +65 -0
  123. package/dist/internal/discovery/subagent.js +1 -0
  124. package/dist/internal/distribution.d.ts +5 -0
  125. package/dist/internal/distribution.d.ts.map +1 -1
  126. package/dist/internal/distribution.js +17 -0
  127. package/dist/internal/framework-storage-selection.d.ts +14 -3
  128. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  129. package/dist/internal/framework-storage-selection.js +36 -6
  130. package/dist/internal/guest-network.d.ts.map +1 -1
  131. package/dist/internal/guest-network.js +2 -0
  132. package/dist/internal/hosted-delivery-protocol.d.ts +48 -0
  133. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  134. package/dist/internal/hosted-delivery-protocol.js +60 -0
  135. package/dist/internal/hosted-delivery.d.ts +10 -0
  136. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  137. package/dist/internal/hosted-delivery.js +83 -18
  138. package/dist/internal/local-control-plane.d.ts +18 -2
  139. package/dist/internal/local-control-plane.d.ts.map +1 -1
  140. package/dist/internal/local-control-plane.js +199 -17
  141. package/dist/internal/reminder-control-plane-protocol.d.ts +187 -0
  142. package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -0
  143. package/dist/internal/reminder-control-plane-protocol.js +244 -0
  144. package/dist/internal/reminder-runner.d.ts +48 -6
  145. package/dist/internal/reminder-runner.d.ts.map +1 -1
  146. package/dist/internal/reminder-runner.js +336 -48
  147. package/dist/internal/reminder-schedule.d.ts +5 -2
  148. package/dist/internal/reminder-schedule.d.ts.map +1 -1
  149. package/dist/internal/reminder-schedule.js +8 -6
  150. package/dist/internal/reminder-store.d.ts +24 -7
  151. package/dist/internal/reminder-store.d.ts.map +1 -1
  152. package/dist/internal/reminder-store.js +6 -5
  153. package/dist/internal/request-error-status.d.ts +2 -0
  154. package/dist/internal/request-error-status.d.ts.map +1 -1
  155. package/dist/internal/request-error-status.js +22 -3
  156. package/dist/internal/scm/pr-url.d.ts +40 -0
  157. package/dist/internal/scm/pr-url.d.ts.map +1 -1
  158. package/dist/internal/scm/pr-url.js +93 -14
  159. package/dist/internal/server.d.ts.map +1 -1
  160. package/dist/internal/server.js +67 -27
  161. package/dist/internal/session-engine.d.ts +4 -0
  162. package/dist/internal/session-engine.d.ts.map +1 -1
  163. package/dist/internal/session-engine.js +5 -0
  164. package/dist/playground/assets/{index-BaQzjaNK.js → index-Bq2HpEQB.js} +23 -23
  165. package/dist/playground/assets/index-CZKKNlmb.css +1 -0
  166. package/dist/playground/index.html +2 -2
  167. package/dist/reminders.d.ts +24 -5
  168. package/dist/reminders.d.ts.map +1 -1
  169. package/dist/reminders.js +28 -5
  170. package/dist/types.d.ts +89 -20
  171. package/dist/types.d.ts.map +1 -1
  172. package/docs/guides/opentelemetry.md +3 -4
  173. package/docs/reference/channels.md +11 -19
  174. package/docs/reference/cli.md +5 -2
  175. package/package.json +3 -3
  176. package/skills/otel/SKILL.md +3 -3
  177. package/src/bin/agent-serve.ts +1 -9
  178. package/src/channels/bitbucket/types.ts +2 -4
  179. package/src/channels/deployments/types.ts +5 -8
  180. package/src/channels/github/types.ts +2 -4
  181. package/src/channels/gitlab/types.ts +2 -5
  182. package/src/channels/origin/types.ts +2 -3
  183. package/src/channels/slack/defaults.ts +3 -0
  184. package/src/channels/slack/dispatch.ts +1 -0
  185. package/src/channels/slack/live-delivery.ts +53 -12
  186. package/src/channels/slack/types.ts +4 -3
  187. package/src/index.ts +6 -3
  188. package/src/internal/cli-deploy.ts +30 -12
  189. package/src/internal/cursor/backend-client.ts +90 -2
  190. package/src/internal/deploy-client.ts +16 -0
  191. package/src/internal/deploy-manifest.ts +16 -11
  192. package/src/internal/discovery/agent.ts +1 -0
  193. package/src/internal/discovery/info.ts +6 -0
  194. package/src/internal/discovery/modules.ts +2 -4
  195. package/src/internal/discovery/project.ts +3 -0
  196. package/src/internal/discovery/reminders.ts +65 -0
  197. package/src/internal/discovery/subagent.ts +1 -0
  198. package/src/internal/distribution.ts +20 -0
  199. package/src/internal/framework-storage-selection.ts +43 -6
  200. package/src/internal/guest-network.ts +3 -0
  201. package/src/internal/hosted-delivery-protocol.ts +96 -0
  202. package/src/internal/hosted-delivery.ts +154 -27
  203. package/src/internal/local-control-plane.ts +281 -22
  204. package/src/internal/reminder-control-plane-protocol.ts +499 -0
  205. package/src/internal/reminder-runner.ts +421 -48
  206. package/src/internal/reminder-schedule.ts +11 -6
  207. package/src/internal/reminder-store.ts +27 -7
  208. package/src/internal/request-error-status.ts +27 -3
  209. package/src/internal/scm/pr-url.ts +167 -20
  210. package/src/internal/server.ts +69 -16
  211. package/src/internal/session-engine.ts +5 -0
  212. package/src/reminders.ts +35 -4
  213. package/src/types.ts +95 -20
  214. package/dist/docs/assets/chunks/@localSearchIndexroot.CJxMklAy.js +0 -1
  215. package/dist/playground/assets/index-CceqnLTX.css +0 -1
  216. /package/dist/docs/assets/{reference_cli.md.C6Lo8SEd.lean.js → reference_cli.md.Dm67hd2D.lean.js} +0 -0
  217. /package/dist/docs/assets/{skills_otel.md.CqhobH3B.lean.js → skills_otel.md.B5Ddv1xH.lean.js} +0 -0
package/src/reminders.ts CHANGED
@@ -1,30 +1,48 @@
1
1
  /**
2
- * Runtime reminders — per-session durable wakes.
2
+ * Runtime reminders — per-session durable wakes — and named handlers
3
+ * authored at `agent/reminders/<name>.ts`.
3
4
  *
4
5
  * ```ts
6
+ * import { defineReminder } from "@cursor/july/reminders";
5
7
  * import type { ReminderCreateInput } from "@cursor/july/reminders";
6
8
  *
9
+ * // agent/reminders/verdict_recheck.ts
10
+ * export default defineReminder({
11
+ * async run({ args, followup }) {
12
+ * await followup({ message: `Recheck ${String(args.headSha)}` });
13
+ * return { action: "delivered" };
14
+ * },
15
+ * });
16
+ *
17
+ * import verdictRecheck from "./reminders/verdict_recheck.js";
18
+ *
7
19
  * // Recurring ≈ setInterval; one-shot ≈ setTimeout.
8
20
  * await host.reminders?.create({
9
21
  * purpose: "ci_recheck",
10
22
  * channelId: session.channelId,
11
23
  * continuationToken: session.continuationKey!,
12
24
  * delay: "2h",
13
- * prompt: "Re-check CI. Only act if still failing.",
25
+ * handler: verdictRecheck,
26
+ * args: { headSha: "abc" },
14
27
  * });
15
28
  * ```
16
29
  *
17
30
  * Distinct from `defineSchedule` (deploy-time global cron under
18
31
  * `agent/schedules/`). Reminders are created at runtime and bound to a
19
- * channel continuation. Prefer `run` + function `until` for host policy
20
- * (silent ticks); agents use prompt-form create via tools.
32
+ * channel continuation. Prefer named `handler` + serializable `args` for
33
+ * hosted v2 durability; anonymous `run` remains on local and hosted v1.
21
34
  */
22
35
 
36
+ import { brandDefinition } from "./internal/brand.js";
37
+ import type { ReminderDefinition, ReminderHandlerConfig } from "./types.js";
38
+
23
39
  export type {
24
40
  ReminderBusyPolicy,
25
41
  ReminderCreateInput,
42
+ ReminderDefinition,
26
43
  ReminderFireContext,
27
44
  ReminderFireResult,
45
+ ReminderHandlerConfig,
28
46
  ReminderHostApi,
29
47
  ReminderInfo,
30
48
  ReminderReschedule,
@@ -33,3 +51,16 @@ export type {
33
51
  ReminderTarget,
34
52
  ReminderUntilContext,
35
53
  } from "./types.js";
54
+
55
+ /**
56
+ * Brand a named reminder handler for `agent/reminders/<name>.ts`.
57
+ * The registry name is the module stem (not a field on the definition).
58
+ */
59
+ export function defineReminder(
60
+ config: ReminderHandlerConfig
61
+ ): ReminderDefinition {
62
+ if (typeof config.run !== "function") {
63
+ throw new Error("defineReminder requires a `run` function");
64
+ }
65
+ return brandDefinition("reminder", config);
66
+ }
package/src/types.ts CHANGED
@@ -281,20 +281,8 @@ export interface AgentConfig {
281
281
  */
282
282
  tools?: ToolName[];
283
283
  /**
284
- * Hosted architecture this agent deploys onto. Omit or `"v1"` keeps the
285
- * current control plane and engine-minted conversation keys. `"v2"`
286
- * deploys onto the v2 control plane (v2 APIs and schemas). Omitted
287
- * channel `continuation` then inherits from declared events (`github.pr/v2`,
288
- * `github.issue/v2`, `github.none/v2`, `slack.thread/v2`, `origin.pr/v2`,
289
- * `deployments.deployment/v2`, `change_monitors.checkpoint/v2`,
290
- * `issues.issue/v2`, `none/v2`). An explicit per-channel selector
291
- * still overrides.
292
- *
293
- * ```ts
294
- * export default defineAgent({
295
- * architecture: "v2",
296
- * });
297
- * ```
284
+ * Hosted architecture override. Leave this unset unless Cursor instructs
285
+ * you to select a specific architecture.
298
286
  */
299
287
  architecture?: AgentArchitecture;
300
288
  }
@@ -2437,6 +2425,13 @@ export type ChannelEventHandlers<TState = JsonValue> = {
2437
2425
  /** Bound helpers passed to {@link ChannelConfig.onStart}. */
2438
2426
  export interface ChannelStartArgs {
2439
2427
  send: SendMessageFn;
2428
+ /**
2429
+ * Hosted architecture from {@link AgentConfig.architecture}. Omitted
2430
+ * means v1. Host pipelines that call `send()` themselves (instead of
2431
+ * letting the channel adapter stamp continuation) branch on this so
2432
+ * v1 `continuationToken` and v2 `claim` stay mutually exclusive.
2433
+ */
2434
+ architecture?: AgentArchitecture;
2440
2435
  getSession(sessionId: string): Promise<ChannelSession | null>;
2441
2436
  receive(
2442
2437
  channel: ChannelDefinition | HttpChannelDefinition | string,
@@ -2607,9 +2602,8 @@ export interface HttpChannelConfig {
2607
2602
  /** Route auth chain. Defaults to `[localDevStrict()]`. */
2608
2603
  auth?: AuthPolicy[];
2609
2604
  /**
2610
- * Continuation selector. Omitted inherits {@link AgentConfig.architecture}:
2611
- * `"none/v1"` unless the agent set `architecture: "v2"` (then `"none/v2"`
2612
- * → `evt:`). Override with an explicit `"none/v1"` or `"none/v2"`.
2605
+ * Continuation selector. Omit this to inherit the agent architecture's
2606
+ * default. Set it explicitly only when migrating persisted identities.
2613
2607
  */
2614
2608
  continuation?: ContinuationIdentity;
2615
2609
  /**
@@ -2843,12 +2837,39 @@ export interface ScheduleConfig {
2843
2837
 
2844
2838
  export type ScheduleDefinition = ScheduleConfig & BrandedDefinition<"schedule">;
2845
2839
 
2840
+ // ============================================================================
2841
+ // Reminder handlers (agent/reminders/*) — named durable fire policies
2842
+ // ============================================================================
2843
+
2844
+ /**
2845
+ * Authored at `agent/reminders/<name>.ts`. The registry name is the module
2846
+ * stem. Pass the discovered definition to {@link ReminderCreateInput.handler}
2847
+ * with serializable {@link ReminderCreateInput.args}; the engine persists the
2848
+ * stem, not the function.
2849
+ */
2850
+ export interface ReminderHandlerConfig {
2851
+ /**
2852
+ * Invoked on every fire with {@link ReminderFireContext} (including the
2853
+ * create-time {@link ReminderFireContext.args} blob).
2854
+ */
2855
+ run: (ctx: ReminderFireContext) => Promise<ReminderFireResult>;
2856
+ }
2857
+
2858
+ export type ReminderDefinition = ReminderHandlerConfig &
2859
+ BrandedDefinition<"reminder">;
2860
+
2861
+ export interface DiscoveredReminder {
2862
+ name: string;
2863
+ definition: ReminderDefinition;
2864
+ }
2865
+
2846
2866
  // ============================================================================
2847
2867
  // Reminders (runtime per-session wakes)
2848
2868
  // ============================================================================
2849
2869
 
2850
2870
  export type ReminderBusyPolicy = "skipIfBusy" | "queueBehindTurn";
2851
2871
 
2872
+ /** Public reminder status. Internal claim state (`firing`) is not exposed. */
2852
2873
  export type ReminderStatus = "armed" | "completed" | "cancelled" | "disarmed";
2853
2874
 
2854
2875
  export type ReminderScheduleKind = "every" | "cron" | "delay" | "at";
@@ -2880,6 +2901,11 @@ export interface ReminderUntilContext {
2880
2901
 
2881
2902
  export interface ReminderFireContext extends ReminderUntilContext {
2882
2903
  appAuth: AuthContext;
2904
+ /**
2905
+ * Serializable args from {@link ReminderCreateInput.args} when the fire
2906
+ * uses a named {@link ReminderCreateInput.handler}. Empty object otherwise.
2907
+ */
2908
+ args: JsonObject;
2883
2909
  /** Wake the reminder's already-bound session (target is implicit). */
2884
2910
  followup(args: { message: string }): Promise<ChannelSession>;
2885
2911
  cancel(reason?: string): Promise<void>;
@@ -2894,9 +2920,11 @@ export interface ReminderFireContext extends ReminderUntilContext {
2894
2920
  /**
2895
2921
  * Create a durable wake bound to a channel continuation.
2896
2922
  *
2897
- * Exactly one of `prompt` | `run`, and exactly one of
2923
+ * Exactly one of `prompt` | `handler` | `run`, and exactly one of
2898
2924
  * `every` | `cron` | `delay` | `at`. Prompt fires always follow up into the
2899
- * bound session.
2925
+ * bound session. Named `handler` resolves `agent/reminders/<name>.ts` on
2926
+ * every fire (survives restart). Anonymous `run` stays supported on local
2927
+ * and hosted v1; hosted architecture v2 rejects it at create.
2900
2928
  *
2901
2929
  * @example Recurring (host policy)
2902
2930
  * ```ts
@@ -2914,6 +2942,28 @@ export interface ReminderFireContext extends ReminderUntilContext {
2914
2942
  * });
2915
2943
  * ```
2916
2944
  *
2945
+ * @example Named handler (durable across restart / hosted v2)
2946
+ * ```ts
2947
+ * // agent/reminders/verdict_recheck.ts
2948
+ * export default defineReminder({
2949
+ * async run({ args, followup }) {
2950
+ * // ...
2951
+ * return { action: "delivered" };
2952
+ * },
2953
+ * });
2954
+ *
2955
+ * import verdictRecheck from "./reminders/verdict_recheck.js";
2956
+ *
2957
+ * await host.reminders.create({
2958
+ * purpose: "verdict_recheck",
2959
+ * channelId: "origin",
2960
+ * continuationToken,
2961
+ * delay: "15m",
2962
+ * handler: verdictRecheck,
2963
+ * args: { headSha: "abc" },
2964
+ * });
2965
+ * ```
2966
+ *
2917
2967
  * @example One-shot (agent tool / prompt form)
2918
2968
  * ```ts
2919
2969
  * await host.reminders.create({
@@ -2934,8 +2984,22 @@ export interface ReminderCreateInput {
2934
2984
  continuationToken: string;
2935
2985
  /** Optional opaque metadata (e.g. `{ prUrl }`). */
2936
2986
  target?: Record<string, unknown>;
2937
- /** Exactly one of prompt or run. */
2987
+ /** Exactly one of prompt, handler, or run. */
2938
2988
  prompt?: string;
2989
+ /**
2990
+ * A definition discovered from `agent/reminders/<name>.ts`, or its stem
2991
+ * for compatibility. Mutually exclusive with `prompt` and `run`. The
2992
+ * definition form avoids coupling callers to a filename string; discovery
2993
+ * resolves it to the stable stem persisted by the control plane. Do not
2994
+ * combine with {@link until}; encode stop conditions in {@link args} and
2995
+ * the handler body.
2996
+ */
2997
+ handler?: ReminderDefinition | string;
2998
+ /**
2999
+ * Serializable args for {@link handler} (UTF-8 JSON capped at 32 KiB).
3000
+ * Only valid with `handler`.
3001
+ */
3002
+ args?: JsonObject;
2939
3003
  run?: (ctx: ReminderFireContext) => Promise<ReminderFireResult>;
2940
3004
  /** Exactly one schedule shape. */
2941
3005
  every?: string;
@@ -2945,6 +3009,9 @@ export interface ReminderCreateInput {
2945
3009
  /**
2946
3010
  * Auto-cancel: function (host evaluates, true → cancel) XOR prompt string
2947
3011
  * (agent-facing stop condition; platform does not interpret it).
3012
+ * Valid with `prompt` (string until) and legacy `run` (function until on
3013
+ * local / hosted v1). Not valid with named `handler`. Function until is
3014
+ * rejected on hosted architecture v2.
2948
3015
  */
2949
3016
  until?: string | ((ctx: ReminderUntilContext) => Promise<boolean>);
2950
3017
  /**
@@ -2962,6 +3029,10 @@ export interface ReminderInfo {
2962
3029
  scheduleKind: ReminderScheduleKind;
2963
3030
  scheduleValue: string;
2964
3031
  prompt?: string;
3032
+ /** Named handler stem when create used `handler`. */
3033
+ handler?: string;
3034
+ /** Serializable args when create used `handler`. */
3035
+ args?: JsonObject;
2965
3036
  untilPrompt?: string;
2966
3037
  busyPolicy: ReminderBusyPolicy;
2967
3038
  status: ReminderStatus;
@@ -3213,6 +3284,8 @@ export interface AgentProject {
3213
3284
  httpChannel: HttpChannelDefinition;
3214
3285
  channels: DiscoveredChannel[];
3215
3286
  schedules: DiscoveredSchedule[];
3287
+ /** Named reminder handlers from `agent/reminders/*` (optional / additive). */
3288
+ reminders?: DiscoveredReminder[];
3216
3289
  hooks: DiscoveredHook[];
3217
3290
  /** Live A/B metric experiments (`defineAB`). */
3218
3291
  abs: DiscoveredAB[];
@@ -3318,6 +3391,8 @@ export interface AgentProjectInfo {
3318
3391
  slackChannelPosts?: readonly string[];
3319
3392
  }>;
3320
3393
  schedules: Array<{ name: string; cron: string; kind: "markdown" | "run" }>;
3394
+ /** Named reminder handlers (`agent/reminders/<name>.ts`) when present. */
3395
+ reminders?: Array<{ name: string }>;
3321
3396
  hooks: string[];
3322
3397
  /** Live A/B experiment names (`defineAB` under `agent/ab`). */
3323
3398
  abs: string[];