@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
package/src/evals.ts
ADDED
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem-first evals for agent-serve projects.
|
|
3
|
+
*
|
|
4
|
+
* Author cases under evals/ as `*.eval.ts` files with {@link defineEval}.
|
|
5
|
+
* One file may hold a single datapoint (`test`) or many (`cases`). Drive the
|
|
6
|
+
* agent with `t.send(...)` and assert with `t.succeeded()`, `t.calledTool()`,
|
|
7
|
+
* `t.messageIncludes(...)`, or `t.check(value, includes(...))`.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { defineEval, includes } from "@anysphere/agent-serve/evals";
|
|
11
|
+
*
|
|
12
|
+
* // One datapoint — id is the file path (evals/weather/nyc.eval.ts → weather/nyc)
|
|
13
|
+
* export default defineEval({
|
|
14
|
+
* description: "Weather tool is used for temperature questions.",
|
|
15
|
+
* async test(t) {
|
|
16
|
+
* await t.send("What's the temperature in NYC?");
|
|
17
|
+
* t.succeeded();
|
|
18
|
+
* t.calledTool("get_weather");
|
|
19
|
+
* t.check(t.reply, includes(/°|F|C/));
|
|
20
|
+
* },
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Many datapoints in one file — ids are <fileId>/<case.id>
|
|
24
|
+
* // evals/weather.eval.ts → weather/nyc, weather/paris
|
|
25
|
+
* export default defineEval({
|
|
26
|
+
* tags: ["smoke", "weather"],
|
|
27
|
+
* cases: [
|
|
28
|
+
* {
|
|
29
|
+
* id: "nyc",
|
|
30
|
+
* async test(t) {
|
|
31
|
+
* await t.send("What's the temperature in NYC?");
|
|
32
|
+
* t.succeeded();
|
|
33
|
+
* t.calledTool("get_weather");
|
|
34
|
+
* },
|
|
35
|
+
* },
|
|
36
|
+
* {
|
|
37
|
+
* id: "paris",
|
|
38
|
+
* async test(t) {
|
|
39
|
+
* await t.send("What's the weather in Paris?");
|
|
40
|
+
* t.succeeded();
|
|
41
|
+
* t.calledTool("get_weather");
|
|
42
|
+
* },
|
|
43
|
+
* },
|
|
44
|
+
* ],
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
import { normalizePositiveInt } from "./internal/bounded-int.js";
|
|
50
|
+
import { brandDefinition } from "./internal/brand.js";
|
|
51
|
+
import {
|
|
52
|
+
assertNonEmptyDir,
|
|
53
|
+
deleteFileInDir,
|
|
54
|
+
readJsonDir,
|
|
55
|
+
resolveProjectRelativeDir,
|
|
56
|
+
writeJsonFile,
|
|
57
|
+
} from "./internal/json-dir-store.js";
|
|
58
|
+
import type { SessionEvent } from "./types.js";
|
|
59
|
+
|
|
60
|
+
export type Expectation =
|
|
61
|
+
| { kind: "includes"; value: string | RegExp }
|
|
62
|
+
| { kind: "equals"; value: unknown }
|
|
63
|
+
| {
|
|
64
|
+
kind: "satisfies";
|
|
65
|
+
predicate: (value: unknown) => boolean;
|
|
66
|
+
label: string;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export function includes(value: string | RegExp): Expectation {
|
|
70
|
+
return { kind: "includes", value };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function equals(value: unknown): Expectation {
|
|
74
|
+
return { kind: "equals", value };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function satisfies(
|
|
78
|
+
predicate: (value: unknown) => boolean,
|
|
79
|
+
label: string
|
|
80
|
+
): Expectation {
|
|
81
|
+
return { kind: "satisfies", predicate, label };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface EvalAssertionResult {
|
|
85
|
+
name: string;
|
|
86
|
+
passed: boolean;
|
|
87
|
+
detail?: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface EvalTurnResult {
|
|
91
|
+
message: string;
|
|
92
|
+
sessionId: string;
|
|
93
|
+
events: SessionEvent[];
|
|
94
|
+
toolCalls: string[];
|
|
95
|
+
ok: boolean;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface EvalSendOptions {
|
|
99
|
+
/** Absolute harness `cwd` for a new session (`SendMessageOptions.workspaceDir`). */
|
|
100
|
+
workspaceDir?: string;
|
|
101
|
+
/** Files seeded into the session workspace before the first turn. */
|
|
102
|
+
workspaceFiles?: Record<string, string>;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface EvalTestContext {
|
|
106
|
+
/** Send a turn and wait until the session parks (or fails). */
|
|
107
|
+
send(message: string, options?: EvalSendOptions): Promise<EvalTurnResult>;
|
|
108
|
+
/** Last assistant text, or null before the first send. */
|
|
109
|
+
readonly reply: string | null;
|
|
110
|
+
readonly sessionId: string | undefined;
|
|
111
|
+
/** All events captured so far across turns. */
|
|
112
|
+
readonly events: SessionEvent[];
|
|
113
|
+
/** Gate: run did not fail. */
|
|
114
|
+
succeeded(): void;
|
|
115
|
+
/** Gate: at least one completed call to `name`. */
|
|
116
|
+
calledTool(name: string): void;
|
|
117
|
+
/** Gate: no call to `name`. */
|
|
118
|
+
notCalledTool(name: string): void;
|
|
119
|
+
/** Gate: joined assistant text matches. */
|
|
120
|
+
messageIncludes(token: string | RegExp): void;
|
|
121
|
+
/** Gate a value with an {@link Expectation} builder. */
|
|
122
|
+
check(value: unknown, assertion: Expectation): void;
|
|
123
|
+
/** Debug line (surfaced under `agent-serve eval --verbose`). */
|
|
124
|
+
log(message: string): void;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** One runnable datapoint inside a multi-case {@link defineEval} file. */
|
|
128
|
+
export interface EvalDatapoint {
|
|
129
|
+
/**
|
|
130
|
+
* Path segment under the file id. Must be a single segment (no `/`).
|
|
131
|
+
* Full case id = `<fileId>/<id>` (e.g. file `weather.eval.ts` + `nyc` →
|
|
132
|
+
* `weather/nyc`).
|
|
133
|
+
*/
|
|
134
|
+
id: string;
|
|
135
|
+
description?: string;
|
|
136
|
+
tags?: string[];
|
|
137
|
+
timeoutMs?: number;
|
|
138
|
+
test: (t: EvalTestContext) => Promise<void>;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Eval file config. Provide either a single {@link test} or a {@link cases}
|
|
143
|
+
* array — not both.
|
|
144
|
+
*/
|
|
145
|
+
export interface EvalConfig {
|
|
146
|
+
description?: string;
|
|
147
|
+
tags?: string[];
|
|
148
|
+
timeoutMs?: number;
|
|
149
|
+
/** Single-datapoint shorthand. Case id = file path under `evals/`. */
|
|
150
|
+
test?: (t: EvalTestContext) => Promise<void>;
|
|
151
|
+
/** Multiple datapoints in this file. Each id = `<fileId>/<case.id>`. */
|
|
152
|
+
cases?: EvalDatapoint[];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Normalized single datapoint used by the runner after discovery. */
|
|
156
|
+
export interface EvalCaseDefinition {
|
|
157
|
+
description?: string;
|
|
158
|
+
tags?: string[];
|
|
159
|
+
timeoutMs?: number;
|
|
160
|
+
test: (t: EvalTestContext) => Promise<void>;
|
|
161
|
+
readonly __agentServe: "eval";
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export type EvalDefinition = EvalConfig & { readonly __agentServe: "eval" };
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Author an eval file. The path under `evals/` is the file id:
|
|
168
|
+
* `evals/weather.eval.ts` → `weather`. With a single `test`, that is also
|
|
169
|
+
* the case id. With `cases`, each datapoint is `<fileId>/<case.id>`.
|
|
170
|
+
*/
|
|
171
|
+
export function defineEval(config: EvalConfig): EvalDefinition {
|
|
172
|
+
const hasTest = typeof config.test === "function";
|
|
173
|
+
const hasCases = config.cases !== undefined;
|
|
174
|
+
if (hasTest && hasCases) {
|
|
175
|
+
throw new Error("defineEval: set either test or cases, not both");
|
|
176
|
+
}
|
|
177
|
+
if (!hasTest && !hasCases) {
|
|
178
|
+
throw new Error("defineEval requires test(t) or a non-empty cases array");
|
|
179
|
+
}
|
|
180
|
+
if (hasCases) {
|
|
181
|
+
if (!Array.isArray(config.cases) || config.cases.length === 0) {
|
|
182
|
+
throw new Error("defineEval: cases must be a non-empty array");
|
|
183
|
+
}
|
|
184
|
+
const seen = new Set<string>();
|
|
185
|
+
for (const datapoint of config.cases) {
|
|
186
|
+
validateDatapointId(datapoint.id);
|
|
187
|
+
if (seen.has(datapoint.id)) {
|
|
188
|
+
throw new Error(
|
|
189
|
+
`defineEval: duplicate case id ${JSON.stringify(datapoint.id)}`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
seen.add(datapoint.id);
|
|
193
|
+
if (typeof datapoint.test !== "function") {
|
|
194
|
+
throw new Error(
|
|
195
|
+
`defineEval: cases[${JSON.stringify(datapoint.id)}] requires test(t)`
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return brandDefinition("eval", config);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function validateDatapointId(id: unknown): asserts id is string {
|
|
204
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
205
|
+
throw new Error("defineEval: each case needs a non-empty string id");
|
|
206
|
+
}
|
|
207
|
+
if (id.includes("/") || id.includes("\\") || id.includes("..")) {
|
|
208
|
+
throw new Error(
|
|
209
|
+
`defineEval: case id must be a single path segment (got ${JSON.stringify(id)})`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Expand a file-level definition into runnable datapoints.
|
|
216
|
+
* Exported for tests and tooling.
|
|
217
|
+
*/
|
|
218
|
+
export function expandEvalDefinition(
|
|
219
|
+
fileId: string,
|
|
220
|
+
definition: EvalDefinition
|
|
221
|
+
): Array<{ id: string; definition: EvalCaseDefinition }> {
|
|
222
|
+
if (definition.cases !== undefined) {
|
|
223
|
+
return definition.cases.map((datapoint) => {
|
|
224
|
+
const description = datapoint.description ?? definition.description;
|
|
225
|
+
const timeoutMs = datapoint.timeoutMs ?? definition.timeoutMs;
|
|
226
|
+
return {
|
|
227
|
+
id: `${fileId}/${datapoint.id}`,
|
|
228
|
+
definition: brandDefinition("eval", {
|
|
229
|
+
...(description !== undefined ? { description } : {}),
|
|
230
|
+
tags: datapoint.tags ?? definition.tags,
|
|
231
|
+
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
232
|
+
test: datapoint.test,
|
|
233
|
+
}),
|
|
234
|
+
};
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (typeof definition.test !== "function") {
|
|
238
|
+
throw new Error(`defineEval(${fileId}): missing test(t)`);
|
|
239
|
+
}
|
|
240
|
+
return [
|
|
241
|
+
{
|
|
242
|
+
id: fileId,
|
|
243
|
+
definition: brandDefinition("eval", {
|
|
244
|
+
...(definition.description !== undefined
|
|
245
|
+
? { description: definition.description }
|
|
246
|
+
: {}),
|
|
247
|
+
...(definition.tags !== undefined ? { tags: definition.tags } : {}),
|
|
248
|
+
...(definition.timeoutMs !== undefined
|
|
249
|
+
? { timeoutMs: definition.timeoutMs }
|
|
250
|
+
: {}),
|
|
251
|
+
test: definition.test,
|
|
252
|
+
}),
|
|
253
|
+
},
|
|
254
|
+
];
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Whether a discovered case id matches a CLI filter.
|
|
259
|
+
* - exact datapoint: `weather/nyc`
|
|
260
|
+
* - whole file / prefix: `weather` selects `weather`, `weather/nyc`, …
|
|
261
|
+
* - multiple filters: OR
|
|
262
|
+
*/
|
|
263
|
+
export function matchesEvalIdFilter(caseId: string, filter: string): boolean {
|
|
264
|
+
return caseId === filter || caseId.startsWith(`${filter}/`);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Hard ceiling for concurrent eval cases.
|
|
269
|
+
*
|
|
270
|
+
* Each case issues model provider requests; unbounded parallelism would
|
|
271
|
+
* overwhelm provider rate limits and exhaust local API quota.
|
|
272
|
+
*/
|
|
273
|
+
export const EVAL_MAX_CONCURRENCY_LIMIT = 200;
|
|
274
|
+
|
|
275
|
+
/** Default playground batches kept in the serve process when `maxPlaygroundRuns` is omitted. */
|
|
276
|
+
export const EVAL_DEFAULT_MAX_PLAYGROUND_RUNS = 20;
|
|
277
|
+
|
|
278
|
+
/** Hard ceiling for {@link EvalConfigFile.maxPlaygroundRuns}. */
|
|
279
|
+
export const EVAL_MAX_PLAYGROUND_RUNS = 500;
|
|
280
|
+
|
|
281
|
+
export type EvalCaseRunStatus = "pending" | "running" | "done";
|
|
282
|
+
export type EvalBatchStatus = "running" | "completed" | "failed";
|
|
283
|
+
|
|
284
|
+
/** One case inside a playground / HTTP eval batch snapshot. */
|
|
285
|
+
export interface EvalCaseSnapshot {
|
|
286
|
+
id: string;
|
|
287
|
+
fileId: string;
|
|
288
|
+
description?: string;
|
|
289
|
+
tags?: string[];
|
|
290
|
+
status: EvalCaseRunStatus;
|
|
291
|
+
ok?: boolean;
|
|
292
|
+
assertions?: EvalAssertionResult[];
|
|
293
|
+
sessionId?: string;
|
|
294
|
+
durationMs?: number;
|
|
295
|
+
error?: string;
|
|
296
|
+
logs?: string[];
|
|
297
|
+
inputs?: string[];
|
|
298
|
+
finalText?: string;
|
|
299
|
+
tools?: string[];
|
|
300
|
+
toolCalls?: Array<{
|
|
301
|
+
toolName: string;
|
|
302
|
+
args?: unknown;
|
|
303
|
+
output?: unknown;
|
|
304
|
+
isError: boolean;
|
|
305
|
+
}>;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/** Playground / HTTP snapshot of one eval batch (`POST /v1/dev/evals/runs`). */
|
|
309
|
+
export interface EvalRunSnapshot {
|
|
310
|
+
runId: string;
|
|
311
|
+
status: EvalBatchStatus;
|
|
312
|
+
startedAt: string;
|
|
313
|
+
finishedAt?: string;
|
|
314
|
+
error?: string;
|
|
315
|
+
summary: { passed: number; failed: number; total: number; done: number };
|
|
316
|
+
cases: EvalCaseSnapshot[];
|
|
317
|
+
config: {
|
|
318
|
+
maxConcurrency?: number;
|
|
319
|
+
timeoutMs?: number;
|
|
320
|
+
maxPlaygroundRuns?: number;
|
|
321
|
+
durableRuns?: boolean;
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/** Context passed to {@link EvalRunPersistence} hooks. */
|
|
326
|
+
export interface EvalRunPersistContext {
|
|
327
|
+
/** Absolute agent project root (directory that contains `evals/`). */
|
|
328
|
+
projectRoot: string;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Durable store for playground eval batches. Without {@link EvalConfigFile.persistRuns},
|
|
333
|
+
* runs live only in the serve process memory — lost on restart, and capped by
|
|
334
|
+
* {@link EvalConfigFile.maxPlaygroundRuns} (default {@link EVAL_DEFAULT_MAX_PLAYGROUND_RUNS}).
|
|
335
|
+
*
|
|
336
|
+
* Implement your own (S3, DB, …) or use {@link persistEvalRunsToDir}.
|
|
337
|
+
* `delete` is required so {@link EvalConfigFile.maxPlaygroundRuns} can prune
|
|
338
|
+
* durable history (otherwise pruned rows reload on the next hydrate).
|
|
339
|
+
*/
|
|
340
|
+
export interface EvalRunPersistence {
|
|
341
|
+
/** Load saved runs (any order). Called once when the serve process hydrates. */
|
|
342
|
+
load(
|
|
343
|
+
ctx: EvalRunPersistContext
|
|
344
|
+
): EvalRunSnapshot[] | Promise<EvalRunSnapshot[]>;
|
|
345
|
+
/**
|
|
346
|
+
* Persist a full snapshot. Called when a batch starts, after each case
|
|
347
|
+
* finishes, and when the batch completes or fails.
|
|
348
|
+
*/
|
|
349
|
+
save(run: EvalRunSnapshot, ctx: EvalRunPersistContext): void | Promise<void>;
|
|
350
|
+
/** Remove a run that falls outside {@link EvalConfigFile.maxPlaygroundRuns}. */
|
|
351
|
+
delete(runId: string, ctx: EvalRunPersistContext): void | Promise<void>;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export interface EvalConfigFile {
|
|
355
|
+
timeoutMs?: number;
|
|
356
|
+
/**
|
|
357
|
+
* Max number of eval cases to run in parallel. Required.
|
|
358
|
+
* Hard-capped at {@link EVAL_MAX_CONCURRENCY_LIMIT} due to model provider
|
|
359
|
+
* request limits.
|
|
360
|
+
*/
|
|
361
|
+
maxConcurrency: number;
|
|
362
|
+
/**
|
|
363
|
+
* Optional. Max batches kept in the **playground / `/v1/dev/evals*`**
|
|
364
|
+
* history window (in-memory, and pruned from {@link persistRuns} via
|
|
365
|
+
* {@link EvalRunPersistence.delete}).
|
|
366
|
+
* Does not affect `agent-serve eval` CLI runs.
|
|
367
|
+
*
|
|
368
|
+
* Default {@link EVAL_DEFAULT_MAX_PLAYGROUND_RUNS}; hard-capped at
|
|
369
|
+
* {@link EVAL_MAX_PLAYGROUND_RUNS}. Newest batches win.
|
|
370
|
+
*/
|
|
371
|
+
maxPlaygroundRuns?: number;
|
|
372
|
+
/**
|
|
373
|
+
* Optional durable store for playground eval batches. Omit this and runs
|
|
374
|
+
* are **not** surviving process restart (only the in-memory
|
|
375
|
+
* {@link maxPlaygroundRuns} window).
|
|
376
|
+
*
|
|
377
|
+
* ```ts
|
|
378
|
+
* import {
|
|
379
|
+
* defineEvalConfig,
|
|
380
|
+
* persistEvalRunsToDir,
|
|
381
|
+
* } from "@anysphere/agent-serve/evals";
|
|
382
|
+
*
|
|
383
|
+
* export default defineEvalConfig({
|
|
384
|
+
* maxConcurrency: 20,
|
|
385
|
+
* maxPlaygroundRuns: 50,
|
|
386
|
+
* // Survive serve restarts (relative to the agent project root):
|
|
387
|
+
* persistRuns: persistEvalRunsToDir(".agent-serve/eval-runs"),
|
|
388
|
+
* });
|
|
389
|
+
* ```
|
|
390
|
+
*/
|
|
391
|
+
persistRuns?: EvalRunPersistence;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Defaults for every eval under `evals/` (`evals/evals.config.ts`).
|
|
396
|
+
* `maxConcurrency` is required (1–{@link EVAL_MAX_CONCURRENCY_LIMIT}).
|
|
397
|
+
*
|
|
398
|
+
* Playground batches default to **in-memory only** (see {@link maxPlaygroundRuns} /
|
|
399
|
+
* {@link persistRuns}).
|
|
400
|
+
*/
|
|
401
|
+
export function defineEvalConfig(config: EvalConfigFile): EvalConfigFile {
|
|
402
|
+
const persistRuns = normalizePersistRuns(config.persistRuns);
|
|
403
|
+
return {
|
|
404
|
+
...(config.timeoutMs === undefined ? {} : { timeoutMs: config.timeoutMs }),
|
|
405
|
+
maxConcurrency: normalizeEvalMaxConcurrency(config.maxConcurrency),
|
|
406
|
+
maxPlaygroundRuns: normalizeEvalMaxPlaygroundRuns(
|
|
407
|
+
config.maxPlaygroundRuns ?? EVAL_DEFAULT_MAX_PLAYGROUND_RUNS
|
|
408
|
+
),
|
|
409
|
+
...(persistRuns === undefined ? {} : { persistRuns }),
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Validate and enforce the hard concurrency ceiling.
|
|
415
|
+
*/
|
|
416
|
+
export function normalizeEvalMaxConcurrency(value: unknown): number {
|
|
417
|
+
return normalizePositiveInt(value, {
|
|
418
|
+
label: "evals.config.ts: maxConcurrency",
|
|
419
|
+
max: EVAL_MAX_CONCURRENCY_LIMIT,
|
|
420
|
+
maxMessage: `evals.config.ts: maxConcurrency ${String(value)} exceeds the hard limit of ${EVAL_MAX_CONCURRENCY_LIMIT} (model provider request limits)`,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/** Validate {@link EvalConfigFile.maxPlaygroundRuns}. */
|
|
425
|
+
export function normalizeEvalMaxPlaygroundRuns(value: unknown): number {
|
|
426
|
+
return normalizePositiveInt(value, {
|
|
427
|
+
label: "evals.config.ts: maxPlaygroundRuns",
|
|
428
|
+
max: EVAL_MAX_PLAYGROUND_RUNS,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Effective playground history window. Invalid values fall back to
|
|
434
|
+
* {@link EVAL_DEFAULT_MAX_PLAYGROUND_RUNS} (same as a missing field).
|
|
435
|
+
*/
|
|
436
|
+
export function resolveEvalMaxPlaygroundRuns(value: unknown): number {
|
|
437
|
+
if (value === undefined) {
|
|
438
|
+
return EVAL_DEFAULT_MAX_PLAYGROUND_RUNS;
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
return normalizeEvalMaxPlaygroundRuns(value);
|
|
442
|
+
} catch {
|
|
443
|
+
return EVAL_DEFAULT_MAX_PLAYGROUND_RUNS;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function normalizePersistRuns(
|
|
448
|
+
value: EvalRunPersistence | undefined
|
|
449
|
+
): EvalRunPersistence | undefined {
|
|
450
|
+
if (value === undefined) {
|
|
451
|
+
return undefined;
|
|
452
|
+
}
|
|
453
|
+
if (
|
|
454
|
+
typeof value !== "object" ||
|
|
455
|
+
value === null ||
|
|
456
|
+
typeof value.load !== "function" ||
|
|
457
|
+
typeof value.save !== "function" ||
|
|
458
|
+
typeof value.delete !== "function"
|
|
459
|
+
) {
|
|
460
|
+
throw new Error(
|
|
461
|
+
"evals.config.ts: persistRuns must define load(ctx), save(run, ctx), and delete(runId, ctx)"
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
return value;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Filesystem {@link EvalRunPersistence}: one JSON file per run under `dir`
|
|
469
|
+
* (relative paths resolve against the agent project root).
|
|
470
|
+
*
|
|
471
|
+
* ```ts
|
|
472
|
+
* export default defineEvalConfig({
|
|
473
|
+
* maxConcurrency: 20,
|
|
474
|
+
* persistRuns: persistEvalRunsToDir(".agent-serve/eval-runs"),
|
|
475
|
+
* });
|
|
476
|
+
* ```
|
|
477
|
+
*/
|
|
478
|
+
export function persistEvalRunsToDir(dir: string): EvalRunPersistence {
|
|
479
|
+
const relativeDir = assertNonEmptyDir(dir, "persistEvalRunsToDir");
|
|
480
|
+
const resolveDir = (projectRoot: string): string =>
|
|
481
|
+
resolveProjectRelativeDir({ dir: relativeDir, projectRoot });
|
|
482
|
+
|
|
483
|
+
return {
|
|
484
|
+
async load(ctx) {
|
|
485
|
+
return readJsonDir<EvalRunSnapshot>(resolveDir(ctx.projectRoot));
|
|
486
|
+
},
|
|
487
|
+
async save(run, ctx) {
|
|
488
|
+
await writeJsonFile({
|
|
489
|
+
root: resolveDir(ctx.projectRoot),
|
|
490
|
+
fileName: `${run.runId}.json`,
|
|
491
|
+
value: run,
|
|
492
|
+
});
|
|
493
|
+
},
|
|
494
|
+
async delete(runId, ctx) {
|
|
495
|
+
await deleteFileInDir({
|
|
496
|
+
root: resolveDir(ctx.projectRoot),
|
|
497
|
+
fileName: `${runId}.json`,
|
|
498
|
+
});
|
|
499
|
+
},
|
|
500
|
+
};
|
|
501
|
+
}
|
package/src/hooks.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineHook` — authored at `agent/hooks/<slug>.ts`.
|
|
3
|
+
*
|
|
4
|
+
* Hooks subscribe to the session event stream and run side effects after
|
|
5
|
+
* each event is durably recorded (audit logging, metrics, persisting
|
|
6
|
+
* transcripts to your own database). Handlers are observe-only.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { defineHook } from "@anysphere/agent-serve/hooks";
|
|
10
|
+
*
|
|
11
|
+
* export default defineHook({
|
|
12
|
+
* events: {
|
|
13
|
+
* async "turn.completed"(event, ctx) {
|
|
14
|
+
* console.log("turn done", ctx.session.id, event.data.usage);
|
|
15
|
+
* },
|
|
16
|
+
* },
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { brandDefinition } from "./internal/brand.js";
|
|
22
|
+
import type { HookConfig, HookDefinition } from "./types.js";
|
|
23
|
+
|
|
24
|
+
export type {
|
|
25
|
+
HookConfig,
|
|
26
|
+
HookContext,
|
|
27
|
+
HookDefinition,
|
|
28
|
+
HookHandler,
|
|
29
|
+
} from "./types.js";
|
|
30
|
+
|
|
31
|
+
export function defineHook(config: HookConfig): HookDefinition {
|
|
32
|
+
return brandDefinition("hook", config);
|
|
33
|
+
}
|