@xrkseek/harness 0.7.6 → 0.7.8

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 (171) 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 +46 -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 +223 -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 +23 -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 +17 -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 +78 -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 +332 -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 +39 -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 +195 -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-posture.js +1 -1
  102. package/node_modules/@xrkseek/server-face/dist/session-posture.js.map +1 -1
  103. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.d.ts +4 -0
  104. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.d.ts.map +1 -1
  105. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js +16 -0
  106. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js.map +1 -1
  107. package/node_modules/@xrkseek/server-face/dist/session-tools.d.ts.map +1 -1
  108. package/node_modules/@xrkseek/server-face/dist/session-tools.js +2 -0
  109. package/node_modules/@xrkseek/server-face/dist/session-tools.js.map +1 -1
  110. package/node_modules/@xrkseek/server-face/dist/settings-document.d.ts.map +1 -1
  111. package/node_modules/@xrkseek/server-face/dist/settings-document.js +56 -1
  112. package/node_modules/@xrkseek/server-face/dist/settings-document.js.map +1 -1
  113. package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
  114. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +42 -12
  115. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
  116. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts +43 -0
  117. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
  118. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +293 -24
  119. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
  120. package/node_modules/@xrkseek/server-face/dist/wire/paths.d.ts.map +1 -1
  121. package/node_modules/@xrkseek/server-face/dist/wire/paths.js +6 -0
  122. package/node_modules/@xrkseek/server-face/dist/wire/paths.js.map +1 -1
  123. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.d.ts.map +1 -1
  124. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js +4 -1
  125. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js.map +1 -1
  126. package/node_modules/@xrkseek/server-face/package.json +1 -0
  127. package/node_modules/@xrkseek/server-host/dist/a2a-inbound-public.d.ts.map +1 -1
  128. package/node_modules/@xrkseek/server-host/dist/a2a-inbound-public.js +8 -1
  129. package/node_modules/@xrkseek/server-host/dist/a2a-inbound-public.js.map +1 -1
  130. package/node_modules/@xrkseek/server-host/dist/index.d.ts +1 -1
  131. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  132. package/node_modules/@xrkseek/server-host/dist/index.js +44 -45
  133. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  134. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.d.ts.map +1 -1
  135. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js +2 -0
  136. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js.map +1 -1
  137. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.d.ts.map +1 -1
  138. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.js +5 -2
  139. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.js.map +1 -1
  140. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.d.ts +15 -0
  141. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.d.ts.map +1 -1
  142. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.js +61 -3
  143. package/node_modules/@xrkseek/server-http/dist/dsh-compat/our-free-model-host.js.map +1 -1
  144. package/node_modules/sherpa-onnx-node/README.md +11 -0
  145. package/node_modules/sherpa-onnx-node/addon-static-import.js +76 -0
  146. package/node_modules/sherpa-onnx-node/addon.js +98 -0
  147. package/node_modules/sherpa-onnx-node/audio-tagg.js +45 -0
  148. package/node_modules/sherpa-onnx-node/keyword-spotter.js +68 -0
  149. package/node_modules/sherpa-onnx-node/non-streaming-asr.js +158 -0
  150. package/node_modules/sherpa-onnx-node/non-streaming-speaker-diarization.js +38 -0
  151. package/node_modules/sherpa-onnx-node/non-streaming-speech-denoiser.js +32 -0
  152. package/node_modules/sherpa-onnx-node/non-streaming-tts.js +117 -0
  153. package/node_modules/sherpa-onnx-node/online-speech-denoiser.js +46 -0
  154. package/node_modules/sherpa-onnx-node/package.json +68 -0
  155. package/node_modules/sherpa-onnx-node/punctuation.js +43 -0
  156. package/node_modules/sherpa-onnx-node/resampler.js +80 -0
  157. package/node_modules/sherpa-onnx-node/sherpa-onnx.js +49 -0
  158. package/node_modules/sherpa-onnx-node/speaker-identification.js +152 -0
  159. package/node_modules/sherpa-onnx-node/spoken-language-identification.js +38 -0
  160. package/node_modules/sherpa-onnx-node/streaming-asr.js +181 -0
  161. package/node_modules/sherpa-onnx-node/types.js +833 -0
  162. package/node_modules/sherpa-onnx-node/vad.js +134 -0
  163. package/node_modules/sherpa-onnx-win-x64/README.md +3 -0
  164. package/node_modules/sherpa-onnx-win-x64/index.js +1 -0
  165. package/node_modules/sherpa-onnx-win-x64/onnxruntime.dll +0 -0
  166. package/node_modules/sherpa-onnx-win-x64/onnxruntime_providers_shared.dll +0 -0
  167. package/node_modules/sherpa-onnx-win-x64/package.json +65 -0
  168. package/node_modules/sherpa-onnx-win-x64/sherpa-onnx-c-api.dll +0 -0
  169. package/node_modules/sherpa-onnx-win-x64/sherpa-onnx-cxx-api.dll +0 -0
  170. package/node_modules/sherpa-onnx-win-x64/sherpa-onnx.node +0 -0
  171. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAWL,WAAW,EAMZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,qFAAqF;IACrF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAChC;AA2DD,kEAAkE;AAClE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAW7B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoC1B;AAyJD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,GACzB,CACD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,KAChB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAiH9B"}
