sourceloop 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +401 -0
  2. package/dist/commands/attach.d.ts +2 -0
  3. package/dist/commands/attach.js +103 -0
  4. package/dist/commands/attach.js.map +1 -0
  5. package/dist/commands/auth.d.ts +2 -0
  6. package/dist/commands/auth.js +33 -0
  7. package/dist/commands/auth.js.map +1 -0
  8. package/dist/commands/chrome.d.ts +2 -0
  9. package/dist/commands/chrome.js +30 -0
  10. package/dist/commands/chrome.js.map +1 -0
  11. package/dist/commands/compose.d.ts +2 -0
  12. package/dist/commands/compose.js +14 -0
  13. package/dist/commands/compose.js.map +1 -0
  14. package/dist/commands/doctor.d.ts +2 -0
  15. package/dist/commands/doctor.js +15 -0
  16. package/dist/commands/doctor.js.map +1 -0
  17. package/dist/commands/import-latest.d.ts +2 -0
  18. package/dist/commands/import-latest.js +42 -0
  19. package/dist/commands/import-latest.js.map +1 -0
  20. package/dist/commands/ingest.d.ts +2 -0
  21. package/dist/commands/ingest.js +14 -0
  22. package/dist/commands/ingest.js.map +1 -0
  23. package/dist/commands/init.d.ts +2 -0
  24. package/dist/commands/init.js +24 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/notebook-bind.d.ts +2 -0
  27. package/dist/commands/notebook-bind.js +39 -0
  28. package/dist/commands/notebook-bind.js.map +1 -0
  29. package/dist/commands/notebook-create.d.ts +2 -0
  30. package/dist/commands/notebook-create.js +39 -0
  31. package/dist/commands/notebook-create.js.map +1 -0
  32. package/dist/commands/notebook-import.d.ts +2 -0
  33. package/dist/commands/notebook-import.js +39 -0
  34. package/dist/commands/notebook-import.js.map +1 -0
  35. package/dist/commands/notebook-source.d.ts +2 -0
  36. package/dist/commands/notebook-source.js +71 -0
  37. package/dist/commands/notebook-source.js.map +1 -0
  38. package/dist/commands/plan.d.ts +9 -0
  39. package/dist/commands/plan.js +59 -0
  40. package/dist/commands/plan.js.map +1 -0
  41. package/dist/commands/run.d.ts +2 -0
  42. package/dist/commands/run.js +76 -0
  43. package/dist/commands/run.js.map +1 -0
  44. package/dist/commands/status.d.ts +2 -0
  45. package/dist/commands/status.js +15 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/commands/topic.d.ts +2 -0
  48. package/dist/commands/topic.js +53 -0
  49. package/dist/commands/topic.js.map +1 -0
  50. package/dist/core/attach/launch-managed-chrome.d.ts +27 -0
  51. package/dist/core/attach/launch-managed-chrome.js +136 -0
  52. package/dist/core/attach/launch-managed-chrome.js.map +1 -0
  53. package/dist/core/attach/manage-targets.d.ts +49 -0
  54. package/dist/core/attach/manage-targets.js +179 -0
  55. package/dist/core/attach/manage-targets.js.map +1 -0
  56. package/dist/core/ingest/frontmatter.d.ts +4 -0
  57. package/dist/core/ingest/frontmatter.js +30 -0
  58. package/dist/core/ingest/frontmatter.js.map +1 -0
  59. package/dist/core/ingest/html-to-markdown.d.ts +5 -0
  60. package/dist/core/ingest/html-to-markdown.js +53 -0
  61. package/dist/core/ingest/html-to-markdown.js.map +1 -0
  62. package/dist/core/ingest/ingest-source.d.ts +11 -0
  63. package/dist/core/ingest/ingest-source.js +115 -0
  64. package/dist/core/ingest/ingest-source.js.map +1 -0
  65. package/dist/core/notebooklm/adapter.d.ts +17 -0
  66. package/dist/core/notebooklm/adapter.js +2 -0
  67. package/dist/core/notebooklm/adapter.js.map +1 -0
  68. package/dist/core/notebooklm/auth.d.ts +30 -0
  69. package/dist/core/notebooklm/auth.js +105 -0
  70. package/dist/core/notebooklm/auth.js.map +1 -0
  71. package/dist/core/notebooklm/browser-agent-adapter.d.ts +21 -0
  72. package/dist/core/notebooklm/browser-agent-adapter.js +37 -0
  73. package/dist/core/notebooklm/browser-agent-adapter.js.map +1 -0
  74. package/dist/core/notebooklm/browser-agent.d.ts +121 -0
  75. package/dist/core/notebooklm/browser-agent.js +1604 -0
  76. package/dist/core/notebooklm/browser-agent.js.map +1 -0
  77. package/dist/core/notebooklm/config.d.ts +20 -0
  78. package/dist/core/notebooklm/config.js +133 -0
  79. package/dist/core/notebooklm/config.js.map +1 -0
  80. package/dist/core/notebooklm/fixture-adapter.d.ts +13 -0
  81. package/dist/core/notebooklm/fixture-adapter.js +32 -0
  82. package/dist/core/notebooklm/fixture-adapter.js.map +1 -0
  83. package/dist/core/notebooklm/response-extraction.d.ts +23 -0
  84. package/dist/core/notebooklm/response-extraction.js +348 -0
  85. package/dist/core/notebooklm/response-extraction.js.map +1 -0
  86. package/dist/core/notebooks/bind-notebook.d.ts +21 -0
  87. package/dist/core/notebooks/bind-notebook.js +95 -0
  88. package/dist/core/notebooks/bind-notebook.js.map +1 -0
  89. package/dist/core/notebooks/manage-managed-notebooks.d.ts +70 -0
  90. package/dist/core/notebooks/manage-managed-notebooks.js +491 -0
  91. package/dist/core/notebooks/manage-managed-notebooks.js.map +1 -0
  92. package/dist/core/notebooks/manage-notebook-source-manifests.d.ts +25 -0
  93. package/dist/core/notebooks/manage-notebook-source-manifests.js +127 -0
  94. package/dist/core/notebooks/manage-notebook-source-manifests.js.map +1 -0
  95. package/dist/core/operator/workspace-operator.d.ts +82 -0
  96. package/dist/core/operator/workspace-operator.js +610 -0
  97. package/dist/core/operator/workspace-operator.js.map +1 -0
  98. package/dist/core/outputs/compose-run.d.ts +11 -0
  99. package/dist/core/outputs/compose-run.js +98 -0
  100. package/dist/core/outputs/compose-run.js.map +1 -0
  101. package/dist/core/runs/load-artifacts.d.ts +14 -0
  102. package/dist/core/runs/load-artifacts.js +51 -0
  103. package/dist/core/runs/load-artifacts.js.map +1 -0
  104. package/dist/core/runs/question-planner.d.ts +20 -0
  105. package/dist/core/runs/question-planner.js +276 -0
  106. package/dist/core/runs/question-planner.js.map +1 -0
  107. package/dist/core/runs/render-run-note.d.ts +13 -0
  108. package/dist/core/runs/render-run-note.js +111 -0
  109. package/dist/core/runs/render-run-note.js.map +1 -0
  110. package/dist/core/runs/run-qa.d.ts +28 -0
  111. package/dist/core/runs/run-qa.js +393 -0
  112. package/dist/core/runs/run-qa.js.map +1 -0
  113. package/dist/core/topics/manage-topics.d.ts +27 -0
  114. package/dist/core/topics/manage-topics.js +314 -0
  115. package/dist/core/topics/manage-topics.js.map +1 -0
  116. package/dist/core/vault/notes.d.ts +29 -0
  117. package/dist/core/vault/notes.js +147 -0
  118. package/dist/core/vault/notes.js.map +1 -0
  119. package/dist/core/vault/paths.d.ts +31 -0
  120. package/dist/core/vault/paths.js +44 -0
  121. package/dist/core/vault/paths.js.map +1 -0
  122. package/dist/core/workspace/bootstrap.d.ts +16 -0
  123. package/dist/core/workspace/bootstrap.js +443 -0
  124. package/dist/core/workspace/bootstrap.js.map +1 -0
  125. package/dist/core/workspace/constants.d.ts +3 -0
  126. package/dist/core/workspace/constants.js +16 -0
  127. package/dist/core/workspace/constants.js.map +1 -0
  128. package/dist/core/workspace/init-workspace.d.ts +15 -0
  129. package/dist/core/workspace/init-workspace.js +86 -0
  130. package/dist/core/workspace/init-workspace.js.map +1 -0
  131. package/dist/core/workspace/load-workspace.d.ts +6 -0
  132. package/dist/core/workspace/load-workspace.js +51 -0
  133. package/dist/core/workspace/load-workspace.js.map +1 -0
  134. package/dist/core/workspace/schema.d.ts +19 -0
  135. package/dist/core/workspace/schema.js +19 -0
  136. package/dist/core/workspace/schema.js.map +1 -0
  137. package/dist/index.d.ts +2 -0
  138. package/dist/index.js +41 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/lib/cli-output.d.ts +2 -0
  141. package/dist/lib/cli-output.js +7 -0
  142. package/dist/lib/cli-output.js.map +1 -0
  143. package/dist/lib/obsidian.d.ts +4 -0
  144. package/dist/lib/obsidian.js +23 -0
  145. package/dist/lib/obsidian.js.map +1 -0
  146. package/dist/lib/slugify.d.ts +1 -0
  147. package/dist/lib/slugify.js +10 -0
  148. package/dist/lib/slugify.js.map +1 -0
  149. package/dist/lib/write-json.d.ts +1 -0
  150. package/dist/lib/write-json.js +5 -0
  151. package/dist/lib/write-json.js.map +1 -0
  152. package/dist/schemas/attach.d.ts +118 -0
  153. package/dist/schemas/attach.js +33 -0
  154. package/dist/schemas/attach.js.map +1 -0
  155. package/dist/schemas/managed-notebook.d.ts +47 -0
  156. package/dist/schemas/managed-notebook.js +30 -0
  157. package/dist/schemas/managed-notebook.js.map +1 -0
  158. package/dist/schemas/notebook-source.d.ts +31 -0
  159. package/dist/schemas/notebook-source.js +23 -0
  160. package/dist/schemas/notebook-source.js.map +1 -0
  161. package/dist/schemas/notebook.d.ts +26 -0
  162. package/dist/schemas/notebook.js +18 -0
  163. package/dist/schemas/notebook.js.map +1 -0
  164. package/dist/schemas/run.d.ts +169 -0
  165. package/dist/schemas/run.js +80 -0
  166. package/dist/schemas/run.js.map +1 -0
  167. package/dist/schemas/source.d.ts +18 -0
  168. package/dist/schemas/source.js +13 -0
  169. package/dist/schemas/source.js.map +1 -0
  170. package/dist/schemas/topic.d.ts +37 -0
  171. package/dist/schemas/topic.js +25 -0
  172. package/dist/schemas/topic.js.map +1 -0
  173. package/package.json +44 -0
