@alta-foundation/plaud-extractor 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +9 -0
- package/.github/workflows/ci.yml +33 -0
- package/.github/workflows/publish.yml +46 -0
- package/CLAUDE.md +53 -0
- package/README.md +318 -0
- package/dist/PlaudExtractor.d.ts +61 -0
- package/dist/PlaudExtractor.d.ts.map +1 -0
- package/dist/PlaudExtractor.js +236 -0
- package/dist/PlaudExtractor.js.map +1 -0
- package/dist/auth/browser-auth.d.ts +10 -0
- package/dist/auth/browser-auth.d.ts.map +1 -0
- package/dist/auth/browser-auth.js +220 -0
- package/dist/auth/browser-auth.js.map +1 -0
- package/dist/auth/token-store.d.ts +9 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +74 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/types.d.ts +266 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +32 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +30 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +22 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/backfill.d.ts +3 -0
- package/dist/cli/commands/backfill.d.ts.map +1 -0
- package/dist/cli/commands/backfill.js +59 -0
- package/dist/cli/commands/backfill.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +55 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +3 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +28 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/exit-codes.d.ts +8 -0
- package/dist/cli/exit-codes.d.ts.map +1 -0
- package/dist/cli/exit-codes.js +16 -0
- package/dist/cli/exit-codes.js.map +1 -0
- package/dist/cli/options.d.ts +31 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +11 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/client/endpoints.d.ts +26 -0
- package/dist/client/endpoints.d.ts.map +1 -0
- package/dist/client/endpoints.js +54 -0
- package/dist/client/endpoints.js.map +1 -0
- package/dist/client/http.d.ts +17 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +92 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/plaud-client.d.ts +14 -0
- package/dist/client/plaud-client.d.ts.map +1 -0
- package/dist/client/plaud-client.js +216 -0
- package/dist/client/plaud-client.js.map +1 -0
- package/dist/client/types.d.ts +154 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +41 -0
- package/dist/client/types.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +37 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/job-tools.d.ts +3 -0
- package/dist/mcp/job-tools.d.ts.map +1 -0
- package/dist/mcp/job-tools.js +108 -0
- package/dist/mcp/job-tools.js.map +1 -0
- package/dist/mcp/read-tools.d.ts +3 -0
- package/dist/mcp/read-tools.d.ts.map +1 -0
- package/dist/mcp/read-tools.js +173 -0
- package/dist/mcp/read-tools.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +32 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/storage/atomic.d.ts +5 -0
- package/dist/storage/atomic.d.ts.map +1 -0
- package/dist/storage/atomic.js +51 -0
- package/dist/storage/atomic.js.map +1 -0
- package/dist/storage/checksums.d.ts +15 -0
- package/dist/storage/checksums.d.ts.map +1 -0
- package/dist/storage/checksums.js +56 -0
- package/dist/storage/checksums.js.map +1 -0
- package/dist/storage/dataset-writer.d.ts +21 -0
- package/dist/storage/dataset-writer.d.ts.map +1 -0
- package/dist/storage/dataset-writer.js +52 -0
- package/dist/storage/dataset-writer.js.map +1 -0
- package/dist/storage/paths.d.ts +9 -0
- package/dist/storage/paths.d.ts.map +1 -0
- package/dist/storage/paths.js +38 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/storage/recording-store.d.ts +24 -0
- package/dist/storage/recording-store.d.ts.map +1 -0
- package/dist/storage/recording-store.js +161 -0
- package/dist/storage/recording-store.js.map +1 -0
- package/dist/sync/download-queue.d.ts +21 -0
- package/dist/sync/download-queue.d.ts.map +1 -0
- package/dist/sync/download-queue.js +82 -0
- package/dist/sync/download-queue.js.map +1 -0
- package/dist/sync/incremental.d.ts +21 -0
- package/dist/sync/incremental.d.ts.map +1 -0
- package/dist/sync/incremental.js +96 -0
- package/dist/sync/incremental.js.map +1 -0
- package/dist/sync/sync-engine.d.ts +6 -0
- package/dist/sync/sync-engine.d.ts.map +1 -0
- package/dist/sync/sync-engine.js +135 -0
- package/dist/sync/sync-engine.js.map +1 -0
- package/dist/sync/types.d.ts +130 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +17 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/transcript/formatter.d.ts +4 -0
- package/dist/transcript/formatter.d.ts.map +1 -0
- package/dist/transcript/formatter.js +88 -0
- package/dist/transcript/formatter.js.map +1 -0
- package/package.json +41 -0
- package/src/PlaudExtractor.ts +275 -0
- package/src/auth/browser-auth.ts +248 -0
- package/src/auth/token-store.ts +79 -0
- package/src/auth/types.ts +41 -0
- package/src/cli/bin.ts +30 -0
- package/src/cli/commands/auth.ts +27 -0
- package/src/cli/commands/backfill.ts +77 -0
- package/src/cli/commands/sync.ts +71 -0
- package/src/cli/commands/verify.ts +31 -0
- package/src/cli/exit-codes.ts +14 -0
- package/src/cli/options.ts +10 -0
- package/src/client/endpoints.ts +62 -0
- package/src/client/http.ts +110 -0
- package/src/client/plaud-client.ts +268 -0
- package/src/client/types.ts +62 -0
- package/src/errors.ts +57 -0
- package/src/index.ts +17 -0
- package/src/logger.ts +49 -0
- package/src/mcp/job-tools.ts +156 -0
- package/src/mcp/read-tools.ts +204 -0
- package/src/mcp/server.ts +39 -0
- package/src/storage/atomic.ts +51 -0
- package/src/storage/checksums.ts +76 -0
- package/src/storage/dataset-writer.ts +74 -0
- package/src/storage/paths.ts +44 -0
- package/src/storage/recording-store.ts +182 -0
- package/src/sync/download-queue.ts +102 -0
- package/src/sync/incremental.ts +111 -0
- package/src/sync/sync-engine.ts +183 -0
- package/src/sync/types.ts +64 -0
- package/src/transcript/formatter.ts +91 -0
- package/tsconfig.build.json +8 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Shared option definitions (reused across commands if needed in future)
|
|
2
|
+
export const COMMON_OPTIONS = {
|
|
3
|
+
out: { flags: '--out <dir>', description: 'Output directory' },
|
|
4
|
+
verbose: { flags: '--verbose', description: 'Verbose logging' },
|
|
5
|
+
redact: { flags: '--redact', description: 'Redact auth tokens from logs' },
|
|
6
|
+
dryRun: { flags: '--dry-run', description: 'Print plan without downloading' },
|
|
7
|
+
concurrency: { flags: '--concurrency <n>', description: 'Parallel downloads (default: 3)' },
|
|
8
|
+
formats: { flags: '--formats <list>', description: 'Transcript formats: json,txt,md' },
|
|
9
|
+
limit: { flags: '--limit <n>', description: 'Max number of recordings to process' },
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC9D,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAC/D,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,8BAA8B,EAAE;IAC1E,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC7E,WAAW,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,iCAAiC,EAAE;IAC3F,OAAO,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,iCAAiC,EAAE;IACtF,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,qCAAqC,EAAE;CACpF,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { EndpointMap } from '../auth/types.js';
|
|
2
|
+
export type { EndpointMap };
|
|
3
|
+
/**
|
|
4
|
+
* Build list URL using skip/limit pagination.
|
|
5
|
+
* GET /file/simple/web?skip=N&limit=50&is_trash=0&sort_by=start_time&is_desc=true
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildListUrl(map: EndpointMap, skip: number, limit?: number): string;
|
|
8
|
+
/**
|
|
9
|
+
* Build URL for POST /file/list — batch detail fetch that includes trans_result.
|
|
10
|
+
* Body: ["file_id_1", "file_id_2"]
|
|
11
|
+
* Response: { data_file_list: [...full recording objects with trans_result...] }
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildBatchDetailUrl(map: EndpointMap): string;
|
|
14
|
+
/**
|
|
15
|
+
* Build URL for GET /file/temp-url/<id> — returns a presigned S3 audio download URL.
|
|
16
|
+
* Response: { temp_url: "https://s3.amazonaws.com/...?X-Amz-..." }
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildAudioTempUrl(map: EndpointMap, id: string): string;
|
|
19
|
+
export declare function buildProfileUrl(map: EndpointMap): string;
|
|
20
|
+
/**
|
|
21
|
+
* Discover the correct regional API base URL by hitting the global endpoint.
|
|
22
|
+
* The global api.plaud.ai returns a region-redirect response:
|
|
23
|
+
* { status: -302, data: { domains: { api: "https://api-euc1.plaud.ai" } } }
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractRegionalBaseUrl(response: unknown): string | null;
|
|
26
|
+
//# sourceMappingURL=endpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/client/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,YAAY,EAAE,WAAW,EAAE,CAAA;AAU3B;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAS/E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAExD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOvE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Real Plaud API paths (discovered from arbuzmell/plaud-api reference client)
|
|
3
|
+
// The user's account lives on a regional endpoint (e.g. api-euc1.plaud.ai for EU).
|
|
4
|
+
// Hit api.plaud.ai/user/me to discover the correct regional base URL.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const API_BASE = (map) => map.apiBaseUrl ?? 'https://api.plaud.ai';
|
|
7
|
+
/**
|
|
8
|
+
* Build list URL using skip/limit pagination.
|
|
9
|
+
* GET /file/simple/web?skip=N&limit=50&is_trash=0&sort_by=start_time&is_desc=true
|
|
10
|
+
*/
|
|
11
|
+
export function buildListUrl(map, skip, limit = 50) {
|
|
12
|
+
const base = map.listRecordings ?? `${API_BASE(map)}/file/simple/web`;
|
|
13
|
+
const url = new URL(base.replace('/{id}', ''));
|
|
14
|
+
url.searchParams.set('skip', String(skip));
|
|
15
|
+
url.searchParams.set('limit', String(limit));
|
|
16
|
+
url.searchParams.set('is_trash', '0');
|
|
17
|
+
url.searchParams.set('sort_by', 'start_time');
|
|
18
|
+
url.searchParams.set('is_desc', 'true');
|
|
19
|
+
return url.toString();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build URL for POST /file/list — batch detail fetch that includes trans_result.
|
|
23
|
+
* Body: ["file_id_1", "file_id_2"]
|
|
24
|
+
* Response: { data_file_list: [...full recording objects with trans_result...] }
|
|
25
|
+
*/
|
|
26
|
+
export function buildBatchDetailUrl(map) {
|
|
27
|
+
return map.batchDetail ?? `${API_BASE(map)}/file/list`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build URL for GET /file/temp-url/<id> — returns a presigned S3 audio download URL.
|
|
31
|
+
* Response: { temp_url: "https://s3.amazonaws.com/...?X-Amz-..." }
|
|
32
|
+
*/
|
|
33
|
+
export function buildAudioTempUrl(map, id) {
|
|
34
|
+
const base = map.getAudioUrl ?? `${API_BASE(map)}/file/temp-url`;
|
|
35
|
+
return `${base.replace('/{id}', '')}/${id}`;
|
|
36
|
+
}
|
|
37
|
+
export function buildProfileUrl(map) {
|
|
38
|
+
return map.userProfile ?? `${API_BASE(map)}/user/me`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Discover the correct regional API base URL by hitting the global endpoint.
|
|
42
|
+
* The global api.plaud.ai returns a region-redirect response:
|
|
43
|
+
* { status: -302, data: { domains: { api: "https://api-euc1.plaud.ai" } } }
|
|
44
|
+
*/
|
|
45
|
+
export function extractRegionalBaseUrl(response) {
|
|
46
|
+
const r = response;
|
|
47
|
+
if (r?.status === -302) {
|
|
48
|
+
const api = r?.data?.domains;
|
|
49
|
+
if (typeof api?.api === 'string')
|
|
50
|
+
return api.api;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/client/endpoints.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,8EAA8E;AAC9E,mFAAmF;AACnF,sEAAsE;AACtE,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,CAAC,GAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,sBAAsB,CAAA;AAE/E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,IAAY,EAAE,KAAK,GAAG,EAAE;IACrE,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAA;IACrE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IACrC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACvC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAA;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,OAAO,GAAG,CAAC,WAAW,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAA;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAgB,EAAE,EAAU;IAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAA;IAChE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAgB;IAC9C,OAAO,GAAG,CAAC,WAAW,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAA;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAiB;IACtD,MAAM,CAAC,GAAG,QAAmC,CAAA;IAC7C,IAAI,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAI,CAAC,EAAE,IAAgC,EAAE,OAAkC,CAAA;QACpF,IAAI,OAAO,GAAG,EAAE,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,GAAG,CAAA;IAClD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type RequestInit } from 'undici';
|
|
2
|
+
import type { StoredCredentials } from '../auth/types.js';
|
|
3
|
+
export declare class HttpClient {
|
|
4
|
+
private readonly creds;
|
|
5
|
+
constructor(creds: StoredCredentials);
|
|
6
|
+
private buildHeaders;
|
|
7
|
+
get<T>(url: string, init?: RequestInit): Promise<T>;
|
|
8
|
+
post<T>(url: string, body: unknown, init?: RequestInit): Promise<T>;
|
|
9
|
+
getStream(url: string): Promise<AsyncIterable<Uint8Array>>;
|
|
10
|
+
/**
|
|
11
|
+
* Download from an external URL (e.g. presigned S3) without Plaud auth headers.
|
|
12
|
+
* S3 presigned URLs sign only the `host` header — sending extra headers breaks the request.
|
|
13
|
+
*/
|
|
14
|
+
downloadExternalUrl(url: string): Promise<AsyncIterable<Uint8Array>>;
|
|
15
|
+
private assertOk;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,WAAW,EAAiB,MAAM,QAAQ,CAAA;AAG/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAgBzD,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAErD,OAAO,CAAC,YAAY;IAad,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAcnD,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAenE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAkBhE;;;OAGG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAc5D,QAAQ;CASvB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { fetch } from 'undici';
|
|
2
|
+
import { ApiError, AuthError } from '../errors.js';
|
|
3
|
+
import { getLogger } from '../logger.js';
|
|
4
|
+
import { cookieHeader } from '../auth/token-store.js';
|
|
5
|
+
// Browser-like headers that Plaud's API validates.
|
|
6
|
+
// app-platform and edit-from are required custom headers.
|
|
7
|
+
const STATIC_HEADERS = {
|
|
8
|
+
'Accept': 'application/json, */*',
|
|
9
|
+
'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
|
|
10
|
+
'Origin': 'https://web.plaud.ai',
|
|
11
|
+
'Referer': 'https://web.plaud.ai/',
|
|
12
|
+
'app-platform': 'web',
|
|
13
|
+
'edit-from': 'web',
|
|
14
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
|
|
15
|
+
};
|
|
16
|
+
export class HttpClient {
|
|
17
|
+
creds;
|
|
18
|
+
constructor(creds) {
|
|
19
|
+
this.creds = creds;
|
|
20
|
+
}
|
|
21
|
+
buildHeaders() {
|
|
22
|
+
const headers = {
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
...STATIC_HEADERS,
|
|
25
|
+
'Cookie': cookieHeader(this.creds),
|
|
26
|
+
};
|
|
27
|
+
if (this.creds.authToken) {
|
|
28
|
+
// Plaud API expects lowercase 'bearer' (per arbuzmell/plaud-api reference client)
|
|
29
|
+
headers['Authorization'] = `bearer ${this.creds.authToken}`;
|
|
30
|
+
}
|
|
31
|
+
return headers;
|
|
32
|
+
}
|
|
33
|
+
async get(url, init) {
|
|
34
|
+
const log = getLogger();
|
|
35
|
+
log.debug({ url }, 'GET');
|
|
36
|
+
const res = await fetch(url, {
|
|
37
|
+
...init,
|
|
38
|
+
method: 'GET',
|
|
39
|
+
headers: { ...this.buildHeaders(), ...init?.headers },
|
|
40
|
+
});
|
|
41
|
+
await this.assertOk(res, url);
|
|
42
|
+
return res.json();
|
|
43
|
+
}
|
|
44
|
+
async post(url, body, init) {
|
|
45
|
+
const log = getLogger();
|
|
46
|
+
log.debug({ url }, 'POST');
|
|
47
|
+
const res = await fetch(url, {
|
|
48
|
+
...init,
|
|
49
|
+
method: 'POST',
|
|
50
|
+
headers: { ...this.buildHeaders(), ...init?.headers },
|
|
51
|
+
body: JSON.stringify(body),
|
|
52
|
+
});
|
|
53
|
+
await this.assertOk(res, url);
|
|
54
|
+
return res.json();
|
|
55
|
+
}
|
|
56
|
+
async getStream(url) {
|
|
57
|
+
const log = getLogger();
|
|
58
|
+
log.debug({ url }, 'GET (stream)');
|
|
59
|
+
const res = await fetch(url, {
|
|
60
|
+
method: 'GET',
|
|
61
|
+
headers: this.buildHeaders(),
|
|
62
|
+
});
|
|
63
|
+
await this.assertOk(res, url);
|
|
64
|
+
if (!res.body) {
|
|
65
|
+
throw new ApiError(`No response body from ${url}`, res.status);
|
|
66
|
+
}
|
|
67
|
+
return res.body;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Download from an external URL (e.g. presigned S3) without Plaud auth headers.
|
|
71
|
+
* S3 presigned URLs sign only the `host` header — sending extra headers breaks the request.
|
|
72
|
+
*/
|
|
73
|
+
async downloadExternalUrl(url) {
|
|
74
|
+
const log = getLogger();
|
|
75
|
+
log.debug({ url: url.split('?')[0] }, 'GET (external)');
|
|
76
|
+
const res = await fetch(url, { method: 'GET' });
|
|
77
|
+
await this.assertOk(res, url);
|
|
78
|
+
if (!res.body) {
|
|
79
|
+
throw new ApiError(`No response body from external URL`, res.status);
|
|
80
|
+
}
|
|
81
|
+
return res.body;
|
|
82
|
+
}
|
|
83
|
+
async assertOk(res, url) {
|
|
84
|
+
if (res.ok)
|
|
85
|
+
return;
|
|
86
|
+
if (res.status === 401 || res.status === 403) {
|
|
87
|
+
throw new AuthError(`Auth failed for ${url} (${res.status}) — run 'alta-plaud auth' to re-authenticate`);
|
|
88
|
+
}
|
|
89
|
+
throw new ApiError(`HTTP ${res.status} for ${url}`, res.status);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { StoredCredentials } from '../auth/types.js';
|
|
2
|
+
import { HttpClient } from './http.js';
|
|
3
|
+
import { type PlaudRecording, type PlaudTranscript, type ListOptions, type PlaudClient } from './types.js';
|
|
4
|
+
export declare class PlaudApiClient implements PlaudClient {
|
|
5
|
+
private readonly http;
|
|
6
|
+
private endpoints;
|
|
7
|
+
constructor(creds: StoredCredentials);
|
|
8
|
+
isAuthenticated(): Promise<boolean>;
|
|
9
|
+
listRecordings(opts?: ListOptions): AsyncGenerator<PlaudRecording>;
|
|
10
|
+
getTranscript(recordingId: string): Promise<PlaudTranscript>;
|
|
11
|
+
getAudioDownloadUrl(recordingId: string): Promise<string | null>;
|
|
12
|
+
getHttpClient(): HttpClient;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=plaud-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plaud-client.d.ts","sourceRoot":"","sources":["../../src/client/plaud-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AASzD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAA;AAEnB,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,SAAS,CAAa;gBAElB,KAAK,EAAE,iBAAiB;IAQ9B,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAgBlC,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC;IAkCnE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAgB5D,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWtE,aAAa,IAAI,UAAU;CAG5B"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { ApiError, AuthError } from '../errors.js';
|
|
2
|
+
import { getLogger } from '../logger.js';
|
|
3
|
+
import { buildListUrl, buildBatchDetailUrl, buildAudioTempUrl, buildProfileUrl, extractRegionalBaseUrl, } from './endpoints.js';
|
|
4
|
+
import { HttpClient } from './http.js';
|
|
5
|
+
import { PlaudRecordingSchema, PlaudTranscriptSchema, } from './types.js';
|
|
6
|
+
export class PlaudApiClient {
|
|
7
|
+
http;
|
|
8
|
+
endpoints;
|
|
9
|
+
constructor(creds) {
|
|
10
|
+
this.http = new HttpClient(creds);
|
|
11
|
+
this.endpoints = {
|
|
12
|
+
...creds.endpointMap,
|
|
13
|
+
apiBaseUrl: creds.apiBaseUrl,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async isAuthenticated() {
|
|
17
|
+
try {
|
|
18
|
+
const profileUrl = buildProfileUrl(this.endpoints);
|
|
19
|
+
const raw = await this.http.get(profileUrl);
|
|
20
|
+
// A region-redirect response still means we're authenticated
|
|
21
|
+
if (extractRegionalBaseUrl(raw) !== null)
|
|
22
|
+
return true;
|
|
23
|
+
// Check for error status in response body
|
|
24
|
+
const r = raw;
|
|
25
|
+
return r?.status === 0 || r?.data_user != null;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err instanceof AuthError)
|
|
29
|
+
return false;
|
|
30
|
+
if (err instanceof ApiError && (err.statusCode === 401 || err.statusCode === 403))
|
|
31
|
+
return false;
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async *listRecordings(opts) {
|
|
36
|
+
const log = getLogger();
|
|
37
|
+
let skip = 0;
|
|
38
|
+
const limit = 50;
|
|
39
|
+
let count = 0;
|
|
40
|
+
while (true) {
|
|
41
|
+
const url = buildListUrl(this.endpoints, skip, limit);
|
|
42
|
+
const raw = await this.http.get(url);
|
|
43
|
+
const items = extractFileList(raw);
|
|
44
|
+
if (items.length === 0)
|
|
45
|
+
break;
|
|
46
|
+
for (const item of items) {
|
|
47
|
+
const recording = normalizeRecording(item);
|
|
48
|
+
const parsed = PlaudRecordingSchema.parse(recording);
|
|
49
|
+
// Apply since filter (no server-side date filtering)
|
|
50
|
+
if (opts?.since && new Date(parsed.recordedAt) < opts.since)
|
|
51
|
+
continue;
|
|
52
|
+
yield parsed;
|
|
53
|
+
count++;
|
|
54
|
+
if (opts?.limit && count >= opts.limit)
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
log.debug({ skip, fetched: items.length }, 'Fetched recording page');
|
|
58
|
+
// Stop when we get fewer items than the limit (last page)
|
|
59
|
+
if (items.length < limit)
|
|
60
|
+
break;
|
|
61
|
+
skip += items.length;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async getTranscript(recordingId) {
|
|
65
|
+
// Transcript data lives inside the recording object (trans_result field).
|
|
66
|
+
// Fetch it via POST /file/list with the single recording ID.
|
|
67
|
+
const url = buildBatchDetailUrl(this.endpoints);
|
|
68
|
+
const raw = await this.http.post(url, [recordingId]);
|
|
69
|
+
const items = extractFileList(raw);
|
|
70
|
+
if (items.length === 0) {
|
|
71
|
+
throw new ApiError(`Recording ${recordingId} not found`, 404);
|
|
72
|
+
}
|
|
73
|
+
const recording = items[0];
|
|
74
|
+
const normalized = normalizeTranscript(recording, recordingId);
|
|
75
|
+
return PlaudTranscriptSchema.parse(normalized);
|
|
76
|
+
}
|
|
77
|
+
async getAudioDownloadUrl(recordingId) {
|
|
78
|
+
try {
|
|
79
|
+
const url = buildAudioTempUrl(this.endpoints, recordingId);
|
|
80
|
+
const raw = await this.http.get(url);
|
|
81
|
+
return extractTempUrl(raw);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
getLogger().debug({ recordingId, err }, 'Could not get audio download URL');
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
getHttpClient() {
|
|
89
|
+
return this.http;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function extractFileList(raw) {
|
|
93
|
+
const obj = raw;
|
|
94
|
+
// Primary response shape: { data_file_list: [...] }
|
|
95
|
+
if (Array.isArray(obj?.data_file_list))
|
|
96
|
+
return obj.data_file_list;
|
|
97
|
+
// Fallback shapes
|
|
98
|
+
if (Array.isArray(obj?.data))
|
|
99
|
+
return obj.data;
|
|
100
|
+
if (Array.isArray(obj?.list))
|
|
101
|
+
return obj.list;
|
|
102
|
+
if (Array.isArray(raw))
|
|
103
|
+
return raw;
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
function normalizeRecording(raw) {
|
|
107
|
+
const r = raw;
|
|
108
|
+
// duration is in milliseconds — convert to seconds
|
|
109
|
+
const durationMs = Number(r['duration'] ?? r['duration_ms'] ?? 0);
|
|
110
|
+
const duration = durationMs / 1000;
|
|
111
|
+
// start_time is Unix milliseconds (the actual recording start time)
|
|
112
|
+
const startTimeMs = Number(r['start_time'] ?? 0);
|
|
113
|
+
const recordedAt = startTimeMs > 0 ? new Date(startTimeMs).toISOString() : new Date().toISOString();
|
|
114
|
+
// version_ms is when the record was last synced; edit_time is seconds
|
|
115
|
+
const versionMs = Number(r['version_ms'] ?? 0);
|
|
116
|
+
const editTimeSec = Number(r['edit_time'] ?? 0);
|
|
117
|
+
const updatedAt = versionMs > 0 ? new Date(versionMs).toISOString() : recordedAt;
|
|
118
|
+
const createdAt = editTimeSec > 0 ? new Date(editTimeSec * 1000).toISOString() : recordedAt;
|
|
119
|
+
// Determine mime type from the fullname file extension
|
|
120
|
+
const fullname = String(r['fullname'] ?? '');
|
|
121
|
+
const ext = fullname.split('.').pop()?.toLowerCase();
|
|
122
|
+
const mimeType = ext === 'ogg' ? 'audio/ogg' :
|
|
123
|
+
ext === 'm4a' ? 'audio/m4a' :
|
|
124
|
+
ext === 'mp3' ? 'audio/mpeg' :
|
|
125
|
+
ext === 'opus' ? 'audio/ogg; codecs=opus' :
|
|
126
|
+
'audio/mp4';
|
|
127
|
+
return {
|
|
128
|
+
id: String(r['id'] ?? ''),
|
|
129
|
+
title: stringOrUndefined(r['filename'] ?? r['name'] ?? r['title']),
|
|
130
|
+
duration,
|
|
131
|
+
recordedAt,
|
|
132
|
+
createdAt,
|
|
133
|
+
updatedAt,
|
|
134
|
+
fileSize: numberOrUndefined(r['filesize'] ?? r['file_size']),
|
|
135
|
+
mimeType,
|
|
136
|
+
hasTranscript: Boolean(r['is_trans'] ?? r['has_transcription'] ?? r['hasNote']),
|
|
137
|
+
transcriptStatus: r['is_trans'] ? 'completed' : undefined,
|
|
138
|
+
language: stringOrUndefined(r['language'] ?? r['lang']),
|
|
139
|
+
deviceId: stringOrUndefined(r['serial_number'] ?? r['device_id'] ?? r['deviceId']),
|
|
140
|
+
tags: arrayOfStrings(r['filetag_id_list'] ?? r['tags']),
|
|
141
|
+
folderId: undefined,
|
|
142
|
+
summary: extractSummaryText(r['ai_content']),
|
|
143
|
+
_raw: r,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function normalizeTranscript(raw, recordingId) {
|
|
147
|
+
const r = raw;
|
|
148
|
+
const transResult = r['trans_result'];
|
|
149
|
+
const segmentsRaw = Array.isArray(transResult) ? transResult : [];
|
|
150
|
+
const segments = segmentsRaw.map((s, i) => ({
|
|
151
|
+
index: i,
|
|
152
|
+
startMs: Number(s['start_time_ms'] ?? s['startMs'] ?? s['startTime'] ?? 0),
|
|
153
|
+
endMs: Number(s['end_time_ms'] ?? s['endMs'] ?? s['endTime'] ?? 0),
|
|
154
|
+
speaker: stringOrUndefined(s['speaker']),
|
|
155
|
+
text: String(s['text'] ?? '').trim(),
|
|
156
|
+
confidence: undefined,
|
|
157
|
+
}));
|
|
158
|
+
const fullText = segments.map(s => s.text).filter(Boolean).join('\n\n');
|
|
159
|
+
// duration field from POST /file/list is in milliseconds — convert to seconds
|
|
160
|
+
const durationMs = Number(r['duration_ms'] ?? r['duration'] ?? 0);
|
|
161
|
+
const duration = durationMs / 1000;
|
|
162
|
+
return {
|
|
163
|
+
recordingId,
|
|
164
|
+
language: stringOrUndefined(r['language'] ?? r['lang']),
|
|
165
|
+
duration,
|
|
166
|
+
segments,
|
|
167
|
+
fullText,
|
|
168
|
+
createdAt: stringOrUndefined(r['created_at'] ?? r['createTime']) ? toIso(r['created_at'] ?? r['createTime']) : undefined,
|
|
169
|
+
_raw: r,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function extractTempUrl(raw) {
|
|
173
|
+
const obj = raw;
|
|
174
|
+
return stringOrUndefined(obj?.['temp_url'] ?? obj?.['url'] ?? obj?.['downloadUrl']) ?? null;
|
|
175
|
+
}
|
|
176
|
+
function extractSummaryText(aiContent) {
|
|
177
|
+
if (!aiContent || typeof aiContent !== 'object')
|
|
178
|
+
return undefined;
|
|
179
|
+
const obj = aiContent;
|
|
180
|
+
// ai_content can have various summary fields
|
|
181
|
+
const text = obj['summary'] ?? obj['text'] ?? obj['content'];
|
|
182
|
+
return stringOrUndefined(text);
|
|
183
|
+
}
|
|
184
|
+
// ─── Utilities ────────────────────────────────────────────────────────────────
|
|
185
|
+
function toIso(val) {
|
|
186
|
+
if (typeof val === 'string' && val.length > 0) {
|
|
187
|
+
// Already ISO string
|
|
188
|
+
if (val.includes('T') || val.includes('-'))
|
|
189
|
+
return new Date(val).toISOString();
|
|
190
|
+
// Unix ms as string
|
|
191
|
+
const n = Number(val);
|
|
192
|
+
if (isFinite(n) && n > 0) {
|
|
193
|
+
return new Date(n > 1e12 ? n : n * 1000).toISOString();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (typeof val === 'number' && val > 0) {
|
|
197
|
+
return new Date(val > 1e12 ? val : val * 1000).toISOString();
|
|
198
|
+
}
|
|
199
|
+
return new Date().toISOString();
|
|
200
|
+
}
|
|
201
|
+
function stringOrUndefined(val) {
|
|
202
|
+
if (typeof val === 'string' && val.length > 0)
|
|
203
|
+
return val;
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
function numberOrUndefined(val) {
|
|
207
|
+
const n = Number(val);
|
|
208
|
+
return isFinite(n) && n >= 0 ? n : undefined;
|
|
209
|
+
}
|
|
210
|
+
function arrayOfStrings(val) {
|
|
211
|
+
if (!Array.isArray(val))
|
|
212
|
+
return undefined;
|
|
213
|
+
const result = val.filter(v => typeof v === 'string');
|
|
214
|
+
return result.length > 0 ? result : undefined;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=plaud-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plaud-client.js","sourceRoot":"","sources":["../../src/client/plaud-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const TranscriptSegmentSchema: z.ZodObject<{
|
|
3
|
+
index: z.ZodNumber;
|
|
4
|
+
startMs: z.ZodNumber;
|
|
5
|
+
endMs: z.ZodNumber;
|
|
6
|
+
speaker: z.ZodOptional<z.ZodString>;
|
|
7
|
+
text: z.ZodString;
|
|
8
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
index: number;
|
|
11
|
+
startMs: number;
|
|
12
|
+
endMs: number;
|
|
13
|
+
text: string;
|
|
14
|
+
speaker?: string | undefined;
|
|
15
|
+
confidence?: number | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
index: number;
|
|
18
|
+
startMs: number;
|
|
19
|
+
endMs: number;
|
|
20
|
+
text: string;
|
|
21
|
+
speaker?: string | undefined;
|
|
22
|
+
confidence?: number | undefined;
|
|
23
|
+
}>;
|
|
24
|
+
export type TranscriptSegment = z.infer<typeof TranscriptSegmentSchema>;
|
|
25
|
+
export declare const PlaudRecordingSchema: z.ZodObject<{
|
|
26
|
+
id: z.ZodString;
|
|
27
|
+
title: z.ZodOptional<z.ZodString>;
|
|
28
|
+
/** Duration in seconds */
|
|
29
|
+
duration: z.ZodNumber;
|
|
30
|
+
recordedAt: z.ZodString;
|
|
31
|
+
createdAt: z.ZodString;
|
|
32
|
+
updatedAt: z.ZodString;
|
|
33
|
+
fileSize: z.ZodOptional<z.ZodNumber>;
|
|
34
|
+
mimeType: z.ZodDefault<z.ZodString>;
|
|
35
|
+
hasTranscript: z.ZodBoolean;
|
|
36
|
+
transcriptStatus: z.ZodOptional<z.ZodEnum<["pending", "processing", "completed", "failed"]>>;
|
|
37
|
+
language: z.ZodOptional<z.ZodString>;
|
|
38
|
+
deviceId: z.ZodOptional<z.ZodString>;
|
|
39
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
40
|
+
folderId: z.ZodOptional<z.ZodString>;
|
|
41
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
42
|
+
/** Raw API payload preserved verbatim for forward-compatibility */
|
|
43
|
+
_raw: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
44
|
+
}, "strip", z.ZodTypeAny, {
|
|
45
|
+
id: string;
|
|
46
|
+
duration: number;
|
|
47
|
+
recordedAt: string;
|
|
48
|
+
createdAt: string;
|
|
49
|
+
updatedAt: string;
|
|
50
|
+
mimeType: string;
|
|
51
|
+
hasTranscript: boolean;
|
|
52
|
+
_raw: Record<string, unknown>;
|
|
53
|
+
title?: string | undefined;
|
|
54
|
+
fileSize?: number | undefined;
|
|
55
|
+
transcriptStatus?: "pending" | "processing" | "completed" | "failed" | undefined;
|
|
56
|
+
language?: string | undefined;
|
|
57
|
+
deviceId?: string | undefined;
|
|
58
|
+
tags?: string[] | undefined;
|
|
59
|
+
folderId?: string | undefined;
|
|
60
|
+
summary?: string | undefined;
|
|
61
|
+
}, {
|
|
62
|
+
id: string;
|
|
63
|
+
duration: number;
|
|
64
|
+
recordedAt: string;
|
|
65
|
+
createdAt: string;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
hasTranscript: boolean;
|
|
68
|
+
_raw: Record<string, unknown>;
|
|
69
|
+
title?: string | undefined;
|
|
70
|
+
fileSize?: number | undefined;
|
|
71
|
+
mimeType?: string | undefined;
|
|
72
|
+
transcriptStatus?: "pending" | "processing" | "completed" | "failed" | undefined;
|
|
73
|
+
language?: string | undefined;
|
|
74
|
+
deviceId?: string | undefined;
|
|
75
|
+
tags?: string[] | undefined;
|
|
76
|
+
folderId?: string | undefined;
|
|
77
|
+
summary?: string | undefined;
|
|
78
|
+
}>;
|
|
79
|
+
export type PlaudRecording = z.infer<typeof PlaudRecordingSchema>;
|
|
80
|
+
export declare const PlaudTranscriptSchema: z.ZodObject<{
|
|
81
|
+
recordingId: z.ZodString;
|
|
82
|
+
language: z.ZodOptional<z.ZodString>;
|
|
83
|
+
/** Duration in seconds */
|
|
84
|
+
duration: z.ZodNumber;
|
|
85
|
+
segments: z.ZodArray<z.ZodObject<{
|
|
86
|
+
index: z.ZodNumber;
|
|
87
|
+
startMs: z.ZodNumber;
|
|
88
|
+
endMs: z.ZodNumber;
|
|
89
|
+
speaker: z.ZodOptional<z.ZodString>;
|
|
90
|
+
text: z.ZodString;
|
|
91
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
92
|
+
}, "strip", z.ZodTypeAny, {
|
|
93
|
+
index: number;
|
|
94
|
+
startMs: number;
|
|
95
|
+
endMs: number;
|
|
96
|
+
text: string;
|
|
97
|
+
speaker?: string | undefined;
|
|
98
|
+
confidence?: number | undefined;
|
|
99
|
+
}, {
|
|
100
|
+
index: number;
|
|
101
|
+
startMs: number;
|
|
102
|
+
endMs: number;
|
|
103
|
+
text: string;
|
|
104
|
+
speaker?: string | undefined;
|
|
105
|
+
confidence?: number | undefined;
|
|
106
|
+
}>, "many">;
|
|
107
|
+
/** Concatenated full text for convenience */
|
|
108
|
+
fullText: z.ZodString;
|
|
109
|
+
createdAt: z.ZodOptional<z.ZodString>;
|
|
110
|
+
_raw: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
111
|
+
}, "strip", z.ZodTypeAny, {
|
|
112
|
+
duration: number;
|
|
113
|
+
_raw: Record<string, unknown>;
|
|
114
|
+
recordingId: string;
|
|
115
|
+
segments: {
|
|
116
|
+
index: number;
|
|
117
|
+
startMs: number;
|
|
118
|
+
endMs: number;
|
|
119
|
+
text: string;
|
|
120
|
+
speaker?: string | undefined;
|
|
121
|
+
confidence?: number | undefined;
|
|
122
|
+
}[];
|
|
123
|
+
fullText: string;
|
|
124
|
+
createdAt?: string | undefined;
|
|
125
|
+
language?: string | undefined;
|
|
126
|
+
}, {
|
|
127
|
+
duration: number;
|
|
128
|
+
_raw: Record<string, unknown>;
|
|
129
|
+
recordingId: string;
|
|
130
|
+
segments: {
|
|
131
|
+
index: number;
|
|
132
|
+
startMs: number;
|
|
133
|
+
endMs: number;
|
|
134
|
+
text: string;
|
|
135
|
+
speaker?: string | undefined;
|
|
136
|
+
confidence?: number | undefined;
|
|
137
|
+
}[];
|
|
138
|
+
fullText: string;
|
|
139
|
+
createdAt?: string | undefined;
|
|
140
|
+
language?: string | undefined;
|
|
141
|
+
}>;
|
|
142
|
+
export type PlaudTranscript = z.infer<typeof PlaudTranscriptSchema>;
|
|
143
|
+
export interface ListOptions {
|
|
144
|
+
since?: Date;
|
|
145
|
+
limit?: number;
|
|
146
|
+
cursor?: string;
|
|
147
|
+
}
|
|
148
|
+
export interface PlaudClient {
|
|
149
|
+
isAuthenticated(): Promise<boolean>;
|
|
150
|
+
listRecordings(options?: ListOptions): AsyncGenerator<PlaudRecording>;
|
|
151
|
+
getTranscript(recordingId: string): Promise<PlaudTranscript>;
|
|
152
|
+
getAudioDownloadUrl(recordingId: string): Promise<string | null>;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;EAOlC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE,eAAO,MAAM,oBAAoB;;;IAG/B,0BAA0B;;;;;;;;;;;;;;IAc1B,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEnE,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,eAAO,MAAM,qBAAqB;;;IAGhC,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;IAG1B,6CAA6C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7C,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACnC,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;IACrE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAC5D,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CACjE"}
|