@wirecat/zoom-cli 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/agent-skill.d.ts.map +1 -1
- package/dist/agent-skill.js +2 -2
- package/dist/agent-skill.js.map +1 -1
- package/dist/answer-output.d.ts +23 -0
- package/dist/answer-output.d.ts.map +1 -0
- package/dist/answer-output.js +52 -0
- package/dist/answer-output.js.map +1 -0
- package/dist/answer-policy.d.ts +11 -0
- package/dist/answer-policy.d.ts.map +1 -0
- package/dist/answer-policy.js +8 -0
- package/dist/answer-policy.js.map +1 -0
- package/dist/answers.d.ts +105 -42
- package/dist/answers.d.ts.map +1 -1
- package/dist/answers.js +23 -34
- package/dist/answers.js.map +1 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +20 -19
- package/dist/api.js.map +1 -1
- package/dist/archive-commands.d.ts +5 -4
- package/dist/archive-commands.d.ts.map +1 -1
- package/dist/archive-commands.js +32 -31
- package/dist/archive-commands.js.map +1 -1
- package/dist/archive-import.d.ts +2 -2
- package/dist/archive-import.d.ts.map +1 -1
- package/dist/archive-import.js +20 -30
- package/dist/archive-import.js.map +1 -1
- package/dist/archive-transcripts.d.ts.map +1 -1
- package/dist/archive-transcripts.js +22 -21
- package/dist/archive-transcripts.js.map +1 -1
- package/dist/bin/zm.js +1 -2
- package/dist/bin/zm.js.map +1 -1
- package/dist/command-effects.d.ts +5 -0
- package/dist/command-effects.d.ts.map +1 -0
- package/dist/command-effects.js +38 -0
- package/dist/command-effects.js.map +1 -0
- package/dist/commands.d.ts +2 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +21 -18
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +54 -37
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +0 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -7
- package/dist/errors.js.map +1 -1
- package/dist/execution.d.ts +1 -0
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +4 -4
- package/dist/execution.js.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +9 -9
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/ingestion-search-commands.d.ts +3 -2
- package/dist/ingestion-search-commands.d.ts.map +1 -1
- package/dist/ingestion-search-commands.js +9 -8
- package/dist/ingestion-search-commands.js.map +1 -1
- package/dist/json-fields.d.ts +7 -0
- package/dist/json-fields.d.ts.map +1 -0
- package/dist/json-fields.js +23 -0
- package/dist/json-fields.js.map +1 -0
- package/dist/keys.d.ts +1 -1
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +7 -5
- package/dist/keys.js.map +1 -1
- package/dist/local-transcription-commands.d.ts +3 -2
- package/dist/local-transcription-commands.d.ts.map +1 -1
- package/dist/local-transcription-commands.js +7 -7
- package/dist/local-transcription-commands.js.map +1 -1
- package/dist/local-transcription.d.ts.map +1 -1
- package/dist/local-transcription.js +13 -12
- package/dist/local-transcription.js.map +1 -1
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +8 -7
- package/dist/login.js.map +1 -1
- package/dist/mcp-server.d.ts +4 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +40 -48
- package/dist/mcp-server.js.map +1 -1
- package/dist/meeting-context-commands.d.ts +2 -1
- package/dist/meeting-context-commands.d.ts.map +1 -1
- package/dist/meeting-context-commands.js +11 -15
- package/dist/meeting-context-commands.js.map +1 -1
- package/dist/meeting-context.d.ts +6 -6
- package/dist/meeting-context.d.ts.map +1 -1
- package/dist/meeting-context.js +8 -21
- package/dist/meeting-context.js.map +1 -1
- package/dist/meeting-integration-commands.d.ts +3 -2
- package/dist/meeting-integration-commands.d.ts.map +1 -1
- package/dist/meeting-integration-commands.js +7 -7
- package/dist/meeting-integration-commands.js.map +1 -1
- package/dist/meeting-integration.d.ts.map +1 -1
- package/dist/meeting-integration.js +2 -2
- package/dist/meeting-integration.js.map +1 -1
- package/dist/meeting-mcp-command.d.ts +19 -0
- package/dist/meeting-mcp-command.d.ts.map +1 -0
- package/dist/meeting-mcp-command.js +41 -0
- package/dist/meeting-mcp-command.js.map +1 -0
- package/dist/meeting-preparation-mcp.d.ts +131 -0
- package/dist/meeting-preparation-mcp.d.ts.map +1 -0
- package/dist/meeting-preparation-mcp.js +20 -0
- package/dist/meeting-preparation-mcp.js.map +1 -0
- package/dist/meeting-preparation.d.ts +22 -0
- package/dist/meeting-preparation.d.ts.map +1 -0
- package/dist/meeting-preparation.js +29 -0
- package/dist/meeting-preparation.js.map +1 -0
- package/dist/meeting-project-evidence-commands.d.ts +1 -4
- package/dist/meeting-project-evidence-commands.d.ts.map +1 -1
- package/dist/meeting-project-evidence-commands.js +2 -6
- package/dist/meeting-project-evidence-commands.js.map +1 -1
- package/dist/meeting-project-evidence-mcp.d.ts +76 -83
- package/dist/meeting-project-evidence-mcp.d.ts.map +1 -1
- package/dist/meeting-project-evidence-mcp.js +7 -8
- package/dist/meeting-project-evidence-mcp.js.map +1 -1
- package/dist/meeting-read-command-bindings.d.ts +10 -0
- package/dist/meeting-read-command-bindings.d.ts.map +1 -0
- package/dist/meeting-read-command-bindings.js +13 -0
- package/dist/meeting-read-command-bindings.js.map +1 -0
- package/dist/meeting-search-commands.d.ts +3 -2
- package/dist/meeting-search-commands.d.ts.map +1 -1
- package/dist/meeting-search-commands.js +47 -38
- package/dist/meeting-search-commands.js.map +1 -1
- package/dist/meeting-semantic-commands.d.ts +3 -2
- package/dist/meeting-semantic-commands.d.ts.map +1 -1
- package/dist/meeting-semantic-commands.js +13 -12
- package/dist/meeting-semantic-commands.js.map +1 -1
- package/dist/meeting-semantic.d.ts.map +1 -1
- package/dist/meeting-semantic.js +3 -2
- package/dist/meeting-semantic.js.map +1 -1
- package/dist/occurrence-schedule.d.ts +3 -0
- package/dist/occurrence-schedule.d.ts.map +1 -0
- package/dist/occurrence-schedule.js +106 -0
- package/dist/occurrence-schedule.js.map +1 -0
- package/dist/output-file.js +3 -3
- package/dist/output-file.js.map +1 -1
- package/dist/program.d.ts +15 -28
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +163 -333
- package/dist/program.js.map +1 -1
- package/dist/recording-archive.d.ts +1 -1
- package/dist/recording-archive.d.ts.map +1 -1
- package/dist/recording-archive.js +99 -46
- package/dist/recording-archive.js.map +1 -1
- package/dist/recording-partial-store.d.ts.map +1 -1
- package/dist/recording-partial-store.js +11 -10
- package/dist/recording-partial-store.js.map +1 -1
- package/dist/recording-promotion-store.d.ts.map +1 -1
- package/dist/recording-promotion-store.js +4 -4
- package/dist/recording-promotion-store.js.map +1 -1
- package/dist/recording-schedule-commands.d.ts +3 -2
- package/dist/recording-schedule-commands.d.ts.map +1 -1
- package/dist/recording-schedule-commands.js +13 -12
- package/dist/recording-schedule-commands.js.map +1 -1
- package/dist/recording-schedule-store.d.ts.map +1 -1
- package/dist/recording-schedule-store.js +15 -14
- package/dist/recording-schedule-store.js.map +1 -1
- package/dist/recording-schedule-systemd.d.ts.map +1 -1
- package/dist/recording-schedule-systemd.js +16 -15
- package/dist/recording-schedule-systemd.js.map +1 -1
- package/dist/recording-schedule.d.ts +1 -1
- package/dist/recording-schedule.d.ts.map +1 -1
- package/dist/recording-schedule.js +15 -14
- package/dist/recording-schedule.js.map +1 -1
- package/dist/recording-sync-store.d.ts.map +1 -1
- package/dist/recording-sync-store.js +9 -9
- package/dist/recording-sync-store.js.map +1 -1
- package/dist/recording-sync.d.ts +1 -1
- package/dist/recording-sync.d.ts.map +1 -1
- package/dist/recording-sync.js +10 -19
- package/dist/recording-sync.js.map +1 -1
- package/dist/recordings.d.ts.map +1 -1
- package/dist/recordings.js +19 -18
- package/dist/recordings.js.map +1 -1
- package/dist/remote-http.d.ts +1 -0
- package/dist/remote-http.d.ts.map +1 -1
- package/dist/remote-http.js +26 -14
- package/dist/remote-http.js.map +1 -1
- package/dist/remote-meeting-id.d.ts +2 -0
- package/dist/remote-meeting-id.d.ts.map +1 -0
- package/dist/remote-meeting-id.js +7 -0
- package/dist/remote-meeting-id.js.map +1 -0
- package/dist/remote-meetings.d.ts.map +1 -1
- package/dist/remote-meetings.js +10 -13
- package/dist/remote-meetings.js.map +1 -1
- package/dist/store-connection.d.ts +1 -7
- package/dist/store-connection.d.ts.map +1 -1
- package/dist/store-connection.js +95 -176
- package/dist/store-connection.js.map +1 -1
- package/dist/streaming.js +3 -3
- package/dist/streaming.js.map +1 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +10 -9
- package/dist/tokens.js.map +1 -1
- package/dist/unified-search.d.ts +1 -0
- package/dist/unified-search.d.ts.map +1 -1
- package/dist/unified-search.js +18 -3
- package/dist/unified-search.js.map +1 -1
- package/dist/upcoming-meetings.d.ts +10 -0
- package/dist/upcoming-meetings.d.ts.map +1 -0
- package/dist/upcoming-meetings.js +24 -0
- package/dist/upcoming-meetings.js.map +1 -0
- package/dist/watch-commands.d.ts +2 -1
- package/dist/watch-commands.d.ts.map +1 -1
- package/dist/watch-commands.js +9 -9
- package/dist/watch-commands.js.map +1 -1
- package/package.json +5 -4
- package/skills/zoom-cli/SKILL.md +32 -12
- package/dist/ordinary-file.d.ts +0 -3
- package/dist/ordinary-file.d.ts.map +0 -1
- package/dist/ordinary-file.js +0 -16
- package/dist/ordinary-file.js.map +0 -1
- package/dist/wav-audio.d.ts +0 -2
- package/dist/wav-audio.d.ts.map +0 -1
- package/dist/wav-audio.js +0 -2
- package/dist/wav-audio.js.map +0 -1
package/dist/keys.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAMA,4GAA4G;AAC5G,eAAO,MAAM,SAAS,UAAW,OAAO,KAAG,OAS1C,CAAA"}
|
package/dist/keys.js
CHANGED
|
@@ -4,13 +4,15 @@ const plain = (value) => {
|
|
|
4
4
|
const prototype = Object.getPrototypeOf(value);
|
|
5
5
|
return prototype === Object.prototype || prototype === null;
|
|
6
6
|
};
|
|
7
|
-
|
|
7
|
+
/** Turns snake_case input that agents send back, such as a cursor, into the camelCase the services take. */
|
|
8
|
+
export const camelKeys = (value) => {
|
|
8
9
|
if (Array.isArray(value))
|
|
9
|
-
return value.map(
|
|
10
|
+
return value.map(camelKeys);
|
|
10
11
|
if (!plain(value))
|
|
11
12
|
return value;
|
|
12
|
-
return Object.fromEntries(Object.entries(value).map(([key, item]) => [
|
|
13
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [
|
|
14
|
+
key.replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase()),
|
|
15
|
+
camelKeys(item),
|
|
16
|
+
]));
|
|
13
17
|
};
|
|
14
|
-
export const snakeKeys = deep((key) => key.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase());
|
|
15
|
-
export const camelKeys = deep((key) => key.replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase()));
|
|
16
18
|
//# sourceMappingURL=keys.js.map
|
package/dist/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,CAAC,KAAc,EAAoC,EAAE;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,CAAC,KAAc,EAAoC,EAAE;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAA;AAC7D,CAAC,CAAA;AAED,4GAA4G;AAC5G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAW,EAAE;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC/B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxE,SAAS,CAAC,IAAI,CAAC;KAChB,CAAC,CACH,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { type Body } from "@wirecat/cli-core/cli";
|
|
1
2
|
import type { Command } from "commander";
|
|
2
3
|
import { type LocalTranscriptionCapabilities } from "./local-transcription.js";
|
|
3
4
|
export declare const addLocalTranscriptionCommands: (program: Command, deps: {
|
|
4
5
|
capabilities: () => Promise<LocalTranscriptionCapabilities>;
|
|
5
6
|
signal: () => AbortSignal | undefined;
|
|
6
|
-
output: (
|
|
7
|
-
receipt: (
|
|
7
|
+
output: (body: Body) => void;
|
|
8
|
+
receipt: (body: Body) => Promise<void>;
|
|
8
9
|
}) => void;
|
|
9
10
|
//# sourceMappingURL=local-transcription-commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transcription-commands.d.ts","sourceRoot":"","sources":["../src/local-transcription-commands.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"local-transcription-commands.d.ts","sourceRoot":"","sources":["../src/local-transcription-commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAuB,MAAM,uBAAuB,CAAA;AAEtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAEL,KAAK,8BAA8B,EAGpC,MAAM,0BAA0B,CAAA;AAEjC,eAAO,MAAM,6BAA6B,YAC/B,OAAO,QACV;IACJ,YAAY,EAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;IAC3D,MAAM,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IACrC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC,KACA,IAqDF,CAAA"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
1
2
|
import { annotate } from "@wirecat/cli-base/commands";
|
|
3
|
+
import { itemOf, LOCAL_WRITE } from "@wirecat/cli-core/cli";
|
|
2
4
|
import { speechModel } from "@wirecat/cli-core/speech";
|
|
3
|
-
import { ZoomError } from "./errors.js";
|
|
4
5
|
import { bytes, duration } from "./execution.js";
|
|
5
6
|
import { compactLocalTranscriptionReceipt, validateLocalTranscriptionOptions, } from "./local-transcription.js";
|
|
6
7
|
export const addLocalTranscriptionCommands = (program, deps) => {
|
|
7
8
|
const meetings = program.commands.find((command) => command.name() === "meetings");
|
|
8
9
|
if (!meetings)
|
|
9
|
-
throw new
|
|
10
|
+
throw new CliError("configuration_error", "meeting command group is unavailable");
|
|
10
11
|
annotate(meetings
|
|
11
12
|
.command("transcribe")
|
|
12
13
|
.description("preview transcribing a recording on this machine; --yes adds the transcript")
|
|
@@ -34,17 +35,16 @@ export const addLocalTranscriptionCommands = (program, deps) => {
|
|
|
34
35
|
});
|
|
35
36
|
speechModel(request.model);
|
|
36
37
|
if (typeof file !== "string" || !file.trim() || file.includes("\0"))
|
|
37
|
-
throw new
|
|
38
|
+
throw new CliError("validation_error", "local audio file is required");
|
|
38
39
|
const capabilities = await deps.capabilities();
|
|
39
40
|
const receipt = await capabilities.transcribe(reference, file, request);
|
|
40
41
|
if (receipt.applied)
|
|
41
|
-
await deps.receipt(compactLocalTranscriptionReceipt(receipt));
|
|
42
|
+
await deps.receipt(itemOf(compactLocalTranscriptionReceipt(receipt)));
|
|
42
43
|
else
|
|
43
|
-
deps.output(receipt);
|
|
44
|
+
deps.output(itemOf(receipt));
|
|
44
45
|
}), {
|
|
45
46
|
origin: "handwritten",
|
|
46
|
-
|
|
47
|
-
local: true,
|
|
47
|
+
effects: LOCAL_WRITE,
|
|
48
48
|
examples: ["zm meetings transcribe meeting:3/12 ./AliceExample.wav --model parakeet-v3 --json"],
|
|
49
49
|
});
|
|
50
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transcription-commands.js","sourceRoot":"","sources":["../src/local-transcription-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"local-transcription-commands.js","sourceRoot":"","sources":["../src/local-transcription-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transcription.d.ts","sourceRoot":"","sources":["../src/local-transcription.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-transcription.d.ts","sourceRoot":"","sources":["../src/local-transcription.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC9B,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EACV,2BAA2B,EAC3B,qBAAqB,EACrB,4BAA4B,EAC7B,MAAM,0BAA0B,CAAA;AAIjC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,2BAA2B,CAAC,CAAA;IAC9D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;CAC3F;AACD,MAAM,WAAW,yBAA0B,SAAQ,2BAA2B;IAC5E,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AACD,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AACD,MAAM,WAAW,8BAA8B;IAC7C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAA;CACtH;AACD,eAAO,MAAM,iCAAiC,UAAW,yBAAyB,KAAG,yBA6BpF,CAAA;AACD,eAAO,MAAM,gCAAgC,YAAa,2BAA2B;IAKjF,OAAO;IACP,SAAS;IACT,UAAU;IACV,SAAS;IACT,OAAO;IACP,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;IACrB,QAAQ;IACR,WAAW;IACX,MAAM;IACN,KAAK;IACL,YAAY;IACZ,MAAM;CAET,CAAA;AAKD,eAAO,MAAM,4BAA4B,SACjC,MAAM,WACH;IACP,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;CACxC,KACA,0BAoEF,CAAA;AACD,eAAO,MAAM,oCAAoC,UACxC;IACL,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAA;IACjG,4BAA4B,EAAE,6BAA6B,CAAC,8BAA8B,CAAC,CAAA;CAC5F,UACM;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;CAAE,KAC9F,8BAgDF,CAAA;AACD,YAAY,EAAE,sBAAsB,EAAE,CAAA"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { isAbsolute } from "node:path";
|
|
2
|
-
import {
|
|
3
|
-
import { openWavAudio, preflightWavAudio } from "
|
|
2
|
+
import { CliError } from "@wirecat/cli-base";
|
|
3
|
+
import { openWavAudio, preflightWavAudio } from "@wirecat/cli-core/speech/wav";
|
|
4
|
+
import { checkCancelled } from "./errors.js";
|
|
4
5
|
export const validateLocalTranscriptionOptions = (input) => {
|
|
5
6
|
const options = { ...input };
|
|
6
7
|
if (typeof options.model !== "string" ||
|
|
7
8
|
!options.model.trim() ||
|
|
8
9
|
options.model.length > 200 ||
|
|
9
10
|
/[\0\r\n]/.test(options.model))
|
|
10
|
-
throw new
|
|
11
|
+
throw new CliError("validation_error", "local transcription requires an explicit speech model");
|
|
11
12
|
if (options.modelsDirectory !== undefined &&
|
|
12
13
|
(typeof options.modelsDirectory !== "string" ||
|
|
13
14
|
!isAbsolute(options.modelsDirectory) ||
|
|
14
15
|
options.modelsDirectory.length > 4096 ||
|
|
15
16
|
/[\0\r\n]/.test(options.modelsDirectory)))
|
|
16
|
-
throw new
|
|
17
|
+
throw new CliError("validation_error", "speech model directory must be an absolute bounded path");
|
|
17
18
|
for (const [value, max, label] of [
|
|
18
19
|
[options.maxBytes, 4 * 1024 ** 3, "media bytes"],
|
|
19
20
|
[options.maxDurationMs, 24 * 3600_000, "media duration"],
|
|
@@ -21,16 +22,16 @@ export const validateLocalTranscriptionOptions = (input) => {
|
|
|
21
22
|
[options.maxTextBytes, 64 * 1024 ** 2, "transcript text bytes"],
|
|
22
23
|
])
|
|
23
24
|
if (value !== undefined && (!Number.isSafeInteger(value) || value < 1 || value > max))
|
|
24
|
-
throw new
|
|
25
|
+
throw new CliError("validation_error", `invalid ${label} budget`);
|
|
25
26
|
for (const value of [options.apply, options.dryRun])
|
|
26
27
|
if (value !== undefined && typeof value !== "boolean")
|
|
27
|
-
throw new
|
|
28
|
+
throw new CliError("validation_error", "transcription apply and dry-run options must be booleans");
|
|
28
29
|
return options;
|
|
29
30
|
};
|
|
30
31
|
export const compactLocalTranscriptionReceipt = (receipt) => {
|
|
31
32
|
const append = receipt.append;
|
|
32
33
|
if (!receipt.applied || !append || !Number.isSafeInteger(append.meeting.meeting.id) || append.meeting.meeting.id < 1)
|
|
33
|
-
throw new
|
|
34
|
+
throw new CliError("outcome_unknown", "transcription did not return a usable committed acknowledgement");
|
|
34
35
|
return {
|
|
35
36
|
applied: true,
|
|
36
37
|
accountId: receipt.accountId,
|
|
@@ -84,7 +85,7 @@ export const createWavTranscriptionSource = (file, options) => {
|
|
|
84
85
|
media.recognition.engine !== recognition.engine ||
|
|
85
86
|
media.recognition.model !== recognition.model ||
|
|
86
87
|
media.recognition.version !== recognition.version)
|
|
87
|
-
throw new
|
|
88
|
+
throw new CliError("validation_error", "transcription media descriptor does not match its prepared audio and model");
|
|
88
89
|
const audio = await openWavAudio(plan, context);
|
|
89
90
|
let model;
|
|
90
91
|
try {
|
|
@@ -97,7 +98,7 @@ export const createWavTranscriptionSource = (file, options) => {
|
|
|
97
98
|
if (model.engine !== recognition.engine ||
|
|
98
99
|
model.model !== recognition.model ||
|
|
99
100
|
model.version !== recognition.version)
|
|
100
|
-
throw new
|
|
101
|
+
throw new CliError("validation_error", "installed speech recognizer changed after the media preview");
|
|
101
102
|
for await (const window of audio.windows()) {
|
|
102
103
|
checkCancelled(context.signal);
|
|
103
104
|
const text = await model.recognize(window.samples, { signal: context.signal });
|
|
@@ -119,7 +120,7 @@ export const createWavTranscriptionSource = (file, options) => {
|
|
|
119
120
|
export const createLocalTranscriptionCapabilities = (store, input = {}) => {
|
|
120
121
|
const accountId = store.accountId;
|
|
121
122
|
if (!Number.isSafeInteger(accountId) || accountId < 1)
|
|
122
|
-
throw new
|
|
123
|
+
throw new CliError("validation_error", "local transcription requires a selected existing account");
|
|
123
124
|
const options = { ...input, ...(input.env ? { env: { ...input.env } } : {}) };
|
|
124
125
|
const resolveMeeting = store.resolveMeeting.bind(store);
|
|
125
126
|
const appendTranscriptsWithReceipt = store.appendTranscriptsWithReceipt.bind(store);
|
|
@@ -139,7 +140,7 @@ export const createLocalTranscriptionCapabilities = (store, input = {}) => {
|
|
|
139
140
|
found.meetingId < 1 ||
|
|
140
141
|
typeof found.externalId !== "string" ||
|
|
141
142
|
!found.externalId.trim())
|
|
142
|
-
throw new
|
|
143
|
+
throw new CliError("not_found", "meeting was not found in the selected account");
|
|
143
144
|
const target = Object.freeze({ accountId, externalId: found.externalId, now: options.now?.() ?? Date.now() });
|
|
144
145
|
const source = createWavTranscriptionSource(file, {
|
|
145
146
|
model: request.model,
|
|
@@ -151,7 +152,7 @@ export const createLocalTranscriptionCapabilities = (store, input = {}) => {
|
|
|
151
152
|
return transcribeMeeting(source, {
|
|
152
153
|
appendTranscriptsWithReceipt(value) {
|
|
153
154
|
if (value.accountId !== accountId || value.externalId !== target.externalId)
|
|
154
|
-
throw new
|
|
155
|
+
throw new CliError("validation_error", "transcription append must retain its selected target");
|
|
155
156
|
return appendTranscriptsWithReceipt(value);
|
|
156
157
|
},
|
|
157
158
|
}, target, request);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transcription.js","sourceRoot":"","sources":["../src/local-transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"local-transcription.js","sourceRoot":"","sources":["../src/local-transcription.ts"],"names":[],"mappings":"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"}
|
package/dist/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,eAAO,MAAM,QAAQ,sCAAsC,CAAA;AAC3D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAA;IACpB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACpD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AACD,eAAO,MAAM,KAAK,YAAmB,YAAY;;;EA0FhD,CAAA"}
|
package/dist/login.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash, randomBytes } from "node:crypto";
|
|
2
2
|
import { createServer } from "node:http";
|
|
3
|
-
import {
|
|
3
|
+
import { CliError } from "@wirecat/cli-base";
|
|
4
|
+
import { checkCancelled } from "./errors.js";
|
|
4
5
|
export const REDIRECT = "https://wirecat.dev/zoom-callback";
|
|
5
6
|
export const login = async (options) => {
|
|
6
7
|
checkCancelled(options.signal);
|
|
@@ -19,7 +20,7 @@ export const login = async (options) => {
|
|
|
19
20
|
checkCancelled(options.signal);
|
|
20
21
|
}
|
|
21
22
|
catch (error) {
|
|
22
|
-
fail(error instanceof Error ? error : new
|
|
23
|
+
fail(error instanceof Error ? error : new CliError("cancelled", "command cancelled"));
|
|
23
24
|
}
|
|
24
25
|
};
|
|
25
26
|
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
@@ -40,9 +41,9 @@ export const login = async (options) => {
|
|
|
40
41
|
if (code)
|
|
41
42
|
accept(code);
|
|
42
43
|
else
|
|
43
|
-
fail(new
|
|
44
|
+
fail(new CliError("authentication_error", "Zoom login was not approved"));
|
|
44
45
|
});
|
|
45
|
-
const timer = setTimeout(() => fail(new
|
|
46
|
+
const timer = setTimeout(() => fail(new CliError("authentication_error", "Zoom login timed out")), options.timeoutMs ?? 300000);
|
|
46
47
|
try {
|
|
47
48
|
await new Promise((resolve, reject) => {
|
|
48
49
|
server.once("error", reject);
|
|
@@ -50,7 +51,7 @@ export const login = async (options) => {
|
|
|
50
51
|
});
|
|
51
52
|
const address = server.address();
|
|
52
53
|
if (!address || typeof address === "string")
|
|
53
|
-
throw new
|
|
54
|
+
throw new CliError("configuration_error", "could not start the local login listener");
|
|
54
55
|
state = `${address.port}.${randomBytes(24).toString("base64url")}`;
|
|
55
56
|
const authorize = new URL("https://zoom.us/oauth/authorize");
|
|
56
57
|
authorize.search = new URLSearchParams({
|
|
@@ -66,7 +67,7 @@ export const login = async (options) => {
|
|
|
66
67
|
const pastePromise = options.readPaste?.(controller.signal).then((text) => {
|
|
67
68
|
const query = new URLSearchParams(text.includes("?") ? text.slice(text.indexOf("?") + 1) : text);
|
|
68
69
|
if (query.get("state") !== state || !query.get("code"))
|
|
69
|
-
throw new
|
|
70
|
+
throw new CliError("authentication_error", "pasted login must contain the matching code and state");
|
|
70
71
|
return query.get("code") ?? "";
|
|
71
72
|
});
|
|
72
73
|
// Paste remains available if the browser cannot start or the callback cannot reach loopback.
|
|
@@ -74,7 +75,7 @@ export const login = async (options) => {
|
|
|
74
75
|
.then(() => options.openBrowser(authorize.toString()))
|
|
75
76
|
.catch(() => {
|
|
76
77
|
if (!options.readPaste)
|
|
77
|
-
fail(new
|
|
78
|
+
fail(new CliError("configuration_error", "could not open the browser; retry with --browser <program>"));
|
|
78
79
|
});
|
|
79
80
|
const code = await (pastePromise ? Promise.race([codePromise, pastePromise]) : codePromise);
|
|
80
81
|
controller.abort();
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
2
|
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
3
|
+
import type { Command } from "commander";
|
|
4
|
+
import type { ZoomPreparationOptions } from "./meeting-preparation.js";
|
|
3
5
|
import { type MeetingModelOptions } from "./meeting-semantic-commands.js";
|
|
4
6
|
import type { StoreConnection } from "./program.js";
|
|
5
7
|
export interface MeetingMcpOptions {
|
|
6
8
|
/** Resolve the selected profile with read intent; each call owns a fresh connection. */
|
|
7
9
|
connectStore: () => Promise<StoreConnection>;
|
|
10
|
+
commandRegistry?: Command;
|
|
8
11
|
version?: string;
|
|
9
12
|
now?: () => number;
|
|
10
13
|
signal?: AbortSignal;
|
|
@@ -14,6 +17,7 @@ export interface MeetingMcpOptions {
|
|
|
14
17
|
includeUnifiedSearch?: boolean;
|
|
15
18
|
includeMeetingContext?: boolean;
|
|
16
19
|
/** Server-selected model for search_meetings by_meaning; tool callers cannot select models or generate vectors. */
|
|
20
|
+
preparation?: ZoomPreparationOptions;
|
|
17
21
|
semanticModel?: MeetingModelOptions;
|
|
18
22
|
}
|
|
19
23
|
/** Embedding seam. Caller owns transport shutdown; each tool call closes its read connection. */
|
package/dist/mcp-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAgB9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGtE,OAAO,EAAE,KAAK,mBAAmB,EAAiD,MAAM,gCAAgC,CAAA;AACxH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAInD,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,YAAY,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;IAC5C,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,wGAAwG;IACxG,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,wFAAwF;IACxF,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,mHAAmH;IACnH,WAAW,CAAC,EAAE,sBAAsB,CAAA;IACpC,aAAa,CAAC,EAAE,mBAAmB,CAAA;CACpC;AAgWD,iGAAiG;AACjG,eAAO,MAAM,sBAAsB,YAAa,iBAAiB,KAAG,MAAqC,CAAA;AAEzG,6FAA6F;AAC7F,eAAO,MAAM,eAAe,YAAmB,iBAAiB,cAAc,SAAS,KAAG,OAAO,CAAC,IAAI,CAkDrG,CAAA"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -2,26 +2,27 @@ 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 { errorObjectOf, isCliError, mcpErrorResult } from "@wirecat/cli-base";
|
|
6
|
-
import {
|
|
5
|
+
import { CliError, errorObjectOf, isCliError, mcpErrorResult } from "@wirecat/cli-base";
|
|
6
|
+
import { LOCAL_READ, meetingPreparationTool, snakeKeys } from "@wirecat/cli-core/cli";
|
|
7
7
|
import { SAVE_INSTRUCTION } from "@wirecat/cli-core/meetings";
|
|
8
8
|
import { callMeetingPassageTool, callMeetingSearchTool, callMeetingTool, meetingPassageTool, meetingProjectEvidenceTool, meetingSearchTool, meetingTools, } from "@wirecat/cli-core/meetings/mcp";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { camelKeys
|
|
9
|
+
import { hostFailureContext } from "./answer-policy.js";
|
|
10
|
+
import { readMetadata, toolAnswer, toolAnswerSchema } from "./answers.js";
|
|
11
|
+
import { camelKeys } from "./keys.js";
|
|
12
12
|
import { validateEvidenceOptions, validatePersonContext, validateTaskKind, validateTaskProposal, } from "./meeting-context.js";
|
|
13
|
+
import { readPreparationTool } from "./meeting-preparation-mcp.js";
|
|
13
14
|
import { readProjectEvidenceTool } from "./meeting-project-evidence-mcp.js";
|
|
14
15
|
import { validateMeetingModel, validateMeetingSemantic } from "./meeting-semantic-commands.js";
|
|
15
|
-
import { runUnifiedSearch } from "./unified-search.js";
|
|
16
|
+
import { runUnifiedSearch, unifiedSearchAnswer } from "./unified-search.js";
|
|
16
17
|
import { VERSION } from "./version.js";
|
|
17
|
-
const failure = (code, message) => mcpErrorResult(errorObjectOf(new
|
|
18
|
-
const crashed = () => mcpErrorResult(errorObjectOf(undefined,
|
|
18
|
+
const failure = (code, message) => mcpErrorResult(errorObjectOf(new CliError(code, message), hostFailureContext(undefined, LOCAL_READ)));
|
|
19
|
+
const crashed = () => mcpErrorResult(errorObjectOf(undefined, hostFailureContext(undefined, LOCAL_READ)));
|
|
19
20
|
/** SDK protocol handling; shared meeting tools own all read behavior and validation. */
|
|
20
21
|
const buildServer = (options) => {
|
|
21
22
|
const semanticModel = options.semanticModel ? Object.freeze({ ...options.semanticModel }) : undefined;
|
|
22
23
|
const maxResultBytes = options.maxResultBytes ?? 4 * 1024 * 1024;
|
|
23
24
|
if (!Number.isSafeInteger(maxResultBytes) || maxResultBytes < 0)
|
|
24
|
-
throw new
|
|
25
|
+
throw new CliError("validation_error", "maxResultBytes must be a nonnegative safe integer");
|
|
25
26
|
const running = new Set();
|
|
26
27
|
let stopping = false;
|
|
27
28
|
const validator = new AjvJsonSchemaValidator();
|
|
@@ -30,6 +31,8 @@ const buildServer = (options) => {
|
|
|
30
31
|
return { ...tool, inputSchema: { ...tool.inputSchema, type: "object", properties } };
|
|
31
32
|
});
|
|
32
33
|
tools.push(meetingProjectEvidenceTool);
|
|
34
|
+
if (options.preparation)
|
|
35
|
+
tools.push(meetingPreparationTool);
|
|
33
36
|
const meaningArguments = {
|
|
34
37
|
by_meaning: { type: "boolean" },
|
|
35
38
|
max_chunks: { type: "integer", minimum: 1, maximum: 10000 },
|
|
@@ -163,6 +166,10 @@ const buildServer = (options) => {
|
|
|
163
166
|
const checked = validate(args);
|
|
164
167
|
if (!checked.valid)
|
|
165
168
|
return failure("validation_error", `invalid meeting tool arguments: ${checked.errorMessage}`);
|
|
169
|
+
if (request.params.name === "meeting_prepare") {
|
|
170
|
+
const result = await readPreparationTool(options, args, signal);
|
|
171
|
+
return cancelled() ? failure("cancelled", "meeting read was cancelled") : bounded(result);
|
|
172
|
+
}
|
|
166
173
|
if (request.params.name === "meeting_project_evidence") {
|
|
167
174
|
const result = await readProjectEvidenceTool(options, args, signal);
|
|
168
175
|
return cancelled() ? failure("cancelled", "meeting read was cancelled") : bounded(result);
|
|
@@ -189,21 +196,21 @@ const buildServer = (options) => {
|
|
|
189
196
|
return typeof value === "function"
|
|
190
197
|
? (...args) => {
|
|
191
198
|
if (cancelled())
|
|
192
|
-
throw new
|
|
199
|
+
throw new CliError("cancelled", "meeting read was cancelled");
|
|
193
200
|
return Reflect.apply(value, target, args);
|
|
194
201
|
}
|
|
195
202
|
: value;
|
|
196
203
|
},
|
|
197
204
|
});
|
|
198
205
|
if (request.params.name === "search_meetings" && args.by_meaning === true) {
|
|
199
|
-
if (!semanticModel
|
|
200
|
-
throw new
|
|
206
|
+
if (!semanticModel)
|
|
207
|
+
throw new CliError("configuration_error", "meeting search by meaning is unavailable");
|
|
201
208
|
const wordsOnly = Object.keys(args).filter((key) => !["query", "limit", "cursor", ...Object.keys(meaningArguments)].includes(key));
|
|
202
209
|
if (wordsOnly.length)
|
|
203
|
-
throw new
|
|
210
|
+
throw new CliError("validation_error", `${wordsOnly.join(", ")} do not apply to a search by meaning`);
|
|
204
211
|
const cursor = args.cursor;
|
|
205
212
|
if (cursor !== undefined && !/^[1-9]\d{0,15}$/.test(cursor))
|
|
206
|
-
throw new
|
|
213
|
+
throw new CliError("validation_error", "cursor by meaning takes the previous page's next_cursor");
|
|
207
214
|
const request = {
|
|
208
215
|
...semanticModel,
|
|
209
216
|
limit: args.limit,
|
|
@@ -216,22 +223,17 @@ const buildServer = (options) => {
|
|
|
216
223
|
validateMeetingSemantic(args.query, request);
|
|
217
224
|
const value = await connection.meetingSemantic.search(args.query, request);
|
|
218
225
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
219
|
-
throw new
|
|
226
|
+
throw new CliError("invalid_response", "meeting search by meaning returned an invalid report");
|
|
220
227
|
const next = value.nextChunkId;
|
|
221
228
|
const found = snakeKeys({ ...value, nextCursor: next === undefined ? null : String(next) });
|
|
222
229
|
result = { content: [{ type: "text", text: JSON.stringify(found) }], structuredContent: found };
|
|
223
230
|
}
|
|
224
231
|
else if (request.params.name === "meeting_passage") {
|
|
225
|
-
|
|
226
|
-
if (!passage)
|
|
227
|
-
throw new ZoomError("configuration_error", "meeting passage capability is unavailable");
|
|
228
|
-
result = await callMeetingPassageTool(passage, args, signal, failureContext());
|
|
232
|
+
result = await callMeetingPassageTool(connection.meetingContext.passage, args, signal, hostFailureContext(options.commandRegistry, LOCAL_READ));
|
|
229
233
|
}
|
|
230
234
|
else if (request.params.name === "search_meetings") {
|
|
231
|
-
if (!connection.meetingSearch)
|
|
232
|
-
throw new ZoomError("configuration_error", "meeting search is unavailable");
|
|
233
235
|
const words = Object.fromEntries(Object.entries(args).filter(([key]) => !(key === "by_meaning" && args.by_meaning === false)));
|
|
234
|
-
result = await callMeetingSearchTool(connection.meetingSearch, words, signal,
|
|
236
|
+
result = await callMeetingSearchTool(connection.meetingSearch, words, signal, hostFailureContext(options.commandRegistry, LOCAL_READ));
|
|
235
237
|
}
|
|
236
238
|
else if (["meeting_evidence", "person_meeting_context", "meeting_task_proposal"].includes(request.params.name)) {
|
|
237
239
|
const context = connection.meetingContext;
|
|
@@ -247,8 +249,6 @@ const buildServer = (options) => {
|
|
|
247
249
|
signal,
|
|
248
250
|
};
|
|
249
251
|
validateEvidenceOptions(options);
|
|
250
|
-
if (!context?.evidence)
|
|
251
|
-
throw new ZoomError("configuration_error", "meeting evidence capability is unavailable");
|
|
252
252
|
value = await context.evidence(args.reference, options);
|
|
253
253
|
}
|
|
254
254
|
else if (request.params.name === "person_meeting_context") {
|
|
@@ -261,44 +261,36 @@ const buildServer = (options) => {
|
|
|
261
261
|
signal,
|
|
262
262
|
};
|
|
263
263
|
validatePersonContext(args.person, options);
|
|
264
|
-
if (!context?.personContext)
|
|
265
|
-
throw new ZoomError("configuration_error", "person meeting context capability is unavailable");
|
|
266
264
|
value = await context.personContext(args.person, options);
|
|
267
265
|
}
|
|
268
266
|
else {
|
|
269
267
|
validateTaskKind(args.kind);
|
|
270
|
-
if (!context?.taskProposal)
|
|
271
|
-
throw new ZoomError("configuration_error", "meeting task proposal capability is unavailable");
|
|
272
268
|
value = await context.taskProposal(args.reference, args.kind, signal);
|
|
273
269
|
validateTaskProposal(value);
|
|
274
270
|
}
|
|
275
271
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
276
|
-
throw new
|
|
272
|
+
throw new CliError("invalid_response", "meeting context returned an invalid report");
|
|
277
273
|
const found = snakeKeys(value);
|
|
278
274
|
result = { content: [{ type: "text", text: JSON.stringify(found) }], structuredContent: found };
|
|
279
275
|
}
|
|
280
276
|
else if (request.params.name === "search_all") {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}, true);
|
|
293
|
-
const snake = snakeKeys(found);
|
|
294
|
-
result = { content: [{ type: "text", text: JSON.stringify(snake) }], structuredContent: snake };
|
|
295
|
-
}
|
|
277
|
+
const found = await runUnifiedSearch(connection.unifiedSearch, {
|
|
278
|
+
text: args.query,
|
|
279
|
+
limit: args.limit ?? 100,
|
|
280
|
+
maxMeetings: args.max_meetings,
|
|
281
|
+
exact: args.exact,
|
|
282
|
+
meetingCursor: camelKeys(args.meeting_cursor),
|
|
283
|
+
only: ["meetings"],
|
|
284
|
+
signal,
|
|
285
|
+
}, true);
|
|
286
|
+
const snake = snakeKeys(unifiedSearchAnswer(found));
|
|
287
|
+
result = { content: [{ type: "text", text: JSON.stringify(snake) }], structuredContent: snake };
|
|
296
288
|
}
|
|
297
289
|
else
|
|
298
290
|
result = await callMeetingTool(store, request.params.name, {
|
|
299
291
|
...args,
|
|
300
292
|
account_id: connection.accountId,
|
|
301
|
-
},
|
|
293
|
+
}, hostFailureContext(options.commandRegistry, LOCAL_READ));
|
|
302
294
|
}
|
|
303
295
|
}
|
|
304
296
|
catch (error) {
|
|
@@ -311,7 +303,7 @@ const buildServer = (options) => {
|
|
|
311
303
|
"person_meeting_context",
|
|
312
304
|
"meeting_task_proposal",
|
|
313
305
|
].includes(request.params.name) && isCliError(error)
|
|
314
|
-
? mcpErrorResult(errorObjectOf(error,
|
|
306
|
+
? mcpErrorResult(errorObjectOf(error, hostFailureContext(undefined, LOCAL_READ)))
|
|
315
307
|
: crashed();
|
|
316
308
|
}
|
|
317
309
|
finally {
|
|
@@ -326,11 +318,11 @@ const buildServer = (options) => {
|
|
|
326
318
|
return failure("cancelled", "meeting read was cancelled");
|
|
327
319
|
if (!result.isError) {
|
|
328
320
|
try {
|
|
329
|
-
const answer =
|
|
321
|
+
const answer = toolAnswer(result.structuredContent, meta(), options.commandRegistry);
|
|
330
322
|
result = { content: [{ type: "text", text: JSON.stringify(answer) }], structuredContent: answer };
|
|
331
323
|
}
|
|
332
324
|
catch (error) {
|
|
333
|
-
result = mcpErrorResult(errorObjectOf(error,
|
|
325
|
+
result = mcpErrorResult(errorObjectOf(error, hostFailureContext(undefined, LOCAL_READ)));
|
|
334
326
|
}
|
|
335
327
|
}
|
|
336
328
|
return bounded(result);
|