@thalovant/mcp-server 0.6.1 → 0.6.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.3 — 2026-10-11
4
+
5
+ - **Sentences in the language the hub answers in.** `thalovant_intent_inventory` takes `@thalovant/sdk` 0.9.9, which lists a language the hub never loaded in one of the hub's own languages: the same language in another region first, then the hub's own language, then the one with the most sentences. A hub loads its `lang` and `secondary_langs` and lists nothing under any other tag, so on 2026-10-11 a ja-JP, es-ES or de-DE request came back empty on every public hub, even though the hub answers those people. The output's `listed_in` names the language each requested language was listed in. `examples` are now rendered from that language (they used to be rendered from the requested tag and came back empty). `presentation.notes` says when the sentences are in another language, so an agent can tell the user.
6
+ - **Fallback skills that exist.** The SDK reads fallbacks from `ovos.skills.list` and no longer asks `ovos.skills.fallback.list`, which ovos-core reverted the day it landed. Skills with no intents, such as Daily Desk's memory skill, now appear. `priority` is `null`: the hub does not say in which order it tries fallbacks, and the list is in skill id order. The tool description and README say so. A connection needs `ovos.skills.list` on its allow-list; until then fallbacks stay unknown, as before.
7
+ - Takes `@thalovant/sdk` ^0.9.9, and the lock resolves the published 0.9.9. The parity contract acknowledges reference digest `5b973a65ab58` (see thalovant/thalovant-python-sdk#105).
8
+ - `package.json`, `server.json`, the OCI label, the README and this file move to 0.6.3 together.
9
+
10
+ ## 0.6.2 — 2026-10-02
11
+
12
+ - Takes `@thalovant/sdk` ^0.9.3, which the lock resolves. Its `reply.claimed` now recognizes a skill's own confident fallback-tier answer; the earlier range silently swallowed a genuinely successful Home Assistant reply (a `claimed` answer from the home skill's fallback tier read as "nothing answered"). No code change in this package: the logic is the SDK's `replyClaimMetadata`, which `src/reply-output.ts` delegates to.
13
+ - The parity contract acknowledges the reference's final round-two digest, and the vendored `reply-claim-vectors.json` carries the round's cases with each event's name and meta, so the assertion-on-a-non-speak-event-is-ignored case is actually exercised rather than built as a bare `speak`.
14
+ - `package.json`, `server.json`, the OCI label and this file move to 0.6.2 together, so the release inventory's `compatible_node_sdk` can follow `package.json` to `@thalovant/sdk ^0.9.3`: the platform contracts gate compares the two byte for byte, and the dependency moved on 2026-09-30 without a release to record it.
15
+
3
16
  ## 0.6.1 — 2026-09-28
4
17
 
5
18
  - **Sign in as a registered app.** `thalovant_begin_device_login` takes an optional `clientId`, passed to the API as `client_id` only when given: `thalovant-home-assistant` makes the approval page show the platform's name for Home Assistant as verified, and approving it again replaces the token it already holds. An id the API does not know is refused with 400 `unknown_client`, and the tool error carries the code and sentence like any other refusal.
package/README.md CHANGED
@@ -418,10 +418,17 @@ Tool outputs redact credential-shaped fields. `thalovant_create_client_identity`
418
418
 
419
419
  `thalovant_intent_inventory` uses the runtime identity and accepts `languages`,
420
420
  `describe`, `fallback`, `speakable`, `sentence`, `slots`, `exampleLimit`, and a per-query/batch `timeoutMs`. It returns registered
421
- intents and examples, fallback skills, `fallbacks_known`, and `may_answer` by
422
- requested language. A missing or denied optional fallback-skill query remains
423
- unknown, rather than being reported as a known empty list. The optional probe
424
- adds at most 1500ms. A silent listing can use engine manifests; disable this with
421
+ intents and examples, fallback skills, `fallbacks_known`, `listed_in`, and
422
+ `may_answer` by requested language. `listed_in` names the hub language each
423
+ requested language was listed in. A hub lists nothing under a language it did
424
+ not load, so a language with no sentences is listed in its usual form (`en-CA`
425
+ in `en-US`) or in the closest language the hub loaded, and `examples` are
426
+ rendered in that language. When `listed_in` differs from what was asked, the
427
+ sentences are in another language, and `presentation.notes` says so. Fallback
428
+ skills come from `ovos.skills.list`, in skill id order, with `priority: null`:
429
+ the hub does not say in which order it tries them. A missing or denied
430
+ fallback-skill query remains unknown, rather than being reported as a known
431
+ empty list. The optional probe adds at most 1500ms. A silent listing can use engine manifests; disable this with
425
432
  `fallback: false`. Both new tools are available in read-only mode and respect
426
433
  per-principal policy. `thalovant_get_operation` reads an operation ID returned by
427
434
  provisioning without replaying the write.
@@ -531,7 +538,7 @@ Runtime calls sharing the same hub client identity run sequentially within one
531
538
  MCP process. Use a distinct client identity for each independently running MCP
532
539
  server so the hub can keep their sessions separate.
533
540
 
