@cursor/july 0.1.105 → 0.1.108
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/README.md +10 -5
- package/dist/bin/agent-serve.js +31 -16
- package/dist/channels/bitbucket/types.d.ts +2 -4
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/deployments/types.d.ts +5 -8
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +8 -5
- package/dist/channels/github/types.d.ts +7 -5
- 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/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +27 -13
- package/dist/channels/origin/types.d.ts +7 -4
- 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/channels.d.ts +45 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +106 -7
- package/dist/connections.d.ts +2 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +2 -1
- package/dist/docs/404.html +3 -3
- package/dist/docs/ab.html +6 -6
- package/dist/docs/assets/{app.BVwaffdK.js → app.BASKM3M4.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BHZYsNVi.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.WuWTZ1x8.js → VPLocalSearchBox.BOKxlYGP.js} +2 -2
- package/dist/docs/assets/chunks/{theme.BYdI_6sF.js → theme.DbDZW-zb.js} +2 -2
- package/dist/docs/assets/{deployment.md.MFPKqsqI.js → deployment.md.JenwuCCB.js} +4 -4
- package/dist/docs/assets/{deployment.md.MFPKqsqI.lean.js → deployment.md.JenwuCCB.lean.js} +1 -1
- package/dist/docs/assets/{evals.md.CbMoebP1.js → evals.md.C1ekS3k2.js} +1 -1
- package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.js +9 -0
- package/dist/docs/assets/{guides_cloud-agents.md.DS8RIjwx.lean.js → guides_cloud-agents.md.BsloyHdY.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.c0gdGJ-D.js → guides_github.md.BH33UEBJ.js} +1 -1
- package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.js → guides_grokbot-agents.md.DyV-WArv.js} +1 -1
- package/dist/docs/assets/guides_improve.md.BGVk32bK.js +14 -0
- package/dist/docs/assets/guides_improve.md.BGVk32bK.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/{guides_slack.md.9oHPye9o.js → guides_slack.md.D4RVMM4G.js} +3 -3
- package/dist/docs/assets/{guides_slack.md.9oHPye9o.lean.js → guides_slack.md.D4RVMM4G.lean.js} +1 -1
- package/dist/docs/assets/index.md.BjH1w2ZW.js +5 -0
- package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.js → reference_agent-config.md.CvoL6pof.js} +1 -1
- 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.C6Lo8SEd.js → reference_cli.md.Ca26u0Es.js} +6 -6
- package/dist/docs/assets/{reference_cli.md.C6Lo8SEd.lean.js → reference_cli.md.Ca26u0Es.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.Di6jJAXF.js → reference_connections.md.BojkC6c5.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CGmMLblt.js → reference_extensions.md.CPWt00ds.js} +1 -1
- package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.js → scaffolding-agents.md.Kctn3OVb.js} +1 -1
- package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.js → skills_create-agent.md.Q3h6Je-e.js} +1 -1
- package/dist/docs/assets/{skills_debug.md.CDbPhHfg.js → skills_debug.md.CVjCXMFF.js} +1 -1
- package/dist/docs/assets/{skills_debug.md.CDbPhHfg.lean.js → skills_debug.md.CVjCXMFF.lean.js} +1 -1
- package/dist/docs/assets/{skills_evals.md.723kpUmA.js → skills_evals.md.BhovOvrl.js} +1 -1
- package/dist/docs/assets/skills_framework-map.md.D-tFZhFS.js +1 -0
- package/dist/docs/assets/{skills_framework-map.md.haibFyoB.lean.js → skills_framework-map.md.D-tFZhFS.lean.js} +1 -1
- package/dist/docs/assets/{skills_github.md.D0JahM8c.js → skills_github.md.hgFX_oKY.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/troubleshooting.md.CYEAO9bM.js +1 -0
- package/dist/docs/building-with-agents.html +6 -6
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/deployment.html +9 -9
- package/dist/docs/deployment.md +7 -2
- package/dist/docs/evals.html +8 -8
- package/dist/docs/evals.md +3 -2
- package/dist/docs/guides/agent-to-agent.html +6 -6
- package/dist/docs/guides/cloud-agents.html +7 -7
- package/dist/docs/guides/cloud-agents.md +4 -3
- package/dist/docs/guides/convert-automation.html +6 -6
- package/dist/docs/guides/github.html +7 -7
- package/dist/docs/guides/github.md +2 -1
- package/dist/docs/guides/grokbot-agents.html +7 -7
- package/dist/docs/guides/grokbot-agents.md +2 -2
- package/dist/docs/guides/human-in-the-loop.html +6 -6
- package/dist/docs/guides/improve.html +40 -0
- package/dist/docs/guides/improve.md +91 -0
- 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 +8 -8
- package/dist/docs/guides/slack.md +2 -1
- 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 +4 -0
- package/dist/docs/llms-full.txt +180 -61
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +6 -6
- package/dist/docs/reference/agent-config.html +7 -7
- package/dist/docs/reference/agent-config.md +5 -2
- 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 +11 -11
- package/dist/docs/reference/cli.md +23 -13
- package/dist/docs/reference/connections.html +8 -8
- package/dist/docs/reference/connections.md +2 -1
- 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 +6 -6
- package/dist/docs/scaffolding-agents.md +2 -1
- package/dist/docs/skills/ab.html +6 -6
- package/dist/docs/skills/create-agent.html +8 -8
- package/dist/docs/skills/create-agent.md +1 -1
- package/dist/docs/skills/debug.html +6 -6
- package/dist/docs/skills/debug.md +1 -1
- package/dist/docs/skills/evals.html +8 -8
- package/dist/docs/skills/evals.md +1 -1
- package/dist/docs/skills/framework-map.html +6 -6
- package/dist/docs/skills/framework-map.md +4 -2
- package/dist/docs/skills/github.html +8 -8
- package/dist/docs/skills/github.md +1 -1
- 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 +6 -6
- 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 +6 -6
- package/dist/docs/troubleshooting.md +1 -1
- package/dist/extensions/improve/extension.d.ts +46 -0
- package/dist/extensions/improve/extension.d.ts.map +1 -0
- package/dist/extensions/improve/extension.js +41 -0
- package/dist/extensions/improve/skills/yourself.d.ts +4 -0
- package/dist/extensions/improve/skills/yourself.d.ts.map +1 -0
- package/dist/extensions/improve/skills/yourself.js +43 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
- package/dist/internal/builtin-tools/artifacts.js +2 -3
- package/dist/internal/channel-route-dispatch.d.ts +13 -0
- package/dist/internal/channel-route-dispatch.d.ts.map +1 -0
- package/dist/internal/channel-route-dispatch.js +62 -0
- package/dist/internal/channel-state.d.ts +17 -0
- package/dist/internal/channel-state.d.ts.map +1 -0
- package/dist/internal/channel-state.js +78 -0
- package/dist/internal/cli-ax.d.ts +7 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +99 -1
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +2 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +61 -25
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
- package/dist/internal/cli-mcp-oauth.js +15 -0
- package/dist/internal/cli-mcp.d.ts.map +1 -1
- package/dist/internal/cli-mcp.js +12 -0
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +8 -2
- 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/credentials.d.ts +8 -2
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +27 -5
- package/dist/internal/deploy-client.d.ts +35 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +46 -0
- package/dist/internal/deploy-manifest.d.ts +26 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +99 -13
- package/dist/internal/describe-error.d.ts +1 -0
- package/dist/internal/describe-error.d.ts.map +1 -1
- package/dist/internal/describe-error.js +25 -0
- 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-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 +4 -10
- package/dist/internal/guest-network.d.ts.map +1 -1
- package/dist/internal/guest-network.js +44 -26
- package/dist/internal/hosted-admission-adapter.d.ts +2 -0
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.d.ts +51 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -0
- package/dist/internal/hosted-catch-protocol.js +103 -0
- package/dist/internal/hosted-catch.d.ts +40 -0
- package/dist/internal/hosted-catch.d.ts.map +1 -0
- package/dist/internal/hosted-catch.js +149 -0
- package/dist/internal/hosted-delivery-protocol.d.ts +89 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +309 -0
- package/dist/internal/hosted-delivery.d.ts +20 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +179 -36
- package/dist/internal/hosted-execution-diag.d.ts +4 -1
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
- package/dist/internal/hosted-execution-diag.js +13 -4
- package/dist/internal/hosted-execution-flush.d.ts +3 -0
- package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
- package/dist/internal/hosted-execution-flush.js +2 -4
- package/dist/internal/http-control-plane-session.d.ts +30 -0
- package/dist/internal/http-control-plane-session.d.ts.map +1 -0
- package/dist/internal/http-control-plane-session.js +83 -0
- package/dist/internal/legacy-command-guard.d.ts +22 -0
- package/dist/internal/legacy-command-guard.d.ts.map +1 -0
- package/dist/internal/legacy-command-guard.js +51 -0
- 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/platform-timers.d.ts +7 -0
- package/dist/internal/platform-timers.d.ts.map +1 -1
- package/dist/internal/platform-timers.js +139 -0
- package/dist/internal/reminder-control-plane-protocol.d.ts +189 -0
- package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -0
- package/dist/internal/reminder-control-plane-protocol.js +251 -0
- package/dist/internal/reminder-runner.d.ts +56 -6
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +372 -57
- 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/resolve-prod-target.d.ts +2 -0
- package/dist/internal/resolve-prod-target.d.ts.map +1 -1
- package/dist/internal/resolve-prod-target.js +13 -0
- 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.map +1 -1
- package/dist/internal/sdk-runner.js +4 -3
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +118 -77
- package/dist/internal/session-engine.d.ts +6 -6
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +100 -67
- package/dist/playground/assets/{index-BaQzjaNK.js → index-BMDqAeXu.js} +34 -34
- package/dist/playground/assets/index-LUgJoWdL.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/storage-backends/cursor-hosted.d.ts +6 -0
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +29 -1
- package/dist/types.d.ts +122 -25
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +4 -0
- package/docs/deployment.md +7 -2
- package/docs/evals.md +3 -2
- package/docs/guides/cloud-agents.md +4 -3
- package/docs/guides/github.md +2 -1
- package/docs/guides/grokbot-agents.md +2 -2
- package/docs/guides/improve.md +96 -0
- package/docs/guides/opentelemetry.md +3 -4
- package/docs/guides/slack.md +2 -1
- package/docs/reference/agent-config.md +5 -2
- package/docs/reference/channels.md +11 -19
- package/docs/reference/cli.md +23 -13
- package/docs/reference/connections.md +2 -1
- package/docs/reference/extensions.md +2 -0
- package/docs/scaffolding-agents.md +2 -1
- package/docs/troubleshooting.md +1 -1
- package/package.json +10 -3
- package/skills/create-agent/SKILL.md +1 -1
- package/skills/debug/SKILL.md +1 -1
- package/skills/evals/SKILL.md +1 -1
- package/skills/framework-map/SKILL.md +4 -2
- package/skills/github/SKILL.md +1 -1
- package/skills/otel/SKILL.md +3 -3
- package/src/bin/agent-serve.ts +28 -11
- package/src/channels/bitbucket/types.ts +2 -4
- package/src/channels/deployments/types.ts +5 -8
- package/src/channels/github/github-channel.ts +8 -8
- package/src/channels/github/types.ts +7 -4
- package/src/channels/gitlab/types.ts +2 -5
- package/src/channels/origin/origin-channel.ts +29 -13
- package/src/channels/origin/types.ts +7 -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/channels.ts +157 -10
- package/src/connections.ts +2 -1
- package/src/extensions/improve/extension.ts +70 -0
- package/src/extensions/improve/skills/yourself.ts +50 -0
- package/src/index.ts +6 -3
- package/src/internal/builtin-tools/artifacts.ts +2 -3
- package/src/internal/channel-route-dispatch.ts +66 -0
- package/src/internal/channel-state.ts +96 -0
- package/src/internal/cli-ax.ts +110 -1
- package/src/internal/cli-cursor.ts +4 -1
- package/src/internal/cli-deploy.ts +80 -22
- package/src/internal/cli-mcp-oauth.ts +18 -0
- package/src/internal/cli-mcp.ts +11 -0
- package/src/internal/cli-slack.ts +15 -2
- package/src/internal/cursor/backend-client.ts +90 -2
- package/src/internal/cursor/credentials.ts +35 -7
- package/src/internal/deploy-client.ts +70 -0
- package/src/internal/deploy-manifest.ts +131 -12
- package/src/internal/describe-error.ts +28 -0
- 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-storage-selection.ts +43 -6
- package/src/internal/guest-network.ts +46 -29
- package/src/internal/hosted-admission-adapter.ts +2 -0
- package/src/internal/hosted-catch-protocol.ts +130 -0
- package/src/internal/hosted-catch.ts +192 -0
- package/src/internal/hosted-delivery-protocol.ts +483 -0
- package/src/internal/hosted-delivery.ts +303 -43
- package/src/internal/hosted-execution-diag.ts +21 -3
- package/src/internal/hosted-execution-flush.ts +6 -3
- package/src/internal/http-control-plane-session.ts +104 -0
- package/src/internal/legacy-command-guard.ts +59 -0
- package/src/internal/local-control-plane.ts +281 -22
- package/src/internal/platform-timers.ts +191 -0
- package/src/internal/reminder-control-plane-protocol.ts +512 -0
- package/src/internal/reminder-runner.ts +481 -57
- 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/resolve-prod-target.ts +15 -0
- package/src/internal/scm/pr-url.ts +167 -20
- package/src/internal/sdk-runner.ts +2 -1
- package/src/internal/server.ts +151 -88
- package/src/internal/session-engine.ts +146 -83
- package/src/reminders.ts +35 -4
- package/src/storage-backends/cursor-hosted.ts +40 -1
- package/src/types.ts +134 -26
- package/dist/docs/assets/chunks/@localSearchIndexroot.CJxMklAy.js +0 -1
- package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +0 -9
- package/dist/docs/assets/index.md.BW_6tOgR.js +0 -5
- package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Cus_YZga.js +0 -1
- package/dist/playground/assets/index-CceqnLTX.css +0 -1
- /package/dist/docs/assets/{evals.md.CbMoebP1.lean.js → evals.md.C1ekS3k2.lean.js} +0 -0
- /package/dist/docs/assets/{guides_github.md.c0gdGJ-D.lean.js → guides_github.md.BH33UEBJ.lean.js} +0 -0
- /package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.lean.js → guides_grokbot-agents.md.DyV-WArv.lean.js} +0 -0
- /package/dist/docs/assets/{index.md.BW_6tOgR.lean.js → index.md.BjH1w2ZW.lean.js} +0 -0
- /package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.lean.js → reference_agent-config.md.CvoL6pof.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.Di6jJAXF.lean.js → reference_connections.md.BojkC6c5.lean.js} +0 -0
- /package/dist/docs/assets/{reference_extensions.md.CGmMLblt.lean.js → reference_extensions.md.CPWt00ds.lean.js} +0 -0
- /package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.lean.js → scaffolding-agents.md.Kctn3OVb.lean.js} +0 -0
- /package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.lean.js → skills_create-agent.md.Q3h6Je-e.lean.js} +0 -0
- /package/dist/docs/assets/{skills_evals.md.723kpUmA.lean.js → skills_evals.md.BhovOvrl.lean.js} +0 -0
- /package/dist/docs/assets/{skills_github.md.D0JahM8c.lean.js → skills_github.md.hgFX_oKY.lean.js} +0 -0
- /package/dist/docs/assets/{skills_otel.md.CqhobH3B.lean.js → skills_otel.md.B5Ddv1xH.lean.js} +0 -0
- /package/dist/docs/assets/{troubleshooting.md.Cus_YZga.lean.js → troubleshooting.md.CYEAO9bM.lean.js} +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { DeployApiError, } from "./deploy-client.js";
|
|
11
|
+
/**
|
|
12
|
+
* Classify a hosted slug by probing the v2 control plane.
|
|
13
|
+
*
|
|
14
|
+
* Only HTTP 404 means “not v2.” Auth, 5xx, and transport errors fail closed
|
|
15
|
+
* so a v2 slug cannot fall through to `/internal/agent-serve`. That probe
|
|
16
|
+
* shares the factory microlith path used by secrets; a factory outage will
|
|
17
|
+
* also block legacy `--prod` until it recovers.
|
|
18
|
+
*/
|
|
19
|
+
export function deploymentArchitecture(args) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
try {
|
|
22
|
+
yield args.client.getAgentkitDeploy({
|
|
23
|
+
teamId: args.teamId,
|
|
24
|
+
slug: args.slug,
|
|
25
|
+
});
|
|
26
|
+
return "v2";
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error instanceof DeployApiError && error.status === 404) {
|
|
30
|
+
return "v1";
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function unsupportedV2LegacyCommandError(slug) {
|
|
37
|
+
return new DeployApiError(`This command is not supported for architecture v2 deployment "${slug}". The command stopped before calling the legacy v1 deployment API.`, 409);
|
|
38
|
+
}
|
|
39
|
+
export function isUnsupportedV2LegacyCommandError(error) {
|
|
40
|
+
return (error instanceof DeployApiError &&
|
|
41
|
+
error.status === 409 &&
|
|
42
|
+
error.message.includes("not supported for architecture v2"));
|
|
43
|
+
}
|
|
44
|
+
export function rejectV2ForLegacyCommand(args) {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const architecture = yield deploymentArchitecture(args);
|
|
47
|
+
if (architecture === "v2") {
|
|
48
|
+
throw unsupportedV2LegacyCommandError(args.slug);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
@@ -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"}
|
|
@@ -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.
|
|
@@ -20,11 +26,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
20
26
|
import { join } from "node:path";
|
|
21
27
|
import { parseCron } from "./cron.js";
|
|
22
28
|
import { routeLocalIngressContinuation, } from "./local-ingress.js";
|
|
29
|
+
import { applyOutcomeToRecord, claimFromDescriptor, intentToNewRecord, REMINDER_CP_PROTOCOL_VERSION, recordGeneration, toFireDescriptor, } from "./reminder-control-plane-protocol.js";
|
|
23
30
|
import { MAX_TIMER_MS } from "./reminder-schedule.js";
|
|
24
31
|
import { ReminderStore } from "./reminder-store.js";
|
|
25
32
|
export function createLocalControlPlane(opts) {
|
|
26
33
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
34
|
var _a, _b;
|
|
35
|
+
if (opts.fireReminder === undefined && opts.executeReminder === undefined) {
|
|
36
|
+
throw new Error("createLocalControlPlane requires fireReminder and/or executeReminder");
|
|
37
|
+
}
|
|
28
38
|
const logger = (_a = opts.logger) !== null && _a !== void 0 ? _a : (() => { });
|
|
29
39
|
const armReminderClocks = opts.armReminderClocks !== false;
|
|
30
40
|
const store = opts.stateDir === undefined
|
|
@@ -32,10 +42,21 @@ export function createLocalControlPlane(opts) {
|
|
|
32
42
|
: new ReminderStore(join(opts.stateDir, "reminders"));
|
|
33
43
|
const schedules = new Map();
|
|
34
44
|
const reminderTimers = new Map();
|
|
35
|
-
const reminders = new Map(((_b = (yield store === null || store === void 0 ? void 0 : store.list())) !== null && _b !== void 0 ? _b : []).map((record) =>
|
|
45
|
+
const reminders = new Map(((_b = (yield store === null || store === void 0 ? void 0 : store.list())) !== null && _b !== void 0 ? _b : []).map((record) => { var _a; return [
|
|
46
|
+
record.id,
|
|
47
|
+
Object.assign(Object.assign({}, record), { generation: (_a = record.generation) !== null && _a !== void 0 ? _a : 0 }),
|
|
48
|
+
]; }));
|
|
49
|
+
/** In-flight claims keyed by reminder id (single-flight per id). */
|
|
50
|
+
const inflight = new Map();
|
|
36
51
|
let scheduleTimer;
|
|
37
52
|
let lastFiredMinute = -1;
|
|
38
53
|
let scmRelay;
|
|
54
|
+
function persist(record) {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
reminders.set(record.id, record);
|
|
57
|
+
yield store === null || store === void 0 ? void 0 : store.save(record);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
39
60
|
function armScheduleTicker() {
|
|
40
61
|
var _a;
|
|
41
62
|
if (scheduleTimer !== undefined || schedules.size === 0) {
|
|
@@ -80,10 +101,96 @@ export function createLocalControlPlane(opts) {
|
|
|
80
101
|
function armReminder(record) {
|
|
81
102
|
var _a;
|
|
82
103
|
clearReminderTimer(record.id);
|
|
104
|
+
if (record.status !== "armed") {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
83
107
|
const delay = Math.min(MAX_TIMER_MS, Math.max(0, record.nextFireAtMs - Date.now()));
|
|
84
108
|
const timer = setTimeout(() => {
|
|
85
109
|
reminderTimers.delete(record.id);
|
|
86
|
-
|
|
110
|
+
void onReminderDue(record.id).catch((error) => {
|
|
111
|
+
logger(`[agent-sdk] reminder "${record.id}" dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
});
|
|
113
|
+
}, delay);
|
|
114
|
+
(_a = timer.unref) === null || _a === void 0 ? void 0 : _a.call(timer);
|
|
115
|
+
reminderTimers.set(record.id, timer);
|
|
116
|
+
}
|
|
117
|
+
function claimDue(id) {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
const current = reminders.get(id);
|
|
120
|
+
if (current === undefined || current.status !== "armed") {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
if (current.nextFireAtMs > Date.now() + 50) {
|
|
124
|
+
armReminder(current);
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
if (inflight.has(id)) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
const claimed = Object.assign(Object.assign({}, current), { status: "firing", generation: recordGeneration(current), updatedAt: new Date().toISOString() });
|
|
131
|
+
yield persist(claimed);
|
|
132
|
+
inflight.set(id, {
|
|
133
|
+
id: claimed.id,
|
|
134
|
+
fireCount: claimed.fireCount,
|
|
135
|
+
generation: recordGeneration(claimed),
|
|
136
|
+
});
|
|
137
|
+
return claimed;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function applyReminderOutcome(claim, outcome) {
|
|
141
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
+
const current = reminders.get(claim.id);
|
|
143
|
+
if (current === undefined) {
|
|
144
|
+
inflight.delete(claim.id);
|
|
145
|
+
return { applied: false, reason: "missing" };
|
|
146
|
+
}
|
|
147
|
+
const result = applyOutcomeToRecord(current, claim, outcome);
|
|
148
|
+
inflight.delete(claim.id);
|
|
149
|
+
if (!result.applied) {
|
|
150
|
+
if (current.status === "armed" && armReminderClocks) {
|
|
151
|
+
armReminder(current);
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
yield persist(result.record);
|
|
156
|
+
if (armReminderClocks && result.record.status === "armed") {
|
|
157
|
+
armReminder(result.record);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
clearReminderTimer(result.record.id);
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function onReminderDue(id) {
|
|
166
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
// Protocol path: claim → guest execute → CAS apply.
|
|
168
|
+
if (opts.executeReminder !== undefined) {
|
|
169
|
+
const claimed = yield claimDue(id);
|
|
170
|
+
if (claimed === undefined) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const descriptor = toFireDescriptor(claimed, Date.now());
|
|
174
|
+
let outcome;
|
|
175
|
+
try {
|
|
176
|
+
outcome = yield opts.executeReminder(descriptor);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
logger(`[agent-sdk] reminder "${id}" guest execution failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
180
|
+
outcome = {
|
|
181
|
+
kind: "retry",
|
|
182
|
+
delayMs: 1000,
|
|
183
|
+
reason: "guest_error",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const result = yield applyReminderOutcome(claimFromDescriptor(descriptor), outcome);
|
|
187
|
+
if (!result.applied) {
|
|
188
|
+
logger(`[agent-sdk] reminder "${id}" outcome not applied: ${result.reason}`);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// Legacy v1: do not claim/firing — runner mutates via putReminder after fire.
|
|
193
|
+
const current = reminders.get(id);
|
|
87
194
|
if (current === undefined || current.status !== "armed") {
|
|
88
195
|
return;
|
|
89
196
|
}
|
|
@@ -91,14 +198,16 @@ export function createLocalControlPlane(opts) {
|
|
|
91
198
|
armReminder(current);
|
|
92
199
|
return;
|
|
93
200
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
201
|
+
try {
|
|
202
|
+
yield opts.fireReminder(current.id, current.fireCount);
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
logger(`[agent-sdk] reminder "${id}" dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
100
208
|
}
|
|
101
209
|
return {
|
|
210
|
+
protocolVersion: REMINDER_CP_PROTOCOL_VERSION,
|
|
102
211
|
routeContinuation: routeLocalIngressContinuation,
|
|
103
212
|
attachScmEvents(relay) {
|
|
104
213
|
scmRelay = relay;
|
|
@@ -121,13 +230,17 @@ export function createLocalControlPlane(opts) {
|
|
|
121
230
|
},
|
|
122
231
|
putReminder(record) {
|
|
123
232
|
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
233
|
+
var _a;
|
|
234
|
+
const normalized = Object.assign(Object.assign({}, record), { generation: (_a = record.generation) !== null && _a !== void 0 ? _a : 0 });
|
|
235
|
+
yield persist(normalized);
|
|
236
|
+
if (armReminderClocks && normalized.status === "armed") {
|
|
237
|
+
armReminder(normalized);
|
|
128
238
|
return;
|
|
129
239
|
}
|
|
130
|
-
clearReminderTimer(
|
|
240
|
+
clearReminderTimer(normalized.id);
|
|
241
|
+
if (normalized.status !== "firing") {
|
|
242
|
+
inflight.delete(normalized.id);
|
|
243
|
+
}
|
|
131
244
|
});
|
|
132
245
|
},
|
|
133
246
|
getReminder(id) {
|
|
@@ -143,16 +256,84 @@ export function createLocalControlPlane(opts) {
|
|
|
143
256
|
deleteReminder(id) {
|
|
144
257
|
return __awaiter(this, void 0, void 0, function* () {
|
|
145
258
|
clearReminderTimer(id);
|
|
259
|
+
inflight.delete(id);
|
|
146
260
|
reminders.delete(id);
|
|
147
261
|
yield store === null || store === void 0 ? void 0 : store.delete(id);
|
|
148
262
|
});
|
|
149
263
|
},
|
|
264
|
+
createReminder(intent) {
|
|
265
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
266
|
+
if (intent.protocolVersion !== REMINDER_CP_PROTOCOL_VERSION) {
|
|
267
|
+
throw new Error(`Unsupported reminder CP protocol version ${String(intent.protocolVersion)}`);
|
|
268
|
+
}
|
|
269
|
+
const record = intentToNewRecord(intent);
|
|
270
|
+
yield persist(record);
|
|
271
|
+
if (armReminderClocks && record.status === "armed") {
|
|
272
|
+
armReminder(record);
|
|
273
|
+
}
|
|
274
|
+
return record;
|
|
275
|
+
});
|
|
276
|
+
},
|
|
277
|
+
cancelReminder(id_1) {
|
|
278
|
+
return __awaiter(this, arguments, void 0, function* (id, reason = "explicit_cancel") {
|
|
279
|
+
const current = reminders.get(id);
|
|
280
|
+
if (current === undefined) {
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
if (current.status === "completed" ||
|
|
284
|
+
current.status === "cancelled" ||
|
|
285
|
+
current.status === "disarmed") {
|
|
286
|
+
return current;
|
|
287
|
+
}
|
|
288
|
+
clearReminderTimer(id);
|
|
289
|
+
inflight.delete(id);
|
|
290
|
+
const updated = Object.assign(Object.assign({}, current), { status: "cancelled", disarmReason: reason, generation: recordGeneration(current) + 1, updatedAt: new Date().toISOString() });
|
|
291
|
+
yield persist(updated);
|
|
292
|
+
return updated;
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
rekeyReminders(channelId, oldToken, newToken) {
|
|
296
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
297
|
+
let n = 0;
|
|
298
|
+
for (const record of [...reminders.values()]) {
|
|
299
|
+
if (record.channelId !== channelId ||
|
|
300
|
+
record.continuationToken !== oldToken) {
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (record.status !== "armed" && record.status !== "firing") {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const wasInflight = inflight.has(record.id);
|
|
307
|
+
inflight.delete(record.id);
|
|
308
|
+
let updated = Object.assign(Object.assign({}, record), { continuationToken: newToken, status: "armed", generation: recordGeneration(record) + 1, updatedAt: new Date().toISOString() });
|
|
309
|
+
// Interrupted in-flight fire: retry the same fireCount soon.
|
|
310
|
+
if (wasInflight) {
|
|
311
|
+
updated = Object.assign(Object.assign({}, updated), { nextFireAtMs: Math.min(updated.nextFireAtMs, Date.now()) });
|
|
312
|
+
}
|
|
313
|
+
yield persist(updated);
|
|
314
|
+
if (armReminderClocks) {
|
|
315
|
+
armReminder(updated);
|
|
316
|
+
}
|
|
317
|
+
n += 1;
|
|
318
|
+
}
|
|
319
|
+
return n;
|
|
320
|
+
});
|
|
321
|
+
},
|
|
322
|
+
applyReminderOutcome,
|
|
150
323
|
startClocks() {
|
|
151
|
-
if (!armReminderClocks) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
324
|
for (const record of reminders.values()) {
|
|
155
|
-
if (record.status === "
|
|
325
|
+
if (record.status === "firing") {
|
|
326
|
+
// Restart hydration: treat interrupted fires as armed for retry
|
|
327
|
+
// even when clocks are not armed (status must still recover).
|
|
328
|
+
const restored = Object.assign(Object.assign({}, record), { status: "armed", updatedAt: new Date().toISOString() });
|
|
329
|
+
void persist(restored).then(() => {
|
|
330
|
+
if (armReminderClocks) {
|
|
331
|
+
armReminder(restored);
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (armReminderClocks && record.status === "armed") {
|
|
156
337
|
armReminder(record);
|
|
157
338
|
}
|
|
158
339
|
}
|
|
@@ -162,6 +343,7 @@ export function createLocalControlPlane(opts) {
|
|
|
162
343
|
for (const id of [...reminderTimers.keys()]) {
|
|
163
344
|
clearReminderTimer(id);
|
|
164
345
|
}
|
|
346
|
+
inflight.clear();
|
|
165
347
|
if (scmRelay !== undefined) {
|
|
166
348
|
void scmRelay.stop();
|
|
167
349
|
scmRelay = undefined;
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* The control plane owns reminder *documents* and clocks. The kit only
|
|
8
8
|
* executes fires.
|
|
9
9
|
*/
|
|
10
|
+
import { type ReminderControlPlane } from "./reminder-control-plane-protocol.js";
|
|
10
11
|
import { type ReminderRecord } from "./reminder-store.js";
|
|
11
12
|
export interface PlatformTimers {
|
|
12
13
|
upsertSchedule(input: {
|
|
@@ -25,4 +26,10 @@ export interface CursorHostedPlatformTimersOptions {
|
|
|
25
26
|
fetch?: typeof fetch;
|
|
26
27
|
}
|
|
27
28
|
export declare function createCursorHostedPlatformTimers(options?: CursorHostedPlatformTimersOptions): PlatformTimers;
|
|
29
|
+
/**
|
|
30
|
+
* Cursor-hosted HTTP ReminderControlPlane for architecture v2.
|
|
31
|
+
* Speaks factory `/internal/agentsdk/reminders` (ELB → factory ECS).
|
|
32
|
+
* CP owns ids and time. v1 PUT/DELETE reminders stay on timed-work.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createCursorHostedReminderControlPlane(options?: CursorHostedPlatformTimersOptions): ReminderControlPlane;
|
|
28
35
|
//# sourceMappingURL=platform-timers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-timers.d.ts","sourceRoot":"","sources":["../../src/internal/platform-timers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI5E,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC7D,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAqED,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,cAAc,CA0EhB"}
|
|
1
|
+
{"version":3,"file":"platform-timers.d.ts","sourceRoot":"","sources":["../../src/internal/platform-timers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEL,KAAK,oBAAoB,EAK1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI5E,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC7D,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAqED,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,cAAc,CA0EhB;AA0DD;;;;GAIG;AACH,wBAAgB,sCAAsC,CACpD,OAAO,GAAE,iCAAsC,GAC9C,oBAAoB,CAsHtB"}
|
|
@@ -16,6 +16,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
16
16
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
17
17
|
});
|
|
18
18
|
};
|
|
19
|
+
import { REMINDER_CP_PROTOCOL_VERSION, } from "./reminder-control-plane-protocol.js";
|
|
19
20
|
import { isReminderRecord } from "./reminder-store.js";
|
|
20
21
|
const DEFAULT_CURSOR_EXTERNAL_API_URL = "https://api.cursor.com";
|
|
21
22
|
function resolveApiKey(options) {
|
|
@@ -118,3 +119,141 @@ export function createCursorHostedPlatformTimers(options = {}) {
|
|
|
118
119
|
},
|
|
119
120
|
};
|
|
120
121
|
}
|
|
122
|
+
/** v2 reminder CP is factory ECS (`/internal/agentsdk/*`), not timed-work. */
|
|
123
|
+
const AGENTSDK_REMINDERS_PREFIX = "/internal/agentsdk";
|
|
124
|
+
/**
|
|
125
|
+
* Bounded retries for idempotent CP outcome writes after the guest handler
|
|
126
|
+
* has already run. Delivery is at-least-once: a transient apply failure may
|
|
127
|
+
* re-enter the handler on the next Temporal admission. Do not claim
|
|
128
|
+
* exactly-once handler execution.
|
|
129
|
+
*/
|
|
130
|
+
const APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS = 3;
|
|
131
|
+
const APPLY_REMINDER_OUTCOME_RETRY_DELAY_MS = 50;
|
|
132
|
+
function sleepMs(ms) {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
+
yield new Promise((resolve) => setTimeout(resolve, ms));
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function withBoundedApplyRetries(run) {
|
|
138
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
+
let lastError;
|
|
140
|
+
for (let attempt = 1; attempt <= APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS; attempt++) {
|
|
141
|
+
try {
|
|
142
|
+
return yield run();
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
lastError = error;
|
|
146
|
+
if (attempt >= APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS) {
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
yield sleepMs(APPLY_REMINDER_OUTCOME_RETRY_DELAY_MS * attempt);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
throw lastError;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
function timedWorkJsonFetch(options, method, path, body) {
|
|
156
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
157
|
+
var _a;
|
|
158
|
+
const fetchImpl = (_a = options.fetch) !== null && _a !== void 0 ? _a : globalThis.fetch;
|
|
159
|
+
if (typeof fetchImpl !== "function") {
|
|
160
|
+
throw new Error("reminder control plane requires fetch");
|
|
161
|
+
}
|
|
162
|
+
return fetchImpl(`${resolveBaseUrl(options)}${path}`, Object.assign({ method, headers: Object.assign({ Authorization: `Bearer ${resolveApiKey(options)}` }, (body === undefined ? {} : { "Content-Type": "application/json" })) }, (body === undefined ? {} : { body: JSON.stringify(body) })));
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Cursor-hosted HTTP ReminderControlPlane for architecture v2.
|
|
167
|
+
* Speaks factory `/internal/agentsdk/reminders` (ELB → factory ECS).
|
|
168
|
+
* CP owns ids and time. v1 PUT/DELETE reminders stay on timed-work.
|
|
169
|
+
*/
|
|
170
|
+
export function createCursorHostedReminderControlPlane(options = {}) {
|
|
171
|
+
return {
|
|
172
|
+
protocolVersion: REMINDER_CP_PROTOCOL_VERSION,
|
|
173
|
+
createReminder(intent) {
|
|
174
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
+
const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders`, intent);
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
const text = yield response.text();
|
|
178
|
+
throw new Error(`reminder CP create failed: HTTP ${response.status} ${text}`);
|
|
179
|
+
}
|
|
180
|
+
const parsed = yield response.json();
|
|
181
|
+
if (!isReminderRecord(parsed)) {
|
|
182
|
+
throw new Error("reminder CP create returned invalid record");
|
|
183
|
+
}
|
|
184
|
+
return parsed;
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
getReminder(id) {
|
|
188
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
189
|
+
const response = yield timedWorkJsonFetch(options, "GET", `${AGENTSDK_REMINDERS_PREFIX}/reminders/${encodeURIComponent(id)}`);
|
|
190
|
+
if (response.status === 404) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
if (!response.ok) {
|
|
194
|
+
throw new Error(`reminder CP get failed: HTTP ${response.status}`);
|
|
195
|
+
}
|
|
196
|
+
const parsed = yield response.json();
|
|
197
|
+
return isReminderRecord(parsed) ? parsed : undefined;
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
listReminders() {
|
|
201
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
202
|
+
const response = yield timedWorkJsonFetch(options, "GET", `${AGENTSDK_REMINDERS_PREFIX}/reminders`);
|
|
203
|
+
if (!response.ok) {
|
|
204
|
+
throw new Error(`reminder CP list failed: HTTP ${response.status}`);
|
|
205
|
+
}
|
|
206
|
+
const parsed = yield response.json();
|
|
207
|
+
if (parsed === null ||
|
|
208
|
+
typeof parsed !== "object" ||
|
|
209
|
+
!("reminders" in parsed) ||
|
|
210
|
+
!Array.isArray(parsed.reminders)) {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
return parsed.reminders.filter(isReminderRecord);
|
|
214
|
+
});
|
|
215
|
+
},
|
|
216
|
+
cancelReminder(id, reason) {
|
|
217
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
+
const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders/${encodeURIComponent(id)}/cancel`, reason === undefined ? {} : { reason });
|
|
219
|
+
if (response.status === 404) {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
if (!response.ok) {
|
|
223
|
+
throw new Error(`reminder CP cancel failed: HTTP ${response.status}`);
|
|
224
|
+
}
|
|
225
|
+
const parsed = yield response.json();
|
|
226
|
+
return isReminderRecord(parsed) ? parsed : undefined;
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
rekeyReminders(channelId, oldToken, newToken) {
|
|
230
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
231
|
+
const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders/rekey`, { channelId, oldToken, newToken });
|
|
232
|
+
if (!response.ok) {
|
|
233
|
+
throw new Error(`reminder CP rekey failed: HTTP ${response.status}`);
|
|
234
|
+
}
|
|
235
|
+
const parsed = yield response.json();
|
|
236
|
+
if (parsed === null ||
|
|
237
|
+
typeof parsed !== "object" ||
|
|
238
|
+
typeof parsed.count !== "number") {
|
|
239
|
+
throw new Error("reminder CP rekey returned invalid body");
|
|
240
|
+
}
|
|
241
|
+
return parsed.count;
|
|
242
|
+
});
|
|
243
|
+
},
|
|
244
|
+
applyReminderOutcome(claim, outcome) {
|
|
245
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
246
|
+
// Handler side effects may already have run; retry only the idempotent
|
|
247
|
+
// CP write. Exhausted failures stay thrown so Temporal can re-admit
|
|
248
|
+
// (at-least-once — not exactly-once).
|
|
249
|
+
return yield withBoundedApplyRetries(() => __awaiter(this, void 0, void 0, function* () {
|
|
250
|
+
const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders/outcome`, { claim, outcome });
|
|
251
|
+
if (!response.ok) {
|
|
252
|
+
throw new Error(`reminder CP outcome apply failed: HTTP ${response.status}`);
|
|
253
|
+
}
|
|
254
|
+
return (yield response.json());
|
|
255
|
+
}));
|
|
256
|
+
});
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|