plaud-notes-to-notion 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/CHANGELOG.md +10 -0
- package/LICENSE +21 -0
- package/README.md +102 -0
- package/bin/plaud-notes-to-notion.js +16 -0
- package/dist/card.d.ts +30 -0
- package/dist/card.js +287 -0
- package/dist/card.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +266 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.js +85 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +52 -0
- package/dist/constants.js +53 -0
- package/dist/constants.js.map +1 -0
- package/dist/daemon.d.ts +13 -0
- package/dist/daemon.js +182 -0
- package/dist/daemon.js.map +1 -0
- package/dist/format.d.ts +36 -0
- package/dist/format.js +108 -0
- package/dist/format.js.map +1 -0
- package/dist/ingest.d.ts +49 -0
- package/dist/ingest.js +205 -0
- package/dist/ingest.js.map +1 -0
- package/dist/llm.d.ts +65 -0
- package/dist/llm.js +177 -0
- package/dist/llm.js.map +1 -0
- package/dist/lock.d.ts +26 -0
- package/dist/lock.js +134 -0
- package/dist/lock.js.map +1 -0
- package/dist/log.d.ts +14 -0
- package/dist/log.js +41 -0
- package/dist/log.js.map +1 -0
- package/dist/notion.d.ts +86 -0
- package/dist/notion.js +254 -0
- package/dist/notion.js.map +1 -0
- package/dist/paths.d.ts +11 -0
- package/dist/paths.js +51 -0
- package/dist/paths.js.map +1 -0
- package/dist/plaud/callback.d.ts +19 -0
- package/dist/plaud/callback.js +162 -0
- package/dist/plaud/callback.js.map +1 -0
- package/dist/plaud/client.d.ts +55 -0
- package/dist/plaud/client.js +246 -0
- package/dist/plaud/client.js.map +1 -0
- package/dist/plaud/constants.d.ts +18 -0
- package/dist/plaud/constants.js +19 -0
- package/dist/plaud/constants.js.map +1 -0
- package/dist/plaud/errors.d.ts +10 -0
- package/dist/plaud/errors.js +32 -0
- package/dist/plaud/errors.js.map +1 -0
- package/dist/plaud/login.d.ts +17 -0
- package/dist/plaud/login.js +89 -0
- package/dist/plaud/login.js.map +1 -0
- package/dist/plaud/oauth.d.ts +21 -0
- package/dist/plaud/oauth.js +197 -0
- package/dist/plaud/oauth.js.map +1 -0
- package/dist/plaud/pkce.d.ts +3 -0
- package/dist/plaud/pkce.js +11 -0
- package/dist/plaud/pkce.js.map +1 -0
- package/dist/plaud/session.d.ts +23 -0
- package/dist/plaud/session.js +77 -0
- package/dist/plaud/session.js.map +1 -0
- package/dist/plaud/types.d.ts +21 -0
- package/dist/plaud/types.js +2 -0
- package/dist/plaud/types.js.map +1 -0
- package/dist/redact.d.ts +3 -0
- package/dist/redact.js +37 -0
- package/dist/redact.js.map +1 -0
- package/dist/runtime.d.ts +44 -0
- package/dist/runtime.js +94 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scrub.d.ts +17 -0
- package/dist/scrub.js +124 -0
- package/dist/scrub.js.map +1 -0
- package/dist/secrets.d.ts +59 -0
- package/dist/secrets.js +220 -0
- package/dist/secrets.js.map +1 -0
- package/dist/ssn.d.ts +33 -0
- package/dist/ssn.js +170 -0
- package/dist/ssn.js.map +1 -0
- package/dist/state.d.ts +46 -0
- package/dist/state.js +23 -0
- package/dist/state.js.map +1 -0
- package/dist/sync.d.ts +60 -0
- package/dist/sync.js +190 -0
- package/dist/sync.js.map +1 -0
- package/examples/com.plaud-notes-to-notion.plist +34 -0
- package/examples/install-launchagent.sh +16 -0
- package/package.json +37 -0
package/dist/notion.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { NOTION_RICH_TEXT_PER_BLOCK, NOTION_TEXT_CHUNK, NOTION_VERSION, TYPE_SUMMARY } from "./constants.js";
|
|
2
|
+
import { redactSecrets } from "./redact.js";
|
|
3
|
+
export class NotionError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
code;
|
|
6
|
+
constructor(message, status, code) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.name = "NotionError";
|
|
11
|
+
}
|
|
12
|
+
get unauthorized() {
|
|
13
|
+
return this.status === 401 || this.status === 403 || (this.status === 404 && this.code === "object_not_found");
|
|
14
|
+
}
|
|
15
|
+
get transient() {
|
|
16
|
+
return this.status === 429 || this.status >= 500 || this.status === 0;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function plain(rich) {
|
|
20
|
+
return Array.isArray(rich) ? rich.map((r) => r.plain_text || "").join("") : "";
|
|
21
|
+
}
|
|
22
|
+
function optionNames(prop) {
|
|
23
|
+
if (!prop) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(prop.multi_select)) {
|
|
27
|
+
return prop.multi_select.map((o) => String(o.name));
|
|
28
|
+
}
|
|
29
|
+
if (prop.select && typeof prop.select === "object") {
|
|
30
|
+
return [String(prop.select.name)];
|
|
31
|
+
}
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
export function rowFromPage(page) {
|
|
35
|
+
const props = (page.properties || {});
|
|
36
|
+
const recorded = props.Recorded?.date;
|
|
37
|
+
return {
|
|
38
|
+
id: String(page.id),
|
|
39
|
+
title: plain(props.Meeting?.title),
|
|
40
|
+
types: optionNames(props.Type),
|
|
41
|
+
participants: optionNames(props.Participants),
|
|
42
|
+
recorded: recorded?.start ?? null,
|
|
43
|
+
lastEdited: String(page.last_edited_time || "")
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function textToRichText(text) {
|
|
47
|
+
const out = [];
|
|
48
|
+
for (let i = 0; i < text.length; i += NOTION_TEXT_CHUNK) {
|
|
49
|
+
out.push({ type: "text", text: { content: text.slice(i, i + NOTION_TEXT_CHUNK) } });
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
/** One paragraph (like the Zap's) holding the whole transcript; split only past Notion's per-block cap. */
|
|
54
|
+
export function transcriptBlocks(text) {
|
|
55
|
+
const rich = textToRichText(text);
|
|
56
|
+
const blocks = [];
|
|
57
|
+
for (let i = 0; i < rich.length; i += NOTION_RICH_TEXT_PER_BLOCK) {
|
|
58
|
+
blocks.push({
|
|
59
|
+
object: "block",
|
|
60
|
+
type: "paragraph",
|
|
61
|
+
paragraph: { rich_text: rich.slice(i, i + NOTION_RICH_TEXT_PER_BLOCK) }
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return blocks.length ? blocks : [{ object: "block", type: "paragraph", paragraph: { rich_text: [] } }];
|
|
65
|
+
}
|
|
66
|
+
/** Fallback when Notion cannot parse a summary as markdown: one plain paragraph per line. */
|
|
67
|
+
export function plainLineBlocks(markdown) {
|
|
68
|
+
return markdown
|
|
69
|
+
.split("\n")
|
|
70
|
+
.filter((l) => l.trim())
|
|
71
|
+
.map((line) => ({ object: "block", type: "paragraph", paragraph: { rich_text: textToRichText(line) } }));
|
|
72
|
+
}
|
|
73
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
74
|
+
export class HttpNotionStore {
|
|
75
|
+
options;
|
|
76
|
+
cachedSchema = null;
|
|
77
|
+
constructor(options) {
|
|
78
|
+
this.options = options;
|
|
79
|
+
}
|
|
80
|
+
async api(method, path, body, attempt = 0) {
|
|
81
|
+
// Creates/appends are not idempotent: a 5xx can hide a success, so only reads retry on 5xx/network.
|
|
82
|
+
// 429 is always safe to retry (Notion rejected it before doing anything).
|
|
83
|
+
const idempotent = method === "GET" || path.endsWith("/query") || (method === "PATCH" && path.startsWith("/pages/"));
|
|
84
|
+
let res;
|
|
85
|
+
try {
|
|
86
|
+
res = await (this.options.fetchImpl || fetch)(`https://api.notion.com/v1${path}`, {
|
|
87
|
+
method,
|
|
88
|
+
headers: {
|
|
89
|
+
Authorization: `Bearer ${this.options.token}`,
|
|
90
|
+
"Notion-Version": NOTION_VERSION,
|
|
91
|
+
"Content-Type": "application/json"
|
|
92
|
+
},
|
|
93
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
94
|
+
signal: AbortSignal.timeout(120_000)
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
if (idempotent && attempt < 2) {
|
|
99
|
+
await (this.options.sleepImpl || sleep)(2000 * (attempt + 1));
|
|
100
|
+
return this.api(method, path, body, attempt + 1);
|
|
101
|
+
}
|
|
102
|
+
throw new NotionError(redactSecrets(`Notion unreachable (${err instanceof Error ? err.name : "network"})`), 0, "network");
|
|
103
|
+
}
|
|
104
|
+
if ((res.status === 429 || (idempotent && res.status >= 500)) && attempt < 3) {
|
|
105
|
+
const retryAfter = Number(res.headers.get("retry-after"));
|
|
106
|
+
const wait = Number.isFinite(retryAfter) && retryAfter > 0 ? Math.min(30, retryAfter) * 1000 : 1500 * (attempt + 1);
|
|
107
|
+
await (this.options.sleepImpl || sleep)(wait);
|
|
108
|
+
return this.api(method, path, body, attempt + 1);
|
|
109
|
+
}
|
|
110
|
+
const json = (await res.json().catch(() => ({})));
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
throw new NotionError(redactSecrets(`Notion HTTP ${res.status}: ${String(json.message || json.code || "error")}`), res.status, String(json.code || ""));
|
|
113
|
+
}
|
|
114
|
+
return json;
|
|
115
|
+
}
|
|
116
|
+
props(row, schema) {
|
|
117
|
+
const multi = (kind, names) => kind === "multi_select" ? { multi_select: names.map((name) => ({ name })) } : { select: names[0] ? { name: names[0] } : null };
|
|
118
|
+
return {
|
|
119
|
+
Meeting: { title: textToRichText(row.title) },
|
|
120
|
+
Recorded: { date: { start: row.recorded } },
|
|
121
|
+
Type: multi(schema.typeKind, [row.type]),
|
|
122
|
+
Participants: multi(schema.participantsKind, row.participants)
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async schema() {
|
|
126
|
+
if (this.cachedSchema && Date.now() - this.cachedSchema.at < 10 * 60_000) {
|
|
127
|
+
return this.cachedSchema.value;
|
|
128
|
+
}
|
|
129
|
+
const ds = await this.api("GET", `/data_sources/${this.options.dataSourceId}`);
|
|
130
|
+
const props = (ds.properties || {});
|
|
131
|
+
const missing = [
|
|
132
|
+
["Meeting", "title"],
|
|
133
|
+
["Recorded", "date"]
|
|
134
|
+
].filter(([name, type]) => props[name]?.type !== type);
|
|
135
|
+
const kindOf = (name) => props[name]?.type === "multi_select" ? "multi_select" : props[name]?.type === "select" ? "select" : null;
|
|
136
|
+
const typeKind = kindOf("Type");
|
|
137
|
+
const participantsKind = kindOf("Participants");
|
|
138
|
+
if (missing.length || !typeKind || !participantsKind) {
|
|
139
|
+
throw new NotionError("Plaud Notes schema mismatch: need Meeting (title), Recorded (date), Type and Participants (select or multi-select)", 400, "schema_mismatch");
|
|
140
|
+
}
|
|
141
|
+
const optionsProp = props.Participants[participantsKind];
|
|
142
|
+
const value = {
|
|
143
|
+
typeKind,
|
|
144
|
+
participantsKind,
|
|
145
|
+
participantOptions: (optionsProp?.options || []).map((o) => String(o.name))
|
|
146
|
+
};
|
|
147
|
+
this.cachedSchema = { at: Date.now(), value };
|
|
148
|
+
return value;
|
|
149
|
+
}
|
|
150
|
+
async queryAll(filter, sorts) {
|
|
151
|
+
const rows = [];
|
|
152
|
+
let cursor;
|
|
153
|
+
do {
|
|
154
|
+
const json = await this.api("POST", `/data_sources/${this.options.dataSourceId}/query`, {
|
|
155
|
+
filter,
|
|
156
|
+
sorts,
|
|
157
|
+
page_size: 100,
|
|
158
|
+
start_cursor: cursor
|
|
159
|
+
});
|
|
160
|
+
for (const page of (json.results || [])) {
|
|
161
|
+
rows.push(rowFromPage(page));
|
|
162
|
+
}
|
|
163
|
+
cursor = json.has_more ? String(json.next_cursor) : undefined;
|
|
164
|
+
} while (cursor);
|
|
165
|
+
return rows;
|
|
166
|
+
}
|
|
167
|
+
async rowsAtMinute(minuteIso) {
|
|
168
|
+
const start = new Date(minuteIso);
|
|
169
|
+
const end = new Date(start.getTime() + 60_000);
|
|
170
|
+
return this.queryAll({
|
|
171
|
+
and: [
|
|
172
|
+
{ property: "Recorded", date: { on_or_after: start.toISOString() } },
|
|
173
|
+
{ property: "Recorded", date: { before: end.toISOString() } }
|
|
174
|
+
]
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async createSummary(row, markdown) {
|
|
178
|
+
const schema = await this.schema();
|
|
179
|
+
const parent = { type: "data_source_id", data_source_id: this.options.dataSourceId };
|
|
180
|
+
try {
|
|
181
|
+
const page = await this.api("POST", "/pages", { parent, properties: this.props(row, schema), markdown });
|
|
182
|
+
return { id: String(page.id), usedFallback: false };
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
if (!(err instanceof NotionError) || err.code !== "validation_error" || !/markdown/i.test(err.message)) {
|
|
186
|
+
throw err;
|
|
187
|
+
}
|
|
188
|
+
const blocks = plainLineBlocks(markdown);
|
|
189
|
+
const page = await this.api("POST", "/pages", { parent, properties: this.props(row, schema), children: blocks.slice(0, 100) });
|
|
190
|
+
for (let i = 100; i < blocks.length; i += 100) {
|
|
191
|
+
await this.api("PATCH", `/blocks/${String(page.id)}/children`, { children: blocks.slice(i, i + 100) });
|
|
192
|
+
}
|
|
193
|
+
return { id: String(page.id), usedFallback: true };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async createTranscript(row, text) {
|
|
197
|
+
const schema = await this.schema();
|
|
198
|
+
const blocks = transcriptBlocks(text);
|
|
199
|
+
const page = await this.api("POST", "/pages", {
|
|
200
|
+
parent: { type: "data_source_id", data_source_id: this.options.dataSourceId },
|
|
201
|
+
properties: this.props(row, schema),
|
|
202
|
+
children: blocks.slice(0, 100)
|
|
203
|
+
});
|
|
204
|
+
for (let i = 100; i < blocks.length; i += 100) {
|
|
205
|
+
await this.api("PATCH", `/blocks/${String(page.id)}/children`, { children: blocks.slice(i, i + 100) });
|
|
206
|
+
}
|
|
207
|
+
return { id: String(page.id) };
|
|
208
|
+
}
|
|
209
|
+
async summariesEditedSince(sinceIso) {
|
|
210
|
+
const schema = await this.schema();
|
|
211
|
+
const typeFilter = schema.typeKind === "multi_select"
|
|
212
|
+
? { property: "Type", multi_select: { contains: TYPE_SUMMARY } }
|
|
213
|
+
: { property: "Type", select: { equals: TYPE_SUMMARY } };
|
|
214
|
+
return this.queryAll({
|
|
215
|
+
and: [typeFilter, { timestamp: "last_edited_time", last_edited_time: { on_or_after: sinceIso } }]
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
async rowsRecordedSince(sinceIso) {
|
|
219
|
+
return this.queryAll({ property: "Recorded", date: { on_or_after: sinceIso } }, [
|
|
220
|
+
{ property: "Recorded", direction: "descending" }
|
|
221
|
+
]);
|
|
222
|
+
}
|
|
223
|
+
async pageState(pageId) {
|
|
224
|
+
try {
|
|
225
|
+
const page = await this.api("GET", `/pages/${pageId}`);
|
|
226
|
+
return page.in_trash === true || page.archived === true ? "trashed" : "live";
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
// 404 means permanently deleted *or* lost access — never treat that as a deletion.
|
|
230
|
+
if (err instanceof NotionError && err.status === 404) {
|
|
231
|
+
return "unknown";
|
|
232
|
+
}
|
|
233
|
+
throw err;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async setTrashed(pageId, inTrash) {
|
|
237
|
+
await this.api("PATCH", `/pages/${pageId}`, { in_trash: inTrash });
|
|
238
|
+
}
|
|
239
|
+
async updateRow(pageId, patch) {
|
|
240
|
+
const schema = await this.schema();
|
|
241
|
+
const properties = {};
|
|
242
|
+
if (patch.title !== undefined) {
|
|
243
|
+
properties.Meeting = { title: textToRichText(patch.title) };
|
|
244
|
+
}
|
|
245
|
+
if (patch.participants !== undefined) {
|
|
246
|
+
properties.Participants =
|
|
247
|
+
schema.participantsKind === "multi_select"
|
|
248
|
+
? { multi_select: patch.participants.map((name) => ({ name })) }
|
|
249
|
+
: { select: patch.participants[0] ? { name: patch.participants[0] } : null };
|
|
250
|
+
}
|
|
251
|
+
await this.api("PATCH", `/pages/${pageId}`, { properties });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=notion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion.js","sourceRoot":"","sources":["../src/notion.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function getHomeDir(env?: NodeJS.ProcessEnv): string;
|
|
2
|
+
export declare function getStateDir(env?: NodeJS.ProcessEnv): string;
|
|
3
|
+
export declare function getConfigPath(env?: NodeJS.ProcessEnv): string;
|
|
4
|
+
export declare function getProfileStatePath(profile: string, env?: NodeJS.ProcessEnv): string;
|
|
5
|
+
export declare function getStatusPath(env?: NodeJS.ProcessEnv): string;
|
|
6
|
+
export declare function getLockFilePath(env?: NodeJS.ProcessEnv): string;
|
|
7
|
+
export declare function getLogFilePath(env?: NodeJS.ProcessEnv): string;
|
|
8
|
+
export declare function ensureDir(dir: string): void;
|
|
9
|
+
/** Write JSON atomically (tmp + rename) so a crash never leaves half a state file. */
|
|
10
|
+
export declare function writeJsonAtomic(file: string, value: unknown): void;
|
|
11
|
+
export declare function readJson<T>(file: string): T | null;
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { LOCK_FILE_NAME, LOG_FILE_NAME, PACKAGE_NAME } from "./constants.js";
|
|
5
|
+
export function getHomeDir(env = process.env) {
|
|
6
|
+
const override = env.PLAUD_NOTES_HOME?.trim();
|
|
7
|
+
if (override) {
|
|
8
|
+
return path.resolve(override);
|
|
9
|
+
}
|
|
10
|
+
return os.homedir();
|
|
11
|
+
}
|
|
12
|
+
export function getStateDir(env = process.env) {
|
|
13
|
+
return path.join(getHomeDir(env), `.${PACKAGE_NAME}`);
|
|
14
|
+
}
|
|
15
|
+
export function getConfigPath(env = process.env) {
|
|
16
|
+
return path.join(getStateDir(env), "config.json");
|
|
17
|
+
}
|
|
18
|
+
export function getProfileStatePath(profile, env = process.env) {
|
|
19
|
+
return path.join(getStateDir(env), "state", `${profile}.json`);
|
|
20
|
+
}
|
|
21
|
+
export function getStatusPath(env = process.env) {
|
|
22
|
+
return path.join(getStateDir(env), "status.json");
|
|
23
|
+
}
|
|
24
|
+
export function getLockFilePath(env = process.env) {
|
|
25
|
+
return path.join(getStateDir(env), LOCK_FILE_NAME);
|
|
26
|
+
}
|
|
27
|
+
export function getLogFilePath(env = process.env) {
|
|
28
|
+
return path.join(getHomeDir(env), "Library", "Logs", LOG_FILE_NAME);
|
|
29
|
+
}
|
|
30
|
+
export function ensureDir(dir) {
|
|
31
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
32
|
+
}
|
|
33
|
+
/** Write JSON atomically (tmp + rename) so a crash never leaves half a state file. */
|
|
34
|
+
export function writeJsonAtomic(file, value) {
|
|
35
|
+
ensureDir(path.dirname(file));
|
|
36
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
37
|
+
fs.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
|
|
38
|
+
fs.renameSync(tmp, file);
|
|
39
|
+
}
|
|
40
|
+
export function readJson(file) {
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(fs.readFileSync(file, "utf8"));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (err.code === "ENOENT") {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,MAAyB,OAAO,CAAC,GAAG;IACvF,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAc;IAC1D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type OAuthCallbackStatus = "success" | "timeout" | "denied" | "exchange-failed" | "listen-failed";
|
|
2
|
+
export interface OAuthCallbackResult {
|
|
3
|
+
status: OAuthCallbackStatus;
|
|
4
|
+
error?: Error;
|
|
5
|
+
}
|
|
6
|
+
export interface RunOAuthCallbackOptions {
|
|
7
|
+
expectedState: string;
|
|
8
|
+
exchangeCode: (code: string) => Promise<void>;
|
|
9
|
+
port?: number;
|
|
10
|
+
path?: string;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
onListening?: () => void;
|
|
13
|
+
postSuccessDelayMs?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Loopback OAuth callback on localhost:8199 (Plaud's registered redirect).
|
|
17
|
+
* Binds 127.0.0.1 and ::1 only. Rejects unexpected `state` without exchanging a code.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runOAuthCallback(options: RunOAuthCallbackOptions): Promise<OAuthCallbackResult>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { OAUTH_CALLBACK_PATH, OAUTH_CALLBACK_PORT } from "./constants.js";
|
|
3
|
+
import { redactSecrets } from "../redact.js";
|
|
4
|
+
const SUCCESS_HTML = "<!doctype html><html><head><meta charset=\"utf-8\"><title>Plaud</title></head><body style=\"font-family:system-ui;padding:2rem;text-align:center;\"><h1>Authorization successful</h1><p>You can close this tab and return to the terminal.</p></body></html>";
|
|
5
|
+
const NEUTRAL_HTML = "<!doctype html><html><head><meta charset=\"utf-8\"><title>Plaud</title></head><body style=\"font-family:system-ui;padding:2rem;text-align:center;\"><h1>Continue authorization in the original window.</h1><p>This page can be closed.</p></body></html>";
|
|
6
|
+
function errorHtml(message) {
|
|
7
|
+
const escaped = redactSecrets(message).replace(/[&<>]/g, (c) => c === "&" ? "&" : c === "<" ? "<" : ">");
|
|
8
|
+
return `<!doctype html><html><head><meta charset="utf-8"><title>Plaud</title></head><body style="font-family:system-ui;padding:2rem;text-align:center;"><h1>Authorization failed</h1><p>${escaped}</p></body></html>`;
|
|
9
|
+
}
|
|
10
|
+
const LOOPBACK_HOSTS = ["127.0.0.1", "::1"];
|
|
11
|
+
const IPV6_UNAVAILABLE = new Set(["EAFNOSUPPORT", "EADDRNOTAVAIL", "EINVAL", "EPROTONOSUPPORT"]);
|
|
12
|
+
function listenOne(port, host, handler) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const server = createServer(handler);
|
|
15
|
+
server.once("error", reject);
|
|
16
|
+
server.listen(port, host, () => {
|
|
17
|
+
server.removeListener("error", reject);
|
|
18
|
+
resolve(server);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function closeServers(servers) {
|
|
23
|
+
await Promise.all(servers.map((server) => new Promise((resolve) => {
|
|
24
|
+
try {
|
|
25
|
+
server.closeAllConnections?.();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
/* ignore */
|
|
29
|
+
}
|
|
30
|
+
server.close(() => resolve());
|
|
31
|
+
})));
|
|
32
|
+
}
|
|
33
|
+
async function listenLoopback(port, handler) {
|
|
34
|
+
const servers = [];
|
|
35
|
+
for (const host of LOOPBACK_HOSTS) {
|
|
36
|
+
try {
|
|
37
|
+
servers.push(await listenOne(port, host, handler));
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const code = err && typeof err === "object" && "code" in err ? String(err.code ?? "") : "";
|
|
41
|
+
if (host !== "127.0.0.1" && IPV6_UNAVAILABLE.has(code)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
await closeServers(servers);
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return servers;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Loopback OAuth callback on localhost:8199 (Plaud's registered redirect).
|
|
52
|
+
* Binds 127.0.0.1 and ::1 only. Rejects unexpected `state` without exchanging a code.
|
|
53
|
+
*/
|
|
54
|
+
export function runOAuthCallback(options) {
|
|
55
|
+
const port = options.port ?? OAUTH_CALLBACK_PORT;
|
|
56
|
+
const callbackPath = options.path ?? OAUTH_CALLBACK_PATH;
|
|
57
|
+
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
58
|
+
const postSuccessDelayMs = options.postSuccessDelayMs ?? 1500;
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
let settled = false;
|
|
61
|
+
let exchangeStarted = false;
|
|
62
|
+
let exchangeSucceeded = false;
|
|
63
|
+
let timeoutId = null;
|
|
64
|
+
let servers = [];
|
|
65
|
+
const handler = (req, res) => {
|
|
66
|
+
const reqUrl = new URL(req.url ?? "/", `http://127.0.0.1:${port}`);
|
|
67
|
+
if (reqUrl.pathname !== callbackPath) {
|
|
68
|
+
res.writeHead(404);
|
|
69
|
+
res.end();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const error = reqUrl.searchParams.get("error");
|
|
73
|
+
const state = reqUrl.searchParams.get("state");
|
|
74
|
+
const code = reqUrl.searchParams.get("code");
|
|
75
|
+
if (error) {
|
|
76
|
+
const desc = reqUrl.searchParams.get("error_description") ?? error;
|
|
77
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
78
|
+
res.end(errorHtml(`Authorization denied.`));
|
|
79
|
+
finalize({ status: "denied", error: new Error(desc) });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!state || state !== options.expectedState) {
|
|
83
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
84
|
+
res.end(NEUTRAL_HTML);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (exchangeSucceeded) {
|
|
88
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
89
|
+
res.end(SUCCESS_HTML);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!code) {
|
|
93
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
94
|
+
res.end(NEUTRAL_HTML);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (exchangeStarted) {
|
|
98
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
99
|
+
res.end(NEUTRAL_HTML);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
exchangeStarted = true;
|
|
103
|
+
options.exchangeCode(code).then(() => {
|
|
104
|
+
exchangeSucceeded = true;
|
|
105
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
106
|
+
res.end(SUCCESS_HTML);
|
|
107
|
+
finalize({ status: "success" });
|
|
108
|
+
}, (err) => {
|
|
109
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
110
|
+
res.writeHead(500, { "Content-Type": "text/html" });
|
|
111
|
+
res.end(errorHtml("Token exchange failed."));
|
|
112
|
+
finalize({ status: "exchange-failed", error: e });
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
timeoutId = setTimeout(() => {
|
|
116
|
+
finalize({ status: "timeout" }, true);
|
|
117
|
+
}, timeoutMs);
|
|
118
|
+
listenLoopback(port, handler).then((bound) => {
|
|
119
|
+
if (settled) {
|
|
120
|
+
void closeServers(bound);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
servers = bound;
|
|
124
|
+
for (const server of servers) {
|
|
125
|
+
server.on("error", (err) => {
|
|
126
|
+
if (settled) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
finalize({ status: "listen-failed", error: new Error(`callback server error: ${err.message}`) }, true);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
options.onListening?.();
|
|
133
|
+
}, (err) => {
|
|
134
|
+
const code = err && typeof err === "object" && "code" in err ? String(err.code ?? "") : "";
|
|
135
|
+
const message = code === "EADDRINUSE"
|
|
136
|
+
? `port ${port} is in use — another Plaud login may still be running. Wait a few seconds and retry.`
|
|
137
|
+
: `callback server error: ${err instanceof Error ? err.message : String(err)}`;
|
|
138
|
+
finalize({ status: "listen-failed", error: new Error(message) }, true);
|
|
139
|
+
});
|
|
140
|
+
function finalize(result, immediate = false) {
|
|
141
|
+
if (settled) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
settled = true;
|
|
145
|
+
if (timeoutId) {
|
|
146
|
+
clearTimeout(timeoutId);
|
|
147
|
+
timeoutId = null;
|
|
148
|
+
}
|
|
149
|
+
const close = () => {
|
|
150
|
+
void closeServers(servers).then(() => resolve(result));
|
|
151
|
+
};
|
|
152
|
+
if (immediate || result.status !== "success") {
|
|
153
|
+
close();
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const closeTimeoutId = setTimeout(close, postSuccessDelayMs);
|
|
157
|
+
closeTimeoutId.unref?.();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback.js","sourceRoot":"","sources":["../../src/plaud/callback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { PlaudAuthSession } from "./session.js";
|
|
2
|
+
/** One recording as listed by Plaud. Times are UTC instants. */
|
|
3
|
+
export interface PlaudFileListing {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
/** When the file landed in Plaud (upload/sync). Drives the ingest watermark. */
|
|
7
|
+
createdAt: Date | null;
|
|
8
|
+
/** When recording started. Becomes Notion `Recorded`. */
|
|
9
|
+
startAt: Date | null;
|
|
10
|
+
durationMs: number | null;
|
|
11
|
+
}
|
|
12
|
+
export interface PlaudSegment {
|
|
13
|
+
speaker: string;
|
|
14
|
+
startMs: number;
|
|
15
|
+
text: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PlaudRecording extends PlaudFileListing {
|
|
18
|
+
/** Plaud's auto summary markdown (`auto_sum_note`), or null while it is still generating. */
|
|
19
|
+
summaryMarkdown: string | null;
|
|
20
|
+
/** Raw transcript segments (`transaction` block), empty while still generating. */
|
|
21
|
+
segments: PlaudSegment[];
|
|
22
|
+
}
|
|
23
|
+
export interface PlaudClient {
|
|
24
|
+
listFiles(page?: number, pageSize?: number): Promise<PlaudFileListing[]>;
|
|
25
|
+
getRecording(fileId: string): Promise<PlaudRecording>;
|
|
26
|
+
currentUser(): Promise<Record<string, unknown>>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Plaud's third-party API returns naive ISO strings that are UTC
|
|
30
|
+
* (e.g. start_at 2026-09-25T20:00:25 for a 3:00 PM CDT call); epoch seconds or
|
|
31
|
+
* milliseconds are accepted too.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parsePlaudTime(value: unknown): Date | null;
|
|
34
|
+
export declare function assertFileId(fileId: string): string;
|
|
35
|
+
export declare function extractFileList(payload: unknown): Record<string, unknown>[];
|
|
36
|
+
export declare function normalizeListing(raw: Record<string, unknown>): PlaudFileListing;
|
|
37
|
+
export declare function segmentsFromUnknown(list: unknown): PlaudSegment[];
|
|
38
|
+
export declare function fetchHttpsBlock(rawUrl: string, fetchImpl?: typeof fetch): Promise<string>;
|
|
39
|
+
export declare class HttpPlaudClient implements PlaudClient {
|
|
40
|
+
private readonly session;
|
|
41
|
+
private readonly fetchImpl;
|
|
42
|
+
private readonly baseUrl;
|
|
43
|
+
constructor(session: PlaudAuthSession, options?: {
|
|
44
|
+
fetchImpl?: typeof fetch;
|
|
45
|
+
baseUrl?: string;
|
|
46
|
+
});
|
|
47
|
+
listFiles(page?: number, pageSize?: number): Promise<PlaudFileListing[]>;
|
|
48
|
+
currentUser(): Promise<Record<string, unknown>>;
|
|
49
|
+
getRecording(fileId: string): Promise<PlaudRecording>;
|
|
50
|
+
private blockContent;
|
|
51
|
+
/** The Summary tab (`auto_sum_note`) — what the Zap's "Summary" field carried. */
|
|
52
|
+
private autoSummary;
|
|
53
|
+
private transcriptSegments;
|
|
54
|
+
private requestJson;
|
|
55
|
+
}
|