@intentic/sandbox-contract 1.176.3 → 1.209.0

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 (334) hide show
  1. package/README.md +65 -0
  2. package/dist/agent-catalog.d.ts +15 -2
  3. package/dist/agent-catalog.d.ts.map +1 -1
  4. package/dist/agent-catalog.js +50 -1
  5. package/dist/agent-catalog.js.map +1 -1
  6. package/dist/agent-run-model.d.ts +3 -0
  7. package/dist/agent-run-model.d.ts.map +1 -0
  8. package/dist/agent-run-model.js +10 -0
  9. package/dist/agent-run-model.js.map +1 -0
  10. package/dist/capability-env.d.ts +2 -0
  11. package/dist/capability-env.d.ts.map +1 -0
  12. package/dist/capability-env.js +2 -0
  13. package/dist/capability-env.js.map +1 -0
  14. package/dist/chores/chores.d.ts +9 -0
  15. package/dist/chores/chores.d.ts.map +1 -1
  16. package/dist/chores/chores.js +257 -18
  17. package/dist/chores/chores.js.map +1 -1
  18. package/dist/chores/digest.js +0 -0
  19. package/dist/chores/digest.js.map +1 -1
  20. package/dist/chores/extension-update.d.ts +9 -0
  21. package/dist/chores/extension-update.d.ts.map +1 -0
  22. package/dist/chores/extension-update.js +15 -0
  23. package/dist/chores/extension-update.js.map +1 -0
  24. package/dist/chores/fix-deps.d.ts +10 -0
  25. package/dist/chores/fix-deps.d.ts.map +1 -0
  26. package/dist/chores/fix-deps.js +18 -0
  27. package/dist/chores/fix-deps.js.map +1 -0
  28. package/dist/chores/index.d.ts +7 -2
  29. package/dist/chores/index.d.ts.map +1 -1
  30. package/dist/chores/index.js +4 -1
  31. package/dist/chores/index.js.map +1 -1
  32. package/dist/chores/probes.d.ts.map +1 -1
  33. package/dist/chores/probes.js +127 -3
  34. package/dist/chores/probes.js.map +1 -1
  35. package/dist/chores/stack.d.ts +27 -0
  36. package/dist/chores/stack.d.ts.map +1 -0
  37. package/dist/chores/stack.js +121 -0
  38. package/dist/chores/stack.js.map +1 -0
  39. package/dist/chores/verdict.d.ts +2 -1
  40. package/dist/chores/verdict.d.ts.map +1 -1
  41. package/dist/chores/verdict.js +53 -6
  42. package/dist/chores/verdict.js.map +1 -1
  43. package/dist/contract-lock.d.ts +3 -0
  44. package/dist/contract-lock.d.ts.map +1 -0
  45. package/dist/contract-lock.js +35 -0
  46. package/dist/contract-lock.js.map +1 -0
  47. package/dist/contracts/activity.contract.d.ts +10 -0
  48. package/dist/contracts/activity.contract.d.ts.map +1 -1
  49. package/dist/contracts/agent.contract.d.ts +230 -20
  50. package/dist/contracts/agent.contract.d.ts.map +1 -1
  51. package/dist/contracts/agent.contract.js +2 -1
  52. package/dist/contracts/agent.contract.js.map +1 -1
  53. package/dist/contracts/agents.contract.d.ts +847 -1
  54. package/dist/contracts/agents.contract.d.ts.map +1 -1
  55. package/dist/contracts/agents.contract.js +3 -1
  56. package/dist/contracts/agents.contract.js.map +1 -1
  57. package/dist/contracts/automations.contract.d.ts +89 -0
  58. package/dist/contracts/automations.contract.d.ts.map +1 -1
  59. package/dist/contracts/automations.contract.js +3 -1
  60. package/dist/contracts/automations.contract.js.map +1 -1
  61. package/dist/contracts/capabilities.contract.d.ts +108 -32
  62. package/dist/contracts/capabilities.contract.d.ts.map +1 -1
  63. package/dist/contracts/capabilities.contract.js +5 -1
  64. package/dist/contracts/capabilities.contract.js.map +1 -1
  65. package/dist/contracts/chores.contract.d.ts +43 -0
  66. package/dist/contracts/chores.contract.d.ts.map +1 -1
  67. package/dist/contracts/ci.contract.d.ts +5 -0
  68. package/dist/contracts/ci.contract.d.ts.map +1 -1
  69. package/dist/contracts/ci.contract.js +2 -2
  70. package/dist/contracts/ci.contract.js.map +1 -1
  71. package/dist/contracts/claude.contract.d.ts +3 -14
  72. package/dist/contracts/claude.contract.d.ts.map +1 -1
  73. package/dist/contracts/claude.contract.js +2 -3
  74. package/dist/contracts/claude.contract.js.map +1 -1
  75. package/dist/contracts/drafts.contract.d.ts +4 -0
  76. package/dist/contracts/drafts.contract.d.ts.map +1 -1
  77. package/dist/contracts/endpoints.contract.d.ts +28 -12
  78. package/dist/contracts/endpoints.contract.d.ts.map +1 -1
  79. package/dist/contracts/endpoints.contract.js +9 -0
  80. package/dist/contracts/endpoints.contract.js.map +1 -1
  81. package/dist/contracts/extensions.contract.d.ts +399 -69
  82. package/dist/contracts/extensions.contract.d.ts.map +1 -1
  83. package/dist/contracts/extensions.contract.js +15 -1
  84. package/dist/contracts/extensions.contract.js.map +1 -1
  85. package/dist/contracts/git.contract.d.ts +209 -11
  86. package/dist/contracts/git.contract.d.ts.map +1 -1
  87. package/dist/contracts/git.contract.js +12 -2
  88. package/dist/contracts/git.contract.js.map +1 -1
  89. package/dist/contracts/grok.contract.d.ts +0 -13
  90. package/dist/contracts/grok.contract.d.ts.map +1 -1
  91. package/dist/contracts/grok.contract.js +1 -2
  92. package/dist/contracts/grok.contract.js.map +1 -1
  93. package/dist/contracts/host.contract.d.ts +39 -0
  94. package/dist/contracts/host.contract.d.ts.map +1 -1
  95. package/dist/contracts/host.contract.js +3 -2
  96. package/dist/contracts/host.contract.js.map +1 -1
  97. package/dist/contracts/loops.contract.d.ts +343 -0
  98. package/dist/contracts/loops.contract.d.ts.map +1 -0
  99. package/dist/contracts/loops.contract.js +11 -0
  100. package/dist/contracts/loops.contract.js.map +1 -0
  101. package/dist/contracts/panels.contract.d.ts +6 -0
  102. package/dist/contracts/panels.contract.d.ts.map +1 -1
  103. package/dist/contracts/personas.contract.d.ts +112 -0
  104. package/dist/contracts/personas.contract.d.ts.map +1 -0
  105. package/dist/contracts/personas.contract.js +13 -0
  106. package/dist/contracts/personas.contract.js.map +1 -0
  107. package/dist/contracts/ports.contract.d.ts +1 -0
  108. package/dist/contracts/ports.contract.d.ts.map +1 -1
  109. package/dist/contracts/prepush.contract.d.ts +1 -0
  110. package/dist/contracts/prepush.contract.d.ts.map +1 -1
  111. package/dist/contracts/prepush.contract.js.map +1 -1
  112. package/dist/contracts/{codex.contract.d.ts → providers.contract.d.ts} +11 -3
  113. package/dist/contracts/providers.contract.d.ts.map +1 -0
  114. package/dist/contracts/providers.contract.js +6 -0
  115. package/dist/contracts/providers.contract.js.map +1 -0
  116. package/dist/contracts/public.contract.d.ts +24 -0
  117. package/dist/contracts/public.contract.d.ts.map +1 -0
  118. package/dist/contracts/public.contract.js +8 -0
  119. package/dist/contracts/public.contract.js.map +1 -0
  120. package/dist/contracts/push.contract.d.ts +3 -3
  121. package/dist/contracts/secrets.contract.d.ts +9 -0
  122. package/dist/contracts/secrets.contract.d.ts.map +1 -1
  123. package/dist/contracts/sessions.contract.d.ts +16 -1
  124. package/dist/contracts/sessions.contract.d.ts.map +1 -1
  125. package/dist/contracts/sessions.contract.js +1 -1
  126. package/dist/contracts/sessions.contract.js.map +1 -1
  127. package/dist/contracts/settings.contract.d.ts +352 -58
  128. package/dist/contracts/settings.contract.d.ts.map +1 -1
  129. package/dist/contracts/settings.contract.js +2 -1
  130. package/dist/contracts/settings.contract.js.map +1 -1
  131. package/dist/contracts/share.contract.d.ts +55 -0
  132. package/dist/contracts/share.contract.d.ts.map +1 -0
  133. package/dist/contracts/share.contract.js +9 -0
  134. package/dist/contracts/share.contract.js.map +1 -0
  135. package/dist/contracts/skills.contract.d.ts +41 -0
  136. package/dist/contracts/skills.contract.d.ts.map +1 -0
  137. package/dist/contracts/skills.contract.js +9 -0
  138. package/dist/contracts/skills.contract.js.map +1 -0
  139. package/dist/contracts/system.contract.d.ts +204 -8
  140. package/dist/contracts/system.contract.d.ts.map +1 -1
  141. package/dist/contracts/system.contract.js +10 -2
  142. package/dist/contracts/system.contract.js.map +1 -1
  143. package/dist/contracts/workflows.contract.d.ts +575 -0
  144. package/dist/contracts/workflows.contract.d.ts.map +1 -0
  145. package/dist/contracts/workflows.contract.js +13 -0
  146. package/dist/contracts/workflows.contract.js.map +1 -0
  147. package/dist/contracts/workspace.contract.d.ts +18 -4
  148. package/dist/contracts/workspace.contract.d.ts.map +1 -1
  149. package/dist/contracts/workspace.contract.js +6 -3
  150. package/dist/contracts/workspace.contract.js.map +1 -1
  151. package/dist/conversation-ids.d.ts +2 -0
  152. package/dist/conversation-ids.d.ts.map +1 -0
  153. package/dist/conversation-ids.js +113 -0
  154. package/dist/conversation-ids.js.map +1 -0
  155. package/dist/events.d.ts +523 -17
  156. package/dist/events.d.ts.map +1 -1
  157. package/dist/events.js +106 -13
  158. package/dist/events.js.map +1 -1
  159. package/dist/history-state.d.ts.map +1 -1
  160. package/dist/history-state.js +10 -0
  161. package/dist/history-state.js.map +1 -1
  162. package/dist/hostnames.d.ts +4 -0
  163. package/dist/hostnames.d.ts.map +1 -1
  164. package/dist/hostnames.js +7 -2
  165. package/dist/hostnames.js.map +1 -1
  166. package/dist/index.d.ts +3791 -478
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +39 -17
  169. package/dist/index.js.map +1 -1
  170. package/dist/listener-protocol.d.ts +77 -0
  171. package/dist/listener-protocol.d.ts.map +1 -0
  172. package/dist/listener-protocol.js +33 -0
  173. package/dist/listener-protocol.js.map +1 -0
  174. package/dist/model-order.d.ts +1 -0
  175. package/dist/model-order.d.ts.map +1 -1
  176. package/dist/model-order.js +16 -0
  177. package/dist/model-order.js.map +1 -1
  178. package/dist/output-fields.d.ts +30 -0
  179. package/dist/output-fields.d.ts.map +1 -0
  180. package/dist/output-fields.js +57 -0
  181. package/dist/output-fields.js.map +1 -0
  182. package/dist/path-refs.d.ts.map +1 -1
  183. package/dist/path-refs.js.map +1 -1
  184. package/dist/publish-drafts.d.ts +7 -0
  185. package/dist/publish-drafts.d.ts.map +1 -0
  186. package/dist/publish-drafts.js +20 -0
  187. package/dist/publish-drafts.js.map +1 -0
  188. package/dist/quick-model.d.ts +2 -1
  189. package/dist/quick-model.d.ts.map +1 -1
  190. package/dist/quick-model.js +18 -14
  191. package/dist/quick-model.js.map +1 -1
  192. package/dist/routes.d.ts +3 -0
  193. package/dist/routes.d.ts.map +1 -1
  194. package/dist/routes.js +63 -0
  195. package/dist/routes.js.map +1 -1
  196. package/dist/runtime-state.d.ts +33 -0
  197. package/dist/runtime-state.d.ts.map +1 -0
  198. package/dist/runtime-state.js +14 -0
  199. package/dist/runtime-state.js.map +1 -0
  200. package/dist/schemas.d.ts +4886 -851
  201. package/dist/schemas.d.ts.map +1 -1
  202. package/dist/schemas.js +993 -192
  203. package/dist/schemas.js.map +1 -1
  204. package/dist/search-globs.d.ts +6 -0
  205. package/dist/search-globs.d.ts.map +1 -0
  206. package/dist/search-globs.js +39 -0
  207. package/dist/search-globs.js.map +1 -0
  208. package/dist/share-paths.d.ts +8 -0
  209. package/dist/share-paths.d.ts.map +1 -0
  210. package/dist/share-paths.js +21 -0
  211. package/dist/share-paths.js.map +1 -0
  212. package/dist/title.d.ts.map +1 -1
  213. package/dist/title.js +1 -1
  214. package/dist/title.js.map +1 -1
  215. package/dist/tunnel-ids.d.ts +1 -0
  216. package/dist/tunnel-ids.d.ts.map +1 -1
  217. package/dist/tunnel-ids.js +1 -0
  218. package/dist/tunnel-ids.js.map +1 -1
  219. package/dist/versions.d.ts +4 -0
  220. package/dist/versions.d.ts.map +1 -0
  221. package/dist/versions.js +15 -0
  222. package/dist/versions.js.map +1 -0
  223. package/dist/workflow-faults.d.ts +4 -0
  224. package/dist/workflow-faults.d.ts.map +1 -0
  225. package/dist/workflow-faults.js +115 -0
  226. package/dist/workflow-faults.js.map +1 -0
  227. package/dist/workspace-state.d.ts +280 -1
  228. package/dist/workspace-state.d.ts.map +1 -1
  229. package/dist/workspace-state.js +163 -21
  230. package/dist/workspace-state.js.map +1 -1
  231. package/package.json +30 -6
  232. package/src/agent-catalog.test.ts +147 -7
  233. package/src/agent-catalog.ts +233 -21
  234. package/src/agent-run-model.test.ts +60 -0
  235. package/src/agent-run-model.ts +51 -0
  236. package/src/capability-env.ts +10 -0
  237. package/src/capability-ledger.test.ts +110 -0
  238. package/src/chores/chores.test.ts +32 -0
  239. package/src/chores/chores.ts +456 -32
  240. package/src/chores/digest.ts +0 -0
  241. package/src/chores/extension-update.ts +37 -0
  242. package/src/chores/fix-deps.ts +40 -0
  243. package/src/chores/index.ts +7 -2
  244. package/src/chores/probes.test.ts +155 -3
  245. package/src/chores/probes.ts +200 -4
  246. package/src/chores/stack.test.ts +126 -0
  247. package/src/chores/stack.ts +244 -0
  248. package/src/chores/verdict.test.ts +357 -19
  249. package/src/chores/verdict.ts +95 -21
  250. package/src/contract-lock.test.ts +17 -0
  251. package/src/contract-lock.ts +66 -0
  252. package/src/contracts/agent.contract.ts +6 -0
  253. package/src/contracts/agents.contract.ts +12 -0
  254. package/src/contracts/automations.contract.ts +17 -1
  255. package/src/contracts/capabilities.contract.ts +22 -0
  256. package/src/contracts/ci.contract.ts +10 -2
  257. package/src/contracts/claude.contract.ts +8 -4
  258. package/src/contracts/endpoints.contract.ts +21 -0
  259. package/src/contracts/extensions.contract.ts +42 -0
  260. package/src/contracts/git.contract.ts +33 -6
  261. package/src/contracts/grok.contract.ts +4 -3
  262. package/src/contracts/host.contract.ts +13 -2
  263. package/src/contracts/loops.contract.ts +62 -0
  264. package/src/contracts/personas.contract.ts +56 -0
  265. package/src/contracts/prepush.contract.ts +4 -3
  266. package/src/contracts/providers.contract.ts +23 -0
  267. package/src/contracts/public.contract.ts +14 -0
  268. package/src/contracts/sessions.contract.ts +5 -1
  269. package/src/contracts/settings.contract.ts +5 -0
  270. package/src/contracts/share.contract.ts +20 -0
  271. package/src/contracts/skills.contract.ts +24 -0
  272. package/src/contracts/system.contract.ts +27 -3
  273. package/src/contracts/workflows.contract.ts +78 -0
  274. package/src/contracts/workspace.contract.ts +10 -2
  275. package/src/conversation-ids.test.ts +25 -0
  276. package/src/conversation-ids.ts +160 -0
  277. package/src/events.test.ts +20 -1
  278. package/src/events.ts +404 -43
  279. package/src/history-state.ts +30 -1
  280. package/src/hostnames.ts +20 -6
  281. package/src/index.ts +58 -17
  282. package/src/listener-protocol.ts +96 -0
  283. package/src/model-order.test.ts +32 -1
  284. package/src/model-order.ts +56 -3
  285. package/src/output-fields.ts +111 -0
  286. package/src/path-refs.test.ts +4 -4
  287. package/src/path-refs.ts +5 -5
  288. package/src/publish-drafts.ts +59 -0
  289. package/src/quick-model.test.ts +70 -27
  290. package/src/quick-model.ts +76 -40
  291. package/src/routes.test.ts +91 -3
  292. package/src/routes.ts +135 -0
  293. package/src/runtime-state.test.ts +45 -0
  294. package/src/runtime-state.ts +124 -0
  295. package/src/schemas.test.ts +16 -29
  296. package/src/schemas.ts +3475 -552
  297. package/src/search-globs.test.ts +46 -0
  298. package/src/search-globs.ts +76 -0
  299. package/src/share-paths.test.ts +48 -0
  300. package/src/share-paths.ts +68 -0
  301. package/src/state-portability.ts +8 -8
  302. package/src/title.test.ts +20 -1
  303. package/src/title.ts +12 -3
  304. package/src/tunnel-ids.ts +15 -1
  305. package/src/versions.test.ts +39 -0
  306. package/src/versions.ts +48 -0
  307. package/src/workflow-faults.test.ts +127 -0
  308. package/src/workflow-faults.ts +188 -0
  309. package/src/workspace-state.test.ts +169 -15
  310. package/src/workspace-state.ts +427 -35
  311. package/dist/contracts/codex.contract.d.ts.map +0 -1
  312. package/dist/contracts/codex.contract.js +0 -6
  313. package/dist/contracts/codex.contract.js.map +0 -1
  314. package/dist/contracts/gemini.contract.d.ts +0 -16
  315. package/dist/contracts/gemini.contract.d.ts.map +0 -1
  316. package/dist/contracts/gemini.contract.js +0 -6
  317. package/dist/contracts/gemini.contract.js.map +0 -1
  318. package/dist/contracts/kimi.contract.d.ts +0 -16
  319. package/dist/contracts/kimi.contract.d.ts.map +0 -1
  320. package/dist/contracts/kimi.contract.js +0 -6
  321. package/dist/contracts/kimi.contract.js.map +0 -1
  322. package/dist/contracts/komodo.contract.d.ts +0 -125
  323. package/dist/contracts/komodo.contract.d.ts.map +0 -1
  324. package/dist/contracts/komodo.contract.js +0 -14
  325. package/dist/contracts/komodo.contract.js.map +0 -1
  326. package/dist/contracts/memory.contract.d.ts +0 -34
  327. package/dist/contracts/memory.contract.d.ts.map +0 -1
  328. package/dist/contracts/memory.contract.js +0 -9
  329. package/dist/contracts/memory.contract.js.map +0 -1
  330. package/src/contracts/codex.contract.ts +0 -10
  331. package/src/contracts/gemini.contract.ts +0 -11
  332. package/src/contracts/kimi.contract.ts +0 -9
  333. package/src/contracts/komodo.contract.ts +0 -36
  334. package/src/contracts/memory.contract.ts +0 -13
