@wirecat/zoom-cli 0.7.0 → 0.7.2

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 (41) hide show
  1. package/README.md +8 -7
  2. package/dist/agent-skill.d.ts +1 -1
  3. package/dist/agent-skill.js +2 -2
  4. package/dist/api.js +1 -1
  5. package/dist/archive-commands.js +1 -1
  6. package/dist/archive-import.js +1 -1
  7. package/dist/bin/zm.js +1 -1
  8. package/dist/commands.js +3 -3
  9. package/dist/config.js +1 -1
  10. package/dist/errors.d.ts +1 -1
  11. package/dist/errors.js +1 -1
  12. package/dist/execution.d.ts +1 -1
  13. package/dist/execution.js +1 -1
  14. package/dist/folders.d.ts +1 -1
  15. package/dist/folders.js +1 -1
  16. package/dist/ingestion-search-commands.js +1 -1
  17. package/dist/local-transcription-commands.js +1 -1
  18. package/dist/mcp-server.js +1 -1
  19. package/dist/meeting-context-commands.js +1 -1
  20. package/dist/meeting-integration-commands.js +1 -1
  21. package/dist/meeting-search-commands.js +1 -1
  22. package/dist/meeting-semantic-commands.js +1 -1
  23. package/dist/ordinary-file.d.ts +1 -3
  24. package/dist/ordinary-file.d.ts.map +1 -1
  25. package/dist/ordinary-file.js +8 -56
  26. package/dist/ordinary-file.js.map +1 -1
  27. package/dist/output-file.js +1 -1
  28. package/dist/program.d.ts +1 -1
  29. package/dist/program.js +1 -1
  30. package/dist/recording-archive.js +1 -1
  31. package/dist/recording-schedule-commands.js +1 -1
  32. package/dist/remote-http.js +1 -1
  33. package/dist/store-connection.js +1 -1
  34. package/dist/streaming.js +1 -1
  35. package/dist/tokens.d.ts +1 -1
  36. package/dist/watch-commands.js +1 -1
  37. package/dist/wav-audio.d.ts +1 -27
  38. package/dist/wav-audio.d.ts.map +1 -1
  39. package/dist/wav-audio.js +1 -190
  40. package/dist/wav-audio.js.map +1 -1
  41. package/package.json +7 -7
package/README.md CHANGED
@@ -39,9 +39,10 @@ zm meetings evidence meeting:1/42/57/118 --json # the exact passage
39
39
 
40
40
  ## Quick start
41
41
 
42
- You need Node 22.16+ (22.x) or 24+, a system keyring and **your own Zoom app** — Zoom lets a program
43
- read your meetings only through an app you register. [Creating it][docs/zoom-app.md]
44
- takes a few minutes and needs no client secret.
42
+ You need Node 22.16+ (22.x) or 24+, a system keyring and **a configured user-managed Zoom app**. Reuse one you already created or one your team
43
+ has made available to your user; otherwise [create your own][docs/zoom-app.md]. Use its Public
44
+ Client ID, not its regular Client ID or secret. The [installation guide][docs/installation.md]
45
+ walks through app settings, browser approval and callback completion.
45
46
 
46
47
  ```sh
47
48
  npm install -g @wirecat/zoom-cli
@@ -52,9 +53,9 @@ zm pull --lookback-days 7
52
53
  zm meetings list
53
54
  ```
54
55
 
55
- Turn on **Allow hosts to retain transcripts** in Zoom's settings first: Zoom returns transcripts only
56
- for meetings you hosted, and only when they were kept. For meetings you only attended, download the
57
- transcripts from Zoom and run `zm import <folder>`. Full guide:
56
+ Check Zoom's transcript generation and retention settings first: the API reads available hosted
57
+ meeting text, and permission does not create a transcript. For an attended meeting, obtain a VTT
58
+ file from the host or download one if allowed, then run `zm import <folder>`. Full guide:
58
59
  [installation][docs/installation.md].
59
60
 
60
61
  More: [installation][docs/installation.md] · [your Zoom app][docs/zoom-app.md] ·