1
+ {"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKjE,OAAO,EAYL,WAAW,EAMZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,qFAAqF;IACrF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAChC;AAmGD,kEAAkE;AAClE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAW7B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoC1B;AAyKD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,GACzB,CACD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,KAChB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAkI9B"}
@@ -1,5 +1,8 @@
1
1
  import { timingSafeEqual } from "node:crypto";
2
- import { A2A_PROTOCOL_VERSION, ERR_TASK_NOT_CANCELABLE, ERR_TASK_NOT_FOUND, ROLE_AGENT, ROLE_USER, STATE_CANCELED, STATE_COMPLETED, STATE_REJECTED, STATE_WORKING, TERMINAL_STATES, TurnTracker, extractText, maxPingpongTurns, newContextId, newTaskId, persistMessage, } from "./protocol.js";
2
+ import { appendFileSync, mkdirSync } from "node:fs";
3
+ import * as path from "node:path";
4
+ import * as os from "node:os";
5
+ import { A2A_PROTOCOL_VERSION, ERR_TASK_NOT_CANCELABLE, ERR_TASK_NOT_FOUND, ROLE_AGENT, ROLE_USER, STATE_CANCELED, STATE_COMPLETED, STATE_INPUT_REQUIRED, STATE_REJECTED, STATE_WORKING, TERMINAL_STATES, TurnTracker, extractText, maxPingpongTurns, newContextId, newTaskId, persistMessage, } from "./protocol.js";
3
6
  import { TaskStore } from "./task-store.js";
4
7
  /** Hermes-shaped method aliases → canonical handler key. */
5
8
  const METHOD_ALIASES = new Map([
@@ -28,6 +31,44 @@ function readBody(req) {
28
31
  req.on("error", reject);
29
32
  });
30
33
  }
34
+ /** In-memory per-peer sliding-window rate limiter (XRK_A2A_RATE_LIMIT per minute). */
35
+ const rateBuckets = new Map();
36
+ function rateLimitOk(peer, env) {
37
+ const raw = Number(env.XRK_A2A_RATE_LIMIT ?? "");
38
+ if (!Number.isFinite(raw) || raw <= 0)
39
+ return true;
40
+ const now = Date.now();
41
+ const windowMs = 60_000;
42
+ const bucket = (rateBuckets.get(peer) ?? []).filter((t) => now - t < windowMs);
43
+ if (bucket.length >= raw) {
44
+ rateBuckets.set(peer, bucket);
45
+ return false;
46
+ }
47
+ bucket.push(now);
48
+ rateBuckets.set(peer, bucket);
49
+ return true;
50
+ }
51
+ function trustedPeers(env) {
52
+ const raw = env.XRK_A2A_TRUSTED_PEERS?.trim() || env.A2A_TRUSTED_PEERS?.trim();
53
+ if (!raw)
54
+ return [];
55
+ return raw
56
+ .split(",")
57
+ .map((s) => s.trim())
58
+ .filter(Boolean);
59
+ }
60
+ function auditLog(env, entry) {
61
+ const pathOverride = env.XRK_A2A_AUDIT_LOG?.trim();
62
+ const home = env.XRK_HOME?.trim() || process.env.XRK_HOME?.trim() || os.homedir();
63
+ const target = pathOverride || path.join(home, ".xrk", "a2a_audit.jsonl");
64
+ try {
65
+ mkdirSync(path.dirname(target), { recursive: true });
66
+ appendFileSync(target, JSON.stringify(entry) + "\n", "utf8");
67
+ }
68
+ catch {
69
+ // Audit is best-effort; never fail the request.
70
+ }
71
+ }
31
72
  function safeEqualToken(a, b) {
32
73
  const ba = Buffer.from(a);
33
74
  const bb = Buffer.from(b);
@@ -171,8 +212,20 @@ async function handleMessageSend(params, peer, options, tracker, store) {
171
212
  ? `A2A inbound accepted from ${peer}: ${text.slice(0, 400)}`
172
213
  : `A2A inbound accepted from ${peer} (empty message)`;
173
214
  }
215
+ const inputRequired = reply.startsWith("[INPUT_REQUIRED]");
216
+ if (inputRequired) {
217
+ reply = reply.slice("[INPUT_REQUIRED]".length).trim();
218
+ }
174
219
  persistMessage(contextId, ROLE_AGENT, reply, taskId, persistOpts);
175
- store.complete(taskId, STATE_COMPLETED, reply);
220
+ store.complete(taskId, inputRequired ? STATE_INPUT_REQUIRED : STATE_COMPLETED, reply);
221
+ auditLog(env, {
222
+ ts: new Date().toISOString(),
223
+ peer,
224
+ contextId,
225
+ taskId,
226
+ state: inputRequired ? STATE_INPUT_REQUIRED : STATE_COMPLETED,
227
+ replyChars: reply.length,
228
+ });
176
229
  return { task: TaskStore.toTask(store.get(taskId)) };
177
230
  }
