@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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-side GitHub + Slack clients shared across tools, channel routes,
|
|
3
|
+
* schedules, and channel packs — same injection pattern as MCP.
|
|
4
|
+
*/
|
|
5
|
+
import type { HostGitHubClient, HostSlackClient } from "../types.js";
|
|
6
|
+
export interface HostPlatforms {
|
|
7
|
+
github: HostGitHubClient;
|
|
8
|
+
slack: HostSlackClient;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* How ambient host GitHub auth was resolved.
|
|
12
|
+
* `app` = GitHub App installation token (preferred in production).
|
|
13
|
+
* `env` / `gh` = local PAT / CLI fallbacks when App creds are unset.
|
|
14
|
+
*/
|
|
15
|
+
export type HostGitHubAuthSource = "app" | "env" | "gh" | "unavailable";
|
|
16
|
+
/**
|
|
17
|
+
* Build host platforms from ambient credentials. Prefer App installation
|
|
18
|
+
* auth when configured; otherwise fall back to PAT / `gh auth` for local
|
|
19
|
+
* testing. Webhook-scoped calls should still prefer `ctx.github`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createHostPlatforms(): HostPlatforms;
|
|
22
|
+
/**
|
|
23
|
+
* Detect ambient host GitHub auth without throwing.
|
|
24
|
+
* Order matches {@link createGitHubOctokit}: App installation, then
|
|
25
|
+
* `GITHUB_TOKEN` / `GH_TOKEN`, then `gh auth token`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveHostGitHubAuthSource(): Promise<HostGitHubAuthSource>;
|
|
28
|
+
/**
|
|
29
|
+
* Soft boot-time GitHub auth check: log the resolved source and optionally
|
|
30
|
+
* prime `github.getOctokit()` so the first request does not pay CLI latency.
|
|
31
|
+
* When auth is App-backed, also export an installation token as `GH_TOKEN`
|
|
32
|
+
* so tools that shell out to `gh` (a host-side `prepare_pr` tool, say)
|
|
33
|
+
* authenticate on corp hosts that have no PAT / `gh
|
|
34
|
+
* auth login`. Never fails serve — missing auth is logged as a warning.
|
|
35
|
+
*/
|
|
36
|
+
export declare function warmupHostGitHubAuth(options: {
|
|
37
|
+
logger: (line: string) => void;
|
|
38
|
+
github?: HostGitHubClient;
|
|
39
|
+
}): Promise<HostGitHubAuthSource>;
|
|
40
|
+
//# sourceMappingURL=host-platforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-platforms.d.ts","sourceRoot":"","sources":["../../src/internal/host-platforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,aAAa,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CA4BnD;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAejF;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA8ChC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-side GitHub + Slack clients shared across tools, channel routes,
|
|
3
|
+
* schedules, and channel packs — same injection pattern as MCP.
|
|
4
|
+
*/
|
|
5
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
6
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
7
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
8
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
9
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
10
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
11
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
import { WebClient } from "@slack/web-api";
|
|
15
|
+
import { createGitHubOctokit } from "../channels/github/api.js";
|
|
16
|
+
import { ensureGhCliTokenEnv, hasGitHubAppCredentials, resolveCredentialValue, resolveGitHubInstallationId, tryResolveGhAuthToken, } from "../channels/github/auth.js";
|
|
17
|
+
import { tryResolveBotToken } from "../channels/slack/credentials.js";
|
|
18
|
+
/**
|
|
19
|
+
* Build host platforms from ambient credentials. Prefer App installation
|
|
20
|
+
* auth when configured; otherwise fall back to PAT / `gh auth` for local
|
|
21
|
+
* testing. Webhook-scoped calls should still prefer `ctx.github`.
|
|
22
|
+
*/
|
|
23
|
+
export function createHostPlatforms() {
|
|
24
|
+
let octokitPromise;
|
|
25
|
+
let slackPromise;
|
|
26
|
+
return {
|
|
27
|
+
github: {
|
|
28
|
+
getOctokit: () => {
|
|
29
|
+
octokitPromise !== null && octokitPromise !== void 0 ? octokitPromise : (octokitPromise = createGitHubOctokit({}));
|
|
30
|
+
return octokitPromise;
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
slack: {
|
|
34
|
+
getClient: () => __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
if (slackPromise === undefined) {
|
|
36
|
+
slackPromise = (() => __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
const token = yield tryResolveBotToken(undefined);
|
|
38
|
+
if (token === undefined) {
|
|
39
|
+
throw new Error("No Slack bot token available (set SLACK_BOT_TOKEN or a channel envPrefix).");
|
|
40
|
+
}
|
|
41
|
+
return new WebClient(token);
|
|
42
|
+
}))();
|
|
43
|
+
}
|
|
44
|
+
return slackPromise;
|
|
45
|
+
}),
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect ambient host GitHub auth without throwing.
|
|
51
|
+
* Order matches {@link createGitHubOctokit}: App installation, then
|
|
52
|
+
* `GITHUB_TOKEN` / `GH_TOKEN`, then `gh auth token`.
|
|
53
|
+
*/
|
|
54
|
+
export function resolveHostGitHubAuthSource() {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
var _a;
|
|
57
|
+
if ((yield hasGitHubAppCredentials()) &&
|
|
58
|
+
(yield resolveGitHubInstallationId()) !== undefined) {
|
|
59
|
+
return "app";
|
|
60
|
+
}
|
|
61
|
+
const fromEnv = (_a = (yield resolveCredentialValue(process.env.GITHUB_TOKEN))) !== null && _a !== void 0 ? _a : (yield resolveCredentialValue(process.env.GH_TOKEN));
|
|
62
|
+
if (fromEnv !== undefined) {
|
|
63
|
+
return "env";
|
|
64
|
+
}
|
|
65
|
+
const fromGh = yield tryResolveGhAuthToken();
|
|
66
|
+
return fromGh === undefined ? "unavailable" : "gh";
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Soft boot-time GitHub auth check: log the resolved source and optionally
|
|
71
|
+
* prime `github.getOctokit()` so the first request does not pay CLI latency.
|
|
72
|
+
* When auth is App-backed, also export an installation token as `GH_TOKEN`
|
|
73
|
+
* so tools that shell out to `gh` (a host-side `prepare_pr` tool, say)
|
|
74
|
+
* authenticate on corp hosts that have no PAT / `gh
|
|
75
|
+
* auth login`. Never fails serve — missing auth is logged as a warning.
|
|
76
|
+
*/
|
|
77
|
+
export function warmupHostGitHubAuth(options) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
const source = yield resolveHostGitHubAuthSource();
|
|
80
|
+
if (source === "unavailable") {
|
|
81
|
+
options.logger("[agent-serve] GitHub auth: unavailable (set GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY + GITHUB_APP_INSTALLATION_ID, or GITHUB_TOKEN / GH_TOKEN, or run `gh auth login`)");
|
|
82
|
+
return source;
|
|
83
|
+
}
|
|
84
|
+
let exportedGhToken = false;
|
|
85
|
+
if (source === "app") {
|
|
86
|
+
try {
|
|
87
|
+
exportedGhToken = yield ensureGhCliTokenEnv();
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
options.logger(`[agent-serve] GitHub auth: failed to export GH_TOKEN for gh CLI: ${error instanceof Error ? error.message : String(error)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const label = source === "app"
|
|
94
|
+
? exportedGhToken
|
|
95
|
+
? "GitHub App installation token (also exported as GH_TOKEN for gh CLI)"
|
|
96
|
+
: "GitHub App installation token"
|
|
97
|
+
: source === "env"
|
|
98
|
+
? "GITHUB_TOKEN/GH_TOKEN"
|
|
99
|
+
: "gh auth token";
|
|
100
|
+
if (options.github === undefined) {
|
|
101
|
+
options.logger(`[agent-serve] GitHub auth: ${label}`);
|
|
102
|
+
return source;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
yield options.github.getOctokit();
|
|
106
|
+
options.logger(`[agent-serve] GitHub auth: ${label}`);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
options.logger(`[agent-serve] GitHub auth: ${label} resolved but Octokit warmup failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
110
|
+
}
|
|
111
|
+
return source;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in HTTP session channel: the default API that `curl`, SDK
|
|
3
|
+
* clients, and frontends talk to. Mounted at `/v1/session*` and enabled even
|
|
4
|
+
* when `agent/channels/http.ts` does not exist; author that file with
|
|
5
|
+
* `httpChannel({ ... })` to override auth or observe events.
|
|
6
|
+
*
|
|
7
|
+
* Continuation semantics: `POST /v1/session` returns a `continuationToken`;
|
|
8
|
+
* each accepted follow-up rotates it and returns the replacement, and a
|
|
9
|
+
* stale token is rejected with 409. Follow-ups address any chat session by
|
|
10
|
+
* id (including custom channels such as `drive`) when the token matches
|
|
11
|
+
* that session's channel + key; task sessions stay fire-and-forget.
|
|
12
|
+
*/
|
|
13
|
+
import type { AuthContext, AuthPolicy, HttpChannelDefinition, SessionRecord } from "../types.js";
|
|
14
|
+
import type { ServerRoute } from "./router.js";
|
|
15
|
+
import { type SessionEngine } from "./session-engine.js";
|
|
16
|
+
export declare function buildHttpChannelRoutes(args: {
|
|
17
|
+
engine: SessionEngine;
|
|
18
|
+
config: HttpChannelDefinition;
|
|
19
|
+
auth: AuthPolicy[];
|
|
20
|
+
/** Path prefix ("" single-agent, "/<slug>" multi-agent). */
|
|
21
|
+
basePath?: string;
|
|
22
|
+
/**
|
|
23
|
+
* When true (server `--dev` without bearer/custom auth), session
|
|
24
|
+
* stream/events/follow-up are readable without matching the creating
|
|
25
|
+
* principal — matching `GET /v1/sessions` includeAll so the playground
|
|
26
|
+
* can open every listed session. Still requires a loopback caller unless
|
|
27
|
+
* {@link relaxSessionReadAuthBeyondLoopback} is also set.
|
|
28
|
+
*/
|
|
29
|
+
relaxSessionReadAuth?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* With {@link relaxSessionReadAuth}, skip the loopback IP check so remote
|
|
32
|
+
* callers (e.g. Tailscale + `--allow-anonymous`) can open listed sessions.
|
|
33
|
+
*/
|
|
34
|
+
relaxSessionReadAuthBeyondLoopback?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* `--dev` bridge: allow playground / HTTP callers to Approve/Deny parked
|
|
37
|
+
* tools on Slack-owned sessions (Slack principals never match local /
|
|
38
|
+
* anonymous auth). Does not open approval writes on HTTP-owned sessions.
|
|
39
|
+
* Respects the same loopback / beyondLoopback gate as session reads.
|
|
40
|
+
*/
|
|
41
|
+
relaxSessionApprovalAuth?: boolean;
|
|
42
|
+
}): ServerRoute[];
|
|
43
|
+
export declare function requireSessionOwner(record: SessionRecord, caller: AuthContext | null, options?: {
|
|
44
|
+
relax?: boolean;
|
|
45
|
+
beyondLoopback?: boolean;
|
|
46
|
+
requestIp?: string | null;
|
|
47
|
+
}): Response | undefined;
|
|
48
|
+
export declare function jsonResponse(data: unknown, init?: {
|
|
49
|
+
status?: number;
|
|
50
|
+
headers?: Record<string, string>;
|
|
51
|
+
}): Response;
|
|
52
|
+
export declare function errorResponse(status: number, code: string, message: string): Response;
|
|
53
|
+
export declare function readJsonObject(request: Request): Promise<Record<string, unknown> | undefined>;
|
|
54
|
+
//# sourceMappingURL=http-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,CAkYhB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,QAAQ,GAAG,SAAS,CAiBtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC/D,QAAQ,CAQV;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV;AA0BD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAc9C"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in HTTP session channel: the default API that `curl`, SDK
|
|
3
|
+
* clients, and frontends talk to. Mounted at `/v1/session*` and enabled even
|
|
4
|
+
* when `agent/channels/http.ts` does not exist; author that file with
|
|
5
|
+
* `httpChannel({ ... })` to override auth or observe events.
|
|
6
|
+
*
|
|
7
|
+
* Continuation semantics: `POST /v1/session` returns a `continuationToken`;
|
|
8
|
+
* each accepted follow-up rotates it and returns the replacement, and a
|
|
9
|
+
* stale token is rejected with 409. Follow-ups address any chat session by
|
|
10
|
+
* id (including custom channels such as `drive`) when the token matches
|
|
11
|
+
* that session's channel + key; task sessions stay fire-and-forget.
|
|
12
|
+
*/
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
import { samePrincipal } from "./auth.js";
|
|
23
|
+
import { formatContinuationToken, newContinuationKey, parseContinuationToken, } from "./ids.js";
|
|
24
|
+
import { isLoopbackAddress } from "./net.js";
|
|
25
|
+
import { ApprovalInterruptedError, ApprovalNotFoundError, HTTP_CHANNEL_ID, SessionAuthError, SessionBusyError, } from "./session-engine.js";
|
|
26
|
+
import { eventsUrlForSession, playgroundUrlForSession, } from "./session-urls.js";
|
|
27
|
+
const SESSION_ID_HEADER = "x-agent-serve-session-id";
|
|
28
|
+
export function buildHttpChannelRoutes(args) {
|
|
29
|
+
var _a, _b, _c, _d;
|
|
30
|
+
const { engine, config, auth } = args;
|
|
31
|
+
const base = (_a = args.basePath) !== null && _a !== void 0 ? _a : "";
|
|
32
|
+
const relaxSessionReadAuth = (_b = args.relaxSessionReadAuth) !== null && _b !== void 0 ? _b : false;
|
|
33
|
+
const relaxSessionReadAuthBeyondLoopback = (_c = args.relaxSessionReadAuthBeyondLoopback) !== null && _c !== void 0 ? _c : false;
|
|
34
|
+
const relaxSessionApprovalAuth = (_d = args.relaxSessionApprovalAuth) !== null && _d !== void 0 ? _d : false;
|
|
35
|
+
const transformMessage = (message, authContext) => __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
if (config.onMessage === undefined) {
|
|
37
|
+
return message;
|
|
38
|
+
}
|
|
39
|
+
return config.onMessage(message, { auth: authContext });
|
|
40
|
+
});
|
|
41
|
+
const createSession = {
|
|
42
|
+
method: "POST",
|
|
43
|
+
pattern: `${base}/v1/session`,
|
|
44
|
+
auth,
|
|
45
|
+
handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
var _a;
|
|
47
|
+
const body = yield readJsonObject(request);
|
|
48
|
+
if (body === undefined || typeof body.message !== "string") {
|
|
49
|
+
return errorResponse(400, "invalid_request", "Expected a JSON body with a string `message`.");
|
|
50
|
+
}
|
|
51
|
+
const message = yield transformMessage(body.message, ctx.auth);
|
|
52
|
+
const workspaceFiles = readWorkspaceFiles(body.workspaceFiles);
|
|
53
|
+
const session = yield engine.send(HTTP_CHANNEL_ID, message, Object.assign(Object.assign(Object.assign(Object.assign({ auth: ctx.auth }, (body.state === undefined ? {} : { state: body.state })), (typeof body.title === "string" ? { title: body.title } : {})), (body.purpose === "eval" ? { purpose: "eval" } : {})), (workspaceFiles === undefined ? {} : { workspaceFiles })));
|
|
54
|
+
return jsonResponse({
|
|
55
|
+
ok: true,
|
|
56
|
+
sessionId: session.id,
|
|
57
|
+
continuationToken: formatContinuationToken(HTTP_CHANNEL_ID, (_a = session.continuationToken) !== null && _a !== void 0 ? _a : ""),
|
|
58
|
+
playgroundUrl: playgroundUrlForSession(request, base, session.id),
|
|
59
|
+
traceUrl: eventsUrlForSession(request.url, base, session.id),
|
|
60
|
+
}, { headers: { [SESSION_ID_HEADER]: session.id } });
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
const followUp = {
|
|
64
|
+
method: "POST",
|
|
65
|
+
pattern: `${base}/v1/session/:sessionId`,
|
|
66
|
+
auth,
|
|
67
|
+
handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
var _a;
|
|
69
|
+
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
70
|
+
const record = yield engine.sessions.get(sessionId);
|
|
71
|
+
if (record === undefined) {
|
|
72
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
73
|
+
}
|
|
74
|
+
// Playground (and other HTTP clients) may follow up on any chat
|
|
75
|
+
// session — including custom channels like `drive` — using that
|
|
76
|
+
// session's own continuation token. Task/schedule sessions stay
|
|
77
|
+
// fire-and-forget.
|
|
78
|
+
if (record.mode === "task") {
|
|
79
|
+
return errorResponse(409, "session_not_followable", "Task sessions are fire-and-forget; they do not accept follow-ups.");
|
|
80
|
+
}
|
|
81
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
82
|
+
relax: relaxSessionReadAuth,
|
|
83
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
84
|
+
requestIp: ctx.requestIp,
|
|
85
|
+
});
|
|
86
|
+
if (ownership !== undefined) {
|
|
87
|
+
return ownership;
|
|
88
|
+
}
|
|
89
|
+
const body = yield readJsonObject(request);
|
|
90
|
+
if (body === undefined || typeof body.message !== "string") {
|
|
91
|
+
return errorResponse(400, "invalid_request", "Expected a JSON body with a string `message`.");
|
|
92
|
+
}
|
|
93
|
+
if (typeof body.continuationToken !== "string") {
|
|
94
|
+
return errorResponse(400, "invalid_request", "Expected a `continuationToken` from the previous response.");
|
|
95
|
+
}
|
|
96
|
+
const presented = parseContinuationToken(body.continuationToken);
|
|
97
|
+
if (presented === null ||
|
|
98
|
+
presented.channelId !== record.channelId ||
|
|
99
|
+
record.continuationKey === null ||
|
|
100
|
+
presented.key !== record.continuationKey) {
|
|
101
|
+
return errorResponse(409, "stale_continuation_token", "The continuation token does not address this session's active continuation.");
|
|
102
|
+
}
|
|
103
|
+
const message = yield transformMessage(body.message, ctx.auth);
|
|
104
|
+
try {
|
|
105
|
+
// Continue as the session owner after the HTTP ownership gate so
|
|
106
|
+
// `--dev` relaxed reads can follow up on channel-owned sessions
|
|
107
|
+
// (drive/slack/…) without failing SessionAuthError.
|
|
108
|
+
yield engine.send(record.channelId, message, {
|
|
109
|
+
auth: record.auth,
|
|
110
|
+
continuationToken: record.continuationKey,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof SessionBusyError) {
|
|
115
|
+
return errorResponse(409, "session_busy", "A turn is already running; wait for session.waiting before sending a follow-up.");
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
// Rotate only after the message is accepted so a rejected send leaves
|
|
120
|
+
// the caller's token valid for retry.
|
|
121
|
+
const rotated = newContinuationKey();
|
|
122
|
+
yield engine.setContinuationToken(sessionId, rotated);
|
|
123
|
+
return jsonResponse({
|
|
124
|
+
ok: true,
|
|
125
|
+
sessionId,
|
|
126
|
+
continuationToken: formatContinuationToken(record.channelId, rotated),
|
|
127
|
+
}, { headers: { [SESSION_ID_HEADER]: sessionId } });
|
|
128
|
+
}),
|
|
129
|
+
};
|
|
130
|
+
const stream = {
|
|
131
|
+
method: "GET",
|
|
132
|
+
pattern: `${base}/v1/session/:sessionId/stream`,
|
|
133
|
+
auth,
|
|
134
|
+
handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
var _a;
|
|
136
|
+
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
137
|
+
// The stream-and-inspect handle is runtime-owned: sessions started by
|
|
138
|
+
// custom channels or schedules are observable here too when the caller
|
|
139
|
+
// matches the session's stored principal (or `--dev` relax). Follow-ups
|
|
140
|
+
// use the same ownership gate plus the session's continuation token.
|
|
141
|
+
const record = yield engine.sessions.get(sessionId);
|
|
142
|
+
if (record === undefined) {
|
|
143
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
144
|
+
}
|
|
145
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
146
|
+
relax: relaxSessionReadAuth,
|
|
147
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
148
|
+
requestIp: ctx.requestIp,
|
|
149
|
+
});
|
|
150
|
+
if (ownership !== undefined) {
|
|
151
|
+
return ownership;
|
|
152
|
+
}
|
|
153
|
+
const url = new URL(request.url);
|
|
154
|
+
const rawStartIndex = url.searchParams.get("startIndex");
|
|
155
|
+
const startIndex = rawStartIndex === null ? 0 : Number.parseInt(rawStartIndex, 10);
|
|
156
|
+
if (Number.isNaN(startIndex) || startIndex < 0) {
|
|
157
|
+
return errorResponse(400, "invalid_request", "startIndex must be a non-negative integer.");
|
|
158
|
+
}
|
|
159
|
+
const body = yield engine.eventStream(sessionId, startIndex);
|
|
160
|
+
return new Response(body, {
|
|
161
|
+
status: 200,
|
|
162
|
+
headers: {
|
|
163
|
+
"content-type": "application/x-ndjson; charset=utf-8",
|
|
164
|
+
"cache-control": "no-store",
|
|
165
|
+
[SESSION_ID_HEADER]: sessionId,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
}),
|
|
169
|
+
};
|
|
170
|
+
/** One-shot NDJSON (or JSON) dump of the session trace. */
|
|
171
|
+
const events = {
|
|
172
|
+
method: "GET",
|
|
173
|
+
pattern: `${base}/v1/session/:sessionId/events`,
|
|
174
|
+
auth,
|
|
175
|
+
handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
176
|
+
var _a;
|
|
177
|
+
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
178
|
+
const record = yield engine.sessions.get(sessionId);
|
|
179
|
+
if (record === undefined) {
|
|
180
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
181
|
+
}
|
|
182
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
183
|
+
relax: relaxSessionReadAuth,
|
|
184
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
185
|
+
requestIp: ctx.requestIp,
|
|
186
|
+
});
|
|
187
|
+
if (ownership !== undefined) {
|
|
188
|
+
return ownership;
|
|
189
|
+
}
|
|
190
|
+
const url = new URL(request.url);
|
|
191
|
+
const asJson = url.searchParams.get("format") === "json";
|
|
192
|
+
const snapshot = yield engine.listEvents(sessionId, 0);
|
|
193
|
+
if (asJson) {
|
|
194
|
+
return jsonResponse({
|
|
195
|
+
sessionId,
|
|
196
|
+
events: snapshot,
|
|
197
|
+
playgroundUrl: playgroundUrlForSession(request, base, sessionId),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const ndjson = `${snapshot.map((e) => JSON.stringify(e)).join("\n")}${snapshot.length > 0 ? "\n" : ""}`;
|
|
201
|
+
return new Response(ndjson, {
|
|
202
|
+
status: 200,
|
|
203
|
+
headers: {
|
|
204
|
+
"content-type": "application/x-ndjson; charset=utf-8",
|
|
205
|
+
"cache-control": "no-store",
|
|
206
|
+
"content-disposition": `attachment; filename="${sessionId}.ndjson"`,
|
|
207
|
+
[SESSION_ID_HEADER]: sessionId,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
}),
|
|
211
|
+
};
|
|
212
|
+
const listApprovals = {
|
|
213
|
+
method: "GET",
|
|
214
|
+
pattern: `${base}/v1/session/:sessionId/approvals`,
|
|
215
|
+
auth,
|
|
216
|
+
handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
217
|
+
var _a;
|
|
218
|
+
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
219
|
+
const record = yield engine.sessions.get(sessionId);
|
|
220
|
+
if (record === undefined) {
|
|
221
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
222
|
+
}
|
|
223
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
224
|
+
relax: relaxSessionReadAuth,
|
|
225
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
226
|
+
requestIp: ctx.requestIp,
|
|
227
|
+
});
|
|
228
|
+
if (ownership !== undefined) {
|
|
229
|
+
return ownership;
|
|
230
|
+
}
|
|
231
|
+
const pending = yield engine.listPendingApprovals(sessionId);
|
|
232
|
+
return jsonResponse({ ok: true, sessionId, pending });
|
|
233
|
+
}),
|
|
234
|
+
};
|
|
235
|
+
const resolveApproval = {
|
|
236
|
+
method: "POST",
|
|
237
|
+
pattern: `${base}/v1/session/:sessionId/approvals/:callId`,
|
|
238
|
+
auth,
|
|
239
|
+
handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
240
|
+
var _a;
|
|
241
|
+
var _b, _c;
|
|
242
|
+
const sessionId = (_b = ctx.params.sessionId) !== null && _b !== void 0 ? _b : "";
|
|
243
|
+
const callId = (_c = ctx.params.callId) !== null && _c !== void 0 ? _c : "";
|
|
244
|
+
const record = yield engine.sessions.get(sessionId);
|
|
245
|
+
if (record === undefined) {
|
|
246
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
247
|
+
}
|
|
248
|
+
const bridgeSlackApproval = relaxSessionApprovalAuth === true &&
|
|
249
|
+
((_a = record.auth) === null || _a === void 0 ? void 0 : _a.authenticator) === "slack" &&
|
|
250
|
+
(relaxSessionReadAuthBeyondLoopback === true ||
|
|
251
|
+
(typeof ctx.requestIp === "string" &&
|
|
252
|
+
isLoopbackAddress(ctx.requestIp)));
|
|
253
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
254
|
+
// HTTP sessions stay strict. Slack sessions may use the --dev
|
|
255
|
+
// playground bridge (see relaxSessionApprovalAuth).
|
|
256
|
+
relax: bridgeSlackApproval,
|
|
257
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
258
|
+
requestIp: ctx.requestIp,
|
|
259
|
+
});
|
|
260
|
+
if (ownership !== undefined) {
|
|
261
|
+
return ownership;
|
|
262
|
+
}
|
|
263
|
+
const body = yield readJsonObject(request);
|
|
264
|
+
const decision = body === null || body === void 0 ? void 0 : body.decision;
|
|
265
|
+
if (decision !== "approve" && decision !== "deny") {
|
|
266
|
+
return errorResponse(400, "invalid_request", 'Expected a JSON body with `decision`: "approve" | "deny".');
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const pending = yield engine.resolveApproval(sessionId, callId, decision, ctx.auth, bridgeSlackApproval ? { asSessionOwner: true } : undefined);
|
|
270
|
+
return jsonResponse({
|
|
271
|
+
ok: true,
|
|
272
|
+
sessionId,
|
|
273
|
+
callId,
|
|
274
|
+
decision,
|
|
275
|
+
toolName: pending.toolName,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
if (error instanceof ApprovalNotFoundError) {
|
|
280
|
+
return errorResponse(404, "approval_not_found", error.message);
|
|
281
|
+
}
|
|
282
|
+
if (error instanceof ApprovalInterruptedError) {
|
|
283
|
+
return errorResponse(409, "approval_interrupted", error.message);
|
|
284
|
+
}
|
|
285
|
+
if (error instanceof SessionAuthError) {
|
|
286
|
+
return errorResponse(403, "forbidden", error.message);
|
|
287
|
+
}
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
}),
|
|
291
|
+
};
|
|
292
|
+
const stop = {
|
|
293
|
+
method: "POST",
|
|
294
|
+
pattern: `${base}/v1/session/:sessionId/stop`,
|
|
295
|
+
auth,
|
|
296
|
+
handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
297
|
+
var _a;
|
|
298
|
+
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
299
|
+
const record = yield engine.sessions.get(sessionId);
|
|
300
|
+
if (record === undefined) {
|
|
301
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
302
|
+
}
|
|
303
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
304
|
+
relax: relaxSessionReadAuth,
|
|
305
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
306
|
+
requestIp: ctx.requestIp,
|
|
307
|
+
});
|
|
308
|
+
if (ownership !== undefined) {
|
|
309
|
+
return ownership;
|
|
310
|
+
}
|
|
311
|
+
const interrupted = yield engine.interrupt(sessionId);
|
|
312
|
+
return jsonResponse({ ok: true, interrupted }, { headers: { [SESSION_ID_HEADER]: sessionId } });
|
|
313
|
+
}),
|
|
314
|
+
};
|
|
315
|
+
return [
|
|
316
|
+
createSession,
|
|
317
|
+
followUp,
|
|
318
|
+
stop,
|
|
319
|
+
stream,
|
|
320
|
+
events,
|
|
321
|
+
listApprovals,
|
|
322
|
+
resolveApproval,
|
|
323
|
+
];
|
|
324
|
+
}
|
|
325
|
+
export function requireSessionOwner(record, caller, options) {
|
|
326
|
+
// Dev playground lists every session (`includeAll`); match that by
|
|
327
|
+
// allowing cross-principal read/follow-up. Loopback-only unless
|
|
328
|
+
// `--allow-anonymous` also opted into beyondLoopback.
|
|
329
|
+
const relaxOwnership = (options === null || options === void 0 ? void 0 : options.relax) === true &&
|
|
330
|
+
(options.beyondLoopback === true ||
|
|
331
|
+
(typeof options.requestIp === "string" &&
|
|
332
|
+
isLoopbackAddress(options.requestIp)));
|
|
333
|
+
if (relaxOwnership || samePrincipal(record.auth, caller)) {
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
336
|
+
return errorResponse(403, "forbidden", "This session belongs to a different principal.");
|
|
337
|
+
}
|
|
338
|
+
export function jsonResponse(data, init = {}) {
|
|
339
|
+
var _a;
|
|
340
|
+
return new Response(JSON.stringify(data), {
|
|
341
|
+
status: (_a = init.status) !== null && _a !== void 0 ? _a : 200,
|
|
342
|
+
headers: Object.assign({ "content-type": "application/json; charset=utf-8" }, init.headers),
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
export function errorResponse(status, code, message) {
|
|
346
|
+
return jsonResponse({ ok: false, error: code, message }, { status });
|
|
347
|
+
}
|
|
348
|
+
function readWorkspaceFiles(value) {
|
|
349
|
+
if (value === undefined || value === null || typeof value !== "object") {
|
|
350
|
+
return undefined;
|
|
351
|
+
}
|
|
352
|
+
if (Array.isArray(value)) {
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
const files = {};
|
|
356
|
+
for (const [path, contents] of Object.entries(value)) {
|
|
357
|
+
if (typeof path !== "string" || path.trim() === "") {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
if (typeof contents !== "string") {
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
files[path] = contents;
|
|
364
|
+
}
|
|
365
|
+
return Object.keys(files).length === 0 ? undefined : files;
|
|
366
|
+
}
|
|
367
|
+
export function readJsonObject(request) {
|
|
368
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
369
|
+
try {
|
|
370
|
+
const parsed = yield request.json();
|
|
371
|
+
if (typeof parsed === "object" &&
|
|
372
|
+
parsed !== null &&
|
|
373
|
+
!Array.isArray(parsed)) {
|
|
374
|
+
return parsed;
|
|
375
|
+
}
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
catch (_a) {
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Fresh session id (`ses_<24 hex>` — a single safe path segment). */
|
|
2
|
+
export declare function newSessionId(): string;
|
|
3
|
+
export declare function newContinuationKey(): string;
|
|
4
|
+
/**
|
|
5
|
+
* Unique server-tool call id (a single safe path segment). Used when the
|
|
6
|
+
* SDK omits `context.toolCallId` and for direct (deterministic) tool calls.
|
|
7
|
+
*/
|
|
8
|
+
export declare function newToolCallId(toolName: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Wire form of a continuation token: the owning channel id, a colon, then
|
|
11
|
+
* the channel-local key (mirrors how platform channels key sessions by
|
|
12
|
+
* thread identity).
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatContinuationToken(channelId: string, key: string): string;
|
|
15
|
+
export declare function parseContinuationToken(token: string): {
|
|
16
|
+
channelId: string;
|
|
17
|
+
key: string;
|
|
18
|
+
} | null;
|
|
19
|
+
//# sourceMappingURL=ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/internal/ids.ts"],"names":[],"mappings":"AAEA,sEAAsE;AACtE,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,MAAM,CAER;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GACZ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS3C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
/** Fresh session id (`ses_<24 hex>` — a single safe path segment). */
|
|
3
|
+
export function newSessionId() {
|
|
4
|
+
return `ses_${randomBytes(12).toString("hex")}`;
|
|
5
|
+
}
|
|
6
|
+
export function newContinuationKey() {
|
|
7
|
+
return randomBytes(16).toString("hex");
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Unique server-tool call id (a single safe path segment). Used when the
|
|
11
|
+
* SDK omits `context.toolCallId` and for direct (deterministic) tool calls.
|
|
12
|
+
*/
|
|
13
|
+
export function newToolCallId(toolName) {
|
|
14
|
+
const safe = toolName.replace(/[^A-Za-z0-9_]/g, "_").slice(0, 32);
|
|
15
|
+
return `tool_${safe}_${randomBytes(8).toString("hex")}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Wire form of a continuation token: the owning channel id, a colon, then
|
|
19
|
+
* the channel-local key (mirrors how platform channels key sessions by
|
|
20
|
+
* thread identity).
|
|
21
|
+
*/
|
|
22
|
+
export function formatContinuationToken(channelId, key) {
|
|
23
|
+
return `${channelId}:${key}`;
|
|
24
|
+
}
|
|
25
|
+
export function parseContinuationToken(token) {
|
|
26
|
+
const separator = token.indexOf(":");
|
|
27
|
+
if (separator <= 0 || separator === token.length - 1) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
channelId: token.slice(0, separator),
|
|
32
|
+
key: token.slice(separator + 1),
|
|
33
|
+
};
|
|
34
|
+
}
|