534
- Version 0.6.1 requires `@thalovant/sdk` `^0.9.1` (0.9.1 through versions below 0.10.0). Since 0.5.1 the server enforces
541
+ Version 0.6.3 requires `@thalovant/sdk` `^0.9.9` (0.9.9 through versions below 0.10.0). Since 0.5.1 the server enforces
535
542
  secure effective MQTT URLs and carries a single connection deadline through
536
543
  MQTT setup and HTTP failure cleanup. Runtime tools support
537
544
  HiveMind v3 Noise over WSS, HTTPS and MQTT over TLS. `thalovant_healthcheck`
package/dist/index.js CHANGED
@@ -1614,7 +1614,7 @@ export function createServer() {
1614
1614
  });
1615
1615
  registerThalovantTool(server, "thalovant_intent_inventory", {
1616
1616
  title: "Runtime Intent Inventory",
1617
- description: "Discover a hub's registered intents, language examples and fallback skills using its runtime identity. Unknown fallback support remains distinct from a known empty list; answerability is a conservative hint.",
1617
+ description: "Discover a hub's registered intents, language examples and fallback skills using its runtime identity. listed_in names, per requested language, the hub language the sentences were listed in: a hub lists nothing under a language it did not load, so a language with no sentences is listed in its usual form or the closest language the hub loaded. When listed_in differs from the language asked, tell the user which language the sentences are in. Fallback skills come from ovos.skills.list in skill id order; the hub does not say in which order they are tried, so priority is null. Unknown fallback support remains distinct from a known empty list; answerability is a conservative hint.",
1618
1618
  inputSchema: {
1619
1619
  ...runtimeAuthSchema,
1620
1620
  languages: z.array(z.string().trim().min(1).max(100)).min(1).max(20).default(["en-us"]),
@@ -1634,8 +1634,12 @@ export function createServer() {
1634
1634
  return jsonContent(redactSecrets({
1635
1635
  ...inventory.asObject(),
1636
1636
  presentation: inventoryPresentation(inventory),
1637
+ // Keyed by the language asked, rendered from the tag that answered:
1638
+ // a Spanish phone on an English hub gets the English sentences, and
1639
+ // listed_in says so.
1637
1640
  examples: inventory.intents.map(intent => ({ id: intent.id,
1638
- languages: Object.fromEntries(inventory.languages.map(lang => [lang, intent.examples(lang, exampleLimit, { speakable, sentence, slots })])),
1641
+ languages: Object.fromEntries(inventory.languages.map((lang, index) => [lang,
1642
+ intent.examples(inventory.listedIn[index] ?? lang, exampleLimit, { speakable, sentence, slots })])),
1639
1643
  })),
1640
1644
  may_answer: Object.fromEntries(inventory.languages.map(lang => [lang, inventory.mayAnswer(lang)])),
1641
1645
  }));
@@ -6,6 +6,12 @@ export function inventoryPresentation(runtime, generatedAt = new Date().toISOStr
6
6
  `Runtime discovery source: ${runtime.source}.`,
7
7
  ...runtime.denied.map(query => `Query refused or unanswered: ${query}.`),
8
8
  ...(!runtime.fallbacksKnown ? ["Fallback skill support is unknown."] : []),
9
+ ...(runtime.fallbacks.length > 0 ? ["Fallback skills are in skill id order; the hub does not say in which order it tries them."] : []),
10
+ ...runtime.languages.flatMap((lang, index) => {
11
+ const listed = runtime.listedIn[index];
12
+ return listed && listed.toLowerCase().replaceAll("_", "-") !== lang.toLowerCase().replaceAll("_", "-")
13
+ ? [`Sentences for ${lang} are listed in ${listed}: the hub has none under ${lang}.`] : [];
14
+ }),
9
15
  ];
10
16
  const inventory = new Inventory("", "", "hub", generatedAt, runtime.skills.map(skill => new Skill(skill.skillId, friendlyTitle(skill.skillId), [], skill.intents.map(intent => new Intent(intent.id, intent.name, intent.skillId, intent.engine, intent.phrases, intent.languages)))), notes);
11
17
  return { ...inventory.asObject(), languages_present: languagesPresent(inventory) };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thalovant/mcp-server",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "Stdio and Streamable HTTP MCP server for Thalovant control-plane and hub runtime APIs.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -64,7 +64,7 @@
64
64
  },
65
65
  "dependencies": {
66
66
  "@modelcontextprotocol/sdk": "^1.30.0",
67
- "@thalovant/sdk": "^0.9.1",
67
+ "@thalovant/sdk": "^0.9.9",
68
68
  "jose": "^6.2.8",
69
69
  "zod": "^3.25.76"
70
70
  },
package/server.json CHANGED
@@ -7,19 +7,19 @@
7
7
  "url": "https://github.com/thalovant/thalovant-mcp",
8
8
  "source": "github"
9
9
  },
10
- "version": "0.6.1",
10
+ "version": "0.6.3",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@thalovant/mcp-server",
15
- "version": "0.6.1",
15
+ "version": "0.6.3",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }
19
19
  },
20
20
  {
21
21
  "registryType": "oci",
22
- "identifier": "ghcr.io/thalovant/thalovant-mcp:0.6.1",
22
+ "identifier": "ghcr.io/thalovant/thalovant-mcp:0.6.3",
23
23
  "transport": {
24
24
  "type": "streamable-http",
25
25
  "url": "http://127.0.0.1:3000/mcp"