178
231
  function handleTasksGet(id, params, store) {
@@ -260,6 +313,23 @@ export function createA2aInboundHandler(options) {
260
313
  sendJson(res, auth.status, auth.error);
261
314
  return true;
262
315
  }
316
+ const trusted = trustedPeers(env);
317
+ if (trusted.length > 0 && !trusted.includes(auth.peer)) {
318
+ sendJson(res, 403, {
319
+ jsonrpc: "2.0",
320
+ error: { code: -32052, message: "untrusted peer" },
321
+ id: null,
322
+ });
323
+ return true;
324
+ }
325
+ if (!rateLimitOk(auth.peer, env)) {
326
+ sendJson(res, 429, {
327
+ jsonrpc: "2.0",
328
+ error: { code: -32051, message: "rate limited" },
329
+ id: null,
330
+ });
331
+ return true;
332
+ }
263
333
  let body;
264
334
  try {
265
335
  body = JSON.parse((await readBody(req)) || "{}");
@@ -1 +1 @@
1
- {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-prompt.d.ts","sourceRoot":"","sources":["../src/subagent-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CActE;AAED,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,qBAAmC,GACxC,MAAM,CA2BR;AAED,2EAA2E;AAC3E,eAAO,MAAM,4BAA4B,QAAqC,CAAC"}
1
+ {"version":3,"file":"subagent-prompt.d.ts","sourceRoot":"","sources":["../src/subagent-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CActE;AAED,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,qBAAmC,GACxC,MAAM,CA6BR;AAED,2EAA2E;AAC3E,eAAO,MAAM,4BAA4B,QAAqC,CAAC"}
@@ -38,6 +38,8 @@ export function subagentRoutingPrompt(mode = "proactive") {
38
38
  " - Need this conversation: `inherit_context: true` (in-process only).",
39
39
  " - Isolated git tree: `worktree: true` (same repo, separate checkout).",
40
40
  " - Child profile: prefer `member_id` from the live `subagent` / `team_list` catalog (turn-start board lists the same roster). `team_save` creates a 干员; `propose_skill` only writes a SKILL.md. Bare `role` is the fallback.",
41
+ "- The child's LLM route defaults to this session's current provider / model / reasoning effort. Pass `provider` / `model` / `reasoning_effort` on `subagent` only when the task needs a different route (bulk work on a cheap model, hard reasoning at `max`).",
42
+ "- A child that ends with `(QUOTA)` did not fail its task — its route ran out. Do not resend there: `set_agent_model` (or `model` / `reasoning_effort` on `followup_task`) moves it onto a route that still works, then follow up. `(RATE_LIMIT)` is temporary — wait and resend on the same route. `list_models` shows routable pairs, efforts and live slot use.",
41
43
  "- After you have handed work to a child: if this turn has nothing else useful to do, end the turn and let the child's result arrive as that steer notice. Keep working in this turn when you still have independent steps. Call `wait_agent` when the next step in this turn needs the child's answer (foreground spawn is usually clearer for that case).",
42
44
  "- Parent↔child and peer follow-ups use `delivery=steer` by default (插队 at the next tool-step boundary). `delivery=queue` waits until the child is idle.",
43
45
  "- Match the live catalog by name and brief when this session has subagent tools. If a member fits, `subagent` with that `member_id` this turn. Do not Skill-load a standing skill that covers the same job. Frugal has no subagent tools — Skill-load here. Tiny asks with no catalog match stay with you. `presence_set` may run in parallel.",
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-prompt.js","sourceRoot":"","sources":["../src/subagent-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA2B;IAC5D,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,4BAA4B;YAC5B,0FAA0F;YAC1F,+FAA+F;YAC/F,0DAA0D;SAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO;QACL,wBAAwB;QACxB,uIAAuI;QACvI,sFAAsF;KACvF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAA8B,WAAW;IAEzC,OAAO;QACL,YAAY;QACZ,uXAAuX;QACvX,iGAAiG;QACjG,iMAAiM;QACjM,+KAA+K;QAC/K,qNAAqN;QACrN,kJAAkJ;QAClJ,2UAA2U;QAC3U,yBAAyB;QACzB,+SAA+S;QAC/S,4LAA4L;QAC5L,wEAAwE;QACxE,yEAAyE;QACzE,+NAA+N;QAC/N,4VAA4V;QAC5V,yJAAyJ;QACzJ,gVAAgV;QAChV,uJAAuJ;QACvJ,uLAAuL;QACvL,+FAA+F;QAC/F,kSAAkS;QAClS,qNAAqN;QACrN,wOAAwO;QACxO,kBAAkB,CAAC,IAAI,CAAC;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"subagent-prompt.js","sourceRoot":"","sources":["../src/subagent-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA2B;IAC5D,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,4BAA4B;YAC5B,0FAA0F;YAC1F,+FAA+F;YAC/F,0DAA0D;SAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO;QACL,wBAAwB;QACxB,uIAAuI;QACvI,sFAAsF;KACvF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAA8B,WAAW;IAEzC,OAAO;QACL,YAAY;QACZ,uXAAuX;QACvX,iGAAiG;QACjG,iMAAiM;QACjM,+KAA+K;QAC/K,qNAAqN;QACrN,kJAAkJ;QAClJ,2UAA2U;QAC3U,yBAAyB;QACzB,+SAA+S;QAC/S,4LAA4L;QAC5L,wEAAwE;QACxE,yEAAyE;QACzE,+NAA+N;QAC/N,gQAAgQ;QAChQ,mWAAmW;QACnW,4VAA4V;QAC5V,yJAAyJ;QACzJ,gVAAgV;QAChV,uJAAuJ;QACvJ,uLAAuL;QACvL,+FAA+F;QAC/F,kSAAkS;QAClS,qNAAqN;QACrN,wOAAwO;QACxO,kBAAkB,CAAC,IAAI,CAAC;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC"}
@@ -3,12 +3,13 @@
3
3
  Voice Host seam: TTS · dictation (STT) · realtime voice session broker.
4
4
 
5
5
  - **Definition**: `VoiceService` (`synthesize` · `transcribe` · `createLiveSession` · `liveStatus`)
6
- - **Provider**: `createMemoryVoiceProvider` · `createOpenAiVoiceProvider` · `createSenseVoiceLocalProvider` · Host-injected
6
+ - **Provider**: `createMemoryVoiceProvider` · `createOpenAiVoiceProvider` · `createSenseVoiceLocalProvider` · `createSystemVoiceProvider` · Host-injected
7
+ - **Registry**: `createVoiceAccess({ direction, engine, … })` — one row per engine in `engines.ts`; adding a Provider does not touch the Host mount, the Face handler or the cards.
7
8
  - **Consumer**: `createVoiceTools` → `text_to_speech` · `voice_transcribe` · `voice_session`
8
9
 
9
- Mic/speaker and WebRTC stay on the client. Tools stay registered when no Provider is configured; execute fails honestly (`describeVoiceAccess` / `voiceUnavailableMessage` share the same copy with Settings and `xrkh doctor`).
10
+ Mic/speaker and WebRTC stay on the client. Tools are bound by the switch that owns them (`asr.enabled` → transcription + live session, `tts.enabled` → `text_to_speech`); when a switch is on without a usable credential the tool stays bound and execute fails honestly (`describeVoiceAccess` / `voiceUnavailableMessage` share the same copy with Settings and `xrkh doctor`).
10
11
 
11
- Product path: Settings → Plugins → Voice (`mode` off/openai + Credentials key). Env: `XRK_VOICE=memory` | `XRK_VOICE=1` + `OPENAI_API_KEY` / `XRK_VOICE_OPENAI_KEY`. Wake word is not shipped.
12
+ Product path: Settings → Plugins → **ASR** (`engine: local` SenseVoice / `openai`) and **TTS** (`engine: local` OS voices / `openai`), sharing Credentials `XRK_VOICE_OPENAI_KEY`. Env: `XRK_VOICE=memory` | `local` | `system` | `1` + `OPENAI_API_KEY` / `XRK_VOICE_OPENAI_KEY`. Wake word is not shipped.
12
13
 
13
14
  ## Browser mic transport
14
15
 
@@ -13,6 +13,7 @@ import { type VoiceSessionHandle } from "./session.js";
13
13
  import type { BrowserVoiceDeps, VoiceSessionBroker } from "./types.js";
14
14
  export { dictateOnce, pickRecorderMime, startDictation, RECORDER_MIME_CANDIDATES, type DictateOnceOptions, type DictationRecorder, type DictationResult, type StartDictationOptions, } from "./dictation.js";
15
15
  export { encodeBase64, micCapabilities, releaseStream } from "./env.js";
16
+ export { dictationAvailable, encodeWav, MAX_RECORDING_MS, startVoiceCapture, toBase64, toPcm16, type CapturedClip, type VoiceCapture, } from "./wav-capture.js";
16
17
  export { startVoiceSession, type StartVoiceSessionOptions, type VoiceSessionHandle, } from "./session.js";
17
18
  export type { BrowserVoiceDeps, GetUserMedia, MicConstraints, VoiceAudioTrack, VoiceBlob, VoiceMediaRecorder, VoiceMediaRecorderCtor, VoiceMediaStream, VoicePeerConnection, VoicePeerConnectionCtor, VoiceRecorderEvent, VoiceSessionBroker, VoiceSessionBrokerRequest, VoiceSessionBrokerResult, VoiceSessionDescription, } from "./types.js";
18
19
  export interface BrowserVoiceCapabilities {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,YAAY,IAAI,wBAAwB,CAAC;IACzC,wEAAwE;IACxE,OAAO,CACL,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,eAAe,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,yEAAyE;IACzE,aAAa,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3E,4DAA4D;IAC5D,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC/D;AAED,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,gBAAqB,GAC1B,qBAAqB,CA0BvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,YAAY,IAAI,wBAAwB,CAAC;IACzC,wEAAwE;IACxE,OAAO,CACL,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,eAAe,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,yEAAyE;IACzE,aAAa,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3E,4DAA4D;IAC5D,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC/D;AAED,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,gBAAqB,GAC1B,qBAAqB,CA0BvB"}
@@ -13,6 +13,7 @@ import { micCapabilities } from "./env.js";
13
13
  import { startVoiceSession, } from "./session.js";
14
14
  export { dictateOnce, pickRecorderMime, startDictation, RECORDER_MIME_CANDIDATES, } from "./dictation.js";
15
15
  export { encodeBase64, micCapabilities, releaseStream } from "./env.js";
16
+ export { dictationAvailable, encodeWav, MAX_RECORDING_MS, startVoiceCapture, toBase64, toPcm16, } from "./wav-capture.js";
16
17
  export { startVoiceSession, } from "./session.js";
17
18
  export function createBrowserVoiceTransport(deps = {}) {
18
19
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,WAAW,EACX,cAAc,GAKf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,iBAAiB,GAGlB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,wBAAwB,GAKzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EACL,iBAAiB,GAGlB,MAAM,cAAc,CAAC;AAuDtB,MAAM,UAAU,2BAA2B,CACzC,OAAyB,EAAE;IAE3B,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QACzC,OAAO,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE;YACxB,MAAM,IAAI,GAAuB;gBAC/B,IAAI;gBACJ,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzE,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS;oBACnC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;oBACtC,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;oBACrC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;oBAC1C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YACF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,aAAa,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;QACrE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,KAAK,GAA6B;gBACtC,GAAG,OAAO;gBACV,IAAI;aACL,CAAC;YACF,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,WAAW,EACX,cAAc,GAKf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,iBAAiB,GAGlB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,wBAAwB,GAKzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,OAAO,GAGR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,GAGlB,MAAM,cAAc,CAAC;AAuDtB,MAAM,UAAU,2BAA2B,CACzC,OAAyB,EAAE;IAE3B,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QACzC,OAAO,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE;YACxB,MAAM,IAAI,GAAuB;gBAC/B,IAAI;gBACJ,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzE,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS;oBACnC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;oBACtC,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;oBACrC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;oBAC1C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YACF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,aAAa,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;QACrE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,KAAK,GAA6B;gBACtC,GAAG,OAAO;gBACV,IAAI;aACL,CAAC;YACF,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * WAV dictation capture — record in the browser, hand the Host one clip.
3
+ *
4
+ * Both Host STT deliveries we target — an OpenAI-compatible
5
+ * `/audio/transcriptions` and a local sherpa SenseVoice build — take 16 kHz
6
+ * mono PCM WAV, so the clip is decoded and resampled here instead of shipping
7
+ * whatever container the recorder happened to produce: one capture format,
8
+ * two backends, no ffmpeg on either side. (DSH's composer does the same; see
9
+ * `.tmp/dsh-asr-tts-audit.md`.)
10
+ *
11
+ * Capture is a plain `MediaRecorder`: no worklet to load, it works on every
12
+ * browser the composer already supports, and {@link MAX_RECORDING_MS} bounds a
13
+ * stuck press so a forgotten stop cannot grow into an unbounded upload.
14
+ *
15
+ * `packages/exec/voice` compiles WITHOUT `lib.dom` on purpose (its Node entry
16
+ * must never reach for a browser global), so the handful of members this
17
+ * module touches are declared locally in {@link WavDom}. The encoding half —
18
+ * {@link toPcm16} / {@link encodeWav} / {@link toBase64} — is pure and takes
19
+ * no DOM at all.
20
+ */
21
+ /** Bounded take; the recorder stops itself and transcribes what it has. */
22
+ export declare const MAX_RECORDING_MS = 120000;
23
+ /** One finished dictation take. */
24
+ export interface CapturedClip {
25
+ /** Base64 PCM WAV, no `data:` prefix. */
26
+ readonly audio: string;
27
+ readonly mimeType: "audio/wav";
28
+ readonly filename: string;
29
+ /** Wall-clock length of the decoded take (diagnostics / empty checks). */
30
+ readonly durationMs: number;
31
+ }
32
+ /** A live take: exactly one of {@link stop} / {@link cancel} settles it. */
33
+ export interface VoiceCapture {
34
+ /** Stop the recorder, release the microphone, and resolve the encoded clip. */
35
+ stop(): Promise<CapturedClip>;
36
+ /** Stop and discard without decoding (Escape / unmount). */
37
+ cancel(): void;
38
+ }
39
+ /** One `audioinput` entry from `enumerateDevices`. */
40
+ interface InputDevice {
41
+ readonly kind: string;
42
+ readonly deviceId: string;
43
+ readonly label: string;
44
+ }
45
+ /**
46
+ * Whether this browser should show a dictation seat at all.
47
+ *
48
+ * Two independent reasons to stay quiet, both decided at render time:
49
+ *
50
+ * - **No capture API**. `navigator.mediaDevices.getUserMedia` exists only in a
51
+ * secure context, so a phone reaching the Host over plain `http://<lan-ip>`
52
+ * would render a button whose every press fails. Deciding this at render
53
+ * time is why the seat never appears on that device.
54
+ * - **Touch-only device**. Phones and tablets are where the transcript cost is
55
+ * highest and where this path has not been exercised; the seat stays off
56
+ * there until that case is designed for, rather than shipped half-tested.
57
+ *
58
+ * Deliberately not memoised: `matchMedia` is a synchronous property read, and
59
+ * a module-level cache would leak one test's environment into the next.
60
+ */
61
+ export declare function dictationAvailable(): boolean;
62
+ /**
63
+ * Pick a concrete physical input, falling back to the system default.
64
+ *
65
+ * `enumerateDevices` only exposes labels after the page holds a capture
66
+ * permission, so the caller must have opened (and closed) one stream first.
67
+ * The `default` / `communications` aliases are skipped because they resolve
68
+ * back to whatever the OS — not this picker — considers default.
69
+ * @param devices - Every media device the page can see.
70
+ * @returns Device id to pin, or undefined to keep the OS default.
71
+ */
72
+ export declare function pickPhysicalInput(devices: readonly InputDevice[]): string | undefined;
73
+ /** Begin a take; resolves once the microphone is actually open. */
74
+ export declare function startVoiceCapture(): Promise<VoiceCapture>;
75
+ /** Float samples → signed 16-bit PCM (clamped, never wrapping). */
76
+ export declare function toPcm16(samples: Float32Array): Int16Array;
77
+ /**
78
+ * Whether every sample is zero.
79
+ *
80
+ * A take can be seconds long and still carry nothing: the recorder opened, the
81
+ * driver answered, and the processing chain emitted zeros. @see startVoiceCapture.
82
+ * @param pcm - Decoded clip.
83
+ * @returns True when no sample carries any amplitude.
84
+ */
85
+ export declare function isSilent(pcm: Int16Array): boolean;
86
+ /** Canonical 44-byte RIFF header + PCM body at {@link TARGET_SAMPLE_RATE}. */
87
+ export declare function encodeWav(pcm: Int16Array): Uint8Array;
88
+ /** `btoa` over a typed array in chunks (spreading 100k+ args overflows). */
89
+ export declare function toBase64(bytes: Uint8Array): string;
90
+ export {};
91
+ //# sourceMappingURL=wav-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wav-capture.d.ts","sourceRoot":"","sources":["../../src/browser/wav-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,SAAU,CAAA;AAKvC,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;IAC7B,4DAA4D;IAC5D,MAAM,IAAI,IAAI,CAAA;CACf;AA4DD,sDAAsD;AACtD,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAU5C;AAaD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,MAAM,GAAG,SAAS,CAUpB;AAED,mEAAmE;AACnE,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,CAAC,CA8E/D;AA2CD,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CAQzD;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAKjD;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAqBrD;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAOlD"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * WAV dictation capture — record in the browser, hand the Host one clip.
3
+ *
4
+ * Both Host STT deliveries we target — an OpenAI-compatible
5
+ * `/audio/transcriptions` and a local sherpa SenseVoice build — take 16 kHz
6
+ * mono PCM WAV, so the clip is decoded and resampled here instead of shipping
7
+ * whatever container the recorder happened to produce: one capture format,
8
+ * two backends, no ffmpeg on either side. (DSH's composer does the same; see
9
+ * `.tmp/dsh-asr-tts-audit.md`.)
10
+ *
11
+ * Capture is a plain `MediaRecorder`: no worklet to load, it works on every
12
+ * browser the composer already supports, and {@link MAX_RECORDING_MS} bounds a
13
+ * stuck press so a forgotten stop cannot grow into an unbounded upload.
14
+ *
15
+ * `packages/exec/voice` compiles WITHOUT `lib.dom` on purpose (its Node entry
16
+ * must never reach for a browser global), so the handful of members this
17
+ * module touches are declared locally in {@link WavDom}. The encoding half —
18
+ * {@link toPcm16} / {@link encodeWav} / {@link toBase64} — is pure and takes
19
+ * no DOM at all.
20
+ */
21
+ /** Bounded take; the recorder stops itself and transcribes what it has. */
22
+ export const MAX_RECORDING_MS = 120_000;
23
+ /** Rate every target backend accepts. */
24
+ const TARGET_SAMPLE_RATE = 16_000;
25
+ function dom() {
26
+ return globalThis;
27
+ }
28
+ /**
29
+ * Whether this browser should show a dictation seat at all.
30
+ *
31
+ * Two independent reasons to stay quiet, both decided at render time:
32
+ *
33
+ * - **No capture API**. `navigator.mediaDevices.getUserMedia` exists only in a
34
+ * secure context, so a phone reaching the Host over plain `http://<lan-ip>`
35
+ * would render a button whose every press fails. Deciding this at render
36
+ * time is why the seat never appears on that device.
37
+ * - **Touch-only device**. Phones and tablets are where the transcript cost is
38
+ * highest and where this path has not been exercised; the seat stays off
39
+ * there until that case is designed for, rather than shipped half-tested.
40
+ *
41
+ * Deliberately not memoised: `matchMedia` is a synchronous property read, and
42
+ * a module-level cache would leak one test's environment into the next.
43
+ */
44
+ export function dictationAvailable() {
45
+ const env = dom();
46
+ if (typeof env.navigator?.mediaDevices?.getUserMedia !== "function")
47
+ return false;
48
+ if (typeof env.matchMedia === "function") {
49
+ const coarse = env.matchMedia("(pointer: coarse)").matches;
50
+ const fine = env.matchMedia("(pointer: fine)").matches;
51
+ // A touchscreen laptop reports both; only a touch-*only* device is blocked.
52
+ if (coarse && !fine)
53
+ return false;
54
+ }
55
+ return true;
56
+ }
57
+ /**
58
+ * Labels of inputs that are virtual or aggregate and therefore carry silence.
59
+ *
60
+ * A machine with the Steam client, an NVIDIA HDMI path, or a VB-Audio cable
61
+ * exposes several `audioinput` entries that open successfully and record zeros
62
+ * — indistinguishable from a broken recogniser once the clip reaches the Host.
63
+ * Measured here: the browser picked such an input while the OS default (a real
64
+ * USB microphone) was fine, so every take arrived silent.
65
+ */
66
+ const VIRTUAL_INPUT = /steam|virtual|vb-audio|voicemeeter|obs|sound ?mapper|stereo ?mix|立体声混音|回放|wave out/i;
67
+ /**
68
+ * Pick a concrete physical input, falling back to the system default.
69
+ *
70
+ * `enumerateDevices` only exposes labels after the page holds a capture
71
+ * permission, so the caller must have opened (and closed) one stream first.
72
+ * The `default` / `communications` aliases are skipped because they resolve
73
+ * back to whatever the OS — not this picker — considers default.
74
+ * @param devices - Every media device the page can see.
75
+ * @returns Device id to pin, or undefined to keep the OS default.
76
+ */
77
+ export function pickPhysicalInput(devices) {
78
+ const inputs = devices.filter((device) => device.kind === "audioinput");
79
+ const physical = inputs.filter((device) => device.deviceId !== "default" &&
80
+ device.deviceId !== "communications" &&
81
+ device.label !== "" &&
82
+ !VIRTUAL_INPUT.test(device.label));
83
+ return physical[0]?.deviceId;
84
+ }
85
+ /** Begin a take; resolves once the microphone is actually open. */
86
+ export async function startVoiceCapture() {
87
+ const env = dom();
88
+ const media = env.navigator?.mediaDevices;
89
+ if (media === undefined || typeof media.getUserMedia !== "function") {
90
+ throw new Error("this browser cannot record audio (no navigator.mediaDevices)");
91
+ }
92
+ if (typeof env.MediaRecorder !== "function") {
93
+ throw new Error("this browser cannot record audio (no MediaRecorder)");
94
+ }
95
+ // Open the OS default first.
96
+ //
97
+ // Two separate reasons the default must not be trusted blindly:
98
+ // - labels only appear once the page holds a capture permission, so the
99
+ // picker below needs a live stream to look at;
100
+ // - a machine running Steam / NVIDIA / VB-Audio exposes virtual inputs
101
+ // that open successfully and record pure zeros. Measured here: the
102
+ // browser picked such an input while the OS default (a real USB mic)
103
+ // worked, and all seven takes arrived silent.
104
+ // Forcing `echoCancellation` / `noiseSuppression` / `autoGainControl` is a
105
+ // third way to be handed silence by a driver, so none of them is requested.
106
+ const probe = await media.getUserMedia({ audio: true });
107
+ const currentLabel = probe.getAudioTracks?.()[0]?.label ?? "";
108
+ let pin;
109
+ if (currentLabel === "" || VIRTUAL_INPUT.test(currentLabel)) {
110
+ try {
111
+ pin = pickPhysicalInput((await media.enumerateDevices?.()) ?? []);
112
+ }
113
+ catch {
114
+ pin = undefined;
115
+ }
116
+ }
117
+ let stream = probe;
118
+ if (pin !== undefined) {
119
+ for (const track of probe.getTracks())
120
+ track.stop();
121
+ stream = await media.getUserMedia({ audio: { deviceId: { exact: pin } } });
122
+ }
123
+ const recorder = new env.MediaRecorder(stream);
124
+ const chunks = [];
125
+ let settled = false;
126
+ recorder.addEventListener("dataavailable", (event) => {
127
+ if (event.data.size > 0)
128
+ chunks.push(event.data);
129
+ });
130
+ const stopped = new Promise((resolve) => {
131
+ recorder.addEventListener("stop", () => {
132
+ resolve();
133
+ });
134
+ });
135
+ const release = () => {
136
+ for (const track of stream.getTracks())
137
+ track.stop();
138
+ };
139
+ recorder.start();
140
+ const timer = env.setTimeout(() => {
141
+ if (recorder.state === "recording")
142
+ recorder.stop();
143
+ }, MAX_RECORDING_MS);
144
+ const halt = () => {
145
+ env.clearTimeout(timer);
146
+ if (recorder.state !== "inactive")
147
+ recorder.stop();
148
+ };
149
+ return {
150
+ async stop() {
151
+ if (settled)
152
+ throw new Error("voice capture already settled");
153
+ settled = true;
154
+ halt();
155
+ await stopped;
156
+ release();
157
+ const blob = new Blob(chunks, {
158
+ type: recorder.mimeType === "" ? "audio/webm" : recorder.mimeType,
159
+ });
160
+ return await encodeClip(blob);
161
+ },
162
+ cancel() {
163
+ if (settled)
164
+ return;
165
+ settled = true;
166
+ halt();
167
+ release();
168
+ },
169
+ };
170
+ }
171
+ /** Decode the recorded container and re-encode it as one 16 kHz mono WAV. */
172
+ async function encodeClip(blob) {
173
+ const env = dom();
174
+ const raw = new Uint8Array(await blob.arrayBuffer());
175
+ const Ctor = env.AudioContext ?? env.webkitAudioContext;
176
+ if (Ctor === undefined) {
177
+ throw new Error("this browser cannot decode recorded audio (no AudioContext)");
178
+ }
179
+ const decoder = new Ctor();
180
+ let decoded;
181
+ try {
182
+ // decodeAudioData detaches the buffer it is handed, so pass a copy.
183
+ decoded = await decoder.decodeAudioData(raw.slice().buffer);
184
+ }
185
+ finally {
186
+ void decoder.close().catch(() => undefined);
187
+ }
188
+ const frames = Math.max(1, Math.ceil(decoded.duration * TARGET_SAMPLE_RATE));
189
+ const resampler = new env.OfflineAudioContext(1, frames, TARGET_SAMPLE_RATE);
190
+ const source = resampler.createBufferSource();
191
+ source.buffer = decoded;
192
+ source.connect(resampler.destination);
193
+ source.start();
194
+ // A mono destination downmixes a stereo take; the rate change is the point.
195
+ const rendered = await resampler.startRendering();
196
+ const pcm = toPcm16(rendered.getChannelData(0));
197
+ // A silent take must not travel: the model would answer with a stray
198
+ // character, which reads as broken recognition rather than a dead capture.
199
+ if (isSilent(pcm)) {
200
+ throw new Error("no sound was captured — check the system microphone (muted, wrong input device, or held by another app)");
201
+ }
202
+ const wav = encodeWav(pcm);
203
+ return {
204
+ audio: toBase64(wav),
205
+ mimeType: "audio/wav",
206
+ filename: "dictation.wav",
207
+ durationMs: Math.round(decoded.duration * 1000),
208
+ };
209
+ }
210
+ /** Float samples → signed 16-bit PCM (clamped, never wrapping). */
211
+ export function toPcm16(samples) {
212
+ const pcm = new Int16Array(samples.length);
213
+ for (let i = 0; i < samples.length; i += 1) {
214
+ const sample = samples[i] ?? 0;
215
+ const clamped = Math.max(-1, Math.min(1, sample));
216
+ pcm[i] = clamped < 0 ? clamped * 0x8000 : clamped * 0x7fff;
217
+ }
218
+ return pcm;
219
+ }
220
+ /**
221
+ * Whether every sample is zero.
222
+ *
223
+ * A take can be seconds long and still carry nothing: the recorder opened, the
224
+ * driver answered, and the processing chain emitted zeros. @see startVoiceCapture.
225
+ * @param pcm - Decoded clip.
226
+ * @returns True when no sample carries any amplitude.
227
+ */
228
+ export function isSilent(pcm) {
229
+ for (let i = 0; i < pcm.length; i += 1) {
230
+ if (pcm[i] !== 0)
231
+ return false;
232
+ }
233
+ return true;
234
+ }
235
+ /** Canonical 44-byte RIFF header + PCM body at {@link TARGET_SAMPLE_RATE}. */
236
+ export function encodeWav(pcm) {
237
+ const bytes = new Uint8Array(44 + pcm.length * 2);
238
+ const view = new DataView(bytes.buffer);
239
+ const ascii = (offset, text) => {
240
+ for (let i = 0; i < text.length; i += 1)
241
+ view.setUint8(offset + i, text.charCodeAt(i));
242
+ };
243
+ ascii(0, "RIFF");
244
+ view.setUint32(4, 36 + pcm.length * 2, true);
245
+ ascii(8, "WAVE");
246
+ ascii(12, "fmt ");
247
+ view.setUint32(16, 16, true); // fmt chunk size
248
+ view.setUint16(20, 1, true); // PCM
249
+ view.setUint16(22, 1, true); // mono
250
+ view.setUint32(24, TARGET_SAMPLE_RATE, true);
251
+ view.setUint32(28, TARGET_SAMPLE_RATE * 2, true); // byte rate
252
+ view.setUint16(32, 2, true); // block align
253
+ view.setUint16(34, 16, true); // bits per sample
254
+ ascii(36, "data");
255
+ view.setUint32(40, pcm.length * 2, true);
256
+ for (let i = 0; i < pcm.length; i += 1)
257
+ view.setInt16(44 + i * 2, pcm[i] ?? 0, true);
258
+ return bytes;
259
+ }
260
+ /** `btoa` over a typed array in chunks (spreading 100k+ args overflows). */
261
+ export function toBase64(bytes) {
262
+ const chunk = 0x8000;
263
+ let binary = "";
264
+ for (let offset = 0; offset < bytes.length; offset += chunk) {
265
+ binary += String.fromCharCode(...bytes.subarray(offset, offset + chunk));
266
+ }
267
+ return btoa(binary);
268
+ }
269
+ //# sourceMappingURL=wav-capture.js.map