@cursor/july 0.1.108 → 0.1.109
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 +2 -6
- package/README.md +3 -6
- package/dist/channels/bitbucket/api.d.ts +41 -0
- package/dist/channels/bitbucket/api.d.ts.map +1 -1
- package/dist/channels/bitbucket/api.js +260 -0
- package/dist/channels/bitbucket/binding.d.ts +4 -0
- package/dist/channels/bitbucket/binding.d.ts.map +1 -1
- package/dist/channels/bitbucket/binding.js +16 -0
- package/dist/channels/bitbucket/index.d.ts +1 -1
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +1 -1
- package/dist/channels/gitlab/api.d.ts +27 -0
- package/dist/channels/gitlab/api.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +88 -0
- package/dist/channels/gitlab/binding.d.ts +5 -0
- package/dist/channels/gitlab/binding.d.ts.map +1 -1
- package/dist/channels/gitlab/binding.js +10 -0
- package/dist/channels/gitlab/index.d.ts +1 -1
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +1 -1
- package/dist/channels/slack/dispatch.d.ts +10 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +20 -3
- package/dist/channels/slack/slack-channel.d.ts +12 -5
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +59 -8
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BASKM3M4.js → app.Cr-wVbnB.js} +1 -1
- package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.js → building-with-agents.md.D0KbSkJn.js} +2 -2
- package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.lean.js → building-with-agents.md.D0KbSkJn.lean.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CFVQ4S17.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BOKxlYGP.js → VPLocalSearchBox.CVQERt56.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DbDZW-zb.js → theme.Dnsd3XOn.js} +2 -2
- package/dist/docs/assets/concepts.md.B4o63Gul.js +1 -0
- package/dist/docs/assets/evals.md.C7JLjoEP.js +211 -0
- package/dist/docs/assets/evals.md.C7JLjoEP.lean.js +1 -0
- package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.js +10 -0
- package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.lean.js +1 -0
- package/dist/docs/assets/{guides_github.md.BH33UEBJ.js → guides_github.md.TZaTZlfz.js} +13 -3
- package/dist/docs/assets/{guides_github.md.BH33UEBJ.lean.js → guides_github.md.TZaTZlfz.lean.js} +1 -1
- package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.js +14 -0
- package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.lean.js +1 -0
- package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.js → guides_webhooks.md.CJK484ex.js} +2 -2
- package/dist/docs/assets/{hillclimbing.md.CpTGTCle.js → hillclimbing.md.BOiVo1tf.js} +1 -1
- package/dist/docs/assets/index.md.DD9Q2XuJ.js +5 -0
- package/dist/docs/assets/{index.md.BjH1w2ZW.lean.js → index.md.DD9Q2XuJ.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.D-qTqwcq.js → reference_channels.md.CAo-iK4j.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.D-qTqwcq.lean.js → reference_channels.md.CAo-iK4j.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.Ca26u0Es.js → reference_cli.md.Deg7849l.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CPWt00ds.js → reference_extensions.md.ZAVUyuEX.js} +2 -2
- package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.js → reference_hooks.md.BlM_bOg6.js} +3 -3
- package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.lean.js → reference_hooks.md.BlM_bOg6.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.oySXBO8o.js → reference_http-api.md.BwaCo-VO.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.4myJPxrf.js → reference_playground.md.DLnoaczX.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.4myJPxrf.lean.js → reference_playground.md.DLnoaczX.lean.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.DuBu9a96.js → reference_project-layout.md.BEU8MtQV.js} +3 -3
- package/dist/docs/assets/{reference_project-layout.md.DuBu9a96.lean.js → reference_project-layout.md.BEU8MtQV.lean.js} +1 -1
- package/dist/docs/assets/reference_sessions.md.CyXV1MUw.js +1 -0
- package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.js +35 -0
- package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.lean.js +1 -0
- package/dist/docs/assets/{skills_evals.md.BhovOvrl.js → skills_evals.md.DFxYPErF.js} +3 -3
- package/dist/docs/assets/skills_evals.md.DFxYPErF.lean.js +1 -0
- package/dist/docs/assets/{skills_framework-map.md.D-tFZhFS.js → skills_framework-map.md.BxLSOhSY.js} +1 -1
- package/dist/docs/assets/skills_index.md.DL7EHaQ-.js +1 -0
- package/dist/docs/assets/skills_index.md.DL7EHaQ-.lean.js +1 -0
- package/dist/docs/assets/{storage.md.BOHeqk2M.js → storage.md.BUrhJ-Zz.js} +4 -4
- package/dist/docs/assets/{storage.md.BOHeqk2M.lean.js → storage.md.BUrhJ-Zz.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +5 -5
- package/dist/docs/building-with-agents.md +3 -2
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/concepts.md +2 -4
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/evals.html +161 -35
- package/dist/docs/evals.md +612 -297
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/bitbucket.html +36 -0
- package/dist/docs/guides/bitbucket.md +84 -0
- package/dist/docs/guides/cloud-agents.html +4 -4
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +17 -7
- package/dist/docs/guides/github.md +31 -0
- package/dist/docs/guides/gitlab.html +40 -0
- package/dist/docs/guides/gitlab.md +92 -0
- package/dist/docs/guides/grokbot-agents.html +4 -4
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/improve.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +4 -4
- package/dist/docs/guides/opentelemetry.html +4 -4
- package/dist/docs/guides/slack.html +5 -5
- package/dist/docs/guides/webhooks.html +6 -6
- package/dist/docs/guides/webhooks.md +4 -2
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +6 -6
- package/dist/docs/hillclimbing.md +2 -2
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +10 -6
- package/dist/docs/llms-full.txt +1113 -778
- package/dist/docs/llms.txt +6 -5
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +6 -6
- package/dist/docs/reference/channels.md +16 -3
- package/dist/docs/reference/cli.html +6 -6
- package/dist/docs/reference/cli.md +6 -4
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/extensions.html +7 -7
- package/dist/docs/reference/extensions.md +0 -3
- package/dist/docs/reference/hooks.html +7 -7
- package/dist/docs/reference/hooks.md +9 -12
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/http-api.md +2 -3
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +5 -5
- package/dist/docs/reference/playground.md +0 -4
- package/dist/docs/reference/project-layout.html +7 -7
- package/dist/docs/reference/project-layout.md +1 -8
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/result.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/sessions.md +1 -2
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +4 -4
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/skills/create-agent.html +4 -4
- package/dist/docs/skills/debug.html +4 -4
- package/dist/docs/skills/deploy.html +61 -0
- package/dist/docs/skills/deploy.md +161 -0
- package/dist/docs/skills/evals.html +8 -8
- package/dist/docs/skills/evals.md +44 -6
- package/dist/docs/skills/framework-map.html +5 -5
- package/dist/docs/skills/framework-map.md +1 -2
- package/dist/docs/skills/github.html +4 -4
- package/dist/docs/skills/hillclimb.html +4 -4
- package/dist/docs/skills/index.html +6 -6
- package/dist/docs/skills/index.md +1 -1
- package/dist/docs/skills/mcp-auth.html +4 -4
- package/dist/docs/skills/otel.html +4 -4
- package/dist/docs/skills/setup-slack.html +4 -4
- package/dist/docs/storage.html +8 -8
- package/dist/docs/storage.md +15 -24
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +4 -4
- package/dist/docs/templates/code-wiki.html +4 -4
- package/dist/docs/templates/demo.html +4 -4
- package/dist/docs/templates/grokbot-agents.html +4 -4
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +4 -4
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/extensions.d.ts +2 -3
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +2 -5
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/internal/authored-alias-hooks.d.ts +5 -0
- package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
- package/dist/internal/authored-alias-hooks.js +17 -0
- package/dist/internal/authored-loaders.d.ts +4 -0
- package/dist/internal/authored-loaders.d.ts.map +1 -1
- package/dist/internal/authored-loaders.js +21 -2
- package/dist/internal/cli-ax.d.ts +1 -2
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +1 -2
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +2 -2
- package/dist/internal/continuation-identity.js +8 -3
- package/dist/internal/discovery/agent.d.ts +1 -1
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +0 -5
- package/dist/internal/discovery/extension-overlay.d.ts +1 -2
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
- package/dist/internal/discovery/extension-overlay.js +0 -14
- package/dist/internal/discovery/extensions.d.ts +1 -2
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +4 -22
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +42 -24
- package/dist/internal/discovery/modules.js +0 -1
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +0 -16
- package/dist/internal/eval-runner.js +0 -1
- package/dist/internal/framework-file-storage.d.ts +4 -5
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +4 -5
- package/dist/internal/framework-storage-selection.d.ts +2 -2
- package/dist/internal/framework-storage-selection.js +2 -2
- package/dist/internal/init-scaffold.d.ts.map +1 -1
- package/dist/internal/init-scaffold.js +1 -2
- package/dist/internal/install-cursor-skills.d.ts +5 -2
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +25 -5
- package/dist/internal/run-client.d.ts +1 -1
- package/dist/internal/sdk-runner.js +1 -1
- package/dist/internal/server.js +0 -14
- package/dist/internal/session-engine.d.ts +5 -35
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +17 -162
- package/dist/internal/storage-coordinator.d.ts +5 -19
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +3 -62
- package/dist/internal/storage-roles.d.ts +4 -9
- package/dist/internal/storage-roles.d.ts.map +1 -1
- package/dist/internal/storage-roles.js +2 -2
- package/dist/playground/assets/index-Bhxzrcf6.css +1 -0
- package/dist/playground/assets/index-CqLX5uF3.js +67 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted-v2.d.ts +4 -5
- package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted-v2.js +4 -5
- package/dist/storage-backends/cursor-hosted.d.ts +1 -2
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +0 -30
- package/dist/storage-backends/file-kv.d.ts +9 -12
- package/dist/storage-backends/file-kv.d.ts.map +1 -1
- package/dist/storage-backends/file-kv.js +11 -47
- package/dist/storage-protocol.d.ts +3 -11
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +3 -11
- package/dist/storage.d.ts +8 -36
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +8 -44
- package/dist/types.d.ts +20 -57
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +10 -6
- package/docs/building-with-agents.md +3 -2
- package/docs/concepts.md +2 -4
- package/docs/evals.md +613 -298
- package/docs/guides/bitbucket.md +89 -0
- package/docs/guides/github.md +31 -0
- package/docs/guides/gitlab.md +97 -0
- package/docs/guides/webhooks.md +4 -2
- package/docs/hillclimbing.md +2 -2
- package/docs/reference/channels.md +16 -3
- package/docs/reference/cli.md +6 -4
- package/docs/reference/extensions.md +0 -3
- package/docs/reference/hooks.md +9 -12
- package/docs/reference/http-api.md +2 -3
- package/docs/reference/playground.md +0 -4
- package/docs/reference/project-layout.md +1 -8
- package/docs/reference/sessions.md +1 -2
- package/docs/skills/index.md +2 -2
- package/docs/storage.md +15 -24
- package/package.json +1 -7
- package/skills/deploy/SKILL.md +169 -0
- package/skills/evals/SKILL.md +45 -8
- package/skills/framework-map/SKILL.md +1 -2
- package/src/channels/bitbucket/api.ts +341 -0
- package/src/channels/bitbucket/binding.ts +25 -0
- package/src/channels/bitbucket/index.ts +2 -0
- package/src/channels/gitlab/api.ts +123 -0
- package/src/channels/gitlab/binding.ts +12 -0
- package/src/channels/gitlab/index.ts +1 -0
- package/src/channels/slack/dispatch.ts +30 -0
- package/src/channels/slack/slack-channel.ts +69 -7
- package/src/extensions.ts +2 -6
- package/src/index.ts +0 -3
- package/src/internal/authored-alias-hooks.ts +32 -0
- package/src/internal/authored-loaders.ts +26 -2
- package/src/internal/cli-ax.ts +1 -2
- package/src/internal/continuation-channel.ts +2 -1
- package/src/internal/continuation-identity.ts +10 -2
- package/src/internal/discovery/agent.ts +1 -7
- package/src/internal/discovery/extension-overlay.ts +0 -18
- package/src/internal/discovery/extensions.ts +2 -26
- package/src/internal/discovery/info.ts +3 -13
- package/src/internal/discovery/modules.ts +0 -1
- package/src/internal/discovery/project.ts +0 -16
- package/src/internal/eval-runner.ts +0 -1
- package/src/internal/framework-file-storage.ts +4 -5
- package/src/internal/framework-storage-selection.ts +2 -2
- package/src/internal/init-scaffold.ts +1 -2
- package/src/internal/install-cursor-skills.ts +38 -5
- package/src/internal/run-client.ts +1 -1
- package/src/internal/sdk-runner.ts +1 -1
- package/src/internal/server.ts +0 -16
- package/src/internal/session-engine.ts +14 -202
- package/src/internal/storage-coordinator.ts +5 -76
- package/src/internal/storage-roles.ts +4 -9
- package/src/storage-backends/cursor-hosted-v2.ts +4 -7
- package/src/storage-backends/cursor-hosted.ts +0 -37
- package/src/storage-backends/file-kv.ts +10 -51
- package/src/storage-protocol.ts +3 -17
- package/src/storage.ts +10 -101
- package/src/types.ts +19 -56
- package/templates/demo/README.md +10 -6
- package/templates/demo/agent/channels/github.ts +2 -0
- package/templates/demo/agent/channels/queue.ts +6 -2
- package/templates/demo/agent/lib/repos.ts +5 -0
- package/templates/demo/init.json +25 -0
- package/dist/ab.d.ts +0 -209
- package/dist/ab.d.ts.map +0 -1
- package/dist/ab.js +0 -246
- package/dist/docs/ab.html +0 -80
- package/dist/docs/ab.md +0 -332
- package/dist/docs/assets/ab.md.mlVgqvSk.js +0 -54
- package/dist/docs/assets/ab.md.mlVgqvSk.lean.js +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BHZYsNVi.js +0 -1
- package/dist/docs/assets/concepts.md.DgEcZOfT.js +0 -1
- package/dist/docs/assets/evals.md.C1ekS3k2.js +0 -85
- package/dist/docs/assets/evals.md.C1ekS3k2.lean.js +0 -1
- package/dist/docs/assets/index.md.BjH1w2ZW.js +0 -5
- package/dist/docs/assets/reference_sessions.md.CueyOHSL.js +0 -1
- package/dist/docs/assets/skills_ab.md.CsFNatVx.js +0 -26
- package/dist/docs/assets/skills_ab.md.CsFNatVx.lean.js +0 -1
- package/dist/docs/assets/skills_evals.md.BhovOvrl.lean.js +0 -1
- package/dist/docs/assets/skills_index.md.DKwIxzGg.js +0 -1
- package/dist/docs/assets/skills_index.md.DKwIxzGg.lean.js +0 -1
- package/dist/docs/skills/ab.html +0 -52
- package/dist/docs/skills/ab.md +0 -50
- package/dist/internal/ab-collector.d.ts +0 -44
- package/dist/internal/ab-collector.d.ts.map +0 -1
- package/dist/internal/ab-collector.js +0 -142
- package/dist/internal/ab-fold.d.ts +0 -36
- package/dist/internal/ab-fold.d.ts.map +0 -1
- package/dist/internal/ab-fold.js +0 -175
- package/dist/internal/ab-snapshot.d.ts +0 -68
- package/dist/internal/ab-snapshot.d.ts.map +0 -1
- package/dist/internal/ab-snapshot.js +0 -208
- package/dist/internal/discovery/ab.d.ts +0 -9
- package/dist/internal/discovery/ab.d.ts.map +0 -1
- package/dist/internal/discovery/ab.js +0 -113
- package/dist/playground/assets/index-BMDqAeXu.js +0 -67
- package/dist/playground/assets/index-LUgJoWdL.css +0 -1
- package/docs/ab.md +0 -337
- package/skills/ab/SKILL.md +0 -58
- package/src/ab.ts +0 -430
- package/src/internal/ab-collector.ts +0 -200
- package/src/internal/ab-fold.ts +0 -232
- package/src/internal/ab-snapshot.ts +0 -331
- package/src/internal/discovery/ab.ts +0 -131
- /package/dist/docs/assets/{concepts.md.DgEcZOfT.lean.js → concepts.md.B4o63Gul.lean.js} +0 -0
- /package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.lean.js → guides_webhooks.md.CJK484ex.lean.js} +0 -0
- /package/dist/docs/assets/{hillclimbing.md.CpTGTCle.lean.js → hillclimbing.md.BOiVo1tf.lean.js} +0 -0
- /package/dist/docs/assets/{reference_cli.md.Ca26u0Es.lean.js → reference_cli.md.Deg7849l.lean.js} +0 -0
- /package/dist/docs/assets/{reference_extensions.md.CPWt00ds.lean.js → reference_extensions.md.ZAVUyuEX.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.oySXBO8o.lean.js → reference_http-api.md.BwaCo-VO.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.CueyOHSL.lean.js → reference_sessions.md.CyXV1MUw.lean.js} +0 -0
- /package/dist/docs/assets/{skills_framework-map.md.D-tFZhFS.lean.js → skills_framework-map.md.BxLSOhSY.lean.js} +0 -0
|
@@ -18,7 +18,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
18
18
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
19
19
|
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
20
20
|
import { dirname, join } from "node:path";
|
|
21
|
-
import { mergeABInstructions, resolveABMaxPlaygroundSessions, resolveABSplit, } from "../ab.js";
|
|
22
21
|
import { SLACK_CHANNEL_ID } from "../channels/slack/constants.js";
|
|
23
22
|
import { materializeSlackNudgeCarrier } from "../channels/slack/nudge-carrier.js";
|
|
24
23
|
import { SlackAskDedupeStore, SlackNudgeStore, } from "../channels/slack/nudge-store.js";
|
|
@@ -28,9 +27,6 @@ import { cursorHostedFiles, isCursorHostedFilesAvailable, isCursorUserStoreFiles
|
|
|
28
27
|
import { isFileSystemToolAlias, isMutatingFileSystemTool, localFileSystem, resolveFileSystemTools, resolveHostHarnessToolOptions, tempFs, unionFs, writeWorkspaceFilesToRoot, } from "../filesystem.js";
|
|
29
28
|
import { storageKeysForArchitecture } from "../storage.js";
|
|
30
29
|
import { DEFAULT_MODEL, DIRECT_TOOL_CALL_CHANNEL_ID, isCursorAccountTransport, isHostOauthConnectionTransport, isSymbolicConnectionTransport, } from "../types.js";
|
|
31
|
-
import { ABCollector } from "./ab-collector.js";
|
|
32
|
-
import { foldABStream } from "./ab-fold.js";
|
|
33
|
-
import { buildABSnapshot } from "./ab-snapshot.js";
|
|
34
30
|
import { resolveAdvertisedTools, } from "./advertise-tools.js";
|
|
35
31
|
import { ApprovalGate } from "./approval-gate.js";
|
|
36
32
|
import { ArtifactsStore } from "./artifacts-store.js";
|
|
@@ -287,9 +283,6 @@ export class SessionEngine {
|
|
|
287
283
|
config: options.project.artifacts,
|
|
288
284
|
sink: managedV2Files === null || managedV2Files === void 0 ? void 0 : managedV2Files(),
|
|
289
285
|
});
|
|
290
|
-
this.abCollector = new ABCollector(options.project.abs, this.logger, (sessionId) => __awaiter(this, void 0, void 0, function* () { return (yield this.logs.get(sessionId)).snapshot(0); }),
|
|
291
|
-
// Samples flow to the defineStorage `abs` table (no-op without one).
|
|
292
|
-
{ persistSample: (sample) => { var _a; return (_a = this.storage) === null || _a === void 0 ? void 0 : _a.abSample(sample); } });
|
|
293
286
|
// Peer and Cursor-account transports are symbolic until the serve host
|
|
294
287
|
// resolves them; the host-side MCP registry starts with the concrete
|
|
295
288
|
// connections and gains the rest via setResolvedConnections.
|
|
@@ -667,7 +660,7 @@ export class SessionEngine {
|
|
|
667
660
|
const purpose = sendOptions.purpose === "eval" ? "eval" : "live";
|
|
668
661
|
const frozenAsOf = normalizeAsOf(sendOptions.asOf);
|
|
669
662
|
assertTimeArgs(this.project.agent.tools, frozenAsOf);
|
|
670
|
-
|
|
663
|
+
const record = {
|
|
671
664
|
sessionId: (_e = sendOptions.hostedSessionId) !== null && _e !== void 0 ? _e : newSessionId(),
|
|
672
665
|
channelId,
|
|
673
666
|
mode: (_f = sendOptions.mode) !== null && _f !== void 0 ? _f : "chat",
|
|
@@ -696,7 +689,6 @@ export class SessionEngine {
|
|
|
696
689
|
dryRun: record.dryRun === true ? true : undefined,
|
|
697
690
|
},
|
|
698
691
|
});
|
|
699
|
-
record = yield this.enrollABs(record);
|
|
700
692
|
const since = (yield this.logs.get(record.sessionId)).count;
|
|
701
693
|
yield this.startTurn(record.sessionId, message, Object.assign({ admission: (_h = sendOptions.admission) !== null && _h !== void 0 ? _h : "preempt" }, (sendOptions.coalesceSourceTs === undefined
|
|
702
694
|
? {}
|
|
@@ -754,85 +746,6 @@ export class SessionEngine {
|
|
|
754
746
|
return existing !== undefined;
|
|
755
747
|
});
|
|
756
748
|
}
|
|
757
|
-
/**
|
|
758
|
-
* Sticky A/B enrollment at session creation — before the first turn, so
|
|
759
|
-
* variants are in the durable stream (and on {@link SessionRecord.abs})
|
|
760
|
-
* ahead of model/instructions work. Failures persist as `variant: null`
|
|
761
|
-
* (sticky skip). Eval harness sessions (`purpose: "eval"`) are never
|
|
762
|
-
* enrolled.
|
|
763
|
-
*/
|
|
764
|
-
enrollABs(record) {
|
|
765
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
766
|
-
if (!this.abCollector.enabled || record.purpose === "eval") {
|
|
767
|
-
return record;
|
|
768
|
-
}
|
|
769
|
-
const sessionInfo = this.sessionInfo(record);
|
|
770
|
-
const abs = {};
|
|
771
|
-
for (const experiment of this.project.abs) {
|
|
772
|
-
const def = experiment.definition;
|
|
773
|
-
const variantKeys = Object.keys(def.variants);
|
|
774
|
-
let variant = null;
|
|
775
|
-
try {
|
|
776
|
-
variant = yield resolveABSplit(def.split, {
|
|
777
|
-
agent: { name: this.project.name },
|
|
778
|
-
channel: { id: record.channelId },
|
|
779
|
-
session: sessionInfo,
|
|
780
|
-
experiment: experiment.name,
|
|
781
|
-
variants: variantKeys,
|
|
782
|
-
});
|
|
783
|
-
if (variant !== null && !(variant in def.variants)) {
|
|
784
|
-
throw new Error(`split resolved to ${JSON.stringify(variant)}; expected one of ${variantKeys.join(", ")} or null to skip`);
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
catch (error) {
|
|
788
|
-
this.logger(`[agent-sdk] ab "${experiment.name}" enrollment failed (sticky skip): ${describeError(error)}`);
|
|
789
|
-
variant = null;
|
|
790
|
-
}
|
|
791
|
-
abs[experiment.name] = variant;
|
|
792
|
-
yield this.appendEvent(record.sessionId, {
|
|
793
|
-
type: "ab.assigned",
|
|
794
|
-
data: { experiment: experiment.name, variant },
|
|
795
|
-
});
|
|
796
|
-
}
|
|
797
|
-
return this.updateRecord(record.sessionId, (current) => (Object.assign(Object.assign({}, current), { abs })));
|
|
798
|
-
});
|
|
799
|
-
}
|
|
800
|
-
/**
|
|
801
|
-
* Ensure {@link SessionRecord.abs} is populated (hydrate from the durable
|
|
802
|
-
* `ab.assigned` stream when missing — e.g. older sessions after upgrade).
|
|
803
|
-
*/
|
|
804
|
-
ensureAbs(record) {
|
|
805
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
806
|
-
if (record.abs !== undefined || record.purpose === "eval") {
|
|
807
|
-
return record;
|
|
808
|
-
}
|
|
809
|
-
if (!this.abCollector.enabled) {
|
|
810
|
-
return record;
|
|
811
|
-
}
|
|
812
|
-
const events = yield this.listEvents(record.sessionId, 0);
|
|
813
|
-
const folded = foldABStream(events);
|
|
814
|
-
if (folded.arms.size === 0) {
|
|
815
|
-
return record;
|
|
816
|
-
}
|
|
817
|
-
const abs = Object.fromEntries(folded.arms);
|
|
818
|
-
return this.updateRecord(record.sessionId, (current) => (Object.assign(Object.assign({}, current), { abs })));
|
|
819
|
-
});
|
|
820
|
-
}
|
|
821
|
-
/**
|
|
822
|
-
* Agent config for this session: base project agent plus any per-variant
|
|
823
|
-
* `instructions` overlays from enrolled A/B arms.
|
|
824
|
-
*/
|
|
825
|
-
agentForSession(record) {
|
|
826
|
-
const base = this.project.agent;
|
|
827
|
-
const instructions = mergeABInstructions(base.instructions, record.abs, this.project.abs.map((experiment) => ({
|
|
828
|
-
name: experiment.name,
|
|
829
|
-
definition: experiment.definition,
|
|
830
|
-
})));
|
|
831
|
-
if (instructions === base.instructions) {
|
|
832
|
-
return base;
|
|
833
|
-
}
|
|
834
|
-
return Object.assign(Object.assign({}, base), { instructions });
|
|
835
|
-
}
|
|
836
749
|
/** Look up a session as a channel-scoped handle. */
|
|
837
750
|
getChannelSession(channelId, sessionId) {
|
|
838
751
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -1107,9 +1020,7 @@ export class SessionEngine {
|
|
|
1107
1020
|
this.pendingTurns.add(sessionId);
|
|
1108
1021
|
let lifecycleInstalled = false;
|
|
1109
1022
|
try {
|
|
1110
|
-
|
|
1111
|
-
// Arms must be on the record before tools/instructions see SessionInfo.
|
|
1112
|
-
record = yield this.ensureAbs(record);
|
|
1023
|
+
const record = yield this.updateRecord(sessionId, (current) => (Object.assign(Object.assign({}, current), { turnCount: current.turnCount + 1 })));
|
|
1113
1024
|
const turnId = `turn_${record.turnCount}`;
|
|
1114
1025
|
const isFirstTurn = record.turnCount === 1;
|
|
1115
1026
|
yield this.appendEvent(sessionId, {
|
|
@@ -1630,12 +1541,10 @@ export class SessionEngine {
|
|
|
1630
1541
|
emit({ type: "turn.started", data: {} });
|
|
1631
1542
|
try {
|
|
1632
1543
|
// Scaffold agent files into the session workspace even when the harness
|
|
1633
|
-
// cwd is overridden (e.g. a PR worktree).
|
|
1634
|
-
// overlays are applied via agentForSession.
|
|
1635
|
-
const agent = this.agentForSession(record);
|
|
1544
|
+
// cwd is overridden (e.g. a PR worktree).
|
|
1636
1545
|
if (!this.hasRootOverride()) {
|
|
1637
1546
|
yield materializeWorkspace({
|
|
1638
|
-
agent,
|
|
1547
|
+
agent: this.project.agent,
|
|
1639
1548
|
workspaceDir,
|
|
1640
1549
|
seed: isFirstTurn,
|
|
1641
1550
|
stateRoot: this.stateRoot,
|
|
@@ -1657,7 +1566,7 @@ export class SessionEngine {
|
|
|
1657
1566
|
const pendingFiles = record.pendingWorkspaceFiles;
|
|
1658
1567
|
const pendingImages = record.pendingImages;
|
|
1659
1568
|
const runtime = resolveSessionRuntime({
|
|
1660
|
-
agentRuntime: agent.runtime,
|
|
1569
|
+
agentRuntime: this.project.agent.runtime,
|
|
1661
1570
|
cloudOverride: record.cloudOverride,
|
|
1662
1571
|
});
|
|
1663
1572
|
const hasPendingFiles = pendingFiles !== undefined && Object.keys(pendingFiles).length > 0;
|
|
@@ -1688,7 +1597,7 @@ export class SessionEngine {
|
|
|
1688
1597
|
const instructionsInvisibleToHarness = isFirstTurn &&
|
|
1689
1598
|
(this.hasBorrowedWorkspace(record) ||
|
|
1690
1599
|
(yield isNestedInGitRepo(harnessCwd)));
|
|
1691
|
-
const request = yield this.buildTurnRequest(record,
|
|
1600
|
+
const request = yield this.buildTurnRequest(record, turnId, message, isFirstTurn, instructionsInvisibleToHarness, emit, eventContext, (update) => __awaiter(this, void 0, void 0, function* () {
|
|
1692
1601
|
const turn = this.turnRoots.get(sessionId);
|
|
1693
1602
|
if (turn !== undefined) {
|
|
1694
1603
|
update = yield applyWebScratchUpdate({
|
|
@@ -1983,10 +1892,11 @@ export class SessionEngine {
|
|
|
1983
1892
|
}
|
|
1984
1893
|
return undefined;
|
|
1985
1894
|
}
|
|
1986
|
-
buildTurnRequest(record,
|
|
1895
|
+
buildTurnRequest(record, turnId, prompt, isFirstTurn, instructionsInvisibleToHarness, emit, eventContext, onUpdate, signal, images) {
|
|
1987
1896
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1988
1897
|
var _a, _b, _c;
|
|
1989
1898
|
var _d;
|
|
1899
|
+
const agent = this.project.agent;
|
|
1990
1900
|
// Per-session cloud attach (channel/tool handoff) forces cloud runtime
|
|
1991
1901
|
// even when the agent defaults to local for chat server tools.
|
|
1992
1902
|
const runtime = resolveSessionRuntime({
|
|
@@ -2155,9 +2065,7 @@ export class SessionEngine {
|
|
|
2155
2065
|
}
|
|
2156
2066
|
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ sessionId: record.sessionId }, (record.sdkAgentId === undefined
|
|
2157
2067
|
? {}
|
|
2158
|
-
: { sdkAgentId: record.sdkAgentId })), { workspaceDir: this.harnessCwd(record), sandbox: authoredRoot
|
|
2159
|
-
? false
|
|
2160
|
-
: ((_c = this.project.agent.local) === null || _c === void 0 ? void 0 : _c.sandbox) === true }), (runtime === "local" && harnessTools !== undefined
|
|
2068
|
+
: { sdkAgentId: record.sdkAgentId })), { workspaceDir: this.harnessCwd(record), sandbox: authoredRoot ? false : ((_c = agent.local) === null || _c === void 0 ? void 0 : _c.sandbox) === true }), (runtime === "local" && harnessTools !== undefined
|
|
2161
2069
|
? Object.assign(Object.assign({}, (harnessTools.tools === undefined
|
|
2162
2070
|
? {}
|
|
2163
2071
|
: { tools: harnessTools.tools })), (harnessTools.disallowedTools === undefined
|
|
@@ -2173,7 +2081,7 @@ export class SessionEngine {
|
|
|
2173
2081
|
: undefined }), (runtime === "cloud" && !isCursorHostedFilesAvailable()
|
|
2174
2082
|
? { agentServeAgent: this.project.name }
|
|
2175
2083
|
: {})), { customTools: runtime === "local"
|
|
2176
|
-
? yield this.buildCustomTools(record,
|
|
2084
|
+
? yield this.buildCustomTools(record, turnId, emit, synthesized)
|
|
2177
2085
|
: {}, mcpServers: this.buildMcpServers(runtime, record.sessionId, yield this.evaluateConnectionAuth(record)) }), (runtime === "local" && this.hasAttachedAuthedConnections()
|
|
2178
2086
|
? { perSendMcpServers: true }
|
|
2179
2087
|
: {})), { subagents: buildRunnerSubagents(agent), onUpdate,
|
|
@@ -2397,8 +2305,9 @@ export class SessionEngine {
|
|
|
2397
2305
|
return evaluated;
|
|
2398
2306
|
});
|
|
2399
2307
|
}
|
|
2400
|
-
buildCustomTools(record_1,
|
|
2401
|
-
return __awaiter(this, arguments, void 0, function* (record,
|
|
2308
|
+
buildCustomTools(record_1, turnId_1, emit_1) {
|
|
2309
|
+
return __awaiter(this, arguments, void 0, function* (record, turnId, emit, extraTools = []) {
|
|
2310
|
+
const agent = this.project.agent;
|
|
2402
2311
|
const tools = {};
|
|
2403
2312
|
const register = (tool) => {
|
|
2404
2313
|
tools[tool.name] = Object.assign(Object.assign(Object.assign({ description: tool.description, inputSchema: tool.inputSchema }, (tool.outputSchema === undefined
|
|
@@ -3529,9 +3438,6 @@ export class SessionEngine {
|
|
|
3529
3438
|
}
|
|
3530
3439
|
}
|
|
3531
3440
|
}
|
|
3532
|
-
if (this.abCollector.enabled) {
|
|
3533
|
-
yield this.abCollector.onEvent(event, sessionCtx.session, this.project.name);
|
|
3534
|
-
}
|
|
3535
3441
|
(_a = this.otel) === null || _a === void 0 ? void 0 : _a.onEvent(event, sessionCtx.session);
|
|
3536
3442
|
});
|
|
3537
3443
|
}
|
|
@@ -3808,57 +3714,6 @@ export class SessionEngine {
|
|
|
3808
3714
|
};
|
|
3809
3715
|
});
|
|
3810
3716
|
}
|
|
3811
|
-
/**
|
|
3812
|
-
* Fold durable session streams into per-session A/B assignments and
|
|
3813
|
-
* aggregate arm metrics (`GET /v1/abs`). Collector-independent: always
|
|
3814
|
-
* reads `events.ndjson`.
|
|
3815
|
-
*/
|
|
3816
|
-
abSnapshot(caller, options) {
|
|
3817
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
3818
|
-
var _a, _b;
|
|
3819
|
-
var _c;
|
|
3820
|
-
const sessions = yield this.listSessions(caller, options);
|
|
3821
|
-
const abConfig = this.project.abConfig;
|
|
3822
|
-
const maxPlaygroundSessions = resolveABMaxPlaygroundSessions(abConfig === null || abConfig === void 0 ? void 0 : abConfig.maxPlaygroundSessions);
|
|
3823
|
-
const foldedSessions = sessions.slice(0, maxPlaygroundSessions);
|
|
3824
|
-
// Backfill for a replacement host with nothing local to fold (e.g.
|
|
3825
|
-
// lazy-only restore before any session resumed): serve the persisted
|
|
3826
|
-
// aggregate instead of an empty surface. Gated on the host having no
|
|
3827
|
-
// sessions AT ALL — the persisted snapshot spans every principal, so a
|
|
3828
|
-
// caller who merely owns no sessions must not see it. Loaded once per
|
|
3829
|
-
// process (playground polls this route ~every 4s); skip the persist
|
|
3830
|
-
// side effect below — re-saving a restored snapshot would echo stale
|
|
3831
|
-
// data back into the store.
|
|
3832
|
-
if (foldedSessions.length === 0 &&
|
|
3833
|
-
this.storage !== undefined &&
|
|
3834
|
-
(yield this.sessions.list()).length === 0) {
|
|
3835
|
-
(_c = this.restoredAbSnapshot) !== null && _c !== void 0 ? _c : (this.restoredAbSnapshot = this.storage.getLatestAbSnapshot());
|
|
3836
|
-
const restoredSnapshot = yield this.restoredAbSnapshot;
|
|
3837
|
-
if (restoredSnapshot !== undefined) {
|
|
3838
|
-
return restoredSnapshot;
|
|
3839
|
-
}
|
|
3840
|
-
}
|
|
3841
|
-
const abTable = (_a = this.project.storage) === null || _a === void 0 ? void 0 : _a.abs;
|
|
3842
|
-
const snapshot = yield buildABSnapshot({
|
|
3843
|
-
experiments: this.project.abs,
|
|
3844
|
-
agentName: this.project.name,
|
|
3845
|
-
sessions: foldedSessions,
|
|
3846
|
-
loadRecord: (sessionId) => this.sessions.get(sessionId),
|
|
3847
|
-
loadEvents: (sessionId) => this.listEvents(sessionId, 0),
|
|
3848
|
-
sessionInfo: (record) => this.sessionInfo(record),
|
|
3849
|
-
logger: this.logger,
|
|
3850
|
-
config: {
|
|
3851
|
-
maxPlaygroundSessions,
|
|
3852
|
-
durableSamples: abTable !== undefined,
|
|
3853
|
-
durableSnapshots: (abTable === null || abTable === void 0 ? void 0 : abTable.putSnapshot) !== undefined,
|
|
3854
|
-
},
|
|
3855
|
-
});
|
|
3856
|
-
// Side effect on the read path: playground polls GET /v1/abs ~every 4s;
|
|
3857
|
-
// the coordinator throttles the actual table write.
|
|
3858
|
-
(_b = this.storage) === null || _b === void 0 ? void 0 : _b.abSnapshot(snapshot);
|
|
3859
|
-
return snapshot;
|
|
3860
|
-
});
|
|
3861
|
-
}
|
|
3862
3717
|
eventStream(sessionId_1) {
|
|
3863
3718
|
return __awaiter(this, arguments, void 0, function* (sessionId, startIndex = 0) {
|
|
3864
3719
|
// Playground Trace replays this stream; backfill before the snapshot
|
|
@@ -4069,7 +3924,7 @@ export class SessionEngine {
|
|
|
4069
3924
|
this.coalesceDrains.has(sessionId));
|
|
4070
3925
|
}
|
|
4071
3926
|
sessionInfo(record) {
|
|
4072
|
-
return Object.assign(Object.assign(
|
|
3927
|
+
return Object.assign(Object.assign({ id: record.sessionId, channelId: record.channelId, mode: record.mode, purpose: record.purpose === "eval" ? "eval" : "live", dryRun: record.dryRun === true ? true : undefined, asOf: record.asOf, auth: record.auth, continuationKey: record.continuationKey }, (record.title === undefined ? {} : { title: record.title })), (record.sdkAgentId === undefined
|
|
4073
3928
|
? {}
|
|
4074
3929
|
: { sdkAgentId: record.sdkAgentId }));
|
|
4075
3930
|
}
|
|
@@ -4131,9 +3986,9 @@ export class SessionEngine {
|
|
|
4131
3986
|
* serve start, before channels accept traffic: any persisted session
|
|
4132
3987
|
* missing from the local `--state-root` is materialized there — events
|
|
4133
3988
|
* as `events.ndjson`, record as `session.json` — after which every
|
|
4134
|
-
* existing read path (continuation lookup, event replay/streams
|
|
4135
|
-
*
|
|
4136
|
-
*
|
|
3989
|
+
* existing read path (continuation lookup, event replay/streams) works
|
|
3990
|
+
* unchanged. Local state always wins over the sink, so restarts on the
|
|
3991
|
+
* same host are no-ops.
|
|
4137
3992
|
*
|
|
4138
3993
|
* Failures are logged and skipped; a broken store (including rows that
|
|
4139
3994
|
* violate the SessionRecord shape) never blocks serve start.
|
|
@@ -11,23 +11,20 @@
|
|
|
11
11
|
* must never stall or fail a turn.
|
|
12
12
|
*
|
|
13
13
|
* Scaling shape: sessions reduce to keyed puts on the KV sink; eval runs
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* bounded, serialized queue.
|
|
14
|
+
* go to their dedicated `evals` table. Reminder documents live on the
|
|
15
|
+
* control plane. Everything shares one bounded, serialized queue.
|
|
17
16
|
*
|
|
18
17
|
* It does three unrelated jobs, declared separately as
|
|
19
18
|
* {@link FrameworkSessionStore}, {@link AuthorKvStore}, and
|
|
20
|
-
* {@link
|
|
19
|
+
* {@link EvalStore} — see `storage-roles.ts` for why they differ and where
|
|
21
20
|
* each is headed. The queue stays shared: it is one bounded, serialized chain
|
|
22
21
|
* per agent, and splitting it would change backpressure behavior, which this
|
|
23
22
|
* seam deliberately does not touch.
|
|
24
23
|
*/
|
|
25
|
-
import type { ABMetricSample } from "../ab.js";
|
|
26
24
|
import { type ResolvedStoragePolicy, type StorageContext, type StorageDefinition, type StorageKeys } from "../storage.js";
|
|
27
25
|
import type { JsonValue, SessionEvent, SessionRecord } from "../types.js";
|
|
28
|
-
import type { ABSnapshot } from "./ab-snapshot.js";
|
|
29
26
|
import type { EvalRunStorage } from "./eval-run-store.js";
|
|
30
|
-
import type { AuthorKvStore,
|
|
27
|
+
import type { AuthorKvStore, EvalStore, FrameworkSessionStore } from "./storage-roles.js";
|
|
31
28
|
export interface StorageCoordinatorOptions {
|
|
32
29
|
definition: StorageDefinition;
|
|
33
30
|
agentName: string;
|
|
@@ -36,7 +33,7 @@ export interface StorageCoordinatorOptions {
|
|
|
36
33
|
/** Defaults to the architecture-v1 key contract. */
|
|
37
34
|
keys?: StorageKeys;
|
|
38
35
|
}
|
|
39
|
-
export declare class StorageCoordinator implements FrameworkSessionStore, AuthorKvStore,
|
|
36
|
+
export declare class StorageCoordinator implements FrameworkSessionStore, AuthorKvStore, EvalStore {
|
|
40
37
|
readonly policy: ResolvedStoragePolicy;
|
|
41
38
|
private readonly definition;
|
|
42
39
|
private readonly keys;
|
|
@@ -56,7 +53,6 @@ export declare class StorageCoordinator implements FrameworkSessionStore, Author
|
|
|
56
53
|
private pending;
|
|
57
54
|
/** Ops dropped because the queue was full. */
|
|
58
55
|
private dropped;
|
|
59
|
-
private lastAbSnapshotAt;
|
|
60
56
|
private closed;
|
|
61
57
|
constructor(options: StorageCoordinatorOptions);
|
|
62
58
|
/** Durable session-record update (engine calls after every store save). */
|
|
@@ -154,16 +150,6 @@ export declare class StorageCoordinator implements FrameworkSessionStore, Author
|
|
|
154
150
|
* history then stays in process memory.
|
|
155
151
|
*/
|
|
156
152
|
evalRuns(): EvalRunStorage | undefined;
|
|
157
|
-
/** Append one metric sample to the `abs` table (no-op without it). */
|
|
158
|
-
abSample(sample: ABMetricSample): void;
|
|
159
|
-
/**
|
|
160
|
-
* Refresh the persisted aggregate A/B snapshot, throttled to once per
|
|
161
|
-
* {@link AB_SNAPSHOT_MIN_INTERVAL_MS} (the playground recomputes the
|
|
162
|
-
* fold on every `GET /v1/abs` poll). No-op without `abs.putSnapshot`.
|
|
163
|
-
*/
|
|
164
|
-
abSnapshot(snapshot: ABSnapshot): void;
|
|
165
|
-
/** Latest persisted aggregate A/B snapshot; errors read as absent. */
|
|
166
|
-
getLatestAbSnapshot(): Promise<ABSnapshot | undefined>;
|
|
167
153
|
/**
|
|
168
154
|
* Flush all buffers and drain the queue, giving the sink at most
|
|
169
155
|
* {@link CLOSE_DRAIN_TIMEOUT_MS} — a hung sink must not stall shutdown
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,13 +11,12 @@
|
|
|
11
11
|
* must never stall or fail a turn.
|
|
12
12
|
*
|
|
13
13
|
* Scaling shape: sessions reduce to keyed puts on the KV sink; eval runs
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* bounded, serialized queue.
|
|
14
|
+
* go to their dedicated `evals` table. Reminder documents live on the
|
|
15
|
+
* control plane. Everything shares one bounded, serialized queue.
|
|
17
16
|
*
|
|
18
17
|
* It does three unrelated jobs, declared separately as
|
|
19
18
|
* {@link FrameworkSessionStore}, {@link AuthorKvStore}, and
|
|
20
|
-
* {@link
|
|
19
|
+
* {@link EvalStore} — see `storage-roles.ts` for why they differ and where
|
|
21
20
|
* each is headed. The queue stays shared: it is one bounded, serialized chain
|
|
22
21
|
* per agent, and splitting it would change backpressure behavior, which this
|
|
23
22
|
* seam deliberately does not touch.
|
|
@@ -56,12 +55,6 @@ const MAX_PENDING_OPS = 1000;
|
|
|
56
55
|
const CLOSE_DRAIN_TIMEOUT_MS = 10000;
|
|
57
56
|
/** Debounced event batching flushes early past this many buffered events. */
|
|
58
57
|
const DEBOUNCE_MAX_BATCH = 200;
|
|
59
|
-
/**
|
|
60
|
-
* Aggregate A/B snapshots are refreshed at most this often — the
|
|
61
|
-
* playground polls `GET /v1/abs` every few seconds, and the snapshot is a
|
|
62
|
-
* convenience backfill, not a source of truth.
|
|
63
|
-
*/
|
|
64
|
-
const AB_SNAPSHOT_MIN_INTERVAL_MS = 60000;
|
|
65
58
|
/** Session records out of raw sink entries; rows without a usable id are dropped. */
|
|
66
59
|
function sessionRecordsOf(entries) {
|
|
67
60
|
return entries
|
|
@@ -86,7 +79,6 @@ export class StorageCoordinator {
|
|
|
86
79
|
this.pending = 0;
|
|
87
80
|
/** Ops dropped because the queue was full. */
|
|
88
81
|
this.dropped = 0;
|
|
89
|
-
this.lastAbSnapshotAt = 0;
|
|
90
82
|
this.closed = false;
|
|
91
83
|
this.definition = options.definition;
|
|
92
84
|
this.keys = (_a = options.keys) !== null && _a !== void 0 ? _a : storageKeys;
|
|
@@ -441,57 +433,6 @@ export class StorageCoordinator {
|
|
|
441
433
|
};
|
|
442
434
|
}
|
|
443
435
|
// ==========================================================================
|
|
444
|
-
// A/Bs (dedicated `abs` table)
|
|
445
|
-
// ==========================================================================
|
|
446
|
-
/** Append one metric sample to the `abs` table (no-op without it). */
|
|
447
|
-
abSample(sample) {
|
|
448
|
-
const table = this.definition.abs;
|
|
449
|
-
if (this.closed || table === undefined) {
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
this.enqueue([
|
|
453
|
-
{
|
|
454
|
-
label: `abs.putSample(${sample.sessionId})`,
|
|
455
|
-
run: (ctx) => table.putSample(sample, ctx),
|
|
456
|
-
},
|
|
457
|
-
], "policy");
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Refresh the persisted aggregate A/B snapshot, throttled to once per
|
|
461
|
-
* {@link AB_SNAPSHOT_MIN_INTERVAL_MS} (the playground recomputes the
|
|
462
|
-
* fold on every `GET /v1/abs` poll). No-op without `abs.putSnapshot`.
|
|
463
|
-
*/
|
|
464
|
-
abSnapshot(snapshot) {
|
|
465
|
-
var _a;
|
|
466
|
-
const putSnapshot = (_a = this.definition.abs) === null || _a === void 0 ? void 0 : _a.putSnapshot;
|
|
467
|
-
const now = Date.now();
|
|
468
|
-
if (this.closed ||
|
|
469
|
-
putSnapshot === undefined ||
|
|
470
|
-
now - this.lastAbSnapshotAt < AB_SNAPSHOT_MIN_INTERVAL_MS) {
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
this.lastAbSnapshotAt = now;
|
|
474
|
-
this.enqueue([{ label: "abs.putSnapshot", run: (ctx) => putSnapshot(snapshot, ctx) }], "policy");
|
|
475
|
-
}
|
|
476
|
-
/** Latest persisted aggregate A/B snapshot; errors read as absent. */
|
|
477
|
-
getLatestAbSnapshot() {
|
|
478
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
479
|
-
var _a;
|
|
480
|
-
const getSnapshot = (_a = this.definition.abs) === null || _a === void 0 ? void 0 : _a.getSnapshot;
|
|
481
|
-
if (getSnapshot === undefined) {
|
|
482
|
-
return undefined;
|
|
483
|
-
}
|
|
484
|
-
try {
|
|
485
|
-
const value = yield getSnapshot(this.context("restore"));
|
|
486
|
-
return value !== null && value !== void 0 ? value : undefined;
|
|
487
|
-
}
|
|
488
|
-
catch (error) {
|
|
489
|
-
this.logger(`[agent-sdk] storage abs.getSnapshot() failed: ${describeError(error)}`);
|
|
490
|
-
return undefined;
|
|
491
|
-
}
|
|
492
|
-
});
|
|
493
|
-
}
|
|
494
|
-
// ==========================================================================
|
|
495
436
|
// Delivery
|
|
496
437
|
// ==========================================================================
|
|
497
438
|
/**
|
|
@@ -14,17 +14,15 @@
|
|
|
14
14
|
* - {@link AuthorKvStore} is author state: whatever `ctx.host.kv` was handed.
|
|
15
15
|
* It converges onto the author file plane, which is a different destination
|
|
16
16
|
* from the one above.
|
|
17
|
-
* - {@link
|
|
18
|
-
*
|
|
17
|
+
* - {@link EvalStore} is playground eval bookkeeping with its own dedicated
|
|
18
|
+
* table, and follows neither.
|
|
19
19
|
*
|
|
20
20
|
* Consumers should depend on the narrowest role they use. That is what keeps a
|
|
21
21
|
* later change to framework persistence from silently reaching author KV, and
|
|
22
22
|
* it is why these are interfaces rather than a comment on one class.
|
|
23
23
|
*/
|
|
24
|
-
import type { ABMetricSample } from "../ab.js";
|
|
25
24
|
import type { StorageContext } from "../storage.js";
|
|
26
25
|
import type { JsonValue, SessionEvent, SessionRecord } from "../types.js";
|
|
27
|
-
import type { ABSnapshot } from "./ab-snapshot.js";
|
|
28
26
|
import type { EvalRunStorage } from "./eval-run-store.js";
|
|
29
27
|
/**
|
|
30
28
|
* Framework-owned session durability: what has to be true for a session to
|
|
@@ -73,11 +71,8 @@ export interface AuthorKvStore {
|
|
|
73
71
|
kvPut(authorKey: string, value: JsonValue): Promise<void>;
|
|
74
72
|
kvDelete(authorKey: string): Promise<void>;
|
|
75
73
|
}
|
|
76
|
-
/** Playground eval batches
|
|
77
|
-
export interface
|
|
74
|
+
/** Playground eval batches, on their own table. */
|
|
75
|
+
export interface EvalStore {
|
|
78
76
|
evalRuns(): EvalRunStorage | undefined;
|
|
79
|
-
abSample(sample: ABMetricSample): void;
|
|
80
|
-
abSnapshot(snapshot: ABSnapshot): void;
|
|
81
|
-
getLatestAbSnapshot(): Promise<ABSnapshot | undefined>;
|
|
82
77
|
}
|
|
83
78
|
//# sourceMappingURL=storage-roles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-roles.d.ts","sourceRoot":"","sources":["../../src/internal/storage-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"storage-roles.d.ts","sourceRoot":"","sources":["../../src/internal/storage-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3C,uEAAuE;IACvE,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACjC,kEAAkE;IAClE,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3C,2EAA2E;IAC3E,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAEzE,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,mFAAmF;IACnF,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEjC,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACjD;;;OAGG;IACH,0BAA0B,CACxB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,CAAC;IACxC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9D,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACtE,wBAAwB,CACtB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;CACvC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,QAAQ,IAAI,cAAc,GAAG,SAAS,CAAC;CACxC"}
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* - {@link AuthorKvStore} is author state: whatever `ctx.host.kv` was handed.
|
|
15
15
|
* It converges onto the author file plane, which is a different destination
|
|
16
16
|
* from the one above.
|
|
17
|
-
* - {@link
|
|
18
|
-
*
|
|
17
|
+
* - {@link EvalStore} is playground eval bookkeeping with its own dedicated
|
|
18
|
+
* table, and follows neither.
|
|
19
19
|
*
|
|
20
20
|
* Consumers should depend on the narrowest role they use. That is what keeps a
|
|
21
21
|
* later change to framework persistence from silently reaching author KV, and
|