@superbee/core 0.2.0-pre.16 → 0.2.0-pre.19

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 (278) hide show
  1. package/README.md +622 -5
  2. package/dist/blob-journal.d.ts +187 -2
  3. package/dist/blob-journal.d.ts.map +1 -1
  4. package/dist/blob-journal.js +377 -5
  5. package/dist/blob-journal.js.map +1 -1
  6. package/dist/body-replace-guards.d.ts +50 -0
  7. package/dist/body-replace-guards.d.ts.map +1 -0
  8. package/dist/body-replace-guards.js +158 -0
  9. package/dist/body-replace-guards.js.map +1 -0
  10. package/dist/builtin-recipes/content.d.ts +93 -0
  11. package/dist/builtin-recipes/content.d.ts.map +1 -0
  12. package/dist/builtin-recipes/content.js +288 -0
  13. package/dist/builtin-recipes/content.js.map +1 -0
  14. package/dist/builtin-recipes.d.ts +10 -0
  15. package/dist/builtin-recipes.d.ts.map +1 -0
  16. package/dist/builtin-recipes.js +97 -0
  17. package/dist/builtin-recipes.js.map +1 -0
  18. package/dist/bundle-health/index.d.ts +14 -0
  19. package/dist/bundle-health/index.d.ts.map +1 -0
  20. package/dist/bundle-health/index.js +12 -0
  21. package/dist/bundle-health/index.js.map +1 -0
  22. package/dist/bundle-health/kind-findings.d.ts +44 -0
  23. package/dist/bundle-health/kind-findings.d.ts.map +1 -0
  24. package/dist/bundle-health/kind-findings.js +68 -0
  25. package/dist/bundle-health/kind-findings.js.map +1 -0
  26. package/dist/bundle-health/legacy-page.d.ts +39 -0
  27. package/dist/bundle-health/legacy-page.d.ts.map +1 -0
  28. package/dist/bundle-health/legacy-page.js +50 -0
  29. package/dist/bundle-health/legacy-page.js.map +1 -0
  30. package/dist/bundle-health/report.d.ts +202 -0
  31. package/dist/bundle-health/report.d.ts.map +1 -0
  32. package/dist/bundle-health/report.js +438 -0
  33. package/dist/bundle-health/report.js.map +1 -0
  34. package/dist/code-point-order.d.ts +8 -0
  35. package/dist/code-point-order.d.ts.map +1 -0
  36. package/dist/code-point-order.js +20 -0
  37. package/dist/code-point-order.js.map +1 -0
  38. package/dist/connectors.d.ts +223 -0
  39. package/dist/connectors.d.ts.map +1 -0
  40. package/dist/connectors.js +1143 -0
  41. package/dist/connectors.js.map +1 -0
  42. package/dist/document-field-actions.d.ts +18 -0
  43. package/dist/document-field-actions.d.ts.map +1 -1
  44. package/dist/document-field-actions.js +91 -29
  45. package/dist/document-field-actions.js.map +1 -1
  46. package/dist/document-mutation.d.ts +7 -9
  47. package/dist/document-mutation.d.ts.map +1 -1
  48. package/dist/document-mutation.js +16 -16
  49. package/dist/document-mutation.js.map +1 -1
  50. package/dist/file-journaled-backend.d.ts +31 -5
  51. package/dist/file-journaled-backend.d.ts.map +1 -1
  52. package/dist/file-journaled-backend.js +131 -118
  53. package/dist/file-journaled-backend.js.map +1 -1
  54. package/dist/hosted-client/blob-delivery.d.ts +6 -0
  55. package/dist/hosted-client/blob-delivery.d.ts.map +1 -1
  56. package/dist/hosted-client/blob-delivery.js +23 -1
  57. package/dist/hosted-client/blob-delivery.js.map +1 -1
  58. package/dist/hosted-client/blob-write.d.ts +386 -0
  59. package/dist/hosted-client/blob-write.d.ts.map +1 -0
  60. package/dist/hosted-client/blob-write.js +770 -0
  61. package/dist/hosted-client/blob-write.js.map +1 -0
  62. package/dist/hosted-client/client.d.ts +64 -0
  63. package/dist/hosted-client/client.d.ts.map +1 -1
  64. package/dist/hosted-client/client.js +31 -0
  65. package/dist/hosted-client/client.js.map +1 -1
  66. package/dist/hosted-client/directory.d.ts +46 -0
  67. package/dist/hosted-client/directory.d.ts.map +1 -0
  68. package/dist/hosted-client/directory.js +74 -0
  69. package/dist/hosted-client/directory.js.map +1 -0
  70. package/dist/hosted-client/errors.d.ts +10 -0
  71. package/dist/hosted-client/errors.d.ts.map +1 -1
  72. package/dist/hosted-client/errors.js +13 -0
  73. package/dist/hosted-client/errors.js.map +1 -1
  74. package/dist/hosted-client/inbox.d.ts +320 -0
  75. package/dist/hosted-client/inbox.d.ts.map +1 -0
  76. package/dist/hosted-client/inbox.js +379 -0
  77. package/dist/hosted-client/inbox.js.map +1 -0
  78. package/dist/hosted-client/index.d.ts +11 -4
  79. package/dist/hosted-client/index.d.ts.map +1 -1
  80. package/dist/hosted-client/index.js +11 -4
  81. package/dist/hosted-client/index.js.map +1 -1
  82. package/dist/hosted-client/journal.d.ts +103 -0
  83. package/dist/hosted-client/journal.d.ts.map +1 -0
  84. package/dist/hosted-client/journal.js +464 -0
  85. package/dist/hosted-client/journal.js.map +1 -0
  86. package/dist/hosted-client/node.d.ts +5 -1
  87. package/dist/hosted-client/node.d.ts.map +1 -1
  88. package/dist/hosted-client/node.js +6 -1
  89. package/dist/hosted-client/node.js.map +1 -1
  90. package/dist/hosted-client/write.d.ts +28 -2
  91. package/dist/hosted-client/write.d.ts.map +1 -1
  92. package/dist/hosted-client/write.js +33 -11
  93. package/dist/hosted-client/write.js.map +1 -1
  94. package/dist/hosted-transport/answer-rows.d.ts +3 -2
  95. package/dist/hosted-transport/answer-rows.d.ts.map +1 -1
  96. package/dist/hosted-transport/answer-rows.js +1 -1
  97. package/dist/hosted-transport/answer-rows.js.map +1 -1
  98. package/dist/hosted-transport/carrier.d.ts +10 -0
  99. package/dist/hosted-transport/carrier.d.ts.map +1 -1
  100. package/dist/hosted-transport/carrier.js +22 -2
  101. package/dist/hosted-transport/carrier.js.map +1 -1
  102. package/dist/hosted-transport/whole-document-transport.d.ts +1 -1
  103. package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -1
  104. package/dist/hosted-transport/whole-document-transport.js +20 -12
  105. package/dist/hosted-transport/whole-document-transport.js.map +1 -1
  106. package/dist/index.d.ts +6 -2
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +4 -2
  109. package/dist/index.js.map +1 -1
  110. package/dist/kind-authoring.d.ts +170 -0
  111. package/dist/kind-authoring.d.ts.map +1 -0
  112. package/dist/kind-authoring.js +451 -0
  113. package/dist/kind-authoring.js.map +1 -0
  114. package/dist/kind-conformance-error.d.ts +15 -0
  115. package/dist/kind-conformance-error.d.ts.map +1 -0
  116. package/dist/kind-conformance-error.js +20 -0
  117. package/dist/kind-conformance-error.js.map +1 -0
  118. package/dist/kinds-load.js +4 -4
  119. package/dist/kinds-load.js.map +1 -1
  120. package/dist/kinds.d.ts +2 -0
  121. package/dist/kinds.d.ts.map +1 -1
  122. package/dist/kinds.js +10 -2
  123. package/dist/kinds.js.map +1 -1
  124. package/dist/paths.d.ts +16 -0
  125. package/dist/paths.d.ts.map +1 -1
  126. package/dist/paths.js +25 -0
  127. package/dist/paths.js.map +1 -1
  128. package/dist/query-filter.d.ts +9 -0
  129. package/dist/query-filter.d.ts.map +1 -1
  130. package/dist/query-filter.js +19 -3
  131. package/dist/query-filter.js.map +1 -1
  132. package/dist/recipe-lifecycle/stamp.d.ts +11 -0
  133. package/dist/recipe-lifecycle/stamp.d.ts.map +1 -1
  134. package/dist/recipe-lifecycle/stamp.js +6 -0
  135. package/dist/recipe-lifecycle/stamp.js.map +1 -1
  136. package/dist/record-overlay/apply.d.ts +43 -0
  137. package/dist/record-overlay/apply.d.ts.map +1 -0
  138. package/dist/record-overlay/apply.js +527 -0
  139. package/dist/record-overlay/apply.js.map +1 -0
  140. package/dist/record-overlay/canonical.d.ts +22 -0
  141. package/dist/record-overlay/canonical.d.ts.map +1 -0
  142. package/dist/record-overlay/canonical.js +47 -0
  143. package/dist/record-overlay/canonical.js.map +1 -0
  144. package/dist/record-overlay/digest.d.ts +4 -0
  145. package/dist/record-overlay/digest.d.ts.map +1 -0
  146. package/dist/record-overlay/digest.js +11 -0
  147. package/dist/record-overlay/digest.js.map +1 -0
  148. package/dist/record-overlay/errors.d.ts +44 -0
  149. package/dist/record-overlay/errors.d.ts.map +1 -0
  150. package/dist/record-overlay/errors.js +55 -0
  151. package/dist/record-overlay/errors.js.map +1 -0
  152. package/dist/record-overlay/findings.d.ts +5 -0
  153. package/dist/record-overlay/findings.d.ts.map +1 -0
  154. package/dist/record-overlay/findings.js +83 -0
  155. package/dist/record-overlay/findings.js.map +1 -0
  156. package/dist/record-overlay/index.d.ts +23 -0
  157. package/dist/record-overlay/index.d.ts.map +1 -0
  158. package/dist/record-overlay/index.js +21 -0
  159. package/dist/record-overlay/index.js.map +1 -0
  160. package/dist/record-overlay/plan.d.ts +12 -0
  161. package/dist/record-overlay/plan.d.ts.map +1 -0
  162. package/dist/record-overlay/plan.js +285 -0
  163. package/dist/record-overlay/plan.js.map +1 -0
  164. package/dist/record-overlay/policy.d.ts +69 -0
  165. package/dist/record-overlay/policy.d.ts.map +1 -0
  166. package/dist/record-overlay/policy.js +228 -0
  167. package/dist/record-overlay/policy.js.map +1 -0
  168. package/dist/record-overlay/redact.d.ts +3 -0
  169. package/dist/record-overlay/redact.d.ts.map +1 -0
  170. package/dist/record-overlay/redact.js +27 -0
  171. package/dist/record-overlay/redact.js.map +1 -0
  172. package/dist/record-overlay/signal-kind.d.ts +30 -0
  173. package/dist/record-overlay/signal-kind.d.ts.map +1 -0
  174. package/dist/record-overlay/signal-kind.js +38 -0
  175. package/dist/record-overlay/signal-kind.js.map +1 -0
  176. package/dist/record-overlay/signal-text.d.ts +45 -0
  177. package/dist/record-overlay/signal-text.d.ts.map +1 -0
  178. package/dist/record-overlay/signal-text.js +116 -0
  179. package/dist/record-overlay/signal-text.js.map +1 -0
  180. package/dist/record-overlay/source-index.d.ts +19 -0
  181. package/dist/record-overlay/source-index.d.ts.map +1 -0
  182. package/dist/record-overlay/source-index.js +102 -0
  183. package/dist/record-overlay/source-index.js.map +1 -0
  184. package/dist/record-overlay/types.d.ts +291 -0
  185. package/dist/record-overlay/types.d.ts.map +1 -0
  186. package/dist/record-overlay/types.js +2 -0
  187. package/dist/record-overlay/types.js.map +1 -0
  188. package/dist/remote-operations.js +5 -2
  189. package/dist/remote-operations.js.map +1 -1
  190. package/dist/search/contract.d.ts +151 -0
  191. package/dist/search/contract.d.ts.map +1 -0
  192. package/dist/search/contract.js +78 -0
  193. package/dist/search/contract.js.map +1 -0
  194. package/dist/search/errors.d.ts +30 -0
  195. package/dist/search/errors.d.ts.map +1 -0
  196. package/dist/search/errors.js +50 -0
  197. package/dist/search/errors.js.map +1 -0
  198. package/dist/search/identity.d.ts +12 -0
  199. package/dist/search/identity.d.ts.map +1 -0
  200. package/dist/search/identity.js +90 -0
  201. package/dist/search/identity.js.map +1 -0
  202. package/dist/search/index.d.ts +15 -0
  203. package/dist/search/index.d.ts.map +1 -0
  204. package/dist/search/index.js +14 -0
  205. package/dist/search/index.js.map +1 -0
  206. package/dist/search/memory-source.d.ts +25 -0
  207. package/dist/search/memory-source.d.ts.map +1 -0
  208. package/dist/search/memory-source.js +230 -0
  209. package/dist/search/memory-source.js.map +1 -0
  210. package/dist/search/rank.d.ts +34 -0
  211. package/dist/search/rank.d.ts.map +1 -0
  212. package/dist/search/rank.js +129 -0
  213. package/dist/search/rank.js.map +1 -0
  214. package/dist/search/row-text.d.ts +38 -0
  215. package/dist/search/row-text.d.ts.map +1 -0
  216. package/dist/search/row-text.js +88 -0
  217. package/dist/search/row-text.js.map +1 -0
  218. package/dist/search/search.d.ts +28 -0
  219. package/dist/search/search.d.ts.map +1 -0
  220. package/dist/search/search.js +240 -0
  221. package/dist/search/search.js.map +1 -0
  222. package/dist/search/source.d.ts +67 -0
  223. package/dist/search/source.d.ts.map +1 -0
  224. package/dist/search/source.js +2 -0
  225. package/dist/search/source.js.map +1 -0
  226. package/dist/search/text.d.ts +47 -0
  227. package/dist/search/text.d.ts.map +1 -0
  228. package/dist/search/text.js +148 -0
  229. package/dist/search/text.js.map +1 -0
  230. package/dist/source-engine/guard.d.ts +82 -0
  231. package/dist/source-engine/guard.d.ts.map +1 -0
  232. package/dist/source-engine/guard.js +396 -0
  233. package/dist/source-engine/guard.js.map +1 -0
  234. package/dist/source-engine/index.d.ts +24 -0
  235. package/dist/source-engine/index.d.ts.map +1 -0
  236. package/dist/source-engine/index.js +20 -0
  237. package/dist/source-engine/index.js.map +1 -0
  238. package/dist/source-engine/machine-state.d.ts +74 -0
  239. package/dist/source-engine/machine-state.d.ts.map +1 -0
  240. package/dist/source-engine/machine-state.js +48 -0
  241. package/dist/source-engine/machine-state.js.map +1 -0
  242. package/dist/source-engine/observe.d.ts +18 -0
  243. package/dist/source-engine/observe.d.ts.map +1 -0
  244. package/dist/source-engine/observe.js +598 -0
  245. package/dist/source-engine/observe.js.map +1 -0
  246. package/dist/source-engine/robots.d.ts +53 -0
  247. package/dist/source-engine/robots.d.ts.map +1 -0
  248. package/dist/source-engine/robots.js +158 -0
  249. package/dist/source-engine/robots.js.map +1 -0
  250. package/dist/source-engine/types.d.ts +285 -0
  251. package/dist/source-engine/types.d.ts.map +1 -0
  252. package/dist/source-engine/types.js +2 -0
  253. package/dist/source-engine/types.js.map +1 -0
  254. package/dist/source-harness/conformance.d.ts +16 -0
  255. package/dist/source-harness/conformance.d.ts.map +1 -0
  256. package/dist/source-harness/conformance.js +265 -0
  257. package/dist/source-harness/conformance.js.map +1 -0
  258. package/dist/source-harness/fixture.d.ts +95 -0
  259. package/dist/source-harness/fixture.d.ts.map +1 -0
  260. package/dist/source-harness/fixture.js +261 -0
  261. package/dist/source-harness/fixture.js.map +1 -0
  262. package/dist/source-harness/index.d.ts +22 -0
  263. package/dist/source-harness/index.d.ts.map +1 -0
  264. package/dist/source-harness/index.js +19 -0
  265. package/dist/source-harness/index.js.map +1 -0
  266. package/dist/source-harness/peer.d.ts +74 -0
  267. package/dist/source-harness/peer.d.ts.map +1 -0
  268. package/dist/source-harness/peer.js +106 -0
  269. package/dist/source-harness/peer.js.map +1 -0
  270. package/dist/storage.d.ts +2 -1
  271. package/dist/storage.d.ts.map +1 -1
  272. package/dist/storage.js +1 -1
  273. package/dist/storage.js.map +1 -1
  274. package/dist/uncertain-write.d.ts +39 -6
  275. package/dist/uncertain-write.d.ts.map +1 -1
  276. package/dist/uncertain-write.js +25 -3
  277. package/dist/uncertain-write.js.map +1 -1
  278. package/package.json +33 -1
