@cursor/july 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +290 -0
- package/LICENSE.md +3 -0
- package/README.md +1233 -0
- package/dist/ab.d.ts +290 -0
- package/dist/ab.d.ts.map +1 -0
- package/dist/ab.js +386 -0
- package/dist/bin/agent-serve.d.ts +15 -0
- package/dist/bin/agent-serve.d.ts.map +1 -0
- package/dist/bin/agent-serve.js +754 -0
- package/dist/channels/github/api.d.ts +101 -0
- package/dist/channels/github/api.d.ts.map +1 -0
- package/dist/channels/github/api.js +229 -0
- package/dist/channels/github/auth.d.ts +67 -0
- package/dist/channels/github/auth.d.ts.map +1 -0
- package/dist/channels/github/auth.js +239 -0
- package/dist/channels/github/binding.d.ts +73 -0
- package/dist/channels/github/binding.d.ts.map +1 -0
- package/dist/channels/github/binding.js +114 -0
- package/dist/channels/github/defaults.d.ts +24 -0
- package/dist/channels/github/defaults.d.ts.map +1 -0
- package/dist/channels/github/defaults.js +100 -0
- package/dist/channels/github/events.d.ts +18 -0
- package/dist/channels/github/events.d.ts.map +1 -0
- package/dist/channels/github/events.js +59 -0
- package/dist/channels/github/forward.d.ts +137 -0
- package/dist/channels/github/forward.d.ts.map +1 -0
- package/dist/channels/github/forward.js +271 -0
- package/dist/channels/github/github-channel.d.ts +127 -0
- package/dist/channels/github/github-channel.d.ts.map +1 -0
- package/dist/channels/github/github-channel.js +1688 -0
- package/dist/channels/github/index.d.ts +52 -0
- package/dist/channels/github/index.d.ts.map +1 -0
- package/dist/channels/github/index.js +51 -0
- package/dist/channels/github/replay.d.ts +115 -0
- package/dist/channels/github/replay.d.ts.map +1 -0
- package/dist/channels/github/replay.js +282 -0
- package/dist/channels/github/state.d.ts +26 -0
- package/dist/channels/github/state.d.ts.map +1 -0
- package/dist/channels/github/state.js +50 -0
- package/dist/channels/github/types.d.ts +385 -0
- package/dist/channels/github/types.d.ts.map +1 -0
- package/dist/channels/github/types.js +1 -0
- package/dist/channels/slack/api.d.ts +117 -0
- package/dist/channels/slack/api.d.ts.map +1 -0
- package/dist/channels/slack/api.js +437 -0
- package/dist/channels/slack/approvals.d.ts +32 -0
- package/dist/channels/slack/approvals.d.ts.map +1 -0
- package/dist/channels/slack/approvals.js +157 -0
- package/dist/channels/slack/assistant.d.ts +23 -0
- package/dist/channels/slack/assistant.d.ts.map +1 -0
- package/dist/channels/slack/assistant.js +67 -0
- package/dist/channels/slack/auth.d.ts +40 -0
- package/dist/channels/slack/auth.d.ts.map +1 -0
- package/dist/channels/slack/auth.js +71 -0
- package/dist/channels/slack/channel-watch.d.ts +46 -0
- package/dist/channels/slack/channel-watch.d.ts.map +1 -0
- package/dist/channels/slack/channel-watch.js +180 -0
- package/dist/channels/slack/constants.d.ts +17 -0
- package/dist/channels/slack/constants.d.ts.map +1 -0
- package/dist/channels/slack/constants.js +27 -0
- package/dist/channels/slack/credentials.d.ts +35 -0
- package/dist/channels/slack/credentials.d.ts.map +1 -0
- package/dist/channels/slack/credentials.js +88 -0
- package/dist/channels/slack/cursor-account.d.ts +76 -0
- package/dist/channels/slack/cursor-account.d.ts.map +1 -0
- package/dist/channels/slack/cursor-account.js +88 -0
- package/dist/channels/slack/defaults.d.ts +32 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -0
- package/dist/channels/slack/defaults.js +380 -0
- package/dist/channels/slack/dispatch.d.ts +43 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -0
- package/dist/channels/slack/dispatch.js +185 -0
- package/dist/channels/slack/doctor.d.ts +24 -0
- package/dist/channels/slack/doctor.d.ts.map +1 -0
- package/dist/channels/slack/doctor.js +115 -0
- package/dist/channels/slack/event-id-dedupe.d.ts +10 -0
- package/dist/channels/slack/event-id-dedupe.d.ts.map +1 -0
- package/dist/channels/slack/event-id-dedupe.js +23 -0
- package/dist/channels/slack/inbound.d.ts +41 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -0
- package/dist/channels/slack/inbound.js +166 -0
- package/dist/channels/slack/index.d.ts +45 -0
- package/dist/channels/slack/index.d.ts.map +1 -0
- package/dist/channels/slack/index.js +44 -0
- package/dist/channels/slack/init.d.ts +32 -0
- package/dist/channels/slack/init.d.ts.map +1 -0
- package/dist/channels/slack/init.js +82 -0
- package/dist/channels/slack/interactive.d.ts +19 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -0
- package/dist/channels/slack/interactive.js +142 -0
- package/dist/channels/slack/links.d.ts +10 -0
- package/dist/channels/slack/links.d.ts.map +1 -0
- package/dist/channels/slack/links.js +19 -0
- package/dist/channels/slack/live-delivery.d.ts +75 -0
- package/dist/channels/slack/live-delivery.d.ts.map +1 -0
- package/dist/channels/slack/live-delivery.js +143 -0
- package/dist/channels/slack/log.d.ts +25 -0
- package/dist/channels/slack/log.d.ts.map +1 -0
- package/dist/channels/slack/log.js +47 -0
- package/dist/channels/slack/manifest.d.ts +57 -0
- package/dist/channels/slack/manifest.d.ts.map +1 -0
- package/dist/channels/slack/manifest.js +110 -0
- package/dist/channels/slack/pr-ref.d.ts +18 -0
- package/dist/channels/slack/pr-ref.d.ts.map +1 -0
- package/dist/channels/slack/pr-ref.js +36 -0
- package/dist/channels/slack/setup.d.ts +14 -0
- package/dist/channels/slack/setup.d.ts.map +1 -0
- package/dist/channels/slack/setup.js +86 -0
- package/dist/channels/slack/slack-channel.d.ts +15 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -0
- package/dist/channels/slack/slack-channel.js +281 -0
- package/dist/channels/slack/socket-mode.d.ts +26 -0
- package/dist/channels/slack/socket-mode.d.ts.map +1 -0
- package/dist/channels/slack/socket-mode.js +116 -0
- package/dist/channels/slack/stream.d.ts +26 -0
- package/dist/channels/slack/stream.d.ts.map +1 -0
- package/dist/channels/slack/stream.js +39 -0
- package/dist/channels/slack/tool-approval-events.d.ts +33 -0
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -0
- package/dist/channels/slack/tool-approval-events.js +129 -0
- package/dist/channels/slack/types.d.ts +326 -0
- package/dist/channels/slack/types.d.ts.map +1 -0
- package/dist/channels/slack/types.js +4 -0
- package/dist/channels.d.ts +116 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +294 -0
- package/dist/connections.d.ts +75 -0
- package/dist/connections.d.ts.map +1 -0
- package/dist/connections.js +75 -0
- package/dist/docs/404.html +22 -0
- package/dist/docs/ab.html +87 -0
- package/dist/docs/assets/ab.md.COdXkces.js +63 -0
- package/dist/docs/assets/ab.md.COdXkces.lean.js +1 -0
- package/dist/docs/assets/app.DqfFEmJd.js +1 -0
- package/dist/docs/assets/building-with-agents.md.CJCtZCyi.js +13 -0
- package/dist/docs/assets/building-with-agents.md.CJCtZCyi.lean.js +1 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.CcVk1uKq.js +1 -0
- package/dist/docs/assets/chunks/VPLocalSearchBox.BaLEdS15.js +9 -0
- package/dist/docs/assets/chunks/framework.CAZyNGu9.js +19 -0
- package/dist/docs/assets/chunks/theme.CZRvu_0q.js +2 -0
- package/dist/docs/assets/concepts.md.Cfb9b-k1.js +4 -0
- package/dist/docs/assets/concepts.md.Cfb9b-k1.lean.js +1 -0
- package/dist/docs/assets/deployment.md.Dx1TYNk5.js +14 -0
- package/dist/docs/assets/deployment.md.Dx1TYNk5.lean.js +1 -0
- package/dist/docs/assets/evals.md.DPZ_MAnI.js +85 -0
- package/dist/docs/assets/evals.md.DPZ_MAnI.lean.js +1 -0
- package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.js +10 -0
- package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.lean.js +1 -0
- package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.js +9 -0
- package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.lean.js +1 -0
- package/dist/docs/assets/guides_github.md.DwbKhCeS.js +20 -0
- package/dist/docs/assets/guides_github.md.DwbKhCeS.lean.js +1 -0
- package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.js +28 -0
- package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.lean.js +1 -0
- package/dist/docs/assets/guides_slack.md.bv41fHfW.js +37 -0
- package/dist/docs/assets/guides_slack.md.bv41fHfW.lean.js +1 -0
- package/dist/docs/assets/guides_webhooks.md.hFTik3lf.js +50 -0
- package/dist/docs/assets/guides_webhooks.md.hFTik3lf.lean.js +1 -0
- package/dist/docs/assets/hillclimbing.md.DHNast08.js +4 -0
- package/dist/docs/assets/hillclimbing.md.DHNast08.lean.js +1 -0
- package/dist/docs/assets/index.md.BPKcj5AI.js +20 -0
- package/dist/docs/assets/index.md.BPKcj5AI.lean.js +1 -0
- package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/dist/docs/assets/quickstart.md.tVPiGK_L.js +35 -0
- package/dist/docs/assets/quickstart.md.tVPiGK_L.lean.js +1 -0
- package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.js +34 -0
- package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.lean.js +1 -0
- package/dist/docs/assets/reference_channels.md.D7JTR03W.js +53 -0
- package/dist/docs/assets/reference_channels.md.D7JTR03W.lean.js +1 -0
- package/dist/docs/assets/reference_cli.md.DA730zCu.js +33 -0
- package/dist/docs/assets/reference_cli.md.DA730zCu.lean.js +1 -0
- package/dist/docs/assets/reference_connections.md.C3vNH_DE.js +26 -0
- package/dist/docs/assets/reference_connections.md.C3vNH_DE.lean.js +1 -0
- package/dist/docs/assets/reference_hooks.md.BCEc3MyM.js +12 -0
- package/dist/docs/assets/reference_hooks.md.BCEc3MyM.lean.js +1 -0
- package/dist/docs/assets/reference_http-api.md.DBAahtdz.js +11 -0
- package/dist/docs/assets/reference_http-api.md.DBAahtdz.lean.js +1 -0
- package/dist/docs/assets/reference_instructions.md.BC05LEQ8.js +12 -0
- package/dist/docs/assets/reference_instructions.md.BC05LEQ8.lean.js +1 -0
- package/dist/docs/assets/reference_playground.md.CPZhfYaO.js +1 -0
- package/dist/docs/assets/reference_playground.md.CPZhfYaO.lean.js +1 -0
- package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.js +31 -0
- package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.lean.js +1 -0
- package/dist/docs/assets/reference_schedules.md.D7qijxLk.js +82 -0
- package/dist/docs/assets/reference_schedules.md.D7qijxLk.lean.js +1 -0
- package/dist/docs/assets/reference_sessions.md.DdjWabnN.js +8 -0
- package/dist/docs/assets/reference_sessions.md.DdjWabnN.lean.js +1 -0
- package/dist/docs/assets/reference_skills.md.VQnlBT3Q.js +15 -0
- package/dist/docs/assets/reference_skills.md.VQnlBT3Q.lean.js +1 -0
- package/dist/docs/assets/reference_subagents.md.CIRAVcPK.js +10 -0
- package/dist/docs/assets/reference_subagents.md.CIRAVcPK.lean.js +1 -0
- package/dist/docs/assets/reference_tools.md.DF5kwlt0.js +46 -0
- package/dist/docs/assets/reference_tools.md.DF5kwlt0.lean.js +1 -0
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.js +1 -0
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.lean.js +1 -0
- package/dist/docs/assets/style.Bj-IXa5W.css +1 -0
- package/dist/docs/assets/troubleshooting.md.DkovjS7h.js +1 -0
- package/dist/docs/assets/troubleshooting.md.DkovjS7h.lean.js +1 -0
- package/dist/docs/building-with-agents.html +37 -0
- package/dist/docs/concepts.html +28 -0
- package/dist/docs/deployment.html +38 -0
- package/dist/docs/evals.html +109 -0
- package/dist/docs/guides/agent-to-agent.html +34 -0
- package/dist/docs/guides/cloud-runtime.html +33 -0
- package/dist/docs/guides/github.html +44 -0
- package/dist/docs/guides/human-in-the-loop.html +52 -0
- package/dist/docs/guides/slack.html +61 -0
- package/dist/docs/guides/webhooks.html +74 -0
- package/dist/docs/hashmap.json +1 -0
- package/dist/docs/hillclimbing.html +28 -0
- package/dist/docs/index.html +44 -0
- package/dist/docs/quickstart.html +59 -0
- package/dist/docs/reference/agent-config.html +58 -0
- package/dist/docs/reference/channels.html +77 -0
- package/dist/docs/reference/cli.html +57 -0
- package/dist/docs/reference/connections.html +50 -0
- package/dist/docs/reference/hooks.html +36 -0
- package/dist/docs/reference/http-api.html +35 -0
- package/dist/docs/reference/instructions.html +36 -0
- package/dist/docs/reference/playground.html +25 -0
- package/dist/docs/reference/project-layout.html +55 -0
- package/dist/docs/reference/schedules.html +106 -0
- package/dist/docs/reference/sessions.html +32 -0
- package/dist/docs/reference/skills.html +39 -0
- package/dist/docs/reference/subagents.html +34 -0
- package/dist/docs/reference/tools.html +70 -0
- package/dist/docs/scaffolding-agents.html +25 -0
- package/dist/docs/troubleshooting.html +25 -0
- package/dist/docs/vp-icons.css +0 -0
- package/dist/evals.d.ts +312 -0
- package/dist/evals.d.ts.map +1 -0
- package/dist/evals.js +254 -0
- package/dist/hooks.d.ts +23 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +23 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/internal/ab-collector.d.ts +42 -0
- package/dist/internal/ab-collector.d.ts.map +1 -0
- package/dist/internal/ab-collector.js +153 -0
- package/dist/internal/ab-fold.d.ts +36 -0
- package/dist/internal/ab-fold.d.ts.map +1 -0
- package/dist/internal/ab-fold.js +171 -0
- package/dist/internal/ab-snapshot.d.ts +70 -0
- package/dist/internal/ab-snapshot.d.ts.map +1 -0
- package/dist/internal/ab-snapshot.js +208 -0
- package/dist/internal/approval-gate.d.ts +34 -0
- package/dist/internal/approval-gate.d.ts.map +1 -0
- package/dist/internal/approval-gate.js +85 -0
- package/dist/internal/auth.d.ts +8 -0
- package/dist/internal/auth.d.ts.map +1 -0
- package/dist/internal/auth.js +27 -0
- package/dist/internal/authored-alias-hooks.d.ts +31 -0
- package/dist/internal/authored-alias-hooks.d.ts.map +1 -0
- package/dist/internal/authored-alias-hooks.js +43 -0
- package/dist/internal/authored-loaders.d.ts +25 -0
- package/dist/internal/authored-loaders.d.ts.map +1 -0
- package/dist/internal/authored-loaders.js +129 -0
- package/dist/internal/bounded-int.d.ts +11 -0
- package/dist/internal/bounded-int.d.ts.map +1 -0
- package/dist/internal/bounded-int.js +13 -0
- package/dist/internal/brand.d.ts +6 -0
- package/dist/internal/brand.d.ts.map +1 -0
- package/dist/internal/brand.js +17 -0
- package/dist/internal/chat-client.d.ts +19 -0
- package/dist/internal/chat-client.d.ts.map +1 -0
- package/dist/internal/chat-client.js +327 -0
- package/dist/internal/cli-ax.d.ts +58 -0
- package/dist/internal/cli-ax.d.ts.map +1 -0
- package/dist/internal/cli-ax.js +345 -0
- package/dist/internal/cli-cursor.d.ts +20 -0
- package/dist/internal/cli-cursor.d.ts.map +1 -0
- package/dist/internal/cli-cursor.js +227 -0
- package/dist/internal/cli-github.d.ts +47 -0
- package/dist/internal/cli-github.d.ts.map +1 -0
- package/dist/internal/cli-github.js +644 -0
- package/dist/internal/cli-slack.d.ts +18 -0
- package/dist/internal/cli-slack.d.ts.map +1 -0
- package/dist/internal/cli-slack.js +144 -0
- package/dist/internal/cloud-merge.d.ts +23 -0
- package/dist/internal/cloud-merge.d.ts.map +1 -0
- package/dist/internal/cloud-merge.js +28 -0
- package/dist/internal/cron.d.ts +17 -0
- package/dist/internal/cron.d.ts.map +1 -0
- package/dist/internal/cron.js +60 -0
- package/dist/internal/cursor/account-mcp.d.ts +95 -0
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -0
- package/dist/internal/cursor/account-mcp.js +342 -0
- package/dist/internal/cursor/backend-client.d.ts +118 -0
- package/dist/internal/cursor/backend-client.d.ts.map +1 -0
- package/dist/internal/cursor/backend-client.js +477 -0
- package/dist/internal/cursor/credentials.d.ts +112 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -0
- package/dist/internal/cursor/credentials.js +329 -0
- package/dist/internal/cursor-event-relay.d.ts +111 -0
- package/dist/internal/cursor-event-relay.d.ts.map +1 -0
- package/dist/internal/cursor-event-relay.js +181 -0
- package/dist/internal/cursor-relay-core.d.ts +113 -0
- package/dist/internal/cursor-relay-core.d.ts.map +1 -0
- package/dist/internal/cursor-relay-core.js +364 -0
- package/dist/internal/cursor-slack-relay.d.ts +94 -0
- package/dist/internal/cursor-slack-relay.d.ts.map +1 -0
- package/dist/internal/cursor-slack-relay.js +171 -0
- package/dist/internal/describe-error.d.ts +3 -0
- package/dist/internal/describe-error.d.ts.map +1 -0
- package/dist/internal/describe-error.js +4 -0
- package/dist/internal/dev-mode.d.ts +13 -0
- package/dist/internal/dev-mode.d.ts.map +1 -0
- package/dist/internal/dev-mode.js +17 -0
- package/dist/internal/discovery.d.ts +55 -0
- package/dist/internal/discovery.d.ts.map +1 -0
- package/dist/internal/discovery.js +1427 -0
- package/dist/internal/distribution.d.ts +47 -0
- package/dist/internal/distribution.d.ts.map +1 -0
- package/dist/internal/distribution.js +82 -0
- package/dist/internal/docs-site.d.ts +28 -0
- package/dist/internal/docs-site.d.ts.map +1 -0
- package/dist/internal/docs-site.js +169 -0
- package/dist/internal/duration.d.ts +8 -0
- package/dist/internal/duration.d.ts.map +1 -0
- package/dist/internal/duration.js +35 -0
- package/dist/internal/eval-run-store.d.ts +81 -0
- package/dist/internal/eval-run-store.d.ts.map +1 -0
- package/dist/internal/eval-run-store.js +396 -0
- package/dist/internal/eval-runner.d.ts +76 -0
- package/dist/internal/eval-runner.d.ts.map +1 -0
- package/dist/internal/eval-runner.js +336 -0
- package/dist/internal/event-log.d.ts +51 -0
- package/dist/internal/event-log.d.ts.map +1 -0
- package/dist/internal/event-log.js +167 -0
- package/dist/internal/event-mapper.d.ts +46 -0
- package/dist/internal/event-mapper.d.ts.map +1 -0
- package/dist/internal/event-mapper.js +226 -0
- package/dist/internal/frontmatter.d.ts +12 -0
- package/dist/internal/frontmatter.d.ts.map +1 -0
- package/dist/internal/frontmatter.js +61 -0
- package/dist/internal/github-fanout.d.ts +32 -0
- package/dist/internal/github-fanout.d.ts.map +1 -0
- package/dist/internal/github-fanout.js +122 -0
- package/dist/internal/handleAgentServeTrigger.d.ts +59 -0
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -0
- package/dist/internal/handleAgentServeTrigger.js +115 -0
- package/dist/internal/host-platforms.d.ts +40 -0
- package/dist/internal/host-platforms.d.ts.map +1 -0
- package/dist/internal/host-platforms.js +113 -0
- package/dist/internal/http-channel.d.ts +54 -0
- package/dist/internal/http-channel.d.ts.map +1 -0
- package/dist/internal/http-channel.js +382 -0
- package/dist/internal/ids.d.ts +19 -0
- package/dist/internal/ids.d.ts.map +1 -0
- package/dist/internal/ids.js +34 -0
- package/dist/internal/init-project.d.ts +22 -0
- package/dist/internal/init-project.d.ts.map +1 -0
- package/dist/internal/init-project.js +125 -0
- package/dist/internal/json-dir-store.d.ts +32 -0
- package/dist/internal/json-dir-store.d.ts.map +1 -0
- package/dist/internal/json-dir-store.js +100 -0
- package/dist/internal/json-schema.d.ts +18 -0
- package/dist/internal/json-schema.d.ts.map +1 -0
- package/dist/internal/json-schema.js +53 -0
- package/dist/internal/log-ring.d.ts +23 -0
- package/dist/internal/log-ring.d.ts.map +1 -0
- package/dist/internal/log-ring.js +42 -0
- package/dist/internal/map-pool.d.ts +6 -0
- package/dist/internal/map-pool.d.ts.map +1 -0
- package/dist/internal/map-pool.js +41 -0
- package/dist/internal/mcp-endpoint.d.ts +59 -0
- package/dist/internal/mcp-endpoint.d.ts.map +1 -0
- package/dist/internal/mcp-endpoint.js +355 -0
- package/dist/internal/mcp-host.d.ts +28 -0
- package/dist/internal/mcp-host.d.ts.map +1 -0
- package/dist/internal/mcp-host.js +162 -0
- package/dist/internal/net.d.ts +5 -0
- package/dist/internal/net.d.ts.map +1 -0
- package/dist/internal/net.js +30 -0
- package/dist/internal/peer-connections.d.ts +44 -0
- package/dist/internal/peer-connections.d.ts.map +1 -0
- package/dist/internal/peer-connections.js +67 -0
- package/dist/internal/playground/static.d.ts +35 -0
- package/dist/internal/playground/static.d.ts.map +1 -0
- package/dist/internal/playground/static.js +162 -0
- package/dist/internal/playground/toolchain.d.ts +57 -0
- package/dist/internal/playground/toolchain.d.ts.map +1 -0
- package/dist/internal/playground/toolchain.js +226 -0
- package/dist/internal/reminder-runner.d.ts +62 -0
- package/dist/internal/reminder-runner.d.ts.map +1 -0
- package/dist/internal/reminder-runner.js +582 -0
- package/dist/internal/reminder-schedule.d.ts +22 -0
- package/dist/internal/reminder-schedule.d.ts.map +1 -0
- package/dist/internal/reminder-schedule.js +82 -0
- package/dist/internal/reminder-store.d.ts +58 -0
- package/dist/internal/reminder-store.d.ts.map +1 -0
- package/dist/internal/reminder-store.js +106 -0
- package/dist/internal/resolved-connections.d.ts +41 -0
- package/dist/internal/resolved-connections.d.ts.map +1 -0
- package/dist/internal/resolved-connections.js +73 -0
- package/dist/internal/review-comments.d.ts +50 -0
- package/dist/internal/review-comments.d.ts.map +1 -0
- package/dist/internal/review-comments.js +194 -0
- package/dist/internal/router.d.ts +33 -0
- package/dist/internal/router.d.ts.map +1 -0
- package/dist/internal/router.js +93 -0
- package/dist/internal/run-client.d.ts +49 -0
- package/dist/internal/run-client.d.ts.map +1 -0
- package/dist/internal/run-client.js +208 -0
- package/dist/internal/schedule-runner.d.ts +31 -0
- package/dist/internal/schedule-runner.d.ts.map +1 -0
- package/dist/internal/schedule-runner.js +126 -0
- package/dist/internal/sdk-runner.d.ts +41 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -0
- package/dist/internal/sdk-runner.js +221 -0
- package/dist/internal/server.d.ts +25 -0
- package/dist/internal/server.d.ts.map +1 -0
- package/dist/internal/server.js +1374 -0
- package/dist/internal/session-engine.d.ts +287 -0
- package/dist/internal/session-engine.d.ts.map +1 -0
- package/dist/internal/session-engine.js +1377 -0
- package/dist/internal/session-store.d.ts +29 -0
- package/dist/internal/session-store.d.ts.map +1 -0
- package/dist/internal/session-store.js +140 -0
- package/dist/internal/session-urls.d.ts +10 -0
- package/dist/internal/session-urls.d.ts.map +1 -0
- package/dist/internal/session-urls.js +25 -0
- package/dist/internal/stream-progress.d.ts +14 -0
- package/dist/internal/stream-progress.d.ts.map +1 -0
- package/dist/internal/stream-progress.js +195 -0
- package/dist/internal/tool-result.d.ts +20 -0
- package/dist/internal/tool-result.d.ts.map +1 -0
- package/dist/internal/tool-result.js +45 -0
- package/dist/internal/trajectory.d.ts +56 -0
- package/dist/internal/trajectory.d.ts.map +1 -0
- package/dist/internal/trajectory.js +248 -0
- package/dist/internal/workspace.d.ts +42 -0
- package/dist/internal/workspace.d.ts.map +1 -0
- package/dist/internal/workspace.js +199 -0
- package/dist/playground/assets/cursor-icons-outline-oY2V_mvK.woff2 +0 -0
- package/dist/playground/assets/index-1K-hG-7p.css +1 -0
- package/dist/playground/assets/index-FlWjhg3x.js +79 -0
- package/dist/playground/index.html +17 -0
- package/dist/reminders.d.ts +23 -0
- package/dist/reminders.d.ts.map +1 -0
- package/dist/reminders.js +22 -0
- package/dist/schedules.d.ts +23 -0
- package/dist/schedules.d.ts.map +1 -0
- package/dist/schedules.js +26 -0
- package/dist/skills.d.ts +22 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +22 -0
- package/dist/tools.d.ts +92 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +68 -0
- package/dist/types.d.ts +1609 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +80 -0
- package/docs/README.md +174 -0
- package/docs/ab.md +355 -0
- package/docs/building-with-agents.md +129 -0
- package/docs/concepts.md +177 -0
- package/docs/deployment.md +218 -0
- package/docs/evals.md +383 -0
- package/docs/guides/agent-to-agent.md +118 -0
- package/docs/guides/cloud-runtime.md +122 -0
- package/docs/guides/github.md +172 -0
- package/docs/guides/human-in-the-loop.md +131 -0
- package/docs/guides/slack.md +245 -0
- package/docs/guides/webhooks.md +201 -0
- package/docs/hillclimbing.md +93 -0
- package/docs/quickstart.md +183 -0
- package/docs/reference/agent-config.md +154 -0
- package/docs/reference/channels.md +206 -0
- package/docs/reference/cli.md +257 -0
- package/docs/reference/connections.md +137 -0
- package/docs/reference/hooks.md +74 -0
- package/docs/reference/http-api.md +219 -0
- package/docs/reference/instructions.md +77 -0
- package/docs/reference/playground.md +67 -0
- package/docs/reference/project-layout.md +119 -0
- package/docs/reference/schedules.md +220 -0
- package/docs/reference/sessions.md +165 -0
- package/docs/reference/skills.md +79 -0
- package/docs/reference/subagents.md +74 -0
- package/docs/reference/tools.md +203 -0
- package/docs/scaffolding-agents.md +113 -0
- package/docs/troubleshooting.md +95 -0
- package/package.json +185 -0
- package/skills/ab/SKILL.md +139 -0
- package/skills/create-agent/SKILL.md +219 -0
- package/skills/debug/SKILL.md +71 -0
- package/skills/evals/SKILL.md +217 -0
- package/skills/framework-map/SKILL.md +142 -0
- package/skills/github/SKILL.md +144 -0
- package/skills/hillclimb/SKILL.md +162 -0
- package/skills/setup-slack/SKILL.md +180 -0
- package/src/ab.ts +675 -0
- package/src/bin/agent-serve.ts +949 -0
- package/src/channels/github/api.ts +374 -0
- package/src/channels/github/auth.ts +275 -0
- package/src/channels/github/binding.ts +223 -0
- package/src/channels/github/defaults.ts +111 -0
- package/src/channels/github/events.ts +72 -0
- package/src/channels/github/forward.ts +381 -0
- package/src/channels/github/github-channel.ts +2270 -0
- package/src/channels/github/index.ts +52 -0
- package/src/channels/github/replay.ts +387 -0
- package/src/channels/github/state.ts +95 -0
- package/src/channels/github/types.ts +490 -0
- package/src/channels/slack/api.ts +580 -0
- package/src/channels/slack/approvals.ts +198 -0
- package/src/channels/slack/assistant.ts +76 -0
- package/src/channels/slack/auth.ts +112 -0
- package/src/channels/slack/channel-watch.ts +219 -0
- package/src/channels/slack/constants.ts +30 -0
- package/src/channels/slack/credentials.ts +90 -0
- package/src/channels/slack/cursor-account.ts +166 -0
- package/src/channels/slack/defaults.ts +450 -0
- package/src/channels/slack/dispatch.ts +293 -0
- package/src/channels/slack/doctor.ts +135 -0
- package/src/channels/slack/event-id-dedupe.ts +30 -0
- package/src/channels/slack/inbound.ts +219 -0
- package/src/channels/slack/index.ts +45 -0
- package/src/channels/slack/init.ts +133 -0
- package/src/channels/slack/interactive.ts +194 -0
- package/src/channels/slack/links.ts +23 -0
- package/src/channels/slack/live-delivery.ts +201 -0
- package/src/channels/slack/log.ts +83 -0
- package/src/channels/slack/manifest.ts +179 -0
- package/src/channels/slack/pr-ref.ts +50 -0
- package/src/channels/slack/setup.ts +97 -0
- package/src/channels/slack/slack-channel.ts +374 -0
- package/src/channels/slack/socket-mode.ts +154 -0
- package/src/channels/slack/stream.ts +63 -0
- package/src/channels/slack/tool-approval-events.ts +136 -0
- package/src/channels/slack/types.ts +349 -0
- package/src/channels.ts +385 -0
- package/src/connections.ts +89 -0
- package/src/evals.ts +501 -0
- package/src/hooks.ts +33 -0
- package/src/index.ts +184 -0
- package/src/internal/ab-collector.ts +210 -0
- package/src/internal/ab-fold.ts +228 -0
- package/src/internal/ab-snapshot.ts +335 -0
- package/src/internal/approval-gate.ts +115 -0
- package/src/internal/auth.ts +39 -0
- package/src/internal/authored-alias-hooks.ts +69 -0
- package/src/internal/authored-loaders.ts +138 -0
- package/src/internal/bounded-int.ts +27 -0
- package/src/internal/brand.ts +29 -0
- package/src/internal/chat-client.ts +407 -0
- package/src/internal/cli-ax.ts +474 -0
- package/src/internal/cli-cursor.ts +275 -0
- package/src/internal/cli-github.ts +849 -0
- package/src/internal/cli-slack.ts +175 -0
- package/src/internal/cloud-merge.ts +41 -0
- package/src/internal/cron.ts +78 -0
- package/src/internal/cursor/account-mcp.ts +472 -0
- package/src/internal/cursor/backend-client.ts +614 -0
- package/src/internal/cursor/credentials.ts +401 -0
- package/src/internal/cursor-event-relay.ts +281 -0
- package/src/internal/cursor-relay-core.ts +444 -0
- package/src/internal/cursor-slack-relay.ts +242 -0
- package/src/internal/describe-error.ts +4 -0
- package/src/internal/dev-mode.ts +20 -0
- package/src/internal/discovery.ts +1709 -0
- package/src/internal/distribution.ts +97 -0
- package/src/internal/docs-site.ts +191 -0
- package/src/internal/duration.ts +39 -0
- package/src/internal/eval-run-store.ts +519 -0
- package/src/internal/eval-runner.ts +522 -0
- package/src/internal/event-log.ts +175 -0
- package/src/internal/event-mapper.ts +272 -0
- package/src/internal/frontmatter.ts +77 -0
- package/src/internal/github-fanout.ts +159 -0
- package/src/internal/handleAgentServeTrigger.ts +156 -0
- package/src/internal/host-platforms.ts +144 -0
- package/src/internal/http-channel.ts +546 -0
- package/src/internal/ids.ts +44 -0
- package/src/internal/init-project.ts +165 -0
- package/src/internal/json-dir-store.ts +109 -0
- package/src/internal/json-schema.ts +69 -0
- package/src/internal/log-ring.ts +59 -0
- package/src/internal/map-pool.ts +32 -0
- package/src/internal/mcp-endpoint.ts +518 -0
- package/src/internal/mcp-host.ts +211 -0
- package/src/internal/net.ts +31 -0
- package/src/internal/peer-connections.ts +100 -0
- package/src/internal/playground/static.ts +189 -0
- package/src/internal/playground/toolchain.ts +277 -0
- package/src/internal/reminder-runner.ts +756 -0
- package/src/internal/reminder-schedule.ts +106 -0
- package/src/internal/reminder-store.ts +145 -0
- package/src/internal/resolved-connections.ts +145 -0
- package/src/internal/review-comments.ts +268 -0
- package/src/internal/router.ts +145 -0
- package/src/internal/run-client.ts +320 -0
- package/src/internal/schedule-runner.ts +161 -0
- package/src/internal/sdk-runner.ts +315 -0
- package/src/internal/server.ts +1737 -0
- package/src/internal/session-engine.ts +1810 -0
- package/src/internal/session-store.ts +147 -0
- package/src/internal/session-urls.ts +40 -0
- package/src/internal/stream-progress.ts +254 -0
- package/src/internal/tool-result.ts +54 -0
- package/src/internal/trajectory.ts +306 -0
- package/src/internal/workspace.ts +223 -0
- package/src/reminders.ts +35 -0
- package/src/schedules.ts +37 -0
- package/src/skills.ts +27 -0
- package/src/tools.ts +127 -0
- package/src/types.ts +1848 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schedule resolution for reminders (`every` / `cron` / `delay` / `at`).
|
|
3
|
+
*/
|
|
4
|
+
import { parseCron } from "./cron.js";
|
|
5
|
+
import { parseDuration } from "./duration.js";
|
|
6
|
+
export class ReminderValidationError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "ReminderValidationError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Node setTimeout overflows past ~2^31-1 ms (~24.8d); chunk long waits. */
|
|
13
|
+
export const MAX_TIMER_MS = 2147483647;
|
|
14
|
+
/** Resolve create-input schedule fields into a concrete next-fire plan. */
|
|
15
|
+
export function resolveSchedule(input) {
|
|
16
|
+
const shapes = [
|
|
17
|
+
input.every !== undefined,
|
|
18
|
+
input.cron !== undefined,
|
|
19
|
+
input.delay !== undefined,
|
|
20
|
+
input.at !== undefined,
|
|
21
|
+
].filter(Boolean);
|
|
22
|
+
if (shapes.length !== 1) {
|
|
23
|
+
throw new ReminderValidationError("reminders.create requires exactly one of every, cron, delay, or at");
|
|
24
|
+
}
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
if (input.every !== undefined) {
|
|
27
|
+
const intervalMs = parseDuration(input.every);
|
|
28
|
+
if (intervalMs <= 0) {
|
|
29
|
+
throw new ReminderValidationError(`every must be > 0 (got ${input.every})`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
kind: "every",
|
|
33
|
+
value: String(input.every),
|
|
34
|
+
intervalMs,
|
|
35
|
+
nextFireAtMs: now + intervalMs,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (input.cron !== undefined) {
|
|
39
|
+
parseCron(input.cron); // validate
|
|
40
|
+
return {
|
|
41
|
+
kind: "cron",
|
|
42
|
+
value: input.cron,
|
|
43
|
+
nextFireAtMs: nextCronFireMs(input.cron, now),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (input.delay !== undefined) {
|
|
47
|
+
const delayMs = parseDuration(input.delay);
|
|
48
|
+
return {
|
|
49
|
+
kind: "delay",
|
|
50
|
+
value: String(input.delay),
|
|
51
|
+
nextFireAtMs: now + delayMs,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const atMs = typeof input.at === "number"
|
|
55
|
+
? input.at
|
|
56
|
+
: input.at instanceof Date
|
|
57
|
+
? input.at.getTime()
|
|
58
|
+
: Date.parse(String(input.at));
|
|
59
|
+
if (!Number.isFinite(atMs)) {
|
|
60
|
+
throw new ReminderValidationError(`Invalid at time: ${String(input.at)}`);
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
kind: "at",
|
|
64
|
+
value: typeof input.at === "string" ? input.at : new Date(atMs).toISOString(),
|
|
65
|
+
nextFireAtMs: atMs,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** Next UTC fire strictly after `afterMs` for a 5-field cron. */
|
|
69
|
+
export function nextCronFireMs(cronSource, afterMs) {
|
|
70
|
+
try {
|
|
71
|
+
return parseCron(cronSource).nextFire(new Date(afterMs)).getTime();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
throw new ReminderValidationError(error instanceof Error
|
|
75
|
+
? error.message
|
|
76
|
+
: `Could not find next fire for cron "${cronSource}"`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Default busy policy: recurring may skip; one-shots queue behind the turn. */
|
|
80
|
+
export function defaultBusyPolicy(kind) {
|
|
81
|
+
return kind === "every" || kind === "cron" ? "skipIfBusy" : "queueBehindTurn";
|
|
82
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable reminder instance store under `<stateRoot>/reminders/`.
|
|
3
|
+
*
|
|
4
|
+
* Handlers (`run` / function `until`) are not serializable — they live only
|
|
5
|
+
* in the in-memory {@link ReminderRunner} registry. Disk holds schedule,
|
|
6
|
+
* prompt, target, and status so one-shots / recurring ticks survive restart
|
|
7
|
+
* for prompt-form reminders.
|
|
8
|
+
*/
|
|
9
|
+
import type { ReminderBusyPolicy, ReminderScheduleKind, ReminderStatus } from "../types.js";
|
|
10
|
+
export declare const REMINDER_SNAPSHOT_VERSION: 1;
|
|
11
|
+
export type { ReminderBusyPolicy, ReminderScheduleKind, ReminderStatus, } from "../types.js";
|
|
12
|
+
/** Serializable reminder record (no function bodies). */
|
|
13
|
+
export interface ReminderRecord {
|
|
14
|
+
version: typeof REMINDER_SNAPSHOT_VERSION;
|
|
15
|
+
id: string;
|
|
16
|
+
purpose: string;
|
|
17
|
+
/** Channel that owns the target session (e.g. `drive`, `http`). */
|
|
18
|
+
channelId: string;
|
|
19
|
+
/** Channel-local continuation key (not the wire `channel:key` token). */
|
|
20
|
+
continuationToken: string;
|
|
21
|
+
/** Optional opaque target metadata (e.g. `{ prUrl }`). */
|
|
22
|
+
target?: Record<string, unknown>;
|
|
23
|
+
scheduleKind: ReminderScheduleKind;
|
|
24
|
+
/** Raw schedule value: every/delay string, cron expression, or ISO `at`. */
|
|
25
|
+
scheduleValue: string;
|
|
26
|
+
intervalMs?: number;
|
|
27
|
+
/** Prompt form — mutually exclusive with in-memory `run`. */
|
|
28
|
+
prompt?: string;
|
|
29
|
+
/**
|
|
30
|
+
* True when create() registered a `run` handler. Handlers are not
|
|
31
|
+
* serializable; after restart, armed records with this flag and no live
|
|
32
|
+
* handler are disarmed instead of falling back to a generic prompt.
|
|
33
|
+
*/
|
|
34
|
+
hasRunHandler: boolean;
|
|
35
|
+
/** True when create() registered a function `until` (in-memory only). */
|
|
36
|
+
hasUntilFn: boolean;
|
|
37
|
+
/** Natural-language until (agent-facing); function until is in-memory only. */
|
|
38
|
+
untilPrompt?: string;
|
|
39
|
+
busyPolicy: ReminderBusyPolicy;
|
|
40
|
+
status: ReminderStatus;
|
|
41
|
+
disarmReason?: string;
|
|
42
|
+
fireCount: number;
|
|
43
|
+
nextFireAtMs: number;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
updatedAt: string;
|
|
46
|
+
}
|
|
47
|
+
export declare class ReminderStore {
|
|
48
|
+
private readonly rootDir;
|
|
49
|
+
constructor(rootDir: string);
|
|
50
|
+
private filePath;
|
|
51
|
+
ensureRoot(): Promise<void>;
|
|
52
|
+
list(): Promise<ReminderRecord[]>;
|
|
53
|
+
listArmed(): Promise<ReminderRecord[]>;
|
|
54
|
+
get(id: string): Promise<ReminderRecord | undefined>;
|
|
55
|
+
save(record: ReminderRecord): Promise<void>;
|
|
56
|
+
delete(id: string): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=reminder-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reminder-store.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,yBAAyB,EAAG,CAAU,CAAC;AAEpD,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,yBAAyB,CAAC;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,oBAAoB,CAAC;IACnC,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,MAAM,EAAI;IAEhD,OAAO,CAAC,QAAQ;IAIV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAEK,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAiBtC;IAEK,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAG3C;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAsBzD;IAEK,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhD;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtC;CACF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable reminder instance store under `<stateRoot>/reminders/`.
|
|
3
|
+
*
|
|
4
|
+
* Handlers (`run` / function `until`) are not serializable — they live only
|
|
5
|
+
* in the in-memory {@link ReminderRunner} registry. Disk holds schedule,
|
|
6
|
+
* prompt, target, and status so one-shots / recurring ticks survive restart
|
|
7
|
+
* for prompt-form reminders.
|
|
8
|
+
*/
|
|
9
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
10
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
11
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
12
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
13
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
14
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
import { mkdir, readdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
export const REMINDER_SNAPSHOT_VERSION = 1;
|
|
21
|
+
export class ReminderStore {
|
|
22
|
+
constructor(rootDir) {
|
|
23
|
+
this.rootDir = rootDir;
|
|
24
|
+
}
|
|
25
|
+
filePath(id) {
|
|
26
|
+
return join(this.rootDir, `${id}.json`);
|
|
27
|
+
}
|
|
28
|
+
ensureRoot() {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
yield mkdir(this.rootDir, { recursive: true });
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
list() {
|
|
34
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
yield this.ensureRoot();
|
|
36
|
+
let names;
|
|
37
|
+
try {
|
|
38
|
+
names = yield readdir(this.rootDir);
|
|
39
|
+
}
|
|
40
|
+
catch (_a) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const records = [];
|
|
44
|
+
for (const name of names) {
|
|
45
|
+
if (!name.endsWith(".json"))
|
|
46
|
+
continue;
|
|
47
|
+
const record = yield this.get(name.slice(0, -".json".length));
|
|
48
|
+
if (record !== undefined) {
|
|
49
|
+
records.push(record);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return records;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
listArmed() {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const all = yield this.list();
|
|
58
|
+
return all.filter((r) => r.status === "armed");
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
get(id) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
try {
|
|
64
|
+
const raw = yield readFile(this.filePath(id), "utf8");
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
if (parsed.version !== REMINDER_SNAPSHOT_VERSION) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
if (typeof parsed.id !== "string" || parsed.id !== id) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
return parsed;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error !== null &&
|
|
76
|
+
typeof error === "object" &&
|
|
77
|
+
"code" in error &&
|
|
78
|
+
error.code === "ENOENT") {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
save(record) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
yield this.ensureRoot();
|
|
88
|
+
const path = this.filePath(record.id);
|
|
89
|
+
const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
90
|
+
const body = `${JSON.stringify(record, null, 2)}\n`;
|
|
91
|
+
try {
|
|
92
|
+
yield writeFile(tmp, body, "utf8");
|
|
93
|
+
yield rename(tmp, path);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
yield rm(tmp, { force: true }).catch(() => { });
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
delete(id) {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
yield rm(this.filePath(id), { force: true });
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serve-time connection resolution for one mounted agent: once the host is
|
|
3
|
+
* listening (port known), symbolic transports — peers and the Cursor
|
|
4
|
+
* account bridge — resolve to concrete URLs and join the engine's
|
|
5
|
+
* resolved-connection set. Local turns call both over loopback; cloud
|
|
6
|
+
* turns use the serve `publicUrl` for peers and the account's native
|
|
7
|
+
* connectors instead of the bridge.
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentProject } from "../types.js";
|
|
10
|
+
import { type CursorAccountConnectionRef, type CursorAccountMcpBridge } from "./cursor/account-mcp.js";
|
|
11
|
+
import { type PeerConnectionRef } from "./peer-connections.js";
|
|
12
|
+
import type { EngineResolvedConnection } from "./session-engine.js";
|
|
13
|
+
/** Fail fast before listen when static cloud config cannot honor `servers`. */
|
|
14
|
+
export declare function validateMountConnectionsConfig(args: {
|
|
15
|
+
slug: string;
|
|
16
|
+
project: AgentProject;
|
|
17
|
+
accountRefs?: CursorAccountConnectionRef[];
|
|
18
|
+
publicUrl?: string;
|
|
19
|
+
}): void;
|
|
20
|
+
/** Fail closed when a cloud turn cannot honor a `servers` filter. */
|
|
21
|
+
export declare function assertCloudCanHonorAccountServersFilters(args: {
|
|
22
|
+
runtime: "local" | "cloud";
|
|
23
|
+
resolvedConnections: readonly EngineResolvedConnection[];
|
|
24
|
+
}): void;
|
|
25
|
+
/** Fail closed when anonymous HTTP admission would expose account connectors. */
|
|
26
|
+
export declare function assertAccountConnectionsNotAnonymous(args: {
|
|
27
|
+
allowAnonymous?: boolean;
|
|
28
|
+
hasAccountConnections: boolean;
|
|
29
|
+
}): void;
|
|
30
|
+
export declare function resolveMountConnections(args: {
|
|
31
|
+
slug: string;
|
|
32
|
+
project: AgentProject;
|
|
33
|
+
serverUrl: string;
|
|
34
|
+
peerRefs?: PeerConnectionRef[];
|
|
35
|
+
accountRefs?: CursorAccountConnectionRef[];
|
|
36
|
+
accountBridge?: CursorAccountMcpBridge;
|
|
37
|
+
publicUrl?: string;
|
|
38
|
+
authToken?: string;
|
|
39
|
+
logger: (line: string) => void;
|
|
40
|
+
}): EngineResolvedConnection[];
|
|
41
|
+
//# sourceMappingURL=resolved-connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-connections.d.ts","sourceRoot":"","sources":["../../src/internal/resolved-connections.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAuBP;AAED,qEAAqE;AACrE,wBAAgB,wCAAwC,CAAC,IAAI,EAAE;IAC7D,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,mBAAmB,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC1D,GAAG,IAAI,CAmBP;AAED,iFAAiF;AACjF,wBAAgB,oCAAoC,CAAC,IAAI,EAAE;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;CAChC,GAAG,IAAI,CAMP;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,GAAG,wBAAwB,EAAE,CA6C7B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serve-time connection resolution for one mounted agent: once the host is
|
|
3
|
+
* listening (port known), symbolic transports — peers and the Cursor
|
|
4
|
+
* account bridge — resolve to concrete URLs and join the engine's
|
|
5
|
+
* resolved-connection set. Local turns call both over loopback; cloud
|
|
6
|
+
* turns use the serve `publicUrl` for peers and the account's native
|
|
7
|
+
* connectors instead of the bridge.
|
|
8
|
+
*/
|
|
9
|
+
import { resolveCursorAccountConnections, } from "./cursor/account-mcp.js";
|
|
10
|
+
import { resolvePeerConnections, } from "./peer-connections.js";
|
|
11
|
+
/** Fail fast before listen when static cloud config cannot honor `servers`. */
|
|
12
|
+
export function validateMountConnectionsConfig(args) {
|
|
13
|
+
if (args.accountRefs === undefined || args.accountRefs.length === 0) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const agent = args.project.agent;
|
|
17
|
+
const cloudCapable = agent.runtime === "cloud" || agent.cloud !== undefined;
|
|
18
|
+
if (!cloudCapable || args.publicUrl !== undefined) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const label = args.slug === "" ? args.project.name : args.slug;
|
|
22
|
+
const filteredRefs = args.accountRefs.filter((ref) => ref.servers !== undefined);
|
|
23
|
+
if (filteredRefs.length === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`[agent-serve] agent "${label}" has Cursor account MCP connections with \`servers\` filters (${filteredRefs
|
|
27
|
+
.map((ref) => ref.name)
|
|
28
|
+
.join(", ")}) but no --public-url; cloud-runtime turns cannot honor those filters without a public bridge URL. Set --public-url or remove the \`servers\` filter.`);
|
|
29
|
+
}
|
|
30
|
+
/** Fail closed when a cloud turn cannot honor a `servers` filter. */
|
|
31
|
+
export function assertCloudCanHonorAccountServersFilters(args) {
|
|
32
|
+
if (args.runtime !== "cloud") {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const blocked = args.resolvedConnections.filter((connection) => connection.accountServersFilter !== undefined &&
|
|
36
|
+
connection.cloudUrl === undefined);
|
|
37
|
+
if (blocked.length === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`[agent-serve] cloud turn cannot honor Cursor account \`servers\` filters (${blocked
|
|
41
|
+
.map((connection) => connection.name)
|
|
42
|
+
.join(", ")}) without --public-url; set --public-url so cloud turns reach the filtered account bridge instead of falling back to native connectors.`);
|
|
43
|
+
}
|
|
44
|
+
/** Fail closed when anonymous HTTP admission would expose account connectors. */
|
|
45
|
+
export function assertAccountConnectionsNotAnonymous(args) {
|
|
46
|
+
if (args.allowAnonymous === true && args.hasAccountConnections) {
|
|
47
|
+
throw new Error("[agent-serve] --allow-anonymous cannot be used with Cursor account MCP connections (defineConnection({ cursorAccount: true })); use --bearer-token or remove the account MCP connections.");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function resolveMountConnections(args) {
|
|
51
|
+
const agent = args.project.agent;
|
|
52
|
+
const cloudCapable = agent.runtime === "cloud" || agent.cloud !== undefined;
|
|
53
|
+
const label = args.slug === "" ? args.project.name : args.slug;
|
|
54
|
+
const resolved = [];
|
|
55
|
+
if (args.peerRefs !== undefined && args.peerRefs.length > 0) {
|
|
56
|
+
const peers = resolvePeerConnections(Object.assign(Object.assign({ refs: args.peerRefs, serverUrl: args.serverUrl }, (args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl })), (args.authToken === undefined ? {} : { authToken: args.authToken })));
|
|
57
|
+
resolved.push(...peers);
|
|
58
|
+
if (cloudCapable && args.publicUrl === undefined) {
|
|
59
|
+
args.logger(`[agent-serve] warning: agent "${label}" has peer MCP connections (${peers
|
|
60
|
+
.map((peer) => peer.name)
|
|
61
|
+
.join(", ")}) but no --public-url; cloud-runtime turns cannot reach this host's loopback address, so peers are omitted from cloud turns.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (args.accountRefs !== undefined && args.accountBridge !== undefined) {
|
|
65
|
+
resolved.push(...resolveCursorAccountConnections(Object.assign({ refs: args.accountRefs, serverUrl: args.serverUrl, basePath: args.slug === "" ? "" : `/${args.slug}`, bridgeSecret: args.accountBridge.secret }, (args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl }))));
|
|
66
|
+
// Non-blocking startup DX: connector statuses land in the serve log.
|
|
67
|
+
args.accountBridge.logPreflight(args.accountRefs);
|
|
68
|
+
if (cloudCapable && args.publicUrl === undefined) {
|
|
69
|
+
args.logger(`[agent-serve] agent "${label}": cloud-runtime turns omit the account bridge without --public-url (cloud agents fall back to the account's native connectors).`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return resolved;
|
|
73
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type ReviewCommentPublisher = "local_gh";
|
|
2
|
+
export type ReviewCommentPostResult = {
|
|
3
|
+
posted: boolean;
|
|
4
|
+
publisher: ReviewCommentPublisher;
|
|
5
|
+
mode: "review_with_inline_comments" | "review_body_only" | "skipped";
|
|
6
|
+
inlineCommentCount: number;
|
|
7
|
+
detail: string;
|
|
8
|
+
};
|
|
9
|
+
export type ReviewInlineComment = {
|
|
10
|
+
file: string;
|
|
11
|
+
line: number;
|
|
12
|
+
start_line?: number;
|
|
13
|
+
body: string;
|
|
14
|
+
};
|
|
15
|
+
export type ReviewCommentPostArgs = {
|
|
16
|
+
prUrl: string;
|
|
17
|
+
reviewedHeadSha: string;
|
|
18
|
+
message: string;
|
|
19
|
+
comments: ReviewInlineComment[];
|
|
20
|
+
cleanupPrevious?: boolean;
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
};
|
|
23
|
+
export type ReviewCommentsRequest = {
|
|
24
|
+
provider: "github";
|
|
25
|
+
repo: string;
|
|
26
|
+
prNumber: number;
|
|
27
|
+
headSha: string;
|
|
28
|
+
message: string;
|
|
29
|
+
comments: ReviewInlineComment[];
|
|
30
|
+
cleanupPrevious: boolean;
|
|
31
|
+
};
|
|
32
|
+
export type ReviewCommentPublisherImplementation = {
|
|
33
|
+
postReview: (args: ReviewCommentPostArgs) => Promise<ReviewCommentPostResult>;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Prepares the provider-neutral review payload used by local `gh` posting.
|
|
37
|
+
*/
|
|
38
|
+
export declare function prepareReviewCommentsRequest(args: ReviewCommentPostArgs): {
|
|
39
|
+
kind: "prepared";
|
|
40
|
+
request: ReviewCommentsRequest;
|
|
41
|
+
} | {
|
|
42
|
+
kind: "skipped";
|
|
43
|
+
result: ReviewCommentPostResult;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Posts a PR review with the local `gh` credentials (`gh auth` / GITHUB_TOKEN /
|
|
47
|
+
* GH_TOKEN). Does not use the security-bugbot comments service.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createLocalGhReviewPublisher(): ReviewCommentPublisherImplementation;
|
|
50
|
+
//# sourceMappingURL=review-comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-comments.d.ts","sourceRoot":"","sources":["../../src/internal/review-comments.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAEhD,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,sBAAsB,CAAC;IAClC,IAAI,EAAE,6BAA6B,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,UAAU,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAC/E,CAAC;AAOF;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,qBAAqB,GAEzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAkBvD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,oCAAoC,CAMnF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { spawn } from "node:child_process";
|
|
11
|
+
/**
|
|
12
|
+
* Prepares the provider-neutral review payload used by local `gh` posting.
|
|
13
|
+
*/
|
|
14
|
+
export function prepareReviewCommentsRequest(args) {
|
|
15
|
+
var _a;
|
|
16
|
+
const target = parseGithubPrUrl(args.prUrl);
|
|
17
|
+
if (target.kind === "invalid") {
|
|
18
|
+
return { kind: "skipped", result: skipped(target.detail) };
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
kind: "prepared",
|
|
22
|
+
request: {
|
|
23
|
+
provider: "github",
|
|
24
|
+
repo: target.value.repo,
|
|
25
|
+
prNumber: target.value.prNumber,
|
|
26
|
+
headSha: args.reviewedHeadSha,
|
|
27
|
+
message: args.message,
|
|
28
|
+
comments: args.comments,
|
|
29
|
+
cleanupPrevious: (_a = args.cleanupPrevious) !== null && _a !== void 0 ? _a : true,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Posts a PR review with the local `gh` credentials (`gh auth` / GITHUB_TOKEN /
|
|
35
|
+
* GH_TOKEN). Does not use the security-bugbot comments service.
|
|
36
|
+
*/
|
|
37
|
+
export function createLocalGhReviewPublisher() {
|
|
38
|
+
return {
|
|
39
|
+
postReview(args) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
return postReviewViaLocalGh(args);
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function postReviewViaLocalGh(args) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
var _a, _b;
|
|
49
|
+
const prepared = prepareReviewCommentsRequest(args);
|
|
50
|
+
if (prepared.kind === "skipped") {
|
|
51
|
+
return prepared.result;
|
|
52
|
+
}
|
|
53
|
+
const { request } = prepared;
|
|
54
|
+
const path = `repos/${request.repo}/pulls/${request.prNumber}/reviews`;
|
|
55
|
+
const payload = {
|
|
56
|
+
commit_id: request.headSha,
|
|
57
|
+
body: request.message,
|
|
58
|
+
event: "COMMENT",
|
|
59
|
+
comments: request.comments.map(toGithubReviewComment),
|
|
60
|
+
};
|
|
61
|
+
try {
|
|
62
|
+
(_a = args.signal) === null || _a === void 0 ? void 0 : _a.throwIfAborted();
|
|
63
|
+
const response = yield ghApiPostJson(path, payload, args.signal);
|
|
64
|
+
const htmlUrl = typeof response.html_url === "string" ? response.html_url : undefined;
|
|
65
|
+
const inlineCommentCount = request.comments.length;
|
|
66
|
+
return {
|
|
67
|
+
posted: true,
|
|
68
|
+
publisher: "local_gh",
|
|
69
|
+
mode: inlineCommentCount > 0
|
|
70
|
+
? "review_with_inline_comments"
|
|
71
|
+
: "review_body_only",
|
|
72
|
+
inlineCommentCount,
|
|
73
|
+
detail: htmlUrl
|
|
74
|
+
? `posted via local gh: ${htmlUrl}`
|
|
75
|
+
: `posted via local gh with ${inlineCommentCount} inline comment(s)`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if ((_b = args.signal) === null || _b === void 0 ? void 0 : _b.aborted) {
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
return skipped(`local gh review post failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function toGithubReviewComment(comment) {
|
|
87
|
+
const body = {
|
|
88
|
+
path: comment.file,
|
|
89
|
+
body: comment.body,
|
|
90
|
+
line: comment.line,
|
|
91
|
+
side: "RIGHT",
|
|
92
|
+
};
|
|
93
|
+
if (comment.start_line !== undefined &&
|
|
94
|
+
comment.start_line > 0 &&
|
|
95
|
+
comment.start_line !== comment.line) {
|
|
96
|
+
body.start_line = comment.start_line;
|
|
97
|
+
body.start_side = "RIGHT";
|
|
98
|
+
}
|
|
99
|
+
return body;
|
|
100
|
+
}
|
|
101
|
+
function skipped(detail) {
|
|
102
|
+
return {
|
|
103
|
+
posted: false,
|
|
104
|
+
publisher: "local_gh",
|
|
105
|
+
mode: "skipped",
|
|
106
|
+
inlineCommentCount: 0,
|
|
107
|
+
detail,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function parseGithubPrUrl(prUrl) {
|
|
111
|
+
let url;
|
|
112
|
+
try {
|
|
113
|
+
url = new URL(prUrl);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return {
|
|
117
|
+
kind: "invalid",
|
|
118
|
+
detail: `unparseable PR URL: ${error instanceof Error ? error.message : String(error)}`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (url.hostname !== "github.com") {
|
|
122
|
+
return {
|
|
123
|
+
kind: "invalid",
|
|
124
|
+
detail: "local gh publisher only supports github.com PRs",
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const parts = url.pathname.split("/").filter(Boolean);
|
|
128
|
+
if (parts.length !== 4 || parts[2] !== "pull") {
|
|
129
|
+
return {
|
|
130
|
+
kind: "invalid",
|
|
131
|
+
detail: "unparseable PR URL: expected https://github.com/{owner}/{repo}/pull/{number}",
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const prNumber = Number(parts[3]);
|
|
135
|
+
if (!Number.isInteger(prNumber) || prNumber <= 0) {
|
|
136
|
+
return {
|
|
137
|
+
kind: "invalid",
|
|
138
|
+
detail: "unparseable PR URL: pull request number must be a positive integer",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
kind: "valid",
|
|
143
|
+
value: {
|
|
144
|
+
repo: `${parts[0]}/${parts[1]}`,
|
|
145
|
+
prNumber,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function ghApiPostJson(path, payload, signal) {
|
|
150
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
152
|
+
const child = spawn("gh", ["api", path, "--method", "POST", "--input", "-"], {
|
|
153
|
+
env: Object.assign(Object.assign({}, process.env), { GH_PROMPT_DISABLED: "1" }),
|
|
154
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
155
|
+
});
|
|
156
|
+
let stdout = "";
|
|
157
|
+
let stderr = "";
|
|
158
|
+
const onAbort = () => {
|
|
159
|
+
var _a;
|
|
160
|
+
child.kill("SIGTERM");
|
|
161
|
+
rejectPromise((_a = signal === null || signal === void 0 ? void 0 : signal.reason) !== null && _a !== void 0 ? _a : new Error("aborted"));
|
|
162
|
+
};
|
|
163
|
+
signal === null || signal === void 0 ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
|
|
164
|
+
child.stdout.on("data", (chunk) => {
|
|
165
|
+
stdout += String(chunk);
|
|
166
|
+
});
|
|
167
|
+
child.stderr.on("data", (chunk) => {
|
|
168
|
+
stderr += String(chunk);
|
|
169
|
+
});
|
|
170
|
+
child.on("error", (error) => {
|
|
171
|
+
signal === null || signal === void 0 ? void 0 : signal.removeEventListener("abort", onAbort);
|
|
172
|
+
rejectPromise(error);
|
|
173
|
+
});
|
|
174
|
+
child.on("close", (code) => {
|
|
175
|
+
signal === null || signal === void 0 ? void 0 : signal.removeEventListener("abort", onAbort);
|
|
176
|
+
if (code !== 0) {
|
|
177
|
+
rejectPromise(new Error(`gh api ${path} exited with ${code}: ${stderr.trim().slice(0, 2000)}`));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (!stdout.trim()) {
|
|
181
|
+
resolvePromise({});
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
resolvePromise(JSON.parse(stdout));
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
rejectPromise(new Error(`gh api ${path} returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`));
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
child.stdin.end(JSON.stringify(payload));
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny path router: literal segments, `:param` captures, and a trailing
|
|
3
|
+
* `*param` catch-all, compiled once at server startup.
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthContext, AuthPolicy, RouteMethod } from "../types.js";
|
|
6
|
+
export interface ServerRouteContext {
|
|
7
|
+
params: Record<string, string>;
|
|
8
|
+
requestIp: string | null;
|
|
9
|
+
/** Resolved by the route's auth chain ("none" routes see null). */
|
|
10
|
+
auth: AuthContext | null;
|
|
11
|
+
}
|
|
12
|
+
export type ServerRouteHandler = (request: Request, ctx: ServerRouteContext) => Response | Promise<Response>;
|
|
13
|
+
export interface ServerRoute {
|
|
14
|
+
method: RouteMethod;
|
|
15
|
+
/** Path pattern, e.g. `/v1/session/:sessionId/stream`. */
|
|
16
|
+
pattern: string;
|
|
17
|
+
/** Auth chain for the route; "none" mounts the route unauthenticated. */
|
|
18
|
+
auth: AuthPolicy[] | "none";
|
|
19
|
+
handler: ServerRouteHandler;
|
|
20
|
+
}
|
|
21
|
+
export interface RouteMatch {
|
|
22
|
+
route: ServerRoute;
|
|
23
|
+
params: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
export declare class Router {
|
|
26
|
+
private readonly routes;
|
|
27
|
+
add(route: ServerRoute): void;
|
|
28
|
+
match(method: string, pathname: string): RouteMatch | undefined;
|
|
29
|
+
private matchExact;
|
|
30
|
+
/** True when the path matches some route with a different method. */
|
|
31
|
+
hasPath(pathname: string): boolean;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/internal/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,kBAAkB,KACpB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC5B,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAaD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAE5B;IAED,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAW9D;IAED,OAAO,CAAC,UAAU;IAclB,qEAAqE;IACrE,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKjC;CACF"}
|