@oh-my-pi/pi-coding-agent 15.12.4 → 15.13.0

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 (291) hide show
  1. package/CHANGELOG.md +304 -6
  2. package/dist/cli.js +1015 -881
  3. package/dist/types/async/job-manager.d.ts +15 -0
  4. package/dist/types/autolearn/controller.d.ts +25 -0
  5. package/dist/types/autolearn/managed-skills.d.ts +45 -0
  6. package/dist/types/autoresearch/state.d.ts +1 -1
  7. package/dist/types/autoresearch/types.d.ts +1 -1
  8. package/dist/types/cli/args.d.ts +19 -1
  9. package/dist/types/cli/session-picker.d.ts +1 -1
  10. package/dist/types/cli/setup-cli.d.ts +1 -1
  11. package/dist/types/cli/setup-model-picker.d.ts +14 -0
  12. package/dist/types/collab/protocol.d.ts +1 -1
  13. package/dist/types/commands/say.d.ts +24 -0
  14. package/dist/types/config/keybindings.d.ts +3 -3
  15. package/dist/types/config/model-registry.d.ts +10 -0
  16. package/dist/types/config/models-config-schema.d.ts +12 -0
  17. package/dist/types/config/models-config.d.ts +8 -2
  18. package/dist/types/config/settings-schema.d.ts +261 -58
  19. package/dist/types/export/html/index.d.ts +2 -1
  20. package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
  21. package/dist/types/extensibility/extensions/runner.d.ts +3 -1
  22. package/dist/types/extensibility/extensions/types.d.ts +47 -1
  23. package/dist/types/extensibility/hooks/index.d.ts +2 -1
  24. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +9 -0
  25. package/dist/types/extensibility/plugins/loader.d.ts +11 -0
  26. package/dist/types/extensibility/shared-events.d.ts +1 -1
  27. package/dist/types/extensibility/skills.d.ts +10 -0
  28. package/dist/types/goals/guided-setup.d.ts +18 -0
  29. package/dist/types/goals/state.d.ts +1 -1
  30. package/dist/types/hindsight/transcript.d.ts +1 -1
  31. package/dist/types/index.d.ts +5 -0
  32. package/dist/types/internal-urls/local-protocol.d.ts +4 -2
  33. package/dist/types/main.d.ts +4 -3
  34. package/dist/types/mcp/startup-events.d.ts +11 -0
  35. package/dist/types/memories/index.d.ts +7 -0
  36. package/dist/types/memory-backend/local-backend.d.ts +4 -3
  37. package/dist/types/mnemopi/config.d.ts +4 -4
  38. package/dist/types/modes/components/agent-hub.d.ts +6 -0
  39. package/dist/types/modes/components/assistant-message.d.ts +1 -2
  40. package/dist/types/modes/components/compaction-summary-message.d.ts +15 -1
  41. package/dist/types/modes/components/custom-editor.d.ts +39 -1
  42. package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
  43. package/dist/types/modes/components/session-selector.d.ts +1 -1
  44. package/dist/types/modes/components/tool-execution.d.ts +26 -16
  45. package/dist/types/modes/components/transcript-container.d.ts +23 -2
  46. package/dist/types/modes/components/tree-selector.d.ts +1 -1
  47. package/dist/types/modes/components/usage-row.d.ts +3 -0
  48. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  49. package/dist/types/modes/controllers/input-controller.d.ts +14 -0
  50. package/dist/types/modes/controllers/selector-controller.d.ts +3 -1
  51. package/dist/types/modes/gradient-highlight.d.ts +9 -4
  52. package/dist/types/modes/image-references.d.ts +6 -0
  53. package/dist/types/modes/interactive-mode.d.ts +27 -3
  54. package/dist/types/modes/magic-keywords.d.ts +13 -1
  55. package/dist/types/modes/rpc/rpc-mode.d.ts +35 -1
  56. package/dist/types/modes/rpc/rpc-types.d.ts +9 -1
  57. package/dist/types/modes/runtime-init.d.ts +4 -0
  58. package/dist/types/modes/theme/theme.d.ts +13 -2
  59. package/dist/types/modes/types.d.ts +8 -2
  60. package/dist/types/modes/utils/ui-helpers.d.ts +1 -1
  61. package/dist/types/registry/agent-registry.d.ts +17 -0
  62. package/dist/types/secrets/obfuscator.d.ts +1 -1
  63. package/dist/types/session/agent-session.d.ts +14 -2
  64. package/dist/types/session/indexed-session-storage.d.ts +3 -4
  65. package/dist/types/session/session-context.d.ts +39 -0
  66. package/dist/types/session/session-entries.d.ts +159 -0
  67. package/dist/types/session/session-listing.d.ts +69 -0
  68. package/dist/types/session/session-loader.d.ts +16 -0
  69. package/dist/types/session/session-manager.d.ts +82 -474
  70. package/dist/types/session/session-migrations.d.ts +12 -0
  71. package/dist/types/session/session-paths.d.ts +25 -0
  72. package/dist/types/session/session-persistence.d.ts +8 -0
  73. package/dist/types/session/session-storage.d.ts +11 -12
  74. package/dist/types/session/snapcompact-inline.d.ts +12 -1
  75. package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
  76. package/dist/types/session/tool-choice-queue.d.ts +6 -6
  77. package/dist/types/stt/asr-client.d.ts +90 -0
  78. package/dist/types/stt/asr-protocol.d.ts +97 -0
  79. package/dist/types/stt/asr-worker.d.ts +2 -0
  80. package/dist/types/stt/downloader.d.ts +38 -0
  81. package/dist/types/stt/endpointer.d.ts +59 -0
  82. package/dist/types/stt/index.d.ts +5 -1
  83. package/dist/types/stt/models.d.ts +120 -0
  84. package/dist/types/stt/recorder.d.ts +17 -0
  85. package/dist/types/stt/stt-controller.d.ts +6 -0
  86. package/dist/types/stt/transcriber.d.ts +5 -7
  87. package/dist/types/stt/wav.d.ts +29 -0
  88. package/dist/types/system-prompt.d.ts +4 -0
  89. package/dist/types/task/executor.d.ts +2 -0
  90. package/dist/types/task/index.d.ts +9 -1
  91. package/dist/types/task/types.d.ts +36 -0
  92. package/dist/types/tools/bash.d.ts +2 -2
  93. package/dist/types/tools/eval-render.d.ts +1 -1
  94. package/dist/types/tools/index.d.ts +11 -1
  95. package/dist/types/tools/irc.d.ts +1 -0
  96. package/dist/types/tools/learn.d.ts +51 -0
  97. package/dist/types/tools/manage-skill.d.ts +40 -0
  98. package/dist/types/tools/plan-mode-guard.d.ts +10 -0
  99. package/dist/types/tools/renderers.d.ts +7 -11
  100. package/dist/types/tools/ssh.d.ts +1 -1
  101. package/dist/types/tools/todo.d.ts +1 -1
  102. package/dist/types/tools/tts.d.ts +25 -0
  103. package/dist/types/tools/write.d.ts +1 -1
  104. package/dist/types/tts/downloader.d.ts +20 -0
  105. package/dist/types/tts/index.d.ts +8 -0
  106. package/dist/types/tts/models.d.ts +82 -0
  107. package/dist/types/tts/player.d.ts +32 -0
  108. package/dist/types/tts/runtime.d.ts +6 -0
  109. package/dist/types/tts/streaming-player.d.ts +41 -0
  110. package/dist/types/tts/tts-client.d.ts +93 -0
  111. package/dist/types/tts/tts-protocol.d.ts +95 -0
  112. package/dist/types/tts/tts-worker.d.ts +2 -0
  113. package/dist/types/tts/vocalizer.d.ts +41 -0
  114. package/dist/types/tts/wav.d.ts +8 -0
  115. package/dist/types/utils/tool-choice.d.ts +8 -0
  116. package/dist/types/utils/tools-manager.d.ts +2 -1
  117. package/dist/types/utils/tools-manager.test.d.ts +1 -0
  118. package/dist/types/web/scrapers/github.d.ts +1 -1
  119. package/package.json +15 -14
  120. package/src/async/job-manager.ts +49 -0
  121. package/src/autolearn/controller.ts +139 -0
  122. package/src/autolearn/managed-skills.ts +257 -0
  123. package/src/autoresearch/state.ts +1 -1
  124. package/src/autoresearch/types.ts +1 -1
  125. package/src/cli/args.ts +56 -2
  126. package/src/cli/session-picker.ts +2 -1
  127. package/src/cli/setup-cli.ts +148 -47
  128. package/src/cli/setup-model-picker.ts +43 -0
  129. package/src/cli-commands.ts +1 -0
  130. package/src/cli.ts +45 -13
  131. package/src/collab/host.ts +1 -1
  132. package/src/collab/protocol.ts +1 -1
  133. package/src/commands/say.ts +102 -0
  134. package/src/commands/setup.ts +1 -1
  135. package/src/commit/agentic/tools/analyze-file.ts +3 -0
  136. package/src/config/keybindings.ts +2 -2
  137. package/src/config/model-discovery.ts +11 -5
  138. package/src/config/model-registry.ts +64 -9
  139. package/src/config/models-config-schema.ts +4 -1
  140. package/src/config/models-config.ts +2 -1
  141. package/src/config/settings-schema.ts +248 -32
  142. package/src/config/settings.ts +10 -0
  143. package/src/discovery/builtin.ts +23 -1
  144. package/src/discovery/claude-plugins.ts +44 -5
  145. package/src/discovery/helpers.ts +41 -1
  146. package/src/eval/__tests__/budget-bridge.test.ts +1 -1
  147. package/src/eval/js/shared/prelude.txt +69 -17
  148. package/src/export/html/index.ts +3 -6
  149. package/src/extensibility/extensions/model-api.ts +41 -0
  150. package/src/extensibility/extensions/runner.ts +4 -0
  151. package/src/extensibility/extensions/types.ts +52 -1
  152. package/src/extensibility/extensions/wrapper.ts +41 -5
  153. package/src/extensibility/hooks/index.ts +2 -1
  154. package/src/extensibility/plugins/legacy-pi-compat.ts +43 -13
  155. package/src/extensibility/plugins/loader.ts +30 -19
  156. package/src/extensibility/plugins/manager.ts +221 -90
  157. package/src/extensibility/shared-events.ts +1 -1
  158. package/src/extensibility/skills.ts +96 -15
  159. package/src/goals/guided-setup.ts +133 -0
  160. package/src/goals/state.ts +1 -1
  161. package/src/hindsight/transcript.ts +1 -1
  162. package/src/index.ts +5 -0
  163. package/src/internal-urls/docs-index.generated.ts +10 -10
  164. package/src/internal-urls/history-protocol.ts +1 -1
  165. package/src/internal-urls/local-protocol.ts +29 -7
  166. package/src/main.ts +27 -7
  167. package/src/mcp/startup-events.ts +21 -0
  168. package/src/mcp/transports/stdio.ts +2 -1
  169. package/src/memories/index.ts +146 -11
  170. package/src/memory-backend/local-backend.ts +11 -5
  171. package/src/mnemopi/backend.ts +1 -0
  172. package/src/mnemopi/config.ts +26 -10
  173. package/src/modes/acp/acp-agent.ts +3 -5
  174. package/src/modes/components/agent-hub.ts +49 -4
  175. package/src/modes/components/assistant-message.ts +4 -37
  176. package/src/modes/components/compaction-summary-message.ts +125 -26
  177. package/src/modes/components/custom-editor.test.ts +96 -0
  178. package/src/modes/components/custom-editor.ts +164 -8
  179. package/src/modes/components/session-selector.ts +1 -1
  180. package/src/modes/components/settings-defs.ts +7 -0
  181. package/src/modes/components/tool-execution.ts +82 -43
  182. package/src/modes/components/transcript-container.ts +70 -1
  183. package/src/modes/components/tree-selector.ts +1 -1
  184. package/src/modes/components/usage-row.ts +18 -0
  185. package/src/modes/components/user-message.ts +4 -2
  186. package/src/modes/controllers/command-controller.ts +14 -4
  187. package/src/modes/controllers/event-controller.ts +78 -11
  188. package/src/modes/controllers/extension-ui-controller.ts +6 -0
  189. package/src/modes/controllers/input-controller.ts +258 -27
  190. package/src/modes/controllers/selector-controller.ts +12 -2
  191. package/src/modes/gradient-highlight.ts +21 -9
  192. package/src/modes/image-references.ts +20 -0
  193. package/src/modes/interactive-mode.ts +286 -40
  194. package/src/modes/magic-keywords.ts +27 -5
  195. package/src/modes/rpc/rpc-mode.ts +146 -14
  196. package/src/modes/rpc/rpc-subagents.ts +2 -2
  197. package/src/modes/rpc/rpc-types.ts +8 -2
  198. package/src/modes/runtime-init.ts +28 -3
  199. package/src/modes/theme/theme.ts +98 -50
  200. package/src/modes/types.ts +6 -2
  201. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  202. package/src/modes/utils/ui-helpers.ts +34 -6
  203. package/src/priority.json +5 -1
  204. package/src/prompts/agents/task.md +1 -0
  205. package/src/prompts/goals/guided-goal-interview.md +8 -0
  206. package/src/prompts/goals/guided-goal-system.md +12 -0
  207. package/src/prompts/memories/read-path.md +6 -0
  208. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  209. package/src/prompts/system/autolearn-guidance.md +7 -0
  210. package/src/prompts/system/autolearn-nudge.md +3 -0
  211. package/src/prompts/system/eager-task.md +7 -0
  212. package/src/prompts/system/eager-todo.md +11 -6
  213. package/src/prompts/system/subagent-system-prompt.md +4 -0
  214. package/src/prompts/system/system-prompt.md +10 -5
  215. package/src/prompts/system/title-marker-instruction.md +1 -0
  216. package/src/prompts/system/title-system-marker.md +16 -0
  217. package/src/prompts/tools/job.md +1 -0
  218. package/src/prompts/tools/learn.md +7 -0
  219. package/src/prompts/tools/manage-skill.md +9 -0
  220. package/src/prompts/tools/task.md +3 -0
  221. package/src/registry/agent-registry.ts +30 -0
  222. package/src/sdk.ts +88 -24
  223. package/src/secrets/obfuscator.ts +1 -1
  224. package/src/session/agent-session.ts +209 -87
  225. package/src/session/history-storage.ts +2 -2
  226. package/src/session/indexed-session-storage.ts +7 -17
  227. package/src/session/session-context.ts +352 -0
  228. package/src/session/session-entries.ts +194 -0
  229. package/src/session/session-listing.ts +588 -0
  230. package/src/session/session-loader.ts +106 -0
  231. package/src/session/session-manager.ts +933 -3145
  232. package/src/session/session-migrations.ts +78 -0
  233. package/src/session/session-paths.ts +193 -0
  234. package/src/session/session-persistence.ts +131 -0
  235. package/src/session/session-storage.ts +91 -50
  236. package/src/session/snapcompact-inline.ts +21 -1
  237. package/src/session/snapcompact-savings-journal.ts +113 -0
  238. package/src/session/tool-choice-queue.ts +23 -11
  239. package/src/slash-commands/builtin-registry.ts +25 -3
  240. package/src/stt/asr-client.ts +520 -0
  241. package/src/stt/asr-protocol.ts +65 -0
  242. package/src/stt/asr-worker.ts +790 -0
  243. package/src/stt/downloader.ts +107 -47
  244. package/src/stt/endpointer.ts +259 -0
  245. package/src/stt/index.ts +5 -1
  246. package/src/stt/models.ts +150 -0
  247. package/src/stt/recorder.ts +247 -60
  248. package/src/stt/stt-controller.ts +201 -22
  249. package/src/stt/transcriber.ts +37 -68
  250. package/src/stt/wav.ts +173 -0
  251. package/src/system-prompt.ts +8 -0
  252. package/src/task/agents.ts +1 -2
  253. package/src/task/executor.ts +49 -15
  254. package/src/task/index.ts +60 -6
  255. package/src/task/render.ts +83 -8
  256. package/src/task/types.ts +53 -0
  257. package/src/tools/ask.ts +8 -0
  258. package/src/tools/bash.ts +4 -3
  259. package/src/tools/eval-render.ts +4 -3
  260. package/src/tools/index.ts +40 -4
  261. package/src/tools/irc.ts +10 -2
  262. package/src/tools/job.ts +14 -2
  263. package/src/tools/learn.ts +144 -0
  264. package/src/tools/manage-skill.ts +104 -0
  265. package/src/tools/plan-mode-guard.ts +53 -19
  266. package/src/tools/renderers.ts +7 -11
  267. package/src/tools/ssh.ts +4 -3
  268. package/src/tools/todo.ts +1 -1
  269. package/src/tools/tts.ts +203 -92
  270. package/src/tools/write.ts +18 -2
  271. package/src/tts/downloader.ts +64 -0
  272. package/src/tts/index.ts +8 -0
  273. package/src/tts/models.ts +137 -0
  274. package/src/tts/player.ts +137 -0
  275. package/src/tts/runtime.ts +21 -0
  276. package/src/tts/streaming-player.ts +266 -0
  277. package/src/tts/tts-client.ts +647 -0
  278. package/src/tts/tts-protocol.ts +60 -0
  279. package/src/tts/tts-worker.ts +497 -0
  280. package/src/tts/vocalizer.ts +162 -0
  281. package/src/tts/wav.ts +58 -0
  282. package/src/utils/title-generator.ts +48 -5
  283. package/src/utils/tool-choice.ts +16 -0
  284. package/src/utils/tools-manager.test.ts +25 -0
  285. package/src/utils/tools-manager.ts +19 -1
  286. package/src/web/scrapers/github.ts +96 -0
  287. package/src/web/search/index.ts +13 -0
  288. package/src/web/search/providers/searxng.ts +13 -1
  289. package/dist/types/stt/setup.d.ts +0 -18
  290. package/src/stt/setup.ts +0 -52
  291. package/src/stt/transcribe.py +0 -70
