@cursor/july 0.1.104 → 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.
- package/dist/bin/agent-serve.js +1 -8
- package/dist/channels/bitbucket/types.d.ts +2 -4
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
- package/dist/channels/deployments/deployments-channel.js +1 -0
- package/dist/channels/deployments/types.d.ts +7 -8
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/github/types.d.ts +2 -4
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/types.d.ts +2 -5
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/types.d.ts +2 -3
- package/dist/channels/origin/types.d.ts.map +1 -1
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +3 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +1 -1
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +48 -11
- package/dist/channels/slack/types.d.ts +4 -3
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/docs/404.html +3 -3
- package/dist/docs/ab.html +6 -6
- package/dist/docs/assets/{app.DbMWUyGb.js → app.CtuckIiL.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DXXZxiMv.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DcNeTh9o.js → VPLocalSearchBox.Bkkhnu8K.js} +2 -2
- package/dist/docs/assets/chunks/{theme.DMjhY3gl.js → theme.DhpIe0Pa.js} +2 -2
- package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.js +9 -0
- package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.lean.js +1 -0
- package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.js → guides_opentelemetry.md.SCRMskno.js} +3 -3
- package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.lean.js → guides_opentelemetry.md.SCRMskno.lean.js} +1 -1
- package/dist/docs/assets/index.md.BW_6tOgR.js +5 -0
- package/dist/docs/assets/index.md.BW_6tOgR.lean.js +1 -0
- package/dist/docs/assets/{reference_channels.md.DBGcaB7m.js → reference_channels.md.D-qTqwcq.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.DBGcaB7m.lean.js → reference_channels.md.D-qTqwcq.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.CJNc_xYK.js → reference_cli.md.Dm67hd2D.js} +3 -2
- package/dist/docs/assets/{reference_extensions.md.DykHW3qL.js → reference_extensions.md.CGmMLblt.js} +1 -1
- package/dist/docs/assets/{skills_otel.md.CqhobH3B.js → skills_otel.md.B5Ddv1xH.js} +1 -1
- package/dist/docs/assets/{style.BRuM8477.css → style.DCD_zyg3.css} +1 -1
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.js +3 -0
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.lean.js +1 -0
- package/dist/docs/building-with-agents.html +6 -6
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/deployment.html +6 -6
- package/dist/docs/evals.html +6 -6
- package/dist/docs/guides/agent-to-agent.html +6 -6
- package/dist/docs/guides/cloud-agents.html +6 -6
- package/dist/docs/guides/convert-automation.html +6 -6
- package/dist/docs/guides/github.html +6 -6
- package/dist/docs/guides/grokbot-agents.html +35 -0
- package/dist/docs/guides/grokbot-agents.md +88 -0
- package/dist/docs/guides/human-in-the-loop.html +6 -6
- package/dist/docs/guides/mcp-oauth.html +6 -6
- package/dist/docs/guides/opentelemetry.html +8 -8
- package/dist/docs/guides/opentelemetry.md +3 -4
- package/dist/docs/guides/slack.html +6 -6
- package/dist/docs/guides/webhooks.html +6 -6
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +6 -6
- package/dist/docs/index.html +8 -8
- package/dist/docs/index.md +6 -1
- package/dist/docs/llms-full.txt +178 -30
- package/dist/docs/llms.txt +2 -0
- package/dist/docs/quickstart.html +6 -6
- package/dist/docs/reference/agent-config.html +6 -6
- package/dist/docs/reference/artifacts.html +6 -6
- package/dist/docs/reference/channels.html +7 -7
- package/dist/docs/reference/channels.md +11 -19
- package/dist/docs/reference/cli.html +10 -9
- package/dist/docs/reference/cli.md +7 -3
- package/dist/docs/reference/connections.html +6 -6
- package/dist/docs/reference/extensions.html +7 -7
- package/dist/docs/reference/extensions.md +2 -0
- package/dist/docs/reference/hooks.html +6 -6
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/instructions.html +6 -6
- package/dist/docs/reference/playground.html +5 -5
- package/dist/docs/reference/project-layout.html +6 -6
- package/dist/docs/reference/prompt.html +6 -6
- package/dist/docs/reference/result.html +6 -6
- package/dist/docs/reference/schedules.html +6 -6
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/skills.html +6 -6
- package/dist/docs/reference/subagents.html +6 -6
- package/dist/docs/reference/tools.html +6 -6
- package/dist/docs/scaffolding-agents.html +5 -5
- package/dist/docs/skills/ab.html +6 -6
- package/dist/docs/skills/create-agent.html +6 -6
- package/dist/docs/skills/debug.html +5 -5
- package/dist/docs/skills/evals.html +6 -6
- package/dist/docs/skills/framework-map.html +5 -5
- package/dist/docs/skills/github.html +6 -6
- package/dist/docs/skills/hillclimb.html +6 -6
- package/dist/docs/skills/index.html +5 -5
- package/dist/docs/skills/mcp-auth.html +6 -6
- package/dist/docs/skills/otel.html +8 -8
- package/dist/docs/skills/otel.md +3 -3
- package/dist/docs/skills/setup-slack.html +6 -6
- package/dist/docs/storage.html +6 -6
- package/dist/docs/templates/agentic-owners.html +6 -6
- package/dist/docs/templates/agents-md.html +6 -6
- package/dist/docs/templates/code-wiki.html +6 -6
- package/dist/docs/templates/demo.html +6 -6
- package/dist/docs/templates/grokbot-agents.html +29 -0
- package/dist/docs/templates/grokbot-agents.md +48 -0
- package/dist/docs/templates/pr-autofixer.html +6 -6
- package/dist/docs/templates/security-help.html +6 -6
- package/dist/docs/templates/security-reviewer.html +6 -6
- package/dist/docs/templates/triage.html +6 -6
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/files.d.ts +7 -2
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +7 -2
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +23 -11
- package/dist/internal/cursor/backend-client.d.ts +25 -0
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +57 -2
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +1 -0
- package/dist/internal/deploy-client.d.ts +8 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +14 -0
- package/dist/internal/deploy-manifest.d.ts +3 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +15 -12
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +1 -0
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +7 -3
- package/dist/internal/discovery/modules.d.ts +1 -1
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +1 -0
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +3 -0
- package/dist/internal/discovery/reminders.d.ts +7 -0
- package/dist/internal/discovery/reminders.d.ts.map +1 -0
- package/dist/internal/discovery/reminders.js +65 -0
- package/dist/internal/discovery/subagent.js +1 -0
- package/dist/internal/distribution.d.ts +5 -0
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +17 -0
- package/dist/internal/framework-file-storage.d.ts +3 -1
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +3 -1
- package/dist/internal/framework-storage-selection.d.ts +14 -3
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +36 -6
- package/dist/internal/guest-network.d.ts.map +1 -1
- package/dist/internal/guest-network.js +2 -0
- package/dist/internal/hosted-delivery-protocol.d.ts +48 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +60 -0
- package/dist/internal/hosted-delivery.d.ts +17 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +112 -19
- package/dist/internal/hosted-managed-automation.d.ts.map +1 -1
- package/dist/internal/hosted-managed-automation.js +27 -2
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +4 -1
- package/dist/internal/local-control-plane.d.ts +18 -2
- package/dist/internal/local-control-plane.d.ts.map +1 -1
- package/dist/internal/local-control-plane.js +199 -17
- package/dist/internal/reminder-control-plane-protocol.d.ts +187 -0
- package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -0
- package/dist/internal/reminder-control-plane-protocol.js +244 -0
- package/dist/internal/reminder-runner.d.ts +48 -6
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +336 -48
- package/dist/internal/reminder-schedule.d.ts +5 -2
- package/dist/internal/reminder-schedule.d.ts.map +1 -1
- package/dist/internal/reminder-schedule.js +8 -6
- package/dist/internal/reminder-store.d.ts +24 -7
- package/dist/internal/reminder-store.d.ts.map +1 -1
- package/dist/internal/reminder-store.js +6 -5
- package/dist/internal/request-error-status.d.ts +2 -0
- package/dist/internal/request-error-status.d.ts.map +1 -1
- package/dist/internal/request-error-status.js +22 -3
- package/dist/internal/scm/pr-url.d.ts +40 -0
- package/dist/internal/scm/pr-url.d.ts.map +1 -1
- package/dist/internal/scm/pr-url.js +93 -14
- package/dist/internal/sdk-runner.d.ts +12 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +18 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +78 -30
- package/dist/internal/session-engine.d.ts +12 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +137 -52
- package/dist/internal/store-mirror.d.ts +2 -2
- package/dist/internal/store-mirror.js +2 -2
- package/dist/internal/tenant-slack/relay.d.ts +2 -0
- package/dist/internal/tenant-slack/relay.d.ts.map +1 -1
- package/dist/internal/tenant-slack/relay.js +18 -8
- package/dist/internal/workspace-sync.d.ts +31 -6
- package/dist/internal/workspace-sync.d.ts.map +1 -1
- package/dist/internal/workspace-sync.js +67 -12
- package/dist/internal/workspace.d.ts +9 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +16 -0
- package/dist/playground/assets/index-Bq2HpEQB.js +67 -0
- package/dist/playground/assets/index-CZKKNlmb.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/reminders.d.ts +24 -5
- package/dist/reminders.d.ts.map +1 -1
- package/dist/reminders.js +28 -5
- package/dist/types.d.ts +98 -28
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +6 -1
- package/docs/guides/grokbot-agents.md +93 -0
- package/docs/guides/opentelemetry.md +3 -4
- package/docs/reference/channels.md +11 -19
- package/docs/reference/cli.md +7 -3
- package/docs/reference/extensions.md +2 -0
- package/docs/templates/grokbot-agents.md +53 -0
- package/package.json +12 -3
- package/skills/otel/SKILL.md +3 -3
- package/src/bin/agent-serve.ts +1 -9
- package/src/channels/bitbucket/types.ts +2 -4
- package/src/channels/deployments/deployments-channel.ts +1 -0
- package/src/channels/deployments/types.ts +7 -8
- package/src/channels/github/types.ts +2 -4
- package/src/channels/gitlab/types.ts +2 -5
- package/src/channels/origin/types.ts +2 -3
- package/src/channels/slack/defaults.ts +3 -0
- package/src/channels/slack/dispatch.ts +1 -0
- package/src/channels/slack/live-delivery.ts +53 -12
- package/src/channels/slack/types.ts +4 -3
- package/src/files.ts +9 -2
- package/src/index.ts +6 -3
- package/src/internal/cli-deploy.ts +30 -12
- package/src/internal/cursor/backend-client.ts +90 -2
- package/src/internal/cursor-agent-template.ts +1 -0
- package/src/internal/deploy-client.ts +16 -0
- package/src/internal/deploy-manifest.ts +16 -11
- package/src/internal/discovery/agent.ts +1 -0
- package/src/internal/discovery/info.ts +6 -0
- package/src/internal/discovery/modules.ts +2 -4
- package/src/internal/discovery/project.ts +3 -0
- package/src/internal/discovery/reminders.ts +65 -0
- package/src/internal/discovery/subagent.ts +1 -0
- package/src/internal/distribution.ts +20 -0
- package/src/internal/framework-file-storage.ts +3 -1
- package/src/internal/framework-storage-selection.ts +43 -6
- package/src/internal/guest-network.ts +3 -0
- package/src/internal/hosted-delivery-protocol.ts +96 -0
- package/src/internal/hosted-delivery.ts +207 -28
- package/src/internal/hosted-managed-automation.ts +49 -5
- package/src/internal/init-project.ts +4 -1
- package/src/internal/local-control-plane.ts +281 -22
- package/src/internal/reminder-control-plane-protocol.ts +499 -0
- package/src/internal/reminder-runner.ts +421 -48
- package/src/internal/reminder-schedule.ts +11 -6
- package/src/internal/reminder-store.ts +27 -7
- package/src/internal/request-error-status.ts +27 -3
- package/src/internal/scm/pr-url.ts +167 -20
- package/src/internal/sdk-runner.ts +19 -0
- package/src/internal/server.ts +85 -16
- package/src/internal/session-engine.ts +173 -56
- package/src/internal/store-mirror.ts +2 -2
- package/src/internal/tenant-slack/relay.ts +28 -4
- package/src/internal/workspace-sync.ts +84 -12
- package/src/internal/workspace.ts +20 -0
- package/src/reminders.ts +35 -4
- package/src/types.ts +104 -28
- package/templates/grokbot-agents/README.md +26 -0
- package/templates/grokbot-agents/agent/agent.ts +6 -0
- package/templates/grokbot-agents/agent/extensions/grokbot.ts +5 -0
- package/templates/grokbot-agents/agent/instructions.md +7 -0
- package/templates/grokbot-agents/evals/evals.config.ts +5 -0
- package/templates/grokbot-agents/evals/grokbot-agents.eval.ts +18 -0
- package/templates/grokbot-agents/init.json +18 -0
- package/templates/grokbot-agents/package.json +17 -0
- package/templates/grokbot-agents/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.Bqsulb9K.js +0 -1
- package/dist/docs/assets/index.md.D75GWhPl.js +0 -5
- package/dist/docs/assets/index.md.D75GWhPl.lean.js +0 -1
- package/dist/playground/assets/index-8YiozU89.js +0 -67
- package/dist/playground/assets/index-MbMxXg-y.css +0 -1
- /package/dist/docs/assets/{reference_cli.md.CJNc_xYK.lean.js → reference_cli.md.Dm67hd2D.lean.js} +0 -0
- /package/dist/docs/assets/{reference_extensions.md.DykHW3qL.lean.js → reference_extensions.md.CGmMLblt.lean.js} +0 -0
- /package/dist/docs/assets/{skills_otel.md.CqhobH3B.lean.js → skills_otel.md.B5Ddv1xH.lean.js} +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned internal reminder control-plane protocol.
|
|
3
|
+
*
|
|
4
|
+
* CP owns reminder id, status, fireCount, nextFireAt, claim, and
|
|
5
|
+
* completion/rearm. The guest validates create input and executes an
|
|
6
|
+
* immutable fire descriptor, returning a structured outcome. Cursor-hosted
|
|
7
|
+
* HTTP CP is not implemented here; {@link ReminderControlPlane} is the
|
|
8
|
+
* surface the next backend PR will speak.
|
|
9
|
+
*
|
|
10
|
+
* Not part of the public package API — keep behind the internal boundary.
|
|
11
|
+
*/
|
|
12
|
+
import { randomBytes } from "node:crypto";
|
|
13
|
+
import { parseDuration } from "./duration.js";
|
|
14
|
+
import { nextCronFireMs, ReminderValidationError, resolveSchedule, } from "./reminder-schedule.js";
|
|
15
|
+
/** Wire / persistence version for this control-plane protocol. */
|
|
16
|
+
export const REMINDER_CP_PROTOCOL_VERSION = 1;
|
|
17
|
+
export function newReminderId() {
|
|
18
|
+
return `rem_${randomBytes(8).toString("hex")}`;
|
|
19
|
+
}
|
|
20
|
+
export function recordGeneration(record) {
|
|
21
|
+
var _a;
|
|
22
|
+
return (_a = record.generation) !== null && _a !== void 0 ? _a : 0;
|
|
23
|
+
}
|
|
24
|
+
/** Map a JSON-safe schedule spec into resolveSchedule create fields. */
|
|
25
|
+
export function scheduleSpecToCreateFields(schedule) {
|
|
26
|
+
switch (schedule.kind) {
|
|
27
|
+
case "every":
|
|
28
|
+
return { every: schedule.every };
|
|
29
|
+
case "cron":
|
|
30
|
+
return { cron: schedule.cron };
|
|
31
|
+
case "delay":
|
|
32
|
+
return { delay: schedule.delay };
|
|
33
|
+
case "at":
|
|
34
|
+
return { at: schedule.at };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build a wire-safe schedule spec from guest create input.
|
|
39
|
+
* Normalizes `at` Dates/numbers to ISO strings.
|
|
40
|
+
*/
|
|
41
|
+
export function scheduleSpecFromCreateInput(input) {
|
|
42
|
+
const shapes = [
|
|
43
|
+
input.every !== undefined,
|
|
44
|
+
input.cron !== undefined,
|
|
45
|
+
input.delay !== undefined,
|
|
46
|
+
input.at !== undefined,
|
|
47
|
+
].filter(Boolean);
|
|
48
|
+
if (shapes.length !== 1) {
|
|
49
|
+
throw new ReminderValidationError("reminders.create requires exactly one of every, cron, delay, or at");
|
|
50
|
+
}
|
|
51
|
+
if (input.every !== undefined) {
|
|
52
|
+
return { kind: "every", every: input.every };
|
|
53
|
+
}
|
|
54
|
+
if (input.cron !== undefined) {
|
|
55
|
+
return { kind: "cron", cron: input.cron };
|
|
56
|
+
}
|
|
57
|
+
if (input.delay !== undefined) {
|
|
58
|
+
return { kind: "delay", delay: input.delay };
|
|
59
|
+
}
|
|
60
|
+
return { kind: "at", at: normalizeScheduleAt(input.at) };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Normalize a guest-facing `at` value to an ISO string for the wire intent.
|
|
64
|
+
*/
|
|
65
|
+
export function normalizeScheduleAt(at) {
|
|
66
|
+
if (at instanceof Date) {
|
|
67
|
+
if (!Number.isFinite(at.getTime())) {
|
|
68
|
+
throw new ReminderValidationError(`Invalid at time: ${String(at)}`);
|
|
69
|
+
}
|
|
70
|
+
return at.toISOString();
|
|
71
|
+
}
|
|
72
|
+
if (typeof at === "number") {
|
|
73
|
+
if (!Number.isFinite(at)) {
|
|
74
|
+
throw new ReminderValidationError(`Invalid at time: ${String(at)}`);
|
|
75
|
+
}
|
|
76
|
+
return new Date(at).toISOString();
|
|
77
|
+
}
|
|
78
|
+
const ms = Date.parse(at);
|
|
79
|
+
if (!Number.isFinite(ms)) {
|
|
80
|
+
throw new ReminderValidationError(`Invalid at time: ${String(at)}`);
|
|
81
|
+
}
|
|
82
|
+
// Preserve caller string when it already parses; still wire-safe.
|
|
83
|
+
return at;
|
|
84
|
+
}
|
|
85
|
+
/** Normalize handler reschedule into a wire-JSON-safe shape. */
|
|
86
|
+
export function toWireReschedule(reschedule) {
|
|
87
|
+
const out = {};
|
|
88
|
+
if (reschedule.delay !== undefined) {
|
|
89
|
+
out.delay = reschedule.delay;
|
|
90
|
+
}
|
|
91
|
+
if (reschedule.at !== undefined) {
|
|
92
|
+
out.at =
|
|
93
|
+
reschedule.at instanceof Date
|
|
94
|
+
? reschedule.at.toISOString()
|
|
95
|
+
: String(reschedule.at);
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Build a durable record from a create intent. CP owns schedule resolution
|
|
101
|
+
* via {@link resolveSchedule}; pass `nowMs` for deterministic tests.
|
|
102
|
+
*/
|
|
103
|
+
export function intentToNewRecord(intent, nowMs = Date.now()) {
|
|
104
|
+
if (intent.protocolVersion !== REMINDER_CP_PROTOCOL_VERSION) {
|
|
105
|
+
throw new ReminderValidationError(`Unsupported reminder CP protocol version ${String(intent.protocolVersion)}`);
|
|
106
|
+
}
|
|
107
|
+
const resolved = resolveSchedule(scheduleSpecToCreateFields(intent.schedule), nowMs);
|
|
108
|
+
const nowIso = new Date(nowMs).toISOString();
|
|
109
|
+
return {
|
|
110
|
+
version: 1,
|
|
111
|
+
id: newReminderId(),
|
|
112
|
+
purpose: intent.purpose,
|
|
113
|
+
channelId: intent.channelId,
|
|
114
|
+
continuationToken: intent.continuationToken,
|
|
115
|
+
target: intent.target,
|
|
116
|
+
scheduleKind: resolved.kind,
|
|
117
|
+
scheduleValue: resolved.value,
|
|
118
|
+
intervalMs: resolved.intervalMs,
|
|
119
|
+
prompt: intent.prompt,
|
|
120
|
+
handler: intent.handler,
|
|
121
|
+
args: intent.args,
|
|
122
|
+
hasRunHandler: intent.hasRunHandler,
|
|
123
|
+
hasUntilFn: intent.hasUntilFn,
|
|
124
|
+
untilPrompt: intent.untilPrompt,
|
|
125
|
+
busyPolicy: intent.busyPolicy,
|
|
126
|
+
status: "armed",
|
|
127
|
+
fireCount: 0,
|
|
128
|
+
nextFireAtMs: resolved.nextFireAtMs,
|
|
129
|
+
generation: 0,
|
|
130
|
+
createdAt: nowIso,
|
|
131
|
+
updatedAt: nowIso,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function toFireDescriptor(record, claimedAtMs) {
|
|
135
|
+
return {
|
|
136
|
+
protocolVersion: REMINDER_CP_PROTOCOL_VERSION,
|
|
137
|
+
id: record.id,
|
|
138
|
+
fireCount: record.fireCount,
|
|
139
|
+
generation: recordGeneration(record),
|
|
140
|
+
purpose: record.purpose,
|
|
141
|
+
channelId: record.channelId,
|
|
142
|
+
continuationToken: record.continuationToken,
|
|
143
|
+
target: record.target,
|
|
144
|
+
scheduleKind: record.scheduleKind,
|
|
145
|
+
scheduleValue: record.scheduleValue,
|
|
146
|
+
intervalMs: record.intervalMs,
|
|
147
|
+
prompt: record.prompt,
|
|
148
|
+
handler: record.handler,
|
|
149
|
+
args: record.args,
|
|
150
|
+
hasRunHandler: record.hasRunHandler,
|
|
151
|
+
hasUntilFn: record.hasUntilFn,
|
|
152
|
+
untilPrompt: record.untilPrompt,
|
|
153
|
+
busyPolicy: record.busyPolicy,
|
|
154
|
+
nextFireAtMs: record.nextFireAtMs,
|
|
155
|
+
claimedAtMs,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export function claimFromDescriptor(descriptor) {
|
|
159
|
+
return {
|
|
160
|
+
id: descriptor.id,
|
|
161
|
+
fireCount: descriptor.fireCount,
|
|
162
|
+
generation: descriptor.generation,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function resolveRescheduleMs(reschedule, nowMs) {
|
|
166
|
+
if (reschedule.delay !== undefined) {
|
|
167
|
+
return nowMs + parseDuration(reschedule.delay);
|
|
168
|
+
}
|
|
169
|
+
if (reschedule.at !== undefined) {
|
|
170
|
+
const atMs = Date.parse(reschedule.at);
|
|
171
|
+
if (!Number.isFinite(atMs)) {
|
|
172
|
+
throw new ReminderValidationError("Invalid reminder reschedule.at");
|
|
173
|
+
}
|
|
174
|
+
return atMs;
|
|
175
|
+
}
|
|
176
|
+
throw new ReminderValidationError("reminder reschedule requires delay or at");
|
|
177
|
+
}
|
|
178
|
+
/** Next fire time from the record's recurring schedule (CP-owned). */
|
|
179
|
+
export function nextScheduleFireAtMs(record, afterMs) {
|
|
180
|
+
if (record.scheduleKind === "every" && record.intervalMs !== undefined) {
|
|
181
|
+
return afterMs + record.intervalMs;
|
|
182
|
+
}
|
|
183
|
+
if (record.scheduleKind === "cron") {
|
|
184
|
+
return nextCronFireMs(record.scheduleValue, afterMs);
|
|
185
|
+
}
|
|
186
|
+
throw new ReminderValidationError(`Cannot advance schedule for reminder "${record.id}" (kind=${record.scheduleKind})`);
|
|
187
|
+
}
|
|
188
|
+
export function isOneShotSchedule(kind) {
|
|
189
|
+
return kind === "delay" || kind === "at";
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Pure CAS apply of a guest outcome onto a reminder record.
|
|
193
|
+
* Callers persist the returned record when `applied: true`.
|
|
194
|
+
* Requires `status === "firing"` — an armed record was never claimed.
|
|
195
|
+
*/
|
|
196
|
+
export function applyOutcomeToRecord(record, claim, outcome, nowMs = Date.now()) {
|
|
197
|
+
var _a;
|
|
198
|
+
if (record.id !== claim.id) {
|
|
199
|
+
return { applied: false, reason: "missing", record };
|
|
200
|
+
}
|
|
201
|
+
// Prefer duplicate over generation mismatch: a successful prior apply
|
|
202
|
+
// bumps both fireCount and generation, and retries of (id, fireCount)
|
|
203
|
+
// must stay idempotent no-ops.
|
|
204
|
+
if (record.fireCount > claim.fireCount) {
|
|
205
|
+
return { applied: false, reason: "duplicate", record };
|
|
206
|
+
}
|
|
207
|
+
if (record.fireCount < claim.fireCount) {
|
|
208
|
+
return { applied: false, reason: "stale_fire_count", record };
|
|
209
|
+
}
|
|
210
|
+
if (recordGeneration(record) !== claim.generation) {
|
|
211
|
+
return { applied: false, reason: "stale_generation", record };
|
|
212
|
+
}
|
|
213
|
+
// Only a claimed (firing) reminder can accept an outcome.
|
|
214
|
+
if (record.status !== "firing") {
|
|
215
|
+
return { applied: false, reason: "not_claimed", record };
|
|
216
|
+
}
|
|
217
|
+
const nowIso = new Date(nowMs).toISOString();
|
|
218
|
+
if (outcome.kind === "retry") {
|
|
219
|
+
const delayMs = (_a = outcome.delayMs) !== null && _a !== void 0 ? _a : 0;
|
|
220
|
+
const updated = Object.assign(Object.assign({}, record), { status: "armed", nextFireAtMs: nowMs + Math.max(0, delayMs),
|
|
221
|
+
// Same fireCount; bump generation so a second apply of the old claim is stale.
|
|
222
|
+
generation: recordGeneration(record) + 1, updatedAt: nowIso });
|
|
223
|
+
return { applied: true, record: updated };
|
|
224
|
+
}
|
|
225
|
+
if (outcome.kind === "stop") {
|
|
226
|
+
const updated = Object.assign(Object.assign({}, record), { status: "completed", disarmReason: outcome.reason, fireCount: record.fireCount + 1, generation: recordGeneration(record) + 1, updatedAt: nowIso });
|
|
227
|
+
return { applied: true, record: updated };
|
|
228
|
+
}
|
|
229
|
+
const reschedule = outcome.reschedule;
|
|
230
|
+
if (reschedule !== undefined) {
|
|
231
|
+
const nextFireAtMs = resolveRescheduleMs(reschedule, nowMs);
|
|
232
|
+
const updated = Object.assign(Object.assign({}, record), { status: "armed", fireCount: record.fireCount + 1, nextFireAtMs, scheduleKind: reschedule.delay !== undefined ? "delay" : "at", scheduleValue: reschedule.delay !== undefined
|
|
233
|
+
? String(reschedule.delay)
|
|
234
|
+
: String(reschedule.at), intervalMs: undefined, generation: recordGeneration(record) + 1, updatedAt: nowIso });
|
|
235
|
+
return { applied: true, record: updated };
|
|
236
|
+
}
|
|
237
|
+
if (isOneShotSchedule(record.scheduleKind)) {
|
|
238
|
+
const updated = Object.assign(Object.assign({}, record), { status: "completed", disarmReason: outcome.kind === "skipped" ? "skipped_one_shot" : "one_shot_complete", fireCount: record.fireCount + 1, generation: recordGeneration(record) + 1, updatedAt: nowIso });
|
|
239
|
+
return { applied: true, record: updated };
|
|
240
|
+
}
|
|
241
|
+
const nextFireAtMs = nextScheduleFireAtMs(record, nowMs);
|
|
242
|
+
const updated = Object.assign(Object.assign({}, record), { status: "armed", fireCount: record.fireCount + 1, nextFireAtMs, generation: recordGeneration(record) + 1, updatedAt: nowIso });
|
|
243
|
+
return { applied: true, record: updated };
|
|
244
|
+
}
|
|
@@ -1,29 +1,63 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-session reminder runner: durable wake subscriptions with
|
|
3
|
-
* prompt XOR run, every/cron/delay/at schedules, and
|
|
4
|
-
* function XOR prompt.
|
|
3
|
+
* prompt XOR named handler XOR run, every/cron/delay/at schedules, and
|
|
4
|
+
* until as function XOR prompt.
|
|
5
5
|
*/
|
|
6
|
-
import type { ReminderCreateInput, ReminderInfo } from "../types.js";
|
|
6
|
+
import type { DiscoveredReminder, ReminderCreateInput, ReminderInfo, ReminderStatus } from "../types.js";
|
|
7
7
|
import type { PlatformTimers } from "./platform-timers.js";
|
|
8
|
-
import type
|
|
8
|
+
import { type ReminderControlPlane, type ReminderExecutionOutcome, type ReminderFireDescriptor } from "./reminder-control-plane-protocol.js";
|
|
9
9
|
import { type SessionEngine } from "./session-engine.js";
|
|
10
10
|
export { ReminderValidationError } from "./reminder-schedule.js";
|
|
11
|
+
/** Max UTF-8 byte length of `JSON.stringify(args)` on named-handler create. */
|
|
12
|
+
export declare const REMINDER_ARGS_MAX_BYTES: number;
|
|
11
13
|
export declare class UnknownReminderError extends Error {
|
|
12
14
|
readonly availableReminderIds: string[];
|
|
13
15
|
constructor(reminderId: string, availableReminderIds: string[]);
|
|
14
16
|
}
|
|
17
|
+
export interface ReminderRunnerOptions {
|
|
18
|
+
/** Discovered `agent/reminders/*` handlers, keyed by module stem. */
|
|
19
|
+
namedHandlers?: readonly DiscoveredReminder[];
|
|
20
|
+
/**
|
|
21
|
+
* Architecture v2: reject anonymous `run` and function `until` at create
|
|
22
|
+
* (named `handler` + prompt remain), whether local or hosted.
|
|
23
|
+
*/
|
|
24
|
+
rejectAnonymousHandlers?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* When set (local self-hosted architecture v2), create/cancel/rekey go
|
|
27
|
+
* through the control-plane protocol and fires are guest executions of
|
|
28
|
+
* immutable descriptors.
|
|
29
|
+
*/
|
|
30
|
+
controlPlane?: ReminderControlPlane;
|
|
31
|
+
/** Agent architecture; used with {@link controlPlane} for v2 protocol path. */
|
|
32
|
+
architecture?: "v1" | "v2";
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Server wiring for {@link ReminderRunnerOptions.rejectAnonymousHandlers}:
|
|
36
|
+
* architecture v2 always rejects anonymous run/until (local or hosted).
|
|
37
|
+
*/
|
|
38
|
+
export declare function rejectAnonymousReminderHandlers(options: {
|
|
39
|
+
noControlPlane?: boolean;
|
|
40
|
+
architecture?: string;
|
|
41
|
+
}): boolean;
|
|
15
42
|
export declare class ReminderRunner {
|
|
16
43
|
private readonly engine;
|
|
17
44
|
private readonly logger;
|
|
18
45
|
private readonly platformTimers?;
|
|
19
46
|
private readonly records;
|
|
20
47
|
private readonly handlers;
|
|
48
|
+
private readonly namedHandlers;
|
|
49
|
+
private readonly namedHandlerNames;
|
|
21
50
|
private readonly timers;
|
|
22
51
|
private readonly firing;
|
|
23
52
|
/** Single-flight idle gates keyed by `channelId:continuationToken`. */
|
|
24
53
|
private readonly idleGates;
|
|
25
54
|
private started;
|
|
26
|
-
|
|
55
|
+
private readonly rejectAnonymousHandlers;
|
|
56
|
+
private readonly controlPlane;
|
|
57
|
+
private readonly architecture;
|
|
58
|
+
constructor(engine: SessionEngine, logger?: (line: string) => void, platformTimers?: PlatformTimers | undefined, options?: ReminderRunnerOptions);
|
|
59
|
+
/** True when create/cancel/rekey/fire go through the CP protocol. */
|
|
60
|
+
private get usesControlPlaneProtocol();
|
|
27
61
|
/**
|
|
28
62
|
* Load reminder documents from the control plane into memory. Does not
|
|
29
63
|
* arm in-process timers — the CP owns clocks.
|
|
@@ -37,7 +71,7 @@ export declare class ReminderRunner {
|
|
|
37
71
|
stop(): void;
|
|
38
72
|
create(input: ReminderCreateInput): Promise<ReminderInfo>;
|
|
39
73
|
list(filter?: {
|
|
40
|
-
status?:
|
|
74
|
+
status?: ReminderStatus;
|
|
41
75
|
purpose?: string;
|
|
42
76
|
continuationToken?: string;
|
|
43
77
|
}): Promise<ReminderInfo[]>;
|
|
@@ -59,8 +93,16 @@ export declare class ReminderRunner {
|
|
|
59
93
|
outcome: "fired" | "noop";
|
|
60
94
|
reason?: string;
|
|
61
95
|
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Architecture v2 / CP protocol guest entrypoint: execute an immutable fire
|
|
98
|
+
* descriptor and return an outcome. Does not mint ids or mutate
|
|
99
|
+
* authoritative status/fireCount — the control plane applies the outcome.
|
|
100
|
+
*/
|
|
101
|
+
executeFire(descriptor: ReminderFireDescriptor): Promise<ReminderExecutionOutcome>;
|
|
102
|
+
private recordFromDescriptor;
|
|
62
103
|
private armTimer;
|
|
63
104
|
private clearTimer;
|
|
105
|
+
private resolveNamedHandler;
|
|
64
106
|
private fire;
|
|
65
107
|
private isSessionBusy;
|
|
66
108
|
private whenSessionIdle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reminder-runner.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAEV,mBAAmB,
|
|
1
|
+
{"version":3,"file":"reminder-runner.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-runner.ts"],"names":[],"mappings":"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"}
|