@xrkseek/harness 0.7.6 → 0.7.7

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 (139) hide show
  1. package/node_modules/@xrkseek/a2a/dist/inbound.d.ts.map +1 -1
  2. package/node_modules/@xrkseek/a2a/dist/inbound.js +72 -2
  3. package/node_modules/@xrkseek/a2a/dist/inbound.js.map +1 -1
  4. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.d.ts.map +1 -1
  5. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js +2 -0
  6. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js.map +1 -1
  7. package/node_modules/@xrkseek/exec-voice/README.md +4 -3
  8. package/node_modules/@xrkseek/exec-voice/dist/browser/index.d.ts +1 -0
  9. package/node_modules/@xrkseek/exec-voice/dist/browser/index.d.ts.map +1 -1
  10. package/node_modules/@xrkseek/exec-voice/dist/browser/index.js +1 -0
  11. package/node_modules/@xrkseek/exec-voice/dist/browser/index.js.map +1 -1
  12. package/node_modules/@xrkseek/exec-voice/dist/browser/wav-capture.d.ts +91 -0
  13. package/node_modules/@xrkseek/exec-voice/dist/browser/wav-capture.d.ts.map +1 -0
  14. package/node_modules/@xrkseek/exec-voice/dist/browser/wav-capture.js +269 -0
  15. package/node_modules/@xrkseek/exec-voice/dist/browser/wav-capture.js.map +1 -0
  16. package/node_modules/@xrkseek/exec-voice/dist/download-http.d.ts +27 -0
  17. package/node_modules/@xrkseek/exec-voice/dist/download-http.d.ts.map +1 -0
  18. package/node_modules/@xrkseek/exec-voice/dist/download-http.js +179 -0
  19. package/node_modules/@xrkseek/exec-voice/dist/download-http.js.map +1 -0
  20. package/node_modules/@xrkseek/exec-voice/dist/engine-ids.d.ts +19 -0
  21. package/node_modules/@xrkseek/exec-voice/dist/engine-ids.d.ts.map +1 -0
  22. package/node_modules/@xrkseek/exec-voice/dist/engine-ids.js +36 -0
  23. package/node_modules/@xrkseek/exec-voice/dist/engine-ids.js.map +1 -0
  24. package/node_modules/@xrkseek/exec-voice/dist/engines.d.ts +60 -0
  25. package/node_modules/@xrkseek/exec-voice/dist/engines.d.ts.map +1 -0
  26. package/node_modules/@xrkseek/exec-voice/dist/engines.js +130 -0
  27. package/node_modules/@xrkseek/exec-voice/dist/engines.js.map +1 -0
  28. package/node_modules/@xrkseek/exec-voice/dist/format.d.ts +13 -0
  29. package/node_modules/@xrkseek/exec-voice/dist/format.d.ts.map +1 -1
  30. package/node_modules/@xrkseek/exec-voice/dist/format.js +22 -3
  31. package/node_modules/@xrkseek/exec-voice/dist/format.js.map +1 -1
  32. package/node_modules/@xrkseek/exec-voice/dist/index.d.ts +22 -31
  33. package/node_modules/@xrkseek/exec-voice/dist/index.d.ts.map +1 -1
  34. package/node_modules/@xrkseek/exec-voice/dist/index.js +16 -66
  35. package/node_modules/@xrkseek/exec-voice/dist/index.js.map +1 -1
  36. package/node_modules/@xrkseek/exec-voice/dist/readiness.d.ts +14 -8
  37. package/node_modules/@xrkseek/exec-voice/dist/readiness.d.ts.map +1 -1
  38. package/node_modules/@xrkseek/exec-voice/dist/readiness.js +36 -27
  39. package/node_modules/@xrkseek/exec-voice/dist/readiness.js.map +1 -1
  40. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-assets.d.ts +48 -0
  41. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-assets.d.ts.map +1 -0
  42. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-assets.js +64 -0
  43. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-assets.js.map +1 -0
  44. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-local.d.ts +24 -0
  45. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-local.d.ts.map +1 -1
  46. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-local.js +66 -4
  47. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-local.js.map +1 -1
  48. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-runtime.d.ts +76 -0
  49. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-runtime.d.ts.map +1 -0
  50. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-runtime.js +315 -0
  51. package/node_modules/@xrkseek/exec-voice/dist/sensevoice-runtime.js.map +1 -0
  52. package/node_modules/@xrkseek/exec-voice/dist/system-tts.d.ts +40 -0
  53. package/node_modules/@xrkseek/exec-voice/dist/system-tts.d.ts.map +1 -0
  54. package/node_modules/@xrkseek/exec-voice/dist/system-tts.js +260 -0
  55. package/node_modules/@xrkseek/exec-voice/dist/system-tts.js.map +1 -0
  56. package/node_modules/@xrkseek/exec-voice/dist/tools.d.ts +13 -12
  57. package/node_modules/@xrkseek/exec-voice/dist/tools.d.ts.map +1 -1
  58. package/node_modules/@xrkseek/exec-voice/dist/tools.js +12 -6
  59. package/node_modules/@xrkseek/exec-voice/dist/tools.js.map +1 -1
  60. package/node_modules/@xrkseek/exec-voice/dist/types.d.ts +3 -1
  61. package/node_modules/@xrkseek/exec-voice/dist/types.d.ts.map +1 -1
  62. package/node_modules/@xrkseek/exec-voice/dist/types.js.map +1 -1
  63. package/node_modules/@xrkseek/exec-voice/package.json +36 -31
  64. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +4 -3
  65. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
  66. package/node_modules/@xrkseek/preset-harness/dist/preset.js +31 -18
  67. package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
  68. package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
  69. package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
  70. package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
  71. package/node_modules/@xrkseek/protocol/dist/sidebar-previews.d.ts +2 -0
  72. package/node_modules/@xrkseek/protocol/dist/sidebar-previews.d.ts.map +1 -1
  73. package/node_modules/@xrkseek/protocol/dist/sidebar-previews.js.map +1 -1
  74. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts +21 -2
  75. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts.map +1 -1
  76. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js +56 -7
  77. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js.map +1 -1
  78. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts.map +1 -1
  79. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js +26 -3
  80. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js.map +1 -1
  81. package/node_modules/@xrkseek/server-face/dist/agent-team-roles.d.ts.map +1 -1
  82. package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js +4 -0
  83. package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js.map +1 -1
  84. package/node_modules/@xrkseek/server-face/dist/dispatch.d.ts.map +1 -1
  85. package/node_modules/@xrkseek/server-face/dist/dispatch.js +16 -0
  86. package/node_modules/@xrkseek/server-face/dist/dispatch.js.map +1 -1
  87. package/node_modules/@xrkseek/server-face/dist/handlers/voice.d.ts +30 -0
  88. package/node_modules/@xrkseek/server-face/dist/handlers/voice.d.ts.map +1 -0
  89. package/node_modules/@xrkseek/server-face/dist/handlers/voice.js +181 -0
  90. package/node_modules/@xrkseek/server-face/dist/handlers/voice.js.map +1 -0
  91. package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts +15 -0
  92. package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts.map +1 -1
  93. package/node_modules/@xrkseek/server-face/dist/model-catalog.js +44 -10
  94. package/node_modules/@xrkseek/server-face/dist/model-catalog.js.map +1 -1
  95. package/node_modules/@xrkseek/server-face/dist/runtime.d.ts.map +1 -1
  96. package/node_modules/@xrkseek/server-face/dist/runtime.js +7 -2
  97. package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
  98. package/node_modules/@xrkseek/server-face/dist/select-session-model.d.ts.map +1 -1
  99. package/node_modules/@xrkseek/server-face/dist/select-session-model.js +68 -1
  100. package/node_modules/@xrkseek/server-face/dist/select-session-model.js.map +1 -1
  101. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.d.ts +4 -0
  102. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.d.ts.map +1 -1
  103. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js +16 -0
  104. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js.map +1 -1
  105. package/node_modules/@xrkseek/server-face/dist/session-tools.d.ts.map +1 -1
  106. package/node_modules/@xrkseek/server-face/dist/session-tools.js +2 -0
  107. package/node_modules/@xrkseek/server-face/dist/session-tools.js.map +1 -1
  108. package/node_modules/@xrkseek/server-face/dist/settings-document.d.ts.map +1 -1
  109. package/node_modules/@xrkseek/server-face/dist/settings-document.js +56 -1
  110. package/node_modules/@xrkseek/server-face/dist/settings-document.js.map +1 -1
  111. package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
  112. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +36 -14
  113. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
  114. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts +43 -0
  115. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
  116. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +293 -24
  117. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
  118. package/node_modules/@xrkseek/server-face/dist/wire/paths.d.ts.map +1 -1
  119. package/node_modules/@xrkseek/server-face/dist/wire/paths.js +6 -0
  120. package/node_modules/@xrkseek/server-face/dist/wire/paths.js.map +1 -1
  121. package/node_modules/@xrkseek/server-face/package.json +1 -0
  122. package/node_modules/@xrkseek/server-host/dist/a2a-inbound-public.d.ts.map +1 -1
  123. package/node_modules/@xrkseek/server-host/dist/a2a-inbound-public.js +8 -1
  124. package/node_modules/@xrkseek/server-host/dist/a2a-inbound-public.js.map +1 -1
  125. package/node_modules/@xrkseek/server-host/dist/index.d.ts +1 -1
  126. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  127. package/node_modules/@xrkseek/server-host/dist/index.js +44 -45
  128. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  129. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.d.ts.map +1 -1
  130. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js +2 -0
  131. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js.map +1 -1
  132. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.d.ts.map +1 -1
  133. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.js +5 -2
  134. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.js.map +1 -1
  135. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.d.ts +15 -0
  136. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.d.ts.map +1 -1
  137. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.js +61 -3
  138. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.js.map +1 -1
  139. package/package.json +1 -1
