@wirecat/zoom-cli 0.1.0 → 0.2.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 (89) hide show
  1. package/README.md +156 -11
  2. package/dist/agent-skill.d.ts +4 -0
  3. package/dist/agent-skill.d.ts.map +1 -0
  4. package/dist/agent-skill.js +16 -0
  5. package/dist/agent-skill.js.map +1 -0
  6. package/dist/api.d.ts +3 -2
  7. package/dist/api.d.ts.map +1 -1
  8. package/dist/api.js +10 -41
  9. package/dist/api.js.map +1 -1
  10. package/dist/archive-commands.d.ts +25 -0
  11. package/dist/archive-commands.d.ts.map +1 -0
  12. package/dist/archive-commands.js +157 -0
  13. package/dist/archive-commands.js.map +1 -0
  14. package/dist/bin/zm.js +53 -3
  15. package/dist/bin/zm.js.map +1 -1
  16. package/dist/commands.d.ts +12 -0
  17. package/dist/commands.d.ts.map +1 -0
  18. package/dist/commands.js +96 -0
  19. package/dist/commands.js.map +1 -0
  20. package/dist/config.d.ts +2 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +13 -2
  23. package/dist/config.js.map +1 -1
  24. package/dist/errors.d.ts +4 -3
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js +11 -4
  27. package/dist/errors.js.map +1 -1
  28. package/dist/execution.d.ts +16 -0
  29. package/dist/execution.d.ts.map +1 -0
  30. package/dist/execution.js +49 -0
  31. package/dist/execution.js.map +1 -0
  32. package/dist/index.d.ts +7 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +6 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/login.d.ts +1 -0
  37. package/dist/login.d.ts.map +1 -1
  38. package/dist/login.js +13 -1
  39. package/dist/login.js.map +1 -1
  40. package/dist/mcp-server.d.ts +16 -0
  41. package/dist/mcp-server.d.ts.map +1 -0
  42. package/dist/mcp-server.js +172 -0
  43. package/dist/mcp-server.js.map +1 -0
  44. package/dist/output-file.d.ts +4 -0
  45. package/dist/output-file.d.ts.map +1 -0
  46. package/dist/output-file.js +55 -0
  47. package/dist/output-file.js.map +1 -0
  48. package/dist/program.d.ts +32 -0
  49. package/dist/program.d.ts.map +1 -1
  50. package/dist/program.js +403 -45
  51. package/dist/program.js.map +1 -1
  52. package/dist/recording-archive.d.ts +62 -0
  53. package/dist/recording-archive.d.ts.map +1 -0
  54. package/dist/recording-archive.js +519 -0
  55. package/dist/recording-archive.js.map +1 -0
  56. package/dist/recording-sync.d.ts +15 -0
  57. package/dist/recording-sync.d.ts.map +1 -0
  58. package/dist/recording-sync.js +49 -0
  59. package/dist/recording-sync.js.map +1 -0
  60. package/dist/recordings.d.ts +47 -0
  61. package/dist/recordings.d.ts.map +1 -0
  62. package/dist/recordings.js +124 -0
  63. package/dist/recordings.js.map +1 -0
  64. package/dist/remote-http.d.ts +23 -0
  65. package/dist/remote-http.d.ts.map +1 -0
  66. package/dist/remote-http.js +113 -0
  67. package/dist/remote-http.js.map +1 -0
  68. package/dist/remote-meetings.d.ts +58 -0
  69. package/dist/remote-meetings.d.ts.map +1 -0
  70. package/dist/remote-meetings.js +151 -0
  71. package/dist/remote-meetings.js.map +1 -0
  72. package/dist/store-connection.d.ts +9 -0
  73. package/dist/store-connection.d.ts.map +1 -0
  74. package/dist/store-connection.js +39 -0
  75. package/dist/store-connection.js.map +1 -0
  76. package/dist/streaming.d.ts +6 -0
  77. package/dist/streaming.d.ts.map +1 -0
  78. package/dist/streaming.js +86 -0
  79. package/dist/streaming.js.map +1 -0
  80. package/dist/tokens.d.ts +6 -4
  81. package/dist/tokens.d.ts.map +1 -1
  82. package/dist/tokens.js +48 -18
  83. package/dist/tokens.js.map +1 -1
  84. package/dist/watch-commands.d.ts +11 -0
  85. package/dist/watch-commands.d.ts.map +1 -0
  86. package/dist/watch-commands.js +30 -0
  87. package/dist/watch-commands.js.map +1 -0
  88. package/package.json +21 -12
  89. package/skills/zoom-cli/SKILL.md +69 -0
