tmg-media-player 0.0.80 → 0.0.82

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 (131) hide show
  1. package/dist/{chunk-7CYASEOW.js → chunk-2AW56J53.js} +8 -8
  2. package/dist/chunk-2AW56J53.js.map +1 -0
  3. package/dist/{chunk-KJWGDVWI.js → chunk-3ZV6B23A.js} +19 -19
  4. package/dist/{chunk-R66CPIRC.js → chunk-56XJDHSF.js} +2 -2
  5. package/dist/{chunk-HAW2LBV6.js → chunk-5R4SZUEB.js} +2 -2
  6. package/dist/{chunk-WL7MYQDW.js → chunk-6RHVWP4N.js} +2 -1
  7. package/dist/{chunk-WL7MYQDW.js.map → chunk-6RHVWP4N.js.map} +1 -1
  8. package/dist/{chunk-IHRSHSUW.js → chunk-7FKNMM7R.js} +2 -2
  9. package/dist/{chunk-ANQG2I2F.js → chunk-DSITGBUZ.js} +139 -139
  10. package/dist/{chunk-AIQZLUR7.js → chunk-ET3QJ7G2.js} +2 -2
  11. package/dist/{chunk-WBMJZVY5.js → chunk-JAHHONGY.js} +39 -39
  12. package/dist/{chunk-I2XQFSRX.js → chunk-JP5OIJZ3.js} +15 -15
  13. package/dist/{chunk-CLXO4GWQ.js → chunk-K5AK6EC6.js} +5 -5
  14. package/dist/{chunk-VISJ3RIN.js → chunk-NEM7C4ZO.js} +2 -2
  15. package/dist/{chunk-FEQ3KO6E.js → chunk-NFZTXMJM.js} +2 -6
  16. package/dist/chunk-NFZTXMJM.js.map +1 -0
  17. package/dist/{chunk-N4SZWQEV.js → chunk-NRHAAIND.js} +72 -72
  18. package/dist/{chunk-AT6ROKXH.js → chunk-OIAQ4QON.js} +51 -51
  19. package/dist/{chunk-TOVCRTK2.js → chunk-S62U5MZT.js} +2 -2
  20. package/dist/{chunk-HHXBTXVL.js → chunk-THZDSCE4.js} +5 -5
  21. package/dist/{chunk-UXCCQXAV.js → chunk-TLPMOBIP.js} +2 -2
  22. package/dist/{chunk-FQKVSKPW.js → chunk-TZU52TJX.js} +2 -2
  23. package/dist/{chunk-LQWM2BZZ.js → chunk-U6ASM7L3.js} +4 -4
  24. package/dist/{chunk-W75LK7RH.js → chunk-ULDPJ3BK.js} +2 -2
  25. package/dist/{chunk-IU5QYRUY.js → chunk-VQMODPB3.js} +41 -41
  26. package/dist/{chunk-KMQYF5HM.js → chunk-X3AUCLQ4.js} +5 -5
  27. package/dist/{chunk-OKUBRJYT.js → chunk-XOWBSXMV.js} +12 -12
  28. package/dist/{chunk-KWMVSXFD.js → chunk-Z4SSJVAP.js} +9 -9
  29. package/dist/{chunk-33YUW7BD.js → chunk-ZKOUPHFX.js} +2 -2
  30. package/dist/{chunk-N3PQSWO5.js → chunk-ZZTPWXML.js} +9 -9
  31. package/dist/components/controls/fullscreenOrientation.js +2 -2
  32. package/dist/components/controls/timeline/index.js +3 -3
  33. package/dist/components/icons/z-register.js +23 -23
  34. package/dist/components/notifiers/z-register.js +6 -6
  35. package/dist/components/z-register.js +20 -20
  36. package/dist/core/controller.js +2 -2
  37. package/dist/index.css +1 -1
  38. package/dist/index.css.map +1 -1
  39. package/dist/index.js +3 -3
  40. package/dist/init.js +3 -3
  41. package/dist/plugs/menus/main/actions.js +2 -2
  42. package/dist/plugs/menus/settings/auto.js +2 -2
  43. package/dist/plugs/menus/settings/frame.js +2 -2
  44. package/dist/plugs/menus/settings/modes.js +2 -2
  45. package/dist/plugs/menus/settings/sleepTimer.js +2 -2
  46. package/dist/plugs/menus/settings/toasts.js +2 -2
  47. package/dist/plugs/menus/settings/voice.js +2 -2
  48. package/dist/plugs/menus/z-register.js +7 -7
  49. package/dist/plugs/settings/auto/index.js +2 -2
  50. package/dist/plugs/settings/captions/index.js +3 -3
  51. package/dist/plugs/settings/modes/airplay.js +4 -4
  52. package/dist/plugs/settings/modes/cast.js +4 -4
  53. package/dist/plugs/settings/modes/fullscreen.js +3 -3
  54. package/dist/plugs/settings/modes/index.js +3 -3
  55. package/dist/plugs/settings/modes/miniplayer.js +3 -3
  56. package/dist/plugs/settings/modes/pictureInPicture.js +3 -3
  57. package/dist/plugs/settings/modes/theater.js +3 -3
  58. package/dist/plugs/settings/panel/index.cjs +1 -5
  59. package/dist/plugs/settings/panel/index.cjs.map +1 -1
  60. package/dist/plugs/settings/panel/index.js +2 -2
  61. package/dist/plugs/settings/panel/menu/index.cjs +1 -5
  62. package/dist/plugs/settings/panel/menu/index.cjs.map +1 -1
  63. package/dist/plugs/settings/panel/menu/index.js +1 -1
  64. package/dist/plugs/settings/timeTravel/index.js +3 -3
  65. package/dist/plugs/settings/voice/ai.cjs +6 -5
  66. package/dist/plugs/settings/voice/ai.cjs.map +1 -1
  67. package/dist/plugs/settings/voice/ai.js +5 -5
  68. package/dist/plugs/settings/voice/build.cjs +1 -0
  69. package/dist/plugs/settings/voice/build.cjs.map +1 -1
  70. package/dist/plugs/settings/voice/build.js +2 -2
  71. package/dist/plugs/settings/voice/index.cjs +6 -5
  72. package/dist/plugs/settings/voice/index.cjs.map +1 -1
  73. package/dist/plugs/settings/voice/index.js +5 -5
  74. package/dist/plugs/settings/voice/prompt.cjs +1 -0
  75. package/dist/plugs/settings/voice/prompt.cjs.map +1 -1
  76. package/dist/plugs/settings/voice/prompt.js +1 -1
  77. package/dist/plugs/settings/volume/index.js +3 -3
  78. package/dist/plugs/z-register.cjs +7 -10
  79. package/dist/plugs/z-register.cjs.map +1 -1
  80. package/dist/plugs/z-register.js +33 -33
  81. package/dist/super/components/icons.js +51 -51
  82. package/dist/super/components/index.js +146 -146
  83. package/dist/super/components/notifiers.js +15 -15
  84. package/dist/super/plugs/index.cjs +7 -10
  85. package/dist/super/plugs/index.cjs.map +1 -1
  86. package/dist/super/plugs/index.js +84 -84
  87. package/dist/super/plugs/menus.js +17 -17
  88. package/dist/super/techs.js +11 -11
  89. package/dist/super/utils.js +19 -19
  90. package/dist/super.cjs +7 -10
  91. package/dist/super.cjs.map +1 -1
  92. package/dist/super.css +1 -1
  93. package/dist/super.css.map +1 -1
  94. package/dist/super.global.js +7 -10
  95. package/dist/super.global.js.map +1 -1
  96. package/dist/super.js +118 -118
  97. package/dist/techs/dash.js +3 -3
  98. package/dist/techs/hls.js +3 -3
  99. package/dist/techs/html5.js +2 -2
  100. package/dist/techs/shaka.js +3 -3
  101. package/dist/techs/youtube.js +2 -2
  102. package/dist/techs/z-register.js +6 -6
  103. package/dist/tools/player.js +2 -2
  104. package/dist/tools/runtime/index.js +2 -2
  105. package/package.json +1 -1
  106. package/dist/chunk-7CYASEOW.js.map +0 -1
  107. package/dist/chunk-FEQ3KO6E.js.map +0 -1
  108. /package/dist/{chunk-KJWGDVWI.js.map → chunk-3ZV6B23A.js.map} +0 -0
  109. /package/dist/{chunk-R66CPIRC.js.map → chunk-56XJDHSF.js.map} +0 -0
  110. /package/dist/{chunk-HAW2LBV6.js.map → chunk-5R4SZUEB.js.map} +0 -0
  111. /package/dist/{chunk-IHRSHSUW.js.map → chunk-7FKNMM7R.js.map} +0 -0
  112. /package/dist/{chunk-ANQG2I2F.js.map → chunk-DSITGBUZ.js.map} +0 -0
  113. /package/dist/{chunk-AIQZLUR7.js.map → chunk-ET3QJ7G2.js.map} +0 -0
  114. /package/dist/{chunk-WBMJZVY5.js.map → chunk-JAHHONGY.js.map} +0 -0
  115. /package/dist/{chunk-I2XQFSRX.js.map → chunk-JP5OIJZ3.js.map} +0 -0
  116. /package/dist/{chunk-CLXO4GWQ.js.map → chunk-K5AK6EC6.js.map} +0 -0
  117. /package/dist/{chunk-VISJ3RIN.js.map → chunk-NEM7C4ZO.js.map} +0 -0
  118. /package/dist/{chunk-N4SZWQEV.js.map → chunk-NRHAAIND.js.map} +0 -0
  119. /package/dist/{chunk-AT6ROKXH.js.map → chunk-OIAQ4QON.js.map} +0 -0
  120. /package/dist/{chunk-TOVCRTK2.js.map → chunk-S62U5MZT.js.map} +0 -0
  121. /package/dist/{chunk-HHXBTXVL.js.map → chunk-THZDSCE4.js.map} +0 -0
  122. /package/dist/{chunk-UXCCQXAV.js.map → chunk-TLPMOBIP.js.map} +0 -0
  123. /package/dist/{chunk-FQKVSKPW.js.map → chunk-TZU52TJX.js.map} +0 -0
  124. /package/dist/{chunk-LQWM2BZZ.js.map → chunk-U6ASM7L3.js.map} +0 -0
  125. /package/dist/{chunk-W75LK7RH.js.map → chunk-ULDPJ3BK.js.map} +0 -0
  126. /package/dist/{chunk-IU5QYRUY.js.map → chunk-VQMODPB3.js.map} +0 -0
  127. /package/dist/{chunk-KMQYF5HM.js.map → chunk-X3AUCLQ4.js.map} +0 -0
  128. /package/dist/{chunk-OKUBRJYT.js.map → chunk-XOWBSXMV.js.map} +0 -0
  129. /package/dist/{chunk-KWMVSXFD.js.map → chunk-Z4SSJVAP.js.map} +0 -0
  130. /package/dist/{chunk-33YUW7BD.js.map → chunk-ZKOUPHFX.js.map} +0 -0
  131. /package/dist/{chunk-N3PQSWO5.js.map → chunk-ZZTPWXML.js.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  VOICE_AI_BUILD,
3
3
  VOICE_BUILD
4
- } from "./chunk-33YUW7BD.js";
4
+ } from "./chunk-ZKOUPHFX.js";
5
5
  import {
6
6
  VOICE_AI_INITIAL_PROMPTS,
7
7
  responseConstraint
8
- } from "./chunk-WL7MYQDW.js";
8
+ } from "./chunk-6RHVWP4N.js";
9
9
  import {
10
10
  tutorialOpts
11
11
  } from "./chunk-673MWY67.js";
