@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,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub REST helpers backed by `@octokit/rest`.
|
|
3
|
+
*
|
|
4
|
+
* Channel hooks should prefer `ctx.github` / `ctx.thread`. Use
|
|
5
|
+
* {@link createGitHubOctokit} (or `ctx.github.getOctokit()`) when you need
|
|
6
|
+
* typed Octokit methods directly.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { createAppAuth } from "@octokit/auth-app";
|
|
10
|
+
import { Octokit } from "@octokit/rest";
|
|
11
|
+
import {
|
|
12
|
+
type GitHubAuthApiOptions,
|
|
13
|
+
hasGitHubAppCredentials,
|
|
14
|
+
resolveCredentialValue,
|
|
15
|
+
resolveGitHubAccessToken,
|
|
16
|
+
resolveGitHubAppId,
|
|
17
|
+
resolveGitHubInstallationId,
|
|
18
|
+
resolveGitHubPrivateKey,
|
|
19
|
+
} from "./auth.js";
|
|
20
|
+
import type { GitHubChannelCredentials } from "./types.js";
|
|
21
|
+
|
|
22
|
+
export type GitHubJsonObject = Record<string, unknown>;
|
|
23
|
+
export type GitHubApiMethod = "DELETE" | "GET" | "PATCH" | "POST" | "PUT";
|
|
24
|
+
|
|
25
|
+
export interface GitHubApiOptions extends GitHubAuthApiOptions {}
|
|
26
|
+
|
|
27
|
+
export interface GitHubApiResponse<T = unknown> {
|
|
28
|
+
body: T;
|
|
29
|
+
ok: boolean;
|
|
30
|
+
status: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class GitHubApiError extends Error {
|
|
34
|
+
readonly body: unknown;
|
|
35
|
+
readonly method: string;
|
|
36
|
+
readonly path: string;
|
|
37
|
+
readonly status: number;
|
|
38
|
+
|
|
39
|
+
constructor(input: {
|
|
40
|
+
body: unknown;
|
|
41
|
+
method: string;
|
|
42
|
+
path: string;
|
|
43
|
+
status: number;
|
|
44
|
+
}) {
|
|
45
|
+
super(
|
|
46
|
+
`GitHub ${input.method} ${input.path} failed with HTTP ${input.status}.`
|
|
47
|
+
);
|
|
48
|
+
this.name = "GitHubApiError";
|
|
49
|
+
this.body = input.body;
|
|
50
|
+
this.method = input.method;
|
|
51
|
+
this.path = input.path;
|
|
52
|
+
this.status = input.status;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface GitHubPostedComment {
|
|
57
|
+
htmlUrl: string | undefined;
|
|
58
|
+
id: number;
|
|
59
|
+
raw: unknown;
|
|
60
|
+
url: string | undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type GitHubReactionContent =
|
|
64
|
+
| "+1"
|
|
65
|
+
| "-1"
|
|
66
|
+
| "confused"
|
|
67
|
+
| "eyes"
|
|
68
|
+
| "heart"
|
|
69
|
+
| "hooray"
|
|
70
|
+
| "laugh"
|
|
71
|
+
| "rocket";
|
|
72
|
+
|
|
73
|
+
interface GitHubResourceInput {
|
|
74
|
+
api?: GitHubApiOptions;
|
|
75
|
+
credentials?: GitHubChannelCredentials;
|
|
76
|
+
installationId?: number;
|
|
77
|
+
owner: string;
|
|
78
|
+
repo: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Build an authenticated Octokit client.
|
|
83
|
+
*
|
|
84
|
+
* Prefer explicit bearer tokens, then GitHub App installation auth (when App
|
|
85
|
+
* credentials + an installation id are available), then local PAT /
|
|
86
|
+
* `gh auth token`. App auth uses `@octokit/auth-app` so Octokit refreshes
|
|
87
|
+
* installation tokens itself.
|
|
88
|
+
*/
|
|
89
|
+
export async function createGitHubOctokit(input: {
|
|
90
|
+
api?: GitHubApiOptions;
|
|
91
|
+
credentials?: GitHubChannelCredentials;
|
|
92
|
+
installationId?: number;
|
|
93
|
+
}): Promise<Octokit> {
|
|
94
|
+
const requestOptions =
|
|
95
|
+
input.api?.fetch === undefined ? undefined : { fetch: input.api.fetch };
|
|
96
|
+
const baseUrl = input.api?.apiBaseUrl;
|
|
97
|
+
|
|
98
|
+
const explicit =
|
|
99
|
+
(await resolveCredentialValue(input.credentials?.token)) ??
|
|
100
|
+
(await resolveCredentialValue(input.credentials?.installationToken));
|
|
101
|
+
if (explicit !== undefined) {
|
|
102
|
+
return new Octokit({
|
|
103
|
+
auth: explicit,
|
|
104
|
+
...(baseUrl === undefined ? {} : { baseUrl }),
|
|
105
|
+
...(requestOptions === undefined ? {} : { request: requestOptions }),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const installationId = await resolveGitHubInstallationId(
|
|
110
|
+
input.installationId
|
|
111
|
+
);
|
|
112
|
+
if (
|
|
113
|
+
installationId !== undefined &&
|
|
114
|
+
(await hasGitHubAppCredentials(input.credentials))
|
|
115
|
+
) {
|
|
116
|
+
const appId = await resolveGitHubAppId(input.credentials?.appId);
|
|
117
|
+
const privateKey = await resolveGitHubPrivateKey(
|
|
118
|
+
input.credentials?.privateKey
|
|
119
|
+
);
|
|
120
|
+
return new Octokit({
|
|
121
|
+
authStrategy: createAppAuth,
|
|
122
|
+
auth: {
|
|
123
|
+
appId,
|
|
124
|
+
privateKey,
|
|
125
|
+
installationId,
|
|
126
|
+
},
|
|
127
|
+
...(baseUrl === undefined ? {} : { baseUrl }),
|
|
128
|
+
...(requestOptions === undefined ? {} : { request: requestOptions }),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Local testing: ambient PAT / `gh auth token` when App creds are unset.
|
|
133
|
+
const token = await resolveGitHubAccessToken(input);
|
|
134
|
+
return new Octokit({
|
|
135
|
+
auth: token,
|
|
136
|
+
...(baseUrl === undefined ? {} : { baseUrl }),
|
|
137
|
+
...(requestOptions === undefined ? {} : { request: requestOptions }),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Call a GitHub REST path with channel auth. Prefer typed Octokit methods via
|
|
143
|
+
* {@link createGitHubOctokit} / `ctx.github.getOctokit()` when possible.
|
|
144
|
+
*/
|
|
145
|
+
export async function callGitHubApi<T = unknown>(input: {
|
|
146
|
+
api?: GitHubApiOptions;
|
|
147
|
+
body?: GitHubJsonObject;
|
|
148
|
+
credentials?: GitHubChannelCredentials;
|
|
149
|
+
installationId?: number;
|
|
150
|
+
method: GitHubApiMethod;
|
|
151
|
+
path: string;
|
|
152
|
+
options?: { auth?: boolean; headers?: Readonly<Record<string, string>> };
|
|
153
|
+
}): Promise<GitHubApiResponse<T>> {
|
|
154
|
+
if (input.options?.auth === false) {
|
|
155
|
+
const octokit = new Octokit({
|
|
156
|
+
...(input.api?.apiBaseUrl === undefined
|
|
157
|
+
? {}
|
|
158
|
+
: { baseUrl: input.api.apiBaseUrl }),
|
|
159
|
+
...(input.api?.fetch === undefined
|
|
160
|
+
? {}
|
|
161
|
+
: { request: { fetch: input.api.fetch } }),
|
|
162
|
+
});
|
|
163
|
+
return requestWithOctokit(octokit, input);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const octokit = await createGitHubOctokit({
|
|
167
|
+
api: input.api,
|
|
168
|
+
credentials: input.credentials,
|
|
169
|
+
installationId: input.installationId,
|
|
170
|
+
});
|
|
171
|
+
return requestWithOctokit(octokit, input);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async function requestWithOctokit<T>(
|
|
175
|
+
octokit: Octokit,
|
|
176
|
+
input: {
|
|
177
|
+
body?: GitHubJsonObject;
|
|
178
|
+
method: GitHubApiMethod;
|
|
179
|
+
path: string;
|
|
180
|
+
options?: { headers?: Readonly<Record<string, string>> };
|
|
181
|
+
}
|
|
182
|
+
): Promise<GitHubApiResponse<T>> {
|
|
183
|
+
try {
|
|
184
|
+
const route = `${input.method} ${normalizeRequestPath(input.path)}`;
|
|
185
|
+
const response = await octokit.request(route, {
|
|
186
|
+
...(input.body ?? {}),
|
|
187
|
+
...(input.options?.headers === undefined
|
|
188
|
+
? {}
|
|
189
|
+
: { headers: input.options.headers }),
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
body: response.data as T,
|
|
193
|
+
ok: true,
|
|
194
|
+
status: response.status,
|
|
195
|
+
};
|
|
196
|
+
} catch (error) {
|
|
197
|
+
if (isOctokitRequestError(error)) {
|
|
198
|
+
throw new GitHubApiError({
|
|
199
|
+
body: error.response?.data,
|
|
200
|
+
method: input.method,
|
|
201
|
+
path: input.path,
|
|
202
|
+
status: error.status,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Create an issue or PR timeline comment. */
|
|
210
|
+
export async function createGitHubIssueComment(
|
|
211
|
+
input: GitHubResourceInput & { body: string; issueNumber: number }
|
|
212
|
+
): Promise<GitHubPostedComment> {
|
|
213
|
+
const octokit = await createGitHubOctokit(input);
|
|
214
|
+
try {
|
|
215
|
+
const response = await octokit.rest.issues.createComment({
|
|
216
|
+
owner: input.owner,
|
|
217
|
+
repo: input.repo,
|
|
218
|
+
issue_number: input.issueNumber,
|
|
219
|
+
body: input.body,
|
|
220
|
+
});
|
|
221
|
+
return toPostedComment(response.data);
|
|
222
|
+
} catch (error) {
|
|
223
|
+
throw wrapOctokitError(
|
|
224
|
+
error,
|
|
225
|
+
"POST",
|
|
226
|
+
`/repos/${input.owner}/${input.repo}/issues/${input.issueNumber}/comments`
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** Reply to an inline pull-request review comment thread. */
|
|
232
|
+
export async function createGitHubReviewCommentReply(
|
|
233
|
+
input: GitHubResourceInput & {
|
|
234
|
+
body: string;
|
|
235
|
+
commentId: number;
|
|
236
|
+
pullRequestNumber: number;
|
|
237
|
+
}
|
|
238
|
+
): Promise<GitHubPostedComment> {
|
|
239
|
+
const octokit = await createGitHubOctokit(input);
|
|
240
|
+
try {
|
|
241
|
+
const response = await octokit.rest.pulls.createReplyForReviewComment({
|
|
242
|
+
owner: input.owner,
|
|
243
|
+
repo: input.repo,
|
|
244
|
+
pull_number: input.pullRequestNumber,
|
|
245
|
+
comment_id: input.commentId,
|
|
246
|
+
body: input.body,
|
|
247
|
+
});
|
|
248
|
+
return toPostedComment(response.data);
|
|
249
|
+
} catch (error) {
|
|
250
|
+
throw wrapOctokitError(
|
|
251
|
+
error,
|
|
252
|
+
"POST",
|
|
253
|
+
`/repos/${input.owner}/${input.repo}/pulls/${input.pullRequestNumber}/comments/${input.commentId}/replies`
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** Create a reaction on an issue or review comment. */
|
|
259
|
+
export async function createGitHubReaction(
|
|
260
|
+
input: GitHubResourceInput & {
|
|
261
|
+
commentId: number;
|
|
262
|
+
content: GitHubReactionContent;
|
|
263
|
+
subject: "issue_comment" | "pull_request_review_comment";
|
|
264
|
+
}
|
|
265
|
+
): Promise<GitHubApiResponse> {
|
|
266
|
+
const octokit = await createGitHubOctokit(input);
|
|
267
|
+
try {
|
|
268
|
+
const response =
|
|
269
|
+
input.subject === "issue_comment"
|
|
270
|
+
? await octokit.rest.reactions.createForIssueComment({
|
|
271
|
+
owner: input.owner,
|
|
272
|
+
repo: input.repo,
|
|
273
|
+
comment_id: input.commentId,
|
|
274
|
+
content: input.content,
|
|
275
|
+
})
|
|
276
|
+
: await octokit.rest.reactions.createForPullRequestReviewComment({
|
|
277
|
+
owner: input.owner,
|
|
278
|
+
repo: input.repo,
|
|
279
|
+
comment_id: input.commentId,
|
|
280
|
+
content: input.content,
|
|
281
|
+
});
|
|
282
|
+
return {
|
|
283
|
+
body: response.data,
|
|
284
|
+
ok: true,
|
|
285
|
+
status: response.status,
|
|
286
|
+
};
|
|
287
|
+
} catch (error) {
|
|
288
|
+
const segment =
|
|
289
|
+
input.subject === "issue_comment" ? "issues/comments" : "pulls/comments";
|
|
290
|
+
throw wrapOctokitError(
|
|
291
|
+
error,
|
|
292
|
+
"POST",
|
|
293
|
+
`/repos/${input.owner}/${input.repo}/${segment}/${input.commentId}/reactions`
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/** Create a commit status (legacy `statuses` API). */
|
|
299
|
+
export async function createGitHubCommitStatus(
|
|
300
|
+
input: GitHubResourceInput & {
|
|
301
|
+
sha: string;
|
|
302
|
+
state: "error" | "failure" | "pending" | "success";
|
|
303
|
+
context?: string;
|
|
304
|
+
description?: string;
|
|
305
|
+
targetUrl?: string;
|
|
306
|
+
}
|
|
307
|
+
): Promise<GitHubApiResponse> {
|
|
308
|
+
const octokit = await createGitHubOctokit(input);
|
|
309
|
+
try {
|
|
310
|
+
const response = await octokit.rest.repos.createCommitStatus({
|
|
311
|
+
owner: input.owner,
|
|
312
|
+
repo: input.repo,
|
|
313
|
+
sha: input.sha,
|
|
314
|
+
state: input.state,
|
|
315
|
+
...(input.context === undefined ? {} : { context: input.context }),
|
|
316
|
+
...(input.description === undefined
|
|
317
|
+
? {}
|
|
318
|
+
: { description: input.description }),
|
|
319
|
+
...(input.targetUrl === undefined ? {} : { target_url: input.targetUrl }),
|
|
320
|
+
});
|
|
321
|
+
return {
|
|
322
|
+
body: response.data,
|
|
323
|
+
ok: true,
|
|
324
|
+
status: response.status,
|
|
325
|
+
};
|
|
326
|
+
} catch (error) {
|
|
327
|
+
throw wrapOctokitError(
|
|
328
|
+
error,
|
|
329
|
+
"POST",
|
|
330
|
+
`/repos/${input.owner}/${input.repo}/statuses/${input.sha}`
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function toPostedComment(raw: {
|
|
336
|
+
html_url?: string;
|
|
337
|
+
id?: number;
|
|
338
|
+
url?: string;
|
|
339
|
+
}): GitHubPostedComment {
|
|
340
|
+
return {
|
|
341
|
+
htmlUrl: typeof raw.html_url === "string" ? raw.html_url : undefined,
|
|
342
|
+
id: typeof raw.id === "number" ? raw.id : 0,
|
|
343
|
+
raw,
|
|
344
|
+
url: typeof raw.url === "string" ? raw.url : undefined,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function normalizeRequestPath(path: string): string {
|
|
349
|
+
return path.startsWith("/") ? path : `/${path}`;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function isOctokitRequestError(error: unknown): error is {
|
|
353
|
+
status: number;
|
|
354
|
+
response?: { data?: unknown };
|
|
355
|
+
} {
|
|
356
|
+
return (
|
|
357
|
+
typeof error === "object" &&
|
|
358
|
+
error !== null &&
|
|
359
|
+
"status" in error &&
|
|
360
|
+
typeof (error as { status: unknown }).status === "number"
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function wrapOctokitError(error: unknown, method: string, path: string): Error {
|
|
365
|
+
if (isOctokitRequestError(error)) {
|
|
366
|
+
return new GitHubApiError({
|
|
367
|
+
body: error.response?.data,
|
|
368
|
+
method,
|
|
369
|
+
path,
|
|
370
|
+
status: error.status,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
374
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub API token resolution for the channel pack.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order for authenticated REST calls:
|
|
5
|
+
* 1. `credentials.token` / `credentials.installationToken` (explicit)
|
|
6
|
+
* 2. GitHub App JWT → installation access token (when App creds + installation
|
|
7
|
+
* id are available — webhook `installation.id` or `GITHUB_APP_INSTALLATION_ID`)
|
|
8
|
+
* 3. `GITHUB_TOKEN` / `GH_TOKEN` env (local PAT / fine-grained token)
|
|
9
|
+
* 4. `gh auth token` (local CLI session)
|
|
10
|
+
*
|
|
11
|
+
* Production should set App credentials and omit ambient PATs. Local testing
|
|
12
|
+
* can keep using a PAT or `gh auth login` when App creds are unset.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { execFile } from "node:child_process";
|
|
16
|
+
import { promisify } from "node:util";
|
|
17
|
+
import { createAppAuth } from "@octokit/auth-app";
|
|
18
|
+
import type {
|
|
19
|
+
GitHubChannelCredentials,
|
|
20
|
+
GitHubCredentialValue,
|
|
21
|
+
} from "./types.js";
|
|
22
|
+
|
|
23
|
+
const execFileAsync = promisify(execFile);
|
|
24
|
+
|
|
25
|
+
export interface GitHubAuthApiOptions {
|
|
26
|
+
apiBaseUrl?: string;
|
|
27
|
+
fetch?: typeof fetch;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let ghAuthTokenCache: { token: string; expiresAtMs: number } | null = null;
|
|
31
|
+
const GH_AUTH_CACHE_MS = 5 * 60_000;
|
|
32
|
+
|
|
33
|
+
/** Refresh exported `GH_TOKEN` before installation tokens expire (~60m). */
|
|
34
|
+
const GH_CLI_TOKEN_REFRESH_MS = 50 * 60_000;
|
|
35
|
+
let ghCliTokenRefreshTimer: ReturnType<typeof setInterval> | null = null;
|
|
36
|
+
|
|
37
|
+
/** Resolve a credential value (literal or lazy). */
|
|
38
|
+
export async function resolveCredentialValue(
|
|
39
|
+
value: GitHubCredentialValue | undefined
|
|
40
|
+
): Promise<string | undefined> {
|
|
41
|
+
if (value === undefined) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const resolved = typeof value === "function" ? await value() : value;
|
|
45
|
+
if (typeof resolved !== "string") {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const trimmed = resolved.trim();
|
|
49
|
+
return trimmed === "" ? undefined : trimmed;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** True when App id + private key are configured (credentials or env). */
|
|
53
|
+
export async function hasGitHubAppCredentials(
|
|
54
|
+
credentials?: GitHubChannelCredentials
|
|
55
|
+
): Promise<boolean> {
|
|
56
|
+
try {
|
|
57
|
+
await resolveGitHubAppId(credentials?.appId);
|
|
58
|
+
await resolveGitHubPrivateKey(credentials?.privateKey);
|
|
59
|
+
return true;
|
|
60
|
+
} catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Resolve an installation id from the call site, then
|
|
67
|
+
* `GITHUB_APP_INSTALLATION_ID` (host / non-webhook GitHub calls).
|
|
68
|
+
*/
|
|
69
|
+
export async function resolveGitHubInstallationId(
|
|
70
|
+
installationId?: number
|
|
71
|
+
): Promise<number | undefined> {
|
|
72
|
+
if (
|
|
73
|
+
installationId !== undefined &&
|
|
74
|
+
Number.isInteger(installationId) &&
|
|
75
|
+
installationId > 0
|
|
76
|
+
) {
|
|
77
|
+
return installationId;
|
|
78
|
+
}
|
|
79
|
+
const fromEnv = await resolveCredentialValue(
|
|
80
|
+
process.env.GITHUB_APP_INSTALLATION_ID
|
|
81
|
+
);
|
|
82
|
+
if (fromEnv === undefined) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
if (!/^[1-9][0-9]*$/u.test(fromEnv)) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
return Number(fromEnv);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Resolve a bearer token for GitHub REST calls. Prefer explicit credentials,
|
|
93
|
+
* then App installation tokens when configured, then local PAT / `gh auth`.
|
|
94
|
+
*/
|
|
95
|
+
export async function resolveGitHubAccessToken(input: {
|
|
96
|
+
api?: GitHubAuthApiOptions;
|
|
97
|
+
credentials?: GitHubChannelCredentials;
|
|
98
|
+
installationId?: number;
|
|
99
|
+
}): Promise<string> {
|
|
100
|
+
const explicit =
|
|
101
|
+
(await resolveCredentialValue(input.credentials?.token)) ??
|
|
102
|
+
(await resolveCredentialValue(input.credentials?.installationToken));
|
|
103
|
+
if (explicit !== undefined) {
|
|
104
|
+
return explicit;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const installationId = await resolveGitHubInstallationId(
|
|
108
|
+
input.installationId
|
|
109
|
+
);
|
|
110
|
+
if (
|
|
111
|
+
installationId !== undefined &&
|
|
112
|
+
(await hasGitHubAppCredentials(input.credentials))
|
|
113
|
+
) {
|
|
114
|
+
return createGitHubInstallationToken({
|
|
115
|
+
api: input.api,
|
|
116
|
+
appId: input.credentials?.appId,
|
|
117
|
+
installationId,
|
|
118
|
+
privateKey: input.credentials?.privateKey,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const fromEnv =
|
|
123
|
+
(await resolveCredentialValue(process.env.GITHUB_TOKEN)) ??
|
|
124
|
+
(await resolveCredentialValue(process.env.GH_TOKEN));
|
|
125
|
+
if (fromEnv !== undefined) {
|
|
126
|
+
return fromEnv;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const fromGh = await tryResolveGhAuthToken();
|
|
130
|
+
if (fromGh !== undefined) {
|
|
131
|
+
return fromGh;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
throw new Error(
|
|
135
|
+
"githubChannel: no GitHub token available (set GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY + installation id, or GITHUB_TOKEN / GH_TOKEN, or run `gh auth login`)."
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Soft resolve — returns undefined instead of throwing. */
|
|
140
|
+
export async function tryResolveGitHubAccessToken(input: {
|
|
141
|
+
api?: GitHubAuthApiOptions;
|
|
142
|
+
credentials?: GitHubChannelCredentials;
|
|
143
|
+
installationId?: number;
|
|
144
|
+
}): Promise<string | undefined> {
|
|
145
|
+
try {
|
|
146
|
+
return await resolveGitHubAccessToken(input);
|
|
147
|
+
} catch {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Read `gh auth token` when the CLI is logged in. Cached briefly. */
|
|
153
|
+
export async function tryResolveGhAuthToken(): Promise<string | undefined> {
|
|
154
|
+
if (ghAuthTokenCache !== null && Date.now() < ghAuthTokenCache.expiresAtMs) {
|
|
155
|
+
return ghAuthTokenCache.token;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const { stdout } = await execFileAsync("gh", ["auth", "token"], {
|
|
159
|
+
timeout: 5_000,
|
|
160
|
+
env: process.env,
|
|
161
|
+
});
|
|
162
|
+
const token = stdout.trim();
|
|
163
|
+
if (token === "") {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
ghAuthTokenCache = {
|
|
167
|
+
token,
|
|
168
|
+
expiresAtMs: Date.now() + GH_AUTH_CACHE_MS,
|
|
169
|
+
};
|
|
170
|
+
return token;
|
|
171
|
+
} catch {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export async function resolveGitHubAppId(
|
|
177
|
+
appId?: GitHubCredentialValue | number
|
|
178
|
+
): Promise<string> {
|
|
179
|
+
const source =
|
|
180
|
+
appId ??
|
|
181
|
+
(process.env.GITHUB_APP_ID !== undefined && process.env.GITHUB_APP_ID !== ""
|
|
182
|
+
? process.env.GITHUB_APP_ID
|
|
183
|
+
: undefined);
|
|
184
|
+
if (source === undefined) {
|
|
185
|
+
throw new Error("githubChannel: GITHUB_APP_ID is required.");
|
|
186
|
+
}
|
|
187
|
+
if (typeof source === "number") {
|
|
188
|
+
return String(source);
|
|
189
|
+
}
|
|
190
|
+
const value = await resolveCredentialValue(source);
|
|
191
|
+
if (value === undefined) {
|
|
192
|
+
throw new Error("githubChannel: GITHUB_APP_ID is required.");
|
|
193
|
+
}
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export async function resolveGitHubPrivateKey(
|
|
198
|
+
privateKey?: GitHubCredentialValue
|
|
199
|
+
): Promise<string> {
|
|
200
|
+
const source =
|
|
201
|
+
privateKey ??
|
|
202
|
+
(process.env.GITHUB_APP_PRIVATE_KEY !== undefined &&
|
|
203
|
+
process.env.GITHUB_APP_PRIVATE_KEY !== ""
|
|
204
|
+
? process.env.GITHUB_APP_PRIVATE_KEY
|
|
205
|
+
: undefined);
|
|
206
|
+
if (source === undefined) {
|
|
207
|
+
throw new Error("githubChannel: GITHUB_APP_PRIVATE_KEY is required.");
|
|
208
|
+
}
|
|
209
|
+
const value = await resolveCredentialValue(source);
|
|
210
|
+
if (value === undefined) {
|
|
211
|
+
throw new Error("githubChannel: GITHUB_APP_PRIVATE_KEY is required.");
|
|
212
|
+
}
|
|
213
|
+
return value.replace(/\\n/gu, "\n");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Mint an installation access token via `@octokit/auth-app`.
|
|
218
|
+
* Prefer {@link createGitHubOctokit} for normal API work — this is for
|
|
219
|
+
* callers that only need the raw token string.
|
|
220
|
+
*/
|
|
221
|
+
export async function createGitHubInstallationToken(input: {
|
|
222
|
+
api?: GitHubAuthApiOptions;
|
|
223
|
+
appId?: GitHubCredentialValue | number;
|
|
224
|
+
installationId: number;
|
|
225
|
+
privateKey?: GitHubCredentialValue;
|
|
226
|
+
}): Promise<string> {
|
|
227
|
+
const appId = await resolveGitHubAppId(input.appId);
|
|
228
|
+
const privateKey = await resolveGitHubPrivateKey(input.privateKey);
|
|
229
|
+
// Prefer createGitHubOctokit for API work — this path only mints a raw
|
|
230
|
+
// token. Custom fetch belongs on the Octokit client, not createAppAuth
|
|
231
|
+
// (StrategyOptions.request expects a full RequestInterface).
|
|
232
|
+
const auth = createAppAuth({
|
|
233
|
+
appId,
|
|
234
|
+
privateKey,
|
|
235
|
+
...(input.api?.apiBaseUrl === undefined
|
|
236
|
+
? {}
|
|
237
|
+
: { baseUrl: input.api.apiBaseUrl }),
|
|
238
|
+
});
|
|
239
|
+
const result = await auth({
|
|
240
|
+
type: "installation",
|
|
241
|
+
installationId: input.installationId,
|
|
242
|
+
});
|
|
243
|
+
return result.token;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Export the resolved host GitHub token as `process.env.GH_TOKEN` so
|
|
248
|
+
* subprocesses that shell out to `gh` work on App-credential hosts (corp
|
|
249
|
+
* agent-serve). Intended for serve warmup when auth source is `app`.
|
|
250
|
+
* Returns whether `GH_TOKEN` was written; refreshes on an interval.
|
|
251
|
+
*/
|
|
252
|
+
export async function ensureGhCliTokenEnv(): Promise<boolean> {
|
|
253
|
+
const token = await tryResolveGitHubAccessToken({});
|
|
254
|
+
if (token === undefined) {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
process.env.GH_TOKEN = token;
|
|
258
|
+
if (ghCliTokenRefreshTimer === null) {
|
|
259
|
+
const timer = setInterval(() => {
|
|
260
|
+
void ensureGhCliTokenEnv();
|
|
261
|
+
}, GH_CLI_TOKEN_REFRESH_MS);
|
|
262
|
+
timer.unref?.();
|
|
263
|
+
ghCliTokenRefreshTimer = timer;
|
|
264
|
+
}
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/** Clears in-memory caches. Intended for tests. */
|
|
269
|
+
export function clearGitHubAuthCaches(): void {
|
|
270
|
+
ghAuthTokenCache = null;
|
|
271
|
+
if (ghCliTokenRefreshTimer !== null) {
|
|
272
|
+
clearInterval(ghCliTokenRefreshTimer);
|
|
273
|
+
ghCliTokenRefreshTimer = null;
|
|
274
|
+
}
|
|
275
|
+
}
|