@wirecat/zoom-cli 0.34.0 → 0.36.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.
- package/README.md +51 -53
- package/dist/answers.d.ts +1 -1
- package/dist/answers.d.ts.map +1 -1
- package/dist/archive-commands.d.ts.map +1 -1
- package/dist/archive-commands.js +6 -6
- package/dist/archive-commands.js.map +1 -1
- package/dist/bin/main.js +12 -13
- package/dist/bin/main.js.map +1 -1
- package/dist/commands.d.ts +2 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +18 -5
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +14 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +37 -8
- package/dist/config.js.map +1 -1
- package/dist/context-sources.js +1 -1
- package/dist/context-sources.js.map +1 -1
- package/dist/errors.d.ts +3 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -1
- package/dist/first-screen.d.ts.map +1 -1
- package/dist/first-screen.js +1 -2
- package/dist/first-screen.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/local-transcription-commands.js +2 -2
- package/dist/local-transcription-commands.js.map +1 -1
- package/dist/local-transcription.d.ts.map +1 -1
- package/dist/local-transcription.js +41 -17
- package/dist/local-transcription.js.map +1 -1
- package/dist/mcp-command.d.ts +20 -0
- package/dist/mcp-command.d.ts.map +1 -0
- package/dist/mcp-command.js +50 -0
- package/dist/mcp-command.js.map +1 -0
- package/dist/mcp.d.ts +28 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +107 -0
- package/dist/mcp.js.map +1 -0
- package/dist/media-decode.d.ts +14 -0
- package/dist/media-decode.d.ts.map +1 -0
- package/dist/media-decode.js +61 -0
- package/dist/media-decode.js.map +1 -0
- package/dist/meeting-inventory.d.ts +1 -2
- package/dist/meeting-inventory.d.ts.map +1 -1
- package/dist/meeting-inventory.js +1 -5
- package/dist/meeting-inventory.js.map +1 -1
- package/dist/meeting-search-commands.d.ts +1 -1
- package/dist/meeting-search-commands.d.ts.map +1 -1
- package/dist/meeting-search-commands.js +42 -29
- package/dist/meeting-search-commands.js.map +1 -1
- package/dist/meeting-semantic-commands.d.ts +6 -2
- package/dist/meeting-semantic-commands.d.ts.map +1 -1
- package/dist/meeting-semantic-commands.js +1 -2
- package/dist/meeting-semantic-commands.js.map +1 -1
- package/dist/meeting-semantic.d.ts +5 -3
- package/dist/meeting-semantic.d.ts.map +1 -1
- package/dist/meeting-semantic.js +18 -13
- package/dist/meeting-semantic.js.map +1 -1
- package/dist/meeting-stats-commands.d.ts +15 -0
- package/dist/meeting-stats-commands.d.ts.map +1 -0
- package/dist/meeting-stats-commands.js +88 -0
- package/dist/meeting-stats-commands.js.map +1 -0
- package/dist/models-commands.d.ts +12 -0
- package/dist/models-commands.d.ts.map +1 -0
- package/dist/models-commands.js +71 -0
- package/dist/models-commands.js.map +1 -0
- package/dist/permissions.d.ts +26 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +95 -0
- package/dist/permissions.js.map +1 -0
- package/dist/profile-word.d.ts +23 -0
- package/dist/profile-word.d.ts.map +1 -0
- package/dist/profile-word.js +68 -0
- package/dist/profile-word.js.map +1 -0
- package/dist/profile.d.ts +12 -0
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +30 -0
- package/dist/profile.js.map +1 -1
- package/dist/program.d.ts +4 -2
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +34 -36
- package/dist/program.js.map +1 -1
- package/dist/read-only.d.ts +1 -0
- package/dist/read-only.d.ts.map +1 -1
- package/dist/read-only.js +5 -7
- package/dist/read-only.js.map +1 -1
- package/dist/recording-schedule-setup.d.ts +2 -1
- package/dist/recording-schedule-setup.d.ts.map +1 -1
- package/dist/recording-schedule-setup.js +8 -5
- package/dist/recording-schedule-setup.js.map +1 -1
- package/dist/recording-schedule-systemd.d.ts.map +1 -1
- package/dist/recording-schedule-systemd.js +1 -0
- package/dist/recording-schedule-systemd.js.map +1 -1
- package/dist/remote-http.js +2 -2
- package/dist/remote-http.js.map +1 -1
- package/dist/setup-commands.d.ts +3 -1
- package/dist/setup-commands.d.ts.map +1 -1
- package/dist/setup-commands.js +26 -16
- package/dist/setup-commands.js.map +1 -1
- package/dist/store-commands.d.ts.map +1 -1
- package/dist/store-commands.js +11 -0
- package/dist/store-commands.js.map +1 -1
- package/dist/store-connection.d.ts +2 -0
- package/dist/store-connection.d.ts.map +1 -1
- package/dist/store-connection.js +6 -2
- package/dist/store-connection.js.map +1 -1
- package/dist/tokens.d.ts +11 -3
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +70 -23
- package/dist/tokens.js.map +1 -1
- package/dist/upgrade.d.ts +7 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +34 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/watch-service.d.ts +2 -1
- package/dist/watch-service.d.ts.map +1 -1
- package/dist/watch-service.js +3 -3
- package/dist/watch-service.js.map +1 -1
- package/package.json +4 -3
- package/skills/zoom-cli/SKILL.md +16 -16
- package/dist/mcp-server.d.ts +0 -9
- package/dist/mcp-server.d.ts.map +0 -1
- package/dist/mcp-server.js +0 -435
- package/dist/mcp-server.js.map +0 -1
- package/dist/meeting-inventory-mcp.d.ts +0 -194
- package/dist/meeting-inventory-mcp.d.ts.map +0 -1
- package/dist/meeting-inventory-mcp.js +0 -12
- package/dist/meeting-inventory-mcp.js.map +0 -1
- package/dist/meeting-mcp-command.d.ts +0 -24
- package/dist/meeting-mcp-command.d.ts.map +0 -1
- package/dist/meeting-mcp-command.js +0 -52
- package/dist/meeting-mcp-command.js.map +0 -1
- package/dist/meeting-mcp-options.d.ts +0 -26
- package/dist/meeting-mcp-options.d.ts.map +0 -1
- package/dist/meeting-mcp-options.js +0 -2
- package/dist/meeting-mcp-options.js.map +0 -1
- package/dist/meeting-preparation-mcp.d.ts +0 -563
- package/dist/meeting-preparation-mcp.d.ts.map +0 -1
- package/dist/meeting-preparation-mcp.js +0 -42
- package/dist/meeting-preparation-mcp.js.map +0 -1
- package/dist/meeting-project-candidates-mcp.d.ts +0 -230
- package/dist/meeting-project-candidates-mcp.d.ts.map +0 -1
- package/dist/meeting-project-candidates-mcp.js +0 -16
- package/dist/meeting-project-candidates-mcp.js.map +0 -1
- package/dist/meeting-project-evidence-mcp.d.ts +0 -152
- package/dist/meeting-project-evidence-mcp.d.ts.map +0 -1
- package/dist/meeting-project-evidence-mcp.js +0 -38
- package/dist/meeting-project-evidence-mcp.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meeting-semantic.js","sourceRoot":"","sources":["../src/meeting-semantic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAKL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,gCAAgC,CAAA;AAWvC,MAAM,YAAY,GAAG,KAAK,IAAkC,EAAE,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAA;AACnG,qFAAqF;AACrF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,
|
|
1
|
+
{"version":3,"file":"meeting-semantic.js","sourceRoot":"","sources":["../src/meeting-semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Body } from "@wirecat/cli-core/cli";
|
|
2
|
+
import type { MeetingStats } from "@wirecat/cli-core/meetings";
|
|
3
|
+
import type { MeetingStatsRequest } from "@wirecat/cli-core/services";
|
|
4
|
+
import type { Command } from "commander";
|
|
5
|
+
export type MeetingStatsRead = (request: Omit<MeetingStatsRequest, "accountId">) => Promise<MeetingStats>;
|
|
6
|
+
/**
|
|
7
|
+
* `stats meetings show|top`: how much was said, by whom, and in which weeks, over the meetings search would read.
|
|
8
|
+
* Numbers only; no transcript text is read or shown.
|
|
9
|
+
*/
|
|
10
|
+
export declare const addMeetingStatsCommands: (program: Command, deps: {
|
|
11
|
+
read: () => Promise<MeetingStatsRead>;
|
|
12
|
+
signal: () => AbortSignal | undefined;
|
|
13
|
+
output: (body: Body) => void;
|
|
14
|
+
}) => void;
|
|
15
|
+
//# sourceMappingURL=meeting-stats-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-stats-commands.d.ts","sourceRoot":"","sources":["../src/meeting-stats-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAsD,MAAM,uBAAuB,CAAA;AACrG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcxC,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;AA0CzG;;;GAGG;AACH,eAAO,MAAM,uBAAuB,YACzB,OAAO,QACV;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;CAAE,KACnH,IAqDF,CAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
2
|
+
import { dateWindow, itemOf, LOCAL_READ, listOf, NO_EFFECTS } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { bytes } from "./execution.js";
|
|
4
|
+
const filters = (command) => command
|
|
5
|
+
.option("--since-time <time>", "meetings starting at or after this date or time (ISO 8601, or 30d ago)")
|
|
6
|
+
.option("--until-time <time>", "meetings starting at or before this date or time; a date alone is that whole day")
|
|
7
|
+
.option("--timezone <zone>", "the IANA zone dates and weeks are read in (default: this computer's)")
|
|
8
|
+
.option("--event-id <id>", "only meetings linked to this stored event", bytes)
|
|
9
|
+
.option("--project <name>", "meetings confirmed in this project, by name, key or alias")
|
|
10
|
+
.option("--topic <name>", "meetings with this topic, by name or alias")
|
|
11
|
+
.option("--max-rows <n>", "most transcript lines to read (default and at most 500000)", bytes);
|
|
12
|
+
const requestOf = (flags, signal) => {
|
|
13
|
+
const zone = flags.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
14
|
+
const window = dateWindow({ sinceTime: flags.sinceTime, untilTime: flags.untilTime, zone });
|
|
15
|
+
return {
|
|
16
|
+
request: {
|
|
17
|
+
...(flags.eventId === undefined ? {} : { eventId: flags.eventId }),
|
|
18
|
+
...(flags.project === undefined ? {} : { project: flags.project }),
|
|
19
|
+
...(flags.topic === undefined ? {} : { topic: flags.topic }),
|
|
20
|
+
...(window.since === undefined ? {} : { since: window.since }),
|
|
21
|
+
...(window.until === undefined ? {} : { until: window.until }),
|
|
22
|
+
...(flags.maxRows === undefined ? {} : { maxRows: flags.maxRows }),
|
|
23
|
+
timeZone: zone,
|
|
24
|
+
...(signal ? { signal } : {}),
|
|
25
|
+
},
|
|
26
|
+
meta: { ...window.meta, timezone: zone },
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
const speaker = (one) => ({
|
|
30
|
+
key: one.key,
|
|
31
|
+
name: one.name,
|
|
32
|
+
person_id: one.personId,
|
|
33
|
+
identity_id: one.identityId,
|
|
34
|
+
meetings: one.meetings,
|
|
35
|
+
lines: one.lines,
|
|
36
|
+
words: one.words,
|
|
37
|
+
talk_ms: one.talkMs,
|
|
38
|
+
share: one.share,
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* `stats meetings show|top`: how much was said, by whom, and in which weeks, over the meetings search would read.
|
|
42
|
+
* Numbers only; no transcript text is read or shown.
|
|
43
|
+
*/
|
|
44
|
+
export const addMeetingStatsCommands = (program, deps) => {
|
|
45
|
+
const stats = program.commands.find((command) => command.name() === "stats") ??
|
|
46
|
+
annotate(program.command("stats"), { effects: NO_EFFECTS }).description("numbers about the stored meetings");
|
|
47
|
+
const meetings = annotate(stats.command("meetings"), { effects: NO_EFFECTS }).description("talk time, lines and words, by speaker and by week");
|
|
48
|
+
annotate(filters(meetings.command("show")), {
|
|
49
|
+
effects: LOCAL_READ,
|
|
50
|
+
examples: ["zm personal stats meetings show --since-time 30d --json"],
|
|
51
|
+
})
|
|
52
|
+
.description("meetings, lines, words and talk time by week, with the top speakers")
|
|
53
|
+
.action(async (flags) => {
|
|
54
|
+
const { request, meta } = requestOf(flags, deps.signal());
|
|
55
|
+
const found = await (await deps.read())(request);
|
|
56
|
+
deps.output(itemOf({
|
|
57
|
+
time_zone: found.timeZone,
|
|
58
|
+
meetings: found.meetings,
|
|
59
|
+
lines: found.lines,
|
|
60
|
+
words: found.words,
|
|
61
|
+
talk_ms: found.talkMs,
|
|
62
|
+
weeks: found.weeks.map((week) => ({
|
|
63
|
+
week_start: week.weekStart,
|
|
64
|
+
meetings: week.meetings,
|
|
65
|
+
talk_ms: week.talkMs,
|
|
66
|
+
})),
|
|
67
|
+
top_speakers: found.speakers.slice(0, 10).map(speaker),
|
|
68
|
+
}, { meta }));
|
|
69
|
+
});
|
|
70
|
+
annotate(filters(meetings.command("top")), {
|
|
71
|
+
effects: LOCAL_READ,
|
|
72
|
+
examples: ["zm personal stats meetings top --project RES --limit 5 --json"],
|
|
73
|
+
})
|
|
74
|
+
.description("speakers by talk time: lines, words, meetings and their share of the talk")
|
|
75
|
+
.option("--limit <n>", "how many speakers (default 20)", bytes)
|
|
76
|
+
.action(async (flags) => {
|
|
77
|
+
const { request, meta } = requestOf(flags, deps.signal());
|
|
78
|
+
const found = await (await deps.read())(request);
|
|
79
|
+
const limit = flags.limit ?? 20;
|
|
80
|
+
deps.output(listOf("stats meetings top", {
|
|
81
|
+
items: found.speakers.slice(0, limit).map(speaker),
|
|
82
|
+
limit,
|
|
83
|
+
has_more: found.speakers.length > limit,
|
|
84
|
+
meta,
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=meeting-stats-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-stats-commands.js","sourceRoot":"","sources":["../src/meeting-stats-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Body } from "@wirecat/cli-core/cli";
|
|
2
|
+
import type { Command } from "commander";
|
|
3
|
+
/**
|
|
4
|
+
* `models audio list|download`: the speech models `meetings transcribe` runs, in the folder every WireCat CLI shares,
|
|
5
|
+
* so a model downloaded by tg serves zm too. Downloading is the owner's command; transcription never downloads.
|
|
6
|
+
*/
|
|
7
|
+
export declare const addModelsCommands: (program: Command, deps: {
|
|
8
|
+
env: () => NodeJS.ProcessEnv;
|
|
9
|
+
output: (body: Body) => void;
|
|
10
|
+
diagnostic: (text: string) => void;
|
|
11
|
+
}) => void;
|
|
12
|
+
//# sourceMappingURL=models-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-commands.d.ts","sourceRoot":"","sources":["../src/models-commands.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAiD,MAAM,uBAAuB,CAAA;AAchG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmCxC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YACnB,OAAO,QACV;IAAE,GAAG,EAAE,MAAM,MAAM,CAAC,UAAU,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,KACvG,IAgCF,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { createReadStream, existsSync } from "node:fs";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
6
|
+
import { FETCH, itemOf, LOCAL_READ, listOf, NO_EFFECTS } from "@wirecat/cli-core/cli";
|
|
7
|
+
import { install, installedBytes, isInstalled, MODELS, megabytes, modelPath, modelsDirectory, speechModel, VAD, vadPath, } from "@wirecat/cli-core/speech";
|
|
8
|
+
const itemOfModel = (model, directory) => ({
|
|
9
|
+
id: model.id,
|
|
10
|
+
kind: "audio",
|
|
11
|
+
title: model.title,
|
|
12
|
+
languages: model.languages,
|
|
13
|
+
sizeBytes: installedBytes(model),
|
|
14
|
+
downloaded: isInstalled(model, directory),
|
|
15
|
+
path: join(directory, model.id),
|
|
16
|
+
});
|
|
17
|
+
const sha256 = (path) => new Promise((resolve) => {
|
|
18
|
+
const hash = createHash("sha256");
|
|
19
|
+
createReadStream(path)
|
|
20
|
+
.on("data", (chunk) => hash.update(chunk))
|
|
21
|
+
.on("end", () => resolve(hash.digest("hex")))
|
|
22
|
+
.on("error", () => resolve(null));
|
|
23
|
+
});
|
|
24
|
+
/** A file of the right size can still be another version or broken, so its hash decides; a wrong one goes. */
|
|
25
|
+
const removeMismatched = async (model, directory) => {
|
|
26
|
+
const path = modelPath(directory, model);
|
|
27
|
+
const files = [...model.files.map((file) => [file.sha256, path(file.name)]), [VAD.sha256, vadPath(directory)]];
|
|
28
|
+
const removed = [];
|
|
29
|
+
for (const [expected, file] of files) {
|
|
30
|
+
const actual = await sha256(file);
|
|
31
|
+
if (actual === null || actual === expected)
|
|
32
|
+
continue;
|
|
33
|
+
await rm(file, { force: true });
|
|
34
|
+
removed.push(file);
|
|
35
|
+
}
|
|
36
|
+
return removed;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* `models audio list|download`: the speech models `meetings transcribe` runs, in the folder every WireCat CLI shares,
|
|
40
|
+
* so a model downloaded by tg serves zm too. Downloading is the owner's command; transcription never downloads.
|
|
41
|
+
*/
|
|
42
|
+
export const addModelsCommands = (program, deps) => {
|
|
43
|
+
const models = annotate(program.command("models"), { effects: NO_EFFECTS }).description("models that run on this machine");
|
|
44
|
+
const audio = annotate(models.command("audio"), { effects: NO_EFFECTS }).description("speech models for `meetings transcribe`");
|
|
45
|
+
annotate(audio.command("list"), { effects: LOCAL_READ, examples: ["zm models audio list --json"] })
|
|
46
|
+
.description("the speech models this version knows, and which are downloaded")
|
|
47
|
+
.action(() => {
|
|
48
|
+
const directory = modelsDirectory(deps.env());
|
|
49
|
+
const items = MODELS.map((model) => itemOfModel(model, directory));
|
|
50
|
+
deps.output(listOf("models audio list", { items, limit: Math.max(1, items.length), has_more: false }));
|
|
51
|
+
});
|
|
52
|
+
annotate(audio.command("download"), { effects: FETCH, examples: ["zm models audio download parakeet-v3 --json"] })
|
|
53
|
+
.argument("<model>", "a model id from `models audio list`")
|
|
54
|
+
.description("download a speech model, or repair one, checking every file's sha256")
|
|
55
|
+
.action(async (id) => {
|
|
56
|
+
const model = speechModel(id);
|
|
57
|
+
const directory = modelsDirectory(deps.env());
|
|
58
|
+
for (const file of await removeMismatched(model, directory))
|
|
59
|
+
deps.diagnostic(`${file}: not the file this version expects, downloading it again\n`);
|
|
60
|
+
if (!isInstalled(model, directory)) {
|
|
61
|
+
const path = modelPath(directory, model);
|
|
62
|
+
const missing = [...model.files.map((file) => [file.bytes, path(file.name)]), [VAD.bytes, vadPath(directory)]]
|
|
63
|
+
.filter(([, file]) => !existsSync(file))
|
|
64
|
+
.reduce((sum, [bytes]) => sum + bytes, 0);
|
|
65
|
+
deps.diagnostic(`${model.id}: ${megabytes(missing)} to download\n`);
|
|
66
|
+
await install(model, directory, { progress: (line) => deps.diagnostic(`${line}\n`) });
|
|
67
|
+
}
|
|
68
|
+
deps.output(itemOf(itemOfModel(model, directory)));
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=models-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-commands.js","sourceRoot":"","sources":["../src/models-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAa,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAChG,OAAO,EACL,OAAO,EACP,cAAc,EACd,WAAW,EACX,MAAM,EACN,SAAS,EACT,SAAS,EACT,eAAe,EAEf,WAAW,EACX,GAAG,EACH,OAAO,GACR,MAAM,0BAA0B,CAAA;AAGjC,MAAM,WAAW,GAAG,CAAC,KAAkB,EAAE,SAAiB,EAAE,EAAE,CAAC,CAAC;IAC9D,EAAE,EAAE,KAAK,CAAC,EAAE;IACZ,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,SAAS,EAAE,KAAK,CAAC,SAAS;IAC1B,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC;IAChC,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;IACzC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;CAChC,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAA0B,EAAE,CACtD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjC,gBAAgB,CAAC,IAAI,CAAC;SACnB,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACzC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;SAC5C,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AACrC,CAAC,CAAC,CAAA;AAEJ,8GAA8G;AAC9G,MAAM,gBAAgB,GAAG,KAAK,EAAE,KAAkB,EAAE,SAAiB,EAAqB,EAAE;IAC1F,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACxC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC9G,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,KAA2B,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,QAAQ;YAAE,SAAQ;QACpD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAgB,EAChB,IAAwG,EAClG,EAAE;IACR,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,CACrF,iCAAiC,CAClC,CAAA;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,CAClF,yCAAyC,CAC1C,CAAA;IACD,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC;SAChG,WAAW,CAAC,gEAAgE,CAAC;SAC7E,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;QAClE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACxG,CAAC,CAAC,CAAA;IACJ,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,6CAA6C,CAAC,EAAE,CAAC;SAC/G,QAAQ,CAAC,SAAS,EAAE,qCAAqC,CAAC;SAC1D,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;QAC7B,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,6DAA6D,CAAC,CAAA;QACvF,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACxC,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;iBAC3G,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAc,CAAC,CAAC;iBACjD,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAI,KAAgB,EAAE,CAAC,CAAC,CAAA;YACvD,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;YACnE,MAAM,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Level } from "@wirecat/cli-core/sends";
|
|
2
|
+
import type { Command } from "commander";
|
|
3
|
+
import type { ZoomConfig } from "./config.js";
|
|
4
|
+
/** A change to Zoom asks first. A built-in default only tightens what the owner set (WC-PERM-7). */
|
|
5
|
+
export declare const DEFAULT_PERMISSIONS: Readonly<Record<string, Level>>;
|
|
6
|
+
/** The command's path, dotted — `remote-meetings.cancel` — or null for housekeeping. */
|
|
7
|
+
export declare const permissionKeyOf: (command: Command) => string | null;
|
|
8
|
+
/** Every key a permission may name: each command's path and every group above it. */
|
|
9
|
+
export declare const permissionKeys: (program: Command) => Set<string>;
|
|
10
|
+
export declare const parsePermissions: (value: string, known: ReadonlySet<string>) => Record<string, Level>;
|
|
11
|
+
export interface PermissionContext {
|
|
12
|
+
/** Undefined when no profile is named: only the built-in defaults apply, and a command that needs one says so. */
|
|
13
|
+
profile: () => string | undefined;
|
|
14
|
+
config: () => Pick<ZoomConfig, "permissions">;
|
|
15
|
+
/** A y/N question at a terminal; absent without one or with --no-input. */
|
|
16
|
+
confirm?: (question: string) => Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Checks a command against its profile's permissions before anything connects. `deny` stops it; `readonly` stops it
|
|
20
|
+
* when it changes something, as `ZM_READ_ONLY` would; `ask` before a change to Zoom wants `--yes` or a yes at the
|
|
21
|
+
* terminal, and `allow` applies it without one. A flag only answers `ask` (WC-PERM-10). `--dry-run` previews.
|
|
22
|
+
*/
|
|
23
|
+
export declare const checkPermission: (command: Command, context: PermissionContext) => Promise<void> | undefined;
|
|
24
|
+
/** `ZM_READ_ONLY` first, then the profile's permissions; a promise only while a y/N question is open. */
|
|
25
|
+
export declare const guardCommand: (command: Command, env: NodeJS.ProcessEnv, context: Omit<PermissionContext, "confirm">, confirm?: PermissionContext["confirm"]) => Promise<void> | undefined;
|
|
26
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,KAAK,EAAY,MAAM,yBAAyB,CAAA;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAgC,CAAA;AAWhG,wFAAwF;AACxF,eAAO,MAAM,eAAe,YAAa,OAAO,KAAG,MAAM,GAAG,IAG3D,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,cAAc,YAAa,OAAO,KAAG,GAAG,CAAC,MAAM,CAS3D,CAAA;AAED,eAAO,MAAM,gBAAgB,UAAW,MAAM,SAAS,WAAW,CAAC,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAkBhG,CAAA;AAED,MAAM,WAAW,iBAAiB;IAChC,kHAAkH;IAClH,OAAO,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC7C,2EAA2E;IAC3E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACjD;AASD;;;;GAIG;AACH,eAAO,MAAM,eAAe,YAAa,OAAO,WAAW,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SA4B9F,CAAA;AAED,yGAAyG;AACzG,eAAO,MAAM,YAAY,YACd,OAAO,OACX,MAAM,CAAC,UAAU,WACb,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,YACjC,iBAAiB,CAAC,SAAS,CAAC,KACrC,OAAO,CAAC,IAAI,CAAC,GAAG,SAGlB,CAAA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { metaOf } from "@wirecat/cli-base/commands";
|
|
3
|
+
import { LEVELS, levelFor } from "@wirecat/cli-core/sends";
|
|
4
|
+
import { PROFILE_FREE } from "./commands.js";
|
|
5
|
+
import { refusalOf, refuseChangeWhenReadOnly } from "./read-only.js";
|
|
6
|
+
/** A change to Zoom asks first. A built-in default only tightens what the owner set (WC-PERM-7). */
|
|
7
|
+
export const DEFAULT_PERMISSIONS = { "remote-meetings": "ask" };
|
|
8
|
+
/** Looking after the tool — its settings, its login, its help — is never gated (WC-PERM-5). */
|
|
9
|
+
const HOUSEKEEPING = new Set([...PROFILE_FREE, "session", "serve", "mcp"]);
|
|
10
|
+
const pathOf = (command) => {
|
|
11
|
+
const words = [];
|
|
12
|
+
for (let at = command; at?.parent; at = at.parent)
|
|
13
|
+
words.unshift(at.name());
|
|
14
|
+
return words;
|
|
15
|
+
};
|
|
16
|
+
/** The command's path, dotted — `remote-meetings.cancel` — or null for housekeeping. */
|
|
17
|
+
export const permissionKeyOf = (command) => {
|
|
18
|
+
const path = pathOf(command);
|
|
19
|
+
return path.length === 0 || HOUSEKEEPING.has(path[0]) ? null : path.join(".");
|
|
20
|
+
};
|
|
21
|
+
/** Every key a permission may name: each command's path and every group above it. */
|
|
22
|
+
export const permissionKeys = (program) => {
|
|
23
|
+
const keys = new Set();
|
|
24
|
+
const walk = (command) => {
|
|
25
|
+
const key = permissionKeyOf(command);
|
|
26
|
+
if (key)
|
|
27
|
+
keys.add(key);
|
|
28
|
+
for (const child of command.commands)
|
|
29
|
+
walk(child);
|
|
30
|
+
};
|
|
31
|
+
walk(program);
|
|
32
|
+
return keys;
|
|
33
|
+
};
|
|
34
|
+
export const parsePermissions = (value, known) => {
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = JSON.parse(value);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new CliError("validation_error", 'permissions must be a JSON object: {"remote-meetings": "allow"}');
|
|
41
|
+
}
|
|
42
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
43
|
+
throw new CliError("validation_error", 'permissions must be a JSON object: {"remote-meetings": "allow"}');
|
|
44
|
+
for (const [key, level] of Object.entries(parsed)) {
|
|
45
|
+
if (!known.has(key))
|
|
46
|
+
throw new CliError("validation_error", `no command is called ${key}; a key is a command path, dotted`, {
|
|
47
|
+
keys: [...known].sort(),
|
|
48
|
+
});
|
|
49
|
+
if (!LEVELS.includes(level))
|
|
50
|
+
throw new CliError("validation_error", `${key}: a level is one of ${LEVELS.join(", ")}`);
|
|
51
|
+
}
|
|
52
|
+
return parsed;
|
|
53
|
+
};
|
|
54
|
+
const refuse = (key, level, profile, what) => new CliError("permission_error", `${what}: ${key} is ${level} for profile ${profile} — \`zm ${profile} config set permissions …\` changes it`, { key, level });
|
|
55
|
+
/**
|
|
56
|
+
* Checks a command against its profile's permissions before anything connects. `deny` stops it; `readonly` stops it
|
|
57
|
+
* when it changes something, as `ZM_READ_ONLY` would; `ask` before a change to Zoom wants `--yes` or a yes at the
|
|
58
|
+
* terminal, and `allow` applies it without one. A flag only answers `ask` (WC-PERM-10). `--dry-run` previews.
|
|
59
|
+
*/
|
|
60
|
+
export const checkPermission = (command, context) => {
|
|
61
|
+
const key = permissionKeyOf(command);
|
|
62
|
+
if (!key)
|
|
63
|
+
return;
|
|
64
|
+
const named = context.profile();
|
|
65
|
+
const profile = named ?? "<profile>";
|
|
66
|
+
const own = named === undefined ? {} : (context.config().permissions[named] ?? {});
|
|
67
|
+
const { level, key: by } = levelFor(own, key, DEFAULT_PERMISSIONS);
|
|
68
|
+
const at = by ?? key;
|
|
69
|
+
if (level === "deny")
|
|
70
|
+
throw refuse(at, level, profile, "refused");
|
|
71
|
+
const changes = refusalOf(command);
|
|
72
|
+
if (level === "readonly" && changes)
|
|
73
|
+
throw refuse(at, level, profile, `refused to ${changes}`);
|
|
74
|
+
const options = command.opts();
|
|
75
|
+
const confirms = metaOf(command).effects?.remote === "write" && command.options.some(({ long }) => long === "--yes");
|
|
76
|
+
if (!confirms || options.dryRun || options.yes)
|
|
77
|
+
return;
|
|
78
|
+
if (level === "allow") {
|
|
79
|
+
command.setOptionValue("yes", true);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!context.confirm)
|
|
83
|
+
throw new CliError("confirmation_required", `${at} asks first for profile ${profile}: add --yes to apply, or --dry-run to preview`, { key: at });
|
|
84
|
+
return context.confirm(`zm: ${pathOf(command).join(" ")} changes Zoom for profile ${profile}. Apply?`).then((yes) => {
|
|
85
|
+
if (!yes)
|
|
86
|
+
throw new CliError("cancelled", "not applied");
|
|
87
|
+
command.setOptionValue("yes", true);
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
/** `ZM_READ_ONLY` first, then the profile's permissions; a promise only while a y/N question is open. */
|
|
91
|
+
export const guardCommand = (command, env, context, confirm) => {
|
|
92
|
+
refuseChangeWhenReadOnly(command, env);
|
|
93
|
+
return checkPermission(command, { ...context, ...(confirm ? { confirm } : {}) });
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Command } from "commander";
|
|
2
|
+
export declare const PROFILE_HELP: string;
|
|
3
|
+
/** Takes the profile word off the command line, in Commander's `parseAsync` argument shape. */
|
|
4
|
+
export declare const liftProfileWord: (program: Command, [argv, settings]: Parameters<Command["parseAsync"]>) => {
|
|
5
|
+
profile?: string;
|
|
6
|
+
args: Parameters<Command["parseAsync"]>;
|
|
7
|
+
};
|
|
8
|
+
/** Commander builds a usage line from the command tree, where the profile is not a word. */
|
|
9
|
+
export declare const showProfileInUsage: (program: Command) => void;
|
|
10
|
+
/** One parse's profile: `lift` takes the word off the command line, `profile()` resolves it when a command needs it. */
|
|
11
|
+
export declare const profileSelection: (env: NodeJS.ProcessEnv, profiles: () => readonly string[]) => {
|
|
12
|
+
lift: (program: Command, args: Parameters<Command["parseAsync"]>) => Parameters<Command["parseAsync"]>;
|
|
13
|
+
profile: () => string;
|
|
14
|
+
/** The profile when one is named, by word or environment; undefined instead of the error that lists them. */
|
|
15
|
+
named: () => string | undefined;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Importing or syncing lists the profile it stores for. On a computer with no profile that makes the first one; beside
|
|
19
|
+
* others an unknown name is refused before anything is stored, since it is far more often a typo than a new account —
|
|
20
|
+
* a new one starts with its login.
|
|
21
|
+
*/
|
|
22
|
+
export declare const recordProfile: (configPath: string, profile: string) => void;
|
|
23
|
+
//# sourceMappingURL=profile-word.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-word.d.ts","sourceRoot":"","sources":["../src/profile-word.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAQ,MAAM,WAAW,CAAA;AAK9C,eAAO,MAAM,YAAY,QAGgF,CAAA;AAUzG,+FAA+F;AAC/F,eAAO,MAAM,eAAe,YACjB,OAAO,oBACiB,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KACjE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;CAI7D,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,YAAa,OAAO,KAAG,IASrD,CAAA;AAED,wHAAwH;AACxH,eAAO,MAAM,gBAAgB,QAAS,MAAM,CAAC,UAAU,YAAY,MAAM,SAAS,MAAM,EAAE;oBAQtE,OAAO,QAAQ,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;mBALlF,MAAM;IAYxB,6GAA6G;iBAClG,MAAM,GAAG,SAAS;CAGhC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,eAAgB,MAAM,WAAW,MAAM,KAAG,IAWnE,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { commandWords, liftProfile } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { Help } from "commander";
|
|
4
|
+
import { PROFILE_FREE } from "./commands.js";
|
|
5
|
+
import { addProfile, readConfig } from "./config.js";
|
|
6
|
+
import { chooseProfile } from "./profile.js";
|
|
7
|
+
export const PROFILE_HELP = "The first word is the profile whenever it is not a command — `zm personal meetings list`.\n" +
|
|
8
|
+
"`ZM_PROFILE` says the same thing for a whole shell session.\n" +
|
|
9
|
+
"No profile is assumed: without one, a command that uses an account stops and lists the profiles here.";
|
|
10
|
+
/** The root options that take the next word as their value, so `zm --timeout 30s personal …` finds the profile. */
|
|
11
|
+
const valuedOptions = (program) => new Set(program.options
|
|
12
|
+
.filter((option) => option.required)
|
|
13
|
+
.flatMap((option) => [option.long, option.short].filter((flag) => flag !== undefined)));
|
|
14
|
+
/** Takes the profile word off the command line, in Commander's `parseAsync` argument shape. */
|
|
15
|
+
export const liftProfileWord = (program, [argv = process.argv, settings]) => {
|
|
16
|
+
const head = settings?.from === "user" ? [] : argv.slice(0, 2);
|
|
17
|
+
const named = liftProfile(argv.slice(head.length), commandWords(program), valuedOptions(program));
|
|
18
|
+
return { profile: named.profile, args: [[...head, ...named.rest], settings] };
|
|
19
|
+
};
|
|
20
|
+
/** Commander builds a usage line from the command tree, where the profile is not a word. */
|
|
21
|
+
export const showProfileInUsage = (program) => {
|
|
22
|
+
const withProfile = (command) => {
|
|
23
|
+
command.configureHelp({
|
|
24
|
+
...command.configureHelp(),
|
|
25
|
+
commandUsage: (shown) => `zm <profile>${new Help().commandUsage(shown).slice("zm".length)}`,
|
|
26
|
+
});
|
|
27
|
+
for (const child of command.commands)
|
|
28
|
+
withProfile(child);
|
|
29
|
+
};
|
|
30
|
+
for (const top of program.commands)
|
|
31
|
+
if (!PROFILE_FREE.has(top.name()))
|
|
32
|
+
withProfile(top);
|
|
33
|
+
};
|
|
34
|
+
/** One parse's profile: `lift` takes the word off the command line, `profile()` resolves it when a command needs it. */
|
|
35
|
+
export const profileSelection = (env, profiles) => {
|
|
36
|
+
let word;
|
|
37
|
+
let chosen;
|
|
38
|
+
const profile = () => {
|
|
39
|
+
chosen ??= chooseProfile({ word, env, profiles });
|
|
40
|
+
return chosen;
|
|
41
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
lift: (program, args) => {
|
|
44
|
+
const named = liftProfileWord(program, args);
|
|
45
|
+
word = named.profile;
|
|
46
|
+
chosen = undefined;
|
|
47
|
+
return named.args;
|
|
48
|
+
},
|
|
49
|
+
profile,
|
|
50
|
+
/** The profile when one is named, by word or environment; undefined instead of the error that lists them. */
|
|
51
|
+
named: () => word !== undefined || env.ZM_PROFILE?.trim() || env.ZM_PROFILE_LOCK?.trim() ? profile() : undefined,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Importing or syncing lists the profile it stores for. On a computer with no profile that makes the first one; beside
|
|
56
|
+
* others an unknown name is refused before anything is stored, since it is far more often a typo than a new account —
|
|
57
|
+
* a new one starts with its login.
|
|
58
|
+
*/
|
|
59
|
+
export const recordProfile = (configPath, profile) => {
|
|
60
|
+
const here = readConfig(configPath).profiles;
|
|
61
|
+
if (here.includes(profile))
|
|
62
|
+
return;
|
|
63
|
+
if (here.length)
|
|
64
|
+
throw new CliError("validation_error", `there is no profile ${profile} here — profiles here: ${here.join(", ")}. A new one starts with ` +
|
|
65
|
+
`\`zm ${profile} session start\`; a typo stores nothing`, { profiles: here });
|
|
66
|
+
addProfile(configPath, profile);
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=profile-word.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-word.js","sourceRoot":"","sources":["../src/profile-word.ts"],"names":[],"mappings":"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"}
|
package/dist/profile.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
export declare const profilePattern: RegExp;
|
|
2
2
|
export declare const profileAccountKey: (profile: string) => string;
|
|
3
|
+
export interface ProfileChoice {
|
|
4
|
+
/** The first word on the command line, when it was not a command. */
|
|
5
|
+
word?: string;
|
|
6
|
+
env: NodeJS.ProcessEnv;
|
|
7
|
+
/** Only to list in the error when none is named, so a named profile never reads the config. */
|
|
8
|
+
profiles: () => readonly string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The profile a command acts for: the first word, else `ZM_PROFILE`, else `ZM_PROFILE_LOCK`. Nothing else
|
|
12
|
+
* picks one — not a saved setting, not the only profile here.
|
|
13
|
+
*/
|
|
14
|
+
export declare const chooseProfile: ({ word, env, profiles }: ProfileChoice) => string;
|
|
3
15
|
//# sourceMappingURL=profile.d.ts.map
|
package/dist/profile.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,QAAsC,CAAA;AACjE,eAAO,MAAM,iBAAiB,YAAa,MAAM,KAAG,MAAiC,CAAA;AAWrF,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,+FAA+F;IAC/F,QAAQ,EAAE,MAAM,SAAS,MAAM,EAAE,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,4BAA6B,aAAa,KAAG,MAsBtE,CAAA"}
|
package/dist/profile.js
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { usableProfileName } from "@wirecat/cli-core/cli";
|
|
1
3
|
export const profilePattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
2
4
|
export const profileAccountKey = (profile) => `zm-profile:${profile}`;
|
|
5
|
+
const given = (value) => (value?.trim() ? value.trim() : undefined);
|
|
6
|
+
const usable = (profile) => {
|
|
7
|
+
usableProfileName(profile);
|
|
8
|
+
if (!profilePattern.test(profile))
|
|
9
|
+
throw new CliError("validation_error", `"${profile}" cannot be a profile name — 64 characters at most`);
|
|
10
|
+
return profile;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The profile a command acts for: the first word, else `ZM_PROFILE`, else `ZM_PROFILE_LOCK`. Nothing else
|
|
14
|
+
* picks one — not a saved setting, not the only profile here.
|
|
15
|
+
*/
|
|
16
|
+
export const chooseProfile = ({ word, env, profiles }) => {
|
|
17
|
+
const lock = given(env.ZM_PROFILE_LOCK);
|
|
18
|
+
const named = word !== undefined ? word : given(env.ZM_PROFILE);
|
|
19
|
+
if (lock !== undefined)
|
|
20
|
+
usable(lock);
|
|
21
|
+
if (named !== undefined && lock !== undefined && named !== lock)
|
|
22
|
+
throw new CliError("permission_error", `this process is locked to profile ${lock} (ZM_PROFILE_LOCK) — profile ${named} is refused`);
|
|
23
|
+
const profile = named ?? lock;
|
|
24
|
+
if (profile === undefined) {
|
|
25
|
+
const here = profiles();
|
|
26
|
+
throw new CliError("validation_error", here.length === 0
|
|
27
|
+
? "name a profile: there is none on this computer yet — create one with `zm personal session start` " +
|
|
28
|
+
"(any name in place of personal)"
|
|
29
|
+
: `name a profile: \`zm <profile> …\` — profiles here: ${here.join(", ")} (or set ZM_PROFILE)`, { profiles: [...here] });
|
|
30
|
+
}
|
|
31
|
+
return usable(profile);
|
|
32
|
+
};
|
|
3
33
|
//# sourceMappingURL=profile.js.map
|
package/dist/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAA;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,cAAc,OAAO,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAA;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,cAAc,OAAO,EAAE,CAAA;AAErF,MAAM,KAAK,GAAG,CAAC,KAAyB,EAAsB,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AAE3G,MAAM,MAAM,GAAG,CAAC,OAAe,EAAU,EAAE;IACzC,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC1B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,IAAI,OAAO,oDAAoD,CAAC,CAAA;IACzG,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAUD;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAiB,EAAU,EAAE;IAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,CAAA;IACpC,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAC7D,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,qCAAqC,IAAI,gCAAgC,KAAK,aAAa,CAC5F,CAAA;IACH,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,CAAA;IAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAA;QACvB,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,IAAI,CAAC,MAAM,KAAK,CAAC;YACf,CAAC,CAAC,mGAAmG;gBACjG,iCAAiC;YACrC,CAAC,CAAC,uDAAuD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAChG,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CACxB,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;AACxB,CAAC,CAAA"}
|
package/dist/program.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { MeetingSource, MeetingStore } from "@wirecat/cli-core/meetings";
|
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { type ArchiveService, type ArchiveTranscriptService, type RecordingsService, type RemoteMeetingsService } from "./archive-commands.js";
|
|
5
5
|
import { readDownloadedFiles } from "./files.js";
|
|
6
|
-
import {
|
|
6
|
+
import type { ZoomMcpOptions } from "./mcp.js";
|
|
7
7
|
import type { RecordingScheduleService } from "./recording-schedule.js";
|
|
8
8
|
import { type StoreConnection, type StoreConnectRequest } from "./store-connection.js";
|
|
9
9
|
import type { TokenManager } from "./tokens.js";
|
|
@@ -30,6 +30,8 @@ export interface ProgramDeps {
|
|
|
30
30
|
}) => Promise<void>;
|
|
31
31
|
openBrowser: (url: string, browser?: string) => Promise<void>;
|
|
32
32
|
readPaste?: (signal: AbortSignal) => Promise<string>;
|
|
33
|
+
/** A y/N question, default no; only at a terminal. */
|
|
34
|
+
confirm?: (question: string) => Promise<boolean>;
|
|
33
35
|
readBatchInput?: (path: string, signal?: AbortSignal) => Promise<string>;
|
|
34
36
|
data: (text: string) => void;
|
|
35
37
|
diagnostic: (text: string) => void;
|
|
@@ -41,7 +43,7 @@ export interface ProgramDeps {
|
|
|
41
43
|
}) => Promise<unknown>;
|
|
42
44
|
signal?: AbortSignal;
|
|
43
45
|
sleep?: SleepLike;
|
|
44
|
-
serveMcp?: (options:
|
|
46
|
+
serveMcp?: (options: ZoomMcpOptions) => Promise<void>;
|
|
45
47
|
streamData?: (text: string, signal: AbortSignal) => Promise<void>;
|
|
46
48
|
}
|
|
47
49
|
export declare const createProgram: (deps: ProgramDeps) => Command;
|
package/dist/program.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAA;AAInD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAE7B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAA;AAM9B,OAAO,EAA6B,mBAAmB,EAA2B,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|