@@ -345,7 +345,7 @@ var VoiceAiPin = class extends BasePin {
345
345
  this.ctlr.learn("voiceAiStop", { fn: this.stop, voice: { stage: "pre-route" } }, this.signal);
346
346
  this.ctlr.learn("voiceAiTimeTravelUndo", { fn: this.module.undo, keyboard: { phase: "keydown" }, voice: { stage: "pre-route" } }, this.signal);
347
347
  this.ctlr.learn("voiceAiTimeTravelRedo", { fn: this.module.redo, keyboard: { phase: "keydown" }, voice: { stage: "pre-route" } }, this.signal);
348
- if (this.config.active) this.ctlr.flags.wired ? this.prewarm() : this.ctlr.state.wonce("readyState", this.prewarm, { signal: this.signal });
348
+ if (this.plug.config.active) this.ctlr.flags.wired ? this.prewarm() : this.ctlr.state.wonce("readyState", this.prewarm, { signal: this.signal });
349
349
  }
350
350
  handleActive({ value }) {
351
351
  value && this.prewarm(), this.plug.config.active.value = true, this.chat(), this.media.container.classList.toggle("tmg-media-ai", value);
@@ -365,7 +365,7 @@ var VoiceAiPin = class extends BasePin {
365
365
  let res = await this.prompt(text, signal), next, data;
366
366
  while (!signal.aborted) {
367
367
  this.ctlr.log(`[VoiceAI] Step: ${JSON.stringify(res)}`);
368
- next = res.query ? (this.state.status = `Reading ${this.getLink(res.query)}...`, this.ctlr.log(`[VoiceAI] Reading: ${res.query}`), data = this.inspect(res.query), `[State: ${JSON.stringify({ [res.query]: data })}]`) : this.apply(res, tx) && !res.speech ? res.action ? `[Executed: ${JSON.stringify(res.action)}]` : `[Applied: ${JSON.stringify({ [res.path]: res.value })}]` : null;
368
+ next = res.query ? (this.state.status = `Reading ${this.getLink(res.query)}...`, this.ctlr.log(`[VoiceAI] Reading: ${res.query}`), data = this.inspect(res.query), `[State: ${JSON.stringify({ [res.query]: data })}]`) : this.apply(res, tx) && !res.speech ? res.action ? `[Executed: ${res.action}]` : `[Applied: ${JSON.stringify({ [res.path]: res.value })}]` : null;
369
369
  if (!next) return this.ctlr.log(`[VoiceAI] Done: ${res.speech}`), void (this.state.speech = res.speech || "");
370
370
  this.ctlr.log(`[VoiceAI] Next: ${JSON.stringify(next)}`);
371
371
  res = await this.prompt(next, signal);
@@ -386,7 +386,7 @@ var VoiceAiPin = class extends BasePin {
386
386
  !signal.aborted && this.ctlr.toast?.error(`AI endpoint not configured. Visit ${this.plug.linked("settings", "voiceAi", "menu")} or enable Built-in AI.`, { signal: this.signal });
387
387
  }
388
388
  apply(res, tx) {
389
- return !res.action && !res.path ? false : (this.ctlr.log(`[VoiceAI] Apply: ${res.action ? `Action "${res.action}"` : `${res.path} = ${res.value}`}`), this.state.status = res.action ? `Executing ${res.action}...` : `Setting ${this.getLink(res.path)}...`, withMeta({ ai: true, tx }, () => res.action ? this.ctlr.perform(res.action) : setPath2(this.systemRoot, res.path, res.value)), true);
389
+ return !res.action && !res.path ? false : (this.ctlr.log(`[VoiceAI] Apply: ${res.action ? `Action "${res.action}"` : `${res.path} = ${res.value}`}`), this.state.status = res.action ? `Executing ${this.getLink(res.action, false)}...` : `Setting ${this.getLink(res.path)}...`, withMeta({ ai: true, tx }, () => res.action ? this.ctlr.perform(res.action) : setPath2(this.systemRoot, res.path, res.value)), true);
390
390
  }
391
391
  reset() {
392
392
  this.session?.destroy?.(), this.session = null;
@@ -447,8 +447,8 @@ var VoiceAiPin = class extends BasePin {
447
447
  isLogical(path) {
448
448
  return (!path || path === "root" || path === "*" || path.split(".")[0] in this.ctlr.logicRoot) && this.ctlr.isLogical(path);
449
449
  }
450
- getLink(path) {
451
- return this.isLogical(path) ? this.plug.linked(fpath(path), path === "root" ? "*" : path, "goto") : fpath(path);
450
+ getLink(key, isPath = true) {
451
+ return isPath ? this.isLogical(key) ? this.plug.linked(fpath(key), key === "root" ? "*" : key, "goto") : fpath(key) : this.plug.linked(this.ctlr.actions.entries[key].label || capitalize(uncamelize(key)), `actions-detail-${key}`, "menu");
452
452
  }
453
453
  get systemRoot() {
454
454
  return { media: this.media, state: this.ctlr.state, ...this.ctlr.config };
@@ -488,4 +488,4 @@ export {
488
488
  parseAiResponse,
489
489
  VoicePlug
490
490
  };
491
- //# sourceMappingURL=chunk-7CYASEOW.js.map
491
+ //# sourceMappingURL=chunk-2AW56J53.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts/plugs/settings/voice/index.ts","../src/ts/plugs/settings/voice/ai.ts"],"sourcesContent":["import { BasePlug } from \"@plugs/base\";\nimport type { Controller } from \"@core/controller\";\nimport { force, getPath, setPath, mirror } from \"sia-reactor/utils\";\nimport { limited, setTimeout } from \"@utils/fn\";\nimport type { VoiceStage, VoiceConfig, VoiceState } from \"./types\";\nimport { VOICE_BUILD } from \"./build\";\nimport { capitalize, camelize, uncamelize, fuzzyBlobMatch, fuzzyChunkMatch, getLevenshteinSimilarity, luid, uncam, fpath, fvalue } from \"@utils/str\";\nimport { formatActionTooltip } from \"@utils/keys\";\nimport { type ToastOptions } from \"@t007/toast\";\nimport { REvent } from \"sia-reactor\";\nimport { CtlrConfig } from \"@defs/config\";\nimport { tutorialOpts } from \"../toasts\";\nimport { Action } from \"@defs/action\";\nimport { IconRegistry, PinRegistry } from \"@core/registries\";\nimport { type VoiceAiPin } from \"./ai\";\nimport { isArr } from \"@utils/obj\";\nimport { IS_MOBILE } from \"@utils/env\";\nimport { globalState } from \"@tools/runtime\";\n\nexport class VoicePlug extends BasePlug<VoiceConfig, VoiceState> {\n public static readonly plugName = \"voice\";\n public static readonly BUILD = VOICE_BUILD;\n public ai?: VoiceAiPin;\n protected recognition?: any;\n protected teachBasics = limited(() => this.view?.(`Follow the guides at the ${(this.config.feedback.helper.position || \"bottom-left\").replace(\"-\", \" \")}. Click ⚙ for settings`, { ...tutorialOpts(this.teachBasics.block), id: this.TIDS.TEACHER, signal: this.signal }), { key: `${luid()}_voice_basics`, maxTimes: 6, perSession: 2 });\n protected snublist: Array<Action[\"id\"]> = [\"voiceToggleOn\", \"voiceToggleOff\"] as const;\n protected readonly TIDS = { ROUTER: `tmg-media-voice-router-for-${this.ctlr.config.id}`, HELPER: `tmg-media-voice-helper-for-${this.ctlr.config.id}`, TEACHER: `tmg-media-voice-teacher-for-${this.ctlr.config.id}` };\n protected history: string[] = [\"*\"];\n protected historyIdx: number = 0;\n\n constructor(ctlr: Controller, config = ctlr.settings.voice) {\n super(ctlr, config, { ctx: \"*\", routing: false });\n const AiPin = PinRegistry.get(\"voice.ai\");\n AiPin && this.config.ai && (this.ai = new AiPin(this.ctlr, this.config.ai));\n }\n\n public override mount(): void {\n // Variables Assignment\n this.ai?.mount?.();\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n if (!SpeechRecognition) return;\n this.recognition = new SpeechRecognition();\n Object.assign(this.recognition, { continuous: true, interimResults: true, onresult: this.onResult, onend: this.onEnd, onerror: this.onError });\n }\n\n public override wire(): void {\n // Event Listeners\n [\"click\", \"click\", \"keydown\", \"mousemove\", \"touchmove\", \"scroll\"].forEach((ev, i) => this.container?.addEventListener(ev, !i ? this.handleClick : i < 3 ? this.handleInput : this.stayWoke, { passive: i > 3, signal: this.signal }));\n // State Watchers\n this.state.watch(\"ctx\", this.onCtx, { signal: this.signal });\n // ----- Listeners\n this.state.on(\"routing\", ({ value }) => (this.media.container.classList.toggle(\"tmg-media-path-routing\", value), (this.config.feedback.router.autoClose = value || this.config.feedback.behavior.value === \"persistent\" ? false : true)), { signal: this.signal });\n // Ctlr Config Setters\n this.ctlr.config.set(\"settings.voice.active.value\", (v) => (v === \"passive\" && !this.config.commands.voiceWake.length ? false : v), { init: true, signal: this.signal });\n // ---- Media Watchers\n this.media.watch(\"tech\", () => this.media.tech.polyfill(\"voice\", true), { init: true, signal: this.signal }); // falls back to tap routing\n // ---- State Listeners\n this.ctlr.state.on(\"mediaIntersecting\", () => this.ctlr.debounce(\"syncingListener\", this.syncListener, 500, false, this.signal), { signal: this.signal });\n globalState.on(\"isVisible\", () => this.ctlr.debounce(\"syncingListener\", this.syncListener, 500, false, this.signal), { signal: this.signal });\n // ---- Config -------\n this.ctlr.config.on(\"settings.voice.active.value\", this.handleActive, { signal: this.signal });\n this.ctlr.config.on(\"settings.voice.muted\", ({ value }) => this.config.active.value && (value && this.recognition?.abort(), this.start()), { signal: this.signal });\n this.ctlr.config.on(\"settings.voice.feedback.behavior.value\", ({ value }) => (this.config.feedback.router.autoClose = this.state.routing || value === \"persistent\" ? false : true), { init: true, signal: this.signal });\n this.ctlr.config.on(\"settings.voice.feedback.router\", ({ type, value, target: { key } }) => this.view?.update(this.TIDS.ROUTER, type !== \"update\" ? value : ({ [key]: value } as any)), { signal: this.signal });\n this.ctlr.config.on(\"settings.voice.feedback.helper\", ({ type, value, target: { key } }) => this.view?.update(this.TIDS.HELPER, type !== \"update\" ? value : ({ [key]: value } as any)), { signal: this.signal });\n this.ctlr.config.on(\"settings.voice.commands.voiceWake\", ({ value }) => !this.state.routing && (value.length ? this.config.active.value && this.start() : (this.config.active.value = false)), { signal: this.signal });\n this.ctlr.config.on(\"disabled\", this.syncListener, { signal: this.signal });\n this.ctlr.config.on(\"devMode\", () => this.state.routing && this.predict(), { signal: this.signal });\n this.ctlr.learn(\"voiceWake\", { voice: { stage: \"anytime\", match: \"chunk\" } }, this.signal);\n this.ctlr.learn(\"voiceQuit\", { voice: { stage: \"anytime\" } }, this.signal);\n this.ctlr.learn(\"voiceMute\", { voice: { stage: \"anytime\" } }, this.signal);\n this.ctlr.learn(\"voiceSubmit\", { fn: () => this.submit(), voice: { stage: \"pre-route\" } }, this.signal);\n this.ctlr.learn(\"voiceCtxPrevious\", { fn: this.goBack, keyboard: { phase: \"keydown\" } }, this.signal);\n this.ctlr.learn(\"voiceCtxNext\", { fn: this.goForward, keyboard: { phase: \"keydown\" } }, this.signal);\n this.ctlr.learn(\"voiceCtxClear\", { fn: () => this.clearCtx(false) }, this.signal);\n this.ctlr.flags.wired ? this.syncListener() : this.ctlr.state.wonce(\"readyState\", this.syncListener, { signal: this.signal }); // #HEAVY: waits for !light. If wake word is enabled, start the engine immediately in \"sleep\" mode\n this.ai?.wire?.(), super.wire();\n }\n\n protected onResult(e: any): void {\n if (this.ai?.synth?.speaking) return;\n this.snooze();\n let transcript = \"\";\n if (!this.config.muted) for (let i = e.resultIndex, len = e.results.length; i < len; ++i) transcript += e.results[i][0].transcript;\n transcript = transcript.trim().toLowerCase();\n !this.config.muted && (this.state.routing || this.config.feedback.behavior.value !== \"strict\") && this.view?.(transcript ? `${transcript}${!this.state.routing ? `... Say ${this.linked(isArr(this.config.commands.voiceWake) ? this.config.commands.voiceWake[0] : this.config.commands.voiceWake)}!` : \"\"}` : this.getRouterSpeech(this.state.routing && !IS_MOBILE ? \"Didn't catch that...\" : undefined, this.state.routing ? \"\" : undefined), this.getRouterOptions());\n const input = this.container?.querySelector<HTMLInputElement>('input[name=\"voice_path\"]');\n if (input) input.value = transcript;\n transcript && this.ctlr.debounce(\"voiceProcessing\", () => `${e.resultIndex}-${transcript}` !== this.prevRes && ((this.prevRes = `${e.resultIndex}-${transcript}`), this.process(transcript)), 500, false, this.signal); // Process after delay\n }\n private prevRes: string | false = false;\n protected onEnd(): void {\n this.prevRes = false;\n this.config?.active.value && this.shouldListen() && this.start();\n }\n protected onError(e: any): void {\n if (e.error.endsWith(\"not-allowed\")) this.config.muted ? this.start() : (this.config.active.value = false), this.view?.error(\"Microphone access revoked. Please check your settings.\", { tag: \"tmg-mard\" });\n }\n\n protected handleActive({ value }: REvent<CtlrConfig, \"settings.voice.active.value\">): void {\n value === false ? this.stop() : this.shouldListen() && (value === \"passive\" ? this.sleep() : this.wakeUp(), this.start());\n }\n public syncListener(): void {\n !this.shouldListen() ? this.stop() : this.config.active.value && (this.config.active.value === true && this.wakeUp(), this.start());\n }\n protected shouldListen(): boolean {\n return this.ctlr.flags.wired && ((globalState.isVisible && this.ctlr.state.mediaIntersecting) || this.config.muted) && !this.ctlr.config.disabled;\n }\n\n protected async request(): Promise<\"granted\" | \"denied\" | \"cancelled\" | \"nuked\"> {\n const state = (await navigator.permissions?.query({ name: \"microphone\" }).catch(() => null))?.state ?? \"prompt\";\n if (state === \"granted\" || state === \"denied\") return state;\n // prettier-ignore\n return t007.toast?.dismiss(this.TIDS.HELPER), new Promise((res, _, req?: () => void, i = 0) => ((req = () => this.view?.info(\"Voice control requires mic access\", { id: this.TIDS.ROUTER, signal: this.signal, ...this.config.feedback.router, autoClose: false, actions: { OK: () => navigator.mediaDevices.getUserMedia({ audio: true }).then((s) => (s.getTracks().forEach((t) => t.stop()), res(\"granted\"))).catch(async (e) => (await navigator.permissions?.query({ name: \"microphone\" as any }).then(p => p?.state === \"denied\", () => e.message === \"Permission denied\")) || ++i > 3 ? res(\"cancelled\") : this.view?.warn(\"Grant permission to use microphone\", { id: this.TIDS.ROUTER, autoClose: false, actions: { Retry: req! } })), ...this.getRouterActions(false) }, onClose: (_, user) => res(user ? \"cancelled\" : \"nuked\") }) || res(\"nuked\"))())); // #EXTRA-MILE: doing the most with the least\n }\n public async start(): Promise<void> {\n let state = this.config.muted ? \"granted\" : await this.request();\n if (state === \"nuked\" || !this.config) return; // only death i know hence abort over config check\n state === \"granted\" && (this.config.feedback.behavior.value === \"persistent\" || t007.toast.isActive(this.TIDS.ROUTER)) && this.view?.(this.getRouterSpeech(), this.getRouterOptions());\n if (this.state.routing) this.goTo(), t007.toast.isActive(this.TIDS.HELPER) && this.teachBasics();\n try {\n state === \"granted\" ? !this.config.muted && this.recognition?.start() : this.onError({ error: \"not-allowed\" });\n } catch (e) {} // Silence the InvalidStateError since we might call when already on due to wake word\n }\n protected stop(): void {\n (this.state.routing = this.prevRes = false), this.recognition?.abort();\n for (const k in this.TIDS) t007.toast?.dismiss(this.TIDS[k as keyof typeof this.TIDS]);\n for (const k of [\"voiceSleeping\", \"voiceProcessing\"]) this.ctlr.cancelTimeout(\"debounce\", k);\n }\n\n protected wakeUp(): void {\n if (this.state.routing) return;\n (this.state.routing = true), this.ai?.chat();\n this.clearCtx(), this.view?.(this.getRouterSpeech(), this.getRouterOptions()), this.snooze();\n } // #STANDALONE: needs scoped behavior\n protected sleep(): void {\n if (!this.state.routing) return;\n (this.state.routing = this.prevRes = false), this.ai?.stop(), this.ai?.view?.render(null);\n this.clearCtx(), t007.toast?.dismiss(this.TIDS.HELPER), !this.config.active.value || this.config.feedback.behavior.value !== \"persistent\" ? t007.toast?.dismiss(this.TIDS.ROUTER) : this.view?.(this.getRouterSpeech(), this.getRouterOptions());\n } // #STANDALONE: needs scoped behavior\n\n protected trigger(transcript: string, stage: VoiceStage = this.config.process.stage.value): boolean {\n for (const act of Object.values(this.ctlr.actions.entries)) {\n const cmd = this.config.commands[act.id];\n if (!cmd?.length || (act.id !== \"voiceWake\" && !this.config.process.allowCommands) || this.snublist.includes(act.id) || (act.voice?.stage || this.config.process.stage.value) !== stage || (act.id === \"voiceWake\" && this.state.routing) || act.gates?.some((g) => !this.media.features[g])) continue;\n if (((act.voice?.match || this.config.process.match.value) === \"chunk\" ? fuzzyChunkMatch : fuzzyBlobMatch)(cmd, transcript, this.config.process.accuracy)) return this.ctlr.perform(act.id) && (act.id === \"voiceSubmit\" || this.view?.success(`Triggered <b>${act.label ?? capitalize(uncamelize(act.id))}</b>`, { id: this.TIDS.ROUTER, icon: true, autoClose: this.config.feedback.router.autoClose })), true;\n }\n return false;\n }\n protected process(transcript: string, cleaned = transcript.replace(/[-\\s]/g, \"\"), isSubmit = false, dormant = !this.state.routing): boolean {\n if (this.trigger(transcript, \"anytime\") || dormant) return !dormant;\n // --- 1. PRE-ROUTE STAGE ---\n if (this.trigger(transcript, \"pre-route\")) return true;\n if (this.ai?.config.active) return this.ai.process(transcript, isSubmit), true;\n // --- 2. PATH|LEAF EXECUTION (PRIORITY) ---\n if (!this.ctlr.isLogical(this.state.ctx, true)) {\n const paths = this.ctlr.getLogicPaths(this.state.ctx);\n // prettier-ignore\n let match: string | null = null, highest = 0, len = paths.length;\n if (len)\n for (let i = 0; i < len; i++) {\n const leaf = paths[i].split(\".\").pop()!.toLowerCase();\n // prettier-ignore\n if (cleaned === leaf) { match = paths[i]; break; }\n const score = getLevenshteinSimilarity(leaf, transcript);\n if (score > this.config.process.accuracy && score > highest) (highest = score), (match = paths[i]);\n } // Fuzzy Match: Check if the user said the last word of any valid path\n if (match) {\n if (this.ctlr.isLogical(this.goTo(match), true)) return this.execute(transcript, match, true), true; // If a S.I.A path strongly matches what they said, TAKE IT. Bypasses commands completely.\n } else if (isSubmit) {\n const path = this.state.ctx === \"*\" ? transcript : `${this.state.ctx}.${camelize(transcript)}`,\n val = this.ctlr.isLogical(path) ? getPath(this.ctlr.logicRoot as any, mirror(path, this.ctlr.logicRoot)) : undefined;\n if (val !== undefined && this.ctlr.isLogical(this.goTo(path), true, val)) return this.execute(transcript, path, true), true; // Hey dev or explorer, here u go!\n }\n } else if (this.execute(transcript, undefined, false)) return true;\n // --- 4. POST-ROUTE STAGE ---\n return this.trigger(transcript, \"post-route\") ? true : this.ai ? (this.ai.process(transcript, isSubmit), true) : false;\n }\n protected parse(transcript: string, path = this.state.ctx, isNav = false, value = getPath(this.ctlr.logicRoot as any, mirror(path, this.ctlr.logicRoot)), type = isArr(value) ? \"array\" : typeof value): any {\n if (type === \"boolean\") return isNav && this.config.routing.autoToggles ? !value : fuzzyChunkMatch(this.config.commands.voiceToggleOn, transcript, this.config.process.accuracy) ? true : fuzzyChunkMatch(this.config.commands.voiceToggleOff, transcript, this.config.process.accuracy) ? false : null;\n if (isNav) return null;\n if (type === \"number\") {\n const match = transcript.replace(/,/g, \"\").match(/-?\\d+(\\.\\d+)?/);\n return match ? Number(match[0]) : null;\n } else if (type === \"string\" || type === \"array\") return transcript ? (type === \"string\" ? transcript : transcript.split(/\\s*(?:,|and)\\s*/i).filter(Boolean)) : null;\n return null;\n }\n protected execute(transcript: string, path = this.state.ctx, isNav = false, isSubmit = false, value = this.parse(transcript, path, isNav), type = isArr(value) ? \"array\" : typeof value): boolean {\n if (value === null) return false;\n if ((this.config.routing.strict.value === true || (this.config.routing.strict.value === \"auto\" && type === \"string\")) && !isSubmit) {\n const input = this.container?.querySelector<HTMLInputElement>(clame(\"input\"));\n if (input) input.value = type === \"array\" ? value.join(\", \") : String(value);\n return this.view?.update(this.TIDS.ROUTER, { render: transcript || fvalue(value), ...this.getRouterOptions(false) }), true;\n } // Auto-Strict: Blocks execution for strings only (or everything if true)\n return setPath(this.ctlr.logicRoot as any, path as any, value), this.goBack(), setTimeout(() => (this.view?.success(`${fpath(path)} -> <code>${fvalue(value)}</code>`, { id: this.TIDS.ROUTER, icon: true, autoClose: this.config.feedback.router.autoClose }), this.ctlr.plug(\"settings.timeTravel\")?.teachBasics()), 200, this.signal), true; // last to render\n }\n protected submit(render = this.container?.querySelector<HTMLInputElement>(clame(\"input\"))?.value.trim() || this.ai?.state.prompt.trim(), process = false): void {\n if (render) this.view?.update(this.TIDS.ROUTER, { render, ...this.getRouterOptions(false) }), this.ai?.config.active ? this.ai.submit(render) : !process ? this.execute(render, undefined, false, true) : this.process(render, undefined, true); // Execute with isSubmit = true\n }\n public predict(): void {\n const isAi = !!this.ai?.config.active,\n crumbHtml = this.history.length < 2 && !isAi ? \"\" : `<div class=\"tmg-media-voice-crumb-wrap\">` + (isAi ? `<small style=\"font-weight: 600;\">AI Copilot</small>` : this.history.map((p, idx, _, active = idx === this.historyIdx) => `<small style=\"${active ? \"font-weight: 500;\" : \"opacity: 0.8;\"}\">${this.linked(p === \"*\" ? \"Root\" : uncam(p.split(\".\").pop()!), p, \"goto\")}</small>`).join(\" <span style='opacity: 0.4;'><small>></small></span> \")) + `</div>`,\n actions: ToastOptions[\"actions\"] = {};\n if (this.media.features.voiceItems && !isAi) {\n actions[`<span title='Clear context${formatActionTooltip(this.settings, \"voiceCtxClear\")}'>×</span>`] = () => this.clearCtx(false);\n actions[`<span title='Go back${formatActionTooltip(this.settings, \"voiceCtxPrevious\")}' ${this.media.features.previousVoiceItem ? \"\" : \"disabled\"}>‹</span>`] = this.goBack;\n actions[`<span title='Go forward${formatActionTooltip(this.settings, \"voiceCtxNext\")}'${this.media.features.nextVoiceItem ? \"\" : \" disabled\"}>›</span>`] = this.goForward;\n }\n if (this.media.features.voiceAi) actions[`<span title='Toggle AI Copilot${formatActionTooltip(this.settings, \"voiceAi\")}' ${isAi ? \"data-auto\" : \"\"}>✨</span>`] = () => this.ctlr.perform(\"voiceAi\");\n if (isAi && this.ai) {\n const isBusy = !!this.ai.state.status,\n showSubmit = this.media.tech.polyfill(\"voiceAiStop\", isBusy) || this.media.tech.polyfill(\"voiceSubmit\", this.config.routing.strict.value === true || this.config.routing.strict.value === \"auto\"),\n feedback = isBusy ? `<div class=\"tmg-media-voice-ai-bubble\"><small>${this.ai.state.status}</small></div>` : \"\",\n undoHtml = !isBusy && this.ai.module.canUndo ? `<button type=\"button\" class=\"tmg-media-voice-undo\" title='Undo changes${formatActionTooltip(this.settings, \"voiceAiTimeTravelUndo\")}' data-action=\"undo\">↺</button>` : \"\",\n redoHtml = !isBusy && this.ai.module.canRedo ? `<button type=\"button\" class=\"tmg-media-voice-redo\" title='Redo changes${formatActionTooltip(this.settings, \"voiceAiTimeTravelRedo\")}' data-action=\"redo\">↻</button>` : \"\",\n submitHtml = isBusy || showSubmit ? `<button type=\"button\" class=\"tmg-media-voice-submit${isBusy ? \" stop\" : \"\"}\" title='${isBusy ? `Stop ${formatActionTooltip(this.settings, \"voiceAiStop\")}` : `Submit ${formatActionTooltip(this.settings, \"voiceSubmit\")}`}' data-action=\"${isBusy ? \"stop\" : \"submit\"}\">${isBusy ? \"■\" : \"↳\"}</button>` : \"\",\n inputHtml = `<div class=\"tmg-media-voice-input-wrap\"><textarea rows=\"${isBusy ? 1 : 2}\" name=\"voice_prompt\" class=\"tmg-media-voice-input\" placeholder=\"${isBusy ? \"AI is working\" : \"Ask AI or tell it to control playback...\"}\" ${isBusy ? \"disabled\" : \"\"}>${this.ai.state.prompt || \"\"}</textarea>${undoHtml}${submitHtml}${redoHtml}</div>`;\n this.view?.(`${crumbHtml}<div class=\"tmg-media-voice-content\">${feedback}${inputHtml}</div>`, this.getHelperOptions(actions));\n const input = this.container?.querySelector<HTMLTextAreaElement>(clame(\"input\"));\n return void (input && (input.value = this.ai.state.prompt || \"\"));\n }\n if (this.ctlr.isLogical(this.state.ctx, true)) {\n const value = getPath(this.ctlr.logicRoot, mirror<any>(this.state.ctx, this.ctlr.logicRoot)),\n type = isArr(value) ? \"array\" : typeof value,\n showInput = this.config.routing.strict.value === true || (this.config.routing.strict.value === \"auto\" && type !== \"boolean\"),\n showSubmit = this.media.tech.polyfill(\"voiceSubmit\", this.config.routing.strict.value === true || (this.config.routing.strict.value === \"auto\" && type === \"string\")),\n display = type === \"array\" ? value.join(\", \") : value ?? \"\",\n inputHtml = showInput ? `<div class=\"tmg-media-voice-input-wrap\"><input name=\"voice_value\" type=\"${type === \"number\" ? \"number\" : \"text\"}\" class=\"tmg-media-voice-input\" placeholder=\"${display || (type === \"boolean\" ? \"true\" : type === \"number\" ? \"0\" : type === \"array\" ? \"value 1, value 2, value 3, ...\" : \"...text\")}\" value=\"${display}\"/>${showSubmit ? `<button type=\"button\" title='Submit ${formatActionTooltip(this.settings, \"voiceSubmit\")}' class=\"tmg-media-voice-submit\">↳</button>` : \"\"}</div>` : \"\",\n // prettier-ignore\n hints = type === \"boolean\" ? `${(isArr(this.config.commands.voiceToggleOn) ? this.config.commands.voiceToggleOn.slice(0, 2) : [this.config.commands.voiceToggleOn]).map((v) => this.linked(v)).join(\", \")} or ${(isArr(this.config.commands.voiceToggleOff) ? this.config.commands.voiceToggleOff.slice(0, 2) : [this.config.commands.voiceToggleOff]).map((v) => this.linked(v)).join(\", \")} ${inputHtml}` : type === \"number\" ? `a number (like ${this.linked(\"0\")}, ${this.linked(\"50\")}):</small> ${inputHtml}` : type === \"array\" ? `comma-separated values:</small> ${inputHtml}` : `the exact text:</small> ${inputHtml}`;\n return void this.view?.(`${crumbHtml}<div class=\"tmg-media-voice-content\">${showInput ? '<small style=\"font-weight: 500;\">' : \"\"}Try ${this.config.muted ? (showInput ? \"typing\" : IS_MOBILE ? \"tapping\" : \"clicking\") : \"saying\"} ${hints}</div>`, this.getHelperOptions(actions));\n }\n const paths = this.ctlr.getLogicPaths(this.state.ctx);\n if (!paths.length) return;\n const inputHtml = `<input name=\"voice_path\" type=\"text\" class=\"tmg-media-voice-input\" placeholder=\"...text\"/>`;\n this.view?.(`${crumbHtml}<div class=\"tmg-media-voice-content\"><small style=\"font-weight: 500;\">Try ${this.config.muted ? (IS_MOBILE ? \"tapping\" : \"clicking\") : \"saying\"} any of these:</small><br>${inputHtml} • ${paths.map((p) => this.linked(uncam(p.split(\".\").pop()!))).join(\" • \")}</div>`, this.getHelperOptions(actions));\n }\n public linked(text: string, value = text.toLowerCase(), type?: \"menu\" | \"goto\", punc = type || this.config.muted ? \"\" : '\"'): string {\n return `${punc}<u class=\"tmg-media-voice-link\" ${type ? `data-${type}` : \"data-cmd\"}=\"${value}\" title='${type ? \"Go to\" : \"Say\"} \"${value}\"' tabindex=\"0\" style=\"cursor:pointer; text-decoration-color: rgb(from var(--tmg-media-brand-${type ? \"accent-\" : \"\"}color) r g b / 0.75);\">${type || this.config.muted ? text : value}</u>${punc}`;\n } // `\"\"` is my lil UI Experiment, crafting a standard here :)\n protected stayWoke(e: Event): void {\n this.state.routing && this.ctlr.throttle(\"voiceWaking\", () => e.composedPath().some((el) => (el as HTMLElement)?.matches?.(`:is([id=\"${this.TIDS.HELPER}\"],[id=\"${this.TIDS.ROUTER}\"],[class=\"tmg-media-captions-container\"])`)) && this.snooze(), 500);\n }\n protected handleClick(e: Event, t = e.target as HTMLElement, menu = this.ctlr.plug(\"settings.panel\")?.menu): void {\n if (!t?.matches?.(clame(\"link\"))) return;\n e.preventDefault(), e.stopPropagation();\n if (t.dataset.goto) return void (this.ai?.config.active && (this.ai.config.active = false), this.goTo(t.dataset.goto));\n if (t.dataset.menu) return void (menu?.open(), menu?.goTo(t.dataset.menu));\n this.view?.update(this.TIDS.ROUTER, { render: t.dataset.cmd, ...this.getRouterOptions(false) }); // Instantly update the router toast to show they \"clicked/said\" it\n this.process(t.dataset.cmd || \"\"); // Pipe it straight into the processor as if they spoke it!\n }\n protected handleInput(e: Event, t = e.target as HTMLInputElement, isEnter = e.type === \"keydown\" && (e as KeyboardEvent).key === \"Enter\" && !(e as KeyboardEvent).shiftKey, isClick = e.type === \"click\", isSubmit = isClick && t.matches(clame(\"submit\")), isUndo = isClick && t.matches(clame(\"undo\")), isRedo = isClick && t.matches(clame(\"redo\"))): void {\n this.stayWoke(e);\n if (!t?.tagName || !(isEnter || isSubmit || isUndo || isRedo)) return;\n if (!this.ai?.config.active) e.preventDefault(), e.stopPropagation(), this.submit(t.closest(clame(\"input-wrap\"))?.querySelector<HTMLInputElement>(clame(\"input\"))?.value ?? t.value, !t.closest(clame(\"input-wrap\")));\n else e.preventDefault(), e.stopPropagation(), isUndo ? this.ai.module.undo() : isRedo ? this.ai.module.redo() : t.dataset.action === \"stop\" ? this.ai?.stop() : this.ai.submit(t.closest(clame(\"input-wrap\"))?.querySelector<HTMLInputElement>(clame(\"input\"))?.value);\n }\n public snooze(): void {\n !this.ai?.state.status && !this.ai?.synth?.speaking ? this.ctlr.debounce(\"voiceSleeping\", this.snoozeCb, this.config.routing.timeout, false, this.signal) : this.ctlr.cancelTimeout(\"debounce\", \"voiceSleeping\");\n }\n private snoozeCb = () => (this.config.active.value = \"passive\");\n\n protected onCtx(value: string): void {\n if (this.history[this.historyIdx] !== this.state.ctx) {\n const idx = this.history.indexOf(this.state.ctx);\n idx === -1 && this.history.splice(this.historyIdx + 1, this.history.length, value), (this.historyIdx = idx !== -1 ? idx : this.history.length - 1);\n }\n this.media.tech.polyfill([\"voiceSubmit\", \"voiceAiStop\"], false), this.media.tech.polyfill(\"voiceItems\", this.history.length > 1);\n this.media.tech.polyfill(\"previousVoiceItem\", this.historyIdx > 0), this.media.tech.polyfill(\"nextVoiceItem\", this.historyIdx < this.history.length - 1);\n this.state.routing && this.predict(); // The single source of truth for rendering the UI\n }\n protected goTo(path = this.state.ctx, useForce = path === this.state.ctx): string {\n return force(() => (this.state.ctx = path), useForce);\n }\n protected goBack(): void {\n this.media.features.previousVoiceItem && this.goTo(this.history[--this.historyIdx]);\n }\n protected goForward(): void {\n this.media.features.nextVoiceItem && this.goTo(this.history[++this.historyIdx]);\n }\n protected clearCtx(direct = this.config.routing.direct): void {\n (this.history = direct ? [\"*\", \"media\", \"media.intent\"] : [\"*\"]), this.goTo(direct ? \"media.intent\" : \"*\", true);\n }\n\n protected getHelperOptions(actions?: ToastOptions[\"actions\"]): ToastOptions {\n return { id: this.TIDS.HELPER, actions, onClose: (_, user) => user && (this.config.active.value = \"passive\"), signal: this.signal, ...this.config.feedback.helper, icon: !this.ai?.config.active && this.config.feedback.helper.icon };\n }\n protected getRouterOptions(full = true): ToastOptions {\n return full ? { id: this.TIDS.ROUTER, actions: this.getRouterActions(), onClose: (_, user) => user && (this.config.active.value = false), signal: this.signal, ...this.config.feedback.router, ...this.getRouterOptions(false) } : { icon: this.config.feedback.router.icon, type: this.config.muted ? \"warning\" : this.config.feedback.router.type };\n }\n protected getRouterActions(full = true): ToastOptions[\"actions\"] {\n return { ...(full && this.state.routing && { [`<span title='Open actions'>${IconRegistry.get(\"settings\")}</span>`]: (_, __, menu = this.ctlr.plug(\"settings.panel\")?.menu) => (menu?.open(null), menu?.goTo(\"actions\")) }), [`<span title='${this.config.muted ? \"Unmute\" : \"Mute\"} voices${formatActionTooltip(this.settings, \"voiceMute\")}'>${IconRegistry.get(this.config.muted ? \"volumeMuted\" : \"volumeHigh\", true)}</span>`]: () => (this.config.muted = !this.config.muted) };\n }\n protected getRouterSpeech(firstHalf = this.config.muted ? \"Snubbing...\" : \"Listening...\", secondHalf = `${this.config.muted ? (IS_MOBILE ? \"Tap\" : \"Click\") : \"Say\"} ${!this.state.routing ? `${isArr(this.config.commands.voiceWake) ? this.config.commands.voiceWake.map((c = \"\") => this.linked(c)).join(\" or \") : this.linked(this.config.commands.voiceWake)} to wake me up` : this.config.muted ? \"or type instead\" : \"a path or command!\"}`): string {\n return `${firstHalf} ${secondHalf}`;\n }\n public get container() {\n return this.ctlr.plug(\"settings.toasts\")?.container;\n }\n protected get view() {\n return this.ctlr.toast;\n }\n\n public override onDestroy(): void {\n this.ai?.destroy(), this.stop(), super.onDestroy();\n }\n}\nconst clame = (sfx: string) => `.tmg-media-voice-${sfx}`;\n\nexport type * from \"./types\";\nexport * from \"./build\";\nexport * from \"./ai\";\n\ndeclare module \"@defs/registries\" {\n interface PlugRegistryMap {\n \"settings.voice\": typeof VoicePlug;\n }\n}\n\ndeclare module \"@defs/config\" {\n interface Settings {\n voice: VoiceConfig;\n }\n}\n\ndeclare module \"@defs/contract\" {\n interface MediaFeaturesExt {\n voice: boolean;\n voiceItems: boolean;\n voiceSubmit: boolean;\n nextVoiceItem: boolean;\n previousVoiceItem: boolean;\n }\n}\n","import { BasePin } from \"../../base\";\nimport type { Controller } from \"@core/controller\";\nimport { VoicePlug } from \"./index\";\nimport type { AiResponse, VoiceAiConfig, VoiceAiState } from \"./types\";\nimport { responseConstraint, VOICE_AI_BUILD, VOICE_AI_INITIAL_PROMPTS } from \"./build\";\nimport { setPath, getPath, getPaths, withMeta } from \"sia-reactor/utils\";\nimport { createTxPathMerger, TimeTravelModule, Transaction } from \"sia-reactor/modules\";\nimport { isArr, isObj, isStr } from \"@utils/obj\";\nimport { ComponentRegistry } from \"@core/registries\";\nimport type { CaptionsView } from \"@components/captionsView\";\nimport { capitalize, fpath, uncamelize } from \"@utils/str\";\nimport { CtlrConfig } from \"@defs/config\";\nimport { REvent } from \"sia-reactor\";\n\nexport class VoiceAiPin extends BasePin<VoicePlug, VoiceAiConfig, VoiceAiState> {\n public static readonly pinName = \"ai\";\n public static get Plug() {\n return VoicePlug;\n }\n public static readonly BUILD = VOICE_AI_BUILD;\n public view: CaptionsView | null = null;\n public synth = globalThis.speechSynthesis;\n public module!: TimeTravelModule<any>;\n protected qac: AbortController | null = null;\n protected session: any = null;\n protected readonly TIDS = { DOWNLOAD: `tmg-media-voice-ai-downloader-for-${this.ctlr.config.id}` };\n\n constructor(ctlr: Controller, config = ctlr.settings.voice.ai) {\n super(ctlr, config, { status: \"\", prompt: \"\", speech: JSON.parse(VOICE_AI_INITIAL_PROMPTS.at(-1)!.content).speech });\n }\n\n public override mount(): void {\n // Variables Assignment\n const merger = createTxPathMerger();\n this.module = new TimeTravelModule({ whitelist: { media: [\"intent\", \"settings\"] }, beforeEntry: (entry, history, e) => !!e.ai && merger(entry, history, e) });\n // Utility Injection\n this.module.attach(this.media, \"media\").setup(this.ctlr.config, \"config\");\n }\n\n public override wire(): void {\n // State Watchers\n for (const p of [\"status\", \"prompt\"] as const) this.state.watch(p, this.plug.predict, { signal: this.signal });\n this.state.watch(\"speech\", this.chat, { signal: this.signal });\n this.module.state.watch(\"currentFrame\", this.syncFeatures, { signal: this.signal });\n // State Listeners\n this.module.state.on(\"currentFrame\", this.plug.predict, { signal: this.signal });\n // Ctlr Media Watchers\n this.media.watch(\"tech\", this.syncFeatures, { init: true, signal: this.signal });\n // ---- Config Listeners\n this.ctlr.config.on(\"settings.voice.ai.active\", this.handleActive, { signal: this.signal });\n this.ctlr.config.on(\"settings.voice.feedback.copilot.captions\", this.chat, { signal: this.signal });\n this.ctlr.config.on(\"settings.voice.feedback.copilot.speech\", ({ value }) => !value && this.quiet(), { signal: this.signal });\n for (const k of [\"systemPrompt\", \"preference\"] as const) this.ctlr.config.on(`settings.voice.ai.${k}`, this.reset, { signal: this.signal });\n // Post Wiring\n this.ctlr.learn(\"voiceAi\", { voice: { stage: \"anytime\", match: \"chunk\" } }, this.signal);\n this.ctlr.learn(\"voiceAiStop\", { fn: this.stop, voice: { stage: \"pre-route\" } }, this.signal);\n this.ctlr.learn(\"voiceAiTimeTravelUndo\", { fn: this.module.undo, keyboard: { phase: \"keydown\" }, voice: { stage: \"pre-route\" } }, this.signal);\n this.ctlr.learn(\"voiceAiTimeTravelRedo\", { fn: this.module.redo, keyboard: { phase: \"keydown\" }, voice: { stage: \"pre-route\" } }, this.signal);\n if (this.plug.config.active) this.ctlr.flags.wired ? this.prewarm() : this.ctlr.state.wonce(\"readyState\", this.prewarm, { signal: this.signal }); // #HEAVY: waits for !light\n }\n\n protected handleActive({ value }: REvent<CtlrConfig, \"settings.voice.ai.active\">): void {\n value && this.prewarm(), (this.plug.config.active.value = true), this.chat(), this.media.container.classList.toggle(\"tmg-media-ai\", value);\n }\n\n public async prewarm(): Promise<void> {\n const LM = (window as any).LanguageModel ?? (window as any).ai?.languageModel;\n if (LM && !this.session)\n try {\n this.session = await LM.create({ systemPrompt: this.systemPrompt, initialPrompts: [{ role: \"system\", content: this.systemPrompt }, ...VOICE_AI_INITIAL_PROMPTS], outputLanguage: \"en\", expectedOutputs: [{ type: \"text\", languages: [\"en\"] }], temperature: 0.1, topK: 1, monitor: (m: any) => m.addEventListener(\"downloadprogress\", (e: any, pct = Math.round((e.loaded / e.total) * 100)) => (pct && pct < 100 ? this.ctlr.toast?.info(`Downloading built-in AI: ${pct}%`, { id: this.TIDS.DOWNLOAD, autoClose: false, signal: this.signal }) : t007.toast?.dismiss(this.TIDS.DOWNLOAD))) });\n } catch (_) {}\n }\n protected async query(text: string, tx: Transaction, signal = this.signal): Promise<void> {\n if ((window as any).LanguageModel ?? (window as any).ai?.languageModel)\n try {\n await this.prewarm(), this.ctlr.log(`[VoiceAI] Query: ${text}`);\n let res = await this.prompt(text, signal),\n next: string | false | null,\n data: any;\n while (!signal.aborted) {\n this.ctlr.log(`[VoiceAI] Step: ${JSON.stringify(res)}`);\n next = res.query ? ((this.state.status = `Reading ${this.getLink(res.query)}...`), this.ctlr.log(`[VoiceAI] Reading: ${res.query}`), (data = this.inspect(res.query)), `[State: ${JSON.stringify({ [res.query]: data })}]`) : this.apply(res, tx) && !res.speech ? (res.action ? `[Executed: ${res.action}]` : `[Applied: ${JSON.stringify({ [res.path!]: res.value })}]`) : null;\n if (!next) return this.ctlr.log(`[VoiceAI] Done: ${res.speech}`), void (this.state.speech = res.speech || \"\");\n this.ctlr.log(`[VoiceAI] Next: ${JSON.stringify(next)}`);\n res = await this.prompt(next, signal);\n }\n return;\n } catch (_) {\n this.reset();\n }\n if (!signal.aborted && this.config.endpoint)\n try {\n const r = await fetch(this.config.endpoint, { method: \"POST\", headers: { \"Content-Type\": \"application/json\", ...(this.config.apiKey ? { Authorization: `Bearer ${this.config.apiKey}` } : {}) }, body: JSON.stringify({ prompt: text, systemPrompt: this.systemPrompt, model: this.config.model }), signal });\n if (r.ok) {\n let res = await r.json();\n return this.apply((res = isStr(res) ? parseAiResponse(res) : res), tx), res.speech && this.speak((this.state.speech = res.speech)), void 0;\n }\n } catch (_) {}\n !signal.aborted && this.ctlr.toast?.error(`AI endpoint not configured. Visit ${this.plug.linked(\"settings\", \"voiceAi\", \"menu\")} or enable Built-in AI.`, { signal: this.signal });\n }\n protected apply(res: AiResponse, tx: Transaction): boolean {\n return !res.action && !res.path ? false : (this.ctlr.log(`[VoiceAI] Apply: ${res.action ? `Action \"${res.action}\"` : `${res.path} = ${res.value}`}`), (this.state.status = res.action ? `Executing ${this.getLink(res.action, false)}...` : `Setting ${this.getLink(res.path!)}...`), withMeta({ ai: true, tx }, () => (res.action ? this.ctlr.perform(res.action) : setPath(this.systemRoot, res.path!, res.value))), true);\n }\n protected reset(): void {\n this.session?.destroy?.(), (this.session = null);\n }\n\n public process(transcript: string, isSubmit = false, strict = this.plug.config.routing.strict.value): boolean {\n if (!transcript || (this.state.status && strict !== false)) return false;\n this.state.prompt = transcript;\n const input = this.plug.container?.querySelector<HTMLTextAreaElement>(clame(\"input\"));\n if (input) input.value = transcript;\n return (strict === true || (strict === \"auto\" && !isSubmit)) && !isSubmit ? true : (this.submit(transcript), true);\n }\n public async submit(prompt = this.state.prompt, text = (prompt || \"\").trim()): Promise<boolean> {\n if (!text) return false;\n this.state.status && this.stop();\n const signal = AbortSignal.any([this.signal, (this.qac = new AbortController()).signal]),\n tx: Transaction = { id: ++txId, label: text, parent: null };\n (this.state.prompt = text), (this.state.status = \"Thinking...\"), this.quiet(), this.plug.snooze();\n try {\n await this.query(text, tx, signal);\n return (this.state.status = this.state.prompt = \"\"), this.plug.snooze(), !signal.aborted;\n } catch (_) {\n return (this.state.status = this.state.prompt = \"\"), !signal.aborted && this.ctlr.toast?.error(\"AI query failed\", { signal: this.signal }), this.plug.snooze(), false;\n }\n }\n public stop(): void {\n this.qac?.abort(\"Copilot execution cancellation\"), (this.qac = null), (this.state.status = this.state.prompt = \"\"), this.quiet();\n }\n\n public chat(): void {\n if (!this.plug.config.feedback.copilot.captions) return void (this.view?.destroy(), (this.view = null));\n if (!this.view) this.plug.container?.prepend((this.view = ComponentRegistry.init(\"captionsView\", this.ctlr, { isSolo: true, initialX: \"80%\", initialY: \"20%\" }))?.element || \"\");\n this.view?.render(!this.config.active || !this.state.speech ? null : [{ text: `<v AI>${formatAiText(this.state.speech)}</v>`, size: 50, scroll: \"up\", fluid: true }]);\n }\n public speak(text = this.state.speech, u?: SpeechSynthesisUtterance): void {\n if (!this.synth || this.plug.config.muted || !this.plug.config.feedback.copilot.speech) return;\n const s = cleanSpeech(text);\n if (s) this.synth.speak((u ??= new SpeechSynthesisUtterance(s))), (u.onend = u.onerror = this.plug.snooze);\n }\n public quiet(): void {\n this.synth?.cancel();\n }\n\n protected async prompt(text: string, signal = this.signal, raw = \"\", s = \"\", si = 0): Promise<AiResponse> {\n if (!this.session.promptStreaming) {\n const res = parseAiResponse(await this.session.prompt(text, { responseConstraint, signal }).catch(() => \"\"));\n return res.speech && this.speak((this.state.speech = res.speech)), res;\n }\n try {\n for await (const c of this.session.promptStreaming(text, { responseConstraint, signal })) if ((s = extractSpeech((raw = c.startsWith(raw) ? c : raw + c)))) for (const m of (this.state.speech = s).slice(si).matchAll(sepRgx)) this.speak(m[0]), (si += m[0].length);\n !signal.aborted && s.slice(si).trim() && this.speak(s.slice(si));\n } catch (_) {}\n return parseAiResponse(raw);\n }\n protected inspect(path: string, root = this.systemRoot): any {\n const val: any = path && path !== \"root\" ? getPath(root, path as any) : root;\n if (isArr(val) || !isObj(val)) return val ?? null;\n const paths = getPaths(root as any, (!path || path === \"root\" ? \"*\" : path) as any, { depth: 1 }),\n entries = paths.map((p) => [p, getPath(root, p as any)]);\n return entries.some(([, v]) => isObj(v)) ? paths : Object.fromEntries(entries);\n }\n public isLogical(path: string): boolean {\n return (!path || path === \"root\" || path === \"*\" || path.split(\".\")[0] in this.ctlr.logicRoot) && this.ctlr.isLogical(path);\n }\n protected getLink(key: string, isPath = true): string {\n return isPath ? (this.isLogical(key) ? this.plug.linked(fpath(key), key === \"root\" ? \"*\" : key, \"goto\") : fpath(key)) : this.plug.linked(this.ctlr.actions.entries[key].label || capitalize(uncamelize(key)), `actions-detail-${key}`, \"menu\");\n }\n protected get systemRoot(): any {\n return { media: this.media, state: this.ctlr.state, ...this.ctlr.config };\n }\n protected get systemPrompt(): string {\n return `${this.config.systemPrompt}${this.config.preference ? `\\nUser Preference: ${this.config.preference}` : \"\"}`;\n }\n\n protected syncFeatures(): void {\n this.media.tech.polyfill(\"voiceAi\", true), this.media.tech.polyfill(\"voiceAiTimeTravelUndo\", this.module.canUndo), this.media.tech.polyfill(\"voiceAiTimeTravelRedo\", this.module.canRedo);\n }\n\n public override onDestroy(): void {\n this.stop(), this.view?.destroy(), this.session?.destroy?.(), this.module.destroy(), super.onDestroy();\n }\n}\nconst sepRgx = /.*?(?:(?<!\\b[a-z]|\\b(?:etc|vs|dr|mr|mrs|ms)|\\d)[.!?]+[)\"'\\]]*\\s+|\\n+)/gis,\n clame = (sfx: string) => `.tmg-media-voice-${sfx}`;\n// prettier-ignore\nexport const cleanSpeech = (t: string) => t.replace(/<[^>]*>/g, \"\").replace(/[*_#`~]/g, \"\").replace(/\\s+/g, \" \").trim();\n// prettier-ignore\nexport const extractSpeech = (raw: string, m = raw.match(/\"speech\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)/)) => (m ? m[1].replace(/\\\\n/g, \"\\n\").replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\") : \"\");\n// prettier-ignore\nexport const formatAiText = (t: string) => t.replace(/\\*\\*(.*?)\\*\\*/g, \"<b>$1</b>\").replace(/`([^`]+)`/g, \"<code>$1</code>\").replace(/(?:^|\\n)\\s*[*•-]\\s+/g, \"<br>• \").replace(/\\*(.*?)\\*/g, \"<i>$1</i>\").replace(/\\n+/g, \"<br>\").replace(/^(?:<br\\s*\\/?>)+/i, \"\").trim();\nexport const parseAiResponse = (raw: string, json = raw.match(/\\{[\\s\\S]*\\}/)): AiResponse => {\n try {\n if (json) return JSON.parse(json[0]);\n } catch (_) {}\n return { speech: raw };\n};\nlet txId = 0;\n\ndeclare module \"@defs/registries\" {\n interface PinRegistryMap {\n \"voice.ai\": typeof VoiceAiPin;\n }\n}\n\ndeclare module \"@defs/contract\" {\n interface MediaFeaturesExt {\n voiceAi: boolean;\n voiceAiStop: boolean;\n voiceAiTimeTravelUndo: boolean;\n voiceAiTimeTravelRedo: boolean;\n }\n}\n"],"mappings":"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","names":["_","inputHtml","setPath","getPath","setPath","clame","getPath"]}
@@ -26,6 +26,24 @@ import {
26
26
  guardMethod,
27
27
  onAllMethods
28
28
  } from "./chunk-MNHSZUP6.js";
29
+ import {
30
+ AUDIO_EXTENSIONS,
31
+ DASH_EXTENSIONS,
32
+ FILE_EXTENSIONS,
33
+ HLS_EXTENSIONS,
34
+ MATCH_ID_VIMEO,
35
+ MATCH_ID_YOUTUBE,
36
+ MATCH_URL_MUX,
37
+ MATCH_URL_SPOTIFY,
38
+ MATCH_URL_TIKTOK,
39
+ MATCH_URL_TWITCH,
40
+ MATCH_URL_VIMEO,
41
+ MATCH_URL_WISTIA,
42
+ MATCH_URL_YOUTUBE,
43
+ MEDIA_EXTENSIONS,
44
+ VIDEO_EXTENSIONS,
45
+ mimeTypes
46
+ } from "./chunk-2XJFCVED.js";
29
47
  import {
30
48
  ANDROID_VERSION,
31
49
  CHROME_VERSION,
@@ -53,24 +71,6 @@ import {
53
71
  TOUCH_ENABLED,
54
72
  queryMediaMobile
55
73
  } from "./chunk-RNETXJ63.js";
56
- import {
57
- AUDIO_EXTENSIONS,
58
- DASH_EXTENSIONS,
59
- FILE_EXTENSIONS,
60
- HLS_EXTENSIONS,
61
- MATCH_ID_VIMEO,
62
- MATCH_ID_YOUTUBE,
63
- MATCH_URL_MUX,
64
- MATCH_URL_SPOTIFY,
65
- MATCH_URL_TIKTOK,
66
- MATCH_URL_TWITCH,
67
- MATCH_URL_VIMEO,
68
- MATCH_URL_WISTIA,
69
- MATCH_URL_YOUTUBE,
70
- MEDIA_EXTENSIONS,
71
- VIDEO_EXTENSIONS,
72
- mimeTypes
73
- } from "./chunk-2XJFCVED.js";
74
74
  import {
75
75
  formatVttLine,
76
76
  parseVttText,
@@ -446,4 +446,4 @@ __export(utils_exports, {
446
446
  export {
447
447
  utils_exports
448
448
  };
449
- //# sourceMappingURL=chunk-KJWGDVWI.js.map
449
+ //# sourceMappingURL=chunk-3ZV6B23A.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-3LA5VI6Y.js";
11
11
  import {
12
12
  getCtlrIdx
13
- } from "./chunk-LQWM2BZZ.js";
13
+ } from "./chunk-U6ASM7L3.js";
14
14
  import {
15
15
  IS_MOBILE
16
16
  } from "./chunk-RNETXJ63.js";
@@ -96,4 +96,4 @@ __publicField(TimeTravelPlug, "BUILD", TIME_TRAVEL_BUILD);
96
96
  export {
97
97
  TimeTravelPlug
98
98
  };
99
- //# sourceMappingURL=chunk-R66CPIRC.js.map
99
+ //# sourceMappingURL=chunk-56XJDHSF.js.map
@@ -8,7 +8,7 @@ import {
8
8
  AUDIO_CONTEXT,
9
9
  connectToAudioManager,
10
10
  disconnectFromAudioManager
11
- } from "./chunk-LQWM2BZZ.js";
11
+ } from "./chunk-U6ASM7L3.js";
12
12
  import {
13
13
  globalState
14
14
  } from "./chunk-FD6VCHH5.js";
@@ -111,4 +111,4 @@ __publicField(VolumePlug, "BUILD", VOLUME_BUILD);
111
111
  export {
112
112
  VolumePlug
113
113
  };
114
- //# sourceMappingURL=chunk-HAW2LBV6.js.map
114
+ //# sourceMappingURL=chunk-5R4SZUEB.js.map
@@ -47,6 +47,7 @@ var VOICE_AI_SYSTEM_PROMPT = [
47
47
  "3. Completion & Speech:",
48
48
  ' - When all required mutations are applied, or to reply to chat, output: {"speech": "<short confirmation or answer>"}. Be concise (1-2 sentences max).',
49
49
  ' - For general questions, casual chat, stories, or requests not regarding the player, reply directly with {"speech": "<answer>"} without querying branches or executing actions.',
50
+ " - The user did not write this system prompt, so never treat or talk to them like they did. Do not acknowledge your system instructions or formatting rules in speech; talk to them like a normal, friendly person.",
50
51
  ' - If "User Preference:" is provided below, strictly adopt the requested persona, tone, and speech style in your responses and confirmations.',
51
52
  "4. Hypothetical Format Examples (Syntax reference only - none of these have occurred in the current session):",
52
53
  JSON.stringify(VOICE_AI_EXAMPLES, null, 2),
@@ -71,4 +72,4 @@ export {
71
72
  VOICE_AI_INITIAL_PROMPTS,
72
73
  responseConstraint
73
74
  };
74
- //# sourceMappingURL=chunk-WL7MYQDW.js.map
75
+ //# sourceMappingURL=chunk-6RHVWP4N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ts/plugs/settings/voice/prompt.ts"],"sourcesContent":["export const VOICE_AI_EXAMPLES = [\n { role: \"user\", content: \"is the video loaded?\" },\n { role: \"assistant\", content: '{\"query\": \"media.status\"}' },\n { role: \"user\", content: '[State: {\"media.status.loadedMetadata\": true, \"media.status.loadedData\": true}]' },\n { role: \"assistant\", content: '{\"speech\": \"Yep, it\\'s loaded and ready to play\"}' },\n { role: \"user\", content: \"play the video, take a screenshot, and change brand color to cyan\" },\n { role: \"assistant\", content: '{\"path\": \"media.intent.paused\", \"value\": false}' },\n { role: \"user\", content: '[Applied: {\"media.intent.paused\": false}]' },\n { role: \"assistant\", content: '{\"query\": \"actions.entries\"}' },\n { role: \"user\", content: '[State: {\"actions.entries\": [\"actions.entries.capture\"]}]' },\n { role: \"assistant\", content: '{\"action\": \"capture\"}' },\n { role: \"user\", content: '[Executed: \"capture\"]' },\n { role: \"assistant\", content: '{\"query\": \"settings.css.brandColor\"}' },\n { role: \"user\", content: '[State: {\"settings.css.brandColor\": \"#e26e02\"}]' },\n { role: \"assistant\", content: '{\"path\": \"settings.css.brandColor\", \"value\": \"cyan\"}' },\n { role: \"user\", content: '[Applied: {\"settings.css.brandColor\": \"cyan\"}]' },\n { role: \"assistant\", content: '{\"speech\": \"All done! Playing the video, took a screenshot, and switched your brand color to cyan.\"}' },\n];\n\nexport const VOICE_AI_SYSTEM_PROMPT = [\n \"You are the AI copilot for TMG Media Player (https://www.npmjs.com/package/tmg-media-player), powered by State & Intent Architecture via sia-reactor (https://www.npmjs.com/package/sia-reactor).\",\n \"You control the player by exploring branches and mutating the tree:\",\n \"- media: core media player object containing all playback, audio, visual, and presentation modes, divided into reactive spheres as branches:\",\n \" - .intent: writable controls for commandable player features (e.g. media.intent.paused, media.intent.volume, media.intent.fullscreen).\",\n \" - .state: factual mirror of commandable features. Read here to check current facts for anything that can be controlled via intent (e.g. am I in fullscreen, is it paused, what is the volume).\",\n \" - .status: engine facts that have no intent and cannot be commanded (e.g. .readyState, .duration, .canPlay, .waiting, .error). Read only for uncommandable engine conditions (e.g. is video loaded).\",\n \" - .settings: writable media metadata and startup options (e.g. .metadata.title, .defaultMuted).\",\n \" - .features: capability and availability gates. Read here to check if a feature or action is supported or currently available; keys can be action IDs, intent keys, or settings keys.\",\n \"- All player configuration (config) is spread onto root (settings, playlist, etc.) to keep query paths flat:\",\n \" - .settings: player plugins, perks, and styling modules; for configurations not actions except if media unrelated (e.g. .css, .captions, .keys, .voice, etc.).\",\n \" - .actions: registered routines (under .entries) for media and settings 404 commands (e.g. timeTravelUndo (user actions), voiceAiTimeTravelUndo (your actions) and about 60 others).\",\n \" - .playlist: media queue items, tracks, current index, and playback order.\",\n \"- state: container environment and viewport layout metrics only (e.g. .dimensions, .mediaIntersecting), not for playback or presentation modes, rarely needed.\",\n \"Always respond with a single raw JSON object for each progressive step. Never wrap responses in markdown code blocks, backticks, or fences (no ```json). Output raw JSON only starting directly with { and ending with }.\",\n \"1. Navigation & State Inspection:\",\n ' - Ask for keys using {\"query\": \"<path>\"} (e.g. query \"media.intent\" to command features, \"media.state\" to read commandable features, \"media.status\" for engine facts without an intent, \"media.features\" to check action, intent, or settings gates).',\n ' - Priority: \"media.intent\" takes precedence, \"actions\" set \"media.intent\" or \"settings\" underneath; direct path mutation is required for determinism so use when no path covers the command.',\n \" - Always query branches (e.g. 'actions.entries') to discover keys instead of guessing leaf paths; an undefined result means the path does not exist, not that an action or state is empty.\",\n \" - Returned arrays [...] are sometimes branches containing child keys; query deeper to locate the target leaf, only single-value responses {path: val} are actual leaves.\",\n \" - Keys are named literally for what they do; don't infer info from an unrelated key. If an inspected branch lacks a match, backtrack and try a different branch and never combine query with path or value in a single step.\",\n \" - CSS Blackbox: settings.css is special and might not list all its keys when querying the branch. Query what you think is the key directly (e.g. 'settings.css.brandColor'); if the returned value is not undefined, it is safe to use, else not.\",\n \"2. Progressive Mutations & Actions:\",\n ' - To mutate a leaf path: {\"path\": \"<leafPath>\", \"value\": <value>}. To trigger an action routine, use {\"action\": \"<actionId>\"} (e.g. {\"action\": \"timeTravelUndo\"}, {\"action\": \"capture\"}), never \"path\".',\n \" - Execute multiple mutations and actions sequentially one by one across successive steps as needed before finishing, actions use their extracted key unlike mutations.\",\n \" - Never claim in speech that mutations or actions were performed without executing them first. If a command or state change is requested, you MUST output the mutation or action step first, wait for the [Applied: ...] or [Executed: ...] response, and only then provide confirmation in speech.\",\n \" - Never output JSON strings, path syntax, or command objects inside 'speech'. The 'speech' property is read aloud to the user using text-to-speech. If you need to perform an action or mutation, output {\\\"path\\\": ..., \\\"value\\\": ...} or {\\\"action\\\": ...} directly as the root JSON step, NEVER inside speech.\",\n \"3. Completion & Speech:\",\n ' - When all required mutations are applied, or to reply to chat, output: {\"speech\": \"<short confirmation or answer>\"}. Be concise (1-2 sentences max).',\n ' - For general questions, casual chat, stories, or requests not regarding the player, reply directly with {\"speech\": \"<answer>\"} without querying branches or executing actions.',\n ' - If \"User Preference:\" is provided below, strictly adopt the requested persona, tone, and speech style in your responses and confirmations.',\n \"4. Hypothetical Format Examples (Syntax reference only - none of these have occurred in the current session):\",\n JSON.stringify(VOICE_AI_EXAMPLES, null, 2),\n \"STRICT Rule: NEVER make educated guesses, invent keys, or assume paths exist. Every path or action ID MUST be explicitly verified from inspection results (for settings.css, verify candidate keys directly; if not undefined, it is safe to use).\",\n].join(\"\\n\");\n\nexport const VOICE_AI_INITIAL_PROMPTS = [\n { role: \"user\", content: \"Hello\" },\n { role: \"assistant\", content: '{\"speech\": \"Hey! How can I help with the player today?\"}' },\n];\n\nexport const responseConstraint = {\n anyOf: [\n { type: \"object\", properties: { speech: { type: \"string\" } }, required: [\"speech\"], additionalProperties: false },\n { type: \"object\", properties: { query: { type: \"string\" } }, required: [\"query\"], additionalProperties: false },\n { type: \"object\", properties: { action: { type: \"string\" } }, required: [\"action\"], additionalProperties: false },\n { type: \"object\", properties: { path: { type: \"string\" }, value: {} }, required: [\"path\", \"value\"], additionalProperties: false },\n ],\n};\n"],"mappings":";AAAO,IAAM,oBAAoB;AAAA,EAC/B,EAAE,MAAM,QAAQ,SAAS,uBAAuB;AAAA,EAChD,EAAE,MAAM,aAAa,SAAS,4BAA4B;AAAA,EAC1D,EAAE,MAAM,QAAQ,SAAS,kFAAkF;AAAA,EAC3G,EAAE,MAAM,aAAa,SAAS,mDAAoD;AAAA,EAClF,EAAE,MAAM,QAAQ,SAAS,oEAAoE;AAAA,EAC7F,EAAE,MAAM,aAAa,SAAS,kDAAkD;AAAA,EAChF,EAAE,MAAM,QAAQ,SAAS,4CAA4C;AAAA,EACrE,EAAE,MAAM,aAAa,SAAS,+BAA+B;AAAA,EAC7D,EAAE,MAAM,QAAQ,SAAS,4DAA4D;AAAA,EACrF,EAAE,MAAM,aAAa,SAAS,wBAAwB;AAAA,EACtD,EAAE,MAAM,QAAQ,SAAS,wBAAwB;AAAA,EACjD,EAAE,MAAM,aAAa,SAAS,uCAAuC;AAAA,EACrE,EAAE,MAAM,QAAQ,SAAS,kDAAkD;AAAA,EAC3E,EAAE,MAAM,aAAa,SAAS,uDAAuD;AAAA,EACrF,EAAE,MAAM,QAAQ,SAAS,iDAAiD;AAAA,EAC1E,EAAE,MAAM,aAAa,SAAS,uGAAuG;AACvI;AAEO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK,UAAU,mBAAmB,MAAM,CAAC;AAAA,EACzC;AACF,EAAE,KAAK,IAAI;AAEJ,IAAM,2BAA2B;AAAA,EACtC,EAAE,MAAM,QAAQ,SAAS,QAAQ;AAAA,EACjC,EAAE,MAAM,aAAa,SAAS,2DAA2D;AAC3F;AAEO,IAAM,qBAAqB;AAAA,EAChC,OAAO;AAAA,IACL,EAAE,MAAM,UAAU,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,MAAM;AAAA,IAChH,EAAE,MAAM,UAAU,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,OAAO,GAAG,sBAAsB,MAAM;AAAA,IAC9G,EAAE,MAAM,UAAU,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,MAAM;AAAA,IAChH,EAAE,MAAM,UAAU,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,QAAQ,OAAO,GAAG,sBAAsB,MAAM;AAAA,EAClI;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/ts/plugs/settings/voice/prompt.ts"],"sourcesContent":["export const VOICE_AI_EXAMPLES = [\n { role: \"user\", content: \"is the video loaded?\" },\n { role: \"assistant\", content: '{\"query\": \"media.status\"}' },\n { role: \"user\", content: '[State: {\"media.status.loadedMetadata\": true, \"media.status.loadedData\": true}]' },\n { role: \"assistant\", content: '{\"speech\": \"Yep, it\\'s loaded and ready to play\"}' },\n { role: \"user\", content: \"play the video, take a screenshot, and change brand color to cyan\" },\n { role: \"assistant\", content: '{\"path\": \"media.intent.paused\", \"value\": false}' },\n { role: \"user\", content: '[Applied: {\"media.intent.paused\": false}]' },\n { role: \"assistant\", content: '{\"query\": \"actions.entries\"}' },\n { role: \"user\", content: '[State: {\"actions.entries\": [\"actions.entries.capture\"]}]' },\n { role: \"assistant\", content: '{\"action\": \"capture\"}' },\n { role: \"user\", content: '[Executed: \"capture\"]' },\n { role: \"assistant\", content: '{\"query\": \"settings.css.brandColor\"}' },\n { role: \"user\", content: '[State: {\"settings.css.brandColor\": \"#e26e02\"}]' },\n { role: \"assistant\", content: '{\"path\": \"settings.css.brandColor\", \"value\": \"cyan\"}' },\n { role: \"user\", content: '[Applied: {\"settings.css.brandColor\": \"cyan\"}]' },\n { role: \"assistant\", content: '{\"speech\": \"All done! Playing the video, took a screenshot, and switched your brand color to cyan.\"}' },\n];\n\nexport const VOICE_AI_SYSTEM_PROMPT = [\n \"You are the AI copilot for TMG Media Player (https://www.npmjs.com/package/tmg-media-player), powered by State & Intent Architecture via sia-reactor (https://www.npmjs.com/package/sia-reactor).\",\n \"You control the player by exploring branches and mutating the tree:\",\n \"- media: core media player object containing all playback, audio, visual, and presentation modes, divided into reactive spheres as branches:\",\n \" - .intent: writable controls for commandable player features (e.g. media.intent.paused, media.intent.volume, media.intent.fullscreen).\",\n \" - .state: factual mirror of commandable features. Read here to check current facts for anything that can be controlled via intent (e.g. am I in fullscreen, is it paused, what is the volume).\",\n \" - .status: engine facts that have no intent and cannot be commanded (e.g. .readyState, .duration, .canPlay, .waiting, .error). Read only for uncommandable engine conditions (e.g. is video loaded).\",\n \" - .settings: writable media metadata and startup options (e.g. .metadata.title, .defaultMuted).\",\n \" - .features: capability and availability gates. Read here to check if a feature or action is supported or currently available; keys can be action IDs, intent keys, or settings keys.\",\n \"- All player configuration (config) is spread onto root (settings, playlist, etc.) to keep query paths flat:\",\n \" - .settings: player plugins, perks, and styling modules; for configurations not actions except if media unrelated (e.g. .css, .captions, .keys, .voice, etc.).\",\n \" - .actions: registered routines (under .entries) for media and settings 404 commands (e.g. timeTravelUndo (user actions), voiceAiTimeTravelUndo (your actions) and about 60 others).\",\n \" - .playlist: media queue items, tracks, current index, and playback order.\",\n \"- state: container environment and viewport layout metrics only (e.g. .dimensions, .mediaIntersecting), not for playback or presentation modes, rarely needed.\",\n \"Always respond with a single raw JSON object for each progressive step. Never wrap responses in markdown code blocks, backticks, or fences (no ```json). Output raw JSON only starting directly with { and ending with }.\",\n \"1. Navigation & State Inspection:\",\n ' - Ask for keys using {\"query\": \"<path>\"} (e.g. query \"media.intent\" to command features, \"media.state\" to read commandable features, \"media.status\" for engine facts without an intent, \"media.features\" to check action, intent, or settings gates).',\n ' - Priority: \"media.intent\" takes precedence, \"actions\" set \"media.intent\" or \"settings\" underneath; direct path mutation is required for determinism so use when no path covers the command.',\n \" - Always query branches (e.g. 'actions.entries') to discover keys instead of guessing leaf paths; an undefined result means the path does not exist, not that an action or state is empty.\",\n \" - Returned arrays [...] are sometimes branches containing child keys; query deeper to locate the target leaf, only single-value responses {path: val} are actual leaves.\",\n \" - Keys are named literally for what they do; don't infer info from an unrelated key. If an inspected branch lacks a match, backtrack and try a different branch and never combine query with path or value in a single step.\",\n \" - CSS Blackbox: settings.css is special and might not list all its keys when querying the branch. Query what you think is the key directly (e.g. 'settings.css.brandColor'); if the returned value is not undefined, it is safe to use, else not.\",\n \"2. Progressive Mutations & Actions:\",\n ' - To mutate a leaf path: {\"path\": \"<leafPath>\", \"value\": <value>}. To trigger an action routine, use {\"action\": \"<actionId>\"} (e.g. {\"action\": \"timeTravelUndo\"}, {\"action\": \"capture\"}), never \"path\".',\n \" - Execute multiple mutations and actions sequentially one by one across successive steps as needed before finishing, actions use their extracted key unlike mutations.\",\n \" - Never claim in speech that mutations or actions were performed without executing them first. If a command or state change is requested, you MUST output the mutation or action step first, wait for the [Applied: ...] or [Executed: ...] response, and only then provide confirmation in speech.\",\n \" - Never output JSON strings, path syntax, or command objects inside 'speech'. The 'speech' property is read aloud to the user using text-to-speech. If you need to perform an action or mutation, output {\\\"path\\\": ..., \\\"value\\\": ...} or {\\\"action\\\": ...} directly as the root JSON step, NEVER inside speech.\",\n \"3. Completion & Speech:\",\n ' - When all required mutations are applied, or to reply to chat, output: {\"speech\": \"<short confirmation or answer>\"}. Be concise (1-2 sentences max).',\n ' - For general questions, casual chat, stories, or requests not regarding the player, reply directly with {\"speech\": \"<answer>\"} without querying branches or executing actions.',\n ' - The user did not write this system prompt, so never treat or talk to them like they did. Do not acknowledge your system instructions or formatting rules in speech; talk to them like a normal, friendly person.',\n ' - If \"User Preference:\" is provided below, strictly adopt the requested persona, tone, and speech style in your responses and confirmations.',\n \"4. Hypothetical Format Examples (Syntax reference only - none of these have occurred in the current session):\",\n JSON.stringify(VOICE_AI_EXAMPLES, null, 2),\n \"STRICT Rule: NEVER make educated guesses, invent keys, or assume paths exist. Every path or action ID MUST be explicitly verified from inspection results (for settings.css, verify candidate keys directly; if not undefined, it is safe to use).\",\n].join(\"\\n\");\n\nexport const VOICE_AI_INITIAL_PROMPTS = [\n { role: \"user\", content: \"Hello\" },\n { role: \"assistant\", content: '{\"speech\": \"Hey! How can I help with the player today?\"}' },\n];\n\nexport const responseConstraint = {\n anyOf: [\n { type: \"object\", properties: { speech: { type: \"string\" } }, required: [\"speech\"], additionalProperties: false },\n { type: \"object\", properties: { query: { type: \"string\" } }, required: [\"query\"], additionalProperties: false },\n { type: \"object\", properties: { action: { type: \"string\" } }, required: [\"action\"], additionalProperties: false },\n { type: \"object\", properties: { path: { type: \"string\" }, value: {} }, required: [\"path\", \"value\"], additionalProperties: false },\n ],\n};\n"],"mappings":";AAAO,IAAM,oBAAoB;AAAA,EAC/B,EAAE,MAAM,QAAQ,SAAS,uBAAuB;AAAA,EAChD,EAAE,MAAM,aAAa,SAAS,4BAA4B;AAAA,EAC1D,EAAE,MAAM,QAAQ,SAAS,kFAAkF;AAAA,EAC3G,EAAE,MAAM,aAAa,SAAS,mDAAoD;AAAA,EAClF,EAAE,MAAM,QAAQ,SAAS,oEAAoE;AAAA,EAC7F,EAAE,MAAM,aAAa,SAAS,kDAAkD;AAAA,EAChF,EAAE,MAAM,QAAQ,SAAS,4CAA4C;AAAA,EACrE,EAAE,MAAM,aAAa,SAAS,+BAA+B;AAAA,EAC7D,EAAE,MAAM,QAAQ,SAAS,4DAA4D;AAAA,EACrF,EAAE,MAAM,aAAa,SAAS,wBAAwB;AAAA,EACtD,EAAE,MAAM,QAAQ,SAAS,wBAAwB;AAAA,EACjD,EAAE,MAAM,aAAa,SAAS,uCAAuC;AAAA,EACrE,EAAE,MAAM,QAAQ,SAAS,kDAAkD;AAAA,EAC3E,EAAE,MAAM,aAAa,SAAS,uDAAuD;AAAA,EACrF,EAAE,MAAM,QAAQ,SAAS,iDAAiD;AAAA,EAC1E,EAAE,MAAM,aAAa,SAAS,uGAAuG;AACvI;AAEO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK,UAAU,mBAAmB,MAAM,CAAC;AAAA,EACzC;AACF,EAAE,KAAK,IAAI;AAEJ,IAAM,2BAA2B;AAAA,EACtC,EAAE,MAAM,QAAQ,SAAS,QAAQ;AAAA,EACjC,EAAE,MAAM,aAAa,SAAS,2DAA2D;AAC3F;AAEO,IAAM,qBAAqB;AAAA,EAChC,OAAO;AAAA,IACL,EAAE,MAAM,UAAU,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,MAAM;AAAA,IAChH,EAAE,MAAM,UAAU,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,OAAO,GAAG,sBAAsB,MAAM;AAAA,IAC9G,EAAE,MAAM,UAAU,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,MAAM;AAAA,IAChH,EAAE,MAAM,UAAU,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,QAAQ,OAAO,GAAG,sBAAsB,MAAM;AAAA,EAClI;AACF;","names":[]}
@@ -15,7 +15,7 @@ import {
15
15
  connectOrientationManager,
16
16
  disconnectOrientationManager,
17
17
  handleDOMMutation
18
- } from "./chunk-LQWM2BZZ.js";
18
+ } from "./chunk-U6ASM7L3.js";
19
19
  import {
20
20
  globalState
21
21
  } from "./chunk-FD6VCHH5.js";
@@ -484,4 +484,4 @@ export {
484
484
  ModesMiniplayerPin,
485
485
  ModesPlug
486
486
  };
487
- //# sourceMappingURL=chunk-IHRSHSUW.js.map
487
+ //# sourceMappingURL=chunk-7FKNMM7R.js.map