@functional-systems/srcx 0.1.0-dev.4 → 0.1.0-dev.40
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/CHANGELOG.md +179 -0
- package/CONTRIBUTING.md +4 -0
- package/DESIGN.md +378 -58
- package/README.md +628 -35
- package/RELEASING.md +15 -3
- package/VALIDATION.md +1120 -16
- package/dist/artifact.d.ts +31 -0
- package/dist/artifact.js +237 -0
- package/dist/artifact.js.map +1 -0
- package/dist/build.d.ts +86 -3
- package/dist/build.js +233 -71
- package/dist/build.js.map +1 -1
- package/dist/chunk.d.ts +9 -3
- package/dist/chunk.js +341 -14
- package/dist/chunk.js.map +1 -1
- package/dist/cli.js +130 -21
- package/dist/cli.js.map +1 -1
- package/dist/file-policy.d.ts +20 -0
- package/dist/file-policy.js +103 -0
- package/dist/file-policy.js.map +1 -0
- package/dist/implementation.d.ts +11 -0
- package/dist/implementation.js +191 -0
- package/dist/implementation.js.map +1 -0
- package/dist/publish.d.ts +18 -0
- package/dist/publish.js +224 -46
- package/dist/publish.js.map +1 -1
- package/dist/releases.js +21 -3
- package/dist/releases.js.map +1 -1
- package/dist/remote.d.ts +1 -0
- package/dist/remote.js +50 -9
- package/dist/remote.js.map +1 -1
- package/dist/repository.d.ts +4 -1
- package/dist/repository.js +26 -11
- package/dist/repository.js.map +1 -1
- package/dist/rerank.d.ts +16 -0
- package/dist/rerank.js +87 -0
- package/dist/rerank.js.map +1 -0
- package/dist/search.d.ts +18 -3
- package/dist/search.js +143 -23
- package/dist/search.js.map +1 -1
- package/dist/skills.d.ts +24 -0
- package/dist/skills.js +155 -0
- package/dist/skills.js.map +1 -0
- package/package.json +17 -6
- package/runtime/grammars/README.md +50 -0
- package/runtime/grammars/tree-sitter-bash.LICENSE +21 -0
- package/runtime/grammars/tree-sitter-bash.wasm +0 -0
- package/runtime/grammars/tree-sitter-sql.LICENSE +21 -0
- package/runtime/grammars/tree-sitter-sql.wasm +0 -0
- package/runtime/grammars/tree-sitter-wasm.LICENSE +21 -0
- package/runtime/qwen.py +132 -0
- package/runtime/requirements.txt +34 -0
- package/skills/srcx-search/SKILL.md +103 -0
- package/src/artifact.ts +303 -0
- package/src/build.ts +313 -84
- package/src/chunk.ts +360 -12
- package/src/cli.ts +263 -23
- package/src/file-policy.ts +166 -0
- package/src/implementation.ts +253 -0
- package/src/publish.ts +321 -47
- package/src/releases.ts +36 -3
- package/src/remote.ts +70 -13
- package/src/repository.ts +40 -11
- package/src/rerank.ts +131 -0
- package/src/search.ts +229 -28
- package/src/skills.ts +205 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Doc } from "./common.js";
|
|
2
|
+
import type { Build } from "./build.js";
|
|
3
|
+
export type ArtifactStorage = "jsonl" | "segments";
|
|
4
|
+
export type RecordPart = {
|
|
5
|
+
fileId: string;
|
|
6
|
+
digest: string;
|
|
7
|
+
byteLength: number;
|
|
8
|
+
recordCount: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function validateStorage(b: Build): void;
|
|
11
|
+
/** Digest verification completes when the iterator is exhausted; validateBuild always exhausts it. */
|
|
12
|
+
export declare function artifactRecords(b: Build): AsyncGenerator<Doc>;
|
|
13
|
+
/** Owns only this build's output; retained objects are verified again by full build validation. */
|
|
14
|
+
export declare class ArtifactWriter {
|
|
15
|
+
readonly directory: string;
|
|
16
|
+
readonly storage: ArtifactStorage;
|
|
17
|
+
readonly recordHashes: Record<string, string>;
|
|
18
|
+
readonly parts: RecordPart[];
|
|
19
|
+
private output?;
|
|
20
|
+
private pending;
|
|
21
|
+
private pendingBytes;
|
|
22
|
+
private part?;
|
|
23
|
+
private constructor();
|
|
24
|
+
static create(directory: string, storage: ArtifactStorage): Promise<ArtifactWriter>;
|
|
25
|
+
private flush;
|
|
26
|
+
private finishPart;
|
|
27
|
+
emit(doc: Doc): Promise<void>;
|
|
28
|
+
retain(previous: Build, part: RecordPart, ids: readonly string[]): Promise<void>;
|
|
29
|
+
finish(): Promise<void>;
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
}
|
package/dist/artifact.js
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { constants, createReadStream } from "node:fs";
|
|
2
|
+
import { copyFile, link, lstat, mkdir, open, realpath, rename, } from "node:fs/promises";
|
|
3
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { canonical, hash, invariant } from "./common.js";
|
|
7
|
+
const bufferLimit = 64 * 1024;
|
|
8
|
+
const documentLimit = 4_800_000;
|
|
9
|
+
function requireSegmentSupport() {
|
|
10
|
+
invariant(constants.O_NOFOLLOW && constants.O_NONBLOCK, "Segmented artifacts require no-follow file-open support.");
|
|
11
|
+
}
|
|
12
|
+
const objectPath = (directory, digest) => {
|
|
13
|
+
invariant(/^[a-f0-9]{64}$/.test(digest), "Invalid artifact object digest.");
|
|
14
|
+
return join(directory, "objects", `${digest}.jsonl`);
|
|
15
|
+
};
|
|
16
|
+
export function validateStorage(b) {
|
|
17
|
+
invariant(b.format === 1 || b.format === 2, "Unsupported artifact format.");
|
|
18
|
+
if (b.format === 1)
|
|
19
|
+
return;
|
|
20
|
+
const included = b.inventory.filter((e) => e.status === "included");
|
|
21
|
+
const files = new Map(included.map((e) => [e.fileId, e]));
|
|
22
|
+
invariant(files.size === included.length &&
|
|
23
|
+
Array.isArray(b.recordParts) &&
|
|
24
|
+
b.recordParts.length === included.length, "Invalid segmented artifact inventory.");
|
|
25
|
+
const seen = new Set();
|
|
26
|
+
for (const part of b.recordParts) {
|
|
27
|
+
const entry = files.get(part?.fileId);
|
|
28
|
+
invariant(part &&
|
|
29
|
+
typeof part.fileId === "string" &&
|
|
30
|
+
/^f-[a-f0-9]{64}$/.test(part.fileId) &&
|
|
31
|
+
entry &&
|
|
32
|
+
Array.isArray(entry.chunkIds) &&
|
|
33
|
+
!seen.has(part.fileId) &&
|
|
34
|
+
typeof part.digest === "string" &&
|
|
35
|
+
/^[a-f0-9]{64}$/.test(part.digest) &&
|
|
36
|
+
Number.isSafeInteger(part.byteLength) &&
|
|
37
|
+
part.byteLength > 0 &&
|
|
38
|
+
Number.isSafeInteger(part.recordCount) &&
|
|
39
|
+
part.recordCount === entry.chunkIds.length + 1, "Invalid segmented artifact part.");
|
|
40
|
+
seen.add(part.fileId);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function objectDirectory(directory) {
|
|
44
|
+
requireSegmentSupport();
|
|
45
|
+
const path = join(directory, "objects");
|
|
46
|
+
const info = await lstat(path);
|
|
47
|
+
invariant(info.isDirectory() &&
|
|
48
|
+
!info.isSymbolicLink() &&
|
|
49
|
+
(await realpath(path)) === join(await realpath(directory), "objects"), "Artifact objects must be a local regular directory.");
|
|
50
|
+
}
|
|
51
|
+
async function openObject(directory, part) {
|
|
52
|
+
requireSegmentSupport();
|
|
53
|
+
const file = await open(objectPath(directory, part.digest), constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
54
|
+
try {
|
|
55
|
+
const info = await file.stat();
|
|
56
|
+
invariant(info.isFile() && info.size === part.byteLength, "Artifact object is not a regular file of the expected size.");
|
|
57
|
+
return file;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
await file.close();
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Digest verification completes when the iterator is exhausted; validateBuild always exhausts it. */
|
|
65
|
+
export async function* artifactRecords(b) {
|
|
66
|
+
if (b.format === 1) {
|
|
67
|
+
const input = createReadStream(join(b.directory, "records.jsonl"), {
|
|
68
|
+
encoding: "utf8",
|
|
69
|
+
});
|
|
70
|
+
const lines = createInterface({ input, crlfDelay: Infinity });
|
|
71
|
+
try {
|
|
72
|
+
for await (const line of lines)
|
|
73
|
+
if (line)
|
|
74
|
+
yield JSON.parse(line);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
lines.close();
|
|
78
|
+
input.destroy();
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
validateStorage(b);
|
|
83
|
+
await objectDirectory(b.directory);
|
|
84
|
+
const files = new Map(b.inventory.map((e) => [e.fileId, e]));
|
|
85
|
+
for (const part of b.recordParts) {
|
|
86
|
+
const file = await openObject(b.directory, part);
|
|
87
|
+
const input = file.createReadStream({
|
|
88
|
+
autoClose: false,
|
|
89
|
+
highWaterMark: bufferLimit,
|
|
90
|
+
});
|
|
91
|
+
const digest = createHash("sha256"), decoder = new TextDecoder("utf-8", { fatal: true });
|
|
92
|
+
let pending = "", bytes = 0, count = 0;
|
|
93
|
+
try {
|
|
94
|
+
for await (const chunk of input) {
|
|
95
|
+
const data = chunk;
|
|
96
|
+
digest.update(data);
|
|
97
|
+
bytes += data.length;
|
|
98
|
+
pending += decoder.decode(data, { stream: true });
|
|
99
|
+
let newline;
|
|
100
|
+
while ((newline = pending.indexOf("\n")) >= 0) {
|
|
101
|
+
const line = pending.slice(0, newline);
|
|
102
|
+
pending = pending.slice(newline + 1);
|
|
103
|
+
invariant(line.length && Buffer.byteLength(line) <= documentLimit, "Invalid artifact record size.");
|
|
104
|
+
const doc = JSON.parse(line);
|
|
105
|
+
const entry = files.get(part.fileId);
|
|
106
|
+
invariant(count === 0
|
|
107
|
+
? doc.kind === "file" && doc.id === part.fileId
|
|
108
|
+
: doc.kind === "chunk" &&
|
|
109
|
+
doc.fileId === part.fileId &&
|
|
110
|
+
doc.id === entry.chunkIds[count - 1], "Artifact part membership mismatch.");
|
|
111
|
+
count++;
|
|
112
|
+
yield doc;
|
|
113
|
+
}
|
|
114
|
+
invariant(Buffer.byteLength(pending) <= documentLimit, "Artifact record exceeds safe document limit.");
|
|
115
|
+
}
|
|
116
|
+
pending += decoder.decode();
|
|
117
|
+
invariant(!pending &&
|
|
118
|
+
bytes === part.byteLength &&
|
|
119
|
+
count === part.recordCount &&
|
|
120
|
+
digest.digest("hex") === part.digest, "Artifact object digest/count mismatch.");
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
input.destroy();
|
|
124
|
+
await file.close();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Owns only this build's output; retained objects are verified again by full build validation. */
|
|
129
|
+
export class ArtifactWriter {
|
|
130
|
+
directory;
|
|
131
|
+
storage;
|
|
132
|
+
recordHashes = {};
|
|
133
|
+
parts = [];
|
|
134
|
+
output;
|
|
135
|
+
pending = [];
|
|
136
|
+
pendingBytes = 0;
|
|
137
|
+
part;
|
|
138
|
+
constructor(directory, storage) {
|
|
139
|
+
this.directory = directory;
|
|
140
|
+
this.storage = storage;
|
|
141
|
+
}
|
|
142
|
+
static async create(directory, storage) {
|
|
143
|
+
const writer = new ArtifactWriter(directory, storage);
|
|
144
|
+
if (storage === "jsonl")
|
|
145
|
+
writer.output = await open(join(directory, "records.jsonl"), "wx", 0o600);
|
|
146
|
+
else {
|
|
147
|
+
requireSegmentSupport();
|
|
148
|
+
await mkdir(join(directory, "objects"), { mode: 0o700 });
|
|
149
|
+
}
|
|
150
|
+
return writer;
|
|
151
|
+
}
|
|
152
|
+
async flush() {
|
|
153
|
+
if (!this.pending.length)
|
|
154
|
+
return;
|
|
155
|
+
await this.output.write(this.pending.join(""));
|
|
156
|
+
this.pending = [];
|
|
157
|
+
this.pendingBytes = 0;
|
|
158
|
+
}
|
|
159
|
+
async finishPart() {
|
|
160
|
+
await this.flush();
|
|
161
|
+
if (!this.part)
|
|
162
|
+
return;
|
|
163
|
+
await this.output.close();
|
|
164
|
+
this.output = undefined;
|
|
165
|
+
const part = this.part;
|
|
166
|
+
const digest = part.digest.digest("hex");
|
|
167
|
+
// Output is private to this newly created artifact; no other writer shares it.
|
|
168
|
+
await rename(part.temp, objectPath(this.directory, digest));
|
|
169
|
+
this.parts.push({
|
|
170
|
+
fileId: part.fileId,
|
|
171
|
+
digest,
|
|
172
|
+
byteLength: part.bytes,
|
|
173
|
+
recordCount: part.count,
|
|
174
|
+
});
|
|
175
|
+
this.part = undefined;
|
|
176
|
+
}
|
|
177
|
+
async emit(doc) {
|
|
178
|
+
const data = canonical(doc), bytes = Buffer.byteLength(data);
|
|
179
|
+
invariant(bytes <= documentLimit, `Serialized document exceeds safe limit: ${doc.id}`);
|
|
180
|
+
invariant(!this.recordHashes[doc.id], "Duplicate document ID.");
|
|
181
|
+
this.recordHashes[doc.id] = hash(data);
|
|
182
|
+
if (this.storage === "segments") {
|
|
183
|
+
if (doc.kind === "file") {
|
|
184
|
+
await this.finishPart();
|
|
185
|
+
const temp = join(this.directory, "objects", `${randomUUID()}.tmp`);
|
|
186
|
+
this.output = await open(temp, "wx", 0o600);
|
|
187
|
+
this.part = {
|
|
188
|
+
fileId: doc.id,
|
|
189
|
+
temp,
|
|
190
|
+
digest: createHash("sha256"),
|
|
191
|
+
bytes: 0,
|
|
192
|
+
count: 0,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
invariant(this.part, "Orphan artifact chunk.");
|
|
196
|
+
this.part.digest.update(data + "\n");
|
|
197
|
+
this.part.bytes += bytes + 1;
|
|
198
|
+
this.part.count++;
|
|
199
|
+
}
|
|
200
|
+
if (this.pendingBytes + bytes + 1 > bufferLimit)
|
|
201
|
+
await this.flush();
|
|
202
|
+
if (bytes + 1 >= bufferLimit)
|
|
203
|
+
await this.output.write(data + "\n");
|
|
204
|
+
else {
|
|
205
|
+
this.pending.push(data + "\n");
|
|
206
|
+
this.pendingBytes += bytes + 1;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async retain(previous, part, ids) {
|
|
210
|
+
await this.finishPart();
|
|
211
|
+
await objectDirectory(previous.directory);
|
|
212
|
+
const file = await openObject(previous.directory, part);
|
|
213
|
+
await file.close();
|
|
214
|
+
const source = objectPath(previous.directory, part.digest), target = objectPath(this.directory, part.digest);
|
|
215
|
+
try {
|
|
216
|
+
await link(source, target);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (!["EXDEV", "ENOTSUP", "EOPNOTSUPP", "ENOSYS"].includes(error.code ?? ""))
|
|
220
|
+
throw error;
|
|
221
|
+
await copyFile(source, target, constants.COPYFILE_EXCL);
|
|
222
|
+
}
|
|
223
|
+
for (const id of ids) {
|
|
224
|
+
invariant(!this.recordHashes[id], "Duplicate document ID.");
|
|
225
|
+
this.recordHashes[id] = previous.recordHashes[id];
|
|
226
|
+
}
|
|
227
|
+
this.parts.push({ ...part });
|
|
228
|
+
}
|
|
229
|
+
async finish() {
|
|
230
|
+
await this.finishPart();
|
|
231
|
+
}
|
|
232
|
+
async close() {
|
|
233
|
+
await this.output?.close();
|
|
234
|
+
this.output = undefined;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../src/artifact.ts"],"names":[],"mappings":"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"}
|
package/dist/build.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import { type Identity } from "./git.js";
|
|
1
|
+
import { resolveCommit, type Identity } from "./git.js";
|
|
2
2
|
import { CHUNKER } from "./chunk.js";
|
|
3
|
+
import { type ArtifactStorage, type RecordPart } from "./artifact.js";
|
|
3
4
|
import { type Doc } from "./common.js";
|
|
5
|
+
import { type FilePolicy } from "./file-policy.js";
|
|
6
|
+
export declare const ANALYZERS: readonly ["english", "japanese", "korean", "standard"];
|
|
7
|
+
export type Analyzer = (typeof ANALYZERS)[number];
|
|
8
|
+
export declare function normalizeAnalyzers(value: unknown): Analyzer[];
|
|
4
9
|
export declare const INDEX_CONFIGS: {
|
|
5
10
|
readonly kind: {
|
|
6
11
|
readonly type: "keyword";
|
|
@@ -24,15 +29,86 @@ export declare const INDEX_CONFIGS: {
|
|
|
24
29
|
};
|
|
25
30
|
export type Preset = {
|
|
26
31
|
schemaVersion: 1;
|
|
32
|
+
analyzers: readonly Analyzer[];
|
|
27
33
|
chunker: typeof CHUNKER;
|
|
28
34
|
mode: "syntax" | "window";
|
|
35
|
+
/** Internal evaluation override; the CLI keeps its original enrichment. */
|
|
36
|
+
enrichment?: "path-only-v1";
|
|
29
37
|
maxFileBytes: number;
|
|
38
|
+
filePolicy: FilePolicy;
|
|
30
39
|
embedding: {
|
|
31
40
|
model: string;
|
|
32
41
|
dimensions: number;
|
|
42
|
+
managed?: true;
|
|
43
|
+
provider?: "openai";
|
|
44
|
+
similarity?: "cosine";
|
|
45
|
+
sourceField?: "embeddingText";
|
|
33
46
|
} | null;
|
|
34
47
|
};
|
|
35
48
|
export declare const PRESET: Preset;
|
|
49
|
+
/** Embedding variants share the same chunking behavior. */
|
|
50
|
+
export declare const MANAGED_PRESET: Preset;
|
|
51
|
+
export declare const MANAGED_LARGE_PRESET: Preset;
|
|
52
|
+
export declare function presetFor(embedding?: string, analyzers?: readonly string[], filePolicy?: unknown): Preset;
|
|
53
|
+
export declare function supportedPreset(preset: unknown): preset is Preset;
|
|
54
|
+
export declare function indexConfigs(preset?: Preset): {
|
|
55
|
+
searchText: {
|
|
56
|
+
type: "text";
|
|
57
|
+
analyzers: ("english" | "japanese" | "korean" | "standard")[];
|
|
58
|
+
};
|
|
59
|
+
kind: {
|
|
60
|
+
readonly type: "keyword";
|
|
61
|
+
};
|
|
62
|
+
path: {
|
|
63
|
+
readonly type: "keyword";
|
|
64
|
+
};
|
|
65
|
+
language: {
|
|
66
|
+
readonly type: "keyword";
|
|
67
|
+
};
|
|
68
|
+
fileId: {
|
|
69
|
+
readonly type: "keyword";
|
|
70
|
+
};
|
|
71
|
+
symbol: {
|
|
72
|
+
readonly type: "keyword";
|
|
73
|
+
};
|
|
74
|
+
} | {
|
|
75
|
+
embeddingText: {
|
|
76
|
+
analyzers: ("english" | "japanese" | "korean" | "standard")[];
|
|
77
|
+
type: "text";
|
|
78
|
+
};
|
|
79
|
+
embedding: {
|
|
80
|
+
type: string;
|
|
81
|
+
managedEmbedding: boolean;
|
|
82
|
+
embedding: {
|
|
83
|
+
model: string;
|
|
84
|
+
dimensions: number;
|
|
85
|
+
provider?: "openai";
|
|
86
|
+
similarity?: "cosine";
|
|
87
|
+
sourceField?: "embeddingText";
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
searchText: {
|
|
91
|
+
type: "text";
|
|
92
|
+
analyzers: ("english" | "japanese" | "korean" | "standard")[];
|
|
93
|
+
};
|
|
94
|
+
kind: {
|
|
95
|
+
readonly type: "keyword";
|
|
96
|
+
};
|
|
97
|
+
path: {
|
|
98
|
+
readonly type: "keyword";
|
|
99
|
+
};
|
|
100
|
+
language: {
|
|
101
|
+
readonly type: "keyword";
|
|
102
|
+
};
|
|
103
|
+
fileId: {
|
|
104
|
+
readonly type: "keyword";
|
|
105
|
+
};
|
|
106
|
+
symbol: {
|
|
107
|
+
readonly type: "keyword";
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
/** Validate server enrichment separately; all other payload fields remain exact. */
|
|
111
|
+
export declare function recordHash(doc: Doc, preset: Preset): string;
|
|
36
112
|
export type InventoryItem = {
|
|
37
113
|
path: string;
|
|
38
114
|
pathBase64: string;
|
|
@@ -41,6 +117,8 @@ export type InventoryItem = {
|
|
|
41
117
|
bytes: number;
|
|
42
118
|
status: "included" | "excluded";
|
|
43
119
|
reason?: string;
|
|
120
|
+
retrieval?: "lexical" | "semantic";
|
|
121
|
+
policyReason?: string;
|
|
44
122
|
targetBase64?: string;
|
|
45
123
|
fileId?: string;
|
|
46
124
|
chunkIds?: string[];
|
|
@@ -48,10 +126,13 @@ export type InventoryItem = {
|
|
|
48
126
|
parseStatus?: string;
|
|
49
127
|
tokens?: number;
|
|
50
128
|
embedded?: number;
|
|
129
|
+
managed?: number;
|
|
130
|
+
managedTokens?: number;
|
|
51
131
|
skipped?: number;
|
|
52
132
|
};
|
|
53
133
|
export type Build = {
|
|
54
|
-
format: 1;
|
|
134
|
+
format: 1 | 2;
|
|
135
|
+
recordParts?: RecordPart[];
|
|
55
136
|
directory: string;
|
|
56
137
|
repoKey: string;
|
|
57
138
|
configHash: string;
|
|
@@ -79,13 +160,15 @@ export type Embedder = {
|
|
|
79
160
|
dimensions: number;
|
|
80
161
|
embed: (text: string) => Promise<number[]>;
|
|
81
162
|
};
|
|
82
|
-
export declare function records(
|
|
163
|
+
export declare function records(build: Build | string): AsyncGenerator<Doc>;
|
|
83
164
|
export declare function loadBuild(directory: string): Promise<Build>;
|
|
84
165
|
export declare function materialize(args: {
|
|
85
166
|
identity: Identity;
|
|
86
167
|
ref: string;
|
|
168
|
+
resolvedCommit?: Awaited<ReturnType<typeof resolveCommit>>;
|
|
87
169
|
output: string;
|
|
88
170
|
previous?: Build;
|
|
171
|
+
storage?: ArtifactStorage;
|
|
89
172
|
preset?: Preset;
|
|
90
173
|
embedder?: Embedder;
|
|
91
174
|
cache?: string;
|