package/dist/schemas.js CHANGED
@@ -1,26 +1,60 @@
1
- import { ExtensionManifestSchema } from "@intentic/extension-api";
1
+ import { STATE_DIR } from "@intentic/constants";
2
+ import { ExtensionManifestSchema } from "@intentic/extension-manifest";
2
3
  import { RegistryEntrySchema } from "@intentic/registry";
3
4
  import { z } from "zod";
5
+ import { OutputFieldsSchema } from "./output-fields.js";
4
6
  export const OkSchema = z.object({ ok: z.literal(true) });
7
+ export const MemberRoleSchema = z.enum(["viewer", "collaborator", "maintainer", "owner"]);
8
+ export const GrantedRoleSchema = z.enum(["viewer", "collaborator", "maintainer"]);
9
+ const MEMBER_ROLE_RANK = { viewer: 0, collaborator: 1, maintainer: 2, owner: 3 };
10
+ export const roleAtLeast = (role, floor) => MEMBER_ROLE_RANK[role] >= MEMBER_ROLE_RANK[floor];
5
11
  export const RepoParamSchema = z.object({ repo: z.string() });
6
- export const SessionTranscriptMessageSchema = z.object({ role: z.enum(["user", "assistant"]), text: z.string() });
7
12
  export const NATIVE_PROVIDERS = ["claude", "codex", "grok", "kimi", "gemini"];
8
13
  export const AgentProviderSchema = z.string().min(1);
14
+ export const NativeProviderParamSchema = z.object({ provider: z.enum(NATIVE_PROVIDERS) });
9
15
  export const AgentHarnessSchema = z.enum(["native", "claude-code"]);
16
+ export const RepoBaseSchema = z.object({ repo: z.string(), base: z.string().min(1) });
10
17
  export const EditorContextSchema = z.object({
11
18
  file: z.string().min(1),
12
19
  startLine: z.number().int().min(1).optional(),
13
20
  endLine: z.number().int().min(1).optional(),
14
21
  selection: z.string().max(20_000).optional(),
15
22
  });
16
- const ConversationIdSchema = z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/);
23
+ export const ConversationIdSchema = z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/);
24
+ const entryId = z
25
+ .string()
26
+ .min(1)
27
+ .max(60)
28
+ .regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/);
17
29
  export const AgentOriginSchema = z.object({
18
30
  automationId: z.string(),
19
31
  provider: z.string(),
20
32
  channelId: z.string().optional(),
21
33
  author: z.string().optional(),
22
34
  });
35
+ export const WakeSourceSchema = z.enum(["schedule", "event", "listener", "webchat", "workspace", "workflow"]);
36
+ export const AdmissionRuleSchema = z.enum(["allow", "hold", "deny"]);
37
+ export const CommandClassSchema = z.enum([
38
+ "git.destructive",
39
+ "files.destructive",
40
+ "secrets.access",
41
+ "package.publish",
42
+ "network.outbound",
43
+ ]);
44
+ export const AdmissionPolicySchema = z.object({
45
+ schedule: AdmissionRuleSchema.default("allow"),
46
+ event: AdmissionRuleSchema.default("allow"),
47
+ listener: AdmissionRuleSchema.default("allow"),
48
+ webchat: AdmissionRuleSchema.default("allow"),
49
+ workspace: AdmissionRuleSchema.default("allow"),
50
+ workflow: z.enum(["allow", "deny"]).default("allow"),
51
+ });
23
52
  export const PermissionModeSchema = z.enum(["default", "acceptEdits", "plan", "bypassPermissions"]);
53
+ export const ForkedFromSchema = z.object({
54
+ conversationId: ConversationIdSchema,
55
+ index: z.number().int().nonnegative(),
56
+ files: z.enum(["then", "now"]),
57
+ });
24
58
  export const AgentTurnSchema = z
25
59
  .object({
26
60
  prompt: z.string(),
@@ -29,42 +63,159 @@ export const AgentTurnSchema = z
29
63
  agent: AgentProviderSchema.optional(),
30
64
  harness: AgentHarnessSchema.optional(),
31
65
  account: z.string().optional(),
66
+ actsAs: entryId.optional(),
32
67
  sessionId: z.string().optional(),
33
68
  conversationId: ConversationIdSchema.optional(),
34
69
  isolated: z.boolean().optional(),
70
+ worktreeBase: z.array(RepoBaseSchema).min(1).max(50).optional(),
71
+ autoLand: z.boolean().optional(),
35
72
  origin: AgentOriginSchema.optional(),
36
- history: z.array(SessionTranscriptMessageSchema).max(200).optional(),
73
+ forkOf: z
74
+ .object({
75
+ conversationId: ConversationIdSchema,
76
+ keep: z.number().int().nonnegative(),
77
+ files: z.enum(["then", "now"]),
78
+ })
79
+ .optional(),
37
80
  model: z.string().optional(),
81
+ unattended: z.boolean().optional(),
82
+ outsideWake: z.string().min(1).optional(),
38
83
  permissionMode: PermissionModeSchema.optional(),
39
84
  allowedTools: z.array(z.string().min(1)).optional(),
40
85
  effort: z.string().optional(),
41
86
  thinking: z.boolean().optional(),
87
+ fast: z.boolean().optional(),
42
88
  editorContext: EditorContextSchema.optional(),
43
89
  })
44
90
  .refine((turn) => turn.prompt.trim().length > 0 || (turn.attachments?.length ?? 0) > 0, {
45
91
  message: "prompt or attachments required",
46
- })
47
- .refine((turn) => turn.sessionId === undefined || turn.history === undefined, {
48
- message: "history and sessionId are mutually exclusive",
49
92
  })
50
93
  .refine((turn) => turn.isolated !== true || turn.conversationId !== undefined, {
51
94
  message: "isolated requires conversationId",
95
+ })
96
+ .refine((turn) => turn.worktreeBase === undefined || (turn.isolated === true && turn.conversationId !== undefined), {
97
+ message: "worktreeBase requires an isolated conversationId",
52
98
  })
53
99
  .refine((turn) => turn.origin === undefined || turn.conversationId !== undefined, {
54
100
  message: "origin requires conversationId",
101
+ })
102
+ .refine((turn) => turn.forkOf === undefined || turn.conversationId !== undefined, {
103
+ message: "forkOf requires conversationId",
104
+ })
105
+ .refine((turn) => turn.forkOf?.files !== "then" || turn.isolated === true, {
106
+ message: 'forkOf.files "then" requires isolated',
55
107
  });
108
+ export const AgentRunPickSchema = z.object({ agent: z.string().min(1), model: z.string().min(1) }).optional();
56
109
  export const StartedTurnSchema = z.object({ run: z.string() });
57
110
  export const AttachTurnSchema = z.object({
58
111
  conversationId: ConversationIdSchema,
59
112
  run: z.string().optional(),
60
113
  after: z.number().int().min(0).optional(),
61
114
  });
