march-cli 0.1.15 → 0.1.16

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "march-cli",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "March CLI — terminal-native coding agent with context reconstruction",
5
5
  "type": "module",
6
6
  "main": "./src/main.mjs",
@@ -1,93 +1,11 @@
1
- import { join } from "node:path";
2
- import { createRunner } from "../runner.mjs";
3
1
  import { createProcessRuntimeIpcPeer } from "./ipc/process-ipc-transport.mjs";
4
- import { createRemoteRuntimeUiClient } from "./remote-ui-client.mjs";
5
2
  import { createRunnerIpcTarget } from "./runner-ipc-target.mjs";
6
- import { createMarchAuthStorage } from "../../auth/storage.mjs";
7
- import { createCliShellRuntime } from "../../shell/cli-runtime.mjs";
8
- import { MarkdownMemoryStore } from "../../memory/markdown-store.mjs";
9
- import { createMarkdownMemoryTools } from "../../memory/markdown-tools.mjs";
10
- import { initializeMcp } from "../../mcp/index.mjs";
11
- import { createWebToolsFromConfig } from "../../web/tools.mjs";
12
- import { createPermissionController } from "../../cli/permissions.mjs";
13
- import { resolvePiSessionManager } from "../../session/pi-manager.mjs";
14
- import { createModelContextDumper } from "../../debug/model-context-dumper.mjs";
15
- import { createLogger, installProcessLogHandlers } from "../../debug/logger.mjs";
16
- import { createDesktopTurnNotifier } from "../../notification/desktop-notifier.mjs";
3
+ import { createIsolatedRunner } from "./runner-process-factory.mjs";
17
4
 
18
5
  const peer = createProcessRuntimeIpcPeer({
19
- target: createRunnerIpcTarget({ createRunnerImpl: createIsolatedRunner }),
6
+ target: createRunnerIpcTarget({
7
+ createRunnerImpl: (options) => createIsolatedRunner(options, { peer }),
8
+ }),
20
9
  });
21
10
 
22
11
  process.once("disconnect", () => peer.dispose());
