@cursor/bdk 0.2.10 → 0.2.12
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/dist/bin/agent-serve.js +28 -26
- package/dist/channels/bitbucket/api.js +8 -8
- package/dist/channels/bitbucket/binding.js +4 -4
- package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +1 -1
- package/dist/channels/bitbucket/checks.js +1 -1
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/events.js +1 -1
- package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
- package/dist/channels/checks.js +2 -2
- package/dist/channels/deployments/deployments-channel.js +1 -1
- package/dist/channels/github/cursor-account.js +3 -3
- package/dist/channels/github/defaults.js +3 -3
- package/dist/channels/github/events.js +1 -1
- package/dist/channels/github/forward.js +8 -8
- package/dist/channels/github/github-channel.js +2 -2
- package/dist/channels/gitlab/binding.js +4 -4
- package/dist/channels/gitlab/checks.js +1 -1
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/events.js +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +1 -1
- package/dist/channels/gitlab/replay.js +2 -2
- package/dist/channels/origin/binding.js +3 -3
- package/dist/channels/origin/checks.js +1 -1
- package/dist/channels/origin/cursor-account.js +1 -1
- package/dist/channels/origin/events.js +1 -1
- package/dist/channels/origin/origin-channel.js +1 -1
- package/dist/channels/origin/origin-webhook.js +2 -2
- package/dist/channels/slack/agentic-delivery.js +3 -3
- package/dist/channels/slack/agentic-signals.js +1 -1
- package/dist/channels/slack/api.js +5 -5
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/attachments.js +3 -3
- package/dist/channels/slack/blocks.js +3 -3
- package/dist/channels/slack/bot-mentions.js +4 -4
- package/dist/channels/slack/channel-watch.js +4 -4
- package/dist/channels/slack/cli-project.js +3 -3
- package/dist/channels/slack/dispatch.js +1 -1
- package/dist/channels/slack/doctor.js +1 -1
- package/dist/channels/slack/eval-directive.js +1 -1
- package/dist/channels/slack/footer.js +1 -1
- package/dist/channels/slack/interactive.js +2 -2
- package/dist/channels/slack/log.d.ts.map +1 -1
- package/dist/channels/slack/log.js +1 -1
- package/dist/channels/slack/manifest.js +1 -1
- package/dist/channels/slack/nudge-carrier.js +1 -1
- package/dist/channels/slack/nudge-store.js +2 -2
- package/dist/channels/slack/recording-sink.js +6 -6
- package/dist/channels/slack/reply-options.js +6 -6
- package/dist/channels/slack/self-identity.d.ts +7 -4
- package/dist/channels/slack/self-identity.d.ts.map +1 -1
- package/dist/channels/slack/self-identity.js +17 -8
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +2 -6
- package/dist/channels/slack/setup.d.ts.map +1 -1
- package/dist/channels/slack/setup.js +1 -1
- package/dist/channels/slack/slack-channel.js +2 -2
- package/dist/channels/slack/socket-mode.js +2 -2
- package/dist/channels/slack/thread-context.js +8 -8
- package/dist/channels/slack/tool-cards.js +1 -1
- package/dist/channels/slack/user-info.d.ts +2 -1
- package/dist/channels/slack/user-info.d.ts.map +1 -1
- package/dist/channels/slack/user-info.js +16 -1
- package/dist/channels.js +1 -1
- package/dist/docs/404.html +3 -3
- package/dist/docs/assets/{app.DXI7bwox.js → app.CKta5zX1.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.DtlCe4t6.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BrbO5mEe.js → VPLocalSearchBox.4vRM3EDG.js} +2 -2
- package/dist/docs/assets/chunks/{arc.BOG1yms8.js → arc.CofbA8tA.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.C0hsMZnZ.js → architectureDiagram-Q4EWVU46.Mt2UV5M-.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.H044KjKs.js → baseUniq.C_W0Aqp4.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BsRW6GoB.js → blockDiagram-DXYQGD6D.dAc4goE-.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.B9HV5PFR.js → c4Diagram-AHTNJAMY.dnbRC3Dm.js} +1 -1
- package/dist/docs/assets/chunks/channel.DpljPUVU.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CPoT_ajl.js → chunk-4BX2VUAB.B42ltSTd.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DZBwWuCL.js → chunk-4TB4RGXK.2GbAul_E.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.CZ3yTiyq.js → chunk-55IACEB6.pjzY-v-B.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.6DfvHSd8.js → chunk-EDXVE4YY.BB1GXLj2.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CpBj8HfK.js → chunk-FMBD7UC4.B2WxZkoA.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.BdKo8YqS.js → chunk-OYMX7WX6.BMvb2w73.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnXNyxJx.js → chunk-QZHKN3VN.Bmu_2lNr.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.Cg1OcF8G.js → chunk-YZCP3GAM.Cth65EaC.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DFNHq2OM.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DFNHq2OM.js +1 -0
- package/dist/docs/assets/chunks/clone.DssygCzX.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.1SP8al9c.js → cose-bilkent-S5V4N54A.CrfA7Iw_.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.DS1L6hJt.js → dagre-KV5264BT.PCD6KQDb.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.ChsausbG.js → diagram-5BDNPKRD.CGNlYlP1.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.3XsptNWj.js → diagram-G4DWMVQ6.C0cvryPD.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DPA9Dk_P.js → diagram-MMDJMWI5.DHlkZHNV.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.BVswXWrB.js → diagram-TYMM5635.DDGqH_4B.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.BSak5OSP.js → erDiagram-SMLLAGMA.4gOY_C3v.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.CQgN4TTz.js → flowDiagram-DWJPFMVM.8i7zsxuh.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.GrT0kA4a.js → ganttDiagram-T4ZO3ILL.BEKHYdM-.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CdS7Ucll.js → gitGraphDiagram-UUTBAWPF.ACzeLGiB.js} +1 -1
- package/dist/docs/assets/chunks/{graph.BVqKRmRo.js → graph.08C3hS6m.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.C3C9FRto.js → infoDiagram-42DDH7IO.D8R9obOH.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js → ishikawaDiagram-UXIWVN3A.CmgYpCWL.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CaHMfK4b.js → journeyDiagram-VCZTEJTY.DUzjGfoZ.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.CjhIUwcA.js → kanban-definition-6JOO6SKY.DbcW2iZ0.js} +1 -1
- package/dist/docs/assets/chunks/{layout.CGU3gfSf.js → layout.BaDEpJzu.js} +1 -1
- package/dist/docs/assets/chunks/{linear.DaihpW_n.js → linear.B_zRQgCU.js} +1 -1
- package/dist/docs/assets/chunks/{min.BS-j8kHQ.js → min.BYscCdSu.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.BVJ1Bbnk.js → mindmap-definition-QFDTVHPH.Ggu0jg86.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.Cz1WIv9r.js → pieDiagram-DEJITSTG.D_q4SVDT.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DKLFxcjy.js → quadrantDiagram-34T5L4WZ.D3zGj5ok.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.BHegiK7x.js → requirementDiagram-MS252O5E.DVTg7zr2.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DYkY6yPc.js → sankeyDiagram-XADWPNL6.D3X8jm57.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DYQ1QUrI.js → sequenceDiagram-FGHM5R23.Dpjai9YP.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.Iru8BsFo.js → stateDiagram-FHFEXIEX.D_AbQBuP.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CWKWRxRx.js +1 -0
- package/dist/docs/assets/chunks/{theme.DaplWQhQ.js → theme.BcgOnbZ6.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BwFA8hiX.js → timeline-definition-GMOUNBTQ.Cp3DKBe2.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CZ60W1C_.js → vennDiagram-DHZGUBPP.Bcvg-Aqu.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.CCpdcUSq.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.B69D2r8-.js → wardleyDiagram-NUSXRM2D.L0yehCc5.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CLPZEIU9.js → xychartDiagram-5P7HB3ND.Cw8-tJmw.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.Bljpve-y.js → reference_connections.md.DLrgAd5f.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.C5LCJ1R3.js → reference_hooks.md.B-eGa2km.js} +3 -3
- package/dist/docs/assets/{reference_hooks.md.C5LCJ1R3.lean.js → reference_hooks.md.B-eGa2km.lean.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.CM5zo3w4.js → reference_sessions.md.CyM7ARz1.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.C0guGcH0.js → reference_skills.md.ClkMoQsV.js} +3 -3
- package/dist/docs/assets/{reference_tools.md.v3SXVSs_.js → reference_tools.md.DzIY9JzY.js} +3 -3
- package/dist/docs/assets/{reference_tools.md.v3SXVSs_.lean.js → reference_tools.md.DzIY9JzY.lean.js} +1 -1
- package/dist/docs/assets/{style.C130MVnH.css → style.Dwls12uf.css} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/evals.html +37 -37
- package/dist/docs/guides/agent-to-agent.html +37 -37
- package/dist/docs/guides/bitbucket.html +37 -37
- package/dist/docs/guides/cloud-agents.html +37 -37
- package/dist/docs/guides/convert-automation.html +37 -37
- package/dist/docs/guides/github.html +37 -37
- package/dist/docs/guides/gitlab.html +37 -37
- package/dist/docs/guides/grokbot-agents.html +37 -37
- package/dist/docs/guides/hooks.html +37 -37
- package/dist/docs/guides/improve.html +37 -37
- package/dist/docs/guides/jev.html +37 -37
- package/dist/docs/guides/mcp-oauth.html +37 -37
- package/dist/docs/guides/migrate.html +37 -37
- package/dist/docs/guides/opentelemetry.html +37 -37
- package/dist/docs/guides/slack.html +37 -37
- package/dist/docs/guides/webhooks.html +37 -37
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +37 -37
- package/dist/docs/index.html +37 -37
- package/dist/docs/llms-full.txt +15 -2
- package/dist/docs/quickstart.html +37 -37
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/artifacts.html +37 -37
- package/dist/docs/reference/channels.html +37 -37
- package/dist/docs/reference/cli.html +37 -37
- package/dist/docs/reference/connections.html +39 -39
- package/dist/docs/reference/connections.md +2 -1
- package/dist/docs/reference/evals.html +37 -37
- package/dist/docs/reference/extensions.html +37 -37
- package/dist/docs/reference/hooks.html +39 -39
- package/dist/docs/reference/hooks.md +1 -0
- package/dist/docs/reference/http-api.html +37 -37
- package/dist/docs/reference/instructions.html +37 -37
- package/dist/docs/reference/playground.html +36 -36
- package/dist/docs/reference/project-layout.html +37 -37
- package/dist/docs/reference/prompt.html +37 -37
- package/dist/docs/reference/schedules.html +37 -37
- package/dist/docs/reference/sessions.html +37 -37
- package/dist/docs/reference/sessions.md +1 -1
- package/dist/docs/reference/skills.html +40 -40
- package/dist/docs/reference/subagents.html +37 -37
- package/dist/docs/reference/tools.html +39 -39
- package/dist/docs/reference/tools.md +11 -0
- package/dist/docs/templates/agentic-owners.html +37 -37
- package/dist/docs/templates/grokbot-agents.html +37 -37
- package/dist/docs/templates/security-reviewer.html +37 -37
- package/dist/docs/templates/thermo-quality-review.html +37 -37
- package/dist/docs/templates/thermo-review.html +37 -37
- package/dist/docs/templates/triage.html +37 -37
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/evals/assertions.d.ts.map +1 -1
- package/dist/evals/assertions.js +21 -19
- package/dist/evals/expect.js +1 -1
- package/dist/evals/judge.js +1 -1
- package/dist/evals/reporters.js +8 -8
- package/dist/evals/run-facts.js +2 -2
- package/dist/evals.js +6 -6
- package/dist/extensions/cursor-cloud-agents/extension.d.ts +2 -0
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +2 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +16 -0
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +44 -3
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts +23 -0
- package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/launch-agent.js +32 -0
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +2 -2
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -2
- package/dist/extensions/cursor-cloud-agents/lib/watch.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +3 -8
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/extension.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +4 -4
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
- package/dist/extensions/improve/skills/yourself.js +1 -1
- package/dist/extensions/jev/extension.js +2 -2
- package/dist/extensions/jev/tools/evaluate.js +1 -1
- package/dist/extensions/slack-communication/tools/react.js +1 -1
- package/dist/files-backends/cursor-hosted.js +8 -8
- package/dist/files-backends/local-fs.js +1 -1
- package/dist/filesystem.d.ts.map +1 -1
- package/dist/filesystem.js +15 -15
- package/dist/internal/advertise-tools.d.ts +3 -2
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +11 -9
- package/dist/internal/approval-gate.js +1 -1
- package/dist/internal/artifacts-store.js +13 -13
- package/dist/internal/as-of.js +2 -2
- package/dist/internal/authored-alias-hooks.js +1 -1
- package/dist/internal/builtin-tools/reminders.js +2 -2
- package/dist/internal/chat-client.js +5 -5
- package/dist/internal/cli-ax.js +14 -14
- package/dist/internal/cli-bitbucket.js +10 -10
- package/dist/internal/cli-convert-automation.js +2 -2
- package/dist/internal/cli-cursor.js +2 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +40 -40
- package/dist/internal/cli-docs.js +5 -5
- package/dist/internal/cli-github.js +15 -15
- package/dist/internal/cli-gitlab.js +10 -10
- package/dist/internal/cli-images.js +16 -16
- package/dist/internal/cli-manifest.js +1 -1
- package/dist/internal/cli-mcp-oauth.js +5 -5
- package/dist/internal/cli-mcp.js +3 -3
- package/dist/internal/cli-migrate.js +1 -1
- package/dist/internal/cli-skills.js +2 -2
- package/dist/internal/cli-slack.js +5 -5
- package/dist/internal/cloud-turn-cost.js +1 -1
- package/dist/internal/continuation-identity.js +6 -6
- package/dist/internal/conversation-mirror.js +5 -5
- package/dist/internal/convert-automation/convert-workflow.js +24 -24
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +20 -20
- package/dist/internal/cursor/backend-client.js +6 -6
- package/dist/internal/cursor/credentials.js +1 -1
- package/dist/internal/cursor/store-api-client.js +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +9 -9
- package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
- package/dist/internal/cursor-deployment-relay.js +9 -9
- package/dist/internal/cursor-event-relay.js +10 -10
- package/dist/internal/cursor-relay-core.js +2 -2
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +3 -0
- package/dist/internal/deploy-manifest.js +10 -10
- package/dist/internal/discovery/agent-config.js +2 -2
- package/dist/internal/discovery/agent.js +6 -6
- package/dist/internal/discovery/connections.js +5 -5
- package/dist/internal/discovery/cursor-plugin.js +12 -12
- package/dist/internal/discovery/extension-overlay.js +3 -3
- package/dist/internal/discovery/extensions.js +6 -6
- package/dist/internal/discovery/info.js +9 -9
- package/dist/internal/discovery/instructions.js +1 -1
- package/dist/internal/discovery/project.js +3 -3
- package/dist/internal/discovery/services.js +1 -1
- package/dist/internal/discovery/tools.js +1 -1
- package/dist/internal/docs-site.js +2 -2
- package/dist/internal/env-file.js +1 -1
- package/dist/internal/eval-run-store.js +7 -7
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +14 -14
- package/dist/internal/eval-transport.js +1 -1
- package/dist/internal/evals-client.js +4 -4
- package/dist/internal/event-log.js +8 -8
- package/dist/internal/event-mapper.js +13 -13
- package/dist/internal/expected-delivery-failure.js +2 -2
- package/dist/internal/filesystem/format.js +2 -2
- package/dist/internal/filesystem/nearest.js +3 -3
- package/dist/internal/filesystem/scratch.js +3 -3
- package/dist/internal/filesystem/tools.js +6 -6
- package/dist/internal/filesystem/walk.d.ts.map +1 -1
- package/dist/internal/filesystem/walk.js +2 -2
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +6 -5
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +4 -2
- package/dist/internal/github-fanout.d.ts.map +1 -1
- package/dist/internal/github-fanout.js +3 -3
- package/dist/internal/guest-network.js +4 -4
- package/dist/internal/host-files.js +1 -1
- package/dist/internal/host-kv.js +2 -2
- package/dist/internal/hosted-catch-protocol.js +1 -1
- package/dist/internal/hosted-catch.js +1 -1
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +14 -14
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +23 -9
- package/dist/internal/hosted-eval-cases.js +4 -4
- package/dist/internal/hosted-execution-diag.js +3 -3
- package/dist/internal/hosting.js +1 -1
- package/dist/internal/http-channel.js +1 -1
- package/dist/internal/http-control-plane-session.js +2 -2
- package/dist/internal/init-interview.js +7 -7
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +12 -12
- package/dist/internal/inline-stdio-mcp.js +2 -2
- package/dist/internal/install-cursor-skills.js +11 -11
- package/dist/internal/json-schema.js +1 -1
- package/dist/internal/local-control-plane.js +3 -3
- package/dist/internal/local-env.js +3 -3
- package/dist/internal/log-ring.js +1 -1
- package/dist/internal/logs-client.js +1 -1
- package/dist/internal/mcp-endpoint.js +8 -8
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +5 -5
- package/dist/internal/mcp-oauth-on-demand.js +3 -3
- package/dist/internal/mcp-oauth.js +5 -5
- package/dist/internal/net.js +2 -2
- package/dist/internal/otel/config.js +3 -3
- package/dist/internal/otel/runtime.js +13 -13
- package/dist/internal/peer-connections.js +2 -2
- package/dist/internal/persistent-stage-log-mirror.d.ts +57 -0
- package/dist/internal/persistent-stage-log-mirror.d.ts.map +1 -0
- package/dist/internal/persistent-stage-log-mirror.js +231 -0
- package/dist/internal/platform-schedule-sync.js +1 -1
- package/dist/internal/platform-timers.js +1 -1
- package/dist/internal/playground/static.js +2 -2
- package/dist/internal/playground/toolchain.js +2 -2
- package/dist/internal/playground-proxy.js +3 -3
- package/dist/internal/process-memory-telemetry.js +1 -1
- package/dist/internal/reminder-runner.d.ts +1 -1
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +14 -16
- package/dist/internal/reminder-store.js +1 -1
- package/dist/internal/resolved-connections.js +8 -8
- package/dist/internal/router.js +4 -4
- package/dist/internal/run-client.js +2 -2
- package/dist/internal/schedule-runner.js +6 -6
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +6 -6
- package/dist/internal/serve-restart.js +1 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +93 -72
- package/dist/internal/session-cost.js +3 -3
- package/dist/internal/session-engine.d.ts +8 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +183 -118
- package/dist/internal/session-live-publisher.d.ts +46 -0
- package/dist/internal/session-live-publisher.d.ts.map +1 -0
- package/dist/internal/session-live-publisher.js +352 -0
- package/dist/internal/session-run-log.js +6 -6
- package/dist/internal/sessions-client.js +3 -3
- package/dist/internal/skill-catalog.js +2 -2
- package/dist/internal/sleep.js +1 -1
- package/dist/internal/start-log-store.d.ts +5 -1
- package/dist/internal/start-log-store.d.ts.map +1 -1
- package/dist/internal/start-log-store.js +5 -3
- package/dist/internal/storage-coordinator.js +12 -12
- package/dist/internal/store-api-protocol.d.ts +51 -0
- package/dist/internal/store-api-protocol.d.ts.map +1 -1
- package/dist/internal/store-api-protocol.js +39 -2
- package/dist/internal/store-mirror.js +4 -4
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +4 -0
- package/dist/internal/terminal-style.js +2 -2
- package/dist/internal/tool-call-retry.d.ts +87 -0
- package/dist/internal/tool-call-retry.d.ts.map +1 -0
- package/dist/internal/tool-call-retry.js +387 -0
- package/dist/internal/tool-result.js +3 -3
- package/dist/internal/trajectory.js +7 -7
- package/dist/internal/turn-governor.js +2 -2
- package/dist/internal/turn-outbox.js +1 -1
- package/dist/internal/update-check.d.ts.map +1 -1
- package/dist/internal/update-check.js +4 -2
- package/dist/internal/v2-hosting.d.ts +6 -0
- package/dist/internal/v2-hosting.d.ts.map +1 -1
- package/dist/internal/v2-hosting.js +7 -1
- package/dist/internal/workspace.js +4 -4
- package/dist/kv/memory-kv.js +3 -3
- package/dist/playground/assets/{index-JekUQERK.js → index-HN5lOuAX.js} +42 -42
- package/dist/playground/assets/index-JY1wKCMg.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +1 -1
- package/dist/storage-backends/cursor-hosted-v2.js +2 -2
- package/dist/storage-backends/file-kv.js +7 -7
- package/dist/storage-protocol.d.ts +7 -0
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +7 -0
- package/dist/storage.js +3 -3
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -4
- package/docs/reference/connections.md +2 -1
- package/docs/reference/hooks.md +1 -0
- package/docs/reference/sessions.md +1 -1
- package/docs/reference/tools.md +11 -0
- package/package.json +6 -6
- package/templates/agentic-owners/bot/channels/github.ts +2 -2
- package/templates/agentic-owners/bot/lib/github.ts +7 -5
- package/templates/agentic-owners/bot/lib/owners/decision.ts +9 -9
- package/templates/agentic-owners/bot/lib/owners/handles.ts +2 -2
- package/templates/agentic-owners/bot/lib/owners/match.ts +5 -3
- package/templates/agentic-owners/bot/lib/owners/matching.ts +1 -1
- package/templates/agentic-owners/bot/lib/owners/parse.ts +4 -4
- package/templates/agentic-owners/bot/lib/owners/prompt.ts +1 -1
- package/templates/agentic-owners/bot/lib/review.ts +18 -17
- package/templates/agentic-owners/evals/owners.eval.ts +2 -2
- package/templates/agents-md/bot/lib/collect.ts +6 -6
- package/templates/agents-md/bot/lib/config.ts +1 -1
- package/templates/agents-md/bot/tools/apply_agents.ts +4 -4
- package/templates/code-wiki/bot/channels/github.ts +3 -3
- package/templates/code-wiki/bot/lib/repos.ts +1 -1
- package/templates/code-wiki/bot/tools/apply_wiki.ts +2 -2
- package/templates/demo/bot/lib/collect.ts +1 -1
- package/templates/demo/bot/lib/repos.ts +1 -1
- package/templates/demo/bot/tools/record_demo.ts +1 -1
- package/templates/pr-autofixer/bot/channels/github.ts +2 -2
- package/templates/pr-autofixer/bot/lib/merge-watch.ts +2 -2
- package/templates/pr-autofixer/bot/lib/repos.ts +2 -2
- package/templates/pr-autofixer/bot/lib/webhook-routing.ts +1 -1
- package/templates/security-help/bot/lib/repos.ts +1 -1
- package/templates/security-reviewer/bot/lib/repos.ts +1 -1
- package/templates/triage/bot/lib/actuate.ts +15 -15
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +0 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +0 -1
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +0 -162
- package/dist/playground/assets/index-DXm_VXAQ.css +0 -1
- /package/dist/docs/assets/{reference_connections.md.Bljpve-y.lean.js → reference_connections.md.DLrgAd5f.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.CM5zo3w4.lean.js → reference_sessions.md.CyM7ARz1.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.C0guGcH0.lean.js → reference_skills.md.ClkMoQsV.lean.js} +0 -0
|
@@ -25,7 +25,7 @@ export function loadAgentLocalEnv(dir) {
|
|
|
25
25
|
loaded.push(path);
|
|
26
26
|
};
|
|
27
27
|
const trackLoadedKeys = () => {
|
|
28
|
-
fileLoadedKeys = new Set(Object.keys(process.env).filter(key => !realKeys.has(key)));
|
|
28
|
+
fileLoadedKeys = new Set(Object.keys(process.env).filter((key) => !realKeys.has(key)));
|
|
29
29
|
};
|
|
30
30
|
const tryLoadDir = (agentDir) => {
|
|
31
31
|
// `.env.local` first so its values win over checked-in `.env` defaults
|
|
@@ -37,8 +37,8 @@ export function loadAgentLocalEnv(dir) {
|
|
|
37
37
|
let children;
|
|
38
38
|
try {
|
|
39
39
|
children = readdirSync(dir, { withFileTypes: true })
|
|
40
|
-
.filter(entry => entry.isDirectory() && !entry.name.startsWith("."))
|
|
41
|
-
.map(entry => entry.name);
|
|
40
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
|
|
41
|
+
.map((entry) => entry.name);
|
|
42
42
|
}
|
|
43
43
|
catch {
|
|
44
44
|
trackLoadedKeys();
|
|
@@ -404,7 +404,7 @@ async function sleepMs(ms, signal) {
|
|
|
404
404
|
if (isAborted(signal)) {
|
|
405
405
|
return;
|
|
406
406
|
}
|
|
407
|
-
await new Promise(resolve => {
|
|
407
|
+
await new Promise((resolve) => {
|
|
408
408
|
const timer = setTimeout(() => {
|
|
409
409
|
signal?.removeEventListener("abort", onAbort);
|
|
410
410
|
resolve();
|
|
@@ -90,7 +90,7 @@ export async function handleStatelessMcpRequest(args) {
|
|
|
90
90
|
/** Tool names the MCP surface exposes for `project` (info projection). */
|
|
91
91
|
export function mcpEndpointToolNames(project) {
|
|
92
92
|
const names = ["ask", "check"];
|
|
93
|
-
if (project.agent.tools.some(tool => tool.execution === "server")) {
|
|
93
|
+
if (project.agent.tools.some((tool) => tool.execution === "server")) {
|
|
94
94
|
names.push("call_tool");
|
|
95
95
|
}
|
|
96
96
|
return names;
|
|
@@ -137,9 +137,9 @@ function buildToolMcpServer(engine, sessionId) {
|
|
|
137
137
|
capabilities: { tools: {} },
|
|
138
138
|
instructions: "Direct tools implemented by the AgentSDK deployment for its active cloud turn.",
|
|
139
139
|
});
|
|
140
|
-
const tools = engine.project.agent.tools.filter(tool => tool.execution === "server");
|
|
140
|
+
const tools = engine.project.agent.tools.filter((tool) => tool.execution === "server");
|
|
141
141
|
server.setRequestHandler(ListToolsRequestSchema, () => Promise.resolve({
|
|
142
|
-
tools: tools.map(tool => ({
|
|
142
|
+
tools: tools.map((tool) => ({
|
|
143
143
|
name: tool.name,
|
|
144
144
|
description: tool.description,
|
|
145
145
|
inputSchema: tool.inputSchema,
|
|
@@ -150,7 +150,7 @@ function buildToolMcpServer(engine, sessionId) {
|
|
|
150
150
|
if (sessionId === null || sessionId === "") {
|
|
151
151
|
return errorResult("Missing AgentSDK session binding.");
|
|
152
152
|
}
|
|
153
|
-
const tool = tools.find(candidate => candidate.name === request.params.name);
|
|
153
|
+
const tool = tools.find((candidate) => candidate.name === request.params.name);
|
|
154
154
|
if (tool === undefined) {
|
|
155
155
|
return errorResult(`Unknown server tool "${request.params.name}".`);
|
|
156
156
|
}
|
|
@@ -203,7 +203,7 @@ function buildConnectionBridgeMcpServer(engine, sessionId, connectionName) {
|
|
|
203
203
|
}
|
|
204
204
|
const tools = await engine.runWithMcpPark(sessionId ?? "", "tools/list", () => engine.host.mcp.listTools(connectionName));
|
|
205
205
|
return {
|
|
206
|
-
tools: tools.map(tool => ({
|
|
206
|
+
tools: tools.map((tool) => ({
|
|
207
207
|
name: tool.name,
|
|
208
208
|
...(tool.description === undefined ? {} : { description: tool.description }),
|
|
209
209
|
inputSchema: tool.inputSchema ?? { type: "object" },
|
|
@@ -303,11 +303,11 @@ function buildAgentMcpServer(engine, auth) {
|
|
|
303
303
|
return errorResult(describeError(error));
|
|
304
304
|
}
|
|
305
305
|
});
|
|
306
|
-
const serverTools = agent.tools.filter(tool => tool.execution === "server");
|
|
306
|
+
const serverTools = agent.tools.filter((tool) => tool.execution === "server");
|
|
307
307
|
if (serverTools.length > 0) {
|
|
308
308
|
server.registerTool("call_tool", {
|
|
309
309
|
description: `Call one of this agent's deterministic server tools directly (no model turn decides anything). Available tools: ${serverTools
|
|
310
|
-
.map(tool => tool.name)
|
|
310
|
+
.map((tool) => tool.name)
|
|
311
311
|
.join(", ")}.`,
|
|
312
312
|
inputSchema: {
|
|
313
313
|
toolName: z.string().describe("Name of the server tool to call."),
|
|
@@ -543,7 +543,7 @@ function raceTimeout(promise, ms) {
|
|
|
543
543
|
const timer = setTimeout(() => {
|
|
544
544
|
resolve(undefined);
|
|
545
545
|
}, ms);
|
|
546
|
-
promise.then(value => {
|
|
546
|
+
promise.then((value) => {
|
|
547
547
|
clearTimeout(timer);
|
|
548
548
|
resolve(value);
|
|
549
549
|
}, (error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AASrB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAS9C;CACF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAMvE;AAoBD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxF;AAED,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED,gFAAgF;IAChF,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAUlE;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,EAAE,oBAAoB,GAAG,aAAa,CAwCtD;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAa5B;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5C;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AASrB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAS9C;CACF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAMvE;AAoBD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxF;AAED,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED,gFAAgF;IAChF,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAUlE;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,EAAE,oBAAoB,GAAG,aAAa,CAwCtD;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAa5B;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5C;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAY3B;IAED;;;;;;;;OAQG;YACW,UAAU;IAcxB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;YAwBH,gBAAgB;IAc9B,OAAO,CAAC,iBAAiB;YASX,OAAO;CAGtB;AASD,+BAA+B;AAC/B,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU9D;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAqB3F"}
|
|
@@ -36,7 +36,7 @@ export function hostMcpCallNeedsAuth(result) {
|
|
|
36
36
|
if (result.isError !== true) {
|
|
37
37
|
return false;
|
|
38
38
|
}
|
|
39
|
-
const text = result.content.map(part => (part.type === "text" ? part.text : "")).join("\n");
|
|
39
|
+
const text = result.content.map((part) => (part.type === "text" ? part.text : "")).join("\n");
|
|
40
40
|
return text.includes("needsAuth") || text.includes("needs authorization");
|
|
41
41
|
}
|
|
42
42
|
function throwIfCallNeedsAuth(connection, result) {
|
|
@@ -73,7 +73,7 @@ export class McpHost {
|
|
|
73
73
|
const listed = await client.listTools(mcpListParams());
|
|
74
74
|
return listed.tools
|
|
75
75
|
.map(toToolInfo)
|
|
76
|
-
.filter(tool => connectionAllowsTool(connection, tool.name));
|
|
76
|
+
.filter((tool) => connectionAllowsTool(connection, tool.name));
|
|
77
77
|
}));
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
@@ -101,7 +101,7 @@ export class McpHost {
|
|
|
101
101
|
const listed = await client.listTools(mcpListParams());
|
|
102
102
|
return listed.tools
|
|
103
103
|
.map(toToolInfo)
|
|
104
|
-
.filter(tool => connectionAllowsTool(connection, tool.name));
|
|
104
|
+
.filter((tool) => connectionAllowsTool(connection, tool.name));
|
|
105
105
|
})),
|
|
106
106
|
callTool: (toolName, args = {}) => {
|
|
107
107
|
assertConnectionAllowsTool(connection, toolName);
|
|
@@ -146,7 +146,7 @@ export class McpHost {
|
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
async close() {
|
|
149
|
-
const opened = await Promise.allSettled([...this.clients.values()].map(entry => entry.opened));
|
|
149
|
+
const opened = await Promise.allSettled([...this.clients.values()].map((entry) => entry.opened));
|
|
150
150
|
this.clients.clear();
|
|
151
151
|
await Promise.allSettled(opened.map(async (settled) => {
|
|
152
152
|
if (settled.status === "fulfilled") {
|
|
@@ -196,7 +196,7 @@ export class McpHost {
|
|
|
196
196
|
// replaced would otherwise orphan the client that replaced it.
|
|
197
197
|
const entry = {
|
|
198
198
|
credentials,
|
|
199
|
-
opened: this.connect(name).catch(error => {
|
|
199
|
+
opened: this.connect(name).catch((error) => {
|
|
200
200
|
if (this.clients.get(name) === entry) {
|
|
201
201
|
this.clients.delete(name);
|
|
202
202
|
}
|
|
@@ -27,7 +27,7 @@ export async function beginHostMcpOauth(args) {
|
|
|
27
27
|
resourceUrl: args.url,
|
|
28
28
|
store: args.store,
|
|
29
29
|
redirectUrl: args.redirectUrl,
|
|
30
|
-
onRedirect: url => {
|
|
30
|
+
onRedirect: (url) => {
|
|
31
31
|
authorizationUrl = url;
|
|
32
32
|
},
|
|
33
33
|
});
|
|
@@ -109,10 +109,10 @@ export class McpOauthOnDemandHub {
|
|
|
109
109
|
return { authUrl: started.authUrl, state: started.state };
|
|
110
110
|
}
|
|
111
111
|
async abortCall(sessionId, callId) {
|
|
112
|
-
await this.dropWhere(attempt => attempt.sessionId === sessionId && attempt.callId === callId, true);
|
|
112
|
+
await this.dropWhere((attempt) => attempt.sessionId === sessionId && attempt.callId === callId, true);
|
|
113
113
|
}
|
|
114
114
|
async abortSession(sessionId) {
|
|
115
|
-
await this.dropWhere(attempt => attempt.sessionId === sessionId, false);
|
|
115
|
+
await this.dropWhere((attempt) => attempt.sessionId === sessionId, false);
|
|
116
116
|
}
|
|
117
117
|
async close() {
|
|
118
118
|
await this.dropWhere(() => true, true);
|
|
@@ -83,12 +83,12 @@ export class FileMcpOAuthStore {
|
|
|
83
83
|
return (await this.entryFor(id, resourceUrl))?.clientInfo;
|
|
84
84
|
}
|
|
85
85
|
async saveTokens(id, resourceUrl, tokens) {
|
|
86
|
-
await this.update(id, resourceUrl, entry => {
|
|
86
|
+
await this.update(id, resourceUrl, (entry) => {
|
|
87
87
|
entry.tokens = tokens;
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
async saveClientInformation(id, resourceUrl, clientInfo) {
|
|
91
|
-
await this.update(id, resourceUrl, entry => {
|
|
91
|
+
await this.update(id, resourceUrl, (entry) => {
|
|
92
92
|
entry.clientInfo = clientInfo;
|
|
93
93
|
});
|
|
94
94
|
}
|
|
@@ -126,7 +126,7 @@ export class FileMcpOAuthStore {
|
|
|
126
126
|
if (this.cache !== undefined) {
|
|
127
127
|
return this.cache;
|
|
128
128
|
}
|
|
129
|
-
this.loading ??= this.readDisk().then(data => {
|
|
129
|
+
this.loading ??= this.readDisk().then((data) => {
|
|
130
130
|
this.cache = data;
|
|
131
131
|
return data;
|
|
132
132
|
});
|
|
@@ -161,7 +161,7 @@ export class FileMcpOAuthStore {
|
|
|
161
161
|
async withLock(fn) {
|
|
162
162
|
const prev = locks.get(this.path) ?? Promise.resolve();
|
|
163
163
|
let release;
|
|
164
|
-
locks.set(this.path, new Promise(resolve => {
|
|
164
|
+
locks.set(this.path, new Promise((resolve) => {
|
|
165
165
|
release = resolve;
|
|
166
166
|
}));
|
|
167
167
|
try {
|
|
@@ -368,7 +368,7 @@ export async function waitForMcpOAuthCallback(args) {
|
|
|
368
368
|
const timer = setTimeout(() => {
|
|
369
369
|
finish(undefined, new Error(`Timed out waiting for OAuth callback on http://localhost:${port}${path}`));
|
|
370
370
|
}, timeoutMs);
|
|
371
|
-
server.on("error", error => {
|
|
371
|
+
server.on("error", (error) => {
|
|
372
372
|
finish(undefined, new Error(`OAuth callback port ${port} failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
373
373
|
});
|
|
374
374
|
server.listen(port, "127.0.0.1");
|
package/dist/internal/net.js
CHANGED
|
@@ -20,8 +20,8 @@ export function isLoopbackHostname(hostname) {
|
|
|
20
20
|
if (ipv4 === null) {
|
|
21
21
|
return false;
|
|
22
22
|
}
|
|
23
|
-
const octets = ipv4.slice(1, 5).map(part => Number(part));
|
|
24
|
-
if (octets.some(octet => octet > 255)) {
|
|
23
|
+
const octets = ipv4.slice(1, 5).map((part) => Number(part));
|
|
24
|
+
if (octets.some((octet) => octet > 255)) {
|
|
25
25
|
return false;
|
|
26
26
|
}
|
|
27
27
|
return octets[0] === 127;
|
|
@@ -49,7 +49,7 @@ export function resolveOtelConfig(input) {
|
|
|
49
49
|
};
|
|
50
50
|
const envExporters = exportersFromEnv(env);
|
|
51
51
|
const exporters = merged.exporters !== undefined && merged.exporters.length > 0
|
|
52
|
-
? merged.exporters.map(e => withEnvHeaders(e, env))
|
|
52
|
+
? merged.exporters.map((e) => withEnvHeaders(e, env))
|
|
53
53
|
: envExporters;
|
|
54
54
|
const optedIn = input.authored !== undefined || input.serve !== undefined || envExporters.length > 0;
|
|
55
55
|
if (!optedIn) {
|
|
@@ -96,7 +96,7 @@ export function stripSignalPath(url) {
|
|
|
96
96
|
}
|
|
97
97
|
/** Exporters that apply to one signal (honors per-exporter `signals`). */
|
|
98
98
|
export function exportersForSignal(exporters, signal) {
|
|
99
|
-
return exporters.filter(exporter => exporter.signals === undefined || exporter.signals.includes(signal));
|
|
99
|
+
return exporters.filter((exporter) => exporter.signals === undefined || exporter.signals.includes(signal));
|
|
100
100
|
}
|
|
101
101
|
function disabled() {
|
|
102
102
|
return {
|
|
@@ -210,7 +210,7 @@ function stable(value) {
|
|
|
210
210
|
const obj = value;
|
|
211
211
|
return `{${Object.keys(obj)
|
|
212
212
|
.sort()
|
|
213
|
-
.map(key => `${JSON.stringify(key)}:${stable(obj[key])}`)
|
|
213
|
+
.map((key) => `${JSON.stringify(key)}:${stable(obj[key])}`)
|
|
214
214
|
.join(",")}}`;
|
|
215
215
|
}
|
|
216
216
|
function nonEmpty(value) {
|
|
@@ -75,7 +75,7 @@ export async function shutdownOtelRuntime(runtime) {
|
|
|
75
75
|
}
|
|
76
76
|
export async function raceOtelForceFlush(work, log, timeoutMs = OTEL_FORCE_FLUSH_TIMEOUT_MS) {
|
|
77
77
|
let timer;
|
|
78
|
-
const timeout = new Promise(resolve => {
|
|
78
|
+
const timeout = new Promise((resolve) => {
|
|
79
79
|
timer = setTimeout(() => resolve("timeout"), timeoutMs);
|
|
80
80
|
});
|
|
81
81
|
const result = await Promise.race([
|
|
@@ -91,11 +91,11 @@ export async function raceOtelForceFlush(work, log, timeoutMs = OTEL_FORCE_FLUSH
|
|
|
91
91
|
}
|
|
92
92
|
function startOtelSdk(config, logger, resolveExport) {
|
|
93
93
|
diag.setLogger({
|
|
94
|
-
verbose: m => logger(`[bdk:otel] ${m}`),
|
|
95
|
-
debug: m => logger(`[bdk:otel] ${m}`),
|
|
96
|
-
info: m => logger(`[bdk:otel] ${m}`),
|
|
97
|
-
warn: m => logger(`[bdk:otel] warn: ${m}`),
|
|
98
|
-
error: m => logger(`[bdk:otel] error: ${m}`),
|
|
94
|
+
verbose: (m) => logger(`[bdk:otel] ${m}`),
|
|
95
|
+
debug: (m) => logger(`[bdk:otel] ${m}`),
|
|
96
|
+
info: (m) => logger(`[bdk:otel] ${m}`),
|
|
97
|
+
warn: (m) => logger(`[bdk:otel] warn: ${m}`),
|
|
98
|
+
error: (m) => logger(`[bdk:otel] error: ${m}`),
|
|
99
99
|
}, DiagLogLevel.ERROR);
|
|
100
100
|
const resource = buildResource(config);
|
|
101
101
|
let tracerProvider;
|
|
@@ -136,7 +136,7 @@ function startOtelSdk(config, logger, resolveExport) {
|
|
|
136
136
|
const exportIntervalMillis = metricOpts.exportIntervalMillis ?? 10_000;
|
|
137
137
|
const provider = new MeterProvider({
|
|
138
138
|
resource,
|
|
139
|
-
readers: exporters.map(exporter => new PeriodicExportingMetricReader({
|
|
139
|
+
readers: exporters.map((exporter) => new PeriodicExportingMetricReader({
|
|
140
140
|
exporter: createMetricExporter(exporter, signalUrl(exporter.url, "metrics")),
|
|
141
141
|
exportIntervalMillis,
|
|
142
142
|
})),
|
|
@@ -155,7 +155,7 @@ function startOtelSdk(config, logger, resolveExport) {
|
|
|
155
155
|
if (exporters.length > 0) {
|
|
156
156
|
const provider = new LoggerProvider({
|
|
157
157
|
resource,
|
|
158
|
-
processors: exporters.map(exporter => new BatchLogRecordProcessor(createLogExporter(exporter, signalUrl(exporter.url, "logs")))),
|
|
158
|
+
processors: exporters.map((exporter) => new BatchLogRecordProcessor(createLogExporter(exporter, signalUrl(exporter.url, "logs")))),
|
|
159
159
|
});
|
|
160
160
|
// api-logs returns the active provider (ours on success, existing otherwise).
|
|
161
161
|
if (logs.setGlobalLoggerProvider(provider) === provider) {
|
|
@@ -226,22 +226,22 @@ function withExportResource(span, resource) {
|
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
228
|
async function exportQueuedSpans(spans, destinations, logger, resource) {
|
|
229
|
-
const payload = spans.map(span => withExportResource(span, resource));
|
|
230
|
-
const exporters = destinations.map(destination => createTraceExporter(destination, signalUrl(destination.url, "traces")));
|
|
229
|
+
const payload = spans.map((span) => withExportResource(span, resource));
|
|
230
|
+
const exporters = destinations.map((destination) => createTraceExporter(destination, signalUrl(destination.url, "traces")));
|
|
231
231
|
try {
|
|
232
|
-
const results = await Promise.all(exporters.map(exporter => new Promise(resolve => {
|
|
232
|
+
const results = await Promise.all(exporters.map((exporter) => new Promise((resolve) => {
|
|
233
233
|
exporter.export(payload, (result) => {
|
|
234
234
|
resolve(result.code === ExportResultCode.SUCCESS);
|
|
235
235
|
});
|
|
236
236
|
})));
|
|
237
|
-
return results.every(ok => ok);
|
|
237
|
+
return results.every((ok) => ok);
|
|
238
238
|
}
|
|
239
239
|
catch (error) {
|
|
240
240
|
logger(`[bdk:otel] deferred export failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
241
241
|
return false;
|
|
242
242
|
}
|
|
243
243
|
finally {
|
|
244
|
-
await Promise.allSettled(exporters.map(exporter => exporter.shutdown()));
|
|
244
|
+
await Promise.allSettled(exporters.map((exporter) => exporter.shutdown()));
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
function buildResource(config) {
|
|
@@ -18,7 +18,7 @@ import { MCP_ENDPOINT_PATH } from "./mcp-endpoint.js";
|
|
|
18
18
|
* self-references (an agent asking itself recurses forever).
|
|
19
19
|
*/
|
|
20
20
|
export function collectPeerConnections(mounts) {
|
|
21
|
-
const knownSlugs = new Set(mounts.map(({ slug }) => slug).filter(slug => slug !== ""));
|
|
21
|
+
const knownSlugs = new Set(mounts.map(({ slug }) => slug).filter((slug) => slug !== ""));
|
|
22
22
|
const bySlug = new Map();
|
|
23
23
|
for (const { slug, project } of mounts) {
|
|
24
24
|
const refs = [];
|
|
@@ -57,7 +57,7 @@ export function resolvePeerConnections(args) {
|
|
|
57
57
|
const serverBase = trimTrailingSlash(args.serverUrl);
|
|
58
58
|
const publicBase = args.publicUrl === undefined ? undefined : trimTrailingSlash(args.publicUrl);
|
|
59
59
|
const headers = args.authToken === undefined ? undefined : { authorization: `Bearer ${args.authToken}` };
|
|
60
|
-
return args.refs.map(ref => ({
|
|
60
|
+
return args.refs.map((ref) => ({
|
|
61
61
|
name: ref.name,
|
|
62
62
|
localUrl: `${serverBase}/${ref.targetSlug}${MCP_ENDPOINT_PATH}`,
|
|
63
63
|
...(publicBase === undefined
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mirror a persistent slot's `/state/logs` directory onto the framework store.
|
|
3
|
+
*
|
|
4
|
+
* One loop for every file in the folder. A file whose size and mtime match
|
|
5
|
+
* the last upload is left alone, including the read. Anything else is read
|
|
6
|
+
* from its tail, masked, and written over the same key. Store keys whose
|
|
7
|
+
* files are gone are deleted. The timer lives on the serve process, because
|
|
8
|
+
* a persistent VM stays up between turns. Freeze pods do not enter this path.
|
|
9
|
+
*/
|
|
10
|
+
import type { FileSink } from "../files.js";
|
|
11
|
+
import type { AgentProject } from "../types.js";
|
|
12
|
+
/** How often the resident process snapshots the directory. */
|
|
13
|
+
export declare const PERSISTENT_STAGE_LOG_SYNC_INTERVAL_MS = 30000;
|
|
14
|
+
/**
|
|
15
|
+
* Basenames written by the persistent stage logger: timestamp, optional generation, stage.
|
|
16
|
+
* Rejects paths, so a listing cannot escape the directory.
|
|
17
|
+
*/
|
|
18
|
+
export declare const PERSISTENT_STAGE_LOG_FILE_NAME: RegExp;
|
|
19
|
+
export interface PersistentStageLogMirror {
|
|
20
|
+
logsDir: string;
|
|
21
|
+
sink: FileSink;
|
|
22
|
+
agentName: string;
|
|
23
|
+
logger: (line: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function selectPersistentStageLogMirror(input: {
|
|
26
|
+
project: AgentProject;
|
|
27
|
+
logsDir: string;
|
|
28
|
+
logger?: (line: string) => void;
|
|
29
|
+
env?: Record<string, string | undefined>;
|
|
30
|
+
}): PersistentStageLogMirror | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Start the directory sync and return a stop that flushes once more. The
|
|
33
|
+
* interval does not keep the process alive on its own. A tick that lands
|
|
34
|
+
* while a sync is running is dropped; stop still runs one more after it.
|
|
35
|
+
*/
|
|
36
|
+
export declare function startPersistentStageLogMirror(mirror: PersistentStageLogMirror, options?: {
|
|
37
|
+
intervalMs?: number;
|
|
38
|
+
}): {
|
|
39
|
+
stop: () => Promise<void>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Upload changed files under `persistent-stage-logs/`, then drop keys for files that are
|
|
43
|
+
* no longer in the directory. A missing directory is a no-op, so a tick before
|
|
44
|
+
* the first stage command does not sweep a previous snapshot.
|
|
45
|
+
*/
|
|
46
|
+
export declare function syncPersistentStageLogDirectory(args: {
|
|
47
|
+
dir: string;
|
|
48
|
+
sink: FileSink;
|
|
49
|
+
agentName: string;
|
|
50
|
+
uploaded: Map<string, {
|
|
51
|
+
size: number;
|
|
52
|
+
mtimeMs: number;
|
|
53
|
+
}>;
|
|
54
|
+
maxBytes?: number;
|
|
55
|
+
logger?: (line: string) => void;
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
//# sourceMappingURL=persistent-stage-log-mirror.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistent-stage-log-mirror.d.ts","sourceRoot":"","sources":["../../src/internal/persistent-stage-log-mirror.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,8DAA8D;AAC9D,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,MAAkD,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C,GAAG,wBAAwB,GAAG,SAAS,CAiBvC;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,wBAAwB,EAChC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAgD/B;AAED;;;;GAIG;AACH,wBAAsB,+BAA+B,CAAC,IAAI,EAAE;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFhB"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mirror a persistent slot's `/state/logs` directory onto the framework store.
|
|
3
|
+
*
|
|
4
|
+
* One loop for every file in the folder. A file whose size and mtime match
|
|
5
|
+
* the last upload is left alone, including the read. Anything else is read
|
|
6
|
+
* from its tail, masked, and written over the same key. Store keys whose
|
|
7
|
+
* files are gone are deleted. The timer lives on the serve process, because
|
|
8
|
+
* a persistent VM stays up between turns. Freeze pods do not enter this path.
|
|
9
|
+
*/
|
|
10
|
+
import { open, readdir, stat } from "node:fs/promises";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { cursorHostedFiles } from "../files-backends/cursor-hosted.js";
|
|
13
|
+
import { agentSdkStorageKeys } from "../storage-protocol.js";
|
|
14
|
+
import { resolveApiKeySync } from "./cursor/credentials.js";
|
|
15
|
+
import { describeError } from "./describe-error.js";
|
|
16
|
+
import { maskStartLogTokens, START_LOG_STORE_MAX_BYTES } from "./start-log-store.js";
|
|
17
|
+
import { resolveAgentV2Hosting } from "./v2-hosting.js";
|
|
18
|
+
/** How often the resident process snapshots the directory. */
|
|
19
|
+
export const PERSISTENT_STAGE_LOG_SYNC_INTERVAL_MS = 30_000;
|
|
20
|
+
/**
|
|
21
|
+
* Basenames written by the persistent stage logger: timestamp, optional generation, stage.
|
|
22
|
+
* Rejects paths, so a listing cannot escape the directory.
|
|
23
|
+
*/
|
|
24
|
+
export const PERSISTENT_STAGE_LOG_FILE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,180}\.log$/;
|
|
25
|
+
export function selectPersistentStageLogMirror(input) {
|
|
26
|
+
const hosting = resolveAgentV2Hosting({
|
|
27
|
+
architecture: input.project.agent.architecture,
|
|
28
|
+
env: input.env,
|
|
29
|
+
});
|
|
30
|
+
if (hosting.kind !== "cursor-managed-persistent") {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
logsDir: input.logsDir,
|
|
35
|
+
sink: cursorHostedFiles({
|
|
36
|
+
resolveStoreSourceId: () => hosting.resolveStoreIds().frameworkStoreSourceId,
|
|
37
|
+
resolveApiKey: () => resolveApiKeySync()?.apiKey,
|
|
38
|
+
}),
|
|
39
|
+
agentName: input.project.name,
|
|
40
|
+
logger: input.logger ?? (() => { }),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Start the directory sync and return a stop that flushes once more. The
|
|
45
|
+
* interval does not keep the process alive on its own. A tick that lands
|
|
46
|
+
* while a sync is running is dropped; stop still runs one more after it.
|
|
47
|
+
*/
|
|
48
|
+
export function startPersistentStageLogMirror(mirror, options) {
|
|
49
|
+
const uploaded = new Map();
|
|
50
|
+
let stopped = false;
|
|
51
|
+
let syncing = false;
|
|
52
|
+
let chain = Promise.resolve();
|
|
53
|
+
const syncOnce = () => {
|
|
54
|
+
chain = chain
|
|
55
|
+
.then(() => syncPersistentStageLogDirectory({
|
|
56
|
+
dir: mirror.logsDir,
|
|
57
|
+
sink: mirror.sink,
|
|
58
|
+
agentName: mirror.agentName,
|
|
59
|
+
uploaded,
|
|
60
|
+
logger: mirror.logger,
|
|
61
|
+
}))
|
|
62
|
+
.catch((error) => {
|
|
63
|
+
mirror.logger(`[bdk] persistent-stage-logs: sync failed (${describeError(error)})`);
|
|
64
|
+
});
|
|
65
|
+
return chain;
|
|
66
|
+
};
|
|
67
|
+
const timer = setInterval(() => {
|
|
68
|
+
if (stopped || syncing) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
syncing = true;
|
|
72
|
+
void syncOnce().finally(() => {
|
|
73
|
+
syncing = false;
|
|
74
|
+
});
|
|
75
|
+
}, options?.intervalMs ?? PERSISTENT_STAGE_LOG_SYNC_INTERVAL_MS);
|
|
76
|
+
timer.unref();
|
|
77
|
+
syncing = true;
|
|
78
|
+
void syncOnce().finally(() => {
|
|
79
|
+
syncing = false;
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
stop: () => {
|
|
83
|
+
if (stopped) {
|
|
84
|
+
return chain;
|
|
85
|
+
}
|
|
86
|
+
stopped = true;
|
|
87
|
+
clearInterval(timer);
|
|
88
|
+
return syncOnce();
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Upload changed files under `persistent-stage-logs/`, then drop keys for files that are
|
|
94
|
+
* no longer in the directory. A missing directory is a no-op, so a tick before
|
|
95
|
+
* the first stage command does not sweep a previous snapshot.
|
|
96
|
+
*/
|
|
97
|
+
export async function syncPersistentStageLogDirectory(args) {
|
|
98
|
+
const logger = args.logger ?? (() => { });
|
|
99
|
+
const maxBytes = args.maxBytes ?? START_LOG_STORE_MAX_BYTES;
|
|
100
|
+
let entries;
|
|
101
|
+
try {
|
|
102
|
+
entries = await readdir(args.dir, { withFileTypes: true });
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (isEnoent(error)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
logger(`[bdk] persistent-stage-logs: read dir failed (${describeError(error)})`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const desired = new Set();
|
|
112
|
+
const names = entries
|
|
113
|
+
.filter((entry) => entry.isFile() && PERSISTENT_STAGE_LOG_FILE_NAME.test(entry.name))
|
|
114
|
+
.map((entry) => entry.name)
|
|
115
|
+
.sort();
|
|
116
|
+
for (const name of names) {
|
|
117
|
+
const path = join(args.dir, name);
|
|
118
|
+
let fileStat;
|
|
119
|
+
try {
|
|
120
|
+
fileStat = await stat(path);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (isEnoent(error)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// Keep the previous snapshot when this tick cannot see the file.
|
|
127
|
+
logger(`[bdk] persistent-stage-logs: read failed for ${name} (${describeError(error)})`);
|
|
128
|
+
desired.add(name);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (fileStat.size === 0) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const previous = args.uploaded.get(name);
|
|
135
|
+
if (previous?.size === fileStat.size && previous.mtimeMs === fileStat.mtimeMs) {
|
|
136
|
+
desired.add(name);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
let raw;
|
|
140
|
+
try {
|
|
141
|
+
raw = await readLogTail(path, fileStat.size, maxBytes);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (isEnoent(error)) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
logger(`[bdk] persistent-stage-logs: read failed for ${name} (${describeError(error)})`);
|
|
148
|
+
desired.add(name);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (raw.length === 0) {
|
|
152
|
+
desired.add(name);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const body = maskStartLogTokens(raw);
|
|
156
|
+
desired.add(name);
|
|
157
|
+
const key = agentSdkStorageKeys.persistentStageLog(args.agentName, name);
|
|
158
|
+
try {
|
|
159
|
+
await args.sink.put(key, new TextEncoder().encode(body));
|
|
160
|
+
args.uploaded.set(name, { size: fileStat.size, mtimeMs: fileStat.mtimeMs });
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
logger(`[bdk] persistent-stage-logs: persist failed for ${name} (${describeError(error)})`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const prefix = agentSdkStorageKeys.persistentStageLogsPrefix(args.agentName);
|
|
167
|
+
let listed;
|
|
168
|
+
try {
|
|
169
|
+
listed = await args.sink.list(prefix);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
logger(`[bdk] persistent-stage-logs: list failed (${describeError(error)})`);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
for (const item of listed) {
|
|
176
|
+
const name = fileNameFromPersistentStageLogKey(item.key, prefix);
|
|
177
|
+
if (name === undefined || desired.has(name)) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
await args.sink.delete(item.key);
|
|
182
|
+
args.uploaded.delete(name);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
logger(`[bdk] persistent-stage-logs: delete failed for ${name} (${describeError(error)})`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** Read the last `maxBytes` of a file without loading the rest of it. */
|
|
190
|
+
async function readLogTail(path, size, maxBytes) {
|
|
191
|
+
const length = Math.min(size, maxBytes);
|
|
192
|
+
const position = size - length;
|
|
193
|
+
const handle = await open(path, "r");
|
|
194
|
+
try {
|
|
195
|
+
const buffer = Buffer.alloc(length);
|
|
196
|
+
let offset = 0;
|
|
197
|
+
while (offset < length) {
|
|
198
|
+
const { bytesRead } = await handle.read(buffer, offset, length - offset, position + offset);
|
|
199
|
+
if (bytesRead === 0) {
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
offset += bytesRead;
|
|
203
|
+
}
|
|
204
|
+
return new TextDecoder().decode(buffer.subarray(0, offset));
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
await handle.close();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function fileNameFromPersistentStageLogKey(key, prefix) {
|
|
211
|
+
if (!key.startsWith(prefix)) {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
const segment = key.slice(prefix.length);
|
|
215
|
+
if (segment.length === 0 || segment.includes("/")) {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const name = decodeURIComponent(segment);
|
|
220
|
+
return PERSISTENT_STAGE_LOG_FILE_NAME.test(name) ? name : undefined;
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function isEnoent(error) {
|
|
227
|
+
return (error !== null &&
|
|
228
|
+
typeof error === "object" &&
|
|
229
|
+
"code" in error &&
|
|
230
|
+
error.code === "ENOENT");
|
|
231
|
+
}
|
|
@@ -8,7 +8,7 @@ import { dirname } from "node:path";
|
|
|
8
8
|
export const PLATFORM_SCHEDULE_CATALOG_FILENAME = "platform-schedule-names.json";
|
|
9
9
|
export async function syncHostedPlatformSchedules(args) {
|
|
10
10
|
const previous = await readScheduleCatalog(args.catalogPath);
|
|
11
|
-
const currentNames = args.schedules.map(schedule => schedule.name);
|
|
11
|
+
const currentNames = args.schedules.map((schedule) => schedule.name);
|
|
12
12
|
const currentSet = new Set(currentNames);
|
|
13
13
|
const failedDeletes = [];
|
|
14
14
|
for (const name of previous) {
|
|
@@ -110,7 +110,7 @@ const AGENTSDK_REMINDERS_PREFIX = "/internal/agentsdk";
|
|
|
110
110
|
const APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS = 3;
|
|
111
111
|
const APPLY_REMINDER_OUTCOME_RETRY_DELAY_MS = 50;
|
|
112
112
|
async function sleepMs(ms) {
|
|
113
|
-
await new Promise(resolve => setTimeout(resolve, ms));
|
|
113
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
114
114
|
}
|
|
115
115
|
async function withBoundedApplyRetries(run) {
|
|
116
116
|
let lastError;
|