115
+ export const LoopContextSchema = z.enum(["fresh", "continue"]);
116
+ export const LoopOutputSchema = z.discriminatedUnion("kind", [
117
+ z.object({ kind: z.literal("none") }),
118
+ z.object({ kind: z.literal("claim") }),
119
+ z.object({ kind: z.literal("json"), fields: OutputFieldsSchema }),
120
+ ]);
121
+ export const LoopCheckSchema = z.discriminatedUnion("kind", [
122
+ z.object({ kind: z.literal("command"), command: z.string().min(1) }),
123
+ z.object({ kind: z.literal("judge"), rubric: z.string().min(1), model: z.string().optional() }),
124
+ ]);
125
+ export const LoopDocumentSchema = z.object({
126
+ done: z.boolean(),
127
+ reason: z.string(),
128
+ evidence: z.string().optional(),
129
+ data: z.record(z.string(), z.unknown()).optional(),
130
+ });
131
+ const LOOP_ITERATIONS_MAX = 50;
132
+ export const LoopSchema = z.object({
133
+ conversationId: ConversationIdSchema,
134
+ goal: z.string().min(1),
135
+ prompt: z.string().min(1),
136
+ context: LoopContextSchema,
137
+ output: LoopOutputSchema,
138
+ checks: z.array(LoopCheckSchema),
139
+ maxIterations: z.number().int().min(1).max(LOOP_ITERATIONS_MAX),
140
+ maxSpendUsd: z.number().positive().optional(),
141
+ stallLimit: z.number().int().min(1),
142
+ isolated: z.boolean(),
143
+ agent: AgentProviderSchema.optional(),
144
+ harness: AgentHarnessSchema.optional(),
145
+ account: z.string().optional(),
146
+ model: z.string().optional(),
147
+ actsAs: entryId.optional(),
148
+ worktreeBase: z.array(RepoBaseSchema).min(1).max(50).optional(),
149
+ autoLand: z.boolean().optional(),
150
+ });
151
+ export const loopCanConverge = (loop) => loop.output.kind !== "none" || loop.checks.length > 0;
152
+ export const LOOP_DIR = `${STATE_DIR}/artifacts/loops`;
153
+ export const LoopIterationSchema = z.object({
154
+ n: z.number().int().min(1),
155
+ at: z.number(),
156
+ outcome: z.enum(["continue", "done", "error"]),
157
+ detail: z.string().optional(),
158
+ costUsd: z.number().optional(),
159
+ changed: z.boolean(),
160
+ sessionId: z.string().optional(),
161
+ });
162
+ export const LoopStateSchema = z.enum(["running", "done", "exhausted", "stalled", "overspent", "stopped", "error"]);
163
+ export const LoopRecordSchema = LoopSchema.extend({
164
+ state: LoopStateSchema,
165
+ startedAt: z.number(),
166
+ endedAt: z.number().optional(),
167
+ resumed: z.number().int().min(0),
168
+ detail: z.string().optional(),
169
+ iterations: z.array(LoopIterationSchema),
170
+ });
171
+ export const LoopsListSchema = z.object({ loops: z.array(LoopRecordSchema) });
172
+ export const LoopIdParamSchema = z.object({ conversationId: ConversationIdSchema });
173
+ export const LoopDesignSchema = z.object({
174
+ id: entryId,
175
+ name: z.string().min(1).max(60),
176
+ description: z.string().max(280).optional(),
177
+ prompt: z.string().optional(),
178
+ context: LoopContextSchema,
179
+ output: LoopOutputSchema,
180
+ checks: z.array(LoopCheckSchema),
181
+ maxIterations: z.number().int().min(1).max(LOOP_ITERATIONS_MAX),
182
+ maxSpendUsd: z.number().positive().optional(),
183
+ stallLimit: z.number().int().min(1),
184
+ });
185
+ export const LoopDesignsListSchema = z.object({ designs: z.array(LoopDesignSchema) });
186
+ export const LoopDesignSaveSchema = z.object({ design: LoopDesignSchema, create: z.boolean() });
187
+ export const LoopDesignIdParamSchema = z.object({ id: entryId });
188
+ export const loopFromDesign = (design, aim) => ({
189
+ conversationId: aim.conversationId,
190
+ goal: aim.goal,
191
+ prompt: design.prompt ?? "Work towards the goal above. Do the next most useful thing.",
192
+ context: design.context,
193
+ output: design.output,
194
+ checks: design.checks,
195
+ maxIterations: design.maxIterations,
196
+ ...(design.maxSpendUsd === undefined ? {} : { maxSpendUsd: design.maxSpendUsd }),
197
+ stallLimit: design.stallLimit,
198
+ isolated: aim.isolated,
199
+ });
200
+ export const loopDesignLine = (design) => {
201
+ const command = design.checks.find((check) => check.kind === "command");
202
+ const ends = command !== undefined
203
+ ? command.command
204
+ : design.checks.some((check) => check.kind === "judge")
205
+ ? "a reviewer agrees"
206
+ : design.output.kind === "none"
207
+ ? "nothing checks it"
208
+ : "the agent says so";
209
+ const ceilings = [`${design.maxIterations} rounds`, design.maxSpendUsd === undefined ? `` : `$${design.maxSpendUsd}`].filter((part) => part !== ``);
210
+ return [ends, ...ceilings].join(" · ");
211
+ };
62
212
  export const AgentStatusSchema = z.enum([
63
213
  "idle",
64
214
  "running",
65
215
  "awaiting",
66
216
  "stopping",
67
217
  "stopped",
218
+ "resuming",
68
219
  "ready",
69
220
  "landed",
70
221
  "conflict",
@@ -80,22 +231,48 @@ export const AgentAttentionSchema = z.object({
80
231
  plan: z.boolean(),
81
232
  question: z.boolean(),
82
233
  permission: z.boolean(),
234
+ service: z.boolean(),
235
+ capability: z.boolean(),
83
236
  conflict: z.boolean(),
84
237
  });
238
+ export const LandedMessageSchema = z.object({
239
+ subject: z.string(),
240
+ note: z.string().optional(),
241
+ breaking: z.string().optional(),
242
+ });
243
+ export const LandedMessageStepSchema = z.object({
244
+ provider: z.string().min(1),
245
+ model: z.string().min(1),
246
+ status: z.enum(["asking", "answered", "refused", "skipped"]),
247
+ at: z.number().optional(),
248
+ ms: z.number().optional(),
249
+ reason: z.string().optional(),
250
+ });
251
+ export const LandedMessageDraftSchema = z.object({
252
+ startedAt: z.number(),
253
+ steps: z.array(LandedMessageStepSchema),
254
+ outcome: z.enum(["written", "failed"]).optional(),
255
+ reason: z.string().optional(),
256
+ finishedAt: z.number().optional(),
257
+ });
85
258
  export const AgentSummarySchema = z.object({
86
259
  id: z.string(),
87
260
  sessionId: z.string().optional(),
88
261
  title: z.string().optional(),
89
262
  status: AgentStatusSchema,
263
+ failure: z.string().optional(),
90
264
  provider: AgentProviderSchema,
91
265
  harness: AgentHarnessSchema,
92
266
  model: z.string().optional(),
93
267
  effort: z.string().optional(),
94
268
  thinking: z.boolean().optional(),
269
+ fast: z.boolean().optional(),
95
270
  account: z.string().optional(),
96
271
  branch: z.string().optional(),
97
272
  autoLand: z.boolean().optional(),
273
+ landRequested: z.object({ email: z.string(), name: z.string().optional(), at: z.number() }).optional(),
98
274
  origin: AgentOriginSchema.optional(),
275
+ forkedFrom: ForkedFromSchema.optional(),
99
276
  base: z.string().optional(),
100
277
  costUsd: z.number().optional(),
101
278
  inputTokens: z.number().optional(),
@@ -103,6 +280,8 @@ export const AgentSummarySchema = z.object({
103
280
  contextTokens: z.number().optional(),
104
281
  contextWindow: z.number().optional(),
105
282
  activity: AgentActivitySchema.optional(),
283
+ landedMessageDraft: LandedMessageDraftSchema.optional(),
284
+ landedMessage: LandedMessageSchema.optional(),
106
285
  startedAt: z.number().optional(),
107
286
  updatedAt: z.number(),
108
287
  seenAt: z.number().optional(),
@@ -111,18 +290,33 @@ export const AgentSummarySchema = z.object({
111
290
  toolUses: z.number().optional(),
112
291
  subagents: z.object({ running: z.number(), total: z.number() }).optional(),
113
292
  diff: z.object({ files: z.number(), insertions: z.number(), deletions: z.number() }).optional(),
293
+ landedPresence: z.object({ landed: z.number(), present: z.number() }).optional(),
294
+ loop: z
295
+ .object({ state: LoopStateSchema, iteration: z.number().int().min(0), maxIterations: z.number().int().min(1), goal: z.string() })
296
+ .optional(),
297
+ workflow: z
298
+ .object({
299
+ runId: z.string(),
300
+ name: z.string(),
301
+ step: z.string(),
302
+ index: z.number().int().min(1),
303
+ total: z.number().int().min(1),
304
+ })
305
+ .optional(),
114
306
  archivedAt: z.number().optional(),
115
307
  });
116
- export const AgentsListSchema = z.object({ agents: z.array(AgentSummarySchema), rev: z.number() });
117
308
  export const AgentIdSchema = z.object({ id: z.string().min(1) });
118
309
  export const AgentArchiveSchema = z.object({ ids: z.array(z.string().min(1)).max(500).optional() });
119
310
  export const AgentIdsSchema = z.object({ ids: z.array(z.string().min(1)).min(1).max(500) });
120
311
  export const AgentsMovedSchema = z.object({ moved: z.array(AgentSummarySchema), rev: z.number() });
121
312
  export const AgentsRemovedSchema = z.object({ removed: z.array(z.string()) });
122
- export const AgentSearchQuerySchema = z.object({ query: z.string().trim().min(2) });
123
- export const AgentMatchSchema = z.object({ id: z.string(), snippet: z.string().optional() });
313
+ export const AgentSearchQuerySchema = z.object({ query: z.string().trim().min(2), caseSensitive: z.stringbool().optional() });
314
+ export const SpeakerSchema = z.enum(["user", "agent"]);
315
+ export const MatchSnippetSchema = z.object({ text: z.string(), speaker: SpeakerSchema });
316
+ export const AgentMatchSchema = z.object({ id: z.string(), snippet: MatchSnippetSchema.optional() });
124
317
  export const AgentSearchResultSchema = z.object({ matches: z.array(AgentMatchSchema), scanned: z.number() });
125
318
  export const AgentRenameSchema = z.object({ id: z.string().min(1), title: z.string().trim().min(1).max(80) });
319
+ export const AgentPlaceSchema = z.object({ id: z.string().min(1), text: z.string().trim().min(1).max(8_000) });
126
320
  export const AgentAutoLandSchema = z.object({ id: z.string().min(1), autoLand: z.boolean().nullable() });
127
321
  export const AgentFileDiffQuerySchema = z.object({ id: z.string().min(1), repo: z.string().min(1), path: z.string().min(1) });
128
322
  export const LandConflictReasonSchema = z.enum(["workspace", "diverged", "binary"]);
@@ -140,7 +334,13 @@ export const LandResultSchema = z.object({
140
334
  held: z.boolean().optional(),
141
335
  });
142
336
  export const LandModeSchema = z.enum(["check", "merge", "measure"]);
143
- export const AgentLandSchema = z.object({ id: z.string().min(1), mode: LandModeSchema.optional() });
337
+ export const AgentSpanSchema = z.enum(["cumulative", "outstanding"]);
338
+ export const AgentLandSchema = z.object({
339
+ id: z.string().min(1),
340
+ mode: LandModeSchema.optional(),
341
+ span: AgentSpanSchema.optional(),
342
+ force: z.boolean().optional(),
343
+ });
144
344
  export const KeyedProviderSchema = z.enum(["codex", "grok", "kimi", "gemini"]);
145
345
  export const UsageWindowSchema = z.object({
146
346
  kind: z.string(),
@@ -154,7 +354,7 @@ export const AccountUsageSchema = z.object({
154
354
  });
155
355
  export const ProviderRefusalSchema = z.object({
156
356
  at: z.number(),
157
- kind: z.enum(["limit", "auth"]),
357
+ kind: z.enum(["limit", "auth", "entitlement"]),
158
358
  message: z.string(),
159
359
  account: z.string().optional(),
160
360
  });
@@ -175,7 +375,6 @@ export const AgentReplySchema = z.discriminatedUnion("kind", [
175
375
  kind: z.literal("plan"),
176
376
  requestId: z.string().min(1),
177
377
  approve: z.boolean(),
178
- mode: PermissionModeSchema.optional(),
179
378
  feedback: z.string().optional(),
180
379
  }),
181
380
  z.object({
@@ -190,6 +389,28 @@ export const AgentReplySchema = z.discriminatedUnion("kind", [
190
389
  decision: z.enum(["once", "always", "deny"]),
191
390
  feedback: z.string().optional(),
192
391
  }),
392
+ z.object({
393
+ kind: z.literal("browser_help"),
394
+ requestId: z.string().min(1),
395
+ helped: z.boolean(),
396
+ note: z.string().optional(),
397
+ }),
398
+ z.object({
399
+ kind: z.literal("terminal_help"),
400
+ requestId: z.string().min(1),
401
+ helped: z.boolean(),
402
+ note: z.string().optional(),
403
+ }),
404
+ z.object({
405
+ kind: z.literal("service_offer"),
406
+ requestId: z.string().min(1),
407
+ approve: z.boolean(),
408
+ }),
409
+ z.object({
410
+ kind: z.literal("capability_offer"),
411
+ requestId: z.string().min(1),
412
+ connect: z.boolean(),
413
+ }),
193
414
  ]);
194
415
  export const SteerSchema = z
195
416
  .object({
@@ -208,6 +429,7 @@ export const RateLimitInfoSchema = z.object({
208
429
  rateLimitType: z.string().optional(),
209
430
  utilization: z.number().optional(),
210
431
  });
432
+ export const FastModeStateSchema = z.enum(["off", "cooldown", "on"]);
211
433
  export const OauthAccountSchema = z.object({
212
434
  id: z.string(),
213
435
  label: z.string(),
@@ -220,6 +442,7 @@ export const OauthAccountSchema = z.object({
220
442
  usage: AccountUsageSchema.optional(),
221
443
  });
222
444
  export const OauthAccountListSchema = z.object({ accounts: z.array(OauthAccountSchema) });
445
+ export const AccountListQuerySchema = z.object({ force: z.stringbool().default(false) });
223
446
  export const AccountIdSchema = z.object({ id: z.string().min(1) });
224
447
  export const AccountRenameSchema = z.object({ id: z.string().min(1), label: z.string().max(80) });
225
448
  export const OauthExchangeSchema = z.object({
@@ -255,42 +478,110 @@ export const SessionSummarySchema = z.object({
255
478
  id: z.string(),
256
479
  title: z.string(),
257
480
  updatedAt: z.number(),
258
- snippet: z.string().optional(),
481
+ snippet: MatchSnippetSchema.optional(),
259
482
  });
260
483
  export const SessionsListSchema = z.object({ sessions: z.array(SessionSummarySchema) });
261
484
  export const SystemPromptModeSchema = z.enum(["intentic", "claude", "custom"]);
262
485
  export const BuiltinPromptSchema = z.object({ base: z.enum(["intentic", "claude"]) });
486
+ export const RuleMomentSchema = z.enum([
487
+ "turn.ending",
488
+ "push.starting",
489
+ "agent.finished",
490
+ ]);
491
+ export const RuleBuiltinSchema = z.enum(["verify-edits"]);
492
+ export const RuleActionSchema = z.discriminatedUnion("kind", [
493
+ z.object({
494
+ kind: z.literal("command"),
495
+ command: z.string().max(500),
496
+ timeoutMs: z.number().min(60_000).max(3_600_000).default(900_000),
497
+ }),
498
+ z.object({ kind: z.literal("instruct"), text: z.string().min(1).max(4000) }),
499
+ z.object({ kind: z.literal("verdict"), verdict: z.enum(["allow", "hold"]) }),
500
+ z.object({ kind: z.literal("builtin"), name: RuleBuiltinSchema }),
501
+ ]);
502
+ export const RuleConditionSchema = z.object({
503
+ repo: z.string().min(1).optional(),
504
+ paths: z.array(z.string().min(1)).max(20).optional(),
505
+ outcome: z.array(z.enum(["clean", "error", "conflict"])).optional(),
506
+ });
507
+ const MOMENT_ACTIONS = {
508
+ "turn.ending": ["builtin", "instruct", "command"],
509
+ "push.starting": ["command"],
510
+ "agent.finished": ["verdict"],
511
+ };
512
+ export const RuleSchema = z
513
+ .object({
514
+ id: z.string().regex(/^[a-z0-9][a-z0-9-]*$/),
515
+ label: z.string().min(1).max(80),
516
+ moment: RuleMomentSchema,
517
+ when: RuleConditionSchema.optional(),
518
+ action: RuleActionSchema,
519
+ enabled: z.boolean().default(true),
520
+ })
521
+ .refine((rule) => MOMENT_ACTIONS[rule.moment].includes(rule.action.kind), {
522
+ message: "that action cannot stand at that moment",
523
+ path: ["action"],
524
+ });
525
+ export const RuleFiringsSchema = z.record(z.string(), z.number());
526
+ export const SkillOriginSchema = z.enum(["builtin", "own", "capability", "extension", "plugin", "persona", "dropped"]);
527
+ export const SkillNameSchema = z.string().regex(/^[a-z0-9][a-z0-9-]*$/, "a skill name is lowercase letters, digits and dashes");
528
+ export const SkillSummarySchema = z.object({
529
+ id: z.string(),
530
+ name: z.string(),
531
+ description: z.string(),
532
+ origin: SkillOriginSchema,
533
+ owner: z.string().optional(),
534
+ enabled: z.boolean(),
535
+ switchable: z.boolean(),
536
+ editable: z.boolean(),
537
+ removable: z.boolean(),
538
+ });
539
+ export const SkillsListSchema = z.array(SkillSummarySchema);
540
+ export const SkillBodySchema = z.object({
541
+ id: z.string(),
542
+ name: z.string(),
543
+ body: z.string(),
544
+ });
545
+ export const SkillIdSchema = z.object({ id: z.string().min(1) });
546
+ export const SkillDraftSchema = z.object({
547
+ name: SkillNameSchema,
548
+ description: z.string().min(1).max(1024),
549
+ body: z.string().min(1),
550
+ });
551
+ export const SkillRemoveSchema = z.object({ name: SkillNameSchema });
263
552
  export const SandboxSettingsSchema = z.object({
264
553
  stableSystemPrompt: z.boolean().default(false),
265
- skills: z.array(z.string()).default([]),
554
+ skills: z.array(z.string()).default(["lsp"]),
266
555
  hashlineEdits: z.boolean().default(false),
267
556
  terseOutput: z.boolean().default(false),
268
557
  terseHoldout: z.number().min(0).max(1).default(0),
269
558
  systemPromptMode: SystemPromptModeSchema.default("intentic"),
270
559
  systemPrompt: z.string().max(20000).default(""),
271
560
  iqSearch: z.boolean().default(false),
561
+ iqSearchHoldout: z.number().min(0).max(1).default(0),
272
562
  iqContext: z.boolean().default(false),
273
563
  iqContextHoldout: z.number().min(0).max(1).default(0),
274
564
  outputCleaners: z.string().default("off"),
275
565
  outputHoldout: z.number().min(0).max(1).default(0),
276
- filterBackend: z.enum(["native", "rtk"]).default("native"),
277
- quickModel: z.string().default(""),
566
+ quickModel: z.array(z.string()).max(10).default([]),
567
+ changelogRepos: z.array(z.string()).max(50).default([]),
568
+ agentRunModels: z.array(z.string()).max(10).default([]),
569
+ agentRunEffort: z.string().default(""),
278
570
  agentRetentionDays: z.number().min(0).max(365).default(3),
279
- autoLand: z.boolean().default(true),
280
- resumeAfterOutage: z.boolean().default(true),
281
- autoResumeOnRestart: z.boolean().default(true),
282
- prepushCommand: z.string().max(500).default(""),
283
- prepushTimeoutMs: z.number().min(60_000).max(3_600_000).default(900_000),
284
- prepushFixModel: z.string().default(""),
285
- prepushFixEffort: z.string().default(""),
286
- verifyOnStop: z.boolean().default(false),
571
+ resumeAfterOutage: z.boolean().default(false),
572
+ autoResumeOnRestart: z.boolean().default(false),
573
+ rules: z.array(RuleSchema).max(50).default([]),
287
574
  automationFailureLimit: z.number().min(0).max(20).default(0),
575
+ admission: AdmissionPolicySchema.prefault({}),
576
+ actionRules: z.record(z.string(), AdmissionRuleSchema).default({}),
577
+ commandRules: z.partialRecord(CommandClassSchema, AdmissionRuleSchema).default({}),
578
+ subagentsAtOnce: z.number().min(1).max(200).default(20),
579
+ subagentsPerTurn: z.number().min(1).max(2000).default(200),
580
+ subagentDepth: z.number().min(1).max(10).default(3),
288
581
  });
289
582
  export const BuiltinPromptTextSchema = z.object({ text: z.string(), version: z.string() });
290
583
  export const SavingsStageSchema = z.object({ id: z.string(), commands: z.number(), savedTokens: z.number() });
291
584
  export const InputSavingsSchema = z.object({
292
- source: z.enum(["native", "rtk"]).default("native"),
293
- windowed: z.boolean(),
294
585
  updatedAt: z.number().optional(),
295
586
  commands: z.number(),
296
587
  rawTokens: z.number(),
@@ -298,22 +589,31 @@ export const InputSavingsSchema = z.object({
298
589
  savedPct: z.number(),
299
590
  perCleaner: z.array(SavingsStageSchema),
300
591
  holdout: z.object({ cleaned: z.number(), heldOut: z.number(), measuredSavedPct: z.number().optional() }),
301
- gaps: z.array(z.object({ command: z.string(), tokens: z.number() })),
592
+ gaps: z.array(z.object({ command: z.string(), commands: z.number(), tokens: z.number() })),
302
593
  });
303
594
  export const SavingsArmSchema = z.object({ turns: z.number(), mean: z.number() });
304
- export const TurnExperimentSchema = z.object({
305
- metric: z.enum(["proseChars", "costUsd"]),
595
+ export const IqContextOutcomeSchema = z.enum(["note", "ineligible", "deadline", "indexing", "no-hits", "failed"]);
596
+ export const TurnMetricReadingSchema = z.object({
597
+ metric: z.enum(["proseChars", "searchCalls", "openingSearches"]),
306
598
  on: SavingsArmSchema,
307
599
  off: SavingsArmSchema,
308
- deliveredPct: z.number().optional(),
309
- minTurns: z.number(),
600
+ controlTurnsNeeded: z.number().optional(),
310
601
  marginPct: z.number().optional(),
311
602
  deltaPct: z.number().optional(),
312
603
  saved: z.number().optional(),
313
604
  });
605
+ export const TurnExperimentSchema = z.object({
606
+ metrics: z.tuple([TurnMetricReadingSchema], TurnMetricReadingSchema),
607
+ minTurns: z.number(),
608
+ sampleUnit: z.enum(["turns", "conversations"]).optional(),
609
+ cohort: z.string().optional(),
610
+ deliveredPct: z.number().optional(),
611
+ outcomes: z.array(z.object({ outcome: IqContextOutcomeSchema, turns: z.number() })).optional(),
612
+ });
314
613
  export const SavingsReportSchema = z.object({
315
614
  input: InputSavingsSchema,
316
615
  output: TurnExperimentSchema.optional(),
616
+ search: TurnExperimentSchema.optional(),
317
617
  context: TurnExperimentSchema.optional(),
318
618
  });
319
619
  export const IntenticRunSchema = z.object({ args: z.array(z.string()) });
@@ -334,17 +634,7 @@ export const GitFileDiffQuerySchema = RepoParamSchema.extend({ path: z.string().
334
634
  export const GitStatusSchema = z.object({ branch: z.string(), dirty: z.boolean(), files: z.array(z.string()) });
335
635
  export const GitFilesSchema = z.object({ files: z.array(z.string()) });
336
636
  export const GitFileSchema = z.object({ path: z.string(), content: z.string() });
337
- export const CommitResultSchema = z.object({ committed: z.boolean() });
338
637
  export const RepoPathsSchema = z.object({ repo: z.string().min(1), paths: z.array(z.string().min(1)).max(500).optional() });
339
- export const CommitMessageDraftSchema = z.object({
340
- repos: z.array(RepoPathsSchema).min(1).max(50),
341
- all: z.boolean().optional(),
342
- });
343
- export const CommitMessageSchema = z.object({
344
- message: z.string(),
345
- provider: z.string(),
346
- model: z.string(),
347
- });
348
638
  export const GitChangeSchema = z.object({
349
639
  path: z.string(),
350
640
  status: z.enum(["added", "modified", "deleted", "renamed", "type-changed", "conflicted"]),
@@ -372,17 +662,21 @@ export const GitBranchSchema = z.object({
372
662
  gone: z.boolean().optional(),
373
663
  at: z.number(),
374
664
  });
375
- export const GitBranchesSchema = z.object({ branches: z.array(GitBranchSchema) });
665
+ export const GitRemoteBranchSchema = z.object({ name: z.string(), remote: z.string(), branch: z.string(), at: z.number() });
666
+ export const GitBranchesSchema = z.object({ branches: z.array(GitBranchSchema), remotes: z.array(GitRemoteBranchSchema) });
376
667
  export const GitBranchCreateAtSchema = RepoParamSchema.extend({
377
668
  name: RefNameSchema,
378
669
  start: z.string().min(1).optional(),
379
670
  checkout: z.boolean().optional(),
380
671
  });
381
672
  export const GitBranchDeleteSchema = RepoParamSchema.extend({ name: RefNameSchema, force: z.boolean().optional() });
673
+ export const GitOperationSchema = z.enum(["merge", "rebase", "cherry-pick", "revert"]);
674
+ export const GitOperationStateSchema = z.object({ repo: z.string(), operation: GitOperationSchema.optional() });
382
675
  export const RepoChangesSchema = z.object({
383
676
  repo: z.string(),
384
677
  branch: z.string().optional(),
385
678
  conflicted: z.array(GitChangeSchema),
679
+ operation: GitOperationSchema.optional(),
386
680
  staged: z.array(GitChangeSchema),
387
681
  unstaged: z.array(GitChangeSchema),
388
682
  truncated: z.number().optional(),
@@ -393,16 +687,27 @@ export const RepoChangesSchema = z.object({
393
687
  export const OriginAgentSchema = z.object({
394
688
  title: z.string().optional(),
395
689
  provider: AgentProviderSchema,
690
+ landedMessage: LandedMessageSchema.optional(),
396
691
  });
397
692
  export const GitChangesSchema = z.object({
398
693
  repos: z.array(RepoChangesSchema),
399
694
  originAgents: z.record(z.string(), OriginAgentSchema).optional(),
695
+ committing: z.array(z.string()).optional(),
696
+ });
697
+ export const CommitResultSchema = z.object({
698
+ committed: z.boolean(),
699
+ changes: RepoChangesSchema.optional(),
700
+ originAgents: z.record(z.string(), OriginAgentSchema).optional(),
400
701
  });
702
+ export const WorkspaceModuleSchema = z.object({ dir: z.string(), name: z.string() });
703
+ export const RepoModulesSchema = z.object({ repo: z.string(), modules: z.array(WorkspaceModuleSchema) });
704
+ export const WorkspaceModulesSchema = z.object({ repos: z.array(RepoModulesSchema) });
401
705
  export const AgentChangeSchema = GitChangeSchema.extend({ landed: z.boolean() });
402
706
  export const AgentRepoChangesSchema = z.object({
403
707
  repo: z.string(),
404
708
  branch: z.string().optional(),
405
709
  changes: z.array(AgentChangeSchema),
710
+ modules: z.array(WorkspaceModuleSchema),
406
711
  });
407
712
  export const AgentChangesSchema = z.object({ repos: z.array(AgentRepoChangesSchema), conflicts: z.array(LandConflictSchema).optional() });
408
713
  const ShaSchema = z.string().regex(/^[0-9a-f]{4,64}$/);
@@ -418,8 +723,16 @@ export const GitCommitSchema = z.object({
418
723
  refs: z.array(z.string()),
419
724
  head: z.boolean(),
420
725
  });
421
- export const GitLogSchema = z.object({ repo: z.string(), branch: z.string().optional(), commits: z.array(GitCommitSchema) });
422
- export const GitLogQuerySchema = RepoParamSchema.extend({ limit: z.coerce.number().int().positive().max(2000).optional() });
726
+ export const GitLogSchema = z.object({
727
+ repo: z.string(),
728
+ branch: z.string().optional(),
729
+ commits: z.array(GitCommitSchema),
730
+ hasMore: z.boolean(),
731
+ });
732
+ export const GitLogQuerySchema = RepoParamSchema.extend({
733
+ limit: z.coerce.number().int().positive().max(2000).optional(),
734
+ skip: z.coerce.number().int().nonnegative().max(1_000_000).optional(),
735
+ });
423
736
  export const GitReposSchema = z.object({ repos: z.array(z.string()) });
424
737
  export const GitCommitDiffQuerySchema = RepoParamSchema.extend({ sha: ShaSchema });
425
738
  export const GitCommitDiffSchema = z.object({ files: z.array(GitChangeSchema) });
@@ -427,9 +740,37 @@ export const GitCommitFileDiffQuerySchema = RepoParamSchema.extend({ sha: ShaSch
427
740
  export const GitBranchCreateSchema = RepoParamSchema.extend({ sha: ShaSchema, name: RefNameSchema });
428
741
  export const GitTagCreateSchema = RepoParamSchema.extend({ sha: ShaSchema, name: RefNameSchema });
429
742
  export const GitCheckoutSchema = RepoParamSchema.extend({ ref: RefNameSchema });
743
+ export const GitTagDeleteSchema = RepoParamSchema.extend({ name: RefNameSchema, remote: RefNameSchema.optional() });
744
+ export const GitTagPushSchema = RepoParamSchema.extend({ name: RefNameSchema, remote: RefNameSchema });
430
745
  export const GitResetSchema = RepoParamSchema.extend({ sha: ShaSchema, mode: z.enum(["soft", "mixed", "hard"]) });
431
746
  export const GitCommitActionSchema = RepoParamSchema.extend({ sha: ShaSchema });
432
747
  export const GitActionResultSchema = z.object({ ok: z.boolean(), reason: z.string().optional() });
748
+ export const StashEntrySchema = z.object({
749
+ ref: z.string(),
750
+ sha: z.string(),
751
+ short: z.string(),
752
+ subject: z.string(),
753
+ branch: z.string().optional(),
754
+ at: z.number(),
755
+ parents: z.array(z.string()),
756
+ });
757
+ export const StashListSchema = z.object({ repo: z.string(), stashes: z.array(StashEntrySchema) });
758
+ const StashRefSchema = z.string().regex(/^stash@\{\d{1,4}\}$/);
759
+ export const StashPushSchema = RepoParamSchema.extend({ message: z.string().max(500).optional(), includeUntracked: z.boolean().optional() });
760
+ export const StashApplySchema = RepoParamSchema.extend({ ref: StashRefSchema, pop: z.boolean().optional() });
761
+ export const StashRefParamSchema = RepoParamSchema.extend({ ref: StashRefSchema });
762
+ export const StashDiffQuerySchema = RepoParamSchema.extend({ ref: StashRefSchema });
763
+ export const UndoKindSchema = z.enum(["commit", "amend", "merge", "rebase", "cherry-pick", "revert", "reset", "pull", "other"]);
764
+ export const UndoableActionSchema = z.object({
765
+ kind: UndoKindSchema,
766
+ description: z.string(),
767
+ branch: z.string(),
768
+ sha: z.string(),
769
+ previousSha: z.string(),
770
+ changesWorkingTree: z.boolean(),
771
+ });
772
+ export const GitUndoStateSchema = z.object({ repo: z.string(), action: UndoableActionSchema.optional() });
773
+ export const GitUndoSchema = RepoParamSchema.extend({ previousSha: ShaSchema, discardChanges: z.boolean().optional() });
433
774
  export const SnapshotTriggerSchema = z.enum(["turn", "interval", "pre-restore", "restore", "user"]);
434
775
  export const SnapshotSchema = z.object({
435
776
  id: z.string(),
@@ -438,6 +779,14 @@ export const SnapshotSchema = z.object({
438
779
  label: z.string().optional(),
439
780
  });
440
781
  export const SnapshotsListSchema = z.object({ snapshots: z.array(SnapshotSchema) });
782
+ export const RewindTurnSchema = z.object({
783
+ conversationId: z.string().min(1),
784
+ index: z.number().int().nonnegative(),
785
+ });
786
+ export const RewindResultSchema = z.object({
787
+ snapshot: z.string().optional(),
788
+ dropped: z.number().int().nonnegative(),
789
+ });
441
790
  export const SnapshotIdSchema = z.object({ id: z.string().min(1) });
442
791
  export const SnapshotChangeSchema = z.object({
443
792
  scope: z.string(),
@@ -456,12 +805,18 @@ export const FileDiffSchema = z.object({
456
805
  binary: z.boolean().optional(),
457
806
  truncated: z.boolean().optional(),
458
807
  });
808
+ export const WorkspaceScopeSchema = z.object({ agent: ConversationIdSchema.optional() });
809
+ export const WorkspaceLinkSchema = z.object({
810
+ to: z.string(),
811
+ state: z.enum(["broken", "outside"]).optional(),
812
+ });
459
813
  export const WorkspaceTreeEntrySchema = z.object({
460
814
  name: z.string(),
461
815
  path: z.string(),
462
816
  type: z.enum(["file", "dir"]),
463
817
  size: z.number().optional(),
464
818
  ignored: z.boolean().optional(),
819
+ link: WorkspaceLinkSchema.optional(),
465
820
  get children() {
466
821
  return z.array(WorkspaceTreeEntrySchema).optional();
467
822
  },
@@ -471,26 +826,31 @@ export const WorkspaceTreeSchema = z.object({
471
826
  tree: z.array(WorkspaceTreeEntrySchema),
472
827
  hidden: z.number(),
473
828
  });
474
- export const WorkspaceChildrenQuerySchema = z.object({ path: z.string().min(1) });
829
+ export const WorkspaceChildrenQuerySchema = WorkspaceScopeSchema.extend({ path: z.string().min(1) });
475
830
  export const WorkspaceChildrenSchema = z.object({
476
831
  entries: z.array(WorkspaceTreeEntrySchema),
477
832
  hidden: z.number(),
478
833
  });
479
834
  export const WorkspaceFileQuerySchema = z.object({ path: z.string().min(1) });
835
+ export const WorkspaceMediaTicketQuerySchema = WorkspaceScopeSchema.extend({ path: z.string().min(1) });
480
836
  export const WorkspaceMediaTicketSchema = z.object({ ticket: z.string(), expiresAt: z.number() });
481
- export const WorkspaceFileReadQuerySchema = z.object({
837
+ export const WorkspaceFileReadQuerySchema = WorkspaceScopeSchema.extend({
482
838
  path: z.string().min(1),
483
839
  offset: z.coerce.number().int().optional(),
484
840
  limit: z.coerce.number().int().min(1).optional(),
485
841
  });
486
- export const WorkspaceFileSchema = z.object({
842
+ export const WorkspaceFilePresentSchema = z.object({
843
+ present: z.literal(true),
487
844
  path: z.string(),
488
845
  content: z.string(),
489
846
  size: z.number(),
490
847
  offset: z.number(),
491
848
  bytes: z.number(),
849
+ shared: z.boolean(),
492
850
  });
493
- export const WorkspaceResolveQuerySchema = z.object({ path: z.string().min(1).max(512) });
851
+ export const WorkspaceFileAbsentSchema = z.object({ present: z.literal(false), path: z.string() });
852
+ export const WorkspaceFileSchema = z.discriminatedUnion("present", [WorkspaceFilePresentSchema, WorkspaceFileAbsentSchema]);
853
+ export const WorkspaceResolveQuerySchema = WorkspaceScopeSchema.extend({ path: z.string().min(1).max(512) });
494
854
  export const WorkspaceResolveSchema = z.object({ path: z.string().optional() });
495
855
  export const WorkspaceDirSchema = z.object({ path: z.string().min(1) });
496
856
  export const WorkspaceMoveSchema = z.object({ from: z.string().min(1), to: z.string().min(1) });
@@ -505,6 +865,7 @@ export const WorkspaceSearchQuerySchema = z.object({
505
865
  literal: z.stringbool().optional(),
506
866
  word: z.stringbool().optional(),
507
867
  caseSensitive: z.stringbool().optional(),
868
+ include: z.string().max(512).optional(),
508
869
  limit: z.coerce.number().int().positive().optional(),
509
870
  after: z.string().optional(),
510
871
  });
@@ -582,11 +943,12 @@ export const ProjectSetupSchema = z.object({
582
943
  manager: z.string(),
583
944
  command: z.string(),
584
945
  evidence: z.string(),
585
- state: z.enum(["ready", "installing", "needs-setup", "unsupported"]),
946
+ state: z.enum(["ready", "installing", "needs-setup", "unsupported", "stale"]),
947
+ missing: z.number().optional(),
586
948
  });
587
949
  export const WorkspaceSetupSchema = z.object({ projects: z.array(ProjectSetupSchema) });
588
- export const WorkspaceInstallSchema = z.object({ dirs: z.array(z.string()).min(1) });
589
- export const WorkspaceInstallResultSchema = z.object({ started: z.array(z.string()) });
950
+ export const WorkspaceInstallSchema = z.object({ dirs: z.array(z.string().max(500)).min(1).max(50) });
951
+ export const WorkspaceInstallResultSchema = z.object({ queued: z.array(z.string()) });
590
952
  export const ReposListSchema = z.object({ repos: z.array(z.string()) });
591
953
  export const CloneRepoSchema = z.object({ name: z.string().min(1), cloneUrl: z.string().min(1), branch: z.string().optional() });
592
954
  export const CloneResultSchema = z.object({ name: z.string(), path: z.string() });
@@ -629,9 +991,6 @@ export const WorkspacePackageSchema = z.object({ name: z.string(), dir: z.string
629
991
  export const WorkspaceDepTypeSchema = z.enum(["prod", "dev", "peer"]);
630
992
  export const WorkspaceDepEdgeSchema = z.object({ from: z.string(), to: z.string(), type: WorkspaceDepTypeSchema });
631
993
  export const WorkspaceGraphSchema = z.object({ packages: z.array(WorkspacePackageSchema), edges: z.array(WorkspaceDepEdgeSchema) });
632
- export const WorkspaceModuleSchema = z.object({ dir: z.string(), name: z.string() });
633
- export const RepoModulesSchema = z.object({ repo: z.string(), modules: z.array(WorkspaceModuleSchema) });
634
- export const WorkspaceModulesSchema = z.object({ repos: z.array(RepoModulesSchema) });
635
994
  export const RepoAppsParamSchema = z.object({ repo: z.string() });
636
995
  export const AppParamSchema = z.object({
637
996
  repo: z.string(),
@@ -700,17 +1059,13 @@ export const CapabilityKindSchema = z.enum([
700
1059
  "vpn",
701
1060
  "docker",
702
1061
  "browser",
1062
+ "identity",
703
1063
  "host",
704
1064
  "agent",
705
1065
  "endpoint",
706
1066
  ]);
707
1067
  export const CapabilityStateSchema = z.enum(["active", "pending", "error", "inactive"]);
708
- const entryId = z
709
- .string()
710
- .min(1)
711
- .max(60)
712
- .regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/);
713
- export const McpConfigSchema = z.object({ url: z.string().url(), token: z.string().optional() });
1068
+ export const McpConfigSchema = z.object({ url: z.url(), token: z.string().optional() });
714
1069
  export const ServiceConfigSchema = z.object({
715
1070
  service: ServiceKindSchema,
716
1071
  domain: z.string().min(1),
@@ -720,7 +1075,7 @@ export const ServiceConfigSchema = z.object({
720
1075
  export const IntegrationConfigSchema = z.object({ provider: z.literal("stripe") });
721
1076
  export const CliConfigSchema = z.object({ provider: z.string().min(1) }).catchall(z.string());
722
1077
  export const PluginConfigSchema = z.object({
723
- url: z.string().url(),
1078
+ url: z.url(),
724
1079
  ref: z.string().min(1).optional(),
725
1080
  path: z
726
1081
  .string()
@@ -730,7 +1085,7 @@ export const PluginConfigSchema = z.object({
730
1085
  token: z.string().min(1).optional(),
731
1086
  });
732
1087
  export const ExtensionConfigSchema = z.object({
733
- url: z.string().url(),
1088
+ url: z.url(),
734
1089
  ref: z.string().regex(/^[0-9a-f]{40}$/, "ref must be a full 40-character commit sha"),
735
1090
  path: z
736
1091
  .string()
@@ -738,6 +1093,8 @@ export const ExtensionConfigSchema = z.object({
738
1093
  .refine((value) => !value.split("/").includes(".."), { message: "path must stay inside the checkout" })
739
1094
  .optional(),
740
1095
  token: z.string().min(1).optional(),
1096
+ tier: z.enum(["free", "premium"]).optional(),
1097
+ registry: z.url().optional(),
741
1098
  });
742
1099
  export const SshConfigSchema = z.discriminatedUnion("auth", [
743
1100
  z.object({
@@ -788,21 +1145,52 @@ export const IpsecVpnConfigSchema = z.object({
788
1145
  pfs: z.enum(["on", "off"]).default("on"),
789
1146
  dhGroup: z.enum(["2", "5", "14", "15", "16", "19", "20"]).default("14"),
790
1147
  aggressive: z.enum(["on", "off"]).default("on"),
1148
+ routedNetworks: z
1149
+ .string()
1150
+ .default("0.0.0.0/0")
1151
+ .refine((value) => value
1152
+ .split(",")
1153
+ .map((entry) => entry.trim())
1154
+ .every((entry) => z.cidrv4().safeParse(entry).success || z.cidrv6().safeParse(entry).success), {
1155
+ message: "Routed networks is a comma-separated list of CIDRs, like 10.0.0.0/8,192.168.0.0/16. A single host needs its prefix too (192.168.0.168/32). Leave it at 0.0.0.0/0 to send everything through the gateway.",
1156
+ }),
791
1157
  autoConnect,
792
1158
  });
793
1159
  export const VpnConfigSchema = z.discriminatedUnion("provider", [WireguardVpnConfigSchema, FortinetVpnConfigSchema, IpsecVpnConfigSchema]);
794
- export const BrowserPlatformSchema = z.enum(["reddit", "x", "youtube"]);
795
- export const BrowserConfigSchema = z.object({ platform: BrowserPlatformSchema });
796
- export const HostPlatformSchema = z.enum(["windows", "linux"]);
1160
+ export const DockerConfigSchema = z.object({
1161
+ gpu: z.enum(["on", "off"]).default("off"),
1162
+ registryMirror: z.url().optional(),
1163
+ insecureRegistries: z.string().optional(),
1164
+ addressPool: z.string().optional(),
1165
+ });
1166
+ export const BrowserConfigSchema = z
1167
+ .object({
1168
+ platform: z.string().min(1),
1169
+ username: z.string().optional(),
1170
+ password: z.string().optional(),
1171
+ identity: z.string().optional(),
1172
+ purpose: z.string().optional(),
1173
+ openedAt: z.string().optional(),
1174
+ })
1175
+ .catchall(z.string());
1176
+ export const IdentityConfigSchema = z.object({
1177
+ email: z.string().min(3),
1178
+ password: z.string().optional(),
1179
+ mailbox: z.string().optional(),
1180
+ loginUrl: z.url().optional(),
1181
+ openAccounts: z.enum(["on", "off"]).default("off"),
1182
+ });
797
1183
  const hostScope = z.enum(["on", "off"]);
798
1184
  export const HostScopesSchema = z.object({
799
1185
  shell: hostScope.default("on"),
800
1186
  write: hostScope.default("off"),
801
1187
  screen: hostScope.default("on"),
802
1188
  control: hostScope.default("off"),
1189
+ sandboxes: hostScope.default("off"),
1190
+ sandboxRemove: hostScope.default("off"),
803
1191
  roots: z.string().optional(),
804
1192
  });
805
- export const HostConfigSchema = HostScopesSchema.extend({ platform: HostPlatformSchema });
1193
+ export const HostConfigSchema = HostScopesSchema.extend({ platform: z.string().min(1) });
806
1194
  export const AcpAgentConfigSchema = z.object({
807
1195
  command: z.string().min(1),
808
1196
  name: z.string().min(1).optional(),
@@ -811,7 +1199,7 @@ export const AcpAgentConfigSchema = z.object({
811
1199
  });
812
1200
  export const EndpointProtocolSchema = z.enum(["openai", "anthropic"]);
813
1201
  export const EndpointConfigSchema = z.object({
814
- baseUrl: z.string().url(),
1202
+ baseUrl: z.url(),
815
1203
  protocol: EndpointProtocolSchema.default("openai"),
816
1204
  apiKey: z.string().optional(),
817
1205
  headers: z.string().optional(),
@@ -827,27 +1215,116 @@ export const CapabilitySchema = z.discriminatedUnion("kind", [
827
1215
  z.object({ id: entryId, kind: z.literal("extension"), config: ExtensionConfigSchema }),
828
1216
  z.object({ id: entryId, kind: z.literal("ssh"), config: SshConfigSchema }),
829
1217
  z.object({ id: entryId, kind: z.literal("vpn"), config: VpnConfigSchema }),
830
- z.object({ id: entryId, kind: z.literal("docker"), config: z.object({}) }),
1218
+ z.object({ id: entryId, kind: z.literal("docker"), config: DockerConfigSchema }),
831
1219
  z.object({ id: entryId, kind: z.literal("browser"), config: BrowserConfigSchema }),
1220
+ z.object({ id: entryId, kind: z.literal("identity"), config: IdentityConfigSchema }),
832
1221
  z.object({ id: entryId, kind: z.literal("host"), config: HostConfigSchema }),
833
1222
  z.object({ id: entryId, kind: z.literal("agent"), config: AcpAgentConfigSchema }),
834
1223
  z.object({ id: entryId, kind: z.literal("endpoint"), config: EndpointConfigSchema }),
835
1224
  ]);
836
- export const CapabilityStatusSchema = z.object({ state: CapabilityStateSchema, detail: z.string().optional() });
1225
+ export const PersonaPowersSchema = z.object({
1226
+ files: z.enum(["none", "read", "write"]).default("write"),
1227
+ shell: z.boolean().default(true),
1228
+ code: z.boolean().default(true),
1229
+ web: z.boolean().default(true),
1230
+ browser: z.boolean().default(true),
1231
+ delegate: z.boolean().default(true),
1232
+ sandbox: z.boolean().default(true),
1233
+ connectors: z.array(entryId).max(100).optional(),
1234
+ computers: z.array(entryId).max(50).optional(),
1235
+ mcp: z.array(entryId).max(50).optional(),
1236
+ });
1237
+ export const PersonaWorkspaceSchema = z.object({
1238
+ startIn: z.string().max(200).optional(),
1239
+ folders: z.array(z.string().min(1)).max(50).optional(),
1240
+ });
1241
+ export const PersonaSchema = z.object({
1242
+ id: entryId,
1243
+ label: z.string().max(60).optional(),
1244
+ capabilities: z.array(entryId).max(50),
1245
+ repos: z.array(z.string().min(1)).max(50).optional(),
1246
+ powers: PersonaPowersSchema.optional(),
1247
+ workspace: PersonaWorkspaceSchema.optional(),
1248
+ systemPromptMode: SystemPromptModeSchema.optional(),
1249
+ });
1250
+ export const FRONT_DESK_PERSONA = "front-desk";
1251
+ export const personaBounds = (persona) => {
1252
+ const powers = persona.powers;
1253
+ if (powers === undefined) {
1254
+ return "Full powers";
1255
+ }
1256
+ const resolved = PersonaPowersSchema.parse(powers);
1257
+ if (resolved.files === "read" && !resolved.shell) {
1258
+ return "Read-only";
1259
+ }
1260
+ if (!resolved.shell) {
1261
+ return "No shell";
1262
+ }
1263
+ const limits = [
1264
+ resolved.files === "none",
1265
+ !resolved.code,
1266
+ !resolved.web,
1267
+ !resolved.browser,
1268
+ !resolved.delegate,
1269
+ !resolved.sandbox,
1270
+ resolved.connectors !== undefined,
1271
+ resolved.computers !== undefined,
1272
+ resolved.mcp !== undefined,
1273
+ ].filter(Boolean).length;
1274
+ return limits === 0 ? "Full powers" : `${limits} limit${limits === 1 ? "" : "s"}`;
1275
+ };
1276
+ export const PersonaIdParamSchema = z.object({ id: entryId });
1277
+ export const PersonasListSchema = z.object({
1278
+ personas: z.array(PersonaSchema),
1279
+ connected: z.array(z.string()),
1280
+ });
1281
+ export const PersonaKitSchema = z.object({
1282
+ prompt: z.string(),
1283
+ skills: z.array(z.object({ name: z.string(), description: z.string() })),
1284
+ });
1285
+ export const PersonaPromptSchema = PersonaIdParamSchema.extend({ prompt: z.string().max(20000) });
1286
+ export const PersonaSkillSchema = PersonaIdParamSchema.extend(SkillDraftSchema.shape);
1287
+ export const PersonaSkillNameSchema = PersonaIdParamSchema.extend({ name: SkillNameSchema });
1288
+ export const PersonaSkillBodySchema = z.object({ name: z.string(), description: z.string(), body: z.string() });
1289
+ export const CapabilityStatusSchema = z.object({
1290
+ state: CapabilityStateSchema,
1291
+ detail: z.string().optional(),
1292
+ code: z.string().optional(),
1293
+ });
837
1294
  export const CapabilitySummarySchema = z.object({
838
1295
  id: z.string(),
839
1296
  kind: CapabilityKindSchema,
840
1297
  status: CapabilityStatusSchema,
841
1298
  config: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])),
842
1299
  });
843
- export const CapabilityRecommendationSchema = z.object({ kind: CapabilityKindSchema, evidence: z.string() });
1300
+ export const CapabilityRecommendationSchema = z.object({
1301
+ card: z.string(),
1302
+ evidence: z.string(),
1303
+ reason: z.string(),
1304
+ prefill: z.record(z.string(), z.string()),
1305
+ });
844
1306
  export const CapabilitiesListSchema = z.object({
845
1307
  capabilities: z.array(CapabilitySummarySchema),
846
1308
  recommendations: z.array(CapabilityRecommendationSchema).default([]),
847
1309
  });
848
1310
  export const CapabilityIdParamSchema = z.object({ id: z.string() });
1311
+ export const CapabilityConnectionSchema = z.object({
1312
+ id: z.string(),
1313
+ kind: z.string(),
1314
+ config: z.record(z.string(), z.string()),
1315
+ });
1316
+ export const CapabilityCardParamSchema = z.object({ card: z.string() });
849
1317
  export const CapabilitySecretInputSchema = z.object({ id: z.string(), value: z.string().min(1) });
1318
+ export const CapabilityRenameSchema = z.object({
1319
+ id: z.string(),
1320
+ to: z
1321
+ .string()
1322
+ .min(1)
1323
+ .max(60)
1324
+ .regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/),
1325
+ });
850
1326
  export const CapabilityLoginSchema = z.object({ session: z.string() });
1327
+ export const CapabilityOtpSchema = z.object({ code: z.string(), secondsRemaining: z.number() });
851
1328
  export const HostFactsSchema = z.object({
852
1329
  os: z.string(),
853
1330
  arch: z.string(),
@@ -857,7 +1334,7 @@ export const HostFactsSchema = z.object({
857
1334
  });
858
1335
  export const HostSummarySchema = z.object({
859
1336
  id: z.string(),
860
- platform: HostPlatformSchema,
1337
+ platform: z.string().min(1),
861
1338
  online: z.boolean(),
862
1339
  version: z.string().optional(),
863
1340
  lastSeen: z.number().optional(),
@@ -903,21 +1380,91 @@ export const ForticlientConnectionSchema = z.object({
903
1380
  needs: z.array(z.string()),
904
1381
  });
905
1382
  export const ForticlientImportSchema = z.object({ connections: z.array(ForticlientConnectionSchema) });
906
- export const MarketplaceRequestSchema = z.object({ url: z.string().url(), token: z.string().min(1).optional() });
1383
+ export const MarketplaceRequestSchema = z.object({ url: z.url(), token: z.string().min(1).optional() });
907
1384
  export const MarketplaceSchema = z.object({ name: z.string(), plugins: z.array(RegistryEntrySchema) });
908
1385
  const extensionId = z
909
1386
  .string()
910
1387
  .min(1)
911
1388
  .max(121)
912
1389
  .regex(/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/);
1390
+ export const ExtensionUpdatePolicySchema = z.object({
1391
+ updates: z.enum(["notify", "agent", "auto"]),
1392
+ advisories: z.enum(["auto-disable", "notify"]),
1393
+ });
1394
+ export const ExtensionUpdateSchema = z.object({
1395
+ ref: z.string(),
1396
+ version: z.string().optional(),
1397
+ url: z.string(),
1398
+ path: z.string().optional(),
1399
+ trust: z.enum(["verified", "listed"]),
1400
+ securityFix: z.boolean().optional(),
1401
+ registry: z.string(),
1402
+ at: z.string(),
1403
+ needsReview: z.string().optional(),
1404
+ review: z.object({ conversationId: z.string(), at: z.string() }).optional(),
1405
+ });
1406
+ export const ExtensionAdvisorySchema = z.object({
1407
+ reason: z.string(),
1408
+ registry: z.string(),
1409
+ at: z.string(),
1410
+ autoDisabled: z.boolean(),
1411
+ });
1412
+ export const ExtensionHealthSchema = z.object({
1413
+ state: z.enum(["watching", "healthy", "unhealthy"]),
1414
+ detail: z.string().optional(),
1415
+ fromRef: z.string().optional(),
1416
+ at: z.string(),
1417
+ autoReverted: z.boolean().optional(),
1418
+ });
1419
+ export const PowersDiffSchema = z.object({ added: z.array(z.string()), removed: z.array(z.string()), unchanged: z.array(z.string()) });
1420
+ export const ExtensionUpdateActionSchema = z.object({
1421
+ id: extensionId,
1422
+ ref: z
1423
+ .string()
1424
+ .regex(/^[0-9a-f]{40}$/)
1425
+ .optional(),
1426
+ });
1427
+ export const ExtensionUpdatePreviewSchema = z.object({
1428
+ ref: z.string(),
1429
+ version: z.string(),
1430
+ installedVersion: z.string(),
1431
+ engines: z.string(),
1432
+ compatible: z.boolean(),
1433
+ powers: PowersDiffSchema,
1434
+ });
1435
+ export const ExtensionUpdateAppliedSchema = z.object({ ok: z.literal(true), ref: z.string(), rebuildNeeded: z.boolean().optional() });
1436
+ export const ExtensionUpdatePolicyInputSchema = z.object({
1437
+ id: extensionId,
1438
+ updates: z.enum(["notify", "agent", "auto"]).optional(),
1439
+ advisories: z.enum(["auto-disable", "notify"]).optional(),
1440
+ });
1441
+ export const ExtensionUpdatesCheckedSchema = z.object({ ok: z.literal(true), checkedAt: z.string() });
913
1442
  export const ExtensionSummarySchema = z.object({
914
1443
  id: extensionId,
915
1444
  manifest: ExtensionManifestSchema,
916
1445
  commit: z.string(),
917
- builtin: z.boolean(),
1446
+ source: z.enum(["builtin", "installed", "workspace"]),
918
1447
  enabled: z.boolean(),
1448
+ essential: z.boolean().optional(),
1449
+ usage: z.record(z.string(), z.object({ calls: z.number().int().nonnegative(), last: z.string() })).optional(),
1450
+ backend: z
1451
+ .object({
1452
+ state: z.enum(["running", "error", "absent", "incompatible", "starting", "stopped"]),
1453
+ detail: z.string().optional(),
1454
+ })
1455
+ .optional(),
1456
+ update: ExtensionUpdateSchema.optional(),
1457
+ advisory: ExtensionAdvisorySchema.optional(),
1458
+ health: ExtensionHealthSchema.optional(),
1459
+ previous: z.object({ ref: z.string(), version: z.string().optional() }).optional(),
1460
+ updatePolicy: ExtensionUpdatePolicySchema.optional(),
1461
+ });
1462
+ export const InvalidWorkspaceExtensionSchema = z.object({ dir: z.string(), error: z.string() });
1463
+ export const ExtensionsListSchema = z.object({
1464
+ extensions: z.array(ExtensionSummarySchema),
1465
+ invalid: z.array(InvalidWorkspaceExtensionSchema),
1466
+ updatesCheckedAt: z.string().optional(),
919
1467
  });
920
- export const ExtensionsListSchema = z.object({ extensions: z.array(ExtensionSummarySchema) });
921
1468
  export const ExtensionSettingsSchema = z.object({
922
1469
  settings: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])),
923
1470
  secretsSet: z.array(z.string()),
@@ -927,6 +1474,12 @@ export const ExtensionSettingsInputSchema = z.object({
927
1474
  settings: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])),
928
1475
  });
929
1476
  export const ExtensionEnabledInputSchema = z.object({ id: z.string(), enabled: z.boolean() });
1477
+ export const WorkspaceExtensionCreateSchema = z.object({
1478
+ publisher: z.string().regex(/^[a-z0-9][a-z0-9-]*$/),
1479
+ name: z.string().regex(/^[a-z0-9][a-z0-9-]*$/),
1480
+ });
1481
+ export const WorkspaceExtensionCreatedSchema = z.object({ id: z.string(), dir: z.string() });
1482
+ export const ExtensionUsageInputSchema = z.object({ id: z.string(), used: z.record(z.string(), z.number().int().positive()) });
930
1483
  export const ExtensionProcessParamSchema = z.object({ id: z.string(), name: z.string() });
931
1484
  export const ExtensionProcessStatusSchema = z.object({
932
1485
  name: z.string(),
@@ -934,7 +1487,7 @@ export const ExtensionProcessStatusSchema = z.object({
934
1487
  port: z.number().optional(),
935
1488
  previewUrl: z.string().optional(),
936
1489
  });
937
- export const WorkspaceEventKindSchema = z.enum(["turn.settled", "agent.landed"]);
1490
+ export const WorkspaceEventKindSchema = z.enum(["turn.settled", "agent.landed", "deps.broken", "deps.fixed"]);
938
1491
  export const WorkspaceEventSchema = z.object({
939
1492
  event: WorkspaceEventKindSchema,
940
1493
  agentId: z.string(),
@@ -942,6 +1495,15 @@ export const WorkspaceEventSchema = z.object({
942
1495
  branch: z.string(),
943
1496
  outcome: z.enum(["landed", "conflict", "ready", "idle", "error"]),
944
1497
  repos: z.array(z.object({ repo: z.string(), from: z.string(), dir: z.string() })),
1498
+ deps: z
1499
+ .object({
1500
+ project: z.string(),
1501
+ command: z.string(),
1502
+ exitCode: z.number(),
1503
+ attempt: z.number(),
1504
+ logTail: z.string(),
1505
+ })
1506
+ .optional(),
945
1507
  });
946
1508
  export const TriggerSchema = z.discriminatedUnion("kind", [
947
1509
  z.object({ kind: z.literal("schedule"), cron: z.string().min(1) }),
@@ -952,6 +1514,7 @@ export const TriggerSchema = z.discriminatedUnion("kind", [
952
1514
  channelId: z.string().min(1).optional(),
953
1515
  eventType: z.string().min(1).optional(),
954
1516
  mentioned: z.boolean().optional(),
1517
+ branch: z.string().min(1).optional(),
955
1518
  allowedOrigins: z.array(z.string()).optional(),
956
1519
  }),
957
1520
  z.object({ kind: z.literal("workspace"), event: WorkspaceEventKindSchema, repo: z.string().min(1).optional() }),
@@ -1008,9 +1571,12 @@ export const AutomationSchema = z.object({
1008
1571
  webchat: WebchatConfigSchema.optional(),
1009
1572
  allowedTools: z.array(z.string().min(1)).optional(),
1010
1573
  agent: AgentProviderSchema.optional(),
1574
+ account: z.string().optional(),
1575
+ actsAs: entryId.optional(),
1011
1576
  harness: AgentHarnessSchema.optional(),
1012
1577
  model: z.string().optional(),
1013
1578
  requireApproval: z.boolean().optional(),
1579
+ holdForSeconds: z.number().optional(),
1014
1580
  chore: z.boolean().optional(),
1015
1581
  enabled: z.boolean(),
1016
1582
  });
@@ -1020,7 +1586,15 @@ export const AutomationApprovalSchema = z.object({
1020
1586
  payload: z.string().optional(),
1021
1587
  origin: AgentOriginSchema.optional(),
1022
1588
  title: z.string().optional(),
1589
+ conversationId: z.string().optional(),
1590
+ sessionId: z.string().optional(),
1023
1591
  createdAt: z.number(),
1592
+ autoRunAt: z.number().optional(),
1593
+ });
1594
+ export const AgentsListSchema = z.object({
1595
+ agents: z.array(AgentSummarySchema),
1596
+ rev: z.number(),
1597
+ held: z.array(AutomationApprovalSchema).default([]),
1024
1598
  });
1025
1599
  export const AutomationApprovalsListSchema = z.object({ approvals: z.array(AutomationApprovalSchema) });
1026
1600
  export const AutomationApprovalIdParamSchema = z.object({ id: z.string() });
@@ -1036,6 +1610,125 @@ export const AutomationSummarySchema = AutomationSchema.extend({
1036
1610
  });
1037
1611
  export const AutomationsListSchema = z.object({ automations: z.array(AutomationSummarySchema) });
1038
1612
  export const AutomationIdParamSchema = z.object({ id: z.string() });
1613
+ export const AutomationEnabledInputSchema = z.object({ id: z.string(), enabled: z.boolean() });
1614
+ const TriggerFieldSchema = z.object({ label: z.string().min(1), placeholder: z.string().min(1), hint: z.string().min(1).optional() });
1615
+ export const TriggerSourceSchema = z.object({
1616
+ provider: z.string().min(1),
1617
+ label: z.string().min(1),
1618
+ logo: z.string().min(1).optional(),
1619
+ icon: z.string().min(1).optional(),
1620
+ events: z.array(z.object({ value: z.string().min(1), label: z.string().min(1) })),
1621
+ channel: TriggerFieldSchema,
1622
+ branchField: TriggerFieldSchema.optional(),
1623
+ mentionLabel: z.string().min(1).optional(),
1624
+ starterPrompt: z.string().min(1).optional(),
1625
+ requires: z.array(z.string().min(1)).default([]),
1626
+ enabled: z.boolean(),
1627
+ });
1628
+ export const TemplateOfferSchema = z.enum(["create", "configure"]);
1629
+ export const AutomationTemplateSchema = z.object({
1630
+ id: z.string().min(1),
1631
+ title: z.string().min(1),
1632
+ logo: z.string().min(1).optional(),
1633
+ icon: z.string().min(1).optional(),
1634
+ requires: z.array(z.string().min(1)).default([]),
1635
+ trigger: TriggerSchema,
1636
+ guard: z.string().min(1).optional(),
1637
+ holdForSeconds: z.number().int().positive().optional(),
1638
+ prompt: z.string().min(1),
1639
+ note: z.string().min(1).optional(),
1640
+ setup: z.string().min(1).optional(),
1641
+ description: z.string().min(1).optional(),
1642
+ offer: TemplateOfferSchema.optional(),
1643
+ chore: z.boolean().optional(),
1644
+ });
1645
+ export const AutomationCatalogSchema = z.object({
1646
+ sources: z.array(TriggerSourceSchema),
1647
+ templates: z.array(AutomationTemplateSchema),
1648
+ });
1649
+ const StepIdSchema = z
1650
+ .string()
1651
+ .min(1)
1652
+ .max(24)
1653
+ .regex(/^[a-z0-9][a-z0-9-]*$/);
1654
+ export const WorkflowHandoffSchema = z.enum(["fresh", "continue"]);
1655
+ const WORKFLOW_STEPS_MAX = 24;
1656
+ export const WorkflowStepSchema = z.object({
1657
+ id: StepIdSchema,
1658
+ title: z.string().min(1).max(60),
1659
+ goal: z.string().min(1).optional(),
1660
+ prompt: z.string().min(1).optional(),
1661
+ needs: z.array(StepIdSchema),
1662
+ handoff: WorkflowHandoffSchema,
1663
+ output: LoopOutputSchema,
1664
+ checks: z.array(LoopCheckSchema),
1665
+ context: LoopContextSchema,
1666
+ maxSpendUsd: z.number().positive().optional(),
1667
+ agent: AgentProviderSchema.optional(),
1668
+ harness: AgentHarnessSchema.optional(),
1669
+ account: z.string().optional(),
1670
+ model: z.string().optional(),
1671
+ actsAs: entryId.optional(),
1672
+ });
1673
+ export const WorkflowGateSchema = z.object({
1674
+ step: StepIdSchema,
1675
+ field: z.string().min(1),
1676
+ pass: z.array(z.string().min(1)).min(1),
1677
+ token: z.string().optional(),
1678
+ dailyMax: z.number().int().positive().optional(),
1679
+ });
1680
+ export const GATE_DAILY_MAX_DEFAULT = 20;
1681
+ export const GateOutcomeSchema = z.enum(["pass", "fail", "blocked"]);
1682
+ export const GateVerdictSchema = z.object({
1683
+ outcome: GateOutcomeSchema,
1684
+ reason: z.string(),
1685
+ runId: z.string(),
1686
+ value: z.string().optional(),
1687
+ });
1688
+ export const WorkflowSchema = z.object({
1689
+ id: entryId,
1690
+ name: z.string().min(1).max(80),
1691
+ description: z.string().max(400).optional(),
1692
+ steps: z.array(WorkflowStepSchema).min(1).max(WORKFLOW_STEPS_MAX),
1693
+ gate: WorkflowGateSchema.optional(),
1694
+ maxParallel: z.number().int().min(1).max(8),
1695
+ });
1696
+ export const WorkflowStepStateSchema = z.enum(["pending", "running", "done", "failed", "skipped", "stopped"]);
1697
+ export const WorkflowStepRunSchema = z.object({
1698
+ stepId: StepIdSchema,
1699
+ state: WorkflowStepStateSchema,
1700
+ conversationId: z.string(),
1701
+ startedAt: z.number().optional(),
1702
+ endedAt: z.number().optional(),
1703
+ iterations: z.number().int().min(0),
1704
+ costUsd: z.number().optional(),
1705
+ loopState: LoopStateSchema.optional(),
1706
+ detail: z.string().optional(),
1707
+ document: LoopDocumentSchema.optional(),
1708
+ report: z.string().optional(),
1709
+ reportPath: z.string().optional(),
1710
+ });
1711
+ export const WorkflowRunStateSchema = z.enum(["running", "done", "failed", "stopped", "overspent", "error"]);
1712
+ export const WorkflowRunSchema = z.object({
1713
+ runId: z.string().min(1),
1714
+ workflow: WorkflowSchema,
1715
+ repos: z.array(RepoBaseSchema).min(1).max(50),
1716
+ request: z.string().optional(),
1717
+ state: WorkflowRunStateSchema,
1718
+ startedAt: z.number(),
1719
+ endedAt: z.number().optional(),
1720
+ resumed: z.number().int().min(0),
1721
+ detail: z.string().optional(),
1722
+ steps: z.array(WorkflowStepRunSchema),
1723
+ archivedAt: z.number().optional(),
1724
+ });
1725
+ export const WorkflowSummarySchema = WorkflowSchema.extend({ runs: z.array(WorkflowRunSchema) });
1726
+ export const WorkflowsListSchema = z.object({ workflows: z.array(WorkflowSummarySchema) });
1727
+ export const WorkflowRunsListSchema = z.object({ runs: z.array(WorkflowRunSchema) });
1728
+ export const WorkflowIdParamSchema = z.object({ id: z.string() });
1729
+ export const WorkflowRunIdParamSchema = z.object({ runId: z.string() });
1730
+ export const WorkflowRunStartSchema = WorkflowIdParamSchema.extend({ request: z.string().min(1).max(20_000).optional() });
1731
+ export const WorkflowSaveSchema = z.object({ workflow: WorkflowSchema, create: z.boolean() });
1039
1732
  export const CiHostSchema = z.enum(["github", "gitlab"]);
1040
1733
  export const PipelineStatusSchema = z.enum(["running", "success", "failed", "canceled", "skipped"]);
1041
1734
  export const PipelineRunSchema = z.object({
@@ -1059,6 +1752,7 @@ export const PipelineJobSchema = z.object({
1059
1752
  name: z.string(),
1060
1753
  status: PipelineStatusSchema,
1061
1754
  stage: z.string().optional(),
1755
+ needs: z.array(z.string()).optional(),
1062
1756
  startedAt: z.number().optional(),
1063
1757
  finishedAt: z.number().optional(),
1064
1758
  durationSeconds: z.number().optional(),
@@ -1074,6 +1768,7 @@ export const CiRepoSchema = z.object({
1074
1768
  url: z.string(),
1075
1769
  hookWarning: z.string().optional(),
1076
1770
  });
1771
+ export const CI_POLL_INTERVAL_MS = 2 * 60_000;
1077
1772
  export const CiRunsResponseSchema = z.object({
1078
1773
  repos: z.array(CiRepoSchema),
1079
1774
  runs: z.array(PipelineRunSchema),
@@ -1081,90 +1776,8 @@ export const CiRunsResponseSchema = z.object({
1081
1776
  });
1082
1777
  export const CiSeenResponseSchema = z.object({ seenAt: z.number() });
1083
1778
  export const CiRunParamSchema = z.object({ repo: z.string(), runId: z.number() });
1779
+ export const CiFixParamSchema = CiRunParamSchema.extend({ pick: AgentRunPickSchema });
1084
1780
  export const CiFixResponseSchema = z.object({ conversationId: z.string() });
1085
- export const DeployStateSchema = z.enum(["running", "deploying", "stopped", "unhealthy", "unknown"]);
1086
- export const DeployResourceKindSchema = z.enum(["deployment", "stack"]);
1087
- export const DeployServiceSchema = z.object({
1088
- name: z.string(),
1089
- image: z.string(),
1090
- updateAvailable: z.boolean(),
1091
- });
1092
- export const DeployResourceSchema = z.object({
1093
- kind: DeployResourceKindSchema,
1094
- id: z.string(),
1095
- name: z.string(),
1096
- state: DeployStateSchema,
1097
- status: z.string().optional(),
1098
- server: z.string().optional(),
1099
- image: z.string().optional(),
1100
- updateAvailable: z.boolean(),
1101
- services: z.array(DeployServiceSchema),
1102
- url: z.string(),
1103
- });
1104
- export const DeployServerStateSchema = z.enum(["ok", "unreachable", "disabled"]);
1105
- export const DeployServerSchema = z.object({
1106
- id: z.string(),
1107
- name: z.string(),
1108
- state: DeployServerStateSchema,
1109
- cpuPercent: z.number().optional(),
1110
- memPercent: z.number().optional(),
1111
- diskPercent: z.number().optional(),
1112
- url: z.string(),
1113
- });
1114
- export const DeployAlertSchema = z.object({
1115
- id: z.string(),
1116
- type: z.string(),
1117
- level: z.enum(["ok", "warning", "critical"]),
1118
- resolved: z.boolean(),
1119
- ts: z.number(),
1120
- resource: z.string().optional(),
1121
- server: z.string().optional(),
1122
- from: z.string().optional(),
1123
- to: z.string().optional(),
1124
- });
1125
- export const DeployViewerSchema = z.object({
1126
- username: z.string(),
1127
- admin: z.boolean(),
1128
- });
1129
- export const DeployRepoLinkSchema = z.object({
1130
- repo: z.string(),
1131
- projectName: z.string(),
1132
- composePath: z.string(),
1133
- linkedStack: z.string().optional(),
1134
- suggestions: z.array(z.string()),
1135
- });
1136
- export const DeployLinkParamSchema = z.object({
1137
- capability: z.string(),
1138
- repo: z.string(),
1139
- stack: z.string(),
1140
- });
1141
- export const DeployOverviewResponseSchema = z.object({
1142
- komodoUrl: z.string(),
1143
- reachable: z.boolean(),
1144
- unreachableReason: z.string().optional(),
1145
- viewer: DeployViewerSchema.optional(),
1146
- repos: z.array(DeployRepoLinkSchema).default([]),
1147
- resources: z.array(DeployResourceSchema),
1148
- servers: z.array(DeployServerSchema),
1149
- alerts: z.array(DeployAlertSchema),
1150
- seenAt: z.number().optional(),
1151
- });
1152
- export const DeployCapabilityParamSchema = z.object({ capability: z.string() });
1153
- export const DeployActionSchema = z.enum(["deploy", "restart", "start", "stop", "pull"]);
1154
- export const DeployActionParamSchema = z.object({
1155
- capability: z.string(),
1156
- kind: DeployResourceKindSchema,
1157
- id: z.string(),
1158
- action: DeployActionSchema,
1159
- });
1160
- export const DeployLogsParamSchema = z.object({
1161
- capability: z.string(),
1162
- kind: DeployResourceKindSchema,
1163
- id: z.string(),
1164
- });
1165
- export const DeployLogsResponseSchema = z.object({ stdout: z.string(), stderr: z.string() });
1166
- export const DeployFixResponseSchema = z.object({ conversationId: z.string() });
1167
- export const DeploySeenResponseSchema = z.object({ seenAt: z.number() });
1168
1781
  export const PrepushStatusSchema = z.enum(["idle", "running", "passed", "failed", "error", "cancelled"]);
1169
1782
  export const PrepushRunSchema = z.object({
1170
1783
  status: PrepushStatusSchema,
@@ -1173,6 +1786,7 @@ export const PrepushRunSchema = z.object({
1173
1786
  finishedAt: z.number().optional(),
1174
1787
  exitCode: z.number().optional(),
1175
1788
  timedOut: z.boolean().optional(),
1789
+ session: z.string().optional(),
1176
1790
  output: z.string(),
1177
1791
  });
1178
1792
  export const DraftStatusSchema = z.enum(["proposed", "approved", "posting", "posted", "failed"]);
@@ -1185,7 +1799,9 @@ export const DraftSchema = z.object({
1185
1799
  scheduledAt: z.number().optional(),
1186
1800
  status: DraftStatusSchema.default("proposed"),
1187
1801
  createdAt: z.number().optional(),
1802
+ postingAt: z.number().optional(),
1188
1803
  postedAt: z.number().optional(),
1804
+ postedUrl: z.string().optional(),
1189
1805
  error: z.string().optional(),
1190
1806
  });
1191
1807
  export const DraftSummarySchema = DraftSchema.extend({ id: entryId });
@@ -1197,6 +1813,7 @@ export const PanelSummarySchema = z.object({
1197
1813
  running: z.boolean(),
1198
1814
  healthy: z.boolean(),
1199
1815
  port: z.number().optional(),
1816
+ servers: z.array(z.object({ url: z.string(), dir: z.string().optional(), session: z.string().optional() })),
1200
1817
  previewUrl: z.string().optional(),
1201
1818
  role: z.enum(["intent", "desired-state", "app"]).optional(),
1202
1819
  deployConfig: z.boolean(),
@@ -1205,6 +1822,7 @@ export const PanelSummarySchema = z.object({
1205
1822
  monorepo: z.boolean(),
1206
1823
  vitest: z.boolean(),
1207
1824
  userStories: z.boolean(),
1825
+ docs: z.boolean(),
1208
1826
  });
1209
1827
  export const PanelsListSchema = z.object({ panels: z.array(PanelSummarySchema) });
1210
1828
  export const PanelRepoParamSchema = z.object({ repo: z.string() });
@@ -1216,12 +1834,126 @@ export const PortSummarySchema = z.object({
1216
1834
  pid: z.number().optional(),
1217
1835
  command: z.string().optional(),
1218
1836
  cwd: z.string().optional(),
1837
+ session: z.string().optional(),
1219
1838
  forwarded: z.boolean(),
1220
1839
  previewUrl: z.string().optional(),
1221
1840
  });
1222
1841
  export const PortsListSchema = z.object({ ports: z.array(PortSummarySchema) });
1223
1842
  export const PortParamSchema = z.object({ port: z.number().int().min(1).max(65535) });
1224
1843
  export const PortForwardResultSchema = z.object({ previewUrl: z.string().optional() });
1844
+ export const MachineSandboxSchema = z.object({
1845
+ slug: z.string(),
1846
+ container: z.string(),
1847
+ name: z.string().optional(),
1848
+ running: z.boolean(),
1849
+ image: z.string(),
1850
+ tunnelRunning: z.boolean().optional(),
1851
+ });
1852
+ export const MachineSandboxOpSchema = z.enum(["start", "stop", "restart", "update", "rebuild", "rollback", "remove"]);
1853
+ export const MachineSandboxFlowSchema = z.object({
1854
+ op: MachineSandboxOpSchema,
1855
+ slug: z.string().min(1),
1856
+ hash: z.string().optional(),
1857
+ });
1858
+ export const MachineSandboxFlowInputSchema = MachineSandboxFlowSchema.extend({ id: z.string().min(1) });
1859
+ export const MachineFlowLineSchema = z.discriminatedUnion("kind", [
1860
+ z.object({ kind: z.literal("line"), text: z.string() }),
1861
+ z.object({ kind: z.literal("result"), message: z.string() }),
1862
+ z.object({ kind: z.literal("error"), message: z.string() }),
1863
+ ]);
1864
+ export const MachinePairingSchema = z.object({
1865
+ sandboxId: z.string(),
1866
+ mode: z.enum(["sync", "mirror"]),
1867
+ localDir: z.string().optional(),
1868
+ mutagenStatus: z.string().optional(),
1869
+ conflicts: z.number().int().nonnegative().optional(),
1870
+ paused: z.boolean().optional(),
1871
+ });
1872
+ export const MachinePortStateSchema = z.enum([
1873
+ "mirrored",
1874
+ "held-by-sandbox",
1875
+ "busy",
1876
+ ]);
1877
+ export const MachinePortSchema = z.object({
1878
+ port: z.number().int().min(1).max(65535),
1879
+ host: z.enum(["127.0.0.1", "::1"]),
1880
+ sandboxId: z.string(),
1881
+ state: MachinePortStateSchema,
1882
+ heldBy: z.string().optional(),
1883
+ command: z.string().optional(),
1884
+ });
1885
+ export const MachineWatcherSchema = z.object({
1886
+ running: z.boolean(),
1887
+ pid: z.number().int().optional(),
1888
+ lastTickAt: z.number().optional(),
1889
+ });
1890
+ export const MachineReportSchema = z.object({
1891
+ hostname: z.string(),
1892
+ os: z.string(),
1893
+ agents: z.object({ sync: z.string().optional(), host: z.string().optional() }),
1894
+ sandboxes: z.array(MachineSandboxSchema),
1895
+ pairings: z.array(MachinePairingSchema),
1896
+ ports: z.array(MachinePortSchema),
1897
+ watcher: MachineWatcherSchema,
1898
+ capturedAt: z.number(),
1899
+ });
1900
+ export const ComputerGapSchema = z.enum([
1901
+ "offline",
1902
+ "scope-off",
1903
+ "no-agent",
1904
+ "unreported",
1905
+ ]);
1906
+ export const ComputerSchema = z.object({
1907
+ key: z.string(),
1908
+ label: z.string(),
1909
+ syncEnrolled: z.boolean(),
1910
+ hostId: z.string().optional(),
1911
+ online: z.boolean().optional(),
1912
+ platform: z.string().optional(),
1913
+ facts: HostFactsSchema.optional(),
1914
+ hostAgent: z.string().optional(),
1915
+ lastSeen: z.number().optional(),
1916
+ report: MachineReportSchema.optional(),
1917
+ gap: ComputerGapSchema.optional(),
1918
+ });
1919
+ export const ComputersListSchema = z.object({ computers: z.array(ComputerSchema) });
1920
+ export const SyncStatusSchema = z.object({
1921
+ enrolled: z.boolean(),
1922
+ sshHostname: z.string().optional(),
1923
+ syncingFrom: z.string().optional(),
1924
+ syncSeenAt: z.number().optional(),
1925
+ mirroredBy: z.array(z.string()).optional(),
1926
+ machines: z.array(MachineReportSchema).optional(),
1927
+ });
1928
+ export const PublicFileSchema = z.object({
1929
+ path: z.string(),
1930
+ size: z.number(),
1931
+ modifiedAt: z.number(),
1932
+ url: z.string().optional(),
1933
+ blocked: z.string().optional(),
1934
+ });
1935
+ export const PublicListSchema = z.object({ url: z.string().optional(), files: z.array(PublicFileSchema) });
1936
+ export const PublishSchema = z.object({ path: z.string().min(1) });
1937
+ export const UnpublishSchema = z.object({ path: z.string().min(1) });
1938
+ export const PublishResultSchema = z.object({ path: z.string(), url: z.string().optional() });
1939
+ export const ShareDetailSchema = z.enum(["messages", "everything"]);
1940
+ export const SharedConversationSchema = z.object({
1941
+ id: z.string(),
1942
+ conversationId: z.string(),
1943
+ title: z.string(),
1944
+ detail: ShareDetailSchema,
1945
+ sharedAt: z.number(),
1946
+ messages: z.number(),
1947
+ url: z.string().optional(),
1948
+ });
1949
+ export const ShareListSchema = z.object({ shares: z.array(SharedConversationSchema) });
1950
+ export const ShareCreateSchema = z.object({
1951
+ conversationId: z.string().min(1),
1952
+ title: z.string().min(1).max(80),
1953
+ detail: ShareDetailSchema,
1954
+ });
1955
+ export const ShareUpdateSchema = z.object({ id: z.string().min(1) });
1956
+ export const ShareRemoveSchema = z.object({ id: z.string().min(1) });
1225
1957
  export const TerminalSessionSchema = z.object({
1226
1958
  name: z.string(),
1227
1959
  label: z.string().optional(),
@@ -1231,9 +1963,20 @@ export const TerminalSessionSchema = z.object({
1231
1963
  exitCode: z.number().optional(),
1232
1964
  extensionId: z.string().optional(),
1233
1965
  processName: z.string().optional(),
1966
+ help: z.object({ requestId: z.string(), message: z.string(), requestedAt: z.number() }).optional(),
1234
1967
  });
1235
1968
  export const TerminalsListSchema = z.object({ sessions: z.array(TerminalSessionSchema) });
1236
1969
  export const TerminalNameParamSchema = z.object({ name: z.string() });
1970
+ export const TerminalScrollbackQuerySchema = z.object({
1971
+ name: z.string(),
1972
+ lines: z.coerce.number().min(1).max(100_000).default(20_000),
1973
+ });
1974
+ export const TerminalScrollbackSchema = z.object({
1975
+ name: z.string(),
1976
+ text: z.string(),
1977
+ lines: z.number(),
1978
+ truncated: z.boolean(),
1979
+ });
1237
1980
  export const BrowserPageSchema = z.object({
1238
1981
  id: z.string(),
1239
1982
  title: z.string().optional(),
@@ -1247,12 +1990,13 @@ export const BrowserSessionSchema = z.object({
1247
1990
  running: z.boolean(),
1248
1991
  activityAt: z.number(),
1249
1992
  finishedAt: z.number().optional(),
1993
+ help: z.object({ requestId: z.string(), message: z.string(), requestedAt: z.number() }).optional(),
1250
1994
  pages: z.array(BrowserPageSchema),
1251
1995
  });
1252
1996
  export const BrowsersListSchema = z.object({ sessions: z.array(BrowserSessionSchema) });
1253
1997
  export const BrowserNameParamSchema = z.object({ name: z.string() });
1254
1998
  export const SubagentKindSchema = z.enum(["subagent", "codex", "grok"]);
1255
- export const SubagentStatusSchema = z.enum(["pending", "running", "completed", "failed", "killed", "paused"]);
1999
+ export const SubagentStatusSchema = z.enum(["pending", "running", "blocked", "completed", "failed", "killed", "paused"]);
1256
2000
  export const SubagentSessionSchema = z.object({
1257
2001
  id: z.string(),
1258
2002
  kind: SubagentKindSchema,
@@ -1284,6 +2028,23 @@ export const EnvironmentSchema = z.object({
1284
2028
  container: z.string().optional(),
1285
2029
  });
1286
2030
  export const EnvironmentApproveSchema = z.object({ hash: z.string().min(1) });
2031
+ const environmentToolSchema = z.object({
2032
+ name: z.string(),
2033
+ version: z.string().optional(),
2034
+ });
2035
+ export const EnvironmentItemSchema = z.object({
2036
+ id: z.string(),
2037
+ name: z.string(),
2038
+ origin: z.enum(["custom", "capability", "base"]),
2039
+ originLabel: z.string().optional(),
2040
+ state: z.enum(["active", "after-rebuild", "awaiting-approval"]),
2041
+ tools: z.array(environmentToolSchema),
2042
+ extras: z.number().optional(),
2043
+ purpose: z.string().optional(),
2044
+ detail: z.string().optional(),
2045
+ commands: z.string().optional(),
2046
+ });
2047
+ export const EnvironmentContentsSchema = z.object({ items: z.array(EnvironmentItemSchema) });
1287
2048
  export const BundleManifestSchema = z.object({
1288
2049
  version: z.literal(1),
1289
2050
  sandbox: z.object({ name: z.string() }).optional(),
@@ -1302,6 +2063,15 @@ export const ImportReportSchema = z.object({
1302
2063
  refused: z.array(z.string()),
1303
2064
  needsAction: z.array(z.object({ subject: z.string(), detail: z.string() })),
1304
2065
  });
2066
+ export const BundleExportSchema = z.object({
2067
+ name: z.string(),
2068
+ status: z.enum(["packing", "ready", "failed"]),
2069
+ bytes: z.number(),
2070
+ createdAt: z.number(),
2071
+ secrets: z.boolean(),
2072
+ error: z.string().optional(),
2073
+ });
2074
+ export const BundleExportsSchema = z.object({ exports: z.array(BundleExportSchema) });
1305
2075
  export const SecretSetSchema = z.object({
1306
2076
  key: z
1307
2077
  .string()
@@ -1321,18 +2091,35 @@ export const SecretInventoryEntrySchema = z.object({
1321
2091
  storedAt: z.string(),
1322
2092
  revealable: z.boolean(),
1323
2093
  ci: z.object({ synced: z.boolean(), pushedAt: z.string().optional() }).optional(),
2094
+ lastUse: z.object({ at: z.number(), lane: z.enum(["shell", "code", "browser"]), detail: z.string().optional() }).optional(),
1324
2095
  });
1325
2096
  export const SecretInventorySchema = z.object({ entries: z.array(SecretInventoryEntrySchema) });
2097
+ export const AdapterHealthSchema = z.object({
2098
+ state: z.enum(["ready", "unavailable", "unknown"]),
2099
+ detail: z.string().optional(),
2100
+ checkedAt: z.number(),
2101
+ });
1326
2102
  export const InfoSchema = z.object({
1327
2103
  name: z.string().optional(),
1328
2104
  image: z.string().optional(),
1329
2105
  version: z.string().optional(),
1330
2106
  latest: z.string().optional(),
1331
2107
  updateAvailable: z.boolean().optional(),
1332
- });
2108
+ runtimes: z.record(z.string(), AdapterHealthSchema).optional(),
2109
+ channel: z.string().optional(),
2110
+ previousImage: z.string().optional(),
2111
+ updateNotes: z.array(z.string()).optional(),
2112
+ moreUpdateNotes: z.number().optional(),
2113
+ breakingNotes: z.array(z.string()).optional(),
2114
+ });
2115
+ export const ManifestProblemSchema = z.object({
2116
+ kind: z.enum(["unreadable", "unknownKey", "invalidEntry"]),
2117
+ detail: z.string(),
2118
+ suggestion: z.string().optional(),
2119
+ });
2120
+ export const ManifestProblemReportSchema = z.object({ path: z.string(), problems: z.array(ManifestProblemSchema) });
2121
+ export const ManifestProblemsSchema = z.array(ManifestProblemReportSchema);
1333
2122
  export const DaemonSessionSchema = z.object({ token: z.string(), expiresAt: z.number(), email: z.string() });
1334
- export const HostTunnelInputSchema = z.object({ hostName: z.string().min(1) });
1335
- export const HostTunnelSchema = z.object({ hostname: z.string(), tunnelToken: z.string() });
1336
2123
  export const ActivityEventSchema = z.object({
1337
2124
  id: z.string(),
1338
2125
  at: z.number(),
@@ -1346,6 +2133,10 @@ export const ActivityEventSchema = z.object({
1346
2133
  method: z.string().optional(),
1347
2134
  endpoint: z.string().optional(),
1348
2135
  sessionId: z.string().optional(),
2136
+ turnId: z.string().optional(),
2137
+ conversationId: z.string().optional(),
2138
+ title: z.string().optional(),
2139
+ origin: AgentOriginSchema.optional(),
1349
2140
  automationIds: z.array(z.string()).optional(),
1350
2141
  outcome: z.enum(["ok", "error"]).optional(),
1351
2142
  error: z.string().optional(),
@@ -1360,7 +2151,7 @@ export const ActivityListSchema = z.object({ events: z.array(ActivityEventSchema
1360
2151
  export const ActivityConnectionSchema = z.object({
1361
2152
  capabilityId: z.string(),
1362
2153
  provider: z.string(),
1363
- gateway: z.enum(["ready", "connecting", "disconnected", "idle"]),
2154
+ gateway: z.enum(["ready", "connecting", "pairing", "disconnected", "idle"]),
1364
2155
  lastError: z.string().optional(),
1365
2156
  });
1366
2157
  export const ActivityStatusSchema = z.object({
@@ -1384,8 +2175,13 @@ export const UsageTurnSchema = z.object({
1384
2175
  durationMs: z.number(),
1385
2176
  terse: z.boolean().optional(),
1386
2177
  iqContext: z.boolean().optional(),
1387
- iqContextNote: z.boolean().optional(),
2178
+ iqContextOutcome: IqContextOutcomeSchema.optional(),
2179
+ iqSearchArm: z.boolean().optional(),
2180
+ iqSearchCohort: z.string().optional(),
2181
+ iqContextDurationMs: z.number().nonnegative().optional(),
1388
2182
  proseChars: z.number().optional(),
2183
+ searchCalls: z.number().optional(),
2184
+ openingSearches: z.number().optional(),
1389
2185
  });
1390
2186
  export const UsageRollupRowSchema = z.object({
1391
2187
  day: z.string(),
@@ -1434,29 +2230,6 @@ export const LogReadSchema = z.object({
1434
2230
  text: z.string(),
1435
2231
  truncated: z.boolean(),
1436
2232
  });
1437
- export const MemoryFileEntrySchema = z.object({
1438
- project: z.string(),
1439
- name: z.string(),
1440
- sizeBytes: z.number(),
1441
- modifiedAt: z.number(),
1442
- });
1443
- export const MemoryListSchema = z.object({ files: z.array(MemoryFileEntrySchema) });
1444
- export const MemoryFileQuerySchema = z.object({
1445
- project: z.string().min(1),
1446
- name: z.string().min(1),
1447
- });
1448
- export const MemoryFileSchema = z.object({
1449
- project: z.string(),
1450
- name: z.string(),
1451
- content: z.string(),
1452
- sizeBytes: z.number(),
1453
- modifiedAt: z.number(),
1454
- });
1455
- export const MemoryWriteSchema = z.object({
1456
- project: z.string().min(1),
1457
- name: z.string().min(1),
1458
- content: z.string().max(1_048_576),
1459
- });
1460
2233
  export const PresenceReportSchema = z.object({
1461
2234
  clientId: z.string(),
1462
2235
  idle: z.boolean(),
@@ -1465,7 +2238,7 @@ export const PresenceReportSchema = z.object({
1465
2238
  path: z.string().optional(),
1466
2239
  });
1467
2240
  export const PushSubscriptionSchema = z.object({
1468
- endpoint: z.string().url(),
2241
+ endpoint: z.url(),
1469
2242
  keys: z.object({
1470
2243
  p256dh: z.string().min(1),
1471
2244
  auth: z.string().min(1),
@@ -1479,10 +2252,10 @@ export const PushNotificationSchema = z.object({
1479
2252
  requireInteraction: z.boolean().optional(),
1480
2253
  });
1481
2254
  export const PushConfigSchema = z.object({ publicKey: z.string(), subscribed: z.boolean() });
1482
- export const PushEndpointSchema = z.object({ endpoint: z.string().url() });
1483
- export const PushConfigQuerySchema = z.object({ endpoint: z.string().url().optional() });
2255
+ export const PushEndpointSchema = z.object({ endpoint: z.url() });
2256
+ export const PushConfigQuerySchema = z.object({ endpoint: z.url().optional() });
1484
2257
  export const PushTestSchema = z.object({ delivered: z.number().int().nonnegative() });
1485
- export const PROBE_IDS = ["outdated", "audit", "knip", "jscpd"];
2258
+ export const PROBE_IDS = ["outdated", "audit", "knip", "jscpd", "ui", "bundle"];
1486
2259
  export const ProbeIdSchema = z.enum(PROBE_IDS);
1487
2260
  export const OutdatedPackageSchema = z.object({
1488
2261
  name: z.string(),
@@ -1511,12 +2284,25 @@ export const DuplicationSchema = z.object({
1511
2284
  clones: z.number().int().nonnegative(),
1512
2285
  top: z.array(z.object({ lines: z.number().int().nonnegative(), first: z.string(), second: z.string() })),
1513
2286
  });
2287
+ export const UiScanSchema = z.object({
2288
+ components: z.array(z.string()),
2289
+ bypasses: z.array(z.object({ path: z.string(), count: z.number().int().positive() })),
2290
+ idioms: z.array(z.object({ id: z.string(), files: z.array(z.string()) })),
2291
+ });
2292
+ export const BundleSchema = z.object({
2293
+ dir: z.string(),
2294
+ totalBytes: z.number().int().nonnegative(),
2295
+ totalGzip: z.number().int().nonnegative(),
2296
+ assets: z.array(z.object({ path: z.string(), bytes: z.number().int().nonnegative(), gzip: z.number().int().nonnegative() })),
2297
+ });
1514
2298
  export const ProbeStateSchema = z.enum(["ok", "unavailable", "failed"]);
1515
2299
  export const ProbeFactsSchema = z.discriminatedUnion("id", [
1516
2300
  z.object({ id: z.literal("outdated"), packages: z.array(OutdatedPackageSchema) }),
1517
2301
  z.object({ id: z.literal("audit"), advisories: z.array(AdvisorySchema) }),
1518
2302
  z.object({ id: z.literal("knip"), deadCode: DeadCodeSchema }),
1519
2303
  z.object({ id: z.literal("jscpd"), duplication: DuplicationSchema }),
2304
+ z.object({ id: z.literal("ui"), scan: UiScanSchema }),
2305
+ z.object({ id: z.literal("bundle"), bundle: BundleSchema }),
1520
2306
  ]);
1521
2307
  export const ProbeResultSchema = z.object({
1522
2308
  id: ProbeIdSchema,
@@ -1540,6 +2326,7 @@ export const ChoreShapeSchema = z.object({
1540
2326
  ci: z.array(z.string()),
1541
2327
  lockfile: z.boolean(),
1542
2328
  packageManifest: z.boolean(),
2329
+ deps: z.array(z.string()),
1543
2330
  });
1544
2331
  export const ChoreSignalsSchema = z.object({
1545
2332
  packages: z.array(ChorePackageSchema),
@@ -1559,11 +2346,25 @@ export const ChoreLedgerEntrySchema = z.object({
1559
2346
  digest: z.string(),
1560
2347
  snoozedUntil: z.number().optional(),
1561
2348
  });
2349
+ export const RunningProbeSchema = z.object({
2350
+ repo: z.string(),
2351
+ id: ProbeIdSchema,
2352
+ askedAt: z.number(),
2353
+ startedAt: z.number().optional(),
2354
+ });
1562
2355
  export const ChoresReportSchema = z.object({
1563
2356
  repos: z.array(z.object({ repo: z.string(), probes: z.array(ProbeResultSchema), signals: ChoreSignalsSchema })),
1564
2357
  ledger: z.array(ChoreLedgerEntrySchema),
2358
+ running: z.array(RunningProbeSchema),
1565
2359
  node: z.string(),
1566
2360
  });
1567
2361
  export const ChoreProbeRequestSchema = z.object({ repo: z.string().min(1), id: ProbeIdSchema });
1568
2362
  export const ChoreLedgerWriteSchema = ChoreLedgerEntrySchema;
2363
+ export const ReadinessCheckSchema = z.object({
2364
+ id: z.string(),
2365
+ label: z.string(),
2366
+ status: z.enum(["pass", "warn", "fail"]),
2367
+ detail: z.string(),
2368
+ });
2369
+ export const ExtensionReadinessSchema = z.object({ checks: z.array(ReadinessCheckSchema) });
1569
2370
  //# sourceMappingURL=schemas.js.map