maka-agent 0.2.0-dev.41.20260918 → 0.2.0-dev.42.20260918

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/LICENSE +7 -4
  2. package/native/runtime-host-windows-task-launcher/prebuilds/win32-x64/maka-runtime-host-task-launcher.exe +0 -0
  3. package/node_modules/@maka/core/dist/client-plugin-bridge.js +19 -0
  4. package/node_modules/@maka/core/dist/events.js +58 -7
  5. package/node_modules/@maka/core/dist/interaction.js +38 -4
  6. package/node_modules/@maka/core/dist/llm-connections.js +4 -0
  7. package/node_modules/@maka/core/dist/model-metadata.js +89 -0
  8. package/node_modules/@maka/core/dist/recall.js +198 -15
  9. package/node_modules/@maka/core/dist/redaction.js +8 -0
  10. package/node_modules/@maka/core/dist/session-reference.js +149 -0
  11. package/node_modules/@maka/core/package.json +2 -0
  12. package/node_modules/@maka/runtime/dist/model-factory.js +5 -3
  13. package/node_modules/@maka/runtime/dist/model-history.js +13 -2
  14. package/node_modules/@maka/runtime/dist/plugin-client-bridge-service.js +308 -0
  15. package/node_modules/@maka/runtime/dist/plugin-composition-loader.js +4 -3
  16. package/node_modules/@maka/runtime/dist/plugin-data-services.js +3 -3
  17. package/node_modules/@maka/runtime/dist/recall-tools.js +70 -2
  18. package/node_modules/@maka/runtime/package.json +1 -0
  19. package/node_modules/@maka/runtime-host/dist/protocol/index.js +7 -1
  20. package/node_modules/@maka/runtime-host/dist/protocol/operations.js +5 -0
  21. package/node_modules/@maka/runtime-host/dist/protocol/plugin-platform.js +269 -0
  22. package/node_modules/@maka/runtime-host/dist/protocol/workhub-coordination.js +2 -0
  23. package/node_modules/@maka/runtime-host/dist/server/execution-composition.js +46 -6
  24. package/node_modules/@maka/runtime-host/dist/server/extension-package-manifest.js +19 -1
  25. package/node_modules/@maka/runtime-host/dist/server/plugin-package-loader.js +88 -14
  26. package/node_modules/@maka/runtime-host/dist/server/plugin-package-store.js +22 -5
  27. package/node_modules/@maka/runtime-host/dist/server/plugin-platform-coordinator.js +122 -1
  28. package/node_modules/@maka/runtime-host/dist/server/plugin-platform.js +120 -1
  29. package/node_modules/@maka/runtime-host/dist/server/recall-material-fetch.js +92 -0
  30. package/node_modules/@maka/runtime-host/dist/server/root-turn-coordinator.js +14 -1
  31. package/node_modules/@maka/runtime-host/dist/server/session-catalog-coordinator.js +17 -1
  32. package/node_modules/@maka/runtime-host/dist/server/workhub-coordination-action-gate.js +67 -3
  33. package/node_modules/@maka/runtime-host/dist/server/workhub-coordination-coordinator.js +9 -3
  34. package/node_modules/@maka/runtime-host/dist/server/workhub-target-execution-authority.js +161 -0
  35. package/package.json +1 -1
package/LICENSE CHANGED
@@ -465,16 +465,19 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
465
465
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
466
466
  THE SOFTWARE.
467
467
 
468
- electron-builder dependency patch
468
+ electron-builder dependency patches
469
469
 
470
470
  Source: https://www.npmjs.com/package/app-builder-lib/v/26.15.3
471
+ https://www.npmjs.com/package/electron-updater/v/6.8.9
471
472
  Repository: https://github.com/electron-userland/electron-builder
472
- Version: 26.15.3
473
+ Versions: app-builder-lib 26.15.3; electron-updater 6.8.9
473
474
  Dependency patch: patches/app-builder-lib+26.15.3.patch
475
+ patches/electron-updater+6.8.9.patch
474
476
  License: MIT
475
477
 
