@functional-systems/srcx 0.1.0-dev.1
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 +20 -0
- package/CONTRIBUTING.md +54 -0
- package/DESIGN.md +1057 -0
- package/LICENSE +202 -0
- package/README.md +209 -0
- package/RELEASING.md +137 -0
- package/VALIDATION.md +181 -0
- package/dist/build.d.ts +94 -0
- package/dist/build.js +433 -0
- package/dist/build.js.map +1 -0
- package/dist/chunk.d.ts +30 -0
- package/dist/chunk.js +296 -0
- package/dist/chunk.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +276 -0
- package/dist/cli.js.map +1 -0
- package/dist/common.d.ts +17 -0
- package/dist/common.js +74 -0
- package/dist/common.js.map +1 -0
- package/dist/git.d.ts +38 -0
- package/dist/git.js +224 -0
- package/dist/git.js.map +1 -0
- package/dist/publish.d.ts +60 -0
- package/dist/publish.js +341 -0
- package/dist/publish.js.map +1 -0
- package/dist/releases.d.ts +8 -0
- package/dist/releases.js +79 -0
- package/dist/releases.js.map +1 -0
- package/dist/remote.d.ts +53 -0
- package/dist/remote.js +136 -0
- package/dist/remote.js.map +1 -0
- package/dist/repository.d.ts +29 -0
- package/dist/repository.js +180 -0
- package/dist/repository.js.map +1 -0
- package/dist/search.d.ts +46 -0
- package/dist/search.js +181 -0
- package/dist/search.js.map +1 -0
- package/dist/settings.d.ts +10 -0
- package/dist/settings.js +35 -0
- package/dist/settings.js.map +1 -0
- package/package.json +58 -0
- package/src/build.ts +587 -0
- package/src/chunk.ts +328 -0
- package/src/cli.ts +366 -0
- package/src/common.ts +71 -0
- package/src/git.ts +286 -0
- package/src/publish.ts +487 -0
- package/src/releases.ts +108 -0
- package/src/remote.ts +230 -0
- package/src/repository.ts +306 -0
- package/src/search.ts +282 -0
- package/src/settings.ts +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Identity } from "./git.js";
|
|
2
|
+
import { LambdaRemote } from "./remote.js";
|
|
3
|
+
import { type Binding } from "./publish.js";
|
|
4
|
+
import { type Settings } from "./settings.js";
|
|
5
|
+
export type Repository = Binding & {
|
|
6
|
+
collection: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
tags: Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
export declare function destination(s: Settings, collection: string): string;
|
|
12
|
+
export declare function collectionName(key: string, name: string, configHash: string): string;
|
|
13
|
+
/** LambdaDB adds its built-in keyword id index to collection metadata. */
|
|
14
|
+
export declare function matchesIndexSchema(actual: unknown): boolean;
|
|
15
|
+
export declare function discover(remote: LambdaRemote): Promise<{
|
|
16
|
+
repositories: Repository[];
|
|
17
|
+
partial: {
|
|
18
|
+
collection: string;
|
|
19
|
+
reason: string;
|
|
20
|
+
}[];
|
|
21
|
+
}>;
|
|
22
|
+
export declare function selectRepository(remote: LambdaRemote, selector: string): Promise<Repository>;
|
|
23
|
+
export declare function register(remote: LambdaRemote, args: {
|
|
24
|
+
path: string;
|
|
25
|
+
remote?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
labels?: Record<string, string>;
|
|
28
|
+
}): Promise<Repository>;
|
|
29
|
+
export declare function attachment(s: Settings, r: Repository): Promise<Identity>;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { atomic, hash, invariant, optionalJson, PURPOSE, } from "./common.js";
|
|
4
|
+
import { PRESET, INDEX_CONFIGS } from "./build.js";
|
|
5
|
+
import { identity } from "./git.js";
|
|
6
|
+
import { one, branch } from "./remote.js";
|
|
7
|
+
import { exclusive } from "./publish.js";
|
|
8
|
+
import { stateRoot } from "./settings.js";
|
|
9
|
+
export function destination(s, collection) {
|
|
10
|
+
return join(stateRoot(), "destinations", hash([s.endpoint, s.project]), collection);
|
|
11
|
+
}
|
|
12
|
+
export function collectionName(key, name, configHash) {
|
|
13
|
+
const slug = name
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
16
|
+
.replace(/^-+|-+$/g, "")
|
|
17
|
+
.slice(0, 24) || "repo";
|
|
18
|
+
return `code-${slug}-${hash(["collection-v1", key, configHash]).slice(0, 16)}`;
|
|
19
|
+
}
|
|
20
|
+
/** LambdaDB adds its built-in keyword id index to collection metadata. */
|
|
21
|
+
export function matchesIndexSchema(actual) {
|
|
22
|
+
if (!actual || typeof actual !== "object" || Array.isArray(actual))
|
|
23
|
+
return false;
|
|
24
|
+
const { id, ...fields } = actual;
|
|
25
|
+
if (id !== undefined && hash(id) !== hash({ type: "keyword" }))
|
|
26
|
+
return false;
|
|
27
|
+
return hash(fields) === hash(INDEX_CONFIGS);
|
|
28
|
+
}
|
|
29
|
+
function descriptor(r) {
|
|
30
|
+
return {
|
|
31
|
+
id: "__repo__",
|
|
32
|
+
kind: "manifest",
|
|
33
|
+
role: "repository",
|
|
34
|
+
schemaVersion: 1,
|
|
35
|
+
configHash: r.configHash,
|
|
36
|
+
repoKey: r.repoKey,
|
|
37
|
+
repoId: r.repoId,
|
|
38
|
+
indexId: r.indexId,
|
|
39
|
+
name: r.name,
|
|
40
|
+
preset: PRESET,
|
|
41
|
+
initialization: "ready",
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function decode(doc, c) {
|
|
45
|
+
invariant(doc?.role === "repository" &&
|
|
46
|
+
doc.initialization === "ready" &&
|
|
47
|
+
doc.configHash === hash(PRESET) &&
|
|
48
|
+
hash(doc.preset) === hash(PRESET), "Repository is partially initialized or uses an unsupported preset.");
|
|
49
|
+
invariant(doc.indexId === c.tags["index-id"] &&
|
|
50
|
+
doc.configHash === c.tags["config-hash"] &&
|
|
51
|
+
c.tags.purpose === PURPOSE, "Repository descriptor and Collection labels disagree.");
|
|
52
|
+
invariant(matchesIndexSchema(c.indexConfigs), "Collection schema differs from the pinned preset.");
|
|
53
|
+
invariant(typeof doc.repoKey === "string" &&
|
|
54
|
+
typeof doc.repoId === "string" &&
|
|
55
|
+
typeof doc.indexId === "string" &&
|
|
56
|
+
typeof doc.name === "string", "Malformed repository descriptor.");
|
|
57
|
+
return {
|
|
58
|
+
collection: c.collectionName,
|
|
59
|
+
repoKey: doc.repoKey,
|
|
60
|
+
repoId: doc.repoId,
|
|
61
|
+
indexId: doc.indexId,
|
|
62
|
+
name: doc.name,
|
|
63
|
+
configHash: String(doc.configHash),
|
|
64
|
+
description: c.description,
|
|
65
|
+
tags: c.tags,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export async function discover(remote) {
|
|
69
|
+
const repositories = [];
|
|
70
|
+
const partial = [];
|
|
71
|
+
for (const c of await remote.collections()) {
|
|
72
|
+
if (c.tags.purpose !== PURPOSE)
|
|
73
|
+
continue;
|
|
74
|
+
const doc = await one(remote.store(c.collectionName), branch("main"), "__repo__", true);
|
|
75
|
+
try {
|
|
76
|
+
repositories.push(decode(doc, c));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
partial.push({
|
|
80
|
+
collection: c.collectionName,
|
|
81
|
+
reason: "Missing/incompatible repository descriptor or schema.",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { repositories, partial };
|
|
86
|
+
}
|
|
87
|
+
export async function selectRepository(remote, selector) {
|
|
88
|
+
const { repositories, partial } = await discover(remote);
|
|
89
|
+
const selected = repositories.filter((r) => r.name === selector ||
|
|
90
|
+
r.repoKey === selector ||
|
|
91
|
+
r.repoKey.split("/").slice(1).join("/") === selector ||
|
|
92
|
+
r.collection === selector);
|
|
93
|
+
invariant(selected.length === 1, selected.length
|
|
94
|
+
? "Ambiguous repository; use its full source identity or Collection name."
|
|
95
|
+
: `Repository not found${partial.length ? "; partially initialized collections exist (see repo list)" : ""}.`);
|
|
96
|
+
return selected[0];
|
|
97
|
+
}
|
|
98
|
+
export async function register(remote, args) {
|
|
99
|
+
const source = await identity(args.path, args.remote);
|
|
100
|
+
const configHash = hash(PRESET), collection = collectionName(source.key, source.name, configHash), state = destination(remote.settings, collection);
|
|
101
|
+
return exclusive(state, async () => {
|
|
102
|
+
const initPath = join(state, "initialization.json");
|
|
103
|
+
let intent = await optionalJson(initPath);
|
|
104
|
+
const existing = (await remote.collections()).find((c) => c.collectionName === collection);
|
|
105
|
+
if (existing) {
|
|
106
|
+
const d = await one(remote.store(collection), branch("main"), "__repo__", true);
|
|
107
|
+
if (d) {
|
|
108
|
+
const result = decode(d, existing);
|
|
109
|
+
invariant(result.repoKey === source.key, "Collection name collision.");
|
|
110
|
+
await atomic(join(state, "attachment.json"), source);
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!intent) {
|
|
115
|
+
invariant(!existing, "Collection exists without a descriptor or a local provisioning journal; refusing adoption.");
|
|
116
|
+
const labels = args.labels ?? {};
|
|
117
|
+
const reserved = ["purpose", "repository", "index-id", "config-hash"];
|
|
118
|
+
invariant(Object.keys(labels).length <= 1 &&
|
|
119
|
+
!Object.keys(labels).some((k) => reserved.includes(k)), "At most one nonreserved metadata tag is allowed.");
|
|
120
|
+
invariant(Object.entries(labels).every(([k, v]) => /^[A-Za-z0-9_.-]{1,63}$/.test(k) &&
|
|
121
|
+
v.length >= 1 &&
|
|
122
|
+
v.length <= 127 &&
|
|
123
|
+
v.trim().length > 0 &&
|
|
124
|
+
!/[:#,]/.test(v)), "Invalid metadata tag.");
|
|
125
|
+
const description = args.description ??
|
|
126
|
+
`Source, tests, and documentation for ${source.key.slice(0, 170)}; version-aware code search.`;
|
|
127
|
+
invariant(description.length <= 255, "Description exceeds 255 characters.");
|
|
128
|
+
const indexId = randomUUID();
|
|
129
|
+
intent = {
|
|
130
|
+
repoKey: source.key,
|
|
131
|
+
name: source.name,
|
|
132
|
+
repoId: randomUUID(),
|
|
133
|
+
indexId,
|
|
134
|
+
collection,
|
|
135
|
+
configHash,
|
|
136
|
+
description,
|
|
137
|
+
tags: {
|
|
138
|
+
purpose: PURPOSE,
|
|
139
|
+
...(source.key.length <= 127 && !/[:#,]/.test(source.key)
|
|
140
|
+
? { repository: source.key }
|
|
141
|
+
: {}),
|
|
142
|
+
"index-id": indexId,
|
|
143
|
+
"config-hash": configHash,
|
|
144
|
+
...labels,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
await atomic(initPath, intent);
|
|
148
|
+
}
|
|
149
|
+
invariant(intent.repoKey === source.key && intent.configHash === configHash, "Provisioning journal identity mismatch.");
|
|
150
|
+
if (existing)
|
|
151
|
+
invariant(hash(existing.tags) === hash(intent.tags) &&
|
|
152
|
+
matchesIndexSchema(existing.indexConfigs), "Existing Collection differs from provisioning journal.");
|
|
153
|
+
else
|
|
154
|
+
await remote.create(collection, JSON.parse(JSON.stringify(INDEX_CONFIGS)), intent.description, intent.tags);
|
|
155
|
+
const store = remote.store(collection);
|
|
156
|
+
const branches = await store.branches();
|
|
157
|
+
const empty = branches.find((b) => b.name === "checkpoint-empty");
|
|
158
|
+
if (empty)
|
|
159
|
+
invariant(empty.snapshotId === null && empty.parent === "main", "Empty checkpoint has been modified.");
|
|
160
|
+
else {
|
|
161
|
+
const main = branches.find((b) => b.name === "main");
|
|
162
|
+
invariant(main && main.snapshotId === null, "Main is not empty; cannot safely initialize checkpoint.");
|
|
163
|
+
await store.branch("checkpoint-empty", "main");
|
|
164
|
+
}
|
|
165
|
+
await store.upsert("main", [descriptor(intent)]);
|
|
166
|
+
const c = (await remote.collections()).find((c) => c.collectionName === collection);
|
|
167
|
+
invariant(c, "Created Collection not discoverable; retry repo add.");
|
|
168
|
+
const result = decode(await one(store, branch("main"), "__repo__", true), c);
|
|
169
|
+
await atomic(join(state, "attachment.json"), source);
|
|
170
|
+
return result;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
export async function attachment(s, r) {
|
|
174
|
+
const saved = await optionalJson(join(destination(s, r.collection), "attachment.json"));
|
|
175
|
+
invariant(saved, "No local checkout attached. Use repo add --path for this repository.");
|
|
176
|
+
const current = await identity(saved.path, saved.remote);
|
|
177
|
+
invariant(current.key === r.repoKey, "Attached checkout now has a different source identity.");
|
|
178
|
+
return current;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type CollectionStore } from "./remote.js";
|
|
2
|
+
import { type Settings } from "./settings.js";
|
|
3
|
+
import type { Repository } from "./repository.js";
|
|
4
|
+
import type { Published } from "./publish.js";
|
|
5
|
+
import type { InventoryItem } from "./build.js";
|
|
6
|
+
export type Handle = {
|
|
7
|
+
id: string;
|
|
8
|
+
endpoint: string;
|
|
9
|
+
project: string;
|
|
10
|
+
repository: Repository;
|
|
11
|
+
version: Published;
|
|
12
|
+
fileId: string;
|
|
13
|
+
path: string;
|
|
14
|
+
contentHash: string;
|
|
15
|
+
chunkId?: string;
|
|
16
|
+
chunkHash?: string;
|
|
17
|
+
startLine: number;
|
|
18
|
+
endLine: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function inventoryAt(store: CollectionStore, r: Repository, v: Published): Promise<InventoryItem[]>;
|
|
21
|
+
export declare function lexicalQuery(query: string, filters?: {
|
|
22
|
+
path?: string;
|
|
23
|
+
language?: string;
|
|
24
|
+
}): Record<string, unknown>;
|
|
25
|
+
export declare function search(store: CollectionStore, s: Settings, r: Repository, v: Published, query: string, size?: number, filters?: {
|
|
26
|
+
path?: string;
|
|
27
|
+
language?: string;
|
|
28
|
+
}): Promise<unknown[]>;
|
|
29
|
+
export declare function loadHandle(id: string): Promise<Handle>;
|
|
30
|
+
export declare function directHandle(store: CollectionStore, s: Settings, r: Repository, v: Published, path: string): Promise<Handle>;
|
|
31
|
+
export declare function readHandle(store: CollectionStore, s: Settings, h: Handle, options?: {
|
|
32
|
+
context?: number;
|
|
33
|
+
fullFile?: boolean;
|
|
34
|
+
lines?: [number, number];
|
|
35
|
+
}): Promise<{
|
|
36
|
+
repository: string;
|
|
37
|
+
commitOid: string;
|
|
38
|
+
version: string;
|
|
39
|
+
snapshotId: string;
|
|
40
|
+
path: string;
|
|
41
|
+
startLine: number;
|
|
42
|
+
endLine: number;
|
|
43
|
+
contentHash: string;
|
|
44
|
+
sourceText: string;
|
|
45
|
+
citation: string;
|
|
46
|
+
}>;
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { atomic, hash, invariant, json, lineAt } from "./common.js";
|
|
4
|
+
import { one, tag } from "./remote.js";
|
|
5
|
+
import { stateRoot } from "./settings.js";
|
|
6
|
+
export async function inventoryAt(store, r, v) {
|
|
7
|
+
const current = (await store.tags()).find((t) => t.name === v.tagName);
|
|
8
|
+
invariant(current?.snapshotId === v.snapshotId, "Pinned Tag was deleted or recreated.");
|
|
9
|
+
const root = await one(store, tag(v.tagName), "__manifest__");
|
|
10
|
+
invariant(root?.repoId === r.repoId &&
|
|
11
|
+
root.indexId === r.indexId &&
|
|
12
|
+
root.configHash === r.configHash &&
|
|
13
|
+
root.commitOid === v.commitOid &&
|
|
14
|
+
root.recordsHash === v.recordsHash &&
|
|
15
|
+
root.inventoryHash === v.inventoryHash, "Pinned manifest identity mismatch.");
|
|
16
|
+
invariant(Array.isArray(root.inventoryPartIds), "Manifest has no inventory part list.");
|
|
17
|
+
const entries = [];
|
|
18
|
+
for (const [n, id] of root.inventoryPartIds.entries()) {
|
|
19
|
+
const part = await one(store, tag(v.tagName), id);
|
|
20
|
+
invariant(part?.role === "inventory" &&
|
|
21
|
+
part.configHash === r.configHash &&
|
|
22
|
+
part.partOrdinal === n &&
|
|
23
|
+
Array.isArray(part.entries) &&
|
|
24
|
+
hash(part.entries) === part.partHash, "Invalid inventory part.");
|
|
25
|
+
entries.push(...part.entries);
|
|
26
|
+
}
|
|
27
|
+
invariant(hash(entries) === root.inventoryHash, "Inventory hash mismatch.");
|
|
28
|
+
return entries;
|
|
29
|
+
}
|
|
30
|
+
export function lexicalQuery(query, filters = {}) {
|
|
31
|
+
invariant(query.trim().length > 0 && query.length <= 4096, "Query must contain 1–4096 characters.");
|
|
32
|
+
const literal = (field, value) => ({
|
|
33
|
+
queryString: { query: value, defaultField: field, skipSyntax: true },
|
|
34
|
+
occur: "filter",
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
bool: [
|
|
38
|
+
literal("kind", "chunk"),
|
|
39
|
+
{
|
|
40
|
+
queryString: { query, defaultField: "searchText", skipSyntax: true },
|
|
41
|
+
occur: "must",
|
|
42
|
+
},
|
|
43
|
+
...(filters.path ? [literal("path", filters.path)] : []),
|
|
44
|
+
...(filters.language ? [literal("language", filters.language)] : []),
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export async function search(store, s, r, v, query, size = 10, filters = {}) {
|
|
49
|
+
invariant(Number.isInteger(size) && size > 0 && size <= 100, "Limit must be an integer from 1 to 100.");
|
|
50
|
+
const entries = await inventoryAt(store, r, v);
|
|
51
|
+
const files = new Map(entries.filter((e) => e.status === "included").map((e) => [e.fileId, e]));
|
|
52
|
+
const result = [];
|
|
53
|
+
for (const hit of await store.query(v.tagName, lexicalQuery(query, filters), size)) {
|
|
54
|
+
const d = hit.doc, e = files.get(d.fileId);
|
|
55
|
+
invariant(d.kind === "chunk" &&
|
|
56
|
+
d.configHash === r.configHash &&
|
|
57
|
+
e?.chunkIds?.includes(d.id) &&
|
|
58
|
+
d.contentHash === e.contentHash &&
|
|
59
|
+
d.path === e.path, "Search returned a record outside the pinned corpus.");
|
|
60
|
+
const id = randomUUID();
|
|
61
|
+
const handle = {
|
|
62
|
+
id,
|
|
63
|
+
endpoint: s.endpoint,
|
|
64
|
+
project: s.project,
|
|
65
|
+
repository: r,
|
|
66
|
+
version: v,
|
|
67
|
+
fileId: String(d.fileId),
|
|
68
|
+
path: String(d.path),
|
|
69
|
+
contentHash: String(d.contentHash),
|
|
70
|
+
chunkId: d.id,
|
|
71
|
+
chunkHash: hash(d),
|
|
72
|
+
startLine: Number(d.startLine),
|
|
73
|
+
endLine: Number(d.endLine),
|
|
74
|
+
};
|
|
75
|
+
// Check the exact source/ranges before persisting an evidence handle.
|
|
76
|
+
const evidence = await readHandle(store, s, handle);
|
|
77
|
+
await atomic(join(stateRoot(), "results", id + ".json"), handle);
|
|
78
|
+
result.push({
|
|
79
|
+
resultId: id,
|
|
80
|
+
repository: r.repoKey,
|
|
81
|
+
commitOid: v.commitOid,
|
|
82
|
+
version: v.tagName,
|
|
83
|
+
snapshotId: v.snapshotId,
|
|
84
|
+
path: d.path,
|
|
85
|
+
startLine: d.startLine,
|
|
86
|
+
endLine: d.endLine,
|
|
87
|
+
symbol: d.symbol,
|
|
88
|
+
score: hit.score,
|
|
89
|
+
excerpt: evidence.sourceText.slice(0, 600),
|
|
90
|
+
citation: evidence.citation,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
export async function loadHandle(id) {
|
|
96
|
+
invariant(/^[a-f0-9-]{36}$/.test(id), "Invalid result handle ID.");
|
|
97
|
+
const h = await json(join(stateRoot(), "results", id + ".json"));
|
|
98
|
+
invariant(h.id === id, "Result handle mismatch.");
|
|
99
|
+
return h;
|
|
100
|
+
}
|
|
101
|
+
export async function directHandle(store, s, r, v, path) {
|
|
102
|
+
const e = (await inventoryAt(store, r, v)).find((e) => e.path === path);
|
|
103
|
+
invariant(e?.status === "included" && e.fileId && e.contentHash, `Path is unavailable${e?.reason ? `: ${e.reason}` : ""}.`);
|
|
104
|
+
return {
|
|
105
|
+
id: "direct",
|
|
106
|
+
endpoint: s.endpoint,
|
|
107
|
+
project: s.project,
|
|
108
|
+
repository: r,
|
|
109
|
+
version: v,
|
|
110
|
+
fileId: e.fileId,
|
|
111
|
+
path,
|
|
112
|
+
contentHash: e.contentHash,
|
|
113
|
+
startLine: 1,
|
|
114
|
+
endLine: 1,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export async function readHandle(store, s, h, options = {}) {
|
|
118
|
+
invariant(h.endpoint === s.endpoint && h.project === s.project, "Result belongs to another endpoint/project; restore that connection before reading.");
|
|
119
|
+
const v = h.version, current = (await store.tags()).find((t) => t.name === v.tagName);
|
|
120
|
+
invariant(current?.snapshotId === v.snapshotId, "Pinned Tag is missing or has been recreated.");
|
|
121
|
+
const file = await one(store, tag(v.tagName), h.fileId);
|
|
122
|
+
invariant(file?.kind === "file" &&
|
|
123
|
+
file.configHash === h.repository.configHash &&
|
|
124
|
+
file.path === h.path &&
|
|
125
|
+
typeof file.sourceText === "string" &&
|
|
126
|
+
file.contentHash === h.contentHash &&
|
|
127
|
+
hash(Buffer.from(file.sourceText)) === h.contentHash, "Original source is missing or its hash does not match.");
|
|
128
|
+
const raw = Buffer.from(file.sourceText);
|
|
129
|
+
const total = raw.length === 0
|
|
130
|
+
? 0
|
|
131
|
+
: lineAt(raw, raw.length - (raw.at(-1) === 10 ? 1 : 0));
|
|
132
|
+
if (h.chunkId) {
|
|
133
|
+
const d = await one(store, tag(v.tagName), h.chunkId);
|
|
134
|
+
invariant(d &&
|
|
135
|
+
hash(d) === h.chunkHash &&
|
|
136
|
+
d.fileId === h.fileId &&
|
|
137
|
+
d.contentHash === h.contentHash, "Pinned chunk has changed or is missing.");
|
|
138
|
+
const a = Number(d.startByte), z = Number(d.endByte);
|
|
139
|
+
invariant(Number.isInteger(a) &&
|
|
140
|
+
Number.isInteger(z) &&
|
|
141
|
+
a >= 0 &&
|
|
142
|
+
z > a &&
|
|
143
|
+
z <= raw.length &&
|
|
144
|
+
lineAt(raw, a) === h.startLine &&
|
|
145
|
+
lineAt(raw, z - 1) === h.endLine, "Invalid source range.");
|
|
146
|
+
}
|
|
147
|
+
const context = options.context ?? 0;
|
|
148
|
+
invariant(Number.isInteger(context) && context >= 0, "Context must be a nonnegative integer.");
|
|
149
|
+
let start = options.lines?.[0] ?? h.startLine, end = options.lines?.[1] ?? h.endLine;
|
|
150
|
+
if (options.fullFile) {
|
|
151
|
+
start = 1;
|
|
152
|
+
end = total;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
invariant(Number.isInteger(start) &&
|
|
156
|
+
Number.isInteger(end) &&
|
|
157
|
+
start >= 1 &&
|
|
158
|
+
end >= start &&
|
|
159
|
+
start <= total &&
|
|
160
|
+
end <= total, "Line range is outside the file.");
|
|
161
|
+
start = Math.max(1, start - context);
|
|
162
|
+
end = Math.min(total, end + context);
|
|
163
|
+
}
|
|
164
|
+
const lines = file.sourceText.match(/[^\n]*\n|[^\n]+$/g) ?? [];
|
|
165
|
+
const sourceText = options.fullFile
|
|
166
|
+
? file.sourceText
|
|
167
|
+
: lines.slice(start - 1, end).join("");
|
|
168
|
+
return {
|
|
169
|
+
repository: h.repository.repoKey,
|
|
170
|
+
commitOid: v.commitOid,
|
|
171
|
+
version: v.tagName,
|
|
172
|
+
snapshotId: v.snapshotId,
|
|
173
|
+
path: h.path,
|
|
174
|
+
startLine: start,
|
|
175
|
+
endLine: end,
|
|
176
|
+
contentHash: h.contentHash,
|
|
177
|
+
sourceText,
|
|
178
|
+
citation: `${h.repository.repoKey}@${v.commitOid}:${h.path}:${start}-${end}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type Settings = {
|
|
2
|
+
endpoint: string;
|
|
3
|
+
project: string;
|
|
4
|
+
apiKeyEnv: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function stateRoot(): string;
|
|
7
|
+
export declare function configPath(): string;
|
|
8
|
+
export declare function validateSettings(s: Settings): Settings;
|
|
9
|
+
export declare function configure(endpoint: string, project: string, apiKeyEnv?: string): Promise<Settings>;
|
|
10
|
+
export declare function loadSettings(): Promise<Settings>;
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { APP, atomic, invariant, json } from "./common.js";
|
|
4
|
+
export function stateRoot() {
|
|
5
|
+
return resolve(process.env.SRCX_STATE_DIR ??
|
|
6
|
+
join(process.env.XDG_STATE_HOME ?? join(homedir(), ".local", "state"), APP));
|
|
7
|
+
}
|
|
8
|
+
export function configPath() {
|
|
9
|
+
return resolve(process.env.SRCX_CONFIG ??
|
|
10
|
+
join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), APP, "config.json"));
|
|
11
|
+
}
|
|
12
|
+
export function validateSettings(s) {
|
|
13
|
+
const u = new URL(s.endpoint);
|
|
14
|
+
const local = ["localhost", "127.0.0.1", "[::1]"].includes(u.hostname);
|
|
15
|
+
invariant((u.protocol === "https:" || (local && u.protocol === "http:")) &&
|
|
16
|
+
!u.username &&
|
|
17
|
+
!u.password &&
|
|
18
|
+
!u.search &&
|
|
19
|
+
!u.hash &&
|
|
20
|
+
u.pathname === "/", "Endpoint must be an HTTPS origin (HTTP loopback is allowed).");
|
|
21
|
+
invariant(/^[A-Za-z0-9_-]+$/.test(s.project), "Invalid project name.");
|
|
22
|
+
invariant(/^[A-Za-z_][A-Za-z0-9_]*$/.test(s.apiKeyEnv), "Invalid API-key environment variable name.");
|
|
23
|
+
return { endpoint: u.origin, project: s.project, apiKeyEnv: s.apiKeyEnv };
|
|
24
|
+
}
|
|
25
|
+
export async function configure(endpoint, project, apiKeyEnv = "LAMBDADB_API_KEY") {
|
|
26
|
+
const s = validateSettings({ endpoint, project, apiKeyEnv });
|
|
27
|
+
await atomic(configPath(), s);
|
|
28
|
+
return s;
|
|
29
|
+
}
|
|
30
|
+
export async function loadSettings() {
|
|
31
|
+
const s = await json(configPath());
|
|
32
|
+
invariant(Object.keys(s).sort().join(",") === "apiKeyEnv,endpoint,project", "Invalid config; never save secrets in this file.");
|
|
33
|
+
return validateSettings(s);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CACZ,OAAO,CAAC,GAAG,CAAC,cAAc;QACxB,IAAI,CACF,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAChE,GAAG,CACJ,CACJ,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CACZ,OAAO,CAAC,GAAG,CAAC,WAAW;QACrB,IAAI,CACF,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EACzD,GAAG,EACH,aAAa,CACd,CACJ,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,CAAW;IAC1C,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvE,SAAS,CACP,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC,QAAQ;QACX,CAAC,CAAC,CAAC,QAAQ;QACX,CAAC,CAAC,CAAC,MAAM;QACT,CAAC,CAAC,CAAC,IAAI;QACP,CAAC,CAAC,QAAQ,KAAK,GAAG,EACpB,8DAA8D,CAC/D,CAAC;IACF,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC;IACvE,SAAS,CACP,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAC5C,4CAA4C,CAC7C,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AAC5E,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,OAAe,EACf,SAAS,GAAG,kBAAkB;IAE9B,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC;AACX,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAW,UAAU,EAAE,CAAC,CAAC;IAC7C,SAAS,CACP,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,4BAA4B,EAChE,kDAAkD,CACnD,CAAC;IACF,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@functional-systems/srcx",
|
|
3
|
+
"version": "0.1.0-dev.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Version-aware code search on LambdaDB",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"srcx": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"DESIGN.md",
|
|
14
|
+
"VALIDATION.md",
|
|
15
|
+
"src",
|
|
16
|
+
"CONTRIBUTING.md",
|
|
17
|
+
"RELEASING.md",
|
|
18
|
+
"CHANGELOG.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22.14.0"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc && node -e \"require('node:fs').chmodSync('dist/cli.js', 0o755)\"",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"test": "npm run build && node --test --test-timeout=60000 test/*.test.mjs",
|
|
28
|
+
"start": "node dist/cli.js",
|
|
29
|
+
"demo": "npm run build && node scripts/demo.mjs",
|
|
30
|
+
"prepack": "npm run build",
|
|
31
|
+
"format": "prettier --write src test scripts README.md VALIDATION.md CONTRIBUTING.md RELEASING.md CHANGELOG.md .github package.json tsconfig.json",
|
|
32
|
+
"format:check": "prettier --check src test scripts README.md VALIDATION.md CONTRIBUTING.md RELEASING.md CHANGELOG.md .github package.json tsconfig.json",
|
|
33
|
+
"test:live": "npm run build && node --env-file=.env.local scripts/live.mjs",
|
|
34
|
+
"check:version": "node scripts/check-release.mjs",
|
|
35
|
+
"test:package": "node scripts/test-package.mjs"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@functional-systems/lambdadb": "0.5.1",
|
|
39
|
+
"commander": "14.0.3",
|
|
40
|
+
"js-tiktoken": "1.0.21",
|
|
41
|
+
"tree-sitter-wasms": "0.1.13",
|
|
42
|
+
"web-tree-sitter": "0.25.10"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "22.19.15",
|
|
46
|
+
"prettier": "3.9.9",
|
|
47
|
+
"typescript": "5.8.3"
|
|
48
|
+
},
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "git+https://github.com/lambdadb/srcx.git"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://github.com/lambdadb/srcx#readme",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/lambdadb/srcx/issues"
|
|
56
|
+
},
|
|
57
|
+
"license": "Apache-2.0"
|
|
58
|
+
}
|