@happyvertical/smrt-ingestion 0.57.20 → 0.57.22

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 (115) hide show
  1. package/FEEDBACK.md +137 -0
  2. package/PROPOSALS.md +146 -5
  3. package/README.md +168 -2
  4. package/REVIEW.md +611 -7
  5. package/agents/execution.md +87 -0
  6. package/dist/chunks/{execution-NoDh3pjs.js → execution-BzVQax0n.js} +528 -42
  7. package/dist/chunks/execution-BzVQax0n.js.map +1 -0
  8. package/dist/chunks/{feedback-CJB900iG.js → feedback-D3UTF8fm.js} +175 -36
  9. package/dist/chunks/feedback-D3UTF8fm.js.map +1 -0
  10. package/dist/chunks/{proposal-errors-VxcTU6Db.js → proposal-contracts-77Uo1B1j.js} +38 -44
  11. package/dist/chunks/proposal-contracts-77Uo1B1j.js.map +1 -0
  12. package/dist/chunks/reviewer-instruction-CEc3AOuU.js +33 -0
  13. package/dist/chunks/reviewer-instruction-CEc3AOuU.js.map +1 -0
  14. package/dist/dto.d.ts +75 -0
  15. package/dist/dto.d.ts.map +1 -1
  16. package/dist/execution-contracts.d.ts +4 -1
  17. package/dist/execution-contracts.d.ts.map +1 -1
  18. package/dist/execution-dto.d.ts +16 -0
  19. package/dist/execution-dto.d.ts.map +1 -1
  20. package/dist/execution-internal.d.ts +2 -0
  21. package/dist/execution-internal.d.ts.map +1 -1
  22. package/dist/execution.d.ts +101 -4
  23. package/dist/execution.d.ts.map +1 -1
  24. package/dist/execution.js +2 -2
  25. package/dist/feedback-dto.d.ts +18 -4
  26. package/dist/feedback-dto.d.ts.map +1 -1
  27. package/dist/feedback-internal.d.ts +9 -0
  28. package/dist/feedback-internal.d.ts.map +1 -1
  29. package/dist/feedback.d.ts +10 -0
  30. package/dist/feedback.d.ts.map +1 -1
  31. package/dist/index.js +2 -2
  32. package/dist/manifest.json +339 -3
  33. package/dist/models.d.ts +15 -0
  34. package/dist/models.d.ts.map +1 -1
  35. package/dist/models.js +82 -2
  36. package/dist/models.js.map +1 -1
  37. package/dist/policy.d.ts +3 -0
  38. package/dist/policy.d.ts.map +1 -1
  39. package/dist/presented-filename.d.ts +11 -0
  40. package/dist/presented-filename.d.ts.map +1 -0
  41. package/dist/proposal-contracts.d.ts +31 -6
  42. package/dist/proposal-contracts.d.ts.map +1 -1
  43. package/dist/proposal-dto.d.ts +17 -0
  44. package/dist/proposal-dto.d.ts.map +1 -1
  45. package/dist/proposal-errors.d.ts +20 -0
  46. package/dist/proposal-errors.d.ts.map +1 -1
  47. package/dist/proposal-validation.d.ts +26 -0
  48. package/dist/proposal-validation.d.ts.map +1 -1
  49. package/dist/proposals.d.ts +6 -1
  50. package/dist/proposals.d.ts.map +1 -1
  51. package/dist/proposals.js +268 -71
  52. package/dist/proposals.js.map +1 -1
  53. package/dist/redaction.d.ts +9 -0
  54. package/dist/redaction.d.ts.map +1 -0
  55. package/dist/review-dto.d.ts +108 -5
  56. package/dist/review-dto.d.ts.map +1 -1
  57. package/dist/review-host.d.ts +52 -3
  58. package/dist/review-host.d.ts.map +1 -1
  59. package/dist/review-instruction-view.d.ts +12 -0
  60. package/dist/review-instruction-view.d.ts.map +1 -0
  61. package/dist/review-summary.d.ts.map +1 -1
  62. package/dist/reviewer-instruction.d.ts +20 -0
  63. package/dist/reviewer-instruction.d.ts.map +1 -0
  64. package/dist/server.d.ts +252 -13
  65. package/dist/server.d.ts.map +1 -1
  66. package/dist/server.js +1190 -85
  67. package/dist/server.js.map +1 -1
  68. package/dist/smrt-knowledge.json +137 -23
  69. package/dist/sources/common.d.ts +11 -0
  70. package/dist/sources/common.d.ts.map +1 -1
  71. package/dist/sources/email.d.ts.map +1 -1
  72. package/dist/sources/http.d.ts.map +1 -1
  73. package/dist/sources/watch-folder.d.ts.map +1 -1
  74. package/dist/svelte/components/ActionReview.svelte +54 -55
  75. package/dist/svelte/components/ActionReview.svelte.d.ts +8 -1
  76. package/dist/svelte/components/ActionReview.svelte.d.ts.map +1 -1
  77. package/dist/svelte/components/CandidatePicker.svelte +72 -0
  78. package/dist/svelte/components/CandidatePicker.svelte.d.ts +15 -0
  79. package/dist/svelte/components/CandidatePicker.svelte.d.ts.map +1 -0
  80. package/dist/svelte/components/EvidenceViewer.svelte +60 -4
  81. package/dist/svelte/components/EvidenceViewer.svelte.d.ts +12 -1
  82. package/dist/svelte/components/EvidenceViewer.svelte.d.ts.map +1 -1
  83. package/dist/svelte/components/InboxView.svelte +172 -19
  84. package/dist/svelte/components/InboxView.svelte.d.ts +36 -2
  85. package/dist/svelte/components/InboxView.svelte.d.ts.map +1 -1
  86. package/dist/svelte/components/IntakeInbox.svelte +6 -3
  87. package/dist/svelte/components/IntakeInbox.svelte.d.ts +4 -1
  88. package/dist/svelte/components/IntakeInbox.svelte.d.ts.map +1 -1
  89. package/dist/svelte/components/IntakeReview.svelte +4 -2
  90. package/dist/svelte/components/IntakeReview.svelte.d.ts +2 -0
  91. package/dist/svelte/components/IntakeReview.svelte.d.ts.map +1 -1
  92. package/dist/svelte/components/IntakeWorkspace.svelte +27 -0
  93. package/dist/svelte/components/IntakeWorkspace.svelte.d.ts +19 -0
  94. package/dist/svelte/components/IntakeWorkspace.svelte.d.ts.map +1 -0
  95. package/dist/svelte/components/ReviewView.svelte +653 -71
  96. package/dist/svelte/components/ReviewView.svelte.d.ts +20 -1
  97. package/dist/svelte/components/ReviewView.svelte.d.ts.map +1 -1
  98. package/dist/svelte/components/TriageView.svelte +669 -0
  99. package/dist/svelte/components/TriageView.svelte.d.ts +16 -0
  100. package/dist/svelte/components/TriageView.svelte.d.ts.map +1 -0
  101. package/dist/svelte/i18n.d.ts +56 -0
  102. package/dist/svelte/i18n.d.ts.map +1 -1
  103. package/dist/svelte/i18n.js +56 -0
  104. package/dist/svelte/index.d.ts +2 -1
  105. package/dist/svelte/index.d.ts.map +1 -1
  106. package/dist/svelte/index.js +1 -0
  107. package/dist/svelte/view-utils.d.ts +67 -0
  108. package/dist/svelte/view-utils.d.ts.map +1 -1
  109. package/dist/svelte/view-utils.js +157 -0
  110. package/package.json +13 -13
  111. package/dist/chunks/execution-NoDh3pjs.js.map +0 -1
  112. package/dist/chunks/execution-internal-DWteDHM2.js +0 -7
  113. package/dist/chunks/execution-internal-DWteDHM2.js.map +0 -1
  114. package/dist/chunks/feedback-CJB900iG.js.map +0 -1
  115. package/dist/chunks/proposal-errors-VxcTU6Db.js.map +0 -1
@@ -1,4 +1,5 @@
1
- import { a as feedbackActionTransaction, c as __exportAll, o as feedbackDiscoveryContext, r as intakeBindingDigest, t as IntakeExecutionService } from "./execution-NoDh3pjs.js";
1
+ import { i as intakeBindingDigest, n as IntakeExecutionService, o as feedbackActionTransaction, s as feedbackDiscoveryContext, v as __exportAll } from "./execution-BzVQax0n.js";
2
+ import { i as reviewerInstructionView } from "./reviewer-instruction-CEc3AOuU.js";
2
3
  import { randomUUID } from "node:crypto";
3
4
  //#region src/feedback.ts
