@cursor/july 0.1.62 → 0.1.73
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 +4 -5
- package/README.md +23 -11
- package/dist/bin/agent-serve.js +11 -2
- package/dist/channels/github/api.d.ts +2 -0
- package/dist/channels/github/api.d.ts.map +1 -1
- package/dist/channels/github/api.js +2 -1
- package/dist/channels/github/binding.d.ts +7 -0
- package/dist/channels/github/binding.d.ts.map +1 -1
- package/dist/channels/github/binding.js +4 -0
- package/dist/channels/github/checks.d.ts +99 -0
- package/dist/channels/github/checks.d.ts.map +1 -0
- package/dist/channels/github/checks.js +108 -0
- package/dist/channels/github/cursor-account.d.ts +4 -4
- package/dist/channels/github/cursor-account.d.ts.map +1 -1
- package/dist/channels/github/cursor-account.js +7 -5
- package/dist/channels/github/index.d.ts +1 -0
- package/dist/channels/github/index.d.ts.map +1 -1
- package/dist/channels/github/index.js +1 -0
- package/dist/channels/github/types.d.ts +8 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/slack/channel-watch.d.ts +2 -1
- package/dist/channels/slack/channel-watch.d.ts.map +1 -1
- package/dist/channels/slack/channel-watch.js +7 -3
- package/dist/channels/slack/dispatch.d.ts +9 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +41 -21
- package/dist/channels/slack/manifest.d.ts +2 -2
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +14 -11
- package/dist/channels/slack/nudge-store.d.ts +16 -0
- package/dist/channels/slack/nudge-store.d.ts.map +1 -1
- package/dist/channels/slack/nudge-store.js +53 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +4 -1
- package/dist/channels/slack/types.d.ts +24 -7
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/connections.d.ts +17 -5
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +17 -5
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.B-biogkN.js → app.CdbcFD8T.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DQad--_z.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DZqKtFZS.js → VPLocalSearchBox.D_NKImM7.js} +1 -1
- package/dist/docs/assets/chunks/{theme.BwC5zP2r.js → theme.CMvz7cu9.js} +2 -2
- package/dist/docs/assets/{concepts.md.CqOsxbMU.js → concepts.md.BXAm6G-C.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.C7G7IykG.js → guides_mcp-oauth.md.CzEB6RaG.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.DHkkvcEZ.js → reference_agent-config.md.BZnEKfEc.js} +3 -4
- package/dist/docs/assets/{reference_agent-config.md.DHkkvcEZ.lean.js → reference_agent-config.md.BZnEKfEc.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.CSQiNzre.js → reference_connections.md.Cu3N-S3Q.js} +26 -9
- package/dist/docs/assets/reference_connections.md.Cu3N-S3Q.lean.js +1 -0
- package/dist/docs/assets/{reference_sessions.md.DBVFi2Sx.js → reference_sessions.md.B0DdlM-K.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.kJfJAP2m.js → reference_tools.md.DTg_kEsx.js} +2 -2
- package/dist/docs/assets/{reference_tools.md.kJfJAP2m.lean.js → reference_tools.md.DTg_kEsx.lean.js} +1 -1
- package/dist/docs/assets/troubleshooting.md.DQ-hYuZT.js +1 -0
- package/dist/docs/building-with-agents.html +3 -3
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/deployment.html +3 -3
- package/dist/docs/evals.html +3 -3
- package/dist/docs/example-agents/approval-buddy.html +3 -3
- package/dist/docs/example-agents/benny.html +3 -3
- package/dist/docs/example-agents/bugbot.html +3 -3
- package/dist/docs/example-agents/codebase-wiki.html +3 -3
- package/dist/docs/example-agents/codeowners-review.html +3 -3
- package/dist/docs/example-agents/concierge.html +3 -3
- package/dist/docs/example-agents/fsd.html +3 -3
- package/dist/docs/example-agents/index.html +3 -3
- package/dist/docs/example-agents/knowledge-base.html +3 -3
- package/dist/docs/example-agents/oncall.html +3 -3
- package/dist/docs/example-agents/security-reviewer.html +3 -3
- package/dist/docs/example-agents/slack-agent.html +3 -3
- package/dist/docs/example-agents/weather-agent.html +3 -3
- package/dist/docs/guides/agent-to-agent.html +3 -3
- package/dist/docs/guides/cloud-runtime.html +3 -3
- package/dist/docs/guides/convert-automation.html +3 -3
- package/dist/docs/guides/github.html +3 -3
- package/dist/docs/guides/human-in-the-loop.html +3 -3
- package/dist/docs/guides/mcp-oauth.html +5 -5
- package/dist/docs/guides/opentelemetry.html +3 -3
- package/dist/docs/guides/slack.html +3 -3
- package/dist/docs/guides/webhooks.html +3 -3
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +3 -3
- package/dist/docs/index.html +3 -3
- package/dist/docs/quickstart.html +3 -3
- package/dist/docs/reference/agent-config.html +5 -6
- package/dist/docs/reference/artifacts.html +3 -3
- package/dist/docs/reference/channels.html +3 -3
- package/dist/docs/reference/cli.html +3 -3
- package/dist/docs/reference/connections.html +28 -11
- package/dist/docs/reference/hooks.html +3 -3
- package/dist/docs/reference/http-api.html +3 -3
- package/dist/docs/reference/instructions.html +3 -3
- package/dist/docs/reference/playground.html +3 -3
- package/dist/docs/reference/project-layout.html +3 -3
- package/dist/docs/reference/prompt.html +3 -3
- package/dist/docs/reference/schedules.html +3 -3
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/skills.html +3 -3
- package/dist/docs/reference/subagents.html +3 -3
- package/dist/docs/reference/tools.html +5 -5
- package/dist/docs/scaffolding-agents.html +3 -3
- package/dist/docs/storage.html +3 -3
- package/dist/docs/templates/agentic-owners.html +3 -3
- package/dist/docs/templates/demo.html +3 -3
- package/dist/docs/templates/pr-autofixer.html +3 -3
- package/dist/docs/templates/security-reviewer.html +3 -3
- package/dist/docs/templates/triage.html +3 -3
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/files-backends/agent-store-presigned-url.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/advertise-tools.d.ts +79 -0
- package/dist/internal/advertise-tools.d.ts.map +1 -0
- package/dist/internal/advertise-tools.js +185 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +7 -1
- package/dist/internal/cli-manifest.d.ts +19 -0
- package/dist/internal/cli-manifest.d.ts.map +1 -0
- package/dist/internal/cli-manifest.js +49 -0
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +9 -1
- package/dist/internal/convert-automation/convert-workflow.d.ts.map +1 -1
- package/dist/internal/convert-automation/convert-workflow.js +2 -10
- package/dist/internal/cursor/account-mcp.d.ts +29 -3
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +147 -67
- package/dist/internal/cursor/backend-client.d.ts +11 -6
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +32 -10
- package/dist/internal/cursor-account-mcp-auth.d.ts +11 -0
- package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +69 -0
- package/dist/internal/cursor-agent-template.d.ts +9 -0
- package/dist/internal/cursor-agent-template.d.ts.map +1 -0
- package/dist/internal/cursor-agent-template.js +37 -0
- package/dist/internal/deploy-client.d.ts +1 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +18 -2
- package/dist/internal/deploy-manifest.d.ts +76 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -0
- package/dist/internal/deploy-manifest.js +117 -0
- package/dist/internal/deployment-scm-event-stream.d.ts +116 -0
- package/dist/internal/deployment-scm-event-stream.d.ts.map +1 -0
- package/dist/internal/deployment-scm-event-stream.js +474 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +111 -10
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +12 -123
- package/dist/internal/init-scaffold.d.ts +8 -0
- package/dist/internal/init-scaffold.d.ts.map +1 -0
- package/dist/internal/init-scaffold.js +168 -0
- package/dist/internal/inline-stdio-mcp.d.ts +2 -0
- package/dist/internal/inline-stdio-mcp.d.ts.map +1 -1
- package/dist/internal/inline-stdio-mcp.js +10 -8
- package/dist/internal/json-schema.d.ts +7 -0
- package/dist/internal/json-schema.d.ts.map +1 -1
- package/dist/internal/json-schema.js +18 -3
- package/dist/internal/mcp-endpoint.js +7 -7
- package/dist/internal/mcp-host.d.ts +18 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +43 -5
- package/dist/internal/mcp-oauth.d.ts +22 -0
- package/dist/internal/mcp-oauth.d.ts.map +1 -1
- package/dist/internal/mcp-oauth.js +40 -1
- package/dist/internal/package-inline-stdio.d.ts.map +1 -1
- package/dist/internal/package-inline-stdio.js +5 -5
- package/dist/internal/review-comments.d.ts +97 -0
- package/dist/internal/review-comments.d.ts.map +1 -1
- package/dist/internal/review-comments.js +151 -0
- package/dist/internal/sanitize-mcp-tool-name.d.ts +20 -0
- package/dist/internal/sanitize-mcp-tool-name.d.ts.map +1 -0
- package/dist/internal/sanitize-mcp-tool-name.js +30 -0
- package/dist/internal/sdk-runner.d.ts +1 -1
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +36 -13
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +18 -0
- package/dist/internal/session-engine.d.ts +66 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +428 -110
- package/dist/internal/shallow-clone.d.ts +170 -0
- package/dist/internal/shallow-clone.d.ts.map +1 -0
- package/dist/internal/shallow-clone.js +412 -0
- package/dist/internal/slack-provision-client.d.ts +2 -0
- package/dist/internal/slack-provision-client.d.ts.map +1 -1
- package/dist/internal/slack-provision-client.js +1 -0
- package/dist/internal/terminal-style.d.ts +18 -0
- package/dist/internal/terminal-style.d.ts.map +1 -1
- package/dist/internal/terminal-style.js +46 -1
- package/dist/internal/turn-lease-store.d.ts +44 -0
- package/dist/internal/turn-lease-store.d.ts.map +1 -0
- package/dist/internal/turn-lease-store.js +139 -0
- package/dist/internal/workspace.d.ts +14 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +33 -0
- package/dist/playground/assets/index-77uhu5Kr.css +1 -0
- package/dist/playground/assets/index-D4buox4m.js +85 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-protocol.d.ts +122 -0
- package/dist/storage-protocol.d.ts.map +1 -0
- package/dist/storage-protocol.js +173 -0
- package/dist/storage.d.ts +2 -72
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +2 -82
- package/dist/tools.d.ts +7 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/types.d.ts +141 -6
- package/dist/types.d.ts.map +1 -1
- package/docs/concepts.md +4 -4
- package/docs/guides/mcp-oauth.md +3 -1
- package/docs/reference/agent-config.md +11 -12
- package/docs/reference/connections.md +108 -10
- package/docs/reference/sessions.md +2 -2
- package/docs/reference/tools.md +14 -0
- package/docs/troubleshooting.md +3 -2
- package/package.json +7 -2
- package/skills/create-agent/SKILL.md +12 -9
- package/skills/debug/SKILL.md +2 -1
- package/skills/framework-map/SKILL.md +6 -6
- package/skills/mcp-auth/SKILL.md +8 -6
- package/src/bin/agent-serve.ts +12 -2
- package/src/channels/github/api.ts +6 -1
- package/src/channels/github/binding.ts +21 -0
- package/src/channels/github/checks.ts +179 -0
- package/src/channels/github/cursor-account.ts +9 -6
- package/src/channels/github/index.ts +1 -0
- package/src/channels/github/types.ts +8 -0
- package/src/channels/slack/channel-watch.ts +6 -3
- package/src/channels/slack/dispatch.ts +40 -3
- package/src/channels/slack/manifest.ts +9 -10
- package/src/channels/slack/nudge-store.ts +56 -0
- package/src/channels/slack/slack-channel.ts +3 -0
- package/src/channels/slack/types.ts +24 -7
- package/src/connections.ts +17 -5
- package/src/index.ts +5 -0
- package/src/internal/advertise-tools.ts +278 -0
- package/src/internal/cli-deploy.ts +11 -1
- package/src/internal/cli-manifest.ts +63 -0
- package/src/internal/cli-slack.ts +10 -1
- package/src/internal/convert-automation/convert-workflow.ts +2 -11
- package/src/internal/cursor/account-mcp.ts +208 -73
- package/src/internal/cursor/backend-client.ts +45 -11
- package/src/internal/cursor-account-mcp-auth.ts +83 -0
- package/src/internal/cursor-agent-template.ts +46 -0
- package/src/internal/deploy-client.ts +25 -6
- package/src/internal/deploy-manifest.ts +161 -0
- package/src/internal/deployment-scm-event-stream.ts +593 -0
- package/src/internal/discovery.ts +132 -3
- package/src/internal/init-project.ts +18 -153
- package/src/internal/init-scaffold.ts +176 -0
- package/src/internal/inline-stdio-mcp.ts +13 -0
- package/src/internal/json-schema.ts +24 -3
- package/src/internal/mcp-endpoint.ts +6 -0
- package/src/internal/mcp-host.ts +70 -9
- package/src/internal/mcp-oauth.ts +55 -1
- package/src/internal/package-inline-stdio.ts +5 -1
- package/src/internal/review-comments.ts +245 -0
- package/src/internal/sanitize-mcp-tool-name.ts +33 -0
- package/src/internal/sdk-runner.ts +50 -11
- package/src/internal/server.ts +19 -0
- package/src/internal/session-engine.ts +392 -19
- package/src/internal/shallow-clone.ts +595 -0
- package/src/internal/slack-provision-client.ts +3 -0
- package/src/internal/terminal-style.ts +67 -1
- package/src/internal/turn-lease-store.ts +147 -0
- package/src/internal/workspace.ts +33 -0
- package/src/storage-protocol.ts +247 -0
- package/src/storage.ts +16 -110
- package/src/tools.ts +7 -0
- package/src/types.ts +149 -7
- package/templates/agentic-owners/agent/agent.ts +3 -0
- package/templates/demo/agent/agent.ts +3 -0
- package/templates/pr-autofixer/agent/lib/drive-schemas.ts +4 -1
- package/templates/security-reviewer/agent/agent.ts +3 -0
- package/templates/triage/agent/agent.ts +3 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.5ozYNf74.js +0 -1
- package/dist/docs/assets/reference_connections.md.CSQiNzre.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.CuVztCKs.js +0 -1
- package/dist/playground/assets/index-B4rcOgeP.css +0 -1
- package/dist/playground/assets/index-DXcY42Jv.js +0 -85
- /package/dist/docs/assets/{concepts.md.CqOsxbMU.lean.js → concepts.md.BXAm6G-C.lean.js} +0 -0
- /package/dist/docs/assets/{guides_mcp-oauth.md.C7G7IykG.lean.js → guides_mcp-oauth.md.CzEB6RaG.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.DBVFi2Sx.lean.js → reference_sessions.md.B0DdlM-K.lean.js} +0 -0
- /package/dist/docs/assets/{troubleshooting.md.CuVztCKs.lean.js → troubleshooting.md.DQ-hYuZT.lean.js} +0 -0
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
/>
|
|
9
9
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
10
10
|
<title>agent-serve playground</title>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-D4buox4m.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="./assets/index-77uhu5Kr.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable session KV contract: key families plus a tolerant SessionRecord
|
|
3
|
+
* decoder. This is the lockstep surface for the control plane (see
|
|
4
|
+
* `backend/server/src/agentServe/durableSessionProtocol.ts`) so a dashboard
|
|
5
|
+
* list can read Bugbot KV without importing `@cursor/july`.
|
|
6
|
+
*
|
|
7
|
+
* Additive JSON only — unknown fields are ignored. Do not put ledger
|
|
8
|
+
* (`durable-session/`) types here; those are coordination-only and must not
|
|
9
|
+
* appear in the CP session list.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Framework-owned key root. All {@link storageKeys} values live under this
|
|
13
|
+
* prefix so a shared store can route or namespace Agent SDK data.
|
|
14
|
+
*/
|
|
15
|
+
export declare const STORAGE_KEY_ROOT: "agentkit/v1";
|
|
16
|
+
/**
|
|
17
|
+
* The framework-owned key scheme. Keys are a **stable, versioned contract**
|
|
18
|
+
* under {@link STORAGE_KEY_ROOT}: sinks may treat them as opaque strings, or
|
|
19
|
+
* route on prefixes (e.g. event chunks to object storage, everything else
|
|
20
|
+
* to a database). Channel ids and continuation tokens are the only segments
|
|
21
|
+
* that may contain caller-controlled characters; they are URI-encoded, and
|
|
22
|
+
* a segment whose encoding exceeds {@link MAX_KEY_SEGMENT_BYTES} is replaced
|
|
23
|
+
* by a `sha256:…` digest — so every minted key has a bounded length that any
|
|
24
|
+
* backend (VARCHAR columns, btree index tuples, S3 key limits) can store,
|
|
25
|
+
* no matter what a caller stuffs into a token. The substitution is
|
|
26
|
+
* deterministic: writes and continuation lookups build the same key.
|
|
27
|
+
*
|
|
28
|
+
* | Key | Value |
|
|
29
|
+
* | --- | --- |
|
|
30
|
+
* | `agentkit/v1/{agent}/session/{sessionId}` | `SessionRecord` |
|
|
31
|
+
* | `agentkit/v1/{agent}/session-events/{sessionId}/{index}` | `SessionEvent[]` chunk (index = first event's index, zero-padded) |
|
|
32
|
+
* | `agentkit/v1/{agent}/continuation/{channelId}/{token}` | `{ sessionId }` |
|
|
33
|
+
* | `agentkit/v1/{agent}/kv/{key}` | Author JSON via `HostContext.kv` |
|
|
34
|
+
*
|
|
35
|
+
* The `eval-runs` / `ab-samples` / `ab-snapshot` families are minted only
|
|
36
|
+
* by the tables `defineStorage` derives over the KV core; a backend that
|
|
37
|
+
* authors dedicated `StorageConfig.evals` / `StorageConfig.abs` groups never
|
|
38
|
+
* sees them.
|
|
39
|
+
*/
|
|
40
|
+
export declare const storageKeys: {
|
|
41
|
+
readonly session: (agent: string, sessionId: string) => string;
|
|
42
|
+
readonly sessionPrefix: (agent: string) => string;
|
|
43
|
+
readonly sessionEvents: (agent: string, sessionId: string, firstIndex: number) => string;
|
|
44
|
+
readonly sessionEventsPrefix: (agent: string, sessionId: string) => string;
|
|
45
|
+
readonly continuation: (agent: string, channelId: string, continuationKey: string) => string;
|
|
46
|
+
/**
|
|
47
|
+
* Author-facing opaque JSON (see `HostContext.kv`). `key` is URI-encoded /
|
|
48
|
+
* digested like other caller-controlled segments.
|
|
49
|
+
*/
|
|
50
|
+
readonly kv: (agent: string, key: string) => string;
|
|
51
|
+
readonly kvPrefix: (agent: string) => string;
|
|
52
|
+
/** One playground eval-run snapshot (derived `evals` table). */
|
|
53
|
+
readonly evalRun: (agent: string, runId: string) => string;
|
|
54
|
+
readonly evalRunsPrefix: (agent: string) => string;
|
|
55
|
+
/**
|
|
56
|
+
* One A/B metric sample (derived `abs` table); the segments mirror the
|
|
57
|
+
* dedicated table's row identity (experiment + sessionId + at).
|
|
58
|
+
*/
|
|
59
|
+
readonly abSample: (agent: string, experiment: string, sessionId: string, at: string) => string;
|
|
60
|
+
/** Latest aggregate A/B snapshot (derived `abs` table, LWW). */
|
|
61
|
+
readonly abSnapshot: (agent: string) => string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Max bytes a caller-controlled key segment may occupy after URI-encoding.
|
|
65
|
+
* Chosen so full keys stay well under common backend limits (Postgres btree
|
|
66
|
+
* index tuples cap at ~2704 bytes; S3 keys at 1024). Longer segments are
|
|
67
|
+
* replaced by their SHA-256 digest, keeping every minted key bounded.
|
|
68
|
+
*/
|
|
69
|
+
export declare const MAX_KEY_SEGMENT_BYTES = 256;
|
|
70
|
+
/**
|
|
71
|
+
* URI-encode one caller-controlled key segment, substituting a `sha256:…`
|
|
72
|
+
* digest of the raw value when the encoding exceeds
|
|
73
|
+
* {@link MAX_KEY_SEGMENT_BYTES}. Deterministic, so key construction on the
|
|
74
|
+
* write path and the continuation-lookup path always agree.
|
|
75
|
+
*
|
|
76
|
+
* Exported for the session ledger, which builds its `session/` and
|
|
77
|
+
* `ledger/` keys with the same encoding rules.
|
|
78
|
+
*/
|
|
79
|
+
export declare function keySegment(raw: string): string;
|
|
80
|
+
export declare function isDurableSessionRecordKey(key: string): boolean;
|
|
81
|
+
/** List fields of a persisted `SessionRecord`. Unknown properties are dropped. */
|
|
82
|
+
export type DurableSessionRecord = {
|
|
83
|
+
sessionId: string;
|
|
84
|
+
channelId: string;
|
|
85
|
+
mode: string;
|
|
86
|
+
continuationKey: string | null | undefined;
|
|
87
|
+
title: string | undefined;
|
|
88
|
+
turnCount: number;
|
|
89
|
+
createdAt: string;
|
|
90
|
+
updatedAt: string;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Session metadata for history UIs. `running` is omitted unless a live
|
|
94
|
+
* overlay (the engine process) supplies it — a KV-only reader must not
|
|
95
|
+
* claim a turn is in flight.
|
|
96
|
+
*/
|
|
97
|
+
export type DurableSessionSummary = {
|
|
98
|
+
sessionId: string;
|
|
99
|
+
channelId: string;
|
|
100
|
+
mode: string;
|
|
101
|
+
title: string | undefined;
|
|
102
|
+
turnCount: number;
|
|
103
|
+
createdAt: string;
|
|
104
|
+
updatedAt: string;
|
|
105
|
+
running: boolean | undefined;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Tolerant `SessionRecord` decoder. Extra fields (`auth`, `purpose`, ledger
|
|
109
|
+
* extras, future keys) are ignored. Returns undefined when required list
|
|
110
|
+
* fields are missing or the wrong type.
|
|
111
|
+
*/
|
|
112
|
+
export declare function parseDurableSessionRecord(value: unknown): DurableSessionRecord | undefined;
|
|
113
|
+
export declare function summarizeDurableSessionRecord(args: {
|
|
114
|
+
record: DurableSessionRecord;
|
|
115
|
+
running?: boolean;
|
|
116
|
+
}): DurableSessionSummary;
|
|
117
|
+
/**
|
|
118
|
+
* Golden persisted record: required list fields plus extras a future engine
|
|
119
|
+
* might write. Both this package and the CP decoder must accept it.
|
|
120
|
+
*/
|
|
121
|
+
export declare const GOLDEN_DURABLE_SESSION_RECORD: Record<string, unknown>;
|
|
122
|
+
//# sourceMappingURL=storage-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-protocol.d.ts","sourceRoot":"","sources":["../src/storage-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAG,aAAsB,CAAC;AAUvD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,WAAW;aACtB,OAAO,UAAU,MAAM,aAAa,MAAM,KAAG,MAAM;aAEnD,aAAa,UAAU,MAAM,KAAG,MAAM;aAEtC,aAAa,UACJ,MAAM,aACF,MAAM,cACL,MAAM,KACjB,MAAM;aAET,mBAAmB,UAAU,MAAM,aAAa,MAAM,KAAG,MAAM;aAE/D,YAAY,UACH,MAAM,aACF,MAAM,mBACA,MAAM,KACtB,MAAM;IAET;;;OAGG;aACH,EAAE,UAAU,MAAM,OAAO,MAAM,KAAG,MAAM;aAExC,QAAQ,UAAU,MAAM,KAAG,MAAM;IACjC,gEAAgE;aAChE,OAAO,UAAU,MAAM,SAAS,MAAM,KAAG,MAAM;aAE/C,cAAc,UAAU,MAAM,KAAG,MAAM;IAEvC;;;OAGG;aACH,QAAQ,UACC,MAAM,cACD,MAAM,aACP,MAAM,MACb,MAAM,KACT,MAAM;IAET,gEAAgE;aAChE,UAAU,UAAU,MAAM,KAAG,MAAM;CAE3B,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,kFAAkF;AAClF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,oBAAoB,GAAG,SAAS,CAwClC;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,qBAAqB,CAYxB;AAED;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAYjE,CAAC"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable session KV contract: key families plus a tolerant SessionRecord
|
|
3
|
+
* decoder. This is the lockstep surface for the control plane (see
|
|
4
|
+
* `backend/server/src/agentServe/durableSessionProtocol.ts`) so a dashboard
|
|
5
|
+
* list can read Bugbot KV without importing `@cursor/july`.
|
|
6
|
+
*
|
|
7
|
+
* Additive JSON only — unknown fields are ignored. Do not put ledger
|
|
8
|
+
* (`durable-session/`) types here; those are coordination-only and must not
|
|
9
|
+
* appear in the CP session list.
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from "node:crypto";
|
|
12
|
+
/**
|
|
13
|
+
* Framework-owned key root. All {@link storageKeys} values live under this
|
|
14
|
+
* prefix so a shared store can route or namespace Agent SDK data.
|
|
15
|
+
*/
|
|
16
|
+
export const STORAGE_KEY_ROOT = "agentkit/v1";
|
|
17
|
+
/**
|
|
18
|
+
* Exact session-record keys: `agentkit/v1/{agent}/session/{sessionId}`.
|
|
19
|
+
* Rejects `session-events/`, `durable-session/`, and the CP-owned `_cp`
|
|
20
|
+
* agent name.
|
|
21
|
+
*/
|
|
22
|
+
const DURABLE_SESSION_RECORD_KEY_RE = /^agentkit\/v1\/([^/]+)\/session\/([^/]+)$/;
|
|
23
|
+
/**
|
|
24
|
+
* The framework-owned key scheme. Keys are a **stable, versioned contract**
|
|
25
|
+
* under {@link STORAGE_KEY_ROOT}: sinks may treat them as opaque strings, or
|
|
26
|
+
* route on prefixes (e.g. event chunks to object storage, everything else
|
|
27
|
+
* to a database). Channel ids and continuation tokens are the only segments
|
|
28
|
+
* that may contain caller-controlled characters; they are URI-encoded, and
|
|
29
|
+
* a segment whose encoding exceeds {@link MAX_KEY_SEGMENT_BYTES} is replaced
|
|
30
|
+
* by a `sha256:…` digest — so every minted key has a bounded length that any
|
|
31
|
+
* backend (VARCHAR columns, btree index tuples, S3 key limits) can store,
|
|
32
|
+
* no matter what a caller stuffs into a token. The substitution is
|
|
33
|
+
* deterministic: writes and continuation lookups build the same key.
|
|
34
|
+
*
|
|
35
|
+
* | Key | Value |
|
|
36
|
+
* | --- | --- |
|
|
37
|
+
* | `agentkit/v1/{agent}/session/{sessionId}` | `SessionRecord` |
|
|
38
|
+
* | `agentkit/v1/{agent}/session-events/{sessionId}/{index}` | `SessionEvent[]` chunk (index = first event's index, zero-padded) |
|
|
39
|
+
* | `agentkit/v1/{agent}/continuation/{channelId}/{token}` | `{ sessionId }` |
|
|
40
|
+
* | `agentkit/v1/{agent}/kv/{key}` | Author JSON via `HostContext.kv` |
|
|
41
|
+
*
|
|
42
|
+
* The `eval-runs` / `ab-samples` / `ab-snapshot` families are minted only
|
|
43
|
+
* by the tables `defineStorage` derives over the KV core; a backend that
|
|
44
|
+
* authors dedicated `StorageConfig.evals` / `StorageConfig.abs` groups never
|
|
45
|
+
* sees them.
|
|
46
|
+
*/
|
|
47
|
+
export const storageKeys = {
|
|
48
|
+
session: (agent, sessionId) => `${STORAGE_KEY_ROOT}/${agent}/session/${sessionId}`,
|
|
49
|
+
sessionPrefix: (agent) => `${STORAGE_KEY_ROOT}/${agent}/session/`,
|
|
50
|
+
sessionEvents: (agent, sessionId, firstIndex) => `${STORAGE_KEY_ROOT}/${agent}/session-events/${sessionId}/${String(firstIndex).padStart(8, "0")}`,
|
|
51
|
+
sessionEventsPrefix: (agent, sessionId) => `${STORAGE_KEY_ROOT}/${agent}/session-events/${sessionId}/`,
|
|
52
|
+
continuation: (agent, channelId, continuationKey) => `${STORAGE_KEY_ROOT}/${agent}/continuation/${keySegment(channelId)}/${keySegment(continuationKey)}`,
|
|
53
|
+
/**
|
|
54
|
+
* Author-facing opaque JSON (see `HostContext.kv`). `key` is URI-encoded /
|
|
55
|
+
* digested like other caller-controlled segments.
|
|
56
|
+
*/
|
|
57
|
+
kv: (agent, key) => `${STORAGE_KEY_ROOT}/${agent}/kv/${keySegment(key)}`,
|
|
58
|
+
kvPrefix: (agent) => `${STORAGE_KEY_ROOT}/${agent}/kv/`,
|
|
59
|
+
/** One playground eval-run snapshot (derived `evals` table). */
|
|
60
|
+
evalRun: (agent, runId) => `${STORAGE_KEY_ROOT}/${agent}/eval-runs/${keySegment(runId)}`,
|
|
61
|
+
evalRunsPrefix: (agent) => `${STORAGE_KEY_ROOT}/${agent}/eval-runs/`,
|
|
62
|
+
/**
|
|
63
|
+
* One A/B metric sample (derived `abs` table); the segments mirror the
|
|
64
|
+
* dedicated table's row identity (experiment + sessionId + at).
|
|
65
|
+
*/
|
|
66
|
+
abSample: (agent, experiment, sessionId, at) => `${STORAGE_KEY_ROOT}/${agent}/ab-samples/${keySegment(experiment)}/${keySegment(sessionId)}/${keySegment(at)}`,
|
|
67
|
+
/** Latest aggregate A/B snapshot (derived `abs` table, LWW). */
|
|
68
|
+
abSnapshot: (agent) => `${STORAGE_KEY_ROOT}/${agent}/ab-snapshot`,
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Max bytes a caller-controlled key segment may occupy after URI-encoding.
|
|
72
|
+
* Chosen so full keys stay well under common backend limits (Postgres btree
|
|
73
|
+
* index tuples cap at ~2704 bytes; S3 keys at 1024). Longer segments are
|
|
74
|
+
* replaced by their SHA-256 digest, keeping every minted key bounded.
|
|
75
|
+
*/
|
|
76
|
+
export const MAX_KEY_SEGMENT_BYTES = 256;
|
|
77
|
+
/**
|
|
78
|
+
* URI-encode one caller-controlled key segment, substituting a `sha256:…`
|
|
79
|
+
* digest of the raw value when the encoding exceeds
|
|
80
|
+
* {@link MAX_KEY_SEGMENT_BYTES}. Deterministic, so key construction on the
|
|
81
|
+
* write path and the continuation-lookup path always agree.
|
|
82
|
+
*
|
|
83
|
+
* Exported for the session ledger, which builds its `session/` and
|
|
84
|
+
* `ledger/` keys with the same encoding rules.
|
|
85
|
+
*/
|
|
86
|
+
export function keySegment(raw) {
|
|
87
|
+
const encoded = encodeURIComponent(raw);
|
|
88
|
+
if (Buffer.byteLength(encoded, "utf8") <= MAX_KEY_SEGMENT_BYTES) {
|
|
89
|
+
return encoded;
|
|
90
|
+
}
|
|
91
|
+
return `sha256:${createHash("sha256").update(raw, "utf8").digest("hex")}`;
|
|
92
|
+
}
|
|
93
|
+
export function isDurableSessionRecordKey(key) {
|
|
94
|
+
const match = DURABLE_SESSION_RECORD_KEY_RE.exec(key);
|
|
95
|
+
return match !== null && match[1] !== "_cp";
|
|
96
|
+
}
|
|
97
|
+
function isRecord(value) {
|
|
98
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
99
|
+
}
|
|
100
|
+
function stringValue(value) {
|
|
101
|
+
return typeof value === "string" ? value : undefined;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Tolerant `SessionRecord` decoder. Extra fields (`auth`, `purpose`, ledger
|
|
105
|
+
* extras, future keys) are ignored. Returns undefined when required list
|
|
106
|
+
* fields are missing or the wrong type.
|
|
107
|
+
*/
|
|
108
|
+
export function parseDurableSessionRecord(value) {
|
|
109
|
+
if (!isRecord(value)) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const sessionId = stringValue(value.sessionId);
|
|
113
|
+
const channelId = stringValue(value.channelId);
|
|
114
|
+
const mode = stringValue(value.mode);
|
|
115
|
+
const turnCount = typeof value.turnCount === "number" ? value.turnCount : undefined;
|
|
116
|
+
const createdAt = stringValue(value.createdAt);
|
|
117
|
+
const updatedAt = stringValue(value.updatedAt);
|
|
118
|
+
if (sessionId === undefined ||
|
|
119
|
+
sessionId.length === 0 ||
|
|
120
|
+
channelId === undefined ||
|
|
121
|
+
mode === undefined ||
|
|
122
|
+
turnCount === undefined ||
|
|
123
|
+
createdAt === undefined ||
|
|
124
|
+
updatedAt === undefined) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
if (value.continuationKey !== undefined &&
|
|
128
|
+
value.continuationKey !== null &&
|
|
129
|
+
typeof value.continuationKey !== "string") {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
const continuationKey = value.continuationKey;
|
|
133
|
+
return {
|
|
134
|
+
sessionId,
|
|
135
|
+
channelId,
|
|
136
|
+
mode,
|
|
137
|
+
continuationKey,
|
|
138
|
+
title: typeof value.title === "string" ? value.title : undefined,
|
|
139
|
+
turnCount,
|
|
140
|
+
createdAt,
|
|
141
|
+
updatedAt,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export function summarizeDurableSessionRecord(args) {
|
|
145
|
+
const { record, running } = args;
|
|
146
|
+
return {
|
|
147
|
+
sessionId: record.sessionId,
|
|
148
|
+
channelId: record.channelId,
|
|
149
|
+
mode: record.mode,
|
|
150
|
+
title: record.title,
|
|
151
|
+
turnCount: record.turnCount,
|
|
152
|
+
createdAt: record.createdAt,
|
|
153
|
+
updatedAt: record.updatedAt,
|
|
154
|
+
running,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Golden persisted record: required list fields plus extras a future engine
|
|
159
|
+
* might write. Both this package and the CP decoder must accept it.
|
|
160
|
+
*/
|
|
161
|
+
export const GOLDEN_DURABLE_SESSION_RECORD = {
|
|
162
|
+
sessionId: "ses_aaaaaaaaaaaaaaaaaaaaaaaa",
|
|
163
|
+
channelId: "playground",
|
|
164
|
+
mode: "chat",
|
|
165
|
+
purpose: "live",
|
|
166
|
+
continuationKey: "cont_key_1",
|
|
167
|
+
auth: { kind: "user", userId: 42 },
|
|
168
|
+
title: "Weather in NYC",
|
|
169
|
+
turnCount: 3,
|
|
170
|
+
createdAt: "2026-08-01T12:00:00.000Z",
|
|
171
|
+
updatedAt: "2026-08-01T12:05:00.000Z",
|
|
172
|
+
extraUnknownField: { nested: true },
|
|
173
|
+
};
|
package/dist/storage.d.ts
CHANGED
|
@@ -55,6 +55,8 @@ import type { ABMetricSample } from "./ab.js";
|
|
|
55
55
|
import type { EvalRunSnapshot } from "./evals.js";
|
|
56
56
|
import type { ABSnapshot } from "./internal/ab-snapshot.js";
|
|
57
57
|
import type { JsonValue, KvCasResult, KvVersionedEntry } from "./types.js";
|
|
58
|
+
export type { DurableSessionRecord, DurableSessionSummary, } from "./storage-protocol.js";
|
|
59
|
+
export { GOLDEN_DURABLE_SESSION_RECORD, isDurableSessionRecordKey, keySegment, MAX_KEY_SEGMENT_BYTES, parseDurableSessionRecord, STORAGE_KEY_ROOT, storageKeys, summarizeDurableSessionRecord, } from "./storage-protocol.js";
|
|
58
60
|
/** One `{ key, value }` pair returned by {@link StorageConfig.list}. */
|
|
59
61
|
export interface StorageEntry {
|
|
60
62
|
key: string;
|
|
@@ -240,78 +242,6 @@ export type StorageDefinition = StorageConfig & {
|
|
|
240
242
|
* export). See the module doc for semantics and an example.
|
|
241
243
|
*/
|
|
242
244
|
export declare function defineStorage(config: StorageConfig): StorageDefinition;
|
|
243
|
-
/**
|
|
244
|
-
* Framework-owned key root. All {@link storageKeys} values live under this
|
|
245
|
-
* prefix so a shared store can route or namespace Agent SDK data.
|
|
246
|
-
*/
|
|
247
|
-
export declare const STORAGE_KEY_ROOT: "agentkit/v1";
|
|
248
|
-
/**
|
|
249
|
-
* The framework-owned key scheme. Keys are a **stable, versioned contract**
|
|
250
|
-
* under {@link STORAGE_KEY_ROOT}: sinks may treat them as opaque strings, or
|
|
251
|
-
* route on prefixes (e.g. event chunks to object storage, everything else
|
|
252
|
-
* to a database). Channel ids and continuation tokens are the only segments
|
|
253
|
-
* that may contain caller-controlled characters; they are URI-encoded, and
|
|
254
|
-
* a segment whose encoding exceeds {@link MAX_KEY_SEGMENT_BYTES} is replaced
|
|
255
|
-
* by a `sha256:…` digest — so every minted key has a bounded length that any
|
|
256
|
-
* backend (VARCHAR columns, btree index tuples, S3 key limits) can store,
|
|
257
|
-
* no matter what a caller stuffs into a token. The substitution is
|
|
258
|
-
* deterministic: writes and continuation lookups build the same key.
|
|
259
|
-
*
|
|
260
|
-
* | Key | Value |
|
|
261
|
-
* | --- | --- |
|
|
262
|
-
* | `agentkit/v1/{agent}/session/{sessionId}` | `SessionRecord` |
|
|
263
|
-
* | `agentkit/v1/{agent}/session-events/{sessionId}/{index}` | `SessionEvent[]` chunk (index = first event's index, zero-padded) |
|
|
264
|
-
* | `agentkit/v1/{agent}/continuation/{channelId}/{token}` | `{ sessionId }` |
|
|
265
|
-
* | `agentkit/v1/{agent}/kv/{key}` | Author JSON via {@link HostContext.kv} |
|
|
266
|
-
* | `agentkit/v1/{agent}/eval-runs/{runId}` | `EvalRunSnapshot` (derived `evals` table) |
|
|
267
|
-
* | `agentkit/v1/{agent}/ab-samples/{experiment}/{sessionId}/{at}` | `ABMetricSample` (derived `abs` table, append-only) |
|
|
268
|
-
* | `agentkit/v1/{agent}/ab-snapshot` | `ABSnapshot` (derived `abs` table, LWW) |
|
|
269
|
-
*
|
|
270
|
-
* The `eval-runs` / `ab-samples` / `ab-snapshot` families are minted only
|
|
271
|
-
* by the tables `defineStorage` derives over the KV core; a backend that
|
|
272
|
-
* authors dedicated {@link StorageConfig.evals} / {@link StorageConfig.abs}
|
|
273
|
-
* groups never sees them.
|
|
274
|
-
*/
|
|
275
|
-
export declare const storageKeys: {
|
|
276
|
-
readonly session: (agent: string, sessionId: string) => string;
|
|
277
|
-
readonly sessionPrefix: (agent: string) => string;
|
|
278
|
-
readonly sessionEvents: (agent: string, sessionId: string, firstIndex: number) => string;
|
|
279
|
-
readonly sessionEventsPrefix: (agent: string, sessionId: string) => string;
|
|
280
|
-
readonly continuation: (agent: string, channelId: string, continuationKey: string) => string;
|
|
281
|
-
/**
|
|
282
|
-
* Author-facing opaque JSON (see {@link HostContext.kv}). `key` is
|
|
283
|
-
* URI-encoded / digested like other caller-controlled segments.
|
|
284
|
-
*/
|
|
285
|
-
readonly kv: (agent: string, key: string) => string;
|
|
286
|
-
readonly kvPrefix: (agent: string) => string;
|
|
287
|
-
/** One playground eval-run snapshot (derived `evals` table). */
|
|
288
|
-
readonly evalRun: (agent: string, runId: string) => string;
|
|
289
|
-
readonly evalRunsPrefix: (agent: string) => string;
|
|
290
|
-
/**
|
|
291
|
-
* One A/B metric sample (derived `abs` table); the segments mirror the
|
|
292
|
-
* dedicated table's row identity (experiment + sessionId + at).
|
|
293
|
-
*/
|
|
294
|
-
readonly abSample: (agent: string, experiment: string, sessionId: string, at: string) => string;
|
|
295
|
-
/** Latest aggregate A/B snapshot (derived `abs` table, LWW). */
|
|
296
|
-
readonly abSnapshot: (agent: string) => string;
|
|
297
|
-
};
|
|
298
|
-
/**
|
|
299
|
-
* Max bytes a caller-controlled key segment may occupy after URI-encoding.
|
|
300
|
-
* Chosen so full keys stay well under common backend limits (Postgres btree
|
|
301
|
-
* index tuples cap at ~2704 bytes; S3 keys at 1024). Longer segments are
|
|
302
|
-
* replaced by their SHA-256 digest, keeping every minted key bounded.
|
|
303
|
-
*/
|
|
304
|
-
export declare const MAX_KEY_SEGMENT_BYTES = 256;
|
|
305
|
-
/**
|
|
306
|
-
* URI-encode one caller-controlled key segment, substituting a `sha256:…`
|
|
307
|
-
* digest of the raw value when the encoding exceeds
|
|
308
|
-
* {@link MAX_KEY_SEGMENT_BYTES}. Deterministic, so key construction on the
|
|
309
|
-
* write path and the continuation-lookup path always agree.
|
|
310
|
-
*
|
|
311
|
-
* Exported for the session ledger, which builds its `session/` and
|
|
312
|
-
* `ledger/` keys with the same encoding rules.
|
|
313
|
-
*/
|
|
314
|
-
export declare function keySegment(raw: string): string;
|
|
315
245
|
export declare const STORAGE_DEFAULT_RESTORE_MAX_SESSIONS = 1000;
|
|
316
246
|
export declare const STORAGE_DEFAULT_RESTORE_MAX_AGE_MS: number;
|
|
317
247
|
export declare const STORAGE_DEFAULT_RESTORE_MAX_TOTAL_BYTES = 1073741824;
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/storage.js
CHANGED
|
@@ -60,8 +60,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
60
60
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
61
61
|
});
|
|
62
62
|
};
|
|
63
|
-
import { createHash } from "node:crypto";
|
|
64
63
|
import { brandDefinition } from "./internal/brand.js";
|
|
64
|
+
import { storageKeys } from "./storage-protocol.js";
|
|
65
|
+
export { GOLDEN_DURABLE_SESSION_RECORD, isDurableSessionRecordKey, keySegment, MAX_KEY_SEGMENT_BYTES, parseDurableSessionRecord, STORAGE_KEY_ROOT, storageKeys, summarizeDurableSessionRecord, } from "./storage-protocol.js";
|
|
65
66
|
/**
|
|
66
67
|
* Author the project storage sink (`agent/storage.ts`, default
|
|
67
68
|
* export). See the module doc for semantics and an example.
|
|
@@ -165,87 +166,6 @@ function deriveAbsTable(config) {
|
|
|
165
166
|
}));
|
|
166
167
|
}
|
|
167
168
|
// ============================================================================
|
|
168
|
-
// Key scheme
|
|
169
|
-
// ============================================================================
|
|
170
|
-
/**
|
|
171
|
-
* Framework-owned key root. All {@link storageKeys} values live under this
|
|
172
|
-
* prefix so a shared store can route or namespace Agent SDK data.
|
|
173
|
-
*/
|
|
174
|
-
export const STORAGE_KEY_ROOT = "agentkit/v1";
|
|
175
|
-
/**
|
|
176
|
-
* The framework-owned key scheme. Keys are a **stable, versioned contract**
|
|
177
|
-
* under {@link STORAGE_KEY_ROOT}: sinks may treat them as opaque strings, or
|
|
178
|
-
* route on prefixes (e.g. event chunks to object storage, everything else
|
|
179
|
-
* to a database). Channel ids and continuation tokens are the only segments
|
|
180
|
-
* that may contain caller-controlled characters; they are URI-encoded, and
|
|
181
|
-
* a segment whose encoding exceeds {@link MAX_KEY_SEGMENT_BYTES} is replaced
|
|
182
|
-
* by a `sha256:…` digest — so every minted key has a bounded length that any
|
|
183
|
-
* backend (VARCHAR columns, btree index tuples, S3 key limits) can store,
|
|
184
|
-
* no matter what a caller stuffs into a token. The substitution is
|
|
185
|
-
* deterministic: writes and continuation lookups build the same key.
|
|
186
|
-
*
|
|
187
|
-
* | Key | Value |
|
|
188
|
-
* | --- | --- |
|
|
189
|
-
* | `agentkit/v1/{agent}/session/{sessionId}` | `SessionRecord` |
|
|
190
|
-
* | `agentkit/v1/{agent}/session-events/{sessionId}/{index}` | `SessionEvent[]` chunk (index = first event's index, zero-padded) |
|
|
191
|
-
* | `agentkit/v1/{agent}/continuation/{channelId}/{token}` | `{ sessionId }` |
|
|
192
|
-
* | `agentkit/v1/{agent}/kv/{key}` | Author JSON via {@link HostContext.kv} |
|
|
193
|
-
* | `agentkit/v1/{agent}/eval-runs/{runId}` | `EvalRunSnapshot` (derived `evals` table) |
|
|
194
|
-
* | `agentkit/v1/{agent}/ab-samples/{experiment}/{sessionId}/{at}` | `ABMetricSample` (derived `abs` table, append-only) |
|
|
195
|
-
* | `agentkit/v1/{agent}/ab-snapshot` | `ABSnapshot` (derived `abs` table, LWW) |
|
|
196
|
-
*
|
|
197
|
-
* The `eval-runs` / `ab-samples` / `ab-snapshot` families are minted only
|
|
198
|
-
* by the tables `defineStorage` derives over the KV core; a backend that
|
|
199
|
-
* authors dedicated {@link StorageConfig.evals} / {@link StorageConfig.abs}
|
|
200
|
-
* groups never sees them.
|
|
201
|
-
*/
|
|
202
|
-
export const storageKeys = {
|
|
203
|
-
session: (agent, sessionId) => `${STORAGE_KEY_ROOT}/${agent}/session/${sessionId}`,
|
|
204
|
-
sessionPrefix: (agent) => `${STORAGE_KEY_ROOT}/${agent}/session/`,
|
|
205
|
-
sessionEvents: (agent, sessionId, firstIndex) => `${STORAGE_KEY_ROOT}/${agent}/session-events/${sessionId}/${String(firstIndex).padStart(8, "0")}`,
|
|
206
|
-
sessionEventsPrefix: (agent, sessionId) => `${STORAGE_KEY_ROOT}/${agent}/session-events/${sessionId}/`,
|
|
207
|
-
continuation: (agent, channelId, continuationKey) => `${STORAGE_KEY_ROOT}/${agent}/continuation/${keySegment(channelId)}/${keySegment(continuationKey)}`,
|
|
208
|
-
/**
|
|
209
|
-
* Author-facing opaque JSON (see {@link HostContext.kv}). `key` is
|
|
210
|
-
* URI-encoded / digested like other caller-controlled segments.
|
|
211
|
-
*/
|
|
212
|
-
kv: (agent, key) => `${STORAGE_KEY_ROOT}/${agent}/kv/${keySegment(key)}`,
|
|
213
|
-
kvPrefix: (agent) => `${STORAGE_KEY_ROOT}/${agent}/kv/`,
|
|
214
|
-
/** One playground eval-run snapshot (derived `evals` table). */
|
|
215
|
-
evalRun: (agent, runId) => `${STORAGE_KEY_ROOT}/${agent}/eval-runs/${keySegment(runId)}`,
|
|
216
|
-
evalRunsPrefix: (agent) => `${STORAGE_KEY_ROOT}/${agent}/eval-runs/`,
|
|
217
|
-
/**
|
|
218
|
-
* One A/B metric sample (derived `abs` table); the segments mirror the
|
|
219
|
-
* dedicated table's row identity (experiment + sessionId + at).
|
|
220
|
-
*/
|
|
221
|
-
abSample: (agent, experiment, sessionId, at) => `${STORAGE_KEY_ROOT}/${agent}/ab-samples/${keySegment(experiment)}/${keySegment(sessionId)}/${keySegment(at)}`,
|
|
222
|
-
/** Latest aggregate A/B snapshot (derived `abs` table, LWW). */
|
|
223
|
-
abSnapshot: (agent) => `${STORAGE_KEY_ROOT}/${agent}/ab-snapshot`,
|
|
224
|
-
};
|
|
225
|
-
/**
|
|
226
|
-
* Max bytes a caller-controlled key segment may occupy after URI-encoding.
|
|
227
|
-
* Chosen so full keys stay well under common backend limits (Postgres btree
|
|
228
|
-
* index tuples cap at ~2704 bytes; S3 keys at 1024). Longer segments are
|
|
229
|
-
* replaced by their SHA-256 digest, keeping every minted key bounded.
|
|
230
|
-
*/
|
|
231
|
-
export const MAX_KEY_SEGMENT_BYTES = 256;
|
|
232
|
-
/**
|
|
233
|
-
* URI-encode one caller-controlled key segment, substituting a `sha256:…`
|
|
234
|
-
* digest of the raw value when the encoding exceeds
|
|
235
|
-
* {@link MAX_KEY_SEGMENT_BYTES}. Deterministic, so key construction on the
|
|
236
|
-
* write path and the continuation-lookup path always agree.
|
|
237
|
-
*
|
|
238
|
-
* Exported for the session ledger, which builds its `session/` and
|
|
239
|
-
* `ledger/` keys with the same encoding rules.
|
|
240
|
-
*/
|
|
241
|
-
export function keySegment(raw) {
|
|
242
|
-
const encoded = encodeURIComponent(raw);
|
|
243
|
-
if (Buffer.byteLength(encoded, "utf8") <= MAX_KEY_SEGMENT_BYTES) {
|
|
244
|
-
return encoded;
|
|
245
|
-
}
|
|
246
|
-
return `sha256:${createHash("sha256").update(raw, "utf8").digest("hex")}`;
|
|
247
|
-
}
|
|
248
|
-
// ============================================================================
|
|
249
169
|
// Policy resolution
|
|
250
170
|
// ============================================================================
|
|
251
171
|
export const STORAGE_DEFAULT_RESTORE_MAX_SESSIONS = 1000;
|
package/dist/tools.d.ts
CHANGED
|
@@ -60,6 +60,11 @@ type ServerToolConfig<TSchema> = {
|
|
|
60
60
|
description: string;
|
|
61
61
|
execution?: "server";
|
|
62
62
|
inputSchema?: TSchema;
|
|
63
|
+
/**
|
|
64
|
+
* JSON Schema for the tool's structured output (zod converted at
|
|
65
|
+
* discovery, never validated against). Advertised when declared.
|
|
66
|
+
*/
|
|
67
|
+
outputSchema?: z.ZodTypeAny | JsonSchemaObject;
|
|
63
68
|
needsApproval?: ToolNeedsApproval<ToolInput<TSchema>>;
|
|
64
69
|
execute: (input: ToolInput<TSchema>, ctx: ToolContext) => ToolExecuteResult | Promise<ToolExecuteResult>;
|
|
65
70
|
script?: never;
|
|
@@ -68,6 +73,8 @@ type AgentToolConfig<TSchema> = {
|
|
|
68
73
|
description: string;
|
|
69
74
|
execution: "agent";
|
|
70
75
|
inputSchema?: TSchema;
|
|
76
|
+
/** Output JSON Schema; advertised when declared, never validated against. */
|
|
77
|
+
outputSchema?: z.ZodTypeAny | JsonSchemaObject;
|
|
71
78
|
/**
|
|
72
79
|
* Shell script written into the session workspace. Receives a JSON
|
|
73
80
|
* object on stdin and should print the result on stdout.
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,UAAU,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,4EAA4E;AAC5E,MAAM,MAAM,SAAS,CAAC,OAAO,IAAI,OAAO,SAAS,CAAC,CAAC,UAAU,GACzD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAChB,UAAU,CAAC;AAEf,KAAK,gBAAgB,CAAC,OAAO,IAAI;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,CACP,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EACzB,GAAG,EAAE,WAAW,KACb,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF,KAAK,eAAe,CAAC,OAAO,IAAI;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,uEAAuE;IACvE,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,OAAO,SAAS,CAAC,CAAC,UAAU,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAEvE,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,GAC3D,cAAc,CAEhB"}
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,UAAU,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,4EAA4E;AAC5E,MAAM,MAAM,SAAS,CAAC,OAAO,IAAI,OAAO,SAAS,CAAC,CAAC,UAAU,GACzD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAChB,UAAU,CAAC;AAEf,KAAK,gBAAgB,CAAC,OAAO,IAAI;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,gBAAgB,CAAC;IAC/C,aAAa,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,CACP,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EACzB,GAAG,EAAE,WAAW,KACb,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF,KAAK,eAAe,CAAC,OAAO,IAAI;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,gBAAgB,CAAC;IAC/C;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,uEAAuE;IACvE,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,OAAO,SAAS,CAAC,CAAC,UAAU,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAEvE,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,GAC3D,cAAc,CAEhB"}
|