@cursor/july 0.1.97 → 0.1.100
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/AGENTS.md +5 -3
- package/dist/bin/agent-serve.js +6 -7
- package/dist/channels/github/defaults.d.ts.map +1 -1
- package/dist/channels/github/defaults.js +28 -3
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +16 -0
- package/dist/channels/github/progress.d.ts +7 -0
- package/dist/channels/github/progress.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.d.ts +2 -0
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +37 -4
- package/dist/channels/slack/api.d.ts +16 -7
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +29 -13
- package/dist/channels/slack/constants.d.ts +6 -0
- package/dist/channels/slack/constants.d.ts.map +1 -1
- package/dist/channels/slack/constants.js +6 -0
- package/dist/channels/slack/defaults.d.ts +9 -4
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +221 -122
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +3 -3
- package/dist/channels/slack/inbound.d.ts +9 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +14 -0
- package/dist/channels/slack/index.d.ts +1 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +1 -0
- package/dist/channels/slack/live-delivery.d.ts +6 -1
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +110 -20
- package/dist/channels/slack/progress-delivery.d.ts +28 -0
- package/dist/channels/slack/progress-delivery.d.ts.map +1 -0
- package/dist/channels/slack/progress-delivery.js +115 -0
- package/dist/channels/slack/reasoning-card.d.ts +38 -0
- package/dist/channels/slack/reasoning-card.d.ts.map +1 -0
- package/dist/channels/slack/reasoning-card.js +104 -0
- package/dist/channels/slack/redact.d.ts +2 -0
- package/dist/channels/slack/redact.d.ts.map +1 -0
- package/dist/channels/slack/redact.js +5 -0
- package/dist/channels/slack/reply-options.d.ts +40 -0
- package/dist/channels/slack/reply-options.d.ts.map +1 -0
- package/dist/channels/slack/reply-options.js +150 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +8 -4
- package/dist/channels/slack/stream.d.ts +22 -10
- package/dist/channels/slack/stream.d.ts.map +1 -1
- package/dist/channels/slack/stream.js +9 -16
- package/dist/channels/slack/tool-cards.d.ts +22 -0
- package/dist/channels/slack/tool-cards.d.ts.map +1 -0
- package/dist/channels/slack/tool-cards.js +178 -0
- package/dist/channels/slack/types.d.ts +154 -7
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +6 -6
- package/dist/docs/ab.md +1 -1
- package/dist/docs/assets/{ab.md.DJo5r4R-.js → ab.md.mlVgqvSk.js} +1 -1
- package/dist/docs/assets/{app.B3rWNYE1.js → app.DZ1e0Ycq.js} +1 -1
- package/dist/docs/assets/{building-with-agents.md.DI4mEzlt.js → building-with-agents.md.CUSWxlP_.js} +2 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.j70vvPL4.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.C1lhqJJR.js → VPLocalSearchBox.l8omwc6D.js} +1 -1
- package/dist/docs/assets/chunks/{theme.B40_SXuv.js → theme.JVcD6gel.js} +2 -2
- package/dist/docs/assets/{evals.md.lfJoEVc8.js → evals.md.CPzDAwoH.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cnh2mL4a.js → guides_github.md.BtPr9GaP.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.CN-6YmTJ.js → guides_mcp-oauth.md.Dp6cDP7f.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.bmPmkvJu.js → guides_opentelemetry.md.BVTXDCRg.js} +2 -2
- package/dist/docs/assets/{guides_slack.md.VDXQV3ja.js → guides_slack.md.9oHPye9o.js} +19 -3
- package/dist/docs/assets/{guides_slack.md.VDXQV3ja.lean.js → guides_slack.md.9oHPye9o.lean.js} +1 -1
- package/dist/docs/assets/hillclimbing.md.CpTGTCle.js +4 -0
- package/dist/docs/assets/{index.md.CVeRUOeZ.js → index.md.Bb4k8kUm.js} +1 -1
- package/dist/docs/assets/{quickstart.md.Nj_LjW_a.js → quickstart.md.DdQOF7Y8.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.RyZf5OTE.js → reference_cli.md.DfoeyvL0.js} +4 -4
- package/dist/docs/assets/{reference_cli.md.RyZf5OTE.lean.js → reference_cli.md.DfoeyvL0.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.DxldvyIB.js → reference_connections.md.BiGoBAk2.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.5zOAbV86.js → reference_http-api.md.BEJx9XVj.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.B84gw9Ii.js → reference_tools.md.CvAHsdSp.js} +10 -2
- package/dist/docs/assets/{reference_tools.md.B84gw9Ii.lean.js → reference_tools.md.CvAHsdSp.lean.js} +1 -1
- package/dist/docs/assets/scaffolding-agents.md.em43xlY1.js +1 -0
- package/dist/docs/assets/skills_ab.md.CsFNatVx.js +26 -0
- package/dist/docs/assets/skills_ab.md.CsFNatVx.lean.js +1 -0
- package/dist/docs/assets/skills_create-agent.md.BVoWPcan.js +8 -0
- package/dist/docs/assets/skills_create-agent.md.BVoWPcan.lean.js +1 -0
- package/dist/docs/assets/skills_debug.md.CDbPhHfg.js +1 -0
- package/dist/docs/assets/skills_debug.md.CDbPhHfg.lean.js +1 -0
- package/dist/docs/assets/skills_evals.md.723kpUmA.js +25 -0
- package/dist/docs/assets/skills_evals.md.723kpUmA.lean.js +1 -0
- package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +1 -0
- package/dist/docs/assets/skills_framework-map.md.BTi817yv.lean.js +1 -0
- package/dist/docs/assets/skills_github.md.D0JahM8c.js +16 -0
- package/dist/docs/assets/skills_github.md.D0JahM8c.lean.js +1 -0
- package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.js +7 -0
- package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.lean.js +1 -0
- package/dist/docs/assets/skills_index.md.DKwIxzGg.js +1 -0
- package/dist/docs/assets/skills_index.md.DKwIxzGg.lean.js +1 -0
- package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.js +18 -0
- package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.lean.js +1 -0
- package/dist/docs/assets/skills_otel.md.CgiZryR3.js +8 -0
- package/dist/docs/assets/skills_otel.md.CgiZryR3.lean.js +1 -0
- package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.js +20 -0
- package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.lean.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.DCiPBhYs.js → troubleshooting.md.Cus_YZga.js} +1 -1
- package/dist/docs/building-with-agents.html +6 -6
- package/dist/docs/building-with-agents.md +14 -11
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/design/runtime-abstraction.md +1757 -0
- package/dist/docs/evals.html +6 -6
- package/dist/docs/evals.md +1 -1
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +5 -5
- package/dist/docs/guides/github.md +1 -1
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +5 -5
- package/dist/docs/guides/mcp-oauth.md +1 -1
- package/dist/docs/guides/opentelemetry.html +7 -7
- package/dist/docs/guides/opentelemetry.md +2 -2
- package/dist/docs/guides/slack.html +22 -6
- package/dist/docs/guides/slack.md +80 -1
- package/dist/docs/guides/webhooks.html +5 -5
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +6 -6
- package/dist/docs/hillclimbing.md +5 -5
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +1 -1
- package/dist/docs/llms-full.txt +2830 -37
- package/dist/docs/llms.txt +15 -0
- package/dist/docs/quickstart.html +5 -5
- package/dist/docs/quickstart.md +1 -1
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +7 -7
- package/dist/docs/reference/cli.md +1 -7
- package/dist/docs/reference/connections.html +6 -6
- package/dist/docs/reference/connections.md +1 -1
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/http-api.md +1 -0
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +14 -6
- package/dist/docs/reference/tools.md +25 -0
- package/dist/docs/scaffolding-agents.html +5 -5
- package/dist/docs/scaffolding-agents.md +3 -3
- package/dist/docs/skills/ab.html +52 -0
- package/dist/docs/skills/ab.md +50 -0
- package/dist/docs/skills/create-agent.html +34 -0
- package/dist/docs/skills/create-agent.md +160 -0
- package/dist/docs/skills/debug.html +27 -0
- package/dist/docs/skills/debug.md +36 -0
- package/dist/docs/skills/evals.html +51 -0
- package/dist/docs/skills/evals.md +99 -0
- package/dist/docs/skills/framework-map.html +27 -0
- package/dist/docs/skills/framework-map.md +95 -0
- package/dist/docs/skills/github.html +42 -0
- package/dist/docs/skills/github.md +93 -0
- package/dist/docs/skills/hillclimb.html +33 -0
- package/dist/docs/skills/hillclimb.md +55 -0
- package/dist/docs/skills/index.html +27 -0
- package/dist/docs/skills/index.md +21 -0
- package/dist/docs/skills/mcp-auth.html +44 -0
- package/dist/docs/skills/mcp-auth.md +76 -0
- package/dist/docs/skills/otel.html +34 -0
- package/dist/docs/skills/otel.md +48 -0
- package/dist/docs/skills/setup-slack.html +46 -0
- package/dist/docs/skills/setup-slack.md +141 -0
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +4 -4
- package/dist/docs/templates/code-wiki.html +4 -4
- package/dist/docs/templates/demo.html +4 -4
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +4 -4
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/docs/troubleshooting.md +1 -1
- package/dist/files-backends/cursor-hosted.d.ts +9 -2
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +9 -11
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/internal/as-of.d.ts +19 -0
- package/dist/internal/as-of.d.ts.map +1 -0
- package/dist/internal/as-of.js +82 -0
- package/dist/internal/cli-deploy.d.ts +2 -1
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +102 -7
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +3 -4
- package/dist/internal/cursor/hosted-store-secrets.d.ts +15 -0
- package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -0
- package/dist/internal/cursor/hosted-store-secrets.js +48 -0
- package/dist/internal/cursor-event-relay.d.ts.map +1 -1
- package/dist/internal/cursor-event-relay.js +5 -6
- package/dist/internal/deploy-client.d.ts +6 -6
- package/dist/internal/deploy-client.js +7 -7
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +11 -1
- package/dist/internal/framework-file-storage.d.ts +5 -4
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +6 -4
- package/dist/internal/framework-storage-selection.d.ts +13 -11
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +28 -23
- package/dist/internal/hosted-admission-adapter.d.ts +28 -0
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -0
- package/dist/internal/hosted-admission-adapter.js +7 -0
- package/dist/internal/hosted-delivery-protocol.d.ts +6 -1
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +1 -1
- package/dist/internal/hosted-delivery.d.ts +15 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +47 -21
- package/dist/internal/hosted-execution-diag.d.ts +11 -0
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
- package/dist/internal/hosted-execution-diag.js +39 -2
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +4 -1
- package/dist/internal/server.d.ts +3 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +82 -19
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +24 -4
- package/dist/internal/session-run-log.d.ts +120 -0
- package/dist/internal/session-run-log.d.ts.map +1 -0
- package/dist/internal/session-run-log.js +358 -0
- package/dist/internal/tool-policy.d.ts +20 -8
- package/dist/internal/tool-policy.d.ts.map +1 -1
- package/dist/internal/tool-policy.js +11 -0
- package/dist/playground/assets/index-BszoQDc6.css +1 -0
- package/dist/playground/assets/index-DVs98vPL.js +69 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted-v2.d.ts +83 -0
- package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -0
- package/dist/storage-backends/cursor-hosted-v2.js +164 -0
- 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 +6 -1
- package/dist/storage-protocol.d.ts +8 -0
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +8 -0
- package/dist/tools.d.ts +12 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +1 -1
- package/docs/ab.md +1 -1
- package/docs/building-with-agents.md +14 -11
- package/docs/design/runtime-abstraction.md +1757 -0
- package/docs/evals.md +1 -1
- package/docs/guides/github.md +1 -1
- package/docs/guides/mcp-oauth.md +1 -1
- package/docs/guides/opentelemetry.md +2 -2
- package/docs/guides/slack.md +80 -1
- package/docs/hillclimbing.md +5 -5
- package/docs/quickstart.md +1 -1
- package/docs/reference/cli.md +1 -7
- package/docs/reference/connections.md +1 -1
- package/docs/reference/http-api.md +1 -0
- package/docs/reference/tools.md +25 -0
- package/docs/scaffolding-agents.md +3 -3
- package/docs/skills/index.md +26 -0
- package/docs/troubleshooting.md +1 -1
- package/package.json +1 -1
- package/src/bin/agent-serve.ts +6 -7
- package/src/channels/github/defaults.ts +36 -3
- package/src/channels/github/github-channel.ts +17 -0
- package/src/channels/github/progress.ts +7 -0
- package/src/channels/origin/origin-channel.ts +74 -10
- package/src/channels/slack/api.ts +35 -17
- package/src/channels/slack/constants.ts +6 -0
- package/src/channels/slack/defaults.ts +253 -144
- package/src/channels/slack/dispatch.ts +10 -1
- package/src/channels/slack/inbound.ts +17 -0
- package/src/channels/slack/index.ts +1 -0
- package/src/channels/slack/live-delivery.ts +135 -22
- package/src/channels/slack/progress-delivery.ts +133 -0
- package/src/channels/slack/reasoning-card.ts +140 -0
- package/src/channels/slack/redact.ts +6 -0
- package/src/channels/slack/reply-options.ts +229 -0
- package/src/channels/slack/slack-channel.ts +7 -2
- package/src/channels/slack/stream.ts +31 -24
- package/src/channels/slack/tool-cards.ts +221 -0
- package/src/channels/slack/types.ts +168 -7
- package/src/files-backends/cursor-hosted.ts +18 -7
- package/src/index.ts +4 -0
- package/src/internal/as-of.ts +107 -0
- package/src/internal/cli-deploy.ts +130 -10
- package/src/internal/conversation-mirror.ts +3 -8
- package/src/internal/cursor/hosted-store-secrets.ts +72 -0
- package/src/internal/cursor-event-relay.ts +5 -6
- package/src/internal/deploy-client.ts +10 -10
- package/src/internal/discovery.ts +9 -1
- package/src/internal/framework-file-storage.ts +6 -4
- package/src/internal/framework-storage-selection.ts +28 -25
- package/src/internal/hosted-admission-adapter.ts +42 -0
- package/src/internal/hosted-delivery-protocol.ts +7 -2
- package/src/internal/hosted-delivery.ts +88 -36
- package/src/internal/hosted-execution-diag.ts +45 -0
- package/src/internal/http-channel.ts +8 -0
- package/src/internal/server.ts +100 -2
- package/src/internal/session-engine.ts +32 -1
- package/src/internal/session-run-log.ts +579 -0
- package/src/internal/tool-policy.ts +31 -9
- package/src/storage-backends/cursor-hosted-v2.ts +219 -0
- package/src/storage-backends/cursor-hosted.ts +6 -1
- package/src/storage-protocol.ts +10 -0
- package/src/tools.ts +12 -2
- package/src/types.ts +30 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.BU9nHdnQ.js +0 -1
- package/dist/docs/assets/hillclimbing.md.DhESf3OO.js +0 -4
- package/dist/docs/assets/scaffolding-agents.md.D7UUkWw0.js +0 -1
- package/dist/playground/assets/index-DrkI6y5O.js +0 -88
- package/dist/playground/assets/index-DzNGwm7q.css +0 -1
- /package/dist/docs/assets/{ab.md.DJo5r4R-.lean.js → ab.md.mlVgqvSk.lean.js} +0 -0
- /package/dist/docs/assets/{building-with-agents.md.DI4mEzlt.lean.js → building-with-agents.md.CUSWxlP_.lean.js} +0 -0
- /package/dist/docs/assets/{evals.md.lfJoEVc8.lean.js → evals.md.CPzDAwoH.lean.js} +0 -0
- /package/dist/docs/assets/{guides_github.md.Cnh2mL4a.lean.js → guides_github.md.BtPr9GaP.lean.js} +0 -0
- /package/dist/docs/assets/{guides_mcp-oauth.md.CN-6YmTJ.lean.js → guides_mcp-oauth.md.Dp6cDP7f.lean.js} +0 -0
- /package/dist/docs/assets/{guides_opentelemetry.md.bmPmkvJu.lean.js → guides_opentelemetry.md.BVTXDCRg.lean.js} +0 -0
- /package/dist/docs/assets/{hillclimbing.md.DhESf3OO.lean.js → hillclimbing.md.CpTGTCle.lean.js} +0 -0
- /package/dist/docs/assets/{index.md.CVeRUOeZ.lean.js → index.md.Bb4k8kUm.lean.js} +0 -0
- /package/dist/docs/assets/{quickstart.md.Nj_LjW_a.lean.js → quickstart.md.DdQOF7Y8.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.DxldvyIB.lean.js → reference_connections.md.BiGoBAk2.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.5zOAbV86.lean.js → reference_http-api.md.BEJx9XVj.lean.js} +0 -0
- /package/dist/docs/assets/{scaffolding-agents.md.D7UUkWw0.lean.js → scaffolding-agents.md.em43xlY1.lean.js} +0 -0
- /package/dist/docs/assets/{troubleshooting.md.DCiPBhYs.lean.js → troubleshooting.md.Cus_YZga.lean.js} +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor-managed durable KV for hosted **architecture v2** agents.
|
|
3
|
+
*
|
|
4
|
+
* Talks to the AgentSDK v2 KV proxy
|
|
5
|
+
* (`POST /internal/agentsdk/kv/*`) using the engine's pod
|
|
6
|
+
* `CURSOR_API_KEY`. The server resolves the v2 deployment from that service
|
|
7
|
+
* account (factorydb `agentsdk_deployment`) and persists rows in factorydb
|
|
8
|
+
* `agentsdk_kv` — v1's Bugbot-backed `/internal/agent-serve/storage/*`
|
|
9
|
+
* routes cannot resolve a v2 pod credential at all.
|
|
10
|
+
*
|
|
11
|
+
* The v2 wire protocol is four routes, not v1's eight:
|
|
12
|
+
*
|
|
13
|
+
* - `POST /internal/agentsdk/kv/get`
|
|
14
|
+
* `{ key }` → `{ found, value, version }` — reads always carry the CAS
|
|
15
|
+
* version token ({@link KvV2GetResponse}).
|
|
16
|
+
* - `POST /internal/agentsdk/kv/put`
|
|
17
|
+
* `{ key, value, ifAbsent? | ifVersion? }` → `{ ok, version, current }`
|
|
18
|
+
* ({@link KvV2PutResponse}) — one write primitive: last-write-wins when
|
|
19
|
+
* unconditional (still bumps the token), atomic create-if-absent with
|
|
20
|
+
* `ifAbsent: true`, atomic compare-and-swap with `ifVersion`.
|
|
21
|
+
* - `POST /internal/agentsdk/kv/delete` `{ key }` → `{ ok }`.
|
|
22
|
+
* - `POST /internal/agentsdk/kv/list`
|
|
23
|
+
* `{ prefix, limit?, cursor?, keysOnly? }` → `{ entries, nextCursor }`
|
|
24
|
+
* ({@link KvV2ListResponse}) — ascending key order with keyset
|
|
25
|
+
* pagination. `list` / `listKeys` below drain every page, so the v1
|
|
26
|
+
* truncated-scan failure mode does not exist here.
|
|
27
|
+
*
|
|
28
|
+
* Eval runs and A/B samples still ride the v1 storage proxy's dedicated
|
|
29
|
+
* tables (`evals` / `abs` below); moving them to factorydb is a separate
|
|
30
|
+
* follow-up from the KV cutover.
|
|
31
|
+
*
|
|
32
|
+
* This backend is platform-selected for architecture v2
|
|
33
|
+
* (framework-storage-selection.ts) — authors never import it; `agent/storage.ts`
|
|
34
|
+
* is rejected on v2.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import type {
|
|
38
|
+
StorageABTable,
|
|
39
|
+
StorageCasTable,
|
|
40
|
+
StorageConfig,
|
|
41
|
+
StorageEntry,
|
|
42
|
+
StorageEvalsTable,
|
|
43
|
+
} from "../storage.js";
|
|
44
|
+
import type { JsonValue, KvCasResult, KvVersionedEntry } from "../types.js";
|
|
45
|
+
import {
|
|
46
|
+
CURSOR_HOSTED_STORAGE,
|
|
47
|
+
type CursorHostedStorageOptions,
|
|
48
|
+
cursorHostedStorage,
|
|
49
|
+
storageRpc,
|
|
50
|
+
} from "./cursor-hosted.js";
|
|
51
|
+
|
|
52
|
+
const KV_V2_PREFIX = "/internal/agentsdk/kv";
|
|
53
|
+
|
|
54
|
+
/** Wire shape of the v2 `get` route. `null` ⇒ JSON `undefined`. */
|
|
55
|
+
export interface KvV2GetResponse {
|
|
56
|
+
found: boolean;
|
|
57
|
+
value: JsonValue | null;
|
|
58
|
+
version: string | null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Wire shape of the v2 `put` route (all three write modes). */
|
|
62
|
+
export interface KvV2PutResponse {
|
|
63
|
+
ok: boolean;
|
|
64
|
+
/** New version token on an accepted write, else `null`. */
|
|
65
|
+
version: string | null;
|
|
66
|
+
/** Entry observed when a conditional write lost; `null` when absent. */
|
|
67
|
+
current: { value: JsonValue | null; version: string } | null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Wire shape of the v2 `list` route. */
|
|
71
|
+
export interface KvV2ListResponse {
|
|
72
|
+
entries: Array<{
|
|
73
|
+
key: string;
|
|
74
|
+
/** Omitted when the request asked for keys only. */
|
|
75
|
+
value?: JsonValue | null;
|
|
76
|
+
version: string;
|
|
77
|
+
}>;
|
|
78
|
+
/** Last key of this page when more rows remain, else `null`. */
|
|
79
|
+
nextCursor: string | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
type CursorHostedStorageV2Methods = Required<
|
|
83
|
+
Pick<StorageConfig, "put" | "get" | "delete" | "list">
|
|
84
|
+
> & {
|
|
85
|
+
readonly [CURSOR_HOSTED_STORAGE]: true;
|
|
86
|
+
cas: StorageCasTable;
|
|
87
|
+
evals: StorageEvalsTable;
|
|
88
|
+
abs: StorageABTable;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
function toCasResult(response: KvV2PutResponse): KvCasResult {
|
|
92
|
+
if (response.ok) {
|
|
93
|
+
if (response.version === null) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
"cursorHostedStorageV2: conditional write succeeded without a version token"
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return { ok: true, version: response.version };
|
|
99
|
+
}
|
|
100
|
+
const current: KvVersionedEntry | undefined =
|
|
101
|
+
response.current === null
|
|
102
|
+
? undefined
|
|
103
|
+
: {
|
|
104
|
+
value: response.current.value ?? null,
|
|
105
|
+
version: response.current.version,
|
|
106
|
+
};
|
|
107
|
+
return { ok: false, current };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Drain every page of a v2 `list` scan. The server pages by keyset (each
|
|
112
|
+
* `nextCursor` is the strictly-greatest key returned so far), so a cursor
|
|
113
|
+
* that fails to advance means a broken server — fail loudly rather than
|
|
114
|
+
* loop forever.
|
|
115
|
+
*/
|
|
116
|
+
async function listAllPages(
|
|
117
|
+
options: CursorHostedStorageOptions,
|
|
118
|
+
body: { prefix: string; keysOnly?: boolean }
|
|
119
|
+
): Promise<KvV2ListResponse["entries"]> {
|
|
120
|
+
const entries: KvV2ListResponse["entries"] = [];
|
|
121
|
+
let cursor: string | undefined;
|
|
122
|
+
for (;;) {
|
|
123
|
+
const page = await storageRpc<KvV2ListResponse>(
|
|
124
|
+
options,
|
|
125
|
+
`${KV_V2_PREFIX}/list`,
|
|
126
|
+
cursor === undefined ? body : { ...body, cursor }
|
|
127
|
+
);
|
|
128
|
+
entries.push(...page.entries);
|
|
129
|
+
if (page.nextCursor === null) {
|
|
130
|
+
return entries;
|
|
131
|
+
}
|
|
132
|
+
if (cursor !== undefined && page.nextCursor <= cursor) {
|
|
133
|
+
throw new Error(
|
|
134
|
+
`cursorHostedStorageV2: list("${body.prefix}") cursor did not advance`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
cursor = page.nextCursor;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Architecture-v2 `defineStorage` methods (AgentSDK v2 KV proxy → factorydb
|
|
143
|
+
* `agentsdk_kv`). Platform-selected; spread into `defineStorage({...})` by
|
|
144
|
+
* framework-storage-selection.ts. No `listNewest`: v2 session records live
|
|
145
|
+
* on the framework file store, so the only consumer of write-time ordering
|
|
146
|
+
* never reaches this backend and the engine's `list` fallback covers the
|
|
147
|
+
* rest.
|
|
148
|
+
*/
|
|
149
|
+
export function cursorHostedStorageV2(
|
|
150
|
+
options: CursorHostedStorageOptions = {}
|
|
151
|
+
): CursorHostedStorageV2Methods {
|
|
152
|
+
// Eval runs and A/B samples stay on the v1 proxy's dedicated tables.
|
|
153
|
+
const v1 = cursorHostedStorage(options);
|
|
154
|
+
return {
|
|
155
|
+
[CURSOR_HOSTED_STORAGE]: true,
|
|
156
|
+
async put(key, value): Promise<void> {
|
|
157
|
+
await storageRpc(options, `${KV_V2_PREFIX}/put`, { key, value });
|
|
158
|
+
},
|
|
159
|
+
async get(key): Promise<JsonValue | undefined> {
|
|
160
|
+
const result = await storageRpc<KvV2GetResponse>(
|
|
161
|
+
options,
|
|
162
|
+
`${KV_V2_PREFIX}/get`,
|
|
163
|
+
{ key }
|
|
164
|
+
);
|
|
165
|
+
if (!result.found) {
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
return result.value ?? undefined;
|
|
169
|
+
},
|
|
170
|
+
async delete(key): Promise<void> {
|
|
171
|
+
await storageRpc(options, `${KV_V2_PREFIX}/delete`, { key });
|
|
172
|
+
},
|
|
173
|
+
async list(prefix): Promise<StorageEntry[]> {
|
|
174
|
+
const entries = await listAllPages(options, { prefix });
|
|
175
|
+
return entries.map((entry) => ({
|
|
176
|
+
key: entry.key,
|
|
177
|
+
value: entry.value ?? null,
|
|
178
|
+
}));
|
|
179
|
+
},
|
|
180
|
+
cas: {
|
|
181
|
+
async getWithVersion(key): Promise<KvVersionedEntry | undefined> {
|
|
182
|
+
const result = await storageRpc<KvV2GetResponse>(
|
|
183
|
+
options,
|
|
184
|
+
`${KV_V2_PREFIX}/get`,
|
|
185
|
+
{ key }
|
|
186
|
+
);
|
|
187
|
+
if (!result.found || result.version === null) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return { value: result.value ?? null, version: result.version };
|
|
191
|
+
},
|
|
192
|
+
async putIfAbsent(key, value): Promise<KvCasResult> {
|
|
193
|
+
const result = await storageRpc<KvV2PutResponse>(
|
|
194
|
+
options,
|
|
195
|
+
`${KV_V2_PREFIX}/put`,
|
|
196
|
+
{ key, value, ifAbsent: true }
|
|
197
|
+
);
|
|
198
|
+
return toCasResult(result);
|
|
199
|
+
},
|
|
200
|
+
async putIfVersion(key, value, expectedVersion): Promise<KvCasResult> {
|
|
201
|
+
const result = await storageRpc<KvV2PutResponse>(
|
|
202
|
+
options,
|
|
203
|
+
`${KV_V2_PREFIX}/put`,
|
|
204
|
+
{ key, value, ifVersion: expectedVersion }
|
|
205
|
+
);
|
|
206
|
+
return toCasResult(result);
|
|
207
|
+
},
|
|
208
|
+
async listKeys(prefix): Promise<string[]> {
|
|
209
|
+
const entries = await listAllPages(options, {
|
|
210
|
+
prefix,
|
|
211
|
+
keysOnly: true,
|
|
212
|
+
});
|
|
213
|
+
return entries.map((entry) => entry.key);
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
evals: v1.evals,
|
|
217
|
+
abs: v1.abs,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
@@ -207,7 +207,12 @@ function resolveBaseUrl(options: CursorHostedStorageOptions): string {
|
|
|
207
207
|
return raw.endsWith("/") ? raw.slice(0, -1) : raw;
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
-
|
|
210
|
+
/**
|
|
211
|
+
* One authenticated POST to the control-plane proxy. Shared with the
|
|
212
|
+
* architecture-v2 backend (`cursor-hosted-v2.ts`), which speaks a different
|
|
213
|
+
* route family over the same transport and credential chain.
|
|
214
|
+
*/
|
|
215
|
+
export async function storageRpc<T>(
|
|
211
216
|
options: CursorHostedStorageOptions,
|
|
212
217
|
path: string,
|
|
213
218
|
body: Record<string, unknown>
|
package/src/storage-protocol.ts
CHANGED
|
@@ -38,6 +38,7 @@ const DURABLE_SESSION_RECORD_KEY_RE =
|
|
|
38
38
|
* | --- | --- |
|
|
39
39
|
* | `agentkit/v1/{agent}/session/{sessionId}` | `SessionRecord` |
|
|
40
40
|
* | `agentkit/v1/{agent}/session-events/{sessionId}/{index}` | `SessionEvent[]` chunk (index = first event's index, zero-padded) |
|
|
41
|
+
* | `agentkit/v1/{agent}/session-runs/{sessionPublicId}` | One session-level hosted-execution log (executions[] + lastFailure) |
|
|
41
42
|
* | `agentkit/v1/{agent}/continuation/{channelId}/{token}` | `{ sessionId }` |
|
|
42
43
|
* | `agentkit/v1/{agent}/kv/{key}` | Author JSON via `HostContext.kv` |
|
|
43
44
|
*
|
|
@@ -59,6 +60,15 @@ export const storageKeys = {
|
|
|
59
60
|
`${STORAGE_KEY_ROOT}/${agent}/session-events/${sessionId}/${String(firstIndex).padStart(8, "0")}`,
|
|
60
61
|
sessionEventsPrefix: (agent: string, sessionId: string): string =>
|
|
61
62
|
`${STORAGE_KEY_ROOT}/${agent}/session-events/${sessionId}/`,
|
|
63
|
+
/**
|
|
64
|
+
* One session-level hosted-execution log (v2 only). `sessionPublicId` is
|
|
65
|
+
* the factory `ses_…` so a throw that never minted a July session still
|
|
66
|
+
* lands under a stable key. Per-execution rows live inside the document.
|
|
67
|
+
*/
|
|
68
|
+
sessionRun: (agent: string, sessionPublicId: string): string =>
|
|
69
|
+
`${STORAGE_KEY_ROOT}/${agent}/session-runs/${keySegment(sessionPublicId)}`,
|
|
70
|
+
sessionRunsPrefix: (agent: string): string =>
|
|
71
|
+
`${STORAGE_KEY_ROOT}/${agent}/session-runs/`,
|
|
62
72
|
continuation: (
|
|
63
73
|
agent: string,
|
|
64
74
|
channelId: string,
|
package/src/tools.ts
CHANGED
|
@@ -99,6 +99,15 @@ type ServerToolConfig<TSchema> = {
|
|
|
99
99
|
* write, so a dry-run session answers it instead of running it.
|
|
100
100
|
*/
|
|
101
101
|
effect?: ToolEffectDeclaration<ToolInput<TSchema>>;
|
|
102
|
+
/**
|
|
103
|
+
* Input properties carrying time bounds. In an `asOf` session each named
|
|
104
|
+
* argument must be an absolute ISO-8601 instant with a timezone, no later
|
|
105
|
+
* than the frozen instant; a call that omits one, or supplies a relative
|
|
106
|
+
* or later value, is refused so the model retries with absolute bounds.
|
|
107
|
+
* Names must exist in {@link inputSchema} or the frozen session refuses to
|
|
108
|
+
* start. Ignored without `asOf`.
|
|
109
|
+
*/
|
|
110
|
+
timeArgs?: readonly string[];
|
|
102
111
|
/** What a `"write"` tool returns in a dry-run session. */
|
|
103
112
|
dryRunResult?:
|
|
104
113
|
| ToolExecuteResult
|
|
@@ -126,10 +135,11 @@ type AgentToolConfig<TSchema> = {
|
|
|
126
135
|
needsApproval?: never;
|
|
127
136
|
/**
|
|
128
137
|
* Agent tools run inside the harness, not through the host's tool path, so
|
|
129
|
-
* a dry run cannot answer them
|
|
130
|
-
*
|
|
138
|
+
* a dry run cannot answer them and an `asOf` session cannot bound them.
|
|
139
|
+
* Classify the work as a server tool if it needs either.
|
|
131
140
|
*/
|
|
132
141
|
effect?: never;
|
|
142
|
+
timeArgs?: never;
|
|
133
143
|
dryRunResult?: never;
|
|
134
144
|
};
|
|
135
145
|
|
package/src/types.ts
CHANGED
|
@@ -880,6 +880,8 @@ export interface ToolContext {
|
|
|
880
880
|
* `subagent.completed`). Omitted for scratch `callTool` with no session.
|
|
881
881
|
*/
|
|
882
882
|
emit?: (payload: SessionEventPayload) => void;
|
|
883
|
+
/** The session's frozen `asOf`, or the wall clock. Use instead of `Date.now()`. */
|
|
884
|
+
now(): Date;
|
|
883
885
|
}
|
|
884
886
|
|
|
885
887
|
/**
|
|
@@ -992,6 +994,17 @@ export interface ToolConfig<TInput> {
|
|
|
992
994
|
* write, so a dry run stubs it — see {@link ToolEffect}.
|
|
993
995
|
*/
|
|
994
996
|
effect?: ToolEffectDeclaration<TInput>;
|
|
997
|
+
/**
|
|
998
|
+
* Input properties that carry time bounds. In a session created with
|
|
999
|
+
* {@link SendMessageOptions.asOf}, every named argument must be an
|
|
1000
|
+
* absolute ISO-8601 instant with a timezone, no later than the session's
|
|
1001
|
+
* frozen instant — a call that omits one, or supplies a relative or later
|
|
1002
|
+
* value, is refused so the model retries with absolute bounds. Names must
|
|
1003
|
+
* exist in {@link inputSchema}; a session with `asOf` refuses to start
|
|
1004
|
+
* otherwise, because a misspelled name would silently check nothing.
|
|
1005
|
+
* Ignored in sessions without `asOf`.
|
|
1006
|
+
*/
|
|
1007
|
+
timeArgs?: readonly string[];
|
|
995
1008
|
/**
|
|
996
1009
|
* What a write tool returns in a dry-run session instead of executing.
|
|
997
1010
|
*
|
|
@@ -1025,6 +1038,7 @@ export interface ToolDefinition extends BrandedDefinition<"tool"> {
|
|
|
1025
1038
|
readonly outputSchema?: z.ZodTypeAny | JsonSchemaObject;
|
|
1026
1039
|
readonly needsApproval?: ToolNeedsApproval<never>;
|
|
1027
1040
|
readonly effect?: ToolEffectDeclaration<never>;
|
|
1041
|
+
readonly timeArgs?: readonly string[];
|
|
1028
1042
|
readonly dryRunResult?:
|
|
1029
1043
|
| ToolExecuteResult
|
|
1030
1044
|
| ((input: never) => ToolExecuteResult);
|
|
@@ -1624,6 +1638,8 @@ export interface SessionInfo {
|
|
|
1624
1638
|
purpose?: SessionPurpose;
|
|
1625
1639
|
/** True when write-classified tool calls are answered by the host. */
|
|
1626
1640
|
dryRun?: boolean;
|
|
1641
|
+
/** Frozen instant this session reads at; absent means the wall clock. */
|
|
1642
|
+
asOf?: string;
|
|
1627
1643
|
auth: AuthContext | null;
|
|
1628
1644
|
title?: string;
|
|
1629
1645
|
/**
|
|
@@ -1658,6 +1674,8 @@ export interface SessionRecord {
|
|
|
1658
1674
|
purpose?: SessionPurpose;
|
|
1659
1675
|
/** Frozen at create from {@link SendMessageOptions.dryRun}. */
|
|
1660
1676
|
dryRun?: boolean;
|
|
1677
|
+
/** Frozen at create from {@link SendMessageOptions.asOf}. */
|
|
1678
|
+
asOf?: string;
|
|
1661
1679
|
/**
|
|
1662
1680
|
* Denormalized sticky A/B arms (mirrors durable `ab.assigned` events) so
|
|
1663
1681
|
* the agent loop / tools can read arms without re-folding the log. Source
|
|
@@ -1853,6 +1871,13 @@ export interface SendMessageOptions {
|
|
|
1853
1871
|
* model chose stay on the session log as the record of the intended action.
|
|
1854
1872
|
*/
|
|
1855
1873
|
dryRun?: boolean;
|
|
1874
|
+
/**
|
|
1875
|
+
* ISO-8601 instant with a timezone, frozen at create: the prompt states
|
|
1876
|
+
* it, {@link ToolContext.now} returns it, and tools that declare
|
|
1877
|
+
* {@link ToolConfig.timeArgs} refuse calls not bounded at or before it. A
|
|
1878
|
+
* tool that declares nothing still reads the present.
|
|
1879
|
+
*/
|
|
1880
|
+
asOf?: string;
|
|
1856
1881
|
/**
|
|
1857
1882
|
* Absolute directory used as the local harness `cwd` for this session.
|
|
1858
1883
|
* On create, sets the session workspace. On resume (continuation hit),
|
|
@@ -2289,6 +2314,11 @@ export interface ChannelMeta {
|
|
|
2289
2314
|
* by `info` so watched channels are auditable.
|
|
2290
2315
|
*/
|
|
2291
2316
|
slackChannelPosts?: readonly string[];
|
|
2317
|
+
/**
|
|
2318
|
+
* Author-facing notices about deprecated options the pack still honored.
|
|
2319
|
+
* Discovery surfaces each one as a `validate` warning on the channel file.
|
|
2320
|
+
*/
|
|
2321
|
+
deprecations?: readonly string[];
|
|
2292
2322
|
}
|
|
2293
2323
|
|
|
2294
2324
|
export interface ChannelConfig<TState = JsonValue> {
|