476
- Maka redistributes a source patch that omits modification and access times
477
- from ZIP archives. The following MIT License applies to that material:
478
+ Maka redistributes source patches that omit modification and access times
479
+ from ZIP archives and skip withdrawn prereleases whose update metadata is
480
+ missing. The following MIT License applies to that material:
478
481
 
479
482
  The MIT License (MIT)
480
483
 
@@ -0,0 +1,19 @@
1
+ /*
2
+ * Licensed to the Apache Software Foundation (ASF) under one
3
+ * or more contributor license agreements. See the NOTICE file
4
+ * distributed with this work for additional information
5
+ * regarding copyright ownership. The ASF licenses this file
6
+ * to you under the Apache License, Version 2.0 (the
7
+ * "License"); you may not use this file except in compliance
8
+ * with the License. You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing,
13
+ * software distributed under the License is distributed on an
14
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ * KIND, either express or implied. See the License for the
16
+ * specific language governing permissions and limitations
17
+ * under the License.
18
+ */
19
+ export {};
@@ -79,7 +79,16 @@ export function hasMeaningfulMessageContent(content) {
79
79
  (content.directoryReferences?.length ?? 0) > 0);
80
80
  }
81
81
  const ATTACHMENT_REF_SHAPE = defineObjectShape()(['kind', 'name', 'mimeType', 'bytes', 'ref'], []);
82
- const QUOTE_REF_SHAPE = defineObjectShape()(['text'], ['label', 'sourceTurnId']);
82
+ const QUOTE_REF_SHAPE = defineObjectShape()(['text'], [
83
+ 'label',
84
+ 'sourceTurnId',
85
+ 'sourceSessionId',
86
+ 'sourceSessionName',
87
+ 'sourceCapturedAt',
88
+ 'sourceTruncated',
89
+ ]);
90
+ const QUOTE_REF_SESSION_ID_MAX_LENGTH = 512;
91
+ const QUOTE_REF_SESSION_NAME_MAX_LENGTH = 200;
83
92
  const INLINE_REFERENCE_SHAPE = defineObjectShape()(['kind', 'value', 'label', 'start'], []);
84
93
  const INLINE_SKILL_REFERENCE_VALUE = /^\/skill:[A-Za-z0-9._-]+$/;
85
94
  export const INLINE_REFERENCE_MAX_COUNT = 32;
@@ -113,6 +122,22 @@ export function normalizeMessageContent(content) {
113
122
  text: quote.text,
114
123
  ...(quote.label !== undefined ? { label: quote.label } : {}),
115
124
  ...(quote.sourceTurnId !== undefined ? { sourceTurnId: quote.sourceTurnId } : {}),
125
+ ...(quote.sourceSessionId !== undefined
126
+ ? { sourceSessionId: quote.sourceSessionId }
127
+ : {}),
128
+ ...(quote.sourceSessionName !== undefined
129
+ ? { sourceSessionName: quote.sourceSessionName }
130
+ : {}),
131
+ ...(quote.sourceCapturedAt !== undefined
132
+ ? {
133
+ sourceCapturedAt: Object.is(quote.sourceCapturedAt, -0)
134
+ ? 0
135
+ : quote.sourceCapturedAt,
136
+ }
137
+ : {}),
138
+ ...(quote.sourceTruncated !== undefined
139
+ ? { sourceTruncated: quote.sourceTruncated }
140
+ : {}),
116
141
  })),
117
142
  }
118
143
  : {}),
@@ -205,11 +230,33 @@ export function isInlineReference(value) {
205
230
  })));
206
231
  }