23
-
24
- async function createIsolatedRunner(options = {}) {
25
- const ui = createRemoteRuntimeUiClient(peer);
26
- const memoryStore = new MarkdownMemoryStore({ root: options.memoryRoot });
27
- const memoryTools = createMarkdownMemoryTools(memoryStore);
28
- const shellRuntime = options.shellRuntime ? createCliShellRuntime({ cwd: options.cwd }) : null;
29
- const mcpInit = await initializeMcp({ projectDir: options.cwd });
30
- const logger = createLogger({ logDir: options.logDir ?? (options.stateRoot ? join(options.stateRoot, "logs") : undefined) });
31
- installProcessLogHandlers(logger);
32
-
33
- const runner = await createRunner({
34
- cwd: options.cwd,
35
- modelId: options.modelId,
36
- provider: options.provider,
37
- serviceTier: options.serviceTier,
38
- providers: options.providers,
39
- stateRoot: options.stateRoot,
40
- ui,
41
- memoryRoot: options.memoryRoot,
42
- profilePaths: options.profilePaths,
43
- memoryStore,
44
- memoryTools,
45
- shellRuntime,
46
- mcpTools: mcpInit.mcpTools,
47
- mcpInjections: mcpInit.mcpInjections,
48
- mcpClientManager: mcpInit.clientManager,
49
- webTools: createWebToolsFromConfig(options.config ?? {}),
50
- namespace: options.namespace,
51
- projectMarchDir: options.projectMarchDir,
52
- extensionPaths: options.extensionPaths ?? [],
53
- sessionManager: resolvePiSessionManager({
54
- cwd: options.cwd,
55
- projectMarchDir: options.projectMarchDir,
56
- enabled: true,
57
- }),
58
- useRuntimeHost: true,
59
- syncPiSidecar: true,
60
- lifecycleHooks: options.lifecycleHooks ?? [],
61
- lifecycleDiagnostics: options.lifecycleDiagnostics ?? [],
62
- authStorage: createMarchAuthStorage({
63
- provider: options.provider ?? "deepseek",
64
- providers: options.providers,
65
- cwd: options.cwd,
66
- }).authStorage,
67
- maxTurns: options.config?.maxTurns ?? undefined,
68
- trimBatch: options.config?.trimBatch ?? undefined,
69
- hostedTools: options.config?.hostedTools,
70
- permissionController: createPermissionController({ mode: options.permissionMode }),
71
- modelContextDumper: createModelContextDumper(options.modelContextDumper ?? { enabled: false }),
72
- turnNotifier: createDesktopTurnNotifier({
73
- enabled: Boolean(options.config?.notifications?.turnEnd),
74
- config: options.config?.notifications,
75
- }),
76
- logger,
77
- onModelPayload: (event) => peer.notify("modelPayload", pickModelPayloadEvent(event)),
78
- });
79
-
80
- const originalDispose = runner.dispose;
81
- runner.dispose = async () => {
82
- try {
83
- await originalDispose.call(runner);
84
- } finally {
85
- memoryStore.close?.();
86
- }
87
- };
88
- return runner;
89
- }
90
-
91
- function pickModelPayloadEvent({ estimatedTokens, provider, model, kind, turnId } = {}) {
92
- return { estimatedTokens, provider, model, kind, turnId };
93
- }
@@ -0,0 +1,108 @@
1
+ import { join } from "node:path";
2
+ import { createRunner } from "../runner.mjs";
3
+ import { createRemoteRuntimeUiClient } from "./remote-ui-client.mjs";
4
+ import { createMarchAuthStorage } from "../../auth/storage.mjs";
5
+ import { createCliShellRuntime } from "../../shell/cli-runtime.mjs";
6
+ import { MarkdownMemoryStore } from "../../memory/markdown-store.mjs";
7
+ import { createMarkdownMemoryTools } from "../../memory/markdown-tools.mjs";
8
+ import { initializeMcp } from "../../mcp/index.mjs";
9
+ import { createWebToolsFromConfig } from "../../web/tools.mjs";
10
+ import { createPermissionController } from "../../cli/permissions.mjs";
11
+ import { resolvePiSessionManager } from "../../session/pi-manager.mjs";
12
+ import { createModelContextDumper } from "../../debug/model-context-dumper.mjs";
13
+ import { createLogger, installProcessLogHandlers } from "../../debug/logger.mjs";
14
+ import { createDesktopTurnNotifier } from "../../notification/desktop-notifier.mjs";
15
+ import { installNetworkEnvironment } from "../../network/environment.mjs";
16
+
17
+ const DEFAULT_DEPS = {
18
+ createRunner,
19
+ createRemoteRuntimeUiClient,
20
+ createCliShellRuntime,
21
+ MarkdownMemoryStore,
22
+ createMarkdownMemoryTools,
23
+ initializeMcp,
24
+ createWebToolsFromConfig,
25
+ createPermissionController,
26
+ resolvePiSessionManager,
27
+ createModelContextDumper,
28
+ createMarchAuthStorage,
29
+ createLogger,
30
+ installProcessLogHandlers,
31
+ createDesktopTurnNotifier,
32
+ installNetworkEnvironment,
33
+ };
34
+
35
+ export async function createIsolatedRunner(options = {}, deps = {}) {
36
+ const d = { ...DEFAULT_DEPS, ...deps };
37
+ d.installNetworkEnvironment(options.config?.network);
38
+
39
+ const ui = d.createRemoteRuntimeUiClient(d.peer);
40
+ const memoryStore = new d.MarkdownMemoryStore({ root: options.memoryRoot });
41
+ const memoryTools = d.createMarkdownMemoryTools(memoryStore);
42
+ const shellRuntime = options.shellRuntime ? d.createCliShellRuntime({ cwd: options.cwd }) : null;
43
+ const mcpInit = await d.initializeMcp({ projectDir: options.cwd });
44
+ const logDir = options.logDir ?? (options.stateRoot ? join(options.stateRoot, "logs") : undefined);
45
+ const logger = d.createLogger({ logDir });
46
+ d.installProcessLogHandlers(logger);
47
+
48
+ const runner = await d.createRunner({
49
+ cwd: options.cwd,
50
+ modelId: options.modelId,
51
+ provider: options.provider,
52
+ serviceTier: options.serviceTier,
53
+ providers: options.providers,
54
+ stateRoot: options.stateRoot,
55
+ ui,
56
+ memoryRoot: options.memoryRoot,
57
+ profilePaths: options.profilePaths,
58
+ memoryStore,
59
+ memoryTools,
60
+ shellRuntime,
61
+ mcpTools: mcpInit.mcpTools,
62
+ mcpInjections: mcpInit.mcpInjections,
63
+ mcpClientManager: mcpInit.clientManager,
64
+ webTools: d.createWebToolsFromConfig(options.config ?? {}),
65
+ namespace: options.namespace,
66
+ projectMarchDir: options.projectMarchDir,
67
+ extensionPaths: options.extensionPaths ?? [],
68
+ sessionManager: d.resolvePiSessionManager({
69
+ cwd: options.cwd,
70
+ projectMarchDir: options.projectMarchDir,
71
+ enabled: true,
72
+ }),
73
+ useRuntimeHost: true,
74
+ syncPiSidecar: true,
75
+ lifecycleHooks: options.lifecycleHooks ?? [],
76
+ lifecycleDiagnostics: options.lifecycleDiagnostics ?? [],
77
+ authStorage: d.createMarchAuthStorage({
78
+ provider: options.provider ?? "deepseek",
79
+ providers: options.providers,
80
+ cwd: options.cwd,
81
+ }).authStorage,
82
+ maxTurns: options.config?.maxTurns ?? undefined,
83
+ trimBatch: options.config?.trimBatch ?? undefined,
84
+ hostedTools: options.config?.hostedTools,
85
+ permissionController: d.createPermissionController({ mode: options.permissionMode }),
86
+ modelContextDumper: d.createModelContextDumper(options.modelContextDumper ?? { enabled: false }),
87
+ turnNotifier: d.createDesktopTurnNotifier({
88
+ enabled: Boolean(options.config?.notifications?.turnEnd),
89
+ config: options.config?.notifications,
90
+ }),
91
+ logger,
92
+ onModelPayload: (event) => d.peer.notify("modelPayload", pickModelPayloadEvent(event)),
93
+ });
94
+
95
+ const originalDispose = runner.dispose;
96
+ runner.dispose = async () => {
97
+ try {
98
+ await originalDispose.call(runner);
99
+ } finally {
100
+ memoryStore.close?.();
101
+ }
102
+ };
103
+ return runner;
104
+ }
105
+
106
+ function pickModelPayloadEvent({ estimatedTokens, provider, model, kind, turnId } = {}) {
107
+ return { estimatedTokens, provider, model, kind, turnId };
108
+ }