@@ -5,7 +5,7 @@ import { loadPolicyRulesetFile } from "@xrkseek/policy";
5
5
  import { flattenText, isHumanUserMessageSource } from "@xrkseek/protocol";
6
6
  import { effectiveApprovalPolicy, effectiveSandboxMode, pathAccessModeFromSandbox, shouldConfineSandbox, } from "@xrkseek/protocol";
7
7
  import { runCuratedMemoryConsolidate, createLayeredCuratedMemoryStore, } from "@xrkseek/exec-memory";
8
- import { createSpeakTool, createDefaultVoiceAccess, createMemoryVoiceProvider, } from "@xrkseek/exec-voice";
8
+ import { createSpeakTool, createVoiceAccess, } from "@xrkseek/exec-voice";
9
9
  import { runSkillCurator } from "@xrkseek/workspace";
10
10
  import { resolveSecretStore } from "@xrkseek/secrets";
11
11
  import { hostSettingsPath, defaultSpillDir, expandHomePath, resolveXrkHome, } from "@xrkseek/server-config";
@@ -15,7 +15,7 @@ import { watchPolicyFile } from "./policy-file-watch.js";
15
15
  import { createA2aInboundPublicHandler } from "./a2a-inbound-public.js";
16
16
  import { createCronApiHandler } from "./cron-http.js";
