@oh-my-pi/pi-coding-agent 8.1.0 → 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 +21 -1
- 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 +51 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +2 -3
- package/src/capability/extension-module.ts +2 -3
- package/src/capability/extension.ts +2 -3
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +2 -3
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +2 -3
- package/src/capability/mcp.ts +2 -3
- package/src/capability/prompt.ts +2 -3
- package/src/capability/rule.ts +2 -3
- package/src/capability/settings.ts +1 -2
- package/src/capability/skill.ts +2 -3
- package/src/capability/slash-command.ts +2 -3
- package/src/capability/ssh.ts +2 -3
- package/src/capability/system-prompt.ts +2 -3
- package/src/capability/tool.ts +2 -3
- 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 -21
- 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 +21 -23
- package/src/commit/agentic/fallback.ts +9 -9
- package/src/commit/agentic/index.ts +30 -38
- package/src/commit/agentic/state.ts +1 -6
- package/src/commit/agentic/tools/analyze-file.ts +15 -15
- package/src/commit/agentic/tools/git-file-diff.ts +3 -3
- package/src/commit/agentic/tools/git-hunk.ts +7 -7
- package/src/commit/agentic/tools/git-overview.ts +5 -5
- package/src/commit/agentic/tools/index.ts +14 -14
- package/src/commit/agentic/tools/propose-changelog.ts +6 -6
- package/src/commit/agentic/tools/propose-commit.ts +8 -8
- package/src/commit/agentic/tools/recent-commits.ts +2 -2
- package/src/commit/agentic/tools/split-commit.ts +19 -23
- package/src/commit/agentic/topo-sort.ts +1 -1
- package/src/commit/agentic/trivial.ts +3 -3
- package/src/commit/agentic/validation.ts +12 -12
- package/src/commit/analysis/conventional.ts +7 -11
- package/src/commit/analysis/index.ts +4 -4
- package/src/commit/analysis/scope.ts +4 -4
- package/src/commit/analysis/summary.ts +7 -9
- package/src/commit/analysis/validation.ts +1 -1
- package/src/commit/changelog/detect.ts +6 -6
- package/src/commit/changelog/generate.ts +7 -9
- package/src/commit/changelog/index.ts +13 -13
- package/src/commit/changelog/parse.ts +2 -2
- package/src/commit/cli.ts +1 -1
- package/src/commit/git/diff.ts +3 -3
- package/src/commit/git/index.ts +19 -24
- package/src/commit/index.ts +1 -1
- package/src/commit/map-reduce/index.ts +9 -9
- package/src/commit/map-reduce/map-phase.ts +19 -34
- package/src/commit/map-reduce/reduce-phase.ts +9 -11
- package/src/commit/message.ts +2 -2
- package/src/commit/model-selection.ts +3 -7
- package/src/commit/pipeline.ts +20 -22
- package/src/commit/utils/exclusions.ts +3 -3
- package/src/config/file-lock.ts +17 -7
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +55 -37
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +50 -34
- package/src/config.ts +60 -62
- 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 +16 -18
- 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 +17 -14
- package/src/extensibility/custom-commands/types.ts +1 -2
- package/src/extensibility/custom-tools/loader.ts +10 -11
- package/src/extensibility/custom-tools/types.ts +6 -7
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +75 -53
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +19 -26
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +8 -9
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +10 -17
- 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 +46 -46
- 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 +14 -10
- 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 +10 -16
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +55 -34
- 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 +3 -4
- 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 +60 -49
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +6 -6
- 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 +11 -16
- package/src/modes/components/tree-selector.ts +11 -11
- 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 +27 -29
- 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 -25
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +2 -2
- package/src/modes/theme/theme.ts +128 -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 +10 -11
- 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 +12 -13
- package/src/sdk.ts +60 -63
- package/src/session/agent-session.ts +83 -84
- package/src/session/agent-storage.ts +11 -11
- package/src/session/artifacts.ts +8 -9
- package/src/session/auth-storage.ts +25 -29
- 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 +2 -3
- 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 +27 -34
- 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 +33 -36
- package/src/task/output-manager.ts +3 -4
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +19 -20
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +32 -38
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +8 -9
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +19 -18
- package/src/tools/calculator.ts +12 -12
- package/src/tools/complete.ts +3 -4
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +23 -26
- package/src/tools/find.ts +15 -16
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +27 -27
- package/src/tools/index.ts +78 -56
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +7 -7
- package/src/tools/notebook.ts +5 -5
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +1 -1
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +36 -37
- package/src/tools/read.ts +23 -23
- package/src/tools/render-utils.ts +8 -9
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +31 -30
- package/src/tools/todo-write.ts +13 -13
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +11 -16
- package/src/tui/code-cell.ts +3 -9
- package/src/tui/file-list.ts +3 -4
- package/src/tui/output-block.ts +1 -2
- package/src/tui/status-line.ts +2 -3
- package/src/tui/tree-list.ts +2 -3
- package/src/tui/types.ts +1 -2
- package/src/tui/utils.ts +2 -3
- 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 +4 -9
- 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 +16 -18
- package/scripts/generate-wasm-b64.ts +0 -24
- package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
- package/src/task/.executor.ts.kate-swp +0 -0
- package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
|
@@ -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:";
|
|
@@ -230,7 +229,7 @@ export class AuthStorage {
|
|
|
230
229
|
for (const [provider, creds] of Object.entries(data.credentials)) {
|
|
231
230
|
instance.data.set(
|
|
232
231
|
provider,
|
|
233
|
-
creds.map(
|
|
232
|
+
creds.map(c => ({
|
|
234
233
|
id: c.id,
|
|
235
234
|
credential:
|
|
236
235
|
c.type === "api_key"
|
|
@@ -255,7 +254,7 @@ export class AuthStorage {
|
|
|
255
254
|
serialize(): SerializedAuthStorage {
|
|
256
255
|
const credentials: SerializedAuthStorage["credentials"] = {};
|
|
257
256
|
for (const [provider, creds] of this.data.entries()) {
|
|
258
|
-
credentials[provider] = creds.map(
|
|
257
|
+
credentials[provider] = creds.map(c => ({
|
|
259
258
|
id: c.id,
|
|
260
259
|
type: c.credential.type,
|
|
261
260
|
data: c.credential.type === "api_key" ? { key: c.credential.key } : { ...c.credential },
|
|
@@ -282,7 +281,7 @@ export class AuthStorage {
|
|
|
282
281
|
if (authPath.endsWith(".db")) {
|
|
283
282
|
return authPath;
|
|
284
283
|
}
|
|
285
|
-
return getAgentDbPath(dirname(authPath));
|
|
284
|
+
return getAgentDbPath(path.dirname(authPath));
|
|
286
285
|
}
|
|
287
286
|
|
|
288
287
|
/**
|
|
@@ -313,10 +312,10 @@ export class AuthStorage {
|
|
|
313
312
|
* Migrates legacy auth.json/settings.json on first load.
|
|
314
313
|
*/
|
|
315
314
|
async reload(): Promise<void> {
|
|
316
|
-
const agentDir = dirname(this.dbPath);
|
|
315
|
+
const agentDir = path.dirname(this.dbPath);
|
|
317
316
|
await migrateJsonStorage({
|
|
318
317
|
agentDir,
|
|
319
|
-
settingsPath: join(agentDir, "settings.json"),
|
|
318
|
+
settingsPath: path.join(agentDir, "settings.json"),
|
|
320
319
|
authPaths: [this.authPath, ...this.fallbackPaths],
|
|
321
320
|
});
|
|
322
321
|
|
|
@@ -425,7 +424,7 @@ export class AuthStorage {
|
|
|
425
424
|
deduped.push(credential);
|
|
426
425
|
continue;
|
|
427
426
|
}
|
|
428
|
-
if (identifiers.some(
|
|
427
|
+
if (identifiers.some(identifier => seen.has(identifier))) {
|
|
429
428
|
continue;
|
|
430
429
|
}
|
|
431
430
|
for (const identifier of identifiers) {
|
|
@@ -452,7 +451,7 @@ export class AuthStorage {
|
|
|
452
451
|
kept.push(entry);
|
|
453
452
|
continue;
|
|
454
453
|
}
|
|
455
|
-
if (identifiers.some(
|
|
454
|
+
if (identifiers.some(identifier => seen.has(identifier))) {
|
|
456
455
|
removed.push(entry);
|
|
457
456
|
continue;
|
|
458
457
|
}
|
|
@@ -472,7 +471,7 @@ export class AuthStorage {
|
|
|
472
471
|
|
|
473
472
|
/** Returns all credentials for a provider as an array */
|
|
474
473
|
private getCredentialsForProvider(provider: string): AuthCredential[] {
|
|
475
|
-
return this.getStoredCredentials(provider).map(
|
|
474
|
+
return this.getStoredCredentials(provider).map(entry => entry.credential);
|
|
476
475
|
}
|
|
477
476
|
|
|
478
477
|
/** Composite key for round-robin tracking: "anthropic:oauth" or "openai:api_key" */
|
|
@@ -660,7 +659,7 @@ export class AuthStorage {
|
|
|
660
659
|
const stored = this.storage.replaceAuthCredentialsForProvider(provider, deduped);
|
|
661
660
|
this.setStoredCredentials(
|
|
662
661
|
provider,
|
|
663
|
-
stored.map(
|
|
662
|
+
stored.map(record => ({ id: record.id, credential: record.credential })),
|
|
664
663
|
);
|
|
665
664
|
this.resetProviderAssignments(provider);
|
|
666
665
|
}
|
|
@@ -704,7 +703,7 @@ export class AuthStorage {
|
|
|
704
703
|
* Check if OAuth credentials are configured for a provider.
|
|
705
704
|
*/
|
|
706
705
|
hasOAuth(provider: string): boolean {
|
|
707
|
-
return this.getCredentialsForProvider(provider).some(
|
|
706
|
+
return this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth");
|
|
708
707
|
}
|
|
709
708
|
|
|
710
709
|
/**
|
|
@@ -722,7 +721,7 @@ export class AuthStorage {
|
|
|
722
721
|
getAll(): AuthStorageData {
|
|
723
722
|
const result: AuthStorageData = {};
|
|
724
723
|
for (const [provider, entries] of this.data.entries()) {
|
|
725
|
-
const credentials = entries.map(
|
|
724
|
+
const credentials = entries.map(entry => entry.credential);
|
|
726
725
|
if (credentials.length === 1) {
|
|
727
726
|
result[provider] = credentials[0];
|
|
728
727
|
} else if (credentials.length > 1) {
|
|
@@ -773,7 +772,7 @@ export class AuthStorage {
|
|
|
773
772
|
break;
|
|
774
773
|
case "cursor":
|
|
775
774
|
credentials = await loginCursor(
|
|
776
|
-
|
|
775
|
+
url => ctrl.onAuth({ url }),
|
|
777
776
|
ctrl.onProgress ? () => ctrl.onProgress?.("Waiting for browser authentication...") : undefined,
|
|
778
777
|
);
|
|
779
778
|
break;
|
|
@@ -847,7 +846,7 @@ export class AuthStorage {
|
|
|
847
846
|
if (username) identifiers.push(`account:${username}`);
|
|
848
847
|
const scopeAccountId = this.getUsageReportScopeAccountId(report);
|
|
849
848
|
if (scopeAccountId) identifiers.push(`account:${scopeAccountId}`);
|
|
850
|
-
return identifiers.map(
|
|
849
|
+
return identifiers.map(identifier => `${report.provider}:${identifier.toLowerCase()}`);
|
|
851
850
|
}
|
|
852
851
|
|
|
853
852
|
private mergeUsageReportGroup(reports: UsageReport[]): UsageReport {
|
|
@@ -859,7 +858,7 @@ export class AuthStorage {
|
|
|
859
858
|
});
|
|
860
859
|
const base = sorted[0];
|
|
861
860
|
const mergedLimits = [...base.limits];
|
|
862
|
-
const limitIds = new Set(mergedLimits.map(
|
|
861
|
+
const limitIds = new Set(mergedLimits.map(limit => limit.id));
|
|
863
862
|
const mergedMetadata: Record<string, unknown> = { ...(base.metadata ?? {}) };
|
|
864
863
|
let fetchedAt = base.fetchedAt;
|
|
865
864
|
|
|
@@ -912,7 +911,7 @@ export class AuthStorage {
|
|
|
912
911
|
}
|
|
913
912
|
}
|
|
914
913
|
|
|
915
|
-
const deduped = groups.map(
|
|
914
|
+
const deduped = groups.map(group => this.mergeUsageReportGroup(group));
|
|
916
915
|
if (deduped.length !== reports.length) {
|
|
917
916
|
this.usageLogger?.debug("Usage reports deduped", {
|
|
918
917
|
before: reports.length,
|
|
@@ -935,7 +934,7 @@ export class AuthStorage {
|
|
|
935
934
|
|
|
936
935
|
/** Returns true if usage indicates rate limit has been reached. */
|
|
937
936
|
private isUsageLimitReached(report: UsageReport): boolean {
|
|
938
|
-
return report.limits.some(
|
|
937
|
+
return report.limits.some(limit => this.isUsageLimitExhausted(limit));
|
|
939
938
|
}
|
|
940
939
|
|
|
941
940
|
/** Extracts the earliest reset timestamp from exhausted windows (in ms). */
|
|
@@ -1000,10 +999,7 @@ export class AuthStorage {
|
|
|
1000
999
|
if (!resolver || !cache) return null;
|
|
1001
1000
|
|
|
1002
1001
|
const tasks: Array<Promise<UsageReport | null>> = [];
|
|
1003
|
-
const providers = new Set<string>([
|
|
1004
|
-
...this.data.keys(),
|
|
1005
|
-
...DEFAULT_USAGE_PROVIDERS.map((provider) => provider.id),
|
|
1006
|
-
]);
|
|
1002
|
+
const providers = new Set<string>([...this.data.keys(), ...DEFAULT_USAGE_PROVIDERS.map(provider => provider.id)]);
|
|
1007
1003
|
this.usageLogger?.debug("Usage fetch requested", {
|
|
1008
1004
|
providers: Array.from(providers).sort(),
|
|
1009
1005
|
});
|
|
@@ -1048,7 +1044,7 @@ export class AuthStorage {
|
|
|
1048
1044
|
now: this.usageNow,
|
|
1049
1045
|
logger: this.usageLogger,
|
|
1050
1046
|
})
|
|
1051
|
-
.catch(
|
|
1047
|
+
.catch(error => {
|
|
1052
1048
|
logger.debug("AuthStorage usage fetch failed", {
|
|
1053
1049
|
provider,
|
|
1054
1050
|
error: String(error),
|
|
@@ -1091,7 +1087,7 @@ export class AuthStorage {
|
|
|
1091
1087
|
now: this.usageNow,
|
|
1092
1088
|
logger: this.usageLogger,
|
|
1093
1089
|
})
|
|
1094
|
-
.catch(
|
|
1090
|
+
.catch(error => {
|
|
1095
1091
|
logger.debug("AuthStorage usage fetch failed", {
|
|
1096
1092
|
provider,
|
|
1097
1093
|
error: String(error),
|
|
@@ -1107,7 +1103,7 @@ export class AuthStorage {
|
|
|
1107
1103
|
const reports = results.filter((report): report is UsageReport => report !== null);
|
|
1108
1104
|
const deduped = this.dedupeUsageReports(reports);
|
|
1109
1105
|
this.usageLogger?.debug("Usage fetch resolved", {
|
|
1110
|
-
reports: deduped.map(
|
|
1106
|
+
reports: deduped.map(report => {
|
|
1111
1107
|
const accountLabel =
|
|
1112
1108
|
this.getUsageReportMetadataValue(report, "email") ??
|
|
1113
1109
|
this.getUsageReportMetadataValue(report, "accountId") ??
|
|
@@ -1164,7 +1160,7 @@ export class AuthStorage {
|
|
|
1164
1160
|
entry.credential.type === sessionCredential.type && entry.index !== sessionCredential.index,
|
|
1165
1161
|
);
|
|
1166
1162
|
|
|
1167
|
-
return remainingCredentials.some(
|
|
1163
|
+
return remainingCredentials.some(candidate => !this.isCredentialBlocked(providerKey, candidate.index));
|
|
1168
1164
|
}
|
|
1169
1165
|
|
|
1170
1166
|
/**
|
|
@@ -1285,7 +1281,7 @@ export class AuthStorage {
|
|
|
1285
1281
|
error: String(error),
|
|
1286
1282
|
});
|
|
1287
1283
|
this.removeCredentialAt(provider, selection.index);
|
|
1288
|
-
if (this.getCredentialsForProvider(provider).some(
|
|
1284
|
+
if (this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth")) {
|
|
1289
1285
|
return this.getApiKey(provider, sessionId, options);
|
|
1290
1286
|
}
|
|
1291
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
|
}
|