youtube-knowledge-mcp 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +110 -12
  2. package/dist/brain-schemas.d.ts +502 -0
  3. package/dist/brain-schemas.d.ts.map +1 -0
  4. package/dist/brain-schemas.js +113 -0
  5. package/dist/brain-schemas.js.map +1 -0
  6. package/dist/http.d.ts.map +1 -1
  7. package/dist/http.js +20 -5
  8. package/dist/http.js.map +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +86 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/prompts.d.ts.map +1 -1
  13. package/dist/prompts.js +42 -0
  14. package/dist/prompts.js.map +1 -1
  15. package/dist/resources.d.ts.map +1 -1
  16. package/dist/resources.js +66 -0
  17. package/dist/resources.js.map +1 -1
  18. package/dist/schemas.d.ts +67 -56
  19. package/dist/schemas.d.ts.map +1 -1
  20. package/dist/schemas.js +25 -4
  21. package/dist/schemas.js.map +1 -1
  22. package/dist/tools/ask-brain.d.ts +62 -0
  23. package/dist/tools/ask-brain.d.ts.map +1 -0
  24. package/dist/tools/ask-brain.js +70 -0
  25. package/dist/tools/ask-brain.js.map +1 -0
  26. package/dist/tools/batch.d.ts +10 -10
  27. package/dist/tools/batch.js +2 -2
  28. package/dist/tools/batch.js.map +1 -1
  29. package/dist/tools/brain-info.d.ts +180 -0
  30. package/dist/tools/brain-info.d.ts.map +1 -0
  31. package/dist/tools/brain-info.js +108 -0
  32. package/dist/tools/brain-info.js.map +1 -0
  33. package/dist/tools/build-brain.d.ts +120 -0
  34. package/dist/tools/build-brain.d.ts.map +1 -0
  35. package/dist/tools/build-brain.js +123 -0
  36. package/dist/tools/build-brain.js.map +1 -0
  37. package/dist/tools/clips.d.ts +4 -4
  38. package/dist/tools/fetch-videos.d.ts +8 -8
  39. package/dist/tools/get-chapters.d.ts +2 -2
  40. package/dist/tools/get-comments.d.ts +2 -2
  41. package/dist/tools/get-transcript.d.ts +2 -2
  42. package/dist/tools/library.d.ts +9 -7
  43. package/dist/tools/library.d.ts.map +1 -1
  44. package/dist/tools/library.js +10 -4
  45. package/dist/tools/library.js.map +1 -1
  46. package/dist/tools/list-library.d.ts +4 -4
  47. package/dist/tools/manage-brain.d.ts +39 -0
  48. package/dist/tools/manage-brain.d.ts.map +1 -0
  49. package/dist/tools/manage-brain.js +53 -0
  50. package/dist/tools/manage-brain.js.map +1 -0
  51. package/dist/tools/search-channels.d.ts +4 -4
  52. package/dist/tools/search-transcript.d.ts +2 -2
  53. package/dist/tools/search-videos.d.ts +8 -8
  54. package/dist/utils/brain-build.d.ts +40 -0
  55. package/dist/utils/brain-build.d.ts.map +1 -0
  56. package/dist/utils/brain-build.js +211 -0
  57. package/dist/utils/brain-build.js.map +1 -0
  58. package/dist/utils/brain-chunks.d.ts +33 -0
  59. package/dist/utils/brain-chunks.d.ts.map +1 -0
  60. package/dist/utils/brain-chunks.js +87 -0
  61. package/dist/utils/brain-chunks.js.map +1 -0
  62. package/dist/utils/brain-index.d.ts +27 -0
  63. package/dist/utils/brain-index.d.ts.map +1 -0
  64. package/dist/utils/brain-index.js +100 -0
  65. package/dist/utils/brain-index.js.map +1 -0
  66. package/dist/utils/brain-ingest.d.ts +57 -0
  67. package/dist/utils/brain-ingest.d.ts.map +1 -0
  68. package/dist/utils/brain-ingest.js +127 -0
  69. package/dist/utils/brain-ingest.js.map +1 -0
  70. package/dist/utils/brain-lock.d.ts +20 -0
  71. package/dist/utils/brain-lock.d.ts.map +1 -0
  72. package/dist/utils/brain-lock.js +93 -0
  73. package/dist/utils/brain-lock.js.map +1 -0
  74. package/dist/utils/brain-lookup.d.ts +3 -0
  75. package/dist/utils/brain-lookup.d.ts.map +1 -0
  76. package/dist/utils/brain-lookup.js +62 -0
  77. package/dist/utils/brain-lookup.js.map +1 -0
  78. package/dist/utils/brain-paths.d.ts +19 -0
  79. package/dist/utils/brain-paths.d.ts.map +1 -0
  80. package/dist/utils/brain-paths.js +34 -0
  81. package/dist/utils/brain-paths.js.map +1 -0
  82. package/dist/utils/brain-phrases.d.ts +31 -0
  83. package/dist/utils/brain-phrases.d.ts.map +1 -0
  84. package/dist/utils/brain-phrases.js +116 -0
  85. package/dist/utils/brain-phrases.js.map +1 -0
  86. package/dist/utils/brain-stats.d.ts +25 -0
  87. package/dist/utils/brain-stats.d.ts.map +1 -0
  88. package/dist/utils/brain-stats.js +64 -0
  89. package/dist/utils/brain-stats.js.map +1 -0
  90. package/dist/utils/brain-storage.d.ts +28 -0
  91. package/dist/utils/brain-storage.d.ts.map +1 -0
  92. package/dist/utils/brain-storage.js +87 -0
  93. package/dist/utils/brain-storage.js.map +1 -0
  94. package/dist/utils/clips.js +4 -4
  95. package/dist/utils/clips.js.map +1 -1
  96. package/dist/utils/json-file.d.ts +36 -0
  97. package/dist/utils/json-file.d.ts.map +1 -0
  98. package/dist/utils/json-file.js +45 -0
  99. package/dist/utils/json-file.js.map +1 -0
  100. package/dist/utils/paths.d.ts +9 -0
  101. package/dist/utils/paths.d.ts.map +1 -0
  102. package/dist/utils/paths.js +13 -0
  103. package/dist/utils/paths.js.map +1 -0
  104. package/dist/utils/preflight.d.ts.map +1 -1
  105. package/dist/utils/preflight.js +14 -2
  106. package/dist/utils/preflight.js.map +1 -1
  107. package/dist/utils/search-index.d.ts +22 -7
  108. package/dist/utils/search-index.d.ts.map +1 -1
  109. package/dist/utils/search-index.js +17 -4
  110. package/dist/utils/search-index.js.map +1 -1
  111. package/dist/utils/storage.d.ts +14 -44
  112. package/dist/utils/storage.d.ts.map +1 -1
  113. package/dist/utils/storage.js +37 -80
  114. package/dist/utils/storage.js.map +1 -1
  115. package/dist/utils/transcript.d.ts +5 -4
  116. package/dist/utils/transcript.d.ts.map +1 -1
  117. package/dist/utils/transcript.js +3 -0
  118. package/dist/utils/transcript.js.map +1 -1
  119. package/dist/utils/validate.d.ts +1 -0
  120. package/dist/utils/validate.d.ts.map +1 -1
  121. package/dist/utils/validate.js +18 -0
  122. package/dist/utils/validate.js.map +1 -1
  123. package/dist/utils/youtube.d.ts +14 -0
  124. package/dist/utils/youtube.d.ts.map +1 -1
  125. package/dist/utils/youtube.js +19 -13
  126. package/dist/utils/youtube.js.map +1 -1
  127. package/dist/utils/ytdlp.d.ts.map +1 -1
  128. package/dist/utils/ytdlp.js +56 -6
  129. package/dist/utils/ytdlp.js.map +1 -1
  130. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,GAAG,QAAkB;IAC3C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,oBAAoB,EAAE,GAAG,QAAQ,CAAC,CAAC;AAC5D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACtB;AAiBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlF;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAyB9F;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,yEAAyE;AACzE,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CA2BrE"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACtB;AAoBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlF;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAkC9F;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAED,yEAAyE;AACzE,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CA2BrE"}