17
17
  import { tryMountHostIsolatingWorkflowEngine } from "./workflow-engine-mount.js";
18
- import { applyXrkProductBootPolicy, chainPublicHandlers, ensureDshCompatHostPlugin, ensureSunflowerFreePlugin, remountSunflowerFreePlugin, applySunflowerFreeEgressSettings, DSH_COMPAT_HOST_PLUGIN_ID, SUNFLOWER_FREE_PLUGIN_ID, SUNFLOWER_FREE_BRAND_ID, createLiveHostPluginsPublicHandler, createHttpServer, createXrkPluginPublicHandler, createSidebarPublicHandler, prewarmDshCompatAdapters, shutdownDshCompatServices, applyHostPackageByName, stopHostPackage, listHostAppliedPackages, invokeDshCompatRpc, attachDshCompatUpgrades, DSH_SETTINGS_NAMESPACES, DSH_SETTINGS_DEFAULTS, runPluginMutate, ensureXrkPlatformClientBootEntries, injectBootIntoHtml, injectBootThemeIntoHtml, injectMobileAccessShellIntoHtml, loadBootManifestFromWebDist, mergeWebBootManifests, resolveWebBootManifest, createXrkWalletPort, armAccessGateForListen, createMobileAccessGateChecker, createMobileAccessGateHandler, disposeDesktopLanShare, resetDesktopLanShareOnBoot, loadSidebarPrefs, createAutoReviewToolPre, isAutoReviewEnabled, setAutoReviewEnabled, setImFaceAdmitHook, } from "@xrkseek/server-http";
18
+ import { applyXrkProductBootPolicy, chainPublicHandlers, ensureDshCompatHostPlugin, ensureSunflowerFreePlugin, remountSunflowerFreePlugin, applySunflowerFreeEgressSettings, DSH_COMPAT_HOST_PLUGIN_ID, SUNFLOWER_FREE_PLUGIN_ID, SUNFLOWER_FREE_BRAND_ID, createLiveHostPluginsPublicHandler, createHttpServer, createXrkPluginPublicHandler, createSidebarPublicHandler, prewarmDshCompatAdapters, shutdownDshCompatServices, applyHostPackageByName, stopHostPackage, listHostAppliedPackages, invokeDshCompatRpc, attachDshCompatUpgrades, DSH_SETTINGS_NAMESPACES, DSH_SETTINGS_DEFAULTS, runPluginMutate, ensureXrkPlatformClientBootEntries, injectBootIntoHtml, injectBootThemeIntoHtml, injectMobileAccessShellIntoHtml, loadBootManifestFromWebDist, mergeWebBootManifests, resolveWebBootManifest, createXrkWalletPort, armAccessGateForListen, createMobileAccessGateChecker, createMobileAccessGateHandler, disposeDesktopLanShare, resetDesktopLanShareOnBoot, loadSidebarPrefs, createAutoReviewToolPre, setImFaceAdmitHook, } from "@xrkseek/server-http";
19
19
  import { attachFaceUpgrades, bindSubagentTools, bindSessionQueryTools, createFaceRuntime, IM_AGENT_PRESET_ID, IM_WORKSPACE_ID, QICHUANG_AGENT_PRESET_ID, XIANGYANG_WORKSPACE_ID, isOrchestrationWorkspaceId, effectiveHostApiKey, ensureMcpLiveIfIdle, timingSafeStringEqual, listCredentialSlots, peekSettingsYamlSection, publishRemoteEvent, createSessionRoutingLlm, liveRouteAllowsImageInput, resolveSessionCwd, ensureSessionWorkingDirectory, setSessionWorkingDirectory, createSessionWorktree, canonicalAgentPresetId, resolveAgentPresetProfile, effectiveSessionAgentPreset, tryHandleFaceHttp, isPluginSoftDisabledAt, readDisabledPluginIdsAt, readManagedPackageIndexAt, reconcileManagedProcessPlugins, snapshotSessionWorkspace, SNAPSHOT_DRAIN_BUDGET_MS, applyRosterToolPolicy, migrateAutoSessionsToFullAccess, approvePendingAutoReview, createBossStatusFragmentProvider, createCollabBoardFragmentProvider, createSeatIdentityFragmentProvider, createSessionCapabilityFragmentProvider, createSessionPostureFragmentProvider, createInstructionAuthorityFragmentProvider, canvasWorkspaceIdForSession, memberPackSkillsDir, resolveSessionModelSelection, credentialsSet, settingsMutateFace, communityLoopbackBaseUrlCollision, existingPiAiProvider, mergeCommunityProviderModels, } from "@xrkseek/server-face";
