@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.
Files changed (286) hide show
  1. package/AGENTS.md +4 -5
  2. package/README.md +23 -11
  3. package/dist/bin/agent-serve.js +11 -2
  4. package/dist/channels/github/api.d.ts +2 -0
  5. package/dist/channels/github/api.d.ts.map +1 -1
  6. package/dist/channels/github/api.js +2 -1
  7. package/dist/channels/github/binding.d.ts +7 -0
  8. package/dist/channels/github/binding.d.ts.map +1 -1
  9. package/dist/channels/github/binding.js +4 -0
  10. package/dist/channels/github/checks.d.ts +99 -0
  11. package/dist/channels/github/checks.d.ts.map +1 -0
  12. package/dist/channels/github/checks.js +108 -0
  13. package/dist/channels/github/cursor-account.d.ts +4 -4
  14. package/dist/channels/github/cursor-account.d.ts.map +1 -1
  15. package/dist/channels/github/cursor-account.js +7 -5
  16. package/dist/channels/github/index.d.ts +1 -0
  17. package/dist/channels/github/index.d.ts.map +1 -1
  18. package/dist/channels/github/index.js +1 -0
  19. package/dist/channels/github/types.d.ts +8 -0
  20. package/dist/channels/github/types.d.ts.map +1 -1
  21. package/dist/channels/slack/channel-watch.d.ts +2 -1
  22. package/dist/channels/slack/channel-watch.d.ts.map +1 -1
  23. package/dist/channels/slack/channel-watch.js +7 -3
  24. package/dist/channels/slack/dispatch.d.ts +9 -0
  25. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  26. package/dist/channels/slack/dispatch.js +41 -21
  27. package/dist/channels/slack/manifest.d.ts +2 -2
  28. package/dist/channels/slack/manifest.d.ts.map +1 -1
  29. package/dist/channels/slack/manifest.js +14 -11
  30. package/dist/channels/slack/nudge-store.d.ts +16 -0
  31. package/dist/channels/slack/nudge-store.d.ts.map +1 -1
  32. package/dist/channels/slack/nudge-store.js +53 -0
  33. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  34. package/dist/channels/slack/slack-channel.js +4 -1
  35. package/dist/channels/slack/types.d.ts +24 -7
  36. package/dist/channels/slack/types.d.ts.map +1 -1
  37. package/dist/connections.d.ts +17 -5
  38. package/dist/connections.d.ts.map +1 -1
  39. package/dist/connections.js +17 -5
  40. package/dist/docs/404.html +2 -2
  41. package/dist/docs/ab.html +3 -3
  42. package/dist/docs/assets/{app.B-biogkN.js → app.CdbcFD8T.js} +1 -1
  43. package/dist/docs/assets/chunks/@localSearchIndexroot.DQad--_z.js +1 -0
  44. package/dist/docs/assets/chunks/{VPLocalSearchBox.DZqKtFZS.js → VPLocalSearchBox.D_NKImM7.js} +1 -1
  45. package/dist/docs/assets/chunks/{theme.BwC5zP2r.js → theme.CMvz7cu9.js} +2 -2
  46. package/dist/docs/assets/{concepts.md.CqOsxbMU.js → concepts.md.BXAm6G-C.js} +1 -1
  47. package/dist/docs/assets/{guides_mcp-oauth.md.C7G7IykG.js → guides_mcp-oauth.md.CzEB6RaG.js} +1 -1
  48. package/dist/docs/assets/{reference_agent-config.md.DHkkvcEZ.js → reference_agent-config.md.BZnEKfEc.js} +3 -4
  49. package/dist/docs/assets/{reference_agent-config.md.DHkkvcEZ.lean.js → reference_agent-config.md.BZnEKfEc.lean.js} +1 -1
  50. package/dist/docs/assets/{reference_connections.md.CSQiNzre.js → reference_connections.md.Cu3N-S3Q.js} +26 -9
  51. package/dist/docs/assets/reference_connections.md.Cu3N-S3Q.lean.js +1 -0
  52. package/dist/docs/assets/{reference_sessions.md.DBVFi2Sx.js → reference_sessions.md.B0DdlM-K.js} +1 -1
  53. package/dist/docs/assets/{reference_tools.md.kJfJAP2m.js → reference_tools.md.DTg_kEsx.js} +2 -2
  54. package/dist/docs/assets/{reference_tools.md.kJfJAP2m.lean.js → reference_tools.md.DTg_kEsx.lean.js} +1 -1
  55. package/dist/docs/assets/troubleshooting.md.DQ-hYuZT.js +1 -0
  56. package/dist/docs/building-with-agents.html +3 -3
  57. package/dist/docs/concepts.html +5 -5
  58. package/dist/docs/deployment.html +3 -3
  59. package/dist/docs/evals.html +3 -3
  60. package/dist/docs/example-agents/approval-buddy.html +3 -3
  61. package/dist/docs/example-agents/benny.html +3 -3
  62. package/dist/docs/example-agents/bugbot.html +3 -3
  63. package/dist/docs/example-agents/codebase-wiki.html +3 -3
  64. package/dist/docs/example-agents/codeowners-review.html +3 -3
  65. package/dist/docs/example-agents/concierge.html +3 -3
  66. package/dist/docs/example-agents/fsd.html +3 -3
  67. package/dist/docs/example-agents/index.html +3 -3
  68. package/dist/docs/example-agents/knowledge-base.html +3 -3
  69. package/dist/docs/example-agents/oncall.html +3 -3
  70. package/dist/docs/example-agents/security-reviewer.html +3 -3
  71. package/dist/docs/example-agents/slack-agent.html +3 -3
  72. package/dist/docs/example-agents/weather-agent.html +3 -3
  73. package/dist/docs/guides/agent-to-agent.html +3 -3
  74. package/dist/docs/guides/cloud-runtime.html +3 -3
  75. package/dist/docs/guides/convert-automation.html +3 -3
  76. package/dist/docs/guides/github.html +3 -3
  77. package/dist/docs/guides/human-in-the-loop.html +3 -3
  78. package/dist/docs/guides/mcp-oauth.html +5 -5
  79. package/dist/docs/guides/opentelemetry.html +3 -3
  80. package/dist/docs/guides/slack.html +3 -3
  81. package/dist/docs/guides/webhooks.html +3 -3
  82. package/dist/docs/hashmap.json +1 -1
  83. package/dist/docs/hillclimbing.html +3 -3
  84. package/dist/docs/index.html +3 -3
  85. package/dist/docs/quickstart.html +3 -3
  86. package/dist/docs/reference/agent-config.html +5 -6
  87. package/dist/docs/reference/artifacts.html +3 -3
  88. package/dist/docs/reference/channels.html +3 -3
  89. package/dist/docs/reference/cli.html +3 -3
  90. package/dist/docs/reference/connections.html +28 -11
  91. package/dist/docs/reference/hooks.html +3 -3
  92. package/dist/docs/reference/http-api.html +3 -3
  93. package/dist/docs/reference/instructions.html +3 -3
  94. package/dist/docs/reference/playground.html +3 -3
  95. package/dist/docs/reference/project-layout.html +3 -3
  96. package/dist/docs/reference/prompt.html +3 -3
  97. package/dist/docs/reference/schedules.html +3 -3
  98. package/dist/docs/reference/sessions.html +5 -5
  99. package/dist/docs/reference/skills.html +3 -3
  100. package/dist/docs/reference/subagents.html +3 -3
  101. package/dist/docs/reference/tools.html +5 -5
  102. package/dist/docs/scaffolding-agents.html +3 -3
  103. package/dist/docs/storage.html +3 -3
  104. package/dist/docs/templates/agentic-owners.html +3 -3
  105. package/dist/docs/templates/demo.html +3 -3
  106. package/dist/docs/templates/pr-autofixer.html +3 -3
  107. package/dist/docs/templates/security-reviewer.html +3 -3
  108. package/dist/docs/templates/triage.html +3 -3
  109. package/dist/docs/troubleshooting.html +5 -5
  110. package/dist/files-backends/agent-store-presigned-url.js +1 -1
  111. package/dist/index.d.ts +2 -2
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +1 -1
  114. package/dist/internal/advertise-tools.d.ts +79 -0
  115. package/dist/internal/advertise-tools.d.ts.map +1 -0
  116. package/dist/internal/advertise-tools.js +185 -0
  117. package/dist/internal/cli-deploy.d.ts.map +1 -1
  118. package/dist/internal/cli-deploy.js +7 -1
  119. package/dist/internal/cli-manifest.d.ts +19 -0
  120. package/dist/internal/cli-manifest.d.ts.map +1 -0
  121. package/dist/internal/cli-manifest.js +49 -0
  122. package/dist/internal/cli-slack.d.ts.map +1 -1
  123. package/dist/internal/cli-slack.js +9 -1
  124. package/dist/internal/convert-automation/convert-workflow.d.ts.map +1 -1
  125. package/dist/internal/convert-automation/convert-workflow.js +2 -10
  126. package/dist/internal/cursor/account-mcp.d.ts +29 -3
  127. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  128. package/dist/internal/cursor/account-mcp.js +147 -67
  129. package/dist/internal/cursor/backend-client.d.ts +11 -6
  130. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  131. package/dist/internal/cursor/backend-client.js +32 -10
  132. package/dist/internal/cursor-account-mcp-auth.d.ts +11 -0
  133. package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
  134. package/dist/internal/cursor-account-mcp-auth.js +69 -0
  135. package/dist/internal/cursor-agent-template.d.ts +9 -0
  136. package/dist/internal/cursor-agent-template.d.ts.map +1 -0
  137. package/dist/internal/cursor-agent-template.js +37 -0
  138. package/dist/internal/deploy-client.d.ts +1 -0
  139. package/dist/internal/deploy-client.d.ts.map +1 -1
  140. package/dist/internal/deploy-client.js +18 -2
  141. package/dist/internal/deploy-manifest.d.ts +76 -0
  142. package/dist/internal/deploy-manifest.d.ts.map +1 -0
  143. package/dist/internal/deploy-manifest.js +117 -0
  144. package/dist/internal/deployment-scm-event-stream.d.ts +116 -0
  145. package/dist/internal/deployment-scm-event-stream.d.ts.map +1 -0
  146. package/dist/internal/deployment-scm-event-stream.js +474 -0
  147. package/dist/internal/discovery.d.ts.map +1 -1
  148. package/dist/internal/discovery.js +111 -10
  149. package/dist/internal/init-project.d.ts.map +1 -1
  150. package/dist/internal/init-project.js +12 -123
  151. package/dist/internal/init-scaffold.d.ts +8 -0
  152. package/dist/internal/init-scaffold.d.ts.map +1 -0
  153. package/dist/internal/init-scaffold.js +168 -0
  154. package/dist/internal/inline-stdio-mcp.d.ts +2 -0
  155. package/dist/internal/inline-stdio-mcp.d.ts.map +1 -1
  156. package/dist/internal/inline-stdio-mcp.js +10 -8
  157. package/dist/internal/json-schema.d.ts +7 -0
  158. package/dist/internal/json-schema.d.ts.map +1 -1
  159. package/dist/internal/json-schema.js +18 -3
  160. package/dist/internal/mcp-endpoint.js +7 -7
  161. package/dist/internal/mcp-host.d.ts +18 -0
  162. package/dist/internal/mcp-host.d.ts.map +1 -1
  163. package/dist/internal/mcp-host.js +43 -5
  164. package/dist/internal/mcp-oauth.d.ts +22 -0
  165. package/dist/internal/mcp-oauth.d.ts.map +1 -1
  166. package/dist/internal/mcp-oauth.js +40 -1
  167. package/dist/internal/package-inline-stdio.d.ts.map +1 -1
  168. package/dist/internal/package-inline-stdio.js +5 -5
  169. package/dist/internal/review-comments.d.ts +97 -0
  170. package/dist/internal/review-comments.d.ts.map +1 -1
  171. package/dist/internal/review-comments.js +151 -0
  172. package/dist/internal/sanitize-mcp-tool-name.d.ts +20 -0
  173. package/dist/internal/sanitize-mcp-tool-name.d.ts.map +1 -0
  174. package/dist/internal/sanitize-mcp-tool-name.js +30 -0
  175. package/dist/internal/sdk-runner.d.ts +1 -1
  176. package/dist/internal/sdk-runner.d.ts.map +1 -1
  177. package/dist/internal/sdk-runner.js +36 -13
  178. package/dist/internal/server.d.ts.map +1 -1
  179. package/dist/internal/server.js +18 -0
  180. package/dist/internal/session-engine.d.ts +66 -0
  181. package/dist/internal/session-engine.d.ts.map +1 -1
  182. package/dist/internal/session-engine.js +428 -110
  183. package/dist/internal/shallow-clone.d.ts +170 -0
  184. package/dist/internal/shallow-clone.d.ts.map +1 -0
  185. package/dist/internal/shallow-clone.js +412 -0
  186. package/dist/internal/slack-provision-client.d.ts +2 -0
  187. package/dist/internal/slack-provision-client.d.ts.map +1 -1
  188. package/dist/internal/slack-provision-client.js +1 -0
  189. package/dist/internal/terminal-style.d.ts +18 -0
  190. package/dist/internal/terminal-style.d.ts.map +1 -1
  191. package/dist/internal/terminal-style.js +46 -1
  192. package/dist/internal/turn-lease-store.d.ts +44 -0
  193. package/dist/internal/turn-lease-store.d.ts.map +1 -0
  194. package/dist/internal/turn-lease-store.js +139 -0
  195. package/dist/internal/workspace.d.ts +14 -0
  196. package/dist/internal/workspace.d.ts.map +1 -1
  197. package/dist/internal/workspace.js +33 -0
  198. package/dist/playground/assets/index-77uhu5Kr.css +1 -0
  199. package/dist/playground/assets/index-D4buox4m.js +85 -0
  200. package/dist/playground/index.html +2 -2
  201. package/dist/storage-protocol.d.ts +122 -0
  202. package/dist/storage-protocol.d.ts.map +1 -0
  203. package/dist/storage-protocol.js +173 -0
  204. package/dist/storage.d.ts +2 -72
  205. package/dist/storage.d.ts.map +1 -1
  206. package/dist/storage.js +2 -82
  207. package/dist/tools.d.ts +7 -0
  208. package/dist/tools.d.ts.map +1 -1
  209. package/dist/types.d.ts +141 -6
  210. package/dist/types.d.ts.map +1 -1
  211. package/docs/concepts.md +4 -4
  212. package/docs/guides/mcp-oauth.md +3 -1
  213. package/docs/reference/agent-config.md +11 -12
  214. package/docs/reference/connections.md +108 -10
  215. package/docs/reference/sessions.md +2 -2
  216. package/docs/reference/tools.md +14 -0
  217. package/docs/troubleshooting.md +3 -2
  218. package/package.json +7 -2
  219. package/skills/create-agent/SKILL.md +12 -9
  220. package/skills/debug/SKILL.md +2 -1
  221. package/skills/framework-map/SKILL.md +6 -6
  222. package/skills/mcp-auth/SKILL.md +8 -6
  223. package/src/bin/agent-serve.ts +12 -2
  224. package/src/channels/github/api.ts +6 -1
  225. package/src/channels/github/binding.ts +21 -0
  226. package/src/channels/github/checks.ts +179 -0
  227. package/src/channels/github/cursor-account.ts +9 -6
  228. package/src/channels/github/index.ts +1 -0
  229. package/src/channels/github/types.ts +8 -0
  230. package/src/channels/slack/channel-watch.ts +6 -3
  231. package/src/channels/slack/dispatch.ts +40 -3
  232. package/src/channels/slack/manifest.ts +9 -10
  233. package/src/channels/slack/nudge-store.ts +56 -0
  234. package/src/channels/slack/slack-channel.ts +3 -0
  235. package/src/channels/slack/types.ts +24 -7
  236. package/src/connections.ts +17 -5
  237. package/src/index.ts +5 -0
  238. package/src/internal/advertise-tools.ts +278 -0
  239. package/src/internal/cli-deploy.ts +11 -1
  240. package/src/internal/cli-manifest.ts +63 -0
  241. package/src/internal/cli-slack.ts +10 -1
  242. package/src/internal/convert-automation/convert-workflow.ts +2 -11
  243. package/src/internal/cursor/account-mcp.ts +208 -73
  244. package/src/internal/cursor/backend-client.ts +45 -11
  245. package/src/internal/cursor-account-mcp-auth.ts +83 -0
  246. package/src/internal/cursor-agent-template.ts +46 -0
  247. package/src/internal/deploy-client.ts +25 -6
  248. package/src/internal/deploy-manifest.ts +161 -0
  249. package/src/internal/deployment-scm-event-stream.ts +593 -0
  250. package/src/internal/discovery.ts +132 -3
  251. package/src/internal/init-project.ts +18 -153
  252. package/src/internal/init-scaffold.ts +176 -0
  253. package/src/internal/inline-stdio-mcp.ts +13 -0
  254. package/src/internal/json-schema.ts +24 -3
  255. package/src/internal/mcp-endpoint.ts +6 -0
  256. package/src/internal/mcp-host.ts +70 -9
  257. package/src/internal/mcp-oauth.ts +55 -1
  258. package/src/internal/package-inline-stdio.ts +5 -1
  259. package/src/internal/review-comments.ts +245 -0
  260. package/src/internal/sanitize-mcp-tool-name.ts +33 -0
  261. package/src/internal/sdk-runner.ts +50 -11
  262. package/src/internal/server.ts +19 -0
  263. package/src/internal/session-engine.ts +392 -19
  264. package/src/internal/shallow-clone.ts +595 -0
  265. package/src/internal/slack-provision-client.ts +3 -0
  266. package/src/internal/terminal-style.ts +67 -1
  267. package/src/internal/turn-lease-store.ts +147 -0
  268. package/src/internal/workspace.ts +33 -0
  269. package/src/storage-protocol.ts +247 -0
  270. package/src/storage.ts +16 -110
  271. package/src/tools.ts +7 -0
  272. package/src/types.ts +149 -7
  273. package/templates/agentic-owners/agent/agent.ts +3 -0
  274. package/templates/demo/agent/agent.ts +3 -0
  275. package/templates/pr-autofixer/agent/lib/drive-schemas.ts +4 -1
  276. package/templates/security-reviewer/agent/agent.ts +3 -0
  277. package/templates/triage/agent/agent.ts +3 -0
  278. package/dist/docs/assets/chunks/@localSearchIndexroot.5ozYNf74.js +0 -1
  279. package/dist/docs/assets/reference_connections.md.CSQiNzre.lean.js +0 -1
  280. package/dist/docs/assets/troubleshooting.md.CuVztCKs.js +0 -1
  281. package/dist/playground/assets/index-B4rcOgeP.css +0 -1
  282. package/dist/playground/assets/index-DXcY42Jv.js +0 -85
  283. /package/dist/docs/assets/{concepts.md.CqOsxbMU.lean.js → concepts.md.BXAm6G-C.lean.js} +0 -0
  284. /package/dist/docs/assets/{guides_mcp-oauth.md.C7G7IykG.lean.js → guides_mcp-oauth.md.CzEB6RaG.lean.js} +0 -0
  285. /package/dist/docs/assets/{reference_sessions.md.DBVFi2Sx.lean.js → reference_sessions.md.B0DdlM-K.lean.js} +0 -0
  286. /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-DXcY42Jv.js"></script>
12
- <link rel="stylesheet" crossorigin href="./assets/index-B4rcOgeP.css">
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;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
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.
@@ -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"}