@cursor/july 0.1.4 → 0.1.6

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 (182) hide show
  1. package/dist/ab.d.ts +8 -95
  2. package/dist/ab.d.ts.map +1 -1
  3. package/dist/ab.js +9 -150
  4. package/dist/bin/agent-serve.js +14 -6
  5. package/dist/docs/404.html +2 -2
  6. package/dist/docs/ab.html +4 -4
  7. package/dist/docs/assets/{app.DF-Yx4OP.js → app.DMboGKUD.js} +1 -1
  8. package/dist/docs/assets/chunks/@localSearchIndexroot.O6eP7QZr.js +1 -0
  9. package/dist/docs/assets/chunks/{VPLocalSearchBox.DSeJSudL.js → VPLocalSearchBox.DkEqEnJU.js} +1 -1
  10. package/dist/docs/assets/chunks/{theme.DZVLTXOC.js → theme.ASugdMNm.js} +2 -2
  11. package/dist/docs/assets/deployment.md.BtfEsc9S.js +55 -0
  12. package/dist/docs/assets/deployment.md.BtfEsc9S.lean.js +1 -0
  13. package/dist/docs/assets/example-agents_approval-buddy.md.8R5phXb5.js +10 -0
  14. package/dist/docs/assets/example-agents_approval-buddy.md.8R5phXb5.lean.js +1 -0
  15. package/dist/docs/assets/example-agents_benny.md.B0gjhI-p.js +7 -0
  16. package/dist/docs/assets/example-agents_benny.md.B0gjhI-p.lean.js +1 -0
  17. package/dist/docs/assets/example-agents_bugbot.md.DelIdhxB.js +11 -0
  18. package/dist/docs/assets/example-agents_bugbot.md.DelIdhxB.lean.js +1 -0
  19. package/dist/docs/assets/example-agents_codebase-wiki.md.DC6sgwn0.js +8 -0
  20. package/dist/docs/assets/example-agents_codebase-wiki.md.DC6sgwn0.lean.js +1 -0
  21. package/dist/docs/assets/example-agents_codeowners-review.md.Ku_tG2RY.js +8 -0
  22. package/dist/docs/assets/example-agents_codeowners-review.md.Ku_tG2RY.lean.js +1 -0
  23. package/dist/docs/assets/example-agents_concierge.md.4rQTSMXt.js +23 -0
  24. package/dist/docs/assets/example-agents_concierge.md.4rQTSMXt.lean.js +1 -0
  25. package/dist/docs/assets/example-agents_fsd.md.CzgUrDfi.js +15 -0
  26. package/dist/docs/assets/example-agents_fsd.md.CzgUrDfi.lean.js +1 -0
  27. package/dist/docs/assets/example-agents_index.md.CRqJlnIf.js +2 -0
  28. package/dist/docs/assets/example-agents_index.md.CRqJlnIf.lean.js +1 -0
  29. package/dist/docs/assets/example-agents_knowledge-base.md.BPJiVueF.js +11 -0
  30. package/dist/docs/assets/example-agents_knowledge-base.md.BPJiVueF.lean.js +1 -0
  31. package/dist/docs/assets/example-agents_security-reviewer.md.D2rtwDTO.js +19 -0
  32. package/dist/docs/assets/example-agents_security-reviewer.md.D2rtwDTO.lean.js +1 -0
  33. package/dist/docs/assets/example-agents_slack-agent.md.buLbgvBf.js +5 -0
  34. package/dist/docs/assets/example-agents_slack-agent.md.buLbgvBf.lean.js +1 -0
  35. package/dist/docs/assets/example-agents_weather-agent.md.C9Qv-W0o.js +24 -0
  36. package/dist/docs/assets/example-agents_weather-agent.md.C9Qv-W0o.lean.js +1 -0
  37. package/dist/docs/assets/index.md.COiu-1jL.js +20 -0
  38. package/dist/docs/assets/{index.md.Cylk70gg.lean.js → index.md.COiu-1jL.lean.js} +1 -1
  39. package/dist/docs/assets/reference_cli.md.D189RBCH.js +60 -0
  40. package/dist/docs/assets/reference_cli.md.D189RBCH.lean.js +1 -0
  41. package/dist/docs/building-with-agents.html +4 -4
  42. package/dist/docs/concepts.html +4 -4
  43. package/dist/docs/deployment.html +58 -17
  44. package/dist/docs/evals.html +4 -4
  45. package/dist/docs/example-agents/approval-buddy.html +34 -0
  46. package/dist/docs/example-agents/benny.html +31 -0
  47. package/dist/docs/example-agents/bugbot.html +35 -0
  48. package/dist/docs/example-agents/codebase-wiki.html +32 -0
  49. package/dist/docs/example-agents/codeowners-review.html +32 -0
  50. package/dist/docs/example-agents/concierge.html +47 -0
  51. package/dist/docs/example-agents/fsd.html +39 -0
  52. package/dist/docs/example-agents/index.html +26 -0
  53. package/dist/docs/example-agents/knowledge-base.html +35 -0
  54. package/dist/docs/example-agents/security-reviewer.html +43 -0
  55. package/dist/docs/example-agents/slack-agent.html +29 -0
  56. package/dist/docs/example-agents/weather-agent.html +48 -0
  57. package/dist/docs/guides/agent-to-agent.html +4 -4
  58. package/dist/docs/guides/cloud-runtime.html +5 -5
  59. package/dist/docs/guides/github.html +4 -4
  60. package/dist/docs/guides/human-in-the-loop.html +4 -4
  61. package/dist/docs/guides/slack.html +4 -4
  62. package/dist/docs/guides/webhooks.html +4 -4
  63. package/dist/docs/hashmap.json +1 -1
  64. package/dist/docs/hillclimbing.html +4 -4
  65. package/dist/docs/index.html +7 -7
  66. package/dist/docs/quickstart.html +4 -4
  67. package/dist/docs/reference/agent-config.html +4 -4
  68. package/dist/docs/reference/channels.html +4 -4
  69. package/dist/docs/reference/cli.html +52 -30
  70. package/dist/docs/reference/connections.html +4 -4
  71. package/dist/docs/reference/hooks.html +4 -4
  72. package/dist/docs/reference/http-api.html +4 -4
  73. package/dist/docs/reference/instructions.html +4 -4
  74. package/dist/docs/reference/playground.html +4 -4
  75. package/dist/docs/reference/project-layout.html +4 -4
  76. package/dist/docs/reference/schedules.html +4 -4
  77. package/dist/docs/reference/sessions.html +4 -4
  78. package/dist/docs/reference/skills.html +4 -4
  79. package/dist/docs/reference/subagents.html +4 -4
  80. package/dist/docs/reference/tools.html +4 -4
  81. package/dist/docs/scaffolding-agents.html +4 -4
  82. package/dist/docs/storage.html +4 -4
  83. package/dist/docs/troubleshooting.html +4 -4
  84. package/dist/evals.d.ts +4 -61
  85. package/dist/evals.d.ts.map +1 -1
  86. package/dist/evals.js +3 -66
  87. package/dist/index.d.ts +1 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/internal/ab-collector.d.ts +7 -5
  90. package/dist/internal/ab-collector.d.ts.map +1 -1
  91. package/dist/internal/ab-collector.js +3 -14
  92. package/dist/internal/ab-snapshot.d.ts +2 -4
  93. package/dist/internal/ab-snapshot.d.ts.map +1 -1
  94. package/dist/internal/cli-ax.d.ts +18 -3
  95. package/dist/internal/cli-ax.d.ts.map +1 -1
  96. package/dist/internal/cli-ax.js +80 -42
  97. package/dist/internal/cli-deploy.d.ts.map +1 -1
  98. package/dist/internal/cli-deploy.js +5 -2
  99. package/dist/internal/cursor-event-relay.d.ts +4 -1
  100. package/dist/internal/cursor-event-relay.d.ts.map +1 -1
  101. package/dist/internal/cursor-event-relay.js +6 -0
  102. package/dist/internal/cursor-relay-core.d.ts +36 -1
  103. package/dist/internal/cursor-relay-core.d.ts.map +1 -1
  104. package/dist/internal/cursor-relay-core.js +89 -8
  105. package/dist/internal/cursor-slack-relay.d.ts +2 -2
  106. package/dist/internal/cursor-slack-relay.d.ts.map +1 -1
  107. package/dist/internal/cursor-slack-relay.js +4 -0
  108. package/dist/internal/discovery.js +3 -3
  109. package/dist/internal/eval-run-store.d.ts +33 -30
  110. package/dist/internal/eval-run-store.d.ts.map +1 -1
  111. package/dist/internal/eval-run-store.js +84 -96
  112. package/dist/internal/init-project.d.ts.map +1 -1
  113. package/dist/internal/init-project.js +3 -2
  114. package/dist/internal/playground-proxy.d.ts +5 -5
  115. package/dist/internal/playground-proxy.js +3 -3
  116. package/dist/internal/resolve-prod-target.d.ts +30 -0
  117. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  118. package/dist/internal/resolve-prod-target.js +74 -2
  119. package/dist/internal/server.d.ts.map +1 -1
  120. package/dist/internal/server.js +5 -3
  121. package/dist/internal/session-engine.d.ts +1 -2
  122. package/dist/internal/session-engine.d.ts.map +1 -1
  123. package/dist/internal/session-engine.js +14 -31
  124. package/dist/internal/storage-coordinator.d.ts +16 -15
  125. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  126. package/dist/internal/storage-coordinator.js +73 -80
  127. package/dist/playground/assets/cursor-icons-16-CQ50JpfO.woff2 +0 -0
  128. package/dist/playground/assets/index-7GJIUFQj.css +1 -0
  129. package/dist/playground/assets/index-mux9aj5P.js +319 -0
  130. package/dist/playground/index.html +2 -2
  131. package/dist/storage.d.ts +51 -10
  132. package/dist/storage.d.ts.map +1 -1
  133. package/dist/storage.js +27 -10
  134. package/docs/README.md +34 -5
  135. package/docs/deployment.md +352 -149
  136. package/docs/example-agents/approval-buddy.md +270 -0
  137. package/docs/example-agents/benny.md +186 -0
  138. package/docs/example-agents/bugbot.md +231 -0
  139. package/docs/example-agents/codebase-wiki.md +174 -0
  140. package/docs/example-agents/codeowners-review.md +195 -0
  141. package/docs/example-agents/concierge.md +205 -0
  142. package/docs/example-agents/fsd.md +330 -0
  143. package/docs/example-agents/index.md +102 -0
  144. package/docs/example-agents/knowledge-base.md +171 -0
  145. package/docs/example-agents/security-reviewer.md +296 -0
  146. package/docs/example-agents/slack-agent.md +146 -0
  147. package/docs/example-agents/weather-agent.md +302 -0
  148. package/docs/reference/cli.md +546 -147
  149. package/package.json +1 -1
  150. package/src/ab.ts +9 -261
  151. package/src/bin/agent-serve.ts +14 -6
  152. package/src/evals.ts +4 -118
  153. package/src/index.ts +2 -0
  154. package/src/internal/ab-collector.ts +12 -22
  155. package/src/internal/ab-snapshot.ts +2 -4
  156. package/src/internal/cli-ax.ts +101 -45
  157. package/src/internal/cli-deploy.ts +5 -2
  158. package/src/internal/cursor-event-relay.ts +10 -1
  159. package/src/internal/cursor-relay-core.ts +115 -9
  160. package/src/internal/cursor-slack-relay.ts +6 -2
  161. package/src/internal/discovery.ts +2 -2
  162. package/src/internal/eval-run-store.ts +86 -100
  163. package/src/internal/init-project.ts +3 -2
  164. package/src/internal/playground-proxy.ts +5 -5
  165. package/src/internal/resolve-prod-target.ts +101 -3
  166. package/src/internal/server.ts +5 -3
  167. package/src/internal/session-engine.ts +9 -29
  168. package/src/internal/storage-coordinator.ts +109 -101
  169. package/src/storage.ts +79 -14
  170. package/dist/docs/assets/chunks/@localSearchIndexroot.0XrheBv2.js +0 -1
  171. package/dist/docs/assets/deployment.md.DTKwE15Z.js +0 -14
  172. package/dist/docs/assets/deployment.md.DTKwE15Z.lean.js +0 -1
  173. package/dist/docs/assets/index.md.Cylk70gg.js +0 -20
  174. package/dist/docs/assets/reference_cli.md.Bv6pOxcF.js +0 -38
  175. package/dist/docs/assets/reference_cli.md.Bv6pOxcF.lean.js +0 -1
  176. package/dist/internal/json-dir-store.d.ts +0 -32
  177. package/dist/internal/json-dir-store.d.ts.map +0 -1
  178. package/dist/internal/json-dir-store.js +0 -100
  179. package/dist/playground/assets/cursor-icons-outline-BxTT_FVJ.woff2 +0 -0
  180. package/dist/playground/assets/index-Ct_Usdm8.css +0 -1
  181. package/dist/playground/assets/index-Dsyb-Vaj.js +0 -319
  182. package/src/internal/json-dir-store.ts +0 -109
