@happyvertical/smrt-ingestion 0.55.5 → 0.55.6
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.
- package/AGENTS.md +2 -0
- package/PROPOSALS.md +173 -0
- package/README.md +3 -0
- package/agents/execution.md +132 -0
- package/dist/chunks/execution-C6HJvl9e.js +7667 -0
- package/dist/chunks/execution-C6HJvl9e.js.map +1 -0
- package/dist/chunks/execution-internal-DWteDHM2.js +7 -0
- package/dist/chunks/execution-internal-DWteDHM2.js.map +1 -0
- package/dist/chunks/extraction-bseWZuWN.js +293 -0
- package/dist/chunks/extraction-bseWZuWN.js.map +1 -0
- package/dist/dto.d.ts +1 -0
- package/dist/dto.d.ts.map +1 -1
- package/dist/execution-contracts.d.ts +3 -0
- package/dist/execution-contracts.d.ts.map +1 -1
- package/dist/execution-internal.d.ts +7 -0
- package/dist/execution-internal.d.ts.map +1 -0
- package/dist/execution.d.ts +9 -1
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +1 -7614
- package/dist/extraction.d.ts.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/models.js +1 -1
- package/dist/models.js.map +1 -1
- package/dist/proposal-contracts.d.ts +85 -0
- package/dist/proposal-contracts.d.ts.map +1 -0
- package/dist/proposal-dto.d.ts +120 -0
- package/dist/proposal-dto.d.ts.map +1 -0
- package/dist/proposal-sdk.d.ts +12 -0
- package/dist/proposal-sdk.d.ts.map +1 -0
- package/dist/proposal-validation.d.ts +188 -0
- package/dist/proposal-validation.d.ts.map +1 -0
- package/dist/proposals.d.ts +41 -0
- package/dist/proposals.d.ts.map +1 -0
- package/dist/proposals.js +865 -0
- package/dist/proposals.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +119 -289
- package/dist/server.js.map +1 -1
- package/dist/smrt-knowledge.json +24 -8
- package/package.json +19 -13
- package/dist/execution.js.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region src/execution-internal.ts
|
|
2
|
+
var discoveryTransaction = /* @__PURE__ */ Symbol("ingestion.discoveryTransaction");
|
|
3
|
+
var generationSnapshotRead = /* @__PURE__ */ Symbol("ingestion.generationSnapshotRead");
|
|
4
|
+
//#endregion
|
|
5
|
+
export { generationSnapshotRead as n, discoveryTransaction as t };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=execution-internal-DWteDHM2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-internal-DWteDHM2.js","names":[],"sources":["../../src/execution-internal.ts"],"sourcesContent":["import type { DatabaseInterface } from '@happyvertical/sql';\nimport type { HandlerContext } from './execution-contracts.js';\n\n// Package-internal transaction bridge. Neither symbol is a public package export.\nexport const discoveryTransaction = Symbol('ingestion.discoveryTransaction');\nexport const generationSnapshotRead = Symbol(\n 'ingestion.generationSnapshotRead',\n);\nexport type TransactionRunner<T> = (\n work: (db: DatabaseInterface) => Promise<T>,\n) => Promise<T>;\nexport type DiscoveryGate = <T>(\n handlerId: string,\n handlerVersion: string,\n work: (context: HandlerContext) => Promise<T>,\n) => Promise<T>;\n"],"mappings":";AAIO,IAAM,uBAAuB,uBAAO,gCAAgC;AACpE,IAAM,yBAAyB,uBACpC,kCACF"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { a as providerIdentity, i as validateExtractionRequest, n as emptyExtraction, t as ExtractionFailure } from "./extraction-providers-C66ADDVe.js";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { fork } from "node:child_process";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
//#region src/extraction.ts
|
|
7
|
+
function createSDKExtractionAdapter(configuration) {
|
|
8
|
+
try {
|
|
9
|
+
configuration = structuredClone(configuration);
|
|
10
|
+
} catch {
|
|
11
|
+
throw new Error("Serializable SDK configuration required");
|
|
12
|
+
}
|
|
13
|
+
const maximum = configuration.maxConcurrentProcesses ?? 1;
|
|
14
|
+
if (!Number.isSafeInteger(maximum) || maximum < 1 || maximum > 32) throw new Error("Invalid extraction concurrency");
|
|
15
|
+
let running = 0;
|
|
16
|
+
if (configuration.nativeMemoryIsolation !== "host-enforced") throw new Error("Native memory isolation is required");
|
|
17
|
+
for (const provider of [
|
|
18
|
+
configuration.pdf,
|
|
19
|
+
configuration.ocr,
|
|
20
|
+
configuration.speech,
|
|
21
|
+
configuration.vision
|
|
22
|
+
]) if (provider) provider.identity = providerIdentity(provider.identity);
|
|
23
|
+
if (configuration.pdf?.provider === "auto" || configuration.ocr?.identity.provider === "auto") throw new Error("Pin extraction providers");
|
|
24
|
+
return { async extract(request) {
|
|
25
|
+
let latest = emptyExtraction(request);
|
|
26
|
+
try {
|
|
27
|
+
validateExtractionRequest(request);
|
|
28
|
+
} catch (caught) {
|
|
29
|
+
if (!(caught instanceof ExtractionFailure)) throw caught;
|
|
30
|
+
latest.errors.push({
|
|
31
|
+
category: caught.category,
|
|
32
|
+
location: { kind: "source" }
|
|
33
|
+
});
|
|
34
|
+
return latest;
|
|
35
|
+
}
|
|
36
|
+
if (request.evidence.mediaType.toLowerCase().startsWith("video/")) {
|
|
37
|
+
latest.status = "unsupported";
|
|
38
|
+
latest.errors.push({
|
|
39
|
+
category: "unsupported_type",
|
|
40
|
+
location: { kind: "source" }
|
|
41
|
+
});
|
|
42
|
+
return latest;
|
|
43
|
+
}
|
|
44
|
+
if (request.signal?.aborted) {
|
|
45
|
+
latest.errors.push({
|
|
46
|
+
category: "cancelled",
|
|
47
|
+
location: { kind: "source" }
|
|
48
|
+
});
|
|
49
|
+
return latest;
|
|
50
|
+
}
|
|
51
|
+
if (running >= maximum) {
|
|
52
|
+
latest.errors.push({
|
|
53
|
+
category: "limit",
|
|
54
|
+
location: { kind: "source" }
|
|
55
|
+
});
|
|
56
|
+
return latest;
|
|
57
|
+
}
|
|
58
|
+
running++;
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
const child = fork(join(dirname(fileURLToPath(import.meta.resolve("@happyvertical/smrt-ingestion/server"))), "extraction-worker.js"), [], {
|
|
61
|
+
serialization: "advanced",
|
|
62
|
+
stdio: [
|
|
63
|
+
"ignore",
|
|
64
|
+
"ignore",
|
|
65
|
+
"ignore",
|
|
66
|
+
"ipc"
|
|
67
|
+
],
|
|
68
|
+
execArgv: [`--max-old-space-size=${request.limits.workerHeapMb}`],
|
|
69
|
+
detached: process.platform !== "win32"
|
|
70
|
+
});
|
|
71
|
+
let done = false;
|
|
72
|
+
const stop = () => {
|
|
73
|
+
try {
|
|
74
|
+
if (process.platform !== "win32" && child.pid) process.kill(-child.pid, "SIGKILL");
|
|
75
|
+
else child.kill("SIGKILL");
|
|
76
|
+
} catch {
|
|
77
|
+
child.kill("SIGKILL");
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const finish = (category) => {
|
|
81
|
+
if (done) return;
|
|
82
|
+
done = true;
|
|
83
|
+
running--;
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
request.signal?.removeEventListener("abort", abort);
|
|
86
|
+
stop();
|
|
87
|
+
if (category) {
|
|
88
|
+
latest.errors.push({
|
|
89
|
+
category,
|
|
90
|
+
location: { kind: "source" }
|
|
91
|
+
});
|
|
92
|
+
latest.status = latest.segments.length ? "partial" : "failed";
|
|
93
|
+
latest.truncated = true;
|
|
94
|
+
latest.omitted.push({ kind: "source" });
|
|
95
|
+
}
|
|
96
|
+
resolve(latest);
|
|
97
|
+
};
|
|
98
|
+
const abort = () => finish("cancelled");
|
|
99
|
+
const timer = setTimeout(() => finish("timeout"), request.limits.timeoutMs);
|
|
100
|
+
request.signal?.addEventListener("abort", abort, { once: true });
|
|
101
|
+
child.on("error", () => finish("unavailable"));
|
|
102
|
+
child.on("exit", () => {
|
|
103
|
+
if (!done) finish("unavailable");
|
|
104
|
+
});
|
|
105
|
+
child.on("message", async (message) => {
|
|
106
|
+
if (done) return;
|
|
107
|
+
if (message.kind === "authorize" && Number.isSafeInteger(message.id)) {
|
|
108
|
+
try {
|
|
109
|
+
await request.beforeProviderCall?.();
|
|
110
|
+
if (!done) child.send({
|
|
111
|
+
kind: "authorized",
|
|
112
|
+
id: message.id
|
|
113
|
+
});
|
|
114
|
+
} catch {
|
|
115
|
+
finish("cancelled");
|
|
116
|
+
}
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if ((message.kind === "progress" || message.kind === "result") && message.result) {
|
|
120
|
+
if (Buffer.byteLength(JSON.stringify(message.result)) > request.limits.maxOutputBytes + 65536) return finish("limit");
|
|
121
|
+
latest = message.result;
|
|
122
|
+
if (message.kind === "result") finish();
|
|
123
|
+
} else finish("unavailable");
|
|
124
|
+
});
|
|
125
|
+
const { signal: _signal, beforeProviderCall: _authorize, ...wireRequest } = request;
|
|
126
|
+
child.send({
|
|
127
|
+
request: wireRequest,
|
|
128
|
+
configuration
|
|
129
|
+
}, (error) => {
|
|
130
|
+
if (error) finish("unavailable");
|
|
131
|
+
});
|
|
132
|
+
if (request.signal?.aborted) abort();
|
|
133
|
+
});
|
|
134
|
+
} };
|
|
135
|
+
}
|
|
136
|
+
function validateAndNormalizeExtractionOutput(result, request) {
|
|
137
|
+
const numeric = (value) => Number.isFinite(value) && value >= 0;
|
|
138
|
+
const location = (value) => {
|
|
139
|
+
if (!value || typeof value !== "object") return false;
|
|
140
|
+
if (value.kind === "source") return true;
|
|
141
|
+
if (value.kind === "page") return Number.isSafeInteger(value.page) && value.page > 0;
|
|
142
|
+
if (value.kind === "pages") return Number.isSafeInteger(value.startPage) && value.startPage > 0 && Number.isSafeInteger(value.endPage) && value.endPage >= value.startPage;
|
|
143
|
+
return value.kind === "time" && numeric(value.startMs) && numeric(value.endMs) && value.endMs >= value.startMs;
|
|
144
|
+
};
|
|
145
|
+
if (!result || ![
|
|
146
|
+
"complete",
|
|
147
|
+
"partial",
|
|
148
|
+
"failed",
|
|
149
|
+
"unsupported"
|
|
150
|
+
].includes(result.status) || result.automaticActionEligible !== false || result.configurationRevision !== request.configurationRevision || !result.evidence || Object.entries(request.evidence).some(([key, value]) => result.evidence[key] !== value) || typeof result.truncated !== "boolean" || !Array.isArray(result.capabilities) || result.capabilities.some((capability) => !capability || typeof capability.confidence !== "boolean" || typeof capability.boxes !== "boolean" || ![
|
|
151
|
+
"source",
|
|
152
|
+
"page",
|
|
153
|
+
"time"
|
|
154
|
+
].includes(capability.location) || !["unknown", "reported"].includes(capability.truncation) || !["unknown", "reported"].includes(capability.usage)) || !result.limits || Object.entries(request.limits).some(([key, value]) => result.limits[key] !== value) || !Array.isArray(result.segments) || !Array.isArray(result.errors) || !Array.isArray(result.omitted) || result.status === "complete" && (result.truncated || result.errors.length > 0 || result.omitted.length > 0) || result.omitted.some((value) => !location(value)) || result.segments.some((segment) => typeof segment.text !== "string" || !location(segment.location) || segment.location.kind === "pages" || segment.provenance?.provider === "unlimited-ocr" && (segment.confidence !== null || segment.boxes !== null) || !segment.provenance || [
|
|
155
|
+
segment.provenance.provider,
|
|
156
|
+
segment.provenance.model,
|
|
157
|
+
segment.provenance.version
|
|
158
|
+
].some((value) => typeof value !== "string" || !value) || segment.confidence !== null && (!segment.confidence || !numeric(segment.confidence.value) || segment.confidence.value > 1 || segment.confidence.scale !== "0-1" || segment.confidence.calibration !== "unknown") || segment.boxes !== null && (!Array.isArray(segment.boxes) || segment.boxes.some((box) => typeof box.text !== "string" || ![
|
|
159
|
+
box.x,
|
|
160
|
+
box.y,
|
|
161
|
+
box.width,
|
|
162
|
+
box.height
|
|
163
|
+
].every(numeric)))) || result.errors.some((error) => ![
|
|
164
|
+
"unsupported_type",
|
|
165
|
+
"malformed_output",
|
|
166
|
+
"limit",
|
|
167
|
+
"timeout",
|
|
168
|
+
"unavailable",
|
|
169
|
+
"authentication",
|
|
170
|
+
"cancelled",
|
|
171
|
+
"integrity"
|
|
172
|
+
].includes(error.category) || !location(error.location)) || !result.usage || Object.values(result.usage).some((value) => !numeric(value))) throw new Error("Invalid extraction output");
|
|
173
|
+
for (const segment of result.segments) segment.provenance = providerIdentity(segment.provenance);
|
|
174
|
+
result.capabilities = result.capabilities.map((capability) => ({
|
|
175
|
+
...providerIdentity(capability),
|
|
176
|
+
confidence: capability.confidence,
|
|
177
|
+
boxes: capability.boxes,
|
|
178
|
+
location: capability.location,
|
|
179
|
+
truncation: capability.truncation,
|
|
180
|
+
usage: capability.usage
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
async function extractAnalysis(service, lease, adapter, options) {
|
|
184
|
+
const snapshot = await service.getAnalysisInput(lease);
|
|
185
|
+
const persisted = snapshot.configuration.extraction;
|
|
186
|
+
if (!persisted || persisted.configurationRevision !== options.configurationRevision || !persisted.limits || Object.keys(options.limits).some((key) => persisted.limits?.[key] !== options.limits[key]) || Object.keys(persisted.limits).length !== Object.keys(options.limits).length) throw new Error("Extraction configuration mismatch");
|
|
187
|
+
const evidence = snapshot.evidence;
|
|
188
|
+
const boundOptions = {
|
|
189
|
+
...options,
|
|
190
|
+
limits: structuredClone(options.limits)
|
|
191
|
+
};
|
|
192
|
+
const results = [];
|
|
193
|
+
let limited = false;
|
|
194
|
+
const publication = (reserve = false) => {
|
|
195
|
+
const allComplete = !limited && results.length === evidence.length && results.every((result) => result.status === "complete");
|
|
196
|
+
const firstError = limited || reserve ? "limit" : results.flatMap((result) => result.errors)[0]?.category;
|
|
197
|
+
return {
|
|
198
|
+
status: reserve ? "needs_attention" : allComplete ? "completed" : results.some((result) => result.segments.length) ? "partial" : "needs_attention",
|
|
199
|
+
provider: "smrt-ingestion-extraction",
|
|
200
|
+
model: "none",
|
|
201
|
+
version: "1",
|
|
202
|
+
output: {
|
|
203
|
+
configurationRevision: options.configurationRevision,
|
|
204
|
+
results,
|
|
205
|
+
...limited || reserve ? {
|
|
206
|
+
truncated: true,
|
|
207
|
+
omittedEvidenceCount: evidence.length - results.length
|
|
208
|
+
} : {}
|
|
209
|
+
},
|
|
210
|
+
usage: {},
|
|
211
|
+
...firstError ? { error: firstError } : {}
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
const fits = (output) => Buffer.byteLength(JSON.stringify(output)) <= snapshot.maxOutputBytes;
|
|
215
|
+
const minimum = {
|
|
216
|
+
status: "needs_attention",
|
|
217
|
+
provider: "smrt-ingestion-extraction",
|
|
218
|
+
model: "none",
|
|
219
|
+
version: "1",
|
|
220
|
+
output: {},
|
|
221
|
+
usage: {},
|
|
222
|
+
error: "limit"
|
|
223
|
+
};
|
|
224
|
+
if (!fits(minimum)) return service.failAnalysis(lease, "limit");
|
|
225
|
+
if (!fits(publication(true))) return service.completeAnalysis(lease, minimum);
|
|
226
|
+
for (const part of evidence) {
|
|
227
|
+
await service.getAnalysisInput(lease);
|
|
228
|
+
const bytes = await service.readEvidence(lease.itemId, part.id);
|
|
229
|
+
await service.getAnalysisInput(lease);
|
|
230
|
+
const request = {
|
|
231
|
+
...boundOptions,
|
|
232
|
+
evidence: part,
|
|
233
|
+
bytes
|
|
234
|
+
};
|
|
235
|
+
const result = await adapter.extract({
|
|
236
|
+
...request,
|
|
237
|
+
evidence: { ...part },
|
|
238
|
+
limits: { ...request.limits },
|
|
239
|
+
bytes: bytes.slice(),
|
|
240
|
+
beforeProviderCall: async () => {
|
|
241
|
+
await service.getAnalysisInput(lease);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
validateAndNormalizeExtractionOutput(result, request);
|
|
245
|
+
results.push(result);
|
|
246
|
+
if (!fits(publication(true))) {
|
|
247
|
+
limited = true;
|
|
248
|
+
result.status = "partial";
|
|
249
|
+
result.truncated = true;
|
|
250
|
+
result.errors.push({
|
|
251
|
+
category: "limit",
|
|
252
|
+
location: { kind: "source" }
|
|
253
|
+
});
|
|
254
|
+
while (result.segments.length && !fits(publication(true))) {
|
|
255
|
+
const removed = result.segments.pop();
|
|
256
|
+
if (removed) result.omitted.push(removed.location);
|
|
257
|
+
}
|
|
258
|
+
if (!fits(publication(true))) results.pop();
|
|
259
|
+
}
|
|
260
|
+
await service.getAnalysisInput(lease);
|
|
261
|
+
if (limited || options.signal?.aborted) break;
|
|
262
|
+
}
|
|
263
|
+
return service.completeAnalysis(lease, publication());
|
|
264
|
+
}
|
|
265
|
+
function proposeDocumentSplits(result, revision, groups) {
|
|
266
|
+
if (!Number.isSafeInteger(revision) || revision < 1 || !groups.length) throw new Error("Invalid split revision");
|
|
267
|
+
const available = new Set(result.segments.flatMap((segment) => segment.location.kind === "page" ? [segment.location.page] : []));
|
|
268
|
+
const seen = /* @__PURE__ */ new Set();
|
|
269
|
+
for (const group of groups) {
|
|
270
|
+
if (!group.length) throw new Error("Empty split");
|
|
271
|
+
for (const page of group) {
|
|
272
|
+
if (!Number.isSafeInteger(page) || !available.has(page) || seen.has(page)) throw new Error("Invalid split page");
|
|
273
|
+
seen.add(page);
|
|
274
|
+
}
|
|
275
|
+
if (group.some((page, index) => index > 0 && page <= group[index - 1])) throw new Error("Unordered split");
|
|
276
|
+
}
|
|
277
|
+
const proposal = {
|
|
278
|
+
revision,
|
|
279
|
+
evidenceId: result.evidence.id,
|
|
280
|
+
inputHash: result.evidence.contentHash,
|
|
281
|
+
configurationRevision: result.configurationRevision,
|
|
282
|
+
groups: groups.map((pages) => ({ pages: [...pages] })),
|
|
283
|
+
status: "proposed"
|
|
284
|
+
};
|
|
285
|
+
return {
|
|
286
|
+
...proposal,
|
|
287
|
+
digest: createHash("sha256").update(JSON.stringify(proposal)).digest("hex")
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
//#endregion
|
|
291
|
+
export { extractAnalysis as n, proposeDocumentSplits as r, createSDKExtractionAdapter as t };
|
|
292
|
+
|
|
293
|
+
//# sourceMappingURL=extraction-bseWZuWN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-bseWZuWN.js","names":[],"sources":["../../src/extraction.ts"],"sourcesContent":["import { fork } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { GetAIOptions } from '@happyvertical/ai';\nimport type { PDFReaderOptions } from '@happyvertical/pdf';\nimport type { GetTranscriberOptions } from '@happyvertical/speech';\nimport type { AnalysisOutput } from './dto.js';\nimport {\n ExtractionFailure,\n emptyExtraction,\n validateExtractionRequest,\n} from './extraction-providers.js';\nimport type {\n ExtractionAdapter,\n ExtractionRequest,\n ExtractionResult,\n ProviderIdentity,\n} from './extraction-types.js';\nimport { providerIdentity } from './extraction-types.js';\nimport type { AnalysisLease, IngestionService } from './server.js';\n\nexport type * from './extraction-types.js';\n\n/** Trusted server configuration. Credentials never enter analysis provenance. */\nexport interface ExtractionSDKConfiguration {\n pdf?: {\n provider: NonNullable<PDFReaderOptions['provider']>;\n identity: ProviderIdentity;\n };\n ocr?: { identity: ProviderIdentity; options?: Record<string, unknown> };\n speech?: { identity: ProviderIdentity; options: GetTranscriberOptions };\n vision?: { identity: ProviderIdentity; options: GetAIOptions };\n imageMode?: 'ocr' | 'vision';\n /** Maximum concurrent child processes for this adapter instance (default 1). */\n maxConcurrentProcesses?: number;\n /** The deployment enforces a native-memory ceiling outside Node (e.g. container).\n * Required for native decoders: Node's heap cap does not bound native allocation. */\n nativeMemoryIsolation: 'host-enforced';\n}\n\n/** Production adapter: bounded per-evidence child, terminated on deadline/abort. */\nexport function createSDKExtractionAdapter(\n configuration: ExtractionSDKConfiguration,\n): ExtractionAdapter {\n try {\n configuration = structuredClone(configuration);\n } catch {\n throw new Error('Serializable SDK configuration required');\n }\n const maximum = configuration.maxConcurrentProcesses ?? 1;\n if (!Number.isSafeInteger(maximum) || maximum < 1 || maximum > 32)\n throw new Error('Invalid extraction concurrency');\n let running = 0;\n if (configuration.nativeMemoryIsolation !== 'host-enforced')\n throw new Error('Native memory isolation is required');\n for (const provider of [\n configuration.pdf,\n configuration.ocr,\n configuration.speech,\n configuration.vision,\n ]) {\n if (provider) provider.identity = providerIdentity(provider.identity);\n }\n if (\n configuration.pdf?.provider === 'auto' ||\n configuration.ocr?.identity.provider === 'auto'\n )\n throw new Error('Pin extraction providers');\n return {\n async extract(request) {\n let latest = emptyExtraction(request);\n try {\n validateExtractionRequest(request);\n } catch (caught) {\n if (!(caught instanceof ExtractionFailure)) throw caught;\n latest.errors.push({\n category: caught.category,\n location: { kind: 'source' },\n });\n return latest;\n }\n if (request.evidence.mediaType.toLowerCase().startsWith('video/')) {\n latest.status = 'unsupported';\n latest.errors.push({\n category: 'unsupported_type',\n location: { kind: 'source' },\n });\n return latest;\n }\n if (request.signal?.aborted) {\n latest.errors.push({\n category: 'cancelled',\n location: { kind: 'source' },\n });\n return latest;\n }\n if (running >= maximum) {\n latest.errors.push({ category: 'limit', location: { kind: 'source' } });\n return latest;\n }\n running++;\n return new Promise<ExtractionResult>((resolve) => {\n // A public entry can move shared code into chunks; resolve without loading it.\n const child = fork(\n join(\n dirname(\n fileURLToPath(\n import.meta.resolve('@happyvertical/smrt-ingestion/server'),\n ),\n ),\n 'extraction-worker.js',\n ),\n [],\n {\n serialization: 'advanced',\n stdio: ['ignore', 'ignore', 'ignore', 'ipc'],\n execArgv: [`--max-old-space-size=${request.limits.workerHeapMb}`],\n detached: process.platform !== 'win32',\n },\n );\n let done = false;\n const stop = () => {\n try {\n if (process.platform !== 'win32' && child.pid)\n process.kill(-child.pid, 'SIGKILL');\n else child.kill('SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n };\n const finish = (\n category?: 'timeout' | 'cancelled' | 'unavailable' | 'limit',\n ) => {\n if (done) return;\n done = true;\n running--;\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', abort);\n stop();\n if (category) {\n latest.errors.push({ category, location: { kind: 'source' } });\n latest.status = latest.segments.length ? 'partial' : 'failed';\n latest.truncated = true;\n latest.omitted.push({ kind: 'source' });\n }\n resolve(latest);\n };\n const abort = () => finish('cancelled');\n const timer = setTimeout(\n () => finish('timeout'),\n request.limits.timeoutMs,\n );\n request.signal?.addEventListener('abort', abort, { once: true });\n child.on('error', () => finish('unavailable'));\n child.on('exit', () => {\n if (!done) finish('unavailable');\n });\n child.on(\n 'message',\n async (message: {\n kind: string;\n id?: number;\n result?: ExtractionResult;\n }) => {\n if (done) return;\n if (\n message.kind === 'authorize' &&\n Number.isSafeInteger(message.id)\n ) {\n try {\n await request.beforeProviderCall?.();\n if (!done) child.send({ kind: 'authorized', id: message.id });\n } catch {\n finish('cancelled');\n }\n return;\n }\n if (\n (message.kind === 'progress' || message.kind === 'result') &&\n message.result\n ) {\n // The child is our trusted normalizer; bound serialized IPC output as well.\n if (\n Buffer.byteLength(JSON.stringify(message.result)) >\n request.limits.maxOutputBytes + 65536\n )\n return finish('limit');\n latest = message.result;\n if (message.kind === 'result') finish();\n } else finish('unavailable');\n },\n );\n const {\n signal: _signal,\n beforeProviderCall: _authorize,\n ...wireRequest\n } = request;\n child.send({ request: wireRequest, configuration }, (error) => {\n if (error) finish('unavailable');\n });\n if (request.signal?.aborted) abort();\n });\n },\n };\n}\n\nfunction validateAndNormalizeExtractionOutput(\n result: ExtractionResult,\n request: ExtractionRequest,\n): void {\n const numeric = (value: number) => Number.isFinite(value) && value >= 0;\n const location = (\n value: ExtractionResult['segments'][number]['location'],\n ) => {\n if (!value || typeof value !== 'object') return false;\n if (value.kind === 'source') return true;\n if (value.kind === 'page')\n return Number.isSafeInteger(value.page) && value.page > 0;\n if (value.kind === 'pages')\n return (\n Number.isSafeInteger(value.startPage) &&\n value.startPage > 0 &&\n Number.isSafeInteger(value.endPage) &&\n value.endPage >= value.startPage\n );\n return (\n value.kind === 'time' &&\n numeric(value.startMs) &&\n numeric(value.endMs) &&\n value.endMs >= value.startMs\n );\n };\n if (\n !result ||\n !['complete', 'partial', 'failed', 'unsupported'].includes(result.status) ||\n result.automaticActionEligible !== false ||\n result.configurationRevision !== request.configurationRevision ||\n !result.evidence ||\n Object.entries(request.evidence).some(\n ([key, value]) =>\n result.evidence[key as keyof typeof result.evidence] !== value,\n ) ||\n typeof result.truncated !== 'boolean' ||\n !Array.isArray(result.capabilities) ||\n result.capabilities.some(\n (capability) =>\n !capability ||\n typeof capability.confidence !== 'boolean' ||\n typeof capability.boxes !== 'boolean' ||\n !['source', 'page', 'time'].includes(capability.location) ||\n !['unknown', 'reported'].includes(capability.truncation) ||\n !['unknown', 'reported'].includes(capability.usage),\n ) ||\n !result.limits ||\n Object.entries(request.limits).some(\n ([key, value]) =>\n result.limits[key as keyof typeof result.limits] !== value,\n ) ||\n !Array.isArray(result.segments) ||\n !Array.isArray(result.errors) ||\n !Array.isArray(result.omitted) ||\n (result.status === 'complete' &&\n (result.truncated ||\n result.errors.length > 0 ||\n result.omitted.length > 0)) ||\n result.omitted.some((value) => !location(value)) ||\n result.segments.some(\n (segment) =>\n typeof segment.text !== 'string' ||\n !location(segment.location) ||\n segment.location.kind === 'pages' ||\n (segment.provenance?.provider === 'unlimited-ocr' &&\n (segment.confidence !== null || segment.boxes !== null)) ||\n !segment.provenance ||\n [\n segment.provenance.provider,\n segment.provenance.model,\n segment.provenance.version,\n ].some((value) => typeof value !== 'string' || !value) ||\n (segment.confidence !== null &&\n (!segment.confidence ||\n !numeric(segment.confidence.value) ||\n segment.confidence.value > 1 ||\n segment.confidence.scale !== '0-1' ||\n segment.confidence.calibration !== 'unknown')) ||\n (segment.boxes !== null &&\n (!Array.isArray(segment.boxes) ||\n segment.boxes.some(\n (box) =>\n typeof box.text !== 'string' ||\n ![box.x, box.y, box.width, box.height].every(numeric),\n ))),\n ) ||\n result.errors.some(\n (error) =>\n ![\n 'unsupported_type',\n 'malformed_output',\n 'limit',\n 'timeout',\n 'unavailable',\n 'authentication',\n 'cancelled',\n 'integrity',\n ].includes(error.category) || !location(error.location),\n ) ||\n !result.usage ||\n Object.values(result.usage).some((value) => !numeric(value))\n )\n throw new Error('Invalid extraction output');\n // Structural typing permits extra host fields. Never persist them as identity.\n for (const segment of result.segments)\n segment.provenance = providerIdentity(segment.provenance);\n result.capabilities = result.capabilities.map((capability) => ({\n ...providerIdentity(capability),\n confidence: capability.confidence,\n boxes: capability.boxes,\n location: capability.location,\n truncation: capability.truncation,\n usage: capability.usage,\n }));\n}\n\n/** Current access is rechecked on read and fenced publication by the foundation.\n * The host already allocated the immutable input/config revision and lease. */\nexport async function extractAnalysis(\n service: IngestionService,\n lease: AnalysisLease,\n adapter: ExtractionAdapter,\n options: Pick<\n ExtractionRequest,\n 'limits' | 'configurationRevision' | 'signal'\n >,\n): Promise<boolean> {\n const snapshot = await service.getAnalysisInput(lease);\n const persisted = snapshot.configuration.extraction as\n | { configurationRevision?: unknown; limits?: Record<string, unknown> }\n | undefined;\n if (\n !persisted ||\n persisted.configurationRevision !== options.configurationRevision ||\n !persisted.limits ||\n Object.keys(options.limits).some(\n (key) =>\n persisted.limits?.[key] !==\n options.limits[key as keyof typeof options.limits],\n ) ||\n Object.keys(persisted.limits).length !== Object.keys(options.limits).length\n )\n throw new Error('Extraction configuration mismatch');\n const evidence = snapshot.evidence;\n const boundOptions = { ...options, limits: structuredClone(options.limits) };\n const results: ExtractionResult[] = [];\n let limited = false;\n const publication = (reserve = false): AnalysisOutput => {\n const allComplete =\n !limited &&\n results.length === evidence.length &&\n results.every((result) => result.status === 'complete');\n const firstError =\n limited || reserve\n ? 'limit'\n : results.flatMap((result) => result.errors)[0]?.category;\n return {\n status: reserve\n ? 'needs_attention'\n : allComplete\n ? 'completed'\n : results.some((result) => result.segments.length)\n ? 'partial'\n : 'needs_attention',\n provider: 'smrt-ingestion-extraction',\n model: 'none',\n version: '1',\n output: {\n configurationRevision: options.configurationRevision,\n results,\n ...(limited || reserve\n ? {\n truncated: true,\n omittedEvidenceCount: evidence.length - results.length,\n }\n : {}),\n },\n usage: {},\n ...(firstError ? { error: firstError } : {}),\n };\n };\n // Canonical persistence sorts keys but uses identical JSON value encoding/size.\n const fits = (output: AnalysisOutput) =>\n Buffer.byteLength(JSON.stringify(output)) <= snapshot.maxOutputBytes;\n const minimum: AnalysisOutput = {\n status: 'needs_attention',\n provider: 'smrt-ingestion-extraction',\n model: 'none',\n version: '1',\n output: {},\n usage: {},\n error: 'limit',\n };\n if (!fits(minimum)) return service.failAnalysis(lease, 'limit');\n if (!fits(publication(true))) return service.completeAnalysis(lease, minimum);\n for (const part of evidence) {\n await service.getAnalysisInput(lease);\n const bytes = await service.readEvidence(lease.itemId, part.id);\n await service.getAnalysisInput(lease);\n const request = { ...boundOptions, evidence: part, bytes };\n const result = await adapter.extract({\n ...request,\n evidence: { ...part },\n limits: { ...request.limits },\n bytes: bytes.slice(),\n beforeProviderCall: async () => {\n await service.getAnalysisInput(lease);\n },\n });\n validateAndNormalizeExtractionOutput(result, request);\n results.push(result);\n if (!fits(publication(true))) {\n limited = true;\n // Preserve earlier parts and the largest prefix of complete segments that fits.\n result.status = 'partial';\n result.truncated = true;\n result.errors.push({ category: 'limit', location: { kind: 'source' } });\n while (result.segments.length && !fits(publication(true))) {\n const removed = result.segments.pop();\n if (removed) result.omitted.push(removed.location);\n }\n // Diagnostics are indivisible: omit this result rather than erase known gaps.\n if (!fits(publication(true))) results.pop();\n }\n // Revalidation after an external call prevents returning/publishing revoked evidence.\n await service.getAnalysisInput(lease);\n if (limited || options.signal?.aborted) break;\n }\n return service.completeAnalysis(lease, publication());\n}\n\n/** Side-effect-free, versioned split proposal. Original evidence is not replaced. */\nexport function proposeDocumentSplits(\n result: ExtractionResult,\n revision: number,\n groups: number[][],\n) {\n if (!Number.isSafeInteger(revision) || revision < 1 || !groups.length)\n throw new Error('Invalid split revision');\n const available = new Set(\n result.segments.flatMap((segment) =>\n segment.location.kind === 'page' ? [segment.location.page] : [],\n ),\n );\n const seen = new Set<number>();\n for (const group of groups) {\n if (!group.length) throw new Error('Empty split');\n for (const page of group) {\n if (!Number.isSafeInteger(page) || !available.has(page) || seen.has(page))\n throw new Error('Invalid split page');\n seen.add(page);\n }\n if (group.some((page, index) => index > 0 && page <= group[index - 1]))\n throw new Error('Unordered split');\n }\n const proposal = {\n revision,\n evidenceId: result.evidence.id,\n inputHash: result.evidence.contentHash,\n configurationRevision: result.configurationRevision,\n groups: groups.map((pages) => ({ pages: [...pages] })),\n status: 'proposed' as const,\n };\n return {\n ...proposal,\n digest: createHash('sha256').update(JSON.stringify(proposal)).digest('hex'),\n };\n}\n"],"mappings":"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"}
|
package/dist/dto.d.ts
CHANGED
package/dist/dto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dto.d.ts","sourceRoot":"","sources":["../src/dto.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,oFAAoF;AACpF,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,GACnD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CACxD,CAAC;AAEN,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,iFAAiF;AACjF,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,kBAAkB,GAClB,OAAO,GACP,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,WAAW,GACX,WAAW,CAAC;AAEhB,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,iBAAiB,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
1
|
+
{"version":3,"file":"dto.d.ts","sourceRoot":"","sources":["../src/dto.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,oFAAoF;AACpF,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,GACnD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CACxD,CAAC;AAEN,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,iFAAiF;AACjF,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,kBAAkB,GAClB,OAAO,GACP,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,WAAW,GACX,WAAW,CAAC;AAEhB,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,iBAAiB,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,mBAAmB,mBAAmB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import type { CapabilityDeclaration } from '@happyvertical/smrt-types';
|
|
|
3
3
|
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
4
4
|
import type { ExecutionCeiling, IntakeValues } from './execution-dto.js';
|
|
5
5
|
import type { IntakePolicy, IntakePolicyLayer } from './policy.js';
|
|
6
|
+
import type { HandlerDiscovery } from './proposal-contracts.js';
|
|
6
7
|
import type { IngestionScope } from './server.js';
|
|
7
8
|
export type * from './execution-dto.js';
|
|
8
9
|
export interface HandlerContext {
|
|
@@ -24,6 +25,8 @@ export interface HandlerPreview {
|
|
|
24
25
|
}>;
|
|
25
26
|
}
|
|
26
27
|
interface HandlerBase {
|
|
28
|
+
/** Optional proposal discovery on this same authoritative execution catalog. */
|
|
29
|
+
discovery?: HandlerDiscovery;
|
|
27
30
|
id: string;
|
|
28
31
|
version: string;
|
|
29
32
|
description: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-contracts.d.ts","sourceRoot":"","sources":["../src/execution-contracts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"execution-contracts.d.ts","sourceRoot":"","sources":["../src/execution-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import type { HandlerContext } from './execution-contracts.js';
|
|
3
|
+
export declare const discoveryTransaction: unique symbol;
|
|
4
|
+
export declare const generationSnapshotRead: unique symbol;
|
|
5
|
+
export type TransactionRunner<T> = (work: (db: DatabaseInterface) => Promise<T>) => Promise<T>;
|
|
6
|
+
export type DiscoveryGate = <T>(handlerId: string, handlerVersion: string, work: (context: HandlerContext) => Promise<T>) => Promise<T>;
|
|
7
|
+
//# sourceMappingURL=execution-internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-internal.d.ts","sourceRoot":"","sources":["../src/execution-internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,eAAO,MAAM,oBAAoB,eAA2C,CAAC;AAC7E,eAAO,MAAM,sBAAsB,eAElC,CAAC;AACF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CACjC,IAAI,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,KACxC,OAAO,CAAC,CAAC,CAAC,CAAC;AAChB,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,KAC1C,OAAO,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/execution.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { JobExecutionContext } from '@happyvertical/smrt-jobs';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
3
|
+
import type { ActionResult, HandlerContext, IntakeExecutionOptions, PlanReview, PreviewPlanInput, PreviewProposalInput, ProposalReview, ReviewInput } from './execution-contracts.js';
|
|
4
|
+
import { type DiscoveryGate, discoveryTransaction, type TransactionRunner } from './execution-internal.js';
|
|
3
5
|
import type { IngestionOptions } from './server.js';
|
|
4
6
|
export type * from './execution-contracts.js';
|
|
5
7
|
export type { IntakePolicy, IntakePolicyLayer } from './policy.js';
|
|
@@ -16,6 +18,7 @@ export declare class IntakeExecutionService {
|
|
|
16
18
|
constructor(options: IngestionOptions, config: IntakeExecutionOptions);
|
|
17
19
|
private now;
|
|
18
20
|
private tx;
|
|
21
|
+
private withRetention;
|
|
19
22
|
private restoreRetention;
|
|
20
23
|
private redactExecution;
|
|
21
24
|
private narrowRetention;
|
|
@@ -28,6 +31,11 @@ export declare class IntakeExecutionService {
|
|
|
28
31
|
private validate;
|
|
29
32
|
private access;
|
|
30
33
|
private principal;
|
|
34
|
+
/** Current discovery authority. Trusted callbacks use context.db for bounded reads. */
|
|
35
|
+
withDiscoveryContext<T>(itemId: string, handlerId: string, handlerVersion: string, work: (context: HandlerContext) => Promise<T>): Promise<T>;
|
|
36
|
+
/** Keep retention restoration outside the supplied foundation transaction. */
|
|
37
|
+
[discoveryTransaction]<T>(run: TransactionRunner<T>, itemId: string, work: (db: DatabaseInterface, authorize: DiscoveryGate) => Promise<T>): Promise<T>;
|
|
38
|
+
private discoveryContext;
|
|
31
39
|
private bound;
|
|
32
40
|
private review;
|
|
33
41
|
getAction(actionId: string): Promise<ProposalReview>;
|
package/dist/execution.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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"}
|