207
232
  export function isQuoteRef(value) {
208
- return (isRecord(value) &&
209
- hasExactShape(value, QUOTE_REF_SHAPE) &&
210
- typeof value.text === 'string' &&
211
- (value.label === undefined || typeof value.label === 'string') &&
212
- (value.sourceTurnId === undefined || typeof value.sourceTurnId === 'string'));
233
+ const record = isRecord(value) ? value : undefined;
234
+ const sourceFields = record
235
+ ? [
236
+ record.sourceSessionId,
237
+ record.sourceSessionName,
238
+ record.sourceCapturedAt,
239
+ record.sourceTruncated,
240
+ ]
241
+ : [];
242
+ const hasSourceMetadata = sourceFields.some((field) => field !== undefined);
243
+ return (record !== undefined &&
244
+ hasExactShape(record, QUOTE_REF_SHAPE) &&
245
+ typeof record.text === 'string' &&
246
+ (record.label === undefined || typeof record.label === 'string') &&
247
+ (record.sourceTurnId === undefined || typeof record.sourceTurnId === 'string') &&
248
+ (!hasSourceMetadata ||
249
+ (typeof record.sourceSessionId === 'string' &&
250
+ record.sourceSessionId.length > 0 &&
251
+ record.sourceSessionId.length <= QUOTE_REF_SESSION_ID_MAX_LENGTH &&
252
+ typeof record.sourceSessionName === 'string' &&
253
+ record.sourceSessionName.length > 0 &&
254
+ record.sourceSessionName.length <= QUOTE_REF_SESSION_NAME_MAX_LENGTH &&
255
+ typeof record.sourceCapturedAt === 'number' &&
256
+ Number.isFinite(record.sourceCapturedAt) &&
257
+ record.sourceCapturedAt >= 0 &&
258
+ record.sourceCapturedAt <= 8.64e15 &&
259
+ typeof record.sourceTruncated === 'boolean')));
213
260
  }
