@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.
Files changed (66) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/CONTRIBUTING.md +4 -0
  3. package/DESIGN.md +378 -58
  4. package/README.md +628 -35
  5. package/RELEASING.md +15 -3
  6. package/VALIDATION.md +1120 -16
  7. package/dist/artifact.d.ts +31 -0
  8. package/dist/artifact.js +237 -0
  9. package/dist/artifact.js.map +1 -0
  10. package/dist/build.d.ts +86 -3
  11. package/dist/build.js +233 -71
  12. package/dist/build.js.map +1 -1
  13. package/dist/chunk.d.ts +9 -3
  14. package/dist/chunk.js +341 -14
  15. package/dist/chunk.js.map +1 -1
  16. package/dist/cli.js +130 -21
  17. package/dist/cli.js.map +1 -1
  18. package/dist/file-policy.d.ts +20 -0
  19. package/dist/file-policy.js +103 -0
  20. package/dist/file-policy.js.map +1 -0
  21. package/dist/implementation.d.ts +11 -0
  22. package/dist/implementation.js +191 -0
  23. package/dist/implementation.js.map +1 -0
  24. package/dist/publish.d.ts +18 -0
  25. package/dist/publish.js +224 -46
  26. package/dist/publish.js.map +1 -1
  27. package/dist/releases.js +21 -3
  28. package/dist/releases.js.map +1 -1
  29. package/dist/remote.d.ts +1 -0
  30. package/dist/remote.js +50 -9
  31. package/dist/remote.js.map +1 -1
  32. package/dist/repository.d.ts +4 -1
  33. package/dist/repository.js +26 -11
  34. package/dist/repository.js.map +1 -1
  35. package/dist/rerank.d.ts +16 -0
  36. package/dist/rerank.js +87 -0
  37. package/dist/rerank.js.map +1 -0
  38. package/dist/search.d.ts +18 -3
  39. package/dist/search.js +143 -23
  40. package/dist/search.js.map +1 -1
  41. package/dist/skills.d.ts +24 -0
  42. package/dist/skills.js +155 -0
  43. package/dist/skills.js.map +1 -0
  44. package/package.json +17 -6
  45. package/runtime/grammars/README.md +50 -0
  46. package/runtime/grammars/tree-sitter-bash.LICENSE +21 -0
  47. package/runtime/grammars/tree-sitter-bash.wasm +0 -0
  48. package/runtime/grammars/tree-sitter-sql.LICENSE +21 -0
  49. package/runtime/grammars/tree-sitter-sql.wasm +0 -0
  50. package/runtime/grammars/tree-sitter-wasm.LICENSE +21 -0
  51. package/runtime/qwen.py +132 -0
  52. package/runtime/requirements.txt +34 -0
  53. package/skills/srcx-search/SKILL.md +103 -0
  54. package/src/artifact.ts +303 -0
  55. package/src/build.ts +313 -84
  56. package/src/chunk.ts +360 -12
  57. package/src/cli.ts +263 -23
  58. package/src/file-policy.ts +166 -0
  59. package/src/implementation.ts +253 -0
  60. package/src/publish.ts +321 -47
  61. package/src/releases.ts +36 -3
  62. package/src/remote.ts +70 -13
  63. package/src/repository.ts +40 -11
  64. package/src/rerank.ts +131 -0
  65. package/src/search.ts +229 -28
  66. 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
+ }
@@ -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(directory: string): AsyncGenerator<Doc>;
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;