@cursor/july 0.1.102 → 0.1.103
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 +34 -32
- package/README.md +10 -12
- package/dist/ab.d.ts +1 -1
- package/dist/ab.js +1 -1
- package/dist/bin/agent-serve.d.ts +12 -12
- package/dist/bin/agent-serve.js +114 -36
- package/dist/channels/bitbucket/api.d.ts +176 -0
- package/dist/channels/bitbucket/api.d.ts.map +1 -0
- package/dist/channels/bitbucket/api.js +419 -0
- package/dist/channels/bitbucket/binding.d.ts +71 -0
- package/dist/channels/bitbucket/binding.d.ts.map +1 -0
- package/dist/channels/bitbucket/binding.js +269 -0
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +33 -0
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -0
- package/dist/channels/bitbucket/bitbucket-channel.js +120 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +61 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -0
- package/dist/channels/bitbucket/bitbucket-webhook.js +394 -0
- package/dist/channels/bitbucket/checks.d.ts +67 -0
- package/dist/channels/bitbucket/checks.d.ts.map +1 -0
- package/dist/channels/bitbucket/checks.js +102 -0
- package/dist/channels/bitbucket/cursor-account.d.ts +37 -0
- package/dist/channels/bitbucket/cursor-account.d.ts.map +1 -0
- package/dist/channels/bitbucket/cursor-account.js +65 -0
- package/dist/channels/bitbucket/defaults.d.ts +26 -0
- package/dist/channels/bitbucket/defaults.d.ts.map +1 -0
- package/dist/channels/bitbucket/defaults.js +73 -0
- package/dist/channels/bitbucket/events.d.ts +22 -0
- package/dist/channels/bitbucket/events.d.ts.map +1 -0
- package/dist/channels/bitbucket/events.js +64 -0
- package/dist/channels/bitbucket/index.d.ts +34 -0
- package/dist/channels/bitbucket/index.d.ts.map +1 -0
- package/dist/channels/bitbucket/index.js +33 -0
- package/dist/channels/bitbucket/replay.d.ts +63 -0
- package/dist/channels/bitbucket/replay.d.ts.map +1 -0
- package/dist/channels/bitbucket/replay.js +304 -0
- package/dist/channels/bitbucket/state.d.ts +35 -0
- package/dist/channels/bitbucket/state.d.ts.map +1 -0
- package/dist/channels/bitbucket/state.js +21 -0
- package/dist/channels/bitbucket/types.d.ts +229 -0
- package/dist/channels/bitbucket/types.d.ts.map +1 -0
- package/dist/channels/bitbucket/types.js +1 -0
- package/dist/channels/deployments/deployments-channel.d.ts +22 -14
- package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
- package/dist/channels/deployments/deployments-channel.js +25 -27
- package/dist/channels/deployments/types.d.ts +12 -6
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/github/binding.d.ts +6 -0
- package/dist/channels/github/binding.d.ts.map +1 -1
- package/dist/channels/github/binding.js +3 -3
- package/dist/channels/github/cursor-account.d.ts +7 -3
- package/dist/channels/github/cursor-account.d.ts.map +1 -1
- package/dist/channels/github/cursor-account.js +10 -6
- package/dist/channels/github/events.d.ts +1 -1
- package/dist/channels/github/events.js +1 -1
- package/dist/channels/github/forward.d.ts +1 -1
- package/dist/channels/github/forward.d.ts.map +1 -1
- package/dist/channels/github/forward.js +3 -2
- package/dist/channels/github/github-channel.d.ts +29 -39
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +68 -101
- package/dist/channels/github/replay.d.ts +1 -1
- package/dist/channels/github/replay.js +1 -1
- package/dist/channels/github/state.d.ts +2 -0
- package/dist/channels/github/state.d.ts.map +1 -1
- package/dist/channels/github/state.js +14 -11
- package/dist/channels/github/types.d.ts +2 -4
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.d.ts +91 -0
- package/dist/channels/gitlab/api.d.ts.map +1 -0
- package/dist/channels/gitlab/api.js +150 -0
- package/dist/channels/gitlab/binding.d.ts +58 -0
- package/dist/channels/gitlab/binding.d.ts.map +1 -0
- package/dist/channels/gitlab/binding.js +139 -0
- package/dist/channels/gitlab/checks.d.ts +110 -0
- package/dist/channels/gitlab/checks.d.ts.map +1 -0
- package/dist/channels/gitlab/checks.js +126 -0
- package/dist/channels/gitlab/cursor-account.d.ts +36 -0
- package/dist/channels/gitlab/cursor-account.d.ts.map +1 -0
- package/dist/channels/gitlab/cursor-account.js +65 -0
- package/dist/channels/gitlab/defaults.d.ts +25 -0
- package/dist/channels/gitlab/defaults.d.ts.map +1 -0
- package/dist/channels/gitlab/defaults.js +60 -0
- package/dist/channels/gitlab/events.d.ts +12 -0
- package/dist/channels/gitlab/events.d.ts.map +1 -0
- package/dist/channels/gitlab/events.js +28 -0
- package/dist/channels/gitlab/gitlab-channel.d.ts +33 -0
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -0
- package/dist/channels/gitlab/gitlab-channel.js +120 -0
- package/dist/channels/gitlab/gitlab-webhook.d.ts +45 -0
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -0
- package/dist/channels/gitlab/gitlab-webhook.js +397 -0
- package/dist/channels/gitlab/index.d.ts +31 -0
- package/dist/channels/gitlab/index.d.ts.map +1 -0
- package/dist/channels/gitlab/index.js +30 -0
- package/dist/channels/gitlab/replay.d.ts +105 -0
- package/dist/channels/gitlab/replay.d.ts.map +1 -0
- package/dist/channels/gitlab/replay.js +206 -0
- package/dist/channels/gitlab/state.d.ts +33 -0
- package/dist/channels/gitlab/state.d.ts.map +1 -0
- package/dist/channels/gitlab/state.js +23 -0
- package/dist/channels/gitlab/types.d.ts +214 -0
- package/dist/channels/gitlab/types.d.ts.map +1 -0
- package/dist/channels/gitlab/types.js +1 -0
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +4 -2
- package/dist/channels/origin/origin-channel.d.ts +4 -9
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +8 -48
- package/dist/channels/origin/types.d.ts +20 -2
- package/dist/channels/origin/types.d.ts.map +1 -1
- package/dist/channels/slack/eval-directive.d.ts.map +1 -1
- package/dist/channels/slack/eval-directive.js +1 -7
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +3 -3
- package/dist/channels/slack/setup.d.ts +1 -1
- package/dist/channels/slack/setup.d.ts.map +1 -1
- package/dist/channels/slack/setup.js +6 -13
- package/dist/channels/slack/types.d.ts +1 -1
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels.d.ts +1 -1
- package/dist/channels.d.ts.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/connections.d.ts +1 -1
- package/dist/connections.js +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.CLA03RCz.js → app.DW9pXkpL.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.nrl1ifBq.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.ifxv-cJV.js → VPLocalSearchBox.CdEIUwDg.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DWCwM6p-.js → theme.YZMHgPgg.js} +2 -2
- package/dist/docs/assets/concepts.md.DgEcZOfT.js +1 -0
- package/dist/docs/assets/{concepts.md.rPzW2HZN.lean.js → concepts.md.DgEcZOfT.lean.js} +1 -1
- package/dist/docs/assets/{evals.md.CPzDAwoH.js → evals.md.CbMoebP1.js} +1 -1
- package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +9 -0
- package/dist/docs/assets/{guides_github.md.BtPr9GaP.js → guides_github.md.DKYiT9do.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.js → guides_opentelemetry.md.COh9jFVg.js} +7 -8
- package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.lean.js → guides_opentelemetry.md.COh9jFVg.lean.js} +1 -1
- package/dist/docs/assets/{index.md.Kiht7ell.js → index.md.D75GWhPl.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.js → reference_agent-config.md.CHNpiyp4.js} +3 -3
- package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.js → reference_channels.md.Dz8Cnudp.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.lean.js → reference_channels.md.Dz8Cnudp.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.DfoeyvL0.js → reference_cli.md.CJNc_xYK.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.9WQMZe1l.js → reference_extensions.md.DykHW3qL.js} +11 -5
- package/dist/docs/assets/reference_extensions.md.DykHW3qL.lean.js +1 -0
- package/dist/docs/assets/reference_hooks.md.Ddt5DdgJ.js +73 -0
- package/dist/docs/assets/{reference_hooks.md.a8BJxMR5.lean.js → reference_hooks.md.Ddt5DdgJ.lean.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.DnX5nL-B.js → reference_playground.md.4myJPxrf.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.js → reference_project-layout.md.DuBu9a96.js} +2 -2
- package/dist/docs/assets/reference_result.md.BK5SxDrf.js +19 -0
- package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +1 -0
- package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.js → reference_sessions.md.CueyOHSL.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.lean.js → reference_sessions.md.CueyOHSL.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.B1up2r9W.js → reference_tools.md.aGrn99hP.js} +1 -1
- package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +1 -0
- package/dist/docs/assets/{skills_otel.md.CgiZryR3.js → skills_otel.md.CqhobH3B.js} +3 -3
- package/dist/docs/assets/{skills_otel.md.CgiZryR3.lean.js → skills_otel.md.CqhobH3B.lean.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.js → templates_pr-autofixer.md.Bds_XWcV.js} +2 -2
- package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.lean.js → templates_pr-autofixer.md.Bds_XWcV.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/concepts.md +2 -4
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/design/runtime-abstraction.md +2 -3
- package/dist/docs/evals.html +6 -6
- package/dist/docs/evals.md +9 -7
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-agents.html +6 -6
- package/dist/docs/guides/cloud-agents.md +4 -6
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +6 -6
- package/dist/docs/guides/github.md +0 -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/opentelemetry.html +10 -11
- package/dist/docs/guides/opentelemetry.md +41 -17
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +2 -2
- package/dist/docs/llms-full.txt +501 -262
- package/dist/docs/llms.txt +2 -2
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +8 -8
- package/dist/docs/reference/agent-config.md +6 -10
- package/dist/docs/reference/artifacts.html +5 -5
- package/dist/docs/reference/channels.html +6 -6
- package/dist/docs/reference/channels.md +18 -8
- package/dist/docs/reference/cli.html +5 -5
- package/dist/docs/reference/cli.md +3 -4
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/extensions.html +16 -10
- package/dist/docs/reference/extensions.md +86 -22
- package/dist/docs/reference/hooks.html +69 -10
- package/dist/docs/reference/hooks.md +215 -46
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +5 -5
- package/dist/docs/reference/playground.md +3 -0
- package/dist/docs/reference/project-layout.html +6 -6
- package/dist/docs/reference/project-layout.md +2 -1
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/result.html +45 -0
- package/dist/docs/reference/result.md +89 -0
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/sessions.md +3 -1
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +5 -5
- package/dist/docs/reference/tools.md +1 -2
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/skills/ab.html +4 -4
- package/dist/docs/skills/create-agent.html +4 -4
- package/dist/docs/skills/debug.html +4 -4
- package/dist/docs/skills/evals.html +4 -4
- package/dist/docs/skills/framework-map.html +5 -5
- package/dist/docs/skills/framework-map.md +3 -1
- package/dist/docs/skills/github.html +4 -4
- package/dist/docs/skills/hillclimb.html +4 -4
- package/dist/docs/skills/index.html +4 -4
- package/dist/docs/skills/mcp-auth.html +4 -4
- package/dist/docs/skills/otel.html +7 -7
- package/dist/docs/skills/otel.md +8 -3
- package/dist/docs/skills/setup-slack.html +4 -4
- 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 +6 -6
- package/dist/docs/templates/pr-autofixer.md +0 -3
- 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 +4 -4
- package/dist/evals.d.ts +1 -1
- package/dist/evals.d.ts.map +1 -1
- package/dist/extensions.d.ts +20 -7
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +36 -5
- package/dist/files.d.ts +16 -3
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +16 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/internal/ab-snapshot.d.ts.map +1 -1
- package/dist/internal/ab-snapshot.js +0 -1
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +1 -3
- package/dist/internal/authored-alias-hooks.d.ts +4 -13
- package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
- package/dist/internal/authored-alias-hooks.js +4 -20
- package/dist/internal/authored-loaders.d.ts +2 -3
- package/dist/internal/authored-loaders.d.ts.map +1 -1
- package/dist/internal/authored-loaders.js +6 -20
- package/dist/internal/channel-dispatch.d.ts +43 -0
- package/dist/internal/channel-dispatch.d.ts.map +1 -0
- package/dist/internal/channel-dispatch.js +77 -0
- package/dist/internal/chat-client.d.ts +1 -1
- package/dist/internal/chat-client.js +1 -1
- package/dist/internal/cli-ax.d.ts +5 -5
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +5 -5
- package/dist/internal/cli-bitbucket.d.ts +33 -0
- package/dist/internal/cli-bitbucket.d.ts.map +1 -0
- package/dist/internal/cli-bitbucket.js +359 -0
- package/dist/internal/cli-convert-automation.d.ts +1 -1
- package/dist/internal/cli-convert-automation.js +2 -2
- package/dist/internal/cli-cursor.d.ts +1 -1
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +2 -4
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +2 -6
- package/dist/internal/cli-github.d.ts +1 -1
- package/dist/internal/cli-github.js +3 -3
- package/dist/internal/cli-gitlab.d.ts +37 -0
- package/dist/internal/cli-gitlab.d.ts.map +1 -0
- package/dist/internal/cli-gitlab.js +380 -0
- package/dist/internal/cli-mcp.d.ts.map +1 -1
- package/dist/internal/cli-mcp.js +2 -6
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +2 -4
- package/dist/internal/continuation-channel.d.ts +14 -0
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +56 -3
- package/dist/internal/continuation-identity.d.ts +14 -15
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +182 -7
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +4 -3
- package/dist/internal/convert-automation/types.d.ts +1 -1
- package/dist/internal/convert-automation/types.js +1 -1
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +1 -3
- package/dist/internal/cursor/backend-client.d.ts +5 -4
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +5 -6
- package/dist/internal/cursor/bound-secret-file.d.ts +56 -0
- package/dist/internal/cursor/bound-secret-file.d.ts.map +1 -0
- package/dist/internal/cursor/bound-secret-file.js +88 -0
- package/dist/internal/cursor/credentials.d.ts +39 -5
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +58 -8
- package/dist/internal/cursor/hosted-bound-secrets.d.ts +41 -0
- package/dist/internal/cursor/hosted-bound-secrets.d.ts.map +1 -0
- package/dist/internal/cursor/hosted-bound-secrets.js +54 -0
- package/dist/internal/cursor/hosted-deployment-secrets.d.ts +19 -5
- package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -1
- package/dist/internal/cursor/hosted-deployment-secrets.js +29 -9
- package/dist/internal/cursor/hosted-store-secrets.d.ts +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +1 -1
- package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +2 -4
- package/dist/internal/cursor-deployment-relay.d.ts +6 -2
- package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
- package/dist/internal/cursor-deployment-relay.js +13 -9
- package/dist/internal/deploy-manifest.d.ts +1 -1
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +1 -1
- package/dist/internal/discovery/ab.d.ts +1 -1
- package/dist/internal/discovery/ab.d.ts.map +1 -1
- package/dist/internal/discovery/ab.js +21 -9
- package/dist/internal/discovery/agent.d.ts +6 -1
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +65 -116
- package/dist/internal/discovery/channels.d.ts +1 -1
- package/dist/internal/discovery/channels.d.ts.map +1 -1
- package/dist/internal/discovery/channels.js +14 -14
- package/dist/internal/discovery/connections.d.ts +1 -5
- package/dist/internal/discovery/connections.d.ts.map +1 -1
- package/dist/internal/discovery/connections.js +30 -44
- package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -1
- package/dist/internal/discovery/cursor-plugin.js +1 -3
- package/dist/internal/discovery/extension-overlay.d.ts +32 -0
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -0
- package/dist/internal/discovery/extension-overlay.js +191 -0
- package/dist/internal/discovery/extensions.d.ts +11 -2
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +211 -74
- package/dist/internal/discovery/hooks.d.ts +1 -1
- package/dist/internal/discovery/hooks.d.ts.map +1 -1
- package/dist/internal/discovery/hooks.js +15 -2
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +7 -1
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +8 -2
- package/dist/internal/discovery/names.d.ts +1 -1
- package/dist/internal/discovery/names.d.ts.map +1 -1
- package/dist/internal/discovery/names.js +1 -0
- package/dist/internal/discovery/project.d.ts +0 -2
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +64 -10
- package/dist/internal/discovery/runtime.d.ts.map +1 -1
- package/dist/internal/discovery/runtime.js +1 -2
- package/dist/internal/discovery/schedules.d.ts +1 -1
- package/dist/internal/discovery/schedules.d.ts.map +1 -1
- package/dist/internal/discovery/schedules.js +23 -2
- package/dist/internal/discovery/services.d.ts +6 -2
- package/dist/internal/discovery/services.d.ts.map +1 -1
- package/dist/internal/discovery/services.js +31 -1
- package/dist/internal/discovery/skills.d.ts +1 -6
- package/dist/internal/discovery/skills.d.ts.map +1 -1
- package/dist/internal/discovery/skills.js +8 -3
- package/dist/internal/discovery/subagent.d.ts +3 -0
- package/dist/internal/discovery/subagent.d.ts.map +1 -1
- package/dist/internal/discovery/subagent.js +109 -0
- package/dist/internal/discovery.d.ts +1 -2
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +1 -2
- package/dist/internal/distribution.d.ts +10 -27
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +25 -73
- package/dist/internal/docs-site.js +1 -1
- package/dist/internal/eval-run-store.d.ts +0 -1
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.d.ts +8 -0
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +8 -8
- package/dist/internal/github-fanout.d.ts +1 -1
- package/dist/internal/github-fanout.js +1 -1
- package/dist/internal/guest-network.d.ts +101 -0
- package/dist/internal/guest-network.d.ts.map +1 -0
- package/dist/internal/guest-network.js +304 -0
- package/dist/internal/host-otel.d.ts +3 -3
- package/dist/internal/host-otel.d.ts.map +1 -1
- package/dist/internal/host-otel.js +8 -4
- package/dist/internal/hosted-admission-adapter.d.ts +8 -7
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.d.ts +6 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +18 -5
- package/dist/internal/hosted-delivery.d.ts +18 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +248 -118
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +1 -3
- package/dist/internal/init-interview.d.ts.map +1 -1
- package/dist/internal/init-interview.js +1 -3
- package/dist/internal/init-project.d.ts +2 -2
- package/dist/internal/init-project.js +2 -2
- package/dist/internal/inline-stdio-define-stub.d.ts +1 -1
- package/dist/internal/inline-stdio-define-stub.d.ts.map +1 -1
- package/dist/internal/inline-stdio-define-stub.js +1 -1
- package/dist/internal/is-record.d.ts +2 -0
- package/dist/internal/is-record.d.ts.map +1 -0
- package/dist/internal/is-record.js +3 -0
- package/dist/internal/json-schema.d.ts.map +1 -1
- package/dist/internal/json-schema.js +18 -10
- package/dist/internal/local-control-plane.d.ts +1 -2
- package/dist/internal/local-control-plane.d.ts.map +1 -1
- package/dist/internal/local-control-plane.js +3 -20
- package/dist/internal/mcp-endpoint.d.ts.map +1 -1
- package/dist/internal/mcp-endpoint.js +1 -3
- package/dist/internal/otel/collector.d.ts +12 -3
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +77 -125
- package/dist/internal/otel/config.d.ts +0 -2
- package/dist/internal/otel/config.d.ts.map +1 -1
- package/dist/internal/otel/config.js +17 -20
- package/dist/internal/otel/http.d.ts +2 -0
- package/dist/internal/otel/http.d.ts.map +1 -1
- package/dist/internal/otel/http.js +7 -1
- package/dist/internal/otel/mcp.d.ts.map +1 -1
- package/dist/internal/otel/mcp.js +3 -16
- package/dist/internal/otel/runtime.d.ts +26 -1
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +164 -15
- package/dist/internal/package-inline-stdio.d.ts.map +1 -1
- package/dist/internal/package-inline-stdio.js +3 -11
- package/dist/internal/playground/toolchain.d.ts +1 -1
- package/dist/internal/playground/toolchain.d.ts.map +1 -1
- package/dist/internal/playground/toolchain.js +1 -1
- package/dist/internal/request-error-status.d.ts +12 -0
- package/dist/internal/request-error-status.d.ts.map +1 -0
- package/dist/internal/request-error-status.js +52 -0
- package/dist/internal/resolve-prod-target.d.ts +1 -1
- package/dist/internal/resolve-prod-target.d.ts.map +1 -1
- package/dist/internal/resolve-prod-target.js +3 -7
- package/dist/internal/result-output.d.ts +18 -0
- package/dist/internal/result-output.d.ts.map +1 -0
- package/dist/internal/result-output.js +33 -0
- package/dist/internal/run-client.d.ts +2 -2
- package/dist/internal/run-client.js +2 -2
- package/dist/internal/runtime-dispatch-runner.d.ts +1 -11
- package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
- package/dist/internal/runtime-dispatch-runner.js +2 -15
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +3 -6
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +110 -35
- package/dist/internal/session-cost.d.ts +3 -3
- package/dist/internal/session-cost.d.ts.map +1 -1
- package/dist/internal/session-cost.js +3 -3
- package/dist/internal/session-engine.d.ts +26 -11
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +146 -76
- package/dist/internal/session-run-log.d.ts.map +1 -1
- package/dist/internal/session-run-log.js +1 -3
- package/dist/internal/skills-sync.d.ts +1 -4
- package/dist/internal/skills-sync.d.ts.map +1 -1
- package/dist/internal/skills-sync.js +10 -50
- package/dist/internal/sleep.d.ts +2 -0
- package/dist/internal/sleep.d.ts.map +1 -0
- package/dist/internal/sleep.js +3 -0
- package/dist/internal/store-mirror.d.ts +29 -0
- package/dist/internal/store-mirror.d.ts.map +1 -0
- package/dist/internal/store-mirror.js +70 -0
- package/dist/internal/tenant-slack/relay.d.ts +73 -0
- package/dist/internal/tenant-slack/relay.d.ts.map +1 -0
- package/dist/internal/tenant-slack/relay.js +138 -0
- package/dist/internal/testing/scm-continuation-fixtures.d.ts +33 -0
- package/dist/internal/testing/scm-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/scm-continuation-fixtures.js +253 -0
- package/dist/internal/workspace-sync.d.ts +22 -0
- package/dist/internal/workspace-sync.d.ts.map +1 -0
- package/dist/internal/workspace-sync.js +49 -0
- package/dist/internal/workspace.d.ts +7 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +13 -0
- package/dist/otel.d.ts +23 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +93 -2
- package/dist/playground/assets/index-59KvgREd.js +67 -0
- package/dist/playground/assets/index-MbMxXg-y.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/result.d.ts +24 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +27 -0
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +7 -4
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +1 -3
- package/dist/types.d.ts +90 -23
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +2 -2
- package/docs/concepts.md +2 -4
- package/docs/design/runtime-abstraction.md +2 -3
- package/docs/evals.md +9 -7
- package/docs/guides/cloud-agents.md +4 -6
- package/docs/guides/github.md +0 -1
- package/docs/guides/opentelemetry.md +41 -17
- package/docs/reference/agent-config.md +6 -10
- package/docs/reference/channels.md +18 -8
- package/docs/reference/cli.md +3 -4
- package/docs/reference/extensions.md +87 -23
- package/docs/reference/hooks.md +215 -46
- package/docs/reference/playground.md +3 -0
- package/docs/reference/project-layout.md +2 -1
- package/docs/reference/result.md +94 -0
- package/docs/reference/sessions.md +3 -1
- package/docs/reference/tools.md +1 -2
- package/docs/templates/pr-autofixer.md +0 -3
- package/package.json +29 -10
- package/skills/framework-map/SKILL.md +3 -1
- package/skills/otel/SKILL.md +8 -3
- package/src/ab.ts +1 -1
- package/src/bin/agent-serve.ts +121 -21
- package/src/channels/bitbucket/api.ts +623 -0
- package/src/channels/bitbucket/binding.ts +414 -0
- package/src/channels/bitbucket/bitbucket-channel.ts +182 -0
- package/src/channels/bitbucket/bitbucket-webhook.ts +576 -0
- package/src/channels/bitbucket/checks.ts +154 -0
- package/src/channels/bitbucket/cursor-account.ts +117 -0
- package/src/channels/bitbucket/defaults.ts +110 -0
- package/src/channels/bitbucket/events.ts +84 -0
- package/src/channels/bitbucket/index.ts +49 -0
- package/src/channels/bitbucket/replay.ts +439 -0
- package/src/channels/bitbucket/state.ts +59 -0
- package/src/channels/bitbucket/types.ts +266 -0
- package/src/channels/deployments/deployments-channel.ts +25 -43
- package/src/channels/deployments/types.ts +12 -6
- package/src/channels/github/binding.ts +8 -1
- package/src/channels/github/cursor-account.ts +17 -6
- package/src/channels/github/events.ts +1 -1
- package/src/channels/github/forward.ts +3 -2
- package/src/channels/github/github-channel.ts +74 -221
- package/src/channels/github/replay.ts +1 -1
- package/src/channels/github/state.ts +6 -0
- package/src/channels/github/types.ts +2 -5
- package/src/channels/gitlab/api.ts +228 -0
- package/src/channels/gitlab/binding.ts +233 -0
- package/src/channels/gitlab/checks.ts +243 -0
- package/src/channels/gitlab/cursor-account.ts +114 -0
- package/src/channels/gitlab/defaults.ts +93 -0
- package/src/channels/gitlab/events.ts +44 -0
- package/src/channels/gitlab/gitlab-channel.ts +176 -0
- package/src/channels/gitlab/gitlab-webhook.ts +555 -0
- package/src/channels/gitlab/index.ts +43 -0
- package/src/channels/gitlab/replay.ts +347 -0
- package/src/channels/gitlab/state.ts +55 -0
- package/src/channels/gitlab/types.ts +263 -0
- package/src/channels/origin/api.ts +4 -2
- package/src/channels/origin/origin-channel.ts +19 -94
- package/src/channels/origin/types.ts +23 -2
- package/src/channels/slack/eval-directive.ts +1 -6
- package/src/channels/slack/init.ts +6 -3
- package/src/channels/slack/setup.ts +7 -6
- package/src/channels/slack/types.ts +1 -1
- package/src/channels.ts +0 -1
- package/src/client.ts +1 -1
- package/src/connections.ts +1 -1
- package/src/evals.ts +1 -1
- package/src/extensions.ts +47 -5
- package/src/files.ts +21 -3
- package/src/index.ts +20 -28
- package/src/internal/ab-snapshot.ts +0 -3
- package/src/internal/advertise-tools.ts +1 -4
- package/src/internal/authored-alias-hooks.ts +4 -21
- package/src/internal/authored-loaders.ts +6 -23
- package/src/internal/channel-dispatch.ts +160 -0
- package/src/internal/chat-client.ts +1 -1
- package/src/internal/cli-ax.ts +5 -5
- package/src/internal/cli-bitbucket.ts +477 -0
- package/src/internal/cli-convert-automation.ts +7 -7
- package/src/internal/cli-cursor.ts +2 -5
- package/src/internal/cli-deploy.ts +2 -8
- package/src/internal/cli-github.ts +3 -3
- package/src/internal/cli-gitlab.ts +485 -0
- package/src/internal/cli-mcp.ts +2 -7
- package/src/internal/cli-slack.ts +2 -5
- package/src/internal/continuation-channel.ts +82 -1
- package/src/internal/continuation-identity.ts +229 -11
- package/src/internal/conversation-mirror.ts +4 -3
- package/src/internal/convert-automation/types.ts +1 -1
- package/src/internal/cursor/account-mcp.ts +1 -4
- package/src/internal/cursor/backend-client.ts +9 -10
- package/src/internal/cursor/bound-secret-file.ts +108 -0
- package/src/internal/cursor/credentials.ts +75 -10
- package/src/internal/cursor/hosted-bound-secrets.ts +75 -0
- package/src/internal/cursor/hosted-deployment-secrets.ts +42 -11
- package/src/internal/cursor/hosted-store-secrets.ts +1 -1
- package/src/internal/cursor-account-mcp-auth.ts +2 -5
- package/src/internal/cursor-deployment-relay.ts +11 -7
- package/src/internal/deploy-manifest.ts +4 -2
- package/src/internal/discovery/ab.ts +29 -9
- package/src/internal/discovery/agent.ts +94 -135
- package/src/internal/discovery/channels.ts +15 -13
- package/src/internal/discovery/connections.ts +55 -50
- package/src/internal/discovery/cursor-plugin.ts +1 -4
- package/src/internal/discovery/extension-overlay.ts +274 -0
- package/src/internal/discovery/extensions.ts +330 -105
- package/src/internal/discovery/hooks.ts +20 -2
- package/src/internal/discovery/info.ts +7 -0
- package/src/internal/discovery/modules.ts +8 -2
- package/src/internal/discovery/names.ts +2 -1
- package/src/internal/discovery/project.ts +80 -9
- package/src/internal/discovery/runtime.ts +1 -2
- package/src/internal/discovery/schedules.ts +28 -2
- package/src/internal/discovery/services.ts +37 -1
- package/src/internal/discovery/skills.ts +13 -3
- package/src/internal/discovery/subagent.ts +107 -0
- package/src/internal/discovery.ts +0 -2
- package/src/internal/distribution.ts +35 -83
- package/src/internal/docs-site.ts +1 -1
- package/src/internal/eval-run-store.ts +0 -7
- package/src/internal/eval-runner.ts +0 -1
- package/src/internal/framework-file-storage.ts +8 -8
- package/src/internal/github-fanout.ts +1 -1
- package/src/internal/guest-network.ts +383 -0
- package/src/internal/host-otel.ts +8 -4
- package/src/internal/hosted-admission-adapter.ts +8 -8
- package/src/internal/hosted-delivery-protocol.ts +26 -1
- package/src/internal/hosted-delivery.ts +376 -192
- package/src/internal/http-channel.ts +1 -4
- package/src/internal/init-interview.ts +1 -4
- package/src/internal/init-project.ts +2 -2
- package/src/internal/inline-stdio-define-stub.ts +1 -1
- package/src/internal/is-record.ts +3 -0
- package/src/internal/json-schema.ts +19 -10
- package/src/internal/local-control-plane.ts +5 -24
- package/src/internal/mcp-endpoint.ts +1 -4
- package/src/internal/otel/collector.ts +94 -159
- package/src/internal/otel/config.ts +10 -14
- package/src/internal/otel/http.ts +14 -1
- package/src/internal/otel/mcp.ts +3 -16
- package/src/internal/otel/runtime.ts +240 -25
- package/src/internal/package-inline-stdio.ts +3 -12
- package/src/internal/playground/toolchain.ts +1 -1
- package/src/internal/request-error-status.ts +72 -0
- package/src/internal/resolve-prod-target.ts +3 -8
- package/src/internal/result-output.ts +34 -0
- package/src/internal/run-client.ts +2 -2
- package/src/internal/runtime-dispatch-runner.ts +3 -21
- package/src/internal/sdk-runner.ts +3 -7
- package/src/internal/server.ts +153 -44
- package/src/internal/session-cost.ts +3 -3
- package/src/internal/session-engine.ts +182 -74
- package/src/internal/session-run-log.ts +1 -4
- package/src/internal/skills-sync.ts +13 -63
- package/src/internal/sleep.ts +3 -0
- package/src/internal/store-mirror.ts +86 -0
- package/src/internal/tenant-slack/relay.ts +179 -0
- package/src/internal/testing/scm-continuation-fixtures.ts +286 -0
- package/src/internal/workspace-sync.ts +55 -0
- package/src/internal/workspace.ts +14 -0
- package/src/otel.ts +143 -3
- package/src/result.ts +36 -0
- package/src/storage-backends/cursor-hosted.ts +7 -4
- package/src/storage-protocol.ts +1 -4
- package/src/types.ts +105 -34
- package/templates/triage/agent/lib/types.ts +0 -2
- package/dist/continuation.d.ts +0 -20
- package/dist/continuation.d.ts.map +0 -1
- package/dist/continuation.js +0 -18
- package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +0 -1
- package/dist/docs/assets/concepts.md.rPzW2HZN.js +0 -1
- package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +0 -9
- package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.js +0 -9
- package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.lean.js +0 -1
- package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +0 -1
- package/dist/docs/assets/reference_hooks.md.a8BJxMR5.js +0 -14
- package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +0 -1
- package/dist/docs/guides/cloud-runtime.html +0 -35
- package/dist/docs/guides/cloud-runtime.md +0 -117
- package/dist/internal/convert-automation/index.d.ts +0 -3
- package/dist/internal/convert-automation/index.d.ts.map +0 -1
- package/dist/internal/convert-automation/index.js +0 -1
- package/dist/internal/grokbot/runner.d.ts +0 -64
- package/dist/internal/grokbot/runner.d.ts.map +0 -1
- package/dist/internal/grokbot/runner.js +0 -282
- package/dist/internal/managed-delivery.d.ts +0 -80
- package/dist/internal/managed-delivery.d.ts.map +0 -1
- package/dist/internal/managed-delivery.js +0 -86
- package/dist/internal/review-comments.d.ts +0 -370
- package/dist/internal/review-comments.d.ts.map +0 -1
- package/dist/internal/review-comments.js +0 -921
- package/dist/internal/shallow-clone.d.ts +0 -176
- package/dist/internal/shallow-clone.d.ts.map +0 -1
- package/dist/internal/shallow-clone.js +0 -419
- package/dist/playground/assets/index-B6C9S9nG.css +0 -1
- package/dist/playground/assets/index-ZqNoT8Ie.js +0 -69
- package/docs/guides/cloud-runtime.md +0 -122
- package/src/continuation.ts +0 -49
- package/src/internal/convert-automation/index.ts +0 -10
- package/src/internal/grokbot/runner.ts +0 -370
- package/src/internal/managed-delivery.ts +0 -125
- package/src/internal/review-comments.ts +0 -1363
- package/src/internal/shallow-clone.ts +0 -609
- /package/dist/docs/assets/{evals.md.CPzDAwoH.lean.js → evals.md.CbMoebP1.lean.js} +0 -0
- /package/dist/docs/assets/{guides_cloud-agents.md.DumwWXba.lean.js → guides_cloud-agents.md.DS8RIjwx.lean.js} +0 -0
- /package/dist/docs/assets/{guides_github.md.BtPr9GaP.lean.js → guides_github.md.DKYiT9do.lean.js} +0 -0
- /package/dist/docs/assets/{index.md.Kiht7ell.lean.js → index.md.D75GWhPl.lean.js} +0 -0
- /package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.lean.js → reference_agent-config.md.CHNpiyp4.lean.js} +0 -0
- /package/dist/docs/assets/{reference_cli.md.DfoeyvL0.lean.js → reference_cli.md.CJNc_xYK.lean.js} +0 -0
- /package/dist/docs/assets/{reference_playground.md.DnX5nL-B.lean.js → reference_playground.md.4myJPxrf.lean.js} +0 -0
- /package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.lean.js → reference_project-layout.md.DuBu9a96.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.B1up2r9W.lean.js → reference_tools.md.aGrn99hP.lean.js} +0 -0
- /package/dist/docs/assets/{skills_framework-map.md.DDa4MeEW.lean.js → skills_framework-map.md.haibFyoB.lean.js} +0 -0
|
@@ -28,6 +28,9 @@ import { resolveDedicatedSlackHostBinding } from "../channels/slack/slack-channe
|
|
|
28
28
|
import {
|
|
29
29
|
AGENT_SERVE_USER_STORE_FILES_SOURCE_ID,
|
|
30
30
|
agentStoreKeys,
|
|
31
|
+
DEPLOYMENT_STORE_MOUNT_PATH,
|
|
32
|
+
type FileSink,
|
|
33
|
+
USER_STORE_MOUNT_PATH,
|
|
31
34
|
} from "../files.js";
|
|
32
35
|
import {
|
|
33
36
|
cursorHostedFiles,
|
|
@@ -70,6 +73,7 @@ import {
|
|
|
70
73
|
type RunnerTurnRequest,
|
|
71
74
|
type SendMessageFn,
|
|
72
75
|
type SendMessageOptions,
|
|
76
|
+
type SessionContext,
|
|
73
77
|
type SessionEvent,
|
|
74
78
|
type SessionEventPayload,
|
|
75
79
|
type SessionInfo,
|
|
@@ -116,6 +120,7 @@ import {
|
|
|
116
120
|
resolveV2Key,
|
|
117
121
|
V2EngineError,
|
|
118
122
|
} from "./continuation-identity.js";
|
|
123
|
+
import { describeError } from "./describe-error.js";
|
|
119
124
|
import { isDevMode } from "./dev-mode.js";
|
|
120
125
|
import { type EventLogMemoryStats, EventLogStore } from "./event-log.js";
|
|
121
126
|
import { TurnEventMapper } from "./event-mapper.js";
|
|
@@ -152,6 +157,7 @@ import {
|
|
|
152
157
|
SCHEDULE_CHANNEL_PREFIX,
|
|
153
158
|
} from "./prompt-context.js";
|
|
154
159
|
import { assertCloudCanHonorAccountServersFilters } from "./resolved-connections.js";
|
|
160
|
+
import { applyAuthoredResult } from "./result-output.js";
|
|
155
161
|
import type { AgentRunner, SteerAckOutcome } from "./sdk-runner.js";
|
|
156
162
|
import { sessionExternalLinks } from "./session-links.js";
|
|
157
163
|
import { SessionStore } from "./session-store.js";
|
|
@@ -173,16 +179,30 @@ import { resolveAgentV2Hosting } from "./v2-hosting.js";
|
|
|
173
179
|
import {
|
|
174
180
|
buildAgentsMdContent,
|
|
175
181
|
buildCloudMemorySection,
|
|
182
|
+
buildCloudWorkspaceSection,
|
|
176
183
|
ensureOwnGitRoot,
|
|
177
184
|
isNestedInGitRepo,
|
|
178
185
|
materializeWorkspace,
|
|
179
186
|
SERVER_TOOLS_MCP_SERVER_NAME,
|
|
180
187
|
writeWorkspaceFiles,
|
|
181
188
|
} from "./workspace.js";
|
|
189
|
+
import { syncWorkspaceToStore } from "./workspace-sync.js";
|
|
182
190
|
|
|
183
191
|
export const HTTP_CHANNEL_ID = "http";
|
|
184
192
|
export { SCHEDULE_CHANNEL_PREFIX } from "./prompt-context.js";
|
|
185
193
|
|
|
194
|
+
/** Authored surfaces mirrored onto the Agent Store before a first cloud prompt. */
|
|
195
|
+
type CloudSyncSurface = "skills" | "workspace";
|
|
196
|
+
|
|
197
|
+
/** The Agent Store cloud turns read authored files from, and where the VM mounts it. */
|
|
198
|
+
interface CloudStoreTarget {
|
|
199
|
+
sink: FileSink;
|
|
200
|
+
mountPath: string;
|
|
201
|
+
skillsPrefix: string;
|
|
202
|
+
workspacePrefix: string;
|
|
203
|
+
label: string;
|
|
204
|
+
}
|
|
205
|
+
|
|
186
206
|
export class SessionBusyError extends Error {
|
|
187
207
|
constructor(sessionId: string) {
|
|
188
208
|
super(
|
|
@@ -406,8 +426,8 @@ export class SessionEngine {
|
|
|
406
426
|
>();
|
|
407
427
|
/** Once-per-process cache for the A/B snapshot backfill (see abSnapshot). */
|
|
408
428
|
private restoredAbSnapshot: Promise<ABSnapshot | undefined> | undefined;
|
|
409
|
-
/** In-flight
|
|
410
|
-
private
|
|
429
|
+
/** In-flight authored files → Agent Store syncs (see syncToCloudStore). */
|
|
430
|
+
private readonly cloudSyncs = new Map<CloudSyncSurface, Promise<boolean>>();
|
|
411
431
|
|
|
412
432
|
private readonly runner: AgentRunner;
|
|
413
433
|
private readonly logger: (line: string) => void;
|
|
@@ -678,9 +698,9 @@ export class SessionEngine {
|
|
|
678
698
|
}
|
|
679
699
|
|
|
680
700
|
/**
|
|
681
|
-
* Host services with `files` bound to one session, so a relative
|
|
682
|
-
*
|
|
683
|
-
*
|
|
701
|
+
* Host services with `files` and `otel` bound to one session, so a relative
|
|
702
|
+
* path resolves to that session's scope and can never read another
|
|
703
|
+
* session's. Unbound (no session) keeps `host.files` usable for
|
|
684
704
|
* `{ scope: "deployment" }` and fails loudly on session-scoped calls.
|
|
685
705
|
*/
|
|
686
706
|
private hostForSession(sessionId: string | undefined): HostContext {
|
|
@@ -2006,7 +2026,9 @@ export class SessionEngine {
|
|
|
2006
2026
|
this.activeToolContexts.set(sessionId, { record, turnId, emit });
|
|
2007
2027
|
this.stubbedCallIds.set(sessionId, stubbed);
|
|
2008
2028
|
try {
|
|
2009
|
-
outcome = await this.
|
|
2029
|
+
outcome = await this.runTurnExecute(record, turnId, () =>
|
|
2030
|
+
this.runner.runTurn(request)
|
|
2031
|
+
);
|
|
2010
2032
|
} finally {
|
|
2011
2033
|
this.activeToolContexts.delete(sessionId);
|
|
2012
2034
|
this.stubbedCallIds.delete(sessionId);
|
|
@@ -2049,14 +2071,39 @@ export class SessionEngine {
|
|
|
2049
2071
|
outcome = { ...outcome, cost: finalCost };
|
|
2050
2072
|
}
|
|
2051
2073
|
|
|
2074
|
+
const authored = this.project.result;
|
|
2075
|
+
if (outcome.status === "finished" && authored !== undefined) {
|
|
2076
|
+
const settled = await applyAuthoredResult({
|
|
2077
|
+
definition: authored,
|
|
2078
|
+
text: finalResult,
|
|
2079
|
+
dryRun: record.dryRun === true,
|
|
2080
|
+
ctx: {
|
|
2081
|
+
session: this.sessionInfo(record),
|
|
2082
|
+
host: this.hostForSession(sessionId),
|
|
2083
|
+
artifacts: this.artifactsApi({ sessionId, turnId }),
|
|
2084
|
+
stateRoot: this.stateRoot,
|
|
2085
|
+
workspaceDir: harnessCwd,
|
|
2086
|
+
},
|
|
2087
|
+
});
|
|
2088
|
+
if (!settled.ok) {
|
|
2089
|
+
outcome = {
|
|
2090
|
+
status: "error",
|
|
2091
|
+
result: finalResult,
|
|
2092
|
+
errorMessage: `turn output failed: ${settled.message}`,
|
|
2093
|
+
usage: finalUsage,
|
|
2094
|
+
cost: finalCost,
|
|
2095
|
+
};
|
|
2096
|
+
}
|
|
2097
|
+
}
|
|
2098
|
+
|
|
2052
2099
|
if (outcome.status === "finished") {
|
|
2053
2100
|
await this.appendEvent(sessionId, {
|
|
2054
2101
|
type: "turn.completed",
|
|
2055
2102
|
turnId,
|
|
2056
2103
|
data: {
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2104
|
+
result: finalResult,
|
|
2105
|
+
usage: finalUsage,
|
|
2106
|
+
cost: finalCost,
|
|
2060
2107
|
},
|
|
2061
2108
|
});
|
|
2062
2109
|
} else {
|
|
@@ -2098,8 +2145,8 @@ export class SessionEngine {
|
|
|
2098
2145
|
|
|
2099
2146
|
return {
|
|
2100
2147
|
...outcome,
|
|
2101
|
-
|
|
2102
|
-
|
|
2148
|
+
result: finalResult,
|
|
2149
|
+
usage: finalUsage,
|
|
2103
2150
|
};
|
|
2104
2151
|
}
|
|
2105
2152
|
|
|
@@ -2110,48 +2157,75 @@ export class SessionEngine {
|
|
|
2110
2157
|
* first-turn S3 scan can discover them. False when the sync fails: the
|
|
2111
2158
|
* turn then runs without store skills rather than pointing discovery at
|
|
2112
2159
|
* paths that do not exist.
|
|
2113
|
-
|
|
2114
|
-
|
|
2160
|
+
*/
|
|
2161
|
+
private ensureCloudSkillsSynced(store: CloudStoreTarget): Promise<boolean> {
|
|
2162
|
+
const skills = this.project.agent.skills;
|
|
2163
|
+
return this.syncToCloudStore("skills", store, skills.length > 0, () =>
|
|
2164
|
+
syncSkillsToStore({
|
|
2165
|
+
sink: store.sink,
|
|
2166
|
+
agentName: this.project.name,
|
|
2167
|
+
skills,
|
|
2168
|
+
skillsPrefix: store.skillsPrefix,
|
|
2169
|
+
})
|
|
2170
|
+
);
|
|
2171
|
+
}
|
|
2172
|
+
|
|
2173
|
+
/**
|
|
2174
|
+
* Sync `agent/sandbox/workspace/**` seeds onto the Agent Store at
|
|
2175
|
+
* `workspace/…` (hosted) or `agent-serve/<agent>/workspace/…`
|
|
2176
|
+
* (personal-key local+cloud) before the first cloud prompt, which names
|
|
2177
|
+
* the mounted directory (see buildCloudWorkspaceSection).
|
|
2178
|
+
*/
|
|
2179
|
+
private ensureCloudWorkspaceSynced(
|
|
2180
|
+
store: CloudStoreTarget
|
|
2181
|
+
): Promise<boolean> {
|
|
2182
|
+
const seedFiles = this.project.agent.seedFiles;
|
|
2183
|
+
return this.syncToCloudStore("workspace", store, seedFiles.length > 0, () =>
|
|
2184
|
+
syncWorkspaceToStore({
|
|
2185
|
+
sink: store.sink,
|
|
2186
|
+
seedFiles,
|
|
2187
|
+
workspacePrefix: store.workspacePrefix,
|
|
2188
|
+
})
|
|
2189
|
+
);
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
/**
|
|
2193
|
+
* With files authored, every first cloud turn re-copies the authored
|
|
2115
2194
|
* bytes and the memo only dedupes concurrent first turns. The mount is
|
|
2116
2195
|
* writable from cloud sessions, so a once-per-process copy would let one
|
|
2117
2196
|
* session's edits masquerade as agent definition for every later session
|
|
2118
2197
|
* until the engine restarts; re-syncing keeps the store true to discovery
|
|
2119
2198
|
* the same way local materialization always rewrites skills. Without
|
|
2120
|
-
*
|
|
2121
|
-
* process is enough, success or not — a deployment without the files
|
|
2199
|
+
* authored files the sync is best-effort stale cleanup and one attempt
|
|
2200
|
+
* per process is enough, success or not — a deployment without the files
|
|
2122
2201
|
* surface must not fail and log on every new session for a feature it
|
|
2123
2202
|
* does not use.
|
|
2124
2203
|
*/
|
|
2125
|
-
private
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2204
|
+
private syncToCloudStore(
|
|
2205
|
+
surface: CloudSyncSurface,
|
|
2206
|
+
store: CloudStoreTarget,
|
|
2207
|
+
authored: boolean,
|
|
2208
|
+
run: () => Promise<void>
|
|
2209
|
+
): Promise<boolean> {
|
|
2210
|
+
const inFlight = this.cloudSyncs.get(surface);
|
|
2211
|
+
if (inFlight !== undefined) {
|
|
2212
|
+
return inFlight;
|
|
2133
2213
|
}
|
|
2134
|
-
|
|
2135
|
-
let sync = syncSkillsToStore({
|
|
2136
|
-
sink: target.sink,
|
|
2137
|
-
agentName: this.project.name,
|
|
2138
|
-
skills,
|
|
2139
|
-
skillsPrefix: target.skillsPrefix,
|
|
2140
|
-
}).then(
|
|
2214
|
+
let sync = run().then(
|
|
2141
2215
|
() => true,
|
|
2142
2216
|
(error) => {
|
|
2143
2217
|
this.logger(
|
|
2144
|
-
`[
|
|
2218
|
+
`[${surface}] ${store.label} sync failed: ${error instanceof Error ? error.message : String(error)}`
|
|
2145
2219
|
);
|
|
2146
2220
|
return false;
|
|
2147
2221
|
}
|
|
2148
2222
|
);
|
|
2149
|
-
if (
|
|
2223
|
+
if (authored) {
|
|
2150
2224
|
sync = sync.finally(() => {
|
|
2151
|
-
this.
|
|
2225
|
+
this.cloudSyncs.delete(surface);
|
|
2152
2226
|
});
|
|
2153
2227
|
}
|
|
2154
|
-
this.
|
|
2228
|
+
this.cloudSyncs.set(surface, sync);
|
|
2155
2229
|
return sync;
|
|
2156
2230
|
}
|
|
2157
2231
|
|
|
@@ -2159,39 +2233,36 @@ export class SessionEngine {
|
|
|
2159
2233
|
* Hosted deployments own the deployment store. Local `serve`/`run` with
|
|
2160
2234
|
* a personal API key writes into the USER store under `agent-serve/`.
|
|
2161
2235
|
*/
|
|
2162
|
-
private
|
|
2163
|
-
| {
|
|
2164
|
-
sink: ReturnType<typeof cursorHostedFiles>;
|
|
2165
|
-
skillsPrefix: string;
|
|
2166
|
-
label: string;
|
|
2167
|
-
}
|
|
2168
|
-
| undefined {
|
|
2236
|
+
private cloudStore(): CloudStoreTarget | undefined {
|
|
2169
2237
|
const v2Hosting = resolveAgentV2Hosting({
|
|
2170
2238
|
architecture: this.project.agent.architecture,
|
|
2171
2239
|
});
|
|
2240
|
+
const deployment = {
|
|
2241
|
+
mountPath: DEPLOYMENT_STORE_MOUNT_PATH,
|
|
2242
|
+
skillsPrefix: agentStoreKeys.skillsPrefix(),
|
|
2243
|
+
workspacePrefix: agentStoreKeys.workspacePrefix(),
|
|
2244
|
+
label: "deployment store",
|
|
2245
|
+
};
|
|
2172
2246
|
if (v2Hosting.kind === "cursor-managed") {
|
|
2173
2247
|
return {
|
|
2174
2248
|
sink: cursorHostedFiles({
|
|
2175
2249
|
resolveStoreSourceId: () =>
|
|
2176
2250
|
v2Hosting.resolveStoreIds().deploymentStoreSourceId,
|
|
2177
2251
|
}),
|
|
2178
|
-
|
|
2179
|
-
label: "deployment store",
|
|
2252
|
+
...deployment,
|
|
2180
2253
|
};
|
|
2181
2254
|
}
|
|
2182
2255
|
if (v2Hosting.kind === "not-v2" && isCursorHostedFilesAvailable()) {
|
|
2183
|
-
return {
|
|
2184
|
-
sink: cursorHostedFiles(),
|
|
2185
|
-
skillsPrefix: agentStoreKeys.skillsPrefix(),
|
|
2186
|
-
label: "deployment store",
|
|
2187
|
-
};
|
|
2256
|
+
return { sink: cursorHostedFiles(), ...deployment };
|
|
2188
2257
|
}
|
|
2189
2258
|
if (isCursorUserStoreFilesAvailable()) {
|
|
2190
2259
|
return {
|
|
2191
2260
|
sink: cursorHostedFiles({
|
|
2192
2261
|
storeSourceId: AGENT_SERVE_USER_STORE_FILES_SOURCE_ID,
|
|
2193
2262
|
}),
|
|
2263
|
+
mountPath: USER_STORE_MOUNT_PATH,
|
|
2194
2264
|
skillsPrefix: agentStoreKeys.userSkillsPrefix(this.project.name),
|
|
2265
|
+
workspacePrefix: agentStoreKeys.userWorkspacePrefix(this.project.name),
|
|
2195
2266
|
label: "user store",
|
|
2196
2267
|
};
|
|
2197
2268
|
}
|
|
@@ -2263,13 +2334,14 @@ export class SessionEngine {
|
|
|
2263
2334
|
if (isFirstTurn) {
|
|
2264
2335
|
if (runtime === "cloud") {
|
|
2265
2336
|
// Cloud VMs have no materialized workspace: ship the full context,
|
|
2266
|
-
// including agent tool script bodies.
|
|
2267
|
-
//
|
|
2268
|
-
//
|
|
2269
|
-
//
|
|
2270
|
-
//
|
|
2271
|
-
//
|
|
2272
|
-
//
|
|
2337
|
+
// including agent tool script bodies. Authored skills and workspace
|
|
2338
|
+
// seeds land on the store mount (skills for native discovery, seeds
|
|
2339
|
+
// for the model's file tools), and on hosted deployments the shared
|
|
2340
|
+
// memory journal is on that mount too — say where. When the turn
|
|
2341
|
+
// carries the session-bound server-tool MCP endpoint, the preamble
|
|
2342
|
+
// catalogs server tools under that MCP server name *before* the
|
|
2343
|
+
// agent-tool "write the script if missing" recipe, so a model told
|
|
2344
|
+
// to "use <server tool>" calls MCP instead of inventing a .sh.
|
|
2273
2345
|
const preamble = buildAgentsMdContent(agent, {
|
|
2274
2346
|
includeScripts: true,
|
|
2275
2347
|
serverToolsMcpName:
|
|
@@ -2278,17 +2350,30 @@ export class SessionEngine {
|
|
|
2278
2350
|
: SERVER_TOOLS_MCP_SERVER_NAME,
|
|
2279
2351
|
});
|
|
2280
2352
|
const hosted = isCursorHostedFilesAvailable();
|
|
2281
|
-
// Synced whenever a store is reachable, not just when skills
|
|
2282
|
-
// removing the last
|
|
2283
|
-
//
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2353
|
+
// Synced whenever a store is reachable, not just when skills or
|
|
2354
|
+
// seeds exist: removing the last one has to delete its store copies
|
|
2355
|
+
// too.
|
|
2356
|
+
const store =
|
|
2357
|
+
hosted || isCursorUserStoreFilesAvailable()
|
|
2358
|
+
? this.cloudStore()
|
|
2359
|
+
: undefined;
|
|
2360
|
+
let sections = "";
|
|
2361
|
+
if (store !== undefined) {
|
|
2362
|
+
const [, seedsSynced] = await Promise.all([
|
|
2363
|
+
this.ensureCloudSkillsSynced(store),
|
|
2364
|
+
this.ensureCloudWorkspaceSynced(store),
|
|
2365
|
+
]);
|
|
2366
|
+
// Only name the mount when the bytes landed; a failed sync must
|
|
2367
|
+
// not send the model looking for files that are not there.
|
|
2368
|
+
if (seedsSynced && agent.seedFiles.length > 0) {
|
|
2369
|
+
const dir = `${store.mountPath}/${store.workspacePrefix}`;
|
|
2370
|
+
sections += `\n\n${buildCloudWorkspaceSection(dir)}`;
|
|
2371
|
+
}
|
|
2287
2372
|
}
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
turnPrompt = `${preamble}${
|
|
2373
|
+
if (hosted) {
|
|
2374
|
+
sections += `\n\n${buildCloudMemorySection(this.project.name)}`;
|
|
2375
|
+
}
|
|
2376
|
+
turnPrompt = `${preamble}${sections}\n\n${turnPrompt}`;
|
|
2292
2377
|
} else if (runtime === "local" && instructionsInvisibleToHarness) {
|
|
2293
2378
|
// Local workspace whose AGENTS.md the harness will not load. With a
|
|
2294
2379
|
// borrowed harness cwd, agent tool scripts live only in the durable
|
|
@@ -2880,6 +2965,31 @@ export class SessionEngine {
|
|
|
2880
2965
|
}
|
|
2881
2966
|
}
|
|
2882
2967
|
|
|
2968
|
+
/**
|
|
2969
|
+
* Bind outbound inject (Factory / Cursor API `traceparent`) to the
|
|
2970
|
+
* turn span for the whole harness run. Host files / VFS RPCs happen
|
|
2971
|
+
* here, not under `runInCall`. No-op when OTel is off.
|
|
2972
|
+
*/
|
|
2973
|
+
private runTurnExecute<T>(
|
|
2974
|
+
record: SessionRecord,
|
|
2975
|
+
turnId: string,
|
|
2976
|
+
fn: () => T | Promise<T>
|
|
2977
|
+
): Promise<T> {
|
|
2978
|
+
const otel = this.otel;
|
|
2979
|
+
const run = (): Promise<T> => Promise.resolve(fn());
|
|
2980
|
+
if (otel === undefined) {
|
|
2981
|
+
return run();
|
|
2982
|
+
}
|
|
2983
|
+
return otel.runInTurn(
|
|
2984
|
+
{
|
|
2985
|
+
sessionId: record.sessionId,
|
|
2986
|
+
session: this.sessionInfo(record),
|
|
2987
|
+
turnId,
|
|
2988
|
+
},
|
|
2989
|
+
run
|
|
2990
|
+
);
|
|
2991
|
+
}
|
|
2992
|
+
|
|
2883
2993
|
/**
|
|
2884
2994
|
* Bind outbound inject (Factory / Cursor API `traceparent`) to the
|
|
2885
2995
|
* tool span. No-op when OTel is off.
|
|
@@ -4011,7 +4121,10 @@ export class SessionEngine {
|
|
|
4011
4121
|
return;
|
|
4012
4122
|
}
|
|
4013
4123
|
|
|
4014
|
-
const sessionCtx = {
|
|
4124
|
+
const sessionCtx: SessionContext = {
|
|
4125
|
+
session: this.sessionInfo(record),
|
|
4126
|
+
host: this.hostForSession(record.sessionId),
|
|
4127
|
+
};
|
|
4015
4128
|
const channelEvents = this.channelEventHandlersFor(record.channelId);
|
|
4016
4129
|
if (channelEvents !== undefined) {
|
|
4017
4130
|
// Handlers are declared against the narrowed event for their key; the
|
|
@@ -4054,14 +4167,13 @@ export class SessionEngine {
|
|
|
4054
4167
|
}
|
|
4055
4168
|
try {
|
|
4056
4169
|
await handler(event, {
|
|
4170
|
+
...sessionCtx,
|
|
4057
4171
|
agent: { name: this.project.name },
|
|
4058
4172
|
channel: {
|
|
4059
4173
|
id: record.channelId,
|
|
4060
4174
|
continuationToken: record.continuationKey,
|
|
4061
4175
|
},
|
|
4062
|
-
session: this.sessionInfo(record),
|
|
4063
4176
|
stateRoot: this.stateRoot,
|
|
4064
|
-
host: this.hostForSession(record.sessionId),
|
|
4065
4177
|
artifacts: this.artifactsApi({
|
|
4066
4178
|
sessionId: record.sessionId,
|
|
4067
4179
|
turnId: event.turnId,
|
|
@@ -4078,12 +4190,12 @@ export class SessionEngine {
|
|
|
4078
4190
|
if (this.abCollector.enabled) {
|
|
4079
4191
|
await this.abCollector.onEvent(
|
|
4080
4192
|
event,
|
|
4081
|
-
|
|
4193
|
+
sessionCtx.session,
|
|
4082
4194
|
this.project.name
|
|
4083
4195
|
);
|
|
4084
4196
|
}
|
|
4085
4197
|
|
|
4086
|
-
this.otel?.onEvent(event,
|
|
4198
|
+
this.otel?.onEvent(event, sessionCtx.session);
|
|
4087
4199
|
}
|
|
4088
4200
|
|
|
4089
4201
|
private channelEventHandlersFor(
|
|
@@ -5191,10 +5303,6 @@ function buildRunnerSubagents(agent: ResolvedAgent): RunnerSubagent[] {
|
|
|
5191
5303
|
}));
|
|
5192
5304
|
}
|
|
5193
5305
|
|
|
5194
|
-
function describeError(error: unknown): string {
|
|
5195
|
-
return error instanceof Error ? error.message : String(error);
|
|
5196
|
-
}
|
|
5197
|
-
|
|
5198
5306
|
function toolErrorResult(message: string): SDKCustomToolResult {
|
|
5199
5307
|
return {
|
|
5200
5308
|
content: [{ type: "text", text: message }],
|
|
@@ -26,6 +26,7 @@ import type { AgentProject } from "../types.js";
|
|
|
26
26
|
import { resolveApiKeySync } from "./cursor/credentials.js";
|
|
27
27
|
import { describeError } from "./describe-error.js";
|
|
28
28
|
import type { HostedExecutionDiagAbortReason } from "./hosted-execution-diag.js";
|
|
29
|
+
import { isRecord } from "./is-record.js";
|
|
29
30
|
import type { LogRingEntry } from "./log-ring.js";
|
|
30
31
|
import { resolveAgentV2Hosting } from "./v2-hosting.js";
|
|
31
32
|
|
|
@@ -193,10 +194,6 @@ export function snapshotSessionRunLogs(
|
|
|
193
194
|
}));
|
|
194
195
|
}
|
|
195
196
|
|
|
196
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
197
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
197
|
function decodeSinkBody(body: Uint8Array | { body: Uint8Array }): Uint8Array {
|
|
201
198
|
return body instanceof Uint8Array ? body : body.body;
|
|
202
199
|
}
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { readFile } from "node:fs/promises";
|
|
10
|
-
import {
|
|
11
|
-
import { agentStoreKeys, FileConflictError, type FileSink } from "../files.js";
|
|
10
|
+
import { agentStoreKeys, type FileSink } from "../files.js";
|
|
12
11
|
import { STORAGE_KEY_ROOT } from "../storage.js";
|
|
13
12
|
import type { DiscoveredSkill, SkillFileSource } from "../types.js";
|
|
13
|
+
import { mirrorToStore, storeRelPath } from "./store-mirror.js";
|
|
14
14
|
import { buildSkillMd } from "./workspace.js";
|
|
15
15
|
|
|
16
16
|
/** Pre-native layout. Deleted on every sync so a rolled-forward deploy does not leave undiscoverable copies. */
|
|
@@ -22,10 +22,7 @@ function legacySkillsPrefix(agent: string): string {
|
|
|
22
22
|
* Mirror the agent's skills onto the store: write every SKILL.md (with the
|
|
23
23
|
* same generated frontmatter local materialization uses) plus sibling files,
|
|
24
24
|
* and delete keys no authored skill claims so redeploys drop removed skills.
|
|
25
|
-
*
|
|
26
|
-
* Everything loads and validates before the store is touched, and writes
|
|
27
|
-
* land before stale deletes, so a failed sync never leaves a gap a
|
|
28
|
-
* concurrent cloud reader could see.
|
|
25
|
+
* Everything loads and validates before the store is touched.
|
|
29
26
|
*/
|
|
30
27
|
export async function syncSkillsToStore(args: {
|
|
31
28
|
sink: FileSink;
|
|
@@ -42,65 +39,18 @@ export async function syncSkillsToStore(args: {
|
|
|
42
39
|
agentStoreKeys.skillFile(skill.name, relPath, skillsPrefix);
|
|
43
40
|
desired.set(key("SKILL.md"), Buffer.from(buildSkillMd(skill), "utf8"));
|
|
44
41
|
for (const [relPath, source] of Object.entries(skill.files)) {
|
|
45
|
-
desired.set(
|
|
42
|
+
desired.set(
|
|
43
|
+
key(storeRelPath(relPath, "skill file")),
|
|
44
|
+
await sourceBytes(source)
|
|
45
|
+
);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
await
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
args.
|
|
53
|
-
|
|
54
|
-
]);
|
|
55
|
-
await Promise.all(
|
|
56
|
-
[...existing.filter((entry) => !desired.has(entry.key)), ...leftover].map(
|
|
57
|
-
(entry) => args.sink.delete(entry.key)
|
|
58
|
-
)
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Same refusals as local materialization's `resolveInside`: a rel that
|
|
64
|
-
* escapes the skill directory or would not round-trip through the FUSE
|
|
65
|
-
* mount (`..`, `.`, `//`, absolute) fails the sync, exactly as it fails a
|
|
66
|
-
* local turn's workspace write. Backslashes are refused too — the store
|
|
67
|
-
* normalizes `\` to `/` on write, so the stored key would differ from the
|
|
68
|
-
* desired one and the stale pass would delete the file it just wrote.
|
|
69
|
-
*/
|
|
70
|
-
function storeRelPath(relPath: string): string {
|
|
71
|
-
if (
|
|
72
|
-
relPath.includes("\0") ||
|
|
73
|
-
relPath.includes("\\") ||
|
|
74
|
-
posix.isAbsolute(relPath) ||
|
|
75
|
-
relPath.endsWith("/") ||
|
|
76
|
-
relPath.split("/").some((seg) => seg === ".." || seg === ".") ||
|
|
77
|
-
posix.normalize(relPath) !== relPath
|
|
78
|
-
) {
|
|
79
|
-
throw new Error(
|
|
80
|
-
`Refusing skill file path "${relPath}" (must be a normalized relative path)`
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
return relPath;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Last writer wins. A raced conditional put (dual engine pods during a
|
|
88
|
-
* deploy rollover) clears the sink's cached etag, so one retry re-learns
|
|
89
|
-
* the current version and lands.
|
|
90
|
-
*/
|
|
91
|
-
async function putLastWriterWins(
|
|
92
|
-
sink: FileSink,
|
|
93
|
-
key: string,
|
|
94
|
-
body: Uint8Array
|
|
95
|
-
): Promise<void> {
|
|
96
|
-
try {
|
|
97
|
-
await sink.put(key, body);
|
|
98
|
-
} catch (error) {
|
|
99
|
-
if (!(error instanceof FileConflictError)) {
|
|
100
|
-
throw error;
|
|
101
|
-
}
|
|
102
|
-
await sink.put(key, body);
|
|
103
|
-
}
|
|
48
|
+
await mirrorToStore({
|
|
49
|
+
sink: args.sink,
|
|
50
|
+
prefix: skillsPrefix,
|
|
51
|
+
desired,
|
|
52
|
+
legacyPrefixes: [legacySkillsPrefix(args.agentName)],
|
|
53
|
+
});
|
|
104
54
|
}
|
|
105
55
|
|
|
106
56
|
async function sourceBytes(source: SkillFileSource): Promise<Uint8Array> {
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mirror an authored file tree onto an Agent Store prefix. Shared by the
|
|
3
|
+
* skills and workspace seed syncs so both keep the same write-then-sweep
|
|
4
|
+
* discipline and the same path refusals.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { posix } from "node:path";
|
|
8
|
+
import { FileConflictError, type FileSink } from "../files.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Write every `desired` key, then delete keys under `prefix` (and the
|
|
12
|
+
* `legacyPrefixes`) that nothing claims, so a redeploy drops removed files.
|
|
13
|
+
* Writes land before stale deletes, so a failed sync never leaves a gap a
|
|
14
|
+
* concurrent cloud reader could see.
|
|
15
|
+
*/
|
|
16
|
+
export async function mirrorToStore(args: {
|
|
17
|
+
sink: FileSink;
|
|
18
|
+
prefix: string;
|
|
19
|
+
desired: ReadonlyMap<string, Uint8Array>;
|
|
20
|
+
/** Pre-native layouts emptied on every sync so a rolled-forward deploy does not leave undiscoverable copies. */
|
|
21
|
+
legacyPrefixes?: readonly string[];
|
|
22
|
+
}): Promise<void> {
|
|
23
|
+
await Promise.all(
|
|
24
|
+
[...args.desired].map(([key, body]) =>
|
|
25
|
+
putLastWriterWins(args.sink, key, body)
|
|
26
|
+
)
|
|
27
|
+
);
|
|
28
|
+
const listed = await Promise.all(
|
|
29
|
+
[args.prefix, ...(args.legacyPrefixes ?? [])].map((prefix) =>
|
|
30
|
+
args.sink.list(prefix)
|
|
31
|
+
)
|
|
32
|
+
);
|
|
33
|
+
await Promise.all(
|
|
34
|
+
listed
|
|
35
|
+
.flat()
|
|
36
|
+
.filter((entry) => !args.desired.has(entry.key))
|
|
37
|
+
.map((entry) => args.sink.delete(entry.key))
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Same refusals as local materialization's `resolveInside`: a rel that
|
|
43
|
+
* escapes its directory or would not round-trip through the FUSE mount
|
|
44
|
+
* (`..`, `.`, `//`, absolute) fails the sync, exactly as it fails a local
|
|
45
|
+
* turn's workspace write. Backslashes are refused too — the store
|
|
46
|
+
* normalizes `\` to `/` on write, so the stored key would differ from the
|
|
47
|
+
* desired one and the stale pass would delete the file it just wrote.
|
|
48
|
+
*/
|
|
49
|
+
export function storeRelPath(
|
|
50
|
+
relPath: string,
|
|
51
|
+
what: "skill file" | "workspace file"
|
|
52
|
+
): string {
|
|
53
|
+
if (
|
|
54
|
+
relPath.includes("\0") ||
|
|
55
|
+
relPath.includes("\\") ||
|
|
56
|
+
posix.isAbsolute(relPath) ||
|
|
57
|
+
relPath.endsWith("/") ||
|
|
58
|
+
relPath.split("/").some((seg) => seg === ".." || seg === ".") ||
|
|
59
|
+
posix.normalize(relPath) !== relPath
|
|
60
|
+
) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Refusing ${what} path "${relPath}" (must be a normalized relative path)`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return relPath;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Last writer wins. A raced conditional put (dual engine pods during a
|
|
70
|
+
* deploy rollover) clears the sink's cached etag, so one retry re-learns
|
|
71
|
+
* the current version and lands.
|
|
72
|
+
*/
|
|
73
|
+
async function putLastWriterWins(
|
|
74
|
+
sink: FileSink,
|
|
75
|
+
key: string,
|
|
76
|
+
body: Uint8Array
|
|
77
|
+
): Promise<void> {
|
|
78
|
+
try {
|
|
79
|
+
await sink.put(key, body);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (!(error instanceof FileConflictError)) {
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
await sink.put(key, body);
|
|
85
|
+
}
|
|
86
|
+
}
|