@@ -5,9 +5,26 @@ export interface RecordingHandle {
5
5
  * Returns available recording tools in priority order.
6
6
  */
7
7
  export declare function detectRecordingTools(): string[];
8
+ export interface ResolvedRecorder {
9
+ tool: "sox" | "ffmpeg" | "arecord" | "powershell";
10
+ bin: string;
11
+ }
12
+ export declare function detectRecorder(): ResolvedRecorder | null;
13
+ /**
14
+ * Ensure a recorder is available, downloading the static ffmpeg binary when
15
+ * nothing is already present. Returns the resolved recorder.
16
+ */
17
+ export declare function ensureRecorder(onProgress?: (p: {
18
+ stage: string;
19
+ percent?: number;
20
+ }) => void, signal?: AbortSignal): Promise<ResolvedRecorder>;
8
21
  export declare function startRecording(outputPath: string): Promise<RecordingHandle>;
9
22
  /**
10
23
  * Verify a recorded audio file is usable.
11
24
  * Returns the file size in bytes, or throws.
12
25
  */
13
26
  export declare function verifyRecordingFile(filePath: string): Promise<number>;
27
+ export interface StreamingRecordingHandle {
28
+ stop(): Promise<void>;
29
+ }
30
+ export declare function startStreamingRecording(onAudio: (samples: Float32Array) => void): Promise<StreamingRecordingHandle | null>;
@@ -3,9 +3,15 @@ interface ToggleOptions {
3
3
  showWarning(msg: string): void;
4
4
  showStatus(msg: string): void;
5
5
  onStateChange(state: SttState): void;
6
+ /** Force a redraw after async edits to the composer (live segment/preview inserts). */
7
+ requestRender?(): void;
6
8
  }
9
+ /** The slice of the composer editor the controller drives. */
7
10
  interface Editor {
8
11
  insertText(text: string): void;
12
+ setVolatileText(text: string): void;
13
+ clearVolatileText(): void;
14
+ commitVolatileText(text: string): void;
9
15
  }
10
16
  export declare class STTController {
11
17
  #private;
@@ -4,13 +4,11 @@ export interface TranscribeOptions {
4
4
  signal?: AbortSignal;
5
5
  }
6
6
  /**
7
- * Find a usable Python command.
8
- */
9
- export declare function resolvePython(): string | null;
10
- /**
11
- * Transcribe a WAV file using Python openai-whisper.
7
+ * Transcribe a WAV file using the local ONNX Whisper worker.
12
8
  *
13
- * Reads the WAV via Python's built-in `wave` module (no ffmpeg needed),
14
- * resamples to 16 kHz mono, and passes the numpy array directly to whisper.
9
+ * Decodes the WAV to a 16 kHz mono Float32Array in-process (no Python, no
10
+ * ffmpeg) and routes it to the warm speech worker, which keeps the model loaded
11
+ * across calls. Honors `options.signal` (abort) and applies an internal timeout
12
+ * with the same semantics as the previous Python path.
15
13
  */
16
14
  export declare function transcribe(audioPath: string, options?: TranscribeOptions): Promise<string>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Minimal WAV (RIFF/PCM) decoder producing the Float32Array @ 16 kHz mono that
3
+ * transformers.js `automatic-speech-recognition` expects. Ports the decode/
4
+ * mono-mix/resample logic from the retired Python `transcribe.py` (which read
5
+ * via the stdlib `wave` module) so STT no longer shells out to Python.
6
+ *
7
+ * Supported sample formats: PCM uint8 (8-bit), int16 (16-bit), int32 (32-bit),
8
+ * and IEEE float32 (format tag 3). Any number of channels is mixed down to mono.
9
+ */
10
+ /** transformers.js Whisper feature extractor operates at 16 kHz. */
11
+ export declare const TARGET_SAMPLE_RATE = 16000;
12
+ /**
13
+ * Resample via linear interpolation, mirroring the Python `np.interp` over
14
+ * `linspace(0, n-1, targetLen)` against `arange(n)`.
15
+ */
16
+ export declare function resampleLinear(input: Float32Array, fromRate: number, toRate: number): Float32Array;
17
+ /**
18
+ * Decode a WAV byte buffer into a 16 kHz mono Float32Array suitable for the
19
+ * transformers.js Whisper pipeline.
20
+ */
21
+ export declare function decodeWavToMono16k(buffer: ArrayBuffer): Float32Array;
22
+ /**
23
+ * Decode interleaved little-endian signed 16-bit PCM bytes into normalized
24
+ * [-1, 1] mono float samples. The live recorder streams raw s16le frames from
25
+ * sox/ffmpeg/arecord stdout (no RIFF container), so this is the hot-path
26
+ * counterpart to {@link decodeWavToMono16k}. `bytes` MUST be 2-byte aligned;
27
+ * callers buffer any trailing odd byte across chunk boundaries.
28
+ */
29
+ export declare function decodePcmS16LE(bytes: Uint8Array): Float32Array;
@@ -78,6 +78,10 @@ export interface BuildSystemPromptOptions {
78
78
  mcpDiscoveryServerSummaries?: string[];
79
79
  /** Encourage the agent to delegate via tasks unless changes are trivial. */
80
80
  eagerTasks?: boolean;
81
+ /** When true, the Eager Tasks section uses the hard MUST/ONLY wording (`task.eager: always`) rather than the softer `preferred` nudge. */
82
+ eagerTasksAlways?: boolean;
83
+ /** Whether `task.batch` is enabled; gates batch-call guidance in the Eager Tasks section. */
84
+ taskBatch?: boolean;
81
85
  /** Rules with alwaysApply=true — their full content is injected into the prompt. */
82
86
  alwaysApplyRules?: AlwaysApplyRule[];
83
87
  /** Whether secret obfuscation is active. When true, explains the redaction format in the prompt. */
@@ -51,6 +51,8 @@ export interface ExecutorOptions {
51
51
  content: string;
52
52
  };
53
53
  description?: string;
54
+ /** Specialist role/expertise for this spawn; drives the system-prompt preamble, display name, and telemetry identity. */
55
+ role?: string;
54
56
  index: number;
55
57
  id: string;
56
58
  parentToolCallId?: string;
@@ -1,7 +1,7 @@
1
1
  import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
2
2
  import type { ToolSession } from "..";
3
3
  import type { Theme } from "../modes/theme/theme";
4
- import { type AgentDefinition, type SingleResult, type TaskToolDetails, type TaskToolSchemaInstance } from "./types";
4
+ import { type AgentDefinition, type SingleResult, type TaskItem, type TaskToolDetails, type TaskToolSchemaInstance } from "./types";
5
5
  import "../tools/review";
6
6
  import { renderResult, renderCall as renderTaskCall } from "./render";
7
7
  export { loadBundledAgents as BUNDLED_AGENTS } from "./agents";
@@ -18,6 +18,14 @@ export declare function isReadOnlyAgent(agent: AgentDefinition): boolean;
18
18
  * tell a no-op child from one that burned requests before being cancelled.
19
19
  */
20
20
  export declare function formatResultOutputFallback(result: Pick<SingleResult, "output" | "stderr" | "requests">): string;
21
+ /**
22
+ * Advisory — never a rejection — nudging the spawner toward tailored
23
+ * specialists when it spawns generic role-less workers and still holds spawn
24
+ * capacity (DepthCapacity: it currently has the `task` tool). Fires when a
25
+ * generic `task`/`quick_task` spawn carries no `role`, or when one call clones
26
+ * the same agent ≥2× all without roles. Returns undefined when no nudge applies.
27
+ */
28
+ export declare function buildSpecializationAdvisory(agentName: string | undefined, items: TaskItem[], depthCapacity: boolean): string | undefined;
21
29
  /**
22
30
  * Task tool - Delegate tasks to specialized agents.
23
31
  *
@@ -51,9 +51,14 @@ export interface SubagentLifecyclePayload {
51
51
  */
52
52
  detached?: boolean;
53
53
  }
54
+ /** Display cap for a normalized one-line label (roster line, registry `displayName`, prompt field). */
55
+ export declare const ROLE_LABEL_MAX = 80;
56
+ /** Schema bound on the raw `role` input, before it is label-normalized at every use site. */
57
+ export declare const ROLE_INPUT_MAX = 256;
54
58
  export declare const taskItemSchema: z.ZodObject<{
55
59
  id: z.ZodOptional<z.ZodString>;
56
60
  description: z.ZodOptional<z.ZodString>;
61
+ role: z.ZodOptional<z.ZodString>;
57
62
  assignment: z.ZodString;
58
63
  }, z.core.$strip>;
59
64
  /** Single task item. Fields are optional defensively: args stream in token by token. */
@@ -62,6 +67,8 @@ export interface TaskItem {
62
67
  id?: string;
63
68
  /** UI label, not seen by the subagent. */
64
69
  description?: string;
70
+ /** Specialist role/expertise this subagent embodies; shapes its system-prompt identity and display name. */
71
+ role?: string;
65
72
  /** The work; required by the schema. */
66
73
  assignment?: string;
67
74
  /** Run this spawn in an isolated worktree (batch form; flat form carries it top-level). */
@@ -70,6 +77,7 @@ export interface TaskItem {
70
77
  export declare const taskSchema: z.ZodObject<{
71
78
  id: z.ZodOptional<z.ZodString>;
72
79
  description: z.ZodOptional<z.ZodString>;
80
+ role: z.ZodOptional<z.ZodString>;
73
81
  assignment: z.ZodString;
74
82
  isolated: z.ZodOptional<z.ZodBoolean>;
75
83
  agent: z.ZodString;
@@ -77,12 +85,14 @@ export declare const taskSchema: z.ZodObject<{
77
85
  declare const ALL_TASK_SCHEMAS: readonly [z.ZodObject<{
78
86
  id: z.ZodOptional<z.ZodString>;
79
87
  description: z.ZodOptional<z.ZodString>;
88
+ role: z.ZodOptional<z.ZodString>;
80
89
  assignment: z.ZodString;
81
90
  isolated: z.ZodOptional<z.ZodBoolean>;
82
91
  agent: z.ZodString;
83
92
  }, z.core.$strip>, z.ZodObject<{
84
93
  id: z.ZodOptional<z.ZodString>;
85
94
  description: z.ZodOptional<z.ZodString>;
95
+ role: z.ZodOptional<z.ZodString>;
86
96
  assignment: z.ZodString;
87
97
  agent: z.ZodString;
88
98
  }, z.core.$strip>, z.ZodObject<{
@@ -91,6 +101,7 @@ declare const ALL_TASK_SCHEMAS: readonly [z.ZodObject<{
91
101
  tasks: z.ZodArray<z.ZodObject<{
92
102
  id: z.ZodOptional<z.ZodString>;
93
103
  description: z.ZodOptional<z.ZodString>;
104
+ role: z.ZodOptional<z.ZodString>;
94
105
  assignment: z.ZodString;
95
106
  isolated: z.ZodOptional<z.ZodBoolean>;
96
107
  }, z.core.$strip>>;
@@ -100,6 +111,7 @@ declare const ALL_TASK_SCHEMAS: readonly [z.ZodObject<{
100
111
  tasks: z.ZodArray<z.ZodObject<{
101
112
  id: z.ZodOptional<z.ZodString>;
102
113
  description: z.ZodOptional<z.ZodString>;
114
+ role: z.ZodOptional<z.ZodString>;
103
115
  assignment: z.ZodString;
104
116
  }, z.core.$strip>>;
105
117
  }, z.core.$strip>];
@@ -124,6 +136,8 @@ export interface TaskParams {
124
136
  id?: string;
125
137
  /** UI label (flat form), not seen by the subagent. */
126
138
  description?: string;
139
+ /** Specialist role/expertise this subagent embodies; shapes its system-prompt identity and display name. */
140
+ role?: string;
127
141
  /** The work (flat form). */
128
142
  assignment?: string;
129
143
  /** Batch form (`task.batch`): one subagent per item. */
@@ -133,6 +147,28 @@ export interface TaskParams {
133
147
  /** Run in an isolated worktree (flat form; per-item in batch form). */
134
148
  isolated?: boolean;
135
149
  }
150
+ /**
151
+ * One-line, length-capped label safe for a single roster line, a registry
152
+ * `displayName`, or a system-prompt field. Collapses every run of whitespace
153
+ * AND control/format characters — including U+0085 NEL, ESC/ANSI, and the
154
+ * zero-width separators that `\s` misses — to a single space, then caps length.
155
+ * So untrusted text (a spawn `role`, a peer activity gist) can neither break the
156
+ * line, inject prompt structure, nor smuggle terminal escapes. Caps at `max`
157
+ * characters (clamped to >= 1; default `ROLE_LABEL_MAX`), appending an ellipsis when truncated.
158
+ */
159
+ export declare function oneLineLabel(text: string, max?: number): string;
160
+ /**
161
+ * Display name for a spawned subagent: its tailored `role` (label-normalized)
162
+ * when one is given, else the agent type's name. Empty/whitespace roles fall
163
+ * back to the agent name.
164
+ */
165
+ export declare function resolveSubagentDisplayName(role: string | undefined, agentName: string): string;
166
+ /**
167
+ * Whether an agent at `taskDepth` may still spawn children — i.e. it currently
168
+ * holds the `task` tool. Mirrors the task-tool availability gate;
169
+ * `maxRecursionDepth < 0` disables the cap entirely.
170
+ */
171
+ export declare function canSpawnAtDepth(maxRecursionDepth: number, taskDepth: number): boolean;
136
172
  /** A code review finding reported by the reviewer agent */
137
173
  export interface ReviewFinding {
138
174
  title: string;
@@ -124,7 +124,7 @@ export declare function createShellRenderer<TArgs>(config: ShellRendererConfig<T
124
124
  }, uiTheme: Theme, args?: TArgs): Component;
125
125
  mergeCallAndResult: boolean;
126
126
  inline: boolean;
127
- provisionalPendingPreview: boolean;
127
+ provisionalPendingPreview: string;
128
128
  };
129
129
  export declare const bashToolRenderer: {
130
130
  renderCall(args: BashRenderArgs, options: RenderResultOptions, uiTheme: Theme): Component;
@@ -140,6 +140,6 @@ export declare const bashToolRenderer: {
140
140
  }, uiTheme: Theme, args?: BashRenderArgs | undefined): Component;
141
141
  mergeCallAndResult: boolean;
142
142
  inline: boolean;
143
- provisionalPendingPreview: boolean;
143
+ provisionalPendingPreview: string;
144
144
  };
145
145
  export {};
@@ -48,6 +48,6 @@ export declare const evalToolRenderer: {
48
48
  }, uiTheme: Theme, _args?: EvalRenderArgs): Component;
49
49
  mergeCallAndResult: boolean;
50
50
  inline: boolean;
51
- provisionalPendingPreview: boolean;
51
+ provisionalPendingPreview: string;
52
52
  };
53
53
  export {};
@@ -17,6 +17,7 @@ import type { AgentRegistry } from "../registry/agent-registry";
17
17
  import type { ArtifactManager } from "../session/artifacts";
18
18
  import type { ClientBridge } from "../session/client-bridge";
19
19
  import type { CustomMessage } from "../session/messages";
20
+ import type { UsageStatistics } from "../session/session-entries";
20
21
  import type { ToolChoiceQueue } from "../session/tool-choice-queue";
21
22
  import type { AgentOutputManager } from "../task/output-manager";
22
23
  import type { DiscoverableTool, DiscoverableToolSearchIndex } from "../tool-discovery/tool-index";
@@ -45,6 +46,8 @@ export * from "./image-gen";
45
46
  export * from "./inspect-image";
46
47
  export * from "./irc";
47
48
  export * from "./job";
49
+ export * from "./learn";
50
+ export * from "./manage-skill";
48
51
  export * from "./memory-edit";
49
52
  export * from "./memory-recall";
50
53
  export * from "./memory-reflect";
@@ -97,6 +100,13 @@ export interface ToolSession {
97
100
  cwd: string;
98
101
  /** Whether UI is available */
99
102
  hasUI: boolean;
103
+ /**
104
+ * Suppress the spawn specialization/coordination advisory appended to `task`
105
+ * results. Set by internal/programmatic callers (e.g. the commit agent's
106
+ * file-analysis fan-out) whose results are consumed by code — not by a model
107
+ * orchestrating further spawns — so the nudge would only be noise.
108
+ */
109
+ suppressSpawnAdvisory?: boolean;
100
110
  /** Optional fetch implementation injected into the URL read pipeline (tests, proxies). Defaults to global fetch. */
101
111
  fetch?: FetchImpl;
102
112
  /** Skip Python kernel availability check and warmup */
@@ -211,7 +221,7 @@ export interface ToolSession {
211
221
  /** Goal runtime for the active agent session. */
212
222
  getGoalRuntime?: () => GoalRuntime | undefined;
213
223
  /** Get cumulative session usage statistics (input/output tokens, cost). */
214
- getUsageStatistics?: () => import("../session/session-manager").UsageStatistics;
224
+ getUsageStatistics?: () => UsageStatistics;
215
225
  /** Current per-turn token budget {total, spent, hard} for the eval `budget` helper. */
216
226
  getTurnBudget?: () => {
217
227
  total: number | null;
@@ -47,6 +47,7 @@ interface IrcPeerInfo {
47
47
  parentId?: string;
48
48
  unread: number;
49
49
  lastActivity: number;
50
+ activity?: string;
50
51
  }
51
52
  export interface IrcDetails {
52
53
  op: "send" | "wait" | "inbox" | "list";
@@ -0,0 +1,51 @@
1
+ import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
2
+ import { z } from "zod/v4";
3
+ import type { ToolSession } from ".";
4
+ declare const learnSchema: z.ZodObject<{
5
+ memory: z.ZodString;
6
+ context: z.ZodOptional<z.ZodString>;
7
+ skill: z.ZodOptional<z.ZodObject<{
8
+ action: z.ZodEnum<{
9
+ create: "create";
10
+ update: "update";
11
+ }>;
12
+ name: z.ZodString;
13
+ description: z.ZodString;
14
+ body: z.ZodString;
15
+ }, z.core.$strip>>;
16
+ }, z.core.$strip>;
17
+ export type LearnParams = z.infer<typeof learnSchema>;
18
+ /**
19
+ * Orchestrating "learn" tool: persists a lesson to long-term memory and,
20
+ * given a `skill` payload, mints/enhances a managed skill via the shared
21
+ * `writeManagedSkill` primitive. Gated behind `autolearn.enabled` plus a live
22
+ * memory backend — `hindsight`/`mnemopi` (remote/SQLite) or `local` (the
23
+ * file-based rollout backend, where lessons append to `learned.md`).
24
+ */
25
+ export declare class LearnTool implements AgentTool<typeof learnSchema> {
26
+ private readonly session;
27
+ readonly name = "learn";
28
+ readonly approval: (args: unknown) => "read" | "write";
29
+ readonly label = "Learn";
30
+ readonly description: string;
31
+ readonly parameters: z.ZodObject<{
32
+ memory: z.ZodString;
33
+ context: z.ZodOptional<z.ZodString>;
34
+ skill: z.ZodOptional<z.ZodObject<{
35
+ action: z.ZodEnum<{
36
+ create: "create";
37
+ update: "update";
38
+ }>;
39
+ name: z.ZodString;
40
+ description: z.ZodString;
41
+ body: z.ZodString;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>;
44
+ readonly strict = true;
45
+ readonly loadMode: "essential";
46
+ readonly summary = "Capture a reusable lesson to memory (and optionally a managed skill)";
47
+ constructor(session: ToolSession);
48
+ static createIf(session: ToolSession): LearnTool | null;
49
+ execute(_id: string, params: LearnParams): Promise<AgentToolResult>;
50
+ }
51
+ export {};
@@ -0,0 +1,40 @@
1
+ import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
2
+ import { z } from "zod/v4";
3
+ import type { ToolSession } from ".";
4
+ declare const manageSkillSchema: z.ZodObject<{
5
+ action: z.ZodEnum<{
6
+ create: "create";
7
+ delete: "delete";
8
+ update: "update";
9
+ }>;
10
+ name: z.ZodString;
11
+ description: z.ZodOptional<z.ZodString>;
12
+ body: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ export type ManageSkillParams = z.infer<typeof manageSkillSchema>;
15
+ /**
16
+ * Direct create/update/delete of isolated managed skills. Gated behind
17
+ * `autolearn.enabled`; backend-independent (the skill side is standalone).
18
+ */
19
+ export declare class ManageSkillTool implements AgentTool<typeof manageSkillSchema> {
20
+ readonly name = "manage_skill";
21
+ readonly approval: "write";
22
+ readonly label = "Manage Skill";
23
+ readonly description: string;
24
+ readonly parameters: z.ZodObject<{
25
+ action: z.ZodEnum<{
26
+ create: "create";
27
+ delete: "delete";
28
+ update: "update";
29
+ }>;
30
+ name: z.ZodString;
31
+ description: z.ZodOptional<z.ZodString>;
32
+ body: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>;
34
+ readonly strict = true;
35
+ readonly loadMode: "essential";
36
+ readonly summary = "Create, update, or delete an isolated managed skill";
37
+ static createIf(session: ToolSession): ManageSkillTool | null;
38
+ execute(_id: string, params: ManageSkillParams): Promise<AgentToolResult>;
39
+ }
40
+ export {};
@@ -1,7 +1,17 @@
1
1
  import type { ToolSession } from ".";
2
+ /** Strip the hashline `[path#TAG]` wrapper from a write/edit target so the inner
3
+ * filesystem path drives both authorization and resolution. Only unwraps inputs
4
+ * that match the strict hashline header shape (`[path]` or `[path#XXXX]` with a
5
+ * 4-hex tag); anything else returns the original string so the downstream
6
+ * resolver surfaces the real error. Exported for callers (e.g. `write`) that
7
+ * make scheme/bridge-routing decisions before {@link resolvePlanPath} runs. */
8
+ export declare function unwrapHashlineHeaderPath(targetPath: string): string;
2
9
  /**
3
10
  * Resolve a write/edit target to its absolute filesystem path, honoring the
4
11
  * `local://` and `vault://` schemes. Plain paths resolve against the session cwd.
12
+ * Bracketed hashline headers (`[path#TAG]`) are unwrapped first so the inner
13
+ * filesystem path drives resolution — keeping the plan-mode guard and the
14
+ * eventual write in lockstep.
5
15
  */
6
16
  export declare function resolvePlanPath(session: ToolSession, targetPath: string): string;
7
17
  /**
@@ -22,17 +22,13 @@ export type ToolRenderer = {
22
22
  /** Render without background box, inline in the response flow */
23
23
  inline?: boolean;
24
24
  /**
25
- * Collapsed pending preview is provisional a tail-window or otherwise
26
- * re-anchored view the result render replaces wholesale (an edit's
27
- * streamed-diff tail, bash/ssh command caps, eval cells whose outputs
28
- * interleave under each cell). Its rows must never commit to native
29
- * scrollback mid-run; see
30
- * `ToolExecutionComponent.isTranscriptBlockCommitStable`. Absent = the
31
- * pending preview streams top-anchored append-shaped rows the result
32
- * render preserves (task context/assignment, write content), which stay
33
- * commit-eligible so a call taller than the viewport scrolls into history
34
- * instead of reading as cut off.
25
+ * Whether pending-call rows are provisional: useful on screen while a tool is
26
+ * streaming, but not durable transcript history. `true` means every pending
27
+ * shape is provisional. `"collapsed"` means only the collapsed pending shape
28
+ * is provisional; expanded rendering is top-anchored/append-shaped enough to
29
+ * let the transcript commit its settled prefix. Absent = the pending preview
30
+ * streams rows the result render preserves.
35
31
  */
36
- provisionalPendingPreview?: boolean;
32
+ provisionalPendingPreview?: boolean | "collapsed";
37
33
  };
38
34
  export declare const toolRenderers: Record<string, ToolRenderer>;
@@ -65,6 +65,6 @@ export declare const sshToolRenderer: {
65
65
  renderContext?: SshRenderContext;
66
66
  }, uiTheme: Theme, args?: SshRenderArgs): Component;
67
67
  mergeCallAndResult: boolean;
68
- provisionalPendingPreview: boolean;
68
+ provisionalPendingPreview: string;
69
69
  };
70
70
  export {};
@@ -4,7 +4,7 @@ import { z } from "zod/v4";
4
4
  import type { RenderResultOptions } from "../extensibility/custom-tools/types";
5
5
  import type { Theme } from "../modes/theme/theme";
6
6
  import type { ToolSession } from "../sdk";
7
- import type { SessionEntry } from "../session/session-manager";
7
+ import type { SessionEntry } from "../session/session-entries";
8
8
  export type TodoStatus = "pending" | "in_progress" | "completed" | "abandoned";
9
9
  export interface TodoItem {
10
10
  content: string;
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod/v4";
2
2
  import type { CustomTool } from "../extensibility/custom-tools/types";
3
3
  type TtsCodec = "mp3" | "wav";
4
+ type TtsBackend = "local" | "xai";
4
5
  declare const ttsSchema: z.ZodObject<{
5
6
  text: z.ZodString;
6
7
  voice_id: z.ZodDefault<z.ZodString>;
@@ -13,6 +14,30 @@ interface TtsToolDetails {
13
14
  bytes: number;
14
15
  voiceId: string;
15
16
  codec: TtsCodec;
17
+ backend: TtsBackend;
16
18
  }
19
+ /**
20
+ * Pick the synthesis backend. Pure for testability.
21
+ *
22
+ * - `xai` / `local` are honored verbatim (the xAI path still surfaces its own
23
+ * "no credentials" error when creds are missing).
24
+ * - `auto` prefers the local on-device backend, except when the caller asked for
25
+ * an `.mp3` and xAI credentials exist — only the cloud path can emit MP3, so we
26
+ * route there to satisfy the requested container rather than substituting WAV.
27
+ */
28
+ export declare function resolveTtsBackend(opts: {
29
+ preference: string;
30
+ wantsMp3: boolean;
31
+ hasXaiCreds: boolean;
32
+ }): TtsBackend;
33
+ /**
34
+ * Resolve the on-disk path for local synthesis. Local output is always WAV (no
35
+ * MP3 encoder is bundled), so an `.mp3` (or any non-`.wav`) request is rewritten
36
+ * to a sibling `.wav` and flagged so the tool result can note the substitution.
37
+ */
38
+ export declare function resolveLocalWavPath(outputPath: string): {
39
+ wavPath: string;
40
+ substituted: boolean;
41
+ };
17
42
  export declare const ttsTool: CustomTool<typeof ttsSchema, TtsToolDetails>;
18
43
  export {};
@@ -46,7 +46,7 @@ export declare class WriteTool implements AgentTool<typeof writeSchema, WriteToo
46
46
  /** Stream matchers should see the real file content, not its JSON-escaped argument encoding. */
47
47
  matcherDigest(args: unknown): string | undefined;
48
48
  constructor(session: ToolSession);
49
- execute(_toolCallId: string, { path, content }: WriteParams, signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<WriteToolDetails>, context?: AgentToolContext): Promise<AgentToolResult<WriteToolDetails>>;
49
+ execute(_toolCallId: string, { path: rawPath, content }: WriteParams, signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<WriteToolDetails>, context?: AgentToolContext): Promise<AgentToolResult<WriteToolDetails>>;
50
50
  }
51
51
  interface WriteRenderArgs {
52
52
  path?: string;
@@ -0,0 +1,20 @@
1
+ export interface TtsDownloadProgress {
2
+ stage: string;
3
+ /** Integer 0–100 download percent when known. */
4
+ percent?: number;
5
+ }
6
+ /**
7
+ * Whether the selected local TTS model and the side Kokoro runtime are already
8
+ * present. transformers.js stores `main`-revision files at
9
+ * `<cacheDir>/<repo>/...`, so any `.onnx` weight under the repo dir means the
10
+ * model weights can load without a network fetch; the Kokoro package runtime is
11
+ * version-keyed separately and must also exist before setup can report ready.
12
+ */
13
+ export declare function isTtsModelCached(modelKey: string): Promise<boolean>;
14
+ /**
15
+ * Ensure the selected local TTS model is downloaded into the transformers.js
16
+ * cache (and warm in the worker), streaming integer-percent Hub progress. The
17
+ * worker resolves the request once every model file is cached. Returns `false`
18
+ * if the worker is unavailable or the download failed.
19
+ */
20
+ export declare function downloadTtsModel(modelKey: string, onProgress?: (progress: TtsDownloadProgress) => void, signal?: AbortSignal): Promise<boolean>;
@@ -0,0 +1,8 @@
1
+ export * from "./downloader";
2
+ export * from "./models";
3
+ export * from "./runtime";
4
+ export * from "./tts-client";
5
+ export * from "./tts-protocol";
6
+ export * from "./tts-worker";
7
+ export * from "./vocalizer";
8
+ export * from "./wav";
@@ -0,0 +1,82 @@
1
+ import type { TinyModelDtype } from "../tiny/dtype";
2
+ /**
3
+ * Voice exposed by a local TTS model. Kokoro ships a fixed catalog of named
4
+ * voices; a voice is just a stable id (e.g. `af_heart`) plus a display label.
5
+ * Selection is purely on-device — generating with a different voice needs no
6
+ * extra network fetch once the model weights are cached.
7
+ */
8
+ export interface TtsLocalVoiceSpec {
9
+ id: string;
10
+ label: string;
11
+ }
12
+ /**
13
+ * A local (on-device, ONNX) text-to-speech model the worker can load. `repo` is
14
+ * the Hugging Face model id loaded through `kokoro-js`
15
+ * (`KokoroTTS.from_pretrained`), which runs on the same `@huggingface/transformers`
16
+ * + `onnxruntime` runtime as the rest of the tiny-model stack and bundles the
17
+ * misaki/espeak phonemizer Kokoro needs. `dtype` is the default ONNX precision
18
+ * (overridable via `providers.tinyModelDtype`/`PI_TINY_DTYPE`).
19
+ */
20
+ export interface TtsLocalModelSpec {
21
+ key: string;
22
+ repo: string;
23
+ dtype: TinyModelDtype;
24
+ /** PCM sample rate the model emits; fallback only — the worker uses the value RawAudio reports. */
25
+ sampleRate: number;
26
+ label: string;
27
+ description: string;
28
+ /** First entry is the model's default voice. */
29
+ voices: readonly TtsLocalVoiceSpec[];
30
+ }
31
+ /**
32
+ * Curated Kokoro-82M voice catalog. Kokoro ships ~28 voices; we surface the
33
+ * higher-graded ones across American/British × female/male so the picker stays
34
+ * useful without listing every D/F-grade sample. `af_heart` (grade A) leads and
35
+ * is the default voice. Grades are Kokoro's own `overallGrade` ratings.
36
+ */
37
+ export declare const KOKORO_VOICES: readonly TtsLocalVoiceSpec[];
38
+ /** Default voice within the default model — Kokoro's flagship grade-A voice. */
39
+ export declare const DEFAULT_TTS_VOICE = "af_heart";
40
+ /** Default local TTS model used when `tts.localModel` is unset. */
41
+ export declare const DEFAULT_TTS_LOCAL_MODEL_KEY = "kokoro";
42
+ /**
43
+ * Local TTS model registry. Kokoro-82M is the on-device SoTA tiny TTS (tops the
44
+ * TTS Arena leaderboard); the `onnx-community` ONNX export runs through
45
+ * `kokoro-js` on the shared transformers.js/onnxruntime worker. q8 keeps the
46
+ * weights ~100 MB and CPU inference fast while preserving quality. One model
47
+ * spans every voice/accent — language selection is a voice choice, not a
48
+ * separate download.
49
+ */
50
+ export declare const TTS_LOCAL_MODELS: readonly [{
51
+ readonly key: "kokoro";
52
+ readonly repo: "onnx-community/Kokoro-82M-v1.0-ONNX";
53
+ readonly dtype: "q8";
54
+ readonly sampleRate: 24000;
55
+ readonly label: "Kokoro-82M";
56
+ readonly description: "Kokoro-82M neural TTS — SoTA on-device quality, multi-voice, fully local";
57
+ readonly voices: readonly TtsLocalVoiceSpec[];
58
+ }];
59
+ export type TtsLocalModelKey = (typeof TTS_LOCAL_MODELS)[number]["key"];
60
+ export declare const TTS_LOCAL_MODEL_VALUES: readonly ["kokoro"];
61
+ export declare const TTS_LOCAL_MODEL_OPTIONS: readonly [{
62
+ readonly value: "kokoro";
63
+ readonly label: "Kokoro-82M";
64
+ readonly description: "Kokoro-82M neural TTS — SoTA on-device quality, multi-voice, fully local";
65
+ }];
66
+ /** Voice options for the `tts.localVoice` setting picker (default model's catalog). */
67
+ export declare const TTS_LOCAL_VOICE_OPTIONS: ReadonlyArray<{
68
+ value: string;
69
+ label: string;
70
+ }>;
71
+ /** Accepted `tts.localVoice` values (default model's catalog) for schema validation. */
72
+ export declare const TTS_LOCAL_VOICE_VALUES: readonly string[];
73
+ export declare function getTtsLocalModelSpec(key: string): TtsLocalModelSpec | undefined;
74
+ export declare function isTtsLocalModelKey(value: string): value is TtsLocalModelKey;
75
+ /** Resolve a model key (or the default) to its Hugging Face repo id. */
76
+ export declare function resolveTtsRepo(modelKey: string | undefined): string;
77
+ /**
78
+ * Resolve a requested voice id to a concrete voice the model supports, falling
79
+ * back to the model's default voice (first entry) when the id is unknown or the
80
+ * legacy `"default"` sentinel. The returned id is always a valid Kokoro voice.
81
+ */
82
+ export declare function resolveTtsVoice(modelKey: string | undefined, voice: string | undefined): string;