@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,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable hosted-execution run log on the framework file store. **v2 only.**
|
|
3
|
+
*
|
|
4
|
+
* One JSON document per factory session (`ses_…`), with per-execution
|
|
5
|
+
* entries inside. The later customer UI is session-scoped ("why did this
|
|
6
|
+
* session fail?") so a single GET is the read path; continuations are FIFO
|
|
7
|
+
* so last-write-wins merge is safe. Guest-local `hosted-execution.json` and
|
|
8
|
+
* factorydb `last_error` are lossy: the on-disk diag dies with the pod, and
|
|
9
|
+
* the session row only keeps the first 1024 characters of a generic HTTP
|
|
10
|
+
* 500.
|
|
11
|
+
*
|
|
12
|
+
* Process death: persist `running` at turn start so SIGKILL / OOM still
|
|
13
|
+
* leaves a durable leftover. `uncaughtException` / SIGTERM flush the same
|
|
14
|
+
* session key with `processDeath: true` and the real throw. Soft-fail on
|
|
15
|
+
* persist so a store outage never changes the hosted-execution HTTP reply.
|
|
16
|
+
*
|
|
17
|
+
* Keys: {@link storageKeys.sessionRun}.
|
|
18
|
+
*/
|
|
19
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
20
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
21
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
22
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
23
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
24
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
25
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
import { cursorFrameworkStoreSourceId, cursorHostedFiles, } from "../files-backends/cursor-hosted.js";
|
|
29
|
+
import { storageKeys } from "../storage-protocol.js";
|
|
30
|
+
import { resolveApiKeySync } from "./cursor/credentials.js";
|
|
31
|
+
import { AGENT_SERVE_GENERATION_ENV_VAR } from "./cursor-relay-core.js";
|
|
32
|
+
import { describeError } from "./describe-error.js";
|
|
33
|
+
export const SESSION_RUN_LOG_VERSION = 1;
|
|
34
|
+
/** Last N log-ring lines kept on each execution. */
|
|
35
|
+
export const SESSION_RUN_LOG_MAX_ENTRIES = 200;
|
|
36
|
+
/** Per-line cap so a runaway logger cannot blow the document. */
|
|
37
|
+
export const SESSION_RUN_LOG_MAX_LINE_CHARS = 4096;
|
|
38
|
+
/** Continuations are FIFO; keep a bounded history for the session UI. */
|
|
39
|
+
export const SESSION_RUN_LOG_MAX_EXECUTIONS = 20;
|
|
40
|
+
const MAX_ERROR_MESSAGE_CHARS = 4096;
|
|
41
|
+
const MAX_ERROR_STACK_CHARS = 16384;
|
|
42
|
+
const MAX_DOCUMENT_CHARS = 512 * 1024;
|
|
43
|
+
/** Crash-handler flush must not block `process.exit`. */
|
|
44
|
+
export const SESSION_RUN_FATAL_FLUSH_TIMEOUT_MS = 2000;
|
|
45
|
+
let fatalFlush;
|
|
46
|
+
/**
|
|
47
|
+
* Install the crash-handler flush used by `bin/agent-serve` on
|
|
48
|
+
* `uncaughtException`. One process, one active hosted serve.
|
|
49
|
+
*/
|
|
50
|
+
export function registerSessionRunFatalFlush(flush) {
|
|
51
|
+
fatalFlush = flush;
|
|
52
|
+
}
|
|
53
|
+
export function unregisterSessionRunFatalFlush() {
|
|
54
|
+
fatalFlush = undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Await the registered crash flush, bounded so a hung store cannot prevent
|
|
58
|
+
* `process.exit`. Soft-fail.
|
|
59
|
+
*/
|
|
60
|
+
export function flushSessionRunFatal(error) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
if (fatalFlush === undefined) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
yield Promise.race([
|
|
66
|
+
fatalFlush(error).catch(() => undefined),
|
|
67
|
+
new Promise((resolve) => {
|
|
68
|
+
setTimeout(resolve, SESSION_RUN_FATAL_FLUSH_TIMEOUT_MS);
|
|
69
|
+
}),
|
|
70
|
+
]);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function boundedText(value, max) {
|
|
74
|
+
return value.length > max ? `${value.slice(0, max)}…` : value;
|
|
75
|
+
}
|
|
76
|
+
function boundedOptionalText(value, max) {
|
|
77
|
+
if (value === undefined || value.length === 0) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
return boundedText(value, max);
|
|
81
|
+
}
|
|
82
|
+
export function serializeSessionRunError(error) {
|
|
83
|
+
if (error instanceof Error) {
|
|
84
|
+
const stack = boundedOptionalText(error.stack, MAX_ERROR_STACK_CHARS);
|
|
85
|
+
return Object.assign({ name: boundedText(error.name.length > 0 ? error.name : "Error", 128), message: boundedText(error.message, MAX_ERROR_MESSAGE_CHARS) }, (stack === undefined ? {} : { stack }));
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
name: "Error",
|
|
89
|
+
message: boundedText(String(error), MAX_ERROR_MESSAGE_CHARS),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function snapshotSessionRunLogs(entries) {
|
|
93
|
+
const tail = entries.slice(-SESSION_RUN_LOG_MAX_ENTRIES);
|
|
94
|
+
return tail.map((entry) => ({
|
|
95
|
+
index: entry.index,
|
|
96
|
+
at: entry.at,
|
|
97
|
+
line: boundedText(entry.line, SESSION_RUN_LOG_MAX_LINE_CHARS),
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
function isRecord(value) {
|
|
101
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
102
|
+
}
|
|
103
|
+
function decodeSinkBody(body) {
|
|
104
|
+
return body instanceof Uint8Array ? body : body.body;
|
|
105
|
+
}
|
|
106
|
+
function parseError(value) {
|
|
107
|
+
if (!isRecord(value)) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const name = typeof value.name === "string" ? value.name : "";
|
|
111
|
+
const message = typeof value.message === "string" ? value.message : "";
|
|
112
|
+
const stack = typeof value.stack === "string" ? value.stack : undefined;
|
|
113
|
+
return Object.assign({ name,
|
|
114
|
+
message }, (stack === undefined ? {} : { stack }));
|
|
115
|
+
}
|
|
116
|
+
function parseLogs(value) {
|
|
117
|
+
if (!Array.isArray(value)) {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
const logs = [];
|
|
121
|
+
for (const entry of value) {
|
|
122
|
+
if (!isRecord(entry)) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (typeof entry.index !== "number" ||
|
|
126
|
+
typeof entry.at !== "string" ||
|
|
127
|
+
typeof entry.line !== "string") {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
logs.push({ index: entry.index, at: entry.at, line: entry.line });
|
|
131
|
+
}
|
|
132
|
+
return logs;
|
|
133
|
+
}
|
|
134
|
+
function parseExecution(value) {
|
|
135
|
+
if (!isRecord(value)) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
const executionId = typeof value.executionId === "string" ? value.executionId : undefined;
|
|
139
|
+
const writtenAt = typeof value.writtenAt === "string" ? value.writtenAt : undefined;
|
|
140
|
+
const sessionId = typeof value.sessionId === "string" ? value.sessionId : undefined;
|
|
141
|
+
const turnStatus = typeof value.turnStatus === "string" ? value.turnStatus : undefined;
|
|
142
|
+
const durationMs = typeof value.durationMs === "number" && Number.isFinite(value.durationMs)
|
|
143
|
+
? value.durationMs
|
|
144
|
+
: undefined;
|
|
145
|
+
if (executionId === undefined ||
|
|
146
|
+
executionId.length === 0 ||
|
|
147
|
+
writtenAt === undefined ||
|
|
148
|
+
sessionId === undefined ||
|
|
149
|
+
turnStatus === undefined ||
|
|
150
|
+
turnStatus.length === 0 ||
|
|
151
|
+
durationMs === undefined ||
|
|
152
|
+
durationMs < 0) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
const abortReason = typeof value.abortReason === "string" ? value.abortReason : undefined;
|
|
156
|
+
const message = typeof value.message === "string" ? value.message : undefined;
|
|
157
|
+
const error = parseError(value.error);
|
|
158
|
+
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ executionId,
|
|
159
|
+
writtenAt,
|
|
160
|
+
sessionId,
|
|
161
|
+
turnStatus,
|
|
162
|
+
durationMs }, (abortReason === undefined
|
|
163
|
+
? {}
|
|
164
|
+
: { abortReason: abortReason })), (message === undefined ? {} : { message })), (error === undefined ? {} : { error })), (value.processDeath === true ? { processDeath: true } : {})), { logs: parseLogs(value.logs) });
|
|
165
|
+
}
|
|
166
|
+
export function lastFailureFromExecutions(executions) {
|
|
167
|
+
const latest = executions.at(-1);
|
|
168
|
+
if (latest === undefined || latest.turnStatus === "finished") {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
return Object.assign(Object.assign(Object.assign(Object.assign({ executionId: latest.executionId, writtenAt: latest.writtenAt, turnStatus: latest.turnStatus }, (latest.abortReason === undefined
|
|
172
|
+
? {}
|
|
173
|
+
: { abortReason: latest.abortReason })), (latest.message === undefined ? {} : { message: latest.message })), (latest.error === undefined ? {} : { error: latest.error })), (latest.processDeath === true ? { processDeath: true } : {}));
|
|
174
|
+
}
|
|
175
|
+
function boundExecution(write) {
|
|
176
|
+
const error = write.error === undefined
|
|
177
|
+
? undefined
|
|
178
|
+
: Object.assign({ name: boundedText(write.error.name, 128), message: boundedText(write.error.message, MAX_ERROR_MESSAGE_CHARS) }, (write.error.stack === undefined
|
|
179
|
+
? {}
|
|
180
|
+
: {
|
|
181
|
+
stack: boundedText(write.error.stack, MAX_ERROR_STACK_CHARS),
|
|
182
|
+
}));
|
|
183
|
+
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ executionId: write.executionId, writtenAt: write.writtenAt, sessionId: write.sessionId, turnStatus: write.turnStatus, durationMs: write.durationMs }, (write.abortReason === undefined
|
|
184
|
+
? {}
|
|
185
|
+
: { abortReason: write.abortReason })), (boundedOptionalText(write.message, MAX_ERROR_MESSAGE_CHARS) ===
|
|
186
|
+
undefined
|
|
187
|
+
? {}
|
|
188
|
+
: {
|
|
189
|
+
message: boundedOptionalText(write.message, MAX_ERROR_MESSAGE_CHARS),
|
|
190
|
+
})), (error === undefined ? {} : { error })), (write.processDeath === true ? { processDeath: true } : {})), { logs: snapshotSessionRunLogs(write.logs) });
|
|
191
|
+
}
|
|
192
|
+
function upsertExecution(existing, next) {
|
|
193
|
+
const executions = existing.filter((entry) => entry.executionId !== next.executionId);
|
|
194
|
+
executions.push(next);
|
|
195
|
+
executions.sort((a, b) => a.writtenAt.localeCompare(b.writtenAt));
|
|
196
|
+
return executions.slice(-SESSION_RUN_LOG_MAX_EXECUTIONS);
|
|
197
|
+
}
|
|
198
|
+
function shrinkSessionDocument(document) {
|
|
199
|
+
let executions = document.executions;
|
|
200
|
+
let next = Object.assign(Object.assign({}, document), { executions, lastFailure: lastFailureFromExecutions(executions) });
|
|
201
|
+
let serialized = JSON.stringify(next);
|
|
202
|
+
while (serialized.length > MAX_DOCUMENT_CHARS) {
|
|
203
|
+
const oldestWithLogs = executions.findIndex((entry) => entry.logs.length > 0);
|
|
204
|
+
if (oldestWithLogs >= 0) {
|
|
205
|
+
const entry = executions[oldestWithLogs];
|
|
206
|
+
executions = executions.map((item, index) => index === oldestWithLogs
|
|
207
|
+
? Object.assign(Object.assign({}, entry), { logs: entry.logs.slice(Math.ceil(entry.logs.length / 2)) }) : item);
|
|
208
|
+
}
|
|
209
|
+
else if (executions.length > 1) {
|
|
210
|
+
executions = executions.slice(1);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
next = Object.assign(Object.assign({}, document), { executions, lastFailure: lastFailureFromExecutions(executions) });
|
|
216
|
+
serialized = JSON.stringify(next);
|
|
217
|
+
}
|
|
218
|
+
return next;
|
|
219
|
+
}
|
|
220
|
+
export function parseSessionRunLogDocument(value) {
|
|
221
|
+
if (!isRecord(value) || value.v !== SESSION_RUN_LOG_VERSION) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
const sessionPublicId = typeof value.sessionPublicId === "string"
|
|
225
|
+
? value.sessionPublicId
|
|
226
|
+
: undefined;
|
|
227
|
+
const updatedAt = typeof value.updatedAt === "string" ? value.updatedAt : undefined;
|
|
228
|
+
if (sessionPublicId === undefined ||
|
|
229
|
+
sessionPublicId.length === 0 ||
|
|
230
|
+
updatedAt === undefined ||
|
|
231
|
+
!Array.isArray(value.executions)) {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
const executions = [];
|
|
235
|
+
for (const entry of value.executions) {
|
|
236
|
+
const parsed = parseExecution(entry);
|
|
237
|
+
if (parsed !== undefined) {
|
|
238
|
+
executions.push(parsed);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
executions.sort((a, b) => a.writtenAt.localeCompare(b.writtenAt));
|
|
242
|
+
const lastFailure = lastFailureFromExecutions(executions);
|
|
243
|
+
return Object.assign(Object.assign({ v: SESSION_RUN_LOG_VERSION, sessionPublicId,
|
|
244
|
+
updatedAt }, (lastFailure === undefined ? {} : { lastFailure })), { executions });
|
|
245
|
+
}
|
|
246
|
+
export function createSessionRunLogStore(input) {
|
|
247
|
+
var _a;
|
|
248
|
+
const { sink, agentName } = input;
|
|
249
|
+
const logger = (_a = input.logger) !== null && _a !== void 0 ? _a : (() => { });
|
|
250
|
+
let active;
|
|
251
|
+
const readDocument = (sessionPublicId) => __awaiter(this, void 0, void 0, function* () {
|
|
252
|
+
const key = storageKeys.sessionRun(agentName, sessionPublicId);
|
|
253
|
+
const body = yield sink.get(key);
|
|
254
|
+
if (body === undefined) {
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
return parseSessionRunLogDocument(JSON.parse(new TextDecoder().decode(decodeSinkBody(body))));
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
logger(`[agent-sdk] session-run log: skip unreadable ${key} (${describeError(error)})`);
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
const persistWrite = (write) => __awaiter(this, void 0, void 0, function* () {
|
|
266
|
+
var _a;
|
|
267
|
+
const fitted = boundExecution(write);
|
|
268
|
+
let existing;
|
|
269
|
+
try {
|
|
270
|
+
existing = yield readDocument(write.sessionPublicId);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
logger(`[agent-sdk] session-run log: persist failed for ${fitted.executionId} (${describeError(error)})`);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const executions = upsertExecution((_a = existing === null || existing === void 0 ? void 0 : existing.executions) !== null && _a !== void 0 ? _a : [], fitted);
|
|
277
|
+
const document = shrinkSessionDocument({
|
|
278
|
+
v: SESSION_RUN_LOG_VERSION,
|
|
279
|
+
sessionPublicId: write.sessionPublicId,
|
|
280
|
+
updatedAt: fitted.writtenAt,
|
|
281
|
+
executions,
|
|
282
|
+
});
|
|
283
|
+
const key = storageKeys.sessionRun(agentName, document.sessionPublicId);
|
|
284
|
+
try {
|
|
285
|
+
yield sink.put(key, new TextEncoder().encode(JSON.stringify(document)));
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
logger(`[agent-sdk] session-run log: persist failed for ${fitted.executionId} (${describeError(error)})`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (fitted.turnStatus === "running") {
|
|
292
|
+
active = {
|
|
293
|
+
sessionPublicId: write.sessionPublicId,
|
|
294
|
+
executionId: fitted.executionId,
|
|
295
|
+
sessionId: fitted.sessionId,
|
|
296
|
+
startedAt: Date.now(),
|
|
297
|
+
};
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
if ((active === null || active === void 0 ? void 0 : active.executionId) === fitted.executionId) {
|
|
301
|
+
active = undefined;
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
return {
|
|
305
|
+
persist: persistWrite,
|
|
306
|
+
read(sessionPublicId) {
|
|
307
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
308
|
+
try {
|
|
309
|
+
return yield readDocument(sessionPublicId);
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
logger(`[agent-sdk] session-run log: read failed for ${sessionPublicId} (${describeError(error)})`);
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
},
|
|
317
|
+
flushProcessDeath(reason, error) {
|
|
318
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
319
|
+
var _a;
|
|
320
|
+
var _b;
|
|
321
|
+
if (active === undefined) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const current = active;
|
|
325
|
+
const serialized = error === undefined ? undefined : serializeSessionRunError(error);
|
|
326
|
+
const message = error instanceof Error
|
|
327
|
+
? error.message
|
|
328
|
+
: error !== undefined
|
|
329
|
+
? String(error)
|
|
330
|
+
: "process died during hosted execution";
|
|
331
|
+
yield persistWrite(Object.assign(Object.assign({ sessionPublicId: current.sessionPublicId, executionId: current.executionId, writtenAt: new Date().toISOString(), sessionId: current.sessionId, turnStatus: "error", durationMs: Math.max(0, Date.now() - current.startedAt), abortReason: reason, processDeath: true, message }, (serialized === undefined ? {} : { error: serialized })), { logs: snapshotSessionRunLogs((_b = (_a = input.snapshotLogs) === null || _a === void 0 ? void 0 : _a.call(input)) !== null && _b !== void 0 ? _b : []) }));
|
|
332
|
+
});
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Same selection as the conversation mirror: architecture-v2 hosted
|
|
338
|
+
* engines (generation env set). Store ids resolve lazily from env or the
|
|
339
|
+
* task-bind files under `/run/cursor/secrets`. Self-hosted and v1 stay on
|
|
340
|
+
* local disk / today's behavior.
|
|
341
|
+
*/
|
|
342
|
+
export function selectSessionRunLogStore(input) {
|
|
343
|
+
var _a;
|
|
344
|
+
if (input.project.agent.architecture !== "v2") {
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
const env = (_a = input.env) !== null && _a !== void 0 ? _a : process.env;
|
|
348
|
+
if (env[AGENT_SERVE_GENERATION_ENV_VAR] === undefined) {
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
const envSnapshot = env;
|
|
352
|
+
return createSessionRunLogStore(Object.assign({ sink: cursorHostedFiles({
|
|
353
|
+
resolveStoreSourceId: () => cursorFrameworkStoreSourceId(envSnapshot),
|
|
354
|
+
resolveApiKey: () => { var _a; return (_a = resolveApiKeySync()) === null || _a === void 0 ? void 0 : _a.apiKey; },
|
|
355
|
+
}), agentName: input.project.name, logger: input.logger }, (input.snapshotLogs === undefined
|
|
356
|
+
? {}
|
|
357
|
+
: { snapshotLogs: input.snapshotLogs })));
|
|
358
|
+
}
|
|
@@ -21,14 +21,22 @@ export type ToolDecision =
|
|
|
21
21
|
result: ToolExecuteResult;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Do not run it; fail the call with this message. Only
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* Do not run it; fail the call with this message. Only produced in a dry
|
|
25
|
+
* run, for an MCP tool nothing classifies: stubbing it would let the run
|
|
26
|
+
* reach a confident conclusion from no data, and running it could leak a
|
|
27
|
+
* real write — refusing is the one failure that is loud.
|
|
28
28
|
*/
|
|
29
29
|
| {
|
|
30
30
|
kind: "refuse";
|
|
31
31
|
message: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Do not run it; the `asOf` session was asked to read without absolute
|
|
35
|
+
* bounds, which would read the present.
|
|
36
|
+
*/
|
|
37
|
+
| {
|
|
38
|
+
kind: "unbounded";
|
|
39
|
+
message: string;
|
|
32
40
|
};
|
|
33
41
|
/** What a policy decision needs to know about the call. */
|
|
34
42
|
export interface ToolCallFacts {
|
|
@@ -50,12 +58,16 @@ export interface ToolCallFacts {
|
|
|
50
58
|
/** What a stubbed write should answer with, if the tool supplied one. */
|
|
51
59
|
dryRunResult?: ToolExecuteResult | ((input: never) => ToolExecuteResult);
|
|
52
60
|
/**
|
|
53
|
-
* Validated input, as the tool body would receive it.
|
|
54
|
-
*
|
|
55
|
-
* with
|
|
56
|
-
* can omit it.
|
|
61
|
+
* Validated input, as the tool body would receive it. Read by a per-call
|
|
62
|
+
* `effect` predicate, a `dryRunResult` function, and the {@link timeArgs}
|
|
63
|
+
* bound check, so a caller with none of those — a bridged MCP tool, which
|
|
64
|
+
* carries no declaration at all — can omit it.
|
|
57
65
|
*/
|
|
58
66
|
input?: unknown;
|
|
67
|
+
/** The session's frozen instant, when it has one. */
|
|
68
|
+
asOf?: string;
|
|
69
|
+
/** The tool's declared time-bound argument names, if it made them. */
|
|
70
|
+
timeArgs?: readonly string[];
|
|
59
71
|
}
|
|
60
72
|
/**
|
|
61
73
|
* The effect of one specific call.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-policy.d.ts","sourceRoot":"","sources":["../../src/internal/tool-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-policy.d.ts","sourceRoot":"","sources":["../../src/internal/tool-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAGrB,6CAA6C;AAC7C,MAAM,MAAM,YAAY;AACtB,yBAAyB;AACvB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE;AACjB,uDAAuD;GACrD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE;AAC/C;;;;;GAKG;GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACrC;;;GAGG;GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IACjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC7D,yEAAyE;IACzE,YAAY,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,iBAAiB,CAAC,CAAC;IACzE;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAUD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,SAAS,EAChD,KAAK,EAAE,OAAO,GACb,UAAU,CAIZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,kBAAkB,GAAG,SAAS,GAC1C,UAAU,GAAG,SAAS,CAiBxB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,aAAa,GAAG,YAAY,CAAC,EACvE,KAAK,EAAE,OAAO,GACb,UAAU,GAAG,SAAS,CAKxB;AAkBD,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,CAuCjE"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* decision lives here, in one pure function, and every path asks it rather
|
|
9
9
|
* than re-implementing it.
|
|
10
10
|
*/
|
|
11
|
+
import { timeArgViolation } from "./as-of.js";
|
|
11
12
|
/**
|
|
12
13
|
* What a stubbed write answers. Deliberately not self-describing: a model told
|
|
13
14
|
* mid-turn that its writes are not real starts hedging its conclusions, and
|
|
@@ -79,6 +80,16 @@ function unclassifiedRefusal(toolName) {
|
|
|
79
80
|
}
|
|
80
81
|
/** Decide what to do with one tool call. Pure; no I/O, no session state. */
|
|
81
82
|
export function decideToolCall(facts) {
|
|
83
|
+
// Before the dry-run split: a frozen session bounds its reads whether or
|
|
84
|
+
// not its writes are stubbed.
|
|
85
|
+
if (facts.asOf !== undefined &&
|
|
86
|
+
facts.timeArgs !== undefined &&
|
|
87
|
+
facts.timeArgs.length > 0) {
|
|
88
|
+
const violation = timeArgViolation(facts.input, facts.timeArgs, facts.asOf);
|
|
89
|
+
if (violation !== undefined) {
|
|
90
|
+
return { kind: "unbounded", message: violation };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
82
93
|
if (!facts.dryRun) {
|
|
83
94
|
return { kind: "run" };
|
|
84
95
|
}
|