@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
|
@@ -14,12 +14,13 @@ import { createDeferredChannelSession, DeferredChannelSessionError, } from "./de
|
|
|
14
14
|
import { formatGuestNetworkServerTiming, GUEST_CONNECT_STALLED, GUEST_NETWORK_UNAVAILABLE, GuestNetworkUnavailableError, isQuietGuestConnectStallMessage, waitForGuestNetworkReady, } from "./guest-network.js";
|
|
15
15
|
import { getHostedAdmissionAdapter, } from "./hosted-admission-adapter.js";
|
|
16
16
|
import { HostedAdmissionLocalSendError, runDuringHostedAdmission, } from "./hosted-admission-context.js";
|
|
17
|
-
import { HOSTED_ADMISSION_PATH, HOSTED_DELIVERY_HEADER, HOSTED_DELIVERY_PROTOCOL_VERSION, HOSTED_EXECUTION_PATH, parseHostedAdmission, parseHostedExecution, } from "./hosted-delivery-protocol.js";
|
|
17
|
+
import { HOSTED_ADMISSION_PATH, HOSTED_DELIVERY_HEADER, HOSTED_DELIVERY_PROTOCOL_VERSION, HOSTED_EXECUTION_PATH, HOSTED_GUEST_RETRY_TERMINAL, HOSTED_GUEST_RETRY_TRANSIENT, hostedGuestErrorResponse, isHostedReminderAdmission, parseHostedAdmission, parseHostedExecution, parseHostedReminderFirePayload, } from "./hosted-delivery-protocol.js";
|
|
18
18
|
import { abortReasonFromTurnStatus, HOSTED_EXECUTION_DIAG_RUNNING_STATUS, hostedExecutionDiagId, } from "./hosted-execution-diag.js";
|
|
19
19
|
import { flushHostedExecutionRecord, } from "./hosted-execution-flush.js";
|
|
20
20
|
import { recordHostedManagedAutomation } from "./hosted-managed-automation.js";
|
|
21
|
-
import {
|
|
21
|
+
import { readJsonObject } from "./http-channel.js";
|
|
22
22
|
import { endActiveHttpSpan } from "./otel/http.js";
|
|
23
|
+
import { ReminderValidationError, UnknownReminderError, } from "./reminder-runner.js";
|
|
23
24
|
import { statusForThrownRequestError } from "./request-error-status.js";
|
|
24
25
|
/**
|
|
25
26
|
* A second `send()` in one delivery is a deterministic authored bug — the
|
|
@@ -44,6 +45,22 @@ function boundedMessage(text) {
|
|
|
44
45
|
? `${text.slice(0, MAX_ERROR_MESSAGE_LENGTH)}…`
|
|
45
46
|
: text;
|
|
46
47
|
}
|
|
48
|
+
function terminalHostedError(status, error, message) {
|
|
49
|
+
return hostedGuestErrorResponse({
|
|
50
|
+
status,
|
|
51
|
+
error,
|
|
52
|
+
retry: HOSTED_GUEST_RETRY_TERMINAL,
|
|
53
|
+
message,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function transientHostedError(status, error, message) {
|
|
57
|
+
return hostedGuestErrorResponse({
|
|
58
|
+
status,
|
|
59
|
+
error,
|
|
60
|
+
retry: HOSTED_GUEST_RETRY_TRANSIENT,
|
|
61
|
+
message,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
47
64
|
/**
|
|
48
65
|
* Classify deterministic authored protocol violations as non-retryable 422
|
|
49
66
|
* admissions. Anything else returns `undefined` so callers fall through to
|
|
@@ -61,7 +78,7 @@ function nonRetryableRejection(error) {
|
|
|
61
78
|
return undefined;
|
|
62
79
|
}
|
|
63
80
|
return {
|
|
64
|
-
response:
|
|
81
|
+
response: terminalHostedError(422, code, boundedMessage(error.message)),
|
|
65
82
|
};
|
|
66
83
|
}
|
|
67
84
|
/**
|
|
@@ -79,7 +96,7 @@ export function dispatchHostedAdmission(input) {
|
|
|
79
96
|
const adapter = getHostedAdmissionAdapter(input.definition);
|
|
80
97
|
if (adapter === undefined || adapter.kind !== input.delivery.channelKind) {
|
|
81
98
|
return {
|
|
82
|
-
response:
|
|
99
|
+
response: terminalHostedError(422, "channel_kind_mismatch"),
|
|
83
100
|
};
|
|
84
101
|
}
|
|
85
102
|
// The admission window marker follows the async graph into task bodies so
|
|
@@ -87,6 +104,41 @@ export function dispatchHostedAdmission(input) {
|
|
|
87
104
|
return runDuringHostedAdmission(() => runAdmission(input, adapter));
|
|
88
105
|
});
|
|
89
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Reserved reminder admission: parse the compact payload and invoke
|
|
109
|
+
* ReminderRunner.dispatch. Returns a standard hosted outcome (`task` /
|
|
110
|
+
* `skip`) and never opens the send-capture / model-session path here —
|
|
111
|
+
* prompt-form fires still follow up inside the runner.
|
|
112
|
+
*/
|
|
113
|
+
function dispatchHostedReminderAdmission(input, delivery) {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
if (input.fireReminder === undefined) {
|
|
116
|
+
return transientHostedError(503, "reminder_dispatch_unavailable", "This guest has no reminder runner wired for hosted admission.");
|
|
117
|
+
}
|
|
118
|
+
const payload = parseHostedReminderFirePayload(delivery.payload);
|
|
119
|
+
if (payload === undefined) {
|
|
120
|
+
return terminalHostedError(400, "invalid_reminder_payload", "Expected reminder payload { reminderId, fireCount }.");
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const result = yield input.fireReminder(payload.reminderId, payload.fireCount);
|
|
124
|
+
const outcome = result.outcome === "noop" ? "skip" : "task";
|
|
125
|
+
return Response.json({
|
|
126
|
+
ok: true,
|
|
127
|
+
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
128
|
+
outcome,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (error instanceof UnknownReminderError) {
|
|
133
|
+
return terminalHostedError(404, "unknown_reminder", boundedMessage(error.message));
|
|
134
|
+
}
|
|
135
|
+
if (error instanceof ReminderValidationError) {
|
|
136
|
+
return terminalHostedError(400, "invalid_reminder", boundedMessage(error.message));
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
90
142
|
function runAdmission(input, adapter) {
|
|
91
143
|
return __awaiter(this, void 0, void 0, function* () {
|
|
92
144
|
var _a;
|
|
@@ -121,7 +173,7 @@ function runAdmission(input, adapter) {
|
|
|
121
173
|
}
|
|
122
174
|
if (!dispatched.ok) {
|
|
123
175
|
return {
|
|
124
|
-
response:
|
|
176
|
+
response: terminalHostedError(dispatched.status >= 400 ? dispatched.status : 502, "channel_dispatch_failed"),
|
|
125
177
|
};
|
|
126
178
|
}
|
|
127
179
|
try {
|
|
@@ -133,7 +185,7 @@ function runAdmission(input, adapter) {
|
|
|
133
185
|
return rejected;
|
|
134
186
|
}
|
|
135
187
|
return {
|
|
136
|
-
response:
|
|
188
|
+
response: terminalHostedError(503, "background_dispatch_failed", boundedMessage(error instanceof Error ? error.message : String(error))),
|
|
137
189
|
};
|
|
138
190
|
}
|
|
139
191
|
if (captured !== undefined) {
|
|
@@ -156,7 +208,7 @@ function runAdmission(input, adapter) {
|
|
|
156
208
|
const outcome = dispatchOutcome(dispatched);
|
|
157
209
|
if (outcome === undefined || outcome === "send") {
|
|
158
210
|
return {
|
|
159
|
-
response:
|
|
211
|
+
response: terminalHostedError(502, "channel_outcome_missing"),
|
|
160
212
|
};
|
|
161
213
|
}
|
|
162
214
|
return {
|
|
@@ -234,7 +286,7 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
234
286
|
const consumed = consumeBoundSecrets();
|
|
235
287
|
return consumed.ok
|
|
236
288
|
? undefined
|
|
237
|
-
:
|
|
289
|
+
: transientHostedError(503, consumed.code, boundedMessage(consumed.message));
|
|
238
290
|
};
|
|
239
291
|
const finishNetworkWait = (phase) => __awaiter(this, void 0, void 0, function* () {
|
|
240
292
|
try {
|
|
@@ -252,7 +304,7 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
252
304
|
: "Guest network is not ready for outbound requests.";
|
|
253
305
|
return {
|
|
254
306
|
timing,
|
|
255
|
-
response:
|
|
307
|
+
response: transientHostedError(503, GUEST_NETWORK_UNAVAILABLE, boundedMessage(message)),
|
|
256
308
|
};
|
|
257
309
|
}
|
|
258
310
|
});
|
|
@@ -289,14 +341,30 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
289
341
|
if (unconsumed !== undefined) {
|
|
290
342
|
return finish(unconsumed);
|
|
291
343
|
}
|
|
292
|
-
const
|
|
344
|
+
const rawAdmission = yield readJsonObject(request);
|
|
345
|
+
const delivery = parseHostedAdmission(rawAdmission);
|
|
293
346
|
if (delivery === undefined) {
|
|
294
|
-
|
|
347
|
+
const rawKeys = typeof rawAdmission === "object" &&
|
|
348
|
+
rawAdmission !== null &&
|
|
349
|
+
!Array.isArray(rawAdmission)
|
|
350
|
+
? Object.keys(rawAdmission)
|
|
351
|
+
: [];
|
|
352
|
+
console.info(`[agent-sdk] hosted admission rejected: envelope failed to parse keys=${JSON.stringify(rawKeys)} hasManagedAutomation=${String(rawKeys.includes("managedAutomation"))}`);
|
|
353
|
+
return finish(terminalHostedError(400, "invalid_hosted_admission", "Expected a supported Agent SDK hosted-admission envelope."));
|
|
295
354
|
}
|
|
355
|
+
console.info(`[agent-sdk] hosted admission received deliveryId=${delivery.deliveryId} channelId=${delivery.channelId} channelKind=${delivery.channelKind} eventType=${delivery.eventType} sessionMode=${delivery.sessionMode} managedAutomation=${delivery.managedAutomation === undefined ? "<absent>" : `automationUuid=${delivery.managedAutomation.automationUuid} mcpServerNames=${String(delivery.managedAutomation.mcpServerNames.length)} slackChannels=${delivery.managedAutomation.slackChannels === undefined ? "<absent>" : JSON.stringify(delivery.managedAutomation.slackChannels)}`}`);
|
|
296
356
|
recordHostedManagedAutomation(delivery);
|
|
357
|
+
if (isHostedReminderAdmission(delivery)) {
|
|
358
|
+
const network = yield finishNetworkWait("admission");
|
|
359
|
+
guestNetwork = network.timing;
|
|
360
|
+
if (network.response !== undefined) {
|
|
361
|
+
return finish(network.response);
|
|
362
|
+
}
|
|
363
|
+
return finish(yield dispatchHostedReminderAdmission(input, delivery));
|
|
364
|
+
}
|
|
297
365
|
const channel = input.channels.find((candidate) => candidate.id === delivery.channelId);
|
|
298
366
|
if (channel === undefined) {
|
|
299
|
-
return finish(
|
|
367
|
+
return finish(terminalHostedError(404, "channel_not_found", `No channel named "${delivery.channelId}" is mounted.`));
|
|
300
368
|
}
|
|
301
369
|
const network = yield finishNetworkWait("admission");
|
|
302
370
|
guestNetwork = network.timing;
|
|
@@ -342,16 +410,16 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
342
410
|
}
|
|
343
411
|
const execution = parseHostedExecution(yield readJsonObject(request));
|
|
344
412
|
if (execution === undefined) {
|
|
345
|
-
return finish(
|
|
413
|
+
return finish(terminalHostedError(400, "invalid_hosted_execution", "Expected a supported Agent SDK hosted-execution envelope."));
|
|
346
414
|
}
|
|
347
415
|
pruneExpired();
|
|
348
416
|
const admitted = pending.get(execution.admissionToken);
|
|
349
417
|
if (admitted === undefined) {
|
|
350
|
-
return finish(
|
|
418
|
+
return finish(transientHostedError(409, "hosted_admission_unavailable", "The hosted admission token is missing or expired."));
|
|
351
419
|
}
|
|
352
420
|
if (admitted.sessionPublicId !== undefined &&
|
|
353
421
|
admitted.sessionPublicId !== execution.sessionPublicId) {
|
|
354
|
-
return finish(
|
|
422
|
+
return finish(transientHostedError(409, "hosted_admission_session_mismatch", "The hosted admission token is already bound to another session."));
|
|
355
423
|
}
|
|
356
424
|
const network = yield finishNetworkWait("execution");
|
|
357
425
|
guestNetwork = network.timing;
|
|
@@ -387,15 +455,21 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
387
455
|
sessionId: "",
|
|
388
456
|
turnStatus: HOSTED_EXECUTION_DIAG_RUNNING_STATUS,
|
|
389
457
|
});
|
|
458
|
+
let sessionId = "";
|
|
390
459
|
try {
|
|
391
460
|
const args = input.buildHandlerArgs(admitted.send.channelId, execution.sessionPublicId);
|
|
392
461
|
const session = yield args.send(admitted.send.message, Object.assign(Object.assign({}, admitted.send.options), { mailboxContinuation: {
|
|
393
462
|
key: admitted.send.mailboxContinuationKey,
|
|
394
463
|
} }));
|
|
464
|
+
sessionId = session.id;
|
|
395
465
|
const outcome = yield session.waitForCompletion();
|
|
396
466
|
// Failed turns drain too: their record/continuation updates must
|
|
397
467
|
// survive the park just like a finished turn's.
|
|
398
468
|
yield (_a = input.drainSessionDurability) === null || _a === void 0 ? void 0 : _a.call(input, session.id);
|
|
469
|
+
// Evict before the reply: TAS parks and hibernates this process
|
|
470
|
+
// as soon as the POST returns. A leftover SDK handle freezes a
|
|
471
|
+
// dead Connect/HTTP2 session that the next wake then reuses.
|
|
472
|
+
evictHostedSdkSessions(input.evictSdkSession, session.id, execution.sessionPublicId);
|
|
399
473
|
yield writeDiag({
|
|
400
474
|
sessionId: session.id,
|
|
401
475
|
turnStatus: outcome.status,
|
|
@@ -406,11 +480,13 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
406
480
|
// waitForCompletion resolves (does not throw) on a quiet
|
|
407
481
|
// Connect abort. Map that to guest_connect_stalled so TAS
|
|
408
482
|
// retries the same pod. Real runner failures stay turn_failed.
|
|
483
|
+
const hostedFailure = hostedFailureForUnfinishedTurn(outcome.errorMessage);
|
|
409
484
|
return {
|
|
410
485
|
status: 503,
|
|
411
486
|
body: {
|
|
412
487
|
ok: false,
|
|
413
|
-
error:
|
|
488
|
+
error: hostedFailure.error,
|
|
489
|
+
retry: hostedFailure.retry,
|
|
414
490
|
turnStatus: outcome.status,
|
|
415
491
|
message: outcome.errorMessage,
|
|
416
492
|
},
|
|
@@ -426,6 +502,7 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
426
502
|
};
|
|
427
503
|
}
|
|
428
504
|
catch (error) {
|
|
505
|
+
evictHostedSdkSessions(input.evictSdkSession, sessionId, execution.sessionPublicId);
|
|
429
506
|
yield writeDiag({
|
|
430
507
|
sessionId: "",
|
|
431
508
|
turnStatus: "error",
|
|
@@ -442,12 +519,28 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
442
519
|
}),
|
|
443
520
|
});
|
|
444
521
|
}
|
|
445
|
-
function
|
|
522
|
+
function evictHostedSdkSessions(evict, ...ids) {
|
|
523
|
+
if (evict === undefined) {
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
const seen = new Set();
|
|
527
|
+
for (const id of ids) {
|
|
528
|
+
if (id === undefined || id === "" || seen.has(id)) {
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
seen.add(id);
|
|
532
|
+
evict(id);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
function hostedFailureForUnfinishedTurn(errorMessage) {
|
|
446
536
|
if (errorMessage !== undefined &&
|
|
447
537
|
isQuietGuestConnectStallMessage(errorMessage)) {
|
|
448
|
-
return
|
|
538
|
+
return {
|
|
539
|
+
error: GUEST_CONNECT_STALLED,
|
|
540
|
+
retry: HOSTED_GUEST_RETRY_TRANSIENT,
|
|
541
|
+
};
|
|
449
542
|
}
|
|
450
|
-
return "turn_failed";
|
|
543
|
+
return { error: "turn_failed", retry: HOSTED_GUEST_RETRY_TERMINAL };
|
|
451
544
|
}
|
|
452
545
|
function afterHostedWork(flushOtel, work) {
|
|
453
546
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-managed-automation.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-managed-automation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"hosted-managed-automation.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-managed-automation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAoCtF,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,gCAAgC,CAAC;CACtD,GAAG,IAAI,CA4BP;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,GACjB,gCAAgC,GAAG,SAAS,CAiB9C;AAED,4DAA4D;AAC5D,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D"}
|
|
@@ -14,14 +14,33 @@
|
|
|
14
14
|
* excluded from the published `@cursor/july` npm package (see the `files`
|
|
15
15
|
* whitelist); consumed by internal deployments via relative source imports.
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Process-wide slot for the table. Hosted engines run the compiled CLI
|
|
19
|
+
* (`dist/`), which records at admission, while first-party factory agents
|
|
20
|
+
* relative-import this file from `src/` and read at finalize — two module
|
|
21
|
+
* instances in one process. A module-local Map would be recorded in one
|
|
22
|
+
* copy and read from the other (always undefined, so a fork never sees its
|
|
23
|
+
* Slack channels or MCP servers); the shared symbol keeps one table.
|
|
24
|
+
*/
|
|
25
|
+
const MANAGED_AUTOMATION_TABLE_KEY = Symbol.for("cursor.agentkit.hostedManagedAutomationByDelivery");
|
|
26
|
+
function managedAutomationTable() {
|
|
27
|
+
const slots = globalThis;
|
|
28
|
+
let table = slots[MANAGED_AUTOMATION_TABLE_KEY];
|
|
29
|
+
if (table === undefined) {
|
|
30
|
+
table = new Map();
|
|
31
|
+
slots[MANAGED_AUTOMATION_TABLE_KEY] = table;
|
|
32
|
+
}
|
|
33
|
+
return table;
|
|
34
|
+
}
|
|
18
35
|
/** Long enough to outlive a slow review run kicked off by the delivery. */
|
|
19
36
|
const MANAGED_AUTOMATION_TTL_MS = 60 * 60000;
|
|
20
37
|
const MANAGED_AUTOMATION_MAX_ENTRIES = 10000;
|
|
21
38
|
export function recordHostedManagedAutomation(delivery) {
|
|
22
39
|
if (delivery.managedAutomation === undefined) {
|
|
40
|
+
console.info(`[agent-sdk] hosted managedAutomation not recorded deliveryId=${delivery.deliveryId}: admission envelope carried no managedAutomation slice (non-managed delivery, or the control plane resolved no MCP servers and no Slack channels)`);
|
|
23
41
|
return;
|
|
24
42
|
}
|
|
43
|
+
const managedAutomationByDelivery = managedAutomationTable();
|
|
25
44
|
const now = Date.now();
|
|
26
45
|
for (const [key, entry] of managedAutomationByDelivery) {
|
|
27
46
|
if (entry.expiresAt <= now) {
|
|
@@ -29,12 +48,15 @@ export function recordHostedManagedAutomation(delivery) {
|
|
|
29
48
|
}
|
|
30
49
|
}
|
|
31
50
|
if (managedAutomationByDelivery.size >= MANAGED_AUTOMATION_MAX_ENTRIES) {
|
|
51
|
+
console.info(`[agent-sdk] hosted managedAutomation table full (${String(managedAutomationByDelivery.size)} entries); clearing before recording deliveryId=${delivery.deliveryId}`);
|
|
32
52
|
managedAutomationByDelivery.clear();
|
|
33
53
|
}
|
|
34
54
|
managedAutomationByDelivery.set(delivery.deliveryId, {
|
|
35
55
|
managedAutomation: delivery.managedAutomation,
|
|
36
56
|
expiresAt: now + MANAGED_AUTOMATION_TTL_MS,
|
|
37
57
|
});
|
|
58
|
+
const slackChannels = delivery.managedAutomation.slackChannels;
|
|
59
|
+
console.info(`[agent-sdk] hosted managedAutomation recorded deliveryId=${delivery.deliveryId} automationUuid=${delivery.managedAutomation.automationUuid} mcpServerNames=${String(delivery.managedAutomation.mcpServerNames.length)} slackChannels=${slackChannels === undefined ? "<absent>" : JSON.stringify(slackChannels)} ttlMs=${String(MANAGED_AUTOMATION_TTL_MS)} tableSize=${String(managedAutomationByDelivery.size)}`);
|
|
38
60
|
}
|
|
39
61
|
/**
|
|
40
62
|
* The managed automation the control plane attributed to a hosted delivery,
|
|
@@ -42,11 +64,14 @@ export function recordHostedManagedAutomation(delivery) {
|
|
|
42
64
|
* expired entries, and non-hosted (webhook/stream) dispatch paths.
|
|
43
65
|
*/
|
|
44
66
|
export function getHostedManagedAutomation(deliveryId) {
|
|
67
|
+
const managedAutomationByDelivery = managedAutomationTable();
|
|
45
68
|
const entry = managedAutomationByDelivery.get(deliveryId);
|
|
46
69
|
if (entry === undefined) {
|
|
70
|
+
console.info(`[agent-sdk] hosted managedAutomation lookup miss deliveryId=${deliveryId}: no entry (never recorded in this process, or evicted) tableSize=${String(managedAutomationByDelivery.size)} knownDeliveryIds=${JSON.stringify([...managedAutomationByDelivery.keys()].slice(0, 10))}`);
|
|
47
71
|
return undefined;
|
|
48
72
|
}
|
|
49
73
|
if (entry.expiresAt <= Date.now()) {
|
|
74
|
+
console.info(`[agent-sdk] hosted managedAutomation lookup expired deliveryId=${deliveryId} automationUuid=${entry.managedAutomation.automationUuid} expiredMsAgo=${String(Date.now() - entry.expiresAt)}`);
|
|
50
75
|
managedAutomationByDelivery.delete(deliveryId);
|
|
51
76
|
return undefined;
|
|
52
77
|
}
|
|
@@ -54,5 +79,5 @@ export function getHostedManagedAutomation(deliveryId) {
|
|
|
54
79
|
}
|
|
55
80
|
/** Drop recorded managed-automation slices (tests only). */
|
|
56
81
|
export function resetHostedManagedAutomationForTest() {
|
|
57
|
-
|
|
82
|
+
managedAutomationTable().clear();
|
|
58
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH,OAAO,EAKL,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ const TEMPLATES = {
|
|
|
25
25
|
"agents-md": { dir: "agents-md" },
|
|
26
26
|
"code-wiki": { dir: "code-wiki" },
|
|
27
27
|
demo: { dir: "demo" },
|
|
28
|
+
"grokbot-agents": { dir: "grokbot-agents" },
|
|
28
29
|
"pr-autofixer": { dir: "pr-autofixer" },
|
|
29
30
|
"security-help": { dir: "security-help" },
|
|
30
31
|
"security-reviewer": { dir: "security-reviewer" },
|
|
@@ -499,6 +500,7 @@ export function printInitGuide() {
|
|
|
499
500
|
Scaffold a project, then open the playground:
|
|
500
501
|
npx ${PACKAGE_NAME} init ./my-agent # installs deps + links agent-sdk onto PATH
|
|
501
502
|
npx ${PACKAGE_NAME} init ./my-demo --template demo # record a PR walkthrough
|
|
503
|
+
npx ${PACKAGE_NAME} init ./grokbot --template grokbot-agents # talk to Grok Bot agents
|
|
502
504
|
npx ${PACKAGE_NAME} init ./code-wiki --template code-wiki # keep wiki pages current after merge
|
|
503
505
|
npx ${PACKAGE_NAME} init ./agents-md --template agents-md # keep AGENTS.md current from last week's PRs and Slack
|
|
504
506
|
npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
|
|
@@ -507,8 +509,9 @@ Scaffold a project, then open the playground:
|
|
|
507
509
|
npx ${PACKAGE_NAME} init ./my-triage --template triage-jira # comment on Jira issues
|
|
508
510
|
npx ${PACKAGE_NAME} init ./my-owners --template agentic-owners # review PRs via owners policies
|
|
509
511
|
npx ${PACKAGE_NAME} init ./pr-autofixer --template pr-autofixer # fix PRs on a cloud VM
|
|
510
|
-
# TTY asks
|
|
512
|
+
# TTY asks the template's questions. Scripts pass --var:
|
|
511
513
|
# --var repos=acme/widgets,acme/api
|
|
514
|
+
# --var agents="Plan Keeper, Chief of Staff"
|
|
512
515
|
cd ./my-agent && agent-sdk dev # or: npx ${PACKAGE_NAME} dev
|
|
513
516
|
|
|
514
517
|
Recommended loop once the project exists (from the project directory):
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
* and reminder documents + clocks, then fires into the kit the same way the
|
|
4
4
|
* Cursor backend does over HTTP when `--no-control-plane` is set.
|
|
5
5
|
*
|
|
6
|
+
* Reminder lifecycle (protocol v1): CP assigns id, arms timers, claims a due
|
|
7
|
+
* fire once, invokes a guest executor with an immutable descriptor, and
|
|
8
|
+
* applies the outcome with generation/fireCount CAS. Cancel/rekey racing an
|
|
9
|
+
* in-flight execution bumps generation so a stale outcome cannot resurrect
|
|
10
|
+
* the reminder. Legacy `fireReminder(id, fireCount)` remains for v1 runners.
|
|
11
|
+
*
|
|
6
12
|
* v2 ingest lives here: `routeContinuation` stamps the mailbox (July twin
|
|
7
13
|
* of hosted `routeVerifiedIngressContinuation`), and `attachScmEvents`
|
|
8
14
|
* owns the `/v0/scm-events` long poll. v1 keeps engine-side scm-events.
|
|
@@ -10,7 +16,8 @@
|
|
|
10
16
|
*/
|
|
11
17
|
import { type LocalIngressContinuation, type RouteLocalIngressContinuationInput } from "./local-ingress.js";
|
|
12
18
|
import type { PlatformTimers } from "./platform-timers.js";
|
|
13
|
-
|
|
19
|
+
import { type ReminderControlPlane, type ReminderGuestExecutor } from "./reminder-control-plane-protocol.js";
|
|
20
|
+
export interface LocalControlPlane extends PlatformTimers, ReminderControlPlane {
|
|
14
21
|
/**
|
|
15
22
|
* Stamp a v2 mailbox from the channel selector + live payload. Same
|
|
16
23
|
* contract as hosted verified ingress. `/v1` is a no-op.
|
|
@@ -30,7 +37,16 @@ export interface LocalControlPlane extends PlatformTimers {
|
|
|
30
37
|
}
|
|
31
38
|
export declare function createLocalControlPlane(opts: {
|
|
32
39
|
fireSchedule: (name: string) => Promise<unknown>;
|
|
33
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Legacy v1 path: CP calls this with (id, fireCount) and the runner mutates
|
|
42
|
+
* authoritative state. Prefer {@link executeReminder} for architecture v2.
|
|
43
|
+
*/
|
|
44
|
+
fireReminder?: (id: string, fireCount: number) => Promise<unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Protocol guest executor. When set, due timers claim once, invoke this
|
|
47
|
+
* with an immutable descriptor, and apply the returned outcome via CAS.
|
|
48
|
+
*/
|
|
49
|
+
executeReminder?: ReminderGuestExecutor;
|
|
34
50
|
/**
|
|
35
51
|
* Persist reminder documents under `<stateDir>/reminders`. Local serve
|
|
36
52
|
* passes `<stateRoot>/control-plane`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-control-plane.d.ts","sourceRoot":"","sources":["../../src/internal/local-control-plane.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"local-control-plane.d.ts","sourceRoot":"","sources":["../../src/internal/local-control-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EAExC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAKL,KAAK,oBAAoB,EAIzB,KAAK,qBAAqB,EAI3B,MAAM,sCAAsC,CAAC;AAI9C,MAAM,WAAW,iBACf,SAAQ,cAAc,EACpB,oBAAoB;IACtB;;;OAGG;IACH,iBAAiB,CACf,KAAK,EAAE,kCAAkC,GACxC,wBAAwB,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE;QAAE,KAAK,IAAI,IAAI,CAAC;QAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,yEAAyE;IACzE,WAAW,IAAI,IAAI,CAAC;IACpB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE;;;OAGG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0X7B"}
|