@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.
- package/LICENSE +21 -0
- package/README.md +74 -2
- package/bin/aira-capture +0 -0
- package/dist/attribution.d.ts +118 -0
- package/dist/attribution.d.ts.map +1 -0
- package/dist/attribution.js +626 -0
- package/dist/attribution.js.map +1 -0
- package/dist/audio.d.ts +26 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +172 -0
- package/dist/audio.js.map +1 -0
- package/dist/brain.d.ts +11 -0
- package/dist/brain.d.ts.map +1 -0
- package/dist/brain.js +70 -0
- package/dist/brain.js.map +1 -0
- package/dist/capture.d.ts +48 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +195 -0
- package/dist/capture.js.map +1 -0
- package/dist/engine.d.ts +61 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +471 -0
- package/dist/engine.js.map +1 -0
- package/dist/eyes.d.ts +60 -0
- package/dist/eyes.d.ts.map +1 -0
- package/dist/eyes.js +173 -0
- package/dist/eyes.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lockfile.d.ts +14 -0
- package/dist/lockfile.d.ts.map +1 -0
- package/dist/lockfile.js +38 -0
- package/dist/lockfile.js.map +1 -0
- package/dist/providers.d.ts +162 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +374 -0
- package/dist/providers.js.map +1 -0
- package/dist/transport.d.ts +14 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +44 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vectors.d.ts +10 -0
- package/dist/vectors.d.ts.map +1 -0
- package/dist/vectors.js +66 -0
- package/dist/vectors.js.map +1 -0
- package/native/AiraCapture.swift +1142 -0
- package/native/Info.plist +26 -0
- package/native/NativeMeetingScraper.swift +1277 -0
- package/package.json +84 -4
- package/scripts/build-capture.cjs +57 -0
- package/scripts/postinstall.cjs +29 -0
package/dist/engine.js
ADDED
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import * as https from 'node:https';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { Audio } from './audio.js';
|
|
8
|
+
import { Brain } from './brain.js';
|
|
9
|
+
import { NativeCaptureBridge } from './capture.js';
|
|
10
|
+
import { Eyes } from './eyes.js';
|
|
11
|
+
import { Lockfile, isProcessAlive } from './lockfile.js';
|
|
12
|
+
import { AiraEngineProvider, CallbackDiarizationProvider, CallbackSTTProvider, HttpDiarizationProvider, HttpSTTProvider, WebSocketSTTProvider, } from './providers.js';
|
|
13
|
+
import { HttpClient } from './transport.js';
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = path.dirname(__filename);
|
|
16
|
+
const DEFAULT_HOST = '127.0.0.1';
|
|
17
|
+
const DEFAULT_STARTUP_TIMEOUT_MS = 30_000;
|
|
18
|
+
const ANNOUNCE_RE = /^aira-engine listening on (\S+?):(\d+)/m;
|
|
19
|
+
export function resolveSTTProvider(input) {
|
|
20
|
+
if (!input)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (typeof input === 'function') {
|
|
23
|
+
return new CallbackSTTProvider(input);
|
|
24
|
+
}
|
|
25
|
+
if (typeof input === 'string') {
|
|
26
|
+
if (input.startsWith('ws://') || input.startsWith('wss://')) {
|
|
27
|
+
return new WebSocketSTTProvider({ wsUrl: input });
|
|
28
|
+
}
|
|
29
|
+
return new HttpSTTProvider({ url: input });
|
|
30
|
+
}
|
|
31
|
+
if ('transcribe' in input || 'startStream' in input) {
|
|
32
|
+
return input;
|
|
33
|
+
}
|
|
34
|
+
if ('wsUrl' in input) {
|
|
35
|
+
return new WebSocketSTTProvider(input);
|
|
36
|
+
}
|
|
37
|
+
if ('url' in input) {
|
|
38
|
+
return new HttpSTTProvider(input);
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
export function resolveDiarizationProvider(input) {
|
|
43
|
+
if (!input)
|
|
44
|
+
return undefined;
|
|
45
|
+
if (typeof input === 'function') {
|
|
46
|
+
return new CallbackDiarizationProvider(input);
|
|
47
|
+
}
|
|
48
|
+
if (typeof input === 'string') {
|
|
49
|
+
return new HttpDiarizationProvider({ url: input });
|
|
50
|
+
}
|
|
51
|
+
if ('diarize' in input) {
|
|
52
|
+
return input;
|
|
53
|
+
}
|
|
54
|
+
if ('url' in input) {
|
|
55
|
+
return new HttpDiarizationProvider(input);
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
export class AiraEngine extends EventEmitter {
|
|
60
|
+
child;
|
|
61
|
+
lockfile;
|
|
62
|
+
baseUrl;
|
|
63
|
+
http;
|
|
64
|
+
audio;
|
|
65
|
+
brain;
|
|
66
|
+
eyes;
|
|
67
|
+
capture;
|
|
68
|
+
sttProvider;
|
|
69
|
+
diarizationProvider;
|
|
70
|
+
constructor(baseUrl, child, lockfile, capture, sttProvider, diarizationProvider) {
|
|
71
|
+
super();
|
|
72
|
+
this.child = child;
|
|
73
|
+
this.lockfile = lockfile;
|
|
74
|
+
this.baseUrl = baseUrl;
|
|
75
|
+
this.http = new HttpClient(baseUrl);
|
|
76
|
+
this.capture = capture;
|
|
77
|
+
this.sttProvider = sttProvider;
|
|
78
|
+
this.diarizationProvider = diarizationProvider;
|
|
79
|
+
this.audio = new Audio(this);
|
|
80
|
+
this.brain = new Brain(this);
|
|
81
|
+
this.eyes = new Eyes(this, capture);
|
|
82
|
+
if (child) {
|
|
83
|
+
child.on('exit', (code, signal) => {
|
|
84
|
+
this.lockfile?.remove();
|
|
85
|
+
this.emit('crash', new Error(`aira-engine exited (code=${code}, signal=${signal})`));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Configure or swap the STT / Diarization providers at runtime.
|
|
91
|
+
*/
|
|
92
|
+
setProviders(opts) {
|
|
93
|
+
if (opts.stt !== undefined) {
|
|
94
|
+
this.sttProvider = resolveSTTProvider(opts.stt);
|
|
95
|
+
}
|
|
96
|
+
if (opts.diarize !== undefined) {
|
|
97
|
+
this.diarizationProvider = resolveDiarizationProvider(opts.diarize);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Downloads the required GGUF models directly to the modelsDir (when using the optional AiraEngine provider).
|
|
102
|
+
*/
|
|
103
|
+
static async downloadModels(opts = {}) {
|
|
104
|
+
const modelsDir = opts.modelsDir ?? defaultModelsDir();
|
|
105
|
+
await fs.promises.mkdir(modelsDir, { recursive: true });
|
|
106
|
+
const models = [
|
|
107
|
+
{
|
|
108
|
+
name: 'google_gemma-4-E2B-it-Q4_K_M.gguf',
|
|
109
|
+
url: 'https://huggingface.co/InfilectAI/Aira-Gemma-4/resolve/main/google_gemma-4-E2B-it-Q4_K_M.gguf?download=true',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'embeddinggemma-300M-Q8_0.gguf',
|
|
113
|
+
url: 'https://huggingface.co/InfilectAI/Aira-EmbeddingGemma/resolve/main/embeddinggemma-300M-Q8_0.gguf?download=true',
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
for (const model of models) {
|
|
117
|
+
const dest = path.join(modelsDir, model.name);
|
|
118
|
+
try {
|
|
119
|
+
await fs.promises.access(dest);
|
|
120
|
+
opts.onModelDownload?.({ name: model.name }, { percent: 100 });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Continue downloading
|
|
125
|
+
}
|
|
126
|
+
await new Promise((resolve, reject) => {
|
|
127
|
+
const fetchFile = (url) => {
|
|
128
|
+
https
|
|
129
|
+
.get(url, (res) => {
|
|
130
|
+
if ([301, 302, 307, 308].includes(res.statusCode ?? 0) && res.headers.location) {
|
|
131
|
+
fetchFile(res.headers.location);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (res.statusCode !== 200) {
|
|
135
|
+
reject(new Error(`Failed to download ${model.name}: HTTP ${res.statusCode}`));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const total = parseInt(res.headers['content-length'] ?? '0', 10);
|
|
139
|
+
let downloaded = 0;
|
|
140
|
+
const file = fs.createWriteStream(dest);
|
|
141
|
+
opts.onModelDownload?.({ name: model.name }, { percent: 0 });
|
|
142
|
+
res.on('data', (chunk) => {
|
|
143
|
+
downloaded += chunk.length;
|
|
144
|
+
if (total > 0) {
|
|
145
|
+
const percent = Math.round((downloaded / total) * 100);
|
|
146
|
+
opts.onModelDownload?.({ name: model.name }, { percent });
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
res.pipe(file);
|
|
150
|
+
file.on('finish', () => {
|
|
151
|
+
file.close();
|
|
152
|
+
resolve();
|
|
153
|
+
});
|
|
154
|
+
file.on('error', (err) => {
|
|
155
|
+
fs.unlink(dest, () => { });
|
|
156
|
+
reject(err);
|
|
157
|
+
});
|
|
158
|
+
})
|
|
159
|
+
.on('error', (err) => {
|
|
160
|
+
fs.unlink(dest, () => { });
|
|
161
|
+
reject(err);
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
fetchFile(model.url);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
let engine;
|
|
168
|
+
try {
|
|
169
|
+
engine = await AiraEngine.create(opts);
|
|
170
|
+
if (!engine.baseUrl)
|
|
171
|
+
return;
|
|
172
|
+
const sttHealth = await engine.health();
|
|
173
|
+
if (sttHealth.primitives.stt !== 'loaded') {
|
|
174
|
+
opts.onModelDownload?.({ name: 'whisper-coreml' }, { percent: 0 });
|
|
175
|
+
const live = engine.audio.startLiveTranscription();
|
|
176
|
+
while (true) {
|
|
177
|
+
const h = await engine.health();
|
|
178
|
+
if (h.primitives.stt === 'loaded') {
|
|
179
|
+
opts.onModelDownload?.({ name: 'whisper-coreml' }, { percent: 100 });
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
if (h.primitives.stt === 'error') {
|
|
183
|
+
throw new Error('Engine failed to load WhisperKit models.');
|
|
184
|
+
}
|
|
185
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
186
|
+
}
|
|
187
|
+
await live.close();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
if (engine) {
|
|
192
|
+
await engine.close();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Creates an Aira SDK instance.
|
|
198
|
+
*
|
|
199
|
+
* - Always starts the lightweight `aira-capture` helper (~450 KB, zero external deps) for
|
|
200
|
+
* macOS meeting detection, native AX/DOM speaker scraping, and CoreAudio capture.
|
|
201
|
+
* - If `stt` / `diarize` endpoints or callbacks are passed (and no `baseUrl` / `enginePath`),
|
|
202
|
+
* runs completely standalone without spawning `aira-engine`!
|
|
203
|
+
* - If `baseUrl` is passed, or an `aira-engine` binary is configured/discovered, wires
|
|
204
|
+
* `AiraEngineProvider` as the default STT/Diarization/LLM provider.
|
|
205
|
+
*/
|
|
206
|
+
static async create(opts = {}) {
|
|
207
|
+
const capture = new NativeCaptureBridge(opts.capturePath);
|
|
208
|
+
await capture.ensureStarted();
|
|
209
|
+
const explicitSTT = resolveSTTProvider(opts.stt);
|
|
210
|
+
const explicitDiarize = resolveDiarizationProvider(opts.diarize);
|
|
211
|
+
// 1. Attached to an explicit AiraEngine baseUrl
|
|
212
|
+
if (opts.baseUrl) {
|
|
213
|
+
const provider = new AiraEngineProvider(opts.baseUrl);
|
|
214
|
+
const eng = new AiraEngine(opts.baseUrl, null, null, capture, explicitSTT ?? provider, explicitDiarize ?? provider);
|
|
215
|
+
await eng.waitForHealth(opts.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS);
|
|
216
|
+
return eng;
|
|
217
|
+
}
|
|
218
|
+
// 2. Standalone mode: if caller provided custom STT (and didn't ask to spawn aira-engine)
|
|
219
|
+
const enginePath = findOptionalEnginePath(opts.enginePath);
|
|
220
|
+
if ((explicitSTT || !enginePath) && !opts.enginePath) {
|
|
221
|
+
return new AiraEngine('', null, null, capture, explicitSTT, explicitDiarize);
|
|
222
|
+
}
|
|
223
|
+
// 3. Optional AiraEngine sidecar provider mode (when aira-engine binary is present)
|
|
224
|
+
const modelsDir = opts.modelsDir ?? defaultModelsDir();
|
|
225
|
+
fs.mkdirSync(modelsDir, { recursive: true });
|
|
226
|
+
const lockfile = new Lockfile(path.join(modelsDir, '.aira-engine.lock'));
|
|
227
|
+
const existing = lockfile.read();
|
|
228
|
+
if (existing && isProcessAlive(existing.pid)) {
|
|
229
|
+
const baseUrl = `http://${DEFAULT_HOST}:${existing.port}`;
|
|
230
|
+
const provider = new AiraEngineProvider(baseUrl);
|
|
231
|
+
const eng = new AiraEngine(baseUrl, null, lockfile, capture, explicitSTT ?? provider, explicitDiarize ?? provider);
|
|
232
|
+
try {
|
|
233
|
+
await eng.waitForHealth(2_000);
|
|
234
|
+
return eng;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
lockfile.remove();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (!enginePath) {
|
|
241
|
+
return new AiraEngine('', null, null, capture, explicitSTT, explicitDiarize);
|
|
242
|
+
}
|
|
243
|
+
const requestedPort = opts.port ?? 0;
|
|
244
|
+
const startupTimeoutMs = opts.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
|
|
245
|
+
const llmPath = path.join(modelsDir, 'google_gemma-4-E2B-it-Q4_K_M.gguf');
|
|
246
|
+
const embedPath = path.join(modelsDir, 'embeddinggemma-300M-Q8_0.gguf');
|
|
247
|
+
const child = spawn(enginePath, [], {
|
|
248
|
+
env: {
|
|
249
|
+
...process.env,
|
|
250
|
+
AIRA_ENGINE_HOST: DEFAULT_HOST,
|
|
251
|
+
AIRA_ENGINE_PORT: String(requestedPort),
|
|
252
|
+
AIRA_MODELS_DIR: modelsDir,
|
|
253
|
+
...(fs.existsSync(llmPath) && !process.env.AIRA_LLM_GGUF ? { AIRA_LLM_GGUF: llmPath } : {}),
|
|
254
|
+
...(fs.existsSync(embedPath) && !process.env.AIRA_EMBED_GGUF
|
|
255
|
+
? { AIRA_EMBED_GGUF: embedPath }
|
|
256
|
+
: {}),
|
|
257
|
+
},
|
|
258
|
+
stdio: ['ignore', 'pipe', 'inherit'],
|
|
259
|
+
});
|
|
260
|
+
if (!child.pid || !child.stdout) {
|
|
261
|
+
throw new Error(`failed to spawn ${enginePath}`);
|
|
262
|
+
}
|
|
263
|
+
let port;
|
|
264
|
+
try {
|
|
265
|
+
port = await readAnnouncedPort(child, startupTimeoutMs);
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
child.kill('SIGTERM');
|
|
269
|
+
throw err;
|
|
270
|
+
}
|
|
271
|
+
lockfile.write({ pid: child.pid, port, startedAt: Date.now() });
|
|
272
|
+
const baseUrl = `http://${DEFAULT_HOST}:${port}`;
|
|
273
|
+
const provider = new AiraEngineProvider(baseUrl);
|
|
274
|
+
const eng = new AiraEngine(baseUrl, child, lockfile, capture, explicitSTT ?? provider, explicitDiarize ?? provider);
|
|
275
|
+
try {
|
|
276
|
+
await eng.waitForHealth(startupTimeoutMs);
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
child.kill('SIGTERM');
|
|
280
|
+
lockfile.remove();
|
|
281
|
+
throw err;
|
|
282
|
+
}
|
|
283
|
+
return eng;
|
|
284
|
+
}
|
|
285
|
+
async health() {
|
|
286
|
+
if (!this.baseUrl) {
|
|
287
|
+
return {
|
|
288
|
+
status: 'ok',
|
|
289
|
+
primitives: {
|
|
290
|
+
capture: 'loaded',
|
|
291
|
+
stt: this.sttProvider ? 'loaded' : 'unloaded',
|
|
292
|
+
diarize: this.diarizationProvider ? 'loaded' : 'unloaded',
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
return this.http.json('/health');
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Starts an attributed-transcript meeting session.
|
|
300
|
+
* Accepts optional per-session `stt` and `diarize` overrides.
|
|
301
|
+
*/
|
|
302
|
+
startMeeting(target, opts = {}) {
|
|
303
|
+
const session = this.eyes.start(target, opts);
|
|
304
|
+
session.on('audio', (chunk) => {
|
|
305
|
+
this.emit('audio', chunk);
|
|
306
|
+
});
|
|
307
|
+
(async () => {
|
|
308
|
+
for await (const event of session.events) {
|
|
309
|
+
if (event.type === 'transcript') {
|
|
310
|
+
this.emit('transcript', event);
|
|
311
|
+
}
|
|
312
|
+
else if (event.type === 'roster') {
|
|
313
|
+
this.emit('roster', event.participants);
|
|
314
|
+
}
|
|
315
|
+
else if (event.type === 'speaker_change') {
|
|
316
|
+
this.emit('speaker_change', event.name, event.participantId, event.t);
|
|
317
|
+
}
|
|
318
|
+
else if (event.type === 'warning' || event.type === 'error') {
|
|
319
|
+
this.emit(event.type, event.message);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
})().catch((err) => this.emit('error', err));
|
|
323
|
+
return session;
|
|
324
|
+
}
|
|
325
|
+
watchActiveMeetings() {
|
|
326
|
+
return this.eyes.watchMeetings();
|
|
327
|
+
}
|
|
328
|
+
onMeetingDetected(callback) {
|
|
329
|
+
const watcher = this.watchActiveMeetings();
|
|
330
|
+
let knownUrls = new Set();
|
|
331
|
+
watcher.on('meetings', (meetings) => {
|
|
332
|
+
const currentUrls = new Set(meetings.map((m) => m.url));
|
|
333
|
+
for (const meeting of meetings) {
|
|
334
|
+
if (!knownUrls.has(meeting.url)) {
|
|
335
|
+
callback(meeting);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
knownUrls = currentUrls;
|
|
339
|
+
});
|
|
340
|
+
return watcher;
|
|
341
|
+
}
|
|
342
|
+
async pushChromeEvent(event) {
|
|
343
|
+
await this.eyes.pushChromeEvent(event);
|
|
344
|
+
}
|
|
345
|
+
async checkPermissions(prompt = false) {
|
|
346
|
+
return this.eyes.checkPermissions(prompt);
|
|
347
|
+
}
|
|
348
|
+
async summarize(text) {
|
|
349
|
+
const res = await this.brain.chat([
|
|
350
|
+
{
|
|
351
|
+
role: 'user',
|
|
352
|
+
content: `Summarize these meeting notes:\n\n${text}`,
|
|
353
|
+
},
|
|
354
|
+
]);
|
|
355
|
+
return res.content;
|
|
356
|
+
}
|
|
357
|
+
async embed(text) {
|
|
358
|
+
let chunks;
|
|
359
|
+
if (typeof text === 'string') {
|
|
360
|
+
chunks = text
|
|
361
|
+
.split(/\n\s*\n/)
|
|
362
|
+
.map((c) => c.trim())
|
|
363
|
+
.filter((c) => c.length > 0);
|
|
364
|
+
if (chunks.length === 0 && text.trim().length > 0) {
|
|
365
|
+
chunks = [text.trim()];
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
chunks = text;
|
|
370
|
+
}
|
|
371
|
+
if (chunks.length === 0)
|
|
372
|
+
return [];
|
|
373
|
+
const result = await this.brain.embed(chunks);
|
|
374
|
+
return Array.isArray(result) ? result : [result];
|
|
375
|
+
}
|
|
376
|
+
async close() {
|
|
377
|
+
await this.capture.close().catch(() => { });
|
|
378
|
+
if (!this.child)
|
|
379
|
+
return;
|
|
380
|
+
this.lockfile?.remove();
|
|
381
|
+
this.child.kill('SIGTERM');
|
|
382
|
+
await new Promise((resolve) => {
|
|
383
|
+
const timer = setTimeout(() => {
|
|
384
|
+
this.child?.kill('SIGKILL');
|
|
385
|
+
resolve();
|
|
386
|
+
}, 5_000);
|
|
387
|
+
this.child.once('exit', () => {
|
|
388
|
+
clearTimeout(timer);
|
|
389
|
+
resolve();
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
async waitForHealth(timeoutMs) {
|
|
394
|
+
const deadline = Date.now() + timeoutMs;
|
|
395
|
+
let lastErr;
|
|
396
|
+
while (Date.now() < deadline) {
|
|
397
|
+
try {
|
|
398
|
+
await this.health();
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
catch (e) {
|
|
402
|
+
lastErr = e;
|
|
403
|
+
await sleep(200);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
throw new Error(`engine did not respond within ${timeoutMs}ms: ${String(lastErr)}`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
export { AiraEngine as Aira };
|
|
410
|
+
function defaultModelsDir() {
|
|
411
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? '.';
|
|
412
|
+
return path.join(home, '.aira', 'models');
|
|
413
|
+
}
|
|
414
|
+
function findOptionalEnginePath(explicit) {
|
|
415
|
+
if (explicit) {
|
|
416
|
+
if (fs.existsSync(explicit))
|
|
417
|
+
return explicit;
|
|
418
|
+
throw new Error(`aira-engine binary not found at ${explicit}`);
|
|
419
|
+
}
|
|
420
|
+
const env = process.env.AIRA_ENGINE_BIN;
|
|
421
|
+
if (env && fs.existsSync(env))
|
|
422
|
+
return env;
|
|
423
|
+
const bundled = path.resolve(__dirname, '..', 'bin', 'aira-engine');
|
|
424
|
+
if (fs.existsSync(bundled))
|
|
425
|
+
return bundled;
|
|
426
|
+
// Check sibling checkout `../AiraEngine/.build/release/aira-engine` for local dev convenience
|
|
427
|
+
const sibling = path.resolve(__dirname, '..', '..', 'AiraEngine', '.build', 'release', 'aira-engine');
|
|
428
|
+
if (fs.existsSync(sibling))
|
|
429
|
+
return fs.realpathSync(sibling);
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
function sleep(ms) {
|
|
433
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
434
|
+
}
|
|
435
|
+
function readAnnouncedPort(child, timeoutMs) {
|
|
436
|
+
return new Promise((resolve, reject) => {
|
|
437
|
+
let buf = '';
|
|
438
|
+
let resolved = false;
|
|
439
|
+
const stdout = child.stdout;
|
|
440
|
+
const timer = setTimeout(() => {
|
|
441
|
+
if (resolved)
|
|
442
|
+
return;
|
|
443
|
+
resolved = true;
|
|
444
|
+
stdout.off('data', onData);
|
|
445
|
+
reject(new Error(`engine did not announce port within ${timeoutMs}ms`));
|
|
446
|
+
}, timeoutMs);
|
|
447
|
+
const onExit = () => {
|
|
448
|
+
if (resolved)
|
|
449
|
+
return;
|
|
450
|
+
resolved = true;
|
|
451
|
+
clearTimeout(timer);
|
|
452
|
+
reject(new Error('engine exited before announcing port'));
|
|
453
|
+
};
|
|
454
|
+
const onData = (chunk) => {
|
|
455
|
+
process.stdout.write(chunk);
|
|
456
|
+
if (resolved)
|
|
457
|
+
return;
|
|
458
|
+
buf += chunk.toString('utf8');
|
|
459
|
+
const m = buf.match(ANNOUNCE_RE);
|
|
460
|
+
if (m) {
|
|
461
|
+
resolved = true;
|
|
462
|
+
clearTimeout(timer);
|
|
463
|
+
child.off('exit', onExit);
|
|
464
|
+
resolve(parseInt(m[2], 10));
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
stdout.on('data', onData);
|
|
468
|
+
child.once('exit', onExit);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/eyes.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { NativeCaptureBridge } from './capture.js';
|
|
3
|
+
import type { AiraEngine } from './engine.js';
|
|
4
|
+
import { resolveDiarizationProvider, resolveSTTProvider } from './engine.js';
|
|
5
|
+
import type { ChromeEvent, EyesEvent, MeetingTarget, StartMeetingOptions } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Aira Eyes: macOS meeting detection, native AX/DOM speaker scraping,
|
|
8
|
+
* CoreAudio Process Tap capture, and pluggable STT/Diarization attribution.
|
|
9
|
+
*/
|
|
10
|
+
export declare class Eyes {
|
|
11
|
+
private readonly engine;
|
|
12
|
+
private readonly capture;
|
|
13
|
+
constructor(engine: AiraEngine, capture: NativeCaptureBridge);
|
|
14
|
+
/** Forward visual state from an extension or webview. */
|
|
15
|
+
pushChromeEvent(event: ChromeEvent): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Check or prompt for macOS permissions (`accessibility`, `screen-capture`, `microphone`, `system-audio`).
|
|
18
|
+
*/
|
|
19
|
+
checkPermissions(prompt?: boolean): Promise<Record<string, 'granted' | 'denied'>>;
|
|
20
|
+
/**
|
|
21
|
+
* Open a live attributed-transcript session using `aira-capture` and the configured
|
|
22
|
+
* (or per-session overridden) `STTProvider` and `DiarizationProvider`.
|
|
23
|
+
*/
|
|
24
|
+
start(target: MeetingTarget, opts?: StartMeetingOptions): EyesSession;
|
|
25
|
+
/**
|
|
26
|
+
* Watch for active meeting targets on the local machine.
|
|
27
|
+
*/
|
|
28
|
+
watchMeetings(): MeetingWatcher;
|
|
29
|
+
}
|
|
30
|
+
export declare class EyesSession extends EventEmitter {
|
|
31
|
+
private readonly capture;
|
|
32
|
+
readonly target: MeetingTarget;
|
|
33
|
+
private readonly queue;
|
|
34
|
+
private readonly waiters;
|
|
35
|
+
private readonly pipeline;
|
|
36
|
+
private readonly startPromise;
|
|
37
|
+
private closed;
|
|
38
|
+
private readonly onRosterBound;
|
|
39
|
+
private readonly onSpeakerActivityBound;
|
|
40
|
+
private readonly onSpeakerChangeBound;
|
|
41
|
+
private readonly onAudioBound;
|
|
42
|
+
constructor(capture: NativeCaptureBridge, target: MeetingTarget, opts: {
|
|
43
|
+
stt?: ReturnType<typeof resolveSTTProvider>;
|
|
44
|
+
diarize?: ReturnType<typeof resolveDiarizationProvider>;
|
|
45
|
+
transcribeOptions?: StartMeetingOptions['transcribeOptions'];
|
|
46
|
+
batchChunkSeconds?: number;
|
|
47
|
+
});
|
|
48
|
+
private pushFrame;
|
|
49
|
+
get events(): AsyncIterable<EyesEvent>;
|
|
50
|
+
ready(): Promise<void>;
|
|
51
|
+
close(): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
export declare class MeetingWatcher extends EventEmitter {
|
|
54
|
+
private readonly capture;
|
|
55
|
+
private closed;
|
|
56
|
+
private readonly onMeetingsBound;
|
|
57
|
+
constructor(capture: NativeCaptureBridge);
|
|
58
|
+
close(): void;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=eyes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eyes.d.ts","sourceRoot":"","sources":["../src/eyes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,KAAK,EAIV,mBAAmB,EACpB,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAEnB;;;GAGG;AACH,qBAAa,IAAI;IAEb,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,mBAAmB;IAG/C,yDAAyD;IACnD,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD;;OAEG;IACG,gBAAgB,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IAIrF;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,mBAAwB,GAAG,WAAW;IAWzE;;OAEG;IACH,aAAa,IAAI,cAAc;CAGhC;AAED,qBAAa,WAAY,SAAQ,YAAY;IAazC,OAAO,CAAC,QAAQ,CAAC,OAAO;aACR,MAAM,EAAE,aAAa;IAbvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiD;IACzE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoC;IAC3E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAoC;IACzE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;gBAG5C,OAAO,EAAE,mBAAmB,EAC7B,MAAM,EAAE,aAAa,EACrC,IAAI,EAAE;QACJ,GAAG,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;QAC3C,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAA;QACvD,iBAAiB,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAA;QAC5D,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAC3B;IAsCH,OAAO,CAAC,SAAS;IAOjB,IAAI,MAAM,IAAI,aAAa,CAAC,SAAS,CAAC,CAmBrC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB7B;AAED,qBAAa,cAAe,SAAQ,YAAY;IAIlC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;gBAExC,OAAO,EAAE,mBAAmB;IAkBzD,KAAK,IAAI,IAAI;CAOd"}
|