@@ -0,0 +1,291 @@
1
+ /** Types of `@superbee/core/record-overlay`. Step and result rows keep the record-bridge keys. */
2
+ import type { DocumentMutationCandidate } from "../document-mutation.js";
3
+ import type { KindConvention, KindRegistry } from "../kinds.js";
4
+ import type { Bundle, ConceptId, Frontmatter, OkfDocument, Version } from "../types.js";
5
+ import type { RefusalCode } from "./errors.js";
6
+ import type { SourceIndex } from "./source-index.js";
7
+ /** One bundle as the overlay reads and writes it. */
8
+ export interface OverlayBundle {
9
+ bundle: Bundle;
10
+ registry: KindRegistry;
11
+ okfVersion: "0.1" | "0.2";
12
+ }
13
+ /** The generic Source Feed policy: which fields a feed owns and what each change kind may do. */
14
+ export interface OverlayPolicy {
15
+ feed: ConceptId;
16
+ /** The provider identity (`url`), as `sources[].resource` names it. */
17
+ provider: string;
18
+ /** The Kind of the overlay documents. Absent for a record-only or presentation-only feed. */
19
+ target_kind?: string;
20
+ owned_fields: string[];
21
+ auto_apply: string[];
22
+ needs_review: string[];
23
+ missing_threshold?: number;
24
+ completeness?: "complete" | "partial";
25
+ /** The feed's wall-time zone, validated by whoever owns the interval hook. */
26
+ time_zone?: string;
27
+ exclude?: RegExp | null;
28
+ exclude_ids?: ReadonlySet<string> | null;
29
+ /**
30
+ * The target Kind's `string-list` and `https-url-list` fields, which change detection compares as
31
+ * sets. Present only when the reader was given a target Kind that declares one.
32
+ */
33
+ list_fields?: string[];
34
+ }
35
+ /** Field checks for the reader: the target Kind's declared fields, or a presentation kind's fields. */
36
+ export type PolicyContext = {
37
+ targetKind?: KindConvention;
38
+ presentationFields?: never;
39
+ } | {
40
+ presentationFields: readonly string[];
41
+ targetKind?: never;
42
+ };
43
+ /** One change the caller's diff observed for one external record. */
44
+ export interface RecordChange {
45
+ external_id: string;
46
+ change_kind: string;
47
+ changed_fields: string[];
48
+ before: Record<string, unknown> | null;
49
+ after: Record<string, unknown> | null;
50
+ content_digest: string;
51
+ occurs_at?: string;
52
+ missing_count?: number;
53
+ first_missing_at?: string;
54
+ collapse_with?: string[];
55
+ signal_priority?: string;
56
+ }
57
+ export interface Tell {
58
+ code: string;
59
+ match: string;
60
+ [property: string]: unknown;
61
+ }
62
+ /** A publication text gate: the text as it may be written, and whether it may be written at all. */
63
+ export type TextGate = (text: string, context: {
64
+ field: string;
65
+ kind: string | undefined;
66
+ }) => {
67
+ text: string;
68
+ ok: boolean;
69
+ tells: Tell[];
70
+ changed?: boolean;
71
+ };
72
+ /** `[startMs, endMs)` of a record's last known occurrence, or null when its dates are unknown. */
73
+ export type IntervalHook = (fields: Record<string, unknown>, timeZone: string | undefined) => readonly [number, number] | null;
74
+ export type DisappearedPhase = "ended" | "before-start" | "ongoing" | null;
75
+ export interface CorrelateHook {
76
+ kind: string;
77
+ match: (fields: Record<string, unknown>, frontmatter: Frontmatter, externalId: string) => null | undefined | {
78
+ reason: string;
79
+ priority?: string;
80
+ };
81
+ }
82
+ /** Runs on every fresh candidate through `mutateDocument`, after the core-owned guards. */
83
+ export type AssertCandidate = (existing: OkfDocument | undefined, candidate: DocumentMutationCandidate) => void | Promise<void>;
84
+ export interface OverlayHooks {
85
+ textGate?: TextGate;
86
+ interval?: IntervalHook;
87
+ correlate?: CorrelateHook;
88
+ /** Scalar properties for the `sources` entry of an applied record; none means no upsert. */
89
+ sourceProperties?: (change: RecordChange) => Record<string, string | number | boolean> | undefined;
90
+ /** Site rules, run after the core-owned guards on the same fresh read. */
91
+ assertCandidate?: (existing: OkfDocument | undefined, candidate: DocumentMutationCandidate, context: {
92
+ step: OverlayStep["op"];
93
+ bundle: "content" | "ops";
94
+ }) => void | Promise<void>;
95
+ /** Fields derived in the same write as the owned fields (for example `updated_at`). */
96
+ deriveFields?: {
97
+ fields: readonly string[];
98
+ derive: (existing: OkfDocument, next: DocumentMutationCandidate) => Record<string, unknown>;
99
+ };
100
+ }
101
+ export interface ChangeDecision {
102
+ apply: Record<string, {
103
+ from: unknown;
104
+ to: unknown;
105
+ }>;
106
+ conflicts: Array<{
107
+ field: string;
108
+ doc_value: unknown;
109
+ feed_before: unknown;
110
+ feed_after: unknown;
111
+ }>;
112
+ editorFields: string[];
113
+ wording: Array<{
114
+ field: string;
115
+ text: string;
116
+ tells: Tell[];
117
+ }>;
118
+ signal: null | {
119
+ priority: string;
120
+ reasons: string[];
121
+ };
122
+ }
123
+ export interface PlanInput {
124
+ content: OverlayBundle;
125
+ ops: OverlayBundle;
126
+ policy: OverlayPolicy;
127
+ changes: readonly RecordChange[];
128
+ observedAt: string;
129
+ /** Next store records, for titles. */
130
+ records?: Record<string, {
131
+ fields?: Record<string, unknown>;
132
+ }>;
133
+ observation?: {
134
+ baseline?: boolean;
135
+ replay?: boolean;
136
+ stats?: Record<string, unknown>;
137
+ };
138
+ /** A per-run identity index; without one the plan builds its own for this provider and Kind. */
139
+ overlays?: SourceIndex;
140
+ timeZone?: string;
141
+ /** Ops and content are one bundle, so typed `about` links are possible. */
142
+ sameBundle?: boolean;
143
+ /** Attention and feed Kind names; default `Signal` and `Source Feed`. */
144
+ signals?: {
145
+ kind?: string;
146
+ feedKind?: string;
147
+ };
148
+ hooks?: OverlayHooks;
149
+ }
150
+ export interface Finding {
151
+ key: string;
152
+ title: string;
153
+ summary?: string;
154
+ priority?: string;
155
+ about_doc?: string;
156
+ related?: string[];
157
+ facts?: unknown;
158
+ sources?: Array<{
159
+ resource: string;
160
+ id?: string;
161
+ title?: string;
162
+ [property: string]: unknown;
163
+ }>;
164
+ external_id?: string;
165
+ expires_at?: string;
166
+ change_kind?: string;
167
+ }
168
+ export interface FindingsInput {
169
+ ops: OverlayBundle;
170
+ /** Signal `provider`: a feed URL or a tool name. */
171
+ provider: string;
172
+ /** Source Feed id for the `from feed` link; absent for tool-raised findings. */
173
+ feed?: ConceptId;
174
+ /** Signal id prefix after the attention Kind's path. */
175
+ slug: string;
176
+ findings: readonly Finding[] | null | undefined;
177
+ observedAt: string;
178
+ signals?: {
179
+ kind?: string;
180
+ feedKind?: string;
181
+ };
182
+ }
183
+ export interface ApplyContext {
184
+ content: OverlayBundle;
185
+ ops: OverlayBundle;
186
+ policy: Pick<OverlayPolicy, "owned_fields" | "provider" | "target_kind">;
187
+ actor: string;
188
+ overlays?: SourceIndex;
189
+ /** Attention and feed Kind names, as the plan was made with; default `Signal` and `Source Feed`. */
190
+ signals?: {
191
+ kind?: string;
192
+ feedKind?: string;
193
+ };
194
+ hooks?: Pick<OverlayHooks, "assertCandidate" | "deriveFields">;
195
+ }
196
+ export interface ApplyOwnedFieldsStep {
197
+ op: "apply-owned-fields";
198
+ target: ConceptId;
199
+ expected_version: Version;
200
+ external_id: string;
201
+ change_kind: string;
202
+ fields: Record<string, {
203
+ from: unknown;
204
+ to: unknown;
205
+ }>;
206
+ /** Grouped shape: properties upserted on the record's `sources` entry in the same write. */
207
+ sources?: Record<string, string | number | boolean>;
208
+ }
209
+ export interface CreateSignalStep {
210
+ op: "create-signal";
211
+ target: ConceptId;
212
+ external_id: string;
213
+ content_digest: string;
214
+ finding?: string;
215
+ reasons: string[];
216
+ candidate: {
217
+ frontmatter: Frontmatter;
218
+ body: string;
219
+ };
220
+ }
221
+ export interface CollapseSignalStep {
222
+ op: "collapse-signal";
223
+ target: ConceptId;
224
+ expected_version: Version;
225
+ external_id: string;
226
+ content_digest: string;
227
+ finding?: string;
228
+ progress_field: string;
229
+ observation_line: string;
230
+ set: Record<string, unknown>;
231
+ }
232
+ export interface SignalDuplicateStep {
233
+ op: "signal-duplicate";
234
+ target: ConceptId;
235
+ external_id: string;
236
+ content_digest: string;
237
+ finding?: string;
238
+ }
239
+ export interface RecordOnlyStep {
240
+ op: "record-only";
241
+ target?: undefined;
242
+ external_id: string;
243
+ change_kind?: string;
244
+ superseded?: true;
245
+ ended?: true;
246
+ reason?: string;
247
+ last_known_end?: string;
248
+ excluded?: true;
249
+ collapsed_into?: ConceptId;
250
+ }
251
+ export type OverlayStep = ApplyOwnedFieldsStep | CreateSignalStep | CollapseSignalStep | SignalDuplicateStep | RecordOnlyStep;
252
+ export interface RefusalRow {
253
+ code: RefusalCode;
254
+ external_id: string;
255
+ target?: ConceptId;
256
+ targets?: ConceptId[];
257
+ field?: string;
258
+ message: string;
259
+ }
260
+ export interface OverlayPlan {
261
+ feed: ConceptId | null;
262
+ provider: string;
263
+ observed_at: string;
264
+ baseline?: boolean;
265
+ replay?: boolean;
266
+ stats?: Record<string, unknown>;
267
+ steps: OverlayStep[];
268
+ refusals: RefusalRow[];
269
+ diagnostics?: unknown[];
270
+ }
271
+ export interface StepResult {
272
+ op: OverlayStep["op"];
273
+ target: ConceptId | null;
274
+ external_id: string;
275
+ outcome: "applied" | "unchanged" | "skipped" | "refused";
276
+ version?: Version;
277
+ code?: RefusalCode;
278
+ message?: string;
279
+ details?: Record<string, unknown>;
280
+ reason?: string;
281
+ last_known_end?: string;
282
+ }
283
+ export interface OverlayReceipt {
284
+ feed: ConceptId | null;
285
+ provider: string;
286
+ observed_at: string;
287
+ results: StepResult[];
288
+ refusals: RefusalRow[];
289
+ diagnostics: unknown[];
290
+ }
291
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/record-overlay/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/record-overlay/types.ts"],"names":[],"mappings":""}
@@ -83,14 +83,14 @@ function buildTransport(remote, options) {
83
83
  // Refused rather than thrown: the primitive classifies a throw as unknown, and an intent
84
84
  // that can never be sent would then stay pending as possibly delivered on every push.
85
85
  if (intent.kind !== "document.write") {
86
- return { kind: "refused", code: "USAGE", message: `remote operation transport: unsupported intent kind '${intent.kind}'` };
86
+ return { kind: "refused", code: "USAGE", message: `remote operation transport: unsupported intent kind '${intent.kind}'`, executed: false };
87
87
  }
88
88
  let parsed;
89
89
  try {
90
90
  parsed = parseMarkdown(intent.content, pathFromConceptId(intent.target));
91
91
  }
92
92
  catch (error) {
93
- return { kind: "refused", code: "USAGE", message: error instanceof Error ? error.message : String(error) };
93
+ return { kind: "refused", code: "USAGE", message: error instanceof Error ? error.message : String(error), executed: false };
94
94
  }
95
95
  const { frontmatter, body } = parsed;
96
96
  const writeOptions = {
@@ -110,6 +110,9 @@ function buildTransport(remote, options) {
110
110
  return { kind: "refused", code: "USAGE", message: error.message };
111
111
  if (error instanceof VersionConflict)
112
112
  return { kind: "conflict", actual: error.actual };
113
+ // The reference router authorizes before it claims a key: a 401 or 403 executed nothing.
114
+ if (error instanceof RemoteError && (error.status === 401 || error.status === 403))
115
+ return { kind: "refused", code: error.code, message: error.message, executed: false };
113
116
  if (error instanceof RemoteError && error.status < 500)
114
117
  return { kind: "refused", code: error.code, message: error.message };
115
118
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"remote-operations.js","sourceRoot":"","sources":["../src/remote-operations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote-operations.js","sourceRoot":"","sources":["../src/remote-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * The `documents.search.v1` contract: its constants, request and result types, and the frontmatter
3
+ * fields a search reads. Ranking and index limits are portal-webmcp 0.3.1's (algorithm
4
+ * `portal-webmcp-search/v1`, a long document indexed whole up to 65,536 body terms); the request
5
+ * limits are this contract's.
6
+ */
7
+ export declare const SEARCH_OPERATION_ID = "documents.search.v1";
8
+ /** The ranking algorithm, shared with portal-webmcp 0.3.1's `superbee_search_documents`. */
9
+ export declare const SEARCH_ALGORITHM = "portal-webmcp-search/v1";
10
+ /** Bumped whenever normalize, tokenize or searchRowText change what a document contributes to an
11
+ * index; the row-text golden (`test/fixtures/search-row-text-v<revision>.json`) pins it. */
12
+ export declare const SEARCH_TEXT_REVISION = 1;
13
+ /** Largest answer, as JSON. A page of long hits can exceed it before 50 hits: the page then ends
14
+ * early with a cursor at the cut. */
15
+ export declare const SEARCH_MAX_OUTPUT_BYTES: number;
16
+ export declare const SEARCH_LIMITS: Readonly<{
17
+ /** Largest query, UTF-8 bytes. */
18
+ readonly maxQueryBytes: 1024;
19
+ /** Distinct normalized query terms. */
20
+ readonly maxQueryTerms: 16;
21
+ readonly defaultRows: 10;
22
+ readonly maxRows: 50;
23
+ /** Excerpt length, UTF-8 bytes. */
24
+ readonly excerptBytes: 512;
25
+ /** Largest exact `type` or `tag` filter, UTF-8 bytes (the kernel query's filter bound). */
26
+ readonly maxFilterBytes: 256;
27
+ /** Largest id `prefix` filter, UTF-8 bytes (a document id's bound). */
28
+ readonly maxPrefixBytes: 512;
29
+ /** Largest cursor, UTF-8 bytes. */
30
+ readonly maxCursorBytes: 2048;
31
+ /** Values per facet, most frequent first. */
32
+ readonly maxFacetValues: 50;
33
+ readonly maxIndexDocuments: 20000;
34
+ readonly maxIndexSourceBytes: 67108864;
35
+ /** portal-webmcp's V1 value: a long document is indexed whole, never truncated; one over it is
36
+ * left out of the index and counted as skipped. */
37
+ readonly maxTermsPerDocument: 65536;
38
+ /** The default and ceiling of `searchDocuments`' `maxEvidenceInstances`: the most capped term
39
+ * instances a request's terms may hold across a corpus before it is refused as too broad. */
40
+ readonly maxEvidenceInstances: 400000;
41
+ }>;
42
+ /** Body occurrences of one distinct query term that can still add score. */
43
+ export declare const BODY_OCCURRENCE_CAP = 20;
44
+ /** Bytes an excerpt may reach behind its first body match before the match starts. */
45
+ export declare const EXCERPT_LEAD_BYTES = 256;
46
+ /** Documents processed between cancellation checks. */
47
+ export declare const SIGNAL_INTERVAL = 128;
48
+ export declare const SEARCH_MATCHES: readonly ["auto", "all", "any"];
49
+ export type SearchMatchV1 = (typeof SEARCH_MATCHES)[number];
50
+ export type SearchMatchModeV1 = "all" | "any";
51
+ export declare const SEARCH_FACETS: readonly ["type", "tags"];
52
+ export type SearchFacetV1 = (typeof SEARCH_FACETS)[number];
53
+ export declare const SEARCH_MATCH_FIELDS: readonly ["title", "type", "tag", "description", "id", "body"];
54
+ export type SearchMatchFieldV1 = (typeof SEARCH_MATCH_FIELDS)[number];
55
+ export declare const SEARCH_GUIDANCE: Readonly<{
56
+ all: "No document contains every query term. Retry with match \"any\", fewer terms, or different exact filters.";
57
+ any: "No document contains any searchable query term. Try domain-specific keywords or remove exact type and tag filters.";
58
+ /** The refusal of a request whose terms occur too often to rank (`maxEvidenceInstances`). */
59
+ broad: "The query's terms occur too often in this corpus to rank. Retry with fewer or more specific terms.";
60
+ }>;
61
+ /** One document of a search corpus: a read model row, or a working copy's head and body. */
62
+ export interface SearchDocumentV1 {
63
+ readonly id: string;
64
+ readonly version: string;
65
+ readonly frontmatter: Readonly<Record<string, unknown>>;
66
+ readonly body: string;
67
+ }
68
+ /** Cancellation for a long build or ranking: a signal, a host check that throws, or both. */
69
+ export interface SearchStopV1 {
70
+ readonly signal?: AbortSignal;
71
+ /** Called every SIGNAL_INTERVAL documents; throws to stop (for example a deadline). */
72
+ readonly check?: () => void;
73
+ }
74
+ /** The exact filters a source applies before it answers evidence. */
75
+ export interface SearchFiltersV1 {
76
+ readonly type?: string;
77
+ readonly tag?: string;
78
+ /** Leading characters of the document id. */
79
+ readonly prefix?: string;
80
+ }
81
+ export interface SearchRequestV1 {
82
+ /** Free text, at most 1 KiB and 16 distinct terms after normalization. */
83
+ readonly query: string;
84
+ /** `auto` (default): every term, then any term without conversational words when nothing matched. */
85
+ readonly match?: SearchMatchV1;
86
+ /** Exact frontmatter `type`. */
87
+ readonly type?: string;
88
+ /** Exact declared tag. */
89
+ readonly tag?: string;
90
+ /** Leading characters of the document id, at most 512 bytes. */
91
+ readonly prefix?: string;
92
+ /** Hits per page, 1 to 50; default 10. */
93
+ readonly limit?: number;
94
+ /** A previous answer's `nextCursor`, for the same corpus, query, match and filters. */
95
+ readonly cursor?: string;
96
+ /** Value counts over every hit (not only this page), most frequent first, at most 50 each. */
97
+ readonly facets?: readonly SearchFacetV1[];
98
+ }
99
+ export interface SearchHitV1 {
100
+ readonly id: string;
101
+ readonly version: string;
102
+ readonly title?: string;
103
+ readonly type?: string;
104
+ readonly tags: readonly string[];
105
+ readonly score: number;
106
+ readonly matchedTerms: readonly {
107
+ readonly term: string;
108
+ readonly fields: readonly SearchMatchFieldV1[];
109
+ }[];
110
+ /** At most SEARCH_LIMITS.excerptBytes UTF-8 bytes: the body around the first match, else the description. */
111
+ readonly excerpt: string;
112
+ }
113
+ export interface SearchFacetValueV1 {
114
+ readonly value: string;
115
+ readonly count: number;
116
+ }
117
+ export interface SearchResultV1 {
118
+ readonly hits: readonly SearchHitV1[];
119
+ readonly query: {
120
+ readonly requestedMatch: SearchMatchV1;
121
+ readonly effectiveMatch: SearchMatchModeV1;
122
+ readonly fallbackUsed: boolean;
123
+ /** The terms matched: normalized, deduplicated, and without ignoredTerms after a fallback. */
124
+ readonly terms: readonly string[];
125
+ /** Conversational terms the fallback left out; absent when none were. */
126
+ readonly ignoredTerms?: readonly string[];
127
+ };
128
+ /** Hits across every page. */
129
+ readonly total: number;
130
+ readonly facets?: {
131
+ readonly type?: readonly SearchFacetValueV1[];
132
+ readonly tags?: readonly SearchFacetValueV1[];
133
+ };
134
+ readonly nextCursor?: string;
135
+ /** What was searched: every document, those indexed (reindexPending included), those the index
136
+ * cannot hold, and indexed rows awaiting re-derivation. */
137
+ readonly corpus: {
138
+ readonly documents: number;
139
+ readonly indexed: number;
140
+ readonly skipped: number;
141
+ readonly reindexPending: number;
142
+ };
143
+ /** Fixed advice when nothing matched. */
144
+ readonly guidance?: string;
145
+ }
146
+ export declare function documentTitle(document: SearchDocumentV1): string | undefined;
147
+ export declare function documentType(document: SearchDocumentV1): string | undefined;
148
+ export declare function documentDescription(document: SearchDocumentV1): string | undefined;
149
+ /** Declared string tags only; a non-array or non-string member contributes nothing. */
150
+ export declare function documentTags(document: SearchDocumentV1): readonly string[];
151
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/search/contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D;4FAC4F;AAC5F,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;qCACqC;AACrC,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD,eAAO,MAAM,aAAa;IACxB,kCAAkC;;IAElC,uCAAuC;;;;IAIvC,mCAAmC;;IAEnC,2FAA2F;;IAE3F,uEAAuE;;IAEvE,mCAAmC;;IAEnC,6CAA6C;;;;IAK7C;uDACmD;;IAEnD;iGAC6F;;EAEpF,CAAC;AAEZ,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,uDAAuD;AACvD,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,eAAO,MAAM,cAAc,iCAAiD,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,CAAC;AAC9C,eAAO,MAAM,aAAa,2BAA2C,CAAC;AACtE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3D,eAAO,MAAM,mBAAmB,gEAAgF,CAAC;AACjH,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,eAAe;;;IAG1B,6FAA6F;;EAE7F,CAAC;AAEH,4FAA4F;AAC5F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,uFAAuF;IACvF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qGAAqG;IACrG,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAA;KAAE,EAAE,CAAC;IAC5G,6GAA6G;IAC7G,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC;QACvC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC;QAC3C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;QAC/B,8FAA8F;QAC9F,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAClC,yEAAyE;QACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC3C,CAAC;IACF,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAA;KAAE,CAAC;IACnH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;+DAC2D;IAC3D,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAElF;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,MAAM,EAAE,CAG1E"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The `documents.search.v1` contract: its constants, request and result types, and the frontmatter
3
+ * fields a search reads. Ranking and index limits are portal-webmcp 0.3.1's (algorithm
4
+ * `portal-webmcp-search/v1`, a long document indexed whole up to 65,536 body terms); the request
5
+ * limits are this contract's.
6
+ */
7
+ export const SEARCH_OPERATION_ID = "documents.search.v1";
8
+ /** The ranking algorithm, shared with portal-webmcp 0.3.1's `superbee_search_documents`. */
9
+ export const SEARCH_ALGORITHM = "portal-webmcp-search/v1";
10
+ /** Bumped whenever normalize, tokenize or searchRowText change what a document contributes to an
11
+ * index; the row-text golden (`test/fixtures/search-row-text-v<revision>.json`) pins it. */
12
+ export const SEARCH_TEXT_REVISION = 1;
13
+ /** Largest answer, as JSON. A page of long hits can exceed it before 50 hits: the page then ends
14
+ * early with a cursor at the cut. */
15
+ export const SEARCH_MAX_OUTPUT_BYTES = 64 * 1024;
16
+ export const SEARCH_LIMITS = Object.freeze({
17
+ /** Largest query, UTF-8 bytes. */
18
+ maxQueryBytes: 1_024,
19
+ /** Distinct normalized query terms. */
20
+ maxQueryTerms: 16,
21
+ defaultRows: 10,
22
+ maxRows: 50,
23
+ /** Excerpt length, UTF-8 bytes. */
24
+ excerptBytes: 512,
25
+ /** Largest exact `type` or `tag` filter, UTF-8 bytes (the kernel query's filter bound). */
26
+ maxFilterBytes: 256,
27
+ /** Largest id `prefix` filter, UTF-8 bytes (a document id's bound). */
28
+ maxPrefixBytes: 512,
29
+ /** Largest cursor, UTF-8 bytes. */
30
+ maxCursorBytes: 2_048,
31
+ /** Values per facet, most frequent first. */
32
+ maxFacetValues: 50,
33
+ // Index limits, enforced while an in-memory index is built.
34
+ maxIndexDocuments: 20_000,
35
+ maxIndexSourceBytes: 67_108_864,
36
+ /** portal-webmcp's V1 value: a long document is indexed whole, never truncated; one over it is
37
+ * left out of the index and counted as skipped. */
38
+ maxTermsPerDocument: 65_536,
39
+ /** The default and ceiling of `searchDocuments`' `maxEvidenceInstances`: the most capped term
40
+ * instances a request's terms may hold across a corpus before it is refused as too broad. */
41
+ maxEvidenceInstances: 400_000,
42
+ });
43
+ /** Body occurrences of one distinct query term that can still add score. */
44
+ export const BODY_OCCURRENCE_CAP = 20;
45
+ /** Bytes an excerpt may reach behind its first body match before the match starts. */
46
+ export const EXCERPT_LEAD_BYTES = 256;
47
+ /** Documents processed between cancellation checks. */
48
+ export const SIGNAL_INTERVAL = 128;
49
+ export const SEARCH_MATCHES = Object.freeze(["auto", "all", "any"]);
50
+ export const SEARCH_FACETS = Object.freeze(["type", "tags"]);
51
+ export const SEARCH_MATCH_FIELDS = Object.freeze(["title", "type", "tag", "description", "id", "body"]);
52
+ export const SEARCH_GUIDANCE = Object.freeze({
53
+ all: 'No document contains every query term. Retry with match "any", fewer terms, or different exact filters.',
54
+ any: "No document contains any searchable query term. Try domain-specific keywords or remove exact type and tag filters.",
55
+ /** The refusal of a request whose terms occur too often to rank (`maxEvidenceInstances`). */
56
+ broad: "The query's terms occur too often in this corpus to rank. Retry with fewer or more specific terms.",
57
+ });
58
+ // The one place that decides which frontmatter members become searchable or displayable fields;
59
+ // nothing here reinterprets Markdown or adds Kind semantics.
60
+ function stringMember(frontmatter, key) {
61
+ const value = frontmatter[key];
62
+ return typeof value === "string" ? value : undefined;
63
+ }
64
+ export function documentTitle(document) {
65
+ return stringMember(document.frontmatter, "title");
66
+ }
67
+ export function documentType(document) {
68
+ return stringMember(document.frontmatter, "type");
69
+ }
70
+ export function documentDescription(document) {
71
+ return stringMember(document.frontmatter, "description");
72
+ }
73
+ /** Declared string tags only; a non-array or non-string member contributes nothing. */
74
+ export function documentTags(document) {
75
+ const value = document.frontmatter["tags"];
76
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : [];
77
+ }
78
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/search/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** The corpus exceeds an index limit or a host's configured bound. A kernel answers
2
+ * `result_too_large`. */
3
+ export declare class SearchLimitError extends Error {
4
+ readonly limit: string;
5
+ readonly max: number;
6
+ readonly actual: number;
7
+ constructor(limit: string, max: number, actual: number, message?: string);
8
+ }
9
+ /** The request's terms hold more than `maxEvidenceInstances` capped instances. Still a
10
+ * `SearchLimitError` (`result_too_large`), but the corpus is searchable: the message is
11
+ * SEARCH_GUIDANCE.broad, to retry with fewer or more specific terms. */
12
+ export declare class SearchBroadQueryError extends SearchLimitError {
13
+ constructor(max: number, actual: number);
14
+ }
15
+ export type SearchInputReason = "request" | "query" | "empty-query" | "too-many-query-terms" | "match" | "filter" | "limit" | "facets" | "cursor";
16
+ /** The request is outside the contract. A kernel answers `invalid_input`. */
17
+ export declare class SearchInputError extends Error {
18
+ readonly reason: SearchInputReason;
19
+ constructor(reason: SearchInputReason);
20
+ }
21
+ /** A cancelled index build or ranking rejects; it never returns a partial answer. */
22
+ export declare class SearchAbortError extends Error {
23
+ constructor();
24
+ }
25
+ /** Throws as a stop asks: a signal already aborted, or a host check that throws. */
26
+ export declare function stopIfAsked(stop: {
27
+ readonly signal?: AbortSignal;
28
+ readonly check?: () => void;
29
+ } | undefined): void;
30
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/search/errors.ts"],"names":[],"mappings":"AAKA;yBACyB;AACzB,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,SAAkD;CAOlH;AAED;;wEAEwE;AACxE,qBAAa,qBAAsB,SAAQ,gBAAgB;gBAC7C,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAIxC;AAED,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,OAAO,GACP,aAAa,GACb,sBAAsB,GACtB,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,QAAQ,CAAC;AAEb,6EAA6E;AAC7E,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAEvB,MAAM,EAAE,iBAAiB;CAKtC;AAED,qFAAqF;AACrF,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,SAAS,GAAG,IAAI,CAGlH"}