shennian 0.2.4 → 0.2.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.
Files changed (286) hide show
  1. package/dist/bin/shennian.d.ts +0 -1
  2. package/dist/bin/shennian.js +0 -1
  3. package/dist/src/agents/adapter.d.ts +0 -1
  4. package/dist/src/agents/adapter.js +0 -1
  5. package/dist/src/agents/claude.d.ts +1 -1
  6. package/dist/src/agents/claude.js +12 -6
  7. package/dist/src/agents/codex.d.ts +0 -1
  8. package/dist/src/agents/codex.js +13 -4
  9. package/dist/src/agents/command-spec.d.ts +28 -3
  10. package/dist/src/agents/command-spec.js +251 -10
  11. package/dist/src/agents/cursor.d.ts +0 -1
  12. package/dist/src/agents/cursor.js +2 -4
  13. package/dist/src/agents/custom.d.ts +0 -6
  14. package/dist/src/agents/custom.js +4 -40
  15. package/dist/src/agents/detect.d.ts +0 -1
  16. package/dist/src/agents/detect.js +0 -1
  17. package/dist/src/agents/gemini.d.ts +0 -1
  18. package/dist/src/agents/gemini.js +7 -3
  19. package/dist/src/agents/model-registry/cache.d.ts +0 -1
  20. package/dist/src/agents/model-registry/cache.js +0 -1
  21. package/dist/src/agents/model-registry/discovery.d.ts +0 -1
  22. package/dist/src/agents/model-registry/discovery.js +13 -54
  23. package/dist/src/agents/model-registry/parsers.d.ts +3 -1
  24. package/dist/src/agents/model-registry/parsers.js +92 -2
  25. package/dist/src/agents/model-registry/runner.d.ts +2 -7
  26. package/dist/src/agents/model-registry/runner.js +3 -134
  27. package/dist/src/agents/model-registry/service.d.ts +0 -1
  28. package/dist/src/agents/model-registry/service.js +12 -10
  29. package/dist/src/agents/model-registry/types.d.ts +0 -1
  30. package/dist/src/agents/model-registry/types.js +0 -1
  31. package/dist/src/agents/model-registry.d.ts +2 -2
  32. package/dist/src/agents/model-registry.js +2 -2
  33. package/dist/src/agents/openclaw.d.ts +0 -1
  34. package/dist/src/agents/openclaw.js +13 -4
  35. package/dist/src/agents/pi.d.ts +0 -1
  36. package/dist/src/agents/pi.js +0 -1
  37. package/dist/src/commands/agent.d.ts +0 -1
  38. package/dist/src/commands/agent.js +2 -33
  39. package/dist/src/commands/daemon.d.ts +6 -1
  40. package/dist/src/commands/daemon.js +153 -18
  41. package/dist/src/commands/pair-qr.d.ts +0 -1
  42. package/dist/src/commands/pair-qr.js +0 -1
  43. package/dist/src/commands/pair.d.ts +0 -1
  44. package/dist/src/commands/pair.js +0 -1
  45. package/dist/src/commands/upgrade.d.ts +0 -1
  46. package/dist/src/commands/upgrade.js +0 -1
  47. package/dist/src/config/index.d.ts +0 -1
  48. package/dist/src/config/index.js +0 -1
  49. package/dist/src/fs/handler.d.ts +0 -1
  50. package/dist/src/fs/handler.js +0 -1
  51. package/dist/src/fs/security.d.ts +0 -1
  52. package/dist/src/fs/security.js +5 -1
  53. package/dist/src/index.d.ts +0 -1
  54. package/dist/src/index.js +33 -7
  55. package/dist/src/log-reporter.d.ts +0 -1
  56. package/dist/src/log-reporter.js +2 -20
  57. package/dist/src/native-fusion/parsers.d.ts +0 -1
  58. package/dist/src/native-fusion/parsers.js +356 -40
  59. package/dist/src/native-fusion/service.d.ts +0 -1
  60. package/dist/src/native-fusion/service.js +14 -5
  61. package/dist/src/native-fusion/state.d.ts +0 -1
  62. package/dist/src/native-fusion/state.js +0 -1
  63. package/dist/src/native-fusion/types.d.ts +0 -1
  64. package/dist/src/native-fusion/types.js +0 -1
  65. package/dist/src/region.d.ts +0 -1
  66. package/dist/src/region.js +0 -1
  67. package/dist/src/relay/client.d.ts +11 -2
  68. package/dist/src/relay/client.js +22 -4
  69. package/dist/src/session/handlers/agents.d.ts +0 -1
  70. package/dist/src/session/handlers/agents.js +0 -1
  71. package/dist/src/session/handlers/chat.d.ts +0 -1
  72. package/dist/src/session/handlers/chat.js +0 -1
  73. package/dist/src/session/handlers/control.d.ts +0 -1
  74. package/dist/src/session/handlers/control.js +0 -1
  75. package/dist/src/session/handlers/fs.d.ts +0 -1
  76. package/dist/src/session/handlers/fs.js +5 -2
  77. package/dist/src/session/manager.d.ts +1 -1
  78. package/dist/src/session/manager.js +23 -4
  79. package/dist/src/session/store.d.ts +0 -1
  80. package/dist/src/session/store.js +0 -1
  81. package/dist/src/session/types.d.ts +0 -1
  82. package/dist/src/session/types.js +0 -1
  83. package/dist/src/upgrade/engine.d.ts +0 -1
  84. package/dist/src/upgrade/engine.js +0 -1
  85. package/package.json +3 -2
  86. package/dist/bin/shennian.d.ts.map +0 -1
  87. package/dist/bin/shennian.js.map +0 -1
  88. package/dist/src/__experiments__/probe-debug.d.ts +0 -2
  89. package/dist/src/__experiments__/probe-debug.d.ts.map +0 -1
  90. package/dist/src/__experiments__/probe-debug.js +0 -66
  91. package/dist/src/__experiments__/probe-debug.js.map +0 -1
  92. package/dist/src/__experiments__/probe-final-benchmark.d.ts +0 -3
  93. package/dist/src/__experiments__/probe-final-benchmark.d.ts.map +0 -1
  94. package/dist/src/__experiments__/probe-final-benchmark.js +0 -234
  95. package/dist/src/__experiments__/probe-final-benchmark.js.map +0 -1
  96. package/dist/src/__experiments__/probe-models-final.d.ts +0 -19
  97. package/dist/src/__experiments__/probe-models-final.d.ts.map +0 -1
  98. package/dist/src/__experiments__/probe-models-final.js +0 -250
  99. package/dist/src/__experiments__/probe-models-final.js.map +0 -1
  100. package/dist/src/__experiments__/probe-models.d.ts +0 -7
  101. package/dist/src/__experiments__/probe-models.d.ts.map +0 -1
  102. package/dist/src/__experiments__/probe-models.js +0 -251
  103. package/dist/src/__experiments__/probe-models.js.map +0 -1
  104. package/dist/src/__tests__/agents-e2e.d.ts +0 -21
  105. package/dist/src/__tests__/agents-e2e.d.ts.map +0 -1
  106. package/dist/src/__tests__/agents-e2e.js +0 -155
  107. package/dist/src/__tests__/agents-e2e.js.map +0 -1
  108. package/dist/src/__tests__/claude-adapter.test.d.ts +0 -2
  109. package/dist/src/__tests__/claude-adapter.test.d.ts.map +0 -1
  110. package/dist/src/__tests__/claude-adapter.test.js +0 -75
  111. package/dist/src/__tests__/claude-adapter.test.js.map +0 -1
  112. package/dist/src/__tests__/codex-adapter.test.d.ts +0 -2
  113. package/dist/src/__tests__/codex-adapter.test.d.ts.map +0 -1
  114. package/dist/src/__tests__/codex-adapter.test.js +0 -281
  115. package/dist/src/__tests__/codex-adapter.test.js.map +0 -1
  116. package/dist/src/__tests__/config.test.d.ts +0 -2
  117. package/dist/src/__tests__/config.test.d.ts.map +0 -1
  118. package/dist/src/__tests__/config.test.js +0 -60
  119. package/dist/src/__tests__/config.test.js.map +0 -1
  120. package/dist/src/__tests__/cursor-adapter.test.d.ts +0 -2
  121. package/dist/src/__tests__/cursor-adapter.test.d.ts.map +0 -1
  122. package/dist/src/__tests__/cursor-adapter.test.js +0 -69
  123. package/dist/src/__tests__/cursor-adapter.test.js.map +0 -1
  124. package/dist/src/__tests__/custom-agent-flow.test.d.ts +0 -2
  125. package/dist/src/__tests__/custom-agent-flow.test.d.ts.map +0 -1
  126. package/dist/src/__tests__/custom-agent-flow.test.js +0 -244
  127. package/dist/src/__tests__/custom-agent-flow.test.js.map +0 -1
  128. package/dist/src/__tests__/daemon-autostart.test.d.ts +0 -2
  129. package/dist/src/__tests__/daemon-autostart.test.d.ts.map +0 -1
  130. package/dist/src/__tests__/daemon-autostart.test.js +0 -60
  131. package/dist/src/__tests__/daemon-autostart.test.js.map +0 -1
  132. package/dist/src/__tests__/e2e-relay.d.ts +0 -19
  133. package/dist/src/__tests__/e2e-relay.d.ts.map +0 -1
  134. package/dist/src/__tests__/e2e-relay.js +0 -400
  135. package/dist/src/__tests__/e2e-relay.js.map +0 -1
  136. package/dist/src/__tests__/fs-handler.test.d.ts +0 -2
  137. package/dist/src/__tests__/fs-handler.test.d.ts.map +0 -1
  138. package/dist/src/__tests__/fs-handler.test.js +0 -19
  139. package/dist/src/__tests__/fs-handler.test.js.map +0 -1
  140. package/dist/src/__tests__/model-discovery.test.d.ts +0 -2
  141. package/dist/src/__tests__/model-discovery.test.d.ts.map +0 -1
  142. package/dist/src/__tests__/model-discovery.test.js +0 -47
  143. package/dist/src/__tests__/model-discovery.test.js.map +0 -1
  144. package/dist/src/__tests__/model-switching.test.d.ts +0 -2
  145. package/dist/src/__tests__/model-switching.test.d.ts.map +0 -1
  146. package/dist/src/__tests__/model-switching.test.js +0 -292
  147. package/dist/src/__tests__/model-switching.test.js.map +0 -1
  148. package/dist/src/__tests__/native-fusion-parsers.test.d.ts +0 -2
  149. package/dist/src/__tests__/native-fusion-parsers.test.d.ts.map +0 -1
  150. package/dist/src/__tests__/native-fusion-parsers.test.js +0 -253
  151. package/dist/src/__tests__/native-fusion-parsers.test.js.map +0 -1
  152. package/dist/src/__tests__/native-fusion-service.test.d.ts +0 -2
  153. package/dist/src/__tests__/native-fusion-service.test.d.ts.map +0 -1
  154. package/dist/src/__tests__/native-fusion-service.test.js +0 -157
  155. package/dist/src/__tests__/native-fusion-service.test.js.map +0 -1
  156. package/dist/src/__tests__/native-session-sync.test.d.ts +0 -2
  157. package/dist/src/__tests__/native-session-sync.test.d.ts.map +0 -1
  158. package/dist/src/__tests__/native-session-sync.test.js +0 -198
  159. package/dist/src/__tests__/native-session-sync.test.js.map +0 -1
  160. package/dist/src/__tests__/pair-qr.test.d.ts +0 -2
  161. package/dist/src/__tests__/pair-qr.test.d.ts.map +0 -1
  162. package/dist/src/__tests__/pair-qr.test.js +0 -13
  163. package/dist/src/__tests__/pair-qr.test.js.map +0 -1
  164. package/dist/src/__tests__/pi-context.test.d.ts +0 -2
  165. package/dist/src/__tests__/pi-context.test.d.ts.map +0 -1
  166. package/dist/src/__tests__/pi-context.test.js +0 -261
  167. package/dist/src/__tests__/pi-context.test.js.map +0 -1
  168. package/dist/src/__tests__/session-manager.test.d.ts +0 -2
  169. package/dist/src/__tests__/session-manager.test.d.ts.map +0 -1
  170. package/dist/src/__tests__/session-manager.test.js +0 -685
  171. package/dist/src/__tests__/session-manager.test.js.map +0 -1
  172. package/dist/src/__tests__/session-store.test.d.ts +0 -2
  173. package/dist/src/__tests__/session-store.test.d.ts.map +0 -1
  174. package/dist/src/__tests__/session-store.test.js +0 -106
  175. package/dist/src/__tests__/session-store.test.js.map +0 -1
  176. package/dist/src/agents/adapter.d.ts.map +0 -1
  177. package/dist/src/agents/adapter.js.map +0 -1
  178. package/dist/src/agents/claude.d.ts.map +0 -1
  179. package/dist/src/agents/claude.js.map +0 -1
  180. package/dist/src/agents/codex.d.ts.map +0 -1
  181. package/dist/src/agents/codex.js.map +0 -1
  182. package/dist/src/agents/command-spec.d.ts.map +0 -1
  183. package/dist/src/agents/command-spec.js.map +0 -1
  184. package/dist/src/agents/cursor.d.ts.map +0 -1
  185. package/dist/src/agents/cursor.js.map +0 -1
  186. package/dist/src/agents/custom.d.ts.map +0 -1
  187. package/dist/src/agents/custom.js.map +0 -1
  188. package/dist/src/agents/detect.d.ts.map +0 -1
  189. package/dist/src/agents/detect.js.map +0 -1
  190. package/dist/src/agents/gemini.d.ts.map +0 -1
  191. package/dist/src/agents/gemini.js.map +0 -1
  192. package/dist/src/agents/model-registry/cache.d.ts.map +0 -1
  193. package/dist/src/agents/model-registry/cache.js.map +0 -1
  194. package/dist/src/agents/model-registry/discovery.d.ts.map +0 -1
  195. package/dist/src/agents/model-registry/discovery.js.map +0 -1
  196. package/dist/src/agents/model-registry/parsers.d.ts.map +0 -1
  197. package/dist/src/agents/model-registry/parsers.js.map +0 -1
  198. package/dist/src/agents/model-registry/runner.d.ts.map +0 -1
  199. package/dist/src/agents/model-registry/runner.js.map +0 -1
  200. package/dist/src/agents/model-registry/service.d.ts.map +0 -1
  201. package/dist/src/agents/model-registry/service.js.map +0 -1
  202. package/dist/src/agents/model-registry/types.d.ts.map +0 -1
  203. package/dist/src/agents/model-registry/types.js.map +0 -1
  204. package/dist/src/agents/model-registry.d.ts.map +0 -1
  205. package/dist/src/agents/model-registry.js.map +0 -1
  206. package/dist/src/agents/openclaw.d.ts.map +0 -1
  207. package/dist/src/agents/openclaw.js.map +0 -1
  208. package/dist/src/agents/pi.d.ts.map +0 -1
  209. package/dist/src/agents/pi.js.map +0 -1
  210. package/dist/src/commands/agent.d.ts.map +0 -1
  211. package/dist/src/commands/agent.js.map +0 -1
  212. package/dist/src/commands/daemon.d.ts.map +0 -1
  213. package/dist/src/commands/daemon.js.map +0 -1
  214. package/dist/src/commands/pair-qr.d.ts.map +0 -1
  215. package/dist/src/commands/pair-qr.js.map +0 -1
  216. package/dist/src/commands/pair.d.ts.map +0 -1
  217. package/dist/src/commands/pair.js.map +0 -1
  218. package/dist/src/commands/upgrade.d.ts.map +0 -1
  219. package/dist/src/commands/upgrade.js.map +0 -1
  220. package/dist/src/config/index.d.ts.map +0 -1
  221. package/dist/src/config/index.js.map +0 -1
  222. package/dist/src/fs/handler.d.ts.map +0 -1
  223. package/dist/src/fs/handler.js.map +0 -1
  224. package/dist/src/fs/multimodal.d.ts +0 -5
  225. package/dist/src/fs/multimodal.d.ts.map +0 -1
  226. package/dist/src/fs/multimodal.js +0 -39
  227. package/dist/src/fs/multimodal.js.map +0 -1
  228. package/dist/src/fs/security.d.ts.map +0 -1
  229. package/dist/src/fs/security.js.map +0 -1
  230. package/dist/src/index.d.ts.map +0 -1
  231. package/dist/src/index.js.map +0 -1
  232. package/dist/src/log-reporter.d.ts.map +0 -1
  233. package/dist/src/log-reporter.js.map +0 -1
  234. package/dist/src/native-fusion/parsers.d.ts.map +0 -1
  235. package/dist/src/native-fusion/parsers.js.map +0 -1
  236. package/dist/src/native-fusion/service.d.ts.map +0 -1
  237. package/dist/src/native-fusion/service.js.map +0 -1
  238. package/dist/src/native-fusion/state.d.ts.map +0 -1
  239. package/dist/src/native-fusion/state.js.map +0 -1
  240. package/dist/src/native-fusion/types.d.ts.map +0 -1
  241. package/dist/src/native-fusion/types.js.map +0 -1
  242. package/dist/src/native-sync/discover.d.ts +0 -6
  243. package/dist/src/native-sync/discover.d.ts.map +0 -1
  244. package/dist/src/native-sync/discover.js +0 -69
  245. package/dist/src/native-sync/discover.js.map +0 -1
  246. package/dist/src/native-sync/parsers.d.ts +0 -3
  247. package/dist/src/native-sync/parsers.d.ts.map +0 -1
  248. package/dist/src/native-sync/parsers.js +0 -373
  249. package/dist/src/native-sync/parsers.js.map +0 -1
  250. package/dist/src/native-sync/service.d.ts +0 -16
  251. package/dist/src/native-sync/service.d.ts.map +0 -1
  252. package/dist/src/native-sync/service.js +0 -95
  253. package/dist/src/native-sync/service.js.map +0 -1
  254. package/dist/src/native-sync/state.d.ts +0 -6
  255. package/dist/src/native-sync/state.d.ts.map +0 -1
  256. package/dist/src/native-sync/state.js +0 -34
  257. package/dist/src/native-sync/state.js.map +0 -1
  258. package/dist/src/native-sync/types.d.ts +0 -23
  259. package/dist/src/native-sync/types.d.ts.map +0 -1
  260. package/dist/src/native-sync/types.js +0 -4
  261. package/dist/src/native-sync/types.js.map +0 -1
  262. package/dist/src/region.d.ts.map +0 -1
  263. package/dist/src/region.js.map +0 -1
  264. package/dist/src/relay/client.d.ts.map +0 -1
  265. package/dist/src/relay/client.js.map +0 -1
  266. package/dist/src/session/handlers/agents.d.ts.map +0 -1
  267. package/dist/src/session/handlers/agents.js.map +0 -1
  268. package/dist/src/session/handlers/chat.d.ts.map +0 -1
  269. package/dist/src/session/handlers/chat.js.map +0 -1
  270. package/dist/src/session/handlers/control.d.ts.map +0 -1
  271. package/dist/src/session/handlers/control.js.map +0 -1
  272. package/dist/src/session/handlers/fs.d.ts.map +0 -1
  273. package/dist/src/session/handlers/fs.js.map +0 -1
  274. package/dist/src/session/handlers/queue.d.ts +0 -4
  275. package/dist/src/session/handlers/queue.d.ts.map +0 -1
  276. package/dist/src/session/handlers/queue.js +0 -66
  277. package/dist/src/session/handlers/queue.js.map +0 -1
  278. package/dist/src/session/manager.d.ts.map +0 -1
  279. package/dist/src/session/manager.js.map +0 -1
  280. package/dist/src/session/store.d.ts.map +0 -1
  281. package/dist/src/session/store.js.map +0 -1
  282. package/dist/src/session/types.d.ts.map +0 -1
  283. package/dist/src/session/types.js.map +0 -1
  284. package/dist/src/upgrade/engine.d.ts.map +0 -1
  285. package/dist/src/upgrade/engine.js.map +0 -1
  286. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,10 +1,9 @@