@@ -3,7 +3,9 @@ import { YouTubeError } from './errors.js';
3
3
  /** yt-dlp versions are date-stamped (2025.11.03), which makes staleness measurable. */
4
4
  const STALE_AFTER_DAYS = 45;
5
5
  const PROBE_TIMEOUT_MS = 10_000;
6
+ const FAILED_REPORT_TTL_MS = 60_000;
6
7
  let cached;
8
+ let cachedAt = 0;
7
9
  async function probe(command, args) {
8
10
  try {
9
11
  const { stdout } = await execa(command, args, { timeout: PROBE_TIMEOUT_MS });
@@ -21,8 +23,16 @@ export function parseYtDlpAgeDays(version, now) {
21
23
  return Math.floor((now - released) / 86_400_000);
22
24
  }
23
25
  export async function runPreflight(options = {}) {
24
- if (cached && !options.force)
25
- return cached;
26
+ // A successful report holds for the process lifetime; a failed one expires.
27
+ // The probe spawns a binary with a timeout, and a host under load can miss it
28
+ // once. Caching that answer forever pins `/health` to 503 for good — the
29
+ // deployment never goes live, on a platform that would have retried, over a
30
+ // ten-second blip. Re-probing on every call instead would let a slow host
31
+ // stack overlapping spawns, so failures get a short life rather than none.
32
+ if (cached !== undefined && !options.force) {
33
+ if (cached.ok || Date.now() - cachedAt < FAILED_REPORT_TTL_MS)
34
+ return cached;
35
+ }
26
36
  const [ytDlpVersion, ffmpegVersion] = await Promise.all([
27
37
  probe('yt-dlp', ['--version']),
28
38
  probe('ffmpeg', ['-version']),
@@ -41,11 +51,13 @@ export async function runPreflight(options = {}) {
41
51
  ffmpeg.version = /^ffmpeg version (\S+)/.exec(ffmpegVersion)?.[1] ?? 'unknown';
42
52
  }
43
53
  cached = { ok: ytDlp.installed, ytDlp, ffmpeg };
54
+ cachedAt = Date.now();
44
55
  return cached;
45
56
  }
46
57
  /** Test seam — the report is cached for the process lifetime in normal use. */
47
58
  export function resetPreflightCache() {
48
59
  cached = undefined;
60
+ cachedAt = 0;
49
61
  }
50
62
  /** Throws a typed, actionable error when ffmpeg is needed but absent. */
51
63
  export async function requireFfmpeg(operation) {
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAyB3C,uFAAuF;AACvF,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,IAAI,MAAmC,CAAC;AACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB,KAAK,UAAU,KAAK,CAAC,OAAe,EAAE,IAAc;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,GAAW;IAC5D,MAAM,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAA+B,EAAE;IAClE,4EAA4E;IAC5E,8EAA8E;IAC9E,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,2EAA2E;IAC3E,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,oBAAoB;YAAE,OAAO,MAAM,CAAC;IAC/E,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,KAAK,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC;QAC9B,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;KAC9B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;IACtF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,OAAO,GAAG,YAAY,CAAC;QAC7B,MAAM,OAAO,GAAG,iBAAiB,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,gBAAgB,EAAE,CAAC;YACxD,KAAK,CAAC,OAAO,GAAG,UAAU,YAAY,OAAO,OAAO,mFAAmF,CAAC;QAC1I,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;IACxF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,yEAAyE;QACzE,MAAM,CAAC,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACjF,CAAC;IAED,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChD,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,SAAS,CAAC;IACnB,QAAQ,GAAG,CAAC,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IACxC,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO;IAE7B,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,GAAG,SAAS,2CAA2C,EACvD;QACE,QAAQ,EACN,mJAAmJ;KACtJ,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAuB;IAC3D,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAEpE,KAAK,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC,CAAC;YAC/D,IAAI,MAAM,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CACR,EAAE,EACF,mDAAmD,EACnD,iFAAiF,CAClF,CAAC;IACJ,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CACR,EAAE,EACF,+EAA+E,EAC/E,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -16,19 +16,24 @@ export declare const indexedDocumentSchema: z.ZodObject<{
16
16
  kind: z.ZodString;
17
17
  text: z.ZodString;
18
18
  }, "strip", z.ZodTypeAny, {
19
- text: string;
20
- title: string;
21
- videoId: string;
22
19
  id: string;
23
- kind: string;
24
- }, {
25
- text: string;
26
20
  title: string;
21
+ text: string;
22
+ kind: string;
27
23
  videoId: string;
24
+ }, {
28
25
  id: string;
26
+ title: string;
27
+ text: string;
29
28
  kind: string;
29
+ videoId: string;
30
30
  }>;
31
31
  export type IndexedDocument = z.infer<typeof indexedDocumentSchema>;
32
+ export interface SearchResults {
33
+ hits: SearchHit[];
34
+ /** Documents matching the query, not documents returned. */
35
+ total: number;
36
+ }
32
37
  export interface SearchHit {
33
38
  id: string;
34
39
  videoId: string;
@@ -38,6 +43,8 @@ export interface SearchHit {
38
43
  /** A window of the document around the strongest match. */
39
44
  excerpt: string;
40
45
  }
46
+ /** Exposed so phrase detection can tell filler apart from content. */
47
+ export declare function isStopWord(word: string): boolean;
41
48
  export declare function tokenize(text: string): string[];
42
49
  export declare class SearchIndex {
43
50
  private readonly documents;
@@ -45,7 +52,15 @@ export declare class SearchIndex {
45
52
  add(document: IndexedDocument): void;
46
53
  remove(id: string): void;
47
54
  get size(): number;
48
- search(query: string, limit?: number): SearchHit[];
55
+ /**
56
+ * Ranked matches, and how many there were in total.
57
+ *
58
+ * The total is not `hits.length`. Reporting the size of the page as the size
59
+ * of the result set is how a caller gets told there is nothing more to see
60
+ * when there are forty more matches, and it is the number a paginating client
61
+ * trusts most.
62
+ */
63
+ search(query: string, limit?: number, offset?: number): SearchResults;
49
64
  /** Serialisable form. Postings are rebuilt on load rather than stored. */
50
65
  toJSON(): {
51
66
  version: number;
@@ -1 +1 @@
1
- {"version":3,"file":"search-index.d.ts","sourceRoot":"","sources":["../../src/utils/search-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;IAIhC,yCAAyC;;;;;;;;;;;;;;;EAGzC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAWpE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/C;AAOD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2D;IACrF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAsBpC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAUxB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE;IAiD9C,0EAA0E;IAC1E,MAAM,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,eAAe,EAAE,CAAA;KAAE;IAO3D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW;CAY7C;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,SAAM,GAAG,MAAM,CAejF"}
1
+ {"version":3,"file":"search-index.d.ts","sourceRoot":"","sources":["../../src/utils/search-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;IAIhC,yCAAyC;;;;;;;;;;;;;;;EAGzC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAWpE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/C;AAOD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2D;IACrF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAsBpC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAUxB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,aAAa;IAmD5D,0EAA0E;IAC1E,MAAM,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,eAAe,EAAE,CAAA;KAAE;IAO3D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW;CAY7C;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,SAAM,GAAG,MAAM,CAejF"}
@@ -71,6 +71,10 @@ const STOP_WORDS = new Set([
71
71
  'do',
72
72
  'does',
73
73
  ]);
74
+ /** Exposed so phrase detection can tell filler apart from content. */
75
+ export function isStopWord(word) {
76
+ return STOP_WORDS.has(word);
77
+ }
74
78
  export function tokenize(text) {
75
79
  return text
76
80
  .toLowerCase()
@@ -112,10 +116,18 @@ export class SearchIndex {
112
116
  get size() {
113
117
  return this.documents.size;
114
118
  }
115
- search(query, limit = 10) {
119
+ /**
120
+ * Ranked matches, and how many there were in total.
121
+ *
122
+ * The total is not `hits.length`. Reporting the size of the page as the size
123
+ * of the result set is how a caller gets told there is nothing more to see
124
+ * when there are forty more matches, and it is the number a paginating client
125
+ * trusts most.
126
+ */
127
+ search(query, limit = 10, offset = 0) {
116
128
  const terms = tokenize(query);
117
129
  if (terms.length === 0 || this.documents.size === 0)
118
- return [];
130
+ return { hits: [], total: 0 };
119
131
  const totalDocuments = this.documents.size;
120
132
  const averageLength = [...this.documents.values()].reduce((sum, document) => sum + document.length, 0) /
121
133
  totalDocuments;
@@ -135,9 +147,9 @@ export class SearchIndex {
135
147
  scores.set(id, (scores.get(id) ?? 0) + score);
136
148
  }
137
149
  }
138
- return [...scores.entries()]
150
+ const hits = [...scores.entries()]
139
151
  .sort((a, b) => b[1] - a[1])
140
- .slice(0, limit)
152
+ .slice(offset, offset + limit)
141
153
  .flatMap(([id, score]) => {
142
154
  const document = this.documents.get(id);
143
155
  if (!document)
@@ -153,6 +165,7 @@ export class SearchIndex {
153
165
  },
154
166
  ];
155
167
  });
168
+ return { hits, total: scores.size };
156
169
  }
157
170
  /** Serialisable form. Postings are rebuilt on load rather than stored. */
158
171
  toJSON() {
@@ -1 +1 @@
1
- {"version":3,"file":"search-index.js","sourceRoot":"","sources":["../../src/utils/search-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-index.js","sourceRoot":"","sources":["../../src/utils/search-index.ts"],"names":[],"mappings":"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"}
@@ -1,64 +1,34 @@
1
1
  import { z } from 'zod';
2
- import { type SearchHit } from './search-index.js';
2
+ import { type SearchResults } from './search-index.js';
3
+ import { libraryMetadataSchema } from '../schemas.js';
4
+ export type LibraryMetadata = z.infer<typeof libraryMetadataSchema>;
3
5
  /**
4
- * Both of these describe files on disk that this process wrote but does not
5
- * own: the user's library survives upgrades, gets synced between machines, and
6
- * is plain JSON anyone can edit. They are schemas rather than interfaces so
7
- * that reading them back validates rather than assumes.
6
+ * The library index describes a file on disk that this process wrote but does
7
+ * not own: it survives upgrades, gets synced between machines, and is plain
8
+ * JSON anyone can edit. It is a schema rather than an interface so that reading
9
+ * it back validates rather than assumes.
8
10
  */
9
- export declare const libraryMetadataSchema: z.ZodObject<{
10
- videoId: z.ZodString;
11
- title: z.ZodString;
12
- channel: z.ZodString;
13
- url: z.ZodString;
14
- tags: z.ZodArray<z.ZodString, "many">;
15
- dateSaved: z.ZodString;
16
- hasTranscript: z.ZodBoolean;
17
- hasSummary: z.ZodBoolean;
18
- hasSkill: z.ZodBoolean;
19
- }, "strip", z.ZodTypeAny, {
20
- url: string;
21
- title: string;
22
- videoId: string;
23
- channel: string;
24
- tags: string[];
25
- dateSaved: string;
26
- hasTranscript: boolean;
27
- hasSummary: boolean;
28
- hasSkill: boolean;
29
- }, {
30
- url: string;
31
- title: string;
32
- videoId: string;
33
- channel: string;
34
- tags: string[];
35
- dateSaved: string;
36
- hasTranscript: boolean;
37
- hasSummary: boolean;
38
- hasSkill: boolean;
39
- }>;
40
- export type LibraryMetadata = z.infer<typeof libraryMetadataSchema>;
41
11
  export declare const libraryIndexSchema: z.ZodObject<{
42
12
  version: z.ZodNumber;
43
- items: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnknown>, Record<string, {
44
- url: string;
13
+ items: z.ZodType<Record<string, {
45
14
  title: string;
46
- videoId: string;
15
+ url: string;
47
16
  channel: string;
48
17
  tags: string[];
18
+ videoId: string;
49
19
  dateSaved: string;
50
20
  hasTranscript: boolean;
51
21
  hasSummary: boolean;
52
22
  hasSkill: boolean;
53
- }>, Record<string, unknown>>;
23
+ }>, z.ZodTypeDef, Record<string, unknown>>;
54
24
  }, "strip", z.ZodTypeAny, {
55
25
  version: number;
56
26
  items: Record<string, {
57
- url: string;
58
27
  title: string;
59
- videoId: string;
28
+ url: string;
60
29
  channel: string;
61
30
  tags: string[];
31
+ videoId: string;
62
32
  dateSaved: string;
63
33
  hasTranscript: boolean;
64
34
  hasSummary: boolean;
@@ -98,7 +68,7 @@ export declare function updateLibraryTags(videoId: string, changes: {
98
68
  }): Promise<LibraryMetadata>;
99
69
  /** Every tag in the library, for argument completion. */
100
70
  export declare function listTags(): Promise<string[]>;
101
- export declare function searchLibrary(query: string, limit?: number): Promise<SearchHit[]>;
71
+ export declare function searchLibrary(query: string, limit?: number, offset?: number): Promise<SearchResults>;
102
72
  /** Rebuild the index from what is actually on disk. */
103
73
  export declare function rebuildSearchIndex(): Promise<{
104
74
  documents: number;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAMhE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AA4B9D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAuD3C;AAQD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAeD,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,SAAS,GAAG,OAAO,GAChC,OAAO,CAAC,WAAW,CAAC,CA0BtB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,SAAS,GAAG,OAAO,GAChC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA4ChC;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACjE,OAAO,CAAC,eAAe,CAAC,CA0B1B;AAED,yDAAyD;AACzD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAOlD;AA2CD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGnF;AAED,uDAAuD;AACvD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBzE;AAED,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAavF"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAiB,MAAM,eAAe,CAAC;AAOrE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAiB9D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CA2C3C;AAQD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAuBD,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,SAAS,GAAG,OAAO,GAChC,OAAO,CAAC,WAAW,CAAC,CA0BtB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,SAAS,GAAG,OAAO,GAChC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwChC;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACjE,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED,yDAAyD;AACzD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAOlD;AAuCD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAGjG;AAED,uDAAuD;AACvD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBzE;AAED,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAavF"}
@@ -1,4 +1,3 @@
1
- import { homedir } from 'os';
2
1
  import { join } from 'path';
3
2
  import { z } from 'zod';
4
3
  import { mkdir, readFile, rm, writeFile } from 'fs/promises';
@@ -6,89 +5,46 @@ import { existsSync } from 'fs';
6
5
  import { YouTubeError } from './errors.js';
7
6
  import { hasCachedTranscript } from './youtube.js';
8
7
  import { SearchIndex } from './search-index.js';
9
- const BASE_DIR = join(homedir(), '.youtube-knowledge');
10
- const LIBRARY_DIR = join(BASE_DIR, 'library');
11
- const INDEX_FILE = join(BASE_DIR, 'index.json');
8
+ import { libraryMetadataSchema, recordOfValid } from '../schemas.js';
9
+ import { readJsonFile, writeJsonAtomic } from './json-file.js';
10
+ import { dataDir } from './paths.js';
11
+ const LIBRARY_DIR = dataDir('library');
12
+ const INDEX_FILE = dataDir('index.json');
12
13
  /**
13
- * Both of these describe files on disk that this process wrote but does not
14
- * own: the user's library survives upgrades, gets synced between machines, and
15
- * is plain JSON anyone can edit. They are schemas rather than interfaces so
16
- * that reading them back validates rather than assumes.
14
+ * The library index describes a file on disk that this process wrote but does
15
+ * not own: it survives upgrades, gets synced between machines, and is plain
16
+ * JSON anyone can edit. It is a schema rather than an interface so that reading
17
+ * it back validates rather than assumes.
17
18
  */
18
- export const libraryMetadataSchema = z.object({
19
- videoId: z.string(),
20
- title: z.string(),
21
- channel: z.string(),
22
- url: z.string(),
23
- tags: z.array(z.string()),
24
- dateSaved: z.string(),
25
- hasTranscript: z.boolean(),
26
- hasSummary: z.boolean(),
27
- hasSkill: z.boolean(),
28
- });
29
19
  export const libraryIndexSchema = z.object({
30
20
  version: z.number(),
31
- // A single corrupt entry should cost that one note, not the whole library, so
32
- // unreadable values are dropped rather than failing the parse.
33
- items: z.record(z.string(), z.unknown()).transform((items) => {
34
- const valid = {};
35
- for (const [key, value] of Object.entries(items)) {
36
- const parsed = libraryMetadataSchema.safeParse(value);
37
- if (parsed.success)
38
- valid[key] = parsed.data;
39
- }
40
- return valid;
41
- }),
21
+ items: recordOfValid(libraryMetadataSchema),
42
22
  });
43
23
  async function ensureDirectories() {
44
- await mkdir(BASE_DIR, { recursive: true });
24
+ await mkdir(dataDir(), { recursive: true });
45
25
  await mkdir(LIBRARY_DIR, { recursive: true });
46
26
  }
47
27
  async function loadIndex() {
48
28
  await ensureDirectories();
49
- if (!existsSync(INDEX_FILE)) {
50
- return { version: 1, items: {} };
51
- }
52
- try {
53
- const content = await readFile(INDEX_FILE, 'utf-8');
54
- const parsed = libraryIndexSchema.safeParse(JSON.parse(content));
55
- return parsed.success ? parsed.data : { version: 1, items: {} };
56
- }
57
- catch {
58
- return { version: 1, items: {} };
59
- }
29
+ return (await readJsonFile(INDEX_FILE, libraryIndexSchema)) ?? { version: 1, items: {} };
60
30
  }
61
31
  async function saveIndex(index) {
62
32
  await ensureDirectories();
63
- await writeFile(INDEX_FILE, JSON.stringify(index, null, 2), 'utf-8');
33
+ await writeJsonAtomic(INDEX_FILE, index);
64
34
  }
65
35
  export async function saveToLibrary(options) {
66
36
  const { videoId, title, channel, url, content, contentType, tags = [] } = options;
67
37
  await ensureDirectories();
68
- const itemDir = join(LIBRARY_DIR, videoId);
69
- await mkdir(itemDir, { recursive: true });
38
+ const directory = itemDir(videoId);
39
+ await mkdir(directory, { recursive: true });
70
40
  // Save content
71
41
  const filename = contentType === 'summary' ? 'summary.md' : 'skill.md';
72
- const filePath = join(itemDir, filename);
42
+ const filePath = join(directory, filename);
73
43
  await writeFile(filePath, content, 'utf-8');
74
- // Update metadata
75
- const metadataPath = join(itemDir, 'metadata.json');
76
- let metadata = {};
77
- if (existsSync(metadataPath)) {
78
- try {
79
- // Only the fields worth carrying forward need to survive validation, so
80
- // this is the metadata schema made optional field by field rather than an
81
- // "is an object" check that let anything through as metadata.
82
- const parsed = libraryMetadataSchema
83
- .partial()
84
- .safeParse(JSON.parse(await readFile(metadataPath, 'utf-8')));
85
- if (parsed.success)
86
- metadata = parsed.data;
87
- }
88
- catch {
89
- // Ignore parse errors
90
- }
91
- }
44
+ // Update metadata. Only the fields worth carrying forward need to survive
45
+ // validation, so this is the metadata schema made optional field by field
46
+ // rather than an "is an object" check that let anything through as metadata.
47
+ const metadata = (await readJsonFile(metadataPath(videoId), libraryMetadataSchema.partial())) ?? {};
92
48
  const updatedMetadata = {
93
49
  videoId,
94
50
  title,
@@ -102,7 +58,7 @@ export async function saveToLibrary(options) {
102
58
  hasSummary: contentType === 'summary' ? true : (metadata.hasSummary ?? false),
103
59
  hasSkill: contentType === 'skill' ? true : (metadata.hasSkill ?? false),
104
60
  };
105
- await writeFile(metadataPath, JSON.stringify(updatedMetadata, null, 2), 'utf-8');
61
+ await writeMetadata(updatedMetadata);
106
62
  // Update index
107
63
  const index = await loadIndex();
108
64
  index.items[videoId] = updatedMetadata;
@@ -116,6 +72,12 @@ function withoutKey(record, key) {
116
72
  function itemDir(videoId) {
117
73
  return join(LIBRARY_DIR, videoId);
118
74
  }
75
+ function metadataPath(videoId) {
76
+ return join(itemDir(videoId), 'metadata.json');
77
+ }
78
+ async function writeMetadata(metadata) {
79
+ await writeJsonAtomic(metadataPath(metadata.videoId), metadata);
80
+ }
119
81
  async function readIfPresent(path) {
120
82
  if (!existsSync(path))
121
83
  return undefined;
@@ -173,7 +135,7 @@ export async function deleteLibraryItem(videoId, contentType) {
173
135
  }
174
136
  else {
175
137
  index.items[videoId] = updated;
176
- await writeFile(join(itemDir(videoId), 'metadata.json'), JSON.stringify(updated, null, 2), 'utf-8');
138
+ await writeMetadata(updated);
177
139
  }
178
140
  await saveIndex(index);
179
141
  await removeFromIndex(videoId, contentType);
@@ -193,7 +155,7 @@ export async function updateLibraryTags(videoId, changes) {
193
155
  const updated = { ...metadata, tags };
194
156
  index.items[videoId] = updated;
195
157
  await saveIndex(index);
196
- await writeFile(join(itemDir(videoId), 'metadata.json'), JSON.stringify(updated, null, 2), 'utf-8');
158
+ await writeMetadata(updated);
197
159
  return updated;
198
160
  }
199
161
  /** Every tag in the library, for argument completion. */
@@ -207,21 +169,16 @@ export async function listTags() {
207
169
  return [...tags].sort();
208
170
  }
209
171
  // -- Full-text search ----------------------------------------------------
210
- const INDEX_SEARCH_FILE = join(BASE_DIR, 'search-index.json');
172
+ const INDEX_SEARCH_FILE = dataDir('search-index.json');
211
173
  async function loadSearchIndex() {
212
174
  await ensureDirectories();
213
- if (!existsSync(INDEX_SEARCH_FILE))
214
- return new SearchIndex();
215
- try {
216
- return SearchIndex.fromJSON(JSON.parse(await readFile(INDEX_SEARCH_FILE, 'utf-8')));
217
- }
218
- catch {
219
- // A corrupt index is a cache, not data: rebuild rather than fail.
220
- return new SearchIndex();
221
- }
175
+ // A corrupt index is a cache, not data: `fromJSON` rebuilds from what it can
176
+ // read rather than failing, and an unreadable file yields an empty index.
177
+ return SearchIndex.fromJSON(await readJsonFile(INDEX_SEARCH_FILE, z.unknown()));
222
178
  }
223
179
  async function persistSearchIndex(index) {
224
- await writeFile(INDEX_SEARCH_FILE, JSON.stringify(index.toJSON()), 'utf-8');
180
+ // Not pretty-printed: indentation is most of the bytes in an index nobody reads.
181
+ await writeJsonAtomic(INDEX_SEARCH_FILE, index.toJSON(), { pretty: false });
225
182
  }
226
183
  async function indexDocument(videoId, title, kind, text) {
227
184
  const index = await loadSearchIndex();
@@ -239,9 +196,9 @@ async function removeFromIndex(videoId, kind) {
239
196
  }
240
197
  await persistSearchIndex(index);
241
198
  }
242
- export async function searchLibrary(query, limit = 10) {
199
+ export async function searchLibrary(query, limit = 10, offset = 0) {
243
200
  const index = await loadSearchIndex();
244
- return index.search(query, limit);
201
+ return index.search(query, limit, offset);
245
202
  }
246
203
  /** Rebuild the index from what is actually on disk. */
247
204
  export async function rebuildSearchIndex() {
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"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"}
@@ -55,24 +55,24 @@ export declare const cachedTranscriptSchema: z.ZodObject<{
55
55
  end: number;
56
56
  }>, "many">;
57
57
  }, "strip", z.ZodTypeAny, {
58
+ videoId: string;
58
59
  version: number;
60
+ language: string;
59
61
  segments: {
60
62
  text: string;
61
63
  start: number;
62
64
  end: number;
63
65
  }[];
64
- videoId: string;
65
- language: string;
66
66
  fetchedAt: string;
67
67
  }, {
68
+ videoId: string;
68
69
  version: number;
70
+ language: string;
69
71
  segments: {
70
72
  text: string;
71
73
  start: number;
72
74
  end: number;
73
75
  }[];
74
- videoId: string;
75
- language: string;
76
76
  fetchedAt: string;
77
77
  }>;
78
78
  export type CachedTranscript = z.infer<typeof cachedTranscriptSchema>;
@@ -96,6 +96,7 @@ export declare function formatSrtTimestamp(totalSeconds: number): string;
96
96
  */
97
97
  export declare function parseVtt(vttContent: string): TranscriptSegment[];
98
98
  export declare function segmentsToText(segments: TranscriptSegment[]): string;
99
+ export declare function countWords(text: string): number;
99
100
  export declare function segmentsToTimestamped(segments: TranscriptSegment[]): string;
100
101
  /** A URL that opens the video at this moment. */
101
102
  export declare function deepLink(videoId: string, seconds: number): string;
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/utils/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;GAQG;AAEH,eAAO,MAAM,uBAAuB;IAClC,2CAA2C;;;;;;;;;;;;EAI3C,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnE,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB;;;;;;QAtBjC,2CAA2C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4B3C,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,wCAAwC;AACxC,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAS/D;AA0BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA4BhE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAMpE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAI3E;AAED,iDAAiD;AACjD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,iBAAiB,EAAE,CAOrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,eAAe,EAAE,CAiCnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAcxF;AAED,wBAAgB,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAY3D;AAED,wBAAgB,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAW3D"}
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/utils/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;GAQG;AAEH,eAAO,MAAM,uBAAuB;IAClC,2CAA2C;;;;;;;;;;;;EAI3C,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnE,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB;;;;;;QAtBjC,2CAA2C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4B3C,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,wCAAwC;AACxC,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAS/D;AA0BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA4BhE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAMpE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAI3E;AAED,iDAAiD;AACjD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,iBAAiB,EAAE,CAOrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,eAAe,EAAE,CAiCnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAcxF;AAED,wBAAgB,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAY3D;AAED,wBAAgB,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAW3D"}
@@ -123,6 +123,9 @@ export function segmentsToText(segments) {
123
123
  .replace(/\s+/g, ' ')
124
124
  .trim();
125
125
  }
126
+ export function countWords(text) {
127
+ return text.split(/\s+/).filter(Boolean).length;
128
+ }
126
129
  export function segmentsToTimestamped(segments) {
127
130
  return segments
128
131
  .map((segment) => `[${formatTimestamp(segment.start)}] ${segment.text}`)