shennian 0.2.0 → 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 (282) 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 +18 -1
  8. package/dist/src/agents/codex.js +372 -13
  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 +90 -48
  23. package/dist/src/agents/model-registry/parsers.d.ts +4 -1
  24. package/dist/src/agents/model-registry/parsers.js +168 -1
  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 +3 -2
  32. package/dist/src/agents/model-registry.js +3 -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 +18 -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 +36 -8
  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 +407 -44
  59. package/dist/src/native-fusion/service.d.ts +0 -1
  60. package/dist/src/native-fusion/service.js +16 -10
  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 +49 -8
  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 +37 -3
  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 +6 -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 -146
  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 -224
  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 -256
  135. package/dist/src/__tests__/e2e-relay.js.map +0 -1
  136. package/dist/src/__tests__/model-discovery.test.d.ts +0 -2
  137. package/dist/src/__tests__/model-discovery.test.d.ts.map +0 -1
  138. package/dist/src/__tests__/model-discovery.test.js +0 -47
  139. package/dist/src/__tests__/model-discovery.test.js.map +0 -1
  140. package/dist/src/__tests__/model-switching.test.d.ts +0 -2
  141. package/dist/src/__tests__/model-switching.test.d.ts.map +0 -1
  142. package/dist/src/__tests__/model-switching.test.js +0 -253
  143. package/dist/src/__tests__/model-switching.test.js.map +0 -1
  144. package/dist/src/__tests__/native-fusion-parsers.test.d.ts +0 -2
  145. package/dist/src/__tests__/native-fusion-parsers.test.d.ts.map +0 -1
  146. package/dist/src/__tests__/native-fusion-parsers.test.js +0 -216
  147. package/dist/src/__tests__/native-fusion-parsers.test.js.map +0 -1
  148. package/dist/src/__tests__/native-fusion-service.test.d.ts +0 -2
  149. package/dist/src/__tests__/native-fusion-service.test.d.ts.map +0 -1
  150. package/dist/src/__tests__/native-fusion-service.test.js +0 -157
  151. package/dist/src/__tests__/native-fusion-service.test.js.map +0 -1
  152. package/dist/src/__tests__/native-session-sync.test.d.ts +0 -2
  153. package/dist/src/__tests__/native-session-sync.test.d.ts.map +0 -1
  154. package/dist/src/__tests__/native-session-sync.test.js +0 -198
  155. package/dist/src/__tests__/native-session-sync.test.js.map +0 -1
  156. package/dist/src/__tests__/pair-qr.test.d.ts +0 -2
  157. package/dist/src/__tests__/pair-qr.test.d.ts.map +0 -1
  158. package/dist/src/__tests__/pair-qr.test.js +0 -13
  159. package/dist/src/__tests__/pair-qr.test.js.map +0 -1
  160. package/dist/src/__tests__/pi-context.test.d.ts +0 -2
  161. package/dist/src/__tests__/pi-context.test.d.ts.map +0 -1
  162. package/dist/src/__tests__/pi-context.test.js +0 -261
  163. package/dist/src/__tests__/pi-context.test.js.map +0 -1
  164. package/dist/src/__tests__/session-manager.test.d.ts +0 -2
  165. package/dist/src/__tests__/session-manager.test.d.ts.map +0 -1
  166. package/dist/src/__tests__/session-manager.test.js +0 -592
  167. package/dist/src/__tests__/session-manager.test.js.map +0 -1
  168. package/dist/src/__tests__/session-store.test.d.ts +0 -2
  169. package/dist/src/__tests__/session-store.test.d.ts.map +0 -1
  170. package/dist/src/__tests__/session-store.test.js +0 -106
  171. package/dist/src/__tests__/session-store.test.js.map +0 -1
  172. package/dist/src/agents/adapter.d.ts.map +0 -1
  173. package/dist/src/agents/adapter.js.map +0 -1
  174. package/dist/src/agents/claude.d.ts.map +0 -1
  175. package/dist/src/agents/claude.js.map +0 -1
  176. package/dist/src/agents/codex.d.ts.map +0 -1
  177. package/dist/src/agents/codex.js.map +0 -1
  178. package/dist/src/agents/command-spec.d.ts.map +0 -1
  179. package/dist/src/agents/command-spec.js.map +0 -1
  180. package/dist/src/agents/cursor.d.ts.map +0 -1
  181. package/dist/src/agents/cursor.js.map +0 -1
  182. package/dist/src/agents/custom.d.ts.map +0 -1
  183. package/dist/src/agents/custom.js.map +0 -1
  184. package/dist/src/agents/detect.d.ts.map +0 -1
  185. package/dist/src/agents/detect.js.map +0 -1
  186. package/dist/src/agents/gemini.d.ts.map +0 -1
  187. package/dist/src/agents/gemini.js.map +0 -1
  188. package/dist/src/agents/model-registry/cache.d.ts.map +0 -1
  189. package/dist/src/agents/model-registry/cache.js.map +0 -1
  190. package/dist/src/agents/model-registry/discovery.d.ts.map +0 -1
  191. package/dist/src/agents/model-registry/discovery.js.map +0 -1
  192. package/dist/src/agents/model-registry/parsers.d.ts.map +0 -1
  193. package/dist/src/agents/model-registry/parsers.js.map +0 -1
  194. package/dist/src/agents/model-registry/runner.d.ts.map +0 -1
  195. package/dist/src/agents/model-registry/runner.js.map +0 -1
  196. package/dist/src/agents/model-registry/service.d.ts.map +0 -1
  197. package/dist/src/agents/model-registry/service.js.map +0 -1
  198. package/dist/src/agents/model-registry/types.d.ts.map +0 -1
  199. package/dist/src/agents/model-registry/types.js.map +0 -1
  200. package/dist/src/agents/model-registry.d.ts.map +0 -1
  201. package/dist/src/agents/model-registry.js.map +0 -1
  202. package/dist/src/agents/openclaw.d.ts.map +0 -1
  203. package/dist/src/agents/openclaw.js.map +0 -1
  204. package/dist/src/agents/pi.d.ts.map +0 -1
  205. package/dist/src/agents/pi.js.map +0 -1
  206. package/dist/src/commands/agent.d.ts.map +0 -1
  207. package/dist/src/commands/agent.js.map +0 -1
  208. package/dist/src/commands/daemon.d.ts.map +0 -1
  209. package/dist/src/commands/daemon.js.map +0 -1
  210. package/dist/src/commands/pair-qr.d.ts.map +0 -1
  211. package/dist/src/commands/pair-qr.js.map +0 -1
  212. package/dist/src/commands/pair.d.ts.map +0 -1
  213. package/dist/src/commands/pair.js.map +0 -1
  214. package/dist/src/commands/upgrade.d.ts.map +0 -1
  215. package/dist/src/commands/upgrade.js.map +0 -1
  216. package/dist/src/config/index.d.ts.map +0 -1
  217. package/dist/src/config/index.js.map +0 -1
  218. package/dist/src/fs/handler.d.ts.map +0 -1
  219. package/dist/src/fs/handler.js.map +0 -1
  220. package/dist/src/fs/multimodal.d.ts +0 -5
  221. package/dist/src/fs/multimodal.d.ts.map +0 -1
  222. package/dist/src/fs/multimodal.js +0 -39
  223. package/dist/src/fs/multimodal.js.map +0 -1
  224. package/dist/src/fs/security.d.ts.map +0 -1
  225. package/dist/src/fs/security.js.map +0 -1
  226. package/dist/src/index.d.ts.map +0 -1
  227. package/dist/src/index.js.map +0 -1
  228. package/dist/src/log-reporter.d.ts.map +0 -1
  229. package/dist/src/log-reporter.js.map +0 -1
  230. package/dist/src/native-fusion/parsers.d.ts.map +0 -1
  231. package/dist/src/native-fusion/parsers.js.map +0 -1
  232. package/dist/src/native-fusion/service.d.ts.map +0 -1
  233. package/dist/src/native-fusion/service.js.map +0 -1
  234. package/dist/src/native-fusion/state.d.ts.map +0 -1
  235. package/dist/src/native-fusion/state.js.map +0 -1
  236. package/dist/src/native-fusion/types.d.ts.map +0 -1
  237. package/dist/src/native-fusion/types.js.map +0 -1
  238. package/dist/src/native-sync/discover.d.ts +0 -6
  239. package/dist/src/native-sync/discover.d.ts.map +0 -1
  240. package/dist/src/native-sync/discover.js +0 -69
  241. package/dist/src/native-sync/discover.js.map +0 -1
  242. package/dist/src/native-sync/parsers.d.ts +0 -3
  243. package/dist/src/native-sync/parsers.d.ts.map +0 -1
  244. package/dist/src/native-sync/parsers.js +0 -373
  245. package/dist/src/native-sync/parsers.js.map +0 -1
  246. package/dist/src/native-sync/service.d.ts +0 -16
  247. package/dist/src/native-sync/service.d.ts.map +0 -1
  248. package/dist/src/native-sync/service.js +0 -95
  249. package/dist/src/native-sync/service.js.map +0 -1
  250. package/dist/src/native-sync/state.d.ts +0 -6
  251. package/dist/src/native-sync/state.d.ts.map +0 -1
  252. package/dist/src/native-sync/state.js +0 -34
  253. package/dist/src/native-sync/state.js.map +0 -1
  254. package/dist/src/native-sync/types.d.ts +0 -23
  255. package/dist/src/native-sync/types.d.ts.map +0 -1
  256. package/dist/src/native-sync/types.js +0 -4
  257. package/dist/src/native-sync/types.js.map +0 -1
  258. package/dist/src/region.d.ts.map +0 -1
  259. package/dist/src/region.js.map +0 -1
  260. package/dist/src/relay/client.d.ts.map +0 -1
  261. package/dist/src/relay/client.js.map +0 -1
  262. package/dist/src/session/handlers/agents.d.ts.map +0 -1
  263. package/dist/src/session/handlers/agents.js.map +0 -1
  264. package/dist/src/session/handlers/chat.d.ts.map +0 -1
  265. package/dist/src/session/handlers/chat.js.map +0 -1
  266. package/dist/src/session/handlers/control.d.ts.map +0 -1
  267. package/dist/src/session/handlers/control.js.map +0 -1
  268. package/dist/src/session/handlers/fs.d.ts.map +0 -1
  269. package/dist/src/session/handlers/fs.js.map +0 -1
  270. package/dist/src/session/handlers/queue.d.ts +0 -4
  271. package/dist/src/session/handlers/queue.d.ts.map +0 -1
  272. package/dist/src/session/handlers/queue.js +0 -66
  273. package/dist/src/session/handlers/queue.js.map +0 -1
  274. package/dist/src/session/manager.d.ts.map +0 -1
  275. package/dist/src/session/manager.js.map +0 -1
  276. package/dist/src/session/store.d.ts.map +0 -1
  277. package/dist/src/session/store.js.map +0 -1
  278. package/dist/src/session/types.d.ts.map +0 -1
  279. package/dist/src/session/types.js.map +0 -1
  280. package/dist/src/upgrade/engine.d.ts.map +0 -1
  281. package/dist/src/upgrade/engine.js.map +0 -1
  282. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -34,6 +34,20 @@ function prettifyCodexModel(id) {
34
34
  })