@@ -0,0 +1,348 @@
1
+ const UI_ONLY_TOKENS = new Set([
2
+ "more_horiz",
3
+ "more_vert",
4
+ "thumb_up",
5
+ "thumb_down",
6
+ "content_copy",
7
+ "refresh",
8
+ "edit",
9
+ "share",
10
+ "open_in_new",
11
+ "expand_more",
12
+ "expand_less"
13
+ ]);
14
+ const UI_ONLY_LABEL_PATTERNS = [
15
+ /^more (actions|options)$/i,
16
+ /^show more$/i,
17
+ /^copy$/i,
18
+ /^copy answer$/i,
19
+ /^share$/i,
20
+ /^open in new$/i,
21
+ /^thumbs? up$/i,
22
+ /^thumbs? down$/i,
23
+ /^good response$/i,
24
+ /^bad response$/i,
25
+ /^edit$/i,
26
+ /^retry$/i,
27
+ /^refresh$/i
28
+ ];
29
+ const CITATION_HINT_PATTERNS = [
30
+ /\bsource\b/i,
31
+ /\bsources\b/i,
32
+ /\bcitation\b/i,
33
+ /\bcitations\b/i,
34
+ /\breference\b/i,
35
+ /\breferences\b/i,
36
+ /출처/,
37
+ /참고/,
38
+ /근거/,
39
+ /자료/
40
+ ];
41
+ const SOURCE_PATH_PATTERN = /(?:[\p{L}\p{N}_./-]+\.(?:md|pdf|txt|docx?|pptx?|xlsx?|csv|html?))/iu;
42
+ const LIKELY_FRAGMENT_WORDS = new Set([
43
+ "e",
44
+ "ts",
45
+ "me",
46
+ "nity",
47
+ "lse",
48
+ "ust",
49
+ "nce",
50
+ "t",
51
+ "f",
52
+ "nts",
53
+ "spiration",
54
+ "nother",
55
+ "ven't"
56
+ ]);
57
+ export function normalizeNotebookLMAnswerText(rawText) {
58
+ const normalizedInput = normalizeWhitespace(rawText);
59
+ if (!normalizedInput) {
60
+ return "";
61
+ }
62
+ const lines = normalizedInput.split(/\r?\n/);
63
+ const cleanedLines = [];
64
+ for (const rawLine of lines) {
65
+ const line = normalizeLine(rawLine);
66
+ if (!line || isUiOnlyLine(line)) {
67
+ continue;
68
+ }
69
+ const previousLine = cleanedLines[cleanedLines.length - 1];
70
+ if (previousLine && isPunctuationOnlyLine(line)) {
71
+ cleanedLines[cleanedLines.length - 1] = `${previousLine}${line}`;
72
+ continue;
73
+ }
74
+ if (previousLine && startsWithDetachedPunctuation(line)) {
75
+ cleanedLines[cleanedLines.length - 1] = `${previousLine}${line}`;
76
+ continue;
77
+ }
78
+ if (previousLine === line) {
79
+ continue;
80
+ }
81
+ cleanedLines.push(line);
82
+ }
83
+ return cleanedLines.join("\n").replace(/\n{3,}/g, "\n\n").trim();
84
+ }
85
+ export function extractNormalizedAnswerFromSnapshot(snapshot) {
86
+ const answerFromBodies = snapshot.bodyTexts
87
+ .map((bodyText) => normalizeNotebookLMAnswerText(bodyText))
88
+ .filter((bodyText) => bodyText.length > 0)
89
+ .join("\n\n")
90
+ .trim();
91
+ if (answerFromBodies) {
92
+ return answerFromBodies;
93
+ }
94
+ const fallback = normalizeNotebookLMAnswerText(snapshot.responseText);
95
+ if (fallback) {
96
+ return fallback;
97
+ }
98
+ return snapshot.responseText.trim();
99
+ }
100
+ export function extractCitationReferencesFromSnapshot(candidates) {
101
+ const grouped = new Map();
102
+ for (const candidate of candidates) {
103
+ const citation = normalizeCitationCandidate(candidate);
104
+ if (!citation) {
105
+ continue;
106
+ }
107
+ const key = citation.label;
108
+ const existing = grouped.get(key);
109
+ grouped.set(key, mergeCitationReferences(existing, citation));
110
+ }
111
+ const citations = [...grouped.values()];
112
+ if (citations.length > 0) {
113
+ return citations;
114
+ }
115
+ return [
116
+ {
117
+ label: "NotebookLM UI citation not captured",
118
+ note: "No visible citation metadata was extracted from the latest answer."
119
+ }
120
+ ];
121
+ }
122
+ function normalizeCitationCandidate(candidate) {
123
+ const text = normalizeLine(candidate.text ?? "");
124
+ const ariaLabel = normalizeLine(candidate.ariaLabel ?? "");
125
+ const title = normalizeLine(candidate.title ?? "");
126
+ const popoverText = normalizeLine(candidate.popoverText ?? "");
127
+ const dialogLabel = normalizeLine(candidate.dialogLabel ?? "");
128
+ const triggerDescription = normalizeLine(candidate.triggerDescription ?? "");
129
+ const href = normalizeHref(candidate.href);
130
+ const sourceTitle = extractCitationTitle(ariaLabel) ?? extractCitationTitle(title);
131
+ const metadataBits = [ariaLabel, title, normalizeLine(candidate.dataTestId ?? ""), normalizeLine(candidate.className ?? "")]
132
+ .filter(Boolean)
133
+ .join(" | ");
134
+ const label = pickCitationLabel(text, ariaLabel, title, href, metadataBits);
135
+ const sourcePath = inferSourcePath([text, ariaLabel, title, dialogLabel, triggerDescription, href]);
136
+ const note = normalizeCitationNote([sourceTitle, popoverText]
137
+ .filter((value) => value && value !== label)
138
+ .filter((value, index, array) => array.indexOf(value) === index)
139
+ .join(" | ")
140
+ .trim(), sourceTitle);
141
+ if (!label) {
142
+ return undefined;
143
+ }
144
+ if (!looksLikeCitation(label, note ?? "", href, sourcePath, candidate.selector, sourceTitle, popoverText)) {
145
+ return undefined;
146
+ }
147
+ if (isUiOnlyCitationLabel(label) && !href && !sourcePath) {
148
+ return undefined;
149
+ }
150
+ if (/^\d+(?:\s*,\s*\d+)*$/.test(label) && !sourceTitle && !sourcePath && !href) {
151
+ return undefined;
152
+ }
153
+ if (!sourceTitle && !sourcePath && !href && !popoverText) {
154
+ return undefined;
155
+ }
156
+ return {
157
+ label,
158
+ ...(href ? { href } : {}),
159
+ ...(sourcePath ? { sourcePath } : {}),
160
+ ...(note ? { note } : {})
161
+ };
162
+ }
163
+ function pickCitationLabel(...values) {
164
+ for (const value of values) {
165
+ const normalized = normalizeLine(value);
166
+ if (!normalized || isUiOnlyCitationLabel(normalized)) {
167
+ continue;
168
+ }
169
+ return normalized;
170
+ }
171
+ return undefined;
172
+ }
173
+ function inferSourcePath(values) {
174
+ for (const value of values) {
175
+ if (!value) {
176
+ continue;
177
+ }
178
+ const match = value.match(SOURCE_PATH_PATTERN);
179
+ if (match) {
180
+ return match[0];
181
+ }
182
+ }
183
+ return undefined;
184
+ }
185
+ function mergeCitationReferences(existing, next) {
186
+ if (!existing) {
187
+ return next;
188
+ }
189
+ const preferredHref = existing.href ?? next.href;
190
+ const preferredSourcePath = existing.sourcePath ?? next.sourcePath;
191
+ const mergedNote = pickBetterCitationNote(existing.note, next.note);
192
+ return {
193
+ label: existing.label,
194
+ ...(preferredHref ? { href: preferredHref } : {}),
195
+ ...(preferredSourcePath ? { sourcePath: preferredSourcePath } : {}),
196
+ ...(mergedNote ? { note: mergedNote } : {})
197
+ };
198
+ }
199
+ function pickBetterCitationNote(current, incoming) {
200
+ const currentNote = normalizeLine(current ?? "");
201
+ const incomingNote = normalizeLine(incoming ?? "");
202
+ if (!currentNote) {
203
+ return incomingNote || undefined;
204
+ }
205
+ if (!incomingNote) {
206
+ return currentNote;
207
+ }
208
+ if (incomingNote.length > currentNote.length) {
209
+ return incomingNote;
210
+ }
211
+ return currentNote;
212
+ }
213
+ function normalizeCitationNote(note, sourceTitle) {
214
+ let normalized = normalizeLine(note);
215
+ if (!normalized) {
216
+ return undefined;
217
+ }
218
+ if (sourceTitle) {
219
+ const escapedTitle = escapeRegExp(sourceTitle);
220
+ normalized = normalized.replace(new RegExp(`(?:\\s*\\|\\s*)?${escapedTitle}$`, "iu"), "").trim();
221
+ normalized = normalized.replace(new RegExp(`${escapedTitle}$`, "iu"), "").trim();
222
+ }
223
+ normalized = normalized.replace(/^\.\.\./, "").trim();
224
+ normalized = normalized.replace(/^["'“”‘’.,;:!?-]+\s*/, "").trim();
225
+ normalized = normalizeCitationNoteSegments(normalized);
226
+ normalized = normalized.replace(/\s+([.,;:!?])/g, "$1").trim();
227
+ const maxLength = 240;
228
+ if (normalized.length > maxLength) {
229
+ normalized = `${normalized.slice(0, maxLength).trimEnd()}...`;
230
+ }
231
+ if (!normalized) {
232
+ return sourceTitle ? normalizeLine(sourceTitle) : undefined;
233
+ }
234
+ return normalized;
235
+ }
236
+ function normalizeCitationNoteSegments(value) {
237
+ const segments = value
238
+ .split(/\s+\|\s+/)
239
+ .map((segment) => segment.trim())
240
+ .filter(Boolean);
241
+ if (segments.length <= 1) {
242
+ return trimBrokenLeadingSnippetToken(value);
243
+ }
244
+ const [head, ...tail] = segments;
245
+ return [head, ...tail.map((segment) => trimBrokenLeadingSnippetToken(segment))].join(" | ");
246
+ }
247
+ function trimBrokenLeadingSnippetToken(value) {
248
+ const normalized = normalizeLine(value);
249
+ const match = normalized.match(/^([a-z][a-z'’-]{0,9})\s+(.+)$/u);
250
+ if (!match) {
251
+ return normalized;
252
+ }
253
+ const firstToken = match[1];
254
+ const remainder = match[2];
255
+ if (!firstToken || !remainder) {
256
+ return normalized;
257
+ }
258
+ if (firstToken !== firstToken.toLowerCase()) {
259
+ return normalized;
260
+ }
261
+ if (LIKELY_FRAGMENT_WORDS.has(firstToken.toLowerCase())) {
262
+ return remainder.trim();
263
+ }
264
+ return normalized;
265
+ }
266
+ function looksLikeCitation(label, note, href, sourcePath, selector, sourceTitle, popoverText) {
267
+ if (sourcePath) {
268
+ return true;
269
+ }
270
+ if (sourceTitle) {
271
+ return true;
272
+ }
273
+ if (popoverText) {
274
+ return true;
275
+ }
276
+ if (/^\d+(?:\s*,\s*\d+)*$/.test(label)) {
277
+ return true;
278
+ }
279
+ const combined = `${label} ${note}`.trim();
280
+ if (CITATION_HINT_PATTERNS.some((pattern) => pattern.test(combined))) {
281
+ return true;
282
+ }
283
+ if (href && selectorImpliesCitation(selector)) {
284
+ return true;
285
+ }
286
+ return false;
287
+ }
288
+ function normalizeHref(href) {
289
+ const normalized = normalizeLine(href ?? "");
290
+ return normalized || undefined;
291
+ }
292
+ function normalizeWhitespace(value) {
293
+ return (value ?? "").replace(/\u00a0/g, " ").replace(/\r\n/g, "\n").trim();
294
+ }
295
+ function normalizeLine(value) {
296
+ return normalizeWhitespace(value).replace(/[ \t]+/g, " ");
297
+ }
298
+ function isUiOnlyLine(value) {
299
+ const normalized = normalizeLine(value);
300
+ if (!normalized) {
301
+ return true;
302
+ }
303
+ if (UI_ONLY_TOKENS.has(normalized.toLowerCase())) {
304
+ return true;
305
+ }
306
+ if (/^\d+$/.test(normalized)) {
307
+ return true;
308
+ }
309
+ return UI_ONLY_LABEL_PATTERNS.some((pattern) => pattern.test(normalized));
310
+ }
311
+ function isUiOnlyCitationLabel(value) {
312
+ const normalized = normalizeLine(value);
313
+ if (!normalized) {
314
+ return true;
315
+ }
316
+ if (UI_ONLY_TOKENS.has(normalized.toLowerCase())) {
317
+ return true;
318
+ }
319
+ return UI_ONLY_LABEL_PATTERNS.some((pattern) => pattern.test(normalized));
320
+ }
321
+ function selectorImpliesCitation(selector) {
322
+ const normalized = normalizeLine(selector);
323
+ if (!normalized) {
324
+ return false;
325
+ }
326
+ return /source|citation|reference|출처|근거/i.test(normalized) || normalized !== "a[href]";
327
+ }
328
+ function extractCitationTitle(value) {
329
+ const normalized = normalizeLine(value);
330
+ if (!normalized) {
331
+ return undefined;
332
+ }
333
+ const numbered = normalized.match(/^\d+\s*:\s*(.+)$/);
334
+ if (numbered?.[1]) {
335
+ return normalizeLine(numbered[1]);
336
+ }
337
+ return undefined;
338
+ }
339
+ function isPunctuationOnlyLine(value) {
340
+ return /^[.,;:!?]+$/.test(normalizeLine(value));
341
+ }
342
+ function startsWithDetachedPunctuation(value) {
343
+ return /^[.,;:!?]+\s+/.test(normalizeLine(value));
344
+ }
345
+ function escapeRegExp(value) {
346
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
347
+ }
348
+ //# sourceMappingURL=response-extraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-extraction.js","sourceRoot":"","sources":["../../../src/core/notebooklm/response-extraction.ts"],"names":[],"mappings":"AAuBA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,YAAY;IACZ,WAAW;IACX,UAAU;IACV,YAAY;IACZ,cAAc;IACd,SAAS;IACT,MAAM;IACN,OAAO;IACP,aAAa;IACb,aAAa;IACb,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG;IAC7B,2BAA2B;IAC3B,cAAc;IACd,SAAS;IACT,gBAAgB;IAChB,UAAU;IACV,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,SAAS;IACT,UAAU;IACV,YAAY;CACJ,CAAC;AAEX,MAAM,sBAAsB,GAAG;IAC7B,aAAa;IACb,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACI,CAAC;AAEX,MAAM,mBAAmB,GAAG,qEAAqE,CAAC;AAClG,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,GAAG;IACH,GAAG;IACH,KAAK;IACL,WAAW;IACX,QAAQ;IACR,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,6BAA6B,CAAC,OAAe;IAC3D,MAAM,eAAe,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,YAAY,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC;YACjE,SAAS;QACX,CAAC;QAED,IAAI,YAAY,IAAI,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC;YACjE,SAAS;QACX,CAAC;QAED,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,QAAoC;IACtF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,SAAS;SACxC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;SAC1D,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC;SACZ,IAAI,EAAE,CAAC;IAEV,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,6BAA6B,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,UAAyC;IAEzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAErD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL;YACE,KAAK,EAAE,qCAAqC;YAC5C,IAAI,EAAE,oEAAoE;SAC3E;KACF,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAsC;IACxE,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,kBAAkB,GAAG,aAAa,CAAC,SAAS,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnF,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;SACzH,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;IACpG,MAAM,IAAI,GAAG,qBAAqB,CAChC,CAAC,WAAW,EAAE,WAAW,CAAC;SACzB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC;SAC3C,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;SAC/D,IAAI,CAAC,KAAK,CAAC;SACX,IAAI,EAAE,EACP,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;QAC1G,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACzD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACzD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAG,MAAiC;IAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,IAAI,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;YACrD,SAAS;QACX,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,MAAiC;IACxD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAuC,EAAE,IAAuB;IAC/F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;IACjD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;IACnE,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpE,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAgB,EAAE,QAAiB;IACjE,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,YAAY,IAAI,SAAS,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,WAAoB;IAC/D,IAAI,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAC/C,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,mBAAmB,YAAY,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjG,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAED,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,UAAU,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC;IACvD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE/D,MAAM,SAAS,GAAG,GAAG,CAAC;IACtB,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAClC,UAAU,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC;IAChE,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAa;IAClD,MAAM,QAAQ,GAAG,KAAK;SACnB,KAAK,CAAC,UAAU,CAAC;SACjB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAChC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,6BAA6B,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC;IACjC,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAa;IAClD,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAa,EACb,IAAY,EACZ,IAAa,EACb,UAAmB,EACnB,QAAwB,EACxB,WAAoB,EACpB,WAAoB;IAEpB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,IAAI,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,IAAoB;IACzC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7C,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAqB;IAChD,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,KAAqB;IAC1C,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAwB;IACvD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,kCAAkC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,KAAK,SAAS,CAAC;AACzF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAqB;IACjD,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtD,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,OAAO,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAa;IAClD,OAAO,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type NotebookBinding } from "../../schemas/notebook.js";
2
+ export type BindNotebookInput = {
3
+ id?: string;
4
+ name: string;
5
+ topic: string;
6
+ topicId?: string;
7
+ notebookUrl: string;
8
+ accessMode: "owner" | "shared" | "chat-only";
9
+ force?: boolean;
10
+ description?: string;
11
+ topics?: string[];
12
+ attachTargetId?: string;
13
+ browserProfile?: string;
14
+ cwd?: string;
15
+ };
16
+ export type BindNotebookResult = {
17
+ binding: NotebookBinding;
18
+ markdownPath: string;
19
+ jsonPath: string;
20
+ };
21
+ export declare function bindNotebook(input: BindNotebookInput): Promise<BindNotebookResult>;
@@ -0,0 +1,95 @@
1
+ import { access, mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loadWorkspace } from "../workspace/load-workspace.js";
4
+ import { notebookBindingSchema } from "../../schemas/notebook.js";
5
+ import { slugify } from "../../lib/slugify.js";
6
+ import { toFrontmatterMarkdown } from "../ingest/frontmatter.js";
7
+ import { writeJsonFile } from "../../lib/write-json.js";
8
+ import { getVaultPaths } from "../vault/paths.js";
9
+ import { loadChromeAttachTarget } from "../attach/manage-targets.js";
10
+ import { loadTopic, refreshTopicArtifacts } from "../topics/manage-topics.js";
11
+ import { makeAliases, makeTags, normalizeObsidianText } from "../../lib/obsidian.js";
12
+ import { getChromeTargetNote, getNotebookNote, getTopicIndexNote, toWikiLink } from "../vault/notes.js";
13
+ import { canonicalizeNotebookUrl, extractNotebookResourceId } from "../notebooklm/browser-agent.js";
14
+ export async function bindNotebook(input) {
15
+ const workspace = await loadWorkspace(input.cwd);
16
+ const vault = getVaultPaths(workspace);
17
+ await mkdir(vault.notebooksDir, { recursive: true });
18
+ const attachTarget = input.attachTargetId ? await loadChromeAttachTarget(input.attachTargetId, input.cwd) : undefined;
19
+ const topic = input.topicId ? await loadTopic(input.topicId, input.cwd) : undefined;
20
+ const topicLabel = normalizeObsidianText(topic?.topic.name ?? input.topic);
21
+ const canonicalNotebookUrl = canonicalizeNotebookUrl(input.notebookUrl);
22
+ const remoteNotebookId = extractNotebookResourceId(canonicalNotebookUrl);
23
+ const binding = notebookBindingSchema.parse({
24
+ id: input.id ?? `notebook-${slugify(input.name)}`,
25
+ type: "notebook_binding",
26
+ name: input.name,
27
+ topic: topicLabel,
28
+ topicId: input.topicId,
29
+ notebookUrl: canonicalNotebookUrl,
30
+ ...(remoteNotebookId ? { remoteNotebookId } : {}),
31
+ accessMode: input.accessMode,
32
+ description: input.description,
33
+ topics: input.topics ?? [],
34
+ attachTargetId: input.attachTargetId,
35
+ browserProfile: input.browserProfile,
36
+ createdAt: new Date().toISOString()
37
+ });
38
+ const note = getNotebookNote(workspace, binding);
39
+ const jsonPath = path.join(vault.notebooksDir, `${binding.id}.json`);
40
+ const markdownPath = note.absolutePath;
41
+ if (!input.force && (await fileExists(jsonPath))) {
42
+ throw new Error(`Notebook binding ${binding.id} already exists. Re-run with --force to overwrite it.`);
43
+ }
44
+ const markdown = toFrontmatterMarkdown({
45
+ type: "notebook",
46
+ title: normalizeObsidianText(binding.name, binding.id),
47
+ aliases: makeAliases(binding.id),
48
+ tags: makeTags("sourceloop", "notebook", "notebooklm", ...binding.topics),
49
+ topic: normalizeObsidianText(binding.topic),
50
+ access: binding.accessMode,
51
+ ...(binding.description ? { description: binding.description } : {}),
52
+ created: binding.createdAt,
53
+ updated: binding.createdAt
54
+ }, buildNotebookBody(workspace, binding, topic?.topic, attachTarget?.target));
55
+ await writeFile(markdownPath, markdown, "utf8");
56
+ await writeJsonFile(jsonPath, binding);
57
+ if (binding.topicId) {
58
+ await refreshTopicArtifacts(binding.topicId, input.cwd);
59
+ }
60
+ return {
61
+ binding,
62
+ markdownPath,
63
+ jsonPath
64
+ };
65
+ }
66
+ async function fileExists(filePath) {
67
+ try {
68
+ await access(filePath);
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ function buildNotebookBody(workspace, binding, topic, attachTarget) {
76
+ const title = normalizeObsidianText(binding.name, binding.id);
77
+ const lines = [
78
+ `# ${title}`,
79
+ "",
80
+ `- Topic: ${binding.topicId && topic ? toWikiLink(workspace, getTopicIndexNote(workspace, topic).absolutePath, normalizeObsidianText(topic.name, topic.id)) : normalizeObsidianText(binding.topic)}`,
81
+ `- Access: ${binding.accessMode}`,
82
+ `- Notebook URL: ${binding.notebookUrl}`
83
+ ];
84
+ if (binding.attachTargetId && attachTarget) {
85
+ lines.push(`- Attach Target: ${toWikiLink(workspace, getChromeTargetNote(workspace, attachTarget).absolutePath, normalizeObsidianText(attachTarget.name, attachTarget.id))}`);
86
+ }
87
+ if (binding.description) {
88
+ lines.push("", "## Description", binding.description);
89
+ }
90
+ if (binding.topics.length > 0) {
91
+ lines.push("", "## Topics", ...binding.topics.map((topic) => `- ${topic}`));
92
+ }
93
+ return lines.join("\n");
94
+ }
95
+ //# sourceMappingURL=bind-notebook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-notebook.js","sourceRoot":"","sources":["../../../src/core/notebooks/bind-notebook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAwB,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAuBpG,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAwB;IACzD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,sBAAsB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3E,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC;QAC1C,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,YAAY,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACjD,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,oBAAoB;QACjC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;QAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IAEvC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,EAAE,uDAAuD,CAAC,CAAC;IACzG,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CACpC;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACzE,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C,MAAM,EAAE,OAAO,CAAC,UAAU;QAC1B,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,OAAO,CAAC,SAAS;QAC1B,OAAO,EAAE,OAAO,CAAC,SAAS;KAC3B,EACD,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAC1E,CAAC;IAEF,MAAM,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,OAAO;QACP,YAAY;QACZ,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,SAAoD,EACpD,OAAwB,EACxB,KAAsD,EACtD,YAA2E;IAE3E,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG;QACZ,KAAK,KAAK,EAAE;QACZ,EAAE;QACF,YAAY,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,YAAY,EAAE,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACpM,aAAa,OAAO,CAAC,UAAU,EAAE;QACjC,mBAAmB,OAAO,CAAC,WAAW,EAAE;KACzC,CAAC;IAEF,IAAI,OAAO,CAAC,cAAc,IAAI,YAAY,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CACR,oBAAoB,UAAU,CAAC,SAAS,EAAE,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,YAAY,EAAE,qBAAqB,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAClK,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { type NotebookBrowserSessionFactory } from "../notebooklm/browser-agent.js";
2
+ import { bindNotebook } from "./bind-notebook.js";
3
+ import { loadWorkspace } from "../workspace/load-workspace.js";
4
+ import { type ManagedNotebookImport, type ManagedNotebookImportStatus, type ManagedNotebookSetup } from "../../schemas/managed-notebook.js";
5
+ import { notebookSourceKindSchema } from "../../schemas/notebook-source.js";
6
+ export type CreateManagedNotebookInput = {
7
+ topicId: string;
8
+ name: string;
9
+ attachTargetId: string;
10
+ accessMode?: "owner" | "shared" | "chat-only";
11
+ description?: string;
12
+ topics?: string[];
13
+ force?: boolean;
14
+ cwd?: string;
15
+ showBrowser?: boolean;
16
+ sessionFactory?: NotebookBrowserSessionFactory;
17
+ writeSetupJson?: (filePath: string, setup: ManagedNotebookSetup) => Promise<void>;
18
+ writeSetupMarkdown?: (filePath: string, markdown: string) => Promise<void>;
19
+ };
20
+ export type CreateManagedNotebookResult = {
21
+ setup: ManagedNotebookSetup;
22
+ binding: Awaited<ReturnType<typeof bindNotebook>>["binding"];
23
+ setupMarkdownPath: string;
24
+ setupJsonPath: string;
25
+ bindingMarkdownPath: string;
26
+ bindingJsonPath: string;
27
+ };
28
+ export type ImportIntoManagedNotebookInput = {
29
+ notebookBindingId: string;
30
+ sourceId: string;
31
+ title?: string;
32
+ force?: boolean;
33
+ cwd?: string;
34
+ showBrowser?: boolean;
35
+ sessionFactory?: NotebookBrowserSessionFactory;
36
+ } | {
37
+ notebookBindingId: string;
38
+ url: string;
39
+ title?: string;
40
+ force?: boolean;
41
+ cwd?: string;
42
+ showBrowser?: boolean;
43
+ sessionFactory?: NotebookBrowserSessionFactory;
44
+ };
45
+ export type ImportIntoManagedNotebookResult = {
46
+ managedImport: ManagedNotebookImport;
47
+ markdownPath: string;
48
+ jsonPath: string;
49
+ };
50
+ export declare function createManagedNotebook(input: CreateManagedNotebookInput): Promise<CreateManagedNotebookResult>;
51
+ export declare function importIntoManagedNotebook(input: ImportIntoManagedNotebookInput): Promise<ImportIntoManagedNotebookResult>;
52
+ export declare function loadManagedNotebookSetup(setupId: string, cwd?: string): Promise<{
53
+ workspace: Awaited<ReturnType<typeof loadWorkspace>>;
54
+ setup: ManagedNotebookSetup;
55
+ path: string;
56
+ }>;
57
+ export declare function loadManagedNotebookSetupByBindingId(notebookBindingId: string, cwd?: string): Promise<{
58
+ workspace: Awaited<ReturnType<typeof loadWorkspace>>;
59
+ setup: ManagedNotebookSetup;
60
+ path: string;
61
+ }>;
62
+ export declare function listManagedNotebookSetups(cwd?: string): Promise<ManagedNotebookSetup[]>;
63
+ export declare function loadManagedNotebookImport(importId: string, cwd?: string): Promise<{
64
+ workspace: Awaited<ReturnType<typeof loadWorkspace>>;
65
+ managedImport: ManagedNotebookImport;
66
+ path: string;
67
+ }>;
68
+ export declare function listManagedNotebookImports(cwd?: string): Promise<ManagedNotebookImport[]>;
69
+ export declare function isNotebookImportSuccessful(status: ManagedNotebookImportStatus): boolean;
70
+ export declare function toManagedNotebookSourceKind(sourceUri: string): ReturnType<typeof notebookSourceKindSchema.parse>;