@hraness/kb 0.17.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 (200) hide show
  1. package/DISCLOSURE +43 -0
  2. package/LICENSE +21 -0
  3. package/README.md +545 -0
  4. package/dist/agent-context.js +35 -0
  5. package/dist/agent-guide-audit.js +18 -0
  6. package/dist/attachments.js +19 -0
  7. package/dist/authoring.js +33 -0
  8. package/dist/benchmark.js +19 -0
  9. package/dist/capture.js +49 -0
  10. package/dist/cli.js +3646 -0
  11. package/dist/clip/acquire.js +57 -0
  12. package/dist/clip/args.js +21 -0
  13. package/dist/clip/bounded-byte-buffer.js +9 -0
  14. package/dist/clip/browser-profiles.js +17 -0
  15. package/dist/clip/bundle-reader.js +11 -0
  16. package/dist/clip/cli.js +27 -0
  17. package/dist/clip/cookies.js +21 -0
  18. package/dist/clip/defuddle-worker.js +84 -0
  19. package/dist/clip/doctor.js +32 -0
  20. package/dist/clip/jobs.js +784 -0
  21. package/dist/clip/network-proxy.js +9 -0
  22. package/dist/clip/network.js +28 -0
  23. package/dist/clip/persist.js +30 -0
  24. package/dist/clip/refresh.js +11 -0
  25. package/dist/clip/terminal.js +11 -0
  26. package/dist/evaluation-builder.js +12238 -0
  27. package/dist/evaluation-kb.js +26 -0
  28. package/dist/evaluation.js +35 -0
  29. package/dist/git.js +39 -0
  30. package/dist/graph.js +39 -0
  31. package/dist/index-01jj6rbv.js +1103 -0
  32. package/dist/index-06c9ctr6.js +738 -0
  33. package/dist/index-0kavxzqj.js +2480 -0
  34. package/dist/index-1gwbassd.js +743 -0
  35. package/dist/index-1n418kb9.js +827 -0
  36. package/dist/index-1vrd1rmn.js +56 -0
  37. package/dist/index-1xxnjn0d.js +171 -0
  38. package/dist/index-3rm7cz6h.js +373 -0
  39. package/dist/index-3v2z4f0q.js +328 -0
  40. package/dist/index-48pz4jpc.js +392 -0
  41. package/dist/index-4j3tt0c3.js +234 -0
  42. package/dist/index-5n05se68.js +307 -0
  43. package/dist/index-5vwpzb5a.js +764 -0
  44. package/dist/index-6g2pv9d2.js +370 -0
  45. package/dist/index-7fzc32gf.js +712 -0
  46. package/dist/index-84x0vjjp.js +432 -0
  47. package/dist/index-adx6khj5.js +488 -0
  48. package/dist/index-b88v3vtm.js +805 -0
  49. package/dist/index-cv6fh7z5.js +462 -0
  50. package/dist/index-cxfrakt7.js +1067 -0
  51. package/dist/index-d13v9ckt.js +150 -0
  52. package/dist/index-dycjbhw2.js +1943 -0
  53. package/dist/index-dyqwejk5.js +531 -0
  54. package/dist/index-e5fbsywq.js +658 -0
  55. package/dist/index-f984hw45.js +927 -0
  56. package/dist/index-gh719d91.js +63 -0
  57. package/dist/index-hgve9rh2.js +2046 -0
  58. package/dist/index-hya40gb2.js +474 -0
  59. package/dist/index-j4zgmzjr.js +152 -0
  60. package/dist/index-jsmvyyvf.js +1166 -0
  61. package/dist/index-kh0pwvdd.js +1974 -0
  62. package/dist/index-mqx4nd6v.js +119 -0
  63. package/dist/index-mxxxytys.js +1254 -0
  64. package/dist/index-n5dd7r0v.js +711 -0
  65. package/dist/index-npg9z1a4.js +431 -0
  66. package/dist/index-pj501bh1.js +140 -0
  67. package/dist/index-qry4vhxk.js +1041 -0
  68. package/dist/index-s2gw5aw9.js +199 -0
  69. package/dist/index-vvdj6kca.js +70 -0
  70. package/dist/index-w2zc0vwa.js +571 -0
  71. package/dist/index-x3fthpsc.js +585 -0
  72. package/dist/index-zr53sf63.js +44 -0
  73. package/dist/index-zxdy5pby.js +2728 -0
  74. package/dist/index-zzhgcwyt.js +966 -0
  75. package/dist/index.js +453 -0
  76. package/dist/navigation.js +13 -0
  77. package/dist/pdf.js +85 -0
  78. package/dist/percolate.js +24 -0
  79. package/dist/portfolio.js +77 -0
  80. package/dist/query.js +29 -0
  81. package/dist/repository-memory.js +60 -0
  82. package/dist/sdk.js +36 -0
  83. package/dist/search-rules.js +34 -0
  84. package/dist/search.js +22 -0
  85. package/dist/semantic.js +39 -0
  86. package/dist/source-inbox.js +17 -0
  87. package/dist/untrusted-content.js +32 -0
  88. package/dist/url-intelligence.js +74 -0
  89. package/dist/workflow.js +23 -0
  90. package/dist/workflows/decision-context.js +20 -0
  91. package/dist/workflows/explain-change.js +8 -0
  92. package/dist/workflows/index.js +28 -0
  93. package/dist/workflows/plan-radar.js +10 -0
  94. package/package.json +409 -0
  95. package/skills/kb/AGENTS.md +19 -0
  96. package/skills/kb/SKILL.md +82 -0
  97. package/skills/kb/agents/openai.yaml +4 -0
  98. package/skills/kb/references/pdf-review.md +51 -0
  99. package/skills/kb/references/percolate.md +144 -0
  100. package/skills/kb/references/plan-structure.md +105 -0
  101. package/skills/kb/references/plan.md +115 -0
  102. package/skills/kb/references/query.md +231 -0
  103. package/skills/kb/references/refresh.md +133 -0
  104. package/skills/kb/references/save-pdf.md +125 -0
  105. package/skills/kb/references/save-url.md +178 -0
  106. package/skills/kb/references/url-authentication.md +75 -0
  107. package/skills/kb/references/url-platforms.md +25 -0
  108. package/src/agent-context.ts +1241 -0
  109. package/src/agent-guide-audit.ts +750 -0
  110. package/src/attachments.ts +723 -0
  111. package/src/authoring.ts +1725 -0
  112. package/src/benchmark.ts +362 -0
  113. package/src/capture.ts +68 -0
  114. package/src/cli.ts +3660 -0
  115. package/src/clip/acquire.ts +1273 -0
  116. package/src/clip/archive-today.ts +402 -0
  117. package/src/clip/args.ts +423 -0
  118. package/src/clip/assets.ts +262 -0
  119. package/src/clip/bounded-byte-buffer.ts +75 -0
  120. package/src/clip/browser-profiles.ts +372 -0
  121. package/src/clip/bundle-reader.ts +608 -0
  122. package/src/clip/capture.ts +1054 -0
  123. package/src/clip/cli.ts +181 -0
  124. package/src/clip/cookies.ts +512 -0
  125. package/src/clip/doctor.ts +1110 -0
  126. package/src/clip/extract.ts +868 -0
  127. package/src/clip/jobs.ts +959 -0
  128. package/src/clip/lib.ts +861 -0
  129. package/src/clip/media.ts +1474 -0
  130. package/src/clip/metadata-search-tool/Cargo.lock +2498 -0
  131. package/src/clip/metadata-search-tool/Cargo.toml +18 -0
  132. package/src/clip/metadata-search-tool/runner.ts +685 -0
  133. package/src/clip/metadata-search-tool/src/main.rs +389 -0
  134. package/src/clip/metadata-search.ts +687 -0
  135. package/src/clip/network-proxy.ts +627 -0
  136. package/src/clip/network.ts +950 -0
  137. package/src/clip/package-root.ts +54 -0
  138. package/src/clip/persist.ts +1472 -0
  139. package/src/clip/platforms.ts +1824 -0
  140. package/src/clip/refresh.ts +197 -0
  141. package/src/clip/structured.ts +432 -0
  142. package/src/clip/terminal.ts +197 -0
  143. package/src/clip/url-intelligence.ts +581 -0
  144. package/src/clip/url-metadata-backfill.ts +616 -0
  145. package/src/clip/url-metadata-cli.ts +251 -0
  146. package/src/clip/url-metadata.ts +1397 -0
  147. package/src/evaluation-analysis-v2.ts +1440 -0
  148. package/src/evaluation-builder.ts +2539 -0
  149. package/src/evaluation-corpus-authoring.ts +2052 -0
  150. package/src/evaluation-evidence.ts +1147 -0
  151. package/src/evaluation-execution-v2.ts +426 -0
  152. package/src/evaluation-implementation.ts +131 -0
  153. package/src/evaluation-kb-closure.ts +1430 -0
  154. package/src/evaluation-kb-runner-v2.ts +735 -0
  155. package/src/evaluation-kb-v2.ts +2567 -0
  156. package/src/evaluation-kb.ts +1018 -0
  157. package/src/evaluation-measurement-v2.ts +1462 -0
  158. package/src/evaluation-packing-v2.ts +452 -0
  159. package/src/evaluation-redaction.ts +28 -0
  160. package/src/evaluation-v2.ts +3857 -0
  161. package/src/evaluation.ts +1220 -0
  162. package/src/git.ts +1276 -0
  163. package/src/graph.ts +1487 -0
  164. package/src/index.ts +20 -0
  165. package/src/init.ts +123 -0
  166. package/src/navigation.ts +277 -0
  167. package/src/note-lock.ts +529 -0
  168. package/src/pdf/args.ts +202 -0
  169. package/src/pdf/capture.ts +298 -0
  170. package/src/pdf/cli.ts +159 -0
  171. package/src/pdf/extract.ts +303 -0
  172. package/src/pdf/layout.ts +618 -0
  173. package/src/pdf/markdown.ts +154 -0
  174. package/src/pdf/model.ts +234 -0
  175. package/src/pdf/ocr.ts +190 -0
  176. package/src/pdf/persist.ts +314 -0
  177. package/src/pdf/source.ts +135 -0
  178. package/src/pdf/tools.ts +146 -0
  179. package/src/pdf.ts +92 -0
  180. package/src/percolate.ts +877 -0
  181. package/src/portfolio-audit.ts +574 -0
  182. package/src/portfolio-identity.ts +162 -0
  183. package/src/portfolio-registry.ts +473 -0
  184. package/src/portfolio.ts +765 -0
  185. package/src/query.ts +646 -0
  186. package/src/repository-memory.ts +1150 -0
  187. package/src/sdk.ts +1452 -0
  188. package/src/search-rules.ts +712 -0
  189. package/src/search.ts +710 -0
  190. package/src/semantic-runtime.ts +1139 -0
  191. package/src/semantic.ts +2480 -0
  192. package/src/source-inbox.ts +232 -0
  193. package/src/untrusted-content.ts +401 -0
  194. package/src/url-intelligence.ts +104 -0
  195. package/src/vault.ts +636 -0
  196. package/src/workflow.ts +653 -0
  197. package/src/workflows/decision-context.ts +81 -0
  198. package/src/workflows/explain-change.ts +73 -0
  199. package/src/workflows/index.ts +3 -0
  200. package/src/workflows/plan-radar.ts +101 -0
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env bun
2
+ import { resolve } from "node:path";
3
+
4
+ import { createRustMetadataSearchProvider, type SearchProvider } from "./metadata-search.js";
5
+ import {
6
+ backfillSavedUrlMetadata,
7
+ type UrlMetadataBackfillReport,
8
+ } from "./url-metadata-backfill.js";
9
+ import { findKbPackageRoot } from "./package-root.js";
10
+ import {
11
+ runMetadataSearchTool,
12
+ type MetadataSearchToolAction,
13
+ } from "./metadata-search-tool/runner.js";
14
+ import { sanitizeTerminalText } from "./terminal.js";
15
+
16
+ export const urlMetadataUsage = `kb url-metadata — backfill bounded metadata for saved URLs
17
+
18
+ Usage:
19
+ kb url-metadata tool <build|check>
20
+ kb url-metadata backfill [--root <vault>] [--search-binary <path>] [--refresh]
21
+ [--archive | --no-archive] [--delay-ms <milliseconds>]
22
+ [--max-results <count>] [--timeout <milliseconds>] [--json]
23
+
24
+ Build or validate the immutable metadata-search-engine-rs helper directly from
25
+ an installed @hraness/kb package:
26
+ kb url-metadata tool build
27
+ `;
28
+
29
+ type Output = {
30
+ readonly stdout: (value: string) => void;
31
+ readonly stderr: (value: string) => void;
32
+ };
33
+
34
+ const defaultOutput: Output = {
35
+ stdout: (value) => process.stdout.write(value),
36
+ stderr: (value) => process.stderr.write(value),
37
+ };
38
+
39
+ type ParsedUrlMetadataArguments =
40
+ | { readonly kind: "help" }
41
+ | { readonly kind: "tool"; readonly action: MetadataSearchToolAction }
42
+ | {
43
+ readonly kind: "backfill";
44
+ readonly root: string;
45
+ readonly binaryPath: string;
46
+ readonly refresh: boolean;
47
+ readonly discoverArchives: boolean;
48
+ readonly delayMs: number;
49
+ readonly maxResults: number;
50
+ readonly timeoutMs: number;
51
+ readonly json: boolean;
52
+ };
53
+
54
+ type ParseResult =
55
+ | { readonly ok: true; readonly value: ParsedUrlMetadataArguments }
56
+ | { readonly ok: false; readonly message: string; readonly json: boolean };
57
+
58
+ export type UrlMetadataCliDependencies = {
59
+ readonly createSearchProvider?: (binaryPath: string) => SearchProvider;
60
+ readonly backfill?: typeof backfillSavedUrlMetadata;
61
+ readonly runTool?: typeof runMetadataSearchTool;
62
+ };
63
+
64
+ function integer(value: string, minimum: number, maximum: number): number | null {
65
+ if (!/^(?:0|[1-9]\d*)$/u.test(value)) return null;
66
+ const parsed = Number(value);
67
+ return Number.isSafeInteger(parsed) && parsed >= minimum && parsed <= maximum
68
+ ? parsed
69
+ : null;
70
+ }
71
+
72
+ export function metadataSearchBinaryPath(
73
+ packageRoot = findKbPackageRoot(),
74
+ platform = process.platform,
75
+ ): string {
76
+ const executable = platform === "win32" ? "kb-url-metadata-search.exe" : "kb-url-metadata-search";
77
+ return resolve(packageRoot, "src", "clip", "metadata-search-tool", "target", "release", executable);
78
+ }
79
+
80
+ function defaultBinaryPath(environment: Readonly<Record<string, string | undefined>>): string {
81
+ const configured = environment.HRANESS_KB_METADATA_SEARCH_BINARY;
82
+ if (configured !== undefined && configured.trim() !== "") return resolve(configured);
83
+ return metadataSearchBinaryPath();
84
+ }
85
+
86
+ export function parseUrlMetadataArguments(
87
+ arguments_: readonly string[],
88
+ environment: Readonly<Record<string, string | undefined>> = process.env,
89
+ ): ParseResult {
90
+ const command = arguments_[0];
91
+ const jsonRequested = arguments_.includes("--json");
92
+ if (command === undefined || command === "help" || command === "--help" || command === "-h") {
93
+ return { ok: true, value: { kind: "help" } };
94
+ }
95
+ if (command === "tool") {
96
+ const action = arguments_[1];
97
+ if (
98
+ arguments_.length !== 2
99
+ || (action !== "build" && action !== "check")
100
+ ) {
101
+ return {
102
+ ok: false,
103
+ message: "url-metadata tool accepts exactly one build or check action",
104
+ json: jsonRequested,
105
+ };
106
+ }
107
+ return { ok: true, value: { kind: "tool", action } };
108
+ }
109
+ if (command !== "backfill") {
110
+ return {
111
+ ok: false,
112
+ message: "url-metadata accepts only the tool or backfill subcommand",
113
+ json: jsonRequested,
114
+ };
115
+ }
116
+
117
+ let root = "kb";
118
+ let binaryPath = defaultBinaryPath(environment);
119
+ let refresh = false;
120
+ let discoverArchives = true;
121
+ let delayMs = 1_000;
122
+ let maxResults = 20;
123
+ let timeoutMs = 15_000;
124
+ let json = false;
125
+ for (let index = 1; index < arguments_.length; index += 1) {
126
+ const argument = arguments_[index];
127
+ if (argument === "--refresh") refresh = true;
128
+ else if (argument === "--archive") discoverArchives = true;
129
+ else if (argument === "--no-archive") discoverArchives = false;
130
+ else if (argument === "--json") json = true;
131
+ else if (
132
+ argument === "--root"
133
+ || argument === "--search-binary"
134
+ || argument === "--delay-ms"
135
+ || argument === "--max-results"
136
+ || argument === "--timeout"
137
+ ) {
138
+ const value = arguments_[index + 1];
139
+ if (value === undefined || value.startsWith("--")) {
140
+ return { ok: false, message: `${argument} requires a value`, json: jsonRequested };
141
+ }
142
+ index += 1;
143
+ if (argument === "--root") root = value;
144
+ else if (argument === "--search-binary") binaryPath = resolve(value);
145
+ else if (argument === "--delay-ms") {
146
+ const parsed = integer(value, 0, 60_000);
147
+ if (parsed === null) return { ok: false, message: "--delay-ms must be an integer from 0 through 60000", json: jsonRequested };
148
+ delayMs = parsed;
149
+ } else if (argument === "--max-results") {
150
+ const parsed = integer(value, 1, 20);
151
+ if (parsed === null) return { ok: false, message: "--max-results must be an integer from 1 through 20", json: jsonRequested };
152
+ maxResults = parsed;
153
+ } else {
154
+ const parsed = integer(value, 500, 15_000);
155
+ if (parsed === null) return { ok: false, message: "--timeout must be an integer from 500 through 15000", json: jsonRequested };
156
+ timeoutMs = parsed;
157
+ }
158
+ } else {
159
+ return { ok: false, message: `unknown url-metadata option: ${argument ?? ""}`, json: jsonRequested };
160
+ }
161
+ }
162
+ if (root.trim() === "") return { ok: false, message: "--root must not be empty", json: jsonRequested };
163
+ return {
164
+ ok: true,
165
+ value: {
166
+ kind: "backfill",
167
+ root,
168
+ binaryPath,
169
+ refresh,
170
+ discoverArchives,
171
+ delayMs,
172
+ maxResults,
173
+ timeoutMs,
174
+ json,
175
+ },
176
+ };
177
+ }
178
+
179
+ function terminalJson(value: unknown): string {
180
+ return `${JSON.stringify(
181
+ value,
182
+ (_key, candidate: unknown) => typeof candidate === "string" ? sanitizeTerminalText(candidate) : candidate,
183
+ 2,
184
+ )}\n`;
185
+ }
186
+
187
+ function renderReport(report: UrlMetadataBackfillReport): string {
188
+ const counts = report.statusCounts;
189
+ return [
190
+ `URL metadata: ${report.processedRecords} processed, ${report.skippedRecords} resumed, ${report.remainingRecords} remaining.`,
191
+ `Writes: ${report.writtenRecords} new or refreshed, ${report.unchangedRecords} unchanged.`,
192
+ `Status: ${counts.matched} matched, ${counts.partial} partial, ${counts.notFound} not found, ${counts.unavailable} unavailable.`,
193
+ ].join("\n") + "\n";
194
+ }
195
+
196
+ /** Dedicated entry point, delegated by the main `kb` CLI. */
197
+ export async function main(
198
+ rawArguments: readonly string[] = process.argv.slice(2),
199
+ environment: Readonly<Record<string, string | undefined>> = process.env,
200
+ output: Output = defaultOutput,
201
+ dependencies: UrlMetadataCliDependencies = {},
202
+ ): Promise<number> {
203
+ const parsed = parseUrlMetadataArguments(rawArguments, environment);
204
+ if (!parsed.ok) {
205
+ if (parsed.json) output.stdout(terminalJson({ ok: false, error: parsed.message }));
206
+ else output.stderr(`error: ${sanitizeTerminalText(parsed.message)}\n\n${urlMetadataUsage}`);
207
+ return 2;
208
+ }
209
+ if (parsed.value.kind === "help") {
210
+ output.stdout(urlMetadataUsage);
211
+ return 0;
212
+ }
213
+ try {
214
+ if (parsed.value.kind === "tool") {
215
+ return (dependencies.runTool ?? runMetadataSearchTool)(
216
+ parsed.value.action,
217
+ {
218
+ toolDirectory: resolve(
219
+ findKbPackageRoot(),
220
+ "src",
221
+ "clip",
222
+ "metadata-search-tool",
223
+ ),
224
+ },
225
+ );
226
+ }
227
+ const provider = (dependencies.createSearchProvider ?? ((binaryPath) =>
228
+ createRustMetadataSearchProvider({ binaryPath })))(parsed.value.binaryPath);
229
+ const report = await (dependencies.backfill ?? backfillSavedUrlMetadata)({
230
+ vaultRoot: parsed.value.root,
231
+ refresh: parsed.value.refresh,
232
+ discoverArchives: parsed.value.discoverArchives,
233
+ interRequestDelayMs: parsed.value.delayMs,
234
+ maxResults: parsed.value.maxResults,
235
+ searchTimeoutMs: parsed.value.timeoutMs,
236
+ }, { searchProvider: provider });
237
+ if (parsed.value.json) output.stdout(terminalJson({ ok: !report.aborted, ...report }));
238
+ else output.stdout(renderReport(report));
239
+ if (report.aborted) return 130;
240
+ return report.statusCounts.unavailable > 0 ? 3 : 0;
241
+ } catch (error) {
242
+ const message = error instanceof Error ? error.message : String(error);
243
+ if (parsed.value.kind === "backfill" && parsed.value.json) {
244
+ output.stdout(terminalJson({ ok: false, error: message }));
245
+ }
246
+ else output.stderr(`error: ${sanitizeTerminalText(message)}\n`);
247
+ return 1;
248
+ }
249
+ }
250
+
251
+ if (import.meta.main) process.exitCode = await main();