shennian 0.3.86 → 0.4.0

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 (98) hide show
  1. package/README.md +3 -2
  2. package/dist/bin/shennian.js +1 -1
  3. package/dist/publish-build-manifest.json +32 -27
  4. package/dist/src/agents/adapter.js +1 -19
  5. package/dist/src/agents/claude-managed-permissions.js +1 -248
  6. package/dist/src/agents/claude.js +8 -393
  7. package/dist/src/agents/codex-managed-permissions.js +1 -294
  8. package/dist/src/agents/codex-managed-room-tools.js +1 -249
  9. package/dist/src/agents/codex-utils.js +7 -200
  10. package/dist/src/agents/codex.d.ts +7 -1
  11. package/dist/src/agents/codex.js +17 -1352
  12. package/dist/src/agents/config-status.js +1 -226
  13. package/dist/src/agents/cursor-managed-permissions.js +2 -299
  14. package/dist/src/agents/cursor.js +1 -314
  15. package/dist/src/agents/custom.js +4 -418
  16. package/dist/src/agents/external-channel-instructions.js +11 -94
  17. package/dist/src/agents/gemini.js +1 -180
  18. package/dist/src/agents/manager.js +18 -250
  19. package/dist/src/agents/model-registry/cache.js +1 -37
  20. package/dist/src/agents/model-registry/discovery.js +2 -188
  21. package/dist/src/agents/model-registry/parsers.js +4 -521
  22. package/dist/src/agents/model-registry/runner.js +1 -30
  23. package/dist/src/agents/model-registry/service.js +1 -115
  24. package/dist/src/agents/model-registry/types.js +1 -8
  25. package/dist/src/agents/model-registry.js +1 -19
  26. package/dist/src/agents/native-capabilities.js +1 -237
  27. package/dist/src/agents/openclaw.js +2 -293
  28. package/dist/src/agents/opencode-managed-permissions.js +2 -187
  29. package/dist/src/agents/opencode.js +1 -298
  30. package/dist/src/agents/platform-instructions.js +17 -46
  31. package/dist/src/agents/runtime-compatibility.js +1 -44
  32. package/dist/src/agents/workbuddy-managed-permissions.js +2 -329
  33. package/dist/src/agents/workbuddy.js +3 -444
  34. package/dist/src/commands/logout.d.ts +3 -0
  35. package/dist/src/commands/logout.js +1 -0
  36. package/dist/src/daemon-ipc/paths.js +1 -1
  37. package/dist/src/fs/boundary.js +1 -185
  38. package/dist/src/fs/handler.js +1 -130
  39. package/dist/src/fs/security.js +1 -32
  40. package/dist/src/fs/text-decoder.js +1 -110
  41. package/dist/src/index.js +3 -587
  42. package/dist/src/manager/prompt.js +29 -34
  43. package/dist/src/manager/registry.js +1 -317
  44. package/dist/src/manager/retired-external-channel-compat.js +1 -40
  45. package/dist/src/manager/runtime.js +23 -1514
  46. package/dist/src/native-fusion/codex-parser.d.ts +3 -1
  47. package/dist/src/native-fusion/codex-parser.js +4 -660
  48. package/dist/src/native-fusion/codex-user-input.js +5 -102
  49. package/dist/src/native-fusion/config.js +1 -5
  50. package/dist/src/native-fusion/file-watcher.js +1 -191
  51. package/dist/src/native-fusion/local-repository.js +2 -569
  52. package/dist/src/native-fusion/opencode-parser.js +3 -130
  53. package/dist/src/native-fusion/parser-common.d.ts +6 -1
  54. package/dist/src/native-fusion/parser-common.js +4 -4
  55. package/dist/src/native-fusion/parsers.d.ts +4 -2
  56. package/dist/src/native-fusion/parsers.js +3 -140
  57. package/dist/src/native-fusion/service.js +2 -739
  58. package/dist/src/native-fusion/session-header.js +2 -101
  59. package/dist/src/native-fusion/state.js +2 -104
  60. package/dist/src/native-fusion/types.js +1 -1
  61. package/dist/src/personal-sync/machine-authority.js +1 -34
  62. package/dist/src/room/activation-audit.js +2 -45
  63. package/dist/src/room/activation-policy.js +1 -30
  64. package/dist/src/room/activation-service.js +8 -408
  65. package/dist/src/room/invite-bootstrap.js +1 -156
  66. package/dist/src/room/managed-prompt-composer.d.ts +1 -1
  67. package/dist/src/room/managed-prompt-composer.js +17 -16
  68. package/dist/src/room/managed-room-binding.js +1 -167
  69. package/dist/src/room/managed-room-ipc.d.ts +4 -0
  70. package/dist/src/room/managed-room-ipc.js +2 -2
  71. package/dist/src/room/mirror-sync-service.d.ts +1 -0
  72. package/dist/src/room/mirror-sync-service.js +1 -183
  73. package/dist/src/room/room-binding-client.js +1 -151
  74. package/dist/src/session/archive-zip.js +1 -220
  75. package/dist/src/session/deletion-sync-state.js +2 -136
  76. package/dist/src/session/handlers/agent-capabilities.js +1 -14
  77. package/dist/src/session/handlers/agent-config.js +1 -150
  78. package/dist/src/session/handlers/agents.js +1 -55
  79. package/dist/src/session/handlers/chat.js +2 -1030
  80. package/dist/src/session/handlers/control.js +1 -61
  81. package/dist/src/session/handlers/fs.js +1 -594
  82. package/dist/src/session/handlers/message-status.js +1 -15
  83. package/dist/src/session/handlers/remote-access.js +1 -43
  84. package/dist/src/session/handlers/room-managed.js +1 -101
  85. package/dist/src/session/handlers/session-refresh.js +1 -35
  86. package/dist/src/session/handlers/title.js +1 -79
  87. package/dist/src/session/handlers/tool-detail.js +1 -149
  88. package/dist/src/session/handlers/voice-window.js +1 -62
  89. package/dist/src/session/history-subscriptions.js +1 -470
  90. package/dist/src/session/manager.d.ts +1 -0
  91. package/dist/src/session/manager.js +1 -658
  92. package/dist/src/session/native-cleanup-outbox.js +2 -287
  93. package/dist/src/session/native-session-lifecycle.js +6 -327
  94. package/dist/src/session/queue.d.ts +8 -0
  95. package/dist/src/session/queue.js +6 -6
  96. package/dist/src/upgrade/scheduler.js +1 -126
  97. package/node_modules/@shennian/wire/dist/agent-workspace.js +2 -2
  98. package/package.json +1 -1
