@smooai/smooth-operator-core 0.10.0 → 0.11.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.
- package/dist/agent.d.ts +276 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +450 -0
- package/dist/agent.js.map +1 -0
- package/dist/cast.d.ts +81 -0
- package/dist/cast.d.ts.map +1 -0
- package/dist/cast.js +103 -0
- package/dist/cast.js.map +1 -0
- package/dist/checkpoint.d.ts +25 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +23 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/compaction.d.ts +21 -0
- package/dist/compaction.d.ts.map +1 -0
- package/dist/compaction.js +50 -0
- package/dist/compaction.js.map +1 -0
- package/dist/cost.d.ts +34 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +42 -0
- package/dist/cost.js.map +1 -0
- package/dist/extension/host.d.ts +199 -0
- package/dist/extension/host.d.ts.map +1 -0
- package/dist/extension/host.js +502 -0
- package/dist/extension/host.js.map +1 -0
- package/dist/extension/index.d.ts +36 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/index.js +37 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/manifest.d.ts +111 -0
- package/dist/extension/manifest.d.ts.map +1 -0
- package/dist/extension/manifest.js +190 -0
- package/dist/extension/manifest.js.map +1 -0
- package/dist/extension/process.d.ts +118 -0
- package/dist/extension/process.d.ts.map +1 -0
- package/dist/extension/process.js +352 -0
- package/dist/extension/process.js.map +1 -0
- package/dist/extension/protocol.d.ts +254 -0
- package/dist/extension/protocol.d.ts.map +1 -0
- package/dist/extension/protocol.js +127 -0
- package/dist/extension/protocol.js.map +1 -0
- package/dist/extension/tool_proxy.d.ts +34 -0
- package/dist/extension/tool_proxy.d.ts.map +1 -0
- package/dist/extension/tool_proxy.js +48 -0
- package/dist/extension/tool_proxy.js.map +1 -0
- package/dist/humanGate.d.ts +44 -0
- package/dist/humanGate.d.ts.map +1 -0
- package/dist/humanGate.js +30 -0
- package/dist/humanGate.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge.d.ts +30 -0
- package/dist/knowledge.d.ts.map +1 -0
- package/dist/knowledge.js +43 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/llmProvider.d.ts +106 -0
- package/dist/llmProvider.d.ts.map +1 -0
- package/dist/llmProvider.js +160 -0
- package/dist/llmProvider.js.map +1 -0
- package/dist/memory.d.ts +23 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +40 -0
- package/dist/memory.js.map +1 -0
- package/dist/rerank.d.ts +27 -0
- package/dist/rerank.d.ts.map +1 -0
- package/dist/rerank.js +45 -0
- package/dist/rerank.js.map +1 -0
- package/dist/thread.d.ts +43 -0
- package/dist/thread.d.ts.map +1 -0
- package/dist/thread.js +60 -0
- package/dist/thread.js.map +1 -0
- package/dist/toolSearch.d.ts +55 -0
- package/dist/toolSearch.d.ts.map +1 -0
- package/dist/toolSearch.js +110 -0
- package/dist/toolSearch.js.map +1 -0
- package/dist/vector.d.ts +36 -0
- package/dist/vector.d.ts.map +1 -0
- package/dist/vector.js +75 -0
- package/dist/vector.js.map +1 -0
- package/dist/workflow.d.ts +62 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +109 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ExtensionHost` — orchestrates the loaded extensions: hook chaining in load
|
|
3
|
+
* order, non-blocking event fanout, tool proxies, and the ext→host delegate seam.
|
|
4
|
+
* The TS sibling of the Rust host's `extension/host.rs`.
|
|
5
|
+
*
|
|
6
|
+
* The security-critical part is {@link foldHookChain}: how per-extension hook
|
|
7
|
+
* outcomes combine, and what happens on timeout/crash. It is a pure function so it
|
|
8
|
+
* can be tested exhaustively against adversarial inputs without spawning anything.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { dirname, join } from 'node:path';
|
|
12
|
+
import { defaultGlobalDir, resolvedEnv } from './manifest.js';
|
|
13
|
+
import { ExtensionProcess } from './process.js';
|
|
14
|
+
import { codes, method, parseHookOutcome, PROTOCOL_VERSION, RpcError, } from './protocol.js';
|
|
15
|
+
import { ExtensionTool } from './tool_proxy.js';
|
|
16
|
+
export { PROTOCOL_VERSION };
|
|
17
|
+
const HOOK_TYPES = new Set([
|
|
18
|
+
'tool_call',
|
|
19
|
+
'user_bash',
|
|
20
|
+
'tool_result',
|
|
21
|
+
'input',
|
|
22
|
+
'before_agent_start',
|
|
23
|
+
'context',
|
|
24
|
+
'before_provider_request',
|
|
25
|
+
'message_end',
|
|
26
|
+
'session_before_compact',
|
|
27
|
+
'session_before_tree',
|
|
28
|
+
]);
|
|
29
|
+
/** The two fail-closed hooks: they gate execution, so a timeout/crash BLOCKS. */
|
|
30
|
+
const FAIL_CLOSED_HOOKS = new Set(['tool_call', 'user_bash']);
|
|
31
|
+
export function hookTypeFromName(name) {
|
|
32
|
+
return HOOK_TYPES.has(name) ? name : undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Fail-closed hooks (`tool_call`, `user_bash`) block the operation when an
|
|
36
|
+
* extension times out or crashes. Everything else fails open (proceeds).
|
|
37
|
+
*/
|
|
38
|
+
export function hookFailClosed(hook) {
|
|
39
|
+
return FAIL_CLOSED_HOOKS.has(hook);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Default hook timeout (ms): 60s for fail-closed (they gate execution), 5s for
|
|
43
|
+
* fail-open. Manifest `hook_timeout_ms` overrides this.
|
|
44
|
+
*/
|
|
45
|
+
export function hookDefaultTimeoutMs(hook) {
|
|
46
|
+
return hookFailClosed(hook) ? 60_000 : 5_000;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Fold a hook chain over `input`, in load order. `steps` are the per-extension
|
|
50
|
+
* results in that order. This is the security-critical policy:
|
|
51
|
+
*
|
|
52
|
+
* - `continue` → value unchanged, next extension sees it.
|
|
53
|
+
* - `modify` → value replaced by the patch, next extension sees the patch.
|
|
54
|
+
* - `block` → short-circuit; the operation is vetoed (honored for every hook).
|
|
55
|
+
* - failed → for a fail-closed hook, block; for a fail-open hook, proceed unchanged.
|
|
56
|
+
*/
|
|
57
|
+
export function foldHookChain(hook, input, steps) {
|
|
58
|
+
let current = input;
|
|
59
|
+
for (const step of steps) {
|
|
60
|
+
if (step.kind === 'failed') {
|
|
61
|
+
if (hookFailClosed(hook))
|
|
62
|
+
return { kind: 'blocked', reason: `${hook} hook failed (fail-closed)` };
|
|
63
|
+
// fail-open: proceed with the current value.
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const outcome = step.outcome;
|
|
67
|
+
if (outcome.action === 'continue')
|
|
68
|
+
continue;
|
|
69
|
+
if (outcome.action === 'modify') {
|
|
70
|
+
current = outcome.patch;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// block
|
|
74
|
+
return { kind: 'blocked', reason: outcome.reason ?? `blocked by ${hook} hook` };
|
|
75
|
+
}
|
|
76
|
+
return { kind: 'proceed', value: current };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Effective event subscriptions: what the extension asked for at handshake,
|
|
80
|
+
* clamped to what its manifest `[capabilities] events` declared. An empty declared
|
|
81
|
+
* list means "no declared filter" → trust the handshake as-is; a non-empty list is
|
|
82
|
+
* the outer bound the extension can never widen past.
|
|
83
|
+
*/
|
|
84
|
+
export function effectiveSubscriptions(declared, requested) {
|
|
85
|
+
if (declared.length === 0)
|
|
86
|
+
return new Set(requested);
|
|
87
|
+
const allow = new Set(declared);
|
|
88
|
+
return new Set(requested.filter((s) => allow.has(s)));
|
|
89
|
+
}
|
|
90
|
+
/** Parse the epoch embedded in a context token minted by {@link ExtensionHost.context} (`epoch-<N>`). */
|
|
91
|
+
function tokenEpoch(token) {
|
|
92
|
+
if (!token.startsWith('epoch-'))
|
|
93
|
+
return undefined;
|
|
94
|
+
const n = token.slice('epoch-'.length);
|
|
95
|
+
if (n.length === 0 || !/^\d+$/.test(n))
|
|
96
|
+
return undefined;
|
|
97
|
+
return Number(n);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The two-tier deadlock guard: a session-mutating ext→host action is valid only
|
|
101
|
+
* when it presents a COMMAND-tier context whose epoch is still current. An
|
|
102
|
+
* event-tier context, or a stale token minted before a reload bumped the epoch, is
|
|
103
|
+
* rejected with `-32003 ContextViolation`. Security-critical; a pure function so it
|
|
104
|
+
* can be tested exhaustively.
|
|
105
|
+
*/
|
|
106
|
+
export function validateCommandContext(params, currentEpoch) {
|
|
107
|
+
const ctx = params?.context;
|
|
108
|
+
if (ctx?.tier !== 'command')
|
|
109
|
+
throw new RpcError(codes.ContextViolation, 'session action requires a command-tier context');
|
|
110
|
+
const token = typeof ctx.token === 'string' ? ctx.token : '';
|
|
111
|
+
const epoch = tokenEpoch(token);
|
|
112
|
+
if (epoch === undefined || epoch !== currentEpoch) {
|
|
113
|
+
throw new RpcError(codes.ContextViolation, 'session action presented a stale context (epoch mismatch)');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Per-extension kv state file: `<globalDir>/<name>/state.json`. */
|
|
117
|
+
function kvFilePath(ext) {
|
|
118
|
+
const dir = defaultGlobalDir();
|
|
119
|
+
return dir ? join(dir, ext, 'state.json') : undefined;
|
|
120
|
+
}
|
|
121
|
+
function kvFileLoad(ext) {
|
|
122
|
+
const path = kvFilePath(ext);
|
|
123
|
+
if (!path || !existsSync(path))
|
|
124
|
+
return {};
|
|
125
|
+
try {
|
|
126
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return {};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function kvFileStore(ext, map) {
|
|
133
|
+
const path = kvFilePath(ext);
|
|
134
|
+
if (!path)
|
|
135
|
+
throw new RpcError(codes.InternalError, 'no home dir for kv store');
|
|
136
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
137
|
+
writeFileSync(path, JSON.stringify(map, null, 2));
|
|
138
|
+
}
|
|
139
|
+
/** The engine's headless delegate: NoUI, JSON-file kv, exec denied, session disabled. */
|
|
140
|
+
export class DefaultHostDelegate {
|
|
141
|
+
async uiRequest(_ext, _params) {
|
|
142
|
+
throw new RpcError(codes.NoUI, 'no UI available (headless host)');
|
|
143
|
+
}
|
|
144
|
+
async kvGet(ext, key) {
|
|
145
|
+
return kvFileLoad(ext)[key] ?? null;
|
|
146
|
+
}
|
|
147
|
+
async kvSet(ext, key, value) {
|
|
148
|
+
const map = kvFileLoad(ext);
|
|
149
|
+
map[key] = value;
|
|
150
|
+
kvFileStore(ext, map);
|
|
151
|
+
}
|
|
152
|
+
async execRun(_ext, _params) {
|
|
153
|
+
throw new RpcError(codes.NotTrusted, 'exec/run is not permitted on the headless host');
|
|
154
|
+
}
|
|
155
|
+
async sessionSendMessage(_ext, _params) {
|
|
156
|
+
throw new RpcError(codes.CapabilityDisabled, 'session actions are unavailable on this host');
|
|
157
|
+
}
|
|
158
|
+
async sessionSendUserMessage(_ext, _params) {
|
|
159
|
+
throw new RpcError(codes.CapabilityDisabled, 'session actions are unavailable on this host');
|
|
160
|
+
}
|
|
161
|
+
async sessionAppendEntry(_ext, _params) {
|
|
162
|
+
throw new RpcError(codes.CapabilityDisabled, 'session actions are unavailable on this host');
|
|
163
|
+
}
|
|
164
|
+
toolUpdate(_ext, _params) {
|
|
165
|
+
// Headless: progress is dropped. A frontend/daemon overrides this.
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Bridges the process reader's ext→host requests to the {@link HostDelegate}.
|
|
170
|
+
* Holds a getter for the host's live epoch so it can reject stale/event-tier
|
|
171
|
+
* session actions.
|
|
172
|
+
*/
|
|
173
|
+
class HostInbound {
|
|
174
|
+
ext;
|
|
175
|
+
delegate;
|
|
176
|
+
currentEpoch;
|
|
177
|
+
constructor(ext, delegate, currentEpoch) {
|
|
178
|
+
this.ext = ext;
|
|
179
|
+
this.delegate = delegate;
|
|
180
|
+
this.currentEpoch = currentEpoch;
|
|
181
|
+
}
|
|
182
|
+
async handleRequest(methodName, params) {
|
|
183
|
+
switch (methodName) {
|
|
184
|
+
case method.PING:
|
|
185
|
+
return {};
|
|
186
|
+
case method.UI_REQUEST:
|
|
187
|
+
return this.delegate.uiRequest(this.ext, params);
|
|
188
|
+
case method.EXEC_RUN:
|
|
189
|
+
return this.delegate.execRun(this.ext, params);
|
|
190
|
+
// Session actions are the tier-guarded set: validate the presented
|
|
191
|
+
// context (command tier + current epoch) BEFORE touching the delegate.
|
|
192
|
+
case method.SESSION_SEND_MESSAGE:
|
|
193
|
+
validateCommandContext(params, this.currentEpoch());
|
|
194
|
+
return this.delegate.sessionSendMessage(this.ext, params);
|
|
195
|
+
case method.SESSION_SEND_USER_MESSAGE:
|
|
196
|
+
validateCommandContext(params, this.currentEpoch());
|
|
197
|
+
return this.delegate.sessionSendUserMessage(this.ext, params);
|
|
198
|
+
case method.SESSION_APPEND_ENTRY:
|
|
199
|
+
validateCommandContext(params, this.currentEpoch());
|
|
200
|
+
return this.delegate.sessionAppendEntry(this.ext, params);
|
|
201
|
+
case 'kv/get': {
|
|
202
|
+
const key = params?.key;
|
|
203
|
+
return { value: await this.delegate.kvGet(this.ext, typeof key === 'string' ? key : '') };
|
|
204
|
+
}
|
|
205
|
+
case 'kv/set': {
|
|
206
|
+
const p = params;
|
|
207
|
+
await this.delegate.kvSet(this.ext, typeof p?.key === 'string' ? p.key : '', p?.value ?? null);
|
|
208
|
+
return {};
|
|
209
|
+
}
|
|
210
|
+
default:
|
|
211
|
+
throw new RpcError(codes.MethodNotFound, `method not found: ${methodName}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
handleNotification(methodName, params) {
|
|
215
|
+
if (methodName === method.TOOL_UPDATE)
|
|
216
|
+
this.delegate.toolUpdate(this.ext, params);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** Orchestrates the set of loaded extensions in load order. */
|
|
220
|
+
export class ExtensionHost {
|
|
221
|
+
host;
|
|
222
|
+
workspace;
|
|
223
|
+
mode;
|
|
224
|
+
uiCapabilities;
|
|
225
|
+
extensions = [];
|
|
226
|
+
epoch = 1;
|
|
227
|
+
constructor(host, workspace, mode, uiCapabilities) {
|
|
228
|
+
this.host = host;
|
|
229
|
+
this.workspace = workspace;
|
|
230
|
+
this.mode = mode;
|
|
231
|
+
this.uiCapabilities = uiCapabilities;
|
|
232
|
+
}
|
|
233
|
+
/** An empty host: no extensions, every hook a passthrough. The zero-cost default. */
|
|
234
|
+
static empty() {
|
|
235
|
+
return new ExtensionHost({ name: 'smooth-operator-core', version: '0.0.0' }, { root: '', trusted: false }, 'headless', []);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Load and initialize each discovered extension. Per-extension failures (spawn,
|
|
239
|
+
* handshake) are tolerated and returned alongside the host. In an untrusted
|
|
240
|
+
* workspace, project-scoped extensions are skipped.
|
|
241
|
+
*/
|
|
242
|
+
static async load(discovered, host, workspace, mode, uiCapabilities, delegate) {
|
|
243
|
+
const self = new ExtensionHost(host, workspace, mode, uiCapabilities);
|
|
244
|
+
const failures = [];
|
|
245
|
+
for (const ext of discovered) {
|
|
246
|
+
const name = ext.manifest.name;
|
|
247
|
+
if (ext.manifest.disabled)
|
|
248
|
+
continue;
|
|
249
|
+
if (ext.scope === 'project' && !workspace.trusted)
|
|
250
|
+
continue;
|
|
251
|
+
try {
|
|
252
|
+
self.extensions.push(await self.loadOne(ext, delegate));
|
|
253
|
+
}
|
|
254
|
+
catch (e) {
|
|
255
|
+
failures.push([name, e instanceof Error ? e.message : String(e)]);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return { host: self, failures };
|
|
259
|
+
}
|
|
260
|
+
async loadOne(ext, delegate) {
|
|
261
|
+
const { manifest, root } = ext;
|
|
262
|
+
const spec = {
|
|
263
|
+
command: manifest.run.command,
|
|
264
|
+
args: manifest.run.args,
|
|
265
|
+
env: resolvedEnv(manifest),
|
|
266
|
+
cwd: root,
|
|
267
|
+
};
|
|
268
|
+
const handler = new HostInbound(manifest.name, delegate, () => this.epoch);
|
|
269
|
+
const proc = ExtensionProcess.spawn(spec, handler);
|
|
270
|
+
const init = await this.initialize(proc);
|
|
271
|
+
const subscriptions = effectiveSubscriptions(manifest.capabilities.events, init.registrations?.subscriptions ?? []);
|
|
272
|
+
return {
|
|
273
|
+
name: manifest.name,
|
|
274
|
+
process: proc,
|
|
275
|
+
init,
|
|
276
|
+
subscriptions,
|
|
277
|
+
declaredEvents: manifest.capabilities.events,
|
|
278
|
+
hookTimeoutMs: manifest.hookTimeoutMs,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/** Send `initialize` and parse the registrations. Shared by load and reload. */
|
|
282
|
+
async initialize(proc) {
|
|
283
|
+
const params = {
|
|
284
|
+
protocol_version: PROTOCOL_VERSION,
|
|
285
|
+
host: this.host,
|
|
286
|
+
workspace: this.workspace,
|
|
287
|
+
mode: this.mode,
|
|
288
|
+
ui_capabilities: this.uiCapabilities,
|
|
289
|
+
flags: {},
|
|
290
|
+
};
|
|
291
|
+
const raw = (await proc.request(method.INITIALIZE, params, 10_000));
|
|
292
|
+
if (typeof raw?.protocol_version !== 'number' || typeof raw?.extension?.name !== 'string') {
|
|
293
|
+
throw new Error('bad initialize result');
|
|
294
|
+
}
|
|
295
|
+
return raw;
|
|
296
|
+
}
|
|
297
|
+
/** Number of successfully loaded extensions. */
|
|
298
|
+
get length() {
|
|
299
|
+
return this.extensions.length;
|
|
300
|
+
}
|
|
301
|
+
isEmpty() {
|
|
302
|
+
return this.extensions.length === 0;
|
|
303
|
+
}
|
|
304
|
+
/** Names of loaded extensions, in load order. */
|
|
305
|
+
names() {
|
|
306
|
+
return this.extensions.map((e) => e.name);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* A fresh dispatch context. Session-mutating actions need `command` tier. The
|
|
310
|
+
* token embeds the current epoch so it is invalidated across reloads.
|
|
311
|
+
*/
|
|
312
|
+
context(tier) {
|
|
313
|
+
return { token: `epoch-${this.epoch}`, tier };
|
|
314
|
+
}
|
|
315
|
+
/** Bump the epoch, invalidating every previously minted context token. */
|
|
316
|
+
bumpEpoch() {
|
|
317
|
+
this.epoch++;
|
|
318
|
+
}
|
|
319
|
+
/** True if any loaded extension subscribed to `event`. */
|
|
320
|
+
hasSubscriber(event) {
|
|
321
|
+
return this.extensions.some((e) => e.subscriptions.has(event));
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Fire-and-forget event fanout to every subscribed extension. Non-blocking: a
|
|
325
|
+
* slow or dead extension never stalls the caller (bounded, lossy observe lane).
|
|
326
|
+
*/
|
|
327
|
+
dispatchEvent(event, payload) {
|
|
328
|
+
if (this.extensions.length === 0)
|
|
329
|
+
return;
|
|
330
|
+
const ctx = this.context('event');
|
|
331
|
+
for (const ext of this.extensions) {
|
|
332
|
+
if (!ext.subscriptions.has(event))
|
|
333
|
+
continue;
|
|
334
|
+
ext.process.sendEvent(event, ctx, payload);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Run a hook across every extension in load order, folding the chain. Each
|
|
339
|
+
* extension sees the prior extension's patch. Fail-open/closed per hook type.
|
|
340
|
+
*/
|
|
341
|
+
async runHook(hook, input) {
|
|
342
|
+
if (this.extensions.length === 0)
|
|
343
|
+
return { kind: 'proceed', value: input };
|
|
344
|
+
const ctx = this.context('command');
|
|
345
|
+
let current = input;
|
|
346
|
+
for (const ext of this.extensions) {
|
|
347
|
+
const params = { hook, context: ctx, input: current };
|
|
348
|
+
const timeout = ext.hookTimeoutMs ?? hookDefaultTimeoutMs(hook);
|
|
349
|
+
let step;
|
|
350
|
+
try {
|
|
351
|
+
const value = await ext.process.request(method.HOOK, params, timeout);
|
|
352
|
+
try {
|
|
353
|
+
step = { kind: 'replied', outcome: parseHookOutcome(value) };
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
step = { kind: 'failed' };
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
step = { kind: 'failed' };
|
|
361
|
+
}
|
|
362
|
+
const folded = foldHookChain(hook, current, [step]);
|
|
363
|
+
if (folded.kind === 'blocked')
|
|
364
|
+
return folded;
|
|
365
|
+
current = folded.value;
|
|
366
|
+
}
|
|
367
|
+
return { kind: 'proceed', value: current };
|
|
368
|
+
}
|
|
369
|
+
/** Convenience: run the `tool_call` hook (fail-closed) on a pending call. */
|
|
370
|
+
runToolCallHook(tool, args) {
|
|
371
|
+
return this.runHook('tool_call', { tool, arguments: args });
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Run the `before_agent_start` hook on a system prompt, returning the
|
|
375
|
+
* possibly-rewritten prompt. Fail-open: a blocked/failed hook leaves it unchanged.
|
|
376
|
+
*/
|
|
377
|
+
async beforeAgentStart(systemPrompt) {
|
|
378
|
+
if (this.extensions.length === 0)
|
|
379
|
+
return systemPrompt;
|
|
380
|
+
const folded = await this.runHook('before_agent_start', { system_prompt: systemPrompt });
|
|
381
|
+
if (folded.kind === 'blocked')
|
|
382
|
+
return systemPrompt;
|
|
383
|
+
const v = folded.value?.system_prompt;
|
|
384
|
+
return typeof v === 'string' ? v : systemPrompt;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Tool proxies for every eager tool every extension registered. Names are dotted
|
|
388
|
+
* `<ext>.<tool>`. Deferred tools are returned by {@link deferredTools}.
|
|
389
|
+
*/
|
|
390
|
+
tools() {
|
|
391
|
+
return this.collectTools(false);
|
|
392
|
+
}
|
|
393
|
+
/** Deferred tool proxies. */
|
|
394
|
+
deferredTools() {
|
|
395
|
+
return this.collectTools(true);
|
|
396
|
+
}
|
|
397
|
+
collectTools(deferred) {
|
|
398
|
+
const ctx = this.context('command');
|
|
399
|
+
const out = [];
|
|
400
|
+
for (const ext of this.extensions) {
|
|
401
|
+
for (const reg of ext.init.registrations?.tools ?? []) {
|
|
402
|
+
if ((reg.deferred ?? false) !== deferred)
|
|
403
|
+
continue;
|
|
404
|
+
out.push(new ExtensionTool(ext.name, reg, ext.process, ctx));
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return out;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Eager tool proxies for a single extension, minted at the CURRENT epoch. The
|
|
411
|
+
* frontend calls this after a {@link reload} to re-register the reloaded
|
|
412
|
+
* extension's tools (its old proxies carry a stale context).
|
|
413
|
+
*/
|
|
414
|
+
toolsFor(extName) {
|
|
415
|
+
const ctx = this.context('command');
|
|
416
|
+
const ext = this.extensions.find((e) => e.name === extName);
|
|
417
|
+
if (!ext)
|
|
418
|
+
return [];
|
|
419
|
+
return (ext.init.registrations?.tools ?? []).filter((reg) => !(reg.deferred ?? false)).map((reg) => new ExtensionTool(ext.name, reg, ext.process, ctx));
|
|
420
|
+
}
|
|
421
|
+
/** Every registered slash-command across all extensions, paired with the owning extension name. */
|
|
422
|
+
commands() {
|
|
423
|
+
const out = [];
|
|
424
|
+
for (const ext of this.extensions) {
|
|
425
|
+
for (const cmd of ext.init.registrations?.commands ?? [])
|
|
426
|
+
out.push([ext.name, cmd]);
|
|
427
|
+
}
|
|
428
|
+
return out;
|
|
429
|
+
}
|
|
430
|
+
/** Every keyboard shortcut across all extensions, paired with the owning extension name. */
|
|
431
|
+
shortcuts() {
|
|
432
|
+
const out = [];
|
|
433
|
+
for (const ext of this.extensions) {
|
|
434
|
+
for (const sc of ext.init.registrations?.shortcuts ?? [])
|
|
435
|
+
out.push([ext.name, sc]);
|
|
436
|
+
}
|
|
437
|
+
return out;
|
|
438
|
+
}
|
|
439
|
+
commandOwner(extName, command) {
|
|
440
|
+
for (const ext of this.extensions) {
|
|
441
|
+
if (extName !== undefined && extName !== ext.name)
|
|
442
|
+
continue;
|
|
443
|
+
if ((ext.init.registrations?.commands ?? []).some((c) => c.name === command))
|
|
444
|
+
return ext.process;
|
|
445
|
+
}
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Dispatch a registered slash-command to its owning extension with a COMMAND-tier
|
|
450
|
+
* context. Pass `extName` to disambiguate a command registered by more than one
|
|
451
|
+
* extension; `undefined` picks the first match in load order.
|
|
452
|
+
*/
|
|
453
|
+
async runCommand(extName, command, args) {
|
|
454
|
+
const proc = this.commandOwner(extName, command);
|
|
455
|
+
if (!proc)
|
|
456
|
+
throw new RpcError(codes.MethodNotFound, `no extension registered command \`${command}\``);
|
|
457
|
+
const params = { command, context: this.context('command'), arguments: args };
|
|
458
|
+
return (await proc.request(method.COMMAND_EXECUTE, params, 120_000));
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Ask the extension that owns `command` for argument completions given the
|
|
462
|
+
* `partial` text typed so far. Returns an empty list on error (best-effort —
|
|
463
|
+
* never fail the caller's keystroke).
|
|
464
|
+
*/
|
|
465
|
+
async completeCommand(extName, command, partial) {
|
|
466
|
+
const proc = this.commandOwner(extName, command);
|
|
467
|
+
if (!proc)
|
|
468
|
+
return [];
|
|
469
|
+
const params = { command, context: this.context('command'), partial };
|
|
470
|
+
try {
|
|
471
|
+
const raw = (await proc.request(method.COMMAND_COMPLETE, params, 5_000));
|
|
472
|
+
return raw?.completions ?? [];
|
|
473
|
+
}
|
|
474
|
+
catch {
|
|
475
|
+
return [];
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Hot-reload a single extension by name: notify it (`session_shutdown` reason
|
|
480
|
+
* `reload`), bump the epoch so every context token it still holds is invalidated,
|
|
481
|
+
* respawn its subprocess (the generation guard discards any late reply), re-run
|
|
482
|
+
* `initialize`, then notify it (`session_start` reason `reload`). The caller
|
|
483
|
+
* re-registers the extension's tools via {@link toolsFor}.
|
|
484
|
+
*/
|
|
485
|
+
async reload(name) {
|
|
486
|
+
const ext = this.extensions.find((e) => e.name === name);
|
|
487
|
+
if (!ext)
|
|
488
|
+
throw new Error(`extension \`${name}\` is not loaded`);
|
|
489
|
+
ext.process.sendEvent('session_shutdown', this.context('event'), { reason: 'reload' });
|
|
490
|
+
this.bumpEpoch();
|
|
491
|
+
ext.process.respawn();
|
|
492
|
+
const init = await this.initialize(ext.process);
|
|
493
|
+
ext.subscriptions = effectiveSubscriptions(ext.declaredEvents, init.registrations?.subscriptions ?? []);
|
|
494
|
+
ext.init = init;
|
|
495
|
+
ext.process.sendEvent('session_start', this.context('event'), { reason: 'reload' });
|
|
496
|
+
}
|
|
497
|
+
/** Gracefully shut down every extension (5s grace each, then SIGKILL). */
|
|
498
|
+
async shutdownAll() {
|
|
499
|
+
await Promise.all(this.extensions.map((e) => e.process.shutdown(5_000)));
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/extension/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEP host — the engine's implementation of the Smooth Extension Protocol.
|
|
3
|
+
*
|
|
4
|
+
* An extension is a long-lived subprocess speaking JSON-RPC 2.0 over ndjson on its
|
|
5
|
+
* stdio (identical framing to MCP stdio). The canonical wire schemas live in the
|
|
6
|
+
* `smooth-operator` repo at `spec/extension/`; {@link module:protocol} is this
|
|
7
|
+
* host's typed view of that wire. The TS sibling of the Rust reference host at
|
|
8
|
+
* `rust/smooth-operator-core/src/extension/`.
|
|
9
|
+
*
|
|
10
|
+
* Purely additive: nothing here runs unless a caller builds an {@link ExtensionHost}
|
|
11
|
+
* and registers its {@link ExtensionHost.tools} into an agent. With no host built,
|
|
12
|
+
* the agent loop behaves exactly as before.
|
|
13
|
+
*/
|
|
14
|
+
export * from './protocol.js';
|
|
15
|
+
export * from './manifest.js';
|
|
16
|
+
export { backoffFor, DefaultInboundHandler, ExtensionProcess, type InboundHandler, OBSERVE_QUEUE_CAP, PING_IDLE_MS, RESTART_BACKOFFS_MS, type SpawnSpec, } from './process.js';
|
|
17
|
+
export { DefaultHostDelegate, effectiveSubscriptions, ExtensionHost, foldHookChain, type FoldedHook, hookDefaultTimeoutMs, hookFailClosed, type HostDelegate, type HookStep, type HookType, hookTypeFromName, type LoadFailure, validateCommandContext, } from './host.js';
|
|
18
|
+
export { ExtensionTool, TOOL_EXECUTE_TIMEOUT_MS } from './tool_proxy.js';
|
|
19
|
+
/**
|
|
20
|
+
* Canonical SEP event names the host dispatches to subscribed extensions. A
|
|
21
|
+
* stringly-typed name is the wire contract; the engine's own event producers map
|
|
22
|
+
* onto these.
|
|
23
|
+
*/
|
|
24
|
+
export declare const events: {
|
|
25
|
+
readonly TURN_START: "turn_start";
|
|
26
|
+
readonly TURN_END: "turn_end";
|
|
27
|
+
readonly MESSAGE_START: "message_start";
|
|
28
|
+
readonly MESSAGE_UPDATE: "message_update";
|
|
29
|
+
readonly MESSAGE_END: "message_end";
|
|
30
|
+
readonly TOOL_EXECUTION_START: "tool_execution_start";
|
|
31
|
+
readonly TOOL_EXECUTION_UPDATE: "tool_execution_update";
|
|
32
|
+
readonly TOOL_EXECUTION_END: "tool_execution_end";
|
|
33
|
+
/** Delivered when the bounded observe queue shed events. Carries `{lost: N}`. */
|
|
34
|
+
readonly EVENTS_LOST: "events_lost";
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extension/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,OAAO,EACH,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,cAAc,EACnB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,KAAK,SAAS,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,KAAK,UAAU,EACf,oBAAoB,EACpB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,gBAAgB,EAChB,KAAK,WAAW,EAChB,sBAAsB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAEzE;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;;;;;;;IAUf,iFAAiF;;CAE3E,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEP host — the engine's implementation of the Smooth Extension Protocol.
|
|
3
|
+
*
|
|
4
|
+
* An extension is a long-lived subprocess speaking JSON-RPC 2.0 over ndjson on its
|
|
5
|
+
* stdio (identical framing to MCP stdio). The canonical wire schemas live in the
|
|
6
|
+
* `smooth-operator` repo at `spec/extension/`; {@link module:protocol} is this
|
|
7
|
+
* host's typed view of that wire. The TS sibling of the Rust reference host at
|
|
8
|
+
* `rust/smooth-operator-core/src/extension/`.
|
|
9
|
+
*
|
|
10
|
+
* Purely additive: nothing here runs unless a caller builds an {@link ExtensionHost}
|
|
11
|
+
* and registers its {@link ExtensionHost.tools} into an agent. With no host built,
|
|
12
|
+
* the agent loop behaves exactly as before.
|
|
13
|
+
*/
|
|
14
|
+
export * from './protocol.js';
|
|
15
|
+
export * from './manifest.js';
|
|
16
|
+
export { backoffFor, DefaultInboundHandler, ExtensionProcess, OBSERVE_QUEUE_CAP, PING_IDLE_MS, RESTART_BACKOFFS_MS, } from './process.js';
|
|
17
|
+
export { DefaultHostDelegate, effectiveSubscriptions, ExtensionHost, foldHookChain, hookDefaultTimeoutMs, hookFailClosed, hookTypeFromName, validateCommandContext, } from './host.js';
|
|
18
|
+
export { ExtensionTool, TOOL_EXECUTE_TIMEOUT_MS } from './tool_proxy.js';
|
|
19
|
+
/**
|
|
20
|
+
* Canonical SEP event names the host dispatches to subscribed extensions. A
|
|
21
|
+
* stringly-typed name is the wire contract; the engine's own event producers map
|
|
22
|
+
* onto these.
|
|
23
|
+
*/
|
|
24
|
+
export const events = {
|
|
25
|
+
TURN_START: 'turn_start',
|
|
26
|
+
TURN_END: 'turn_end',
|
|
27
|
+
MESSAGE_START: 'message_start',
|
|
28
|
+
MESSAGE_UPDATE: 'message_update',
|
|
29
|
+
MESSAGE_END: 'message_end',
|
|
30
|
+
// Names mirror pi's `tool_execution_*` so pi extensions port unchanged.
|
|
31
|
+
TOOL_EXECUTION_START: 'tool_execution_start',
|
|
32
|
+
TOOL_EXECUTION_UPDATE: 'tool_execution_update',
|
|
33
|
+
TOOL_EXECUTION_END: 'tool_execution_end',
|
|
34
|
+
/** Delivered when the bounded observe queue shed events. Carries `{lost: N}`. */
|
|
35
|
+
EVENTS_LOST: 'events_lost',
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extension/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,OAAO,EACH,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAEhB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,GAEtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,aAAa,EAEb,oBAAoB,EACpB,cAAc,EAId,gBAAgB,EAEhB,sBAAsB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAEzE;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAC1B,wEAAwE;IACxE,oBAAoB,EAAE,sBAAsB;IAC5C,qBAAqB,EAAE,uBAAuB;IAC9C,kBAAkB,EAAE,oBAAoB;IACxC,iFAAiF;IACjF,WAAW,EAAE,aAAa;CACpB,CAAC"}
|