@cursor/bdk 0.2.11 → 0.2.13
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/github/index.d.ts +22 -12
- package/dist/channels/github/index.d.ts.map +1 -1
- package/dist/channels/github/index.js +11 -12
- 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/index.d.ts +21 -11
- package/dist/channels/origin/index.d.ts.map +1 -1
- package/dist/channels/origin/index.js +10 -11
- 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.CaLG1pPt.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.DvlKuIO-.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BrbO5mEe.js → VPLocalSearchBox.YsP_2wqD.js} +2 -2
- package/dist/docs/assets/chunks/{arc.BOG1yms8.js → arc.C2j9hR7c.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.C0hsMZnZ.js → architectureDiagram-Q4EWVU46.C5qkGp7y.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.H044KjKs.js → baseUniq.U6GgTHOD.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BsRW6GoB.js → blockDiagram-DXYQGD6D.D51mJop2.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.B9HV5PFR.js → c4Diagram-AHTNJAMY.w1d6QxV7.js} +1 -1
- package/dist/docs/assets/chunks/channel.BRSFxCcD.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CPoT_ajl.js → chunk-4BX2VUAB.B_A815un.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DZBwWuCL.js → chunk-4TB4RGXK.DMrm-ZCb.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.CZ3yTiyq.js → chunk-55IACEB6.8qw6Xdal.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.6DfvHSd8.js → chunk-EDXVE4YY.Cq_nHODn.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CpBj8HfK.js → chunk-FMBD7UC4.B67ohCYn.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.BdKo8YqS.js → chunk-OYMX7WX6.Bo8rQI8F.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnXNyxJx.js → chunk-QZHKN3VN.BERUMfE9.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.Cg1OcF8G.js → chunk-YZCP3GAM.DWG2tXIX.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Cmtm6WkN.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Cmtm6WkN.js +1 -0
- package/dist/docs/assets/chunks/clone.JMC96Eo6.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.1SP8al9c.js → cose-bilkent-S5V4N54A.tezXBs9b.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.DS1L6hJt.js → dagre-KV5264BT.aSbEUwT7.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.ChsausbG.js → diagram-5BDNPKRD.vnT6aJ57.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.3XsptNWj.js → diagram-G4DWMVQ6.hGYdrDa2.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DPA9Dk_P.js → diagram-MMDJMWI5.CmdSUP6L.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.BVswXWrB.js → diagram-TYMM5635.BbAnLEBB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.BSak5OSP.js → erDiagram-SMLLAGMA.H40W4HWE.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.CQgN4TTz.js → flowDiagram-DWJPFMVM.BFMtUSv-.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.GrT0kA4a.js → ganttDiagram-T4ZO3ILL.CbYiu7Dt.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CdS7Ucll.js → gitGraphDiagram-UUTBAWPF.Cyc5mzZD.js} +1 -1
- package/dist/docs/assets/chunks/{graph.BVqKRmRo.js → graph.BRptDG1H.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.C3C9FRto.js → infoDiagram-42DDH7IO.Bz6KCA3a.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js → ishikawaDiagram-UXIWVN3A.DDJ_7_Fq.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CaHMfK4b.js → journeyDiagram-VCZTEJTY.D0t_ltlb.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.CjhIUwcA.js → kanban-definition-6JOO6SKY.DyyNsMfi.js} +1 -1
- package/dist/docs/assets/chunks/{layout.CGU3gfSf.js → layout.Cbxq-Rhp.js} +1 -1
- package/dist/docs/assets/chunks/{linear.DaihpW_n.js → linear.DxGYL0MP.js} +1 -1
- package/dist/docs/assets/chunks/{min.BS-j8kHQ.js → min.DA5KL8wu.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.BVJ1Bbnk.js → mindmap-definition-QFDTVHPH.Bc72Utls.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.Cz1WIv9r.js → pieDiagram-DEJITSTG.BtpHnIB_.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DKLFxcjy.js → quadrantDiagram-34T5L4WZ.Cx4oCSRR.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.BHegiK7x.js → requirementDiagram-MS252O5E.BC0hXWlW.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DYkY6yPc.js → sankeyDiagram-XADWPNL6.Dg8T1SEp.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DYQ1QUrI.js → sequenceDiagram-FGHM5R23.CWSdHYAF.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.Iru8BsFo.js → stateDiagram-FHFEXIEX.0MVPRI28.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.N4Am6sXd.js +1 -0
- package/dist/docs/assets/chunks/{theme.DaplWQhQ.js → theme.DO1avLBn.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BwFA8hiX.js → timeline-definition-GMOUNBTQ.BuRinAVi.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CZ60W1C_.js → vennDiagram-DHZGUBPP.DXf0PCoJ.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD._eATmGtu.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.B69D2r8-.js → wardleyDiagram-NUSXRM2D.T4ThngYV.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CLPZEIU9.js → xychartDiagram-5P7HB3ND.b4pZF3D5.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.ClkMoQsV.js → reference_skills.md.C0guGcH0.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.d.ts +4 -3
- package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
- package/dist/internal/authored-alias-hooks.js +16 -7
- package/dist/internal/authored-loaders.d.ts.map +1 -1
- package/dist/internal/authored-loaders.js +21 -5
- 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-manifest.d.ts +14 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +33 -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.d.ts.map +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 +24 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +58 -14
- package/dist/internal/hosted-delivery.d.ts +6 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +64 -13
- package/dist/internal/hosted-eval-cases.js +4 -4
- package/dist/internal/hosted-execution-diag.js +3 -3
- package/dist/internal/hosted-managed-automation.d.ts +3 -3
- package/dist/internal/hosted-managed-automation.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.d.ts +13 -2
- package/dist/internal/schedule-runner.d.ts.map +1 -1
- package/dist/internal/schedule-runner.js +48 -9
- package/dist/internal/sdk-runner.d.ts +2 -1
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +13 -8
- package/dist/internal/serve-restart.js +1 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +101 -76
- 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 +48 -0
- package/dist/internal/session-live-publisher.d.ts.map +1 -0
- package/dist/internal/session-live-publisher.js +415 -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/testing/conversation-identity-vectors.d.ts +48 -0
- package/dist/internal/testing/conversation-identity-vectors.d.ts.map +1 -0
- package/dist/internal/testing/conversation-identity-vectors.js +136 -0
- 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-CzttDc-d.css +1 -0
- package/dist/playground/assets/{index-Be0-1hw2.js → index-DIiKbZ25.js} +42 -42
- 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 +21 -4
- 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-Clz6uHj9.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.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publishes session events to the managed live relay (`session.live`) so the
|
|
3
|
+
* playground, the session view, and the CLI can show a hosted turn while it
|
|
4
|
+
* runs. The on-disk event log and the storage coordinator stay the durable
|
|
5
|
+
* path; this is a best-effort copy for viewers.
|
|
6
|
+
*
|
|
7
|
+
* The relay keeps events only while a viewer watches. Unwatched, a session
|
|
8
|
+
* sends a small probe at most once per `recheckAfterMs` window and nothing
|
|
9
|
+
* else. Once a viewer watches, events go out in short batches, and when the
|
|
10
|
+
* relay reports a gap (`replayFromIndex`) the missing events are reread from
|
|
11
|
+
* the local log and resent.
|
|
12
|
+
*
|
|
13
|
+
* Publishing can never slow or fail a turn: {@link SessionLivePublisher.event}
|
|
14
|
+
* is synchronous, requests time out quickly, queues are bounded, a failed
|
|
15
|
+
* batch is dropped, and repeated failures pause the session. A 404 means the
|
|
16
|
+
* backend predates the relay and turns publishing off for the process.
|
|
17
|
+
*/
|
|
18
|
+
import type { SessionEvent } from "../types.js";
|
|
19
|
+
import { type CursorApiTransportOptions } from "./cursor/cursor-api-transport.js";
|
|
20
|
+
import { type SessionLiveEventWire } from "./store-api-protocol.js";
|
|
21
|
+
/** How long events collect before a batch goes out. */
|
|
22
|
+
export declare const SESSION_LIVE_BATCH_WINDOW_MS = 150;
|
|
23
|
+
export interface SessionLivePublisherOptions extends CursorApiTransportOptions {
|
|
24
|
+
/** Local events from `fromIndex` on, for replays. */
|
|
25
|
+
readEvents(sessionId: string, fromIndex: number): Promise<SessionEvent[]>;
|
|
26
|
+
/** Whether the managed store API is bound; defaults to the pod's store pin. */
|
|
27
|
+
isEnabled?: () => boolean;
|
|
28
|
+
logger?: (line: string) => void;
|
|
29
|
+
now?: () => number;
|
|
30
|
+
}
|
|
31
|
+
export interface SessionLivePublisher {
|
|
32
|
+
/** Offer one appended event. Never throws and never waits. */
|
|
33
|
+
event(event: SessionEvent): void;
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The event as it crosses the live wire. Delta events drop the accumulated
|
|
38
|
+
* `text` (viewers rebuild it from deltas). An event over the per-event cap
|
|
39
|
+
* keeps its envelope and `data` with long strings shortened, marked
|
|
40
|
+
* `liveTruncated`; when even that is too large, `data` keeps only the fields
|
|
41
|
+
* viewers need to place the event.
|
|
42
|
+
*/
|
|
43
|
+
export declare function toSessionLiveWire(event: SessionEvent): {
|
|
44
|
+
wire: SessionLiveEventWire;
|
|
45
|
+
bytes: number;
|
|
46
|
+
};
|
|
47
|
+
export declare function createSessionLivePublisher(options: SessionLivePublisherOptions): SessionLivePublisher;
|
|
48
|
+
//# sourceMappingURL=session-live-publisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-live-publisher.d.ts","sourceRoot":"","sources":["../../src/internal/session-live-publisher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,KAAK,yBAAyB,EAI/B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAIL,KAAK,oBAAoB,EAM1B,MAAM,yBAAyB,CAAC;AAEjC,uDAAuD;AACvD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AA+ChD,MAAM,WAAW,2BAA4B,SAAQ,yBAAyB;IAC5E,qDAAqD;IACrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1E,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf;AA8DD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG;IACtD,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CA+BA;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAqStB"}
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publishes session events to the managed live relay (`session.live`) so the
|
|
3
|
+
* playground, the session view, and the CLI can show a hosted turn while it
|
|
4
|
+
* runs. The on-disk event log and the storage coordinator stay the durable
|
|
5
|
+
* path; this is a best-effort copy for viewers.
|
|
6
|
+
*
|
|
7
|
+
* The relay keeps events only while a viewer watches. Unwatched, a session
|
|
8
|
+
* sends a small probe at most once per `recheckAfterMs` window and nothing
|
|
9
|
+
* else. Once a viewer watches, events go out in short batches, and when the
|
|
10
|
+
* relay reports a gap (`replayFromIndex`) the missing events are reread from
|
|
11
|
+
* the local log and resent.
|
|
12
|
+
*
|
|
13
|
+
* Publishing can never slow or fail a turn: {@link SessionLivePublisher.event}
|
|
14
|
+
* is synchronous, requests time out quickly, queues are bounded, a failed
|
|
15
|
+
* batch is dropped, and repeated failures pause the session. A 404 means the
|
|
16
|
+
* backend predates the relay and turns publishing off for the process.
|
|
17
|
+
*/
|
|
18
|
+
import { resolveCursorApiBaseUrl, resolveCursorApiFetch, resolveCursorApiKey, } from "./cursor/cursor-api-transport.js";
|
|
19
|
+
import { isStoreApiLaneEnabled } from "./cursor/store-api-client.js";
|
|
20
|
+
import { describeError } from "./describe-error.js";
|
|
21
|
+
import { SESSION_LIVE_MAX_BATCH_BYTES, SESSION_LIVE_MAX_BATCH_EVENTS, SESSION_LIVE_MAX_EVENT_BYTES, STORE_API_PATH, STORE_API_PROTOCOL_VERSION, STORE_API_SESSION_LIVE_CALL, sessionLiveResponseSchema, } from "./store-api-protocol.js";
|
|
22
|
+
/** How long events collect before a batch goes out. */
|
|
23
|
+
export const SESSION_LIVE_BATCH_WINDOW_MS = 150;
|
|
24
|
+
/** A batch this large goes out without waiting for the window. */
|
|
25
|
+
const SESSION_LIVE_EAGER_BATCH_BYTES = 64 * 1024;
|
|
26
|
+
const SESSION_LIVE_REQUEST_TIMEOUT_MS = 1_000;
|
|
27
|
+
/** Queued events per session; past this the oldest drop and the relay asks for a replay. */
|
|
28
|
+
const SESSION_LIVE_MAX_QUEUED_EVENTS = 2_000;
|
|
29
|
+
const SESSION_LIVE_FAILURES_BEFORE_PAUSE = 3;
|
|
30
|
+
const SESSION_LIVE_PAUSE_MS = 60_000;
|
|
31
|
+
/** The same replay request is honored at most this often. */
|
|
32
|
+
const SESSION_LIVE_REPLAY_COOLDOWN_MS = 5_000;
|
|
33
|
+
/** A session with no events for this long drops its state. */
|
|
34
|
+
const SESSION_LIVE_IDLE_MS = 10 * 60_000;
|
|
35
|
+
const TERMINAL_EVENT_TYPES = new Set(["session.completed", "session.failed"]);
|
|
36
|
+
const BOUNDARY_EVENT_TYPES = new Set([
|
|
37
|
+
"turn.completed",
|
|
38
|
+
"turn.failed",
|
|
39
|
+
"session.waiting",
|
|
40
|
+
"session.completed",
|
|
41
|
+
"session.failed",
|
|
42
|
+
]);
|
|
43
|
+
const DELTA_EVENT_TYPES = new Set(["message.appended", "reasoning.appended"]);
|
|
44
|
+
function utf8Bytes(text) {
|
|
45
|
+
return Buffer.byteLength(text, "utf8");
|
|
46
|
+
}
|
|
47
|
+
/** Per-string length limits tried, longest first, until an event fits the cap. */
|
|
48
|
+
const LIVE_TRUNCATION_STEPS = [4096, 1024, 256, 64];
|
|
49
|
+
/**
|
|
50
|
+
* `data` fields viewers use to place an event (which tool card, which
|
|
51
|
+
* subagent, how the turn ended). They survive every truncation step.
|
|
52
|
+
*/
|
|
53
|
+
const LIVE_IDENTITY_KEYS = [
|
|
54
|
+
"callId",
|
|
55
|
+
"toolName",
|
|
56
|
+
"parentCallId",
|
|
57
|
+
"isError",
|
|
58
|
+
"finishReason",
|
|
59
|
+
"stepId",
|
|
60
|
+
"decision",
|
|
61
|
+
"sdkAgentId",
|
|
62
|
+
];
|
|
63
|
+
const LIVE_TRUNCATION_MARKER = "… [truncated in the live view]";
|
|
64
|
+
function truncateStrings(value, maxChars) {
|
|
65
|
+
if (typeof value === "string") {
|
|
66
|
+
return value.length > maxChars ? `${value.slice(0, maxChars)}${LIVE_TRUNCATION_MARKER}` : value;
|
|
67
|
+
}
|
|
68
|
+
if (Array.isArray(value)) {
|
|
69
|
+
return value.map((item) => truncateStrings(item, maxChars));
|
|
70
|
+
}
|
|
71
|
+
if (value !== null && typeof value === "object") {
|
|
72
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, truncateStrings(item, maxChars)]));
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
function identityData(data) {
|
|
77
|
+
const kept = {};
|
|
78
|
+
if (data === null || typeof data !== "object" || Array.isArray(data)) {
|
|
79
|
+
return kept;
|
|
80
|
+
}
|
|
81
|
+
for (const key of LIVE_IDENTITY_KEYS) {
|
|
82
|
+
const value = data[key];
|
|
83
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
84
|
+
kept[key] = value;
|
|
85
|
+
}
|
|
86
|
+
else if (typeof value === "string") {
|
|
87
|
+
kept[key] = truncateStrings(value, 256);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// `actions.requested` places its tool cards from `calls`.
|
|
91
|
+
const calls = data.calls;
|
|
92
|
+
if (Array.isArray(calls)) {
|
|
93
|
+
kept.calls = calls.slice(0, 50).map((call) => identityData(call));
|
|
94
|
+
}
|
|
95
|
+
return kept;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The event as it crosses the live wire. Delta events drop the accumulated
|
|
99
|
+
* `text` (viewers rebuild it from deltas). An event over the per-event cap
|
|
100
|
+
* keeps its envelope and `data` with long strings shortened, marked
|
|
101
|
+
* `liveTruncated`; when even that is too large, `data` keeps only the fields
|
|
102
|
+
* viewers need to place the event.
|
|
103
|
+
*/
|
|
104
|
+
export function toSessionLiveWire(event) {
|
|
105
|
+
let wire = event;
|
|
106
|
+
if (DELTA_EVENT_TYPES.has(event.type)) {
|
|
107
|
+
const data = event.data;
|
|
108
|
+
if (data !== undefined && "text" in data) {
|
|
109
|
+
const { text: _text, ...rest } = data;
|
|
110
|
+
wire = { ...wire, data: rest };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const bytes = utf8Bytes(JSON.stringify(wire));
|
|
114
|
+
if (bytes <= SESSION_LIVE_MAX_EVENT_BYTES) {
|
|
115
|
+
return { wire, bytes };
|
|
116
|
+
}
|
|
117
|
+
for (const maxChars of LIVE_TRUNCATION_STEPS) {
|
|
118
|
+
const candidate = {
|
|
119
|
+
...wire,
|
|
120
|
+
data: truncateStrings(wire.data, maxChars),
|
|
121
|
+
liveTruncated: true,
|
|
122
|
+
};
|
|
123
|
+
const candidateBytes = utf8Bytes(JSON.stringify(candidate));
|
|
124
|
+
if (candidateBytes <= SESSION_LIVE_MAX_EVENT_BYTES) {
|
|
125
|
+
return { wire: candidate, bytes: candidateBytes };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const minimal = { index: event.index, type: event.type };
|
|
129
|
+
if (typeof event.at === "string")
|
|
130
|
+
minimal.at = event.at;
|
|
131
|
+
if (typeof event.turnId === "string")
|
|
132
|
+
minimal.turnId = event.turnId;
|
|
133
|
+
if (typeof event.sessionId === "string")
|
|
134
|
+
minimal.sessionId = event.sessionId;
|
|
135
|
+
minimal.data = identityData(wire.data);
|
|
136
|
+
minimal.liveTruncated = true;
|
|
137
|
+
return { wire: minimal, bytes: utf8Bytes(JSON.stringify(minimal)) };
|
|
138
|
+
}
|
|
139
|
+
export function createSessionLivePublisher(options) {
|
|
140
|
+
const now = options.now ?? Date.now;
|
|
141
|
+
const logger = options.logger ?? (() => { });
|
|
142
|
+
const isEnabled = options.isEnabled ?? (() => isStoreApiLaneEnabled(options));
|
|
143
|
+
const sessions = new Map();
|
|
144
|
+
let disabled = false;
|
|
145
|
+
let closed = false;
|
|
146
|
+
const stateFor = (sessionId) => {
|
|
147
|
+
let state = sessions.get(sessionId);
|
|
148
|
+
if (state === undefined) {
|
|
149
|
+
state = {
|
|
150
|
+
subscribed: false,
|
|
151
|
+
nextProbeAt: 0,
|
|
152
|
+
queue: [],
|
|
153
|
+
queuedBytes: 0,
|
|
154
|
+
timer: undefined,
|
|
155
|
+
inFlight: false,
|
|
156
|
+
sendAgain: false,
|
|
157
|
+
failures: 0,
|
|
158
|
+
pausedUntil: 0,
|
|
159
|
+
lastReplay: undefined,
|
|
160
|
+
lastEventAt: now(),
|
|
161
|
+
closing: false,
|
|
162
|
+
};
|
|
163
|
+
sessions.set(sessionId, state);
|
|
164
|
+
}
|
|
165
|
+
return state;
|
|
166
|
+
};
|
|
167
|
+
const dropSession = (sessionId, state) => {
|
|
168
|
+
if (state.timer !== undefined) {
|
|
169
|
+
clearTimeout(state.timer);
|
|
170
|
+
}
|
|
171
|
+
sessions.delete(sessionId);
|
|
172
|
+
};
|
|
173
|
+
const sweepIdle = () => {
|
|
174
|
+
const cutoff = now() - SESSION_LIVE_IDLE_MS;
|
|
175
|
+
for (const [sessionId, state] of sessions) {
|
|
176
|
+
if (!state.inFlight && state.lastEventAt < cutoff) {
|
|
177
|
+
dropSession(sessionId, state);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const clearQueue = (state) => {
|
|
182
|
+
state.queue = [];
|
|
183
|
+
state.queuedBytes = 0;
|
|
184
|
+
};
|
|
185
|
+
const enqueue = (state, events) => {
|
|
186
|
+
const byIndex = new Map(state.queue.map((entry) => [entry.index, entry]));
|
|
187
|
+
for (const event of events) {
|
|
188
|
+
const { wire, bytes } = toSessionLiveWire(event);
|
|
189
|
+
byIndex.set(event.index, { index: event.index, wire, bytes });
|
|
190
|
+
}
|
|
191
|
+
// Over the cap, the newest events drop: the viewer needs an unbroken run
|
|
192
|
+
// from its next index, and the relay asks for the rest again once the
|
|
193
|
+
// oldest land.
|
|
194
|
+
const queue = [...byIndex.values()]
|
|
195
|
+
.sort((a, b) => a.index - b.index)
|
|
196
|
+
.slice(0, SESSION_LIVE_MAX_QUEUED_EVENTS);
|
|
197
|
+
state.queue = queue;
|
|
198
|
+
state.queuedBytes = queue.reduce((total, entry) => total + entry.bytes, 0);
|
|
199
|
+
};
|
|
200
|
+
const takeBatch = (state) => {
|
|
201
|
+
const batch = [];
|
|
202
|
+
let bytes = 0;
|
|
203
|
+
while (batch.length < SESSION_LIVE_MAX_BATCH_EVENTS) {
|
|
204
|
+
const next = state.queue[0];
|
|
205
|
+
if (next === undefined) {
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
if (batch.length > 0 && bytes + next.bytes > SESSION_LIVE_MAX_BATCH_BYTES) {
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
batch.push(next);
|
|
212
|
+
bytes += next.bytes;
|
|
213
|
+
state.queue.shift();
|
|
214
|
+
}
|
|
215
|
+
state.queuedBytes -= bytes;
|
|
216
|
+
return batch;
|
|
217
|
+
};
|
|
218
|
+
const post = async (sessionId, events) => {
|
|
219
|
+
let response;
|
|
220
|
+
try {
|
|
221
|
+
response = await resolveCursorApiFetch(options)(`${resolveCursorApiBaseUrl(options)}${STORE_API_PATH}/${STORE_API_SESSION_LIVE_CALL}`, {
|
|
222
|
+
method: "POST",
|
|
223
|
+
headers: {
|
|
224
|
+
Authorization: `Bearer ${resolveCursorApiKey(options)}`,
|
|
225
|
+
"Content-Type": "application/json",
|
|
226
|
+
},
|
|
227
|
+
body: JSON.stringify({
|
|
228
|
+
v: STORE_API_PROTOCOL_VERSION,
|
|
229
|
+
call: STORE_API_SESSION_LIVE_CALL,
|
|
230
|
+
payload: { sessionId, events },
|
|
231
|
+
}),
|
|
232
|
+
signal: AbortSignal.timeout(SESSION_LIVE_REQUEST_TIMEOUT_MS),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
return { kind: "failed", reason: describeError(error) };
|
|
237
|
+
}
|
|
238
|
+
if (response.status === 404) {
|
|
239
|
+
return { kind: "not_found" };
|
|
240
|
+
}
|
|
241
|
+
if (response.status === 429) {
|
|
242
|
+
const seconds = Number(response.headers.get("retry-after"));
|
|
243
|
+
return {
|
|
244
|
+
kind: "shed",
|
|
245
|
+
retryAfterMs: Number.isFinite(seconds) && seconds > 0 ? seconds * 1_000 : SESSION_LIVE_PAUSE_MS,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
if (!response.ok) {
|
|
249
|
+
return { kind: "failed", reason: `HTTP ${response.status}` };
|
|
250
|
+
}
|
|
251
|
+
try {
|
|
252
|
+
const parsed = sessionLiveResponseSchema.safeParse(await response.json());
|
|
253
|
+
return parsed.success
|
|
254
|
+
? { kind: "ok", reply: parsed.data }
|
|
255
|
+
: { kind: "failed", reason: "response failed the session.live schema" };
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return { kind: "failed", reason: "non-JSON response" };
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
const replay = async (sessionId, state, from) => {
|
|
262
|
+
const at = now();
|
|
263
|
+
if (state.lastReplay !== undefined &&
|
|
264
|
+
state.lastReplay.from === from &&
|
|
265
|
+
at - state.lastReplay.at < SESSION_LIVE_REPLAY_COOLDOWN_MS) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
state.lastReplay = { from, at };
|
|
269
|
+
try {
|
|
270
|
+
enqueue(state, await options.readEvents(sessionId, from));
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
logger(`[bdk] live replay read failed for ${sessionId}: ${describeError(error)}`);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
const schedule = (sessionId, state, delayMs) => {
|
|
277
|
+
if (state.timer !== undefined || closed) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
state.timer = setTimeout(() => {
|
|
281
|
+
state.timer = undefined;
|
|
282
|
+
void send(sessionId, state);
|
|
283
|
+
}, delayMs);
|
|
284
|
+
state.timer.unref?.();
|
|
285
|
+
};
|
|
286
|
+
const send = async (sessionId, state) => {
|
|
287
|
+
if (disabled || closed) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (state.inFlight) {
|
|
291
|
+
state.sendAgain = true;
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
state.inFlight = true;
|
|
295
|
+
state.sendAgain = false;
|
|
296
|
+
const batch = state.subscribed ? takeBatch(state) : [];
|
|
297
|
+
try {
|
|
298
|
+
const outcome = await post(sessionId, batch.map((entry) => entry.wire));
|
|
299
|
+
switch (outcome.kind) {
|
|
300
|
+
case "not_found":
|
|
301
|
+
disabled = true;
|
|
302
|
+
for (const [id, other] of sessions) {
|
|
303
|
+
dropSession(id, other);
|
|
304
|
+
}
|
|
305
|
+
logger("[bdk] live session relay unavailable (404); live publishing off for this process");
|
|
306
|
+
return;
|
|
307
|
+
case "shed":
|
|
308
|
+
state.subscribed = false;
|
|
309
|
+
clearQueue(state);
|
|
310
|
+
state.pausedUntil = now() + outcome.retryAfterMs;
|
|
311
|
+
return;
|
|
312
|
+
case "failed":
|
|
313
|
+
state.failures += 1;
|
|
314
|
+
clearQueue(state);
|
|
315
|
+
if (state.failures >= SESSION_LIVE_FAILURES_BEFORE_PAUSE) {
|
|
316
|
+
state.failures = 0;
|
|
317
|
+
state.subscribed = false;
|
|
318
|
+
state.pausedUntil = now() + SESSION_LIVE_PAUSE_MS;
|
|
319
|
+
logger(`[bdk] live publishing paused for ${sessionId}: ${outcome.reason}`);
|
|
320
|
+
}
|
|
321
|
+
return;
|
|
322
|
+
case "ok": {
|
|
323
|
+
state.failures = 0;
|
|
324
|
+
const { reply } = outcome;
|
|
325
|
+
state.subscribed = reply.subscribed;
|
|
326
|
+
if (!reply.subscribed) {
|
|
327
|
+
clearQueue(state);
|
|
328
|
+
state.nextProbeAt = now() + reply.recheckAfterMs;
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (reply.replayFromIndex !== null) {
|
|
332
|
+
await replay(sessionId, state, reply.replayFromIndex);
|
|
333
|
+
}
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
state.inFlight = false;
|
|
340
|
+
if (state.closing && state.queue.length === 0) {
|
|
341
|
+
dropSession(sessionId, state);
|
|
342
|
+
}
|
|
343
|
+
else if (state.subscribed && (state.queue.length > 0 || state.sendAgain)) {
|
|
344
|
+
schedule(sessionId, state, 0);
|
|
345
|
+
}
|
|
346
|
+
else if (state.sendAgain) {
|
|
347
|
+
void send(sessionId, state);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
return {
|
|
352
|
+
event(event) {
|
|
353
|
+
if (disabled || closed) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
const sessionId = event.sessionId;
|
|
358
|
+
if (typeof sessionId !== "string" || sessionId === "") {
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
let state = sessions.get(sessionId);
|
|
362
|
+
if (state === undefined) {
|
|
363
|
+
sweepIdle();
|
|
364
|
+
state = stateFor(sessionId);
|
|
365
|
+
if (!isEnabled()) {
|
|
366
|
+
// Decided once per session: the pin is a file read, and delta
|
|
367
|
+
// events arrive per token.
|
|
368
|
+
state.pausedUntil = Number.POSITIVE_INFINITY;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
const at = now();
|
|
372
|
+
state.lastEventAt = at;
|
|
373
|
+
if (TERMINAL_EVENT_TYPES.has(event.type)) {
|
|
374
|
+
state.closing = true;
|
|
375
|
+
}
|
|
376
|
+
if (at < state.pausedUntil) {
|
|
377
|
+
if (state.closing) {
|
|
378
|
+
dropSession(sessionId, state);
|
|
379
|
+
}
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if (!state.subscribed) {
|
|
383
|
+
if (at >= state.nextProbeAt && !state.inFlight) {
|
|
384
|
+
state.nextProbeAt = at + SESSION_LIVE_BATCH_WINDOW_MS;
|
|
385
|
+
void send(sessionId, state);
|
|
386
|
+
}
|
|
387
|
+
else if (state.closing && !state.inFlight) {
|
|
388
|
+
dropSession(sessionId, state);
|
|
389
|
+
}
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
enqueue(state, [event]);
|
|
393
|
+
if (BOUNDARY_EVENT_TYPES.has(event.type) ||
|
|
394
|
+
state.queuedBytes >= SESSION_LIVE_EAGER_BATCH_BYTES) {
|
|
395
|
+
if (state.timer !== undefined) {
|
|
396
|
+
clearTimeout(state.timer);
|
|
397
|
+
state.timer = undefined;
|
|
398
|
+
}
|
|
399
|
+
void send(sessionId, state);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
schedule(sessionId, state, SESSION_LIVE_BATCH_WINDOW_MS);
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
logger(`[bdk] live publish skipped: ${describeError(error)}`);
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
close() {
|
|
409
|
+
closed = true;
|
|
410
|
+
for (const [sessionId, state] of sessions) {
|
|
411
|
+
dropSession(sessionId, state);
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
}
|
|
@@ -10,7 +10,7 @@ import { agentSdkStorageKeys } from "../storage-protocol.js";
|
|
|
10
10
|
import { resolveApiKeySync } from "./cursor/credentials.js";
|
|
11
11
|
import { describeError } from "./describe-error.js";
|
|
12
12
|
import { isRecord } from "./is-record.js";
|
|
13
|
-
import { resolveAgentV2Hosting } from "./v2-hosting.js";
|
|
13
|
+
import { isCursorManagedV2Hosting, resolveAgentV2Hosting } from "./v2-hosting.js";
|
|
14
14
|
export const SESSION_RUN_LOG_VERSION = 1;
|
|
15
15
|
/** Last N log-ring lines kept on each execution. */
|
|
16
16
|
export const SESSION_RUN_LOG_MAX_ENTRIES = 200;
|
|
@@ -44,7 +44,7 @@ export async function flushSessionRunFatal(error) {
|
|
|
44
44
|
}
|
|
45
45
|
await Promise.race([
|
|
46
46
|
fatalFlush(error).catch(() => undefined),
|
|
47
|
-
new Promise(resolve => {
|
|
47
|
+
new Promise((resolve) => {
|
|
48
48
|
setTimeout(resolve, SESSION_RUN_FATAL_FLUSH_TIMEOUT_MS);
|
|
49
49
|
}),
|
|
50
50
|
]);
|
|
@@ -74,7 +74,7 @@ export function serializeSessionRunError(error) {
|
|
|
74
74
|
}
|
|
75
75
|
export function snapshotSessionRunLogs(entries) {
|
|
76
76
|
const tail = entries.slice(-SESSION_RUN_LOG_MAX_ENTRIES);
|
|
77
|
-
return tail.map(entry => ({
|
|
77
|
+
return tail.map((entry) => ({
|
|
78
78
|
index: entry.index,
|
|
79
79
|
at: entry.at,
|
|
80
80
|
line: boundedText(entry.line, SESSION_RUN_LOG_MAX_LINE_CHARS),
|
|
@@ -196,7 +196,7 @@ function boundExecution(write) {
|
|
|
196
196
|
};
|
|
197
197
|
}
|
|
198
198
|
function upsertExecution(existing, next) {
|
|
199
|
-
const executions = existing.filter(entry => entry.executionId !== next.executionId);
|
|
199
|
+
const executions = existing.filter((entry) => entry.executionId !== next.executionId);
|
|
200
200
|
executions.push(next);
|
|
201
201
|
executions.sort((a, b) => a.writtenAt.localeCompare(b.writtenAt));
|
|
202
202
|
return executions.slice(-SESSION_RUN_LOG_MAX_EXECUTIONS);
|
|
@@ -210,7 +210,7 @@ function shrinkSessionDocument(document) {
|
|
|
210
210
|
};
|
|
211
211
|
let serialized = JSON.stringify(next);
|
|
212
212
|
while (serialized.length > MAX_DOCUMENT_CHARS) {
|
|
213
|
-
const oldestWithLogs = executions.findIndex(entry => entry.logs.length > 0);
|
|
213
|
+
const oldestWithLogs = executions.findIndex((entry) => entry.logs.length > 0);
|
|
214
214
|
if (oldestWithLogs >= 0) {
|
|
215
215
|
const entry = executions[oldestWithLogs];
|
|
216
216
|
executions = executions.map((item, index) => index === oldestWithLogs
|
|
@@ -368,7 +368,7 @@ export function selectSessionRunLogStore(input) {
|
|
|
368
368
|
architecture: input.project.agent.architecture,
|
|
369
369
|
env: input.env,
|
|
370
370
|
});
|
|
371
|
-
if (hosting
|
|
371
|
+
if (!isCursorManagedV2Hosting(hosting)) {
|
|
372
372
|
return undefined;
|
|
373
373
|
}
|
|
374
374
|
return createSessionRunLogStore({
|
|
@@ -143,7 +143,7 @@ function parseSessionSummary(value) {
|
|
|
143
143
|
* one are skipped).
|
|
144
144
|
*/
|
|
145
145
|
export function pickPreviousSession(sessions) {
|
|
146
|
-
const followable = sessions.filter(s => typeof s.continuationToken === "string" && s.continuationToken !== "");
|
|
146
|
+
const followable = sessions.filter((s) => typeof s.continuationToken === "string" && s.continuationToken !== "");
|
|
147
147
|
if (followable.length === 0) {
|
|
148
148
|
return undefined;
|
|
149
149
|
}
|
|
@@ -171,7 +171,7 @@ export function formatSessionsTable(sessions, options) {
|
|
|
171
171
|
return `${sourceLine}No sessions.\n`;
|
|
172
172
|
}
|
|
173
173
|
const header = ["SESSION", "CHANNEL", "MODE", "TURNS", "RUNNING", "UPDATED"];
|
|
174
|
-
const rows = sessions.map(s => [
|
|
174
|
+
const rows = sessions.map((s) => [
|
|
175
175
|
s.sessionId,
|
|
176
176
|
s.channelId,
|
|
177
177
|
s.mode,
|
|
@@ -182,7 +182,7 @@ export function formatSessionsTable(sessions, options) {
|
|
|
182
182
|
return `${sourceLine}${renderTable(header, rows)}\n`;
|
|
183
183
|
}
|
|
184
184
|
function renderTable(header, rows) {
|
|
185
|
-
const widths = header.map((h, i) => Math.max(h.length, ...rows.map(row => (row[i] ?? "").length)));
|
|
185
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((row) => (row[i] ?? "").length)));
|
|
186
186
|
const renderRow = (row) => row
|
|
187
187
|
.map((cell, i) => cell.padEnd(widths[i] ?? 0))
|
|
188
188
|
.join(" ")
|
|
@@ -16,9 +16,9 @@ export function skillListEntry(skill) {
|
|
|
16
16
|
return { name: skill.name, description: skill.description };
|
|
17
17
|
}
|
|
18
18
|
export async function readSkillDetail(skills, skillName) {
|
|
19
|
-
const skill = skills.find(s => s.name === skillName);
|
|
19
|
+
const skill = skills.find((s) => s.name === skillName);
|
|
20
20
|
if (skill === undefined) {
|
|
21
|
-
throw new UnknownSkillError(skillName, skills.map(s => s.name));
|
|
21
|
+
throw new UnknownSkillError(skillName, skills.map((s) => s.name));
|
|
22
22
|
}
|
|
23
23
|
// Null-prototype: authored keys (`defineSkill`) pass through
|
|
24
24
|
// unvalidated, and `__proto__` would silently vanish on a plain object.
|
package/dist/internal/sleep.js
CHANGED
|
@@ -15,6 +15,8 @@ export interface StartLogStore {
|
|
|
15
15
|
read(startLogId: string): Promise<string | undefined>;
|
|
16
16
|
}
|
|
17
17
|
export declare function tailStartLogText(raw: string, maxBytes: number): string;
|
|
18
|
+
/** Mask credential tokens before persisting a snapshot. */
|
|
19
|
+
export declare function maskStartLogTokens(text: string): string;
|
|
18
20
|
export declare function resolveEngineStartLogPath(env?: NodeJS.ProcessEnv): string;
|
|
19
21
|
/**
|
|
20
22
|
* Read the local engine tee. Missing/empty is `undefined` (no store write).
|
|
@@ -30,7 +32,9 @@ export declare function createStartLogStore(input: {
|
|
|
30
32
|
logger?: (line: string) => void;
|
|
31
33
|
}): StartLogStore;
|
|
32
34
|
/**
|
|
33
|
-
*
|
|
35
|
+
* Freeze pods only. A persistent slot writes one file per command under
|
|
36
|
+
* `/state/logs` and mirrors that directory; this store is the single
|
|
37
|
+
* `start.log` tee those pods do not produce.
|
|
34
38
|
*/
|
|
35
39
|
export declare function selectStartLogStore(input: {
|
|
36
40
|
project: AgentProject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-log-store.d.ts","sourceRoot":"","sources":["../../src/internal/start-log-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,MAAwB,CAAC;AAEjE,iCAAiC;AACjC,eAAO,MAAM,6BAA6B,sCAAsC,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;
|
|
1
|
+
{"version":3,"file":"start-log-store.d.ts","sourceRoot":"","sources":["../../src/internal/start-log-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,MAAwB,CAAC;AAEjE,iCAAiC;AACjC,eAAO,MAAM,6BAA6B,sCAAsC,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAqBD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAKtF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB9B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,aAAa,CAqChB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,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,aAAa,GAAG,SAAS,CAgB5B;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAchB"}
|
|
@@ -26,7 +26,7 @@ export function tailStartLogText(raw, maxBytes) {
|
|
|
26
26
|
}
|
|
27
27
|
/** Each character literally or percent-encoded, as tokens appear in URLs. */
|
|
28
28
|
function encodable(text) {
|
|
29
|
-
return Array.from(text, char => {
|
|
29
|
+
return Array.from(text, (char) => {
|
|
30
30
|
const lower = char.charCodeAt(0).toString(16).padStart(2, "0");
|
|
31
31
|
const upper = char.toUpperCase().charCodeAt(0).toString(16).padStart(2, "0");
|
|
32
32
|
return lower === upper ? `(?:${char}|%${lower})` : `(?:${char}|%${lower}|%${upper})`;
|
|
@@ -41,7 +41,7 @@ const TOKEN_MASKS = [
|
|
|
41
41
|
[/\bxox[baprs]-[A-Za-z0-9-]+\b/g, "xox…"],
|
|
42
42
|
];
|
|
43
43
|
/** Mask credential tokens before persisting a snapshot. */
|
|
44
|
-
function maskStartLogTokens(text) {
|
|
44
|
+
export function maskStartLogTokens(text) {
|
|
45
45
|
return TOKEN_MASKS.reduce((masked, [pattern, mask]) => masked.replace(pattern, mask), text);
|
|
46
46
|
}
|
|
47
47
|
export function resolveEngineStartLogPath(env = process.env) {
|
|
@@ -113,7 +113,9 @@ export function createStartLogStore(input) {
|
|
|
113
113
|
};
|
|
114
114
|
}
|
|
115
115
|
/**
|
|
116
|
-
*
|
|
116
|
+
* Freeze pods only. A persistent slot writes one file per command under
|
|
117
|
+
* `/state/logs` and mirrors that directory; this store is the single
|
|
118
|
+
* `start.log` tee those pods do not produce.
|
|
117
119
|
*/
|
|
118
120
|
export function selectStartLogStore(input) {
|
|
119
121
|
const hosting = resolveAgentV2Hosting({
|