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
package/src/auth/storage.mjs
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { homedir } from "node:os";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { AuthStorage } from "@earendil-works/pi-coding-agent";
|
|
4
|
-
|
|
5
|
-
export function getMarchAuthPath(homeDir = homedir()) {
|
|
6
|
-
return resolve(homeDir, ".march", "auth.json");
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function createMarchAuthStorage({
|
|
10
|
-
providers = {},
|
|
11
|
-
homeDir = homedir(),
|
|
12
|
-
authStorage = null,
|
|
13
|
-
} = {}) {
|
|
14
|
-
const resolvedAuthStorage = authStorage ?? AuthStorage.create(getMarchAuthPath(homeDir));
|
|
15
|
-
|
|
16
|
-
for (const [id, profile] of Object.entries(providers ?? {})) {
|
|
17
|
-
if (!profile || typeof profile !== "object") continue;
|
|
18
|
-
const type = profile.type ?? profile.provider;
|
|
19
|
-
const providerKey = type === "openai-compatible" ? id : type;
|
|
20
|
-
const profileKey = profile.auth?.method === "apiKey" ? profile.auth?.apiKey : null;
|
|
21
|
-
if (providerKey && profileKey) resolvedAuthStorage.setRuntimeApiKey(providerKey, profileKey);
|
|
22
|
-
}
|
|
23
|
-
const hasStoredAuth = Boolean(resolvedAuthStorage.list?.().length);
|
|
24
|
-
const hasConfiguredProvider = Object.values(providers ?? {}).some((profile) => {
|
|
25
|
-
if (!profile || typeof profile !== "object") return false;
|
|
26
|
-
return Boolean(profile.auth?.apiKey);
|
|
27
|
-
});
|
|
28
|
-
return {
|
|
29
|
-
authStorage: resolvedAuthStorage,
|
|
30
|
-
authPath: getMarchAuthPath(homeDir),
|
|
31
|
-
hasAuth: hasStoredAuth || hasConfiguredProvider,
|
|
32
|
-
diagnostics: [],
|
|
33
|
-
};
|
|
34
|
-
}
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { AuthStorage } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
|
|
5
|
+
export function getMarchAuthPath(homeDir = homedir()) {
|
|
6
|
+
return resolve(homeDir, ".march", "auth.json");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function createMarchAuthStorage({
|
|
10
|
+
providers = {},
|
|
11
|
+
homeDir = homedir(),
|
|
12
|
+
authStorage = null,
|
|
13
|
+
} = {}) {
|
|
14
|
+
const resolvedAuthStorage = authStorage ?? AuthStorage.create(getMarchAuthPath(homeDir));
|
|
15
|
+
|
|
16
|
+
for (const [id, profile] of Object.entries(providers ?? {})) {
|
|
17
|
+
if (!profile || typeof profile !== "object") continue;
|
|
18
|
+
const type = profile.type ?? profile.provider;
|
|
19
|
+
const providerKey = type === "openai-compatible" ? id : type;
|
|
20
|
+
const profileKey = profile.auth?.method === "apiKey" ? profile.auth?.apiKey : null;
|
|
21
|
+
if (providerKey && profileKey) resolvedAuthStorage.setRuntimeApiKey(providerKey, profileKey);
|
|
22
|
+
}
|
|
23
|
+
const hasStoredAuth = Boolean(resolvedAuthStorage.list?.().length);
|
|
24
|
+
const hasConfiguredProvider = Object.values(providers ?? {}).some((profile) => {
|
|
25
|
+
if (!profile || typeof profile !== "object") return false;
|
|
26
|
+
return Boolean(profile.auth?.apiKey);
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
authStorage: resolvedAuthStorage,
|
|
30
|
+
authPath: getMarchAuthPath(homeDir),
|
|
31
|
+
hasAuth: hasStoredAuth || hasConfiguredProvider,
|
|
32
|
+
diagnostics: [],
|
|
33
|
+
};
|
|
34
|
+
}
|
package/src/cli/args.mjs
CHANGED
|
@@ -1,79 +1,96 @@
|
|
|
1
|
-
import { parseArgs } from "node:util";
|
|
2
|
-
|
|
3
|
-
export function parseCliArgs(argv) {
|
|
4
|
-
const { values, positionals } = parseArgs({
|
|
5
|
-
args: argv,
|
|
6
|
-
options: {
|
|
7
|
-
model: { type: "string", short: "m" },
|
|
8
|
-
provider: { type: "string" },
|
|
9
|
-
resume: { type: "string" },
|
|
10
|
-
json: { type: "boolean" },
|
|
11
|
-
extension: { type: "string", short: "e", multiple: true },
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"pi-
|
|
18
|
-
"
|
|
19
|
-
"shell-runtime": { type: "boolean" },
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
march
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
|
|
3
|
+
export function parseCliArgs(argv) {
|
|
4
|
+
const { values, positionals } = parseArgs({
|
|
5
|
+
args: argv,
|
|
6
|
+
options: {
|
|
7
|
+
model: { type: "string", short: "m" },
|
|
8
|
+
provider: { type: "string" },
|
|
9
|
+
resume: { type: "string" },
|
|
10
|
+
json: { type: "boolean" },
|
|
11
|
+
extension: { type: "string", short: "e", multiple: true },
|
|
12
|
+
config: { type: "boolean" },
|
|
13
|
+
"include-key": { type: "boolean" },
|
|
14
|
+
"profile-only": { type: "boolean" },
|
|
15
|
+
"dump-context": { type: "boolean" },
|
|
16
|
+
"pi-sessions": { type: "boolean" },
|
|
17
|
+
"pi-runtime-host": { type: "boolean" },
|
|
18
|
+
"shell-runtime": { type: "boolean" },
|
|
19
|
+
"no-shell-runtime": { type: "boolean" },
|
|
20
|
+
"permission-mode": { type: "string" },
|
|
21
|
+
host: { type: "string" },
|
|
22
|
+
port: { type: "string" },
|
|
23
|
+
name: { type: "string" },
|
|
24
|
+
token: { type: "string" },
|
|
25
|
+
foreground: { type: "boolean" },
|
|
26
|
+
help: { type: "boolean", short: "h" },
|
|
27
|
+
},
|
|
28
|
+
allowPositionals: true,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const commandName = ["login", "provider", "websearch", "memory"].includes(positionals[0]) ? positionals[0] : null;
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
command: commandName ? { name: commandName, args: positionals.slice(1) } : null,
|
|
35
|
+
model: values.model ?? null,
|
|
36
|
+
provider: values.provider,
|
|
37
|
+
resume: values.resume,
|
|
38
|
+
json: values.json ?? false,
|
|
39
|
+
extensions: values.extension ?? [],
|
|
40
|
+
dumpContext: values["dump-context"] ?? false,
|
|
41
|
+
providerConfig: values.config ?? false,
|
|
42
|
+
includeKey: values["include-key"] ?? false,
|
|
43
|
+
profileOnly: values["profile-only"] ?? false,
|
|
44
|
+
piSessions: values["pi-sessions"] ?? false,
|
|
45
|
+
piRuntimeHost: values["pi-runtime-host"] ?? false,
|
|
46
|
+
shellRuntime: values["no-shell-runtime"] ? false : true,
|
|
47
|
+
permissionMode: values["permission-mode"] ?? "bypassPermissions",
|
|
48
|
+
host: values.host ?? null,
|
|
49
|
+
port: values.port ?? null,
|
|
50
|
+
name: values.name ?? null,
|
|
51
|
+
token: values.token ?? null,
|
|
52
|
+
foreground: values.foreground ?? false,
|
|
53
|
+
help: values.help ?? false,
|
|
54
|
+
prompt: commandName ? "" : positionals.join(" "),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function showHelp() {
|
|
59
|
+
process.stdout.write(`march — terminal-native coding agent
|
|
60
|
+
|
|
61
|
+
Usage:
|
|
62
|
+
march [options] [prompt]
|
|
63
|
+
march [options] (starts REPL)
|
|
64
|
+
march login [provider] Login to an OAuth provider
|
|
65
|
+
march provider --config Configure provider credentials
|
|
66
|
+
march provider share [id] Share a provider profile
|
|
67
|
+
march provider accept <token>
|
|
68
|
+
march websearch --config Configure web search credentials
|
|
69
|
+
march memory serve [folder]
|
|
70
|
+
march memory add <url>
|
|
71
|
+
march memory list
|
|
72
|
+
march memory remove <name>
|
|
73
|
+
|
|
74
|
+
Options:
|
|
75
|
+
-m, --model <id> Initial model ID override
|
|
76
|
+
--provider <name> Initial provider override
|
|
77
|
+
--resume <id> Resume a pi session by default
|
|
78
|
+
--json JSON output mode (no TUI)
|
|
79
|
+
--config With provider/websearch command, open configuration
|
|
80
|
+
--include-key With provider share, include API key
|
|
81
|
+
--profile-only With provider share, omit API key
|
|
82
|
+
--dump-context Write every prompt sent to the model under .march/context-dumps/
|
|
83
|
+
--pi-sessions Force pi JSONL SessionManager persistence
|
|
84
|
+
--pi-runtime-host Force pi AgentSessionRuntime host path
|
|
85
|
+
--shell-runtime Enable interactive PTY shell tools (default)
|
|
86
|
+
--no-shell-runtime Disable interactive PTY shell tools and shell pane
|
|
87
|
+
--permission-mode <mode> Permission mode: default, bypassPermissions, dontAsk (default: bypassPermissions)
|
|
88
|
+
-e, --extension <path>
|
|
89
|
+
Load a pi extension path in the default runtime host (repeatable)
|
|
90
|
+
--host <host> With memory serve, bind host (default: 127.0.0.1)
|
|
91
|
+
--port <port> With memory serve, bind port (default: 4317)
|
|
92
|
+
--name <name> With memory serve/add, remote memory source name
|
|
93
|
+
--foreground With memory serve, run server in current process
|
|
94
|
+
-h, --help Show this help
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
-
|
|
3
|
-
export function copyLastAssistantMessage({ engine, writeClipboard = writeSystemClipboard } = {}) {
|
|
4
|
-
const message = findLastAssistantMessage(engine);
|
|
5
|
-
if (!message) return ["Error: no assistant response to copy"];
|
|
6
|
-
const result = writeClipboard(message);
|
|
7
|
-
if (result?.ok === false) return [`Error: ${result.message}`];
|
|
8
|
-
return [`Copied last assistant response (${message.length} chars)`];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function findLastAssistantMessage(engine) {
|
|
12
|
-
const turns = engine?.turns ?? [];
|
|
13
|
-
for (let i = turns.length - 1; i >= 0; i -= 1) {
|
|
14
|
-
const text = turns[i]?.assistantMessage;
|
|
15
|
-
if (typeof text === "string" && text.trim()) return text;
|
|
16
|
-
}
|
|
17
|
-
return "";
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function writeSystemClipboard(text, { platform = process.platform } = {}) {
|
|
21
|
-
const command = clipboardCommand(platform);
|
|
22
|
-
if (!command) return { ok: false, message: `clipboard is not supported on ${platform}` };
|
|
23
|
-
const result = spawnSync(command.bin, command.args, {
|
|
24
|
-
input: text,
|
|
25
|
-
encoding: "utf8",
|
|
26
|
-
windowsHide: true,
|
|
27
|
-
});
|
|
28
|
-
if (result.error) return { ok: false, message: result.error.message };
|
|
29
|
-
if (result.status !== 0) {
|
|
30
|
-
const stderr = (result.stderr || "").trim();
|
|
31
|
-
return { ok: false, message: stderr || `${command.bin} exited ${result.status}` };
|
|
32
|
-
}
|
|
33
|
-
return { ok: true };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function writeSystemClipboardAsync(text, { platform = process.platform } = {}) {
|
|
37
|
-
const command = clipboardCommand(platform);
|
|
38
|
-
if (!command) return Promise.resolve({ ok: false, message: `clipboard is not supported on ${platform}` });
|
|
39
|
-
return new Promise((resolve) => {
|
|
40
|
-
let settled = false;
|
|
41
|
-
let stderr = "";
|
|
42
|
-
const done = (result) => {
|
|
43
|
-
if (settled) return;
|
|
44
|
-
settled = true;
|
|
45
|
-
resolve(result);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const child = spawn(command.bin, command.args, {
|
|
49
|
-
windowsHide: true,
|
|
50
|
-
stdio: ["pipe", "ignore", "pipe"],
|
|
51
|
-
});
|
|
52
|
-
child.stderr?.setEncoding?.("utf8");
|
|
53
|
-
child.stderr?.on("data", (chunk) => { stderr += chunk; });
|
|
54
|
-
child.on("error", (err) => done({ ok: false, message: err.message }));
|
|
55
|
-
child.on("close", (status) => {
|
|
56
|
-
if (status === 0) done({ ok: true });
|
|
57
|
-
else done({ ok: false, message: stderr.trim() || `${command.bin} exited ${status}` });
|
|
58
|
-
});
|
|
59
|
-
child.stdin?.on("error", (err) => done({ ok: false, message: err.message }));
|
|
60
|
-
child.stdin?.end(text, "utf8");
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function clipboardCommand(platform) {
|
|
65
|
-
if (platform === "win32") {
|
|
66
|
-
return {
|
|
67
|
-
bin: "powershell.exe",
|
|
68
|
-
args: ["-NoProfile", "-EncodedCommand", encodePowerShellCommand(readUtf8StdinToClipboardScript())],
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
if (platform === "darwin") return { bin: "pbcopy", args: [] };
|
|
72
|
-
return { bin: "sh", args: ["-lc", "command -v wl-copy >/dev/null && wl-copy || xclip -selection clipboard || xsel --clipboard --input"] };
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function readUtf8StdinToClipboardScript() {
|
|
76
|
-
return [
|
|
77
|
-
"$stdin = [Console]::OpenStandardInput()",
|
|
78
|
-
"$memory = New-Object System.IO.MemoryStream",
|
|
79
|
-
"$stdin.CopyTo($memory)",
|
|
80
|
-
"$text = [System.Text.Encoding]::UTF8.GetString($memory.ToArray())",
|
|
81
|
-
"Set-Clipboard -Value $text",
|
|
82
|
-
].join("; ");
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function encodePowerShellCommand(script) {
|
|
86
|
-
return Buffer.from(script, "utf16le").toString("base64");
|
|
87
|
-
}
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
|
|
3
|
+
export function copyLastAssistantMessage({ engine, writeClipboard = writeSystemClipboard } = {}) {
|
|
4
|
+
const message = findLastAssistantMessage(engine);
|
|
5
|
+
if (!message) return ["Error: no assistant response to copy"];
|
|
6
|
+
const result = writeClipboard(message);
|
|
7
|
+
if (result?.ok === false) return [`Error: ${result.message}`];
|
|
8
|
+
return [`Copied last assistant response (${message.length} chars)`];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function findLastAssistantMessage(engine) {
|
|
12
|
+
const turns = engine?.turns ?? [];
|
|
13
|
+
for (let i = turns.length - 1; i >= 0; i -= 1) {
|
|
14
|
+
const text = turns[i]?.assistantMessage;
|
|
15
|
+
if (typeof text === "string" && text.trim()) return text;
|
|
16
|
+
}
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function writeSystemClipboard(text, { platform = process.platform } = {}) {
|
|
21
|
+
const command = clipboardCommand(platform);
|
|
22
|
+
if (!command) return { ok: false, message: `clipboard is not supported on ${platform}` };
|
|
23
|
+
const result = spawnSync(command.bin, command.args, {
|
|
24
|
+
input: text,
|
|
25
|
+
encoding: "utf8",
|
|
26
|
+
windowsHide: true,
|
|
27
|
+
});
|
|
28
|
+
if (result.error) return { ok: false, message: result.error.message };
|
|
29
|
+
if (result.status !== 0) {
|
|
30
|
+
const stderr = (result.stderr || "").trim();
|
|
31
|
+
return { ok: false, message: stderr || `${command.bin} exited ${result.status}` };
|
|
32
|
+
}
|
|
33
|
+
return { ok: true };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function writeSystemClipboardAsync(text, { platform = process.platform } = {}) {
|
|
37
|
+
const command = clipboardCommand(platform);
|
|
38
|
+
if (!command) return Promise.resolve({ ok: false, message: `clipboard is not supported on ${platform}` });
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
let settled = false;
|
|
41
|
+
let stderr = "";
|
|
42
|
+
const done = (result) => {
|
|
43
|
+
if (settled) return;
|
|
44
|
+
settled = true;
|
|
45
|
+
resolve(result);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const child = spawn(command.bin, command.args, {
|
|
49
|
+
windowsHide: true,
|
|
50
|
+
stdio: ["pipe", "ignore", "pipe"],
|
|
51
|
+
});
|
|
52
|
+
child.stderr?.setEncoding?.("utf8");
|
|
53
|
+
child.stderr?.on("data", (chunk) => { stderr += chunk; });
|
|
54
|
+
child.on("error", (err) => done({ ok: false, message: err.message }));
|
|
55
|
+
child.on("close", (status) => {
|
|
56
|
+
if (status === 0) done({ ok: true });
|
|
57
|
+
else done({ ok: false, message: stderr.trim() || `${command.bin} exited ${status}` });
|
|
58
|
+
});
|
|
59
|
+
child.stdin?.on("error", (err) => done({ ok: false, message: err.message }));
|
|
60
|
+
child.stdin?.end(text, "utf8");
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function clipboardCommand(platform) {
|
|
65
|
+
if (platform === "win32") {
|
|
66
|
+
return {
|
|
67
|
+
bin: "powershell.exe",
|
|
68
|
+
args: ["-NoProfile", "-EncodedCommand", encodePowerShellCommand(readUtf8StdinToClipboardScript())],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (platform === "darwin") return { bin: "pbcopy", args: [] };
|
|
72
|
+
return { bin: "sh", args: ["-lc", "command -v wl-copy >/dev/null && wl-copy || xclip -selection clipboard || xsel --clipboard --input"] };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function readUtf8StdinToClipboardScript() {
|
|
76
|
+
return [
|
|
77
|
+
"$stdin = [Console]::OpenStandardInput()",
|
|
78
|
+
"$memory = New-Object System.IO.MemoryStream",
|
|
79
|
+
"$stdin.CopyTo($memory)",
|
|
80
|
+
"$text = [System.Text.Encoding]::UTF8.GetString($memory.ToArray())",
|
|
81
|
+
"Set-Clipboard -Value $text",
|
|
82
|
+
].join("; ");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function encodePowerShellCommand(script) {
|
|
86
|
+
return Buffer.from(script, "utf16le").toString("base64");
|
|
87
|
+
}
|