minutes-mcp 0.22.1 → 0.24.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/dist/index.d.ts CHANGED
@@ -204,4 +204,10 @@ export type LiveEventsSubscriptionController = {
204
204
  subscriptionCount: () => number;
205
205
  };
206
206
  export declare function registerLiveEventsSubscriptionHandlers(mcpServer: McpServer, options?: LiveEventsSubscriptionOptions): LiveEventsSubscriptionController;
207
+ export interface DictationModelMissingError {
208
+ model: string;
209
+ expectedPath: string;
210
+ setupCommand: string;
211
+ }
212
+ export declare function parseDictationModelMissingError(stderr: string): DictationModelMissingError | null;
207
213
  export {};
package/dist/index.js CHANGED
@@ -419,7 +419,7 @@ const COPILOT_SUPPORTED = hasFeature(CLI_CAPABILITIES, "copilot_realtime");
419
419
  // `./version.ts` (see issue #183). Hosted `.mcpb` bundles will run
420
420
  // against CLIs with different minor/patch numbers within the same
421
421
  // major; that is explicitly supported.
422
- const MCP_SERVER_VERSION = "0.22.1";
422
+ const MCP_SERVER_VERSION = "0.24.0";
423
423
  export function parseKnowledgeConfig(configContent) {
424
424
  const knowledgeMatch = configContent.match(/\[knowledge\][\s\S]*?(?=\n\[|$)/);
425
425
  if (!knowledgeMatch) {
@@ -3064,7 +3064,14 @@ server.resource("recent-ideas", "minutes://ideas/recent", { description: "Recent
3064
3064
  }],
3065
3065
  };
3066
3066
  });
3067
- // ── Tool: start_dictation ──────────────────────────────────
3067
+ export function parseDictationModelMissingError(stderr) {
3068
+ const model = stderr.match(/Dictation model not installed:\s*([^\r\n]+)/)?.[1]?.trim();
3069
+ const expectedPath = stderr.match(/Expected:\s*([^\r\n]+)/)?.[1]?.trim();
3070
+ const setupCommand = stderr.match(/Fix:\s*([^\r\n]+)/)?.[1]?.trim();
3071
+ if (!model || !expectedPath || !setupCommand)
3072
+ return null;
3073
+ return { model, expectedPath, setupCommand };
3074
+ }
3068
3075
  registerTool("start_dictation", "Start dictation mode. Speak naturally — text accumulates across pauses and the combined result is written when dictation ends. Runs until stop_dictation is called or silence timeout.", {
3069
3076
  language: z.string().optional().describe("Transcription language code (e.g. 'en', 'ur', 'es', 'zh'). Overrides config.toml setting."),
3070
3077
  }, { title: "Start Dictation", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async ({ language }) => {
@@ -3099,6 +3106,48 @@ registerTool("start_dictation", "Start dictation mode. Speak naturally — text
3099
3106
  isError: true,
3100
3107
  };
3101
3108
  }
3109
+ try {
3110
+ await execFileAsync(MINUTES_BIN, ["dictate", "--preflight"], {
3111
+ timeout: 5000,
3112
+ env: augmentedEnv(),
3113
+ });
3114
+ }
3115
+ catch (error) {
3116
+ const stderr = typeof error?.stderr === "string" ? error.stderr : "";
3117
+ const missing = parseDictationModelMissingError(stderr);
3118
+ if (missing) {
3119
+ return {
3120
+ content: [
3121
+ {
3122
+ type: "text",
3123
+ text: `Dictation model '${missing.model}' is not installed. ` +
3124
+ `Expected it at ${missing.expectedPath}.\n\nFix: ${missing.setupCommand}`,
3125
+ },
3126
+ ],
3127
+ structuredContent: {
3128
+ status: "error",
3129
+ code: "MODEL_MISSING",
3130
+ model: missing.model,
3131
+ expectedPath: missing.expectedPath,
3132
+ setupCommand: missing.setupCommand,
3133
+ },
3134
+ isError: true,
3135
+ };
3136
+ }
3137
+ return {
3138
+ content: [
3139
+ {
3140
+ type: "text",
3141
+ text: `Dictation could not pass startup checks: ${stderr.trim() || error?.message || error}`,
3142
+ },
3143
+ ],
3144
+ structuredContent: {
3145
+ status: "error",
3146
+ code: "DICTATION_PREFLIGHT_FAILED",
3147
+ },
3148
+ isError: true,
3149
+ };
3150
+ }
3102
3151
  // Spawn dictation as child (not detached — preserves macOS TCC mic grant)
3103
3152
  const dictArgs = ["dictate"];
3104
3153
  if (language)