package/dist/ab.d.ts CHANGED
@@ -10,9 +10,8 @@
10
10
  *
11
11
  * Assignments and foldable metrics live in each session's `events.ndjson`
12
12
  * (survive serve restart). Optional project defaults in `agent/ab.config.ts`
13
- * ({@link defineABConfig}) let authors retain the playground fold window and
14
- * persist samples / aggregate snapshots wherever they like same idea as
15
- * eval `persistRuns`.
13
+ * ({@link defineABConfig}) cap the playground fold window; durable
14
+ * sample/snapshot export lives on the `defineStorage` `abs` table.
16
15
  *
17
16
  * ```ts
18
17
  * import { defineAB, splitBySessionHash } from "@anysphere/agent-serve/ab";
@@ -30,7 +29,6 @@
30
29
  * });
31
30
  * ```
32
31
  */
33
- import type { ABSnapshot } from "./internal/ab-snapshot.js";
34
32
  import type { SessionEvent, SessionInfo } from "./types.js";
35
33
  export type { ABSnapshot } from "./internal/ab-snapshot.js";
36
34
  export interface ABVariantMeta {
@@ -170,88 +168,29 @@ export declare function mergeABInstructions(base: string | undefined, abs: Reado
170
168
  export declare const AB_DEFAULT_MAX_PLAYGROUND_SESSIONS = 200;
171
169
  /** Hard ceiling for {@link ABConfigFile.maxPlaygroundSessions}. */
172
170
  export declare const AB_MAX_PLAYGROUND_SESSIONS = 10000;
173
- /** Default snapshot files kept when {@link ABConfigFile.persistSnapshots} is set. */
174
- export declare const AB_DEFAULT_RETAIN_SNAPSHOTS = 20;
175
- /** Hard ceiling for {@link ABConfigFile.retainSnapshots}. */
176
- export declare const AB_MAX_RETAIN_SNAPSHOTS = 500;
177
- /** Context passed to A/B persistence hooks. */
178
- export interface ABPersistContext {
179
- /** Absolute agent project root (directory that contains `agent/`). */
180
- projectRoot: string;
181
- }
182
- /**
183
- * Durable sink for {@link ABMetricSample} rows (same payload as
184
- * {@link ABConfig.onSample}). Session `events.ndjson` remains the source of
185
- * truth for assignment + fold; this is for analytics export.
186
- */
187
- export interface ABSamplePersistence {
188
- save(sample: ABMetricSample, ctx: ABPersistContext): void | Promise<void>;
189
- }
190
- /**
191
- * Durable store for playground-style aggregate snapshots (`GET /v1/abs`).
192
- * Without this, aggregates are always recomputed from session logs (nothing
193
- * is kept after sessions are pruned).
194
- *
195
- * **Runtime note:** `serve` currently only calls {@link save} (after each
196
- * `GET /v1/abs`). {@link load} / {@link delete} are for author tooling or a
197
- * custom store; they are not wired into the playground hydrate path.
198
- */
199
- export interface ABSnapshotPersistence {
200
- load(ctx: ABPersistContext): ABSnapshot[] | Promise<ABSnapshot[]>;
201
- save(snapshot: ABSnapshot, ctx: ABPersistContext): void | Promise<void>;
202
- delete?(snapshotId: string, ctx: ABPersistContext): void | Promise<void>;
203
- }
204
171
  /**
205
172
  * Project-wide A/B defaults (`agent/ab.config.ts`).
206
173
  *
207
174
  * **Assignments and foldable metrics** already persist in each session's
208
- * `events.ndjson` under `--state-root`. Use this config to:
209
- * - cap how many sessions the playground / `GET /v1/abs` folds
210
- * - export samples and/or aggregate snapshots to author-chosen storage
175
+ * `events.ndjson` under `--state-root`; durable sample/snapshot export
176
+ * lives on the `defineStorage` `abs` table (`agent/storage.ts`). This
177
+ * config only caps how many sessions the playground / `GET /v1/abs` folds.
211
178
  */
212
179
  export interface ABConfigFile {
213
180
  /**
214
181
  * Optional. Max newest sessions folded into **`GET /v1/abs` / the A/Bs
215
- * tab** (and into {@link persistSnapshots} payloads). Does not prune
216
- * session logs, change assignment, or limit {@link persistSamples}.
182
+ * tab**. Does not prune session logs or change assignment.
217
183
  *
218
184
  * Default {@link AB_DEFAULT_MAX_PLAYGROUND_SESSIONS}; hard-capped at
219
185
  * {@link AB_MAX_PLAYGROUND_SESSIONS}.
220
186
  */
221
187
  maxPlaygroundSessions?: number;
222
- /**
223
- * Snapshot-file budget when {@link persistSnapshots} is set.
224
- * Default {@link AB_DEFAULT_RETAIN_SNAPSHOTS}; hard-capped at
225
- * {@link AB_MAX_RETAIN_SNAPSHOTS}.
226
- *
227
- * When using {@link persistABSnapshotsToDir}, this value controls on-disk
228
- * pruning (overriding the helper's `{ retain }` default). Custom stores
229
- * should apply the same budget themselves.
230
- */
231
- retainSnapshots?: number;
232
- /**
233
- * Optional sink for cumulative metric samples (in addition to each
234
- * experiment's {@link ABConfig.onSample}).
235
- *
236
- * ```ts
237
- * persistSamples: persistABSamplesToDir(".agent-serve/ab-samples"),
238
- * ```
239
- */
240
- persistSamples?: ABSamplePersistence;
241
- /**
242
- * Optional store for aggregate snapshots written when `GET /v1/abs` runs.
243
- *
244
- * ```ts
245
- * persistSnapshots: persistABSnapshotsToDir(".agent-serve/ab-snapshots"),
246
- * ```
247
- */
248
- persistSnapshots?: ABSnapshotPersistence;
249
188
  }
250
189
  /**
251
190
  * Defaults for every experiment under `agent/ab*` (`agent/ab.config.ts`).
252
191
  *
253
- * Session event logs remain the assignment/metrics source of truth; this
254
- * file controls the playground fold window and optional durable exports.
192
+ * Session event logs remain the assignment/metrics source of truth;
193
+ * durable exports go through the `defineStorage` `abs` table.
255
194
  */
256
195
  export declare function defineABConfig(config: ABConfigFile): ABConfigFile;
257
196
  /** Validate {@link ABConfigFile.maxPlaygroundSessions}. */
@@ -261,30 +200,4 @@ export declare function normalizeABMaxPlaygroundSessions(value: unknown): number
261
200
  * {@link AB_DEFAULT_MAX_PLAYGROUND_SESSIONS}.
262
201
  */
263
202
  export declare function resolveABMaxPlaygroundSessions(value: unknown): number;
264
- /** Validate {@link ABConfigFile.retainSnapshots}. */
265
- export declare function normalizeABRetainSnapshots(value: unknown): number;
266
- /**
267
- * Append-only NDJSON {@link ABSamplePersistence} under `dir` (relative to
268
- * the agent project root).
269
- *
270
- * ```ts
271
- * // agent/ab.config.ts
272
- * export default defineABConfig({
273
- * persistSamples: persistABSamplesToDir(".agent-serve/ab-samples"),
274
- * });
275
- * ```
276
- */
277
- export declare function persistABSamplesToDir(dir: string): ABSamplePersistence;
278
- /**
279
- * Filesystem {@link ABSnapshotPersistence}: one JSON file per snapshot under
280
- * `dir`, pruned to `retain` files (default {@link AB_DEFAULT_RETAIN_SNAPSHOTS}).
281
- *
282
- * Prefer setting {@link ABConfigFile.retainSnapshots} in `defineABConfig` —
283
- * that value is applied to this helper's prune budget. Pass `{ retain }` here
284
- * only when constructing the helper outside `defineABConfig`, or as a default
285
- * that `retainSnapshots` may override.
286
- */
287
- export declare function persistABSnapshotsToDir(dir: string, options?: {
288
- retain?: number;
289
- }): ABSnapshotPersistence;
290
203
  //# sourceMappingURL=ab.d.ts.map
package/dist/ab.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ab.d.ts","sourceRoot":"","sources":["../src/ab.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ab.d.ts","sourceRoot":"","sources":["../src/ab.ts"],"names":[],"mappings":"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"}
package/dist/ab.js CHANGED
@@ -10,9 +10,8 @@
10
10
  *
11
11
  * Assignments and foldable metrics live in each session's `events.ndjson`
12
12
  * (survive serve restart). Optional project defaults in `agent/ab.config.ts`
13
- * ({@link defineABConfig}) let authors retain the playground fold window and
14
- * persist samples / aggregate snapshots wherever they like same idea as
15
- * eval `persistRuns`.
13
+ * ({@link defineABConfig}) cap the playground fold window; durable
14
+ * sample/snapshot export lives on the `defineStorage` `abs` table.
16
15
  *
17
16
  * ```ts
18
17
  * import { defineAB, splitBySessionHash } from "@anysphere/agent-serve/ab";
@@ -39,12 +38,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
39
38
  step((generator = generator.apply(thisArg, _arguments || [])).next());
40
39
  });
41
40
  };
42
- import { randomUUID } from "node:crypto";
43
- import { appendFile, mkdir } from "node:fs/promises";
44
- import { join } from "node:path";
45
41
  import { normalizePositiveInt } from "./internal/bounded-int.js";
46
42
  import { brandDefinition } from "./internal/brand.js";
47
- import { assertNonEmptyDir, deleteFileInDir, listJsonBasenames, readJsonDir, resolveProjectRelativeDir, writeJsonFile, } from "./internal/json-dir-store.js";
48
43
  /** Sticky hash of session id → arm (recommended default). */
49
44
  export function splitBySessionHash(options) {
50
45
  assertHoldout(options === null || options === void 0 ? void 0 : options.holdout);
@@ -208,42 +203,23 @@ export function mergeABInstructions(base, abs, experiments) {
208
203
  : `${baseText}\n\n${extras.join("\n\n")}`;
209
204
  }
210
205
  // ---------------------------------------------------------------------------
211
- // Project config (`agent/ab.config.ts`) — fold window + optional persistence
206
+ // Project config (`agent/ab.config.ts`) — playground fold window
212
207
  // ---------------------------------------------------------------------------
213
208
  /** Default sessions folded into `GET /v1/abs` / the A/Bs tab. */
214
209
  export const AB_DEFAULT_MAX_PLAYGROUND_SESSIONS = 200;
215
210
  /** Hard ceiling for {@link ABConfigFile.maxPlaygroundSessions}. */
216
211
  export const AB_MAX_PLAYGROUND_SESSIONS = 10000;
217
- /** Default snapshot files kept when {@link ABConfigFile.persistSnapshots} is set. */
218
- export const AB_DEFAULT_RETAIN_SNAPSHOTS = 20;
219
- /** Hard ceiling for {@link ABConfigFile.retainSnapshots}. */
220
- export const AB_MAX_RETAIN_SNAPSHOTS = 500;
221
- /** Lets {@link defineABConfig} push `retainSnapshots` into {@link persistABSnapshotsToDir}. */
222
- const abSnapshotRetainState = new WeakMap();
223
212
  /**
224
213
  * Defaults for every experiment under `agent/ab*` (`agent/ab.config.ts`).
225
214
  *
226
- * Session event logs remain the assignment/metrics source of truth; this
227
- * file controls the playground fold window and optional durable exports.
215
+ * Session event logs remain the assignment/metrics source of truth;
216
+ * durable exports go through the `defineStorage` `abs` table.
228
217
  */
229
218
  export function defineABConfig(config) {
230
- var _a, _b;
231
- const persistSamples = normalizeSamplePersistence(config.persistSamples);
232
- const persistSnapshots = normalizeSnapshotPersistence(config.persistSnapshots);
233
- const helperRetain = persistSnapshots !== undefined
234
- ? abSnapshotRetainState.get(persistSnapshots)
235
- : undefined;
236
- let retainSnapshots;
237
- if (config.retainSnapshots !== undefined) {
238
- retainSnapshots = normalizeABRetainSnapshots(config.retainSnapshots);
239
- if (helperRetain !== undefined) {
240
- helperRetain.retain = retainSnapshots;
241
- }
242
- }
243
- else if (persistSnapshots !== undefined) {
244
- retainSnapshots = (_a = helperRetain === null || helperRetain === void 0 ? void 0 : helperRetain.retain) !== null && _a !== void 0 ? _a : normalizeABRetainSnapshots(AB_DEFAULT_RETAIN_SNAPSHOTS);
245
- }
246
- return Object.assign(Object.assign(Object.assign({ maxPlaygroundSessions: normalizeABMaxPlaygroundSessions((_b = config.maxPlaygroundSessions) !== null && _b !== void 0 ? _b : AB_DEFAULT_MAX_PLAYGROUND_SESSIONS) }, (retainSnapshots === undefined ? {} : { retainSnapshots })), (persistSamples === undefined ? {} : { persistSamples })), (persistSnapshots === undefined ? {} : { persistSnapshots }));
219
+ var _a;
220
+ return {
221
+ maxPlaygroundSessions: normalizeABMaxPlaygroundSessions((_a = config.maxPlaygroundSessions) !== null && _a !== void 0 ? _a : AB_DEFAULT_MAX_PLAYGROUND_SESSIONS),
222
+ };
247
223
  }
248
224
  /** Validate {@link ABConfigFile.maxPlaygroundSessions}. */
249
225
  export function normalizeABMaxPlaygroundSessions(value) {
@@ -267,120 +243,3 @@ export function resolveABMaxPlaygroundSessions(value) {
267
243
  return AB_DEFAULT_MAX_PLAYGROUND_SESSIONS;
268
244
  }
269
245
  }
270
- /** Validate {@link ABConfigFile.retainSnapshots}. */
271
- export function normalizeABRetainSnapshots(value) {
272
- return normalizePositiveInt(value, {
273
- label: "ab.config.ts: retainSnapshots",
274
- max: AB_MAX_RETAIN_SNAPSHOTS,
275
- });
276
- }
277
- function normalizeSamplePersistence(value) {
278
- if (value === undefined) {
279
- return undefined;
280
- }
281
- if (typeof value !== "object" ||
282
- value === null ||
283
- typeof value.save !== "function") {
284
- throw new Error("ab.config.ts: persistSamples must define save(sample, ctx)");
285
- }
286
- return value;
287
- }
288
- function normalizeSnapshotPersistence(value) {
289
- if (value === undefined) {
290
- return undefined;
291
- }
292
- if (typeof value !== "object" ||
293
- value === null ||
294
- typeof value.load !== "function" ||
295
- typeof value.save !== "function") {
296
- throw new Error("ab.config.ts: persistSnapshots must define load(ctx) and save(snapshot, ctx)");
297
- }
298
- if (value.delete !== undefined && typeof value.delete !== "function") {
299
- throw new Error("ab.config.ts: persistSnapshots.delete must be a function");
300
- }
301
- return value;
302
- }
303
- /**
304
- * Append-only NDJSON {@link ABSamplePersistence} under `dir` (relative to
305
- * the agent project root).
306
- *
307
- * ```ts
308
- * // agent/ab.config.ts
309
- * export default defineABConfig({
310
- * persistSamples: persistABSamplesToDir(".agent-serve/ab-samples"),
311
- * });
312
- * ```
313
- */
314
- export function persistABSamplesToDir(dir) {
315
- const relativeDir = assertNonEmptyDir(dir, "persistABSamplesToDir");
316
- const resolveDir = (projectRoot) => resolveProjectRelativeDir({ dir: relativeDir, projectRoot });
317
- return {
318
- save(sample, ctx) {
319
- return __awaiter(this, void 0, void 0, function* () {
320
- const root = resolveDir(ctx.projectRoot);
321
- yield mkdir(root, { recursive: true });
322
- yield appendFile(join(root, "samples.ndjson"), `${JSON.stringify(sample)}\n`, "utf8");
323
- });
324
- },
325
- };
326
- }
327
- /**
328
- * Filesystem {@link ABSnapshotPersistence}: one JSON file per snapshot under
329
- * `dir`, pruned to `retain` files (default {@link AB_DEFAULT_RETAIN_SNAPSHOTS}).
330
- *
331
- * Prefer setting {@link ABConfigFile.retainSnapshots} in `defineABConfig` —
332
- * that value is applied to this helper's prune budget. Pass `{ retain }` here
333
- * only when constructing the helper outside `defineABConfig`, or as a default
334
- * that `retainSnapshots` may override.
335
- */
336
- export function persistABSnapshotsToDir(dir, options) {
337
- var _a;
338
- const relativeDir = assertNonEmptyDir(dir, "persistABSnapshotsToDir");
339
- const retainState = {
340
- retain: normalizeABRetainSnapshots((_a = options === null || options === void 0 ? void 0 : options.retain) !== null && _a !== void 0 ? _a : AB_DEFAULT_RETAIN_SNAPSHOTS),
341
- };
342
- const resolveDir = (projectRoot) => resolveProjectRelativeDir({ dir: relativeDir, projectRoot });
343
- let saveChain = Promise.resolve();
344
- const persist = {
345
- load(ctx) {
346
- return __awaiter(this, void 0, void 0, function* () {
347
- return readJsonDir(resolveDir(ctx.projectRoot), {
348
- sortBasenames: "desc",
349
- });
350
- });
351
- },
352
- save(snapshot, ctx) {
353
- return __awaiter(this, void 0, void 0, function* () {
354
- const run = () => __awaiter(this, void 0, void 0, function* () {
355
- var _a;
356
- var _b;
357
- const root = resolveDir(ctx.projectRoot);
358
- const snapshotId = (_b = (_a = snapshot.config) === null || _a === void 0 ? void 0 : _a.snapshotId) !== null && _b !== void 0 ? _b : `absnap_${randomUUID().replace(/-/g, "")}`;
359
- const toWrite = Object.assign(Object.assign({}, snapshot), { config: Object.assign(Object.assign({}, snapshot.config), { snapshotId }) });
360
- yield writeJsonFile({
361
- root,
362
- fileName: `${snapshotId}.json`,
363
- value: toWrite,
364
- });
365
- const names = (yield listJsonBasenames(root)).sort().reverse();
366
- for (const stale of names.slice(retainState.retain)) {
367
- yield deleteFileInDir({ root, fileName: stale });
368
- }
369
- });
370
- const next = saveChain.then(run, run);
371
- saveChain = next.then(() => undefined, () => undefined);
372
- yield next;
373
- });
374
- },
375
- delete(snapshotId, ctx) {
376
- return __awaiter(this, void 0, void 0, function* () {
377
- yield deleteFileInDir({
378
- root: resolveDir(ctx.projectRoot),
379
- fileName: `${snapshotId}.json`,
380
- });
381
- });
382
- },
383
- };
384
- abSnapshotRetainState.set(persist, retainState);
385
- return persist;
386
- }
@@ -67,7 +67,7 @@ Usage:
67
67
  ${CLI} init [dir] [--json]
68
68
  ${CLI} eval [--dir <path>] [evalId...] [--list] [--json]
69
69
  [--tag <tag>]... [--verbose] [--timeout-ms <n>]
70
- [--no-stream] [--url <baseUrl> | --prod] [--slug <slug>]
70
+ [--no-stream] [--local | --url <baseUrl>] [--slug <slug>]
71
71
  [--team <id>]
72
72
  ${CLI} info [--dir <path>] [--json]
73
73
  ${CLI} validate [--dir <path>]
@@ -132,9 +132,11 @@ Commands:
132
132
  machine-readable and never blocks on login. No directory:
133
133
  print the setup guide.
134
134
  eval Run filesystem evals under evals/**/*.eval.ts (streams on a TTY).
135
- Pass evalId args to select: one datapoint (weather/nyc), a whole
136
- file (weather all cases in that file), several of either, or
137
- omit to run all.
135
+ Runs against the team's hosted deployment by default (slug from
136
+ --slug or the directory name); pass --local for an ephemeral
137
+ local server, or --url for a running one. Pass evalId args to
138
+ select: one datapoint (weather/nyc), a whole file (weather →
139
+ all cases in that file), several of either, or omit to run all.
138
140
  info Print the discovered agent surface (tools, skills, channels, ...).
139
141
  validate Check the project(s) and exit non-zero on error diagnostics.
140
142
  login Sign the host in to Cursor: browser sign-in mints a named,
@@ -169,7 +171,7 @@ Agent loop:
169
171
  ${CLI} validate --dir .
170
172
  ${CLI} info --dir . --json
171
173
  ${CLI} run --dir . --message "..."
172
- ${CLI} eval --dir .
174
+ ${CLI} eval --local --dir .
173
175
  ${CLI} dev .
174
176
 
175
177
  Options:
@@ -208,7 +210,10 @@ Options:
208
210
  --prod chat/resume/run/call/eval/logs/sessions/session/playground:
209
211
  use the team's hosted deployment. Slug from --slug or the
210
212
  --dir basename. Mutually exclusive with --url. Requires
211
- \`${CLI} login\`.
213
+ \`${CLI} login\`. (eval already defaults to the
214
+ deployment; there --prod is just being explicit.)
215
+ --local eval: run against an ephemeral local server instead of
216
+ the hosted deployment. Mutually exclusive with --url.
212
217
  --once logs: print current progress / log buffer once and exit
213
218
  (default is to follow).
214
219
  --print playground: print the URL only; do not open a browser.
@@ -321,6 +326,7 @@ function main(argv) {
321
326
  "no-docs": { type: "boolean", default: false },
322
327
  url: { type: "string" },
323
328
  prod: { type: "boolean", default: false },
329
+ local: { type: "boolean", default: false },
324
330
  message: { type: "string", multiple: true },
325
331
  input: { type: "string" },
326
332
  "messages-file": { type: "string" },
@@ -553,6 +559,7 @@ function main(argv) {
553
559
  tags: values.tag,
554
560
  url: values.url,
555
561
  prod: values.prod,
562
+ local: values.local,
556
563
  team: values.team,
557
564
  apiKey: values["api-key"],
558
565
  slug: values.slug,
@@ -863,6 +870,7 @@ function axFromOptions(partial) {
863
870
  toolInput: partial.toolInput,
864
871
  url: partial.url,
865
872
  prod: partial.prod,
873
+ local: partial.local,
866
874
  team: partial.team,
867
875
  apiKey: partial.apiKey,
868
876
  fetchImpl: partial.fetchImpl,
@@ -9,14 +9,14 @@
9
9
  <link rel="preload stylesheet" href="/docs/assets/style.Bj-IXa5W.css" as="style">
10
10
  <link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
11
11
 
12
- <script type="module" src="/docs/assets/app.DF-Yx4OP.js"></script>
12
+ <script type="module" src="/docs/assets/app.DMboGKUD.js"></script>
13
13
  <link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
14
  <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
15
15
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
16
16
  </head>
17
17
  <body>
18
18
  <div id="app"></div>
19
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"ab.md\":\"BMCZ6Hd7\",\"building-with-agents.md\":\"CJCtZCyi\",\"concepts.md\":\"Cfb9b-k1\",\"deployment.md\":\"DTKwE15Z\",\"evals.md\":\"DAgEc_hL\",\"guides_agent-to-agent.md\":\"Bpzgq2Pq\",\"guides_cloud-runtime.md\":\"gVzabdQL\",\"guides_github.md\":\"DOOCpqsW\",\"guides_human-in-the-loop.md\":\"DlUqsp1S\",\"guides_slack.md\":\"CCwqHvSV\",\"guides_webhooks.md\":\"B1EswtUu\",\"hillclimbing.md\":\"DHNast08\",\"index.md\":\"Cylk70gg\",\"quickstart.md\":\"BU6Iwi_9\",\"reference_agent-config.md\":\"DrW2JUM8\",\"reference_channels.md\":\"DdmiKgqf\",\"reference_cli.md\":\"Bv6pOxcF\",\"reference_connections.md\":\"zaEYCLHT\",\"reference_hooks.md\":\"DyLVfE1O\",\"reference_http-api.md\":\"Dx_nmDG6\",\"reference_instructions.md\":\"CgoV-YEb\",\"reference_playground.md\":\"CPZhfYaO\",\"reference_project-layout.md\":\"Bd_CKtNS\",\"reference_schedules.md\":\"w_F2mXB6\",\"reference_sessions.md\":\"DdjWabnN\",\"reference_skills.md\":\"B_jHN7JL\",\"reference_subagents.md\":\"zWAMNfi1\",\"reference_tools.md\":\"CqgJroI0\",\"scaffolding-agents.md\":\"C3pTrmoE\",\"storage.md\":\"CVnInNiN\",\"troubleshooting.md\":\"DkovjS7h\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"agentkit\",\"description\":\"Filesystem-first framework for building and serving Cursor agents.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Guides\",\"link\":\"/guides/webhooks\"},{\"text\":\"Reference\",\"link\":\"/reference/project-layout\"}],\"search\":{\"provider\":\"local\"},\"outline\":{\"level\":[2,3]},\"sidebar\":[{\"text\":\"Getting started\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Scaffold an agent with Cursor\",\"link\":\"/scaffolding-agents\"},{\"text\":\"Concepts\",\"link\":\"/concepts\"}]},{\"text\":\"Improving agents\",\"items\":[{\"text\":\"Building agents with agents\",\"link\":\"/building-with-agents\"},{\"text\":\"Evals\",\"link\":\"/evals\"},{\"text\":\"Live A/B metrics\",\"link\":\"/ab\"},{\"text\":\"Storage\",\"link\":\"/storage\"},{\"text\":\"Hillclimbing\",\"link\":\"/hillclimbing\"}]},{\"text\":\"Guides\",\"items\":[{\"text\":\"Webhooks & custom channels\",\"link\":\"/guides/webhooks\"},{\"text\":\"GitHub\",\"link\":\"/guides/github\"},{\"text\":\"Slack\",\"link\":\"/guides/slack\"},{\"text\":\"Human-in-the-loop approvals\",\"link\":\"/guides/human-in-the-loop\"},{\"text\":\"Agent-to-agent\",\"link\":\"/guides/agent-to-agent\"},{\"text\":\"Cloud runtime\",\"link\":\"/guides/cloud-runtime\"}]},{\"text\":\"Operating\",\"items\":[{\"text\":\"Deployment\",\"link\":\"/deployment\"},{\"text\":\"Fix common problems\",\"link\":\"/troubleshooting\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Project layout\",\"link\":\"/reference/project-layout\"},{\"text\":\"Agent config\",\"link\":\"/reference/agent-config\"},{\"text\":\"Instructions\",\"link\":\"/reference/instructions\"},{\"text\":\"Tools\",\"link\":\"/reference/tools\"},{\"text\":\"Skills\",\"link\":\"/reference/skills\"},{\"text\":\"MCP Connections\",\"link\":\"/reference/connections\"},{\"text\":\"Subagents\",\"link\":\"/reference/subagents\"},{\"text\":\"Channels\",\"link\":\"/reference/channels\"},{\"text\":\"Schedules & reminders\",\"link\":\"/reference/schedules\"},{\"text\":\"Hooks\",\"link\":\"/reference/hooks\"},{\"text\":\"Sessions & streaming\",\"link\":\"/reference/sessions\"},{\"text\":\"Playground\",\"link\":\"/reference/playground\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"HTTP API\",\"link\":\"/reference/http-api\"}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
19
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"ab.md\":\"BMCZ6Hd7\",\"building-with-agents.md\":\"CJCtZCyi\",\"concepts.md\":\"Cfb9b-k1\",\"deployment.md\":\"BtfEsc9S\",\"evals.md\":\"DAgEc_hL\",\"example-agents_approval-buddy.md\":\"8R5phXb5\",\"example-agents_benny.md\":\"B0gjhI-p\",\"example-agents_bugbot.md\":\"DelIdhxB\",\"example-agents_codebase-wiki.md\":\"DC6sgwn0\",\"example-agents_codeowners-review.md\":\"Ku_tG2RY\",\"example-agents_concierge.md\":\"4rQTSMXt\",\"example-agents_fsd.md\":\"CzgUrDfi\",\"example-agents_index.md\":\"CRqJlnIf\",\"example-agents_knowledge-base.md\":\"BPJiVueF\",\"example-agents_security-reviewer.md\":\"D2rtwDTO\",\"example-agents_slack-agent.md\":\"buLbgvBf\",\"example-agents_weather-agent.md\":\"C9Qv-W0o\",\"guides_agent-to-agent.md\":\"Bpzgq2Pq\",\"guides_cloud-runtime.md\":\"gVzabdQL\",\"guides_github.md\":\"DOOCpqsW\",\"guides_human-in-the-loop.md\":\"DlUqsp1S\",\"guides_slack.md\":\"CCwqHvSV\",\"guides_webhooks.md\":\"B1EswtUu\",\"hillclimbing.md\":\"DHNast08\",\"index.md\":\"COiu-1jL\",\"quickstart.md\":\"BU6Iwi_9\",\"reference_agent-config.md\":\"DrW2JUM8\",\"reference_channels.md\":\"DdmiKgqf\",\"reference_cli.md\":\"D189RBCH\",\"reference_connections.md\":\"zaEYCLHT\",\"reference_hooks.md\":\"DyLVfE1O\",\"reference_http-api.md\":\"Dx_nmDG6\",\"reference_instructions.md\":\"CgoV-YEb\",\"reference_playground.md\":\"CPZhfYaO\",\"reference_project-layout.md\":\"Bd_CKtNS\",\"reference_schedules.md\":\"w_F2mXB6\",\"reference_sessions.md\":\"DdjWabnN\",\"reference_skills.md\":\"B_jHN7JL\",\"reference_subagents.md\":\"zWAMNfi1\",\"reference_tools.md\":\"CqgJroI0\",\"scaffolding-agents.md\":\"C3pTrmoE\",\"storage.md\":\"CVnInNiN\",\"troubleshooting.md\":\"DkovjS7h\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"agentkit\",\"description\":\"Filesystem-first framework for building and serving Cursor agents.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Guides\",\"link\":\"/guides/webhooks\"},{\"text\":\"Examples\",\"link\":\"/example-agents/\"},{\"text\":\"Reference\",\"link\":\"/reference/project-layout\"}],\"search\":{\"provider\":\"local\"},\"outline\":{\"level\":[2,3]},\"sidebar\":[{\"text\":\"Getting started\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Scaffold an agent with Cursor\",\"link\":\"/scaffolding-agents\"},{\"text\":\"Concepts\",\"link\":\"/concepts\"}]},{\"text\":\"Improving agents\",\"items\":[{\"text\":\"Building agents with agents\",\"link\":\"/building-with-agents\"},{\"text\":\"Evals\",\"link\":\"/evals\"},{\"text\":\"Live A/B metrics\",\"link\":\"/ab\"},{\"text\":\"Storage\",\"link\":\"/storage\"},{\"text\":\"Hillclimbing\",\"link\":\"/hillclimbing\"}]},{\"text\":\"Guides\",\"items\":[{\"text\":\"Webhooks & custom channels\",\"link\":\"/guides/webhooks\"},{\"text\":\"GitHub\",\"link\":\"/guides/github\"},{\"text\":\"Slack\",\"link\":\"/guides/slack\"},{\"text\":\"Human-in-the-loop approvals\",\"link\":\"/guides/human-in-the-loop\"},{\"text\":\"Agent-to-agent\",\"link\":\"/guides/agent-to-agent\"},{\"text\":\"Cloud runtime\",\"link\":\"/guides/cloud-runtime\"}]},{\"text\":\"Example agents\",\"items\":[{\"text\":\"Choose an example\",\"link\":\"/example-agents/\"},{\"text\":\"Weather agent\",\"link\":\"/example-agents/weather-agent\"},{\"text\":\"Slack agent\",\"link\":\"/example-agents/slack-agent\"},{\"text\":\"Concierge\",\"link\":\"/example-agents/concierge\"},{\"text\":\"Playbook router\",\"link\":\"/example-agents/benny\"},{\"text\":\"PR evidence reviewer\",\"link\":\"/example-agents/bugbot\"},{\"text\":\"Approval Buddy\",\"link\":\"/example-agents/approval-buddy\"},{\"text\":\"Security Reviewer\",\"link\":\"/example-agents/security-reviewer\"},{\"text\":\"Remote PR coordinator\",\"link\":\"/example-agents/fsd\"},{\"text\":\"Knowledge base\",\"link\":\"/example-agents/knowledge-base\"},{\"text\":\"Codebase wiki\",\"link\":\"/example-agents/codebase-wiki\"},{\"text\":\"Codeowners review\",\"link\":\"/example-agents/codeowners-review\"}]},{\"text\":\"Operating\",\"items\":[{\"text\":\"Deployment\",\"link\":\"/deployment\"},{\"text\":\"Fix common problems\",\"link\":\"/troubleshooting\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Project layout\",\"link\":\"/reference/project-layout\"},{\"text\":\"Agent config\",\"link\":\"/reference/agent-config\"},{\"text\":\"Instructions\",\"link\":\"/reference/instructions\"},{\"text\":\"Tools\",\"link\":\"/reference/tools\"},{\"text\":\"Skills\",\"link\":\"/reference/skills\"},{\"text\":\"MCP Connections\",\"link\":\"/reference/connections\"},{\"text\":\"Subagents\",\"link\":\"/reference/subagents\"},{\"text\":\"Channels\",\"link\":\"/reference/channels\"},{\"text\":\"Schedules & reminders\",\"link\":\"/reference/schedules\"},{\"text\":\"Hooks\",\"link\":\"/reference/hooks\"},{\"text\":\"Sessions & streaming\",\"link\":\"/reference/sessions\"},{\"text\":\"Playground\",\"link\":\"/reference/playground\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"HTTP API\",\"link\":\"/reference/http-api\"}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
20
20
 
21
21
  </body>
22
22
  </html>