@oh-my-pi/pi-coding-agent 15.12.3 → 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 +347 -7
- package/dist/cli.js +1615 -1231
- 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/tools/init-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/log-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/run-experiment.d.ts +1 -1
- package/dist/types/autoresearch/tools/update-notes.d.ts +1 -1
- package/dist/types/autoresearch/types.d.ts +1 -1
- package/dist/types/cli/args.d.ts +19 -2
- package/dist/types/cli/models-cli.d.ts +49 -0
- 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/launch.d.ts +0 -3
- package/dist/types/commands/models.d.ts +33 -0
- package/dist/types/commands/say.d.ts +24 -0
- package/dist/types/commands/token.d.ts +25 -0
- package/dist/types/commit/agentic/tools/analyze-file.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-file-diff.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-hunk.d.ts +1 -1
- package/dist/types/commit/agentic/tools/git-overview.d.ts +1 -1
- package/dist/types/commit/agentic/tools/propose-changelog.d.ts +1 -1
- package/dist/types/commit/agentic/tools/propose-commit.d.ts +1 -1
- package/dist/types/commit/agentic/tools/recent-commits.d.ts +1 -1
- package/dist/types/commit/agentic/tools/schemas.d.ts +1 -1
- package/dist/types/commit/agentic/tools/split-commit.d.ts +1 -1
- package/dist/types/commit/changelog/generate.d.ts +1 -1
- package/dist/types/commit/shared-llm.d.ts +1 -1
- package/dist/types/config/keybindings.d.ts +3 -3
- package/dist/types/config/model-registry.d.ts +17 -0
- package/dist/types/config/models-config-schema.d.ts +13 -1
- package/dist/types/config/models-config.d.ts +8 -2
- package/dist/types/config/settings-schema.d.ts +281 -58
- package/dist/types/edit/hashline/params.d.ts +1 -1
- package/dist/types/edit/modes/apply-patch.d.ts +1 -1
- package/dist/types/edit/modes/patch.d.ts +1 -1
- package/dist/types/edit/modes/replace.d.ts +1 -1
- package/dist/types/export/html/index.d.ts +2 -1
- package/dist/types/extensibility/custom-commands/types.d.ts +2 -2
- package/dist/types/extensibility/custom-tools/types.d.ts +2 -2
- 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 +49 -3
- package/dist/types/extensibility/hooks/index.d.ts +2 -1
- package/dist/types/extensibility/hooks/types.d.ts +2 -2
- 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/goals/tools/goal-tool.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/lsp/types.d.ts +1 -1
- package/dist/types/main.d.ts +4 -3
- package/dist/types/mcp/manager.d.ts +8 -0
- 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 +28 -0
- package/dist/types/modes/acp/acp-agent.d.ts +1 -2
- 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/index.d.ts +1 -0
- package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
- package/dist/types/modes/components/session-selector.d.ts +1 -1
- package/dist/types/modes/components/status-line/component.d.ts +9 -5
- package/dist/types/modes/components/status-line/types.d.ts +2 -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/event-controller.d.ts +0 -17
- 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 -6
- 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 -7
- 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 +28 -35
- package/dist/types/session/agent-storage.d.ts +2 -1
- package/dist/types/session/indexed-session-storage.d.ts +3 -3
- package/dist/types/session/messages.d.ts +8 -10
- 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 +85 -462
- 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 -7
- 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/slash-commands/helpers/logout.d.ts +15 -0
- 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 +37 -1
- package/dist/types/tools/ask.d.ts +1 -1
- package/dist/types/tools/ast-edit.d.ts +1 -1
- package/dist/types/tools/ast-grep.d.ts +1 -1
- package/dist/types/tools/bash.d.ts +3 -3
- package/dist/types/tools/browser/cmux/cmux-tab.d.ts +202 -0
- package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
- package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
- package/dist/types/tools/browser/registry.d.ts +16 -3
- package/dist/types/tools/browser/render.d.ts +2 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +2 -0
- package/dist/types/tools/browser/tab-supervisor.d.ts +16 -4
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/checkpoint.d.ts +1 -1
- package/dist/types/tools/debug.d.ts +1 -1
- package/dist/types/tools/eval-render.d.ts +1 -1
- package/dist/types/tools/eval.d.ts +1 -1
- package/dist/types/tools/find.d.ts +1 -1
- package/dist/types/tools/gh.d.ts +1 -1
- package/dist/types/tools/image-gen.d.ts +1 -1
- package/dist/types/tools/index.d.ts +14 -2
- package/dist/types/tools/inspect-image.d.ts +1 -1
- package/dist/types/tools/irc.d.ts +2 -1
- package/dist/types/tools/job.d.ts +1 -1
- package/dist/types/tools/learn.d.ts +51 -0
- package/dist/types/tools/manage-skill.d.ts +40 -0
- package/dist/types/tools/memory-edit.d.ts +1 -1
- package/dist/types/tools/memory-recall.d.ts +1 -1
- package/dist/types/tools/memory-reflect.d.ts +1 -1
- package/dist/types/tools/memory-retain.d.ts +1 -1
- package/dist/types/tools/plan-mode-guard.d.ts +10 -0
- package/dist/types/tools/read.d.ts +1 -1
- package/dist/types/tools/render-mermaid.d.ts +1 -1
- package/dist/types/tools/renderers.d.ts +7 -11
- package/dist/types/tools/resolve.d.ts +1 -1
- package/dist/types/tools/review.d.ts +1 -1
- package/dist/types/tools/search-tool-bm25.d.ts +1 -1
- package/dist/types/tools/search.d.ts +1 -1
- package/dist/types/tools/ssh.d.ts +2 -2
- package/dist/types/tools/todo.d.ts +2 -2
- package/dist/types/tools/tts.d.ts +26 -1
- package/dist/types/tools/write.d.ts +2 -2
- 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/clipboard.d.ts +4 -3
- package/dist/types/utils/image-loading.d.ts +18 -1
- package/dist/types/utils/thinking-display.d.ts +17 -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/dist/types/web/search/index.d.ts +1 -1
- package/package.json +17 -16
- 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/storage.ts +2 -1
- package/src/autoresearch/tools/init-experiment.ts +1 -1
- package/src/autoresearch/tools/log-experiment.ts +1 -1
- package/src/autoresearch/tools/run-experiment.ts +1 -1
- package/src/autoresearch/tools/update-notes.ts +1 -1
- package/src/autoresearch/types.ts +1 -1
- package/src/cli/args.ts +56 -10
- package/src/cli/auth-gateway-cli.ts +1 -1
- package/src/cli/bench-cli.ts +1 -1
- package/src/cli/dry-balance-cli.ts +1 -1
- package/src/cli/models-cli.ts +427 -0
- 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 +3 -0
- package/src/cli.ts +45 -13
- package/src/collab/host.ts +10 -13
- package/src/collab/protocol.ts +1 -1
- package/src/commands/launch.ts +0 -3
- package/src/commands/models.ts +61 -0
- package/src/commands/say.ts +102 -0
- package/src/commands/setup.ts +1 -1
- package/src/commands/token.ts +89 -0
- package/src/commit/agentic/tools/analyze-file.ts +4 -1
- package/src/commit/agentic/tools/git-file-diff.ts +1 -1
- package/src/commit/agentic/tools/git-hunk.ts +1 -1
- package/src/commit/agentic/tools/git-overview.ts +1 -1
- package/src/commit/agentic/tools/propose-changelog.ts +1 -1
- package/src/commit/agentic/tools/propose-commit.ts +1 -1
- package/src/commit/agentic/tools/recent-commits.ts +1 -1
- package/src/commit/agentic/tools/schemas.ts +1 -1
- package/src/commit/agentic/tools/split-commit.ts +1 -1
- package/src/commit/analysis/summary.ts +1 -1
- package/src/commit/changelog/generate.ts +1 -1
- package/src/commit/shared-llm.ts +1 -1
- package/src/config/keybindings.ts +2 -2
- package/src/config/model-discovery.ts +11 -5
- package/src/config/model-registry.ts +79 -21
- package/src/config/model-resolver.ts +2 -2
- package/src/config/models-config-schema.ts +5 -2
- package/src/config/models-config.ts +2 -1
- package/src/config/settings-schema.ts +266 -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/edit/hashline/params.ts +1 -1
- package/src/edit/modes/apply-patch.ts +1 -1
- package/src/edit/modes/patch.ts +1 -1
- package/src/edit/modes/replace.ts +1 -1
- package/src/eval/__tests__/budget-bridge.test.ts +1 -1
- package/src/eval/agent-bridge.ts +1 -1
- package/src/eval/completion-bridge.ts +1 -1
- package/src/eval/js/shared/prelude.txt +69 -17
- package/src/export/html/index.ts +3 -6
- package/src/export/html/template.js +24 -2
- package/src/export/html/tool-views.generated.js +2 -2
- package/src/extensibility/custom-commands/loader.ts +1 -1
- package/src/extensibility/custom-commands/types.ts +2 -2
- package/src/extensibility/custom-tools/loader.ts +1 -1
- package/src/extensibility/custom-tools/types.ts +2 -2
- package/src/extensibility/extensions/loader.ts +2 -2
- package/src/extensibility/extensions/model-api.ts +41 -0
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +54 -3
- package/src/extensibility/extensions/wrapper.ts +41 -5
- package/src/extensibility/hooks/index.ts +2 -1
- package/src/extensibility/hooks/loader.ts +1 -1
- package/src/extensibility/hooks/types.ts +2 -2
- 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 +101 -5
- package/src/goals/guided-setup.ts +133 -0
- package/src/goals/state.ts +1 -1
- package/src/goals/tools/goal-tool.ts +1 -1
- package/src/hindsight/transcript.ts +1 -1
- package/src/index.ts +5 -0
- package/src/internal-urls/docs-index.generated.ts +13 -10
- package/src/internal-urls/history-protocol.ts +1 -1
- package/src/internal-urls/local-protocol.ts +29 -7
- package/src/lsp/types.ts +1 -1
- package/src/main.ts +27 -32
- package/src/mcp/config-writer.ts +7 -3
- package/src/mcp/manager.ts +11 -0
- package/src/mcp/startup-events.ts +21 -0
- package/src/mcp/transports/stdio.ts +2 -1
- package/src/memories/index.ts +149 -12
- package/src/memories/storage.ts +2 -1
- package/src/memory-backend/local-backend.ts +11 -5
- package/src/mnemopi/backend.ts +1 -0
- package/src/mnemopi/config.ts +112 -12
- package/src/modes/acp/acp-agent.ts +8 -53
- package/src/modes/acp/acp-event-mapper.ts +5 -1
- package/src/modes/components/agent-hub.ts +51 -5
- package/src/modes/components/assistant-message.ts +12 -44
- 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/index.ts +1 -0
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +1 -1
- package/src/modes/components/model-selector.ts +2 -2
- package/src/modes/components/session-selector.ts +1 -1
- package/src/modes/components/settings-defs.ts +7 -0
- package/src/modes/components/status-line/component.ts +54 -157
- package/src/modes/components/status-line/segments.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -1
- 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 -16
- package/src/modes/controllers/event-controller.ts +101 -73
- package/src/modes/controllers/extension-ui-controller.ts +6 -0
- package/src/modes/controllers/input-controller.ts +311 -57
- package/src/modes/controllers/mcp-command-controller.ts +44 -3
- package/src/modes/controllers/selector-controller.ts +68 -12
- package/src/modes/controllers/streaming-reveal.ts +4 -3
- package/src/modes/gradient-highlight.ts +21 -9
- package/src/modes/image-references.ts +20 -0
- package/src/modes/interactive-mode.ts +288 -48
- 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 +99 -51
- package/src/modes/types.ts +6 -7
- package/src/modes/utils/hotkeys-markdown.ts +1 -1
- package/src/modes/utils/ui-helpers.ts +36 -7
- 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/empty-stop-retry.md +4 -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 +103 -43
- package/src/secrets/obfuscator.ts +1 -1
- package/src/session/agent-session.ts +331 -318
- package/src/session/agent-storage.ts +18 -9
- package/src/session/history-storage.ts +3 -2
- package/src/session/indexed-session-storage.ts +7 -10
- package/src/session/messages.ts +9 -11
- package/src/session/session-context.ts +352 -0
- package/src/session/session-dump-format.ts +4 -2
- 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 +968 -3064
- 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 -30
- 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 +40 -4
- package/src/slash-commands/helpers/logout.ts +88 -0
- 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 +54 -1
- package/src/tools/ask.ts +9 -1
- package/src/tools/ast-edit.ts +1 -1
- package/src/tools/ast-grep.ts +1 -1
- package/src/tools/bash.ts +5 -4
- package/src/tools/browser/cmux/cmux-tab.ts +1264 -0
- package/src/tools/browser/cmux/rpc.ts +156 -0
- package/src/tools/browser/cmux/socket-client.ts +309 -0
- package/src/tools/browser/registry.ts +37 -3
- package/src/tools/browser/render.ts +6 -1
- package/src/tools/browser/tab-protocol.ts +2 -0
- package/src/tools/browser/tab-supervisor.ts +189 -18
- package/src/tools/browser/tab-worker.ts +1 -1
- package/src/tools/browser.ts +16 -1
- package/src/tools/checkpoint.ts +1 -1
- package/src/tools/debug.ts +1 -1
- package/src/tools/eval-render.ts +4 -3
- package/src/tools/eval.ts +11 -6
- package/src/tools/fetch.ts +13 -2
- package/src/tools/find.ts +1 -1
- package/src/tools/gh.ts +1 -1
- package/src/tools/github-cache.ts +2 -1
- package/src/tools/image-gen.ts +1 -1
- package/src/tools/index.ts +43 -5
- package/src/tools/inspect-image.ts +3 -1
- package/src/tools/irc.ts +11 -3
- package/src/tools/job.ts +15 -3
- package/src/tools/learn.ts +144 -0
- package/src/tools/manage-skill.ts +104 -0
- package/src/tools/memory-edit.ts +1 -1
- package/src/tools/memory-recall.ts +1 -1
- package/src/tools/memory-reflect.ts +1 -1
- package/src/tools/memory-retain.ts +1 -1
- package/src/tools/plan-mode-guard.ts +53 -19
- package/src/tools/read.ts +8 -2
- package/src/tools/render-mermaid.ts +1 -1
- package/src/tools/renderers.ts +7 -11
- package/src/tools/report-tool-issue.ts +3 -2
- package/src/tools/resolve.ts +1 -1
- package/src/tools/review.ts +1 -1
- package/src/tools/search-tool-bm25.ts +1 -1
- package/src/tools/search.ts +1 -1
- package/src/tools/ssh.ts +5 -4
- package/src/tools/todo.ts +2 -2
- package/src/tools/tts.ts +204 -93
- package/src/tools/write.ts +19 -3
- 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/clipboard.ts +35 -18
- package/src/utils/image-loading.ts +35 -4
- package/src/utils/thinking-display.ts +37 -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 +14 -1
- package/src/web/search/providers/searxng.ts +13 -1
- package/dist/types/cli/list-models.d.ts +0 -30
- package/dist/types/stt/setup.d.ts +0 -18
- package/src/cli/list-models.ts +0 -194
- package/src/stt/setup.ts +0 -52
- package/src/stt/transcribe.py +0 -70
|
@@ -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;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface PlayerCommand {
|
|
2
|
+
cmd: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
}
|
|
5
|
+
/** Injection seam for {@link playerCommandsFor} — defaults to real PATH/tools lookups. */
|
|
6
|
+
export interface PlayerLookup {
|
|
7
|
+
which?: (bin: string) => string | null;
|
|
8
|
+
ffmpeg?: () => string | null;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Build the ordered list of playback commands to try for `filePath` on the
|
|
12
|
+
* given platform. Pure + injectable so the selection logic is testable without
|
|
13
|
+
* spawning anything.
|
|
14
|
+
*
|
|
15
|
+
* - darwin: `afplay` (always present on macOS).
|
|
16
|
+
* - win32: PowerShell `Media.SoundPlayer.PlaySync()` (no extra deps).
|
|
17
|
+
* - linux/other POSIX: `paplay` (PulseAudio) → `aplay` (ALSA) → the bundled
|
|
18
|
+
* static `ffmpeg` (`-f pulse` then `-f alsa`). Empty result means nothing is
|
|
19
|
+
* available and the caller should surface an install hint.
|
|
20
|
+
*/
|
|
21
|
+
export declare function playerCommandsFor(platform: NodeJS.Platform, filePath: string, lookup?: PlayerLookup): PlayerCommand[];
|
|
22
|
+
export interface PlayAudioOptions {
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Play `filePath` through the speakers, trying each candidate command in order
|
|
27
|
+
* and returning on the first clean exit. Throws an actionable Error if no
|
|
28
|
+
* player exists or every candidate fails (with the collected stderr).
|
|
29
|
+
*/
|
|
30
|
+
export declare function playAudioFile(filePath: string, options?: PlayAudioOptions): Promise<void>;
|
|
31
|
+
/** Best-effort temp-file cleanup used by callers after playback. */
|
|
32
|
+
export declare function removeTempFile(filePath: string): Promise<void>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const KOKORO_PACKAGE = "kokoro-js";
|
|
2
|
+
export declare const KOKORO_VERSION = "1.2.1";
|
|
3
|
+
export declare const ONNXRUNTIME_NODE_PACKAGE = "onnxruntime-node";
|
|
4
|
+
export declare const ONNXRUNTIME_NODE_VERSION = "1.26.0";
|
|
5
|
+
export declare function getTtsRuntimeDir(): string;
|
|
6
|
+
export declare function isTtsRuntimeCached(): Promise<boolean>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type PlayerCommand } from "./player";
|
|
2
|
+
/** Output gain applied while ducked (the user is speaking over the assistant). */
|
|
3
|
+
export declare const DUCK_GAIN = 0.25;
|
|
4
|
+
/** Injection seam for {@link streamingPlayerCommandsFor} — defaults to real PATH/tools lookups. */
|
|
5
|
+
export interface StreamingPlayerLookup {
|
|
6
|
+
which?: (bin: string) => string | null;
|
|
7
|
+
ffmpeg?: () => string | null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Ordered candidate commands for a persistent raw-PCM player on `platform`: each
|
|
11
|
+
* reads 32-bit-float little-endian mono PCM at `sampleRate` from stdin (`pipe:0`)
|
|
12
|
+
* and plays it to the default output device. An empty list means no streaming
|
|
13
|
+
* backend is available and the caller should fall back to per-file playback.
|
|
14
|
+
*
|
|
15
|
+
* - darwin: none; `afplay` is file-only, so macOS uses the interruptible
|
|
16
|
+
* per-file fallback.
|
|
17
|
+
* - linux/other POSIX: `ffmpeg` (`-f pulse` then `-f alsa`) → `paplay`/`aplay`
|
|
18
|
+
* raw fallbacks.
|
|
19
|
+
* - win32: none (PowerShell `SoundPlayer` is file-only).
|
|
20
|
+
*/
|
|
21
|
+
export declare function streamingPlayerCommandsFor(platform: NodeJS.Platform, sampleRate: number, lookup?: StreamingPlayerLookup): PlayerCommand[];
|
|
22
|
+
/**
|
|
23
|
+
* Single-session gapless player. Lifecycle: {@link start} once, {@link write}
|
|
24
|
+
* chunks in order, then {@link end} to drain or {@link stop} to abort. Not
|
|
25
|
+
* reusable after stop/end — create a new instance per utterance.
|
|
26
|
+
*/
|
|
27
|
+
export declare class StreamingAudioPlayer {
|
|
28
|
+
#private;
|
|
29
|
+
/** Pick a backend and begin draining. Idempotent; the first call's rate wins. */
|
|
30
|
+
start(sampleRate: number): void;
|
|
31
|
+
/** Queue a mono float32 PCM chunk for playback in arrival order. */
|
|
32
|
+
write(pcm: Float32Array): void;
|
|
33
|
+
/** Scale subsequent output (1 = normal, <1 = ducked). Applies within {@link LEAD_SECONDS}. */
|
|
34
|
+
setGain(gain: number): void;
|
|
35
|
+
/** Close the input; resolves once all queued audio has finished playing. */
|
|
36
|
+
end(): Promise<void>;
|
|
37
|
+
/** Stop immediately: kill the player, drop everything still queued. */
|
|
38
|
+
stop(): void;
|
|
39
|
+
}
|
|
40
|
+
/** Factory the vocalizer calls; a function so tests can stub it without spawning a player. */
|
|
41
|
+
export declare function createStreamingPlayer(): StreamingAudioPlayer;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Subprocess } from "bun";
|
|
2
|
+
import type { TtsProgressEvent, TtsWorkerInbound, TtsWorkerOutbound } from "./tts-protocol";
|
|
3
|
+
/** Decoded PCM returned by a local synthesis request. */
|
|
4
|
+
export interface TtsAudio {
|
|
5
|
+
pcm: Float32Array;
|
|
6
|
+
sampleRate: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Abstraction over the TTS subprocess. The runtime implementation is a Bun child
|
|
10
|
+
* process so `onnxruntime-node`'s NAPI finalizer never runs inside the main agent
|
|
11
|
+
* address space — that destructor segfaults Bun during shutdown (issue #1606).
|
|
12
|
+
*/
|
|
13
|
+
interface WorkerHandle {
|
|
14
|
+
send(message: TtsWorkerInbound): void;
|
|
15
|
+
onMessage(handler: (message: TtsWorkerOutbound) => void): () => void;
|
|
16
|
+
onError(handler: (error: Error) => void): () => void;
|
|
17
|
+
/** Re-reference the subprocess so a pending request keeps the parent event loop alive. */
|
|
18
|
+
ref(): void;
|
|
19
|
+
/** Drop the reference once the worker is idle so it never blocks process exit. */
|
|
20
|
+
unref(): void;
|
|
21
|
+
terminate(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export interface TtsSynthesizeOptions {
|
|
24
|
+
voice?: string;
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
}
|
|
27
|
+
export interface TtsDownloadOptions {
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
onProgress?: (event: TtsProgressEvent) => void;
|
|
30
|
+
}
|
|
31
|
+
export interface TtsStreamOptions {
|
|
32
|
+
voice?: string;
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
}
|
|
35
|
+
/** One synthesized sentence of a streaming session, in emission order. */
|
|
36
|
+
export interface TtsAudioChunk {
|
|
37
|
+
index: number;
|
|
38
|
+
text: string;
|
|
39
|
+
pcm: Float32Array;
|
|
40
|
+
sampleRate: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A live streaming-synthesis session. Feed text incrementally with {@link push}
|
|
44
|
+
* and close the input with {@link end}; `chunks` yields each synthesized
|
|
45
|
+
* sentence's audio as soon as it is ready, then completes once the worker
|
|
46
|
+
* finishes draining the closed input.
|
|
47
|
+
*/
|
|
48
|
+
export interface TtsStreamHandle {
|
|
49
|
+
push(text: string): void;
|
|
50
|
+
end(): void;
|
|
51
|
+
chunks: AsyncIterableIterator<TtsAudioChunk>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Hidden subcommand on the main CLI that boots the TTS worker in the spawned
|
|
55
|
+
* subprocess. Kept in sync with the dispatch in `cli.ts` (Main-owned).
|
|
56
|
+
*/
|
|
57
|
+
export declare const TTS_WORKER_ARG = "__omp_tts_worker";
|
|
58
|
+
interface SpawnedSubprocess {
|
|
59
|
+
proc: Subprocess<"ignore", "ignore", "ignore">;
|
|
60
|
+
inbound: Set<(message: TtsWorkerOutbound) => void>;
|
|
61
|
+
errors: Set<(error: Error) => void>;
|
|
62
|
+
/** Flipped to `true` right before the deliberate SIGKILL so `onExit` can tell it apart from a crash. */
|
|
63
|
+
intentionalExit: {
|
|
64
|
+
value: boolean;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Spawn the TTS worker as a subprocess. Exported for tests and the smoke probe;
|
|
69
|
+
* production callers go through {@link spawnTtsWorker}.
|
|
70
|
+
*/
|
|
71
|
+
export declare function createTtsSubprocess(): SpawnedSubprocess;
|
|
72
|
+
export declare class TtsClient {
|
|
73
|
+
#private;
|
|
74
|
+
constructor(spawnWorker?: () => WorkerHandle);
|
|
75
|
+
onProgress(listener: (event: TtsProgressEvent) => void): () => void;
|
|
76
|
+
synthesize(modelKey: string, text: string, options?: TtsSynthesizeOptions): Promise<TtsAudio | null>;
|
|
77
|
+
/**
|
|
78
|
+
* Open a streaming-synthesis session. Text is fed incrementally through the
|
|
79
|
+
* returned handle's `push`/`end`; audio is emitted one synthesized sentence at
|
|
80
|
+
* a time via `chunks`, so playback can begin before the full text is known.
|
|
81
|
+
* Returns an inert handle (immediately-ended `chunks`) for unknown models or
|
|
82
|
+
* an already-aborted signal, and fails the iterator if the worker cannot spawn.
|
|
83
|
+
*/
|
|
84
|
+
synthesizeStream(modelKey: string, options?: TtsStreamOptions): TtsStreamHandle;
|
|
85
|
+
downloadModel(modelKey: string, options?: TtsDownloadOptions): Promise<boolean>;
|
|
86
|
+
terminate(): Promise<void>;
|
|
87
|
+
}
|
|
88
|
+
export declare const ttsClient: TtsClient;
|
|
89
|
+
export declare function shutdownTtsClient(): Promise<void>;
|
|
90
|
+
export declare function smokeTestTtsWorker({ timeoutMs, }?: {
|
|
91
|
+
timeoutMs?: number;
|
|
92
|
+
}): Promise<void>;
|
|
93
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { TtsLocalModelKey } from "./models";
|
|
2
|
+
export type TtsProgressStatus = "initiate" | "download" | "progress" | "progress_total" | "done" | "ready" | "error";
|
|
3
|
+
export interface TtsProgressFileState {
|
|
4
|
+
loaded: number;
|
|
5
|
+
total: number;
|
|
6
|
+
}
|
|
7
|
+
export interface TtsProgressEvent {
|
|
8
|
+
modelKey: TtsLocalModelKey;
|
|
9
|
+
status: TtsProgressStatus;
|
|
10
|
+
name?: string;
|
|
11
|
+
file?: string;
|
|
12
|
+
progress?: number;
|
|
13
|
+
loaded?: number;
|
|
14
|
+
total?: number;
|
|
15
|
+
files?: Record<string, TtsProgressFileState>;
|
|
16
|
+
task?: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
}
|
|
19
|
+
export type TtsWorkerInbound = {
|
|
20
|
+
type: "ping";
|
|
21
|
+
id: string;
|
|
22
|
+
} | {
|
|
23
|
+
type: "synthesize";
|
|
24
|
+
id: string;
|
|
25
|
+
modelKey: TtsLocalModelKey;
|
|
26
|
+
text: string;
|
|
27
|
+
voice?: string;
|
|
28
|
+
} | {
|
|
29
|
+
type: "download";
|
|
30
|
+
id: string;
|
|
31
|
+
modelKey: TtsLocalModelKey;
|
|
32
|
+
} | {
|
|
33
|
+
type: "stream-start";
|
|
34
|
+
id: string;
|
|
35
|
+
modelKey: TtsLocalModelKey;
|
|
36
|
+
voice?: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: "stream-push";
|
|
39
|
+
id: string;
|
|
40
|
+
text: string;
|
|
41
|
+
} | {
|
|
42
|
+
type: "stream-end";
|
|
43
|
+
id: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: "stream-cancel";
|
|
46
|
+
id: string;
|
|
47
|
+
};
|
|
48
|
+
export type TtsWorkerOutbound = {
|
|
49
|
+
type: "pong";
|
|
50
|
+
id: string;
|
|
51
|
+
} | {
|
|
52
|
+
type: "audio";
|
|
53
|
+
id: string;
|
|
54
|
+
pcm: Float32Array;
|
|
55
|
+
sampleRate: number;
|
|
56
|
+
} | {
|
|
57
|
+
type: "downloaded";
|
|
58
|
+
id: string;
|
|
59
|
+
} | {
|
|
60
|
+
type: "error";
|
|
61
|
+
id: string;
|
|
62
|
+
error: string;
|
|
63
|
+
} | {
|
|
64
|
+
type: "progress";
|
|
65
|
+
id: string;
|
|
66
|
+
event: TtsProgressEvent;
|
|
67
|
+
} | {
|
|
68
|
+
type: "log";
|
|
69
|
+
level: "debug" | "warn" | "error";
|
|
70
|
+
msg: string;
|
|
71
|
+
meta?: Record<string, unknown>;
|
|
72
|
+
} | {
|
|
73
|
+
type: "audio-chunk";
|
|
74
|
+
id: string;
|
|
75
|
+
index: number;
|
|
76
|
+
text: string;
|
|
77
|
+
pcm: Float32Array;
|
|
78
|
+
sampleRate: number;
|
|
79
|
+
} | {
|
|
80
|
+
type: "stream-done";
|
|
81
|
+
id: string;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Wire transport between the parent (`TtsClient`) and the local TTS subprocess.
|
|
85
|
+
* The parent owns the subprocess lifecycle (graceful work, hard SIGKILL on
|
|
86
|
+
* shutdown); the protocol carries no explicit close handshake — once the parent
|
|
87
|
+
* decides to terminate, it signals the OS to reap the child so
|
|
88
|
+
* `onnxruntime-node`'s NAPI finalizer never runs in the main agent address
|
|
89
|
+
* space (it segfaults Bun on shutdown — issue #1606). See `tts-client.ts` for
|
|
90
|
+
* the spawn/kill glue.
|
|
91
|
+
*/
|
|
92
|
+
export interface TtsTransport {
|
|
93
|
+
send(message: TtsWorkerOutbound): void;
|
|
94
|
+
onMessage(handler: (message: TtsWorkerInbound) => void): () => void;
|
|
95
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface VocalizerPlayer {
|
|
2
|
+
start(sampleRate: number): void;
|
|
3
|
+
write(pcm: Float32Array): void;
|
|
4
|
+
setGain(gain: number): void;
|
|
5
|
+
end(): Promise<void>;
|
|
6
|
+
stop(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare class Vocalizer {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(createPlayer?: () => VocalizerPlayer);
|
|
11
|
+
/**
|
|
12
|
+
* Stream a delta of assistant text into the engine. No-op when vocalization
|
|
13
|
+
* is disabled. The engine buffers the running text and emits audio for each
|
|
14
|
+
* complete sentence; the trailing partial is flushed by {@link flush}.
|
|
15
|
+
*/
|
|
16
|
+
pushDelta(text: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Close the current input stream (call at message/turn end). The engine
|
|
19
|
+
* flushes its trailing partial as a final chunk; the player keeps draining
|
|
20
|
+
* queued audio until it completes.
|
|
21
|
+
*/
|
|
22
|
+
flush(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Speak a complete piece of text in one shot (ask questions, yield-mode final
|
|
25
|
+
* message): stream it in and immediately close the input. No-op when disabled.
|
|
26
|
+
*/
|
|
27
|
+
speak(text: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Interrupt and drop the current session, killing in-flight playback and
|
|
30
|
+
* synthesis (new turn / user message / Esc interrupt). Audio stops at once.
|
|
31
|
+
*/
|
|
32
|
+
clear(): void;
|
|
33
|
+
/** Lower the volume while the user is speaking (push-to-talk), so speech doesn't drown them out. */
|
|
34
|
+
duck(): void;
|
|
35
|
+
/** Restore full volume once the user stops speaking. */
|
|
36
|
+
unduck(): void;
|
|
37
|
+
/** Resolve once the playback chain has drained (tests / shutdown). */
|
|
38
|
+
idle(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/** Process-level vocalizer shared by the event controller and the ask tool. */
|
|
41
|
+
export declare const vocalizer: Vocalizer;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble a mono PCM16 WAV byte buffer from Float32 PCM samples (the shape
|
|
3
|
+
* transformers.js `RawAudio` emits: normalized [-1, 1] amplitudes plus a sample
|
|
4
|
+
* rate). No external encoder is involved — we write a canonical 44-byte RIFF/
|
|
5
|
+
* WAVE header followed by little-endian signed 16-bit samples. Samples are
|
|
6
|
+
* clamped before quantization so out-of-range float values do not wrap.
|
|
7
|
+
*/
|
|
8
|
+
export declare function encodeWav(samples: Float32Array, sampleRate: number): Uint8Array;
|
|
@@ -13,9 +13,10 @@ export declare function copyToClipboard(text: string): Promise<void>;
|
|
|
13
13
|
* Read an image from the system clipboard.
|
|
14
14
|
*
|
|
15
15
|
* Returns null on Termux (no image clipboard support) or when no display
|
|
16
|
-
* server is available (headless/SSH without forwarding). Under
|
|
17
|
-
* Windows clipboard is reached through `powershell.exe
|
|
18
|
-
*
|
|
16
|
+
* server is available (headless/SSH without forwarding). Under native Windows
|
|
17
|
+
* and WSL, the Windows clipboard is also reached through `powershell.exe`
|
|
18
|
+
* because terminal clipboard paths can leave image payloads invisible to the
|
|
19
|
+
* native bridge.
|
|
19
20
|
*
|
|
20
21
|
* @returns PNG payload or null when no image is available.
|
|
21
22
|
*/
|
|
@@ -1,7 +1,20 @@
|
|
|
1
|
-
import type { ImageContent } from "@oh-my-pi/pi-ai";
|
|
1
|
+
import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
|
|
2
2
|
import { type ImageResizeOptions } from "./image-resize";
|
|
3
3
|
export declare const MAX_IMAGE_INPUT_BYTES: number;
|
|
4
4
|
export declare const SUPPORTED_INPUT_IMAGE_MIME_TYPES: Set<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Ollama and its local-backend family decode image input through llama.cpp /
|
|
7
|
+
* `stb_image`, which is compiled without WebP support, so a WebP upload fails
|
|
8
|
+
* with an opaque HTTP 400. Detect those models so the resize pipeline encodes
|
|
9
|
+
* to PNG/JPEG instead — the automatic equivalent of `OMP_NO_WEBP=1`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function modelLacksWebpSupport(model: Pick<Model, "provider" | "api"> | undefined): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* `true` when `model` cannot decode WebP, otherwise `undefined` so the
|
|
14
|
+
* `OMP_NO_WEBP` env fallback in {@link resizeImage} still applies. Feed straight
|
|
15
|
+
* into {@link ImageResizeOptions.excludeWebP}.
|
|
16
|
+
*/
|
|
17
|
+
export declare function webpExclusionForModel(model: Pick<Model, "provider" | "api"> | undefined): true | undefined;
|
|
5
18
|
export interface LoadImageInputOptions {
|
|
6
19
|
path: string;
|
|
7
20
|
cwd: string;
|
|
@@ -9,6 +22,8 @@ export interface LoadImageInputOptions {
|
|
|
9
22
|
maxBytes?: number;
|
|
10
23
|
resolvedPath?: string;
|
|
11
24
|
detectedMimeType?: string;
|
|
25
|
+
/** Force non-WebP output (e.g. for Ollama). Leave unset to honor `OMP_NO_WEBP`. */
|
|
26
|
+
excludeWebP?: boolean;
|
|
12
27
|
}
|
|
13
28
|
export interface LoadedImageInput {
|
|
14
29
|
resolvedPath: string;
|
|
@@ -25,6 +40,8 @@ export declare class ImageInputTooLargeError extends Error {
|
|
|
25
40
|
}
|
|
26
41
|
export declare function ensureSupportedImageInput(image: ImageContent): Promise<ImageContent | null>;
|
|
27
42
|
export interface NormalizeModelContextImagesOptions {
|
|
43
|
+
/** Model the images are bound for; used to derive encoder constraints (WebP exclusion for Ollama). */
|
|
44
|
+
model?: Model;
|
|
28
45
|
resize?: ImageResizeOptions;
|
|
29
46
|
}
|
|
30
47
|
/**
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AssistantMessage } from "@oh-my-pi/pi-ai";
|
|
2
|
+
type AssistantContentBlock = AssistantMessage["content"][number];
|
|
3
|
+
type ThinkingBlock = Extract<AssistantContentBlock, {
|
|
4
|
+
type: "thinking";
|
|
5
|
+
}>;
|
|
6
|
+
/**
|
|
7
|
+
* Returns the operator-visible thinking text for a block.
|
|
8
|
+
*
|
|
9
|
+
* Some OpenAI-compatible reasoning gateways require a non-empty
|
|
10
|
+
* `reasoning_content` field on historical assistant tool-call turns even when
|
|
11
|
+
* the model did not emit any reasoning. The provider adapter uses a single dot
|
|
12
|
+
* as the wire-only placeholder those gateways accept; if that value is later
|
|
13
|
+
* replayed or echoed as a thinking block, it should not render as model thought.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getVisibleThinkingText(block: ThinkingBlock): string;
|
|
16
|
+
export declare function hasVisibleThinking(block: ThinkingBlock): boolean;
|
|
17
|
+
export {};
|
|
@@ -5,3 +5,11 @@ import type { Api, Model, ToolChoice } from "@oh-my-pi/pi-ai";
|
|
|
5
5
|
* narrowing their request tool list before transport.
|
|
6
6
|
*/
|
|
7
7
|
export declare function buildNamedToolChoice(toolName: string, model?: Model<Api>): ToolChoice | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Whether the given tool choice can be satisfied by the active tool set for the
|
|
10
|
+
* upcoming turn. Non-named choices (`"none"`, `"required"`, etc.) do not name a
|
|
11
|
+
* specific tool and are therefore always active.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isToolChoiceActive(toolChoice: ToolChoice | undefined, tools: readonly {
|
|
14
|
+
name: string;
|
|
15
|
+
}[]): boolean;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export
|
|
1
|
+
export declare function ffmpegAssetName(_version: string, plat: string, architecture: string): string | null;
|
|
2
|
+
export type ToolName = "sd" | "sg" | "yt-dlp" | "trafilatura" | "ffmpeg";
|
|
2
3
|
export declare function getToolPath(tool: ToolName): string | null;
|
|
3
4
|
type EnsureToolOptions = {
|
|
4
5
|
signal?: AbortSignal;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SpecialHandler } from "./types";
|
|
2
2
|
interface GitHubUrl {
|
|
3
|
-
type: "blob" | "tree" | "repo" | "issue" | "issues" | "pull" | "pulls" | "discussion" | "discussions" | "actions-run" | "actions-job" | "other";
|
|
3
|
+
type: "blob" | "tree" | "repo" | "commit" | "issue" | "issues" | "pull" | "pulls" | "discussion" | "discussions" | "actions-run" | "actions-job" | "other";
|
|
4
4
|
owner: string;
|
|
5
5
|
repo: string;
|
|
6
6
|
ref?: string;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
8
8
|
import type { AuthStorage } from "@oh-my-pi/pi-ai";
|
|
9
|
-
import
|
|
9
|
+
import { z } from "zod/v4";
|
|
10
10
|
import type { CustomTool } from "../../extensibility/custom-tools/types";
|
|
11
11
|
import type { ToolSession } from "../../tools";
|
|
12
12
|
import { type SearchRenderDetails } from "./render";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@oh-my-pi/pi-coding-agent",
|
|
4
|
-
"version": "15.
|
|
4
|
+
"version": "15.13.0",
|
|
5
5
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
6
6
|
"homepage": "https://omp.sh",
|
|
7
7
|
"author": "Can Boluk",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"check": "biome check . && bun run check:types",
|
|
36
36
|
"check:types": "tsgo -p tsconfig.json --noEmit",
|
|
37
37
|
"lint": "biome lint .",
|
|
38
|
-
"test": "bun test --parallel",
|
|
38
|
+
"test": "bun test --parallel=2",
|
|
39
39
|
"fix": "biome check --write --unsafe . && bun run format-prompts && bun run generate-docs-index",
|
|
40
40
|
"fmt": "biome format --write . && bun run format-prompts",
|
|
41
41
|
"format-prompts": "bun scripts/format-prompts.ts",
|
|
@@ -44,20 +44,20 @@
|
|
|
44
44
|
"bench:guard": "bun scripts/bench-guard.ts"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@agentclientprotocol/sdk": "0.
|
|
47
|
+
"@agentclientprotocol/sdk": "0.25.0",
|
|
48
48
|
"@babel/parser": "^7.29.7",
|
|
49
49
|
"@mozilla/readability": "^0.6.0",
|
|
50
|
-
"@oh-my-pi/hashline": "15.
|
|
51
|
-
"@oh-my-pi/omp-stats": "15.
|
|
52
|
-
"@oh-my-pi/pi-agent-core": "15.
|
|
53
|
-
"@oh-my-pi/pi-ai": "15.
|
|
54
|
-
"@oh-my-pi/pi-catalog": "15.
|
|
55
|
-
"@oh-my-pi/pi-mnemopi": "15.
|
|
56
|
-
"@oh-my-pi/pi-natives": "15.
|
|
57
|
-
"@oh-my-pi/pi-tui": "15.
|
|
58
|
-
"@oh-my-pi/pi-utils": "15.
|
|
59
|
-
"@oh-my-pi/pi-wire": "15.
|
|
60
|
-
"@oh-my-pi/snapcompact": "15.
|
|
50
|
+
"@oh-my-pi/hashline": "15.13.0",
|
|
51
|
+
"@oh-my-pi/omp-stats": "15.13.0",
|
|
52
|
+
"@oh-my-pi/pi-agent-core": "15.13.0",
|
|
53
|
+
"@oh-my-pi/pi-ai": "15.13.0",
|
|
54
|
+
"@oh-my-pi/pi-catalog": "15.13.0",
|
|
55
|
+
"@oh-my-pi/pi-mnemopi": "15.13.0",
|
|
56
|
+
"@oh-my-pi/pi-natives": "15.13.0",
|
|
57
|
+
"@oh-my-pi/pi-tui": "15.13.0",
|
|
58
|
+
"@oh-my-pi/pi-utils": "15.13.0",
|
|
59
|
+
"@oh-my-pi/pi-wire": "15.13.0",
|
|
60
|
+
"@oh-my-pi/snapcompact": "15.13.0",
|
|
61
61
|
"@opentelemetry/api": "^1.9.1",
|
|
62
62
|
"@opentelemetry/context-async-hooks": "^2.7.1",
|
|
63
63
|
"@opentelemetry/exporter-trace-otlp-proto": "^0.218.0",
|
|
@@ -77,10 +77,11 @@
|
|
|
77
77
|
"puppeteer-core": "^25.1.0",
|
|
78
78
|
"turndown": "7.2.4",
|
|
79
79
|
"turndown-plugin-gfm": "1.0.2",
|
|
80
|
-
"zod": "4
|
|
80
|
+
"zod": "^4"
|
|
81
81
|
},
|
|
82
82
|
"optionalDependencies": {
|
|
83
|
-
"@huggingface/transformers": "^4.2.0"
|
|
83
|
+
"@huggingface/transformers": "^4.2.0",
|
|
84
|
+
"sherpa-onnx-node": "1.13.2"
|
|
84
85
|
},
|
|
85
86
|
"devDependencies": {
|
|
86
87
|
"@types/bun": "^1.3.14"
|