@cursor/july 0.1.30 → 0.1.32
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 +1 -1
- package/README.md +10 -5
- package/dist/bin/agent-serve.js +4 -4
- package/dist/channels/github/index.d.ts +1 -1
- package/dist/channels/github/index.js +1 -1
- package/dist/channels/slack/bot-mentions.d.ts +1 -1
- package/dist/channels/slack/bot-mentions.d.ts.map +1 -1
- package/dist/channels/slack/bot-mentions.js +1 -1
- package/dist/channels/slack/eval-directive.js +1 -1
- package/dist/channels/slack/external-policy.d.ts +1 -1
- package/dist/channels/slack/external-policy.js +1 -1
- package/dist/channels/slack/log.d.ts +1 -1
- package/dist/channels/slack/log.js +1 -1
- package/dist/channels/slack/post-update-delivery.d.ts +85 -0
- package/dist/channels/slack/post-update-delivery.d.ts.map +1 -0
- package/dist/channels/slack/setup.js +1 -1
- package/dist/channels/slack/socket-mode.js +1 -1
- package/dist/docs/404.html +3 -3
- package/dist/docs/ab.html +11 -11
- package/dist/docs/assets/{ab.md.BMCZ6Hd7.js → ab.md.DAQoJ-up.js} +6 -6
- package/dist/docs/assets/{ab.md.BMCZ6Hd7.lean.js → ab.md.DAQoJ-up.lean.js} +1 -1
- package/dist/docs/assets/{app.Cm4lsMc4.js → app.C2aVczmo.js} +1 -1
- package/dist/docs/assets/building-with-agents.md.CnHqvYDd.js +13 -0
- package/dist/docs/assets/{building-with-agents.md.CJCtZCyi.lean.js → building-with-agents.md.CnHqvYDd.lean.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.xgMnlUSO.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CYUFXspH.js → VPLocalSearchBox.DLEzetbD.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CTjkX9vc.js → theme.BkOH1oMp.js} +2 -2
- package/dist/docs/assets/concepts.md.DFaQEFkA.js +4 -0
- package/dist/docs/assets/concepts.md.DFaQEFkA.lean.js +1 -0
- package/dist/docs/assets/deployment.md.9MYBuKM1.js +55 -0
- package/dist/docs/assets/deployment.md.9MYBuKM1.lean.js +1 -0
- package/dist/docs/assets/{evals.md.DYOjkRCX.js → evals.md.BIUoVZ6X.js} +13 -13
- package/dist/docs/assets/evals.md.BIUoVZ6X.lean.js +1 -0
- package/dist/docs/assets/{example-agents_approval-buddy.md.DFGBYLcc.js → example-agents_approval-buddy.md.BhEfleVx.js} +4 -4
- package/dist/docs/assets/{example-agents_approval-buddy.md.DFGBYLcc.lean.js → example-agents_approval-buddy.md.BhEfleVx.lean.js} +1 -1
- package/dist/docs/assets/example-agents_benny.md.2Et1qa8f.js +7 -0
- package/dist/docs/assets/{example-agents_bugbot.md.DelIdhxB.js → example-agents_bugbot.md.ByUexi5i.js} +5 -5
- package/dist/docs/assets/{example-agents_codebase-wiki.md.DC6sgwn0.js → example-agents_codebase-wiki.md.B4y-7ZVW.js} +6 -6
- package/dist/docs/assets/{example-agents_codebase-wiki.md.DC6sgwn0.lean.js → example-agents_codebase-wiki.md.B4y-7ZVW.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_codeowners-review.md.Ku_tG2RY.js → example-agents_codeowners-review.md.D6ay4nvf.js} +6 -6
- package/dist/docs/assets/{example-agents_codeowners-review.md.Ku_tG2RY.lean.js → example-agents_codeowners-review.md.D6ay4nvf.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_concierge.md.4rQTSMXt.js → example-agents_concierge.md.lL8rhYlj.js} +7 -7
- package/dist/docs/assets/{example-agents_fsd.md.CzgUrDfi.js → example-agents_fsd.md.DfNKQTHz.js} +5 -5
- package/dist/docs/assets/example-agents_index.md.DgGBwckv.js +2 -0
- package/dist/docs/assets/example-agents_index.md.DgGBwckv.lean.js +1 -0
- package/dist/docs/assets/{example-agents_knowledge-base.md.BPJiVueF.js → example-agents_knowledge-base.md.CzyZ2DCr.js} +5 -5
- package/dist/docs/assets/{example-agents_knowledge-base.md.BPJiVueF.lean.js → example-agents_knowledge-base.md.CzyZ2DCr.lean.js} +1 -1
- package/dist/docs/assets/example-agents_oncall.md.wFFXXEyW.js +10 -0
- package/dist/docs/assets/{example-agents_security-reviewer.md.Dhj_m7_B.js → example-agents_security-reviewer.md.Dkf1gyo6.js} +8 -8
- package/dist/docs/assets/example-agents_slack-agent.md.DvgvT4nn.js +5 -0
- package/dist/docs/assets/example-agents_weather-agent.md.Dmrcphhl.js +24 -0
- package/dist/docs/assets/example-agents_weather-agent.md.Dmrcphhl.lean.js +1 -0
- package/dist/docs/assets/{guides_agent-to-agent.md.Bpzgq2Pq.js → guides_agent-to-agent.md.Bmbxy-FA.js} +4 -4
- package/dist/docs/assets/guides_cloud-runtime.md.BZ2GA7Es.js +9 -0
- package/dist/docs/assets/{guides_github.md.DOOCpqsW.js → guides_github.md.R2QlpR75.js} +5 -5
- package/dist/docs/assets/{guides_human-in-the-loop.md.DlUqsp1S.js → guides_human-in-the-loop.md.BWvT7UqY.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.Dd8EgSem.js → guides_mcp-oauth.md.C7G7IykG.js} +5 -5
- package/dist/docs/assets/guides_mcp-oauth.md.C7G7IykG.lean.js +1 -0
- package/dist/docs/assets/guides_slack.md.zriQpU_9.js +47 -0
- package/dist/docs/assets/guides_slack.md.zriQpU_9.lean.js +1 -0
- package/dist/docs/assets/{guides_webhooks.md.wSOYas3X.js → guides_webhooks.md.DiAwSR42.js} +1 -1
- package/dist/docs/assets/{hillclimbing.md.DHNast08.js → hillclimbing.md.D9Y1_bYh.js} +1 -1
- package/dist/docs/assets/index.md.CZqbBJPB.js +20 -0
- package/dist/docs/assets/index.md.CZqbBJPB.lean.js +1 -0
- package/dist/docs/assets/{quickstart.md.BU6Iwi_9.js → quickstart.md.TnEXYgYW.js} +12 -12
- package/dist/docs/assets/{reference_agent-config.md.DrW2JUM8.js → reference_agent-config.md.kuN6-OxK.js} +1 -1
- package/dist/docs/assets/reference_cli.md.sD-IUWjg.js +73 -0
- package/dist/docs/assets/{reference_cli.md.ccoKOoXt.lean.js → reference_cli.md.sD-IUWjg.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.B9Q3TOve.js → reference_connections.md.DGqAsFXb.js} +3 -3
- package/dist/docs/assets/reference_http-api.md.CfVM_ICa.js +11 -0
- package/dist/docs/assets/{reference_project-layout.md.Bd_CKtNS.js → reference_project-layout.md.D8E6ZmHJ.js} +4 -4
- package/dist/docs/assets/{reference_project-layout.md.Bd_CKtNS.lean.js → reference_project-layout.md.D8E6ZmHJ.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.w_F2mXB6.js → reference_schedules.md.gmfYzf_I.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.DLd6mvbv.js → reference_sessions.md.C_ouF_uf.js} +3 -3
- package/dist/docs/assets/{reference_tools.md.BRSDnTbN.js → reference_tools.md.BswAQM41.js} +3 -3
- package/dist/docs/assets/{scaffolding-agents.md.C3pTrmoE.js → scaffolding-agents.md.Bsr9Pwzu.js} +1 -1
- package/dist/docs/assets/{scaffolding-agents.md.C3pTrmoE.lean.js → scaffolding-agents.md.Bsr9Pwzu.lean.js} +1 -1
- package/dist/docs/assets/{storage.md.DRTdnFvd.js → storage.md.xZoiGM58.js} +3 -3
- package/dist/docs/assets/storage.md.xZoiGM58.lean.js +1 -0
- package/dist/docs/assets/troubleshooting.md.B5RVX_tL.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.CmQkmnzC.lean.js → troubleshooting.md.B5RVX_tL.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +12 -12
- package/dist/docs/concepts.html +6 -6
- package/dist/docs/deployment.html +32 -32
- package/dist/docs/evals.html +19 -19
- package/dist/docs/example-agents/approval-buddy.html +9 -9
- package/dist/docs/example-agents/benny.html +11 -11
- package/dist/docs/example-agents/bugbot.html +10 -10
- package/dist/docs/example-agents/codebase-wiki.html +11 -11
- package/dist/docs/example-agents/codeowners-review.html +11 -11
- package/dist/docs/example-agents/concierge.html +12 -12
- package/dist/docs/example-agents/fsd.html +10 -10
- package/dist/docs/example-agents/index.html +7 -7
- package/dist/docs/example-agents/knowledge-base.html +10 -10
- package/dist/docs/example-agents/oncall.html +10 -10
- package/dist/docs/example-agents/security-reviewer.html +13 -13
- package/dist/docs/example-agents/slack-agent.html +10 -10
- package/dist/docs/example-agents/weather-agent.html +16 -16
- package/dist/docs/guides/agent-to-agent.html +9 -9
- package/dist/docs/guides/cloud-runtime.html +7 -7
- package/dist/docs/guides/github.html +10 -10
- package/dist/docs/guides/human-in-the-loop.html +7 -7
- package/dist/docs/guides/mcp-oauth.html +11 -11
- package/dist/docs/guides/slack.html +22 -17
- package/dist/docs/guides/webhooks.html +7 -7
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +7 -7
- package/dist/docs/index.html +9 -9
- package/dist/docs/quickstart.html +17 -17
- package/dist/docs/reference/agent-config.html +7 -7
- package/dist/docs/reference/channels.html +5 -5
- package/dist/docs/reference/cli.html +56 -48
- package/dist/docs/reference/connections.html +9 -9
- package/dist/docs/reference/hooks.html +5 -5
- package/dist/docs/reference/http-api.html +7 -7
- package/dist/docs/reference/instructions.html +5 -5
- package/dist/docs/reference/playground.html +5 -5
- package/dist/docs/reference/project-layout.html +9 -9
- package/dist/docs/reference/prompt.html +5 -5
- package/dist/docs/reference/schedules.html +7 -7
- package/dist/docs/reference/sessions.html +8 -8
- package/dist/docs/reference/skills.html +5 -5
- package/dist/docs/reference/subagents.html +5 -5
- package/dist/docs/reference/tools.html +9 -9
- package/dist/docs/scaffolding-agents.html +6 -6
- package/dist/docs/storage.html +9 -9
- package/dist/docs/troubleshooting.html +6 -6
- package/dist/evals/reporters.d.ts +1 -1
- package/dist/evals/reporters.js +1 -1
- package/dist/evals.d.ts +2 -2
- package/dist/files-backends/agent-store-presigned-url.d.ts +3 -0
- package/dist/files-backends/agent-store-presigned-url.d.ts.map +1 -0
- package/dist/files-backends/agent-store-presigned-url.js +1023 -0
- package/dist/files-backends/cursor-hosted.d.ts +87 -0
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -0
- package/dist/files-backends/cursor-hosted.js +563 -0
- package/dist/files-backends/local-fs.d.ts +33 -0
- package/dist/files-backends/local-fs.d.ts.map +1 -0
- package/dist/files-backends/local-fs.js +199 -0
- package/dist/files.d.ts +139 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +89 -0
- package/dist/internal/ab-collector.js +2 -2
- package/dist/internal/ab-fold.js +1 -1
- package/dist/internal/cli-ax.d.ts +2 -2
- package/dist/internal/cli-ax.js +2 -2
- package/dist/internal/cli-deploy.d.ts +1 -1
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +7 -2
- package/dist/internal/cli-docs.d.ts +1 -1
- package/dist/internal/cli-docs.js +1 -1
- package/dist/internal/cli-github.js +13 -13
- package/dist/internal/cli-mcp-oauth.d.ts +1 -1
- package/dist/internal/cli-mcp-oauth.js +2 -2
- package/dist/internal/cli-mcp.d.ts +3 -3
- package/dist/internal/cli-mcp.js +4 -4
- package/dist/internal/cli-skills.js +1 -1
- package/dist/internal/cloud-turn-cost.d.ts +9 -1
- package/dist/internal/cloud-turn-cost.d.ts.map +1 -1
- package/dist/internal/cloud-turn-cost.js +14 -4
- package/dist/internal/cursor/account-mcp.js +5 -5
- package/dist/internal/cursor/backend-client.js +1 -1
- package/dist/internal/cursor/github-credentials.js +3 -3
- package/dist/internal/cursor-account-mcp-auth.d.ts +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +1 -1
- package/dist/internal/cursor-event-relay.js +1 -1
- package/dist/internal/cursor-relay-core.d.ts +1 -1
- package/dist/internal/cursor-relay-core.d.ts.map +1 -1
- package/dist/internal/cursor-slack-relay.js +1 -1
- package/dist/internal/deploy-client.d.ts +6 -1
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +3 -2
- package/dist/internal/deploy-source.d.ts +2 -2
- package/dist/internal/deploy-source.js +2 -2
- package/dist/internal/discovery.js +2 -2
- package/dist/internal/distribution.d.ts +5 -5
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +6 -6
- package/dist/internal/docs-site.js +5 -5
- package/dist/internal/eval-run-store.js +8 -8
- package/dist/internal/evals-client.d.ts +1 -1
- package/dist/internal/evals-client.js +1 -1
- package/dist/internal/github-fanout.js +2 -2
- package/dist/internal/host-files.d.ts +29 -0
- package/dist/internal/host-files.d.ts.map +1 -0
- package/dist/internal/host-files.js +283 -0
- package/dist/internal/host-platforms.js +5 -5
- package/dist/internal/hosting.d.ts +1 -1
- package/dist/internal/hosting.js +1 -1
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +26 -0
- package/dist/internal/install-cursor-skills.d.ts +1 -1
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +33 -4
- package/dist/internal/json-dir-store.d.ts +32 -0
- package/dist/internal/json-dir-store.d.ts.map +1 -0
- package/dist/internal/local-control-plane.js +2 -2
- package/dist/internal/logs-client.d.ts +2 -2
- package/dist/internal/logs-client.js +2 -2
- package/dist/internal/mcp-endpoint.js +1 -1
- package/dist/internal/mcp-oauth.js +2 -2
- package/dist/internal/persistence-coordinator.d.ts +127 -0
- package/dist/internal/persistence-coordinator.d.ts.map +1 -0
- package/dist/internal/platform-schedule-sync.js +2 -2
- package/dist/internal/playground/toolchain.js +6 -6
- package/dist/internal/reminder-runner.js +13 -13
- package/dist/internal/resolved-connections.js +6 -6
- package/dist/internal/schedule-runner.js +1 -1
- package/dist/internal/sdk-runner.js +5 -5
- package/dist/internal/server.js +16 -16
- package/dist/internal/session-cost.d.ts +3 -2
- package/dist/internal/session-cost.d.ts.map +1 -1
- package/dist/internal/session-cost.js +7 -6
- package/dist/internal/session-engine.d.ts +31 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +119 -31
- package/dist/internal/slack-provision-client.js +1 -1
- package/dist/internal/storage-coordinator.js +7 -7
- package/dist/internal/trajectory.js +2 -2
- package/dist/internal/turn-cost.d.ts +27 -0
- package/dist/internal/turn-cost.d.ts.map +1 -0
- package/dist/internal/turn-cost.js +83 -0
- package/dist/internal/update-check.d.ts +3 -3
- package/dist/internal/update-check.d.ts.map +1 -1
- package/dist/internal/update-check.js +5 -5
- package/dist/memory.d.ts +1 -1
- package/dist/memory.js +1 -1
- package/dist/multi-tenant.d.ts +80 -0
- package/dist/multi-tenant.d.ts.map +1 -0
- package/dist/multi-tenant.js +69 -0
- package/dist/persistence.d.ts +184 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/playground/assets/index-50PKeJlG.css +1 -0
- package/dist/playground/assets/index-C0f2Wl1q.js +85 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage.d.ts +1 -1
- package/dist/storage.js +1 -1
- package/dist/types.d.ts +120 -16
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +23 -23
- package/docs/ab.md +12 -12
- package/docs/building-with-agents.md +9 -9
- package/docs/concepts.md +11 -11
- package/docs/deployment.md +55 -43
- package/docs/evals.md +20 -20
- package/docs/example-agents/approval-buddy.md +9 -9
- package/docs/example-agents/benny.md +13 -13
- package/docs/example-agents/bugbot.md +6 -6
- package/docs/example-agents/codebase-wiki.md +8 -8
- package/docs/example-agents/codeowners-review.md +8 -8
- package/docs/example-agents/concierge.md +10 -10
- package/docs/example-agents/fsd.md +7 -7
- package/docs/example-agents/index.md +8 -8
- package/docs/example-agents/knowledge-base.md +9 -9
- package/docs/example-agents/oncall.md +7 -7
- package/docs/example-agents/security-reviewer.md +12 -12
- package/docs/example-agents/slack-agent.md +10 -10
- package/docs/example-agents/weather-agent.md +30 -26
- package/docs/guides/agent-to-agent.md +4 -4
- package/docs/guides/cloud-runtime.md +3 -3
- package/docs/guides/github.md +6 -6
- package/docs/guides/human-in-the-loop.md +1 -1
- package/docs/guides/mcp-oauth.md +9 -9
- package/docs/guides/slack.md +94 -21
- package/docs/guides/webhooks.md +1 -1
- package/docs/hillclimbing.md +3 -3
- package/docs/quickstart.md +18 -18
- package/docs/reference/agent-config.md +1 -1
- package/docs/reference/cli.md +110 -79
- package/docs/reference/connections.md +3 -3
- package/docs/reference/http-api.md +2 -2
- package/docs/reference/project-layout.md +7 -7
- package/docs/reference/schedules.md +1 -1
- package/docs/reference/sessions.md +7 -7
- package/docs/reference/tools.md +3 -3
- package/docs/scaffolding-agents.md +2 -2
- package/docs/storage.md +5 -5
- package/docs/troubleshooting.md +11 -10
- package/package.json +5 -2
- package/skills/ab/SKILL.md +5 -5
- package/skills/create-agent/SKILL.md +17 -17
- package/skills/debug/SKILL.md +10 -10
- package/skills/evals/SKILL.md +13 -13
- package/skills/framework-map/SKILL.md +3 -3
- package/skills/github/SKILL.md +11 -11
- package/skills/hillclimb/SKILL.md +9 -9
- package/skills/mcp-auth/SKILL.md +11 -11
- package/skills/setup-slack/SKILL.md +28 -28
- package/src/bin/agent-serve.ts +4 -4
- package/src/channels/github/index.ts +1 -1
- package/src/channels/slack/bot-mentions.ts +1 -1
- package/src/channels/slack/eval-directive.ts +1 -1
- package/src/channels/slack/external-policy.ts +1 -1
- package/src/channels/slack/log.ts +1 -1
- package/src/channels/slack/setup.ts +1 -1
- package/src/channels/slack/socket-mode.ts +1 -1
- package/src/evals/reporters.ts +1 -1
- package/src/evals.ts +2 -2
- package/src/files-backends/agent-store-presigned-url.ts +8 -0
- package/src/files-backends/cursor-hosted.ts +724 -0
- package/src/files-backends/local-fs.ts +178 -0
- package/src/files.ts +195 -0
- package/src/internal/ab-collector.ts +2 -2
- package/src/internal/ab-fold.ts +1 -1
- package/src/internal/cli-ax.ts +2 -2
- package/src/internal/cli-deploy.ts +7 -2
- package/src/internal/cli-docs.ts +1 -1
- package/src/internal/cli-github.ts +13 -13
- package/src/internal/cli-mcp-oauth.ts +2 -2
- package/src/internal/cli-mcp.ts +4 -4
- package/src/internal/cli-skills.ts +1 -1
- package/src/internal/cloud-turn-cost.ts +20 -4
- package/src/internal/cursor/account-mcp.ts +5 -5
- package/src/internal/cursor/backend-client.ts +1 -1
- package/src/internal/cursor/github-credentials.ts +3 -3
- package/src/internal/cursor-account-mcp-auth.ts +1 -1
- package/src/internal/cursor-event-relay.ts +1 -1
- package/src/internal/cursor-relay-core.ts +1 -1
- package/src/internal/cursor-slack-relay.ts +1 -1
- package/src/internal/deploy-client.ts +8 -2
- package/src/internal/deploy-source.ts +2 -2
- package/src/internal/discovery.ts +2 -2
- package/src/internal/distribution.ts +6 -6
- package/src/internal/docs-site.ts +5 -5
- package/src/internal/eval-run-store.ts +8 -8
- package/src/internal/evals-client.ts +1 -1
- package/src/internal/github-fanout.ts +2 -2
- package/src/internal/host-files.ts +372 -0
- package/src/internal/host-platforms.ts +5 -5
- package/src/internal/hosting.ts +1 -1
- package/src/internal/http-channel.ts +30 -0
- package/src/internal/install-cursor-skills.ts +31 -3
- package/src/internal/local-control-plane.ts +2 -2
- package/src/internal/logs-client.ts +2 -2
- package/src/internal/mcp-endpoint.ts +1 -1
- package/src/internal/mcp-oauth.ts +2 -2
- package/src/internal/platform-schedule-sync.ts +2 -2
- package/src/internal/playground/toolchain.ts +6 -6
- package/src/internal/reminder-runner.ts +13 -13
- package/src/internal/resolved-connections.ts +6 -6
- package/src/internal/schedule-runner.ts +1 -1
- package/src/internal/sdk-runner.ts +5 -5
- package/src/internal/server.ts +16 -16
- package/src/internal/session-cost.ts +7 -6
- package/src/internal/session-engine.ts +141 -28
- package/src/internal/slack-provision-client.ts +1 -1
- package/src/internal/storage-coordinator.ts +7 -7
- package/src/internal/trajectory.ts +2 -2
- package/src/internal/turn-cost.ts +110 -0
- package/src/internal/update-check.ts +6 -6
- package/src/memory.ts +1 -1
- package/src/storage.ts +1 -1
- package/src/types.ts +148 -16
- package/dist/docs/assets/building-with-agents.md.CJCtZCyi.js +0 -13
- package/dist/docs/assets/chunks/@localSearchIndexroot.CbQshWFK.js +0 -1
- package/dist/docs/assets/concepts.md.Cfb9b-k1.js +0 -4
- package/dist/docs/assets/concepts.md.Cfb9b-k1.lean.js +0 -1
- package/dist/docs/assets/deployment.md.TecHo0_2.js +0 -55
- package/dist/docs/assets/deployment.md.TecHo0_2.lean.js +0 -1
- package/dist/docs/assets/evals.md.DYOjkRCX.lean.js +0 -1
- package/dist/docs/assets/example-agents_benny.md.B0gjhI-p.js +0 -7
- package/dist/docs/assets/example-agents_index.md.D2PEVSXl.js +0 -2
- package/dist/docs/assets/example-agents_index.md.D2PEVSXl.lean.js +0 -1
- package/dist/docs/assets/example-agents_oncall.md.BG_sUMly.js +0 -10
- package/dist/docs/assets/example-agents_slack-agent.md.buLbgvBf.js +0 -5
- package/dist/docs/assets/example-agents_weather-agent.md.C9Qv-W0o.js +0 -24
- package/dist/docs/assets/example-agents_weather-agent.md.C9Qv-W0o.lean.js +0 -1
- package/dist/docs/assets/guides_cloud-runtime.md.gVzabdQL.js +0 -9
- package/dist/docs/assets/guides_mcp-oauth.md.Dd8EgSem.lean.js +0 -1
- package/dist/docs/assets/guides_slack.md.CjmJSvZS.js +0 -42
- package/dist/docs/assets/guides_slack.md.CjmJSvZS.lean.js +0 -1
- package/dist/docs/assets/index.md.CH_s5uZe.js +0 -20
- package/dist/docs/assets/index.md.CH_s5uZe.lean.js +0 -1
- package/dist/docs/assets/reference_cli.md.ccoKOoXt.js +0 -65
- package/dist/docs/assets/reference_http-api.md.BncLd3PZ.js +0 -11
- package/dist/docs/assets/storage.md.DRTdnFvd.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.CmQkmnzC.js +0 -1
- package/dist/internal/model-pricing.d.ts +0 -49
- package/dist/internal/model-pricing.d.ts.map +0 -1
- package/dist/internal/model-pricing.js +0 -377
- package/dist/playground/assets/index-CquRB-l0.js +0 -85
- package/dist/playground/assets/index-Dj0bWpkn.css +0 -1
- package/src/internal/model-pricing.ts +0 -426
- /package/dist/docs/assets/{example-agents_benny.md.B0gjhI-p.lean.js → example-agents_benny.md.2Et1qa8f.lean.js} +0 -0
- /package/dist/docs/assets/{example-agents_bugbot.md.DelIdhxB.lean.js → example-agents_bugbot.md.ByUexi5i.lean.js} +0 -0
- /package/dist/docs/assets/{example-agents_concierge.md.4rQTSMXt.lean.js → example-agents_concierge.md.lL8rhYlj.lean.js} +0 -0
- /package/dist/docs/assets/{example-agents_fsd.md.CzgUrDfi.lean.js → example-agents_fsd.md.DfNKQTHz.lean.js} +0 -0
- /package/dist/docs/assets/{example-agents_oncall.md.BG_sUMly.lean.js → example-agents_oncall.md.wFFXXEyW.lean.js} +0 -0
- /package/dist/docs/assets/{example-agents_security-reviewer.md.Dhj_m7_B.lean.js → example-agents_security-reviewer.md.Dkf1gyo6.lean.js} +0 -0
- /package/dist/docs/assets/{example-agents_slack-agent.md.buLbgvBf.lean.js → example-agents_slack-agent.md.DvgvT4nn.lean.js} +0 -0
- /package/dist/docs/assets/{guides_agent-to-agent.md.Bpzgq2Pq.lean.js → guides_agent-to-agent.md.Bmbxy-FA.lean.js} +0 -0
- /package/dist/docs/assets/{guides_cloud-runtime.md.gVzabdQL.lean.js → guides_cloud-runtime.md.BZ2GA7Es.lean.js} +0 -0
- /package/dist/docs/assets/{guides_github.md.DOOCpqsW.lean.js → guides_github.md.R2QlpR75.lean.js} +0 -0
- /package/dist/docs/assets/{guides_human-in-the-loop.md.DlUqsp1S.lean.js → guides_human-in-the-loop.md.BWvT7UqY.lean.js} +0 -0
- /package/dist/docs/assets/{guides_webhooks.md.wSOYas3X.lean.js → guides_webhooks.md.DiAwSR42.lean.js} +0 -0
- /package/dist/docs/assets/{hillclimbing.md.DHNast08.lean.js → hillclimbing.md.D9Y1_bYh.lean.js} +0 -0
- /package/dist/docs/assets/{quickstart.md.BU6Iwi_9.lean.js → quickstart.md.TnEXYgYW.lean.js} +0 -0
- /package/dist/docs/assets/{reference_agent-config.md.DrW2JUM8.lean.js → reference_agent-config.md.kuN6-OxK.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.B9Q3TOve.lean.js → reference_connections.md.DGqAsFXb.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.BncLd3PZ.lean.js → reference_http-api.md.CfVM_ICa.lean.js} +0 -0
- /package/dist/docs/assets/{reference_schedules.md.w_F2mXB6.lean.js → reference_schedules.md.gmfYzf_I.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.DLd6mvbv.lean.js → reference_sessions.md.C_ouF_uf.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.BRSDnTbN.lean.js → reference_tools.md.BswAQM41.lean.js} +0 -0
|
@@ -118,7 +118,7 @@ export class EvalRunStore {
|
|
|
118
118
|
this.abortByRunId.set(runId, abort);
|
|
119
119
|
this.pruneOldRuns(config);
|
|
120
120
|
this.persist(snapshot);
|
|
121
|
-
this.logger(`[
|
|
121
|
+
this.logger(`[agent-sdk] eval run ${runId}: starting ${cases.length} case(s)`);
|
|
122
122
|
void this.execute(runId, Object.assign(Object.assign(Object.assign({ baseUrl: loopbackUrl, evals: selected, config, signal: abort.signal }, (input.bearerToken === undefined
|
|
123
123
|
? {}
|
|
124
124
|
: { bearerToken: input.bearerToken })), (input.verbose === undefined ? {} : { verbose: input.verbose })), (input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs })));
|
|
@@ -149,7 +149,7 @@ export class EvalRunStore {
|
|
|
149
149
|
if (this.activeRunId === runId) {
|
|
150
150
|
this.activeRunId = undefined;
|
|
151
151
|
}
|
|
152
|
-
this.logger(`[
|
|
152
|
+
this.logger(`[agent-sdk] eval run ${runId}: cancelled`);
|
|
153
153
|
return run;
|
|
154
154
|
});
|
|
155
155
|
}
|
|
@@ -203,14 +203,14 @@ export class EvalRunStore {
|
|
|
203
203
|
config = (yield discoverEvals(this.projectRoot)).config;
|
|
204
204
|
}
|
|
205
205
|
catch (error) {
|
|
206
|
-
this.logger(`[
|
|
206
|
+
this.logger(`[agent-sdk] eval discovery failed during hydrate (pruning with defaults): ${error instanceof Error ? error.message : String(error)}`);
|
|
207
207
|
}
|
|
208
208
|
this.pruneOldRuns(config);
|
|
209
|
-
this.logger(`[
|
|
209
|
+
this.logger(`[agent-sdk] hydrated ${this.runs.size} playground eval run(s) from storage`);
|
|
210
210
|
}
|
|
211
211
|
catch (error) {
|
|
212
212
|
const message = error instanceof Error ? error.message : String(error);
|
|
213
|
-
this.logger(`[
|
|
213
|
+
this.logger(`[agent-sdk] failed to hydrate playground eval runs: ${message}`);
|
|
214
214
|
}
|
|
215
215
|
finally {
|
|
216
216
|
this.hydrated = true;
|
|
@@ -324,7 +324,7 @@ export class EvalRunStore {
|
|
|
324
324
|
run.status = "completed";
|
|
325
325
|
run.finishedAt = new Date().toISOString();
|
|
326
326
|
this.persist(run);
|
|
327
|
-
this.logger(`[
|
|
327
|
+
this.logger(`[agent-sdk] eval run ${runId}: done — ${run.summary.passed} passed, ${run.summary.failed} failed`);
|
|
328
328
|
}
|
|
329
329
|
catch (error) {
|
|
330
330
|
const run = this.runs.get(runId);
|
|
@@ -335,14 +335,14 @@ export class EvalRunStore {
|
|
|
335
335
|
if (opts.signal.aborted || message === "cancelled") {
|
|
336
336
|
markCancelledRun(run);
|
|
337
337
|
this.persist(run);
|
|
338
|
-
this.logger(`[
|
|
338
|
+
this.logger(`[agent-sdk] eval run ${runId}: cancelled`);
|
|
339
339
|
return;
|
|
340
340
|
}
|
|
341
341
|
run.status = "failed";
|
|
342
342
|
run.finishedAt = new Date().toISOString();
|
|
343
343
|
run.error = message;
|
|
344
344
|
this.persist(run);
|
|
345
|
-
this.logger(`[
|
|
345
|
+
this.logger(`[agent-sdk] eval run ${runId}: failed — ${run.error}`);
|
|
346
346
|
}
|
|
347
347
|
finally {
|
|
348
348
|
this.abortByRunId.delete(runId);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HTTP client for playground eval batches (`/v1/dev/evals/runs`).
|
|
3
3
|
*
|
|
4
|
-
* Used by `
|
|
4
|
+
* Used by `agent-sdk eval --prod` (or `--url`) so the batch runs on the serve
|
|
5
5
|
* process and is mirrored to `defineStorage` when an `evals` table is
|
|
6
6
|
* configured. Without those flags, eval keeps the in-process ephemeral path
|
|
7
7
|
* in `cli-ax.ts`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HTTP client for playground eval batches (`/v1/dev/evals/runs`).
|
|
3
3
|
*
|
|
4
|
-
* Used by `
|
|
4
|
+
* Used by `agent-sdk eval --prod` (or `--url`) so the batch runs on the serve
|
|
5
5
|
* process and is mirrored to `defineStorage` when an `evals` table is
|
|
6
6
|
* configured. Without those flags, eval keeps the in-process ephemeral path
|
|
7
7
|
* in `cli-ax.ts`.
|
|
@@ -105,13 +105,13 @@ export function fanoutDelivery(body_1, headers_1, targets_1) {
|
|
|
105
105
|
body: payload,
|
|
106
106
|
});
|
|
107
107
|
if (!response.ok) {
|
|
108
|
-
log(`[
|
|
108
|
+
log(`[agent-sdk] delivery to ${label} failed: HTTP ${response.status}\n`);
|
|
109
109
|
return;
|
|
110
110
|
}
|
|
111
111
|
delivered.push(label);
|
|
112
112
|
}
|
|
113
113
|
catch (error) {
|
|
114
|
-
log(`[
|
|
114
|
+
log(`[agent-sdk] delivery to ${label} failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
115
115
|
}
|
|
116
116
|
})));
|
|
117
117
|
if (recipients.length > 0 && delivered.length === 0) {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Author-facing durable file storage for {@link HostContext.files}.
|
|
3
|
+
*
|
|
4
|
+
* On Cursor-managed hosting the bytes live in the deployment's durable
|
|
5
|
+
* store; otherwise they land under `--state-root/files` on local disk, which
|
|
6
|
+
* is what makes `host.files` work self-hosted with no storage service at all.
|
|
7
|
+
*
|
|
8
|
+
* Everything that decides *which* bytes an author may reach lives here rather
|
|
9
|
+
* than in the sink: scope selection, path validation, and key minting through
|
|
10
|
+
* {@link fileKeys}. A sink only ever sees a fully-qualified opaque key, so an
|
|
11
|
+
* authored sink — including one a customer wrote against their own Dropbox —
|
|
12
|
+
* cannot be steered into another deployment's or another session's files.
|
|
13
|
+
*/
|
|
14
|
+
import { type FileSink } from "../files.js";
|
|
15
|
+
import type { HostFilesApi } from "../types.js";
|
|
16
|
+
export interface CreateHostFilesApiOptions {
|
|
17
|
+
agentName: string;
|
|
18
|
+
/** Local disk root for the default sink. Required unless `sink` is supplied. */
|
|
19
|
+
stateRoot?: string;
|
|
20
|
+
/** Explicit sink override (tests). Omitted → hosted store or local disk. */
|
|
21
|
+
sink?: FileSink;
|
|
22
|
+
/** Session bound for `scope: "session"` calls; prefer {@link HostFilesApi.forSession}. */
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
/** Environment consulted when choosing the default sink (tests). */
|
|
25
|
+
env?: NodeJS.ProcessEnv;
|
|
26
|
+
}
|
|
27
|
+
/** Build the host file API for one agent process. */
|
|
28
|
+
export declare function createHostFilesApi(options: CreateHostFilesApiOptions): HostFilesApi;
|
|
29
|
+
//# sourceMappingURL=host-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-files.d.ts","sourceRoot":"","sources":["../../src/internal/host-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAGL,KAAK,QAAQ,EAId,MAAM,aAAa,CAAC;AAMrB,OAAO,KAAK,EAGV,YAAY,EAGb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,YAAY,CASd"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Author-facing durable file storage for {@link HostContext.files}.
|
|
3
|
+
*
|
|
4
|
+
* On Cursor-managed hosting the bytes live in the deployment's durable
|
|
5
|
+
* store; otherwise they land under `--state-root/files` on local disk, which
|
|
6
|
+
* is what makes `host.files` work self-hosted with no storage service at all.
|
|
7
|
+
*
|
|
8
|
+
* Everything that decides *which* bytes an author may reach lives here rather
|
|
9
|
+
* than in the sink: scope selection, path validation, and key minting through
|
|
10
|
+
* {@link fileKeys}. A sink only ever sees a fully-qualified opaque key, so an
|
|
11
|
+
* authored sink — including one a customer wrote against their own Dropbox —
|
|
12
|
+
* cannot be steered into another deployment's or another session's files.
|
|
13
|
+
*/
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
import { join, normalize, sep } from "node:path";
|
|
24
|
+
import { FilePathRejectedError, FileSessionRequiredError, FileTooLargeError, fileKeys, } from "../files.js";
|
|
25
|
+
import { cursorHostedFiles, isCursorHostedFilesAvailable, } from "../files-backends/cursor-hosted.js";
|
|
26
|
+
import { localFiles } from "../files-backends/local-fs.js";
|
|
27
|
+
/** Build the host file API for one agent process. */
|
|
28
|
+
export function createHostFilesApi(options) {
|
|
29
|
+
var _a;
|
|
30
|
+
const sink = (_a = options.sink) !== null && _a !== void 0 ? _a : createDefaultSink(options);
|
|
31
|
+
return createBoundHostFilesApi(Object.assign({ agentName: options.agentName, sink }, (options.sessionId === undefined
|
|
32
|
+
? {}
|
|
33
|
+
: { sessionId: options.sessionId })));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Pick the default sink.
|
|
37
|
+
*
|
|
38
|
+
* On Cursor-managed hosting the durable store is the only correct answer —
|
|
39
|
+
* falling back to pod-local disk there would accept writes that vanish with
|
|
40
|
+
* the pod, which is the failure this surface exists to remove. Off hosting,
|
|
41
|
+
* local disk keeps `serve --dev`, replay, fixtures, and evals working with no
|
|
42
|
+
* storage service. This is the gate all six hosted agents write by hand in
|
|
43
|
+
* their `agent/storage.ts`; resolving it here means authors do not repeat it.
|
|
44
|
+
*/
|
|
45
|
+
function createDefaultSink(options) {
|
|
46
|
+
var _a;
|
|
47
|
+
if (isCursorHostedFilesAvailable((_a = options.env) !== null && _a !== void 0 ? _a : process.env)) {
|
|
48
|
+
return cursorHostedFiles();
|
|
49
|
+
}
|
|
50
|
+
if (options.stateRoot === undefined) {
|
|
51
|
+
throw new Error("createHostFilesApi needs a stateRoot for the default local-disk sink, or an explicit sink");
|
|
52
|
+
}
|
|
53
|
+
return localFiles({
|
|
54
|
+
filesRoot: join(options.stateRoot, "files"),
|
|
55
|
+
stripKeyPrefix: localKeyPrefix(options.agentName),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** On-disk layout drops the framework key prefix so paths stay navigable. */
|
|
59
|
+
function localKeyPrefix(agentName) {
|
|
60
|
+
return fileKeys.deploymentPrefix(agentName).replace(/deployment\/$/, "");
|
|
61
|
+
}
|
|
62
|
+
function createBoundHostFilesApi(state) {
|
|
63
|
+
var _a;
|
|
64
|
+
const sinkCaps = (_a = state.sink.capabilities) !== null && _a !== void 0 ? _a : {};
|
|
65
|
+
const capabilities = Object.assign({ conflictDetection: sinkCaps.etags === true, materialized: sinkCaps.materialized === true &&
|
|
66
|
+
typeof state.sink.materializedPath === "function" }, (sinkCaps.maxBytes === undefined ? {} : { maxBytes: sinkCaps.maxBytes }));
|
|
67
|
+
const keyFor = (path, scope) => mintKey(state, path, scope);
|
|
68
|
+
const api = {
|
|
69
|
+
capabilities,
|
|
70
|
+
forSession(sessionId) {
|
|
71
|
+
const trimmed = sessionId.trim();
|
|
72
|
+
if (trimmed === "") {
|
|
73
|
+
throw new FileSessionRequiredError("host.files.forSession requires a non-empty session id");
|
|
74
|
+
}
|
|
75
|
+
return createBoundHostFilesApi(Object.assign(Object.assign({}, state), { sessionId: trimmed }));
|
|
76
|
+
},
|
|
77
|
+
read(path, options) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
var _a;
|
|
80
|
+
const bytes = yield api.readBytes(path, options);
|
|
81
|
+
return bytes === undefined
|
|
82
|
+
? undefined
|
|
83
|
+
: Buffer.from(bytes).toString((_a = options === null || options === void 0 ? void 0 : options.encoding) !== null && _a !== void 0 ? _a : "utf8");
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
readBytes(path, options) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
const found = yield state.sink.get(keyFor(path, options === null || options === void 0 ? void 0 : options.scope));
|
|
89
|
+
if (found === undefined) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
return found instanceof Uint8Array ? found : found.body;
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
write(path, data, options) {
|
|
96
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
const key = keyFor(path, options === null || options === void 0 ? void 0 : options.scope);
|
|
98
|
+
const body = typeof data === "string"
|
|
99
|
+
? Buffer.from(data, "utf8")
|
|
100
|
+
: Buffer.from(data);
|
|
101
|
+
const maxBytes = capabilities.maxBytes;
|
|
102
|
+
if (maxBytes !== undefined && body.byteLength > maxBytes) {
|
|
103
|
+
throw new FileTooLargeError(key, body.byteLength, maxBytes);
|
|
104
|
+
}
|
|
105
|
+
yield state.sink.put(key, body, (options === null || options === void 0 ? void 0 : options.ifMatch) === undefined
|
|
106
|
+
? undefined
|
|
107
|
+
: { ifMatch: options.ifMatch });
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
remove(path, options) {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
yield state.sink.delete(keyFor(path, options === null || options === void 0 ? void 0 : options.scope));
|
|
113
|
+
});
|
|
114
|
+
},
|
|
115
|
+
exists(path, options) {
|
|
116
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
+
return (yield api.stat(path, options)) !== undefined;
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
stat(path, options) {
|
|
121
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
const key = keyFor(path, options === null || options === void 0 ? void 0 : options.scope);
|
|
123
|
+
const entry = yield statKey(state.sink, key);
|
|
124
|
+
if (entry === undefined) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
return Object.assign(Object.assign({ size: entry.size }, (entry.mtimeMs === undefined ? {} : { mtimeMs: entry.mtimeMs })), (entry.etag === undefined ? {} : { etag: entry.etag }));
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
list(prefix, options) {
|
|
131
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
132
|
+
const scopePrefix = mintPrefix(state, options === null || options === void 0 ? void 0 : options.scope);
|
|
133
|
+
const rel = prefix === undefined ? "" : normalizeRelPath(prefix, true);
|
|
134
|
+
const entries = yield state.sink.list(`${scopePrefix}${rel}`);
|
|
135
|
+
const out = [];
|
|
136
|
+
for (const entry of entries) {
|
|
137
|
+
if (!entry.key.startsWith(scopePrefix)) {
|
|
138
|
+
// A sink that widens the prefix must not leak keys from another
|
|
139
|
+
// scope through a listing.
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
out.push(Object.assign({ path: entry.key.slice(scopePrefix.length), size: entry.size }, (entry.mtimeMs === undefined ? {} : { mtimeMs: entry.mtimeMs })));
|
|
143
|
+
}
|
|
144
|
+
return out.sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
|
|
145
|
+
});
|
|
146
|
+
},
|
|
147
|
+
materializedPath(path, options) {
|
|
148
|
+
var _a, _b;
|
|
149
|
+
if (!capabilities.materialized) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
return (_b = (_a = state.sink).materializedPath) === null || _b === void 0 ? void 0 : _b.call(_a, keyFor(path, options === null || options === void 0 ? void 0 : options.scope));
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
return api;
|
|
156
|
+
}
|
|
157
|
+
function statKey(sink, key) {
|
|
158
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
159
|
+
if (typeof sink.stat === "function") {
|
|
160
|
+
return yield sink.stat(key);
|
|
161
|
+
}
|
|
162
|
+
const entries = yield sink.list(key);
|
|
163
|
+
return entries.find((entry) => entry.key === key);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// ============================================================================
|
|
167
|
+
// Key minting
|
|
168
|
+
// ============================================================================
|
|
169
|
+
function mintKey(state, path, scope) {
|
|
170
|
+
const rel = normalizeRelPath(path, false);
|
|
171
|
+
const resolved = resolveScope(state, scope);
|
|
172
|
+
if (resolved.kind === "session") {
|
|
173
|
+
return fileKeys.session(state.agentName, resolved.sessionId, rel);
|
|
174
|
+
}
|
|
175
|
+
return resolved.partition === undefined
|
|
176
|
+
? fileKeys.deployment(state.agentName, rel)
|
|
177
|
+
: fileKeys.deploymentPartition(state.agentName, resolved.partition, rel);
|
|
178
|
+
}
|
|
179
|
+
function mintPrefix(state, scope) {
|
|
180
|
+
const resolved = resolveScope(state, scope);
|
|
181
|
+
if (resolved.kind === "session") {
|
|
182
|
+
return fileKeys.sessionPrefix(state.agentName, resolved.sessionId);
|
|
183
|
+
}
|
|
184
|
+
const base = fileKeys.deploymentPrefix(state.agentName);
|
|
185
|
+
return resolved.partition === undefined
|
|
186
|
+
? base
|
|
187
|
+
: `${base}${resolved.partition}/`;
|
|
188
|
+
}
|
|
189
|
+
function resolveScope(state, scope) {
|
|
190
|
+
var _a;
|
|
191
|
+
if (scope === "deployment") {
|
|
192
|
+
return { kind: "deployment" };
|
|
193
|
+
}
|
|
194
|
+
if (scope !== undefined && typeof scope === "object") {
|
|
195
|
+
if (scope.kind === "deployment") {
|
|
196
|
+
return scope.partition === undefined
|
|
197
|
+
? { kind: "deployment" }
|
|
198
|
+
: { kind: "deployment", partition: segment(scope.partition) };
|
|
199
|
+
}
|
|
200
|
+
const explicit = (_a = scope.sessionId) !== null && _a !== void 0 ? _a : state.sessionId;
|
|
201
|
+
return { kind: "session", sessionId: requireSession(explicit) };
|
|
202
|
+
}
|
|
203
|
+
// Default and explicit `"session"` both bind to the caller's own session, so
|
|
204
|
+
// a relative path can never be re-read as another session's.
|
|
205
|
+
return { kind: "session", sessionId: requireSession(state.sessionId) };
|
|
206
|
+
}
|
|
207
|
+
function requireSession(sessionId) {
|
|
208
|
+
if (sessionId === undefined || sessionId.trim() === "") {
|
|
209
|
+
throw new FileSessionRequiredError("host.files needs a session in scope: call forSession(sessionId), pass { scope: { kind: 'session', sessionId } }, or use { scope: 'deployment' }");
|
|
210
|
+
}
|
|
211
|
+
return segment(sessionId);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Normalize an author path into key-relative form. Rejects traversal, NUL,
|
|
215
|
+
* backslashes, trailing slashes, and the `.cursor*` prefix the Agent Store
|
|
216
|
+
* reserves for Cursor-managed content — refusing here turns an opaque failure
|
|
217
|
+
* deep in a sink (or a 400 from the hosted API, which accepts each path in
|
|
218
|
+
* exactly one spelling) into one the author can act on, and keeps the rule
|
|
219
|
+
* identical across sinks.
|
|
220
|
+
*/
|
|
221
|
+
function normalizeRelPath(path, allowEmpty) {
|
|
222
|
+
if (typeof path !== "string") {
|
|
223
|
+
throw new FilePathRejectedError("host.files path must be a string");
|
|
224
|
+
}
|
|
225
|
+
const trimmed = path.trim().replace(/^\/+/, "");
|
|
226
|
+
if (trimmed === "") {
|
|
227
|
+
if (allowEmpty) {
|
|
228
|
+
return "";
|
|
229
|
+
}
|
|
230
|
+
throw new FilePathRejectedError("host.files path must be non-empty");
|
|
231
|
+
}
|
|
232
|
+
if (trimmed.includes("\0")) {
|
|
233
|
+
throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
|
|
234
|
+
}
|
|
235
|
+
// A backslash is a separator on Windows and a literal on POSIX, so a key
|
|
236
|
+
// minted from one would name different objects on different hosts — and the
|
|
237
|
+
// hosted API refuses it. Same rule as `segment()` below.
|
|
238
|
+
if (trimmed.includes("\\")) {
|
|
239
|
+
throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
|
|
240
|
+
}
|
|
241
|
+
// On an object path, a trailing slash would mint a key ending in "/" — an
|
|
242
|
+
// empty "directory marker" object, never what an author writing a file
|
|
243
|
+
// meant, and refused by the hosted API. A listing prefix (`allowEmpty`) is
|
|
244
|
+
// a different thing: there a trailing slash legitimately scopes to a
|
|
245
|
+
// directory's contents.
|
|
246
|
+
if (!allowEmpty && trimmed.endsWith("/")) {
|
|
247
|
+
throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
|
|
248
|
+
}
|
|
249
|
+
const normalized = normalize(trimmed).split(sep).join("/");
|
|
250
|
+
if (normalized === ".." ||
|
|
251
|
+
normalized === "." ||
|
|
252
|
+
normalized.startsWith("../") ||
|
|
253
|
+
normalized.includes("/../") ||
|
|
254
|
+
normalized.endsWith("/..")) {
|
|
255
|
+
throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
|
|
256
|
+
}
|
|
257
|
+
for (const part of normalized.split("/")) {
|
|
258
|
+
if (isReservedSegment(part)) {
|
|
259
|
+
throw new FilePathRejectedError(`host.files path segment "${part}" is reserved for Cursor-managed content: ${path}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return normalized;
|
|
263
|
+
}
|
|
264
|
+
/** One key segment (session id, partition): no separators, no traversal. */
|
|
265
|
+
function segment(value) {
|
|
266
|
+
const trimmed = value.trim();
|
|
267
|
+
if (trimmed === "" ||
|
|
268
|
+
trimmed === "." ||
|
|
269
|
+
trimmed === ".." ||
|
|
270
|
+
trimmed.includes("/") ||
|
|
271
|
+
trimmed.includes("\\") ||
|
|
272
|
+
trimmed.includes("\0")) {
|
|
273
|
+
throw new FilePathRejectedError(`host.files key segment is not allowed: ${value}`);
|
|
274
|
+
}
|
|
275
|
+
if (isReservedSegment(trimmed)) {
|
|
276
|
+
throw new FilePathRejectedError(`host.files key segment "${trimmed}" is reserved for Cursor-managed content`);
|
|
277
|
+
}
|
|
278
|
+
return trimmed;
|
|
279
|
+
}
|
|
280
|
+
/** Mirrors the server's reserved-prefix rule (`AGENT_STORE_RESERVED_CURSOR_PATH_PREFIX`). */
|
|
281
|
+
function isReservedSegment(value) {
|
|
282
|
+
return value.toLowerCase().startsWith(".cursor");
|
|
283
|
+
}
|
|
@@ -90,7 +90,7 @@ export function warmupHostGitHubAuth(options) {
|
|
|
90
90
|
var _a;
|
|
91
91
|
const source = (_a = options.authSource) !== null && _a !== void 0 ? _a : (yield resolveHostGitHubAuthSource());
|
|
92
92
|
if (source === "unavailable") {
|
|
93
|
-
options.logger("[
|
|
93
|
+
options.logger("[agent-sdk] GitHub auth: unavailable (set GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY + GITHUB_APP_INSTALLATION_ID, or GITHUB_TOKEN / GH_TOKEN, or run `gh auth login`)");
|
|
94
94
|
return source;
|
|
95
95
|
}
|
|
96
96
|
let exportedGhToken = false;
|
|
@@ -99,7 +99,7 @@ export function warmupHostGitHubAuth(options) {
|
|
|
99
99
|
exportedGhToken = yield ensureGhCliTokenEnv();
|
|
100
100
|
}
|
|
101
101
|
catch (error) {
|
|
102
|
-
options.logger(`[
|
|
102
|
+
options.logger(`[agent-sdk] GitHub auth: failed to export GH_TOKEN for gh CLI: ${error instanceof Error ? error.message : String(error)}`);
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
const label = source === "cursor-account"
|
|
@@ -112,15 +112,15 @@ export function warmupHostGitHubAuth(options) {
|
|
|
112
112
|
? "GITHUB_TOKEN/GH_TOKEN"
|
|
113
113
|
: "gh auth token";
|
|
114
114
|
if (options.github === undefined) {
|
|
115
|
-
options.logger(`[
|
|
115
|
+
options.logger(`[agent-sdk] GitHub auth: ${label}`);
|
|
116
116
|
return source;
|
|
117
117
|
}
|
|
118
118
|
try {
|
|
119
119
|
yield options.github.getOctokit();
|
|
120
|
-
options.logger(`[
|
|
120
|
+
options.logger(`[agent-sdk] GitHub auth: ${label}`);
|
|
121
121
|
}
|
|
122
122
|
catch (error) {
|
|
123
|
-
options.logger(`[
|
|
123
|
+
options.logger(`[agent-sdk] GitHub auth: ${label} resolved but Octokit warmup failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
124
124
|
}
|
|
125
125
|
return source;
|
|
126
126
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Client-side mirrors of the Agent Serve hosting validation rules
|
|
3
3
|
* (backend/server/src/agentServe/agentServeShared.ts). Shared by discovery
|
|
4
|
-
* (`hosting` block diagnostics on `
|
|
4
|
+
* (`hosting` block diagnostics on `agent-sdk validate`) and the deploy /
|
|
5
5
|
* secrets CLI verbs (actionable errors before any network call). The
|
|
6
6
|
* backend stays authoritative — these exist so mistakes fail fast and
|
|
7
7
|
* locally with the same grammar the server enforces.
|
package/dist/internal/hosting.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Client-side mirrors of the Agent Serve hosting validation rules
|
|
3
3
|
* (backend/server/src/agentServe/agentServeShared.ts). Shared by discovery
|
|
4
|
-
* (`hosting` block diagnostics on `
|
|
4
|
+
* (`hosting` block diagnostics on `agent-sdk validate`) and the deploy /
|
|
5
5
|
* secrets CLI verbs (actionable errors before any network call). The
|
|
6
6
|
* backend stays authoritative — these exist so mistakes fail fast and
|
|
7
7
|
* locally with the same grammar the server enforces.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,CAwahB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,QAAQ,GAAG,SAAS,CAiBtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC/D,QAAQ,CAQV;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV;AAoGD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAc9C"}
|
|
@@ -216,6 +216,31 @@ export function buildHttpChannelRoutes(args) {
|
|
|
216
216
|
});
|
|
217
217
|
}),
|
|
218
218
|
};
|
|
219
|
+
const cost = {
|
|
220
|
+
method: "GET",
|
|
221
|
+
pattern: `${base}/v1/session/:sessionId/cost`,
|
|
222
|
+
auth,
|
|
223
|
+
handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
224
|
+
var _a;
|
|
225
|
+
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
226
|
+
const record = yield engine.getOrRestoreSession(sessionId);
|
|
227
|
+
if (record === undefined) {
|
|
228
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
229
|
+
}
|
|
230
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
231
|
+
relax: relaxSessionReadAuth,
|
|
232
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
233
|
+
requestIp: ctx.requestIp,
|
|
234
|
+
});
|
|
235
|
+
if (ownership !== undefined) {
|
|
236
|
+
return ownership;
|
|
237
|
+
}
|
|
238
|
+
const payload = yield engine.sessionCost(sessionId);
|
|
239
|
+
return jsonResponse(payload, {
|
|
240
|
+
headers: { [SESSION_ID_HEADER]: sessionId },
|
|
241
|
+
});
|
|
242
|
+
}),
|
|
243
|
+
};
|
|
219
244
|
const listApprovals = {
|
|
220
245
|
method: "GET",
|
|
221
246
|
pattern: `${base}/v1/session/:sessionId/approvals`,
|
|
@@ -325,6 +350,7 @@ export function buildHttpChannelRoutes(args) {
|
|
|
325
350
|
stop,
|
|
326
351
|
stream,
|
|
327
352
|
events,
|
|
353
|
+
cost,
|
|
328
354
|
listApprovals,
|
|
329
355
|
resolveApproval,
|
|
330
356
|
];
|
|
@@ -69,7 +69,7 @@ export declare function planSkillInstall(options?: {
|
|
|
69
69
|
packageRoot?: string;
|
|
70
70
|
skillsHome?: string;
|
|
71
71
|
}): Promise<SkillInstallPlan>;
|
|
72
|
-
/** `Installed 9
|
|
72
|
+
/** `Installed 9 Agent SDK skills`, what it dropped, and where it went. */
|
|
73
73
|
export declare function formatSkillInstall(plan: SkillInstallPlan, result: SkillInstallResult): string;
|
|
74
74
|
export interface OfferInstallCursorSkillsOptions {
|
|
75
75
|
/** Skip when false (non-TTY / `--json`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqBH,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,GAAE,MAAsC,GAC3C,MAAM,CAGR;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,CACrC,UAAU,GAAE,MAA2B,GACtC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EACpC,UAAU,GAAE,MAA2B,GACtC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,GAAE,MAAyB,GACrC,OAAO,CAAC,YAAY,EAAE,CAAC,CA2BzB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAY1B;AAED,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,UAAU,GAAE,MAA2B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CA2B7B;AAwCD,oFAAoF;AACpF,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY5E;AAoBD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+EAA+E;IAC/E,YAAY,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgB5B;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,kBAAkB,GACzB,MAAM,CASR;AAED,MAAM,WAAW,+BAA+B;IAC9C,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA2DpD;AAmBD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAsB9B"}
|
|
@@ -15,7 +15,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
15
15
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
16
|
});
|
|
17
17
|
};
|
|
18
|
-
import { access, cp, mkdir, readdir, readFile, rm, writeFile, } from "node:fs/promises";
|
|
18
|
+
import { access, chmod, cp, mkdir, readdir, readFile, rm, stat, writeFile, } from "node:fs/promises";
|
|
19
19
|
import { homedir } from "node:os";
|
|
20
20
|
import { join } from "node:path";
|
|
21
21
|
import { CLI_COMMAND_NAME, packageRootDir } from "./distribution.js";
|
|
@@ -115,6 +115,11 @@ export function installCursorSkills(skills_1) {
|
|
|
115
115
|
for (const skill of skills) {
|
|
116
116
|
const target = skillInstallPath(skill, skillsHome);
|
|
117
117
|
yield cp(skill.sourceDir, target, { recursive: true, force: true });
|
|
118
|
+
// cp() preserves source modes, and installs can come from read-only
|
|
119
|
+
// stores (Bazel runfiles, pnpm's content-addressed store, nix). Make the
|
|
120
|
+
// copies writable so the SKILL.md rewrite below and the overwrite on the
|
|
121
|
+
// next upgrade both work.
|
|
122
|
+
yield makeTreeWritable(target);
|
|
118
123
|
const skillMdPath = join(target, "SKILL.md");
|
|
119
124
|
const raw = yield readFile(skillMdPath, "utf8");
|
|
120
125
|
const adjusted = prepareSkillMarkdownForCursorInstall(raw);
|
|
@@ -126,6 +131,30 @@ export function installCursorSkills(skills_1) {
|
|
|
126
131
|
return { installed, removed };
|
|
127
132
|
});
|
|
128
133
|
}
|
|
134
|
+
function makeTreeWritable(root) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
yield addOwnerWrite(root);
|
|
137
|
+
const entries = yield readdir(root, { withFileTypes: true });
|
|
138
|
+
for (const entry of entries) {
|
|
139
|
+
const child = join(root, entry.name);
|
|
140
|
+
if (entry.isDirectory()) {
|
|
141
|
+
yield makeTreeWritable(child);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
yield addOwnerWrite(child);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/** Add owner-write, preserving every other mode bit (e.g. exec on scripts). */
|
|
150
|
+
function addOwnerWrite(path) {
|
|
151
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
+
const mode = (yield stat(path)).mode & 0o7777;
|
|
153
|
+
if ((mode & 0o200) === 0) {
|
|
154
|
+
yield chmod(path, mode | 0o200);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
129
158
|
/** Installed leaf dirs the package no longer ships. Installing deletes these. */
|
|
130
159
|
function orphanLeaves(namespaceDir, skills) {
|
|
131
160
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -193,11 +222,11 @@ export function planSkillInstall(options) {
|
|
|
193
222
|
};
|
|
194
223
|
});
|
|
195
224
|
}
|
|
196
|
-
/** `Installed 9
|
|
225
|
+
/** `Installed 9 Agent SDK skills`, what it dropped, and where it went. */
|
|
197
226
|
export function formatSkillInstall(plan, result) {
|
|
198
227
|
const noun = result.installed.length === 1 ? "skill" : "skills";
|
|
199
228
|
const verb = plan.firstInstall ? "Installed" : "Updated";
|
|
200
|
-
const lines = [`${verb} ${result.installed.length}
|
|
229
|
+
const lines = [`${verb} ${result.installed.length} Agent SDK ${noun}`];
|
|
201
230
|
if (result.removed.length > 0) {
|
|
202
231
|
lines.push(` removed: ${result.removed.join(", ")}`);
|
|
203
232
|
}
|
|
@@ -228,7 +257,7 @@ export function offerInstallCursorSkills() {
|
|
|
228
257
|
const noun = plan.shipped.length === 1 ? "skill" : "skills";
|
|
229
258
|
const verb = plan.firstInstall ? "Install" : "Update";
|
|
230
259
|
const c = stdoutPalette();
|
|
231
|
-
out(`${verb} ${plan.shipped.length}
|
|
260
|
+
out(`${verb} ${plan.shipped.length} Agent SDK ${noun} in ${plan.directory}?\n`);
|
|
232
261
|
out(c.dim(` ${plan.leaves.join(", ")}\n`));
|
|
233
262
|
if (!plan.firstInstall) {
|
|
234
263
|
out(c.dim(" (overwrites existing copies with the package version)\n"));
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small filesystem helpers for one-JSON-file-per-id persistence under a
|
|
3
|
+
* project-relative directory (eval run snapshots, A/B aggregate snapshots).
|
|
4
|
+
*/
|
|
5
|
+
export declare function assertNonEmptyDir(dir: string, fnName: string): string;
|
|
6
|
+
/** Resolve `dir` against `projectRoot` when relative. */
|
|
7
|
+
export declare function resolveProjectRelativeDir(args: {
|
|
8
|
+
dir: string;
|
|
9
|
+
projectRoot: string;
|
|
10
|
+
}): string;
|
|
11
|
+
/** List `*.json` basenames in `root` (any order). Missing dir → []. */
|
|
12
|
+
export declare function listJsonBasenames(root: string): Promise<string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Read and JSON.parse every `*.json` file under `root`. Missing dir → [].
|
|
15
|
+
* Unreadable or corrupt files are skipped so one bad snapshot cannot wipe
|
|
16
|
+
* the rest of the history.
|
|
17
|
+
*/
|
|
18
|
+
export declare function readJsonDir<T>(root: string, options?: {
|
|
19
|
+
sortBasenames?: "asc" | "desc";
|
|
20
|
+
}): Promise<T[]>;
|
|
21
|
+
/** Atomically write JSON under `root`/`fileName` (temp file + rename). */
|
|
22
|
+
export declare function writeJsonFile(args: {
|
|
23
|
+
root: string;
|
|
24
|
+
fileName: string;
|
|
25
|
+
value: unknown;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
/** Best-effort delete; ignores missing files. */
|
|
28
|
+
export declare function deleteFileInDir(args: {
|
|
29
|
+
root: string;
|
|
30
|
+
fileName: string;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=json-dir-store.d.ts.map
|