@cursor/bdk 0.2.3 → 0.2.4
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 +9 -1
- package/dist/channels/slack/attachments.d.ts +2 -1
- package/dist/channels/slack/attachments.d.ts.map +1 -1
- package/dist/channels/slack/attachments.js +19 -9
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +26 -24
- package/dist/channels/slack/thread-context.d.ts +21 -11
- package/dist/channels/slack/thread-context.d.ts.map +1 -1
- package/dist/channels/slack/thread-context.js +75 -27
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BOIHhrKi.js → app.4kQ8Db_q.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.CvuAJ0My.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D49zVZqM.js → VPLocalSearchBox.DY1RwB8Q.js} +1 -1
- package/dist/docs/assets/chunks/{arc.hmjb-sc4.js → arc.CxE_fSPK.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CxEI1KqM.js → architectureDiagram-Q4EWVU46.CPX426ui.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.DHHvBWoV.js → baseUniq.CB52JrKG.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DnXW-3bu.js → blockDiagram-DXYQGD6D.J0cNaQCL.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.e-47O2jM.js → c4Diagram-AHTNJAMY.DJn3vEGT.js} +1 -1
- package/dist/docs/assets/chunks/channel.BoNycAoN.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.3ry4pYXB.js → chunk-4BX2VUAB.Dao618F6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DGIZFRx6.js → chunk-4TB4RGXK.QW8Rhjai.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DKBnqg9U.js → chunk-55IACEB6.DfRLLKF_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BIU8Ue5k.js → chunk-EDXVE4YY.CIV2ApKQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DP-TFhjI.js → chunk-FMBD7UC4.BEheSuxp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Ux0OYj5v.js → chunk-OYMX7WX6.CUN88ENB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BzHMwYox.js → chunk-QZHKN3VN.CgqCs8b_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.D4OGAsSP.js → chunk-YZCP3GAM.iCH0nnTJ.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/clone.Db22cH_-.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Jq_7BUNx.js → cose-bilkent-S5V4N54A.BLcUxhWE.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Di-skR2x.js → dagre-KV5264BT.Ep7LofOm.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DeREHIdH.js → diagram-5BDNPKRD.Bzf4GSQ4.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.C7Kcqxro.js → diagram-G4DWMVQ6.DD6Jh-eM.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BK3eohyo.js → diagram-MMDJMWI5.oOIl8bWd.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.C6TyymXT.js → diagram-TYMM5635.DHs85Ade.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DYGG-gGx.js → erDiagram-SMLLAGMA.BIb5ghCk.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.C9nBcSV4.js → flowDiagram-DWJPFMVM.DV4paY9k.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.wAg_ymsp.js → ganttDiagram-T4ZO3ILL.AyEKA6_v.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.B87j9Oeg.js → gitGraphDiagram-UUTBAWPF.BltiCDFo.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CuFMj31w.js → graph.DzuEYGdC.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.P_mLGumP.js → infoDiagram-42DDH7IO.BV2l981J.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DyuL_MsT.js → ishikawaDiagram-UXIWVN3A.BA4Izf-m.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CtP09IoJ.js → journeyDiagram-VCZTEJTY.DjaFbFS3.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BoeSYPZo.js → kanban-definition-6JOO6SKY.CfTFieDs.js} +1 -1
- package/dist/docs/assets/chunks/{layout.B0lMMtNo.js → layout.DzfWqTBV.js} +1 -1
- package/dist/docs/assets/chunks/{linear.HxRBiAFX.js → linear.BO6mpulV.js} +1 -1
- package/dist/docs/assets/chunks/{min.BGlFFHwS.js → min.BGgTadgT.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.JyLBD9M8.js → mindmap-definition-QFDTVHPH.DPuIXVWY.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DnSmNZF8.js → pieDiagram-DEJITSTG.BOnl3bBg.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CUCnbfCa.js → quadrantDiagram-34T5L4WZ.DNB6Ckdc.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.py0IVUn5.js → requirementDiagram-MS252O5E.D5-Qo7vb.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.Bkc-HWYp.js → sankeyDiagram-XADWPNL6.8t65cesf.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Dqn8Mlv2.js → sequenceDiagram-FGHM5R23.CaG07BdS.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.JikkoQUU.js → stateDiagram-FHFEXIEX.TKOweTB6.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CuqmyQc4.js +1 -0
- package/dist/docs/assets/chunks/{theme.b6HQ6zG_.js → theme.Dx-JhpTB.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BvpSXiBj.js → timeline-definition-GMOUNBTQ.fE53zQ2s.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CU7MVnZx.js → vennDiagram-DHZGUBPP.DJsZZaJg.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.BKwC4ctG.js → wardley-RL74JXVD.844kyrjl.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.BfaF6Uhe.js → wardleyDiagram-NUSXRM2D.CMZ-Ru_t.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Bg5dcpj4.js → xychartDiagram-5P7HB3ND.XXrhBc7a.js} +1 -1
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.js → deployment.md.UhnJIMr-.js} +2 -2
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.lean.js → deployment.md.UhnJIMr-.lean.js} +1 -1
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.js → guides_jev.md.CRcgmjDb.js} +2 -2
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.CRcgmjDb.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.DzGI777n.js → reference_agent-config.md.Cj5uBKp4.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.js → reference_extensions.md.pa2tN-e4.js} +4 -3
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.pa2tN-e4.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/deployment.md +4 -1
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +35 -35
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +37 -37
- package/dist/docs/guides/jev.md +7 -0
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +25 -2
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/agent-config.md +1 -1
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +35 -35
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +39 -38
- package/dist/docs/reference/extensions.md +13 -0
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +35 -35
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +35 -35
- package/dist/extensions/jev/extension.d.ts +3 -0
- package/dist/extensions/jev/extension.d.ts.map +1 -1
- package/dist/extensions/jev/extension.js +10 -1
- package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
- package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
- package/dist/extensions/jev/lib/evaluate.js +6 -2
- package/dist/extensions.d.ts +4 -2
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +5 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +19 -5
- package/dist/internal/discovery/agent-config.d.ts +6 -5
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +29 -28
- package/dist/internal/discovery/agent.js +1 -1
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +12 -0
- package/dist/internal/hosting.d.ts +8 -0
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +24 -0
- package/dist/types.d.ts +18 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +4 -1
- package/docs/guides/jev.md +7 -0
- package/docs/reference/agent-config.md +1 -1
- package/docs/reference/extensions.md +13 -0
- package/package.json +1 -9
- package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +0 -1
- package/dist/docs/assets/chunks/channel.BbOGaJQP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/clone.Co4MBflG.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +0 -1
- package/src/artifacts.ts +0 -68
- package/src/bin/agent-serve.ts +0 -1854
- package/src/channels/bitbucket/api.ts +0 -891
- package/src/channels/bitbucket/binding.ts +0 -417
- package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
- package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
- package/src/channels/bitbucket/checks.ts +0 -146
- package/src/channels/bitbucket/cursor-account.ts +0 -106
- package/src/channels/bitbucket/defaults.ts +0 -100
- package/src/channels/bitbucket/events.ts +0 -74
- package/src/channels/bitbucket/index.ts +0 -51
- package/src/channels/bitbucket/replay.ts +0 -421
- package/src/channels/bitbucket/state.ts +0 -59
- package/src/channels/bitbucket/types.ts +0 -261
- package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
- package/src/channels/change-monitors/index.ts +0 -8
- package/src/channels/change-monitors/types.ts +0 -42
- package/src/channels/checks.ts +0 -185
- package/src/channels/deployments/deployments-channel.ts +0 -224
- package/src/channels/deployments/index.ts +0 -25
- package/src/channels/deployments/types.ts +0 -92
- package/src/channels/github/api.ts +0 -526
- package/src/channels/github/auth.ts +0 -293
- package/src/channels/github/binding.ts +0 -233
- package/src/channels/github/checks.ts +0 -145
- package/src/channels/github/cursor-account.ts +0 -303
- package/src/channels/github/defaults.ts +0 -168
- package/src/channels/github/events.ts +0 -67
- package/src/channels/github/forward.ts +0 -359
- package/src/channels/github/github-channel.ts +0 -2334
- package/src/channels/github/index.ts +0 -54
- package/src/channels/github/progress.ts +0 -365
- package/src/channels/github/replay.ts +0 -372
- package/src/channels/github/state.ts +0 -124
- package/src/channels/github/types.ts +0 -590
- package/src/channels/gitlab/api.ts +0 -329
- package/src/channels/gitlab/binding.ts +0 -231
- package/src/channels/gitlab/checks.ts +0 -228
- package/src/channels/gitlab/cursor-account.ts +0 -105
- package/src/channels/gitlab/defaults.ts +0 -80
- package/src/channels/gitlab/events.ts +0 -37
- package/src/channels/gitlab/gitlab-channel.ts +0 -160
- package/src/channels/gitlab/gitlab-webhook.ts +0 -509
- package/src/channels/gitlab/index.ts +0 -44
- package/src/channels/gitlab/replay.ts +0 -328
- package/src/channels/gitlab/state.ts +0 -55
- package/src/channels/gitlab/types.ts +0 -247
- package/src/channels/issues/index.ts +0 -9
- package/src/channels/issues/issues-channel.ts +0 -45
- package/src/channels/issues/types.ts +0 -38
- package/src/channels/origin/api.ts +0 -507
- package/src/channels/origin/binding.ts +0 -114
- package/src/channels/origin/checks.ts +0 -250
- package/src/channels/origin/cursor-account.ts +0 -58
- package/src/channels/origin/defaults.ts +0 -140
- package/src/channels/origin/events.ts +0 -35
- package/src/channels/origin/index.ts +0 -35
- package/src/channels/origin/origin-channel.ts +0 -815
- package/src/channels/origin/origin-webhook.ts +0 -296
- package/src/channels/origin/reactions.ts +0 -72
- package/src/channels/origin/state.ts +0 -54
- package/src/channels/origin/types.ts +0 -295
- package/src/channels/slack/agentic-delivery.ts +0 -634
- package/src/channels/slack/agentic-posted.ts +0 -135
- package/src/channels/slack/agentic-signals.ts +0 -231
- package/src/channels/slack/api.ts +0 -761
- package/src/channels/slack/approvals.ts +0 -279
- package/src/channels/slack/assistant.ts +0 -76
- package/src/channels/slack/attachments.ts +0 -596
- package/src/channels/slack/auth.ts +0 -127
- package/src/channels/slack/blocks.ts +0 -131
- package/src/channels/slack/bot-mentions.ts +0 -318
- package/src/channels/slack/channel-watch.ts +0 -314
- package/src/channels/slack/cli-project.ts +0 -249
- package/src/channels/slack/code-fences.ts +0 -171
- package/src/channels/slack/constants.ts +0 -38
- package/src/channels/slack/credentials.ts +0 -88
- package/src/channels/slack/defaults.ts +0 -714
- package/src/channels/slack/dispatch.ts +0 -1060
- package/src/channels/slack/doctor.ts +0 -338
- package/src/channels/slack/eval-directive.ts +0 -306
- package/src/channels/slack/event-id-dedupe.ts +0 -30
- package/src/channels/slack/external-policy.ts +0 -75
- package/src/channels/slack/footer.ts +0 -106
- package/src/channels/slack/inbound.ts +0 -416
- package/src/channels/slack/index.ts +0 -53
- package/src/channels/slack/init.ts +0 -169
- package/src/channels/slack/interactive.ts +0 -406
- package/src/channels/slack/links.ts +0 -23
- package/src/channels/slack/live-delivery.ts +0 -489
- package/src/channels/slack/log.ts +0 -70
- package/src/channels/slack/manifest.ts +0 -240
- package/src/channels/slack/message-body.ts +0 -82
- package/src/channels/slack/nudge-carrier.ts +0 -224
- package/src/channels/slack/nudge-store.ts +0 -334
- package/src/channels/slack/paint-start.ts +0 -93
- package/src/channels/slack/placeholder.ts +0 -358
- package/src/channels/slack/pr-ref.ts +0 -74
- package/src/channels/slack/progress-delivery.ts +0 -138
- package/src/channels/slack/reasoning-card.ts +0 -125
- package/src/channels/slack/reasoning-chip.ts +0 -41
- package/src/channels/slack/recording-sink.ts +0 -167
- package/src/channels/slack/redact.ts +0 -6
- package/src/channels/slack/reply-options.ts +0 -279
- package/src/channels/slack/setup.ts +0 -125
- package/src/channels/slack/slack-channel.ts +0 -744
- package/src/channels/slack/socket-mode.ts +0 -140
- package/src/channels/slack/stop.ts +0 -25
- package/src/channels/slack/stream.ts +0 -66
- package/src/channels/slack/thread-context.ts +0 -485
- package/src/channels/slack/tool-approval-events.ts +0 -233
- package/src/channels/slack/tool-cards.ts +0 -198
- package/src/channels/slack/tool-chip.ts +0 -34
- package/src/channels/slack/types.ts +0 -787
- package/src/channels/slack/upload.ts +0 -137
- package/src/channels.ts +0 -543
- package/src/connections.ts +0 -153
- package/src/dashboard-session-url.ts +0 -30
- package/src/evals/assertions.ts +0 -688
- package/src/evals/expect.ts +0 -250
- package/src/evals/judge.ts +0 -329
- package/src/evals/loaders.ts +0 -111
- package/src/evals/matchers.ts +0 -223
- package/src/evals/reporters.ts +0 -257
- package/src/evals/results.ts +0 -130
- package/src/evals/run-facts.ts +0 -306
- package/src/evals.ts +0 -709
- package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
- package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
- package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
- package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
- package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
- package/src/extensions/cursor-grokbot-agents/extension.ts +0 -132
- package/src/extensions/cursor-grokbot-agents/lib/agents.ts +0 -42
- package/src/extensions/cursor-grokbot-agents/lib/backend.ts +0 -208
- package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +0 -74
- package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +0 -260
- package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +0 -21
- package/src/extensions/cursor-grokbot-agents/lib/lock.ts +0 -26
- package/src/extensions/cursor-grokbot-agents/skills/consult.md +0 -40
- package/src/extensions/cursor-grokbot-agents/tools/ask.ts +0 -32
- package/src/extensions/cursor-grokbot-agents/tools/check.ts +0 -25
- package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +0 -17
- package/src/extensions/cursor-grokbot-agents/tools/list.ts +0 -26
- package/src/extensions/improve/extension.ts +0 -69
- package/src/extensions/improve/skills/yourself.ts +0 -50
- package/src/extensions/jev/extension.ts +0 -95
- package/src/extensions/jev/lib/evaluate.ts +0 -266
- package/src/extensions/jev/skills/gated-write.md +0 -25
- package/src/extensions/jev/skills/questions.md +0 -33
- package/src/extensions/jev/tools/evaluate.ts +0 -82
- package/src/extensions/slack-communication/evals/harness.ts +0 -705
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
- package/src/extensions/slack-communication/extension.ts +0 -44
- package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
- package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
- package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
- package/src/extensions/slack-communication/tools/post-card.ts +0 -28
- package/src/extensions/slack-communication/tools/post-file.ts +0 -82
- package/src/extensions/slack-communication/tools/post-update.ts +0 -40
- package/src/extensions/slack-communication/tools/react.ts +0 -30
- package/src/extensions/slack-communication/tools/set-status.ts +0 -21
- package/src/extensions.ts +0 -179
- package/src/files-backends/agent-store-presigned-url.ts +0 -11
- package/src/files-backends/cursor-hosted.ts +0 -1212
- package/src/files-backends/local-fs.ts +0 -163
- package/src/files.ts +0 -293
- package/src/filesystem.ts +0 -2005
- package/src/hooks.ts +0 -30
- package/src/index.ts +0 -259
- package/src/internal/advertise-tools.ts +0 -370
- package/src/internal/approval-gate.ts +0 -103
- package/src/internal/artifacts-store.ts +0 -836
- package/src/internal/as-of.ts +0 -257
- package/src/internal/auth.ts +0 -46
- package/src/internal/authored-alias-hooks.ts +0 -138
- package/src/internal/authored-loaders.ts +0 -188
- package/src/internal/bounded-int.ts +0 -24
- package/src/internal/bounded.ts +0 -25
- package/src/internal/brand.ts +0 -28
- package/src/internal/browser-origin-guard.ts +0 -67
- package/src/internal/builtin-tools/artifacts.ts +0 -62
- package/src/internal/builtin-tools/index.ts +0 -53
- package/src/internal/builtin-tools/reminders.ts +0 -145
- package/src/internal/channel-dispatch.ts +0 -129
- package/src/internal/channel-route-dispatch.ts +0 -58
- package/src/internal/channel-state.ts +0 -83
- package/src/internal/chat-client.ts +0 -594
- package/src/internal/cli-ax.ts +0 -2318
- package/src/internal/cli-bitbucket.ts +0 -438
- package/src/internal/cli-convert-automation.ts +0 -335
- package/src/internal/cli-cursor.ts +0 -282
- package/src/internal/cli-deploy.ts +0 -2519
- package/src/internal/cli-docs.ts +0 -192
- package/src/internal/cli-github.ts +0 -806
- package/src/internal/cli-gitlab.ts +0 -452
- package/src/internal/cli-images.ts +0 -672
- package/src/internal/cli-manifest.ts +0 -56
- package/src/internal/cli-mcp-oauth.ts +0 -396
- package/src/internal/cli-mcp.ts +0 -808
- package/src/internal/cli-skills.ts +0 -98
- package/src/internal/cli-slack-manual.ts +0 -418
- package/src/internal/cli-slack.ts +0 -874
- package/src/internal/cloud-merge.ts +0 -51
- package/src/internal/cloud-turn-cost.ts +0 -159
- package/src/internal/connection-env.ts +0 -106
- package/src/internal/continuation-channel.ts +0 -233
- package/src/internal/continuation-identity.ts +0 -935
- package/src/internal/conversation-mirror.ts +0 -423
- package/src/internal/convert-automation/convert-workflow.ts +0 -1377
- package/src/internal/convert-automation/slug.ts +0 -29
- package/src/internal/convert-automation/types.ts +0 -212
- package/src/internal/cron.ts +0 -76
- package/src/internal/cursor/account-mcp.ts +0 -692
- package/src/internal/cursor/backend-client.ts +0 -984
- package/src/internal/cursor/bound-secret-file.ts +0 -101
- package/src/internal/cursor/credentials.ts +0 -560
- package/src/internal/cursor/cursor-api-transport.ts +0 -65
- package/src/internal/cursor/github-credentials.ts +0 -228
- package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
- package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
- package/src/internal/cursor/hosted-store-secrets.ts +0 -152
- package/src/internal/cursor/session-token.ts +0 -111
- package/src/internal/cursor/store-api-client.ts +0 -323
- package/src/internal/cursor-account-mcp-auth.ts +0 -303
- package/src/internal/cursor-agent-template.ts +0 -50
- package/src/internal/cursor-deployment-relay.ts +0 -315
- package/src/internal/cursor-event-relay.ts +0 -675
- package/src/internal/cursor-relay-core.ts +0 -563
- package/src/internal/deferred-channel-session.ts +0 -61
- package/src/internal/deploy-client.ts +0 -1574
- package/src/internal/deploy-manifest.ts +0 -361
- package/src/internal/deploy-source.ts +0 -144
- package/src/internal/describe-error.ts +0 -32
- package/src/internal/dev-mode.ts +0 -20
- package/src/internal/discovery/agent-config.ts +0 -288
- package/src/internal/discovery/agent.ts +0 -381
- package/src/internal/discovery/channels.ts +0 -100
- package/src/internal/discovery/connections.ts +0 -516
- package/src/internal/discovery/context.ts +0 -38
- package/src/internal/discovery/cursor-plugin.ts +0 -628
- package/src/internal/discovery/extension-overlay.ts +0 -247
- package/src/internal/discovery/extensions.ts +0 -490
- package/src/internal/discovery/fs.ts +0 -103
- package/src/internal/discovery/hooks.ts +0 -63
- package/src/internal/discovery/info.ts +0 -174
- package/src/internal/discovery/instructions.ts +0 -98
- package/src/internal/discovery/modules.ts +0 -107
- package/src/internal/discovery/names.ts +0 -45
- package/src/internal/discovery/project.ts +0 -319
- package/src/internal/discovery/reminders.ts +0 -65
- package/src/internal/discovery/runtime.ts +0 -158
- package/src/internal/discovery/schedules.ts +0 -120
- package/src/internal/discovery/seed-files.ts +0 -34
- package/src/internal/discovery/services.ts +0 -151
- package/src/internal/discovery/skills.ts +0 -174
- package/src/internal/discovery/subagent.ts +0 -138
- package/src/internal/discovery/tools.ts +0 -170
- package/src/internal/discovery.ts +0 -27
- package/src/internal/distribution.ts +0 -126
- package/src/internal/docs-site.ts +0 -248
- package/src/internal/duration.ts +0 -37
- package/src/internal/env-file.ts +0 -83
- package/src/internal/eval-judge-model.ts +0 -142
- package/src/internal/eval-run-store.ts +0 -585
- package/src/internal/eval-runner.ts +0 -823
- package/src/internal/evals-client.ts +0 -475
- package/src/internal/event-log.ts +0 -342
- package/src/internal/event-mapper.ts +0 -811
- package/src/internal/expected-delivery-failure.ts +0 -34
- package/src/internal/factory-resource-channel.ts +0 -103
- package/src/internal/filesystem/errors.ts +0 -207
- package/src/internal/filesystem/format.ts +0 -253
- package/src/internal/filesystem/merge.ts +0 -192
- package/src/internal/filesystem/nearest.ts +0 -112
- package/src/internal/filesystem/scratch.ts +0 -239
- package/src/internal/filesystem/sdk-schemas.ts +0 -204
- package/src/internal/filesystem/tools.ts +0 -804
- package/src/internal/filesystem/walk.ts +0 -366
- package/src/internal/fixtures/units-server.ts +0 -52
- package/src/internal/framework-file-storage.ts +0 -357
- package/src/internal/framework-storage-selection.ts +0 -156
- package/src/internal/frontmatter.ts +0 -108
- package/src/internal/github-fanout.ts +0 -144
- package/src/internal/guest-network.ts +0 -391
- package/src/internal/handleAgentServeTrigger.ts +0 -286
- package/src/internal/host-files.ts +0 -341
- package/src/internal/host-kv.ts +0 -81
- package/src/internal/host-otel.ts +0 -231
- package/src/internal/host-platforms.ts +0 -170
- package/src/internal/hosted-admission-adapter.ts +0 -47
- package/src/internal/hosted-admission-context.ts +0 -37
- package/src/internal/hosted-catch-protocol.ts +0 -112
- package/src/internal/hosted-catch.ts +0 -179
- package/src/internal/hosted-delivery-protocol.ts +0 -824
- package/src/internal/hosted-delivery.ts +0 -1410
- package/src/internal/hosted-execution-diag.ts +0 -291
- package/src/internal/hosted-execution-flush.ts +0 -136
- package/src/internal/hosted-execution-latency.ts +0 -301
- package/src/internal/hosted-managed-automation.ts +0 -116
- package/src/internal/hosting.ts +0 -114
- package/src/internal/http-channel-define.ts +0 -25
- package/src/internal/http-channel.ts +0 -669
- package/src/internal/http-control-plane-session.ts +0 -110
- package/src/internal/ids.ts +0 -39
- package/src/internal/incoming-headers-to-fetch.ts +0 -45
- package/src/internal/init-interview.ts +0 -360
- package/src/internal/init-project.ts +0 -711
- package/src/internal/init-scaffold.ts +0 -182
- package/src/internal/inline-stdio-define-stub.ts +0 -4
- package/src/internal/inline-stdio-mcp.ts +0 -230
- package/src/internal/install-cursor-skills.ts +0 -604
- package/src/internal/is-record.ts +0 -3
- package/src/internal/json-schema.ts +0 -95
- package/src/internal/legacy-command-guard.ts +0 -66
- package/src/internal/listen-port.ts +0 -85
- package/src/internal/local-control-plane.ts +0 -442
- package/src/internal/local-env.ts +0 -59
- package/src/internal/local-ingress.ts +0 -90
- package/src/internal/log-ring.ts +0 -59
- package/src/internal/logs-client.ts +0 -477
- package/src/internal/map-pool.ts +0 -39
- package/src/internal/mcp-endpoint.ts +0 -747
- package/src/internal/mcp-host.ts +0 -509
- package/src/internal/mcp-oauth-on-demand.ts +0 -337
- package/src/internal/mcp-oauth-persist.ts +0 -118
- package/src/internal/mcp-oauth.ts +0 -549
- package/src/internal/net.ts +0 -29
- package/src/internal/open-browser.ts +0 -41
- package/src/internal/otel/attrs.ts +0 -16
- package/src/internal/otel/collector.ts +0 -937
- package/src/internal/otel/config.ts +0 -287
- package/src/internal/otel/http.ts +0 -122
- package/src/internal/otel/mcp.ts +0 -56
- package/src/internal/otel/propagation.ts +0 -17
- package/src/internal/otel/runtime.ts +0 -441
- package/src/internal/package-inline-stdio.ts +0 -114
- package/src/internal/peer-connections.ts +0 -96
- package/src/internal/platform-schedule-sync.ts +0 -75
- package/src/internal/platform-timers.ts +0 -365
- package/src/internal/playground/static.ts +0 -278
- package/src/internal/playground/toolchain.ts +0 -270
- package/src/internal/playground-proxy.ts +0 -564
- package/src/internal/process-memory-telemetry.ts +0 -334
- package/src/internal/project-layout.ts +0 -31
- package/src/internal/prompt-context.ts +0 -116
- package/src/internal/reminder-control-plane-protocol.ts +0 -482
- package/src/internal/reminder-runner.ts +0 -1559
- package/src/internal/reminder-schedule.ts +0 -104
- package/src/internal/reminder-store.ts +0 -176
- package/src/internal/request-error-status.ts +0 -95
- package/src/internal/request-headers.ts +0 -21
- package/src/internal/resolve-prod-target.ts +0 -334
- package/src/internal/resolved-connections.ts +0 -190
- package/src/internal/router.ts +0 -143
- package/src/internal/run-client.ts +0 -354
- package/src/internal/runtime-dispatch-runner.ts +0 -50
- package/src/internal/sanitize-mcp-tool-name.ts +0 -31
- package/src/internal/schedule-runner.ts +0 -154
- package/src/internal/scm/pr-url.ts +0 -245
- package/src/internal/sdk-runner.ts +0 -959
- package/src/internal/serve-restart.ts +0 -113
- package/src/internal/server.ts +0 -3147
- package/src/internal/session-cost.ts +0 -208
- package/src/internal/session-engine.ts +0 -5622
- package/src/internal/session-links.ts +0 -84
- package/src/internal/session-run-log.ts +0 -535
- package/src/internal/session-store.ts +0 -307
- package/src/internal/session-urls.ts +0 -32
- package/src/internal/sessions-client.ts +0 -239
- package/src/internal/skill-catalog.ts +0 -66
- package/src/internal/skills-sync.ts +0 -55
- package/src/internal/slack-provision-client.ts +0 -544
- package/src/internal/slack-thread-key.ts +0 -11
- package/src/internal/sleep.ts +0 -3
- package/src/internal/start-log-store.ts +0 -164
- package/src/internal/steering.ts +0 -17
- package/src/internal/storage-coordinator.ts +0 -800
- package/src/internal/storage-roles.ts +0 -86
- package/src/internal/storage.ts +0 -1
- package/src/internal/store-api-protocol.ts +0 -205
- package/src/internal/store-mirror.ts +0 -73
- package/src/internal/stream-progress.ts +0 -294
- package/src/internal/terminal-style.ts +0 -133
- package/src/internal/testing/factory-resource-fixtures.ts +0 -84
- package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
- package/src/internal/tool-catalog.ts +0 -104
- package/src/internal/tool-policy.ts +0 -222
- package/src/internal/tool-result.ts +0 -50
- package/src/internal/trajectory.ts +0 -418
- package/src/internal/turn-cost.ts +0 -136
- package/src/internal/turn-governor.ts +0 -145
- package/src/internal/turn-lease-store.ts +0 -144
- package/src/internal/turn-outbox.ts +0 -77
- package/src/internal/update-check.ts +0 -517
- package/src/internal/v2-hosting.ts +0 -52
- package/src/internal/workspace-sync.ts +0 -114
- package/src/internal/workspace.ts +0 -505
- package/src/kv/memory-kv.ts +0 -94
- package/src/kv.ts +0 -18
- package/src/memory.ts +0 -487
- package/src/otel-public.ts +0 -24
- package/src/otel.ts +0 -320
- package/src/prompt.ts +0 -80
- package/src/reminders.ts +0 -65
- package/src/schedules.ts +0 -31
- package/src/skills.ts +0 -27
- package/src/storage-backends/cursor-hosted-v2.ts +0 -204
- package/src/storage-backends/cursor-hosted.ts +0 -388
- package/src/storage-backends/file-kv.ts +0 -276
- package/src/storage-protocol.ts +0 -261
- package/src/storage.ts +0 -408
- package/src/tools.ts +0 -166
- package/src/types.ts +0 -3776
- /package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.Cj5uBKp4.lean.js} +0 -0
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { type AgentServeDeployClient, DeployApiError } from "./deploy-client.js";
|
|
2
|
-
import { CLI_COMMAND_NAME } from "./distribution.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Classify a hosted slug by probing the v2 control plane.
|
|
6
|
-
*
|
|
7
|
-
* Only HTTP 404 means “not v2.” Auth, 5xx, and transport errors fail closed
|
|
8
|
-
* so a v2 slug cannot fall through to `/internal/agent-serve`. That probe
|
|
9
|
-
* shares the factory microlith path used by secrets; a factory outage will
|
|
10
|
-
* also block legacy `--prod` until it recovers.
|
|
11
|
-
*/
|
|
12
|
-
export async function deploymentArchitecture(args: {
|
|
13
|
-
client: AgentServeDeployClient;
|
|
14
|
-
teamId: number;
|
|
15
|
-
slug: string;
|
|
16
|
-
}): Promise<"v1" | "v2"> {
|
|
17
|
-
try {
|
|
18
|
-
await args.client.getAgentkitDeploy({
|
|
19
|
-
teamId: args.teamId,
|
|
20
|
-
slug: args.slug,
|
|
21
|
-
});
|
|
22
|
-
return "v2";
|
|
23
|
-
} catch (error) {
|
|
24
|
-
if (error instanceof DeployApiError && error.status === 404) {
|
|
25
|
-
return "v1";
|
|
26
|
-
}
|
|
27
|
-
throw error;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** `run --prod` returns a delivery; read the session after it is allocated. */
|
|
32
|
-
export function v2HostedVerifyHint(slug = "<slug>"): string {
|
|
33
|
-
return (
|
|
34
|
-
`\`${CLI_COMMAND_NAME} run --prod\` returns a delivery. ` +
|
|
35
|
-
`An accept without sessionId is expected. ` +
|
|
36
|
-
`Poll the delivery until the session is allocated, then ` +
|
|
37
|
-
`\`${CLI_COMMAND_NAME} session <ses_> --prod --slug ${slug}\`.`
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function unsupportedV2LegacyCommandError(slug: string): DeployApiError {
|
|
42
|
-
return new DeployApiError(
|
|
43
|
-
`This command is not supported for architecture v2 deployment "${slug}". ` +
|
|
44
|
-
`call and sessions stay on the v1 API. ${v2HostedVerifyHint(slug)}`,
|
|
45
|
-
409,
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function isUnsupportedV2LegacyCommandError(error: unknown): error is DeployApiError {
|
|
50
|
-
return (
|
|
51
|
-
error instanceof DeployApiError &&
|
|
52
|
-
error.status === 409 &&
|
|
53
|
-
error.message.includes("not supported for architecture v2")
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export async function rejectV2ForLegacyCommand(args: {
|
|
58
|
-
client: AgentServeDeployClient;
|
|
59
|
-
teamId: number;
|
|
60
|
-
slug: string;
|
|
61
|
-
}): Promise<void> {
|
|
62
|
-
const architecture = await deploymentArchitecture(args);
|
|
63
|
-
if (architecture === "v2") {
|
|
64
|
-
throw unsupportedV2LegacyCommandError(args.slug);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bind an HTTP server to a port, with a clear next-port path when 3000 (or
|
|
3
|
-
* whatever was requested) is already taken — a common onboarding failure.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { once } from "node:events";
|
|
7
|
-
import type { Server } from "node:http";
|
|
8
|
-
import { CLI_COMMAND_NAME } from "./distribution.js";
|
|
9
|
-
|
|
10
|
-
/** Default listen port for `serve` / `dev` when `--port` is omitted. */
|
|
11
|
-
export const DEFAULT_SERVE_PORT = 3000;
|
|
12
|
-
|
|
13
|
-
/** How many ports above the default to try when the default is taken. */
|
|
14
|
-
const DEFAULT_PORT_FALLBACK_SPAN = 20;
|
|
15
|
-
|
|
16
|
-
export function isAddrInUse(error: unknown): boolean {
|
|
17
|
-
return (
|
|
18
|
-
typeof error === "object" &&
|
|
19
|
-
error !== null &&
|
|
20
|
-
"code" in error &&
|
|
21
|
-
(error as { code?: unknown }).code === "EADDRINUSE"
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function formatPortInUseHint(port: number): string {
|
|
26
|
-
const next = port === 0 ? 3001 : port + 1;
|
|
27
|
-
return (
|
|
28
|
-
`port ${port} is already in use. ` +
|
|
29
|
-
`Try \`${CLI_COMMAND_NAME} dev --port ${next}\` or \`--port 0\` for any free port.`
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* `server.listen` with fallback when the caller used the default port.
|
|
35
|
-
* Explicit `--port N` (including `0`) fails immediately with a next-port hint.
|
|
36
|
-
*/
|
|
37
|
-
export async function listenHttpServer(args: {
|
|
38
|
-
server: Server;
|
|
39
|
-
host: string;
|
|
40
|
-
port: number;
|
|
41
|
-
/** True when the caller passed `port` (including 0); skip fallback. */
|
|
42
|
-
portWasExplicit: boolean;
|
|
43
|
-
logger: (line: string) => void;
|
|
44
|
-
}): Promise<number> {
|
|
45
|
-
const { server, host, logger } = args;
|
|
46
|
-
const startPort = args.port;
|
|
47
|
-
if (args.portWasExplicit || startPort === 0) {
|
|
48
|
-
try {
|
|
49
|
-
server.listen(startPort, host);
|
|
50
|
-
await once(server, "listening");
|
|
51
|
-
} catch (error) {
|
|
52
|
-
if (isAddrInUse(error)) {
|
|
53
|
-
throw new Error(formatPortInUseHint(startPort));
|
|
54
|
-
}
|
|
55
|
-
throw error;
|
|
56
|
-
}
|
|
57
|
-
const address = server.address();
|
|
58
|
-
if (address === null || typeof address === "string") {
|
|
59
|
-
throw new Error("server listening without an address");
|
|
60
|
-
}
|
|
61
|
-
return address.port;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const last = startPort + DEFAULT_PORT_FALLBACK_SPAN;
|
|
65
|
-
for (let port = startPort; port <= last; port++) {
|
|
66
|
-
try {
|
|
67
|
-
server.listen(port, host);
|
|
68
|
-
await once(server, "listening");
|
|
69
|
-
if (port !== startPort) {
|
|
70
|
-
logger(
|
|
71
|
-
`[agent-sdk] port ${startPort} in use; listening on ${port} instead (pass --port to pick)`,
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
return port;
|
|
75
|
-
} catch (error) {
|
|
76
|
-
if (!isAddrInUse(error)) {
|
|
77
|
-
throw error;
|
|
78
|
-
}
|
|
79
|
-
if (port === last) {
|
|
80
|
-
throw new Error(formatPortInUseHint(port));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
throw new Error(formatPortInUseHint(last));
|
|
85
|
-
}
|
|
@@ -1,442 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-process control plane started with local `serve`. Owns schedule clocks
|
|
3
|
-
* and reminder documents + clocks, then fires into the kit the same way the
|
|
4
|
-
* Cursor backend does over HTTP when `--no-control-plane` is set.
|
|
5
|
-
*
|
|
6
|
-
* Reminder lifecycle (protocol v1): CP assigns id, arms timers, claims a due
|
|
7
|
-
* fire once, invokes a guest executor with an immutable descriptor, and
|
|
8
|
-
* applies the outcome with generation/fireCount CAS. Cancel/rekey racing an
|
|
9
|
-
* in-flight execution bumps generation so a stale outcome cannot resurrect
|
|
10
|
-
* the reminder. Legacy `fireReminder(id, fireCount)` remains for v1 runners.
|
|
11
|
-
*
|
|
12
|
-
* v2 ingest lives here: `routeContinuation` stamps the mailbox (July twin
|
|
13
|
-
* of hosted `routeVerifiedIngressContinuation`), and `attachScmEvents`
|
|
14
|
-
* owns the `/v0/scm-events` long poll. v1 keeps engine-side scm-events.
|
|
15
|
-
* Hosted `--no-control-plane` v2 skips that poll — the hosted CP delivers.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { join } from "node:path";
|
|
19
|
-
import { type CronExpression, parseCron } from "./cron.js";
|
|
20
|
-
import {
|
|
21
|
-
type LocalIngressContinuation,
|
|
22
|
-
type RouteLocalIngressContinuationInput,
|
|
23
|
-
routeLocalIngressContinuation,
|
|
24
|
-
} from "./local-ingress.js";
|
|
25
|
-
import type { PlatformTimers } from "./platform-timers.js";
|
|
26
|
-
import {
|
|
27
|
-
applyOutcomeToRecord,
|
|
28
|
-
claimFromDescriptor,
|
|
29
|
-
intentToNewRecord,
|
|
30
|
-
REMINDER_CP_PROTOCOL_VERSION,
|
|
31
|
-
type ReminderControlPlane,
|
|
32
|
-
type ReminderCreateIntent,
|
|
33
|
-
type ReminderExecutionOutcome,
|
|
34
|
-
type ReminderFireClaim,
|
|
35
|
-
type ReminderGuestExecutor,
|
|
36
|
-
type ReminderOutcomeApplyResult,
|
|
37
|
-
recordGeneration,
|
|
38
|
-
toFireDescriptor,
|
|
39
|
-
} from "./reminder-control-plane-protocol.js";
|
|
40
|
-
import { MAX_TIMER_MS } from "./reminder-schedule.js";
|
|
41
|
-
import { type ReminderRecord, ReminderStore } from "./reminder-store.js";
|
|
42
|
-
|
|
43
|
-
export interface LocalControlPlane extends PlatformTimers, ReminderControlPlane {
|
|
44
|
-
/**
|
|
45
|
-
* Stamp a v2 mailbox from the channel selector + live payload. Same
|
|
46
|
-
* contract as hosted verified ingress. `/v1` is a no-op.
|
|
47
|
-
*/
|
|
48
|
-
routeContinuation(input: RouteLocalIngressContinuationInput): LocalIngressContinuation;
|
|
49
|
-
/**
|
|
50
|
-
* Take ownership of the v2 `/v0/scm-events` long poll. Starts the relay.
|
|
51
|
-
* v1 scm-events stay on the engine serve path.
|
|
52
|
-
*/
|
|
53
|
-
attachScmEvents(relay: { start(): void; stop(): Promise<void> }): void;
|
|
54
|
-
/** Arm persisted reminder clocks after the kit fire callback is live. */
|
|
55
|
-
startClocks(): void;
|
|
56
|
-
stop(): void;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export async function createLocalControlPlane(opts: {
|
|
60
|
-
fireSchedule: (name: string) => Promise<unknown>;
|
|
61
|
-
/**
|
|
62
|
-
* Legacy v1 path: CP calls this with (id, fireCount) and the runner mutates
|
|
63
|
-
* authoritative state. Prefer {@link executeReminder} for architecture v2.
|
|
64
|
-
*/
|
|
65
|
-
fireReminder?: (id: string, fireCount: number) => Promise<unknown>;
|
|
66
|
-
/**
|
|
67
|
-
* Protocol guest executor. When set, due timers claim once, invoke this
|
|
68
|
-
* with an immutable descriptor, and apply the returned outcome via CAS.
|
|
69
|
-
*/
|
|
70
|
-
executeReminder?: ReminderGuestExecutor;
|
|
71
|
-
/**
|
|
72
|
-
* Persist reminder documents under `<stateDir>/reminders`. Local serve
|
|
73
|
-
* passes `<stateRoot>/control-plane`.
|
|
74
|
-
*/
|
|
75
|
-
stateDir?: string;
|
|
76
|
-
/** Arm deadline timers. Off in `--dev`. Defaults to true. */
|
|
77
|
-
armReminderClocks?: boolean;
|
|
78
|
-
logger?: (line: string) => void;
|
|
79
|
-
}): Promise<LocalControlPlane> {
|
|
80
|
-
if (opts.fireReminder === undefined && opts.executeReminder === undefined) {
|
|
81
|
-
throw new Error("createLocalControlPlane requires fireReminder and/or executeReminder");
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const logger = opts.logger ?? (() => {});
|
|
85
|
-
const armReminderClocks = opts.armReminderClocks !== false;
|
|
86
|
-
const store =
|
|
87
|
-
opts.stateDir === undefined ? undefined : new ReminderStore(join(opts.stateDir, "reminders"));
|
|
88
|
-
const schedules = new Map<string, CronExpression>();
|
|
89
|
-
const reminderTimers = new Map<string, NodeJS.Timeout>();
|
|
90
|
-
const reminders = new Map<string, ReminderRecord>(
|
|
91
|
-
((await store?.list()) ?? []).map(record => [
|
|
92
|
-
record.id,
|
|
93
|
-
{ ...record, generation: record.generation ?? 0 },
|
|
94
|
-
]),
|
|
95
|
-
);
|
|
96
|
-
/** In-flight claims keyed by reminder id (single-flight per id). */
|
|
97
|
-
const inflight = new Map<string, ReminderFireClaim>();
|
|
98
|
-
let scheduleTimer: NodeJS.Timeout | undefined;
|
|
99
|
-
let lastFiredMinute = -1;
|
|
100
|
-
let scmRelay: { start(): void; stop(): Promise<void> } | undefined;
|
|
101
|
-
|
|
102
|
-
async function persist(record: ReminderRecord): Promise<void> {
|
|
103
|
-
reminders.set(record.id, record);
|
|
104
|
-
await store?.save(record);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function armScheduleTicker(): void {
|
|
108
|
-
if (scheduleTimer !== undefined || schedules.size === 0) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const now = Date.now();
|
|
112
|
-
const nextMinute = (Math.floor(now / 60_000) + 1) * 60_000;
|
|
113
|
-
scheduleTimer = setTimeout(() => tickSchedules(), nextMinute - now + 250);
|
|
114
|
-
scheduleTimer.unref?.();
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function stopScheduleTicker(): void {
|
|
118
|
-
if (scheduleTimer === undefined) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
clearTimeout(scheduleTimer);
|
|
122
|
-
scheduleTimer = undefined;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function tickSchedules(): void {
|
|
126
|
-
scheduleTimer = undefined;
|
|
127
|
-
const now = new Date();
|
|
128
|
-
const minute = Math.floor(now.getTime() / 60_000);
|
|
129
|
-
if (minute !== lastFiredMinute) {
|
|
130
|
-
lastFiredMinute = minute;
|
|
131
|
-
for (const [name, cron] of schedules) {
|
|
132
|
-
if (!cron.matches(now)) {
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
void opts.fireSchedule(name).catch(error => {
|
|
136
|
-
logger(
|
|
137
|
-
`[agent-sdk] schedule "${name}" dispatch failed: ${
|
|
138
|
-
error instanceof Error ? error.message : String(error)
|
|
139
|
-
}`,
|
|
140
|
-
);
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
armScheduleTicker();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function clearReminderTimer(id: string): void {
|
|
148
|
-
const timer = reminderTimers.get(id);
|
|
149
|
-
if (timer !== undefined) {
|
|
150
|
-
clearTimeout(timer);
|
|
151
|
-
reminderTimers.delete(id);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function armReminder(record: ReminderRecord): void {
|
|
156
|
-
clearReminderTimer(record.id);
|
|
157
|
-
if (record.status !== "armed") {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
const delay = Math.min(MAX_TIMER_MS, Math.max(0, record.nextFireAtMs - Date.now()));
|
|
161
|
-
const timer = setTimeout(() => {
|
|
162
|
-
reminderTimers.delete(record.id);
|
|
163
|
-
void onReminderDue(record.id).catch(error => {
|
|
164
|
-
logger(
|
|
165
|
-
`[agent-sdk] reminder "${record.id}" dispatch failed: ${
|
|
166
|
-
error instanceof Error ? error.message : String(error)
|
|
167
|
-
}`,
|
|
168
|
-
);
|
|
169
|
-
});
|
|
170
|
-
}, delay);
|
|
171
|
-
timer.unref?.();
|
|
172
|
-
reminderTimers.set(record.id, timer);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async function claimDue(id: string): Promise<ReminderRecord | undefined> {
|
|
176
|
-
const current = reminders.get(id);
|
|
177
|
-
if (current === undefined || current.status !== "armed") {
|
|
178
|
-
return undefined;
|
|
179
|
-
}
|
|
180
|
-
if (current.nextFireAtMs > Date.now() + 50) {
|
|
181
|
-
armReminder(current);
|
|
182
|
-
return undefined;
|
|
183
|
-
}
|
|
184
|
-
if (inflight.has(id)) {
|
|
185
|
-
return undefined;
|
|
186
|
-
}
|
|
187
|
-
const claimed: ReminderRecord = {
|
|
188
|
-
...current,
|
|
189
|
-
status: "firing",
|
|
190
|
-
generation: recordGeneration(current),
|
|
191
|
-
updatedAt: new Date().toISOString(),
|
|
192
|
-
};
|
|
193
|
-
await persist(claimed);
|
|
194
|
-
inflight.set(id, {
|
|
195
|
-
id: claimed.id,
|
|
196
|
-
fireCount: claimed.fireCount,
|
|
197
|
-
generation: recordGeneration(claimed),
|
|
198
|
-
});
|
|
199
|
-
return claimed;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
async function applyReminderOutcome(
|
|
203
|
-
claim: ReminderFireClaim,
|
|
204
|
-
outcome: ReminderExecutionOutcome,
|
|
205
|
-
): Promise<ReminderOutcomeApplyResult> {
|
|
206
|
-
const current = reminders.get(claim.id);
|
|
207
|
-
if (current === undefined) {
|
|
208
|
-
inflight.delete(claim.id);
|
|
209
|
-
return { applied: false, reason: "missing" };
|
|
210
|
-
}
|
|
211
|
-
const result = applyOutcomeToRecord(current, claim, outcome);
|
|
212
|
-
inflight.delete(claim.id);
|
|
213
|
-
if (!result.applied) {
|
|
214
|
-
if (current.status === "armed" && armReminderClocks) {
|
|
215
|
-
armReminder(current);
|
|
216
|
-
}
|
|
217
|
-
return result;
|
|
218
|
-
}
|
|
219
|
-
await persist(result.record);
|
|
220
|
-
if (armReminderClocks && result.record.status === "armed") {
|
|
221
|
-
armReminder(result.record);
|
|
222
|
-
} else {
|
|
223
|
-
clearReminderTimer(result.record.id);
|
|
224
|
-
}
|
|
225
|
-
return result;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async function onReminderDue(id: string): Promise<void> {
|
|
229
|
-
// Protocol path: claim → guest execute → CAS apply.
|
|
230
|
-
if (opts.executeReminder !== undefined) {
|
|
231
|
-
const claimed = await claimDue(id);
|
|
232
|
-
if (claimed === undefined) {
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
const descriptor = toFireDescriptor(claimed, Date.now());
|
|
236
|
-
let outcome: ReminderExecutionOutcome;
|
|
237
|
-
try {
|
|
238
|
-
outcome = await opts.executeReminder(descriptor);
|
|
239
|
-
} catch (error) {
|
|
240
|
-
logger(
|
|
241
|
-
`[agent-sdk] reminder "${id}" guest execution failed: ${
|
|
242
|
-
error instanceof Error ? error.message : String(error)
|
|
243
|
-
}`,
|
|
244
|
-
);
|
|
245
|
-
outcome = {
|
|
246
|
-
kind: "retry",
|
|
247
|
-
delayMs: 1_000,
|
|
248
|
-
reason: "guest_error",
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
const result = await applyReminderOutcome(claimFromDescriptor(descriptor), outcome);
|
|
252
|
-
if (!result.applied) {
|
|
253
|
-
logger(`[agent-sdk] reminder "${id}" outcome not applied: ${result.reason}`);
|
|
254
|
-
}
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Legacy v1: do not claim/firing — runner mutates via putReminder after fire.
|
|
259
|
-
const current = reminders.get(id);
|
|
260
|
-
if (current === undefined || current.status !== "armed") {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
if (current.nextFireAtMs > Date.now() + 50) {
|
|
264
|
-
armReminder(current);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
try {
|
|
268
|
-
await opts.fireReminder!(current.id, current.fireCount);
|
|
269
|
-
} catch (error) {
|
|
270
|
-
logger(
|
|
271
|
-
`[agent-sdk] reminder "${id}" dispatch failed: ${
|
|
272
|
-
error instanceof Error ? error.message : String(error)
|
|
273
|
-
}`,
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
return {
|
|
279
|
-
protocolVersion: REMINDER_CP_PROTOCOL_VERSION,
|
|
280
|
-
|
|
281
|
-
routeContinuation: routeLocalIngressContinuation,
|
|
282
|
-
|
|
283
|
-
attachScmEvents(relay) {
|
|
284
|
-
scmRelay = relay;
|
|
285
|
-
relay.start();
|
|
286
|
-
logger("[agent-sdk] cursor-events: control-plane ingest started");
|
|
287
|
-
},
|
|
288
|
-
|
|
289
|
-
async upsertSchedule(input) {
|
|
290
|
-
schedules.set(input.name, parseCron(input.cron));
|
|
291
|
-
armScheduleTicker();
|
|
292
|
-
},
|
|
293
|
-
|
|
294
|
-
async deleteSchedule(name) {
|
|
295
|
-
schedules.delete(name);
|
|
296
|
-
if (schedules.size === 0) {
|
|
297
|
-
stopScheduleTicker();
|
|
298
|
-
}
|
|
299
|
-
},
|
|
300
|
-
|
|
301
|
-
async putReminder(record) {
|
|
302
|
-
const normalized: ReminderRecord = {
|
|
303
|
-
...record,
|
|
304
|
-
generation: record.generation ?? 0,
|
|
305
|
-
};
|
|
306
|
-
await persist(normalized);
|
|
307
|
-
if (armReminderClocks && normalized.status === "armed") {
|
|
308
|
-
armReminder(normalized);
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
clearReminderTimer(normalized.id);
|
|
312
|
-
if (normalized.status !== "firing") {
|
|
313
|
-
inflight.delete(normalized.id);
|
|
314
|
-
}
|
|
315
|
-
},
|
|
316
|
-
|
|
317
|
-
async getReminder(id) {
|
|
318
|
-
return reminders.get(id);
|
|
319
|
-
},
|
|
320
|
-
|
|
321
|
-
async listReminders() {
|
|
322
|
-
return [...reminders.values()];
|
|
323
|
-
},
|
|
324
|
-
|
|
325
|
-
async deleteReminder(id) {
|
|
326
|
-
clearReminderTimer(id);
|
|
327
|
-
inflight.delete(id);
|
|
328
|
-
reminders.delete(id);
|
|
329
|
-
await store?.delete(id);
|
|
330
|
-
},
|
|
331
|
-
|
|
332
|
-
async createReminder(intent: ReminderCreateIntent) {
|
|
333
|
-
if (intent.protocolVersion !== REMINDER_CP_PROTOCOL_VERSION) {
|
|
334
|
-
throw new Error(
|
|
335
|
-
`Unsupported reminder CP protocol version ${String(intent.protocolVersion)}`,
|
|
336
|
-
);
|
|
337
|
-
}
|
|
338
|
-
const record = intentToNewRecord(intent);
|
|
339
|
-
await persist(record);
|
|
340
|
-
if (armReminderClocks && record.status === "armed") {
|
|
341
|
-
armReminder(record);
|
|
342
|
-
}
|
|
343
|
-
return record;
|
|
344
|
-
},
|
|
345
|
-
|
|
346
|
-
async cancelReminder(id, reason = "explicit_cancel") {
|
|
347
|
-
const current = reminders.get(id);
|
|
348
|
-
if (current === undefined) {
|
|
349
|
-
return undefined;
|
|
350
|
-
}
|
|
351
|
-
if (
|
|
352
|
-
current.status === "completed" ||
|
|
353
|
-
current.status === "cancelled" ||
|
|
354
|
-
current.status === "disarmed"
|
|
355
|
-
) {
|
|
356
|
-
return current;
|
|
357
|
-
}
|
|
358
|
-
clearReminderTimer(id);
|
|
359
|
-
inflight.delete(id);
|
|
360
|
-
const updated: ReminderRecord = {
|
|
361
|
-
...current,
|
|
362
|
-
status: "cancelled",
|
|
363
|
-
disarmReason: reason,
|
|
364
|
-
generation: recordGeneration(current) + 1,
|
|
365
|
-
updatedAt: new Date().toISOString(),
|
|
366
|
-
};
|
|
367
|
-
await persist(updated);
|
|
368
|
-
return updated;
|
|
369
|
-
},
|
|
370
|
-
|
|
371
|
-
async rekeyReminders(channelId, oldToken, newToken) {
|
|
372
|
-
let n = 0;
|
|
373
|
-
for (const record of [...reminders.values()]) {
|
|
374
|
-
if (record.channelId !== channelId || record.continuationToken !== oldToken) {
|
|
375
|
-
continue;
|
|
376
|
-
}
|
|
377
|
-
if (record.status !== "armed" && record.status !== "firing") {
|
|
378
|
-
continue;
|
|
379
|
-
}
|
|
380
|
-
const wasInflight = inflight.has(record.id);
|
|
381
|
-
inflight.delete(record.id);
|
|
382
|
-
let updated: ReminderRecord = {
|
|
383
|
-
...record,
|
|
384
|
-
continuationToken: newToken,
|
|
385
|
-
status: "armed",
|
|
386
|
-
generation: recordGeneration(record) + 1,
|
|
387
|
-
updatedAt: new Date().toISOString(),
|
|
388
|
-
};
|
|
389
|
-
// Interrupted in-flight fire: retry the same fireCount soon.
|
|
390
|
-
if (wasInflight) {
|
|
391
|
-
updated = {
|
|
392
|
-
...updated,
|
|
393
|
-
nextFireAtMs: Math.min(updated.nextFireAtMs, Date.now()),
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
await persist(updated);
|
|
397
|
-
if (armReminderClocks) {
|
|
398
|
-
armReminder(updated);
|
|
399
|
-
}
|
|
400
|
-
n += 1;
|
|
401
|
-
}
|
|
402
|
-
return n;
|
|
403
|
-
},
|
|
404
|
-
|
|
405
|
-
applyReminderOutcome,
|
|
406
|
-
|
|
407
|
-
startClocks() {
|
|
408
|
-
for (const record of reminders.values()) {
|
|
409
|
-
if (record.status === "firing") {
|
|
410
|
-
// Restart hydration: treat interrupted fires as armed for retry
|
|
411
|
-
// even when clocks are not armed (status must still recover).
|
|
412
|
-
const restored: ReminderRecord = {
|
|
413
|
-
...record,
|
|
414
|
-
status: "armed",
|
|
415
|
-
updatedAt: new Date().toISOString(),
|
|
416
|
-
};
|
|
417
|
-
void persist(restored).then(() => {
|
|
418
|
-
if (armReminderClocks) {
|
|
419
|
-
armReminder(restored);
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
continue;
|
|
423
|
-
}
|
|
424
|
-
if (armReminderClocks && record.status === "armed") {
|
|
425
|
-
armReminder(record);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
},
|
|
429
|
-
|
|
430
|
-
stop() {
|
|
431
|
-
stopScheduleTicker();
|
|
432
|
-
for (const id of [...reminderTimers.keys()]) {
|
|
433
|
-
clearReminderTimer(id);
|
|
434
|
-
}
|
|
435
|
-
inflight.clear();
|
|
436
|
-
if (scmRelay !== undefined) {
|
|
437
|
-
void scmRelay.stop();
|
|
438
|
-
scmRelay = undefined;
|
|
439
|
-
}
|
|
440
|
-
},
|
|
441
|
-
};
|
|
442
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Loads an agent directory's env files (and each immediate child's, for
|
|
3
|
-
* multi-agent hosts) into process.env. Load order per directory is
|
|
4
|
-
* `.env.local` then `.env` — `process.loadEnvFile` never overrides, so
|
|
5
|
-
* real env wins over both, and `.env.local` wins over checked-in `.env`
|
|
6
|
-
* defaults. Values a previous call loaded are refreshed, so a reload
|
|
7
|
-
* picks up edits made since.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
|
|
13
|
-
// Not real env, so a reload has to clear them first: loadEnvFile skips
|
|
14
|
-
// anything already in process.env, which would pin the first-boot values.
|
|
15
|
-
let fileLoadedKeys = new Set<string>();
|
|
16
|
-
|
|
17
|
-
export function loadAgentLocalEnv(dir: string): string[] {
|
|
18
|
-
for (const key of fileLoadedKeys) {
|
|
19
|
-
delete process.env[key];
|
|
20
|
-
}
|
|
21
|
-
const realKeys = new Set(Object.keys(process.env));
|
|
22
|
-
const loaded: string[] = [];
|
|
23
|
-
const tryLoad = (path: string): void => {
|
|
24
|
-
if (!existsSync(path)) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
process.loadEnvFile(path);
|
|
28
|
-
loaded.push(path);
|
|
29
|
-
};
|
|
30
|
-
const trackLoadedKeys = (): void => {
|
|
31
|
-
fileLoadedKeys = new Set(Object.keys(process.env).filter(key => !realKeys.has(key)));
|
|
32
|
-
};
|
|
33
|
-
const tryLoadDir = (agentDir: string): void => {
|
|
34
|
-
// `.env.local` first so its values win over checked-in `.env` defaults
|
|
35
|
-
// under loadEnvFile's no-override semantics.
|
|
36
|
-
tryLoad(join(agentDir, ".env.local"));
|
|
37
|
-
tryLoad(join(agentDir, ".env"));
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
tryLoadDir(dir);
|
|
41
|
-
|
|
42
|
-
let children: string[];
|
|
43
|
-
try {
|
|
44
|
-
children = readdirSync(dir, { withFileTypes: true })
|
|
45
|
-
.filter(entry => entry.isDirectory() && !entry.name.startsWith("."))
|
|
46
|
-
.map(entry => entry.name);
|
|
47
|
-
} catch {
|
|
48
|
-
trackLoadedKeys();
|
|
49
|
-
return loaded;
|
|
50
|
-
}
|
|
51
|
-
for (const child of children) {
|
|
52
|
-
if (child === "node_modules") {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
tryLoadDir(join(dir, child));
|
|
56
|
-
}
|
|
57
|
-
trackLoadedKeys();
|
|
58
|
-
return loaded;
|
|
59
|
-
}
|