1
1
  // @arch docs/architecture/cli/model-discovery.md
2
2
  // @test src/__tests__/model-switching.test.ts
3
- import { spawn } from 'node:child_process';
4
3
  import { createInterface } from 'node:readline';
5
- import { resolveBuiltinCommand } from '../command-spec.js';
6
- import { parseClaudeModels, parseCodexAppServerModels, parseCodexModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, } from './parsers.js';
7
- import { runCommand, runPtyCommand } from './runner.js';
4
+ import { resolveBuiltinCommand, spawnResolvedCommand } from '../command-spec.js';
5
+ import { fallbackClaudeAliasModels, fallbackGeminiModels, parseCodexAppServerModels, parseCursorModels, parseOpenClawModels, } from './parsers.js';
6
+ import { runResolvedCommand } from './runner.js';
8
7
  import { DISCOVERY_WORKDIR } from './types.js';
9
8
  function sendAppServerRpc(proc, pending, id, method, params, timeoutMs) {
10
9
  if (!proc.stdin)
@@ -24,8 +23,8 @@ function sendAppServerRpc(proc, pending, id, method, params, timeoutMs) {
24
23
  });
25
24
  });
26
25
  }
27
- async function discoverCodexModelsViaAppServer() {
28
- const proc = spawn('codex', ['app-server', '--listen', 'stdio://'], {
26
+ async function discoverCodexModelsViaAppServer(spec) {
27
+ const proc = spawnResolvedCommand(spec, ['app-server', '--listen', 'stdio://'], {
29
28
  cwd: DISCOVERY_WORKDIR,
30
29
  stdio: ['pipe', 'pipe', 'pipe'],
31
30
  env: { ...process.env, NO_COLOR: '1' },
@@ -88,71 +87,32 @@ async function discoverCursorModels() {
88
87
  const spec = resolveBuiltinCommand('cursor');
89
88
  if (!spec)
90
89
  return [];
91
- const result = await runCommand(spec.command, [...spec.args, '--list-models']);
90
+ const result = await runResolvedCommand(spec, ['--list-models']);
92
91
  return parseCursorModels(result.stdout);
93
92
  }
94
93
  async function discoverOpenClawModels() {
95
94
  const spec = resolveBuiltinCommand('openclaw');
96
95
  if (!spec)
97
96
  return [];
98
- const result = await runCommand(spec.command, [...spec.args, 'models', 'list', '--json']);
97
+ const result = await runResolvedCommand(spec, ['models', 'list', '--json']);
99
98
  return parseOpenClawModels(result.stdout);
100
99
  }
101
100
  async function discoverClaudeModels() {
102
- const spec = resolveBuiltinCommand('claude');
103
- if (!spec)
101
+ if (!resolveBuiltinCommand('claude'))
104
102
  return [];
105
- const runDiscovery = async (startupArgs) => runPtyCommand(spec, {
106
- startupArgs,
107
- readyPatterns: [/[>❯]/, /claude/i],
108
- closePatterns: [/esc/i, /confirm/i, /default/i],
109
- timeoutMs: 12_000,
110
- });
111
- const primaryRaw = await runDiscovery(['--bare', '--dangerously-skip-permissions']);
112
- const primaryModels = parseClaudeModels(primaryRaw);
113
- if (primaryModels.length > 0)
114
- return primaryModels;
115
- const clean = primaryRaw.toLowerCase();
116
- const bareUnsupported = clean.includes('--bare') &&
117
- (clean.includes('unknown option') ||
118
- clean.includes('unknown argument') ||
119
- clean.includes('unexpected argument') ||
120
- clean.includes('unrecognized option'));
121
- if (!bareUnsupported)
122
- return primaryModels;
123
- const fallbackRaw = await runDiscovery(['--dangerously-skip-permissions']);
124
- return parseClaudeModels(fallbackRaw);
103
+ return fallbackClaudeAliasModels();
125
104
  }
126
105
  async function discoverCodexModels() {
127
106
  const spec = resolveBuiltinCommand('codex');
128
107
  if (!spec)
129
108
  return [];
130
- const appServerModels = await discoverCodexModelsViaAppServer().catch(() => []);
131
- if (appServerModels.length > 0)
132
- return appServerModels;
133
- const raw = await runPtyCommand(spec, {
134
- startupArgs: ['--no-alt-screen', '-C', DISCOVERY_WORKDIR],
135
- preOpenPromptPatterns: [/update available!/i, /skip until next version/i, /release notes:/i],
136
- preOpenPromptInput: '\u001b[B\r',
137
- readyPatterns: [/(?:^|\s)\/model\b/i, /codex/i],
138
- closePatterns: [/enter to select/i, /dismiss/i, /select model/i],
139
- timeoutMs: 45_000,
140
- scrollAfterOpenMs: 2500,
141
- scrollCount: 15,
142
- scrollIntervalMs: 500,
143
- });
144
- return parseCodexModels(raw);
109
+ const appServerModels = await discoverCodexModelsViaAppServer(spec).catch(() => []);
110
+ return appServerModels;
145
111
  }
146
112
  async function discoverGeminiModels() {
147
- const spec = resolveBuiltinCommand('gemini');
148
- if (!spec)
113
+ if (!resolveBuiltinCommand('gemini'))
149
114
  return [];
150
- const raw = await runPtyCommand(spec, {
151
- readyPatterns: [/[>❯]/, /gemini/i],
152
- closePatterns: [/enter to select/i, /select model/i, /\besc\b/i],
153
- timeoutMs: 16_000,
154
- });
155
- return parseGeminiModels(raw);
115
+ return fallbackGeminiModels();
156
116
  }
157
117
  async function discoverPiModels(context) {
158
118
  if (!context.serverUrl || !context.authToken)
@@ -199,4 +159,3 @@ export async function discoverModelsForAgent(agent, context) {
199
159
  }
200
160
  return discoverBuiltinModels(agent.type, context);
201
161
  }
202
- //# sourceMappingURL=discovery.js.map
@@ -3,7 +3,9 @@ export declare function stripAnsi(text: string): string;
3
3
  export declare function parseCursorModels(raw: string): ModelInfo[];
4
4
  export declare function parseOpenClawModels(raw: string): ModelInfo[];
5
5
  export declare function parseClaudeModels(raw: string): ModelInfo[];
6
+ export declare function parseClaudeBinaryModels(raw: string): ModelInfo[];
7
+ export declare function fallbackClaudeAliasModels(): ModelInfo[];
6
8
  export declare function parseCodexModels(raw: string): ModelInfo[];
7
9
  export declare function parseCodexAppServerModels(raw: unknown): ModelInfo[];
8
10
  export declare function parseGeminiModels(raw: string): ModelInfo[];
9
- //# sourceMappingURL=parsers.d.ts.map
11
+ export declare function fallbackGeminiModels(): ModelInfo[];
@@ -138,6 +138,78 @@ export function parseClaudeModels(raw) {
138
138
  }
139
139
  return uniqueModels(fallback);
140
140
  }
141
+ function compareVersionNumbers(a, b) {
142
+ const length = Math.max(a.length, b.length);
143
+ for (let index = 0; index < length; index++) {
144
+ const left = a[index] ?? -1;
145
+ const right = b[index] ?? -1;
146
+ if (left === right)
147
+ continue;
148
+ return left - right;
149
+ }
150
+ return 0;
151
+ }
152
+ function extractClaudeFamilyVersion(id, family) {
153
+ const match = id.match(new RegExp(`^claude-${family}-([0-9]+(?:-[0-9]+)*)$`, 'i'));
154
+ if (!match?.[1])
155
+ return null;
156
+ const parts = match[1]
157
+ .split('-')
158
+ .map((part) => Number.parseInt(part, 10))
159
+ .filter((part) => Number.isFinite(part));
160
+ if (parts.length === 0 || parts.length > 2)
161
+ return null;
162
+ return parts;
163
+ }
164
+ function formatClaudeVersion(version) {
165
+ if (!version?.length)
166
+ return undefined;
167
+ return `v${version.join('.')}`;
168
+ }
169
+ export function parseClaudeBinaryModels(raw) {
170
+ const clean = stripAnsi(raw);
171
+ const aliasMap = {
172
+ default: 'Default (recommended)',
173
+ sonnet: 'Sonnet',
174
+ opus: 'Opus',
175
+ haiku: 'Haiku',
176
+ };
177
+ const familyVersions = new Map();
178
+ for (const family of ['sonnet', 'opus', 'haiku']) {
179
+ for (const match of clean.matchAll(new RegExp(`\\bclaude-${family}-[0-9.-]+\\b`, 'gi'))) {
180
+ const normalized = match[0].trim().toLowerCase().replace(/\./g, '-').replace(/-+$/g, '');
181
+ const version = extractClaudeFamilyVersion(normalized, family);
182
+ if (!version)
183
+ continue;
184
+ const current = familyVersions.get(family);
185
+ if (!current || compareVersionNumbers(current, version) < 0) {
186
+ familyVersions.set(family, version);
187
+ }
188
+ }
189
+ }
190
+ const models = [];
191
+ for (const alias of ['default', 'sonnet', 'opus', 'haiku']) {
192
+ if (!new RegExp(`\\b${alias}\\b`, 'i').test(clean))
193
+ continue;
194
+ const version = (alias === 'default' ? familyVersions.get('sonnet') : familyVersions.get(alias)) ?? null;
195
+ models.push({
196
+ id: alias,
197
+ name: aliasMap[alias],
198
+ description: formatClaudeVersion(version),
199
+ provider: 'anthropic',
200
+ isDefault: alias === 'default',
201
+ });
202
+ }
203
+ return uniqueModels(models);
204
+ }
205
+ export function fallbackClaudeAliasModels() {
206
+ return [
207
+ { id: 'default', name: 'Default (recommended)', provider: 'anthropic', isDefault: true },
208
+ { id: 'sonnet', name: 'Sonnet', provider: 'anthropic' },
209
+ { id: 'opus', name: 'Opus', provider: 'anthropic' },
210
+ { id: 'haiku', name: 'Haiku', provider: 'anthropic' },
211
+ ];
212
+ }
141
213
  export function parseCodexModels(raw) {
142
214
  const clean = stripAnsi(raw);
143
215
  const models = [];
@@ -162,6 +234,9 @@ export function parseCodexAppServerModels(raw) {
162
234
  ? raw
163
235
  : {};
164
236
  const currentModel = typeof data.config?.model === 'string' ? data.config.model : undefined;
237
+ const currentReasoningEffort = typeof data.config?.model_reasoning_effort === 'string'
238
+ ? data.config.model_reasoning_effort
239
+ : undefined;
165
240
  const models = [];
166
241
  for (const entry of data.data ?? []) {
167
242
  if (typeof entry !== 'object' || entry === null)
@@ -212,12 +287,21 @@ export function parseCodexAppServerModels(raw) {
212
287
  name: displayName || prettifyCodexModel(id),
213
288
  description,
214
289
  provider: 'openai',
215
- isDefault: item.isDefault === true || currentModel === id,
290
+ isDefault: currentModel ? currentModel === id : item.isDefault === true,
216
291
  supportedReasoningEfforts,
217
292
  defaultReasoningEffort,
218
293
  additionalSpeedTiers,
219
294
  });
220
295
  }
296
+ if (currentModel && !models.some((model) => model.id === currentModel)) {
297
+ models.unshift({
298
+ id: currentModel,
299
+ name: prettifyCodexModel(currentModel),
300
+ provider: 'openai',
301
+ isDefault: true,
302
+ defaultReasoningEffort: currentReasoningEffort,
303
+ });
304
+ }
221
305
  return uniqueModels(models);
222
306
  }
223
307
  export function parseGeminiModels(raw) {
@@ -256,4 +340,10 @@ export function parseGeminiModels(raw) {
256
340
  }
257
341
  return uniqueModels(models);
258
342
  }
259
- //# sourceMappingURL=parsers.js.map
343
+ export function fallbackGeminiModels() {
344
+ return [
345
+ { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', provider: 'google', isDefault: true },
346
+ { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', provider: 'google' },
347
+ { id: 'auto-gemini-2.5', name: 'Auto Gemini 2.5', provider: 'google' },
348
+ ];
349
+ }
@@ -1,11 +1,6 @@
1
- import { type PtyOptions } from './types.js';
2
- export declare function runCommand(command: string, args: string[], timeoutMs?: number): Promise<{
1
+ import type { ResolvedCommandSpec } from '../command-spec.js';
2
+ export declare function runResolvedCommand(spec: ResolvedCommandSpec, args: string[], timeoutMs?: number): Promise<{
3
3
  stdout: string;
4
4
  stderr: string;
5
5
  exitCode: number | null;
6
6
  }>;
7
- export declare function runPtyCommand(spec: {
8
- command: string;
9
- args: string[];
10
- }, options: PtyOptions): Promise<string>;
11
- //# sourceMappingURL=runner.d.ts.map
@@ -1,11 +1,10 @@
1
1
  // @arch docs/architecture/cli/model-discovery.md
2
2
  // @test src/__tests__/model-switching.test.ts
3
- import { spawn as spawnProcess } from 'node:child_process';
4
- import { stripAnsi } from './parsers.js';
3
+ import { spawnResolvedCommand } from '../command-spec.js';
5
4
  import { DISCOVERY_WORKDIR } from './types.js';
6
- export function runCommand(command, args, timeoutMs = 15_000) {
5
+ export function runResolvedCommand(spec, args, timeoutMs = 15_000) {
7
6
  return new Promise((resolve, reject) => {
8
- const proc = spawnProcess(command, args, {
7
+ const proc = spawnResolvedCommand(spec, args, {
9
8
  cwd: DISCOVERY_WORKDIR,
10
9
  stdio: ['ignore', 'pipe', 'pipe'],
11
10
  env: { ...process.env, NO_COLOR: '1' },
@@ -28,133 +27,3 @@ export function runCommand(command, args, timeoutMs = 15_000) {
28
27
  });
29
28
  });
30
29
  }
31
- // Lazy-load node-pty so platforms where native compilation fails still work
32
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
- let ptySpawnRef;
34
- async function loadPtySpawn() {
35
- if (ptySpawnRef)
36
- return ptySpawnRef;
37
- try {
38
- const pty = await import('@homebridge/node-pty-prebuilt-multiarch');
39
- ptySpawnRef = pty.spawn;
40
- return ptySpawnRef;
41
- }
42
- catch {
43
- return undefined;
44
- }
45
- }
46
- export async function runPtyCommand(spec, options) {
47
- const ptySpawn = await loadPtySpawn();
48
- if (!ptySpawn)
49
- return '';
50
- const initialDelayMs = options.initialDelayMs ?? 2500;
51
- const timeoutMs = options.timeoutMs ?? 20_000;
52
- const scrollCount = options.scrollCount ?? 0;
53
- const scrollIntervalMs = options.scrollIntervalMs ?? 400;
54
- const scrollAfterOpenMs = options.scrollAfterOpenMs ?? 2000;
55
- const preOpenPromptPatterns = options.preOpenPromptPatterns ?? [];
56
- const preOpenPromptInput = options.preOpenPromptInput ?? '';
57
- return new Promise((resolve) => {
58
- const proc = ptySpawn(spec.command, [...spec.args, ...(options.startupArgs ?? [])], {
59
- name: 'xterm-256color',
60
- cols: 200,
61
- rows: 120,
62
- cwd: DISCOVERY_WORKDIR,
63
- env: {
64
- ...process.env,
65
- TERM: 'xterm-256color',
66
- COLUMNS: '200',
67
- LINES: '120',
68
- NO_COLOR: '1',
69
- },
70
- });
71
- let output = '';
72
- let opened = false;
73
- let scrolling = false;
74
- let closing = false;
75
- let finished = false;
76
- let handledPreOpenPrompt = false;
77
- const cleanup = () => {
78
- if (finished)
79
- return;
80
- finished = true;
81
- clearTimeout(forceOpenTimer);
82
- clearTimeout(forceCloseTimer);
83
- resolve(output);
84
- };
85
- const doClose = () => {
86
- if (closing)
87
- return;
88
- closing = true;
89
- proc.write('\u001b');
90
- setTimeout(() => {
91
- proc.write('\u0003');
92
- proc.kill();
93
- }, 300);
94
- };
95
- const doScroll = () => {
96
- if (scrollCount <= 0)
97
- return;
98
- scrolling = true;
99
- let remaining = scrollCount;
100
- const tick = () => {
101
- if (remaining <= 0 || closing || finished) {
102
- scrolling = false;
103
- setTimeout(doClose, 500);
104
- return;
105
- }
106
- proc.write('\u001b[B');
107
- remaining--;
108
- setTimeout(tick, scrollIntervalMs);
109
- };
110
- tick();
111
- };
112
- const afterOpen = () => {
113
- if (scrollCount > 0) {
114
- setTimeout(doScroll, scrollAfterOpenMs);
115
- }
116
- };
117
- const forceOpenTimer = setTimeout(() => {
118
- if (!opened) {
119
- opened = true;
120
- proc.write('/model\r');
121
- afterOpen();
122
- }
123
- }, initialDelayMs);
124
- const forceCloseTimer = setTimeout(doClose, timeoutMs);
125
- const maybeOpen = () => {
126
- const clean = stripAnsi(output);
127
- if (!handledPreOpenPrompt && preOpenPromptPatterns.some((pattern) => pattern.test(clean))) {
128
- handledPreOpenPrompt = true;
129
- if (preOpenPromptInput) {
130
- proc.write(preOpenPromptInput);
131
- }
132
- return;
133
- }
134
- if (opened)
135
- return;
136
- if (options.readyPatterns.some((pattern) => pattern.test(clean))) {
137
- opened = true;
138
- proc.write('/model\r');
139
- afterOpen();
140
- }
141
- };
142
- const maybeClose = () => {
143
- if (!opened || closing || scrolling || scrollCount > 0)
144
- return;
145
- const clean = stripAnsi(output);
146
- if (options.closePatterns.some((pattern) => pattern.test(clean))) {
147
- doClose();
148
- }
149
- };
150
- proc.onData((chunk) => {
151
- output += chunk;
152
- if (!finished) {
153
- maybeOpen();
154
- maybeClose();
155
- }
156
- });
157
- proc.onExit(cleanup);
158
- });
159
- }
160
- //# sourceMappingURL=runner.js.map
@@ -4,4 +4,3 @@ import type { DiscoveryContext } from './types.js';
4
4
  export declare function getCachedAgentInfos(detectedAgents: DetectedAgent[]): AgentInfo[];
5
5
  export declare function refreshAgentInfos(detectedAgents: DetectedAgent[], context: DiscoveryContext): Promise<AgentInfo[]>;
6
6
  export declare function resolveAgentInfos(detectedAgents: DetectedAgent[], context: DiscoveryContext): Promise<AgentInfo[]>;
7
- //# sourceMappingURL=service.d.ts.map
@@ -39,21 +39,24 @@ export async function resolveAgentInfos(detectedAgents, context) {
39
39
  models = cached.models;
40
40
  }
41
41
  else {
42
+ let discovered = null;
42
43
  try {
43
- const discovered = uniqueModels(await discoverModelsForAgent(agent, context));
44
+ discovered = uniqueModels(await discoverModelsForAgent(agent, context));
44
45
  models = discovered.length > 0 ? discovered : cached?.models ?? agent.models ?? [];
45
46
  }
46
47
  catch {
47
48
  models = cached?.models ?? agent.models ?? [];
48
49
  }
49
- const nextEntry = {
50
- version: agent.version,
51
- refreshedAt: Date.now(),
52
- models,
53
- };
54
- if (JSON.stringify(cached) !== JSON.stringify(nextEntry)) {
55
- cache.agents[agent.type] = nextEntry;
56
- changed = true;
50
+ if (discovered && discovered.length > 0) {
51
+ const nextEntry = {
52
+ version: agent.version,
53
+ refreshedAt: Date.now(),
54
+ models,
55
+ };
56
+ if (JSON.stringify(cached) !== JSON.stringify(nextEntry)) {
57
+ cache.agents[agent.type] = nextEntry;
58
+ changed = true;
59
+ }
57
60
  }
58
61
  }
59
62
  infos.push({
@@ -66,4 +69,3 @@ export async function resolveAgentInfos(detectedAgents, context) {
66
69
  }
67
70
  return infos;
68
71
  }
69
- //# sourceMappingURL=service.js.map
@@ -28,4 +28,3 @@ export type PtyOptions = {
28
28
  scrollCount?: number;
29
29
  scrollIntervalMs?: number;
30
30
  };
31
- //# sourceMappingURL=types.d.ts.map
@@ -6,4 +6,3 @@ export const CACHE_VERSION = 1;
6
6
  export const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
7
7
  export const MODEL_CACHE_PATH = resolveShennianPath('model-cache.json');
8
8
  export const DISCOVERY_WORKDIR = os.tmpdir();
9
- //# sourceMappingURL=types.js.map
@@ -1,7 +1,8 @@
1
1
  export { getCachedAgentInfos, refreshAgentInfos, resolveAgentInfos } from './model-registry/service.js';
2
- import { parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi } from './model-registry/parsers.js';
2
+ import { parseClaudeBinaryModels, parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi } from './model-registry/parsers.js';
3
3
  /** Used by Vitest / `model-switching-e2e.ts` — not a stable public API. */
4
4
  export declare const modelSwitchingTestExports: {
5
+ readonly parseClaudeBinaryModels: typeof parseClaudeBinaryModels;
5
6
  readonly parseClaudeModels: typeof parseClaudeModels;
6
7
  readonly parseCodexModels: typeof parseCodexModels;
7
8
  readonly parseCodexAppServerModels: typeof parseCodexAppServerModels;
@@ -10,4 +11,3 @@ export declare const modelSwitchingTestExports: {
10
11
  readonly parseGeminiModels: typeof parseGeminiModels;
11
12
  readonly stripAnsi: typeof stripAnsi;
12
13
  };
13
- //# sourceMappingURL=model-registry.d.ts.map
@@ -1,9 +1,10 @@
1
1
  // @arch docs/architecture/cli/model-discovery.md
2
2
  // @test src/__tests__/model-switching.test.ts
3
3
  export { getCachedAgentInfos, refreshAgentInfos, resolveAgentInfos } from './model-registry/service.js';
4
- import { parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi, } from './model-registry/parsers.js';
4
+ import { parseClaudeBinaryModels, parseClaudeModels, parseCodexModels, parseCodexAppServerModels, parseCursorModels, parseGeminiModels, parseOpenClawModels, stripAnsi, } from './model-registry/parsers.js';
5
5
  /** Used by Vitest / `model-switching-e2e.ts` — not a stable public API. */
6
6
  export const modelSwitchingTestExports = {
7
+ parseClaudeBinaryModels,
7
8
  parseClaudeModels,
8
9
  parseCodexModels,
9
10
  parseCodexAppServerModels,
@@ -12,4 +13,3 @@ export const modelSwitchingTestExports = {
12
13
  parseGeminiModels,
13
14
  stripAnsi,
14
15
  };
15
- //# sourceMappingURL=model-registry.js.map
@@ -18,4 +18,3 @@ export declare class OpenClawAdapter extends AgentAdapter {
18
18
  private emitEvent;
19
19
  private killProcess;
20
20
  }
21
- //# sourceMappingURL=openclaw.d.ts.map
@@ -1,6 +1,6 @@
1
- import { spawn } from 'node:child_process';
2
1
  import { randomUUID } from 'node:crypto';
3
2
  import { AgentAdapter, registerAgent } from './adapter.js';
3
+ import { resolveBuiltinCommand, spawnResolvedCommand } from './command-spec.js';
4
4
  /** Best-effort parse of `openclaw agent --json` stdout; shape may vary by version. */
5
5
  function extractResponseText(parsed) {
6
6
  if (parsed == null)
@@ -116,8 +116,13 @@ export class OpenClawAdapter extends AgentAdapter {
116
116
  await this.killProcess();
117
117
  }
118
118
  spawnAgent(extraArgs) {
119
+ const spec = resolveBuiltinCommand('openclaw');
120
+ if (!spec) {
121
+ this.emit('error', new Error('Command "openclaw" not found. Is OpenClaw CLI installed?'));
122
+ return;
123
+ }
119
124
  const args = ['agent', '--local', '--json', ...extraArgs];
120
- const proc = spawn('openclaw', args, {
125
+ const proc = spawnResolvedCommand(spec, args, {
121
126
  cwd: this.workDir ?? undefined,
122
127
  stdio: ['ignore', 'pipe', 'pipe'],
123
128
  env: { ...process.env },
@@ -190,8 +195,13 @@ export class OpenClawAdapter extends AgentAdapter {
190
195
  }
191
196
  async runAgentCommand(extraArgs) {
192
197
  return new Promise((resolve) => {
198
+ const spec = resolveBuiltinCommand('openclaw');
199
+ if (!spec) {
200
+ resolve({ ok: false, error: 'Command "openclaw" not found. Is OpenClaw CLI installed?' });
201
+ return;
202
+ }
193
203
  const args = ['agent', '--local', '--json', ...extraArgs];
194
- const proc = spawn('openclaw', args, {
204
+ const proc = spawnResolvedCommand(spec, args, {
195
205
  cwd: this.workDir ?? undefined,
196
206
  stdio: ['ignore', 'pipe', 'pipe'],
197
207
  env: { ...process.env },
@@ -261,4 +271,3 @@ export class OpenClawAdapter extends AgentAdapter {
261
271
  }
262
272
  }
263
273
  registerAgent('openclaw', () => new OpenClawAdapter());
264
- //# sourceMappingURL=openclaw.js.map
@@ -49,4 +49,3 @@ export declare class PiAdapter extends AgentAdapter {
49
49
  private resolvePendingSendStart;
50
50
  private rejectPendingSendStart;
51
51
  }
52
- //# sourceMappingURL=pi.d.ts.map
@@ -791,4 +791,3 @@ export class PiAdapter extends AgentAdapter {
791
791
  }
792
792
  }
793
793
  registerAgent('pi', () => new PiAdapter());
794
- //# sourceMappingURL=pi.js.map
@@ -1,3 +1,2 @@
1
1
  import type { Command } from 'commander';
2
2
  export declare function registerAgentCommand(program: Command): void;
3
- //# sourceMappingURL=agent.d.ts.map
@@ -1,6 +1,6 @@
1
- import { spawn } from 'node:child_process';
2
1
  import chalk from 'chalk';
3
2
  import { loadConfig, saveConfig } from '../config/index.js';
3
+ import { spawnCommandString } from '../agents/command-spec.js';
4
4
  function getCapsModels(caps) {
5
5
  if (caps.models?.length)
6
6
  return caps.models;
@@ -12,11 +12,8 @@ function getCapsModels(caps) {
12
12
  * Runs `<command> /caps` and returns the parsed caps JSON.
13
13
  */
14
14
  async function probeCaps(command) {
15
- const parts = splitCommand(command);
16
- const bin = parts[0];
17
- const args = [...parts.slice(1), '/caps'];
18
15
  return new Promise((resolve, reject) => {
19
- const proc = spawn(bin, args, { stdio: ['ignore', 'pipe', 'pipe'] });
16
+ const proc = spawnCommandString(command, ['/caps'], { stdio: ['ignore', 'pipe', 'pipe'] });
20
17
  let stdout = '';
21
18
  let stderr = '';
22
19
  proc.stdout?.on('data', (d) => { stdout += d.toString(); });
@@ -54,33 +51,6 @@ async function probeCaps(command) {
54
51
  }, 5000);
55
52
  });
56
53
  }
57
- function splitCommand(cmd) {
58
- const args = [];
59
- let current = '';
60
- let inSingle = false;
61
- let inDouble = false;
62
- for (const ch of cmd) {
63
- if (ch === "'" && !inDouble) {
64
- inSingle = !inSingle;
65
- continue;
66
- }
67
- if (ch === '"' && !inSingle) {
68
- inDouble = !inDouble;
69
- continue;
70
- }
71
- if (ch === ' ' && !inSingle && !inDouble) {
72
- if (current) {
73
- args.push(current);
74
- current = '';
75
- }
76
- continue;
77
- }
78
- current += ch;
79
- }
80
- if (current)
81
- args.push(current);
82
- return args;
83
- }
84
54
  export function registerAgentCommand(program) {
85
55
  const agent = program
86
56
  .command('agent')
@@ -159,4 +129,3 @@ export function registerAgentCommand(program) {
159
129
  console.log(chalk.yellow(' Refresh Agents in the app to hot-reload this daemon, or restart the daemon as a fallback.'));
160
130
  });
161
131
  }
162
- //# sourceMappingURL=agent.js.map
@@ -14,6 +14,12 @@ export declare function resolveServiceLaunchSpec(input: {
14
14
  }): ServiceLaunchSpec;
15
15
  export declare function buildWindowsLauncherCommand(spec: ServiceLaunchSpec, logFile: string): string;
16
16
  export declare function buildWindowsStartupVbs(cmdPath: string): string;
17
+ export declare function buildWindowsScheduledTaskXml(input: {
18
+ userId: string;
19
+ command: string;
20
+ arguments: string[];
21
+ }): string;
22
+ export declare function captureEnvForService(): Record<string, string>;
17
23
  /**
18
24
  * Save current env vars so the daemon can load them at startup.
19
25
  * This is critical for launchd/systemd which start with minimal env.
@@ -27,4 +33,3 @@ export declare function startDaemonProcess(): void;
27
33
  export declare function installService(): boolean;
28
34
  export declare function registerDaemonCommand(program: Command): void;
29
35
  export {};
30
- //# sourceMappingURL=daemon.d.ts.map