@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
|
@@ -46,7 +46,9 @@ import type { CheckpointState } from "../tools/checkpoint";
|
|
|
46
46
|
import { type TodoItem, type TodoPhase } from "../tools/todo";
|
|
47
47
|
import type { ClientBridge } from "./client-bridge";
|
|
48
48
|
import { type CustomMessage } from "./messages";
|
|
49
|
-
import type {
|
|
49
|
+
import type { SessionContext } from "./session-context";
|
|
50
|
+
import type { BranchSummaryEntry, NewSessionOptions } from "./session-entries";
|
|
51
|
+
import type { SessionManager } from "./session-manager";
|
|
50
52
|
import type { ShakeMode, ShakeResult } from "./shake-types";
|
|
51
53
|
import { ToolChoiceQueue } from "./tool-choice-queue";
|
|
52
54
|
import { YieldQueue } from "./yield-queue";
|
|
@@ -215,6 +217,10 @@ export interface AgentSessionConfig {
|
|
|
215
217
|
asyncJobManager?: AsyncJobManager;
|
|
216
218
|
/** Agent identity (registry id like "Main" or "Alice") used for IRC routing. */
|
|
217
219
|
agentId?: string;
|
|
220
|
+
/** Whether this session is the top-level agent or a subagent. Drives eager-task
|
|
221
|
+
* prelude gating so a top-level session created with a custom `agentId` still
|
|
222
|
+
* receives the always-mode reminder. Defaults to "main". */
|
|
223
|
+
agentKind?: "main" | "sub";
|
|
218
224
|
/**
|
|
219
225
|
* Override the provider-facing session ID for all API requests from this session.
|
|
220
226
|
* When absent, `sessionManager.getSessionId()` is used. Needed when benchmark or
|
|
@@ -357,16 +363,6 @@ export declare class AgentSession {
|
|
|
357
363
|
/** Unconditionally clear the silent-abort flag. Idempotent: safe when the
|
|
358
364
|
* flag was never set OR was already consumed by `#handleAgentEvent`. */
|
|
359
365
|
clearPlanCompactAbortPending(): void;
|
|
360
|
-
/** Register a compact display string for a custom message that the caller is
|
|
361
|
-
* about to dispatch via `promptCustomMessage` / `sendCustomMessage`.
|
|
362
|
-
* Returns a stable tag the caller MUST embed in
|
|
363
|
-
* `CustomMessage.details.__pendingDisplayTag` so the agent-side
|
|
364
|
-
* `message_start` handler can remove the matching display entry when the
|
|
365
|
-
* queued message is consumed.
|
|
366
|
-
*
|
|
367
|
-
* Does NOT push to the agent's steering/followUp queue — that happens
|
|
368
|
-
* separately inside `sendCustomMessage`. */
|
|
369
|
-
enqueueCustomMessageDisplay(text: string, mode: "steer" | "followUp"): string;
|
|
370
366
|
getAsyncJobSnapshot(options?: {
|
|
371
367
|
recentLimit?: number;
|
|
372
368
|
}): AsyncJobSnapshot | null;
|
|
@@ -421,6 +417,7 @@ export declare class AgentSession {
|
|
|
421
417
|
get serviceTier(): ServiceTier | undefined;
|
|
422
418
|
/** Whether agent is currently streaming a response */
|
|
423
419
|
get isStreaming(): boolean;
|
|
420
|
+
get isAborting(): boolean;
|
|
424
421
|
/** Wait until streaming and deferred recovery work are fully settled. */
|
|
425
422
|
waitForIdle(): Promise<void>;
|
|
426
423
|
drainAsyncJobDeliveriesForAcp(options?: {
|
|
@@ -595,7 +592,9 @@ export declare class AgentSession {
|
|
|
595
592
|
* the ACP agent) use this to know whether to expect an `agent_end` event.
|
|
596
593
|
*/
|
|
597
594
|
prompt(text: string, options?: PromptOptions): Promise<boolean>;
|
|
598
|
-
promptCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: Pick<PromptOptions, "streamingBehavior" | "toolChoice">
|
|
595
|
+
promptCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: Pick<PromptOptions, "streamingBehavior" | "toolChoice"> & {
|
|
596
|
+
queueChipText?: string;
|
|
597
|
+
}): Promise<void>;
|
|
599
598
|
/**
|
|
600
599
|
* Queue a steering message to interrupt the agent mid-run.
|
|
601
600
|
*/
|
|
@@ -612,11 +611,18 @@ export declare class AgentSession {
|
|
|
612
611
|
* - Streaming: queue as steer/follow-up or store for next turn
|
|
613
612
|
* - Not streaming + triggerTurn: appends to state/session, starts new turn unless the client cannot own it
|
|
614
613
|
* - Not streaming + no trigger: appends to state/session, no turn
|
|
614
|
+
*
|
|
615
|
+
* @returns true iff this call synchronously started a new turn (awaited
|
|
616
|
+
* `agent.prompt`); false when the message was queued/appended without a turn
|
|
617
|
+
* — including when `triggerTurn` is downgraded because the client defers
|
|
618
|
+
* agent-initiated turns. Callers that must mirror the resulting `agent_end`
|
|
619
|
+
* use this to avoid acting on a turn that never ran.
|
|
615
620
|
*/
|
|
616
621
|
sendCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: {
|
|
617
622
|
triggerTurn?: boolean;
|
|
618
623
|
deliverAs?: "steer" | "followUp" | "nextTurn";
|
|
619
|
-
|
|
624
|
+
queueChipText?: string;
|
|
625
|
+
}): Promise<boolean>;
|
|
620
626
|
/**
|
|
621
627
|
* Send a user message to the agent.
|
|
622
628
|
* When deliverAs is set, queue the message instead of starting a new turn.
|
|
@@ -627,22 +633,13 @@ export declare class AgentSession {
|
|
|
627
633
|
sendUserMessage(content: string | (TextContent | ImageContent)[], options?: {
|
|
628
634
|
deliverAs?: "steer" | "followUp";
|
|
629
635
|
}): Promise<void>;
|
|
630
|
-
/**
|
|
631
|
-
* Clear queued messages and return them (text plus any attached images).
|
|
632
|
-
* Useful for restoring to editor when user aborts. The internal entry
|
|
633
|
-
* arrays are handed out as-is — a `tag` (if any) is inert once the record
|
|
634
|
-
* leaves the queue.
|
|
635
|
-
*/
|
|
636
|
+
/** Clear queued messages and return them (text plus any attached images). */
|
|
636
637
|
clearQueue(): {
|
|
637
638
|
steering: RestoredQueuedMessage[];
|
|
638
639
|
followUp: RestoredQueuedMessage[];
|
|
639
640
|
};
|
|
640
|
-
/** Number of pending messages (includes steering, follow-up, and next-turn messages) */
|
|
641
|
+
/** Number of pending displayable messages (includes steering, follow-up, and next-turn messages) */
|
|
641
642
|
get queuedMessageCount(): number;
|
|
642
|
-
/** Get pending messages (read-only). Returns the public text-only view;
|
|
643
|
-
* internal `{text, tag?}` records are mapped to `.text` so callers
|
|
644
|
-
* (`updatePendingMessagesDisplay`, `restoreQueuedMessagesToEditor`) see
|
|
645
|
-
* the unchanged historical shape. */
|
|
646
643
|
getQueuedMessages(): {
|
|
647
644
|
steering: readonly string[];
|
|
648
645
|
followUp: readonly string[];
|
|
@@ -650,8 +647,6 @@ export declare class AgentSession {
|
|
|
650
647
|
/**
|
|
651
648
|
* Pop the last queued message (steering first, then follow-up).
|
|
652
649
|
* Used by dequeue keybinding to restore messages to editor one at a time.
|
|
653
|
-
* Returns the popped entry's text and images; the tag (if any) dies with
|
|
654
|
-
* the record — no orphan state can outlive the queue entry.
|
|
655
650
|
*/
|
|
656
651
|
popLastQueuedMessage(): RestoredQueuedMessage | undefined;
|
|
657
652
|
get skillsSettings(): SkillsSettings | undefined;
|
|
@@ -673,13 +668,6 @@ export declare class AgentSession {
|
|
|
673
668
|
goalReason?: "interrupted" | "internal";
|
|
674
669
|
reason?: string;
|
|
675
670
|
}): Promise<void>;
|
|
676
|
-
/**
|
|
677
|
-
* Abort active work, then immediately resume the agent so queued steer/follow-up
|
|
678
|
-
* messages drain instead of waiting for another natural turn boundary.
|
|
679
|
-
*/
|
|
680
|
-
interruptAndFlushQueuedMessages(options?: {
|
|
681
|
-
reason?: string;
|
|
682
|
-
}): Promise<void>;
|
|
683
671
|
/**
|
|
684
672
|
* Start a new session, optionally with initial messages and parent tracking.
|
|
685
673
|
* Clears all messages and starts a new session.
|
|
@@ -701,7 +689,10 @@ export declare class AgentSession {
|
|
|
701
689
|
fork(): Promise<boolean>;
|
|
702
690
|
/**
|
|
703
691
|
* Set model directly.
|
|
704
|
-
* Validates
|
|
692
|
+
* Validates that a credential source is configured (synchronously, without
|
|
693
|
+
* refreshing OAuth or running command-backed key programs) and saves to the
|
|
694
|
+
* active session. Persists settings only when requested. The concrete key is
|
|
695
|
+
* resolved lazily per request, so switching never blocks the event loop.
|
|
705
696
|
* @throws Error if no API key available for the model
|
|
706
697
|
*/
|
|
707
698
|
setModel(model: Model, role?: string, options?: {
|
|
@@ -711,7 +702,9 @@ export declare class AgentSession {
|
|
|
711
702
|
}): Promise<void>;
|
|
712
703
|
/**
|
|
713
704
|
* Set model temporarily (for this session only).
|
|
714
|
-
* Validates
|
|
705
|
+
* Validates that a credential source is configured (synchronously, without
|
|
706
|
+
* refreshing OAuth or running command-backed key programs), saves to session
|
|
707
|
+
* log but NOT to settings.
|
|
715
708
|
* @throws Error if no API key available for the model
|
|
716
709
|
*/
|
|
717
710
|
setModelTemporary(model: Model, thinkingLevel?: ThinkingLevel, options?: {
|
|
@@ -10,7 +10,8 @@ export declare class AgentStorage {
|
|
|
10
10
|
private constructor();
|
|
11
11
|
/**
|
|
12
12
|
* Returns singleton instance for the given database path, creating if needed.
|
|
13
|
-
* Retries on SQLITE_BUSY
|
|
13
|
+
* Retries on the `SQLITE_BUSY` family (including `SQLITE_BUSY_RECOVERY`) with
|
|
14
|
+
* exponential backoff. See issue #2421.
|
|
14
15
|
* @param dbPath - Path to the SQLite database file (defaults to config path)
|
|
15
16
|
* @returns AgentStorage instance for the given path
|
|
16
17
|
*/
|
|
@@ -30,6 +30,7 @@ export declare class IndexedSessionStorage implements SessionStorage {
|
|
|
30
30
|
readText(path: string): Promise<string>;
|
|
31
31
|
readTextSlices(path: string, prefixBytes: number, suffixBytes: number): Promise<[string, string]>;
|
|
32
32
|
writeText(path: string, content: string): Promise<void>;
|
|
33
|
+
writeTextAtomic(path: string, content: string): Promise<void>;
|
|
33
34
|
rename(src: string, dst: string): Promise<void>;
|
|
34
35
|
unlink(path: string): Promise<void>;
|
|
35
36
|
deleteSessionWithArtifacts(sessionPath: string): Promise<void>;
|
|
@@ -49,10 +50,9 @@ declare class IndexedSessionStorageWriter implements SessionStorageWriter {
|
|
|
49
50
|
flags?: "a" | "w";
|
|
50
51
|
onError?: (err: Error) => void;
|
|
51
52
|
});
|
|
52
|
-
|
|
53
|
-
writeLine(line: string): Promise<void>;
|
|
53
|
+
append(line: string): Promise<void>;
|
|
54
54
|
flush(): Promise<void>;
|
|
55
|
-
|
|
55
|
+
isOpen(): boolean;
|
|
56
56
|
close(): Promise<void>;
|
|
57
57
|
getError(): Error | undefined;
|
|
58
58
|
}
|
|
@@ -16,13 +16,11 @@ export interface SkillPromptDetails {
|
|
|
16
16
|
path: string;
|
|
17
17
|
args?: string;
|
|
18
18
|
lineCount: number;
|
|
19
|
-
/** Internal:
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
* via the `INTERNAL_DETAILS_FIELDS` allowlist below. */
|
|
25
|
-
__pendingDisplayTag?: string;
|
|
19
|
+
/** Internal: compact label shown for a queued custom message. Optional —
|
|
20
|
+
* non-streaming skill prompts never set it. Stripped from persisted
|
|
21
|
+
* `details` by `SessionManager.appendCustomMessageEntry` via the
|
|
22
|
+
* `INTERNAL_DETAILS_FIELDS` allowlist below. */
|
|
23
|
+
__queueChipText?: string;
|
|
26
24
|
}
|
|
27
25
|
/** Sentinel value for `AssistantMessage.errorMessage` indicating that the abort
|
|
28
26
|
* was an *expected internal transition* (plan-mode → execution compaction)
|
|
@@ -55,16 +53,16 @@ export declare function shouldRenderAbortReason(errorMessage: string | undefined
|
|
|
55
53
|
* `shouldRenderAbortReason` before rendering when user interrupts should stay
|
|
56
54
|
* visually quiet. */
|
|
57
55
|
export declare function resolveAbortLabel(errorMessage: string | undefined, retryAttempt?: number): string;
|
|
58
|
-
/** Extract the optional `
|
|
56
|
+
/** Extract the optional `__queueChipText` field from a CustomMessage's
|
|
59
57
|
* `details` blob. Safe over `unknown`; returns undefined when the field is
|
|
60
58
|
* absent or non-string. */
|
|
61
|
-
export declare function
|
|
59
|
+
export declare function readQueueChipText(details: unknown): string | undefined;
|
|
62
60
|
/** Explicit allowlist of `details` field names that are AgentSession-internal
|
|
63
61
|
* transient bookkeeping and MUST be removed before SessionManager persists
|
|
64
62
|
* the CustomMessageEntry to disk. Scoped intentionally narrow: only fields
|
|
65
63
|
* declared here are stripped. Adding a new entry is a deliberate, reviewed
|
|
66
64
|
* change — unrelated future payload fields are never silently dropped. */
|
|
67
|
-
export declare const INTERNAL_DETAILS_FIELDS: readonly ["
|
|
65
|
+
export declare const INTERNAL_DETAILS_FIELDS: readonly ["__queueChipText"];
|
|
68
66
|
/** Return a `details` copy with every key in `INTERNAL_DETAILS_FIELDS`
|
|
69
67
|
* removed. Returns the input unchanged when there is nothing to strip
|
|
70
68
|
* (null/non-object, or no listed fields present) so callers don't pay a
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
2
|
+
import type { ServiceTier } from "@oh-my-pi/pi-ai";
|
|
3
|
+
import { type CompactionEntry, type SessionEntry } from "./session-entries";
|
|
4
|
+
export interface SessionContext {
|
|
5
|
+
messages: AgentMessage[];
|
|
6
|
+
thinkingLevel?: string;
|
|
7
|
+
serviceTier?: ServiceTier;
|
|
8
|
+
/** Model roles: { default: "provider/modelId", small: "provider/modelId", ... } */
|
|
9
|
+
models: Record<string, string>;
|
|
10
|
+
/** Names of TTSR rules that have been injected this session */
|
|
11
|
+
injectedTtsrRules: string[];
|
|
12
|
+
/** MCP tool names selected through discovery for this session branch. */
|
|
13
|
+
selectedMCPToolNames: string[];
|
|
14
|
+
/** Whether this branch contains an explicit persisted MCP selection entry. */
|
|
15
|
+
hasPersistedMCPToolSelection: boolean;
|
|
16
|
+
/** Active mode (e.g. "plan") or "none" if no special mode is active */
|
|
17
|
+
mode: string;
|
|
18
|
+
/** Mode-specific data from the last mode_change entry */
|
|
19
|
+
modeData?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/** Lists session model strings to try when restoring, in fallback order. */
|
|
22
|
+
export declare function getRestorableSessionModels(models: Readonly<Record<string, string>>, lastModelChangeRole: string | undefined): string[];
|
|
23
|
+
export declare function getLatestCompactionEntry(entries: SessionEntry[]): CompactionEntry | null;
|
|
24
|
+
export interface BuildSessionContextOptions {
|
|
25
|
+
/**
|
|
26
|
+
* Build the full-history display transcript instead of the LLM context:
|
|
27
|
+
* every path entry in chronological order, with each compaction emitted
|
|
28
|
+
* inline as a `compactionSummary` message at the position it fired rather
|
|
29
|
+
* than replacing the history before it. Display-only — never send the
|
|
30
|
+
* result to a provider.
|
|
31
|
+
*/
|
|
32
|
+
transcript?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build the session context from entries using tree traversal.
|
|
36
|
+
* If leafId is provided, walks from that entry to root.
|
|
37
|
+
* Handles compaction and branch summaries along the path.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildSessionContext(entries: SessionEntry[], leafId?: string | null, byId?: Map<string, SessionEntry>, options?: BuildSessionContextOptions): SessionContext;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
2
|
+
import type { ImageContent, MessageAttribution, ServiceTier, TextContent } from "@oh-my-pi/pi-ai";
|
|
3
|
+
export declare const CURRENT_SESSION_VERSION = 3;
|
|
4
|
+
export declare const EPHEMERAL_MODEL_CHANGE_ROLE = "fallback";
|
|
5
|
+
export interface SessionHeader {
|
|
6
|
+
type: "session";
|
|
7
|
+
version?: number;
|
|
8
|
+
id: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
titleSource?: "auto" | "user";
|
|
11
|
+
timestamp: string;
|
|
12
|
+
cwd: string;
|
|
13
|
+
parentSession?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface NewSessionOptions {
|
|
16
|
+
parentSession?: string;
|
|
17
|
+
/** Skip flushing the current session and delete it instead of saving. */
|
|
18
|
+
drop?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface SessionEntryBase {
|
|
21
|
+
type: string;
|
|
22
|
+
id: string;
|
|
23
|
+
parentId: string | null;
|
|
24
|
+
timestamp: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SessionMessageEntry extends SessionEntryBase {
|
|
27
|
+
type: "message";
|
|
28
|
+
message: AgentMessage;
|
|
29
|
+
}
|
|
30
|
+
export interface ThinkingLevelChangeEntry extends SessionEntryBase {
|
|
31
|
+
type: "thinking_level_change";
|
|
32
|
+
thinkingLevel?: string | null;
|
|
33
|
+
}
|
|
34
|
+
export interface ModelChangeEntry extends SessionEntryBase {
|
|
35
|
+
type: "model_change";
|
|
36
|
+
/** Model in "provider/modelId" format */
|
|
37
|
+
model: string;
|
|
38
|
+
/** Role: "default", "smol", "slow", etc. Undefined treated as "default" */
|
|
39
|
+
role?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ServiceTierChangeEntry extends SessionEntryBase {
|
|
42
|
+
type: "service_tier_change";
|
|
43
|
+
serviceTier: ServiceTier | null;
|
|
44
|
+
}
|
|
45
|
+
export interface CompactionEntry<T = unknown> extends SessionEntryBase {
|
|
46
|
+
type: "compaction";
|
|
47
|
+
summary: string;
|
|
48
|
+
shortSummary?: string;
|
|
49
|
+
firstKeptEntryId: string;
|
|
50
|
+
tokensBefore: number;
|
|
51
|
+
/** Extension-specific data (e.g., ArtifactIndex, version markers for structured compaction) */
|
|
52
|
+
details?: T;
|
|
53
|
+
/** Hook-provided data to persist across compaction */
|
|
54
|
+
preserveData?: Record<string, unknown>;
|
|
55
|
+
/** True if generated by an extension, undefined/false if pi-generated (backward compatible) */
|
|
56
|
+
fromExtension?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface BranchSummaryEntry<T = unknown> extends SessionEntryBase {
|
|
59
|
+
type: "branch_summary";
|
|
60
|
+
fromId: string;
|
|
61
|
+
summary: string;
|
|
62
|
+
/** Extension-specific data (not sent to LLM) */
|
|
63
|
+
details?: T;
|
|
64
|
+
/** True if generated by an extension, false if pi-generated */
|
|
65
|
+
fromExtension?: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Custom entry for extensions to store extension-specific data in the session.
|
|
69
|
+
* Use customType to identify your extension's entries.
|
|
70
|
+
*
|
|
71
|
+
* Purpose: Persist extension state across session reloads. On reload, extensions can
|
|
72
|
+
* scan entries for their customType and reconstruct internal state.
|
|
73
|
+
*
|
|
74
|
+
* Does NOT participate in LLM context (ignored by buildSessionContext).
|
|
75
|
+
* For injecting content into context, see CustomMessageEntry.
|
|
76
|
+
*/
|
|
77
|
+
export interface CustomEntry<T = unknown> extends SessionEntryBase {
|
|
78
|
+
type: "custom";
|
|
79
|
+
customType: string;
|
|
80
|
+
data?: T;
|
|
81
|
+
}
|
|
82
|
+
/** Label entry for user-defined bookmarks/markers on entries. */
|
|
83
|
+
export interface LabelEntry extends SessionEntryBase {
|
|
84
|
+
type: "label";
|
|
85
|
+
targetId: string;
|
|
86
|
+
label: string | undefined;
|
|
87
|
+
}
|
|
88
|
+
/** TTSR injection entry - tracks which time-traveling rules have been injected this session. */
|
|
89
|
+
export interface TtsrInjectionEntry extends SessionEntryBase {
|
|
90
|
+
type: "ttsr_injection";
|
|
91
|
+
/** Names of rules that were injected */
|
|
92
|
+
injectedRules: string[];
|
|
93
|
+
}
|
|
94
|
+
/** Persisted MCP discovery selection state for a session branch. */
|
|
95
|
+
export interface MCPToolSelectionEntry extends SessionEntryBase {
|
|
96
|
+
type: "mcp_tool_selection";
|
|
97
|
+
/** MCP tool names selected for visibility in discovery mode. */
|
|
98
|
+
selectedToolNames: string[];
|
|
99
|
+
}
|
|
100
|
+
/** Session init entry - captures initial context for subagent sessions (debugging/replay). */
|
|
101
|
+
export interface SessionInitEntry extends SessionEntryBase {
|
|
102
|
+
type: "session_init";
|
|
103
|
+
/** Full system prompt sent to the model */
|
|
104
|
+
systemPrompt: string;
|
|
105
|
+
/** Initial task/user message */
|
|
106
|
+
task: string;
|
|
107
|
+
/** Tools available to the agent */
|
|
108
|
+
tools: string[];
|
|
109
|
+
/** Output schema if structured output was requested */
|
|
110
|
+
outputSchema?: unknown;
|
|
111
|
+
}
|
|
112
|
+
/** Mode change entry - tracks agent mode transitions (e.g. plan mode). */
|
|
113
|
+
export interface ModeChangeEntry extends SessionEntryBase {
|
|
114
|
+
type: "mode_change";
|
|
115
|
+
/** Current mode name, or "none" when exiting a mode */
|
|
116
|
+
mode: string;
|
|
117
|
+
/** Optional mode-specific data (e.g. plan file path) */
|
|
118
|
+
data?: Record<string, unknown>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Custom message entry for extensions to inject messages into LLM context.
|
|
122
|
+
* Use customType to identify your extension's entries.
|
|
123
|
+
*
|
|
124
|
+
* Unlike CustomEntry, this DOES participate in LLM context.
|
|
125
|
+
* The content participates in LLM context through convertToLlm().
|
|
126
|
+
* Use details for extension-specific metadata (not sent to LLM).
|
|
127
|
+
*
|
|
128
|
+
* display controls TUI rendering:
|
|
129
|
+
* - false: hidden entirely
|
|
130
|
+
* - true: rendered with distinct styling (different from user messages)
|
|
131
|
+
*/
|
|
132
|
+
export interface CustomMessageEntry<T = unknown> extends SessionEntryBase {
|
|
133
|
+
type: "custom_message";
|
|
134
|
+
customType: string;
|
|
135
|
+
content: string | (TextContent | ImageContent)[];
|
|
136
|
+
details?: T;
|
|
137
|
+
display: boolean;
|
|
138
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
139
|
+
attribution?: MessageAttribution;
|
|
140
|
+
}
|
|
141
|
+
/** Session entry - has id/parentId for tree structure (returned by "read" methods in SessionManager) */
|
|
142
|
+
export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | ServiceTierChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | TtsrInjectionEntry | MCPToolSelectionEntry | SessionInitEntry | ModeChangeEntry;
|
|
143
|
+
/** Raw file entry (includes header) */
|
|
144
|
+
export type FileEntry = SessionHeader | SessionEntry;
|
|
145
|
+
/** Tree node for getTree() - defensive copy of session structure */
|
|
146
|
+
export interface SessionTreeNode {
|
|
147
|
+
entry: SessionEntry;
|
|
148
|
+
children: SessionTreeNode[];
|
|
149
|
+
/** Resolved label for this entry, if any */
|
|
150
|
+
label?: string;
|
|
151
|
+
}
|
|
152
|
+
export interface UsageStatistics {
|
|
153
|
+
input: number;
|
|
154
|
+
output: number;
|
|
155
|
+
cacheRead: number;
|
|
156
|
+
cacheWrite: number;
|
|
157
|
+
premiumRequests: number;
|
|
158
|
+
cost: number;
|
|
159
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type SessionStorage } from "./session-storage";
|
|
2
|
+
/**
|
|
3
|
+
* Coarse lifecycle status of a session, derived from its last persisted message.
|
|
4
|
+
*
|
|
5
|
+
* - `complete` — the last assistant turn ended with no unanswered tool calls, i.e.
|
|
6
|
+
* the agent yielded control back to the user.
|
|
7
|
+
* - `interrupted` — work was cut off mid-flight: a trailing assistant turn with
|
|
8
|
+
* pending tool calls, a trailing tool result the agent never continued from, or
|
|
9
|
+
* a length-truncated turn.
|
|
10
|
+
* - `aborted` — the last assistant turn was cancelled by the user.
|
|
11
|
+
* - `error` — the last assistant turn ended in an error.
|
|
12
|
+
* - `pending` — a trailing user message with no assistant reply persisted after it.
|
|
13
|
+
* - `unknown` — status could not be determined (empty/header-only session, or the
|
|
14
|
+
* final message was larger than the tail window that was read).
|
|
15
|
+
*/
|
|
16
|
+
export type SessionStatus = "complete" | "interrupted" | "aborted" | "error" | "pending" | "unknown";
|
|
17
|
+
export interface SessionInfo {
|
|
18
|
+
path: string;
|
|
19
|
+
id: string;
|
|
20
|
+
/** Working directory where the session was started. Empty string for old sessions. */
|
|
21
|
+
cwd: string;
|
|
22
|
+
title?: string;
|
|
23
|
+
/** Path to the parent session (if this session was forked). */
|
|
24
|
+
parentSessionPath?: string;
|
|
25
|
+
created: Date;
|
|
26
|
+
modified: Date;
|
|
27
|
+
messageCount: number;
|
|
28
|
+
/** File size in bytes on disk; used for compact list rendering. */
|
|
29
|
+
size: number;
|
|
30
|
+
firstMessage: string;
|
|
31
|
+
allMessagesText: string;
|
|
32
|
+
/**
|
|
33
|
+
* Coarse lifecycle status from the session's last persisted message. Optional:
|
|
34
|
+
* synthesized {@link SessionInfo}s (cross-project stubs, tests) leave it unset.
|
|
35
|
+
*/
|
|
36
|
+
status?: SessionStatus;
|
|
37
|
+
}
|
|
38
|
+
export interface ResolvedSessionMatch {
|
|
39
|
+
session: SessionInfo;
|
|
40
|
+
scope: "local" | "global";
|
|
41
|
+
}
|
|
42
|
+
/** Lightweight metadata for a recent session, used in welcome/picker UI. */
|
|
43
|
+
export interface RecentSessionInfo {
|
|
44
|
+
path: string;
|
|
45
|
+
name: string;
|
|
46
|
+
timeAgo: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Promote orphaned `<basename>.jsonl.<snowflake>.bak` backups created by the
|
|
50
|
+
* EPERM-rewrite path back to their primary path when the primary is missing.
|
|
51
|
+
* This runs once per session-dir scan, before the main `*.jsonl` glob, so a
|
|
52
|
+
* crash between the two renames in the EPERM-rewrite path does not leave the
|
|
53
|
+
* user's last good state stranded outside the loader's view.
|
|
54
|
+
*
|
|
55
|
+
* Exported for testing.
|
|
56
|
+
*/
|
|
57
|
+
export declare function recoverOrphanedBackups(sessionDir: string, storage: SessionStorage): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* List sessions in a resolved session directory (newest first), reading each
|
|
60
|
+
* file's lifecycle {@link SessionStatus}.
|
|
61
|
+
*/
|
|
62
|
+
export declare function listSessions(sessionDir: string, storage: SessionStorage): Promise<SessionInfo[]>;
|
|
63
|
+
/** List all sessions across all project directories (newest first). */
|
|
64
|
+
export declare function listAllSessions(storage?: SessionStorage): Promise<SessionInfo[]>;
|
|
65
|
+
/** Exported for testing */
|
|
66
|
+
export declare function findMostRecentSession(sessionDir: string, storage?: SessionStorage): Promise<string | null>;
|
|
67
|
+
/** Get recent sessions for display in the welcome screen. */
|
|
68
|
+
export declare function getRecentSessions(sessionDir: string, limit?: number, storage?: SessionStorage): Promise<RecentSessionInfo[]>;
|
|
69
|
+
export declare function resolveResumableSession(sessionArg: string, cwd: string, sessionDir?: string, storage?: SessionStorage): Promise<ResolvedSessionMatch | undefined>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
2
|
+
import { BlobStore } from "./blob-store";
|
|
3
|
+
import type { FileEntry } from "./session-entries";
|
|
4
|
+
import { type SessionStorage } from "./session-storage";
|
|
5
|
+
/** Exported for compaction.test.ts */
|
|
6
|
+
export declare function parseSessionEntries(content: string): FileEntry[];
|
|
7
|
+
/** Exported for testing */
|
|
8
|
+
export declare function loadEntriesFromFile(filePath: string, storage?: SessionStorage): Promise<FileEntry[]>;
|
|
9
|
+
export declare function resolveBlobRefsInEntries(entries: FileEntry[], blobStore: BlobStore): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Read-only message view of a session file: load entries, migrate to the
|
|
12
|
+
* current version, resolve blob refs, and build the context along the
|
|
13
|
+
* persisted leaf path (last entry). Does NOT create a writer or take the
|
|
14
|
+
* session lock — safe to call against a file another session is writing.
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadSessionMessagesReadOnly(filePath: string): Promise<AgentMessage[]>;
|