@wirecat/zoom-cli 0.12.0 → 0.14.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 (220) hide show
  1. package/README.md +5 -5
  2. package/dist/agent-skill.d.ts.map +1 -1
  3. package/dist/agent-skill.js +2 -2
  4. package/dist/agent-skill.js.map +1 -1
  5. package/dist/answer-output.d.ts +23 -0
  6. package/dist/answer-output.d.ts.map +1 -0
  7. package/dist/answer-output.js +52 -0
  8. package/dist/answer-output.js.map +1 -0
  9. package/dist/answer-policy.d.ts +11 -0
  10. package/dist/answer-policy.d.ts.map +1 -0
  11. package/dist/answer-policy.js +8 -0
  12. package/dist/answer-policy.js.map +1 -0
  13. package/dist/answers.d.ts +105 -42
  14. package/dist/answers.d.ts.map +1 -1
  15. package/dist/answers.js +23 -34
  16. package/dist/answers.js.map +1 -1
  17. package/dist/api.d.ts.map +1 -1
  18. package/dist/api.js +20 -19
  19. package/dist/api.js.map +1 -1
  20. package/dist/archive-commands.d.ts +5 -4
  21. package/dist/archive-commands.d.ts.map +1 -1
  22. package/dist/archive-commands.js +32 -31
  23. package/dist/archive-commands.js.map +1 -1
  24. package/dist/archive-import.d.ts +2 -2
  25. package/dist/archive-import.d.ts.map +1 -1
  26. package/dist/archive-import.js +20 -30
  27. package/dist/archive-import.js.map +1 -1
  28. package/dist/archive-transcripts.d.ts.map +1 -1
  29. package/dist/archive-transcripts.js +22 -21
  30. package/dist/archive-transcripts.js.map +1 -1
  31. package/dist/bin/zm.js +1 -2
  32. package/dist/bin/zm.js.map +1 -1
  33. package/dist/command-effects.d.ts +5 -0
  34. package/dist/command-effects.d.ts.map +1 -0
  35. package/dist/command-effects.js +38 -0
  36. package/dist/command-effects.js.map +1 -0
  37. package/dist/commands.d.ts +2 -1
  38. package/dist/commands.d.ts.map +1 -1
  39. package/dist/commands.js +21 -18
  40. package/dist/commands.js.map +1 -1
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +54 -37
  43. package/dist/config.js.map +1 -1
  44. package/dist/errors.d.ts +0 -4
  45. package/dist/errors.d.ts.map +1 -1
  46. package/dist/errors.js +2 -7
  47. package/dist/errors.js.map +1 -1
  48. package/dist/execution.d.ts +1 -0
  49. package/dist/execution.d.ts.map +1 -1
  50. package/dist/execution.js +4 -4
  51. package/dist/execution.js.map +1 -1
  52. package/dist/files.d.ts.map +1 -1
  53. package/dist/files.js +9 -9
  54. package/dist/files.js.map +1 -1
  55. package/dist/index.d.ts +2 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +2 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/ingestion-search-commands.d.ts +3 -2
  60. package/dist/ingestion-search-commands.d.ts.map +1 -1
  61. package/dist/ingestion-search-commands.js +9 -8
  62. package/dist/ingestion-search-commands.js.map +1 -1
  63. package/dist/json-fields.d.ts +7 -0
  64. package/dist/json-fields.d.ts.map +1 -0
  65. package/dist/json-fields.js +23 -0
  66. package/dist/json-fields.js.map +1 -0
  67. package/dist/keys.d.ts +1 -1
  68. package/dist/keys.d.ts.map +1 -1
  69. package/dist/keys.js +7 -5
  70. package/dist/keys.js.map +1 -1
  71. package/dist/local-transcription-commands.d.ts +3 -2
  72. package/dist/local-transcription-commands.d.ts.map +1 -1
  73. package/dist/local-transcription-commands.js +7 -7
  74. package/dist/local-transcription-commands.js.map +1 -1
  75. package/dist/local-transcription.d.ts.map +1 -1
  76. package/dist/local-transcription.js +13 -12
  77. package/dist/local-transcription.js.map +1 -1
  78. package/dist/login.d.ts.map +1 -1
  79. package/dist/login.js +8 -7
  80. package/dist/login.js.map +1 -1
  81. package/dist/mcp-server.d.ts +4 -0
  82. package/dist/mcp-server.d.ts.map +1 -1
  83. package/dist/mcp-server.js +40 -48
  84. package/dist/mcp-server.js.map +1 -1
  85. package/dist/meeting-context-commands.d.ts +2 -1
  86. package/dist/meeting-context-commands.d.ts.map +1 -1
  87. package/dist/meeting-context-commands.js +11 -15
  88. package/dist/meeting-context-commands.js.map +1 -1
  89. package/dist/meeting-context.d.ts +6 -6
  90. package/dist/meeting-context.d.ts.map +1 -1
  91. package/dist/meeting-context.js +8 -21
  92. package/dist/meeting-context.js.map +1 -1
  93. package/dist/meeting-integration-commands.d.ts +3 -2
  94. package/dist/meeting-integration-commands.d.ts.map +1 -1
  95. package/dist/meeting-integration-commands.js +7 -7
  96. package/dist/meeting-integration-commands.js.map +1 -1
  97. package/dist/meeting-integration.d.ts.map +1 -1
  98. package/dist/meeting-integration.js +2 -2
  99. package/dist/meeting-integration.js.map +1 -1
  100. package/dist/meeting-mcp-command.d.ts +19 -0
  101. package/dist/meeting-mcp-command.d.ts.map +1 -0
  102. package/dist/meeting-mcp-command.js +41 -0
  103. package/dist/meeting-mcp-command.js.map +1 -0
  104. package/dist/meeting-preparation-mcp.d.ts +131 -0
  105. package/dist/meeting-preparation-mcp.d.ts.map +1 -0
  106. package/dist/meeting-preparation-mcp.js +20 -0
  107. package/dist/meeting-preparation-mcp.js.map +1 -0
  108. package/dist/meeting-preparation.d.ts +22 -0
  109. package/dist/meeting-preparation.d.ts.map +1 -0
  110. package/dist/meeting-preparation.js +29 -0
  111. package/dist/meeting-preparation.js.map +1 -0
  112. package/dist/meeting-project-evidence-commands.d.ts +1 -4
  113. package/dist/meeting-project-evidence-commands.d.ts.map +1 -1
  114. package/dist/meeting-project-evidence-commands.js +2 -6
  115. package/dist/meeting-project-evidence-commands.js.map +1 -1
  116. package/dist/meeting-project-evidence-mcp.d.ts +76 -83
  117. package/dist/meeting-project-evidence-mcp.d.ts.map +1 -1
  118. package/dist/meeting-project-evidence-mcp.js +7 -8
  119. package/dist/meeting-project-evidence-mcp.js.map +1 -1
  120. package/dist/meeting-read-command-bindings.d.ts +10 -0
  121. package/dist/meeting-read-command-bindings.d.ts.map +1 -0
  122. package/dist/meeting-read-command-bindings.js +13 -0
  123. package/dist/meeting-read-command-bindings.js.map +1 -0
  124. package/dist/meeting-search-commands.d.ts +3 -2
  125. package/dist/meeting-search-commands.d.ts.map +1 -1
  126. package/dist/meeting-search-commands.js +47 -38
  127. package/dist/meeting-search-commands.js.map +1 -1
  128. package/dist/meeting-semantic-commands.d.ts +3 -2
  129. package/dist/meeting-semantic-commands.d.ts.map +1 -1
  130. package/dist/meeting-semantic-commands.js +13 -12
  131. package/dist/meeting-semantic-commands.js.map +1 -1
  132. package/dist/meeting-semantic.d.ts.map +1 -1
  133. package/dist/meeting-semantic.js +3 -2
  134. package/dist/meeting-semantic.js.map +1 -1
  135. package/dist/occurrence-schedule.d.ts +3 -0
  136. package/dist/occurrence-schedule.d.ts.map +1 -0
  137. package/dist/occurrence-schedule.js +106 -0
  138. package/dist/occurrence-schedule.js.map +1 -0
  139. package/dist/output-file.js +3 -3
  140. package/dist/output-file.js.map +1 -1
  141. package/dist/program.d.ts +15 -28
  142. package/dist/program.d.ts.map +1 -1
  143. package/dist/program.js +163 -333
  144. package/dist/program.js.map +1 -1
  145. package/dist/recording-archive.d.ts +1 -1
  146. package/dist/recording-archive.d.ts.map +1 -1
  147. package/dist/recording-archive.js +99 -46
  148. package/dist/recording-archive.js.map +1 -1
  149. package/dist/recording-partial-store.d.ts.map +1 -1
  150. package/dist/recording-partial-store.js +11 -10
  151. package/dist/recording-partial-store.js.map +1 -1
  152. package/dist/recording-promotion-store.d.ts.map +1 -1
  153. package/dist/recording-promotion-store.js +4 -4
  154. package/dist/recording-promotion-store.js.map +1 -1
  155. package/dist/recording-schedule-commands.d.ts +3 -2
  156. package/dist/recording-schedule-commands.d.ts.map +1 -1
  157. package/dist/recording-schedule-commands.js +13 -12
  158. package/dist/recording-schedule-commands.js.map +1 -1
  159. package/dist/recording-schedule-store.d.ts.map +1 -1
  160. package/dist/recording-schedule-store.js +15 -14
  161. package/dist/recording-schedule-store.js.map +1 -1
  162. package/dist/recording-schedule-systemd.d.ts.map +1 -1
  163. package/dist/recording-schedule-systemd.js +16 -15
  164. package/dist/recording-schedule-systemd.js.map +1 -1
  165. package/dist/recording-schedule.d.ts +1 -1
  166. package/dist/recording-schedule.d.ts.map +1 -1
  167. package/dist/recording-schedule.js +15 -14
  168. package/dist/recording-schedule.js.map +1 -1
  169. package/dist/recording-sync-store.d.ts.map +1 -1
  170. package/dist/recording-sync-store.js +9 -9
  171. package/dist/recording-sync-store.js.map +1 -1
  172. package/dist/recording-sync.d.ts +1 -1
  173. package/dist/recording-sync.d.ts.map +1 -1
  174. package/dist/recording-sync.js +10 -19
  175. package/dist/recording-sync.js.map +1 -1
  176. package/dist/recordings.d.ts.map +1 -1
  177. package/dist/recordings.js +19 -18
  178. package/dist/recordings.js.map +1 -1
  179. package/dist/remote-http.d.ts +1 -0
  180. package/dist/remote-http.d.ts.map +1 -1
  181. package/dist/remote-http.js +26 -14
  182. package/dist/remote-http.js.map +1 -1
  183. package/dist/remote-meeting-id.d.ts +2 -0
  184. package/dist/remote-meeting-id.d.ts.map +1 -0
  185. package/dist/remote-meeting-id.js +7 -0
  186. package/dist/remote-meeting-id.js.map +1 -0
  187. package/dist/remote-meetings.d.ts.map +1 -1
  188. package/dist/remote-meetings.js +10 -13
  189. package/dist/remote-meetings.js.map +1 -1
  190. package/dist/store-connection.d.ts +1 -7
  191. package/dist/store-connection.d.ts.map +1 -1
  192. package/dist/store-connection.js +95 -176
  193. package/dist/store-connection.js.map +1 -1
  194. package/dist/streaming.js +3 -3
  195. package/dist/streaming.js.map +1 -1
  196. package/dist/tokens.d.ts.map +1 -1
  197. package/dist/tokens.js +10 -9
  198. package/dist/tokens.js.map +1 -1
  199. package/dist/unified-search.d.ts +1 -0
  200. package/dist/unified-search.d.ts.map +1 -1
  201. package/dist/unified-search.js +18 -3
  202. package/dist/unified-search.js.map +1 -1
  203. package/dist/upcoming-meetings.d.ts +10 -0
  204. package/dist/upcoming-meetings.d.ts.map +1 -0
  205. package/dist/upcoming-meetings.js +24 -0
  206. package/dist/upcoming-meetings.js.map +1 -0
  207. package/dist/watch-commands.d.ts +2 -1
  208. package/dist/watch-commands.d.ts.map +1 -1
  209. package/dist/watch-commands.js +9 -9
  210. package/dist/watch-commands.js.map +1 -1
  211. package/package.json +5 -4
  212. package/skills/zoom-cli/SKILL.md +32 -12
  213. package/dist/ordinary-file.d.ts +0 -3
  214. package/dist/ordinary-file.d.ts.map +0 -1
  215. package/dist/ordinary-file.js +0 -16
  216. package/dist/ordinary-file.js.map +0 -1
  217. package/dist/wav-audio.d.ts +0 -2
  218. package/dist/wav-audio.d.ts.map +0 -1
  219. package/dist/wav-audio.js +0 -2
  220. package/dist/wav-audio.js.map +0 -1
