march-cli 0.1.24 → 0.1.26
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/bin/march.mjs +13 -13
- package/package.json +49 -49
- package/src/agent/command-exec-tool.mjs +172 -172
- package/src/agent/context-stats-tool.mjs +57 -57
- package/src/agent/editing/diff-apply.mjs +28 -28
- package/src/agent/editing/diff-format.mjs +57 -57
- package/src/agent/editing/lsp-report.mjs +69 -69
- package/src/agent/file-edit-tool.mjs +250 -250
- package/src/agent/file-tools/read-file-tool.mjs +112 -112
- package/src/agent/file-tools/read-image-tool.mjs +76 -76
- package/src/agent/model-payload-dumper.mjs +208 -208
- package/src/agent/pi-session/pi-session-sidecar-failure.mjs +10 -10
- package/src/agent/provider/payload-messages.mjs +138 -138
- package/src/agent/runner/codex-large-context-guard.mjs +87 -87
- package/src/agent/runner/codex-transport-compression.mjs +180 -180
- package/src/agent/runner/codex-transport-debug.mjs +113 -113
- package/src/agent/runner/codex-websocket-event-debug.mjs +130 -130
- package/src/agent/runner/fast-model.mjs +36 -36
- package/src/agent/runner/runner-cleanup.mjs +12 -12
- package/src/agent/runner/runner-init.mjs +15 -15
- package/src/agent/runner/runner-session-state.mjs +40 -40
- package/src/agent/runner/runner-utils.mjs +24 -24
- package/src/agent/runner.mjs +299 -299
- package/src/agent/runtime/ipc/ipc-peer.mjs +99 -99
- package/src/agent/runtime/ipc/process-ipc-transport.mjs +16 -16
- package/src/agent/runtime/remote-runner-client.mjs +73 -73
- package/src/agent/runtime/remote-ui-client.mjs +20 -20
- package/src/agent/runtime/runner-ipc-target.mjs +125 -125
- package/src/agent/runtime/runner-process-client.mjs +47 -47
- package/src/agent/runtime/runner-process-entry.mjs +11 -11
- package/src/agent/runtime/runner-process-factory.mjs +111 -108
- package/src/agent/runtime/runner-runtime-host.mjs +79 -79
- package/src/agent/runtime/runtime-factory.mjs +42 -42
- package/src/agent/runtime/runtime-host.mjs +34 -34
- package/src/agent/runtime/ui-event-bridge.mjs +95 -95
- package/src/agent/screen-tools/list-windows-tool.mjs +39 -39
- package/src/agent/screen-tools/screen-tool.mjs +49 -49
- package/src/agent/screen-tools/windows-screen.mjs +133 -133
- package/src/agent/session/session-auto-name.mjs +41 -41
- package/src/agent/session/session-binding.mjs +12 -12
- package/src/agent/session/session-options.mjs +47 -47
- package/src/agent/tool-names.mjs +1 -1
- package/src/agent/tool-result.mjs +3 -3
- package/src/agent/tool-summary.mjs +112 -112
- package/src/agent/tools.mjs +58 -58
- package/src/agent/turn/turn-events.mjs +111 -111
- package/src/agent/turn/turn-logging.mjs +30 -30
- package/src/agent/turn/turn-runner.mjs +196 -196
- package/src/agent/vision-capability.mjs +14 -14
- package/src/auth/login-command.mjs +90 -90
- package/src/auth/storage.mjs +34 -34
- package/src/cli/args.mjs +96 -79
- package/src/cli/commands/copy-command.mjs +87 -87
- package/src/cli/commands/export-command.mjs +206 -206
- package/src/cli/commands/extensions-command.mjs +53 -53
- package/src/cli/commands/help-command.mjs +7 -7
- package/src/cli/commands/model-command.mjs +141 -141
- package/src/cli/commands/paste-image-command.mjs +43 -43
- package/src/cli/commands/provider-command.mjs +59 -59
- package/src/cli/commands/status-command.mjs +196 -194
- package/src/cli/commands/thinking-command.mjs +87 -87
- package/src/cli/fallback-ui.mjs +156 -156
- package/src/cli/input/attachment-tokens.mjs +20 -20
- package/src/cli/input/autocomplete.mjs +74 -74
- package/src/cli/input/external-editor.mjs +39 -39
- package/src/cli/input/file-search/index.mjs +160 -160
- package/src/cli/input/history-store.mjs +35 -35
- package/src/cli/input/image-clipboard.mjs +55 -55
- package/src/cli/input/keybinding-dispatch.mjs +76 -76
- package/src/cli/input/keybindings.mjs +96 -96
- package/src/cli/input/mode-state.mjs +43 -43
- package/src/cli/input/prompt-templates.mjs +84 -84
- package/src/cli/input/select-with-keyboard.mjs +86 -86
- package/src/cli/permissions.mjs +103 -103
- package/src/cli/repl-commands.mjs +86 -86
- package/src/cli/repl-loop.mjs +183 -183
- package/src/cli/selector-list.mjs +21 -21
- package/src/cli/session/pi-session-switch-command.mjs +41 -41
- package/src/cli/session/session-command.mjs +23 -23
- package/src/cli/session/session-list-command.mjs +68 -68
- package/src/cli/session/session-name-command.mjs +26 -26
- package/src/cli/session/session-source-command.mjs +89 -89
- package/src/cli/session/session-switch-command.mjs +1 -1
- package/src/cli/shell/shell-command.mjs +55 -55
- package/src/cli/shell/shell-drawer-controls.mjs +33 -33
- package/src/cli/shell/shell-drawer.mjs +192 -192
- package/src/cli/shell/shell-split-layout.mjs +70 -70
- package/src/cli/slash-commands.mjs +192 -192
- package/src/cli/startup/create-runtime-runner.mjs +61 -61
- package/src/cli/startup/runtime-close.mjs +23 -23
- package/src/cli/startup/startup-banner.mjs +71 -71
- package/src/cli/startup/startup-session.mjs +51 -51
- package/src/cli/status-line-updater.mjs +75 -75
- package/src/cli/tool-output.mjs +9 -9
- package/src/cli/tui/editor/external-editor-runner.mjs +24 -24
- package/src/cli/tui/input/mouse-selection-controller.mjs +91 -91
- package/src/cli/tui/input/mouse-tracking.mjs +20 -20
- package/src/cli/tui/layout/main-pane-layout.mjs +47 -47
- package/src/cli/tui/layout/safe-render-boundary.mjs +46 -46
- package/src/cli/tui/markdown-renderer.mjs +285 -285
- package/src/cli/tui/output/scroll-state.mjs +79 -79
- package/src/cli/tui/output/text-line-renderer.mjs +50 -50
- package/src/cli/tui/output/tool-card-renderer.mjs +59 -59
- package/src/cli/tui/output/visible-lines.mjs +8 -8
- package/src/cli/tui/output-buffer.mjs +293 -293
- package/src/cli/tui/permission-request-ui.mjs +18 -18
- package/src/cli/tui/recall-rendering.mjs +28 -25
- package/src/cli/tui/render/render-scheduler.mjs +26 -26
- package/src/cli/tui/render/stream-delta-buffer.mjs +46 -46
- package/src/cli/tui/select/editor-select-list.mjs +111 -111
- package/src/cli/tui/selection-screen.mjs +269 -269
- package/src/cli/tui/status/retry-status.mjs +72 -72
- package/src/cli/tui/status/spinner-status.mjs +42 -42
- package/src/cli/tui/status/status-bar.mjs +225 -225
- package/src/cli/tui/syntax/highlighting.mjs +260 -260
- package/src/cli/tui/syntax/languages.mjs +91 -91
- package/src/cli/tui/syntax/tree-sitter/bash.highlights.scm +261 -261
- package/src/cli/tui/syntax/tree-sitter/c.highlights.scm +341 -341
- package/src/cli/tui/syntax/tree-sitter/cpp.highlights.scm +268 -268
- package/src/cli/tui/syntax/tree-sitter/csharp.highlights.scm +577 -577
- package/src/cli/tui/syntax/tree-sitter/css.highlights.scm +109 -109
- package/src/cli/tui/syntax/tree-sitter/diff.highlights.scm +49 -49
- package/src/cli/tui/syntax/tree-sitter/go.highlights.scm +254 -254
- package/src/cli/tui/syntax/tree-sitter/html.highlights.scm +13 -13
- package/src/cli/tui/syntax/tree-sitter/java.highlights.scm +330 -330
- package/src/cli/tui/syntax/tree-sitter/json.highlights.scm +38 -38
- package/src/cli/tui/syntax/tree-sitter/php.highlights.scm +203 -203
- package/src/cli/tui/syntax/tree-sitter/python.highlights.scm +137 -137
- package/src/cli/tui/syntax/tree-sitter/ruby.highlights.scm +309 -309
- package/src/cli/tui/syntax/tree-sitter/rust.highlights.scm +531 -531
- package/src/cli/tui/syntax/tree-sitter/toml.highlights.scm +39 -39
- package/src/cli/tui/syntax/tree-sitter/tsx.highlights.scm +35 -35
- package/src/cli/tui/syntax/tree-sitter/typescript.highlights.scm +35 -35
- package/src/cli/tui/syntax/tree-sitter/yaml.highlights.scm +99 -99
- package/src/cli/tui/tool-rendering.mjs +87 -87
- package/src/cli/tui/tui-diff-rendering.mjs +157 -157
- package/src/cli/tui/tui-handlers.mjs +111 -111
- package/src/cli/tui/tui-input-controller.mjs +61 -61
- package/src/cli/tui/ui-theme.mjs +157 -157
- package/src/cli/ui.mjs +297 -297
- package/src/config/config-json.mjs +108 -84
- package/src/config/dotenv.mjs +20 -20
- package/src/config/features.mjs +75 -75
- package/src/config/loader.mjs +156 -143
- package/src/config/settings-command.mjs +97 -97
- package/src/context/engine.mjs +199 -198
- package/src/context/injections.mjs +26 -26
- package/src/context/profiles.mjs +39 -39
- package/src/context/project-context.mjs +20 -20
- package/src/context/session-status.mjs +25 -17
- package/src/context/shell-layers.mjs +23 -23
- package/src/context/system-core/base.md +51 -50
- package/src/context/system-core/prompts/deepseek-v4-pro.md +3 -3
- package/src/context/system-core/prompts/default.md +3 -3
- package/src/context/system-core.mjs +35 -35
- package/src/debug/logger.mjs +141 -141
- package/src/debug/model-context-dumper.mjs +52 -52
- package/src/extensions/discovery.mjs +40 -40
- package/src/extensions/lifecycle-adapter.mjs +210 -210
- package/src/extensions/lifecycle-manifest.mjs +69 -69
- package/src/image-gen/index.mjs +7 -7
- package/src/image-gen/provider.mjs +231 -231
- package/src/image-gen/tool.mjs +84 -84
- package/src/lsp/client.mjs +257 -257
- package/src/lsp/diagnostic-store.mjs +42 -42
- package/src/lsp/diagnostics-format.mjs +72 -72
- package/src/lsp/managed-node-server.mjs +99 -99
- package/src/lsp/path-match.mjs +10 -10
- package/src/lsp/server-definitions.mjs +188 -188
- package/src/lsp/servers.mjs +165 -165
- package/src/lsp/service.mjs +110 -110
- package/src/lsp/status-message.mjs +9 -9
- package/src/lsp/typescript-project-resolver.mjs +186 -186
- package/src/main.mjs +294 -299
- package/src/mcp/client.mjs +195 -195
- package/src/mcp/config.mjs +130 -130
- package/src/mcp/index.mjs +48 -48
- package/src/mcp/tools.mjs +98 -98
- package/src/memory/command.mjs +120 -0
- package/src/memory/markdown/markdown-delete.mjs +23 -23
- package/src/memory/markdown/markdown-format.mjs +128 -128
- package/src/memory/markdown/markdown-recall.mjs +28 -28
- package/src/memory/markdown/ripgrep.mjs +16 -16
- package/src/memory/markdown/sqlite-index.mjs +87 -87
- package/src/memory/markdown-store.mjs +272 -286
- package/src/memory/markdown-tools.mjs +174 -103
- package/src/memory/remote/client.mjs +68 -0
- package/src/memory/remote/config.mjs +52 -0
- package/src/memory/remote/server.mjs +99 -0
- package/src/memory/search.mjs +183 -0
- package/src/network/environment.mjs +131 -131
- package/src/notification/desktop-notifier.mjs +262 -262
- package/src/platform/open-file.mjs +28 -28
- package/src/platform/spawn-command.mjs +27 -27
- package/src/provider/accept-command.mjs +89 -89
- package/src/provider/command.mjs +21 -21
- package/src/provider/config-command.mjs +129 -129
- package/src/provider/custom-provider.mjs +113 -113
- package/src/provider/hosted-tools.mjs +111 -111
- package/src/provider/presets.mjs +72 -72
- package/src/provider/share-command.mjs +79 -79
- package/src/provider/share-payload.mjs +52 -52
- package/src/session/attachment-display.mjs +16 -16
- package/src/session/attachment-references.mjs +65 -65
- package/src/session/attachments.mjs +140 -140
- package/src/session/persist.mjs +1 -1
- package/src/session/pi-manager.mjs +34 -34
- package/src/session/session-utils.mjs +16 -16
- package/src/session/sidecar-sync.mjs +19 -19
- package/src/session/sidecar.mjs +69 -69
- package/src/session/transcript.mjs +83 -83
- package/src/session/tree.mjs +42 -42
- package/src/shell/cli-runtime.mjs +11 -11
- package/src/shell/hints.mjs +12 -12
- package/src/shell/node-pty-adapter.mjs +81 -81
- package/src/shell/runtime-state.mjs +126 -126
- package/src/shell/runtime.mjs +252 -252
- package/src/shell/screen-buffer.mjs +136 -136
- package/src/shell/tool-read.mjs +74 -74
- package/src/shell/tools.mjs +299 -299
- package/src/supergrok/actions/image-generate.mjs +60 -60
- package/src/supergrok/actions/search.mjs +78 -78
- package/src/supergrok/auth.mjs +36 -36
- package/src/supergrok/constants.mjs +18 -18
- package/src/supergrok/oauth-provider.mjs +278 -278
- package/src/supergrok/provider.mjs +35 -35
- package/src/supergrok/response.mjs +76 -76
- package/src/supergrok/tool.mjs +61 -61
- package/src/text/ansi.mjs +3 -3
- package/src/web/config-command.mjs +43 -43
- package/src/web/fetch.mjs +78 -78
- package/src/web/presets.mjs +16 -16
- package/src/web/search.mjs +83 -83
- package/src/web/tools.mjs +107 -107
|
@@ -1,194 +1,196 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import { MODES, formatModeLabel } from "../input/mode-state.mjs";
|
|
3
|
-
import { modeLabel, PREFIX, R } from "../tui/ui-theme.mjs";
|
|
4
|
-
|
|
5
|
-
export function statusCommand({
|
|
6
|
-
runner,
|
|
7
|
-
sessionState,
|
|
8
|
-
sessionSource = "pi",
|
|
9
|
-
extensionDiagnostics = [],
|
|
10
|
-
lifecycleState = null,
|
|
11
|
-
gitBranch = getGitBranch(runner.engine.cwd),
|
|
12
|
-
}) {
|
|
13
|
-
return [formatStatusLine({
|
|
14
|
-
engine: runner.engine,
|
|
15
|
-
sessionState,
|
|
16
|
-
sessionStats: runner.getSessionStats?.() ?? null,
|
|
17
|
-
sessionSource,
|
|
18
|
-
extensionDiagnostics,
|
|
19
|
-
lifecycleState,
|
|
20
|
-
gitBranch,
|
|
21
|
-
})];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function statusBarLine({
|
|
25
|
-
runner,
|
|
26
|
-
mode = MODES.DO,
|
|
27
|
-
contextTokens = null,
|
|
28
|
-
activity = null,
|
|
29
|
-
lspStatus = null,
|
|
30
|
-
}) {
|
|
31
|
-
return formatStatusBarLine({
|
|
32
|
-
engine: runner.engine,
|
|
33
|
-
mode,
|
|
34
|
-
contextTokens,
|
|
35
|
-
activity,
|
|
36
|
-
lspStatus,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function formatStatusLine({
|
|
41
|
-
engine,
|
|
42
|
-
sessionState,
|
|
43
|
-
sessionStats = null,
|
|
44
|
-
sessionSource = "pi",
|
|
45
|
-
extensionDiagnostics = [],
|
|
46
|
-
lifecycleState = null,
|
|
47
|
-
gitBranch = null,
|
|
48
|
-
}) {
|
|
49
|
-
const statsSessionId = sessionStats?.sessionId ?? sessionState?.sessionId ?? "unknown";
|
|
50
|
-
const tokens = sessionStats?.tokens
|
|
51
|
-
? `${sessionStats.tokens.input ?? 0}in/${sessionStats.tokens.output ?? 0}out`
|
|
52
|
-
: "n/a";
|
|
53
|
-
const parts = [
|
|
54
|
-
`git:${gitBranch || "none"}`,
|
|
55
|
-
`session:${statsSessionId}`,
|
|
56
|
-
`source:${sessionSource}`,
|
|
57
|
-
];
|
|
58
|
-
if (engine.sessionName) parts.push(`name:${engine.sessionName}`);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
`
|
|
63
|
-
`
|
|
64
|
-
`
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
if (
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if (status === "
|
|
132
|
-
return "
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (value
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
.
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { MODES, formatModeLabel } from "../input/mode-state.mjs";
|
|
3
|
+
import { modeLabel, PREFIX, R } from "../tui/ui-theme.mjs";
|
|
4
|
+
|
|
5
|
+
export function statusCommand({
|
|
6
|
+
runner,
|
|
7
|
+
sessionState,
|
|
8
|
+
sessionSource = "pi",
|
|
9
|
+
extensionDiagnostics = [],
|
|
10
|
+
lifecycleState = null,
|
|
11
|
+
gitBranch = getGitBranch(runner.engine.cwd),
|
|
12
|
+
}) {
|
|
13
|
+
return [formatStatusLine({
|
|
14
|
+
engine: runner.engine,
|
|
15
|
+
sessionState,
|
|
16
|
+
sessionStats: runner.getSessionStats?.() ?? null,
|
|
17
|
+
sessionSource,
|
|
18
|
+
extensionDiagnostics,
|
|
19
|
+
lifecycleState,
|
|
20
|
+
gitBranch,
|
|
21
|
+
})];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function statusBarLine({
|
|
25
|
+
runner,
|
|
26
|
+
mode = MODES.DO,
|
|
27
|
+
contextTokens = null,
|
|
28
|
+
activity = null,
|
|
29
|
+
lspStatus = null,
|
|
30
|
+
}) {
|
|
31
|
+
return formatStatusBarLine({
|
|
32
|
+
engine: runner.engine,
|
|
33
|
+
mode,
|
|
34
|
+
contextTokens,
|
|
35
|
+
activity,
|
|
36
|
+
lspStatus,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function formatStatusLine({
|
|
41
|
+
engine,
|
|
42
|
+
sessionState,
|
|
43
|
+
sessionStats = null,
|
|
44
|
+
sessionSource = "pi",
|
|
45
|
+
extensionDiagnostics = [],
|
|
46
|
+
lifecycleState = null,
|
|
47
|
+
gitBranch = null,
|
|
48
|
+
}) {
|
|
49
|
+
const statsSessionId = sessionStats?.sessionId ?? sessionState?.sessionId ?? "unknown";
|
|
50
|
+
const tokens = sessionStats?.tokens
|
|
51
|
+
? `${sessionStats.tokens.input ?? 0}in/${sessionStats.tokens.output ?? 0}out`
|
|
52
|
+
: "n/a";
|
|
53
|
+
const parts = [
|
|
54
|
+
`git:${gitBranch || "none"}`,
|
|
55
|
+
`session:${statsSessionId}`,
|
|
56
|
+
`source:${sessionSource}`,
|
|
57
|
+
];
|
|
58
|
+
if (engine.sessionName) parts.push(`name:${engine.sessionName}`);
|
|
59
|
+
const remoteMemories = engine.remoteMemorySources ?? [];
|
|
60
|
+
if (remoteMemories.length > 0) parts.push(`remote-memory:${remoteMemories.map((source) => source.name).join(",")}`);
|
|
61
|
+
parts.push(
|
|
62
|
+
`model:${engine.modelId}`,
|
|
63
|
+
`provider:${engine.provider}`,
|
|
64
|
+
`thinking:${engine.thinkingLevel ?? "unknown"}`,
|
|
65
|
+
`tokens:${tokens}`,
|
|
66
|
+
`ext:${formatExtensionDiagnosticSummary(extensionDiagnostics, lifecycleState)}`,
|
|
67
|
+
);
|
|
68
|
+
return parts.join(" ");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function formatStatusBarLine({
|
|
72
|
+
engine,
|
|
73
|
+
mode = MODES.DO,
|
|
74
|
+
contextTokens = null,
|
|
75
|
+
activity = null,
|
|
76
|
+
lspStatus = null,
|
|
77
|
+
}) {
|
|
78
|
+
const model = engine.modelId || "model?";
|
|
79
|
+
const thinking = engine.thinkingLevel || "thinking?";
|
|
80
|
+
|
|
81
|
+
const C = PREFIX; // foreground-only color prefixes (no reset)
|
|
82
|
+
const DIM = C.brightBlack;
|
|
83
|
+
const modeSegment = formatModeSegment(mode);
|
|
84
|
+
const runtime = `${C.cyan}${model}${DIM}·${thinking}`;
|
|
85
|
+
const segments = [modeSegment, runtime];
|
|
86
|
+
const lspText = formatLspSegment(lspStatus);
|
|
87
|
+
if (lspText) segments.push(`${C.fg250}${lspText}`);
|
|
88
|
+
const activityText = formatActivitySegment(activity);
|
|
89
|
+
if (activityText) segments.push(`${C.fg250}${activityText}`);
|
|
90
|
+
const compactTokens = formatCompactTokenCount(contextTokens);
|
|
91
|
+
if (compactTokens) segments.push(`${C.fg250}${compactTokens}`);
|
|
92
|
+
|
|
93
|
+
const inner = segments.join(` ${DIM}|${C.fg250} `);
|
|
94
|
+
return `${inner}${R}`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function formatModeSegment(mode) {
|
|
98
|
+
const label = formatModeLabel(mode);
|
|
99
|
+
return (modeLabel[mode] ?? modeLabel.fallback)(label);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function formatLspSegment(lspStatus) {
|
|
103
|
+
if (!lspStatus) return "";
|
|
104
|
+
const servers = lspStatus.servers ?? [];
|
|
105
|
+
const visible = servers.filter((server) => server.id);
|
|
106
|
+
if (visible.length === 0) return "lsp:off";
|
|
107
|
+
const parts = buildLspStatusParts(visible);
|
|
108
|
+
if (parts.length === 0) return "lsp:off";
|
|
109
|
+
return `lsp:${parts.join(",")}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function buildLspStatusParts(servers) {
|
|
113
|
+
const byId = new Map();
|
|
114
|
+
for (const server of servers) {
|
|
115
|
+
const id = shortLspId(server.id);
|
|
116
|
+
byId.set(id, mergeLspStatus(byId.get(id), server.status));
|
|
117
|
+
}
|
|
118
|
+
return [...byId.entries()]
|
|
119
|
+
.map(([id, status]) => `${id}${formatLspStatusMark(status)}`);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function mergeLspStatus(current, next) {
|
|
123
|
+
const rank = { failed: 5, installing: 4, starting: 3, busy: 2, ready: 1, idle: 1, unavailable: 0 };
|
|
124
|
+
if (!current) return next ?? "unavailable";
|
|
125
|
+
const currentRank = rank[current] ?? 0;
|
|
126
|
+
const nextRank = rank[next] ?? 0;
|
|
127
|
+
return nextRank > currentRank ? next : current;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function formatLspStatusMark(status) {
|
|
131
|
+
if (status === "failed") return "!";
|
|
132
|
+
if (status === "starting" || status === "installing") return "…";
|
|
133
|
+
if (status === "unavailable") return "?";
|
|
134
|
+
return "✓";
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function formatActivitySegment(activity) {
|
|
138
|
+
if (!activity) return "";
|
|
139
|
+
const label = String(activity.label ?? "").trim();
|
|
140
|
+
const frame = String(activity.frame ?? "").trim();
|
|
141
|
+
return [frame, label].filter(Boolean).join(" ");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function shortLspId(id) {
|
|
145
|
+
if (id === "typescript") return "ts";
|
|
146
|
+
return String(id ?? "?");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function formatCompactTokenCount(tokens) {
|
|
150
|
+
const value = Number(tokens);
|
|
151
|
+
if (!Number.isFinite(value) || value <= 0) return "";
|
|
152
|
+
if (value < 1000) return String(Math.ceil(value));
|
|
153
|
+
if (value < 1000000) return `${formatOneDecimal(value / 1000)}K`;
|
|
154
|
+
return `${formatOneDecimal(value / 1000000)}M`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function formatExtensionDiagnosticSummary(extensionDiagnostics = [], lifecycleState = null) {
|
|
158
|
+
const diagnostics = [...extensionDiagnostics, ...(lifecycleState?.diagnostics ?? [])];
|
|
159
|
+
if (diagnostics.length === 0) return "ok";
|
|
160
|
+
const counts = new Map();
|
|
161
|
+
for (const diagnostic of diagnostics) {
|
|
162
|
+
const type = diagnostic?.type ?? "info";
|
|
163
|
+
counts.set(type, (counts.get(type) ?? 0) + 1);
|
|
164
|
+
}
|
|
165
|
+
return [...counts.entries()]
|
|
166
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
167
|
+
.map(([type, count]) => `${count}${type}`)
|
|
168
|
+
.join(",");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function getGitBranch(cwd) {
|
|
172
|
+
const branch = runGit(cwd, ["branch", "--show-current"]);
|
|
173
|
+
if (branch) return branch;
|
|
174
|
+
return runGit(cwd, ["rev-parse", "--short", "HEAD"]);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function shortSessionId(sessionId) {
|
|
178
|
+
const value = String(sessionId || "unknown");
|
|
179
|
+
if (value === "unknown" || value.length <= 8) return value;
|
|
180
|
+
return value.slice(0, 8);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function runGit(cwd, args) {
|
|
184
|
+
const result = spawnSync("git", args, {
|
|
185
|
+
cwd,
|
|
186
|
+
encoding: "utf8",
|
|
187
|
+
windowsHide: true,
|
|
188
|
+
});
|
|
189
|
+
if (result.status !== 0) return null;
|
|
190
|
+
return result.stdout.trim() || null;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function formatOneDecimal(value) {
|
|
194
|
+
const rounded = Math.round(value * 10) / 10;
|
|
195
|
+
return Number.isInteger(rounded) ? String(rounded) : rounded.toFixed(1);
|
|
196
|
+
}
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
import { formatSelectorList } from "../selector-list.mjs";
|
|
2
|
-
|
|
3
|
-
const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
4
|
-
|
|
5
|
-
export function parseThinkingCommand(input) {
|
|
6
|
-
if (input !== "/thinking" && !input.startsWith("/thinking ")) {
|
|
7
|
-
return { type: "none" };
|
|
8
|
-
}
|
|
9
|
-
const arg = input.slice("/thinking".length).trim();
|
|
10
|
-
if (!arg) return { type: "select-interactive" };
|
|
11
|
-
if (arg === "list") return { type: "list" };
|
|
12
|
-
const index = Number(arg);
|
|
13
|
-
if (Number.isInteger(index) && index > 0) return { type: "select", index };
|
|
14
|
-
if (THINKING_LEVELS.includes(arg)) return { type: "set", level: arg };
|
|
15
|
-
return {
|
|
16
|
-
type: "error",
|
|
17
|
-
message: `Usage: /thinking [list|index|${THINKING_LEVELS.join("|")}]`,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function formatThinkingLevels(levels, current) {
|
|
22
|
-
const available = Array.isArray(levels) && levels.length > 0 ? levels : THINKING_LEVELS;
|
|
23
|
-
return formatSelectorList({
|
|
24
|
-
items: available,
|
|
25
|
-
currentIndex: available.indexOf(current),
|
|
26
|
-
instruction: "Use /thinking <index> to select.",
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function buildThinkingSelectItems(levels, current) {
|
|
31
|
-
const available = Array.isArray(levels) && levels.length > 0 ? levels : THINKING_LEVELS;
|
|
32
|
-
return available.map((level, index) => ({
|
|
33
|
-
value: String(index),
|
|
34
|
-
label: level,
|
|
35
|
-
description: level === current ? "current" : "",
|
|
36
|
-
level,
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function selectThinkingByIndex(index, { runner }) {
|
|
41
|
-
const levels = runner.getAvailableThinkingLevels?.() || THINKING_LEVELS;
|
|
42
|
-
const level = levels[index - 1];
|
|
43
|
-
if (!level) return `Error: thinking index out of range: ${index}`;
|
|
44
|
-
return `thinking: ${runner.setThinkingLevel(level)}`;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export async function handleThinkingCommand(parsed, { runner, ui = null } = {}) {
|
|
48
|
-
if (parsed.type === "select-interactive") {
|
|
49
|
-
if (ui?.selectList) return [await selectThinkingInteractively({ runner, ui })];
|
|
50
|
-
return ["Use /thinking list or run in TUI to choose a thinking level."];
|
|
51
|
-
}
|
|
52
|
-
if (parsed.type === "list") {
|
|
53
|
-
return formatThinkingLevels(
|
|
54
|
-
runner.getAvailableThinkingLevels?.(),
|
|
55
|
-
runner.getThinkingLevel?.(),
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
if (parsed.type === "select") return [await selectThinkingByIndexAsync(parsed.index, { runner })];
|
|
59
|
-
if (parsed.type === "set") {
|
|
60
|
-
const level = await runner.setThinkingLevel(parsed.level);
|
|
61
|
-
return [`thinking: ${level}`];
|
|
62
|
-
}
|
|
63
|
-
if (parsed.type === "error") return [`Error: ${parsed.message}`];
|
|
64
|
-
return [];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function selectThinkingInteractively({ runner, ui }) {
|
|
68
|
-
const levels = runner.getAvailableThinkingLevels?.() || THINKING_LEVELS;
|
|
69
|
-
if (levels.length === 0) return "thinking: no available levels";
|
|
70
|
-
const current = runner.getThinkingLevel?.();
|
|
71
|
-
const selectedIndex = Math.max(0, levels.indexOf(current));
|
|
72
|
-
const item = await ui.selectList({
|
|
73
|
-
items: buildThinkingSelectItems(levels, current),
|
|
74
|
-
selectedIndex,
|
|
75
|
-
width: 48,
|
|
76
|
-
suppressInitialConfirm: true,
|
|
77
|
-
});
|
|
78
|
-
if (!item) return "thinking: unchanged";
|
|
79
|
-
return `thinking: ${await runner.setThinkingLevel(item.level)}`;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async function selectThinkingByIndexAsync(index, { runner }) {
|
|
83
|
-
const levels = runner.getAvailableThinkingLevels?.() || THINKING_LEVELS;
|
|
84
|
-
const level = levels[index - 1];
|
|
85
|
-
if (!level) return `Error: thinking index out of range: ${index}`;
|
|
86
|
-
return `thinking: ${await runner.setThinkingLevel(level)}`;
|
|
87
|
-
}
|
|
1
|
+
import { formatSelectorList } from "../selector-list.mjs";
|
|
2
|
+
|
|
3
|
+
const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
4
|
+
|
|
5
|
+
export function parseThinkingCommand(input) {
|
|
6
|
+
if (input !== "/thinking" && !input.startsWith("/thinking ")) {
|
|
7
|
+
return { type: "none" };
|
|
8
|
+
}
|
|
9
|
+
const arg = input.slice("/thinking".length).trim();
|
|
10
|
+
if (!arg) return { type: "select-interactive" };
|
|
11
|
+
if (arg === "list") return { type: "list" };
|
|
12
|
+
const index = Number(arg);
|
|
13
|
+
if (Number.isInteger(index) && index > 0) return { type: "select", index };
|
|
14
|
+
if (THINKING_LEVELS.includes(arg)) return { type: "set", level: arg };
|
|
15
|
+
return {
|
|
16
|
+
type: "error",
|
|
17
|
+
message: `Usage: /thinking [list|index|${THINKING_LEVELS.join("|")}]`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function formatThinkingLevels(levels, current) {
|
|
22
|
+
const available = Array.isArray(levels) && levels.length > 0 ? levels : THINKING_LEVELS;
|
|
23
|
+
return formatSelectorList({
|
|
24
|
+
items: available,
|
|
25
|
+
currentIndex: available.indexOf(current),
|
|
26
|
+
instruction: "Use /thinking <index> to select.",
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function buildThinkingSelectItems(levels, current) {
|
|
31
|
+
const available = Array.isArray(levels) && levels.length > 0 ? levels : THINKING_LEVELS;
|
|
32
|
+
return available.map((level, index) => ({
|
|
33
|
+
value: String(index),
|
|
34
|
+
label: level,
|
|
35
|
+
description: level === current ? "current" : "",
|
|
36
|
+
level,
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function selectThinkingByIndex(index, { runner }) {
|
|
41
|
+
const levels = runner.getAvailableThinkingLevels?.() || THINKING_LEVELS;
|
|
42
|
+
const level = levels[index - 1];
|
|
43
|
+
if (!level) return `Error: thinking index out of range: ${index}`;
|
|
44
|
+
return `thinking: ${runner.setThinkingLevel(level)}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function handleThinkingCommand(parsed, { runner, ui = null } = {}) {
|
|
48
|
+
if (parsed.type === "select-interactive") {
|
|
49
|
+
if (ui?.selectList) return [await selectThinkingInteractively({ runner, ui })];
|
|
50
|
+
return ["Use /thinking list or run in TUI to choose a thinking level."];
|
|
51
|
+
}
|
|
52
|
+
if (parsed.type === "list") {
|
|
53
|
+
return formatThinkingLevels(
|
|
54
|
+
runner.getAvailableThinkingLevels?.(),
|
|
55
|
+
runner.getThinkingLevel?.(),
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
if (parsed.type === "select") return [await selectThinkingByIndexAsync(parsed.index, { runner })];
|
|
59
|
+
if (parsed.type === "set") {
|
|
60
|
+
const level = await runner.setThinkingLevel(parsed.level);
|
|
61
|
+
return [`thinking: ${level}`];
|
|
62
|
+
}
|
|
63
|
+
if (parsed.type === "error") return [`Error: ${parsed.message}`];
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function selectThinkingInteractively({ runner, ui }) {
|
|
68
|
+
const levels = runner.getAvailableThinkingLevels?.() || THINKING_LEVELS;
|
|
69
|
+
if (levels.length === 0) return "thinking: no available levels";
|
|
70
|
+
const current = runner.getThinkingLevel?.();
|
|
71
|
+
const selectedIndex = Math.max(0, levels.indexOf(current));
|
|
72
|
+
const item = await ui.selectList({
|
|
73
|
+
items: buildThinkingSelectItems(levels, current),
|
|
74
|
+
selectedIndex,
|
|
75
|
+
width: 48,
|
|
76
|
+
suppressInitialConfirm: true,
|
|
77
|
+
});
|
|
78
|
+
if (!item) return "thinking: unchanged";
|
|
79
|
+
return `thinking: ${await runner.setThinkingLevel(item.level)}`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function selectThinkingByIndexAsync(index, { runner }) {
|
|
83
|
+
const levels = runner.getAvailableThinkingLevels?.() || THINKING_LEVELS;
|
|
84
|
+
const level = levels[index - 1];
|
|
85
|
+
if (!level) return `Error: thinking index out of range: ${index}`;
|
|
86
|
+
return `thinking: ${await runner.setThinkingLevel(level)}`;
|
|
87
|
+
}
|