4
5
  var feedback_exports = /* @__PURE__ */ __exportAll({
@@ -153,9 +154,16 @@ var IntakeFeedbackService = class {
153
154
  kind: row.kind
154
155
  };
155
156
  }
157
+ /** Source text, pin and (when a model suggestion exists) generation versions. */
156
158
  async provenance(ctx) {
157
- const generation = object(object(ctx.result.output).proposals), pin = object(generation.source), provenance = object(generation.provenance);
158
- if (provenance.feedback) {
159
+ const output = object(ctx.result.output);
160
+ const generation = output.proposals ? object(output.proposals) : void 0;
161
+ const pin = generation ? object(generation.source) : {
162
+ attemptId: ctx.attemptId,
163
+ outputDigest: intakeBindingDigest(ctx.result)
164
+ };
165
+ const provenance = generation ? object(generation.provenance) : void 0;
166
+ if (generation && provenance?.feedback) {
159
167
  const inherited = object(provenance.feedback);
160
168
  const key = ctx.attemptId;
161
169
  if (this.lineage.has(key) || this.lineage.size >= 8) throw new Error("Feedback lineage unavailable");
@@ -185,6 +193,13 @@ var IntakeFeedbackService = class {
185
193
  const segments = object(entry).segments;
186
194
  return Array.isArray(segments) ? segments.map((segment) => String(object(segment).text ?? "")) : [];
187
195
  }).join("\n").slice(0, 4096);
196
+ if (!provenance) return {
197
+ generation: false,
198
+ query,
199
+ attemptId: ctx.attemptId,
200
+ evidence: object(ctx.analysis).inputs,
201
+ source: pin
202
+ };
188
203
  const model = object(provenance.generative);
189
204
  for (const field of [
190
205
  "provider",
@@ -193,8 +208,14 @@ var IntakeFeedbackService = class {
193
208
  ]) text(model[field]);
194
209
  text(provenance.promptVersion);
195
210
  text(provenance.configurationVersion);
211
+ const instruction = this.instructionFor(ctx);
196
212
  return {
213
+ generation: true,
197
214
  query,
215
+ ...instruction ? { instruction: {
216
+ id: instruction.id,
217
+ digest: instruction.digest
218
+ } } : {},
198
219
  model: {
199
220
  provider: String(model.provider),
200
221
  model: String(model.model),
@@ -207,6 +228,42 @@ var IntakeFeedbackService = class {
207
228
  source: pin
208
229
  };
209
230
  }
231
+ /** The example exactly as retrieval returns it; shared by the write-time size check. */
232
+ exampleOf(id, stored, data, ctx, guidance) {
233
+ return {
234
+ feedbackId: id,
235
+ digest: stored,
236
+ itemId: ctx.itemId,
237
+ actionId: ctx.review.actionId,
238
+ revision: ctx.review.revision,
239
+ handlerId: ctx.handlerId,
240
+ handlerVersion: ctx.handlerVersion,
241
+ judgment: data.judgment,
242
+ query: String(data.query),
243
+ args: object(data.args),
244
+ model: data.model,
245
+ promptVersion: String(data.promptVersion),
246
+ configurationVersion: String(data.configurationVersion),
247
+ ...guidance ? { instruction: guidance } : {}
248
+ };
249
+ }
250
+ /**
251
+ * The verified reviewer instruction the action's generation ran under: the
252
+ * authenticated extraction record must match the generation's provenance.
253
+ */
254
+ instructionFor(ctx) {
255
+ const provenance = object(object(object(ctx.result.output).proposals).provenance);
256
+ const instructionRecord = object(object(ctx.analysis).configuration).reviewerInstruction;
257
+ const recorded = provenance.reviewerInstruction ? object(provenance.reviewerInstruction) : void 0;
258
+ if (!instructionRecord && !recorded) return void 0;
259
+ const view = reviewerInstructionView(instructionRecord);
260
+ if (!recorded || recorded.id !== view.id || recorded.digest !== view.digest) throw new Error("Feedback instruction integrity");
261
+ return {
262
+ id: view.id,
263
+ digest: view.digest,
264
+ text: view.text
265
+ };
266
+ }
210
267
  /** Internal saved-action gate; the execution owner supplies its transaction. */
211
268
  async assertActionLineage(actionId, db, proposalId) {
212
269
  await this.execution[feedbackActionTransaction](actionId, false, async (ctx) => {
@@ -236,7 +293,8 @@ var IntakeFeedbackService = class {
236
293
  ]);
237
294
  if (!old || object(old.data).actionId !== frozen.actionId || (await this.rows(ctx.db, "supersedes_id=?", [old.id])).length) throw new Error("Feedback supersession conflict");
238
295
  }
239
- const provenance = await this.provenance(ctx), routing = this.routing(ctx);
296
+ const { generation, ...provenance } = await this.provenance(ctx), routing = this.routing(ctx);
297
+ if (!generation || ctx.origin === "reviewer-selected") throw new Error("Feedback requires a model suggestion");
240
298
  const body = {
241
299
  version: 1,
242
300
  requestHash,
@@ -257,6 +315,16 @@ var IntakeFeedbackService = class {
257
315
  ...body,
258
316
  digest: intakeBindingDigest(body)
259
317
  }, frozen.supersedesId ?? null);
318
+ const guidance = this.instructionFor(ctx);
319
+ if (guidance) {
320
+ const data = object(row.data);
321
+ const selection = {
322
+ version: this.config.version,
323
+ configurationDigest: this.configurationDigest(),
324
+ examples: [this.exampleOf(String(row.id), String(data.digest), data, ctx, guidance)]
325
+ };
326
+ if (Buffer.byteLength(JSON.stringify(selection)) > Math.min(this.config.maxBytes, ctx.context.policy.maxBytes)) throw new Error("Feedback instruction exceeds retrieval budget");
327
+ }
260
328
  await this.authorize(ctx, "capture");
261
329
  if (intakeBindingDigest(routing) !== intakeBindingDigest(this.routing(ctx))) throw new Error("Routing projection changed");
262
330
  return this.receipt(row);
@@ -286,6 +354,8 @@ var IntakeFeedbackService = class {
286
354
  actionId: input.actionId,
287
355
  revision: ctx.review.revision,
288
356
  reviewer: input.kind === "action_decision" ? object(event.data).reviewer : null,
357
+ decisionMode: input.kind === "action_decision" ? object(event.data).mode ?? "review" : null,
358
+ selfDecision: input.kind === "action_decision" && object(event.data).selfDecision === true,
289
359
  observedBy: this.scope().actorId,
290
360
  principalId: object(event.data).principalId ?? null,
291
361
  signal: state,
@@ -310,36 +380,99 @@ var IntakeFeedbackService = class {
310
380
  return await this.execution[feedbackActionTransaction](candidate.actionId, false, async (ctx) => {
311
381
  await this.authorize(ctx, "retrieve");
312
382
  await this.provenance(ctx);
383
+ const guidance = this.instructionFor(ctx);
313
384
  const [current] = await this.rows(ctx.db, "id=? AND kind=? AND NOT EXISTS (SELECT 1 FROM intake_feedback successor WHERE successor.tenant_id=intake_feedback.tenant_id AND successor.confidential_scope_id=intake_feedback.confidential_scope_id AND successor.supersedes_id=intake_feedback.id)", [row.id, "interpretation"]);
314
385
  if (!current) return void 0;
315
386
  const data = object(current.data);
316
387
  const { digest: stored, ...body } = data;
317
388
  if (intakeBindingDigest(body) !== stored) throw new Error("Feedback integrity");
318
- if (data.revision !== ctx.review.revision || data.bindingHash !== ctx.review.bindingHash || data.attemptId !== ctx.attemptId || data.promptVersion !== input.promptVersion || data.configurationVersion !== input.configurationVersion || intakeBindingDigest(data.model) !== intakeBindingDigest(input.model)) return void 0;
389
+ if (ctx.origin === "reviewer-selected" || data.revision !== ctx.review.revision || data.bindingHash !== ctx.review.bindingHash || data.attemptId !== ctx.attemptId || data.promptVersion !== input.promptVersion || data.configurationVersion !== input.configurationVersion || intakeBindingDigest(data.model) !== intakeBindingDigest(input.model)) return void 0;
390
+ const reference = data.instruction ? object(data.instruction) : void 0;
391
+ if (!!reference !== !!guidance || reference && (reference.id !== guidance?.id || reference.digest !== guidance?.digest)) return void 0;
319
392
  const offered = input.offered.find((entry) => entry.handler.id === data.handlerId && entry.handler.version === data.handlerVersion);
320
393
  if (!offered) return void 0;
321
394
  const args = object(data.args);
322
- for (const [field, reference] of Object.entries(offered.handler.references)) if (reference.kind === "candidate" && Object.hasOwn(args, field) && !offered.candidates.some((candidate2) => candidate2.id === args[field] && candidate2.model === reference.model)) return void 0;
323
- return {
324
- feedbackId: String(current.id),
325
- digest: String(stored),
326
- itemId: ctx.itemId,
327
- actionId: ctx.review.actionId,
328
- revision: ctx.review.revision,
329
- handlerId: ctx.handlerId,
330
- handlerVersion: ctx.handlerVersion,
331
- judgment: data.judgment,
332
- query: String(data.query),
333
- args,
334
- model: data.model,
335
- promptVersion: String(data.promptVersion),
336
- configurationVersion: String(data.configurationVersion)
337
- };
395
+ for (const [field, reference2] of Object.entries(offered.handler.references)) if (reference2.kind === "candidate" && Object.hasOwn(args, field) && !offered.candidates.some((candidate2) => candidate2.id === args[field] && candidate2.model === reference2.model)) return void 0;
396
+ return this.exampleOf(String(current.id), String(stored), data, ctx, guidance);
338
397
  }, executor, input.providers ?? [input.model.provider]);
339
398
  } catch {
340
399
  return;
341
400
  }
342
401
  }
402
+ /** Reviewer routing choice, reusable without a model suggestion; fails closed like `example`. */
403
+ async routingExample(row, input, executor, lineage = false) {
404
+ if (++this.exampleChecks > this.config.maxScan) return void 0;
405
+ try {
406
+ const data = object(row.data);
407
+ const { digest: stored, ...body } = data;
408
+ const itemId = String(row.item_id);
409
+ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
410
+ if (typeof stored !== "string" || intakeBindingDigest(body) !== stored) return void 0;
411
+ const chosen = data.choice === "handler";
412
+ if (chosen && (typeof data.actionId !== "string" || !uuid.test(data.actionId))) return void 0;
413
+ const offered = chosen ? input.offered.find((entry) => entry.handler.id === data.handlerId && entry.handler.version === data.handlerVersion) : void 0;
414
+ if (chosen && !offered) return void 0;
415
+ const args = chosen ? object(data.args) : {};
416
+ if (offered) {
417
+ for (const [field, reference] of Object.entries(offered.handler.references)) if (reference.kind === "candidate" && Object.hasOwn(args, field) && !offered.candidates.some((candidate) => candidate.id === args[field] && candidate.model === reference.model)) return void 0;
418
+ }
419
+ const providers = input.providers ?? [input.model.provider];
420
+ const scope = this.scope();
421
+ const current = async (db) => {
422
+ if (!await this.config.authorize({
423
+ db,
424
+ scope,
425
+ itemId,
426
+ operation: "retrieve"
427
+ })) throw new Error("Feedback unavailable");
428
+ const [attempt] = (await db.query("SELECT output_digest FROM intake_analysis_attempts WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=?", scope.tenantId, scope.confidentialScopeId, itemId, data.attemptId)).rows;
429
+ if (!attempt || attempt.output_digest !== data.attemptDigest) throw new Error("Feedback source unavailable");
430
+ const evidence = data.evidence;
431
+ if (!Array.isArray(evidence) || !evidence.length) throw new Error("Feedback source unavailable");
432
+ for (const frozen of evidence) {
433
+ const pinned = object(frozen);
434
+ const [row2] = (await db.query("SELECT content_hash FROM intake_evidence WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=? AND state='durable'", scope.tenantId, scope.confidentialScopeId, itemId, pinned.id)).rows;
435
+ if (!row2 || row2.content_hash !== pinned.hash) throw new Error("Feedback source unavailable");
436
+ }
437
+ if ((await this.rows(db, "supersedes_id=?", [row.id])).length) throw new Error("Feedback superseded");
438
+ };
439
+ const example = {
440
+ feedbackId: String(row.id),
441
+ digest: stored,
442
+ itemId,
443
+ actionId: chosen ? String(data.actionId) : "",
444
+ revision: chosen ? Number(data.revision) : 0,
445
+ handlerId: chosen ? String(data.handlerId) : "none",
446
+ handlerVersion: chosen ? String(data.handlerVersion) : "",
447
+ judgment: "correct",
448
+ query: String(data.query),
449
+ args,
450
+ kind: "reviewer_routing",
451
+ routing: {
452
+ choice: chosen ? "handler" : "none",
453
+ reason: typeof data.reason === "string" ? data.reason : ""
454
+ }
455
+ };
456
+ if (chosen) return await this.execution[feedbackActionTransaction](String(data.actionId), false, async (ctx) => {
457
+ if (ctx.itemId !== itemId || ctx.origin !== "reviewer-selected" || !lineage && !ctx.settled || data.revision !== ctx.review.revision || data.bindingHash !== ctx.review.bindingHash || data.attemptId !== ctx.attemptId || data.handlerId !== ctx.handlerId || data.handlerVersion !== ctx.handlerVersion || intakeBindingDigest(args) !== intakeBindingDigest(ctx.args)) return void 0;
458
+ await current(ctx.db);
459
+ return example;
460
+ }, executor, providers, void 0, !lineage);
461
+ for (const entry of input.offered) try {
462
+ return await this.execution[feedbackDiscoveryContext](executor, itemId, entry.handler.id, entry.handler.version, async (context) => {
463
+ if (providers.some((provider) => !context.policy.providers.includes(provider))) throw new Error("Feedback source provider unavailable");
464
+ await current(context.db);
465
+ return example;
466
+ }, async (context) => {
467
+ if (providers.some((provider) => !context.policy.providers.includes(provider))) throw new Error("Feedback source provider unavailable");
468
+ await current(context.db);
469
+ });
470
+ } catch {}
471
+ return;
472
+ } catch {
473
+ return;
474
+ }
475
+ }
343
476
  receivingContext(input, executor, work) {
344
477
  let limit = this.config.maxBytes;
345
478
  let bytes;
@@ -381,10 +514,10 @@ var IntakeFeedbackService = class {
381
514
  };
382
515
  await authorize("initial");
383
516
  const scope = this.scope();
384
- const rows = (await context.db.query("SELECT * FROM intake_feedback WHERE tenant_id=? AND confidential_scope_id=? AND kind='interpretation' ORDER BY id LIMIT ?", scope.tenantId, scope.confidentialScopeId, this.config.maxScan)).rows;
517
+ const rows = (await context.db.query("SELECT * FROM intake_feedback WHERE tenant_id=? AND confidential_scope_id=? AND kind IN ('interpretation','reviewer_routing') ORDER BY id LIMIT ?", scope.tenantId, scope.confidentialScopeId, this.config.maxScan)).rows;
385
518
  const ranked = [];
386
519
  for (const row of rows) {
387
- const example = await this.example(row, input, context.db);
520
+ const example = row.kind === "reviewer_routing" ? await this.routingExample(row, input, context.db) : await this.example(row, input, context.db);
388
521
  if (!example) continue;
389
522
  const score = feedbackSimilarity(input.query, example.query);
390
523
  if (score >= this.config.minimumSimilarity) ranked.push({
@@ -418,8 +551,8 @@ var IntakeFeedbackService = class {
418
551
  })) throw new Error("Feedback unavailable");
419
552
  const examples = [];
420
553
  for (const expected of selection.examples) {
421
- const [row] = await this.rows(context.db, "id=? AND kind=?", [expected.feedbackId, "interpretation"]);
422
- const current = row ? await this.example(row, input, context.db) : void 0;
554
+ const [row] = await this.rows(context.db, "id=? AND kind IN ('interpretation','reviewer_routing')", [expected.feedbackId]);
555
+ const current = !row ? void 0 : row.kind === "reviewer_routing" ? await this.routingExample(row, input, context.db, true) : await this.example(row, input, context.db);
423
556
  if (!current || current.digest !== expected.digest || feedbackSimilarity(input.query, current.query) < this.config.minimumSimilarity) throw new Error("Feedback eligibility changed");
424
557
  examples.push(current);
425
558
  }
@@ -436,27 +569,30 @@ var IntakeFeedbackService = class {
436
569
  };
437
570
  await this.receivingContext(input, executor, work);
438
571
  }
439
- async support(ctx, ids) {
572
+ async support(ctx, ids, lineage = false) {
440
573
  if (!Array.isArray(ids) || ids.length < 2 || ids.length > this.config.maxExamples || new Set(ids).size !== ids.length) throw new Error("Insufficient rule evidence");
441
574
  const provenance = await this.provenance(ctx), origins = /* @__PURE__ */ new Set(), result = [];
442
575
  for (const id of [...ids].sort()) {
443
576
  text(id);
444
- const [row] = await this.rows(ctx.db, "id=? AND kind=?", [id, "interpretation"]);
577
+ const [row] = await this.rows(ctx.db, "id=? AND kind IN ('interpretation','reviewer_routing')", [id]);
445
578
  if (!row) throw new Error("Rule evidence unavailable");
446
579
  const data = object(row.data);
580
+ const routing = row.kind === "reviewer_routing";
581
+ if (routing && (data.choice !== "handler" || typeof data.actionId !== "string")) throw new Error("Rule evidence unavailable");
447
582
  await this.execution[feedbackActionTransaction](String(data.actionId), false, async (source) => {
448
583
  await this.authorize(source, "retrieve");
449
584
  await this.provenance(source);
450
585
  if (origins.has(source.itemId)) throw new Error("Independent rule evidence required");
451
586
  origins.add(source.itemId);
452
587
  const { digest: stored, ...body } = data;
453
- if (intakeBindingDigest(body) !== stored || data.judgment !== "correct" || data.revision !== source.review.revision || data.bindingHash !== source.review.bindingHash || data.attemptId !== source.attemptId || data.handlerId !== source.handlerId || data.handlerVersion !== source.handlerVersion || data.handlerId !== ctx.handlerId || data.handlerVersion !== ctx.handlerVersion || intakeBindingDigest(data.args) !== intakeBindingDigest(source.args) || intakeBindingDigest(data.routing ?? { args: data.args }) !== intakeBindingDigest(this.routing(source)) || intakeBindingDigest(this.routing(source)) !== intakeBindingDigest(this.routing(ctx)) || data.promptVersion !== provenance.promptVersion || data.configurationVersion !== provenance.configurationVersion || intakeBindingDigest(data.model) !== intakeBindingDigest(provenance.model) || (await this.rows(ctx.db, "supersedes_id=?", [id])).length) throw new Error("Rule evidence unavailable");
588
+ const generationMatch = routing ? source.origin === "reviewer-selected" && (lineage || source.settled) : source.origin !== "reviewer-selected" && provenance.generation && data.judgment === "correct" && data.promptVersion === provenance.promptVersion && data.configurationVersion === provenance.configurationVersion && intakeBindingDigest(data.model) === intakeBindingDigest(provenance.model) && intakeBindingDigest(data.routing ?? { args: data.args }) === intakeBindingDigest(this.routing(source));
589
+ if (intakeBindingDigest(body) !== stored || !generationMatch || data.revision !== source.review.revision || data.bindingHash !== source.review.bindingHash || data.attemptId !== source.attemptId || data.handlerId !== source.handlerId || data.handlerVersion !== source.handlerVersion || data.handlerId !== ctx.handlerId || data.handlerVersion !== ctx.handlerVersion || intakeBindingDigest(data.args) !== intakeBindingDigest(source.args) || intakeBindingDigest(this.routing(source)) !== intakeBindingDigest(this.routing(ctx)) || (await this.rows(ctx.db, "supersedes_id=?", [id])).length) throw new Error("Rule evidence unavailable");
454
590
  result.push({
455
591
  id,
456
592
  digest: String(stored),
457
593
  query: String(data.query)
458
594
  });
459
- }, ctx.db);
595
+ }, ctx.db, void 0, void 0, !(lineage && routing));
460
596
  }
461
597
  return result;
462
598
  }
@@ -467,6 +603,13 @@ var IntakeFeedbackService = class {
467
603
  return this.execution[feedbackActionTransaction](input.actionId, true, async (ctx) => {
468
604
  this.checkBinding(input, ctx);
469
605
  await this.authorize(ctx, "suggest");
606
+ const key = `rule:${input.requestId}`;
607
+ const [stored] = await this.rows(ctx.db, "item_id=? AND request_key=?", [ctx.itemId, key]);
608
+ if (stored) {
609
+ if (object(stored.data).requestHash !== intakeBindingDigest(input)) throw new Error("Rule request conflict");
610
+ await this.rule(ctx, String(stored.id));
611
+ return this.ruleDTO(stored);
612
+ }
470
613
  const support = await this.support(ctx, input.supportingFeedbackIds);
471
614
  const terms = feedbackTerms(support[0].query).filter((term) => support.every((example) => feedbackTerms(example.query).includes(term)));
472
615
  if (!terms.length) throw new Error("No shared routing evidence");
@@ -498,11 +641,7 @@ var IntakeFeedbackService = class {
498
641
  reviewer: this.scope().actorId,
499
642
  requestHash: intakeBindingDigest(input)
500
643
  };
501
- const key = `rule:${input.requestId}`;
502
- let [row] = await this.rows(ctx.db, "item_id=? AND request_key=?", [ctx.itemId, key]);
503
- if (row) {
504
- if (object(row.data).requestHash !== body.requestHash) throw new Error("Rule request conflict");
505
- } else row = await this.insert(ctx, key, "rule_suggestion", {
644
+ const row = await this.insert(ctx, key, "rule_suggestion", {
506
645
  ...body,
507
646
  digest: intakeBindingDigest(body)
508
647
  });
@@ -539,7 +678,7 @@ var IntakeFeedbackService = class {
539
678
  ...rule.projection ? { projection: rule.projection } : {}
540
679
  }) !== intakeBindingDigest(this.routing(ctx))) throw new Error("Rule routing projection changed");
541
680
  const support = data.supportingFeedback;
542
- if (intakeBindingDigest((await this.support(ctx, support.map((entry) => entry.id))).map(({ id: id2, digest: digest2 }) => ({
681
+ if (intakeBindingDigest((await this.support(ctx, support.map((entry) => entry.id), true)).map(({ id: id2, digest: digest2 }) => ({
543
682
  id: id2,
544
683
  digest: digest2
545
684
  }))) !== intakeBindingDigest(support)) throw new Error("Rule evidence changed");
@@ -632,4 +771,4 @@ var IntakeFeedbackService = class {
632
771
  //#endregion
633
772
  export { IntakeFeedbackService as n, feedback_exports as r, FeedbackRetrievalDeniedError as t };
634
773
 
635
- //# sourceMappingURL=feedback-CJB900iG.js.map
774
+ //# sourceMappingURL=feedback-D3UTF8fm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-D3UTF8fm.js","names":["handler","reference","candidate","row","digest","id"],"sources":["../../src/feedback.ts"],"sourcesContent":["/** Initial optional-example denial; revocation after selection must remain fatal. */\nexport class FeedbackRetrievalDeniedError extends Error {\n constructor() {\n super('Feedback unavailable');\n this.name = 'FeedbackRetrievalDeniedError';\n }\n}\n\nimport { randomUUID } from 'node:crypto';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport {\n intakeBindingDigest as digest,\n IntakeExecutionService,\n} from './execution.js';\nimport type { FeedbackConfiguration } from './feedback-contracts.js';\nimport type {\n AdoptRuleInput,\n FeedbackBinding,\n FeedbackExample,\n FeedbackReceipt,\n FeedbackReferences,\n FeedbackSelection,\n ObserveFeedbackInput,\n ReadRuleInput,\n RecordFeedbackInput,\n RoutingRule,\n RuleAdoption,\n RuleSuggestion,\n SuggestRuleInput,\n} from './feedback-dto.js';\nimport {\n type FeedbackActionContext,\n feedbackActionTransaction,\n feedbackDiscoveryContext,\n} from './feedback-internal.js';\nimport type { GenerationOutput } from './proposal-dto.js';\nimport { reviewerInstructionView } from './reviewer-instruction.js';\nimport type { IngestionOptions } from './server.js';\n\ntype Row = Record<string, unknown>;\nfunction object(value: unknown): Row {\n const result = typeof value === 'string' ? JSON.parse(value) : value;\n if (!result || typeof result !== 'object' || Array.isArray(result))\n throw new Error('Feedback unavailable');\n return result as Row;\n}\nfunction text(value: unknown, max = 512): asserts value is string {\n if (typeof value !== 'string' || !value.trim() || value.length > max)\n throw new Error('Invalid feedback');\n}\nfunction resultData(data: Row): Row {\n return {\n status: data.status,\n provider: data.provider,\n model: data.model,\n version: data.version,\n output: data.output,\n usage: data.usage,\n ...(Object.hasOwn(data, 'error') ? { error: data.error } : {}),\n ...(Object.hasOwn(data, 'confidence')\n ? { confidence: data.confidence }\n : {}),\n };\n}\nexport function feedbackTerms(value: string): string[] {\n return [\n ...new Set(value.toLowerCase().match(/[\\p{L}\\p{N}]+/gu) ?? []),\n ].sort();\n}\nexport function feedbackSimilarity(left: string, right: string): number {\n const a = new Set(feedbackTerms(left)),\n b = new Set(feedbackTerms(right));\n const union = new Set([...a, ...b]);\n return union.size\n ? [...a].filter((value) => b.has(value)).length / union.size\n : 0;\n}\nexport interface RetrieveFeedbackInput {\n itemId: string;\n query: string;\n offered: GenerationOutput['offered'];\n promptVersion: string;\n configurationVersion: string;\n model: { provider: string; model: string; version: string };\n providers?: string[];\n}\n/** Owning ingestion ledger. Generic LearningMemory's success/ancestor fallback semantics are deliberately not used. */\nexport class IntakeFeedbackService {\n private readonly execution: IntakeExecutionService;\n private readonly config: FeedbackConfiguration;\n private readonly lineage = new Set<string>();\n private exampleChecks = 0;\n constructor(\n private readonly options: IngestionOptions,\n execution?: IntakeExecutionService,\n ) {\n if (!options.execution || !options.feedback)\n throw new Error('Feedback not configured');\n this.config = { ...options.feedback };\n this.execution =\n execution ?? new IntakeExecutionService(options, options.execution);\n text(this.config.version);\n for (const [value, max] of [\n [this.config.maxExamples, 20],\n [this.config.maxScan, 1000],\n [this.config.maxBytes, 1000000],\n ])\n if (!Number.isSafeInteger(value) || value < 1 || value > max)\n throw new Error('Invalid feedback limits');\n if (\n !Number.isFinite(this.config.minimumSimilarity) ||\n this.config.minimumSimilarity < 0.2 ||\n this.config.minimumSimilarity > 1\n )\n throw new Error('Invalid feedback similarity');\n }\n private configurationDigest() {\n const { version, maxExamples, maxScan, maxBytes, minimumSimilarity } =\n this.config;\n return digest({\n version,\n maxExamples,\n maxScan,\n maxBytes,\n minimumSimilarity,\n });\n }\n private routing(\n ctx: FeedbackActionContext,\n ): Pick<RoutingRule, 'args' | 'projection'> {\n // Read live trusted configuration again at publication/replay boundaries.\n const declarations = this.options.feedback?.routing;\n if (declarations === undefined) return { args: ctx.args };\n if (!Array.isArray(declarations))\n throw new Error('Invalid routing projection');\n const seen = new Set<string>();\n for (const declaration of declarations) {\n const entry = object(declaration);\n text(entry.handlerId);\n text(entry.handlerVersion);\n text(entry.version);\n const key = digest([entry.handlerId, entry.handlerVersion]);\n const handler = this.options.execution!.handlers.find(\n (handler) =>\n handler.id === entry.handlerId &&\n handler.version === entry.handlerVersion,\n );\n if (!handler || seen.has(key))\n throw new Error('Invalid routing projection');\n seen.add(key);\n const properties = object(handler.argsSchema.properties);\n if (\n !Array.isArray(entry.fields) ||\n !entry.fields.length ||\n entry.fields.length > 64 ||\n new Set(entry.fields).size !== entry.fields.length\n )\n throw new Error('Invalid routing projection');\n for (const field of entry.fields) {\n text(field);\n if (\n ['__proto__', 'prototype', 'constructor'].includes(field) ||\n !Object.hasOwn(properties, field)\n )\n throw new Error('Invalid routing projection');\n }\n }\n const selected = declarations.find(\n (entry) =>\n entry.handlerId === ctx.handlerId &&\n entry.handlerVersion === ctx.handlerVersion,\n );\n if (!selected) return { args: ctx.args };\n const fields = [...selected.fields].sort();\n const args = Object.fromEntries(\n fields\n .filter((field) => Object.hasOwn(ctx.args, field))\n .map((field) => [field, structuredClone(ctx.args[field])]),\n );\n if (!Object.keys(args).length)\n throw new Error('Routing values unavailable');\n return { args, projection: { version: selected.version, fields } };\n }\n private scope() {\n return this.options.scope;\n }\n private async rows(\n db: DatabaseInterface,\n where: string,\n params: unknown[] = [],\n ): Promise<Row[]> {\n const scope = this.scope();\n return (\n await db.query(\n `SELECT * FROM intake_feedback WHERE tenant_id=? AND confidential_scope_id=? AND ${where}`,\n scope.tenantId,\n scope.confidentialScopeId,\n ...params,\n )\n ).rows;\n }\n private async authorize(\n ctx: FeedbackActionContext,\n operation: 'capture' | 'retrieve' | 'suggest' | 'adopt',\n ) {\n if (\n !(await this.config.authorize({\n db: ctx.db,\n scope: this.scope(),\n itemId: ctx.itemId,\n operation,\n }))\n )\n throw new Error('Feedback unavailable');\n }\n private checkBinding(input: FeedbackBinding, ctx: FeedbackActionContext) {\n if (\n input.itemId !== ctx.itemId ||\n input.actionId !== ctx.review.actionId ||\n input.expectedRevision !== ctx.review.revision ||\n input.expectedReviewVersion !== ctx.review.reviewVersion ||\n input.bindingHash !== ctx.review.bindingHash\n )\n throw new Error('Stale feedback binding');\n }\n private async insert(\n ctx: FeedbackActionContext,\n key: string,\n kind: string,\n data: Row,\n supersedesId: string | null = null,\n ): Promise<Row> {\n const serialized = JSON.stringify(data);\n if (\n Buffer.byteLength(serialized) >\n Math.min(this.config.maxBytes, ctx.context.policy.maxBytes)\n )\n throw new Error('Feedback limit');\n const scope = this.scope(),\n now = (this.options.now?.() ?? new Date()).toISOString();\n const row = {\n id: randomUUID(),\n slug: randomUUID(),\n context: '',\n created_at: now,\n updated_at: now,\n tenant_id: scope.tenantId,\n confidential_scope_id: scope.confidentialScopeId,\n item_id: ctx.itemId,\n request_key: key,\n supersedes_id: supersedesId,\n kind,\n data: serialized,\n };\n return (\n await ctx.db.query(\n `INSERT INTO intake_feedback (${Object.keys(row).join(',')}) VALUES (${Object.keys(\n row,\n )\n .map(() => '?')\n .join(',')}) RETURNING *`,\n ...Object.values(row),\n )\n ).rows[0];\n }\n private receipt(row: Row): FeedbackReceipt {\n return {\n id: String(row.id),\n digest: String(object(row.data).digest),\n kind: row.kind as FeedbackReceipt['kind'],\n };\n }\n /** Source text, pin and (when a model suggestion exists) generation versions. */\n private async provenance(ctx: FeedbackActionContext) {\n const output = object(ctx.result.output);\n // A reviewer-selected action on an extraction-only item carries no generation.\n const generation = output.proposals ? object(output.proposals) : undefined;\n const pin = generation\n ? object(generation.source)\n : { attemptId: ctx.attemptId, outputDigest: digest(ctx.result) };\n const provenance = generation ? object(generation.provenance) : undefined;\n if (generation && provenance?.feedback) {\n const inherited = object(provenance.feedback);\n const key = ctx.attemptId;\n if (this.lineage.has(key) || this.lineage.size >= 8)\n throw new Error('Feedback lineage unavailable');\n this.lineage.add(key);\n try {\n await this.assertSelection(\n {\n itemId: ctx.itemId,\n query: String(inherited.query),\n offered: generation.offered as GenerationOutput['offered'],\n promptVersion: String(provenance.promptVersion),\n configurationVersion: String(provenance.configurationVersion),\n model: provenance.generative as RetrieveFeedbackInput['model'],\n providers: [\n String(object(provenance.generative).provider),\n ...(object(provenance.decision).configured\n ? [String(object(provenance.decision).provider)]\n : []),\n ],\n },\n inherited.selection as unknown as FeedbackReferences,\n ctx.db,\n );\n } finally {\n this.lineage.delete(key);\n }\n }\n const scope = this.scope();\n const [source] = (\n await ctx.db.query(\n 'SELECT data,output_digest FROM intake_analysis_attempts WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=?',\n scope.tenantId,\n scope.confidentialScopeId,\n ctx.itemId,\n pin.attemptId,\n )\n ).rows;\n if (!source || source.output_digest !== pin.outputDigest)\n throw new Error('Feedback source unavailable');\n const sourceResult = resultData(object(source.data));\n if (digest(sourceResult) !== pin.outputDigest)\n throw new Error('Feedback source integrity');\n const results = object(sourceResult.output).results;\n if (!Array.isArray(results))\n throw new Error('Feedback extraction unavailable');\n const query = results\n .flatMap((entry) => {\n const segments = object(entry).segments;\n return Array.isArray(segments)\n ? segments.map((segment) => String(object(segment).text ?? ''))\n : [];\n })\n .join('\\n')\n .slice(0, 4096);\n if (!provenance)\n return {\n generation: false as const,\n query,\n attemptId: ctx.attemptId,\n evidence: object(ctx.analysis).inputs,\n source: pin,\n };\n const model = object(provenance.generative);\n for (const field of ['provider', 'model', 'version']) text(model[field]);\n text(provenance.promptVersion);\n text(provenance.configurationVersion);\n // A judgment made under reviewer guidance references that guidance by id\n // and digest only; retrieval joins the text from the source's own record,\n // so instruction text never counts against the write budget.\n const instruction = this.instructionFor(ctx);\n return {\n generation: true as const,\n query,\n ...(instruction\n ? { instruction: { id: instruction.id, digest: instruction.digest } }\n : {}),\n model: {\n provider: String(model.provider),\n model: String(model.model),\n version: String(model.version),\n },\n promptVersion: String(provenance.promptVersion),\n configurationVersion: String(provenance.configurationVersion),\n attemptId: ctx.attemptId,\n evidence: object(ctx.analysis).inputs,\n source: pin,\n };\n }\n /** The example exactly as retrieval returns it; shared by the write-time size check. */\n private exampleOf(\n id: string,\n stored: string,\n data: Row,\n ctx: FeedbackActionContext,\n guidance?: { id: string; digest: string; text: string },\n ): FeedbackExample {\n return {\n feedbackId: id,\n digest: stored,\n itemId: ctx.itemId,\n actionId: ctx.review.actionId,\n revision: ctx.review.revision,\n handlerId: ctx.handlerId,\n handlerVersion: ctx.handlerVersion,\n judgment: data.judgment as 'correct' | 'incorrect',\n query: String(data.query),\n args: object(data.args),\n model: data.model as FeedbackExample['model'],\n promptVersion: String(data.promptVersion),\n configurationVersion: String(data.configurationVersion),\n ...(guidance ? { instruction: guidance } : {}),\n };\n }\n /**\n * The verified reviewer instruction the action's generation ran under: the\n * authenticated extraction record must match the generation's provenance.\n */\n private instructionFor(\n ctx: FeedbackActionContext,\n ): { id: string; digest: string; text: string } | undefined {\n const provenance = object(\n object(object(ctx.result.output).proposals).provenance,\n );\n const instructionRecord = object(\n object(ctx.analysis).configuration,\n ).reviewerInstruction;\n const recorded = provenance.reviewerInstruction\n ? object(provenance.reviewerInstruction)\n : undefined;\n if (!instructionRecord && !recorded) return undefined;\n const view = reviewerInstructionView(instructionRecord);\n if (!recorded || recorded.id !== view.id || recorded.digest !== view.digest)\n throw new Error('Feedback instruction integrity');\n return { id: view.id, digest: view.digest, text: view.text };\n }\n /** Internal saved-action gate; the execution owner supplies its transaction. */\n async assertActionLineage(\n actionId: string,\n db: DatabaseInterface,\n proposalId: string,\n ): Promise<void> {\n await this.execution[feedbackActionTransaction](\n actionId,\n false,\n async (ctx) => {\n await this.provenance(ctx);\n },\n db,\n undefined,\n proposalId,\n );\n }\n async record(input: RecordFeedbackInput): Promise<FeedbackReceipt> {\n digest(input);\n text(input.requestId);\n if (\n !['correct', 'incorrect'].includes(input.judgment) ||\n (input.comment !== undefined &&\n (typeof input.comment !== 'string' || input.comment.length > 4000))\n )\n throw new Error('Invalid feedback');\n const frozen = structuredClone(input);\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n await this.authorize(ctx, 'capture');\n this.checkBinding(frozen, ctx);\n const requestHash = digest(frozen),\n key = `judgment:${frozen.requestId}`;\n const [replay] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (replay) {\n const data = object(replay.data);\n if (\n data.requestHash !== requestHash ||\n data.reviewer !== this.scope().actorId\n )\n throw new Error('Feedback request conflict');\n return this.receipt(replay);\n }\n if (frozen.supersedesId) {\n const [old] = await this.rows(\n ctx.db,\n 'item_id=? AND id=? AND kind=?',\n [ctx.itemId, frozen.supersedesId, 'interpretation'],\n );\n if (\n !old ||\n object(old.data).actionId !== frozen.actionId ||\n (await this.rows(ctx.db, 'supersedes_id=?', [old.id])).length\n )\n throw new Error('Feedback supersession conflict');\n }\n const { generation, ...provenance } = await this.provenance(ctx),\n routing = this.routing(ctx);\n // Interpretation judgments label a model suggestion; reviewer-selected\n // actions are captured as routing choices by their owning operation,\n // even when the item also carries a (different) model generation.\n if (!generation || ctx.origin === 'reviewer-selected')\n throw new Error('Feedback requires a model suggestion');\n const body = {\n version: 1,\n requestHash,\n reviewer: this.scope().actorId,\n actionId: ctx.review.actionId,\n revision: ctx.review.revision,\n reviewVersion: ctx.review.reviewVersion,\n bindingHash: ctx.review.bindingHash,\n handlerId: ctx.handlerId,\n handlerVersion: ctx.handlerVersion,\n args: ctx.args,\n ...(routing.projection ? { routing } : {}),\n judgment: frozen.judgment,\n comment: frozen.comment ?? '',\n ...provenance,\n };\n const row = await this.insert(\n ctx,\n key,\n 'interpretation',\n { ...body, digest: digest(body) },\n frozen.supersedesId ?? null,\n );\n // The judgment stores only the instruction reference, but retrieval\n // joins its text. Refuse here, inside the transaction, if that single\n // joined example could never fit the handler's read budget; otherwise\n // every later retrieval ranking it would fail closed scope-wide.\n const guidance = this.instructionFor(ctx);\n if (guidance) {\n const data = object(row.data);\n const selection = {\n version: this.config.version,\n configurationDigest: this.configurationDigest(),\n examples: [\n this.exampleOf(\n String(row.id),\n String(data.digest),\n data,\n ctx,\n guidance,\n ),\n ],\n };\n if (\n Buffer.byteLength(JSON.stringify(selection)) >\n Math.min(this.config.maxBytes, ctx.context.policy.maxBytes)\n )\n throw new Error('Feedback instruction exceeds retrieval budget');\n }\n await this.authorize(ctx, 'capture');\n if (digest(routing) !== digest(this.routing(ctx)))\n throw new Error('Routing projection changed');\n return this.receipt(row);\n },\n );\n }\n /** Consume a durable owner event idempotently. Never derive correctness from these signals. */\n async observe(input: ObserveFeedbackInput): Promise<FeedbackReceipt> {\n digest(input);\n text(input.eventId);\n if (!['action_decision', 'downstream_outcome'].includes(input.kind))\n throw new Error('Invalid feedback kind');\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n await this.authorize(ctx, 'capture');\n this.checkBinding(input, ctx);\n const scope = this.scope();\n const table =\n input.kind === 'action_decision'\n ? 'intake_review_decisions'\n : 'intake_executions';\n const [event] = (\n await ctx.db.query(\n `SELECT * FROM ${table} WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND action_id=? AND id=?`,\n scope.tenantId,\n scope.confidentialScopeId,\n ctx.itemId,\n input.actionId,\n input.eventId,\n )\n ).rows;\n if (!event || event.binding_hash !== ctx.review.bindingHash)\n throw new Error('Feedback event unavailable');\n const state =\n input.kind === 'action_decision' ? event.decision : event.state;\n if (\n input.kind === 'downstream_outcome' &&\n !['succeeded', 'failed', 'outcome_unknown'].includes(String(state))\n )\n throw new Error('Outcome is not terminal');\n const body = {\n version: 1,\n eventId: input.eventId,\n actionId: input.actionId,\n revision: ctx.review.revision,\n reviewer:\n input.kind === 'action_decision'\n ? object(event.data).reviewer\n : null,\n decisionMode:\n input.kind === 'action_decision'\n ? (object(event.data).mode ?? 'review')\n : null,\n selfDecision:\n input.kind === 'action_decision' &&\n object(event.data).selfDecision === true,\n observedBy: this.scope().actorId,\n principalId: object(event.data).principalId ?? null,\n signal: state,\n provenance: await this.provenance(ctx),\n };\n const key = `event:${input.kind}:${input.eventId}:${String(state)}`;\n const [existing] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (existing) return this.receipt(existing);\n const row = await this.insert(ctx, key, input.kind, {\n ...body,\n digest: digest(body),\n });\n await this.authorize(ctx, 'capture');\n return this.receipt(row);\n },\n );\n }\n private async example(\n row: Row,\n input: RetrieveFeedbackInput,\n executor?: DatabaseInterface,\n ): Promise<FeedbackExample | undefined> {\n if (++this.exampleChecks > this.config.maxScan) return undefined;\n try {\n const candidate = object(row.data);\n // Retention deliberately redacts ledger payloads. Reject tombstones before\n // issuing a UUID query: catching a PostgreSQL cast error cannot repair its transaction.\n if (\n typeof candidate.actionId !== 'string' ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(\n candidate.actionId,\n )\n )\n return undefined;\n return await this.execution[feedbackActionTransaction](\n candidate.actionId,\n false,\n async (ctx) => {\n await this.authorize(ctx, 'retrieve');\n await this.provenance(ctx);\n const guidance = this.instructionFor(ctx);\n const [current] = await this.rows(\n ctx.db,\n 'id=? AND kind=? AND NOT EXISTS (SELECT 1 FROM intake_feedback successor WHERE successor.tenant_id=intake_feedback.tenant_id AND successor.confidential_scope_id=intake_feedback.confidential_scope_id AND successor.supersedes_id=intake_feedback.id)',\n [row.id, 'interpretation'],\n );\n if (!current) return undefined;\n const data = object(current.data);\n const { digest: stored, ...body } = data;\n if (digest(body) !== stored) throw new Error('Feedback integrity');\n if (\n // A reviewer-selected action never labels a model suggestion. A\n // disposition says nothing about whether the suggestion was right.\n ctx.origin === 'reviewer-selected' ||\n data.revision !== ctx.review.revision ||\n data.bindingHash !== ctx.review.bindingHash ||\n data.attemptId !== ctx.attemptId ||\n data.promptVersion !== input.promptVersion ||\n data.configurationVersion !== input.configurationVersion ||\n digest(data.model) !== digest(input.model)\n )\n return undefined;\n // The stored reference must still name the source's verified record.\n const reference = data.instruction\n ? object(data.instruction)\n : undefined;\n if (\n !!reference !== !!guidance ||\n (reference &&\n (reference.id !== guidance?.id ||\n reference.digest !== guidance?.digest))\n )\n return undefined;\n const offered = input.offered.find(\n (entry) =>\n entry.handler.id === data.handlerId &&\n entry.handler.version === data.handlerVersion,\n );\n if (!offered) return undefined;\n const args = object(data.args);\n for (const [field, reference] of Object.entries(\n offered.handler.references,\n )) {\n if (\n reference.kind === 'candidate' &&\n Object.hasOwn(args, field) &&\n !offered.candidates.some(\n (candidate) =>\n candidate.id === args[field] &&\n candidate.model === reference.model,\n )\n )\n return undefined;\n }\n return this.exampleOf(\n String(current.id),\n String(stored),\n data,\n ctx,\n guidance,\n );\n },\n executor,\n input.providers ?? [input.model.provider],\n );\n } catch {\n return undefined;\n }\n }\n /** Reviewer routing choice, reusable without a model suggestion; fails closed like `example`. */\n private async routingExample(\n row: Row,\n input: RetrieveFeedbackInput,\n executor?: DatabaseInterface,\n /** Re-checking an earlier selection: only integrity and revocation count. */\n lineage = false,\n ): Promise<FeedbackExample | undefined> {\n if (++this.exampleChecks > this.config.maxScan) return undefined;\n try {\n const data = object(row.data);\n const { digest: stored, ...body } = data;\n const itemId = String(row.item_id);\n const uuid =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n // Redacted tombstones carry no digest; reject before any UUID query.\n if (typeof stored !== 'string' || digest(body) !== stored)\n return undefined;\n const chosen = data.choice === 'handler';\n if (\n chosen &&\n (typeof data.actionId !== 'string' || !uuid.test(data.actionId))\n )\n return undefined;\n const offered = chosen\n ? input.offered.find(\n (entry) =>\n entry.handler.id === data.handlerId &&\n entry.handler.version === data.handlerVersion,\n )\n : undefined;\n if (chosen && !offered) return undefined;\n const args = chosen ? object(data.args) : {};\n if (offered)\n for (const [field, reference] of Object.entries(\n offered.handler.references,\n ))\n if (\n reference.kind === 'candidate' &&\n Object.hasOwn(args, field) &&\n !offered.candidates.some(\n (candidate) =>\n candidate.id === args[field] &&\n candidate.model === reference.model,\n )\n )\n return undefined;\n const providers = input.providers ?? [input.model.provider];\n const scope = this.scope();\n const current = async (db: DatabaseInterface) => {\n if (\n !(await this.config.authorize({\n db,\n scope,\n itemId,\n operation: 'retrieve',\n }))\n )\n throw new Error('Feedback unavailable');\n const [attempt] = (\n await db.query(\n 'SELECT output_digest FROM intake_analysis_attempts WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=?',\n scope.tenantId,\n scope.confidentialScopeId,\n itemId,\n data.attemptId,\n )\n ).rows;\n if (!attempt || attempt.output_digest !== data.attemptDigest)\n throw new Error('Feedback source unavailable');\n const evidence = data.evidence;\n if (!Array.isArray(evidence) || !evidence.length)\n throw new Error('Feedback source unavailable');\n for (const frozen of evidence) {\n const pinned = object(frozen);\n const [row] = (\n await db.query(\n \"SELECT content_hash FROM intake_evidence WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=? AND state='durable'\",\n scope.tenantId,\n scope.confidentialScopeId,\n itemId,\n pinned.id,\n )\n ).rows;\n if (!row || row.content_hash !== pinned.hash)\n throw new Error('Feedback source unavailable');\n }\n if ((await this.rows(db, 'supersedes_id=?', [row.id])).length)\n throw new Error('Feedback superseded');\n };\n const example: FeedbackExample = {\n feedbackId: String(row.id),\n digest: stored,\n itemId,\n actionId: chosen ? String(data.actionId) : '',\n revision: chosen ? Number(data.revision) : 0,\n handlerId: chosen ? String(data.handlerId) : 'none',\n handlerVersion: chosen ? String(data.handlerVersion) : '',\n judgment: 'correct',\n query: String(data.query),\n args,\n kind: 'reviewer_routing',\n routing: {\n choice: chosen ? 'handler' : 'none',\n reason: typeof data.reason === 'string' ? data.reason : '',\n },\n };\n if (chosen)\n // The action binding, handler access, targets, providers and retention\n // are rechecked by the owning execution boundary.\n return await this.execution[feedbackActionTransaction](\n String(data.actionId),\n false,\n async (ctx) => {\n // Only an approved (or applied) reviewer choice is a routing example;\n // a later correction changes the revision and retires it until the\n // new revision is approved and captured again.\n if (\n ctx.itemId !== itemId ||\n ctx.origin !== 'reviewer-selected' ||\n // Settledness gates selection only; a later resolution, lapse or\n // outcome change must not revoke an example already used.\n (!lineage && !ctx.settled) ||\n data.revision !== ctx.review.revision ||\n data.bindingHash !== ctx.review.bindingHash ||\n data.attemptId !== ctx.attemptId ||\n data.handlerId !== ctx.handlerId ||\n data.handlerVersion !== ctx.handlerVersion ||\n digest(args) !== digest(ctx.args)\n )\n return undefined;\n await current(ctx.db);\n return example;\n },\n executor,\n providers,\n undefined,\n !lineage,\n );\n // No handler was chosen: the source item must still be readable under a\n // currently offered handler, with the generation recipients allowed.\n for (const entry of input.offered) {\n try {\n return await this.execution[feedbackDiscoveryContext](\n executor,\n itemId,\n entry.handler.id,\n entry.handler.version,\n async (context) => {\n if (\n providers.some(\n (provider) => !context.policy.providers.includes(provider),\n )\n )\n throw new Error('Feedback source provider unavailable');\n await current(context.db);\n return example;\n },\n async (context) => {\n if (\n providers.some(\n (provider) => !context.policy.providers.includes(provider),\n )\n )\n throw new Error('Feedback source provider unavailable');\n await current(context.db);\n },\n );\n } catch {\n /* try the next currently offered handler; none means excluded */\n }\n }\n return undefined;\n } catch {\n return undefined;\n }\n }\n private receivingContext(\n input: RetrieveFeedbackInput,\n executor: DatabaseInterface | undefined,\n work: (\n context: import('./execution-contracts.js').HandlerContext,\n ) => Promise<FeedbackSelection>,\n ): Promise<FeedbackSelection> {\n let limit = this.config.maxBytes;\n let bytes: number | undefined;\n const validate = async (\n context: import('./execution-contracts.js').HandlerContext,\n ) => {\n if (\n (input.providers ?? [input.model.provider]).some(\n (provider) => !context.policy.providers.includes(provider),\n )\n )\n throw new Error('Feedback recipient unavailable');\n limit = Math.min(limit, context.policy.maxBytes);\n if (bytes !== undefined && bytes > limit)\n throw new Error('Feedback limit');\n };\n const visit = (\n index: number,\n db: DatabaseInterface | undefined,\n ): Promise<FeedbackSelection> => {\n const entry = input.offered[index];\n return this.execution[feedbackDiscoveryContext](\n db,\n input.itemId,\n entry.handler.id,\n entry.handler.version,\n async (context) => {\n await validate(context);\n const selection =\n index + 1 < input.offered.length\n ? await visit(index + 1, context.db)\n : await work(context);\n bytes = Buffer.byteLength(JSON.stringify(selection));\n if (bytes > limit) throw new Error('Feedback limit');\n return selection;\n },\n validate,\n );\n };\n return visit(0, executor);\n }\n async retrieve(\n input: RetrieveFeedbackInput,\n executor?: DatabaseInterface,\n ): Promise<FeedbackSelection> {\n text(input.query, 4096);\n const offered = input.offered[0];\n if (!offered)\n return {\n version: this.config.version,\n configurationDigest: this.configurationDigest(),\n examples: [],\n };\n const work = async (\n context: import('./execution-contracts.js').HandlerContext,\n ) => {\n const authorize = async (phase: 'initial' | 'final') => {\n if (\n !(await this.config.authorize({\n db: context.db,\n scope: this.scope(),\n itemId: input.itemId,\n operation: 'retrieve',\n }))\n ) {\n if (phase === 'initial') throw new FeedbackRetrievalDeniedError();\n throw new Error('Feedback unavailable');\n }\n };\n await authorize('initial');\n const scope = this.scope();\n const rows = (\n await context.db.query(\n \"SELECT * FROM intake_feedback WHERE tenant_id=? AND confidential_scope_id=? AND kind IN ('interpretation','reviewer_routing') ORDER BY id LIMIT ?\",\n scope.tenantId,\n scope.confidentialScopeId,\n this.config.maxScan,\n )\n ).rows;\n const ranked: Array<{ example: FeedbackExample; score: number }> = [];\n for (const row of rows) {\n const example =\n row.kind === 'reviewer_routing'\n ? await this.routingExample(row, input, context.db)\n : await this.example(row, input, context.db);\n if (!example) continue;\n const score = feedbackSimilarity(input.query, example.query);\n if (score >= this.config.minimumSimilarity)\n ranked.push({ example, score });\n }\n ranked.sort(\n (a, b) =>\n b.score - a.score ||\n a.example.feedbackId.localeCompare(b.example.feedbackId),\n );\n const selection = {\n version: this.config.version,\n configurationDigest: this.configurationDigest(),\n examples: ranked\n .slice(0, this.config.maxExamples)\n .map((entry) => entry.example),\n };\n await authorize('final');\n return selection;\n };\n return this.receivingContext(input, executor, work);\n }\n async assertSelection(\n input: RetrieveFeedbackInput,\n selection: FeedbackReferences,\n executor?: DatabaseInterface,\n ): Promise<void> {\n if (\n selection.version !== this.config.version ||\n selection.configurationDigest !== this.configurationDigest() ||\n !Array.isArray(selection.examples) ||\n selection.examples.length > this.config.maxExamples ||\n new Set(selection.examples.map((example) => example.feedbackId)).size !==\n selection.examples.length ||\n Buffer.byteLength(JSON.stringify(selection)) > this.config.maxBytes\n )\n throw new Error('Feedback eligibility changed');\n const offered = input.offered[0];\n if (!offered) {\n if (selection.examples.length)\n throw new Error('Feedback eligibility changed');\n return;\n }\n const work = async (\n context: import('./execution-contracts.js').HandlerContext,\n ) => {\n if (\n !(await this.config.authorize({\n db: context.db,\n scope: this.scope(),\n itemId: input.itemId,\n operation: 'retrieve',\n }))\n )\n throw new Error('Feedback unavailable');\n const examples: FeedbackExample[] = [];\n for (const expected of selection.examples) {\n const [row] = await this.rows(\n context.db,\n \"id=? AND kind IN ('interpretation','reviewer_routing')\",\n [expected.feedbackId],\n );\n const current = !row\n ? undefined\n : row.kind === 'reviewer_routing'\n ? await this.routingExample(row, input, context.db, true)\n : await this.example(row, input, context.db);\n if (\n !current ||\n current.digest !== expected.digest ||\n feedbackSimilarity(input.query, current.query) <\n this.config.minimumSimilarity\n )\n throw new Error('Feedback eligibility changed');\n examples.push(current);\n }\n if (\n !(await this.config.authorize({\n db: context.db,\n scope: this.scope(),\n itemId: input.itemId,\n operation: 'retrieve',\n }))\n )\n throw new Error('Feedback unavailable');\n return { ...selection, examples };\n };\n await this.receivingContext(input, executor, work);\n }\n private async support(\n ctx: FeedbackActionContext,\n ids: string[],\n /** Re-checking stored support (read/adopt): only integrity and revocation count. */\n lineage = false,\n ): Promise<Array<{ id: string; digest: string; query: string }>> {\n if (\n !Array.isArray(ids) ||\n ids.length < 2 ||\n ids.length > this.config.maxExamples ||\n new Set(ids).size !== ids.length\n )\n throw new Error('Insufficient rule evidence');\n const provenance = await this.provenance(ctx),\n origins = new Set<string>(),\n result: Array<{ id: string; digest: string; query: string }> = [];\n for (const id of [...ids].sort()) {\n text(id);\n const [row] = await this.rows(\n ctx.db,\n \"id=? AND kind IN ('interpretation','reviewer_routing')\",\n [id],\n );\n if (!row) throw new Error('Rule evidence unavailable');\n const data = object(row.data);\n // A reviewer routing choice supports a rule only when it chose this handler.\n const routing = row.kind === 'reviewer_routing';\n if (\n routing &&\n (data.choice !== 'handler' || typeof data.actionId !== 'string')\n )\n throw new Error('Rule evidence unavailable');\n await this.execution[feedbackActionTransaction](\n String(data.actionId),\n false,\n async (source) => {\n await this.authorize(source, 'retrieve');\n await this.provenance(source);\n if (origins.has(source.itemId))\n throw new Error('Independent rule evidence required');\n origins.add(source.itemId);\n const { digest: stored, ...body } = data;\n const generationMatch = routing\n ? source.origin === 'reviewer-selected' &&\n (lineage || source.settled)\n : source.origin !== 'reviewer-selected' &&\n provenance.generation &&\n data.judgment === 'correct' &&\n data.promptVersion === provenance.promptVersion &&\n data.configurationVersion === provenance.configurationVersion &&\n digest(data.model) === digest(provenance.model) &&\n digest(data.routing ?? { args: data.args }) ===\n digest(this.routing(source));\n if (\n digest(body) !== stored ||\n !generationMatch ||\n data.revision !== source.review.revision ||\n data.bindingHash !== source.review.bindingHash ||\n data.attemptId !== source.attemptId ||\n data.handlerId !== source.handlerId ||\n data.handlerVersion !== source.handlerVersion ||\n data.handlerId !== ctx.handlerId ||\n data.handlerVersion !== ctx.handlerVersion ||\n digest(data.args) !== digest(source.args) ||\n digest(this.routing(source)) !== digest(this.routing(ctx)) ||\n (await this.rows(ctx.db, 'supersedes_id=?', [id])).length\n )\n throw new Error('Rule evidence unavailable');\n result.push({\n id,\n digest: String(stored),\n query: String(data.query),\n });\n },\n ctx.db,\n undefined,\n undefined,\n !(lineage && routing),\n );\n }\n return result;\n }\n async suggest(input: SuggestRuleInput): Promise<RuleSuggestion> {\n digest(input);\n text(input.requestId);\n if (!this.config.policy) throw new Error('Rule policy owner unavailable');\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n this.checkBinding(input, ctx);\n await this.authorize(ctx, 'suggest');\n const key = `rule:${input.requestId}`;\n // A replay returns the stored suggestion; its support is re-checked\n // as lineage (integrity and revocation), never re-selected.\n const [stored] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (stored) {\n if (object(stored.data).requestHash !== digest(input))\n throw new Error('Rule request conflict');\n await this.rule(ctx, String(stored.id));\n return this.ruleDTO(stored);\n }\n const support = await this.support(ctx, input.supportingFeedbackIds);\n const terms = feedbackTerms(support[0].query).filter((term) =>\n support.every((example) =>\n feedbackTerms(example.query).includes(term),\n ),\n );\n if (!terms.length) throw new Error('No shared routing evidence');\n const rule: RoutingRule = {\n handlerId: ctx.handlerId,\n handlerVersion: ctx.handlerVersion,\n matchTerms: terms,\n ...this.routing(ctx),\n };\n const preview = await this.config.policy!.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(rule),\n });\n text(preview.version);\n text(preview.preview, 4000);\n const body = {\n version: 1,\n actionId: input.actionId,\n revision: ctx.review.revision,\n bindingHash: ctx.review.bindingHash,\n rule,\n supportingFeedback: support.map(({ id, digest }) => ({ id, digest })),\n expectedPolicyVersion: preview.version,\n preview: preview.preview,\n reviewer: this.scope().actorId,\n requestHash: digest(input),\n };\n const row = await this.insert(ctx, key, 'rule_suggestion', {\n ...body,\n digest: digest(body),\n });\n await this.authorize(ctx, 'suggest');\n await this.rule(ctx, String(row.id));\n return this.ruleDTO(row);\n },\n );\n }\n private ruleDTO(row: Row): RuleSuggestion {\n const data = object(row.data);\n return {\n id: String(row.id),\n digest: String(data.digest),\n itemId: String(row.item_id),\n rule: data.rule as unknown as RoutingRule,\n supportingFeedback:\n data.supportingFeedback as RuleSuggestion['supportingFeedback'],\n expectedPolicyVersion: String(data.expectedPolicyVersion),\n preview: String(data.preview),\n automaticActionEligible: false,\n };\n }\n private async rule(ctx: FeedbackActionContext, id: string): Promise<Row> {\n const [row] = await this.rows(ctx.db, 'item_id=? AND id=? AND kind=?', [\n ctx.itemId,\n id,\n 'rule_suggestion',\n ]);\n if (!row) throw new Error('Rule unavailable');\n const data = object(row.data),\n { digest: stored, ...body } = data;\n if (\n digest(body) !== stored ||\n data.actionId !== ctx.review.actionId ||\n data.revision !== ctx.review.revision ||\n data.bindingHash !== ctx.review.bindingHash\n )\n throw new Error('Stale rule');\n const rule = object(data.rule);\n if (\n rule.handlerId !== ctx.handlerId ||\n rule.handlerVersion !== ctx.handlerVersion ||\n digest({\n args: rule.args,\n ...(rule.projection ? { projection: rule.projection } : {}),\n }) !== digest(this.routing(ctx))\n )\n throw new Error('Rule routing projection changed');\n const support = data.supportingFeedback as Array<{\n id: string;\n digest: string;\n }>;\n const current = await this.support(\n ctx,\n support.map((entry) => entry.id),\n true,\n );\n if (\n digest(current.map(({ id, digest }) => ({ id, digest }))) !==\n digest(support)\n )\n throw new Error('Rule evidence changed');\n return row;\n }\n async readRule(input: ReadRuleInput): Promise<RuleSuggestion> {\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n this.checkBinding(input, ctx);\n await this.authorize(ctx, 'suggest');\n const suggestion = this.ruleDTO(\n await this.rule(ctx, input.suggestionId),\n );\n if (!this.config.policy)\n throw new Error('Rule policy owner unavailable');\n const current = await this.config.policy.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n });\n if (\n current.version !== suggestion.expectedPolicyVersion ||\n current.preview !== suggestion.preview\n )\n throw new Error('Rule policy changed');\n await this.authorize(ctx, 'suggest');\n await this.rule(ctx, input.suggestionId);\n return suggestion;\n },\n );\n }\n async adopt(input: AdoptRuleInput): Promise<RuleAdoption> {\n digest(input);\n text(input.requestId);\n if (!this.config.policy) throw new Error('Rule policy owner unavailable');\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n this.checkBinding(input, ctx);\n await this.authorize(ctx, 'adopt');\n const row = await this.rule(ctx, input.suggestionId),\n suggestion = this.ruleDTO(row);\n if (\n input.expectedDigest !== suggestion.digest ||\n input.expectedPolicyVersion !== suggestion.expectedPolicyVersion\n )\n throw new Error('Stale rule');\n const requestHash = digest(input),\n key = `adopt:${input.requestId}`;\n const [replay] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (replay) {\n const data = object(replay.data);\n if (\n data.requestHash !== requestHash ||\n data.reviewer !== this.scope().actorId\n )\n throw new Error('Rule request conflict');\n return {\n id: String(replay.id),\n policyVersion: String(data.policyVersion),\n auditId: String(data.auditId),\n automaticActionEligible: false,\n };\n }\n const current = await this.config.policy!.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n });\n if (current.version !== input.expectedPolicyVersion)\n throw new Error('Policy version changed');\n const applied = await this.config.policy!.adopt({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n expectedVersion: input.expectedPolicyVersion,\n requestId: input.requestId,\n });\n text(applied.version);\n text(applied.auditId);\n if (applied.version === input.expectedPolicyVersion)\n throw new Error('Policy version did not advance');\n const verified = await this.config.policy!.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n });\n if (verified.version !== applied.version)\n throw new Error('Policy adoption mismatch');\n const body = {\n version: 1,\n requestHash,\n suggestionId: suggestion.id,\n suggestionDigest: suggestion.digest,\n previousPolicyVersion: input.expectedPolicyVersion,\n policyVersion: applied.version,\n auditId: applied.auditId,\n reviewer: this.scope().actorId,\n automaticActionEligible: false,\n };\n const saved = await this.insert(ctx, key, 'rule_adoption', {\n ...body,\n digest: digest(body),\n });\n await this.authorize(ctx, 'adopt');\n await this.rule(ctx, input.suggestionId);\n return {\n id: String(saved.id),\n policyVersion: applied.version,\n auditId: applied.auditId,\n automaticActionEligible: false,\n };\n },\n );\n }\n}\n"],"mappings":"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"}
@@ -3,41 +3,6 @@ import { createHash } from "node:crypto";
3
3
  import { fork } from "node:child_process";
4
4
  import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- //#region src/proposal-limits.ts
7
- function assertProposalLimits(limits) {
8
- if (!limits || [
9
- "maxHandlers",
10
- "maxCandidates",
11
- "maxSuggestions",
12
- "maxInputBytes",
13
- "maxOutputBytes",
14
- "maxQueryLength",
15
- "timeoutMs"
16
- ].some((key) => !Number.isSafeInteger(limits[key]) || limits[key] <= 0) || limits.maxHandlers > 20 || limits.maxCandidates > 20 || limits.maxSuggestions > 20 || limits.timeoutMs > 2147483647) throw new Error("Invalid proposal limits");
17
- }
18
- //#endregion
19
- //#region src/proposal-contracts.ts
20
- function proposalReadConfiguration(config) {
21
- const generator = providerIdentity("identity" in config.generator ? config.generator.identity : config.generator);
22
- return {
23
- version: config.version,
24
- promptVersion: config.promptVersion,
25
- generator,
26
- ...config.decision ? { decision: providerIdentity("identity" in config.decision ? config.decision.identity : config.decision) } : {},
27
- ...config.minimumDecisionProbability === void 0 ? {} : { minimumDecisionProbability: config.minimumDecisionProbability },
28
- ...config.tieMargin === void 0 ? {} : { tieMargin: config.tieMargin },
29
- limits: {
30
- maxHandlers: config.limits.maxHandlers,
31
- maxCandidates: config.limits.maxCandidates,
32
- maxSuggestions: config.limits.maxSuggestions,
33
- maxInputBytes: config.limits.maxInputBytes,
34
- maxOutputBytes: config.limits.maxOutputBytes,
35
- maxQueryLength: config.limits.maxQueryLength,
36
- timeoutMs: config.limits.timeoutMs
37
- }
38
- };
39
- }
40
- //#endregion
41
6
  //#region src/extraction.ts
42
7
  function createSDKExtractionAdapter(configuration) {
43
8
  try {
@@ -323,14 +288,43 @@ function proposeDocumentSplits(result, revision, groups) {
323
288
  };
324
289
  }
325
290
  //#endregion
326
- //#region src/proposal-errors.ts
327
- var GenerationSnapshotStaleError = class extends Error {
328
- constructor() {
329
- super("Generation snapshot stale");
330
- this.name = "GenerationSnapshotStaleError";
331
- }
332
- };
291
+ //#region src/proposal-limits.ts
292
+ function assertProposalLimits(limits) {
293
+ if (!limits || [
294
+ "maxHandlers",
295
+ "maxCandidates",
296
+ "maxSuggestions",
297
+ "maxInputBytes",
298
+ "maxOutputBytes",
299
+ "maxQueryLength",
300
+ "timeoutMs"
301
+ ].some((key) => !Number.isSafeInteger(limits[key]) || limits[key] <= 0) || limits.maxHandlers > 20 || limits.maxCandidates > 20 || limits.maxSuggestions > 20 || limits.timeoutMs > 2147483647) throw new Error("Invalid proposal limits");
302
+ }
303
+ //#endregion
304
+ //#region src/proposal-contracts.ts
305
+ function proposalReadConfiguration(config) {
306
+ const generator = providerIdentity("identity" in config.generator ? config.generator.identity : config.generator);
307
+ return {
308
+ version: config.version,
309
+ promptVersion: config.promptVersion,
310
+ generator,
311
+ ...config.decision ? { decision: providerIdentity("identity" in config.decision ? config.decision.identity : config.decision) } : {},
312
+ ...config.minimumDecisionProbability === void 0 ? {} : { minimumDecisionProbability: config.minimumDecisionProbability },
313
+ ...config.tieMargin === void 0 ? {} : { tieMargin: config.tieMargin },
314
+ ...config.decisionMaxLen === void 0 ? {} : { decisionMaxLen: config.decisionMaxLen },
315
+ ...config.decisionReadiness === void 0 ? {} : { decisionReadiness: config.decisionReadiness },
316
+ limits: {
317
+ maxHandlers: config.limits.maxHandlers,
318
+ maxCandidates: config.limits.maxCandidates,
319
+ maxSuggestions: config.limits.maxSuggestions,
320
+ maxInputBytes: config.limits.maxInputBytes,
321
+ maxOutputBytes: config.limits.maxOutputBytes,
322
+ maxQueryLength: config.limits.maxQueryLength,
323
+ timeoutMs: config.limits.timeoutMs
324
+ }
325
+ };
326
+ }
333
327
  //#endregion
334
- export { proposalReadConfiguration as a, proposeDocumentSplits as i, createSDKExtractionAdapter as n, assertProposalLimits as o, extractAnalysis as r, GenerationSnapshotStaleError as t };
328
+ export { proposeDocumentSplits as a, extractAnalysis as i, assertProposalLimits as n, createSDKExtractionAdapter as r, proposalReadConfiguration as t };
335
329
 
336
- //# sourceMappingURL=proposal-errors-VxcTU6Db.js.map
330
+ //# sourceMappingURL=proposal-contracts-77Uo1B1j.js.map