35
35
  .join('-');
36
36
  }
37
+ function prettifyReasoningEffort(id) {
38
+ switch (id) {
39
+ case 'low':
40
+ return 'Low';
41
+ case 'medium':
42
+ return 'Medium';
43
+ case 'high':
44
+ return 'High';
45
+ case 'xhigh':
46
+ return 'Extra High';
47
+ default:
48
+ return titleCaseSegment(id);
49
+ }
50
+ }
37
51
  function prettifyCursorModel(id) {
38
52
  return id
39
53
  .split('-')
@@ -124,6 +138,78 @@ export function parseClaudeModels(raw) {
124
138
  }
125
139
  return uniqueModels(fallback);
126
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
+ }
127
213
  export function parseCodexModels(raw) {
128
214
  const clean = stripAnsi(raw);
129
215
  const models = [];
@@ -143,6 +229,81 @@ export function parseCodexModels(raw) {
143
229
  }
144
230
  return uniqueModels(models);
145
231
  }
232
+ export function parseCodexAppServerModels(raw) {
233
+ const data = typeof raw === 'object' && raw !== null
234
+ ? raw
235
+ : {};
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;
240
+ const models = [];
241
+ for (const entry of data.data ?? []) {
242
+ if (typeof entry !== 'object' || entry === null)
243
+ continue;
244
+ const item = entry;
245
+ const id = typeof item.id === 'string'
246
+ ? item.id
247
+ : typeof item.model === 'string'
248
+ ? item.model
249
+ : '';
250
+ if (!id)
251
+ continue;
252
+ const displayName = typeof item.displayName === 'string'
253
+ ? item.displayName
254
+ : typeof item.name === 'string'
255
+ ? item.name
256
+ : undefined;
257
+ const description = typeof item.description === 'string' ? item.description : undefined;
258
+ const defaultReasoningEffort = typeof item.defaultReasoningEffort === 'string'
259
+ ? item.defaultReasoningEffort
260
+ : undefined;
261
+ const supportedReasoningEfforts = Array.isArray(item.supportedReasoningEfforts)
262
+ ? item.supportedReasoningEfforts
263
+ .map((effort) => {
264
+ if (typeof effort !== 'object' || effort === null)
265
+ return null;
266
+ const rawEffort = effort;
267
+ const effortId = typeof rawEffort.reasoningEffort === 'string'
268
+ ? rawEffort.reasoningEffort
269
+ : typeof rawEffort.id === 'string'
270
+ ? rawEffort.id
271
+ : '';
272
+ if (!effortId)
273
+ return null;
274
+ return {
275
+ id: effortId,
276
+ name: prettifyReasoningEffort(effortId),
277
+ description: typeof rawEffort.description === 'string' ? rawEffort.description : undefined,
278
+ };
279
+ })
280
+ .filter((effort) => effort != null)
281
+ : undefined;
282
+ const additionalSpeedTiers = Array.isArray(item.additionalSpeedTiers)
283
+ ? item.additionalSpeedTiers.filter((tier) => typeof tier === 'string')
284
+ : undefined;
285
+ models.push({
286
+ id,
287
+ name: displayName || prettifyCodexModel(id),
288
+ description,
289
+ provider: 'openai',
290
+ isDefault: currentModel ? currentModel === id : item.isDefault === true,
291
+ supportedReasoningEfforts,
292
+ defaultReasoningEffort,
293
+ additionalSpeedTiers,
294
+ });
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
+ }
305
+ return uniqueModels(models);
306
+ }
146
307
  export function parseGeminiModels(raw) {
147
308
  const clean = stripAnsi(raw);
148
309
  const models = [];
@@ -179,4 +340,10 @@ export function parseGeminiModels(raw) {
179
340
  }
180
341
  return uniqueModels(models);
181
342
  }
182
- //# 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,12 +1,13 @@
1
1
  export { getCachedAgentInfos, refreshAgentInfos, resolveAgentInfos } from './model-registry/service.js';
2
- import { parseClaudeModels, parseCodexModels, 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;
8
+ readonly parseCodexAppServerModels: typeof parseCodexAppServerModels;
7
9
  readonly parseCursorModels: typeof parseCursorModels;
8
10
  readonly parseOpenClawModels: typeof parseOpenClawModels;
9
11
  readonly parseGeminiModels: typeof parseGeminiModels;
10
12
  readonly stripAnsi: typeof stripAnsi;
11
13
  };
12
- //# sourceMappingURL=model-registry.d.ts.map
@@ -1,14 +1,15 @@
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, 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,
10
+ parseCodexAppServerModels,
9
11
  parseCursorModels,
10
12
  parseOpenClawModels,
11
13
  parseGeminiModels,
12
14
  stripAnsi,
13
15
  };
14
- //# 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