@aexol/spectral 0.7.1 → 0.7.5
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 +5 -0
- package/dist/agent/agents.js +1 -1
- package/dist/agent/index.js +199 -184
- package/dist/commands/serve.js +0 -3
- package/dist/designer/data/systems/renault/DESIGN.md +1 -1
- package/dist/designer/philosophies.js +668 -0
- package/dist/mcp/sampling-handler.js +1 -1
- package/dist/memory/commands/status.js +1 -1
- package/dist/memory/compaction.js +2 -2
- package/dist/memory/config.js +1 -1
- package/dist/memory/debug-log.js +1 -1
- package/dist/memory/hooks/compaction-hook.js +29 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/observer.js +2 -2
- package/dist/memory/project-observations-store.js +14 -0
- package/dist/memory/tokens.js +1 -1
- package/dist/memory/tools/read-project-observations.js +82 -0
- package/dist/memory/tools/recall-observation.js +2 -2
- package/dist/pi/agent-core/agent-loop.js +501 -0
- package/dist/pi/agent-core/agent.js +401 -0
- package/dist/pi/agent-core/harness/agent-harness.js +899 -0
- package/dist/pi/agent-core/harness/compaction/branch-summarization.js +173 -0
- package/dist/pi/agent-core/harness/compaction/compaction.js +532 -0
- package/dist/pi/agent-core/harness/compaction/utils.js +130 -0
- package/dist/pi/agent-core/harness/env/nodejs.js +485 -0
- package/dist/pi/agent-core/harness/messages.js +101 -0
- package/dist/pi/agent-core/harness/prompt-templates.js +229 -0
- package/dist/pi/agent-core/harness/session/jsonl-repo.js +100 -0
- package/dist/pi/agent-core/harness/session/jsonl-storage.js +230 -0
- package/dist/pi/agent-core/harness/session/memory-repo.js +41 -0
- package/dist/pi/agent-core/harness/session/memory-storage.js +113 -0
- package/dist/pi/agent-core/harness/session/repo-utils.js +38 -0
- package/dist/pi/agent-core/harness/session/session.js +196 -0
- package/dist/pi/agent-core/harness/session/uuid.js +49 -0
- package/dist/pi/agent-core/harness/skills.js +310 -0
- package/dist/pi/agent-core/harness/system-prompt.js +29 -0
- package/dist/pi/agent-core/harness/types.js +93 -0
- package/dist/pi/agent-core/harness/utils/shell-output.js +125 -0
- package/dist/pi/agent-core/harness/utils/truncate.js +289 -0
- package/dist/pi/agent-core/index.js +24 -0
- package/dist/pi/agent-core/node.js +2 -0
- package/dist/pi/agent-core/proxy.js +277 -0
- package/dist/pi/agent-core/types.js +1 -0
- package/dist/pi/ai/api-registry.js +43 -0
- package/dist/pi/ai/cli.js +120 -0
- package/dist/pi/ai/env-api-keys.js +169 -0
- package/dist/pi/ai/image-models.generated.js +441 -0
- package/dist/pi/ai/image-models.js +22 -0
- package/dist/pi/ai/images-api-registry.js +21 -0
- package/dist/pi/ai/images.js +13 -0
- package/dist/pi/ai/index.js +18 -0
- package/dist/pi/ai/models.generated.js +16220 -0
- package/dist/pi/ai/models.js +70 -0
- package/dist/pi/ai/oauth.js +1 -0
- package/dist/pi/ai/providers/anthropic.js +945 -0
- package/dist/pi/ai/providers/faux.js +367 -0
- package/dist/pi/ai/providers/github-copilot-headers.js +28 -0
- package/dist/pi/ai/providers/openai-completions.js +945 -0
- package/dist/pi/ai/providers/openai-prompt-cache.js +9 -0
- package/dist/pi/ai/providers/register-builtins.js +97 -0
- package/dist/pi/ai/providers/simple-options.js +40 -0
- package/dist/pi/ai/providers/transform-messages.js +183 -0
- package/dist/pi/ai/session-resources.js +21 -0
- package/dist/pi/ai/stream.js +26 -0
- package/dist/pi/ai/types.js +1 -0
- package/dist/pi/ai/utils/diagnostics.js +24 -0
- package/dist/pi/ai/utils/event-stream.js +80 -0
- package/dist/pi/ai/utils/hash.js +13 -0
- package/dist/pi/ai/utils/headers.js +7 -0
- package/dist/pi/ai/utils/json-parse.js +112 -0
- package/dist/pi/ai/utils/node-http-proxy.js +96 -0
- package/dist/pi/ai/utils/oauth/anthropic.js +334 -0
- package/dist/pi/ai/utils/oauth/device-code.js +54 -0
- package/dist/pi/ai/utils/oauth/github-copilot.js +270 -0
- package/dist/pi/ai/utils/oauth/index.js +121 -0
- package/dist/pi/ai/utils/oauth/oauth-page.js +104 -0
- package/dist/pi/ai/utils/oauth/openai-codex.js +384 -0
- package/dist/pi/ai/utils/oauth/pkce.js +30 -0
- package/dist/pi/ai/utils/oauth/types.js +1 -0
- package/dist/pi/ai/utils/overflow.js +150 -0
- package/dist/pi/ai/utils/sanitize-unicode.js +25 -0
- package/dist/pi/ai/utils/typebox-helpers.js +20 -0
- package/dist/pi/ai/utils/validation.js +280 -0
- package/dist/pi/coding-agent/bun/cli.js +7 -0
- package/dist/pi/coding-agent/bun/restore-sandbox-env.js +31 -0
- package/dist/pi/coding-agent/cli/args.js +340 -0
- package/dist/pi/coding-agent/cli/file-processor.js +82 -0
- package/dist/pi/coding-agent/cli/initial-message.js +21 -0
- package/dist/pi/coding-agent/cli.js +17 -0
- package/dist/pi/coding-agent/config.js +414 -0
- package/dist/pi/coding-agent/core/agent-session-runtime.js +299 -0
- package/dist/pi/coding-agent/core/agent-session-services.js +117 -0
- package/dist/pi/coding-agent/core/agent-session.js +2498 -0
- package/dist/pi/coding-agent/core/auth-guidance.js +20 -0
- package/dist/pi/coding-agent/core/auth-storage.js +441 -0
- package/dist/pi/coding-agent/core/bash-executor.js +110 -0
- package/dist/pi/coding-agent/core/compaction/branch-summarization.js +242 -0
- package/dist/pi/coding-agent/core/compaction/compaction.js +624 -0
- package/dist/pi/coding-agent/core/compaction/index.js +6 -0
- package/dist/pi/coding-agent/core/compaction/utils.js +152 -0
- package/dist/pi/coding-agent/core/defaults.js +1 -0
- package/dist/pi/coding-agent/core/diagnostics.js +1 -0
- package/dist/pi/coding-agent/core/event-bus.js +24 -0
- package/dist/pi/coding-agent/core/exec.js +74 -0
- package/dist/pi/coding-agent/core/export-html/ansi-to-html.js +248 -0
- package/dist/pi/coding-agent/core/export-html/index.js +225 -0
- package/dist/pi/coding-agent/core/export-html/tool-renderer.js +107 -0
- package/dist/pi/coding-agent/core/extensions/index.js +8 -0
- package/dist/pi/coding-agent/core/extensions/loader.js +485 -0
- package/dist/pi/coding-agent/core/extensions/runner.js +824 -0
- package/dist/pi/coding-agent/core/extensions/types.js +44 -0
- package/dist/pi/coding-agent/core/extensions/wrapper.js +21 -0
- package/dist/pi/coding-agent/core/footer-data-provider.js +309 -0
- package/dist/pi/coding-agent/core/http-dispatcher.js +47 -0
- package/dist/pi/coding-agent/core/index.js +11 -0
- package/dist/pi/coding-agent/core/keybindings.js +294 -0
- package/dist/pi/coding-agent/core/messages.js +122 -0
- package/dist/pi/coding-agent/core/model-registry.js +728 -0
- package/dist/pi/coding-agent/core/model-resolver.js +494 -0
- package/dist/pi/coding-agent/core/output-guard.js +58 -0
- package/dist/pi/coding-agent/core/package-manager.js +2020 -0
- package/dist/pi/coding-agent/core/prompt-templates.js +237 -0
- package/dist/pi/coding-agent/core/provider-display-names.js +32 -0
- package/dist/pi/coding-agent/core/resolve-config-value.js +125 -0
- package/dist/pi/coding-agent/core/resource-loader.js +733 -0
- package/dist/pi/coding-agent/core/sdk.js +282 -0
- package/dist/pi/coding-agent/core/session-cwd.js +37 -0
- package/dist/pi/coding-agent/core/session-manager.js +1146 -0
- package/dist/pi/coding-agent/core/settings-manager.js +794 -0
- package/dist/pi/coding-agent/core/skills.js +386 -0
- package/dist/pi/coding-agent/core/slash-commands.js +24 -0
- package/dist/pi/coding-agent/core/source-info.js +18 -0
- package/dist/pi/coding-agent/core/system-prompt.js +122 -0
- package/dist/pi/coding-agent/core/telemetry.js +8 -0
- package/dist/pi/coding-agent/core/timings.js +30 -0
- package/dist/pi/coding-agent/core/tools/bash.js +341 -0
- package/dist/pi/coding-agent/core/tools/edit-diff.js +344 -0
- package/dist/pi/coding-agent/core/tools/edit.js +324 -0
- package/dist/pi/coding-agent/core/tools/file-mutation-queue.js +36 -0
- package/dist/pi/coding-agent/core/tools/find.js +297 -0
- package/dist/pi/coding-agent/core/tools/grep.js +303 -0
- package/dist/pi/coding-agent/core/tools/index.js +111 -0
- package/dist/pi/coding-agent/core/tools/ls.js +168 -0
- package/dist/pi/coding-agent/core/tools/output-accumulator.js +183 -0
- package/dist/pi/coding-agent/core/tools/path-utils.js +61 -0
- package/dist/pi/coding-agent/core/tools/read.js +288 -0
- package/dist/pi/coding-agent/core/tools/render-utils.js +48 -0
- package/dist/pi/coding-agent/core/tools/tool-definition-wrapper.js +33 -0
- package/dist/pi/coding-agent/core/tools/truncate.js +214 -0
- package/dist/pi/coding-agent/core/tools/write.js +212 -0
- package/dist/pi/coding-agent/index.js +41 -0
- package/dist/pi/coding-agent/main.js +5 -0
- package/dist/pi/coding-agent/migrations.js +280 -0
- package/dist/pi/coding-agent/modes/index.js +7 -0
- package/dist/pi/coding-agent/modes/interactive/components/diff.js +132 -0
- package/dist/pi/coding-agent/modes/interactive/components/keybinding-hints.js +35 -0
- package/dist/pi/coding-agent/modes/interactive/components/visual-truncate.js +32 -0
- package/dist/pi/coding-agent/modes/interactive/interactive-mode.js +3 -0
- package/dist/pi/coding-agent/modes/interactive/theme/theme.js +1023 -0
- package/dist/pi/coding-agent/modes/print-mode.js +130 -0
- package/dist/pi/coding-agent/modes/rpc/jsonl.js +48 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-client.js +409 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-mode.js +600 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-types.js +7 -0
- package/dist/pi/coding-agent/utils/ansi.js +51 -0
- package/dist/pi/coding-agent/utils/changelog.js +86 -0
- package/dist/pi/coding-agent/utils/child-process.js +87 -0
- package/dist/pi/coding-agent/utils/clipboard-image.js +244 -0
- package/dist/pi/coding-agent/utils/clipboard-native.js +13 -0
- package/dist/pi/coding-agent/utils/clipboard.js +116 -0
- package/dist/pi/coding-agent/utils/exif-orientation.js +157 -0
- package/dist/pi/coding-agent/utils/frontmatter.js +25 -0
- package/dist/pi/coding-agent/utils/fs-watch.js +24 -0
- package/dist/pi/coding-agent/utils/git.js +162 -0
- package/dist/pi/coding-agent/utils/html.js +39 -0
- package/dist/pi/coding-agent/utils/image-convert.js +38 -0
- package/dist/pi/coding-agent/utils/image-resize.js +136 -0
- package/dist/pi/coding-agent/utils/mime.js +68 -0
- package/dist/pi/coding-agent/utils/paths.js +91 -0
- package/dist/pi/coding-agent/utils/photon.js +120 -0
- package/dist/pi/coding-agent/utils/pi-user-agent.js +4 -0
- package/dist/pi/coding-agent/utils/shell.js +194 -0
- package/dist/pi/coding-agent/utils/sleep.js +16 -0
- package/dist/pi/coding-agent/utils/syntax-highlight.js +117 -0
- package/dist/pi/coding-agent/utils/tools-manager.js +327 -0
- package/dist/pi/coding-agent/utils/version-check.js +81 -0
- package/dist/pi/coding-agent/utils/windows-self-update.js +76 -0
- package/dist/pi/tui/autocomplete.js +631 -0
- package/dist/pi/tui/components/box.js +103 -0
- package/dist/pi/tui/components/cancellable-loader.js +34 -0
- package/dist/pi/tui/components/editor.js +1915 -0
- package/dist/pi/tui/components/image.js +88 -0
- package/dist/pi/tui/components/input.js +425 -0
- package/dist/pi/tui/components/loader.js +68 -0
- package/dist/pi/tui/components/markdown.js +633 -0
- package/dist/pi/tui/components/select-list.js +158 -0
- package/dist/pi/tui/components/settings-list.js +184 -0
- package/dist/pi/tui/components/spacer.js +22 -0
- package/dist/pi/tui/components/text.js +88 -0
- package/dist/pi/tui/components/truncated-text.js +50 -0
- package/dist/pi/tui/editor-component.js +1 -0
- package/dist/pi/tui/fuzzy.js +109 -0
- package/dist/pi/tui/index.js +31 -0
- package/dist/pi/tui/keybindings.js +173 -0
- package/dist/pi/tui/keys.js +1172 -0
- package/dist/pi/tui/kill-ring.js +43 -0
- package/dist/pi/tui/stdin-buffer.js +360 -0
- package/dist/pi/tui/terminal-image.js +335 -0
- package/dist/pi/tui/terminal.js +324 -0
- package/dist/pi/tui/tui.js +1076 -0
- package/dist/pi/tui/undo-stack.js +24 -0
- package/dist/pi/tui/utils.js +1016 -0
- package/dist/relay/dispatcher.js +30 -0
- package/dist/server/handlers/queue.js +52 -0
- package/dist/server/pi-bridge.js +9 -1
- package/dist/server/session-stream.js +76 -111
- package/dist/server/storage.js +154 -2
- package/dist/server/title-generator.js +14 -153
- package/package.json +24 -6
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { TUI_KEYBINDINGS, KeybindingsManager as TuiKeybindingsManager, } from "../../tui/index.js";
|
|
2
|
+
import { existsSync, readFileSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { getAgentDir } from "../config.js";
|
|
5
|
+
export const KEYBINDINGS = {
|
|
6
|
+
...TUI_KEYBINDINGS,
|
|
7
|
+
"app.interrupt": { defaultKeys: "escape", description: "Cancel or abort" },
|
|
8
|
+
"app.clear": { defaultKeys: "ctrl+c", description: "Clear editor" },
|
|
9
|
+
"app.exit": { defaultKeys: "ctrl+d", description: "Exit when editor is empty" },
|
|
10
|
+
"app.suspend": {
|
|
11
|
+
defaultKeys: process.platform === "win32" ? [] : "ctrl+z",
|
|
12
|
+
description: "Suspend to background",
|
|
13
|
+
},
|
|
14
|
+
"app.thinking.cycle": {
|
|
15
|
+
defaultKeys: "shift+tab",
|
|
16
|
+
description: "Cycle thinking level",
|
|
17
|
+
},
|
|
18
|
+
"app.model.cycleForward": {
|
|
19
|
+
defaultKeys: "ctrl+p",
|
|
20
|
+
description: "Cycle to next model",
|
|
21
|
+
},
|
|
22
|
+
"app.model.cycleBackward": {
|
|
23
|
+
defaultKeys: "shift+ctrl+p",
|
|
24
|
+
description: "Cycle to previous model",
|
|
25
|
+
},
|
|
26
|
+
"app.model.select": { defaultKeys: "ctrl+l", description: "Open model selector" },
|
|
27
|
+
"app.tools.expand": { defaultKeys: "ctrl+o", description: "Toggle tool output" },
|
|
28
|
+
"app.thinking.toggle": {
|
|
29
|
+
defaultKeys: "ctrl+t",
|
|
30
|
+
description: "Toggle thinking blocks",
|
|
31
|
+
},
|
|
32
|
+
"app.session.toggleNamedFilter": {
|
|
33
|
+
defaultKeys: "ctrl+n",
|
|
34
|
+
description: "Toggle named session filter",
|
|
35
|
+
},
|
|
36
|
+
"app.editor.external": {
|
|
37
|
+
defaultKeys: "ctrl+g",
|
|
38
|
+
description: "Open external editor",
|
|
39
|
+
},
|
|
40
|
+
"app.message.followUp": {
|
|
41
|
+
defaultKeys: "alt+enter",
|
|
42
|
+
description: "Queue follow-up message",
|
|
43
|
+
},
|
|
44
|
+
"app.message.dequeue": {
|
|
45
|
+
defaultKeys: "alt+up",
|
|
46
|
+
description: "Restore queued messages",
|
|
47
|
+
},
|
|
48
|
+
"app.clipboard.pasteImage": {
|
|
49
|
+
defaultKeys: process.platform === "win32" ? "alt+v" : "ctrl+v",
|
|
50
|
+
description: "Paste image from clipboard",
|
|
51
|
+
},
|
|
52
|
+
"app.session.new": { defaultKeys: [], description: "Start a new session" },
|
|
53
|
+
"app.session.tree": { defaultKeys: [], description: "Open session tree" },
|
|
54
|
+
"app.session.fork": { defaultKeys: [], description: "Fork current session" },
|
|
55
|
+
"app.session.resume": { defaultKeys: [], description: "Resume a session" },
|
|
56
|
+
"app.tree.foldOrUp": {
|
|
57
|
+
defaultKeys: ["ctrl+left", "alt+left"],
|
|
58
|
+
description: "Fold tree branch or move up",
|
|
59
|
+
},
|
|
60
|
+
"app.tree.unfoldOrDown": {
|
|
61
|
+
defaultKeys: ["ctrl+right", "alt+right"],
|
|
62
|
+
description: "Unfold tree branch or move down",
|
|
63
|
+
},
|
|
64
|
+
"app.tree.editLabel": {
|
|
65
|
+
defaultKeys: "shift+l",
|
|
66
|
+
description: "Edit tree label",
|
|
67
|
+
},
|
|
68
|
+
"app.tree.toggleLabelTimestamp": {
|
|
69
|
+
defaultKeys: "shift+t",
|
|
70
|
+
description: "Toggle tree label timestamps",
|
|
71
|
+
},
|
|
72
|
+
"app.session.togglePath": {
|
|
73
|
+
defaultKeys: "ctrl+p",
|
|
74
|
+
description: "Toggle session path display",
|
|
75
|
+
},
|
|
76
|
+
"app.session.toggleSort": {
|
|
77
|
+
defaultKeys: "ctrl+s",
|
|
78
|
+
description: "Toggle session sort mode",
|
|
79
|
+
},
|
|
80
|
+
"app.session.rename": {
|
|
81
|
+
defaultKeys: "ctrl+r",
|
|
82
|
+
description: "Rename session",
|
|
83
|
+
},
|
|
84
|
+
"app.session.delete": {
|
|
85
|
+
defaultKeys: "ctrl+d",
|
|
86
|
+
description: "Delete session",
|
|
87
|
+
},
|
|
88
|
+
"app.session.deleteNoninvasive": {
|
|
89
|
+
defaultKeys: "ctrl+backspace",
|
|
90
|
+
description: "Delete session when query is empty",
|
|
91
|
+
},
|
|
92
|
+
"app.models.save": {
|
|
93
|
+
defaultKeys: "ctrl+s",
|
|
94
|
+
description: "Save model selection",
|
|
95
|
+
},
|
|
96
|
+
"app.models.enableAll": {
|
|
97
|
+
defaultKeys: "ctrl+a",
|
|
98
|
+
description: "Enable all models",
|
|
99
|
+
},
|
|
100
|
+
"app.models.clearAll": {
|
|
101
|
+
defaultKeys: "ctrl+x",
|
|
102
|
+
description: "Clear all models",
|
|
103
|
+
},
|
|
104
|
+
"app.models.toggleProvider": {
|
|
105
|
+
defaultKeys: "ctrl+p",
|
|
106
|
+
description: "Toggle all models for provider",
|
|
107
|
+
},
|
|
108
|
+
"app.models.reorderUp": {
|
|
109
|
+
defaultKeys: "alt+up",
|
|
110
|
+
description: "Move model up in order",
|
|
111
|
+
},
|
|
112
|
+
"app.models.reorderDown": {
|
|
113
|
+
defaultKeys: "alt+down",
|
|
114
|
+
description: "Move model down in order",
|
|
115
|
+
},
|
|
116
|
+
"app.tree.filter.default": {
|
|
117
|
+
defaultKeys: "ctrl+d",
|
|
118
|
+
description: "Tree filter: default view",
|
|
119
|
+
},
|
|
120
|
+
"app.tree.filter.noTools": {
|
|
121
|
+
defaultKeys: "ctrl+t",
|
|
122
|
+
description: "Tree filter: hide tool results",
|
|
123
|
+
},
|
|
124
|
+
"app.tree.filter.userOnly": {
|
|
125
|
+
defaultKeys: "ctrl+u",
|
|
126
|
+
description: "Tree filter: user messages only",
|
|
127
|
+
},
|
|
128
|
+
"app.tree.filter.labeledOnly": {
|
|
129
|
+
defaultKeys: "ctrl+l",
|
|
130
|
+
description: "Tree filter: labeled entries only",
|
|
131
|
+
},
|
|
132
|
+
"app.tree.filter.all": {
|
|
133
|
+
defaultKeys: "ctrl+a",
|
|
134
|
+
description: "Tree filter: show all entries",
|
|
135
|
+
},
|
|
136
|
+
"app.tree.filter.cycleForward": {
|
|
137
|
+
defaultKeys: "ctrl+o",
|
|
138
|
+
description: "Tree filter: cycle forward",
|
|
139
|
+
},
|
|
140
|
+
"app.tree.filter.cycleBackward": {
|
|
141
|
+
defaultKeys: "shift+ctrl+o",
|
|
142
|
+
description: "Tree filter: cycle backward",
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
const KEYBINDING_NAME_MIGRATIONS = {
|
|
146
|
+
cursorUp: "tui.editor.cursorUp",
|
|
147
|
+
cursorDown: "tui.editor.cursorDown",
|
|
148
|
+
cursorLeft: "tui.editor.cursorLeft",
|
|
149
|
+
cursorRight: "tui.editor.cursorRight",
|
|
150
|
+
cursorWordLeft: "tui.editor.cursorWordLeft",
|
|
151
|
+
cursorWordRight: "tui.editor.cursorWordRight",
|
|
152
|
+
cursorLineStart: "tui.editor.cursorLineStart",
|
|
153
|
+
cursorLineEnd: "tui.editor.cursorLineEnd",
|
|
154
|
+
jumpForward: "tui.editor.jumpForward",
|
|
155
|
+
jumpBackward: "tui.editor.jumpBackward",
|
|
156
|
+
pageUp: "tui.editor.pageUp",
|
|
157
|
+
pageDown: "tui.editor.pageDown",
|
|
158
|
+
deleteCharBackward: "tui.editor.deleteCharBackward",
|
|
159
|
+
deleteCharForward: "tui.editor.deleteCharForward",
|
|
160
|
+
deleteWordBackward: "tui.editor.deleteWordBackward",
|
|
161
|
+
deleteWordForward: "tui.editor.deleteWordForward",
|
|
162
|
+
deleteToLineStart: "tui.editor.deleteToLineStart",
|
|
163
|
+
deleteToLineEnd: "tui.editor.deleteToLineEnd",
|
|
164
|
+
yank: "tui.editor.yank",
|
|
165
|
+
yankPop: "tui.editor.yankPop",
|
|
166
|
+
undo: "tui.editor.undo",
|
|
167
|
+
newLine: "tui.input.newLine",
|
|
168
|
+
submit: "tui.input.submit",
|
|
169
|
+
tab: "tui.input.tab",
|
|
170
|
+
copy: "tui.input.copy",
|
|
171
|
+
selectUp: "tui.select.up",
|
|
172
|
+
selectDown: "tui.select.down",
|
|
173
|
+
selectPageUp: "tui.select.pageUp",
|
|
174
|
+
selectPageDown: "tui.select.pageDown",
|
|
175
|
+
selectConfirm: "tui.select.confirm",
|
|
176
|
+
selectCancel: "tui.select.cancel",
|
|
177
|
+
interrupt: "app.interrupt",
|
|
178
|
+
clear: "app.clear",
|
|
179
|
+
exit: "app.exit",
|
|
180
|
+
suspend: "app.suspend",
|
|
181
|
+
cycleThinkingLevel: "app.thinking.cycle",
|
|
182
|
+
cycleModelForward: "app.model.cycleForward",
|
|
183
|
+
cycleModelBackward: "app.model.cycleBackward",
|
|
184
|
+
selectModel: "app.model.select",
|
|
185
|
+
expandTools: "app.tools.expand",
|
|
186
|
+
toggleThinking: "app.thinking.toggle",
|
|
187
|
+
toggleSessionNamedFilter: "app.session.toggleNamedFilter",
|
|
188
|
+
externalEditor: "app.editor.external",
|
|
189
|
+
followUp: "app.message.followUp",
|
|
190
|
+
dequeue: "app.message.dequeue",
|
|
191
|
+
pasteImage: "app.clipboard.pasteImage",
|
|
192
|
+
newSession: "app.session.new",
|
|
193
|
+
tree: "app.session.tree",
|
|
194
|
+
fork: "app.session.fork",
|
|
195
|
+
resume: "app.session.resume",
|
|
196
|
+
treeFoldOrUp: "app.tree.foldOrUp",
|
|
197
|
+
treeUnfoldOrDown: "app.tree.unfoldOrDown",
|
|
198
|
+
treeEditLabel: "app.tree.editLabel",
|
|
199
|
+
treeToggleLabelTimestamp: "app.tree.toggleLabelTimestamp",
|
|
200
|
+
toggleSessionPath: "app.session.togglePath",
|
|
201
|
+
toggleSessionSort: "app.session.toggleSort",
|
|
202
|
+
renameSession: "app.session.rename",
|
|
203
|
+
deleteSession: "app.session.delete",
|
|
204
|
+
deleteSessionNoninvasive: "app.session.deleteNoninvasive",
|
|
205
|
+
};
|
|
206
|
+
function isRecord(value) {
|
|
207
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
208
|
+
}
|
|
209
|
+
function isLegacyKeybindingName(key) {
|
|
210
|
+
return key in KEYBINDING_NAME_MIGRATIONS;
|
|
211
|
+
}
|
|
212
|
+
function toKeybindingsConfig(value) {
|
|
213
|
+
if (!isRecord(value))
|
|
214
|
+
return {};
|
|
215
|
+
const config = {};
|
|
216
|
+
for (const [key, binding] of Object.entries(value)) {
|
|
217
|
+
if (typeof binding === "string") {
|
|
218
|
+
config[key] = binding;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (Array.isArray(binding) && binding.every((entry) => typeof entry === "string")) {
|
|
222
|
+
config[key] = binding;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return config;
|
|
226
|
+
}
|
|
227
|
+
export function migrateKeybindingsConfig(rawConfig) {
|
|
228
|
+
const config = {};
|
|
229
|
+
let migrated = false;
|
|
230
|
+
for (const [key, value] of Object.entries(rawConfig)) {
|
|
231
|
+
const nextKey = isLegacyKeybindingName(key) ? KEYBINDING_NAME_MIGRATIONS[key] : key;
|
|
232
|
+
if (nextKey !== key) {
|
|
233
|
+
migrated = true;
|
|
234
|
+
}
|
|
235
|
+
if (key !== nextKey && Object.hasOwn(rawConfig, nextKey)) {
|
|
236
|
+
migrated = true;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
config[nextKey] = value;
|
|
240
|
+
}
|
|
241
|
+
return { config: orderKeybindingsConfig(config), migrated };
|
|
242
|
+
}
|
|
243
|
+
function orderKeybindingsConfig(config) {
|
|
244
|
+
const ordered = {};
|
|
245
|
+
for (const keybinding of Object.keys(KEYBINDINGS)) {
|
|
246
|
+
if (Object.hasOwn(config, keybinding)) {
|
|
247
|
+
ordered[keybinding] = config[keybinding];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const extras = Object.keys(config)
|
|
251
|
+
.filter((key) => !Object.hasOwn(ordered, key))
|
|
252
|
+
.sort();
|
|
253
|
+
for (const key of extras) {
|
|
254
|
+
ordered[key] = config[key];
|
|
255
|
+
}
|
|
256
|
+
return ordered;
|
|
257
|
+
}
|
|
258
|
+
function loadRawConfig(path) {
|
|
259
|
+
if (!existsSync(path))
|
|
260
|
+
return undefined;
|
|
261
|
+
try {
|
|
262
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
263
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
export class KeybindingsManager extends TuiKeybindingsManager {
|
|
270
|
+
configPath;
|
|
271
|
+
constructor(userBindings = {}, configPath) {
|
|
272
|
+
super(KEYBINDINGS, userBindings);
|
|
273
|
+
this.configPath = configPath;
|
|
274
|
+
}
|
|
275
|
+
static create(agentDir = getAgentDir()) {
|
|
276
|
+
const configPath = join(agentDir, "keybindings.json");
|
|
277
|
+
const userBindings = KeybindingsManager.loadFromFile(configPath);
|
|
278
|
+
return new KeybindingsManager(userBindings, configPath);
|
|
279
|
+
}
|
|
280
|
+
reload() {
|
|
281
|
+
if (!this.configPath)
|
|
282
|
+
return;
|
|
283
|
+
this.setUserBindings(KeybindingsManager.loadFromFile(this.configPath));
|
|
284
|
+
}
|
|
285
|
+
getEffectiveConfig() {
|
|
286
|
+
return this.getResolvedBindings();
|
|
287
|
+
}
|
|
288
|
+
static loadFromFile(path) {
|
|
289
|
+
const rawConfig = loadRawConfig(path);
|
|
290
|
+
if (!rawConfig)
|
|
291
|
+
return {};
|
|
292
|
+
return toKeybindingsConfig(migrateKeybindingsConfig(rawConfig).config);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom message types and transformers for the coding agent.
|
|
3
|
+
*
|
|
4
|
+
* Extends the base AgentMessage type with coding-agent specific message types,
|
|
5
|
+
* and provides a transformer to convert them to LLM-compatible messages.
|
|
6
|
+
*/
|
|
7
|
+
export const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:
|
|
8
|
+
|
|
9
|
+
<summary>
|
|
10
|
+
`;
|
|
11
|
+
export const COMPACTION_SUMMARY_SUFFIX = `
|
|
12
|
+
</summary>`;
|
|
13
|
+
export const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:
|
|
14
|
+
|
|
15
|
+
<summary>
|
|
16
|
+
`;
|
|
17
|
+
export const BRANCH_SUMMARY_SUFFIX = `</summary>`;
|
|
18
|
+
/**
|
|
19
|
+
* Convert a BashExecutionMessage to user message text for LLM context.
|
|
20
|
+
*/
|
|
21
|
+
export function bashExecutionToText(msg) {
|
|
22
|
+
let text = `Ran \`${msg.command}\`\n`;
|
|
23
|
+
if (msg.output) {
|
|
24
|
+
text += `\`\`\`\n${msg.output}\n\`\`\``;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
text += "(no output)";
|
|
28
|
+
}
|
|
29
|
+
if (msg.cancelled) {
|
|
30
|
+
text += "\n\n(command cancelled)";
|
|
31
|
+
}
|
|
32
|
+
else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {
|
|
33
|
+
text += `\n\nCommand exited with code ${msg.exitCode}`;
|
|
34
|
+
}
|
|
35
|
+
if (msg.truncated && msg.fullOutputPath) {
|
|
36
|
+
text += `\n\n[Output truncated. Full output: ${msg.fullOutputPath}]`;
|
|
37
|
+
}
|
|
38
|
+
return text;
|
|
39
|
+
}
|
|
40
|
+
export function createBranchSummaryMessage(summary, fromId, timestamp) {
|
|
41
|
+
return {
|
|
42
|
+
role: "branchSummary",
|
|
43
|
+
summary,
|
|
44
|
+
fromId,
|
|
45
|
+
timestamp: new Date(timestamp).getTime(),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function createCompactionSummaryMessage(summary, tokensBefore, timestamp) {
|
|
49
|
+
return {
|
|
50
|
+
role: "compactionSummary",
|
|
51
|
+
summary: summary,
|
|
52
|
+
tokensBefore,
|
|
53
|
+
timestamp: new Date(timestamp).getTime(),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Convert CustomMessageEntry to AgentMessage format */
|
|
57
|
+
export function createCustomMessage(customType, content, display, details, timestamp) {
|
|
58
|
+
return {
|
|
59
|
+
role: "custom",
|
|
60
|
+
customType,
|
|
61
|
+
content,
|
|
62
|
+
display,
|
|
63
|
+
details,
|
|
64
|
+
timestamp: new Date(timestamp).getTime(),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Transform AgentMessages (including custom types) to LLM-compatible Messages.
|
|
69
|
+
*
|
|
70
|
+
* This is used by:
|
|
71
|
+
* - Agent's transormToLlm option (for prompt calls and queued messages)
|
|
72
|
+
* - Compaction's generateSummary (for summarization)
|
|
73
|
+
* - Custom extensions and tools
|
|
74
|
+
*/
|
|
75
|
+
export function convertToLlm(messages) {
|
|
76
|
+
return messages
|
|
77
|
+
.map((m) => {
|
|
78
|
+
switch (m.role) {
|
|
79
|
+
case "bashExecution":
|
|
80
|
+
// Skip messages excluded from context (!! prefix)
|
|
81
|
+
if (m.excludeFromContext) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
role: "user",
|
|
86
|
+
content: [{ type: "text", text: bashExecutionToText(m) }],
|
|
87
|
+
timestamp: m.timestamp,
|
|
88
|
+
};
|
|
89
|
+
case "custom": {
|
|
90
|
+
const content = typeof m.content === "string" ? [{ type: "text", text: m.content }] : m.content;
|
|
91
|
+
return {
|
|
92
|
+
role: "user",
|
|
93
|
+
content,
|
|
94
|
+
timestamp: m.timestamp,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
case "branchSummary":
|
|
98
|
+
return {
|
|
99
|
+
role: "user",
|
|
100
|
+
content: [{ type: "text", text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],
|
|
101
|
+
timestamp: m.timestamp,
|
|
102
|
+
};
|
|
103
|
+
case "compactionSummary":
|
|
104
|
+
return {
|
|
105
|
+
role: "user",
|
|
106
|
+
content: [
|
|
107
|
+
{ type: "text", text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },
|
|
108
|
+
],
|
|
109
|
+
timestamp: m.timestamp,
|
|
110
|
+
};
|
|
111
|
+
case "user":
|
|
112
|
+
case "assistant":
|
|
113
|
+
case "toolResult":
|
|
114
|
+
return m;
|
|
115
|
+
default:
|
|
116
|
+
// biome-ignore lint/correctness/noSwitchDeclarations: fine
|
|
117
|
+
const _exhaustiveCheck = m;
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
})
|
|
121
|
+
.filter((m) => m !== undefined);
|
|
122
|
+
}
|