@infilectai/aira 0.0.0-stage → 0.1.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 (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -2
  3. package/bin/aira-capture +0 -0
  4. package/dist/attribution.d.ts +118 -0
  5. package/dist/attribution.d.ts.map +1 -0
  6. package/dist/attribution.js +626 -0
  7. package/dist/attribution.js.map +1 -0
  8. package/dist/audio.d.ts +26 -0
  9. package/dist/audio.d.ts.map +1 -0
  10. package/dist/audio.js +172 -0
  11. package/dist/audio.js.map +1 -0
  12. package/dist/brain.d.ts +11 -0
  13. package/dist/brain.d.ts.map +1 -0
  14. package/dist/brain.js +70 -0
  15. package/dist/brain.js.map +1 -0
  16. package/dist/capture.d.ts +48 -0
  17. package/dist/capture.d.ts.map +1 -0
  18. package/dist/capture.js +195 -0
  19. package/dist/capture.js.map +1 -0
  20. package/dist/engine.d.ts +61 -0
  21. package/dist/engine.d.ts.map +1 -0
  22. package/dist/engine.js +471 -0
  23. package/dist/engine.js.map +1 -0
  24. package/dist/eyes.d.ts +60 -0
  25. package/dist/eyes.d.ts.map +1 -0
  26. package/dist/eyes.js +173 -0
  27. package/dist/eyes.js.map +1 -0
  28. package/dist/index.d.ts +11 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/lockfile.d.ts +14 -0
  33. package/dist/lockfile.d.ts.map +1 -0
  34. package/dist/lockfile.js +38 -0
  35. package/dist/lockfile.js.map +1 -0
  36. package/dist/providers.d.ts +162 -0
  37. package/dist/providers.d.ts.map +1 -0
  38. package/dist/providers.js +374 -0
  39. package/dist/providers.js.map +1 -0
  40. package/dist/transport.d.ts +14 -0
  41. package/dist/transport.d.ts.map +1 -0
  42. package/dist/transport.js +44 -0
  43. package/dist/transport.js.map +1 -0
  44. package/dist/types.d.ts +175 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +2 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/vectors.d.ts +10 -0
  49. package/dist/vectors.d.ts.map +1 -0
  50. package/dist/vectors.js +66 -0
  51. package/dist/vectors.js.map +1 -0
  52. package/native/AiraCapture.swift +1142 -0
  53. package/native/Info.plist +26 -0
  54. package/native/NativeMeetingScraper.swift +1277 -0
  55. package/package.json +84 -4
  56. package/scripts/build-capture.cjs +57 -0
  57. package/scripts/postinstall.cjs +29 -0
@@ -0,0 +1,26 @@
1
+ import type { AiraEngine } from './engine.js';
2
+ import type { DiarizeOptions, DiarizeResult, LiveTranscriptFrame, SpeakOptions, TranscribeOptions, TranscribeResult } from './types.js';
3
+ export declare class Audio {
4
+ private readonly engine;
5
+ constructor(engine: AiraEngine);
6
+ transcribe(audio: Buffer | Uint8Array, opts?: TranscribeOptions): Promise<TranscribeResult>;
7
+ diarize(audio: Buffer | Uint8Array, opts?: DiarizeOptions): Promise<DiarizeResult>;
8
+ /** Buffered: returns a complete WAV (Float32 PCM, 24 kHz mono). */
9
+ speak(text: string, opts?: SpeakOptions): Promise<Uint8Array>;
10
+ /** Streams 24 kHz mono Float32 PCM as the engine generates each chunk (~110 ms TTFB). */
11
+ speakStream(text: string, opts?: SpeakOptions): AsyncGenerator<Uint8Array, void, void>;
12
+ startLiveTranscription(): LiveSession;
13
+ }
14
+ export declare class LiveSession {
15
+ private readonly ws;
16
+ private readonly queue;
17
+ private readonly waiters;
18
+ private closed;
19
+ constructor(url: string);
20
+ /** Feed 16 kHz mono int16 PCM. */
21
+ feed(pcm: Int16Array | Uint8Array | Buffer): void;
22
+ get frames(): AsyncIterable<LiveTranscriptFrame>;
23
+ ready(): Promise<void>;
24
+ close(): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EACV,cAAc,EAAE,aAAa,EAC7B,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EAAE,gBAAgB,EACpC,MAAM,YAAY,CAAA;AAEnB,qBAAa,KAAK;IACJ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEzC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkB/F,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB5F,mEAAmE;IAC7D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAUvE,yFAAyF;IAClF,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAgBjG,sBAAsB,IAAI,WAAW;CAOtC;AAoBD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IACnF,OAAO,CAAC,MAAM,CAAQ;gBAEV,GAAG,EAAE,MAAM;IAoBvB,kCAAkC;IAClC,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI;IAQjD,IAAI,MAAM,IAAI,aAAa,CAAC,mBAAmB,CAAC,CAmB/C;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
package/dist/audio.js ADDED
@@ -0,0 +1,172 @@
1
+ import { WebSocket } from 'ws';
2
+ export class Audio {
3
+ engine;
4
+ constructor(engine) {
5
+ this.engine = engine;
6
+ }
7
+ async transcribe(audio, opts = {}) {
8
+ if (this.engine.sttProvider?.transcribe) {
9
+ return this.engine.sttProvider.transcribe(audio, opts);
10
+ }
11
+ if (!this.engine.baseUrl) {
12
+ throw new Error('No STT provider or AiraEngine baseUrl configured. Pass `stt` to AiraEngine.create({ stt: ... }).');
13
+ }
14
+ const form = new FormData();
15
+ form.set('file', new Blob([toBlobPart(audio)]), 'audio.wav');
16
+ if (opts.model)
17
+ form.set('model', opts.model);
18
+ if (opts.language)
19
+ form.set('language', opts.language);
20
+ if (opts.prompt)
21
+ form.set('prompt', opts.prompt);
22
+ return this.engine.http.json('/v1/audio/transcriptions', {
23
+ method: 'POST',
24
+ body: form,
25
+ });
26
+ }
27
+ async diarize(audio, opts = {}) {
28
+ if (this.engine.diarizationProvider) {
29
+ return this.engine.diarizationProvider.diarize(audio, opts);
30
+ }
31
+ if (!this.engine.baseUrl) {
32
+ throw new Error('No Diarization provider or AiraEngine baseUrl configured. Pass `diarize` to AiraEngine.create({ diarize: ... }).');
33
+ }
34
+ const form = new FormData();
35
+ form.set('file', new Blob([toBlobPart(audio)]), 'audio.wav');
36
+ if (opts.numSpeakers)
37
+ form.set('num_speakers', String(opts.numSpeakers));
38
+ const raw = await this.engine.http.json('/v1/audio/diarize', { method: 'POST', body: form });
39
+ return {
40
+ numSpeakers: raw.num_speakers,
41
+ scores: raw.scores,
42
+ segments: raw.segments,
43
+ };
44
+ }
45
+ /** Buffered: returns a complete WAV (Float32 PCM, 24 kHz mono). */
46
+ async speak(text, opts = {}) {
47
+ const res = await this.engine.http.raw('/v1/audio/speech', {
48
+ method: 'POST',
49
+ headers: { 'content-type': 'application/json' },
50
+ body: JSON.stringify(speakBody(text, opts, false)),
51
+ signal: opts.signal,
52
+ });
53
+ return new Uint8Array(await res.arrayBuffer());
54
+ }
55
+ /** Streams 24 kHz mono Float32 PCM as the engine generates each chunk (~110 ms TTFB). */
56
+ async *speakStream(text, opts = {}) {
57
+ const res = await this.engine.http.raw('/v1/audio/speech', {
58
+ method: 'POST',
59
+ headers: { 'content-type': 'application/json' },
60
+ body: JSON.stringify(speakBody(text, opts, true)),
61
+ signal: opts.signal,
62
+ });
63
+ if (!res.body)
64
+ return;
65
+ const reader = res.body.getReader();
66
+ while (true) {
67
+ const { value, done } = await reader.read();
68
+ if (done)
69
+ return;
70
+ if (value)
71
+ yield value;
72
+ }
73
+ }
74
+ startLiveTranscription() {
75
+ if (!this.engine.baseUrl) {
76
+ throw new Error('startLiveTranscription requires baseUrl or AiraEngine provider');
77
+ }
78
+ const wsUrl = this.engine.baseUrl.replace(/^http/, 'ws') + '/v1/audio/stream';
79
+ return new LiveSession(wsUrl);
80
+ }
81
+ }
82
+ // `Buffer`/`Uint8Array<ArrayBufferLike>` could in theory carry a SharedArrayBuffer;
83
+ // the DOM Blob constructor wants an ArrayBuffer-backed view. Narrow without copying.
84
+ function toBlobPart(bytes) {
85
+ return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
86
+ }
87
+ function speakBody(input, o, stream) {
88
+ return {
89
+ input,
90
+ voice: o.voice,
91
+ language: o.language,
92
+ format: stream ? 'stream' : 'wav',
93
+ temperature: o.temperature,
94
+ top_k: o.topK,
95
+ instruction: o.instruction,
96
+ };
97
+ }
98
+ export class LiveSession {
99
+ ws;
100
+ queue = [];
101
+ waiters = [];
102
+ closed = false;
103
+ constructor(url) {
104
+ this.ws = new WebSocket(url);
105
+ this.ws.on('message', (data, isBinary) => {
106
+ if (isBinary)
107
+ return;
108
+ try {
109
+ const frame = JSON.parse(data.toString());
110
+ const w = this.waiters.shift();
111
+ if (w)
112
+ w({ value: frame, done: false });
113
+ else
114
+ this.queue.push(frame);
115
+ }
116
+ catch { /* ignore malformed frames */ }
117
+ });
118
+ this.ws.on('close', () => {
119
+ this.closed = true;
120
+ while (this.waiters.length) {
121
+ const w = this.waiters.shift();
122
+ w({ value: undefined, done: true });
123
+ }
124
+ });
125
+ }
126
+ /** Feed 16 kHz mono int16 PCM. */
127
+ feed(pcm) {
128
+ if (this.closed)
129
+ throw new Error('LiveSession is closed');
130
+ const bytes = pcm instanceof Int16Array
131
+ ? Buffer.from(pcm.buffer, pcm.byteOffset, pcm.byteLength)
132
+ : pcm;
133
+ this.ws.send(bytes);
134
+ }
135
+ get frames() {
136
+ const queue = this.queue;
137
+ const waiters = this.waiters;
138
+ const isClosed = () => this.closed;
139
+ return {
140
+ [Symbol.asyncIterator]() {
141
+ return {
142
+ next() {
143
+ if (queue.length) {
144
+ return Promise.resolve({ value: queue.shift(), done: false });
145
+ }
146
+ if (isClosed()) {
147
+ return Promise.resolve({ value: undefined, done: true });
148
+ }
149
+ return new Promise((resolve) => waiters.push(resolve));
150
+ },
151
+ };
152
+ },
153
+ };
154
+ }
155
+ async ready() {
156
+ if (this.ws.readyState === WebSocket.OPEN)
157
+ return;
158
+ await new Promise((resolve, reject) => {
159
+ this.ws.once('open', () => resolve());
160
+ this.ws.once('error', reject);
161
+ });
162
+ }
163
+ async close() {
164
+ if (this.closed)
165
+ return;
166
+ if (this.ws.readyState === WebSocket.OPEN) {
167
+ this.ws.send(JSON.stringify({ type: 'end' }));
168
+ }
169
+ await new Promise((resolve) => this.ws.once('close', () => resolve()));
170
+ }
171
+ }
172
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AiraEngine } from './engine.js';
2
+ import type { ChatChunk, ChatMessage, ChatOptions, ChatResult } from './types.js';
3
+ export declare class Brain {
4
+ private readonly engine;
5
+ constructor(engine: AiraEngine);
6
+ chat(messages: ChatMessage[], opts?: ChatOptions): Promise<ChatResult>;
7
+ chatStream(messages: ChatMessage[], opts?: ChatOptions): AsyncGenerator<ChatChunk, void, void>;
8
+ embed(input: string): Promise<Float32Array>;
9
+ embed(input: string[]): Promise<Float32Array[]>;
10
+ }
11
+ //# sourceMappingURL=brain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEjF,qBAAa,KAAK;IACJ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEzC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAazE,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;IAsCnG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAStD"}
package/dist/brain.js ADDED
@@ -0,0 +1,70 @@
1
+ export class Brain {
2
+ engine;
3
+ constructor(engine) {
4
+ this.engine = engine;
5
+ }
6
+ async chat(messages, opts = {}) {
7
+ const raw = await this.engine.http.post('/v1/chat/completions', { ...openaiChatBody(messages, opts), stream: false });
8
+ return {
9
+ id: raw.id,
10
+ model: raw.model,
11
+ content: raw.choices[0]?.message.content ?? '',
12
+ };
13
+ }
14
+ async *chatStream(messages, opts = {}) {
15
+ const res = await this.engine.http.raw('/v1/chat/completions', {
16
+ method: 'POST',
17
+ headers: { 'content-type': 'application/json' },
18
+ body: JSON.stringify({ ...openaiChatBody(messages, opts), stream: true }),
19
+ signal: opts.signal,
20
+ });
21
+ if (!res.body)
22
+ return;
23
+ const reader = res.body.getReader();
24
+ const decoder = new TextDecoder();
25
+ let buf = '';
26
+ let id = '';
27
+ while (true) {
28
+ const { value, done } = await reader.read();
29
+ if (done)
30
+ break;
31
+ buf += decoder.decode(value, { stream: true });
32
+ let nl;
33
+ while ((nl = buf.indexOf('\n\n')) >= 0) {
34
+ const event = buf.slice(0, nl);
35
+ buf = buf.slice(nl + 2);
36
+ const line = event.startsWith('data: ') ? event.slice(6) : event;
37
+ if (line === '[DONE]') {
38
+ yield { id, delta: '', done: true };
39
+ return;
40
+ }
41
+ try {
42
+ const json = JSON.parse(line);
43
+ if (json.id)
44
+ id = json.id;
45
+ const delta = json.choices?.[0]?.delta?.content ?? '';
46
+ if (delta)
47
+ yield { id, delta, done: false };
48
+ }
49
+ catch { /* SSE keep-alive or malformed line */ }
50
+ }
51
+ }
52
+ }
53
+ async embed(input) {
54
+ const raw = await this.engine.http.post('/v1/embeddings', { input });
55
+ const sorted = [...raw.data].sort((a, b) => a.index - b.index);
56
+ const vecs = sorted.map((d) => Float32Array.from(d.embedding));
57
+ return Array.isArray(input) ? vecs : vecs[0];
58
+ }
59
+ }
60
+ function openaiChatBody(messages, opts) {
61
+ return {
62
+ model: opts.model,
63
+ messages,
64
+ temperature: opts.temperature,
65
+ top_p: opts.topP,
66
+ top_k: opts.topK,
67
+ max_tokens: opts.maxTokens,
68
+ };
69
+ }
70
+ //# sourceMappingURL=brain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain.js","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { ChromeEvent, MeetingTarget, Participant } from './types.js';
3
+ export interface CaptureRosterPayload {
4
+ participants: Participant[];
5
+ localUserId: string;
6
+ localUserName: string;
7
+ }
8
+ export interface CaptureSpeakerPayload {
9
+ participantId: string;
10
+ name: string;
11
+ t: number;
12
+ source: string;
13
+ }
14
+ export interface CaptureAudioPayload {
15
+ pcm: Buffer;
16
+ t0: number;
17
+ t1: number;
18
+ sysRMS: number;
19
+ micRMS: number;
20
+ micActive: boolean;
21
+ }
22
+ /**
23
+ * Lightweight stdio bridge to the zero-dependency `bin/aira-capture` macOS binary.
24
+ * Handles meeting detection, native AX/DOM speaker scraping (Zoom, Meet, Teams),
25
+ * CoreAudio Process Tap system audio capture, and microphone RMS monitoring.
26
+ */
27
+ export declare class NativeCaptureBridge extends EventEmitter {
28
+ private child;
29
+ private rl;
30
+ private nextId;
31
+ private readonly pending;
32
+ private readyPromise;
33
+ private readonly captureBinPath;
34
+ constructor(captureBinPath?: string);
35
+ ensureStarted(): Promise<void>;
36
+ private handleEvent;
37
+ private rejectAllPending;
38
+ sendCommand<T = any>(command: string, params?: Record<string, unknown>): Promise<T>;
39
+ checkPermissions(prompt?: boolean): Promise<Record<string, 'granted' | 'denied'>>;
40
+ watchMeetings(): Promise<void>;
41
+ stopWatchingMeetings(): Promise<void>;
42
+ startCapture(target: MeetingTarget): Promise<void>;
43
+ stopCapture(): Promise<void>;
44
+ pushChromeEvent(event: ChromeEvent): Promise<void>;
45
+ close(): Promise<void>;
46
+ }
47
+ export declare function resolveCaptureBinPath(explicit?: string): string;
48
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAOzE,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;CACnB;AAOD;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;gBAE3B,cAAc,CAAC,EAAE,MAAM;IAK7B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA8EpC,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,gBAAgB;IAOlB,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBvF,gBAAgB,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IAI/E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB7B;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/D"}
@@ -0,0 +1,195 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { EventEmitter } from 'node:events';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import * as readline from 'node:readline';
6
+ import { fileURLToPath } from 'node:url';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const PROTOCOL_PREFIX = 'aira_capture|';
10
+ /**
11
+ * Lightweight stdio bridge to the zero-dependency `bin/aira-capture` macOS binary.
12
+ * Handles meeting detection, native AX/DOM speaker scraping (Zoom, Meet, Teams),
13
+ * CoreAudio Process Tap system audio capture, and microphone RMS monitoring.
14
+ */
15
+ export class NativeCaptureBridge extends EventEmitter {
16
+ child = null;
17
+ rl = null;
18
+ nextId = 1;
19
+ pending = new Map();
20
+ readyPromise = null;
21
+ captureBinPath;
22
+ constructor(captureBinPath) {
23
+ super();
24
+ this.captureBinPath = resolveCaptureBinPath(captureBinPath);
25
+ }
26
+ async ensureStarted() {
27
+ if (this.child && this.child.exitCode === null && !this.child.killed) {
28
+ if (this.readyPromise)
29
+ await this.readyPromise;
30
+ return;
31
+ }
32
+ this.readyPromise = new Promise((resolve, reject) => {
33
+ const child = spawn(this.captureBinPath, [], {
34
+ stdio: ['pipe', 'pipe', 'inherit'],
35
+ });
36
+ this.child = child;
37
+ if (!child.stdout || !child.stdin) {
38
+ reject(new Error(`Failed to spawn ${this.captureBinPath}`));
39
+ return;
40
+ }
41
+ let settled = false;
42
+ const timer = setTimeout(() => {
43
+ if (!settled) {
44
+ settled = true;
45
+ reject(new Error('aira-capture did not announce ready within 10s'));
46
+ }
47
+ }, 10_000);
48
+ this.rl = readline.createInterface({ input: child.stdout, crlfDelay: Infinity });
49
+ this.rl.on('line', (line) => {
50
+ if (!line.startsWith(PROTOCOL_PREFIX))
51
+ return;
52
+ try {
53
+ const msg = JSON.parse(line.slice(PROTOCOL_PREFIX.length));
54
+ if (msg.type === 'event') {
55
+ if (msg.event === 'ready' && !settled) {
56
+ settled = true;
57
+ clearTimeout(timer);
58
+ resolve();
59
+ }
60
+ this.handleEvent(msg.event, msg.payload);
61
+ }
62
+ else if (msg.type === 'response') {
63
+ const p = this.pending.get(msg.id);
64
+ if (p) {
65
+ this.pending.delete(msg.id);
66
+ if (msg.status === 'success')
67
+ p.resolve(msg.result);
68
+ else
69
+ p.reject(new Error(msg.error ?? 'aira-capture command failed'));
70
+ }
71
+ }
72
+ }
73
+ catch {
74
+ // ignore malformed line
75
+ }
76
+ });
77
+ child.once('error', (err) => {
78
+ if (!settled) {
79
+ settled = true;
80
+ clearTimeout(timer);
81
+ reject(err);
82
+ }
83
+ this.rejectAllPending(err);
84
+ });
85
+ child.once('exit', (code, signal) => {
86
+ this.rl?.close();
87
+ this.rl = null;
88
+ this.child = null;
89
+ this.readyPromise = null;
90
+ const err = new Error(`aira-capture exited (code=${code}, signal=${signal})`);
91
+ if (!settled) {
92
+ settled = true;
93
+ clearTimeout(timer);
94
+ reject(err);
95
+ }
96
+ this.rejectAllPending(err);
97
+ this.emit('exit', code, signal);
98
+ });
99
+ });
100
+ await this.readyPromise;
101
+ }
102
+ handleEvent(event, payload) {
103
+ if (event === 'audio' && payload?.pcmBase64) {
104
+ const audioPayload = {
105
+ pcm: Buffer.from(payload.pcmBase64, 'base64'),
106
+ t0: payload.t0,
107
+ t1: payload.t1,
108
+ sysRMS: payload.sysRMS,
109
+ micRMS: payload.micRMS,
110
+ micActive: Boolean(payload.micActive),
111
+ };
112
+ this.emit('audio', audioPayload);
113
+ return;
114
+ }
115
+ this.emit(event, payload);
116
+ }
117
+ rejectAllPending(err) {
118
+ for (const [, p] of this.pending) {
119
+ p.reject(err);
120
+ }
121
+ this.pending.clear();
122
+ }
123
+ async sendCommand(command, params = {}) {
124
+ await this.ensureStarted();
125
+ const stdin = this.child?.stdin;
126
+ if (!stdin || stdin.destroyed || !stdin.writable) {
127
+ throw new Error('aira-capture stdin is not writable');
128
+ }
129
+ const id = String(this.nextId++);
130
+ return new Promise((resolve, reject) => {
131
+ this.pending.set(id, { resolve, reject });
132
+ const line = JSON.stringify({ id, command, ...params }) + '\n';
133
+ stdin.write(line, (err) => {
134
+ if (err) {
135
+ this.pending.delete(id);
136
+ reject(err);
137
+ }
138
+ });
139
+ });
140
+ }
141
+ async checkPermissions(prompt = false) {
142
+ return this.sendCommand('checkPermissions', { prompt });
143
+ }
144
+ async watchMeetings() {
145
+ await this.sendCommand('watchMeetings');
146
+ }
147
+ async stopWatchingMeetings() {
148
+ await this.sendCommand('stopWatchingMeetings');
149
+ }
150
+ async startCapture(target) {
151
+ await this.sendCommand('startCapture', { target });
152
+ }
153
+ async stopCapture() {
154
+ if (!this.child)
155
+ return;
156
+ await this.sendCommand('stopCapture');
157
+ }
158
+ async pushChromeEvent(event) {
159
+ await this.sendCommand('pushChromeEvent', { event });
160
+ }
161
+ async close() {
162
+ if (!this.child)
163
+ return;
164
+ const proc = this.child;
165
+ try {
166
+ await this.sendCommand('shutdown');
167
+ }
168
+ catch {
169
+ proc.kill('SIGTERM');
170
+ }
171
+ await new Promise((resolve) => {
172
+ if (proc.exitCode !== null)
173
+ return resolve();
174
+ const timer = setTimeout(() => {
175
+ proc.kill('SIGKILL');
176
+ resolve();
177
+ }, 2_000);
178
+ proc.once('exit', () => {
179
+ clearTimeout(timer);
180
+ resolve();
181
+ });
182
+ });
183
+ }
184
+ }
185
+ export function resolveCaptureBinPath(explicit) {
186
+ if (explicit)
187
+ return explicit;
188
+ if (process.env.AIRA_CAPTURE_BIN)
189
+ return process.env.AIRA_CAPTURE_BIN;
190
+ const candidate = path.resolve(__dirname, '..', 'bin', 'aira-capture');
191
+ if (fs.existsSync(candidate))
192
+ return candidate;
193
+ throw new Error(`aira-capture binary not found at ${candidate}. Run \`npm run build:capture\` or set AIRA_CAPTURE_BIN.`);
194
+ }
195
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { Audio } from './audio.js';
3
+ import { Brain } from './brain.js';
4
+ import { NativeCaptureBridge } from './capture.js';
5
+ import { Eyes, type EyesSession, type MeetingWatcher } from './eyes.js';
6
+ import { type DiarizationProvider, type STTProvider } from './providers.js';
7
+ import { HttpClient } from './transport.js';
8
+ import type { AiraEngineOptions, ChromeEvent, DiarizationProviderInput, HealthResponse, MeetingTarget, STTProviderInput, StartMeetingOptions } from './types.js';
9
+ export declare function resolveSTTProvider(input?: STTProviderInput): STTProvider | undefined;
10
+ export declare function resolveDiarizationProvider(input?: DiarizationProviderInput): DiarizationProvider | undefined;
11
+ export declare class AiraEngine extends EventEmitter {
12
+ private readonly child;
13
+ private readonly lockfile;
14
+ readonly baseUrl: string;
15
+ readonly http: HttpClient;
16
+ readonly audio: Audio;
17
+ readonly brain: Brain;
18
+ readonly eyes: Eyes;
19
+ readonly capture: NativeCaptureBridge;
20
+ sttProvider?: STTProvider;
21
+ diarizationProvider?: DiarizationProvider;
22
+ private constructor();
23
+ /**
24
+ * Configure or swap the STT / Diarization providers at runtime.
25
+ */
26
+ setProviders(opts: {
27
+ stt?: STTProviderInput;
28
+ diarize?: DiarizationProviderInput;
29
+ }): void;
30
+ /**
31
+ * Downloads the required GGUF models directly to the modelsDir (when using the optional AiraEngine provider).
32
+ */
33
+ static downloadModels(opts?: AiraEngineOptions): Promise<void>;
34
+ /**
35
+ * Creates an Aira SDK instance.
36
+ *
37
+ * - Always starts the lightweight `aira-capture` helper (~450 KB, zero external deps) for
38
+ * macOS meeting detection, native AX/DOM speaker scraping, and CoreAudio capture.
39
+ * - If `stt` / `diarize` endpoints or callbacks are passed (and no `baseUrl` / `enginePath`),
40
+ * runs completely standalone without spawning `aira-engine`!
41
+ * - If `baseUrl` is passed, or an `aira-engine` binary is configured/discovered, wires
42
+ * `AiraEngineProvider` as the default STT/Diarization/LLM provider.
43
+ */
44
+ static create(opts?: AiraEngineOptions): Promise<AiraEngine>;
45
+ health(): Promise<HealthResponse>;
46
+ /**
47
+ * Starts an attributed-transcript meeting session.
48
+ * Accepts optional per-session `stt` and `diarize` overrides.
49
+ */
50
+ startMeeting(target: MeetingTarget, opts?: StartMeetingOptions): EyesSession;
51
+ watchActiveMeetings(): MeetingWatcher;
52
+ onMeetingDetected(callback: (meeting: MeetingTarget) => void): MeetingWatcher;
53
+ pushChromeEvent(event: ChromeEvent): Promise<void>;
54
+ checkPermissions(prompt?: boolean): Promise<Record<string, 'granted' | 'denied'>>;
55
+ summarize(text: string): Promise<string>;
56
+ embed(text: string | string[]): Promise<Float32Array[]>;
57
+ close(): Promise<void>;
58
+ private waitForHealth;
59
+ }
60
+ export { AiraEngine as Aira };
61
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AAEvE,OAAO,EAOL,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,wBAAwB,EACxB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAUnB,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,gBAAgB,GAAG,WAAW,GAAG,SAAS,CAqBpF;AAED,wBAAgB,0BAA0B,CACxC,KAAK,CAAC,EAAE,wBAAwB,GAC/B,mBAAmB,GAAG,SAAS,CAejC;AAED,qBAAa,UAAW,SAAQ,YAAY;IAYxC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAZ3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;IACrC,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IAEzC,OAAO;IA0BP;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,gBAAgB,CAAC;QAAC,OAAO,CAAC,EAAE,wBAAwB,CAAA;KAAE,GAAG,IAAI;IASxF;;OAEG;WACU,cAAc,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsGxE;;;;;;;;;OASG;WACU,MAAM,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgHhE,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;IAcvC;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,mBAAwB,GAAG,WAAW;IAwBhF,mBAAmB,IAAI,cAAc;IAIrC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,cAAc;IAiBvE,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,gBAAgB,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IAI/E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoBvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBd,aAAa;CAc5B;AAED,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,CAAA"}