20
20
  import { createPluginLoader, composeHostPolicyEngine, wireCompositionChannels, wireCompositionLlm, collectChannelPluginRegistrations, isOptionalBundleEnabledAt, } from "@xrkseek/server-loader";
21
21
  import { existsSync } from "node:fs";
@@ -1113,13 +1113,7 @@ export function createHostManager() {
1113
1113
  },
1114
1114
  autoReviewPre: createAutoReviewToolPre({
1115
1115
  xrkHome: resolveXrkHome(),
1116
- // Master switch (Settings) AND session preset === auto (DSH).
1117
- isEnabled: () => {
1118
- const ar = faceRuntime.settingsNamespaces.view("auto-review")
1119
- .value;
1120
- return (ar.enabled === true ||
1121
- isAutoReviewEnabled({ xrkHome: resolveXrkHome() }));
1122
- },
1116
+ // No master switch: Auto permission preset implies review.
1123
1117
  // Session Auto gate: resolveSessionEvents → folded permission/preset.
1124
1118
  product: () => {
1125
1119
  const ns = faceRuntime.settingsNamespaces.view("auto-review")
@@ -1219,18 +1213,22 @@ export function createHostManager() {
1219
1213
  });
1220
1214
  }
1221
1215
  }
1222
- // Settings voice.speakTools: ensure text_to_speech on every surface
1223
- // (including Minimal / IM). OpenAI when mode=openai + key; else
1224
- // local memory TTS stub so the switch always has a Provider.
1225
- const voiceNsSpeak = faceBox.runtime.settingsNamespaces.view("voice").value;
1226
- if (voiceNsSpeak.speakTools === true &&
1216
+ // Settings tts.enabled: bind text_to_speech on every surface
1217
+ // (including Minimal / IM). `tts.engine` picks the Provider —
1218
+ // OS voices (SAPI / say / espeak-ng) or an OpenAI-compatible
1219
+ // endpoint — and an unresolvable one still mounts the tool so it
1220
+ // can fail honestly instead of vanishing.
1221
+ const ttsNs = faceBox.runtime.settingsNamespaces.view("tts").value;
1222
+ if (ttsNs.enabled === true &&
1227
1223
  !agent.tools.get("text_to_speech")) {
1228
- const voiceMode = typeof voiceNsSpeak.mode === "string"
1229
- ? voiceNsSpeak.mode.trim().toLowerCase()
1230
- : "off";
1231
- const voiceBase = typeof voiceNsSpeak.baseUrl === "string" &&
1232
- voiceNsSpeak.baseUrl.trim()
1233
- ? voiceNsSpeak.baseUrl.trim()
1224
+ const ttsBase = typeof ttsNs.baseUrl === "string" && ttsNs.baseUrl.trim()
1225
+ ? ttsNs.baseUrl.trim()
1226
+ : undefined;
1227
+ const ttsVoice = typeof ttsNs.voice === "string" && ttsNs.voice.trim()
1228
+ ? ttsNs.voice.trim()
1229
+ : undefined;
1230
+ const ttsModel = typeof ttsNs.model === "string" && ttsNs.model.trim()
1231
+ ? ttsNs.model.trim()
1234
1232
  : undefined;
1235
1233
  const voiceKey = faceBox.runtime.credentials.peek("voice.openai")?.trim() ||
1236
1234
  process.env.XRK_VOICE_OPENAI_KEY?.trim() ||
@@ -1238,20 +1236,21 @@ export function createHostManager() {
1238
1236
  const voiceEnv = voiceKey
1239
1237
  ? { ...process.env, XRK_VOICE_OPENAI_KEY: voiceKey }
1240
1238
  : undefined;
1241
- const product = {
1242
- mode: voiceMode === "openai"
1243
- ? "openai"
1244
- : "off",
1245
- ...(voiceBase ? { baseUrl: voiceBase } : {}),
1246
- };
1247
- const access = createDefaultVoiceAccess({
1248
- product,
1239
+ const ttsEngine = typeof ttsNs.engine === "string" && ttsNs.engine.trim()
1240
+ ? ttsNs.engine.trim().toLowerCase()
1241
+ : "local";
1242
+ const access = createVoiceAccess({
1243
+ direction: "tts",
1244
+ engine: ttsEngine,
1245
+ ...(ttsBase ? { baseUrl: ttsBase } : {}),
1246
+ ...(ttsVoice ? { voice: ttsVoice } : {}),
1247
+ ...(ttsModel ? { model: ttsModel } : {}),
1249
1248
  ...(voiceEnv ? { env: voiceEnv } : {}),
1250
1249
  });
1251
- const service = access.service ?? createMemoryVoiceProvider();
1252
1250
  agent.tools.register(createSpeakTool({
1253
- service,
1254
- product,
1251
+ direction: "tts",
1252
+ engine: ttsEngine,
1253
+ ...(access.service ? { service: access.service } : {}),
1255
1254
  ...(voiceEnv ? { env: voiceEnv } : {}),
1256
1255
  }));
1257
1256
  }
@@ -1996,17 +1995,22 @@ export function createHostManager() {
1996
1995
  mode: brModeRaw === "cdp" ? "cdp" : "http",
1997
1996
  ...(brCdpUrl ? { cdpUrl: brCdpUrl } : {}),
1998
1997
  };
1999
- const voiceNs = faceRuntime.settingsNamespaces.view("voice")
1998
+ const asrNs = faceRuntime.settingsNamespaces.view("asr")
2000
1999
  .value;
2001
- const voiceModeRaw = typeof voiceNs.mode === "string"
2002
- ? voiceNs.mode.trim().toLowerCase()
2003
- : "off";
2004
- const voiceBase = typeof voiceNs.baseUrl === "string" && voiceNs.baseUrl.trim()
2005
- ? voiceNs.baseUrl.trim()
2000
+ const asrEnabled = asrNs.enabled === true;
2001
+ const asrEngineRaw = typeof asrNs.engine === "string"
2002
+ ? asrNs.engine.trim().toLowerCase()
2003
+ : "local";
2004
+ const asrBase = typeof asrNs.baseUrl === "string" && asrNs.baseUrl.trim()
2005
+ ? asrNs.baseUrl.trim()
2006
2006
  : undefined;
2007
2007
  const voiceProduct = {
2008
- mode: voiceModeRaw === "openai" ? "openai" : "off",
2009
- ...(voiceBase ? { baseUrl: voiceBase } : {}),
2008
+ mode: asrEnabled
2009
+ ? asrEngineRaw === "openai"
2010
+ ? "openai"
2011
+ : "local"
2012
+ : "off",
2013
+ ...(asrBase ? { baseUrl: asrBase } : {}),
2010
2014
  };
2011
2015
  const voiceKey = faceRuntime.credentials.peek("voice.openai")?.trim() ||
2012
2016
  process.env.XRK_VOICE_OPENAI_KEY?.trim() ||
@@ -2258,12 +2262,7 @@ export function createHostManager() {
2258
2262
  if (event === "settings/document-updated") {
2259
2263
  const ns = frame.args[0];
2260
2264
  if (ns === "auto-review") {
2261
- const ar = faceRuntime.settingsNamespaces.view("auto-review")
2262
- .value;
2263
- if (typeof ar.enabled === "boolean") {
2264
- setAutoReviewEnabled({ xrkHome: resolveXrkHome() }, ar.enabled);
2265
- }
2266
- // Classifier URL is live; no agent invalidate required.
2265
+ // No master switch; classifier URL/token are read live via product().
2267
2266
  return;
2268
2267
  }
2269
2268
  if (ns === "cron") {