@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.
- package/CHANGELOG.md +304 -6
- package/dist/cli.js +1015 -881
- package/dist/types/async/job-manager.d.ts +15 -0
- package/dist/types/autolearn/controller.d.ts +25 -0
- package/dist/types/autolearn/managed-skills.d.ts +45 -0
- package/dist/types/autoresearch/state.d.ts +1 -1
- package/dist/types/autoresearch/types.d.ts +1 -1
- package/dist/types/cli/args.d.ts +19 -1
- package/dist/types/cli/session-picker.d.ts +1 -1
- package/dist/types/cli/setup-cli.d.ts +1 -1
- package/dist/types/cli/setup-model-picker.d.ts +14 -0
- package/dist/types/collab/protocol.d.ts +1 -1
- package/dist/types/commands/say.d.ts +24 -0
- package/dist/types/config/keybindings.d.ts +3 -3
- package/dist/types/config/model-registry.d.ts +10 -0
- package/dist/types/config/models-config-schema.d.ts +12 -0
- package/dist/types/config/models-config.d.ts +8 -2
- package/dist/types/config/settings-schema.d.ts +261 -58
- package/dist/types/export/html/index.d.ts +2 -1
- package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -1
- package/dist/types/extensibility/extensions/types.d.ts +47 -1
- package/dist/types/extensibility/hooks/index.d.ts +2 -1
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +9 -0
- package/dist/types/extensibility/plugins/loader.d.ts +11 -0
- package/dist/types/extensibility/shared-events.d.ts +1 -1
- package/dist/types/extensibility/skills.d.ts +10 -0
- package/dist/types/goals/guided-setup.d.ts +18 -0
- package/dist/types/goals/state.d.ts +1 -1
- package/dist/types/hindsight/transcript.d.ts +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/internal-urls/local-protocol.d.ts +4 -2
- package/dist/types/main.d.ts +4 -3
- package/dist/types/mcp/startup-events.d.ts +11 -0
- package/dist/types/memories/index.d.ts +7 -0
- package/dist/types/memory-backend/local-backend.d.ts +4 -3
- package/dist/types/mnemopi/config.d.ts +4 -4
- package/dist/types/modes/components/agent-hub.d.ts +6 -0
- package/dist/types/modes/components/assistant-message.d.ts +1 -2
- package/dist/types/modes/components/compaction-summary-message.d.ts +15 -1
- package/dist/types/modes/components/custom-editor.d.ts +39 -1
- package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
- package/dist/types/modes/components/session-selector.d.ts +1 -1
- package/dist/types/modes/components/tool-execution.d.ts +26 -16
- package/dist/types/modes/components/transcript-container.d.ts +23 -2
- package/dist/types/modes/components/tree-selector.d.ts +1 -1
- package/dist/types/modes/components/usage-row.d.ts +3 -0
- package/dist/types/modes/controllers/command-controller.d.ts +2 -2
- package/dist/types/modes/controllers/input-controller.d.ts +14 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +3 -1
- package/dist/types/modes/gradient-highlight.d.ts +9 -4
- package/dist/types/modes/image-references.d.ts +6 -0
- package/dist/types/modes/interactive-mode.d.ts +27 -3
- package/dist/types/modes/magic-keywords.d.ts +13 -1
- package/dist/types/modes/rpc/rpc-mode.d.ts +35 -1
- package/dist/types/modes/rpc/rpc-types.d.ts +9 -1
- package/dist/types/modes/runtime-init.d.ts +4 -0
- package/dist/types/modes/theme/theme.d.ts +13 -2
- package/dist/types/modes/types.d.ts +8 -2
- package/dist/types/modes/utils/ui-helpers.d.ts +1 -1
- package/dist/types/registry/agent-registry.d.ts +17 -0
- package/dist/types/secrets/obfuscator.d.ts +1 -1
- package/dist/types/session/agent-session.d.ts +14 -2
- package/dist/types/session/indexed-session-storage.d.ts +3 -4
- package/dist/types/session/session-context.d.ts +39 -0
- package/dist/types/session/session-entries.d.ts +159 -0
- package/dist/types/session/session-listing.d.ts +69 -0
- package/dist/types/session/session-loader.d.ts +16 -0
- package/dist/types/session/session-manager.d.ts +82 -474
- package/dist/types/session/session-migrations.d.ts +12 -0
- package/dist/types/session/session-paths.d.ts +25 -0
- package/dist/types/session/session-persistence.d.ts +8 -0
- package/dist/types/session/session-storage.d.ts +11 -12
- package/dist/types/session/snapcompact-inline.d.ts +12 -1
- package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
- package/dist/types/session/tool-choice-queue.d.ts +6 -6
- package/dist/types/stt/asr-client.d.ts +90 -0
- package/dist/types/stt/asr-protocol.d.ts +97 -0
- package/dist/types/stt/asr-worker.d.ts +2 -0
- package/dist/types/stt/downloader.d.ts +38 -0
- package/dist/types/stt/endpointer.d.ts +59 -0
- package/dist/types/stt/index.d.ts +5 -1
- package/dist/types/stt/models.d.ts +120 -0
- package/dist/types/stt/recorder.d.ts +17 -0
- package/dist/types/stt/stt-controller.d.ts +6 -0
- package/dist/types/stt/transcriber.d.ts +5 -7
- package/dist/types/stt/wav.d.ts +29 -0
- package/dist/types/system-prompt.d.ts +4 -0
- package/dist/types/task/executor.d.ts +2 -0
- package/dist/types/task/index.d.ts +9 -1
- package/dist/types/task/types.d.ts +36 -0
- package/dist/types/tools/bash.d.ts +2 -2
- package/dist/types/tools/eval-render.d.ts +1 -1
- package/dist/types/tools/index.d.ts +11 -1
- package/dist/types/tools/irc.d.ts +1 -0
- package/dist/types/tools/learn.d.ts +51 -0
- package/dist/types/tools/manage-skill.d.ts +40 -0
- package/dist/types/tools/plan-mode-guard.d.ts +10 -0
- package/dist/types/tools/renderers.d.ts +7 -11
- package/dist/types/tools/ssh.d.ts +1 -1
- package/dist/types/tools/todo.d.ts +1 -1
- package/dist/types/tools/tts.d.ts +25 -0
- package/dist/types/tools/write.d.ts +1 -1
- package/dist/types/tts/downloader.d.ts +20 -0
- package/dist/types/tts/index.d.ts +8 -0
- package/dist/types/tts/models.d.ts +82 -0
- package/dist/types/tts/player.d.ts +32 -0
- package/dist/types/tts/runtime.d.ts +6 -0
- package/dist/types/tts/streaming-player.d.ts +41 -0
- package/dist/types/tts/tts-client.d.ts +93 -0
- package/dist/types/tts/tts-protocol.d.ts +95 -0
- package/dist/types/tts/tts-worker.d.ts +2 -0
- package/dist/types/tts/vocalizer.d.ts +41 -0
- package/dist/types/tts/wav.d.ts +8 -0
- package/dist/types/utils/tool-choice.d.ts +8 -0
- package/dist/types/utils/tools-manager.d.ts +2 -1
- package/dist/types/utils/tools-manager.test.d.ts +1 -0
- package/dist/types/web/scrapers/github.d.ts +1 -1
- package/package.json +15 -14
- package/src/async/job-manager.ts +49 -0
- package/src/autolearn/controller.ts +139 -0
- package/src/autolearn/managed-skills.ts +257 -0
- package/src/autoresearch/state.ts +1 -1
- package/src/autoresearch/types.ts +1 -1
- package/src/cli/args.ts +56 -2
- package/src/cli/session-picker.ts +2 -1
- package/src/cli/setup-cli.ts +148 -47
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli-commands.ts +1 -0
- package/src/cli.ts +45 -13
- package/src/collab/host.ts +1 -1
- package/src/collab/protocol.ts +1 -1
- package/src/commands/say.ts +102 -0
- package/src/commands/setup.ts +1 -1
- package/src/commit/agentic/tools/analyze-file.ts +3 -0
- package/src/config/keybindings.ts +2 -2
- package/src/config/model-discovery.ts +11 -5
- package/src/config/model-registry.ts +64 -9
- package/src/config/models-config-schema.ts +4 -1
- package/src/config/models-config.ts +2 -1
- package/src/config/settings-schema.ts +248 -32
- package/src/config/settings.ts +10 -0
- package/src/discovery/builtin.ts +23 -1
- package/src/discovery/claude-plugins.ts +44 -5
- package/src/discovery/helpers.ts +41 -1
- package/src/eval/__tests__/budget-bridge.test.ts +1 -1
- package/src/eval/js/shared/prelude.txt +69 -17
- package/src/export/html/index.ts +3 -6
- package/src/extensibility/extensions/model-api.ts +41 -0
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +52 -1
- package/src/extensibility/extensions/wrapper.ts +41 -5
- package/src/extensibility/hooks/index.ts +2 -1
- package/src/extensibility/plugins/legacy-pi-compat.ts +43 -13
- package/src/extensibility/plugins/loader.ts +30 -19
- package/src/extensibility/plugins/manager.ts +221 -90
- package/src/extensibility/shared-events.ts +1 -1
- package/src/extensibility/skills.ts +96 -15
- package/src/goals/guided-setup.ts +133 -0
- package/src/goals/state.ts +1 -1
- package/src/hindsight/transcript.ts +1 -1
- package/src/index.ts +5 -0
- package/src/internal-urls/docs-index.generated.ts +10 -10
- package/src/internal-urls/history-protocol.ts +1 -1
- package/src/internal-urls/local-protocol.ts +29 -7
- package/src/main.ts +27 -7
- package/src/mcp/startup-events.ts +21 -0
- package/src/mcp/transports/stdio.ts +2 -1
- package/src/memories/index.ts +146 -11
- package/src/memory-backend/local-backend.ts +11 -5
- package/src/mnemopi/backend.ts +1 -0
- package/src/mnemopi/config.ts +26 -10
- package/src/modes/acp/acp-agent.ts +3 -5
- package/src/modes/components/agent-hub.ts +49 -4
- package/src/modes/components/assistant-message.ts +4 -37
- package/src/modes/components/compaction-summary-message.ts +125 -26
- package/src/modes/components/custom-editor.test.ts +96 -0
- package/src/modes/components/custom-editor.ts +164 -8
- package/src/modes/components/session-selector.ts +1 -1
- package/src/modes/components/settings-defs.ts +7 -0
- package/src/modes/components/tool-execution.ts +82 -43
- package/src/modes/components/transcript-container.ts +70 -1
- package/src/modes/components/tree-selector.ts +1 -1
- package/src/modes/components/usage-row.ts +18 -0
- package/src/modes/components/user-message.ts +4 -2
- package/src/modes/controllers/command-controller.ts +14 -4
- package/src/modes/controllers/event-controller.ts +78 -11
- package/src/modes/controllers/extension-ui-controller.ts +6 -0
- package/src/modes/controllers/input-controller.ts +258 -27
- package/src/modes/controllers/selector-controller.ts +12 -2
- package/src/modes/gradient-highlight.ts +21 -9
- package/src/modes/image-references.ts +20 -0
- package/src/modes/interactive-mode.ts +286 -40
- package/src/modes/magic-keywords.ts +27 -5
- package/src/modes/rpc/rpc-mode.ts +146 -14
- package/src/modes/rpc/rpc-subagents.ts +2 -2
- package/src/modes/rpc/rpc-types.ts +8 -2
- package/src/modes/runtime-init.ts +28 -3
- package/src/modes/theme/theme.ts +98 -50
- package/src/modes/types.ts +6 -2
- package/src/modes/utils/hotkeys-markdown.ts +1 -1
- package/src/modes/utils/ui-helpers.ts +34 -6
- package/src/priority.json +5 -1
- package/src/prompts/agents/task.md +1 -0
- package/src/prompts/goals/guided-goal-interview.md +8 -0
- package/src/prompts/goals/guided-goal-system.md +12 -0
- package/src/prompts/memories/read-path.md +6 -0
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge.md +3 -0
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +11 -6
- package/src/prompts/system/subagent-system-prompt.md +4 -0
- package/src/prompts/system/system-prompt.md +10 -5
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system-marker.md +16 -0
- package/src/prompts/tools/job.md +1 -0
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/task.md +3 -0
- package/src/registry/agent-registry.ts +30 -0
- package/src/sdk.ts +88 -24
- package/src/secrets/obfuscator.ts +1 -1
- package/src/session/agent-session.ts +209 -87
- package/src/session/history-storage.ts +2 -2
- package/src/session/indexed-session-storage.ts +7 -17
- package/src/session/session-context.ts +352 -0
- package/src/session/session-entries.ts +194 -0
- package/src/session/session-listing.ts +588 -0
- package/src/session/session-loader.ts +106 -0
- package/src/session/session-manager.ts +933 -3145
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +193 -0
- package/src/session/session-persistence.ts +131 -0
- package/src/session/session-storage.ts +91 -50
- package/src/session/snapcompact-inline.ts +21 -1
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/tool-choice-queue.ts +23 -11
- package/src/slash-commands/builtin-registry.ts +25 -3
- package/src/stt/asr-client.ts +520 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +790 -0
- package/src/stt/downloader.ts +107 -47
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +5 -1
- package/src/stt/models.ts +150 -0
- package/src/stt/recorder.ts +247 -60
- package/src/stt/stt-controller.ts +201 -22
- package/src/stt/transcriber.ts +37 -68
- package/src/stt/wav.ts +173 -0
- package/src/system-prompt.ts +8 -0
- package/src/task/agents.ts +1 -2
- package/src/task/executor.ts +49 -15
- package/src/task/index.ts +60 -6
- package/src/task/render.ts +83 -8
- package/src/task/types.ts +53 -0
- package/src/tools/ask.ts +8 -0
- package/src/tools/bash.ts +4 -3
- package/src/tools/eval-render.ts +4 -3
- package/src/tools/index.ts +40 -4
- package/src/tools/irc.ts +10 -2
- package/src/tools/job.ts +14 -2
- package/src/tools/learn.ts +144 -0
- package/src/tools/manage-skill.ts +104 -0
- package/src/tools/plan-mode-guard.ts +53 -19
- package/src/tools/renderers.ts +7 -11
- package/src/tools/ssh.ts +4 -3
- package/src/tools/todo.ts +1 -1
- package/src/tools/tts.ts +203 -92
- package/src/tools/write.ts +18 -2
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +8 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/player.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/streaming-player.ts +266 -0
- package/src/tts/tts-client.ts +647 -0
- package/src/tts/tts-protocol.ts +60 -0
- package/src/tts/tts-worker.ts +497 -0
- package/src/tts/vocalizer.ts +162 -0
- package/src/tts/wav.ts +58 -0
- package/src/utils/title-generator.ts +48 -5
- package/src/utils/tool-choice.ts +16 -0
- package/src/utils/tools-manager.test.ts +25 -0
- package/src/utils/tools-manager.ts +19 -1
- package/src/web/scrapers/github.ts +96 -0
- package/src/web/search/index.ts +13 -0
- package/src/web/search/providers/searxng.ts +13 -1
- package/dist/types/stt/setup.d.ts +0 -18
- package/src/stt/setup.ts +0 -52
- 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
|
-
*
|
|
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
|
-
*
|
|
14
|
-
*
|
|
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:
|
|
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:
|
|
143
|
+
provisionalPendingPreview: string;
|
|
144
144
|
};
|
|
145
145
|
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?: () =>
|
|
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;
|
|
@@ -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
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
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>;
|
|
@@ -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-
|
|
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,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;
|