@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/CONTRIBUTING.md +54 -0
  3. package/DESIGN.md +1057 -0
  4. package/LICENSE +202 -0
  5. package/README.md +209 -0
  6. package/RELEASING.md +137 -0
  7. package/VALIDATION.md +181 -0
  8. package/dist/build.d.ts +94 -0
  9. package/dist/build.js +433 -0
  10. package/dist/build.js.map +1 -0
  11. package/dist/chunk.d.ts +30 -0
  12. package/dist/chunk.js +296 -0
  13. package/dist/chunk.js.map +1 -0
  14. package/dist/cli.d.ts +2 -0
  15. package/dist/cli.js +276 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/common.d.ts +17 -0
  18. package/dist/common.js +74 -0
  19. package/dist/common.js.map +1 -0
  20. package/dist/git.d.ts +38 -0
  21. package/dist/git.js +224 -0
  22. package/dist/git.js.map +1 -0
  23. package/dist/publish.d.ts +60 -0
  24. package/dist/publish.js +341 -0
  25. package/dist/publish.js.map +1 -0
  26. package/dist/releases.d.ts +8 -0
  27. package/dist/releases.js +79 -0
  28. package/dist/releases.js.map +1 -0
  29. package/dist/remote.d.ts +53 -0
  30. package/dist/remote.js +136 -0
  31. package/dist/remote.js.map +1 -0
  32. package/dist/repository.d.ts +29 -0
  33. package/dist/repository.js +180 -0
  34. package/dist/repository.js.map +1 -0
  35. package/dist/search.d.ts +46 -0
  36. package/dist/search.js +181 -0
  37. package/dist/search.js.map +1 -0
  38. package/dist/settings.d.ts +10 -0
  39. package/dist/settings.js +35 -0
  40. package/dist/settings.js.map +1 -0
  41. package/package.json +58 -0
  42. package/src/build.ts +587 -0
  43. package/src/chunk.ts +328 -0
  44. package/src/cli.ts +366 -0
  45. package/src/common.ts +71 -0
  46. package/src/git.ts +286 -0
  47. package/src/publish.ts +487 -0
  48. package/src/releases.ts +108 -0
  49. package/src/remote.ts +230 -0
  50. package/src/repository.ts +306 -0
  51. package/src/search.ts +282 -0
  52. 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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"}
@@ -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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAY,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,GAAG,EAAwB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAiB,MAAM,eAAe,CAAC;AAkBzD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAsB,EACtB,CAAa,EACb,CAAY;IAEZ,MAAM,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IACvE,SAAS,CACP,OAAO,EAAE,UAAU,KAAK,CAAC,CAAC,UAAU,EACpC,sCAAsC,CACvC,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;IAC9D,SAAS,CACP,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC,MAAM;QACvB,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;QAC1B,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAChC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAC9B,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;QAClC,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa,EACxC,oCAAoC,CACrC,CAAC;IACF,SAAS,CACP,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACpC,sCAAsC,CACvC,CAAC;IACF,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAK,IAAI,CAAC,gBAA6B,CAAC,OAAO,EAAE,EAAE,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,SAAS,CACP,IAAI,EAAE,IAAI,KAAK,WAAW;YACxB,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;YAChC,IAAI,CAAC,WAAW,KAAK,CAAC;YACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,QAAQ,EACtC,yBAAyB,CAC1B,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,OAA2B,CAAC,CAAC;IACrD,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;IAC5E,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,UAAgD,EAAE;IAElD,SAAS,CACP,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAC/C,uCAAuC,CACxC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;QACjD,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;QACpE,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,OAAO;QACL,IAAI,EAAE;YACJ,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YACxB;gBACE,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE;gBACpE,KAAK,EAAE,MAAM;aACd;YACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE;KACF,CAAC;AACJ,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,KAAsB,EACtB,CAAW,EACX,CAAa,EACb,CAAY,EACZ,KAAa,EACb,IAAI,GAAG,EAAE,EACT,UAAgD,EAAE;IAElD,SAAS,CACP,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,EACjD,yCAAyC,CAC1C,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CACzE,CAAC;IACF,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,CAAC,KAAK,CACjC,CAAC,CAAC,OAAO,EACT,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EAC5B,IAAI,CACL,EAAE,CAAC;QACF,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,EACf,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC;QACpC,SAAS,CACP,CAAC,CAAC,IAAI,KAAK,OAAO;YAChB,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;YAC7B,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;YAC/B,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EACnB,qDAAqD,CACtD,CAAC;QACF,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,MAAM,GAAW;YACrB,EAAE;YACF,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;YAClC,OAAO,EAAE,CAAC,CAAC,EAAE;YACb,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;SAC3B,CAAC;QACF,sEAAsE;QACtE,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC1C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAS,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IACzE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC;AACX,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAsB,EACtB,CAAW,EACX,CAAa,EACb,CAAY,EACZ,IAAY;IAEZ,MAAM,CAAC,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxE,SAAS,CACP,CAAC,EAAE,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,EACrD,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAC1D,CAAC;IACF,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI;QACJ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;KACX,CAAC;AACJ,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAsB,EACtB,CAAW,EACX,CAAS,EACT,UAII,EAAE;IAEN,SAAS,CACP,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EACpD,qFAAqF,CACtF,CAAC;IACF,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EACjB,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IACnE,SAAS,CACP,OAAO,EAAE,UAAU,KAAK,CAAC,CAAC,UAAU,EACpC,8CAA8C,CAC/C,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACxD,SAAS,CACP,IAAI,EAAE,IAAI,KAAK,MAAM;QACnB,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU;QAC3C,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QACpB,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;QACnC,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EACtD,wDAAwD,CACzD,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,KAAK,GACT,GAAG,CAAC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACtD,SAAS,CACP,CAAC;YACC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;YACvB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,EACjC,yCAAyC,CAC1C,CAAC;QACF,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAC3B,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxB,SAAS,CACP,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACjB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACnB,CAAC,IAAI,CAAC;YACN,CAAC,GAAG,CAAC;YACL,CAAC,IAAI,GAAG,CAAC,MAAM;YACf,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;YAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAClC,uBAAuB,CACxB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IACrC,SAAS,CACP,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EACzC,wCAAwC,CACzC,CAAC;IACF,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAC3C,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;IACxC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,GAAG,CAAC,CAAC;QACV,GAAG,GAAG,KAAK,CAAC;IACd,CAAC;SAAM,CAAC;QACN,SAAS,CACP,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YACrB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;YACrB,KAAK,IAAI,CAAC;YACV,GAAG,IAAI,KAAK;YACZ,KAAK,IAAI,KAAK;YACd,GAAG,IAAI,KAAK,EACd,iCAAiC,CAClC,CAAC;QACF,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;QACrC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ;QACjC,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,OAAO;QACL,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO;QAChC,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,UAAU;QACV,QAAQ,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE;KAC7E,CAAC;AACJ,CAAC"}
@@ -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>;
@@ -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
+ }