@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.
Files changed (46) hide show
  1. package/README.md +163 -0
  2. package/dist/adapters/filesystem-only.d.ts +30 -0
  3. package/dist/adapters/filesystem-only.d.ts.map +1 -0
  4. package/dist/adapters/filesystem-only.js +115 -0
  5. package/dist/adapters/filesystem-only.js.map +1 -0
  6. package/dist/adapters/hook-poller.d.ts +40 -0
  7. package/dist/adapters/hook-poller.d.ts.map +1 -0
  8. package/dist/adapters/hook-poller.js +125 -0
  9. package/dist/adapters/hook-poller.js.map +1 -0
  10. package/dist/adapters/index.d.ts +34 -0
  11. package/dist/adapters/index.d.ts.map +1 -0
  12. package/dist/adapters/index.js +61 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/adapters/stdin-json-hook-tool.d.ts +87 -0
  15. package/dist/adapters/stdin-json-hook-tool.d.ts.map +1 -0
  16. package/dist/adapters/stdin-json-hook-tool.js +491 -0
  17. package/dist/adapters/stdin-json-hook-tool.js.map +1 -0
  18. package/dist/adapters/transcript-scavenger.d.ts +40 -0
  19. package/dist/adapters/transcript-scavenger.d.ts.map +1 -0
  20. package/dist/adapters/transcript-scavenger.js +569 -0
  21. package/dist/adapters/transcript-scavenger.js.map +1 -0
  22. package/dist/classifier.d.ts +132 -0
  23. package/dist/classifier.d.ts.map +1 -0
  24. package/dist/classifier.js +95 -0
  25. package/dist/classifier.js.map +1 -0
  26. package/dist/index.d.ts +8 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +8 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/loader.d.ts +51 -0
  31. package/dist/loader.d.ts.map +1 -0
  32. package/dist/loader.js +352 -0
  33. package/dist/loader.js.map +1 -0
  34. package/dist/manifest.d.ts +131 -0
  35. package/dist/manifest.d.ts.map +1 -0
  36. package/dist/manifest.js +12 -0
  37. package/dist/manifest.js.map +1 -0
  38. package/dist/normalize.d.ts +51 -0
  39. package/dist/normalize.d.ts.map +1 -0
  40. package/dist/normalize.js +122 -0
  41. package/dist/normalize.js.map +1 -0
  42. package/dist/tier.d.ts +12 -0
  43. package/dist/tier.d.ts.map +1 -0
  44. package/dist/tier.js +62 -0
  45. package/dist/tier.js.map +1 -0
  46. 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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"}
@@ -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"}