package/README.md CHANGED
@@ -46,7 +46,7 @@ walks through app settings, browser approval and callback completion.
46
46
 
47
47
  ```sh
48
48
  npm install -g @wirecat/zoom-cli
49
- zm config set zoom.clientId <public-client-id>
49
+ zm config set zoom.client_id <public-client-id>
50
50
  zm session start # approve in your browser; the token goes to the keyring
51
51
  zm config set account.profile personal # a label for your stored meetings
52
52
  zm meetings sync --lookback-days 7
@@ -207,7 +207,7 @@ More: [the local archive][docs/archive.md] · [Zoom on wirecat.dev][wirecat/en/d
207
207
  ```sh
208
208
  zm recordings sync --since-time 2026-01-01 --until-time 2026-10-10 --destination ./zoom-archive --jsonl
209
209
  zm recordings archive check ./zoom-archive --offline --json
210
- zm search meetings "example plan" --archive ./zoom-archive --offline --json
210
+ zm search recordings ./zoom-archive "example plan" --offline --json
211
211
  ```
212
212
 
213
213
  Sync covers up to ten years in monthly requests and downloads serially, streaming to disk. Each
@@ -284,8 +284,8 @@ More: [managing Zoom meetings][docs/remote-meetings.md] · [Zoom on wirecat.dev]
284
284
 
285
285
  ## Output, limits and deadlines
286
286
 
287
- `--json` prints one value and `--jsonl` one item per line; piped output defaults to JSON and errors
288
- go to stderr. `--fields id,title` trims results, `--offline` refuses the network, and output is
287
+ `--json` prints one answer envelope; `--jsonl` prints typed item records and a final end record; piped output defaults to JSON and errors
288
+ go to stderr. `--json=id,title` keeps only those fields, `--offline` refuses the network, and output is
289
289
  capped at 4 MiB unless `--max-output-bytes` says otherwise. Default deadlines are 30 seconds for
290
290
  reads, five minutes for login and one hour for downloads, sync and verification; `--timeout 5m`
291
291
  changes them. Watching and MCP serving run until stopped.
@@ -296,7 +296,7 @@ More: [usage][docs/usage.md] · [Zoom on wirecat.dev][wirecat/en/docs/zoom]
296
296
 
297
297
  | Setting | Meaning |
298
298
  |---|---|
299
- | `zoom.clientId` | your Zoom app's Public Client ID |
299
+ | `zoom.client_id` | your Zoom app's Public Client ID |
300
300
  | `account.profile` | the local profile label |
301
301
  | `source` | `api` or `files` for `meetings sync` and `watch` |
302
302
  | `files.folder`, `files.timezone` | the transcript folder and the zone of its filenames |
@@ -1 +1 @@
1
- {"version":3,"file":"agent-skill.d.ts","sourceRoot":"","sources":["../src/agent-skill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gBAAgB,EAAgB,MAAM,yBAAyB,CAAA;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,eAAO,MAAM,oBAAoB,YACtB,OAAO,eACH,gBAAgB,gCAE5B,IAWF,CAAA"}
1
+ {"version":3,"file":"agent-skill.d.ts","sourceRoot":"","sources":["../src/agent-skill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gBAAgB,EAAgB,MAAM,yBAAyB,CAAA;AAE7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,eAAO,MAAM,oBAAoB,YACtB,OAAO,eACH,gBAAgB,gCAE5B,IAUF,CAAA"}
@@ -1,13 +1,13 @@
1
1
  import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { skillCommand } from "@wirecat/cli-base/skill";
3
+ import { LOCAL_READ, LOCAL_WRITE } from "@wirecat/cli-core/cli";
3
4
  import { VERSION } from "./version.js";
4
5
  export const addZoomSkillCommands = (program, environment, skill = new URL("../skills/zoom-cli/SKILL.md", import.meta.url)) => {
5
6
  const command = skillCommand({ command: "zm", appName: "zoom-cli", version: VERSION }, skill, environment);
6
7
  for (const child of command.commands) {
7
8
  const install = child.name() === "install";
8
9
  annotate(child, {
9
- mutates: install,
10
- ...(install ? { local: true } : {}),
10
+ effects: install ? LOCAL_WRITE : LOCAL_READ,
11
11
  examples: [install ? "zm skill install --for agents --json" : "zm skill show --json"],
12
12
  });
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-skill.js","sourceRoot":"","sources":["../src/agent-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAyB,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAgB,EAChB,WAA6B,EAC7B,KAAK,GAAG,IAAI,GAAG,CAAC,6BAA6B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EACzD,EAAE;IACR,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAA;IAC1G,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,CAAA;QAC1C,QAAQ,CAAC,KAAK,EAAE;YACd,OAAO,EAAE,OAAO;YAChB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,sBAAsB,CAAC;SACtF,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC,CAAA"}
1
+ {"version":3,"file":"agent-skill.js","sourceRoot":"","sources":["../src/agent-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAyB,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAgB,EAChB,WAA6B,EAC7B,KAAK,GAAG,IAAI,GAAG,CAAC,6BAA6B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EACzD,EAAE;IACR,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAA;IAC1G,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,CAAA;QAC1C,QAAQ,CAAC,KAAK,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU;YAC3C,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,sBAAsB,CAAC;SACtF,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC,CAAA"}
@@ -0,0 +1,23 @@
1
+ import type { Meta } from "@wirecat/cli-base/standards";
2
+ import { type Body } from "@wirecat/cli-core/cli";
3
+ import type { Command } from "commander";
4
+ export type AnswerFormat = "json" | "jsonl" | "pretty";
5
+ /**
6
+ * cli-core's meeting commands and MCP tools return envelopes as plain objects, `listed()` lists or bare reports,
7
+ * not `itemOf`/`listOf` bodies; zoom's own commands build bodies and never come through here.
8
+ */
9
+ export declare const bodyOf: (value: unknown) => Body;
10
+ /** The answer as text, and the exit code a partial answer earns. */
11
+ export declare const renderBody: (command: Command, body: Body, options: {
12
+ format: AnswerFormat;
13
+ meta: Meta;
14
+ fields?: readonly string[];
15
+ quiet?: boolean;
16
+ diagnostic: (text: string) => void;
17
+ }) => {
18
+ text: string;
19
+ exitCode: number;
20
+ };
21
+ /** Every row the command read, in one page. */
22
+ export declare const wholeList: <T>(command: string, items: T[]) => import("@wirecat/cli-core/cli").ListBody<T>;
23
+ //# sourceMappingURL=answer-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-output.d.ts","sourceRoot":"","sources":["../src/answer-output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAE,KAAK,IAAI,EAAoD,MAAM,uBAAuB,CAAA;AACnG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAMtD;;;GAGG;AACH,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,IAYvC,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,UAAU,YACZ,OAAO,QACV,IAAI,WACD;IACP,MAAM,EAAE,YAAY,CAAA;IACpB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,KACA;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAuBlC,CAAA;AAED,+CAA+C;AAC/C,eAAO,MAAM,SAAS,GAAI,CAAC,WAAW,MAAM,SAAS,CAAC,EAAE,gDACuB,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { createRenderer, exitCodeOfAnswer, projectFields } from "@wirecat/cli-base";
2
+ import { metaOf } from "@wirecat/cli-base/commands";
3
+ import { itemOf, listOf, metaNow, renderAnswer, snakeKeys } from "@wirecat/cli-core/cli";
4
+ const record = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
5
+ const only = (value, keys) => Object.keys(value).every((key) => keys.includes(key));
6
+ /**
7
+ * cli-core's meeting commands and MCP tools return envelopes as plain objects, `listed()` lists or bare reports,
8
+ * not `itemOf`/`listOf` bodies; zoom's own commands build bodies and never come through here.
9
+ */
10
+ export const bodyOf = (value) => {
11
+ const data = snakeKeys(value);
12
+ if (record(data) && only(data, ["item", "items", "page", "next", "missing", "meta"])) {
13
+ if ("item" in data || (Array.isArray(data.items) && record(data.page)))
14
+ return data;
15
+ }
16
+ if (record(data) && Array.isArray(data.items) && only(data, ["items", "page", "limit", "has_more"]))
17
+ return listOf("list", {
18
+ items: data.items,
19
+ limit: Math.max(1, data.items.length),
20
+ has_more: data.has_more === true,
21
+ });
22
+ return itemOf(data);
23
+ };
24
+ /** The answer as text, and the exit code a partial answer earns. */
25
+ export const renderBody = (command, body, options) => {
26
+ const data = snakeKeys(body);
27
+ const fields = options.fields;
28
+ const projected = !fields
29
+ ? data
30
+ : "items" in data
31
+ ? { ...data, items: projectFields(data.items, fields) }
32
+ : { ...data, item: projectFields(data.item, fields) };
33
+ const meta = metaNow({ ...projected.meta, run_id: options.meta.run_id, duration_ms: options.meta.duration_ms });
34
+ const chunks = [];
35
+ const streams = {
36
+ data: (text) => chunks.push(`${text}\n`),
37
+ diagnostic: (text) => options.diagnostic(`${text}\n`),
38
+ };
39
+ const renderer = createRenderer({ format: options.format, color: false, quiet: options.quiet, streams });
40
+ // renderAnswer reports a partial answer through process.exitCode; zoom returns that code from `run` instead.
41
+ const exitCode = process.exitCode;
42
+ try {
43
+ renderAnswer(command, { renderer, format: options.format, streams }, { ...projected, meta });
44
+ }
45
+ finally {
46
+ process.exitCode = exitCode;
47
+ }
48
+ return { text: chunks.join(""), exitCode: exitCodeOfAnswer(meta, metaOf(command).partial === true) };
49
+ };
50
+ /** Every row the command read, in one page. */
51
+ export const wholeList = (command, items) => listOf(command, { items, limit: Math.max(1, items.length), has_more: false });
52
+ //# sourceMappingURL=answer-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-output.js","sourceRoot":"","sources":["../src/answer-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Effects } from "@wirecat/cli-base/standards";
2
+ import type { Command } from "commander";
3
+ export declare const hostFailureContext: (registry?: Command, effects?: Effects) => {
4
+ reasons?: readonly import("@wirecat/cli-base/standards").ErrorReason[];
5
+ details?: readonly string[];
6
+ steps?: readonly import("@wirecat/cli-base/standards").StepDefinition[];
7
+ runId?: string;
8
+ effects?: Effects;
9
+ targets?: import("@wirecat/cli-base/standards").StepInput["targets"];
10
+ };
11
+ //# sourceMappingURL=answer-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-policy.d.ts","sourceRoot":"","sources":["../src/answer-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,eAAO,MAAM,kBAAkB,cAAe,OAAO,YAAY,OAAO;;;;;;;CAItE,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { failureContext } from "@wirecat/cli-core";
2
+ import { judgedEffects, judgedTargets } from "@wirecat/cli-core/cli";
3
+ export const hostFailureContext = (registry, effects) => ({
4
+ ...failureContext(),
5
+ ...(effects ? { effects: judgedEffects(effects) } : {}),
6
+ ...(registry ? { targets: judgedTargets(registry) } : {}),
7
+ });
8
+ //# sourceMappingURL=answer-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-policy.js","sourceRoot":"","sources":["../src/answer-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAkB,EAAE,OAAiB,EAAE,EAAE,CAAC,CAAC;IAC5E,GAAG,cAAc,EAAE;IACnB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAC1D,CAAC,CAAA"}
package/dist/answers.d.ts CHANGED
@@ -1,127 +1,190 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
2
  import { type Meta } from "@wirecat/cli-base/standards";
3
+ import type { Command } from "commander";
3
4
  import * as v from "valibot";
4
5
  export declare const answerSchema: v.UnionSchema<[v.StrictObjectSchema<{
5
- readonly item: v.UnknownSchema;
6
- readonly next: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.StrictObjectSchema<{
6
+ readonly items: v.ArraySchema<v.GenericSchema, undefined>;
7
+ readonly page: v.VariantSchema<"mode", [v.StrictObjectSchema<{
8
+ readonly mode: v.LiteralSchema<"page", undefined>;
9
+ readonly limit: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
10
+ readonly has_more: v.BooleanSchema<undefined>;
11
+ readonly next_page: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 2, undefined>]>, undefined>;
12
+ }, undefined>, v.StrictObjectSchema<{
13
+ readonly mode: v.LiteralSchema<"cursor", undefined>;
14
+ readonly limit: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
15
+ readonly has_more: v.BooleanSchema<undefined>;
16
+ readonly next_cursor: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, undefined>;
17
+ }, undefined>], undefined>;
18
+ readonly next: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.VariantSchema<"kind", [v.StrictObjectSchema<{
19
+ readonly kind: v.LiteralSchema<"command", undefined>;
7
20
  readonly step: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
8
21
  readonly command: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
9
22
  readonly args: v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>;
10
23
  readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
11
- }, undefined>, undefined>, v.MaxLengthAction<{
24
+ readonly safe_to_auto_execute: v.BooleanSchema<undefined>;
25
+ }, undefined>, v.StrictObjectSchema<{
26
+ readonly kind: v.LiteralSchema<"user_action", undefined>;
27
+ readonly step: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
28
+ readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
29
+ readonly safe_to_auto_execute: v.LiteralSchema<false, undefined>;
30
+ }, undefined>], undefined>, undefined>, v.MaxLengthAction<({
31
+ kind: "command";
12
32
  step: string;
13
33
  command: string;
14
34
  args: {
15
35
  [x: string]: unknown;
16
36
  };
17
37
  why: string;
18
- }[], 3, undefined>]>, undefined>;
38
+ safe_to_auto_execute: boolean;
39
+ } | {
40
+ kind: "user_action";
41
+ step: string;
42
+ why: string;
43
+ safe_to_auto_execute: false;
44
+ })[], 2, undefined>]>, undefined>;
19
45
  readonly missing: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
20
46
  readonly field: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
21
47
  readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
22
- readonly step: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
48
+ readonly step: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>, undefined>;
23
49
  }, undefined>, undefined>, undefined>;
24
50
  readonly meta: v.StrictObjectSchema<{
25
51
  readonly run_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
26
52
  readonly duration_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
27
53
  readonly accounts: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, undefined>, undefined>;
28
- readonly skipped: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
29
- readonly account: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
30
- readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
54
+ readonly complete: v.BooleanSchema<undefined>;
55
+ readonly issues: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
56
+ readonly code: v.PicklistSchema<readonly ["validation_error", "configuration_error", "authentication_error", "permission_error", "not_found", "confirmation_required", "rate_limited", "timeout", "network_error", "provider_error", "provider_unavailable", "invalid_response", "outcome_unknown", "cancelled"], undefined>;
57
+ readonly reason: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>, undefined>;
58
+ readonly source: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
31
59
  }, undefined>, undefined>, undefined>;
32
60
  readonly truncated: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
33
61
  }, undefined>;
34
62
  }, undefined>, v.StrictObjectSchema<{
35
- readonly items: v.ArraySchema<v.UnknownSchema, undefined>;
36
- readonly page: v.StrictObjectSchema<{
37
- readonly limit: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
38
- readonly has_more: v.BooleanSchema<undefined>;
39
- readonly cursor: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, undefined>;
40
- }, undefined>;
41
- readonly next: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.StrictObjectSchema<{
63
+ readonly item: v.GenericSchema;
64
+ readonly next: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.VariantSchema<"kind", [v.StrictObjectSchema<{
65
+ readonly kind: v.LiteralSchema<"command", undefined>;
42
66
  readonly step: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
43
67
  readonly command: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
44
68
  readonly args: v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>;
45
69
  readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
46
- }, undefined>, undefined>, v.MaxLengthAction<{
70
+ readonly safe_to_auto_execute: v.BooleanSchema<undefined>;
71
+ }, undefined>, v.StrictObjectSchema<{
72
+ readonly kind: v.LiteralSchema<"user_action", undefined>;
73
+ readonly step: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
74
+ readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
75
+ readonly safe_to_auto_execute: v.LiteralSchema<false, undefined>;
76
+ }, undefined>], undefined>, undefined>, v.MaxLengthAction<({
77
+ kind: "command";
47
78
  step: string;
48
79
  command: string;
49
80
  args: {
50
81
  [x: string]: unknown;
51
82
  };
52
83
  why: string;
53
- }[], 3, undefined>]>, undefined>;
84
+ safe_to_auto_execute: boolean;
85
+ } | {
86
+ kind: "user_action";
87
+ step: string;
88
+ why: string;
89
+ safe_to_auto_execute: false;
90
+ })[], 2, undefined>]>, undefined>;
54
91
  readonly missing: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
55
92
  readonly field: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
56
93
  readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
57
- readonly step: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
94
+ readonly step: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>, undefined>;
58
95
  }, undefined>, undefined>, undefined>;
59
96
  readonly meta: v.StrictObjectSchema<{
60
97
  readonly run_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
61
98
  readonly duration_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
62
99
  readonly accounts: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, undefined>, undefined>;
63
- readonly skipped: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
64
- readonly account: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
65
- readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
100
+ readonly complete: v.BooleanSchema<undefined>;
101
+ readonly issues: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
102
+ readonly code: v.PicklistSchema<readonly ["validation_error", "configuration_error", "authentication_error", "permission_error", "not_found", "confirmation_required", "rate_limited", "timeout", "network_error", "provider_error", "provider_unavailable", "invalid_response", "outcome_unknown", "cancelled"], undefined>;
103
+ readonly reason: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>, undefined>;
104
+ readonly source: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
66
105
  }, undefined>, undefined>, undefined>;
67
106
  readonly truncated: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
68
107
  }, undefined>;
69
108
  }, undefined>], undefined>;
70
109
  export declare const toolAnswerSchema: NonNullable<Tool["outputSchema"]>;
71
110
  export declare const readMetadata: (now?: () => number) => (() => Meta);
72
- /** Seal standard bodies; keep report-specific coverage and cursors together inside one item. */
73
- export declare const meetingAnswer: (value: unknown, meta: Meta) => {
74
- item: unknown;
75
- next?: {
111
+ /** An MCP tool's result as a validated envelope with the host's run metadata and only runnable next steps. */
112
+ export declare const toolAnswer: (value: unknown, meta: Meta, registry?: Command) => {
113
+ items: unknown[];
114
+ page: {
115
+ mode: "page";
116
+ limit: number;
117
+ has_more: boolean;
118
+ next_page?: number | undefined;
119
+ } | {
120
+ mode: "cursor";
121
+ limit: number;
122
+ has_more: boolean;
123
+ next_cursor?: string | undefined;
124
+ };
125
+ next?: ({
126
+ kind: "command";
76
127
  step: string;
77
128
  command: string;
78
129
  args: {
79
130
  [x: string]: unknown;
80
131
  };
81
132
  why: string;
82
- }[] | undefined;
133
+ safe_to_auto_execute: boolean;
134
+ } | {
135
+ kind: "user_action";
136
+ step: string;
137
+ why: string;
138
+ safe_to_auto_execute: false;
139
+ })[] | undefined;
83
140
  missing?: {
84
141
  field: string;
85
142
  why: string;
86
- step: string;
143
+ step?: string | undefined;
87
144
  }[] | undefined;
88
145
  meta: {
89
146
  run_id: string;
90
147
  duration_ms: number;
91
148
  accounts?: string[] | undefined;
92
- skipped?: {
93
- account: string;
94
- why: string;
149
+ complete: boolean;
150
+ issues?: {
151
+ code: "authentication_error" | "cancelled" | "configuration_error" | "confirmation_required" | "invalid_response" | "network_error" | "not_found" | "outcome_unknown" | "permission_error" | "provider_error" | "provider_unavailable" | "rate_limited" | "timeout" | "validation_error";
152
+ reason?: string | undefined;
153
+ source: string;
95
154
  }[] | undefined;
96
155
  truncated?: boolean | undefined;
97
156
  };
98
157
  } | {
99
- items: unknown[];
100
- page: {
101
- limit: number;
102
- has_more: boolean;
103
- cursor?: string | undefined;
104
- };
105
- next?: {
158
+ item: unknown;
159
+ next?: ({
160
+ kind: "command";
106
161
  step: string;
107
162
  command: string;
108
163
  args: {
109
164
  [x: string]: unknown;
110
165
  };
111
166
  why: string;
112
- }[] | undefined;
167
+ safe_to_auto_execute: boolean;
168
+ } | {
169
+ kind: "user_action";
170
+ step: string;
171
+ why: string;
172
+ safe_to_auto_execute: false;
173
+ })[] | undefined;
113
174
  missing?: {
114
175
  field: string;
115
176
  why: string;
116
- step: string;
177
+ step?: string | undefined;
117
178
  }[] | undefined;
118
179
  meta: {
119
180
  run_id: string;
120
181
  duration_ms: number;
121
182
  accounts?: string[] | undefined;
122
- skipped?: {
123
- account: string;
124
- why: string;
183
+ complete: boolean;
184
+ issues?: {
185
+ code: "authentication_error" | "cancelled" | "configuration_error" | "confirmation_required" | "invalid_response" | "network_error" | "not_found" | "outcome_unknown" | "permission_error" | "provider_error" | "provider_unavailable" | "rate_limited" | "timeout" | "validation_error";
186
+ reason?: string | undefined;
187
+ source: string;
125
188
  }[] | undefined;
126
189
  truncated?: boolean | undefined;
127
190
  };
@@ -1 +1 @@
1
- {"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../src/answers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAA;AAC9D,OAAO,EAKL,KAAK,IAAI,EACV,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAA8E,CAAA;AAEvG,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAuC,CAAA;AAEtG,eAAO,MAAM,YAAY,SAAS,MAAM,MAAM,KAAc,CAAC,MAAM,IAAI,CAItE,CAAA;AAED,gGAAgG;AAChG,eAAO,MAAM,aAAa,UAAW,OAAO,QAAQ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BvD,CAAA"}
1
+ {"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../src/answers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAA;AAE9D,OAAO,EAAmC,KAAK,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAExF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAG5B,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAAuB,CAAA;AAEhD,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAuC,CAAA;AAEtG,eAAO,MAAM,YAAY,SAAS,MAAM,MAAM,KAAc,CAAC,MAAM,IAAI,CAItE,CAAA;AAED,8GAA8G;AAC9G,eAAO,MAAM,UAAU,UAAW,OAAO,QAAQ,IAAI,aAAa,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAexE,CAAA"}
package/dist/answers.js CHANGED
@@ -1,47 +1,36 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { errorObjectSchema, itemEnvelopeSchema, jsonSchemaOf, listEnvelopeSchema, } from "@wirecat/cli-base/standards";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { errorObjectSchema, jsonSchemaOf } from "@wirecat/cli-base/standards";
4
+ import { metaNow, runnable, answerSchema as sharedAnswerSchema } from "@wirecat/cli-core/cli";
3
5
  import * as v from "valibot";
4
- import { ZoomError } from "./errors.js";
5
- import { snakeKeys } from "./keys.js";
6
- export const answerSchema = v.union([itemEnvelopeSchema(v.unknown()), listEnvelopeSchema(v.unknown())]);
6
+ import { bodyOf } from "./answer-output.js";
7
+ export const answerSchema = sharedAnswerSchema();
7
8
  const outputSchema = { ...jsonSchemaOf(v.union([answerSchema, errorObjectSchema])) };
8
9
  export const toolAnswerSchema = { ...outputSchema, type: "object" };
9
10
  export const readMetadata = (now = Date.now) => {
10
11
  const started = now();
11
12
  const runId = randomUUID();
12
- return () => ({ run_id: runId, duration_ms: Math.max(0, Math.round(now() - started)) });
13
+ return () => metaNow({ run_id: runId, duration_ms: Math.max(0, Math.round(now() - started)) });
13
14
  };
14
- /** Seal standard bodies; keep report-specific coverage and cursors together inside one item. */
15
- export const meetingAnswer = (value, meta) => {
15
+ /** An MCP tool's result as a validated envelope with the host's run metadata and only runnable next steps. */
16
+ export const toolAnswer = (value, meta, registry) => {
16
17
  if (value === undefined)
17
- throw new ZoomError("invalid_response", "command returned no answer");
18
- const data = snakeKeys(value);
19
- let body;
20
- if (Array.isArray(data))
21
- body = { items: data, page: { limit: Math.max(1, data.length), has_more: false }, meta };
22
- else if (data && typeof data === "object") {
23
- const record = data;
24
- if (Object.keys(record).every((key) => ["item", "items", "page", "next", "missing", "meta"].includes(key)) &&
25
- ("item" in record || (Array.isArray(record.items) && record.page && typeof record.page === "object")))
26
- body = { ...record, meta };
27
- else if (Array.isArray(record.items) &&
28
- Object.keys(record).every((key) => ["items", "page", "limit", "has_more"].includes(key)))
29
- body = {
30
- items: record.items,
31
- page: {
32
- limit: Math.max(1, typeof record.limit === "number" ? record.limit : record.items.length),
33
- has_more: record.has_more === true,
34
- },
35
- meta,
36
- };
18
+ throw new CliError("invalid_response", "command returned no answer");
19
+ const body = bodyOf(value);
20
+ const answer = v.safeParse(answerSchema, {
21
+ ...body,
22
+ meta: metaNow({ ...body.meta, run_id: meta.run_id, duration_ms: meta.duration_ms }),
23
+ });
24
+ if (!answer.success)
25
+ throw new CliError("invalid_response", "command returned an invalid answer envelope");
26
+ const packet = answer.output;
27
+ if (registry && packet.next) {
28
+ const next = runnable(registry, packet.next);
29
+ if (next.length)
30
+ packet.next = next;
37
31
  else
38
- body = { item: data, meta };
32
+ delete packet.next;
39
33
  }
40
- else
41
- body = { item: data, meta };
42
- const answer = v.safeParse(answerSchema, body);
43
- if (!answer.success)
44
- throw new ZoomError("invalid_response", "command returned an invalid answer envelope");
45
- return answer.output;
34
+ return packet;
46
35
  };
47
36
  //# sourceMappingURL=answers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"answers.js","sourceRoot":"","sources":["../src/answers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"answers.js","sourceRoot":"","sources":["../src/answers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAa,MAAM,6BAA6B,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE7F,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAA;AAChD,MAAM,YAAY,GAA4B,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAA;AAC7G,MAAM,CAAC,MAAM,gBAAgB,GAAsC,EAAE,GAAG,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAEtG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,GAAiB,IAAI,CAAC,GAAG,EAAgB,EAAE;IACzE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAA;IACrB,MAAM,KAAK,GAAG,UAAU,EAAE,CAAA;IAC1B,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;AAChG,CAAC,CAAA;AAED,8GAA8G;AAC9G,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,IAAU,EAAE,QAAkB,EAAE,EAAE;IAC3E,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAA;IAC7F,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,YAAY,EAAE;QACvC,GAAG,IAAI;QACP,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;KACpF,CAAC,CAAA;IACF,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,6CAA6C,CAAC,CAAA;IAC1G,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;;YAC9B,OAAO,MAAM,CAAC,IAAI,CAAA;IACzB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,QAAmB,CAAA;AAgBpD,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAC6E,CAAA;AAavH,qBAAa,aAAc,YAAW,aAAa;IAM/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,QAAQ,CAAC,QAAQ,UAAS;IAC1B,QAAQ,CAAC,gBAAgB,SAAQ;IACjC,QAAQ,CAAC,IAAI,SAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,YACmB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,KAAK,EACtC,OAAO,GAAE,aAAkB,EAG5B;IACD,OAAO,CAAC,OAAO;YAKD,KAAK;IAeb,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAqEtD;IACK,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAoE3D;IACK,UAAU,CAAC,EAAE,EAAE,MAAM,yEAkF1B;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmCxD;IACK,IAAI,kBAET;IACK,KAAK,kBAEV;CACF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,QAAmB,CAAA;AAgBpD,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAC6E,CAAA;AAavH,qBAAa,aAAc,YAAW,aAAa;IAM/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,QAAQ,CAAC,QAAQ,UAAS;IAC1B,QAAQ,CAAC,gBAAgB,SAAQ;IACjC,QAAQ,CAAC,IAAI,SAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,YACmB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,KAAK,EACtC,OAAO,GAAE,aAAkB,EAG5B;IACD,OAAO,CAAC,OAAO;YAKD,KAAK;IAeb,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAqEtD;IACK,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAoE3D;IACK,UAAU,CAAC,EAAE,EAAE,MAAM,yEAkF1B;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmCxD;IACK,IAAI,kBAET;IACK,KAAK,kBAEV;CACF"}