@@ -0,0 +1,47 @@
1
+ import { type ArchiveReport, type DownloadOptions } from "./recording-archive.js";
2
+ import { type RemoteOptions, ZoomRemote } from "./remote-http.js";
3
+ import type { TokenManager } from "./tokens.js";
4
+ export interface RecordingAsset {
5
+ id: string | null;
6
+ type: string;
7
+ format: string | null;
8
+ size: number | null;
9
+ status: string;
10
+ available: boolean;
11
+ startedAt: string | null;
12
+ endedAt: string | null;
13
+ }
14
+ export interface RecordingMeeting {
15
+ id: string;
16
+ uuid: string;
17
+ title: string | null;
18
+ startedAt: string | null;
19
+ assets: RecordingAsset[];
20
+ }
21
+ export interface RecordingRange {
22
+ from: string;
23
+ to: string;
24
+ signal?: AbortSignal;
25
+ }
26
+ export declare const required: (value: unknown) => string;
27
+ export declare class ZoomRecordings {
28
+ readonly remote: ZoomRemote;
29
+ constructor(tokens: Pick<TokenManager, "tokens">, fetcher: typeof fetch, options?: RemoteOptions);
30
+ list(options: RecordingRange): Promise<RecordingMeeting[]>;
31
+ private details;
32
+ show(id: string, options?: {
33
+ signal?: AbortSignal;
34
+ }): Promise<RecordingMeeting>;
35
+ download(id: string, options: DownloadOptions): Promise<ArchiveReport>;
36
+ }
37
+ export type { ArchivedFile, ArchiveLockInfo, ArchiveManifest, ArchiveReport, ArchiveVerification, DownloadOptions, } from "./recording-archive.js";
38
+ export { inspectArchive, inspectArchiveLocks, recoverArchiveLocks, verifyArchive } from "./recording-archive.js";
39
+ export interface ZoomProfile {
40
+ id: string;
41
+ email: string | null;
42
+ displayName: string | null;
43
+ }
44
+ export declare const getZoomProfile: (tokens: Pick<TokenManager, "tokens">, fetcher: typeof fetch, options?: {
45
+ signal?: AbortSignal;
46
+ }) => Promise<ZoomProfile>;
47
+ //# sourceMappingURL=recordings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordings.d.ts","sourceRoot":"","sources":["../src/recordings.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAmB,KAAK,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AACD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB;AACD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AACD,eAAO,MAAM,QAAQ,UAAW,OAAO,KAAG,MAIzC,CAAA;AA2CD,qBAAa,cAAc;IACzB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,YAAY,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,OAAO,GAAE,aAAkB,EAEnG;IACK,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuC/D;YACa,OAAO;IAuBf,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAExF;IACK,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAK3E;CACF;AAED,YAAY,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,eAAe,GAChB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEhH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AACD,eAAO,MAAM,cAAc,WACjB,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,WAC3B,OAAO,KAAK,YACZ;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAChC,OAAO,CAAC,WAAW,CAGrB,CAAA"}
@@ -0,0 +1,124 @@
1
+ import { encodeUuid } from "./api.js";
2
+ import { object, string, ZoomError } from "./errors.js";
3
+ import { archiveRecording, validateDownloadOptions, } from "./recording-archive.js";
4
+ import { operationSignal, ZoomRemote } from "./remote-http.js";
5
+ export const required = (value) => {
6
+ const text = string(value);
7
+ if (text === null)
8
+ throw new ZoomError("invalid_response", "Zoom response is missing a required field");
9
+ return text;
10
+ };
11
+ const timestamp = (value) => {
12
+ if (value === undefined || value === null || value === "")
13
+ return null;
14
+ const text = required(value);
15
+ if (!Number.isFinite(Date.parse(text)))
16
+ throw new ZoomError("invalid_response", "Zoom returned an invalid timestamp");
17
+ return new Date(text).toISOString();
18
+ };
19
+ const meeting = (value) => {
20
+ const row = object(value);
21
+ const id = typeof row.id === "number" && Number.isSafeInteger(row.id) ? String(row.id) : required(row.id);
22
+ if (!Array.isArray(row.recording_files))
23
+ throw new ZoomError("invalid_response", "Zoom returned invalid recording files");
24
+ const all = [
25
+ ...row.recording_files,
26
+ ...(Array.isArray(row.participant_audio_files) ? row.participant_audio_files : []),
27
+ ];
28
+ const seen = new Set();
29
+ const assets = all.map((value) => {
30
+ const asset = object(value);
31
+ const id = string(asset.id);
32
+ if (id !== null && seen.has(id))
33
+ throw new ZoomError("invalid_response", "Zoom repeated a recording file id");
34
+ if (id !== null)
35
+ seen.add(id);
36
+ return {
37
+ id,
38
+ type: string(asset.recording_type) ?? string(asset.file_type) ?? "unknown",
39
+ format: string(asset.file_extension) ??
40
+ { TRANSCRIPT: "VTT", CC: "VTT", CHAT: "TXT", CHAT_MESSAGE: "TXT", SUMMARY: "JSON", TIMELINE: "JSON" }[String(asset.file_type)] ??
41
+ string(asset.file_type),
42
+ size: typeof asset.file_size === "number" && Number.isSafeInteger(asset.file_size) && asset.file_size >= 0
43
+ ? asset.file_size
44
+ : null,
45
+ status: id === null ? "unsupported" : (string(asset.status) ?? "unknown"),
46
+ available: id !== null && asset.status === "completed" && string(asset.download_url) !== null,
47
+ startedAt: timestamp(asset.recording_start),
48
+ endedAt: timestamp(asset.recording_end),
49
+ };
50
+ });
51
+ return { id, uuid: required(row.uuid), title: string(row.topic), startedAt: timestamp(row.start_time), assets };
52
+ };
53
+ export class ZoomRecordings {
54
+ remote;
55
+ constructor(tokens, fetcher, options = {}) {
56
+ this.remote = new ZoomRemote(tokens, fetcher, options);
57
+ }
58
+ async list(options) {
59
+ const dates = [options.from, options.to].map((date) => {
60
+ const instant = Date.parse(`${date}T00:00:00Z`);
61
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(date) ||
62
+ !Number.isFinite(instant) ||
63
+ new Date(instant).toISOString().slice(0, 10) !== date)
64
+ throw new ZoomError("validation_error", "recording dates must be valid YYYY-MM-DD dates");
65
+ return instant;
66
+ });
67
+ const difference = (dates[1] ?? 0) - (dates[0] ?? 0);
68
+ if (difference < 0 || difference > 31 * 86400000)
69
+ throw new ZoomError("validation_error", "recording date range must be ordered and at most one month");
70
+ const signal = operationSignal(options.signal);
71
+ const query = new URLSearchParams({ from: options.from, to: options.to, page_size: "100" });
72
+ const seen = new Set();
73
+ const meetings = new Map();
74
+ for (;;) {
75
+ const body = await this.remote.request(`/users/me/recordings?${query}`, "cloud_recording:read:list_user_recordings", { signal });
76
+ if (!Array.isArray(body.meetings))
77
+ throw new ZoomError("invalid_response", "Zoom returned an invalid recording list");
78
+ for (const value of body.meetings) {
79
+ const item = meeting(value);
80
+ const previous = meetings.get(item.uuid);
81
+ if (previous && JSON.stringify(previous) !== JSON.stringify(item))
82
+ throw new ZoomError("invalid_response", "Zoom returned conflicting recording occurrences");
83
+ meetings.set(item.uuid, item);
84
+ }
85
+ const next = string(body.next_page_token);
86
+ if (!next)
87
+ return [...meetings.values()];
88
+ if (seen.has(next))
89
+ throw new ZoomError("invalid_response", "Zoom repeated a pagination token");
90
+ seen.add(next);
91
+ query.set("next_page_token", next);
92
+ }
93
+ }
94
+ async details(id, signal) {
95
+ if (!id.trim())
96
+ throw new ZoomError("validation_error", "recording meeting id is required");
97
+ const body = await this.remote.request(`/meetings/${encodeUuid(id)}/recordings`, "cloud_recording:read:list_recording_files", { ...(signal ? { signal } : {}) });
98
+ const item = meeting(body);
99
+ const rows = [
100
+ ...body.recording_files,
101
+ ...(Array.isArray(body.participant_audio_files) ? body.participant_audio_files : []),
102
+ ];
103
+ const urls = new Map(rows.map((value) => {
104
+ const row = object(value);
105
+ return [string(row.id) ?? "", string(row.download_url) ?? ""];
106
+ }));
107
+ return { meeting: item, urls };
108
+ }
109
+ async show(id, options = {}) {
110
+ return (await this.details(id, options.signal)).meeting;
111
+ }
112
+ async download(id, options) {
113
+ validateDownloadOptions(options);
114
+ const signal = operationSignal(options.signal);
115
+ const details = await this.details(id, signal);
116
+ return archiveRecording(this.remote, details.meeting, details.urls, { ...options, signal });
117
+ }
118
+ }
119
+ export { inspectArchive, inspectArchiveLocks, recoverArchiveLocks, verifyArchive } from "./recording-archive.js";
120
+ export const getZoomProfile = async (tokens, fetcher, options = {}) => {
121
+ const body = await new ZoomRemote(tokens, fetcher).request("/users/me", "user:read:user", options);
122
+ return { id: required(body.id), email: string(body.email), displayName: string(body.display_name) };
123
+ };
124
+ //# sourceMappingURL=recordings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordings.js","sourceRoot":"","sources":["../src/recordings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { TokenManager } from "./tokens.js";
2
+ export interface RemoteOptions {
3
+ sleep?: (milliseconds: number, signal: AbortSignal) => Promise<void>;
4
+ now?: () => number;
5
+ }
6
+ export interface RemoteRequest {
7
+ signal?: AbortSignal;
8
+ method?: "GET" | "POST" | "PATCH" | "DELETE";
9
+ body?: unknown;
10
+ }
11
+ export declare const operationSignal: (signal?: AbortSignal) => AbortSignal;
12
+ export declare class ZoomRemote {
13
+ readonly tokens: Pick<TokenManager, "tokens">;
14
+ readonly fetcher: typeof fetch;
15
+ private readonly options;
16
+ constructor(tokens: Pick<TokenManager, "tokens">, fetcher: typeof fetch, options?: RemoteOptions);
17
+ pause(response: Response | null, attempt: number, signal: AbortSignal): Promise<boolean>;
18
+ get(target: string | URL, accessToken: string, signal: AbortSignal, retry?: boolean): Promise<Response>;
19
+ request(path: string, scope: string, options?: RemoteRequest): Promise<Record<string, unknown>>;
20
+ requestOptional(path: string, scope: string, missingCode: number, options?: RemoteRequest): Promise<Record<string, unknown> | null>;
21
+ private perform;
22
+ }
23
+ //# sourceMappingURL=remote-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-http.d.ts","sourceRoot":"","sources":["../src/remote-http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AACD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AACD,eAAO,MAAM,eAAe,YAAa,WAAW,KAAG,WAAqD,CAAA;AAC5G,qBAAa,UAAU;IAEnB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,KAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,YACW,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EACpC,OAAO,EAAE,OAAO,KAAK,EACb,OAAO,GAAE,aAAkB,EAC1C;IACE,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAW7F;IACK,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,UAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqBzG;IACD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAElG;IACD,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAEzC;YACa,OAAO;CA8EtB"}
@@ -0,0 +1,113 @@
1
+ import { setTimeout } from "node:timers/promises";
2
+ import { providerWaitMs, retryableStatus, statusToCode } from "@wirecat/cli-core/http";
3
+ import { checkCancelled, object, ZoomError } from "./errors.js";
4
+ export const operationSignal = (signal) => signal ?? AbortSignal.timeout(3600000);
5
+ export class ZoomRemote {
6
+ tokens;
7
+ fetcher;
8
+ options;
9
+ constructor(tokens, fetcher, options = {}) {
10
+ this.tokens = tokens;
11
+ this.fetcher = fetcher;
12
+ this.options = options;
13
+ }
14
+ async pause(response, attempt, signal) {
15
+ const delay = response
16
+ ? (providerWaitMs(response.headers, () => new Date(this.options.now?.() ?? Date.now())) ?? 250 * 2 ** attempt)
17
+ : 250 * 2 ** attempt;
18
+ if (!Number.isFinite(delay) || delay > 30000)
19
+ return false;
20
+ checkCancelled(signal);
21
+ await (this.options.sleep ?? ((ms, abort) => setTimeout(ms, undefined, { signal: abort })))(Math.max(0, delay), signal);
22
+ return true;
23
+ }
24
+ async get(target, accessToken, signal, retry = true) {
25
+ for (let attempt = 0;; attempt++) {
26
+ checkCancelled(signal);
27
+ let response;
28
+ try {
29
+ response = await this.fetcher(target, {
30
+ headers: { authorization: `Bearer ${accessToken}` },
31
+ redirect: "manual",
32
+ signal,
33
+ });
34
+ }
35
+ catch {
36
+ checkCancelled(signal);
37
+ if (retry && attempt < 2 && (await this.pause(null, attempt, signal)))
38
+ continue;
39
+ throw new ZoomError("network_error", "Zoom request could not be completed");
40
+ }
41
+ if (retry && attempt < 2 && retryableStatus(response.status) && (await this.pause(response, attempt, signal))) {
42
+ await response.body?.cancel();
43
+ continue;
44
+ }
45
+ return response;
46
+ }
47
+ }
48
+ request(path, scope, options = {}) {
49
+ return this.perform(path, scope, options);
50
+ }
51
+ requestOptional(path, scope, missingCode, options = {}) {
52
+ return this.perform(path, scope, options, missingCode);
53
+ }
54
+ async perform(path, scope, options, missingCode) {
55
+ const signal = operationSignal(options.signal);
56
+ checkCancelled(signal);
57
+ const tokens = await this.tokens.tokens();
58
+ if (![scope, `${scope}:admin`, `${scope}:master`].some((grant) => tokens.scopes.includes(grant)))
59
+ throw new ZoomError("configuration_error", `Zoom scope ${scope} is missing; add it to the app and run zm login again`);
60
+ checkCancelled(signal);
61
+ const method = options.method ?? "GET";
62
+ let response;
63
+ if (method === "GET")
64
+ response = await this.get(`https://api.zoom.us/v2${path}`, tokens.accessToken, signal);
65
+ else {
66
+ try {
67
+ response = await this.fetcher(`https://api.zoom.us/v2${path}`, {
68
+ method,
69
+ headers: { authorization: `Bearer ${tokens.accessToken}`, "content-type": "application/json" },
70
+ ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),
71
+ redirect: "manual",
72
+ signal,
73
+ });
74
+ }
75
+ catch {
76
+ throw new ZoomError("outcome_unknown", "Zoom mutation did not finish; verify remote state before retrying");
77
+ }
78
+ }
79
+ if (method !== "GET" && signal.aborted)
80
+ throw new ZoomError("outcome_unknown", "Zoom mutation was interrupted after dispatch; verify remote state before retrying");
81
+ if (response.status === 204)
82
+ return {};
83
+ let value;
84
+ try {
85
+ value = await response.json();
86
+ }
87
+ catch {
88
+ if (response.ok)
89
+ throw new ZoomError(method === "GET" ? "invalid_response" : "outcome_unknown", method === "GET"
90
+ ? "Zoom returned an invalid response"
91
+ : "Zoom mutation returned an invalid response; verify remote state before retrying");
92
+ value = {};
93
+ }
94
+ if (method !== "GET" && signal.aborted)
95
+ throw new ZoomError("outcome_unknown", "Zoom mutation was interrupted after dispatch; verify remote state before retrying");
96
+ const body = typeof value === "object" && value !== null && !Array.isArray(value) ? object(value) : {};
97
+ if (body.code === 4711)
98
+ throw new ZoomError("authentication_error", `Zoom scope ${scope} is missing; add it to the app and run zm login again`);
99
+ if (response.status === 404 && missingCode !== undefined && body.code === missingCode)
100
+ return null;
101
+ if (!response.ok || (typeof body.code === "number" && body.code !== 0))
102
+ throw new ZoomError(body.code === 200 ? "permission_error" : statusToCode(response.status), `Zoom request failed (HTTP ${response.status}${typeof body.code === "number" ? `, code ${body.code}` : ""})`);
103
+ try {
104
+ return object(value);
105
+ }
106
+ catch {
107
+ throw new ZoomError(method === "GET" ? "invalid_response" : "outcome_unknown", method === "GET"
108
+ ? "Zoom returned an invalid response"
109
+ : "Zoom mutation returned an invalid response; verify remote state before retrying");
110
+ }
111
+ }
112
+ }
113
+ //# sourceMappingURL=remote-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-http.js","sourceRoot":"","sources":["../src/remote-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAY/D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAoB,EAAe,EAAE,CAAC,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AAC5G,MAAM,OAAO,UAAU;IAEV,MAAM;IACN,OAAO;IACC,OAAO;IAH1B,YACW,MAAoC,EACpC,OAAqB,EACb,OAAO,GAAkB,EAAE;sBAFnC,MAAM;uBACN,OAAO;uBACC,OAAO;IACvB,CAAC;IACJ,KAAK,CAAC,KAAK,CAAC,QAAyB,EAAE,OAAe,EAAE,MAAmB;QACzE,MAAM,KAAK,GAAG,QAAQ;YACpB,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC;YAC9G,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,OAAO,CAAA;QACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,KAAK;YAAE,OAAO,KAAK,CAAA;QAC1D,cAAc,CAAC,MAAM,CAAC,CAAA;QACtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CACzF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAClB,MAAM,CACP,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,MAAoB,EAAE,WAAmB,EAAE,MAAmB,EAAE,KAAK,GAAG,IAAI;QACpF,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,cAAc,CAAC,MAAM,CAAC,CAAA;YACtB,IAAI,QAAkB,CAAA;YACtB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;oBACpC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;oBACnD,QAAQ,EAAE,QAAQ;oBAClB,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,CAAC,MAAM,CAAC,CAAA;gBACtB,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;oBAAE,SAAQ;gBAC/E,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,qCAAqC,CAAC,CAAA;YAC7E,CAAC;YACD,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC9G,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;gBAC7B,SAAQ;YACV,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,OAAO,GAAkB,EAAE;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAqC,CAAA;IAC/E,CAAC;IACD,eAAe,CACb,IAAY,EACZ,KAAa,EACb,WAAmB,EACnB,OAAO,GAAkB,EAAE;QAE3B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;IACxD,CAAC;IACO,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,KAAa,EACb,OAAsB,EACtB,WAAoB;QAEpB,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC9C,cAAc,CAAC,MAAM,CAAC,CAAA;QACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QACzC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,QAAQ,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9F,MAAM,IAAI,SAAS,CACjB,qBAAqB,EACrB,cAAc,KAAK,uDAAuD,CAC3E,CAAA;QACH,cAAc,CAAC,MAAM,CAAC,CAAA;QACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;QACtC,IAAI,QAAkB,CAAA;QACtB,IAAI,MAAM,KAAK,KAAK;YAAE,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;aACvG,CAAC;YACJ,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,yBAAyB,IAAI,EAAE,EAAE;oBAC7D,MAAM;oBACN,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC9F,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7E,QAAQ,EAAE,QAAQ;oBAClB,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,SAAS,CAAC,iBAAiB,EAAE,mEAAmE,CAAC,CAAA;YAC7G,CAAC;QACH,CAAC;QACD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO;YACpC,MAAM,IAAI,SAAS,CACjB,iBAAiB,EACjB,mFAAmF,CACpF,CAAA;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,CAAA;QACtC,IAAI,KAAc,CAAA;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,QAAQ,CAAC,EAAE;gBACb,MAAM,IAAI,SAAS,CACjB,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,EACzD,MAAM,KAAK,KAAK;oBACd,CAAC,CAAC,mCAAmC;oBACrC,CAAC,CAAC,iFAAiF,CACtF,CAAA;YACH,KAAK,GAAG,EAAE,CAAA;QACZ,CAAC;QACD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO;YACpC,MAAM,IAAI,SAAS,CACjB,iBAAiB,EACjB,mFAAmF,CACpF,CAAA;QACH,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACtG,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YACpB,MAAM,IAAI,SAAS,CACjB,sBAAsB,EACtB,cAAc,KAAK,uDAAuD,CAC3E,CAAA;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAA;QAClG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;YACpE,MAAM,IAAI,SAAS,CACjB,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EACtE,6BAA6B,QAAQ,CAAC,MAAM,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAC7G,CAAA;QACH,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,SAAS,CACjB,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,EACzD,MAAM,KAAK,KAAK;gBACd,CAAC,CAAC,mCAAmC;gBACrC,CAAC,CAAC,iFAAiF,CACtF,CAAA;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ import { type RemoteOptions, ZoomRemote } from "./remote-http.js";
2
+ import type { TokenManager } from "./tokens.js";
3
+ export interface RemoteMeeting {
4
+ id: string;
5
+ uuid: string | null;
6
+ title: string | null;
7
+ type: number | null;
8
+ startedAt: string | null;
9
+ durationMinutes: number | null;
10
+ timezone: string | null;
11
+ agenda: string | null;
12
+ joinUrl: string | null;
13
+ }
14
+ export interface MeetingChange {
15
+ topic?: string;
16
+ startTime?: string;
17
+ durationMinutes?: number;
18
+ timezone?: string;
19
+ agenda?: string;
20
+ type?: 1 | 2;
21
+ }
22
+ export interface MutationOptions {
23
+ apply?: boolean;
24
+ dryRun?: boolean;
25
+ signal?: AbortSignal;
26
+ occurrenceId?: string;
27
+ }
28
+ export interface MeetingMutation {
29
+ action: "create" | "update" | "cancel";
30
+ applied: boolean;
31
+ request: {
32
+ method: "POST" | "PATCH" | "DELETE";
33
+ path: string;
34
+ body?: Record<string, unknown>;
35
+ };
36
+ meeting?: RemoteMeeting;
37
+ }
38
+ export declare class ZoomRemoteMeetings {
39
+ readonly remote: ZoomRemote;
40
+ constructor(tokens: Pick<TokenManager, "tokens">, fetcher: typeof fetch, options?: RemoteOptions);
41
+ list(options?: {
42
+ signal?: AbortSignal;
43
+ }): Promise<RemoteMeeting[]>;
44
+ show(id: string, options?: {
45
+ signal?: AbortSignal;
46
+ }): Promise<RemoteMeeting>;
47
+ invitation(id: string, options?: {
48
+ signal?: AbortSignal;
49
+ }): Promise<{
50
+ id: string;
51
+ invitation: string;
52
+ }>;
53
+ private mutate;
54
+ create(change: MeetingChange, options?: MutationOptions): Promise<MeetingMutation>;
55
+ update(id: string, change: MeetingChange, options?: MutationOptions): Promise<MeetingMutation>;
56
+ cancel(id: string, options?: MutationOptions): Promise<MeetingMutation>;
57
+ }
58
+ //# sourceMappingURL=remote-meetings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-meetings.d.ts","sourceRoot":"","sources":["../src/remote-meetings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,aAAa,EAAsB,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACtG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AACD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CACb;AACD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AACD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;IAC9F,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB;AA+ED,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,YAAY,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,OAAO,GAAE,aAAkB,EAEnG;IACK,IAAI,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAmB3E;IACK,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAErF;IACK,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAGhH;YACa,MAAM;IA2BpB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAOrF;IACD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAOjG;IACD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAM1E;CACF"}
@@ -0,0 +1,151 @@
1
+ import { object, string, ZoomError } from "./errors.js";
2
+ import { required } from "./recordings.js";
3
+ import { operationSignal, ZoomRemote } from "./remote-http.js";
4
+ const idPath = (id) => {
5
+ if (!/^[1-9]\d*$/.test(id))
6
+ throw new ZoomError("validation_error", "remote meeting id must be a positive numeric id");
7
+ return `/meetings/${id}`;
8
+ };
9
+ const normalized = (value) => {
10
+ const row = object(value);
11
+ const id = typeof row.id === "number" && Number.isSafeInteger(row.id) ? String(row.id) : required(row.id);
12
+ idPath(id);
13
+ return {
14
+ id,
15
+ uuid: string(row.uuid),
16
+ title: string(row.topic),
17
+ type: typeof row.type === "number" ? row.type : null,
18
+ startedAt: string(row.start_time),
19
+ durationMinutes: typeof row.duration === "number" && Number.isFinite(row.duration) && row.duration >= 0 ? row.duration : null,
20
+ timezone: string(row.timezone),
21
+ agenda: string(row.agenda),
22
+ joinUrl: string(row.join_url),
23
+ };
24
+ };
25
+ const changeBody = (change, create) => {
26
+ if (!change ||
27
+ Object.keys(change).some((key) => !["topic", "startTime", "durationMinutes", "timezone", "agenda", "type"].includes(key)))
28
+ throw new ZoomError("validation_error", "unsupported meeting change field");
29
+ const body = {};
30
+ if (change.topic !== undefined) {
31
+ if (!string(change.topic))
32
+ throw new ZoomError("validation_error", "meeting topic must be nonempty");
33
+ body.topic = change.topic;
34
+ }
35
+ if (create && !string(change.topic))
36
+ throw new ZoomError("validation_error", "meeting topic is required");
37
+ if (change.startTime !== undefined) {
38
+ if (typeof change.startTime !== "string" ||
39
+ !/T.+(?:Z|[+-]\d{2}:\d{2})$/i.test(change.startTime) ||
40
+ !Number.isFinite(Date.parse(change.startTime)))
41
+ throw new ZoomError("validation_error", "meeting start must be an ISO timestamp with a timezone");
42
+ const date = change.startTime.slice(0, 10);
43
+ const dateInstant = Date.parse(`${date}T00:00:00Z`);
44
+ if (!Number.isFinite(dateInstant) || new Date(dateInstant).toISOString().slice(0, 10) !== date)
45
+ throw new ZoomError("validation_error", "meeting start contains an invalid calendar date");
46
+ body.start_time = new Date(change.startTime).toISOString();
47
+ }
48
+ if (change.durationMinutes !== undefined) {
49
+ if (!Number.isSafeInteger(change.durationMinutes) || change.durationMinutes <= 0 || change.durationMinutes > 1440)
50
+ throw new ZoomError("validation_error", "meeting duration must be an integer from 1 to 1440 minutes");
51
+ body.duration = change.durationMinutes;
52
+ }
53
+ if (change.timezone !== undefined) {
54
+ try {
55
+ new Intl.DateTimeFormat("en", { timeZone: change.timezone }).format();
56
+ }
57
+ catch {
58
+ throw new ZoomError("validation_error", "meeting timezone must be a valid IANA timezone");
59
+ }
60
+ body.timezone = change.timezone;
61
+ }
62
+ if (change.agenda !== undefined) {
63
+ if (typeof change.agenda !== "string")
64
+ throw new ZoomError("validation_error", "meeting agenda must be text");
65
+ body.agenda = change.agenda;
66
+ }
67
+ if (change.type !== undefined && change.type !== 1 && change.type !== 2)
68
+ throw new ZoomError("validation_error", "only instant or scheduled meeting types are supported");
69
+ if (create) {
70
+ body.type = change.type ?? 2;
71
+ if (body.type === 2 && body.start_time === undefined)
72
+ throw new ZoomError("validation_error", "scheduled meeting start is required");
73
+ }
74
+ else {
75
+ if (change.type !== undefined)
76
+ body.type = change.type;
77
+ if (Object.keys(body).length === 0)
78
+ throw new ZoomError("validation_error", "at least one meeting change is required");
79
+ }
80
+ return body;
81
+ };
82
+ export class ZoomRemoteMeetings {
83
+ remote;
84
+ constructor(tokens, fetcher, options = {}) {
85
+ this.remote = new ZoomRemote(tokens, fetcher, options);
86
+ }
87
+ async list(options = {}) {
88
+ const signal = operationSignal(options.signal);
89
+ const query = new URLSearchParams({ type: "upcoming", page_size: "100" });
90
+ const seen = new Set();
91
+ const result = new Map();
92
+ for (;;) {
93
+ const body = await this.remote.request(`/users/me/meetings?${query}`, "meeting:read:list_meetings", { signal });
94
+ if (!Array.isArray(body.meetings))
95
+ throw new ZoomError("invalid_response", "Zoom returned an invalid meeting list");
96
+ for (const row of body.meetings) {
97
+ const item = normalized(row);
98
+ result.set(item.id, item);
99
+ }
100
+ const next = string(body.next_page_token);
101
+ if (!next)
102
+ return [...result.values()];
103
+ if (seen.has(next))
104
+ throw new ZoomError("invalid_response", "Zoom repeated a pagination token");
105
+ seen.add(next);
106
+ query.set("next_page_token", next);
107
+ }
108
+ }
109
+ async show(id, options = {}) {
110
+ return normalized(await this.remote.request(idPath(id), "meeting:read:meeting", options));
111
+ }
112
+ async invitation(id, options = {}) {
113
+ const body = await this.remote.request(`${idPath(id)}/invitation`, "meeting:read:invitation", options);
114
+ return { id, invitation: required(body.invitation) };
115
+ }
116
+ async mutate(action, request, scope, options) {
117
+ const result = { action, applied: false, request };
118
+ if (!options.apply || options.dryRun)
119
+ return result;
120
+ const init = {
121
+ method: request.method,
122
+ ...(request.body ? { body: request.body } : {}),
123
+ ...(options.signal ? { signal: options.signal } : {}),
124
+ };
125
+ const body = await this.remote.request(request.path, scope, init);
126
+ result.applied = true;
127
+ if (action === "create") {
128
+ try {
129
+ result.meeting = normalized(body);
130
+ }
131
+ catch {
132
+ throw new ZoomError("outcome_unknown", "Zoom mutation returned incomplete meeting details; verify remote state before retrying");
133
+ }
134
+ }
135
+ return result;
136
+ }
137
+ create(change, options = {}) {
138
+ return this.mutate("create", { method: "POST", path: "/users/me/meetings", body: changeBody(change, true) }, "meeting:write:meeting", options);
139
+ }
140
+ update(id, change, options = {}) {
141
+ return this.mutate("update", { method: "PATCH", path: idPath(id), body: changeBody(change, false) }, "meeting:update:meeting", options);
142
+ }
143
+ cancel(id, options = {}) {
144
+ const path = idPath(id);
145
+ if (options.occurrenceId !== undefined && !string(options.occurrenceId))
146
+ throw new ZoomError("validation_error", "occurrence id must be nonempty");
147
+ const query = options.occurrenceId ? `?${new URLSearchParams({ occurrence_id: options.occurrenceId })}` : "";
148
+ return this.mutate("cancel", { method: "DELETE", path: `${path}${query}` }, "meeting:delete:meeting", options);
149
+ }
150
+ }
151
+ //# sourceMappingURL=remote-meetings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-meetings.js","sourceRoot":"","sources":["../src/remote-meetings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MessageStore, StoreOptions } from "@wirecat/cli-messaging/store";
2
+ import type { StoreConnection, StoreConnectRequest } from "./program.js";
3
+ type SharedMeetingStore = Pick<MessageStore, "meetings" | "saveAccount" | "storedAccount" | "close">;
4
+ export interface StoreConnectionOptions extends StoreOptions {
5
+ openStore?: (options: StoreOptions) => Promise<SharedMeetingStore>;
6
+ }
7
+ export declare const createStoreConnector: (options?: StoreConnectionOptions) => (request: StoreConnectRequest) => Promise<StoreConnection>;
8
+ export {};
9
+ //# sourceMappingURL=store-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-connection.d.ts","sourceRoot":"","sources":["../src/store-connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG9E,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAExE,KAAK,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,aAAa,GAAG,eAAe,GAAG,OAAO,CAAC,CAAA;AACpG,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACnE;AAED,eAAO,MAAM,oBAAoB,aACrB,sBAAsB,eAChB,mBAAmB,KAAG,OAAO,CAAC,eAAe,CAwC5D,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { CliError } from "@wirecat/cli-core";
2
+ import { profileAccountKey } from "./config.js";
3
+ import { ZoomError } from "./errors.js";
4
+ export const createStoreConnector = (options = {}) => async (request) => {
5
+ if (typeof request?.profile !== "string" ||
6
+ !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(request.profile) ||
7
+ request.externalId !== profileAccountKey(request.profile) ||
8
+ (request.intent !== "read" && request.intent !== "ingestion"))
9
+ throw new ZoomError("validation_error", "expected a selected Zoom profile and read or ingestion intent");
10
+ let store;
11
+ try {
12
+ const open = options.openStore ?? (await import("@wirecat/cli-messaging/store")).openStore;
13
+ store = await open({ path: options.path, env: options.env, now: options.now });
14
+ const key = { provider: "zoom", account: request.externalId };
15
+ const accountId = request.intent === "ingestion"
16
+ ? await store.saveAccount(key, { name: request.profile })
17
+ : (await store.storedAccount(key)).id;
18
+ if (!Number.isSafeInteger(accountId) || accountId < 1)
19
+ throw new ZoomError("configuration_error", "the selected meeting account is unavailable");
20
+ const connected = store;
21
+ return { store: connected.meetings, accountId, close: () => connected.close() };
22
+ }
23
+ catch (error) {
24
+ if (store) {
25
+ try {
26
+ await store.close();
27
+ }
28
+ catch {
29
+ /* Preserve the setup failure. */
30
+ }
31
+ }
32
+ if (error instanceof ZoomError)
33
+ throw error;
34
+ if (error instanceof CliError && error.code === "not_found")
35
+ throw new ZoomError("configuration_error", "no stored meetings for the selected profile; import transcripts or pull first");
36
+ throw new ZoomError("configuration_error", "could not connect to the shared meeting store; check MESSAGING_STORE and the installed store version");
37
+ }
38
+ };
39
+ //# sourceMappingURL=store-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-connection.js","sourceRoot":"","sources":["../src/store-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAQvC,MAAM,CAAC,MAAM,oBAAoB,GAC/B,CAAC,OAAO,GAA2B,EAAE,EAAE,EAAE,CACzC,KAAK,EAAE,OAA4B,EAA4B,EAAE;IAC/D,IACE,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ;QACpC,CAAC,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1D,OAAO,CAAC,UAAU,KAAK,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC;QACzD,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC;QAE7D,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,+DAA+D,CAAC,CAAA;IAC1G,IAAI,KAAqC,CAAA;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1F,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC9E,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,CAAA;QAC7D,MAAM,SAAS,GACb,OAAO,CAAC,MAAM,KAAK,WAAW;YAC5B,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YACzD,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QACzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;YACnD,MAAM,IAAI,SAAS,CAAC,qBAAqB,EAAE,6CAA6C,CAAC,CAAA;QAC3F,MAAM,SAAS,GAAG,KAAK,CAAA;QACvB,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAA;IACjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,iCAAiC;YACnC,CAAC;QACH,CAAC;QACD,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,KAAK,CAAA;QAC3C,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YACzD,MAAM,IAAI,SAAS,CACjB,qBAAqB,EACrB,+EAA+E,CAChF,CAAA;QACH,MAAM,IAAI,SAAS,CACjB,qBAAqB,EACrB,sGAAsG,CACvG,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}