shennian 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/dist/bin/shennian.d.ts +0 -2
- package/dist/bin/shennian.js +0 -2
- package/dist/src/agents/adapter.d.ts +0 -35
- package/dist/src/agents/adapter.js +0 -19
- package/dist/src/agents/claude.d.ts +0 -25
- package/dist/src/agents/claude.js +0 -234
- package/dist/src/agents/codex.d.ts +0 -49
- package/dist/src/agents/codex.js +0 -794
- package/dist/src/agents/command-spec.d.ts +0 -36
- package/dist/src/agents/command-spec.js +0 -303
- package/dist/src/agents/cursor.d.ts +0 -22
- package/dist/src/agents/cursor.js +0 -248
- package/dist/src/agents/custom.d.ts +0 -30
- package/dist/src/agents/custom.js +0 -210
- package/dist/src/agents/detect.d.ts +0 -9
- package/dist/src/agents/detect.js +0 -46
- package/dist/src/agents/gemini.d.ts +0 -17
- package/dist/src/agents/gemini.js +0 -172
- package/dist/src/agents/model-registry/cache.d.ts +0 -4
- package/dist/src/agents/model-registry/cache.js +0 -37
- package/dist/src/agents/model-registry/discovery.d.ts +0 -4
- package/dist/src/agents/model-registry/discovery.js +0 -161
- package/dist/src/agents/model-registry/parsers.d.ts +0 -11
- package/dist/src/agents/model-registry/parsers.js +0 -349
- package/dist/src/agents/model-registry/runner.d.ts +0 -6
- package/dist/src/agents/model-registry/runner.js +0 -29
- package/dist/src/agents/model-registry/service.d.ts +0 -6
- package/dist/src/agents/model-registry/service.js +0 -71
- package/dist/src/agents/model-registry/types.d.ts +0 -30
- package/dist/src/agents/model-registry/types.js +0 -8
- package/dist/src/agents/model-registry.d.ts +0 -13
- package/dist/src/agents/model-registry.js +0 -15
- package/dist/src/agents/openclaw.d.ts +0 -20
- package/dist/src/agents/openclaw.js +0 -273
- package/dist/src/agents/pi.d.ts +0 -51
- package/dist/src/agents/pi.js +0 -793
- package/dist/src/commands/agent.d.ts +0 -2
- package/dist/src/commands/agent.js +0 -131
- package/dist/src/commands/daemon.d.ts +0 -35
- package/dist/src/commands/daemon.js +0 -612
- package/dist/src/commands/pair-qr.d.ts +0 -4
- package/dist/src/commands/pair-qr.js +0 -6
- package/dist/src/commands/pair.d.ts +0 -8
- package/dist/src/commands/pair.js +0 -162
- package/dist/src/commands/upgrade.d.ts +0 -5
- package/dist/src/commands/upgrade.js +0 -145
- package/dist/src/config/index.d.ts +0 -32
- package/dist/src/config/index.js +0 -31
- package/dist/src/fs/handler.d.ts +0 -26
- package/dist/src/fs/handler.js +0 -130
- package/dist/src/fs/security.d.ts +0 -2
- package/dist/src/fs/security.js +0 -32
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +0 -277
- package/dist/src/log-reporter.d.ts +0 -18
- package/dist/src/log-reporter.js +0 -16
- package/dist/src/native-fusion/parsers.d.ts +0 -12
- package/dist/src/native-fusion/parsers.js +0 -687
- package/dist/src/native-fusion/service.d.ts +0 -25
- package/dist/src/native-fusion/service.js +0 -176
- package/dist/src/native-fusion/state.d.ts +0 -3
- package/dist/src/native-fusion/state.js +0 -22
- package/dist/src/native-fusion/types.d.ts +0 -24
- package/dist/src/native-fusion/types.js +0 -1
- package/dist/src/region.d.ts +0 -15
- package/dist/src/region.js +0 -99
- package/dist/src/relay/client.d.ts +0 -62
- package/dist/src/relay/client.js +0 -311
- package/dist/src/session/handlers/agents.d.ts +0 -4
- package/dist/src/session/handlers/agents.js +0 -55
- package/dist/src/session/handlers/chat.d.ts +0 -4
- package/dist/src/session/handlers/chat.js +0 -326
- package/dist/src/session/handlers/control.d.ts +0 -5
- package/dist/src/session/handlers/control.js +0 -57
- package/dist/src/session/handlers/fs.d.ts +0 -10
- package/dist/src/session/handlers/fs.js +0 -256
- package/dist/src/session/manager.d.ts +0 -28
- package/dist/src/session/manager.js +0 -174
- package/dist/src/session/store.d.ts +0 -7
- package/dist/src/session/store.js +0 -46
- package/dist/src/session/types.d.ts +0 -35
- package/dist/src/session/types.js +0 -4
- package/dist/src/upgrade/engine.d.ts +0 -64
- package/dist/src/upgrade/engine.js +0 -238
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { AgentAdapter, registerAgent } from './adapter.js';
|
|
3
|
-
import { resolveBuiltinCommand, spawnResolvedCommand } from './command-spec.js';
|
|
4
|
-
/** Best-effort parse of `openclaw agent --json` stdout; shape may vary by version. */
|
|
5
|
-
function extractResponseText(parsed) {
|
|
6
|
-
if (parsed == null)
|
|
7
|
-
return '';
|
|
8
|
-
if (typeof parsed === 'string')
|
|
9
|
-
return parsed;
|
|
10
|
-
if (typeof parsed === 'object') {
|
|
11
|
-
const o = parsed;
|
|
12
|
-
// Primary format: { payloads: [{ text: "..." }] }
|
|
13
|
-
if (Array.isArray(o.payloads)) {
|
|
14
|
-
const parts = [];
|
|
15
|
-
for (const p of o.payloads) {
|
|
16
|
-
if (p && typeof p === 'object') {
|
|
17
|
-
const t = p.text;
|
|
18
|
-
if (typeof t === 'string')
|
|
19
|
-
parts.push(t);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
if (parts.join('').trim())
|
|
23
|
-
return parts.join('\n');
|
|
24
|
-
}
|
|
25
|
-
const direct = o.response ?? o.message ?? o.text ?? o.output ?? o.content ?? o.result;
|
|
26
|
-
if (typeof direct === 'string' && direct.trim())
|
|
27
|
-
return direct;
|
|
28
|
-
}
|
|
29
|
-
return '';
|
|
30
|
-
}
|
|
31
|
-
function extractSessionId(parsed) {
|
|
32
|
-
if (parsed == null || typeof parsed !== 'object')
|
|
33
|
-
return undefined;
|
|
34
|
-
const o = parsed;
|
|
35
|
-
const meta = o.meta;
|
|
36
|
-
const agentMeta = meta?.agentMeta;
|
|
37
|
-
const id = agentMeta?.sessionId ?? o.sessionId ?? o.session_id;
|
|
38
|
-
return typeof id === 'string' && id ? id : undefined;
|
|
39
|
-
}
|
|
40
|
-
function extractUsage(parsed) {
|
|
41
|
-
if (parsed == null || typeof parsed !== 'object')
|
|
42
|
-
return undefined;
|
|
43
|
-
const o = parsed;
|
|
44
|
-
// Primary: meta.agentMeta.usage (openclaw format)
|
|
45
|
-
const meta = o.meta;
|
|
46
|
-
const agentMeta = meta?.agentMeta;
|
|
47
|
-
const u = agentMeta?.usage ?? o.usage;
|
|
48
|
-
if (!u || typeof u !== 'object')
|
|
49
|
-
return undefined;
|
|
50
|
-
const rec = u;
|
|
51
|
-
const inTok = rec.input ?? rec.inputTokens ?? rec.input_tokens;
|
|
52
|
-
const outTok = rec.output ?? rec.outputTokens ?? rec.output_tokens;
|
|
53
|
-
if (typeof inTok !== 'number' && typeof outTok !== 'number')
|
|
54
|
-
return undefined;
|
|
55
|
-
return {
|
|
56
|
-
inputTokens: typeof inTok === 'number' ? inTok : 0,
|
|
57
|
-
outputTokens: typeof outTok === 'number' ? outTok : 0,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function extractErrorMessage(parsed) {
|
|
61
|
-
if (parsed == null || typeof parsed !== 'object')
|
|
62
|
-
return undefined;
|
|
63
|
-
const o = parsed;
|
|
64
|
-
const err = o.error ?? o.err ?? o.errorMessage;
|
|
65
|
-
if (typeof err === 'string' && err.trim())
|
|
66
|
-
return err;
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
export class OpenClawAdapter extends AgentAdapter {
|
|
70
|
-
type = 'openclaw';
|
|
71
|
-
process = null;
|
|
72
|
-
sessionId = null;
|
|
73
|
-
/** OpenClaw session id from JSON or `resume()`; falls back to app `sessionId`. */
|
|
74
|
-
agentSessionId = null;
|
|
75
|
-
currentModelId = null;
|
|
76
|
-
workDir = null;
|
|
77
|
-
seq = 0;
|
|
78
|
-
runId = '';
|
|
79
|
-
async start(sessionId, workDir, agentSessionId) {
|
|
80
|
-
this.sessionId = sessionId;
|
|
81
|
-
this.workDir = workDir;
|
|
82
|
-
this.seq = 0;
|
|
83
|
-
if (agentSessionId)
|
|
84
|
-
this.agentSessionId = agentSessionId;
|
|
85
|
-
}
|
|
86
|
-
async send(text, modelId) {
|
|
87
|
-
await this.killProcess();
|
|
88
|
-
this.runId = randomUUID();
|
|
89
|
-
this.seq = 0;
|
|
90
|
-
const sid = this.agentSessionId ?? this.sessionId;
|
|
91
|
-
if (!sid) {
|
|
92
|
-
this.emitEvent({ state: 'error', message: 'openclaw: session not started' });
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
// OpenClaw `openclaw agent` uses session-scoped model; `--model` on the same CLI may not apply here.
|
|
96
|
-
// Sending `/model <id>` as a message matches interactive `/model` and updates the session before the user turn.
|
|
97
|
-
if (modelId && modelId !== this.currentModelId) {
|
|
98
|
-
const modelSwitch = await this.runAgentCommand(['--message', `/model ${modelId}`, '--session-id', sid]);
|
|
99
|
-
if (!modelSwitch.ok) {
|
|
100
|
-
this.emitEvent({ state: 'error', message: modelSwitch.error ?? 'openclaw model switch failed' });
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
this.currentModelId = modelId;
|
|
104
|
-
}
|
|
105
|
-
this.spawnAgent(['--message', text, '--session-id', sid]);
|
|
106
|
-
}
|
|
107
|
-
async resume(agentSessionId) {
|
|
108
|
-
await this.killProcess();
|
|
109
|
-
this.agentSessionId = agentSessionId;
|
|
110
|
-
this.runId = randomUUID();
|
|
111
|
-
this.seq = 0;
|
|
112
|
-
// No new user turn; minimal body so the CLI accepts the invocation.
|
|
113
|
-
this.spawnAgent(['--message', '\u200b', '--session-id', agentSessionId]);
|
|
114
|
-
}
|
|
115
|
-
async stop() {
|
|
116
|
-
await this.killProcess();
|
|
117
|
-
}
|
|
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
|
-
}
|
|
124
|
-
const args = ['agent', '--local', '--json', ...extraArgs];
|
|
125
|
-
const proc = spawnResolvedCommand(spec, args, {
|
|
126
|
-
cwd: this.workDir ?? undefined,
|
|
127
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
128
|
-
env: { ...process.env },
|
|
129
|
-
});
|
|
130
|
-
this.process = proc;
|
|
131
|
-
let stdoutBuf = '';
|
|
132
|
-
proc.stdout?.on('data', (chunk) => {
|
|
133
|
-
stdoutBuf += chunk.toString();
|
|
134
|
-
});
|
|
135
|
-
let stderrBuf = '';
|
|
136
|
-
proc.stderr?.on('data', (chunk) => {
|
|
137
|
-
stderrBuf += chunk.toString();
|
|
138
|
-
});
|
|
139
|
-
proc.on('close', (code) => {
|
|
140
|
-
if (this.process !== proc)
|
|
141
|
-
return;
|
|
142
|
-
this.process = null;
|
|
143
|
-
if (code !== 0 && code !== null) {
|
|
144
|
-
const msg = stderrBuf.trim() || `openclaw exited with code ${code}`;
|
|
145
|
-
this.emitEvent({ state: 'error', message: msg });
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const raw = stdoutBuf.trim();
|
|
149
|
-
if (!raw) {
|
|
150
|
-
const msg = stderrBuf.trim() || 'openclaw returned empty stdout';
|
|
151
|
-
this.emitEvent({ state: 'error', message: msg });
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
let parsed;
|
|
155
|
-
try {
|
|
156
|
-
parsed = JSON.parse(raw);
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
this.emitEvent({
|
|
160
|
-
state: 'error',
|
|
161
|
-
message: `openclaw stdout is not valid JSON: ${raw.slice(0, 200)}`,
|
|
162
|
-
});
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
const rec = parsed;
|
|
166
|
-
const failed = rec.ok === false || rec.success === false;
|
|
167
|
-
if (failed) {
|
|
168
|
-
this.emitEvent({
|
|
169
|
-
state: 'error',
|
|
170
|
-
message: extractErrorMessage(parsed) ?? 'openclaw request failed',
|
|
171
|
-
});
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
const nextSid = extractSessionId(parsed);
|
|
175
|
-
if (nextSid)
|
|
176
|
-
this.agentSessionId = nextSid;
|
|
177
|
-
const text = extractResponseText(parsed);
|
|
178
|
-
if (text) {
|
|
179
|
-
this.emitEvent({ state: 'delta', text });
|
|
180
|
-
}
|
|
181
|
-
const usage = extractUsage(parsed);
|
|
182
|
-
this.emitEvent({ state: 'final', agentSessionId: this.agentSessionId ?? undefined, usage });
|
|
183
|
-
});
|
|
184
|
-
proc.on('error', (err) => {
|
|
185
|
-
if (this.process !== proc)
|
|
186
|
-
return;
|
|
187
|
-
this.process = null;
|
|
188
|
-
if (err.code === 'ENOENT') {
|
|
189
|
-
this.emit('error', new Error('Command "openclaw" not found. Is OpenClaw CLI installed?'));
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
this.emit('error', err);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
async runAgentCommand(extraArgs) {
|
|
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
|
-
}
|
|
203
|
-
const args = ['agent', '--local', '--json', ...extraArgs];
|
|
204
|
-
const proc = spawnResolvedCommand(spec, args, {
|
|
205
|
-
cwd: this.workDir ?? undefined,
|
|
206
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
207
|
-
env: { ...process.env },
|
|
208
|
-
});
|
|
209
|
-
let stdoutBuf = '';
|
|
210
|
-
let stderrBuf = '';
|
|
211
|
-
proc.stdout?.on('data', (chunk) => {
|
|
212
|
-
stdoutBuf += chunk.toString();
|
|
213
|
-
});
|
|
214
|
-
proc.stderr?.on('data', (chunk) => {
|
|
215
|
-
stderrBuf += chunk.toString();
|
|
216
|
-
});
|
|
217
|
-
proc.on('close', (code) => {
|
|
218
|
-
if (code !== 0 && code !== null) {
|
|
219
|
-
resolve({ ok: false, error: stderrBuf.trim() || `openclaw exited with code ${code}` });
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const raw = stdoutBuf.trim();
|
|
223
|
-
if (!raw) {
|
|
224
|
-
resolve({ ok: true });
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
try {
|
|
228
|
-
const parsed = JSON.parse(raw);
|
|
229
|
-
if (parsed.ok === false || parsed.success === false) {
|
|
230
|
-
resolve({
|
|
231
|
-
ok: false,
|
|
232
|
-
error: extractErrorMessage(parsed) ?? 'openclaw request failed',
|
|
233
|
-
});
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
const nextSid = extractSessionId(parsed);
|
|
237
|
-
if (nextSid)
|
|
238
|
-
this.agentSessionId = nextSid;
|
|
239
|
-
resolve({ ok: true, parsed });
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
resolve({ ok: false, error: `openclaw stdout is not valid JSON: ${raw.slice(0, 200)}` });
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
proc.on('error', (err) => {
|
|
246
|
-
resolve({ ok: false, error: err instanceof Error ? err.message : String(err) });
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
emitEvent(partial) {
|
|
251
|
-
const event = {
|
|
252
|
-
...partial,
|
|
253
|
-
runId: this.runId,
|
|
254
|
-
seq: this.seq++,
|
|
255
|
-
};
|
|
256
|
-
this.emit('agentEvent', event);
|
|
257
|
-
}
|
|
258
|
-
async killProcess() {
|
|
259
|
-
const proc = this.process;
|
|
260
|
-
if (!proc)
|
|
261
|
-
return;
|
|
262
|
-
this.process = null;
|
|
263
|
-
proc.kill('SIGTERM');
|
|
264
|
-
await new Promise((resolve) => {
|
|
265
|
-
proc.on('close', resolve);
|
|
266
|
-
setTimeout(() => {
|
|
267
|
-
proc.kill('SIGKILL');
|
|
268
|
-
resolve();
|
|
269
|
-
}, 3000);
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
registerAgent('openclaw', () => new OpenClawAdapter());
|
package/dist/src/agents/pi.d.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { AgentAdapter } from './adapter.js';
|
|
2
|
-
export declare class PiAdapter extends AgentAdapter {
|
|
3
|
-
readonly type: "pi";
|
|
4
|
-
private agent;
|
|
5
|
-
private sessionId;
|
|
6
|
-
private workDir;
|
|
7
|
-
private seq;
|
|
8
|
-
private runId;
|
|
9
|
-
private emittedLengths;
|
|
10
|
-
private terminalState;
|
|
11
|
-
private authToken;
|
|
12
|
-
private proxyUrl;
|
|
13
|
-
private sessionDir;
|
|
14
|
-
private messagesPath;
|
|
15
|
-
private snapshotPath;
|
|
16
|
-
private summaryPath;
|
|
17
|
-
private cachedSummary;
|
|
18
|
-
private restoredMessages;
|
|
19
|
-
private compressing;
|
|
20
|
-
private lastSummaryMsgCount;
|
|
21
|
-
private pendingBaseMessages;
|
|
22
|
-
private finalizePromise;
|
|
23
|
-
private pendingSendStart;
|
|
24
|
-
start(sessionId: string, workDir: string, _agentSessionId?: string | null): Promise<void>;
|
|
25
|
-
send(text: string, modelId?: string): Promise<void>;
|
|
26
|
-
private initAgent;
|
|
27
|
-
/**
|
|
28
|
-
* After each turn, compress old messages and actually replace them in the
|
|
29
|
-
* Agent's internal state. This is the primary compression mechanism.
|
|
30
|
-
*/
|
|
31
|
-
private compressAndReplace;
|
|
32
|
-
/**
|
|
33
|
-
* Safety fallback: if messages somehow exceed the threshold at LLM call time
|
|
34
|
-
* (e.g. compressAndReplace hasn't run yet), return a truncated view using
|
|
35
|
-
* the cached summary. Does NOT call LLM — avoids nested async delays.
|
|
36
|
-
*/
|
|
37
|
-
private compressContext;
|
|
38
|
-
private splitMessages;
|
|
39
|
-
private generateSummary;
|
|
40
|
-
private loadSnapshot;
|
|
41
|
-
private loadSummary;
|
|
42
|
-
private saveSummary;
|
|
43
|
-
private saveSnapshot;
|
|
44
|
-
private appendMessagesLog;
|
|
45
|
-
private getTurnMessages;
|
|
46
|
-
private finalizeTurn;
|
|
47
|
-
resume(_agentSessionId: string): Promise<void>;
|
|
48
|
-
stop(): Promise<void>;
|
|
49
|
-
private resolvePendingSendStart;
|
|
50
|
-
private rejectPendingSendStart;
|
|
51
|
-
}
|