@@ -396,7 +397,7 @@ More: [development setup][docs/dev/development.md] · [test matrix][docs/dev/tes
396
397
  [docs/troubleshooting.md]: https://github.com/WireCatLabs/zoom-cli/blob/main/docs/troubleshooting.md
397
398
  [docs/usage.md]: https://github.com/WireCatLabs/zoom-cli/blob/main/docs/usage.md
398
399
  [docs/zoom-app.md]: https://github.com/WireCatLabs/zoom-cli/blob/main/docs/zoom-app.md
399
- [gh/cli-meetings/blob/main/docs/dev/roadmap.md]: https://github.com/WireCatLabs/cli-meetings/blob/main/docs/dev/ROADMAP.md
400
+ [gh/cli-meetings/blob/main/docs/dev/roadmap.md]: https://github.com/WireCatLabs/cli-messaging/blob/main/docs/dev/MEETINGS.md#providers-next
400
401
  [license]: https://github.com/WireCatLabs/zoom-cli/blob/main/LICENSE
401
402
  [wirecat/en/docs/agents]: https://wirecat.dev/en/docs/agents
402
403
  [wirecat/en/docs/mcp]: https://wirecat.dev/en/docs/mcp
@@ -1,4 +1,4 @@
1
- import { type SkillEnvironment } from "@wirecat/cli-core/skill";
1
+ import { type SkillEnvironment } from "@wirecat/cli-base/skill";
2
2
  import type { Command } from "commander";
3
3
  export declare const addZoomSkillCommands: (program: Command, environment: SkillEnvironment, skill?: import("url").URL) => void;
4
4
  //# sourceMappingURL=agent-skill.d.ts.map
@@ -1,5 +1,5 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
2
- import { skillCommand } from "@wirecat/cli-core/skill";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
+ import { skillCommand } from "@wirecat/cli-base/skill";
3
3
  import { VERSION } from "./version.js";
4
4
  export const addZoomSkillCommands = (program, environment, skill = new URL("../skills/zoom-cli/SKILL.md", import.meta.url)) => {
5
5
  const command = skillCommand({ command: "zm", appName: "zoom-cli", version: VERSION }, skill, environment);
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- import { statusToCode } from "@wirecat/cli-core/http";
1
+ import { statusToCode } from "@wirecat/cli-base/http";
2
2
  import { parseVtt, } from "@wirecat/cli-messaging/meetings";
3
3
  import { number, object, string, ZoomError } from "./errors.js";
4
4
  import { ZoomRemote } from "./remote-http.js";
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { listed, recordingWindows } from "@wirecat/cli-messaging/meetings";
3
3
  import { ZoomError } from "./errors.js";
4
4
  import { bytes } from "./execution.js";
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { CliError } from "@wirecat/cli-core";
2
+ import { CliError } from "@wirecat/cli-base";
3
3
  import { readArchiveTranscripts } from "./archive-transcripts.js";
4
4
  import { checkCancelled, ZoomError } from "./errors.js";
5
5
  const plans = new WeakMap();
package/dist/bin/zm.js CHANGED
@@ -3,7 +3,7 @@ import { spawn } from "node:child_process";
3
3
  import { join } from "node:path";
4
4
  import { createInterface } from "node:readline/promises";
5
5
  import { fileURLToPath } from "node:url";
6
- import { CliError, systemKeyring } from "@wirecat/cli-core";
6
+ import { CliError, systemKeyring } from "@wirecat/cli-base";
7
7
  import { profileAccountKey, readConfig } from "../config.js";
8
8
  import { ZoomError } from "../errors.js";
9
9
  import { loginService, zmPaths } from "../folders.js";
package/dist/commands.js CHANGED
@@ -1,6 +1,6 @@
1
- import { projectFields } from "@wirecat/cli-core";
2
- import { annotate, describeOptions, describeProgram, flatten, metaOf, } from "@wirecat/cli-core/commands";
3
- import { formatSuggestions, suggest } from "@wirecat/cli-core/completion";
1
+ import { projectFields } from "@wirecat/cli-base";
2
+ import { annotate, describeOptions, describeProgram, flatten, metaOf, } from "@wirecat/cli-base/commands";
3
+ import { formatSuggestions, suggest } from "@wirecat/cli-base/completion";
4
4
  import { ZoomError } from "./errors.js";
5
5
  export const addStandardCommands = (program, deps) => {
6
6
  annotate(program
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
- import { saveConfigFile } from "@wirecat/cli-core";
2
+ import { saveConfigFile } from "@wirecat/cli-base";
3
3
  import { object, ZoomError } from "./errors.js";
4
4
  const profilePattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
5
5
  export const profileAccountKey = (profile) => `zm-profile:${profile}`;
package/dist/errors.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { CliError, type ErrorCode } from "@wirecat/cli-core";
1
+ import { CliError, type ErrorCode } from "@wirecat/cli-base";
2
2
  export declare class ZoomError extends CliError {
3
3
  constructor(code: ErrorCode, message: string);
4
4
  }
package/dist/errors.js CHANGED
@@ -1,4 +1,4 @@
1
- import { CliError } from "@wirecat/cli-core";
1
+ import { CliError } from "@wirecat/cli-base";
2
2
  export class ZoomError extends CliError {
3
3
  constructor(code, message) {
4
4
  super(code, message);
@@ -1,4 +1,4 @@
1
- import { type Deadline, type OutputBuffer, type SleepLike } from "@wirecat/cli-core";
1
+ import { type Deadline, type OutputBuffer, type SleepLike } from "@wirecat/cli-base";
2
2
  import type { Command } from "commander";
3
3
  export declare const duration: (text: string) => number;
4
4
  export declare const bytes: (text: string) => number;
package/dist/execution.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createDeadline, createOutputBuffer } from "@wirecat/cli-core";
1
+ import { createDeadline, createOutputBuffer } from "@wirecat/cli-base";
2
2
  import { ZoomError } from "./errors.js";
3
3
  export const duration = (text) => {
4
4
  const match = /^(\d+(?:\.\d+)?)(ms|s|m|h)?$/.exec(text);
package/dist/folders.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type KeyringStore, type MigrateLegacyPathsOptions, type Paths } from "@wirecat/cli-core";
1
+ import { type KeyringStore, type MigrateLegacyPathsOptions, type Paths } from "@wirecat/cli-base";
2
2
  /** The login lives in the keyring under the config folder's path, so it has to follow a moved folder. */
3
3
  export declare const loginService: (configDir: string) => string;
4
4
  /**
package/dist/folders.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { join } from "node:path";
2
- import { legacyMacPaths, migrateLegacyMacPaths, resolvePaths, } from "@wirecat/cli-core";
2
+ import { legacyMacPaths, migrateLegacyMacPaths, resolvePaths, } from "@wirecat/cli-base";
3
3
  import { readConfig } from "./config.js";
4
4
  /** The login lives in the keyring under the config folder's path, so it has to follow a moved folder. */
5
5
  export const loginService = (configDir) => `zoom-cli:${configDir}`;
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { ZoomError } from "./errors.js";
3
3
  import { bytes } from "./execution.js";
4
4
  import { validateUnifiedSearch } from "./unified-search.js";
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { speechModel } from "@wirecat/cli-messaging/speech";
3
3
  import { ZoomError } from "./errors.js";
4
4
  import { bytes, duration } from "./execution.js";
@@ -2,7 +2,7 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
3
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
4
4
  import { AjvJsonSchemaValidator } from "@modelcontextprotocol/sdk/validation/ajv";
5
- import { CliError } from "@wirecat/cli-core";
5
+ import { CliError } from "@wirecat/cli-base";
6
6
  import { callMeetingTool, meetingTools } from "@wirecat/cli-messaging/meetings/mcp";
7
7
  import { ZoomError } from "./errors.js";
8
8
  import { validateEvidenceOptions, validatePersonContext, validateTaskKind, validateTaskProposal, } from "./meeting-context.js";
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { ZoomError } from "./errors.js";
3
3
  import { bytes } from "./execution.js";
4
4
  import { validateEvidenceOptions, validatePersonContext, validateTaskKind, validateTaskProposal, } from "./meeting-context.js";
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { validateMeetingContextChange } from "@wirecat/cli-messaging/meetings";
3
3
  import { ZoomError } from "./errors.js";
4
4
  import { bytes } from "./execution.js";
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { ZoomError } from "./errors.js";
3
3
  import { bytes } from "./execution.js";
4
4
  export const validateMeetingHitSearch = (query, options = {}) => {
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { ZoomError } from "./errors.js";
3
3
  import { bytes } from "./execution.js";
4
4
  const bounded = (value, maximum) => value === undefined || (Number.isSafeInteger(value) && value > 0 && value <= maximum);
@@ -1,5 +1,3 @@
1
- import { type FileHandle } from "node:fs/promises";
2
- /** Check the opened object before reading: Windows has no O_NOFOLLOW support. */
3
- export declare const openOrdinaryFile: (path: string) => Promise<FileHandle>;
1
+ export declare const openOrdinaryFile: (path: string) => Promise<import("fs/promises").FileHandle>;
4
2
  export declare const syncDirectory: (path: string) => Promise<void>;
5
3
  //# sourceMappingURL=ordinary-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ordinary-file.d.ts","sourceRoot":"","sources":["../src/ordinary-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,kBAAkB,CAAA;AAM/D,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,SAAgB,MAAM,KAAG,OAAO,CAAC,UAAU,CA0CvE,CAAA;AAED,eAAO,MAAM,aAAa,SAAgB,MAAM,KAAG,OAAO,CAAC,IAAI,CAU9D,CAAA"}
1
+ {"version":3,"file":"ordinary-file.d.ts","sourceRoot":"","sources":["../src/ordinary-file.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,gBAAgB,SAAU,MAAM,8CAA2C,CAAA;AACxF,eAAO,MAAM,aAAa,SAAU,MAAM,kBAA2C,CAAA"}
@@ -1,64 +1,16 @@
1
- import { constants } from "node:fs";
2
- import { lstat, open } from "node:fs/promises";
1
+ import { CliError } from "@wirecat/cli-base";
2
+ import { openOrdinaryFile as sharedOpen, syncDirectory as sharedSync } from "@wirecat/cli-messaging/files";
3
3
  import { ZoomError } from "./errors.js";
4
- // Node 22's Windows path stat uses a 64-bit volume serial; handle stat uses its low DWORD.
5
- const deviceOf = (dev) => (process.platform === "win32" ? BigInt.asUintN(32, dev) : dev);
6
- /** Check the opened object before reading: Windows has no O_NOFOLLOW support. */
7
- export const openOrdinaryFile = async (path) => {
8
- const before = await lstat(path, { bigint: true });
9
- if (before.isSymbolicLink())
10
- throw new ZoomError("validation_error", "archive path must be an ordinary file without a symlink");
11
- if (!before.isFile())
12
- throw new ZoomError("validation_error", "archive path must be an ordinary file");
13
- const flags = process.platform === "win32"
14
- ? constants.O_RDONLY
15
- : constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0);
16
- const file = await open(path, flags);
4
+ const withZoomErrors = async (operation) => {
17
5
  try {
18
- const opened = await file.stat({ bigint: true });
19
- const after = await lstat(path, { bigint: true });
20
- if (!opened.isFile() || !after.isFile() || before.ino !== opened.ino || before.ino !== after.ino)
21
- throw new ZoomError("validation_error", "archive file changed while opening");
22
- if (process.platform === "win32" && before.dev === 0n && after.dev === 0n) {
23
- // Older Windows path stats omit the device; compare two handles before any content read.
24
- const witness = await open(path, flags);
25
- try {
26
- const identified = await witness.stat({ bigint: true });
27
- const final = await lstat(path, { bigint: true });
28
- if (opened.dev === 0n ||
29
- !identified.isFile() ||
30
- !final.isFile() ||
31
- deviceOf(identified.dev) !== deviceOf(opened.dev) ||
32
- identified.ino !== opened.ino ||
33
- final.ino !== before.ino ||
34
- (final.dev !== 0n && deviceOf(final.dev) !== deviceOf(opened.dev)))
35
- throw new ZoomError("validation_error", "archive file changed while opening");
36
- }
37
- finally {
38
- await witness.close();
39
- }
40
- }
41
- else if (deviceOf(before.dev) !== deviceOf(opened.dev) || deviceOf(before.dev) !== deviceOf(after.dev)) {
42
- throw new ZoomError("validation_error", "archive file changed while opening");
43
- }
44
- return file;
6
+ return await operation();
45
7
  }
46
8
  catch (error) {
47
- await file.close();
9
+ if (error instanceof CliError)
10
+ throw new ZoomError(error.code, error.message);
48
11
  throw error;
49
12
  }
50
13
  };
51
- export const syncDirectory = async (path) => {
52
- if (process.platform === "win32")
53
- return;
54
- const directory = await open(path, constants.O_RDONLY | (constants.O_DIRECTORY ?? 0) | (constants.O_NOFOLLOW ?? 0));
55
- try {
56
- if (!(await directory.stat()).isDirectory())
57
- throw new ZoomError("validation_error", "archive publication directory must be ordinary");
58
- await directory.sync();
59
- }
60
- finally {
61
- await directory.close();
62
- }
63
- };
14
+ export const openOrdinaryFile = (path) => withZoomErrors(() => sharedOpen(path));
15
+ export const syncDirectory = (path) => withZoomErrors(() => sharedSync(path));
64
16
  //# sourceMappingURL=ordinary-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ordinary-file.js","sourceRoot":"","sources":["../src/ordinary-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ordinary-file.js","sourceRoot":"","sources":["../src/ordinary-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,IAAI,UAAU,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAC1G,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,cAAc,GAAG,KAAK,EAAK,SAA2B,EAAc,EAAE;IAC1E,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAC7E,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;AACxF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { link, open, unlink } from "node:fs/promises";
3
- import { CliError } from "@wirecat/cli-core";
3
+ import { CliError } from "@wirecat/cli-base";
4
4
  import { checkCancelled, ZoomError } from "./errors.js";
5
5
  export const writeExportFile = async (path, content, options = {}) => {
6
6
  checkCancelled(options.signal);
package/dist/program.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type SleepLike } from "@wirecat/cli-core";
1
+ import { type SleepLike } from "@wirecat/cli-base";
2
2
  import { type MeetingSource, type MeetingStore, type MeetingTranscriptReceiptStore, type MeetingTranscriptStore } from "@wirecat/cli-messaging/meetings";
3
3
  import { Command } from "commander";
4
4
  import { type ArchiveService, type ArchiveTranscriptService, type RecordingsService, type RemoteMeetingsService } from "./archive-commands.js";
package/dist/program.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { homedir } from "node:os";
2
2
  import { dirname, join } from "node:path";
3
- import { CliError, createDeadline, createRenderer, exitCodeFor, fieldsOf, GENERIC_FAILURE, projectFields, realSleep, } from "@wirecat/cli-core";
3
+ import { CliError, createDeadline, createRenderer, exitCodeFor, fieldsOf, GENERIC_FAILURE, projectFields, realSleep, } from "@wirecat/cli-base";
4
4
  import { importFiles, listed, MeetingError, pull, } from "@wirecat/cli-messaging/meetings";
5
5
  import { addMeetingCommands } from "@wirecat/cli-messaging/meetings/cli";
6
6
  import { Command, CommanderError } from "commander";
@@ -2,7 +2,7 @@ import { createHash, randomUUID } from "node:crypto";
2
2
  import { link, lstat, mkdir, open, readdir, realpath, rename, rmdir, unlink } from "node:fs/promises";
3
3
  import { hostname } from "node:os";
4
4
  import { join } from "node:path";
5
- import { retryableStatus, statusToCode } from "@wirecat/cli-core/http";
5
+ import { retryableStatus, statusToCode } from "@wirecat/cli-base/http";
6
6
  import { RecordingTransferError, transferRecording, } from "@wirecat/cli-messaging/meetings";
7
7
  import { checkCancelled, string, ZoomError } from "./errors.js";
8
8
  import { openOrdinaryFile, syncDirectory } from "./ordinary-file.js";
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { listed } from "@wirecat/cli-messaging/meetings";
3
3
  import { ZoomError } from "./errors.js";
4
4
  import { bytes } from "./execution.js";
@@ -1,5 +1,5 @@
1
1
  import { setTimeout } from "node:timers/promises";
2
- import { providerWaitMs, retryableStatus, statusToCode } from "@wirecat/cli-core/http";
2
+ import { providerWaitMs, retryableStatus, statusToCode } from "@wirecat/cli-base/http";
3
3
  import { checkCancelled, object, ZoomError } from "./errors.js";
4
4
  export const operationSignal = (signal) => signal ?? AbortSignal.timeout(3600000);
5
5
  export class ZoomRemote {
@@ -1,4 +1,4 @@
1
- import { CliError } from "@wirecat/cli-core";
1
+ import { CliError } from "@wirecat/cli-base";
2
2
  import { dispatchMeetingMutation, validateMeetingContextChange, } from "@wirecat/cli-messaging/meetings";
3
3
  import { profileAccountKey } from "./config.js";
4
4
  import { ZoomError } from "./errors.js";
package/dist/streaming.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createOutputBuffer } from "@wirecat/cli-core";
1
+ import { createOutputBuffer } from "@wirecat/cli-base";
2
2
  import { checkCancelled, ZoomError } from "./errors.js";
3
3
  /** Await kernel-facing stdout backpressure before advancing another ingestion/download cycle. */
4
4
  export const writeStream = (stream, text, signal) => {
package/dist/tokens.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { KeyringStore } from "@wirecat/cli-core";
1
+ import type { KeyringStore } from "@wirecat/cli-base";
2
2
  export interface Tokens {
3
3
  accessToken: string;
4
4
  refreshToken: string;
@@ -1,4 +1,4 @@
1
- import { annotate } from "@wirecat/cli-core/commands";
1
+ import { annotate } from "@wirecat/cli-base/commands";
2
2
  import { watchMeetingIngestion } from "@wirecat/cli-messaging/meetings";
3
3
  import { Option } from "commander";
4
4
  import { ZoomError } from "./errors.js";
@@ -1,28 +1,2 @@
1
- export interface WavAudioDescriptor {
2
- id: string;
3
- contentHash: string;
4
- size: number;
5
- durationMs: number;
6
- format: "wav";
7
- sampleRate: 16000 | 48000;
8
- channels: 1 | 2;
9
- }
10
- export interface WavAudioOptions {
11
- maxBytes: number;
12
- maxDurationMs: number;
13
- signal?: AbortSignal;
14
- }
15
- export interface WavAudioPlan {
16
- readonly media: Readonly<WavAudioDescriptor>;
17
- }
18
- export interface WavPcmWindow {
19
- startMs: number;
20
- endMs: number;
21
- samples: Float32Array;
22
- }
23
- export declare const preflightWavAudio: (path: string, input: WavAudioOptions) => Promise<WavAudioPlan>;
24
- export declare const openWavAudio: (plan: WavAudioPlan, input: WavAudioOptions) => Promise<{
25
- windows(): AsyncIterable<WavPcmWindow>;
26
- close(): Promise<void>;
27
- }>;
1
+ export { openWavAudio, preflightWavAudio, type WavAudioDescriptor, type WavAudioOptions, type WavAudioPlan, type WavPcmWindow, } from "@wirecat/cli-messaging/speech/wav";
28
2
  //# sourceMappingURL=wav-audio.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wav-audio.d.ts","sourceRoot":"","sources":["../src/wav-audio.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,KAAK,CAAA;IACb,UAAU,EAAE,KAAK,GAAG,KAAK,CAAA;IACzB,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAA;CAChB;AACD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAA;CAC7C;AACD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,YAAY,CAAA;CACtB;AAmHD,eAAO,MAAM,iBAAiB,SAAgB,MAAM,SAAS,eAAe,KAAG,OAAO,CAAC,YAAY,CA8BlG,CAAA;AACD,eAAO,MAAM,YAAY,SACjB,YAAY,SACX,eAAe,KACrB,OAAO,CAAC;IAAE,OAAO,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA+D5E,CAAA"}
1
+ {"version":3,"file":"wav-audio.d.ts","sourceRoot":"","sources":["../src/wav-audio.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,mCAAmC,CAAA"}
package/dist/wav-audio.js CHANGED
@@ -1,191 +1,2 @@
1
- import { createHash } from "node:crypto";
2
- import { basename, resolve } from "node:path";
3
- import { checkCancelled, ZoomError } from "./errors.js";
4
- import { openOrdinaryFile } from "./ordinary-file.js";
5
- const prepared = new WeakMap();
6
- const invalid = () => {
7
- throw new ZoomError("validation_error", "local transcription requires PCM16 mono/stereo WAV at 16 or 48 kHz; convert the media locally to PCM WAV first");
8
- };
9
- const validate = (options) => {
10
- if (!Number.isSafeInteger(options.maxBytes) ||
11
- options.maxBytes < 1 ||
12
- options.maxBytes > 4 * 1024 ** 3 ||
13
- !Number.isSafeInteger(options.maxDurationMs) ||
14
- options.maxDurationMs < 1 ||
15
- options.maxDurationMs > 24 * 3600_000)
16
- throw new ZoomError("validation_error", "audio byte and duration budgets must be positive bounded integers");
17
- checkCancelled(options.signal);
18
- };
19
- const exact = async (file, offset, size, signal) => {
20
- const bytes = Buffer.alloc(size);
21
- let read = 0;
22
- while (read < size) {
23
- checkCancelled(signal);
24
- const result = await file.read(bytes, read, size - read, offset + read);
25
- if (!result.bytesRead)
26
- throw new ZoomError("validation_error", "WAV changed or was truncated while reading");
27
- read += result.bytesRead;
28
- }
29
- return bytes;
30
- };
31
- const layoutOf = async (file, size, options) => {
32
- if (size < 44 || size > options.maxBytes)
33
- invalid();
34
- const header = await exact(file, 0, 12, options.signal);
35
- if (header.toString("ascii", 0, 4) !== "RIFF" ||
36
- header.toString("ascii", 8, 12) !== "WAVE" ||
37
- header.readUInt32LE(4) + 8 !== size)
38
- invalid();
39
- let format;
40
- let data;
41
- let at = 12;
42
- let chunks = 0;
43
- while (at < size) {
44
- checkCancelled(options.signal);
45
- if (++chunks > 1024 || size - at < 8)
46
- invalid();
47
- const chunk = await exact(file, at, 8, options.signal);
48
- const kind = chunk.toString("ascii", 0, 4);
49
- const length = chunk.readUInt32LE(4);
50
- const start = at + 8;
51
- const next = start + length + (length % 2);
52
- if (next > size)
53
- invalid();
54
- if (kind === "fmt ") {
55
- if (format || ![16, 18].includes(length))
56
- invalid();
57
- const bytes = await exact(file, start, length, options.signal);
58
- const channels = bytes.readUInt16LE(2);
59
- const sampleRate = bytes.readUInt32LE(4);
60
- if (bytes.readUInt16LE(0) !== 1 ||
61
- ![1, 2].includes(channels) ||
62
- ![16000, 48000].includes(sampleRate) ||
63
- bytes.readUInt16LE(14) !== 16 ||
64
- bytes.readUInt16LE(12) !== channels * 2 ||
65
- bytes.readUInt32LE(8) !== sampleRate * channels * 2 ||
66
- (length === 18 && bytes.readUInt16LE(16) !== 0))
67
- invalid();
68
- format = { sampleRate: sampleRate, channels: channels };
69
- }
70
- else if (kind === "data") {
71
- if (data || !length)
72
- invalid();
73
- data = { offset: start, size: length };
74
- }
75
- at = next;
76
- }
77
- if (!format || !data || data.size % (format.channels * 2) !== 0)
78
- return invalid();
79
- const frames = data.size / (format.channels * 2);
80
- if (Math.ceil((frames * 1000) / format.sampleRate) > options.maxDurationMs)
81
- throw new ZoomError("validation_error", "WAV exceeds the configured duration limit");
82
- return { ...format, dataOffset: data.offset, dataSize: data.size, frames };
83
- };
84
- const hashRange = async (file, hash, start, end, signal) => {
85
- let at = start;
86
- while (at < end) {
87
- const bytes = await exact(file, at, Math.min(65536, end - at), signal);
88
- hash.update(bytes);
89
- at += bytes.length;
90
- }
91
- };
92
- const hashFile = async (file, size, signal) => {
93
- const hash = createHash("sha256");
94
- await hashRange(file, hash, 0, size, signal);
95
- if ((await file.stat()).size !== size)
96
- throw new ZoomError("validation_error", "WAV changed while verifying its content");
97
- return hash.digest("hex");
98
- };
99
- export const preflightWavAudio = async (path, input) => {
100
- const options = { ...input };
101
- validate(options);
102
- if (typeof path !== "string" || !path.trim() || /\0/.test(path))
103
- throw new ZoomError("validation_error", "local audio file is required");
104
- const absolute = resolve(path);
105
- const file = await openOrdinaryFile(absolute);
106
- try {
107
- const stat = await file.stat({ bigint: true });
108
- const size = Number(stat.size);
109
- const layout = await layoutOf(file, size, options);
110
- const contentHash = await hashFile(file, size, options.signal);
111
- const after = await file.stat({ bigint: true });
112
- if (stat.size !== after.size || stat.mtimeNs !== after.mtimeNs)
113
- throw new ZoomError("validation_error", "WAV changed while preparing the transcription");
114
- const media = Object.freeze({
115
- id: createHash("sha256").update(basename(absolute)).digest("hex"),
116
- contentHash,
117
- size,
118
- durationMs: Math.ceil((layout.frames * 1000) / layout.sampleRate),
119
- format: "wav",
120
- sampleRate: layout.sampleRate,
121
- channels: layout.channels,
122
- });
123
- const plan = Object.freeze({ media });
124
- prepared.set(plan, { path: absolute, dev: stat.dev, ino: stat.ino, layout });
125
- return plan;
126
- }
127
- finally {
128
- await file.close();
129
- }
130
- };
131
- export const openWavAudio = async (plan, input) => {
132
- const options = { ...input };
133
- validate(options);
134
- const known = prepared.get(plan);
135
- if (!known)
136
- throw new ZoomError("validation_error", "audio plan was not prepared by this adapter");
137
- const file = await openOrdinaryFile(known.path);
138
- try {
139
- const stat = await file.stat({ bigint: true });
140
- if (stat.dev !== known.dev || stat.ino !== known.ino || Number(stat.size) !== plan.media.size)
141
- throw new ZoomError("validation_error", "WAV identity changed before transcription");
142
- const layout = await layoutOf(file, plan.media.size, options);
143
- if (JSON.stringify(layout) !== JSON.stringify(known.layout) ||
144
- (await hashFile(file, plan.media.size, options.signal)) !== plan.media.contentHash)
145
- throw new ZoomError("validation_error", "WAV content changed before transcription");
146
- let closed = false;
147
- let consumed = false;
148
- return {
149
- async *windows() {
150
- if (closed || consumed)
151
- throw new ZoomError("configuration_error", "audio source can be consumed once before closing");
152
- consumed = true;
153
- const hash = createHash("sha256");
154
- await hashRange(file, hash, 0, layout.dataOffset, options.signal);
155
- const step = layout.sampleRate / 16000;
156
- for (let frame = 0; frame < layout.frames;) {
157
- checkCancelled(options.signal);
158
- const count = Math.min(layout.sampleRate * 30, layout.frames - frame);
159
- const bytes = await exact(file, layout.dataOffset + frame * layout.channels * 2, count * layout.channels * 2, options.signal);
160
- hash.update(bytes);
161
- const samples = new Float32Array(Math.floor(count / step));
162
- for (let index = 0; index < samples.length; index++) {
163
- let sum = 0;
164
- for (let offset = 0; offset < step; offset++)
165
- for (let channel = 0; channel < layout.channels; channel++)
166
- sum += bytes.readInt16LE(((index * step + offset) * layout.channels + channel) * 2);
167
- samples[index] = sum / (32768 * step * layout.channels);
168
- }
169
- const startMs = Math.floor((frame * 1000) / layout.sampleRate);
170
- frame += count;
171
- if (samples.length)
172
- yield { startMs, endMs: Math.ceil((frame * 1000) / layout.sampleRate), samples };
173
- }
174
- await hashRange(file, hash, layout.dataOffset + layout.dataSize, plan.media.size, options.signal);
175
- if (hash.digest("hex") !== plan.media.contentHash || (await file.stat()).size !== plan.media.size)
176
- throw new ZoomError("validation_error", "WAV changed during recognition; no transcript may be stored");
177
- },
178
- async close() {
179
- if (!closed) {
180
- closed = true;
181
- await file.close();
182
- }
183
- },
184
- };
185
- }
186
- catch (error) {
187
- await file.close();
188
- throw error;
189
- }
190
- };
1
+ export { openWavAudio, preflightWavAudio, } from "@wirecat/cli-messaging/speech/wav";
191
2
  //# sourceMappingURL=wav-audio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wav-audio.js","sourceRoot":"","sources":["../src/wav-audio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wav-audio.js","sourceRoot":"","sources":["../src/wav-audio.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,GAKlB,MAAM,mCAAmC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirecat/zoom-cli",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Zoom cloud recording archives, persistent transcripts and meeting tools",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -28,7 +28,7 @@
28
28
  }
29
29
  },
30
30
  "scripts": {
31
- "build": "tsc --build",
31
+ "build": "tsc --build --force",
32
32
  "typecheck": "tsc --build --force --emitDeclarationOnly && tsc -p tsconfig.test.json && tsc -p tsconfig.scripts.json",
33
33
  "lint": "biome check .",
34
34
  "lint:fix": "biome check --write .",
@@ -36,7 +36,7 @@
36
36
  "test:coverage": "vitest run --coverage",
37
37
  "smoke:bun": "bun run scripts/smoke.ts",
38
38
  "prepublishOnly": "pnpm build",
39
- "docs:check": "node node_modules/@wirecat/cli-core/dist/dev/bin.js docs-check --rules scripts/docs-rules.ts && cspell --no-progress --no-summary README.md && node node_modules/rumdl/bin/rumdl check --config config/wirecat/rumdl.toml README.md CHANGELOG.md CLAUDE.md docs/*.md docs/dev/*.md",
39
+ "docs:check": "node node_modules/@wirecat/cli-base/dist/dev/bin.js docs-check --rules scripts/docs-rules.ts && cspell --no-progress --no-summary README.md && node node_modules/rumdl/bin/rumdl check --config config/wirecat/rumdl.toml README.md CHANGELOG.md CLAUDE.md docs/*.md docs/dev/*.md",
40
40
  "standards:check": "node config/wirecat/check.mjs",
41
41
  "docs:lint": "markdownlint-cli2",
42
42
  "docs:spell": "cspell lint --config cspell.json --no-progress README.md",
@@ -46,14 +46,14 @@
46
46
  "generate": "pnpm build && node scripts/commands.ts",
47
47
  "generate:check": "pnpm build && node scripts/commands.ts --check",
48
48
  "test:matrix": "pnpm test --maxWorkers 2 && pnpm build && pnpm test:matrix:check",
49
- "test:matrix:check": "node node_modules/@wirecat/cli-core/dist/dev/bin.js test-matrix --program scripts/command-program.ts --untested scripts/test-matrix-untested.ts --name zm --check",
49
+ "test:matrix:check": "node node_modules/@wirecat/cli-base/dist/dev/bin.js test-matrix --program scripts/command-program.ts --untested scripts/test-matrix-untested.ts --name zm --check",
50
50
  "contracts:upgrade": "pnpm --dir contracts/previous install --frozen-lockfile --ignore-scripts && cli-contract contracts/upgrade.json",
51
51
  "security:no-leak": "cli-testing security no-leak . contracts/no-leak.json"
52
52
  },
53
53
  "dependencies": {
54
54
  "@modelcontextprotocol/sdk": "1.32.1",
55
- "@wirecat/cli-core": "0.20.0",
56
- "@wirecat/cli-messaging": "0.246.0",
55
+ "@wirecat/cli-base": "0.21.0",
56
+ "@wirecat/cli-messaging": "0.253.0",
57
57
  "commander": "15.0.0"
58
58
  },
59
59
  "devDependencies": {
@@ -63,7 +63,7 @@
63
63
  "@cspell/dict-ru_ru": "2.3.3",
64
64
  "@types/node": "^22.20.5",
65
65
  "@vitest/coverage-v8": "^5.0.3",
66
- "@wirecat/cli-testing": "0.3.0",
66
+ "@wirecat/cli-testing": "0.4.0",
67
67
  "cspell": "10.3.6",
68
68
  "lefthook": "2.1.16",
69
69
  "markdownlint-cli2": "0.23.3",