@omnitype-code/adapter-sdk 2.0.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/README.md +163 -0
- package/dist/adapters/filesystem-only.d.ts +30 -0
- package/dist/adapters/filesystem-only.d.ts.map +1 -0
- package/dist/adapters/filesystem-only.js +115 -0
- package/dist/adapters/filesystem-only.js.map +1 -0
- package/dist/adapters/hook-poller.d.ts +40 -0
- package/dist/adapters/hook-poller.d.ts.map +1 -0
- package/dist/adapters/hook-poller.js +125 -0
- package/dist/adapters/hook-poller.js.map +1 -0
- package/dist/adapters/index.d.ts +34 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +61 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/stdin-json-hook-tool.d.ts +87 -0
- package/dist/adapters/stdin-json-hook-tool.d.ts.map +1 -0
- package/dist/adapters/stdin-json-hook-tool.js +491 -0
- package/dist/adapters/stdin-json-hook-tool.js.map +1 -0
- package/dist/adapters/transcript-scavenger.d.ts +40 -0
- package/dist/adapters/transcript-scavenger.d.ts.map +1 -0
- package/dist/adapters/transcript-scavenger.js +569 -0
- package/dist/adapters/transcript-scavenger.js.map +1 -0
- package/dist/classifier.d.ts +132 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +95 -0
- package/dist/classifier.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +51 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +352 -0
- package/dist/loader.js.map +1 -0
- package/dist/manifest.d.ts +131 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +12 -0
- package/dist/manifest.js.map +1 -0
- package/dist/normalize.d.ts +51 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +122 -0
- package/dist/normalize.js.map +1 -0
- package/dist/tier.d.ts +12 -0
- package/dist/tier.d.ts.map +1 -0
- package/dist/tier.js +62 -0
- package/dist/tier.js.map +1 -0
- package/package.json +36 -0
package/dist/loader.js
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter loader — daemon-side.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* 1. Discover adapters from the catalog directories.
|
|
6
|
+
* 2. Load and validate manifests.
|
|
7
|
+
* 3. Spawn co-process adapters, manage their lifecycle.
|
|
8
|
+
* 4. Validate incoming events (HMAC, capability gating, seq monotonicity).
|
|
9
|
+
* 5. Forward valid events to the Journal via the provided emit callback.
|
|
10
|
+
*
|
|
11
|
+
* Each co-process adapter communicates over stdin/stdout (stdin-json protocol).
|
|
12
|
+
* The loader sends ControlMsg, receives EventMsg | ReplyMsg.
|
|
13
|
+
*/
|
|
14
|
+
import { spawn } from 'node:child_process';
|
|
15
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
16
|
+
import { join, resolve } from 'node:path';
|
|
17
|
+
import { createHmac, randomBytes, createVerify } from 'node:crypto';
|
|
18
|
+
import { homedir } from 'node:os';
|
|
19
|
+
// ─── Trust root certificate (Day 9: §3.1) ────────────────────────────────────
|
|
20
|
+
// The OmniType trust root Ed25519 public key is embedded here.
|
|
21
|
+
// First-party adapters are signed by this key; community adapters require explicit opt-in.
|
|
22
|
+
// In strict mode, unsigned community manifests are rejected at load time.
|
|
23
|
+
const TRUST_ROOT_PEM = `-----BEGIN PUBLIC KEY-----
|
|
24
|
+
MCowBQYDK2VwAyEA+V5yQv1S3nHLG4OUJBPh0UhSZDMaD5FwVPeVoN/XXTM=
|
|
25
|
+
-----END PUBLIC KEY-----`;
|
|
26
|
+
function verifyManifestSignature(manifest) {
|
|
27
|
+
const raw = manifest;
|
|
28
|
+
const signature = raw['signature'];
|
|
29
|
+
const { signature: _sig, ...rest } = raw;
|
|
30
|
+
if (!signature)
|
|
31
|
+
return false;
|
|
32
|
+
try {
|
|
33
|
+
const canonical = Buffer.from(JSON.stringify(Object.fromEntries(Object.entries(rest).sort(([a], [b]) => a.localeCompare(b)))), 'utf-8');
|
|
34
|
+
const verifier = createVerify('SHA256');
|
|
35
|
+
verifier.update(canonical);
|
|
36
|
+
return verifier.verify(TRUST_ROOT_PEM, Buffer.from(signature, 'base64'));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Standard catalog search paths (in priority order)
|
|
43
|
+
function catalogPaths(workspace) {
|
|
44
|
+
return [
|
|
45
|
+
join(workspace, '.omnitype', 'adapters'),
|
|
46
|
+
join(homedir(), '.omnitype', 'adapters'),
|
|
47
|
+
join(new URL('.', import.meta.url).pathname, '..', '..', 'adapters', 'builtin'),
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
export class AdapterLoader {
|
|
51
|
+
instances = new Map();
|
|
52
|
+
emit;
|
|
53
|
+
installKey;
|
|
54
|
+
workspace;
|
|
55
|
+
trustMode;
|
|
56
|
+
constructor(emit, installKey, workspace, trustMode = 'permissive') {
|
|
57
|
+
this.emit = emit;
|
|
58
|
+
this.installKey = installKey;
|
|
59
|
+
this.workspace = workspace;
|
|
60
|
+
this.trustMode = trustMode;
|
|
61
|
+
}
|
|
62
|
+
// ─── Discovery & loading ─────────────────────────────────────────────────
|
|
63
|
+
loadAll() {
|
|
64
|
+
for (const dir of catalogPaths(this.workspace)) {
|
|
65
|
+
if (!existsSync(dir))
|
|
66
|
+
continue;
|
|
67
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
68
|
+
if (!entry.isDirectory())
|
|
69
|
+
continue;
|
|
70
|
+
const manifestPath = join(dir, entry.name, 'manifest.json');
|
|
71
|
+
if (!existsSync(manifestPath))
|
|
72
|
+
continue;
|
|
73
|
+
try {
|
|
74
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
75
|
+
this.loadAdapter(manifest, join(dir, entry.name));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error(`[adapter-loader] failed to load ${entry.name}:`, err);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
loadAdapter(manifest, adapterDir) {
|
|
84
|
+
if (this.instances.has(manifest.adapter_id))
|
|
85
|
+
return; // already loaded
|
|
86
|
+
// Day 9 (§3.1): verify manifest signature against trust root
|
|
87
|
+
const sigVerified = verifyManifestSignature(manifest);
|
|
88
|
+
const isCommunity = manifest.trust.trust_circle > 2;
|
|
89
|
+
if (isCommunity && !sigVerified) {
|
|
90
|
+
if (this.trustMode === 'strict') {
|
|
91
|
+
console.error(`[adapter-loader] REJECT ${manifest.adapter_id}: community adapter with unverified signature (strict mode)`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
console.warn(`[adapter-loader] WARN ${manifest.adapter_id}: community adapter loaded without verified signature — capabilities capped at T2`);
|
|
95
|
+
}
|
|
96
|
+
const subkey = this.deriveSubkey(manifest.adapter_id);
|
|
97
|
+
const caps = new Map();
|
|
98
|
+
// Seed caps from declared capabilities (assume available until negotiation proves otherwise)
|
|
99
|
+
for (const cap of manifest.declared_capabilities) {
|
|
100
|
+
caps.set(cap, { status: 'available', reason: 'declared', expected_freshness_ms: 1000, expected_loss_rate: 0 });
|
|
101
|
+
}
|
|
102
|
+
const instance = {
|
|
103
|
+
manifest,
|
|
104
|
+
process: null,
|
|
105
|
+
subkey,
|
|
106
|
+
adapterSeq: -1,
|
|
107
|
+
caps,
|
|
108
|
+
healthy: false,
|
|
109
|
+
buf: '',
|
|
110
|
+
};
|
|
111
|
+
this.instances.set(manifest.adapter_id, instance);
|
|
112
|
+
if (manifest.runtime.mode === 'co-process' && manifest.runtime.entry) {
|
|
113
|
+
this.spawnAdapter(instance, join(adapterDir, manifest.runtime.entry));
|
|
114
|
+
}
|
|
115
|
+
else if (manifest.runtime.mode === 'out-of-process' && manifest.runtime.entry) {
|
|
116
|
+
this.spawnAdapter(instance, resolve(adapterDir, manifest.runtime.entry));
|
|
117
|
+
}
|
|
118
|
+
// in-process adapters are initialized by the tool itself calling the agent-sdk
|
|
119
|
+
}
|
|
120
|
+
// ─── Co-process lifecycle ────────────────────────────────────────────────
|
|
121
|
+
spawnAdapter(instance, entryPath) {
|
|
122
|
+
if (!existsSync(entryPath)) {
|
|
123
|
+
console.error(`[adapter-loader] entry not found: ${entryPath}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Day 17 (§3.2): sandbox co-process adapters to prevent install-key access.
|
|
127
|
+
// macOS: sandbox-exec with a deny-all profile that allows only stdio + workspace dir.
|
|
128
|
+
// Linux: seccomp stub (process isolation via Node --experimental-vm-modules in future).
|
|
129
|
+
// Windows: AppContainer stub — spawns as restricted user (future work).
|
|
130
|
+
const [cmd, args] = this.buildSandboxedCommand(entryPath, instance.manifest.adapter_id);
|
|
131
|
+
const child = spawn(cmd, args, {
|
|
132
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
133
|
+
env: {
|
|
134
|
+
...process.env,
|
|
135
|
+
OMNITYPE_WORKSPACE: this.workspace,
|
|
136
|
+
// Explicitly remove key material from adapter environment
|
|
137
|
+
OMNITYPE_INSTALL_KEY: undefined,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
instance.process = child;
|
|
141
|
+
child.stdout?.on('data', (chunk) => {
|
|
142
|
+
instance.buf += chunk.toString('utf-8');
|
|
143
|
+
const lines = instance.buf.split('\n');
|
|
144
|
+
instance.buf = lines.pop() ?? '';
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
if (line.trim())
|
|
147
|
+
this.handleAdapterLine(instance, line);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
child.stderr?.on('data', (chunk) => {
|
|
151
|
+
console.error(`[${instance.manifest.adapter_id}]`, chunk.toString('utf-8').trimEnd());
|
|
152
|
+
});
|
|
153
|
+
child.on('exit', (code) => {
|
|
154
|
+
instance.healthy = false;
|
|
155
|
+
console.error(`[adapter-loader] ${instance.manifest.adapter_id} exited (code ${code})`);
|
|
156
|
+
});
|
|
157
|
+
// Negotiate
|
|
158
|
+
this.sendControl(instance, 'negotiate', {
|
|
159
|
+
os: process.platform === 'darwin' ? 'darwin' : process.platform === 'win32' ? 'windows' : 'linux',
|
|
160
|
+
workspace: this.workspace,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
sendControl(instance, type, payload) {
|
|
164
|
+
const msg = JSON.stringify({ v: 1, type, id: randomBytes(4).toString('hex'), payload }) + '\n';
|
|
165
|
+
instance.process?.stdin?.write(msg);
|
|
166
|
+
}
|
|
167
|
+
// ─── Event ingestion (from co-process adapter) ───────────────────────────
|
|
168
|
+
handleAdapterLine(instance, line) {
|
|
169
|
+
let msg;
|
|
170
|
+
try {
|
|
171
|
+
msg = JSON.parse(line);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (msg['type'] === 'reply') {
|
|
177
|
+
this.handleReply(instance, msg);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (msg['type'] === 'event') {
|
|
181
|
+
this.handleEventMsg(instance, msg);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
handleReply(instance, msg) {
|
|
185
|
+
// Replies always carry an id (correlation handle); we only act on the payload.
|
|
186
|
+
// A negotiate reply carries { capabilities: {...} }; any other reply is informational.
|
|
187
|
+
const payload = msg['payload'];
|
|
188
|
+
const caps = payload?.['capabilities'];
|
|
189
|
+
if (!caps)
|
|
190
|
+
return;
|
|
191
|
+
for (const [cap, status] of Object.entries(caps)) {
|
|
192
|
+
instance.caps.set(cap, {
|
|
193
|
+
status: status,
|
|
194
|
+
reason: 'negotiated',
|
|
195
|
+
expected_freshness_ms: 1000,
|
|
196
|
+
expected_loss_rate: 0,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
instance.healthy = true;
|
|
200
|
+
this.sendControl(instance, 'start');
|
|
201
|
+
}
|
|
202
|
+
handleEventMsg(instance, msg) {
|
|
203
|
+
const events = msg['events'];
|
|
204
|
+
const adapterSeq = msg['adapter_seq'];
|
|
205
|
+
const sig = msg['sig'];
|
|
206
|
+
if (!events || adapterSeq === undefined || !sig)
|
|
207
|
+
return;
|
|
208
|
+
// Validate monotonic seq
|
|
209
|
+
if (adapterSeq <= instance.adapterSeq) {
|
|
210
|
+
console.error(`[adapter-loader] replay detected from ${instance.manifest.adapter_id}: seq ${adapterSeq} <= ${instance.adapterSeq}`);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
instance.adapterSeq = adapterSeq;
|
|
214
|
+
// Validate HMAC
|
|
215
|
+
const payload = JSON.stringify(events) + String(adapterSeq);
|
|
216
|
+
const expected = createHmac('sha256', instance.subkey).update(payload).digest('hex');
|
|
217
|
+
if (expected !== sig) {
|
|
218
|
+
console.error(`[adapter-loader] HMAC mismatch from ${instance.manifest.adapter_id}`);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
// Compute tier from negotiated capabilities
|
|
222
|
+
const tier = this.tierForInstance(instance);
|
|
223
|
+
// Forward each event
|
|
224
|
+
for (const raw of events) {
|
|
225
|
+
const actor = raw['actor'];
|
|
226
|
+
const body = raw['body'];
|
|
227
|
+
if (!actor || !body)
|
|
228
|
+
continue;
|
|
229
|
+
// Capability gate: reject events the adapter isn't allowed to produce
|
|
230
|
+
if (!this.isEventAllowed(instance, body.type)) {
|
|
231
|
+
console.error(`[adapter-loader] ${instance.manifest.adapter_id} emitted disallowed event type: ${body.type}`);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
this.emit(actor, body, tier, instance.manifest.adapter_id);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
isEventAllowed(instance, eventType) {
|
|
238
|
+
// EditOp requires operation.editOp capability
|
|
239
|
+
if (eventType === 'EditOp') {
|
|
240
|
+
const cap = instance.caps.get('operation.editOp');
|
|
241
|
+
return cap?.status === 'available';
|
|
242
|
+
}
|
|
243
|
+
// PromptCapture with text requires prompt.visible
|
|
244
|
+
if (eventType === 'PromptCapture') {
|
|
245
|
+
const cap = instance.caps.get('prompt.visible');
|
|
246
|
+
return cap?.status === 'available';
|
|
247
|
+
}
|
|
248
|
+
return true; // other event types pass through
|
|
249
|
+
}
|
|
250
|
+
tierForInstance(instance) {
|
|
251
|
+
// Import tier computation inline to avoid circular deps
|
|
252
|
+
const circle = instance.manifest.trust.trust_circle;
|
|
253
|
+
const hasSigned = instance.caps.get('integrity.signed_events')?.status === 'available';
|
|
254
|
+
const hasInProcess = instance.caps.get('integrity.in_process')?.status === 'available';
|
|
255
|
+
const hasEditExact = instance.caps.get('operation.editOp.exact')?.status === 'available';
|
|
256
|
+
const hasAncestry = instance.caps.get('attest.process_ancestry')?.status === 'available';
|
|
257
|
+
const hasHook = instance.caps.get('hook.preToolUse')?.status === 'available';
|
|
258
|
+
let score = 0;
|
|
259
|
+
if (hasInProcess)
|
|
260
|
+
score += 40;
|
|
261
|
+
if (hasSigned)
|
|
262
|
+
score += 30;
|
|
263
|
+
if (hasEditExact)
|
|
264
|
+
score += 15;
|
|
265
|
+
if (hasAncestry)
|
|
266
|
+
score += 10;
|
|
267
|
+
if (hasHook)
|
|
268
|
+
score += 5;
|
|
269
|
+
const raw = score >= 80 && hasInProcess && circle <= 2 ? 'T0'
|
|
270
|
+
: score >= 60 ? 'T1'
|
|
271
|
+
: score >= 30 ? 'T2'
|
|
272
|
+
: 'T3';
|
|
273
|
+
const ceilings = ['T0', 'T1', 'T2', 'T3'];
|
|
274
|
+
const ceilingIdx = Math.min(circle - 1, 3);
|
|
275
|
+
const rawIdx = ceilings.indexOf(raw);
|
|
276
|
+
return rawIdx >= ceilingIdx ? raw : ceilings[ceilingIdx];
|
|
277
|
+
}
|
|
278
|
+
// ─── Direct emission (for built-in adapters that run in-process) ─────────
|
|
279
|
+
/** Built-in adapters call this instead of going through IPC */
|
|
280
|
+
emitDirect(actor, body, tier, adapterId) {
|
|
281
|
+
this.emit(actor, body, tier, adapterId);
|
|
282
|
+
}
|
|
283
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
284
|
+
/**
|
|
285
|
+
* Build a sandboxed command for spawning adapter co-processes. (Day 17: §3.2)
|
|
286
|
+
* Returns [executable, args] ready to pass to spawn().
|
|
287
|
+
*/
|
|
288
|
+
buildSandboxedCommand(entryPath, adapterId) {
|
|
289
|
+
const nodeArgs = [entryPath];
|
|
290
|
+
if (process.platform === 'darwin') {
|
|
291
|
+
// macOS sandbox-exec: deny-all profile, then allow read on workspace + /usr/local/lib
|
|
292
|
+
// This blocks access to ~/.omnitype/journal/keys/ which contains the install key.
|
|
293
|
+
const profile = [
|
|
294
|
+
'(version 1)',
|
|
295
|
+
'(deny default)',
|
|
296
|
+
'(allow process-exec)',
|
|
297
|
+
'(allow process-fork)',
|
|
298
|
+
`(allow file-read* (subpath "${this.workspace}"))`,
|
|
299
|
+
'(allow file-read* (subpath "/usr/local/lib"))',
|
|
300
|
+
'(allow file-read* (subpath "/usr/lib"))',
|
|
301
|
+
`(allow file-read* (subpath "${process.execPath.replace(/\/node$/, '')}"))`,
|
|
302
|
+
'(allow network-inbound)',
|
|
303
|
+
'(allow network-outbound)',
|
|
304
|
+
'(allow sysctl-read)',
|
|
305
|
+
'(allow signal (target self))',
|
|
306
|
+
].join('\n');
|
|
307
|
+
return ['sandbox-exec', ['-p', profile, process.execPath, ...nodeArgs]];
|
|
308
|
+
}
|
|
309
|
+
if (process.platform === 'linux') {
|
|
310
|
+
// Linux: use unshare for namespace isolation if available, otherwise plain spawn.
|
|
311
|
+
// Full seccomp-bpf filter is a future hardening step.
|
|
312
|
+
try {
|
|
313
|
+
const { execFileSync } = require('node:child_process');
|
|
314
|
+
execFileSync('which', ['unshare'], { stdio: 'pipe' });
|
|
315
|
+
return ['unshare', ['--user', '--map-root-user', process.execPath, ...nodeArgs]];
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
console.warn(`[adapter-loader] ${adapterId}: sandbox unavailable on this Linux (no unshare); running unsandboxed`);
|
|
319
|
+
return [process.execPath, nodeArgs];
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Windows and fallback: no sandbox yet (AppContainer requires manifest embedding)
|
|
323
|
+
if (process.platform === 'win32') {
|
|
324
|
+
console.warn(`[adapter-loader] ${adapterId}: Windows AppContainer sandbox not yet implemented; running unsandboxed`);
|
|
325
|
+
}
|
|
326
|
+
return [process.execPath, nodeArgs];
|
|
327
|
+
}
|
|
328
|
+
deriveSubkey(adapterId) {
|
|
329
|
+
return createHmac('sha256', this.installKey)
|
|
330
|
+
.update(`adapter-subkey:${adapterId}`)
|
|
331
|
+
.digest();
|
|
332
|
+
}
|
|
333
|
+
stopAll() {
|
|
334
|
+
for (const [, instance] of this.instances) {
|
|
335
|
+
if (instance.process) {
|
|
336
|
+
try {
|
|
337
|
+
instance.process.kill('SIGTERM');
|
|
338
|
+
}
|
|
339
|
+
catch { /* ignore */ }
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
this.instances.clear();
|
|
343
|
+
}
|
|
344
|
+
getStatus() {
|
|
345
|
+
return [...this.instances.entries()].map(([id, inst]) => ({
|
|
346
|
+
id,
|
|
347
|
+
healthy: inst.healthy,
|
|
348
|
+
mode: inst.manifest.runtime.mode,
|
|
349
|
+
}));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter manifest schema (v1).
|
|
3
|
+
*
|
|
4
|
+
* A manifest is the contract between an adapter and the OmniType daemon.
|
|
5
|
+
* Capability declarations here are *claims* — the daemon verifies them
|
|
6
|
+
* at runtime during negotiate() and downgrades if they don't hold.
|
|
7
|
+
*
|
|
8
|
+
* Design rule: per-tool knowledge lives in manifests, NOT in daemon code.
|
|
9
|
+
* The daemon contains zero `if (tool === "cursor")` branches.
|
|
10
|
+
*/
|
|
11
|
+
export type CapabilityId = 'tool.identity' | 'tool.process_tracking' | 'tool.version' | 'session.id' | 'session.id.synthesized' | 'session.parent' | 'session.transcript_anchor' | 'session.scope.tool-call' | 'session.scope.conversation' | 'prompt.visible' | 'prompt.visible.realtime' | 'prompt.hash_only' | 'prompt.scrubbing.local' | 'model.visible' | 'model.visible.per_call' | 'model.version_pinned' | 'model.switch_observable' | 'hook.preToolUse' | 'hook.postToolUse' | 'operation.editOp' | 'operation.editOp.exact' | 'operation.preHash_postHash' | 'write.intercept' | 'streaming.visible' | 'txn.boundaries' | 'editor.context' | 'editor.context.via_vscode' | 'cwd.authoritative' | 'clipboard.snapshot' | 'attest.process_ancestry' | 'attest.binary_signature' | 'attest.network_origin' | 'integrity.signed_events' | 'integrity.in_process' | 'integrity.replay_protected';
|
|
12
|
+
export type AdapterMode = 'in-process' | 'co-process' | 'out-of-process';
|
|
13
|
+
export type IpcProtocol = 'stdin-json' | 'uds-cbor' | 'none';
|
|
14
|
+
export type CertificationLevel = 'community' | 'verified' | 'first-party';
|
|
15
|
+
export type TrustCircle = 1 | 2 | 3 | 4;
|
|
16
|
+
export type DetectionRule = {
|
|
17
|
+
kind: 'binary';
|
|
18
|
+
paths: string[];
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'directory';
|
|
21
|
+
paths: string[];
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'file';
|
|
24
|
+
paths: string[];
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'env';
|
|
27
|
+
variable: string;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'vscode_extension';
|
|
30
|
+
ids: string[];
|
|
31
|
+
} | {
|
|
32
|
+
kind: 'process_name';
|
|
33
|
+
names: string[];
|
|
34
|
+
};
|
|
35
|
+
export interface NormalizeRule {
|
|
36
|
+
match: {
|
|
37
|
+
type: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
};
|
|
41
|
+
emit: {
|
|
42
|
+
type: string;
|
|
43
|
+
mapping: Record<string, string | {
|
|
44
|
+
from_string: unknown;
|
|
45
|
+
} | {
|
|
46
|
+
literal: unknown;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export interface AdapterManifest {
|
|
51
|
+
schema_version: 1;
|
|
52
|
+
adapter_id: string;
|
|
53
|
+
adapter_version: string;
|
|
54
|
+
display_name: string;
|
|
55
|
+
target_tool: {
|
|
56
|
+
id: string;
|
|
57
|
+
detection: DetectionRule[];
|
|
58
|
+
};
|
|
59
|
+
declared_capabilities: CapabilityId[];
|
|
60
|
+
runtime: {
|
|
61
|
+
mode: AdapterMode;
|
|
62
|
+
entry?: string;
|
|
63
|
+
ipc: IpcProtocol;
|
|
64
|
+
language?: string;
|
|
65
|
+
};
|
|
66
|
+
trust: {
|
|
67
|
+
signed_by?: string;
|
|
68
|
+
certification: CertificationLevel;
|
|
69
|
+
trust_circle: TrustCircle;
|
|
70
|
+
};
|
|
71
|
+
permissions_required?: string[];
|
|
72
|
+
configurable?: Record<string, {
|
|
73
|
+
default: unknown;
|
|
74
|
+
min?: unknown;
|
|
75
|
+
max?: unknown;
|
|
76
|
+
description?: string;
|
|
77
|
+
}>;
|
|
78
|
+
sla?: {
|
|
79
|
+
declared_event_latency_p99_ms: number;
|
|
80
|
+
declared_max_lost_events_per_hour: number;
|
|
81
|
+
};
|
|
82
|
+
normalize?: NormalizeRule[];
|
|
83
|
+
extends?: string;
|
|
84
|
+
overrides?: Record<string, unknown>;
|
|
85
|
+
}
|
|
86
|
+
export interface RuntimeEnv {
|
|
87
|
+
os: 'darwin' | 'linux' | 'windows' | 'wsl';
|
|
88
|
+
os_version: string;
|
|
89
|
+
is_remote: boolean;
|
|
90
|
+
has_proc_introspection: boolean;
|
|
91
|
+
vscode_present: boolean;
|
|
92
|
+
vscode_version?: string;
|
|
93
|
+
user_uid: number;
|
|
94
|
+
installed_tools: string[];
|
|
95
|
+
}
|
|
96
|
+
export type CapabilityStatus = 'available' | 'degraded' | 'unavailable';
|
|
97
|
+
export interface CapabilityEvidence {
|
|
98
|
+
status: CapabilityStatus;
|
|
99
|
+
reason: string;
|
|
100
|
+
expected_freshness_ms: number;
|
|
101
|
+
expected_loss_rate: number;
|
|
102
|
+
}
|
|
103
|
+
export type CapabilitySet = Map<CapabilityId, CapabilityEvidence>;
|
|
104
|
+
export interface ProbeResult {
|
|
105
|
+
healthy: boolean;
|
|
106
|
+
detail?: string;
|
|
107
|
+
latency_ms?: number;
|
|
108
|
+
}
|
|
109
|
+
export interface ControlMsg {
|
|
110
|
+
v: 1;
|
|
111
|
+
type: 'negotiate' | 'start' | 'stop' | 'probe' | 'attest' | 'resolve_session';
|
|
112
|
+
id: string;
|
|
113
|
+
payload?: unknown;
|
|
114
|
+
}
|
|
115
|
+
export interface EventMsg {
|
|
116
|
+
v: 1;
|
|
117
|
+
type: 'event';
|
|
118
|
+
events: unknown[];
|
|
119
|
+
adapter_seq: number;
|
|
120
|
+
sig: string;
|
|
121
|
+
}
|
|
122
|
+
export interface ReplyMsg {
|
|
123
|
+
v: 1;
|
|
124
|
+
type: 'reply';
|
|
125
|
+
id: string;
|
|
126
|
+
ok: boolean;
|
|
127
|
+
payload?: unknown;
|
|
128
|
+
error?: string;
|
|
129
|
+
}
|
|
130
|
+
export type WireMsg = ControlMsg | EventMsg | ReplyMsg;
|
|
131
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter manifest schema (v1).
|
|
3
|
+
*
|
|
4
|
+
* A manifest is the contract between an adapter and the OmniType daemon.
|
|
5
|
+
* Capability declarations here are *claims* — the daemon verifies them
|
|
6
|
+
* at runtime during negotiate() and downgrades if they don't hold.
|
|
7
|
+
*
|
|
8
|
+
* Design rule: per-tool knowledge lives in manifests, NOT in daemon code.
|
|
9
|
+
* The daemon contains zero `if (tool === "cursor")` branches.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize-spec interpreter.
|
|
3
|
+
*
|
|
4
|
+
* Adapters declare `normalize` rules in their manifest. This interpreter
|
|
5
|
+
* runs those rules against raw tool-native payloads and produces canonical events.
|
|
6
|
+
*
|
|
7
|
+
* Mapping value types:
|
|
8
|
+
* "$.field.path" — JSONPath-style extraction from raw payload
|
|
9
|
+
* { literal: value } — constant value
|
|
10
|
+
* { from_string: ... } — build a Splice from string content
|
|
11
|
+
*
|
|
12
|
+
* This keeps community adapters reviewable (no arbitrary code), and lets
|
|
13
|
+
* the daemon handle new tools without a code release — just a manifest update.
|
|
14
|
+
*/
|
|
15
|
+
import type { NormalizeRule } from './manifest.js';
|
|
16
|
+
import type { EventBody, Splice } from '@omnitype-code/journal';
|
|
17
|
+
export declare function applyNormalize(rules: NormalizeRule[], raw: Record<string, unknown>): EventBody[];
|
|
18
|
+
export interface HookPayload {
|
|
19
|
+
tool_name?: string;
|
|
20
|
+
tool_input?: {
|
|
21
|
+
path?: string;
|
|
22
|
+
file_path?: string;
|
|
23
|
+
content?: string;
|
|
24
|
+
new_content?: string;
|
|
25
|
+
old_content?: string;
|
|
26
|
+
};
|
|
27
|
+
session_id?: string;
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
model?: string;
|
|
30
|
+
toolCall?: {
|
|
31
|
+
name?: string;
|
|
32
|
+
args?: {
|
|
33
|
+
TargetFile?: string;
|
|
34
|
+
CodeContent?: string;
|
|
35
|
+
ReplacementContent?: string;
|
|
36
|
+
TargetContent?: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
conversationId?: string;
|
|
40
|
+
transcriptPath?: string;
|
|
41
|
+
workspacePaths?: string[];
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
export declare function hookPayloadToSessionEvent(payload: HookPayload, tool: string): {
|
|
45
|
+
session_id: string;
|
|
46
|
+
model: string;
|
|
47
|
+
} | null;
|
|
48
|
+
export declare function hookPayloadToFilePath(payload: HookPayload): string | null;
|
|
49
|
+
export declare function hookPayloadToSplices(payload: HookPayload): Splice[];
|
|
50
|
+
export declare function isWriteToolCall(toolName: string | undefined): boolean;
|
|
51
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EAAE,EACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,SAAS,EAAE,CAQb;AAqED,MAAM,WAAW,WAAW;IAE1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE;YACL,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;YAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,GACX;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAM9C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CASzE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE,CAMnE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQrE"}
|