214
261
  export function isAttachmentRef(value) {
215
262
  return (isRecord(value) &&
@@ -339,7 +386,11 @@ function inlineReferencesEqual(left, right) {
339
386
  function quoteRefsEqual(left, right) {
340
387
  return (left.text === right.text &&
341
388
  left.label === right.label &&
342
- left.sourceTurnId === right.sourceTurnId);
389
+ left.sourceTurnId === right.sourceTurnId &&
390
+ left.sourceSessionId === right.sourceSessionId &&
391
+ left.sourceSessionName === right.sourceSessionName &&
392
+ left.sourceCapturedAt === right.sourceCapturedAt &&
393
+ left.sourceTruncated === right.sourceTruncated);
343
394
  }
344
395
  function attachmentRefsEqual(left, right) {
345
396
  if (left.kind !== right.kind ||
@@ -77,8 +77,8 @@ const CLOSURE_OUTCOME_SHAPE = defineObjectShape()(['kind', 'reason', 'committedA
77
77
  const QUESTION_SHAPE = defineObjectShape()(['question', 'options'], []);
78
78
  const OPTION_SHAPE = defineObjectShape()(['label'], ['description']);
79
79
  const FORM_REQUESTER_SHAPE = defineObjectShape()(['name'], ['source']);
80
- const FORM_OPTION_SHAPE = defineObjectShape()(['value', 'label'], []);
81
- const FORM_STRING_FIELD_SHAPE = defineObjectShape()(['kind', 'name', 'label', 'required'], ['description', 'default', 'minLength', 'maxLength', 'format']);
80
+ const FORM_OPTION_SHAPE = defineObjectShape()(['value', 'label'], ['description']);
81
+ const FORM_STRING_FIELD_SHAPE = defineObjectShape()(['kind', 'name', 'label', 'required'], ['description', 'default', 'minLength', 'maxLength', 'format', 'presentation']);
82
82
  const FORM_NUMBER_FIELD_SHAPE = defineObjectShape()(['kind', 'name', 'label', 'required'], ['description', 'default', 'minimum', 'maximum']);
83
83
  const FORM_BOOLEAN_FIELD_SHAPE = defineObjectShape()(['kind', 'name', 'label', 'required'], ['description', 'default']);
84
84
  const FORM_SINGLE_SELECT_FIELD_SHAPE = defineObjectShape()(['kind', 'name', 'label', 'required', 'options'], ['description', 'default']);
@@ -405,6 +405,11 @@ function projectInteractionFormField(field) {
405
405
  const options = field.options.map((option) => ({
406
406
  ...option,
407
407
  label: projectInteractionReviewText(option.label, INTERACTION_FORM_FIELD_LABEL_MAX_BYTES),
408
+ ...(option.description === undefined
409
+ ? {}
410
+ : {
411
+ description: projectInteractionReviewText(option.description, INTERACTION_FORM_FIELD_DESCRIPTION_MAX_BYTES, true),
412
+ }),
408
413
  }));
409
414
  if (new Set(options.map((option) => option.label)).size !== options.length) {
410
415
  throw new Error('Form option labels collide after safe projection');
@@ -573,7 +578,15 @@ function decodeFormField(value) {
573
578
  : {
574
579
  format: oneOf(record.format, ['email', 'uri', 'date', 'date-time'], 'form string format'),
575
580
  }),
581
+ ...(record.presentation === undefined
582
+ ? {}
583
+ : {
584
+ presentation: oneOf(record.presentation, ['model_picker'], 'string presentation'),
585
+ }),
576
586
  };
587
+ if (field.presentation === 'model_picker' && field.format !== undefined) {
588
+ throw new Error('Model picker string field cannot declare a format');
589
+ }
577
590
  if (field.default !== undefined && !isInteractionFormFieldValueValid(field, field.default)) {
578
591
  throw new Error('Invalid form string default');
579
592
  }
@@ -674,6 +687,11 @@ function decodeFormOptions(value) {
674
687
  return Object.freeze({
675
688
  value: boundedText(record.value, 'form option value', INTERACTION_FORM_VALUE_MAX_BYTES),
676
689
  label: boundedString(record.label, 'form option label', INTERACTION_FORM_FIELD_LABEL_MAX_BYTES),
690
+ ...(record.description === undefined
691
+ ? {}
692
+ : {
693
+ description: boundedText(record.description, 'form option description', INTERACTION_FORM_FIELD_DESCRIPTION_MAX_BYTES),
694
+ }),
677
695
  });
678
696
  });
679
697
  if (new Set(options.map((option) => option.value)).size !== options.length) {
@@ -737,7 +755,8 @@ export function isInteractionFormFieldValueValid(field, value) {
737
755
  const length = [...value].length;
738
756
  return ((field.minLength === undefined || length >= field.minLength) &&
739
757
  (field.maxLength === undefined || length <= field.maxLength) &&
740
- matchesStringFormat(value, field.format));
758
+ matchesStringFormat(value, field.format) &&
759
+ (field.presentation !== 'model_picker' || isCanonicalModelChoiceValue(value)));
741
760
  }
742
761
  if (field.kind === 'number' || field.kind === 'integer') {
743
762
  return (typeof value === 'number' &&
@@ -836,8 +855,9 @@ function formFieldMaximumEnvelope(field) {
836
855
  if (field.format === 'date')
837
856
  return '0000-01-01';
838
857
  const maximumCodePoints = Math.min(field.maxLength ?? INTERACTION_FORM_VALUE_MAX_BYTES, INTERACTION_FORM_VALUE_MAX_BYTES);
839
- if (field.format === 'date-time')
858
+ if (field.format === 'date-time' || field.presentation === 'model_picker') {
840
859
  return '0'.repeat(maximumCodePoints);
860
+ }
841
861
  return '\u0001'.repeat(maximumCodePoints);
842
862
  }
843
863
  if (field.kind === 'number' || field.kind === 'integer')
@@ -852,6 +872,17 @@ function formFieldMaximumEnvelope(field) {
852
872
  .slice(0, field.maxItems ?? field.options.length)
853
873
  .map((option) => option.value);
854
874
  }
875
+ function isCanonicalModelChoiceValue(value) {
876
+ const components = value.split(':');
877
+ if (components.length !== 3 || components.some((component) => component.length === 0))
878
+ return false;
879
+ try {
880
+ return components.every((component) => encodeURIComponent(decodeURIComponent(component)) === component);
881
+ }
882
+ catch {
883
+ return false;
884
+ }
885
+ }
855
886
  function serializedByteLength(value) {
856
887
  return UTF8.encode(JSON.stringify(value)).byteLength;
857
888
  }
@@ -884,6 +915,9 @@ function formFieldWitness(field) {
884
915
  const fractionalLength = minLength <= 20 ? 0 : Math.max(1, minLength - 21);
885
916
  value = fractionalLength === 0 ? `${base}Z` : `${base}.${'0'.repeat(fractionalLength)}Z`;
886
917
  }
918
+ else if (field.presentation === 'model_picker') {
919
+ value = `a:a:${'a'.repeat(Math.max(1, minLength - 4))}`;
920
+ }
887
921
  else {
888
922
  value = 'a'.repeat(minLength);
889
923
  }
@@ -27,6 +27,10 @@ const MODEL_MODALITIES = ['text', 'image', 'audio', 'pdf', 'video'];
27
27
  export function isModelModality(value) {
28
28
  return MODEL_MODALITIES.includes(value);
29
29
  }
30
+ /** Stable client/Host value for one exact configured connection and model. */
31
+ export function connectionModelChoiceValue(connectionId, connectionSlug, model) {
32
+ return `${encodeURIComponent(connectionId)}:${encodeURIComponent(connectionSlug)}:${encodeURIComponent(model)}`;
33
+ }
30
34
  /**
31
35
  * Read-time normalizer: the model ids a stored connection exposes.
32
36
  *
@@ -318,6 +318,92 @@ function ollamaCloudThinkingModels(active) {
318
318
  !id.startsWith('gpt-oss'))
319
319
  .map(([id]) => [id, { thinkingOptions: OLLAMA_CLOUD_STANDARD_THINKING_OPTIONS }]));
320
320
  }
321
+ // Command Code declares no reasoning metadata over its API — the public
322
+ // `/provider/v1/models` listing carries only id/object/created/owned_by/name/
323
+ // context_length/supported_endpoints, and `/provider/v1/models/<id>` is not a
324
+ // route. The selectable `reasoning_effort` levels therefore live only in the
325
+ // official CLI's bundled model table, which the MIT `pi-commandcode-provider`
326
+ // project and its derivative `Mars-Sea/dsh-commandcode-provider`
327
+ // (`src/capabilities.ts`, `KNOWN_EFFORTS`) are the traceable extraction of.
328
+ //
329
+ // Ported from `dsh-commandcode-provider`'s `KNOWN_EFFORTS`, which was
330
+ // re-verified against `command-code@1.53.0` (`dist/cli.mjs`'s provider effort
331
+ // map). The reference keeps a running changelog of which CLI release added or
332
+ // removed each line; that history is summarized here per entry. We pin
333
+ // `command-code@1.54.0`, so a future re-sync should re-read that release's
334
+ // bundle — a wrong effort word is refused by the wire or ignored by the model,
335
+ // it is not silently mis-billed.
336
+ //
337
+ // Two rules from the reference that must survive re-syncs:
338
+ // - Models that reason automatically under a depth Command Code chooses
339
+ // (Tencent Hy3/Hy4 without levels, GLM-5/5.1/5.2-Fast, and the previews in
340
+ // the reference's `KNOWN_THINKING_MODELS`) carry no selectable effort, so
341
+ // they are absent here and the picker offers no selector for them.
342
+ // - Only the Provider-API table is authoritative for this route. Do not add
343
+ // levels observed on the OAuth (anthropic/openai) tables.
344
+ const COMMAND_CODE_MODEL_METADATA = {
345
+ 'Qwen/Qwen3.8-Max': { thinkingOptions: { efforts: ['low', 'medium', 'xhigh'] } },
346
+ 'Qwen/Qwen3.8-Max-0902': { thinkingOptions: { efforts: ['low', 'medium', 'xhigh'] } },
347
+ 'Qwen/Qwen3.8-27B': { thinkingOptions: { efforts: ['low', 'medium', 'xhigh'] } },
348
+ 'Qwen/Qwen3.8-Flash': { thinkingOptions: { efforts: ['low', 'medium', 'xhigh'] } },
349
+ 'claude-fable-5-1': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
350
+ 'claude-fable-5': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
351
+ 'claude-opus-4-7': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
352
+ 'claude-opus-4-8': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
353
+ 'claude-opus-5': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
354
+ 'claude-sonnet-4-6': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
355
+ 'claude-sonnet-5': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
356
+ // 1.39.0 added the model; 1.39.1 dropped `medium`; 1.39.2 ships this set.
357
+ 'deepseek/deepseek-v4-flash-fast': { thinkingOptions: { efforts: ['low', 'high', 'max'] } },
358
+ // 1.53.0 added DeepSeek V4.1 Flash with this set.
359
+ 'deepseek/deepseek-v4.1-flash': { thinkingOptions: { efforts: ['low', 'high', 'max'] } },
360
+ 'deepseek/deepseek-v4-flash': { thinkingOptions: { efforts: ['high', 'max'] } },
361
+ 'deepseek/deepseek-v4-flash-vision-exp': { thinkingOptions: { efforts: ['high', 'max'] } },
362
+ 'deepseek/deepseek-v4-pro': { thinkingOptions: { efforts: ['high', 'max'] } },
363
+ 'google/gemini-3.1-flash-lite': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
364
+ 'google/gemini-3.5-flash': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
365
+ 'google/gemini-3.5-flash-lite': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
366
+ 'google/gemini-3.6-flash': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
367
+ 'google/gemini-3.7-flash': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
368
+ // 1.43.0 added Gemini 3.8 Flash with the family's three-level set.
369
+ 'google/gemini-3.8-flash': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
370
+ 'gpt-5.3-codex': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] } },
371
+ 'gpt-5.4': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] } },
372
+ 'gpt-5.4-mini': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
373
+ 'gpt-5.5': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] } },
374
+ 'gpt-5.6-luna': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
375
+ 'gpt-5.6-sol': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
376
+ 'gpt-5.6-terra': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
377
+ // 1.39.3 gained selectable levels (previously thought automatically).
378
+ 'moonshotai/Kimi-K3': { thinkingOptions: { efforts: ['low', 'high', 'max'] } },
379
+ 'sakana/fugu-ultra': { thinkingOptions: { efforts: ['high', 'xhigh'] } },
380
+ // 1.38.0 gained selectable levels (previously thought automatically).
381
+ 'tencent/hy4-preview': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
382
+ 'xai/grok-4.5': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
383
+ 'xai/grok-4.6': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] } },
384
+ // Successor of `stealth/ox-alpha`, removed in 1.34.0 with the same set.
385
+ 'z-ai/glm-5.3-flash': { thinkingOptions: { efforts: ['low', 'high', 'max'] } },
386
+ 'zai-org/GLM-5.2': { thinkingOptions: { efforts: ['high', 'max'] } },
387
+ 'zai-org/GLM-5.3': { thinkingOptions: { efforts: ['low', 'high', 'max'] } },
388
+ // Muse Spark gained selectable levels in 1.45.0; 1.48.0 added `max` to 1.3
389
+ // only, so 1.3 and 1.3-contributor now differ.
390
+ 'meta/muse-spark-1.1': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] } },
391
+ 'meta/muse-spark-1.2': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] } },
392
+ 'meta/muse-spark-1.2-contributor': {
393
+ thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] },
394
+ },
395
+ 'meta/muse-spark-1.3': {
396
+ thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] },
397
+ },
398
+ 'meta/muse-spark-1.3-contributor': {
399
+ thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh'] },
400
+ },
401
+ // 1.49.0 added GPT-6 Astra with the five-level set.
402
+ 'gpt-6-astra': { thinkingOptions: { efforts: ['low', 'medium', 'high', 'xhigh', 'max'] } },
403
+ // 1.51.3 gave MiniMax M3 selectable levels (read from the bundle; the
404
+ // 1.51.1–1.51.3 changelog had not been published at extraction time).
405
+ 'MiniMaxAI/MiniMax-M3': { thinkingOptions: { efforts: ['low', 'medium', 'high'] } },
406
+ };
321
407
  // Facts that models.dev cannot express: provider wire controls and
322
408
  // access-path-specific aliases/limits. Standard model facts stay generated.
323
409
  //
@@ -327,6 +413,9 @@ function buildStaticModelMetadata(active) {
327
413
  return {
328
414
  anthropic: ANTHROPIC_MODEL_OVERRIDES,
329
415
  'claude-subscription': claudeSubscriptionModelMetadata(active),
416
+ // Both Command Code providers ride the same Provider-API effort table.
417
+ commandcode: COMMAND_CODE_MODEL_METADATA,
418
+ 'commandcode-go': COMMAND_CODE_MODEL_METADATA,
330
419
  'alibaba-token-plan-cn': {
331
420
  'qwen3.8-max': {
332
421
  thinkingOptions: { efforts: ['none', 'low', 'medium', 'xhigh'], toggle: true },