@oh-my-pi/pi-coding-agent 8.0.20 → 8.2.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 +125 -0
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +54 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +3 -4
- package/src/capability/extension-module.ts +3 -4
- package/src/capability/extension.ts +3 -4
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +3 -4
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +3 -4
- package/src/capability/mcp.ts +3 -4
- package/src/capability/prompt.ts +3 -4
- package/src/capability/rule.ts +3 -4
- package/src/capability/settings.ts +2 -3
- package/src/capability/skill.ts +3 -4
- package/src/capability/slash-command.ts +3 -4
- package/src/capability/ssh.ts +3 -4
- package/src/capability/system-prompt.ts +3 -4
- package/src/capability/tool.ts +3 -4
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -25
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +307 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +351 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +26 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +40 -0
- package/src/commit/agentic/state.ts +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +131 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +36 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +233 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +11 -0
- package/src/commit/git/index.ts +212 -0
- package/src/commit/git/operations.ts +53 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +63 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +80 -0
- package/src/commit/pipeline.ts +240 -0
- package/src/commit/prompts/analysis-system.md +155 -0
- package/src/commit/prompts/analysis-user.md +41 -0
- package/src/commit/prompts/changelog-system.md +56 -0
- package/src/commit/prompts/changelog-user.md +19 -0
- package/src/commit/prompts/file-observer-system.md +26 -0
- package/src/commit/prompts/file-observer-user.md +9 -0
- package/src/commit/prompts/reduce-system.md +60 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +4 -0
- package/src/commit/prompts/summary-system.md +52 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/types.ts +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +65 -38
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +141 -50
- package/src/config.ts +64 -66
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +22 -24
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +18 -15
- package/src/extensibility/custom-commands/types.ts +2 -3
- package/src/extensibility/custom-tools/loader.ts +11 -12
- package/src/extensibility/custom-tools/types.ts +7 -8
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +76 -54
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +20 -27
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +9 -10
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +11 -18
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +54 -54
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +109 -9
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +99 -61
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +71 -37
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +6 -7
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +63 -52
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +33 -5
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +16 -19
- package/src/modes/components/tree-selector.ts +12 -12
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +31 -31
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -28
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +89 -0
- package/src/modes/theme/theme.ts +130 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +11 -18
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +43 -16
- package/src/prompts/tools/task.md +2 -0
- package/src/sdk.ts +100 -65
- package/src/session/agent-session.ts +84 -85
- package/src/session/agent-storage.ts +43 -39
- package/src/session/artifacts.ts +32 -10
- package/src/session/auth-storage.ts +50 -39
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +14 -56
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +28 -35
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +40 -34
- package/src/task/output-manager.ts +93 -0
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +24 -30
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +33 -39
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +41 -20
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +91 -97
- package/src/tools/calculator.ts +49 -47
- package/src/tools/complete.ts +4 -5
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +84 -124
- package/src/tools/find.ts +94 -98
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +100 -116
- package/src/tools/index.ts +80 -55
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +44 -70
- package/src/tools/notebook.ts +51 -67
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +2 -2
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +104 -217
- package/src/tools/read.ts +92 -33
- package/src/tools/render-utils.ts +8 -23
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +69 -49
- package/src/tools/todo-write.ts +37 -25
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +99 -75
- package/src/tui/code-cell.ts +109 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +72 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +55 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +48 -0
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +5 -10
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +129 -175
- package/tsconfig.json +0 -42
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Credential storage for API keys and OAuth tokens.
|
|
3
3
|
* Handles loading, saving, and refreshing credentials from agent.db.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
import { Buffer } from "node:buffer";
|
|
7
|
-
import
|
|
6
|
+
import * as path from "node:path";
|
|
8
7
|
import {
|
|
9
8
|
antigravityUsageProvider,
|
|
10
9
|
claudeUsageProvider,
|
|
@@ -32,8 +31,8 @@ import {
|
|
|
32
31
|
type UsageReport,
|
|
33
32
|
zaiUsageProvider,
|
|
34
33
|
} from "@oh-my-pi/pi-ai";
|
|
35
|
-
import { getAgentDbPath, getAuthPath } from "@oh-my-pi/pi-coding-agent/config";
|
|
36
34
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
35
|
+
import { getAgentDbPath, getAuthPath } from "../config";
|
|
37
36
|
import { AgentStorage } from "./agent-storage";
|
|
38
37
|
import { migrateJsonStorage } from "./storage-migration";
|
|
39
38
|
|
|
@@ -94,7 +93,7 @@ const DEFAULT_USAGE_PROVIDERS: UsageProvider[] = [
|
|
|
94
93
|
];
|
|
95
94
|
|
|
96
95
|
const DEFAULT_USAGE_PROVIDER_MAP = new Map<Provider, UsageProvider>(
|
|
97
|
-
DEFAULT_USAGE_PROVIDERS.map(
|
|
96
|
+
DEFAULT_USAGE_PROVIDERS.map(provider => [provider.id, provider]),
|
|
98
97
|
);
|
|
99
98
|
|
|
100
99
|
const USAGE_CACHE_PREFIX = "usage_cache:";
|
|
@@ -162,17 +161,14 @@ export class AuthStorage {
|
|
|
162
161
|
private usageLogger?: UsageLogger;
|
|
163
162
|
private fallbackResolver?: (provider: string) => string | undefined;
|
|
164
163
|
|
|
165
|
-
|
|
166
|
-
* @param authPath - Legacy auth.json path used for migration and locating agent.db
|
|
167
|
-
* @param fallbackPaths - Additional auth.json paths to migrate (legacy support)
|
|
168
|
-
*/
|
|
169
|
-
constructor(
|
|
164
|
+
private constructor(
|
|
170
165
|
private authPath: string,
|
|
171
166
|
private fallbackPaths: string[] = [],
|
|
167
|
+
storage: AgentStorage,
|
|
172
168
|
options: AuthStorageOptions = {},
|
|
173
169
|
) {
|
|
174
170
|
this.dbPath = AuthStorage.resolveDbPath(authPath);
|
|
175
|
-
this.storage =
|
|
171
|
+
this.storage = storage;
|
|
176
172
|
this.usageProviderResolver = options.usageProviderResolver ?? resolveDefaultUsageProvider;
|
|
177
173
|
this.usageCache = options.usageCache ?? new AuthStorageUsageCache(this.storage);
|
|
178
174
|
this.usageFetch = options.usageFetch ?? fetch;
|
|
@@ -185,17 +181,35 @@ export class AuthStorage {
|
|
|
185
181
|
} satisfies UsageLogger);
|
|
186
182
|
}
|
|
187
183
|
|
|
184
|
+
/**
|
|
185
|
+
* Create an AuthStorage instance.
|
|
186
|
+
* @param authPath - Legacy auth.json path used for migration and locating agent.db
|
|
187
|
+
* @param fallbackPaths - Additional auth.json paths to migrate (legacy support)
|
|
188
|
+
*/
|
|
189
|
+
static async create(
|
|
190
|
+
authPath: string,
|
|
191
|
+
fallbackPaths: string[] = [],
|
|
192
|
+
options: AuthStorageOptions = {},
|
|
193
|
+
): Promise<AuthStorage> {
|
|
194
|
+
const dbPath = AuthStorage.resolveDbPath(authPath);
|
|
195
|
+
const storage = await AgentStorage.open(dbPath);
|
|
196
|
+
return new AuthStorage(authPath, fallbackPaths, storage, options);
|
|
197
|
+
}
|
|
198
|
+
|
|
188
199
|
/**
|
|
189
200
|
* Create an in-memory AuthStorage instance from serialized data.
|
|
190
201
|
* Used by subagent workers to bypass discovery and use parent's credentials.
|
|
191
202
|
*/
|
|
192
|
-
static fromSerialized(data: SerializedAuthStorage, options: AuthStorageOptions = {}): AuthStorage {
|
|
193
|
-
const instance = Object.create(AuthStorage.prototype) as AuthStorage;
|
|
203
|
+
static async fromSerialized(data: SerializedAuthStorage, options: AuthStorageOptions = {}): Promise<AuthStorage> {
|
|
194
204
|
const authPath = data.authPath ?? data.dbPath ?? getAuthPath();
|
|
205
|
+
const dbPath = data.dbPath ?? AuthStorage.resolveDbPath(authPath);
|
|
206
|
+
const storage = await AgentStorage.open(dbPath);
|
|
207
|
+
|
|
208
|
+
const instance = Object.create(AuthStorage.prototype) as AuthStorage;
|
|
195
209
|
instance.authPath = authPath;
|
|
196
210
|
instance.fallbackPaths = [];
|
|
197
|
-
instance.dbPath =
|
|
198
|
-
instance.storage =
|
|
211
|
+
instance.dbPath = dbPath;
|
|
212
|
+
instance.storage = storage;
|
|
199
213
|
instance.data = new Map();
|
|
200
214
|
instance.runtimeOverrides = new Map();
|
|
201
215
|
instance.providerRoundRobinIndex = new Map();
|
|
@@ -215,7 +229,7 @@ export class AuthStorage {
|
|
|
215
229
|
for (const [provider, creds] of Object.entries(data.credentials)) {
|
|
216
230
|
instance.data.set(
|
|
217
231
|
provider,
|
|
218
|
-
creds.map(
|
|
232
|
+
creds.map(c => ({
|
|
219
233
|
id: c.id,
|
|
220
234
|
credential:
|
|
221
235
|
c.type === "api_key"
|
|
@@ -240,7 +254,7 @@ export class AuthStorage {
|
|
|
240
254
|
serialize(): SerializedAuthStorage {
|
|
241
255
|
const credentials: SerializedAuthStorage["credentials"] = {};
|
|
242
256
|
for (const [provider, creds] of this.data.entries()) {
|
|
243
|
-
credentials[provider] = creds.map(
|
|
257
|
+
credentials[provider] = creds.map(c => ({
|
|
244
258
|
id: c.id,
|
|
245
259
|
type: c.credential.type,
|
|
246
260
|
data: c.credential.type === "api_key" ? { key: c.credential.key } : { ...c.credential },
|
|
@@ -267,7 +281,7 @@ export class AuthStorage {
|
|
|
267
281
|
if (authPath.endsWith(".db")) {
|
|
268
282
|
return authPath;
|
|
269
283
|
}
|
|
270
|
-
return getAgentDbPath(dirname(authPath));
|
|
284
|
+
return getAgentDbPath(path.dirname(authPath));
|
|
271
285
|
}
|
|
272
286
|
|
|
273
287
|
/**
|
|
@@ -298,10 +312,10 @@ export class AuthStorage {
|
|
|
298
312
|
* Migrates legacy auth.json/settings.json on first load.
|
|
299
313
|
*/
|
|
300
314
|
async reload(): Promise<void> {
|
|
301
|
-
const agentDir = dirname(this.dbPath);
|
|
315
|
+
const agentDir = path.dirname(this.dbPath);
|
|
302
316
|
await migrateJsonStorage({
|
|
303
317
|
agentDir,
|
|
304
|
-
settingsPath: join(agentDir, "settings.json"),
|
|
318
|
+
settingsPath: path.join(agentDir, "settings.json"),
|
|
305
319
|
authPaths: [this.authPath, ...this.fallbackPaths],
|
|
306
320
|
});
|
|
307
321
|
|
|
@@ -410,7 +424,7 @@ export class AuthStorage {
|
|
|
410
424
|
deduped.push(credential);
|
|
411
425
|
continue;
|
|
412
426
|
}
|
|
413
|
-
if (identifiers.some(
|
|
427
|
+
if (identifiers.some(identifier => seen.has(identifier))) {
|
|
414
428
|
continue;
|
|
415
429
|
}
|
|
416
430
|
for (const identifier of identifiers) {
|
|
@@ -437,7 +451,7 @@ export class AuthStorage {
|
|
|
437
451
|
kept.push(entry);
|
|
438
452
|
continue;
|
|
439
453
|
}
|
|
440
|
-
if (identifiers.some(
|
|
454
|
+
if (identifiers.some(identifier => seen.has(identifier))) {
|
|
441
455
|
removed.push(entry);
|
|
442
456
|
continue;
|
|
443
457
|
}
|
|
@@ -457,7 +471,7 @@ export class AuthStorage {
|
|
|
457
471
|
|
|
458
472
|
/** Returns all credentials for a provider as an array */
|
|
459
473
|
private getCredentialsForProvider(provider: string): AuthCredential[] {
|
|
460
|
-
return this.getStoredCredentials(provider).map(
|
|
474
|
+
return this.getStoredCredentials(provider).map(entry => entry.credential);
|
|
461
475
|
}
|
|
462
476
|
|
|
463
477
|
/** Composite key for round-robin tracking: "anthropic:oauth" or "openai:api_key" */
|
|
@@ -645,7 +659,7 @@ export class AuthStorage {
|
|
|
645
659
|
const stored = this.storage.replaceAuthCredentialsForProvider(provider, deduped);
|
|
646
660
|
this.setStoredCredentials(
|
|
647
661
|
provider,
|
|
648
|
-
stored.map(
|
|
662
|
+
stored.map(record => ({ id: record.id, credential: record.credential })),
|
|
649
663
|
);
|
|
650
664
|
this.resetProviderAssignments(provider);
|
|
651
665
|
}
|
|
@@ -689,7 +703,7 @@ export class AuthStorage {
|
|
|
689
703
|
* Check if OAuth credentials are configured for a provider.
|
|
690
704
|
*/
|
|
691
705
|
hasOAuth(provider: string): boolean {
|
|
692
|
-
return this.getCredentialsForProvider(provider).some(
|
|
706
|
+
return this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth");
|
|
693
707
|
}
|
|
694
708
|
|
|
695
709
|
/**
|
|
@@ -707,7 +721,7 @@ export class AuthStorage {
|
|
|
707
721
|
getAll(): AuthStorageData {
|
|
708
722
|
const result: AuthStorageData = {};
|
|
709
723
|
for (const [provider, entries] of this.data.entries()) {
|
|
710
|
-
const credentials = entries.map(
|
|
724
|
+
const credentials = entries.map(entry => entry.credential);
|
|
711
725
|
if (credentials.length === 1) {
|
|
712
726
|
result[provider] = credentials[0];
|
|
713
727
|
} else if (credentials.length > 1) {
|
|
@@ -758,7 +772,7 @@ export class AuthStorage {
|
|
|
758
772
|
break;
|
|
759
773
|
case "cursor":
|
|
760
774
|
credentials = await loginCursor(
|
|
761
|
-
|
|
775
|
+
url => ctrl.onAuth({ url }),
|
|
762
776
|
ctrl.onProgress ? () => ctrl.onProgress?.("Waiting for browser authentication...") : undefined,
|
|
763
777
|
);
|
|
764
778
|
break;
|
|
@@ -832,7 +846,7 @@ export class AuthStorage {
|
|
|
832
846
|
if (username) identifiers.push(`account:${username}`);
|
|
833
847
|
const scopeAccountId = this.getUsageReportScopeAccountId(report);
|
|
834
848
|
if (scopeAccountId) identifiers.push(`account:${scopeAccountId}`);
|
|
835
|
-
return identifiers.map(
|
|
849
|
+
return identifiers.map(identifier => `${report.provider}:${identifier.toLowerCase()}`);
|
|
836
850
|
}
|
|
837
851
|
|
|
838
852
|
private mergeUsageReportGroup(reports: UsageReport[]): UsageReport {
|
|
@@ -844,7 +858,7 @@ export class AuthStorage {
|
|
|
844
858
|
});
|
|
845
859
|
const base = sorted[0];
|
|
846
860
|
const mergedLimits = [...base.limits];
|
|
847
|
-
const limitIds = new Set(mergedLimits.map(
|
|
861
|
+
const limitIds = new Set(mergedLimits.map(limit => limit.id));
|
|
848
862
|
const mergedMetadata: Record<string, unknown> = { ...(base.metadata ?? {}) };
|
|
849
863
|
let fetchedAt = base.fetchedAt;
|
|
850
864
|
|
|
@@ -897,7 +911,7 @@ export class AuthStorage {
|
|
|
897
911
|
}
|
|
898
912
|
}
|
|
899
913
|
|
|
900
|
-
const deduped = groups.map(
|
|
914
|
+
const deduped = groups.map(group => this.mergeUsageReportGroup(group));
|
|
901
915
|
if (deduped.length !== reports.length) {
|
|
902
916
|
this.usageLogger?.debug("Usage reports deduped", {
|
|
903
917
|
before: reports.length,
|
|
@@ -920,7 +934,7 @@ export class AuthStorage {
|
|
|
920
934
|
|
|
921
935
|
/** Returns true if usage indicates rate limit has been reached. */
|
|
922
936
|
private isUsageLimitReached(report: UsageReport): boolean {
|
|
923
|
-
return report.limits.some(
|
|
937
|
+
return report.limits.some(limit => this.isUsageLimitExhausted(limit));
|
|
924
938
|
}
|
|
925
939
|
|
|
926
940
|
/** Extracts the earliest reset timestamp from exhausted windows (in ms). */
|
|
@@ -985,10 +999,7 @@ export class AuthStorage {
|
|
|
985
999
|
if (!resolver || !cache) return null;
|
|
986
1000
|
|
|
987
1001
|
const tasks: Array<Promise<UsageReport | null>> = [];
|
|
988
|
-
const providers = new Set<string>([
|
|
989
|
-
...this.data.keys(),
|
|
990
|
-
...DEFAULT_USAGE_PROVIDERS.map((provider) => provider.id),
|
|
991
|
-
]);
|
|
1002
|
+
const providers = new Set<string>([...this.data.keys(), ...DEFAULT_USAGE_PROVIDERS.map(provider => provider.id)]);
|
|
992
1003
|
this.usageLogger?.debug("Usage fetch requested", {
|
|
993
1004
|
providers: Array.from(providers).sort(),
|
|
994
1005
|
});
|
|
@@ -1033,7 +1044,7 @@ export class AuthStorage {
|
|
|
1033
1044
|
now: this.usageNow,
|
|
1034
1045
|
logger: this.usageLogger,
|
|
1035
1046
|
})
|
|
1036
|
-
.catch(
|
|
1047
|
+
.catch(error => {
|
|
1037
1048
|
logger.debug("AuthStorage usage fetch failed", {
|
|
1038
1049
|
provider,
|
|
1039
1050
|
error: String(error),
|
|
@@ -1076,7 +1087,7 @@ export class AuthStorage {
|
|
|
1076
1087
|
now: this.usageNow,
|
|
1077
1088
|
logger: this.usageLogger,
|
|
1078
1089
|
})
|
|
1079
|
-
.catch(
|
|
1090
|
+
.catch(error => {
|
|
1080
1091
|
logger.debug("AuthStorage usage fetch failed", {
|
|
1081
1092
|
provider,
|
|
1082
1093
|
error: String(error),
|
|
@@ -1092,7 +1103,7 @@ export class AuthStorage {
|
|
|
1092
1103
|
const reports = results.filter((report): report is UsageReport => report !== null);
|
|
1093
1104
|
const deduped = this.dedupeUsageReports(reports);
|
|
1094
1105
|
this.usageLogger?.debug("Usage fetch resolved", {
|
|
1095
|
-
reports: deduped.map(
|
|
1106
|
+
reports: deduped.map(report => {
|
|
1096
1107
|
const accountLabel =
|
|
1097
1108
|
this.getUsageReportMetadataValue(report, "email") ??
|
|
1098
1109
|
this.getUsageReportMetadataValue(report, "accountId") ??
|
|
@@ -1149,7 +1160,7 @@ export class AuthStorage {
|
|
|
1149
1160
|
entry.credential.type === sessionCredential.type && entry.index !== sessionCredential.index,
|
|
1150
1161
|
);
|
|
1151
1162
|
|
|
1152
|
-
return remainingCredentials.some(
|
|
1163
|
+
return remainingCredentials.some(candidate => !this.isCredentialBlocked(providerKey, candidate.index));
|
|
1153
1164
|
}
|
|
1154
1165
|
|
|
1155
1166
|
/**
|
|
@@ -1270,7 +1281,7 @@ export class AuthStorage {
|
|
|
1270
1281
|
error: String(error),
|
|
1271
1282
|
});
|
|
1272
1283
|
this.removeCredentialAt(provider, selection.index);
|
|
1273
|
-
if (this.getCredentialsForProvider(provider).some(
|
|
1284
|
+
if (this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth")) {
|
|
1274
1285
|
return this.getApiKey(provider, sessionId, options);
|
|
1275
1286
|
}
|
|
1276
1287
|
}
|
|
@@ -4,22 +4,19 @@
|
|
|
4
4
|
* When navigating to a different point in the session tree, this generates
|
|
5
5
|
* a summary of the branch being left so context isn't lost.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
9
8
|
import type { Model } from "@oh-my-pi/pi-ai";
|
|
10
9
|
import { completeSimple } from "@oh-my-pi/pi-ai";
|
|
11
|
-
import { renderPromptTemplate } from "
|
|
12
|
-
import branchSummaryPrompt from "
|
|
13
|
-
import branchSummaryPreamble from "
|
|
14
|
-
type: "text",
|
|
15
|
-
};
|
|
10
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
11
|
+
import branchSummaryPrompt from "../../prompts/compaction/branch-summary.md" with { type: "text" };
|
|
12
|
+
import branchSummaryPreamble from "../../prompts/compaction/branch-summary-preamble.md" with { type: "text" };
|
|
16
13
|
import {
|
|
17
14
|
convertToLlm,
|
|
18
15
|
createBranchSummaryMessage,
|
|
19
16
|
createCompactionSummaryMessage,
|
|
20
17
|
createCustomMessage,
|
|
21
|
-
} from "
|
|
22
|
-
import type { ReadonlySessionManager, SessionEntry } from "
|
|
18
|
+
} from "../../session/messages";
|
|
19
|
+
import type { ReadonlySessionManager, SessionEntry } from "../../session/session-manager";
|
|
23
20
|
import { estimateTokens } from "./compaction";
|
|
24
21
|
import {
|
|
25
22
|
computeFileLists,
|
|
@@ -107,7 +104,7 @@ export function collectEntriesForBranchSummary(
|
|
|
107
104
|
}
|
|
108
105
|
|
|
109
106
|
// Find common ancestor (deepest node that's on both paths)
|
|
110
|
-
const oldPath = new Set(session.getBranch(oldLeafId).map(
|
|
107
|
+
const oldPath = new Set(session.getBranch(oldLeafId).map(e => e.id));
|
|
111
108
|
const targetPath = session.getBranch(targetId);
|
|
112
109
|
|
|
113
110
|
// targetPath is root-first, so iterate backwards to find deepest common ancestor
|
|
@@ -300,7 +297,7 @@ export async function generateBranchSummary(
|
|
|
300
297
|
|
|
301
298
|
let summary = response.content
|
|
302
299
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
303
|
-
.map(
|
|
300
|
+
.map(c => c.text)
|
|
304
301
|
.join("\n");
|
|
305
302
|
|
|
306
303
|
// Prepend preamble to provide context about the branch summary
|
|
@@ -4,26 +4,15 @@
|
|
|
4
4
|
* Pure functions for compaction logic. The session manager handles I/O,
|
|
5
5
|
* and after compaction the session is reloaded.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
9
8
|
import type { AssistantMessage, Model, Usage } from "@oh-my-pi/pi-ai";
|
|
10
9
|
import { completeSimple } from "@oh-my-pi/pi-ai";
|
|
11
|
-
import { renderPromptTemplate } from "
|
|
12
|
-
import compactionSummaryPrompt from "
|
|
13
|
-
|
|
14
|
-
};
|
|
15
|
-
import
|
|
16
|
-
|
|
17
|
-
};
|
|
18
|
-
import compactionUpdateSummaryPrompt from "@oh-my-pi/pi-coding-agent/prompts/compaction/compaction-update-summary.md" with {
|
|
19
|
-
type: "text",
|
|
20
|
-
};
|
|
21
|
-
import {
|
|
22
|
-
convertToLlm,
|
|
23
|
-
createBranchSummaryMessage,
|
|
24
|
-
createCustomMessage,
|
|
25
|
-
} from "@oh-my-pi/pi-coding-agent/session/messages";
|
|
26
|
-
import type { CompactionEntry, SessionEntry } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
10
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
11
|
+
import compactionSummaryPrompt from "../../prompts/compaction/compaction-summary.md" with { type: "text" };
|
|
12
|
+
import compactionTurnPrefixPrompt from "../../prompts/compaction/compaction-turn-prefix.md" with { type: "text" };
|
|
13
|
+
import compactionUpdateSummaryPrompt from "../../prompts/compaction/compaction-update-summary.md" with { type: "text" };
|
|
14
|
+
import { convertToLlm, createBranchSummaryMessage, createCustomMessage } from "../../session/messages";
|
|
15
|
+
import type { CompactionEntry, SessionEntry } from "../../session/session-manager";
|
|
27
16
|
import {
|
|
28
17
|
computeFileLists,
|
|
29
18
|
createFileOps,
|
|
@@ -454,7 +443,7 @@ export async function generateSummary(
|
|
|
454
443
|
|
|
455
444
|
const textContent = response.content
|
|
456
445
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
457
|
-
.map(
|
|
446
|
+
.map(c => c.text)
|
|
458
447
|
.join("\n");
|
|
459
448
|
|
|
460
449
|
return textContent;
|
|
@@ -675,6 +664,6 @@ async function generateTurnPrefixSummary(
|
|
|
675
664
|
|
|
676
665
|
return response.content
|
|
677
666
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
678
|
-
.map(
|
|
667
|
+
.map(c => c.text)
|
|
679
668
|
.join("\n");
|
|
680
669
|
}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared utilities for compaction and branch summarization.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
6
5
|
import type { Message } from "@oh-my-pi/pi-ai";
|
|
7
|
-
import { renderPromptTemplate } from "
|
|
8
|
-
import fileOperationsTemplate from "
|
|
9
|
-
import summarizationSystemPrompt from "
|
|
10
|
-
type: "text",
|
|
11
|
-
};
|
|
6
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
7
|
+
import fileOperationsTemplate from "../../prompts/system/file-operations.md" with { type: "text" };
|
|
8
|
+
import summarizationSystemPrompt from "../../prompts/system/summarization-system.md" with { type: "text" };
|
|
12
9
|
|
|
13
10
|
// ============================================================================
|
|
14
11
|
// File Operation Tracking
|
|
@@ -66,7 +63,7 @@ export function extractFileOpsFromMessage(message: AgentMessage, fileOps: FileOp
|
|
|
66
63
|
*/
|
|
67
64
|
export function computeFileLists(fileOps: FileOperations): { readFiles: string[]; modifiedFiles: string[] } {
|
|
68
65
|
const modified = new Set([...fileOps.edited, ...fileOps.written]);
|
|
69
|
-
const readOnly = [...fileOps.read].filter(
|
|
66
|
+
const readOnly = [...fileOps.read].filter(f => !modified.has(f)).sort();
|
|
70
67
|
const modifiedFiles = [...modified].sort();
|
|
71
68
|
return { readFiles: readOnly, modifiedFiles };
|
|
72
69
|
}
|
|
@@ -98,7 +95,7 @@ export function serializeConversation(messages: Message[]): string {
|
|
|
98
95
|
? msg.content
|
|
99
96
|
: msg.content
|
|
100
97
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
101
|
-
.map(
|
|
98
|
+
.map(c => c.text)
|
|
102
99
|
.join("");
|
|
103
100
|
if (content) parts.push(`[User]: ${content}`);
|
|
104
101
|
} else if (msg.role === "assistant") {
|
|
@@ -132,7 +129,7 @@ export function serializeConversation(messages: Message[]): string {
|
|
|
132
129
|
} else if (msg.role === "toolResult") {
|
|
133
130
|
const content = msg.content
|
|
134
131
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
135
|
-
.map(
|
|
132
|
+
.map(c => c.text)
|
|
136
133
|
.join("");
|
|
137
134
|
if (content) {
|
|
138
135
|
parts.push(`[Tool result]: ${content}`);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Database } from "bun:sqlite";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { getAgentDir } from "@oh-my-pi/pi-coding-agent/config";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
5
4
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
5
|
+
import { getAgentDir } from "../config";
|
|
6
6
|
|
|
7
7
|
export interface HistoryEntry {
|
|
8
8
|
id: number;
|
|
@@ -81,7 +81,7 @@ END;
|
|
|
81
81
|
this.lastPromptCache = last?.prompt ?? null;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
static open(dbPath: string = join(getAgentDir(), "history.db")): HistoryStorage {
|
|
84
|
+
static open(dbPath: string = path.join(getAgentDir(), "history.db")): HistoryStorage {
|
|
85
85
|
if (!HistoryStorage.instance) {
|
|
86
86
|
HistoryStorage.instance = new HistoryStorage(dbPath);
|
|
87
87
|
}
|
|
@@ -110,7 +110,7 @@ END;
|
|
|
110
110
|
|
|
111
111
|
try {
|
|
112
112
|
const rows = this.recentStmt.all(safeLimit) as HistoryRow[];
|
|
113
|
-
return rows.map(
|
|
113
|
+
return rows.map(row => this.toEntry(row));
|
|
114
114
|
} catch (error) {
|
|
115
115
|
logger.error("HistoryStorage getRecent failed", { error: String(error) });
|
|
116
116
|
return [];
|
|
@@ -126,7 +126,7 @@ END;
|
|
|
126
126
|
|
|
127
127
|
try {
|
|
128
128
|
const rows = this.searchStmt.all(ftsQuery, safeLimit) as HistoryRow[];
|
|
129
|
-
return rows.map(
|
|
129
|
+
return rows.map(row => this.toEntry(row));
|
|
130
130
|
} catch (error) {
|
|
131
131
|
logger.error("HistoryStorage search failed", { error: String(error) });
|
|
132
132
|
return [];
|
|
@@ -134,8 +134,8 @@ END;
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
private ensureDir(dbPath: string): void {
|
|
137
|
-
const dir = dirname(dbPath);
|
|
138
|
-
mkdirSync(dir, { recursive: true });
|
|
137
|
+
const dir = path.dirname(dbPath);
|
|
138
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
private normalizeLimit(limit: number): number {
|
|
@@ -148,13 +148,13 @@ END;
|
|
|
148
148
|
const tokens = query
|
|
149
149
|
.trim()
|
|
150
150
|
.split(/\s+/)
|
|
151
|
-
.map(
|
|
151
|
+
.map(token => token.trim())
|
|
152
152
|
.filter(Boolean);
|
|
153
153
|
|
|
154
154
|
if (tokens.length === 0) return null;
|
|
155
155
|
|
|
156
156
|
return tokens
|
|
157
|
-
.map(
|
|
157
|
+
.map(token => {
|
|
158
158
|
const escaped = token.replace(/"/g, '""');
|
|
159
159
|
return `"${escaped}"*`;
|
|
160
160
|
})
|
package/src/session/messages.ts
CHANGED
|
@@ -4,11 +4,10 @@
|
|
|
4
4
|
* Extends the base AgentMessage type with coding-agent specific message types,
|
|
5
5
|
* and provides a transformer to convert them to LLM-compatible messages.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
9
8
|
import type { ImageContent, Message, TextContent } from "@oh-my-pi/pi-ai";
|
|
10
|
-
import type { OutputMeta } from "
|
|
11
|
-
import { formatOutputNotice } from "
|
|
9
|
+
import type { OutputMeta } from "../tools/output-meta";
|
|
10
|
+
import { formatOutputNotice } from "../tools/output-meta";
|
|
12
11
|
|
|
13
12
|
export const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:
|
|
14
13
|
|
|
@@ -255,7 +254,7 @@ export function convertToLlm(messages: AgentMessage[]): Message[] {
|
|
|
255
254
|
timestamp: m.timestamp,
|
|
256
255
|
};
|
|
257
256
|
case "fileMention": {
|
|
258
|
-
const fileContents = m.files.map(
|
|
257
|
+
const fileContents = m.files.map(f => `<file path="${f.path}">\n${f.content}\n</file>`).join("\n\n");
|
|
259
258
|
return {
|
|
260
259
|
role: "user",
|
|
261
260
|
content: [{ type: "text" as const, text: `<system-reminder>\n${fileContents}\n</system-reminder>` }],
|
|
@@ -272,5 +271,5 @@ export function convertToLlm(messages: AgentMessage[]): Message[] {
|
|
|
272
271
|
return undefined;
|
|
273
272
|
}
|
|
274
273
|
})
|
|
275
|
-
.filter(
|
|
274
|
+
.filter(m => m !== undefined);
|
|
276
275
|
}
|