@secondcontext/btx-cli 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/login.js CHANGED
@@ -2,6 +2,111 @@ import { spawn } from 'node:child_process';
2
2
  import http from 'node:http';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import { setDesktopFallbackEnabled, loadDesktopAuthSession, loadLocalAuthSession, writeStoredAuthSession, } from './config.js';
5
+ function loadTestBrowserLoginSession(apiUrl) {
6
+ const raw = process.env.BTX_TEST_BROWSER_LOGIN_SESSION?.trim();
7
+ if (!raw)
8
+ return null;
9
+ try {
10
+ const parsed = JSON.parse(raw);
11
+ const accessToken = typeof parsed.access_token === 'string' ? parsed.access_token.trim() : '';
12
+ if (!accessToken)
13
+ return null;
14
+ const session = {
15
+ access_token: accessToken,
16
+ refresh_token: typeof parsed.refresh_token === 'string' ? parsed.refresh_token : '',
17
+ expires_at: typeof parsed.expires_at === 'number' && Number.isFinite(parsed.expires_at)
18
+ ? parsed.expires_at
19
+ : Math.floor(Date.now() / 1000) + 3600,
20
+ ...(typeof parsed.supabase_url === 'string' && parsed.supabase_url
21
+ ? { supabase_url: parsed.supabase_url }
22
+ : {}),
23
+ ...(typeof parsed.supabase_anon_key === 'string' && parsed.supabase_anon_key
24
+ ? { supabase_anon_key: parsed.supabase_anon_key }
25
+ : {}),
26
+ ...(typeof parsed.api_url === 'string' && parsed.api_url
27
+ ? { api_url: parsed.api_url }
28
+ : {}),
29
+ };
30
+ const loginUrl = new URL('/auth/cli', apiUrl);
31
+ loginUrl.searchParams.set('mock', 'true');
32
+ return {
33
+ loginUrl: loginUrl.toString(),
34
+ session,
35
+ };
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ async function readResponseError(response) {
42
+ try {
43
+ const json = (await response.clone().json());
44
+ if (typeof json.error === 'string' && json.error.trim())
45
+ return json.error.trim();
46
+ }
47
+ catch {
48
+ // fall through to plain text
49
+ }
50
+ try {
51
+ const text = (await response.text()).trim();
52
+ return text || null;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ async function validateAuthSession(session, apiUrl, env) {
59
+ const normalized = normalizeStoredSession(session, apiUrl, env);
60
+ const requestProjects = (accessToken) => fetch(`${normalized.api_url ?? apiUrl}/api/projects`, {
61
+ method: 'GET',
62
+ headers: {
63
+ authorization: `Bearer ${accessToken}`,
64
+ },
65
+ });
66
+ const refreshSession = async () => {
67
+ if (!normalized.refresh_token ||
68
+ !normalized.supabase_url ||
69
+ !normalized.supabase_anon_key) {
70
+ return null;
71
+ }
72
+ const response = await fetch(`${normalized.supabase_url}/auth/v1/token?grant_type=refresh_token`, {
73
+ method: 'POST',
74
+ headers: {
75
+ 'content-type': 'application/json',
76
+ apikey: normalized.supabase_anon_key,
77
+ },
78
+ body: JSON.stringify({ refresh_token: normalized.refresh_token }),
79
+ });
80
+ if (!response.ok)
81
+ return null;
82
+ const data = (await response.json());
83
+ return {
84
+ access_token: data.access_token,
85
+ refresh_token: data.refresh_token,
86
+ expires_at: Math.floor(Date.now() / 1000) + data.expires_in,
87
+ supabase_url: normalized.supabase_url,
88
+ supabase_anon_key: normalized.supabase_anon_key,
89
+ api_url: normalized.api_url ?? apiUrl,
90
+ };
91
+ };
92
+ let response = await requestProjects(normalized.access_token);
93
+ if (response.ok)
94
+ return normalized;
95
+ if (response.status !== 401) {
96
+ const detail = await readResponseError(response);
97
+ throw new Error(detail ?? `BTX API request failed while validating the current auth session (${response.status}).`);
98
+ }
99
+ const refreshed = await refreshSession();
100
+ if (!refreshed)
101
+ return null;
102
+ response = await requestProjects(refreshed.access_token);
103
+ if (response.ok)
104
+ return refreshed;
105
+ if (response.status === 401)
106
+ return null;
107
+ const detail = await readResponseError(response);
108
+ throw new Error(detail ?? `BTX API request failed while validating the refreshed auth session (${response.status}).`);
109
+ }
5
110
  function normalizeStoredSession(session, apiUrl, env) {
6
111
  return {
7
112
  ...session,
@@ -27,16 +132,25 @@ function createPendingLogin(state, timeoutMs) {
27
132
  return new Promise((resolve, reject) => {
28
133
  const server = http.createServer();
29
134
  let settled = false;
135
+ let closed = false;
30
136
  let timeout = null;
31
137
  let resolveSession = null;
32
138
  let rejectSession = null;
139
+ const closeOnce = async () => {
140
+ if (closed)
141
+ return;
142
+ closed = true;
143
+ if (!server.listening)
144
+ return;
145
+ await closeServer(server).catch(() => { });
146
+ };
33
147
  const waitForSession = new Promise((resolvePromise, rejectPromise) => {
34
148
  resolveSession = resolvePromise;
35
149
  rejectSession = rejectPromise;
36
150
  }).finally(async () => {
37
151
  if (timeout)
38
152
  clearTimeout(timeout);
39
- await closeServer(server).catch(() => { });
153
+ await closeOnce();
40
154
  });
41
155
  function finishWithError(error) {
42
156
  if (settled)
@@ -127,7 +241,7 @@ function createPendingLogin(state, timeoutMs) {
127
241
  resolve({
128
242
  port: address.port,
129
243
  waitForSession,
130
- close: () => closeServer(server),
244
+ close: closeOnce,
131
245
  });
132
246
  });
133
247
  });
@@ -160,25 +274,42 @@ export async function loginToBtx(options) {
160
274
  const { apiUrl, env, force = false, openBrowser = true, onBrowserLoginStart, timeoutMs = 10 * 60 * 1000, } = options;
161
275
  const localSession = loadLocalAuthSession();
162
276
  if (localSession && !force) {
163
- setDesktopFallbackEnabled(true);
164
- const normalized = normalizeStoredSession(localSession, apiUrl, env);
165
- if (!sessionsEqual(localSession, normalized))
166
- writeStoredAuthSession(normalized);
167
- return {
168
- authSource: 'local',
169
- apiUrl,
170
- browserOpened: false,
171
- session: normalized,
172
- };
277
+ const validated = await validateAuthSession(localSession, apiUrl, env);
278
+ if (validated) {
279
+ setDesktopFallbackEnabled(true);
280
+ if (!sessionsEqual(localSession, validated))
281
+ writeStoredAuthSession(validated);
282
+ return {
283
+ authSource: 'local',
284
+ apiUrl,
285
+ browserOpened: false,
286
+ session: validated,
287
+ };
288
+ }
173
289
  }
174
290
  const desktopSession = loadDesktopAuthSession();
175
291
  if (desktopSession && !force) {
176
- const normalized = normalizeStoredSession(desktopSession, apiUrl, env);
292
+ const validated = await validateAuthSession(desktopSession, apiUrl, env);
293
+ if (validated) {
294
+ writeStoredAuthSession(validated);
295
+ return {
296
+ authSource: 'desktop',
297
+ apiUrl,
298
+ browserOpened: false,
299
+ session: validated,
300
+ };
301
+ }
302
+ }
303
+ const testBrowserLogin = loadTestBrowserLoginSession(apiUrl);
304
+ if (testBrowserLogin) {
305
+ onBrowserLoginStart?.({ loginUrl: testBrowserLogin.loginUrl, browserOpened: false });
306
+ const normalized = normalizeStoredSession(testBrowserLogin.session, apiUrl, env);
177
307
  writeStoredAuthSession(normalized);
178
308
  return {
179
- authSource: 'desktop',
309
+ authSource: 'browser',
180
310
  apiUrl,
181
311
  browserOpened: false,
312
+ loginUrl: testBrowserLogin.loginUrl,
182
313
  session: normalized,
183
314
  };
184
315
  }
@@ -186,8 +317,8 @@ export async function loginToBtx(options) {
186
317
  const pending = await createPendingLogin(state, timeoutMs);
187
318
  const loginUrl = buildLoginUrl(apiUrl, pending.port, state);
188
319
  const browserOpened = openBrowser ? openInBrowser(loginUrl) : false;
189
- onBrowserLoginStart?.({ loginUrl, browserOpened });
190
320
  try {
321
+ onBrowserLoginStart?.({ loginUrl, browserOpened });
191
322
  const session = await pending.waitForSession;
192
323
  const normalized = normalizeStoredSession(session, apiUrl, env);
193
324
  writeStoredAuthSession(normalized);
package/dist/login.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-cli.d.ts","sourceRoot":"","sources":["../src/runtime-cli.ts"],"names":[],"mappings":"AAmNA,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAgvED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,aAA2B,GAC/B,OAAO,CAAC,IAAI,CAAC,CAiRf"}
1
+ {"version":3,"file":"runtime-cli.d.ts","sourceRoot":"","sources":["../src/runtime-cli.ts"],"names":[],"mappings":"AAiPA,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AA48ED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,aAA2B,GAC/B,OAAO,CAAC,IAAI,CAAC,CA+Rf"}
@@ -365,6 +365,107 @@ function formatMeetingTranscript(m) {
365
365
  console.log(`[${time}] ${speaker}: ${seg.text}`);
366
366
  }
367
367
  }
368
+ function recordingTitle(recording) {
369
+ return (recording.meetingTitle?.trim() ||
370
+ recording.originalFilename?.trim() ||
371
+ 'Untitled recording');
372
+ }
373
+ function recordingTimestamp(recording) {
374
+ return recording.meetingDate || recording.uploadedAt || recording.transcribedAt || recording.createdAt || null;
375
+ }
376
+ function formatRecordingDuration(durationMs) {
377
+ if (!durationMs || durationMs <= 0)
378
+ return '';
379
+ const totalSeconds = Math.max(0, Math.floor(durationMs / 1000));
380
+ const minutes = Math.floor(totalSeconds / 60);
381
+ const seconds = totalSeconds % 60;
382
+ const hours = Math.floor(minutes / 60);
383
+ if (hours > 0) {
384
+ return `${hours}:${String(minutes % 60).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
385
+ }
386
+ return `${minutes}:${String(seconds).padStart(2, '0')}`;
387
+ }
388
+ function formatRecordingTable(recordings) {
389
+ if (recordings.length === 0) {
390
+ console.log('No recordings found.');
391
+ return;
392
+ }
393
+ const idW = 10;
394
+ const dateW = 12;
395
+ const statusW = 12;
396
+ const sourceW = 12;
397
+ const durationW = 8;
398
+ console.log(`${padRight('ID', idW)} ${padRight('Date', dateW)} ${padRight('Status', statusW)} ${padRight('Source', sourceW)} ${padRight('Dur', durationW)} Title`);
399
+ console.log(`${'\u2500'.repeat(idW)} ${'\u2500'.repeat(dateW)} ${'\u2500'.repeat(statusW)} ${'\u2500'.repeat(sourceW)} ${'\u2500'.repeat(durationW)} ${'\u2500'.repeat(40)}`);
400
+ for (const recording of recordings) {
401
+ const date = recordingTimestamp(recording)
402
+ ? new Date(recordingTimestamp(recording)).toISOString().slice(0, 10)
403
+ : '';
404
+ console.log(`${padRight(truncate(recording.id, idW), idW)} ${padRight(date, dateW)} ${padRight(truncate(recording.status || '', statusW), statusW)} ${padRight(truncate(recording.source || '', sourceW), sourceW)} ${padRight(formatRecordingDuration(recording.durationMs), durationW)} ${truncate(recordingTitle(recording), 52)}`);
405
+ }
406
+ console.log(`\n${recordings.length} recording${recordings.length !== 1 ? 's' : ''} found`);
407
+ }
408
+ function formatRecordingDetail(recording) {
409
+ console.log(`Recording: ${recordingTitle(recording)}`);
410
+ console.log(`ID: ${recording.id}`);
411
+ if (recording.meetingId)
412
+ console.log(`Meeting ID: ${recording.meetingId}`);
413
+ if (recordingTimestamp(recording)) {
414
+ console.log(`Date: ${new Date(recordingTimestamp(recording)).toISOString().slice(0, 10)}`);
415
+ }
416
+ if (recording.source)
417
+ console.log(`Source: ${recording.source}`);
418
+ if (recording.status)
419
+ console.log(`Status: ${recording.status}`);
420
+ if (recording.kind)
421
+ console.log(`Kind: ${recording.kind}`);
422
+ if (recording.captureMode)
423
+ console.log(`Capture: ${recording.captureMode}`);
424
+ if (recording.languageHint) {
425
+ const detected = recording.detectedLanguage ? ` (detected ${recording.detectedLanguage})` : '';
426
+ console.log(`Language: ${recording.languageHint}${detected}`);
427
+ }
428
+ if (recording.durationMs)
429
+ console.log(`Duration: ${formatRecordingDuration(recording.durationMs)}`);
430
+ if (recording.originalFilename)
431
+ console.log(`Filename: ${recording.originalFilename}`);
432
+ if (recording.mimeType)
433
+ console.log(`MIME: ${recording.mimeType}`);
434
+ if (recording.error)
435
+ console.log(`Error: ${recording.error}`);
436
+ if (recording.transcriptText?.trim()) {
437
+ console.log(`\nTranscript Preview:\n ${recording.transcriptText.trim().replace(/\n/g, '\n ')}`);
438
+ }
439
+ }
440
+ function recordingSpeakerLabel(source) {
441
+ const normalized = source?.trim();
442
+ if (!normalized)
443
+ return 'Speaker';
444
+ return normalized.replace(/[_-]+/g, ' ');
445
+ }
446
+ function formatRecordingTranscript(recording) {
447
+ const transcript = recording.transcript ?? [];
448
+ const transcriptText = recording.transcriptText?.trim() ?? '';
449
+ if (transcript.length === 0 && !transcriptText) {
450
+ console.log('No transcript available for this recording.');
451
+ return;
452
+ }
453
+ console.log(`Transcript: ${recordingTitle(recording)}`);
454
+ if (recordingTimestamp(recording)) {
455
+ console.log(`Date: ${new Date(recordingTimestamp(recording)).toISOString().slice(0, 10)}`);
456
+ }
457
+ if (transcript.length > 0) {
458
+ console.log(`Segments: ${transcript.length}`);
459
+ console.log('');
460
+ for (const segment of transcript) {
461
+ const time = segment.start_time || '';
462
+ console.log(`[${time}] ${recordingSpeakerLabel(segment.speaker?.source)}: ${segment.text}`);
463
+ }
464
+ return;
465
+ }
466
+ console.log('');
467
+ console.log(transcriptText);
468
+ }
368
469
  function sessionPayload(s) {
369
470
  return JSON.stringify({
370
471
  sessionId: s.sessionId,
@@ -455,7 +556,7 @@ function formatSessionDetail(session, activities) {
455
556
  }
456
557
  // ── Help ─────────────────────────────────────────────────────────────────────
457
558
  const HELP = {
458
- top: `BTX CLI - manage tasks, contacts, meetings, and leads from a session.
559
+ top: `BTX CLI - manage tasks, contacts, meetings, recordings, and leads from a session.
459
560
 
460
561
  Usage:
461
562
  node "$BTX_CLI_PATH" <resource> <command> [flags]
@@ -467,6 +568,7 @@ Resources:
467
568
  contacts View and update contacts, add notes
468
569
  orgs View organizations, add notes
469
570
  meetings View meeting recordings and transcripts
571
+ recordings View recording imports and transcripts
470
572
  leads List lead types
471
573
  user Manage your profile notes
472
574
  intro-paths Find warm intro paths in your network
@@ -477,8 +579,10 @@ Resources:
477
579
  Examples:
478
580
  node "$BTX_CLI_PATH" tasks list --status todo
479
581
  node "$BTX_CLI_PATH" tasks list --json
582
+ node "$BTX_CLI_PATH" recordings list --days 7
583
+ node "$BTX_CLI_PATH" recordings transcript <recording-id>
480
584
  node "$BTX_CLI_PATH" meetings list --days 7
481
- node "$BTX_CLI_PATH" meetings get <meeting-id> --transcript
585
+ node "$BTX_CLI_PATH" meetings transcript <meeting-id>
482
586
  node "$BTX_CLI_PATH" contacts --help
483
587
 
484
588
  All resource commands support --json for machine-readable output.`,
@@ -652,6 +756,27 @@ Examples:
652
756
  node "$BTX_CLI_PATH" meetings list --query "onboarding"
653
757
  node "$BTX_CLI_PATH" meetings get abc123
654
758
  node "$BTX_CLI_PATH" meetings transcript abc123`,
759
+ recordings: `BTX recordings - view synced recordings and transcripts.
760
+
761
+ Commands:
762
+ list List recordings (filterable by date, source, status)
763
+ get Get recording details
764
+ transcript Get the full transcript for a recording
765
+
766
+ Flags:
767
+ recordings list [--days <n>] [--query "text"] [--status <status>] [--source <source>]
768
+ recordings get <recording-id>
769
+ recordings transcript <recording-id>
770
+
771
+ The --days flag filters to recordings from the last N days (default: all).
772
+ Use "list" to browse imported or uploaded recordings, "get" for metadata,
773
+ and "transcript" for the transcript text coding agents can consume directly.
774
+
775
+ Examples:
776
+ node "$BTX_CLI_PATH" recordings list
777
+ node "$BTX_CLI_PATH" recordings list --days 7
778
+ node "$BTX_CLI_PATH" recordings list --source granola
779
+ node "$BTX_CLI_PATH" recordings transcript abc123`,
655
780
  context: `BTX context - fetch the current project business context.
656
781
 
657
782
  Commands:
@@ -1284,7 +1409,7 @@ async function fetchSessions(flags) {
1284
1409
  return sessions;
1285
1410
  }
1286
1411
  async function fetchSession(sessionId) {
1287
- const result = await api('GET', `/sessions?sessionId=${encodeURIComponent(sessionId)}`);
1412
+ const result = await api('GET', `/sessions/${encodeURIComponent(sessionId)}`);
1288
1413
  return result.session ?? null;
1289
1414
  }
1290
1415
  async function fetchSessionActivities(sessionId, limit) {
@@ -1966,6 +2091,10 @@ async function fetchMeetings() {
1966
2091
  const result = await api('GET', '/meetings');
1967
2092
  return result?.meetings ?? [];
1968
2093
  }
2094
+ async function fetchRecordings() {
2095
+ const result = await api('GET', '/recordings');
2096
+ return result?.recordings ?? [];
2097
+ }
1969
2098
  async function meetingsList(flags) {
1970
2099
  let meetings = await fetchMeetings();
1971
2100
  if (flags.days) {
@@ -2012,6 +2141,71 @@ async function meetingsTranscript(id, flags) {
2012
2141
  }
2013
2142
  formatMeetingTranscript(meeting);
2014
2143
  }
2144
+ async function recordingsList(flags) {
2145
+ let recordings = await fetchRecordings();
2146
+ if (flags.days) {
2147
+ const cutoff = new Date();
2148
+ cutoff.setDate(cutoff.getDate() - Number(flags.days));
2149
+ const cutoffStr = cutoff.toISOString();
2150
+ recordings = recordings.filter((recording) => {
2151
+ const timestamp = recordingTimestamp(recording);
2152
+ return timestamp != null && timestamp >= cutoffStr;
2153
+ });
2154
+ }
2155
+ if (flags.status) {
2156
+ const expected = flags.status.toLowerCase();
2157
+ recordings = recordings.filter((recording) => (recording.status || '').toLowerCase() === expected);
2158
+ }
2159
+ if (flags.source) {
2160
+ const expected = flags.source.toLowerCase();
2161
+ recordings = recordings.filter((recording) => (recording.source || '').toLowerCase() === expected);
2162
+ }
2163
+ if (flags.query) {
2164
+ const q = flags.query.toLowerCase();
2165
+ recordings = recordings.filter((recording) => recordingTitle(recording).toLowerCase().includes(q) ||
2166
+ (recording.originalFilename || '').toLowerCase().includes(q) ||
2167
+ (recording.transcriptText || '').toLowerCase().includes(q) ||
2168
+ (recording.source || '').toLowerCase().includes(q) ||
2169
+ (recording.status || '').toLowerCase().includes(q));
2170
+ }
2171
+ if (isJson(flags)) {
2172
+ printJson(recordings);
2173
+ return;
2174
+ }
2175
+ formatRecordingTable(recordings);
2176
+ }
2177
+ async function recordingsGet(id, flags) {
2178
+ if (!id)
2179
+ die('Usage: btx recordings get <recording-id>');
2180
+ const recordings = await fetchRecordings();
2181
+ const recording = recordings.find((item) => item.id === id);
2182
+ if (!recording)
2183
+ die(`Recording not found: ${id}`);
2184
+ if (isJson(flags)) {
2185
+ printJson(recording);
2186
+ return;
2187
+ }
2188
+ formatRecordingDetail(recording);
2189
+ }
2190
+ async function recordingsTranscript(id, flags) {
2191
+ if (!id)
2192
+ die('Usage: btx recordings transcript <recording-id>');
2193
+ const recordings = await fetchRecordings();
2194
+ const recording = recordings.find((item) => item.id === id);
2195
+ if (!recording)
2196
+ die(`Recording not found: ${id}`);
2197
+ if (isJson(flags)) {
2198
+ printJson({
2199
+ id: recording.id,
2200
+ meetingId: recording.meetingId ?? null,
2201
+ title: recordingTitle(recording),
2202
+ transcriptText: recording.transcriptText ?? '',
2203
+ transcript: recording.transcript ?? [],
2204
+ });
2205
+ return;
2206
+ }
2207
+ formatRecordingTranscript(recording);
2208
+ }
2015
2209
  // ── Main ────────────────────────────────────────────────────────────────────
2016
2210
  export async function runRuntimeCli(args, env = process.env) {
2017
2211
  configureRuntime(env);
@@ -2032,6 +2226,7 @@ export async function runRuntimeCli(args, env = process.env) {
2032
2226
  'contacts',
2033
2227
  'orgs',
2034
2228
  'meetings',
2229
+ 'recordings',
2035
2230
  'leads',
2036
2231
  'user',
2037
2232
  'intro-paths',
@@ -2174,6 +2369,18 @@ export async function runRuntimeCli(args, env = process.env) {
2174
2369
  die(`Unknown meetings command: "${command || '(none)'}". Run: node "$BTX_CLI_PATH" meetings --help`);
2175
2370
  }
2176
2371
  }
2372
+ else if (resource === 'recordings') {
2373
+ switch (command) {
2374
+ case 'list':
2375
+ return recordingsList(flags);
2376
+ case 'get':
2377
+ return recordingsGet(positional[2], flags);
2378
+ case 'transcript':
2379
+ return recordingsTranscript(positional[2], flags);
2380
+ default:
2381
+ die(`Unknown recordings command: "${command || '(none)'}". Run: node "$BTX_CLI_PATH" recordings --help`);
2382
+ }
2383
+ }
2177
2384
  else if (resource === 'intro-paths') {
2178
2385
  switch (command) {
2179
2386
  case 'find':