@@ -1,188 +1,2 @@
1
- // @arch docs/architecture/cli/model-discovery.md
2
- // @test src/__tests__/model-switching.test.ts
3
- import { createInterface } from 'node:readline';
4
- import { resolveBuiltinCommand, spawnResolvedCommand } from '../command-spec.js';
5
- import { fallbackClaudeAliasModels, discoverClaudeAliasModelsFromEnv, fallbackCodexModels, fallbackWorkBuddyModels, fallbackGeminiModels, parseCodexAppServerModels, parseCursorModels, parseOpenCodeModels, } from './parsers.js';
6
- import { runResolvedCommand } from './runner.js';
7
- import { DISCOVERY_WORKDIR } from './types.js';
8
- import { buildAgentProcessEnv, readLatestUserEnv } from '../../agent-env.js';
9
- import { CODEX_APP_SERVER_CLIENT_INFO } from '../codex-utils.js';
10
- function sendAppServerRpc(proc, pending, id, method, params, timeoutMs) {
11
- if (!proc.stdin)
12
- return Promise.reject(new Error('codex app-server stdin unavailable'));
13
- return new Promise((resolve, reject) => {
14
- const timer = setTimeout(() => {
15
- pending.delete(id);
16
- reject(new Error(`codex app-server request timed out: ${method}`));
17
- }, timeoutMs);
18
- pending.set(id, { resolve, reject, timer });
19
- proc.stdin.write(`${JSON.stringify({ id, method, params })}\n`, (error) => {
20
- if (!error)
21
- return;
22
- clearTimeout(timer);
23
- pending.delete(id);
24
- reject(error);
25
- });
26
- });
27
- }
28
- async function discoverCodexModelsViaAppServer(spec) {
29
- const proc = spawnResolvedCommand(spec, ['app-server', '--listen', 'stdio://'], {
30
- cwd: DISCOVERY_WORKDIR,
31
- stdio: ['pipe', 'pipe', 'pipe'],
32
- env: buildAgentProcessEnv({ NO_COLOR: '1' }),
33
- });
34
- const pending = new Map();
35
- let seq = 1;
36
- const rl = createInterface({ input: proc.stdout });
37
- rl.on('line', (line) => {
38
- if (!line.trim())
39
- return;
40
- let msg;
41
- try {
42
- msg = JSON.parse(line);
43
- }
44
- catch {
45
- return;
46
- }
47
- if (msg.id == null)
48
- return;
49
- const request = pending.get(msg.id);
50
- if (!request)
51
- return;
52
- clearTimeout(request.timer);
53
- pending.delete(msg.id);
54
- if (msg.error) {
55
- request.reject(new Error(msg.error.message || `codex app-server error ${msg.error.code ?? ''}`.trim()));
56
- }
57
- else {
58
- request.resolve(msg.result);
59
- }
60
- });
61
- try {
62
- await sendAppServerRpc(proc, pending, seq++, 'initialize', {
63
- clientInfo: CODEX_APP_SERVER_CLIENT_INFO,
64
- capabilities: { experimentalApi: true },
65
- }, 10_000);
66
- const [modelList, configRead] = await Promise.all([
67
- sendAppServerRpc(proc, pending, seq++, 'model/list', {}, 15_000),
68
- sendAppServerRpc(proc, pending, seq++, 'config/read', {}, 15_000).catch(() => null),
69
- ]);
70
- const config = typeof configRead === 'object' && configRead !== null && 'config' in configRead
71
- ? configRead.config
72
- : undefined;
73
- return parseCodexAppServerModels({
74
- ...(typeof modelList === 'object' && modelList !== null ? modelList : {}),
75
- config,
76
- });
77
- }
78
- finally {
79
- for (const [id, request] of pending) {
80
- clearTimeout(request.timer);
81
- request.reject(new Error('codex app-server stopped'));
82
- pending.delete(id);
83
- }
84
- proc.kill('SIGTERM');
85
- setTimeout(() => proc.kill('SIGKILL'), 1000).unref();
86
- }
87
- }
88
- async function discoverCursorModels() {
89
- const spec = resolveBuiltinCommand('cursor');
90
- if (!spec)
91
- return [];
92
- const result = await runResolvedCommand(spec, ['--list-models']);
93
- return parseCursorModels(result.stdout);
94
- }
95
- // OpenClaw support is intentionally disabled.
96
- // async function discoverOpenClawModels(): Promise<ModelInfo[]> {
97
- // const spec = resolveBuiltinCommand('openclaw')
98
- // if (!spec) return []
99
- // const result = await runResolvedCommand(spec, ['models', 'list', '--json'])
100
- // return parseOpenClawModels(result.stdout)
101
- // }
102
- async function discoverOpenCodeModels() {
103
- const spec = resolveBuiltinCommand('opencode');
104
- if (!spec)
105
- return [];
106
- const result = await runResolvedCommand(spec, ['models']);
107
- return parseOpenCodeModels(result.stdout);
108
- }
109
- async function discoverClaudeModels() {
110
- if (!resolveBuiltinCommand('claude'))
111
- return [];
112
- const shellEnvModels = discoverClaudeAliasModelsFromEnv(readLatestUserEnv());
113
- if (shellEnvModels.length > 0)
114
- return shellEnvModels;
115
- return fallbackClaudeAliasModels();
116
- }
117
- async function discoverCodexModels() {
118
- const spec = resolveBuiltinCommand('codex');
119
- if (!spec)
120
- return [];
121
- const appServerModels = await discoverCodexModelsViaAppServer(spec).catch(() => []);
122
- return appServerModels.length > 0 ? appServerModels : fallbackCodexModels();
123
- }
124
- async function discoverGeminiModels() {
125
- if (!resolveBuiltinCommand('gemini'))
126
- return [];
127
- return fallbackGeminiModels();
128
- }
129
- const fallbackPiModels = [
130
- { id: 'qwen3.6-plus', name: 'Qwen 3.6 Plus', provider: 'dashscope', isDefault: true },
131
- ];
132
- const managerModels = [
133
- { id: 'codex', name: 'Codex', provider: 'shennian', isDefault: true },
134
- { id: 'claude', name: 'Claude Code', provider: 'shennian' },
135
- ];
136
- async function discoverPiModels(context) {
137
- if (!context.serverUrl || !context.authToken)
138
- return fallbackPiModels;
139
- try {
140
- const response = await fetch(`${context.serverUrl.replace(/\/$/, '')}/api/models`, {
141
- headers: {
142
- Authorization: `Bearer ${context.authToken}`,
143
- },
144
- });
145
- if (!response.ok)
146
- return fallbackPiModels;
147
- const data = (await response.json());
148
- const models = (data.models ?? []).map((model) => ({
149
- id: model.id,
150
- name: model.name?.trim() || model.id,
151
- provider: model.provider,
152
- isDefault: model.id === data.default,
153
- }));
154
- return models.length > 0 ? models : fallbackPiModels;
155
- }
156
- catch {
157
- return fallbackPiModels;
158
- }
159
- }
160
- async function discoverBuiltinModels(type, context) {
161
- switch (type) {
162
- case 'claude':
163
- return discoverClaudeModels();
164
- case 'codex':
165
- return discoverCodexModels();
166
- case 'workbuddy':
167
- return resolveBuiltinCommand('workbuddy') ? fallbackWorkBuddyModels() : [];
168
- case 'gemini':
169
- return discoverGeminiModels();
170
- case 'cursor':
171
- return discoverCursorModels();
172
- case 'openclaw':
173
- // OpenClaw support is intentionally disabled.
174
- return [];
175
- case 'opencode':
176
- return discoverOpenCodeModels();
177
- case 'pi':
178
- return discoverPiModels(context);
179
- case 'manager':
180
- return managerModels;
181
- }
182
- }
183
- export async function discoverModelsForAgent(agent, context) {
184
- if (agent.type.startsWith('custom:')) {
185
- return agent.models ?? [];
186
- }
187
- return discoverBuiltinModels(agent.type, context);
188
- }
1
+ import{createInterface as m}from"node:readline";import{resolveBuiltinCommand as c,spawnResolvedCommand as v}from"../command-spec.js";import{fallbackClaudeAliasModels as M,discoverClaudeAliasModelsFromEnv as w,fallbackCodexModels as y,fallbackWorkBuddyModels as C,fallbackGeminiModels as h,parseCodexAppServerModels as g,parseCursorModels as E,parseOpenCodeModels as k}from"./parsers.js";import{runResolvedCommand as f}from"./runner.js";import{DISCOVERY_WORKDIR as b}from"./types.js";import{buildAgentProcessEnv as x,readLatestUserEnv as O}from"../../agent-env.js";import{CODEX_APP_SERVER_CLIENT_INFO as R}from"../codex-utils.js";function l(e,r,o,i,a,n){return e.stdin?new Promise((t,s)=>{const u=setTimeout(()=>{r.delete(o),s(new Error(`codex app-server request timed out: ${i}`))},n);r.set(o,{resolve:t,reject:s,timer:u}),e.stdin.write(`${JSON.stringify({id:o,method:i,params:a})}
2
+ `,p=>{p&&(clearTimeout(u),r.delete(o),s(p))})}):Promise.reject(new Error("codex app-server stdin unavailable"))}async function A(e){const r=v(e,["app-server","--listen","stdio://"],{cwd:b,stdio:["pipe","pipe","pipe"],env:x({NO_COLOR:"1"})}),o=new Map;let i=1;m({input:r.stdout}).on("line",n=>{if(!n.trim())return;let t;try{t=JSON.parse(n)}catch{return}if(t.id==null)return;const s=o.get(t.id);s&&(clearTimeout(s.timer),o.delete(t.id),t.error?s.reject(new Error(t.error.message||`codex app-server error ${t.error.code??""}`.trim())):s.resolve(t.result))});try{await l(r,o,i++,"initialize",{clientInfo:R,capabilities:{experimentalApi:!0}},1e4);const[n,t]=await Promise.all([l(r,o,i++,"model/list",{},15e3),l(r,o,i++,"config/read",{},15e3).catch(()=>null)]),s=typeof t=="object"&&t!==null&&"config"in t?t.config:void 0;return g({...typeof n=="object"&&n!==null?n:{},config:s})}finally{for(const[n,t]of o)clearTimeout(t.timer),t.reject(new Error("codex app-server stopped")),o.delete(n);r.kill("SIGTERM"),setTimeout(()=>r.kill("SIGKILL"),1e3).unref()}}async function S(){const e=c("cursor");if(!e)return[];const r=await f(e,["--list-models"]);return E(r.stdout)}async function I(){const e=c("opencode");if(!e)return[];const r=await f(e,["models"]);return k(r.stdout)}async function P(){if(!c("claude"))return[];const e=w(O());return e.length>0?e:M()}async function T(){const e=c("codex");if(!e)return[];const r=await A(e).catch(()=>[]);return r.length>0?r:y()}async function _(){return c("gemini")?h():[]}const d=[{id:"qwen3.6-plus",name:"Qwen 3.6 Plus",provider:"dashscope",isDefault:!0}],D=[{id:"codex",name:"Codex",provider:"shennian",isDefault:!0},{id:"claude",name:"Claude Code",provider:"shennian"}];async function L(e){if(!e.serverUrl||!e.authToken)return d;try{const r=await fetch(`${e.serverUrl.replace(/\/$/,"")}/api/models`,{headers:{Authorization:`Bearer ${e.authToken}`}});if(!r.ok)return d;const o=await r.json(),i=(o.models??[]).map(a=>({id:a.id,name:a.name?.trim()||a.id,provider:a.provider,isDefault:a.id===o.default}));return i.length>0?i:d}catch{return d}}async function $(e,r){switch(e){case"claude":return P();case"codex":return T();case"workbuddy":return c("workbuddy")?C():[];case"gemini":return _();case"cursor":return S();case"openclaw":return[];case"opencode":return I();case"pi":return L(r);case"manager":return D}}async function V(e,r){return e.type.startsWith("custom:")?e.models??[]:$(e.type,r)}export{V as discoverModelsForAgent};