@znt/sdk-nodejs 1.0.0

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/dist/client.js ADDED
@@ -0,0 +1,277 @@
1
+ import { resolve } from "node:path";
2
+ import { ZntAbortError, ZntCoreConfigMismatchError, ZntProtocolError, ZntScanError, ZntTimeoutError, ZntTransportError } from "./errors.js";
3
+ import { ZntConnection } from "./connection.js";
4
+ import { downloadManagedCore, getDefaultConfig, isManagedCoreInstalled, isManagedCoreConfigured, removeManagedCore, resolveManagedConfigPath, startManagedDaemon, storeManagedSecret, deleteManagedSecret, validateManagedConfig, } from "./daemon.js";
5
+ import { getSetupStatus, setupManagedConfig, } from "./config.js";
6
+ const DEFAULT_SCAN_TIMEOUT_MS = 10 * 60 * 1_000;
7
+ const DEFAULT_POLL_INTERVAL_MS = 250;
8
+ const DEFAULT_WATCH_INTERVAL_MS = 1_000;
9
+ export class ZntClient {
10
+ connection;
11
+ daemonOptions;
12
+ daemonStartPromise;
13
+ constructor(options = {}) {
14
+ this.connection = new ZntConnection(options);
15
+ this.daemonOptions = options;
16
+ }
17
+ get endpoint() {
18
+ return this.connection.endpoint;
19
+ }
20
+ get connected() {
21
+ return this.connection.connected;
22
+ }
23
+ connect() {
24
+ return this.connection.connect();
25
+ }
26
+ async startCore() {
27
+ try {
28
+ const info = await this.info({ timeoutMs: 2_000 });
29
+ const requestedConfig = this.daemonOptions.configPath ?? process.env.ZNT_CONFIG;
30
+ if (requestedConfig && resolve(info.config) !== resolve(requestedConfig)) {
31
+ throw new ZntCoreConfigMismatchError(info.config, resolve(requestedConfig));
32
+ }
33
+ return;
34
+ }
35
+ catch (error) {
36
+ if (!(error instanceof ZntTransportError))
37
+ throw error;
38
+ }
39
+ if (!this.daemonStartPromise) {
40
+ this.daemonStartPromise = startManagedDaemon({
41
+ ...this.daemonOptions,
42
+ endpoint: this.endpoint,
43
+ probe: async () => {
44
+ await this.info({ timeoutMs: 2_000 });
45
+ },
46
+ }).finally(() => {
47
+ this.daemonStartPromise = undefined;
48
+ });
49
+ }
50
+ return this.daemonStartPromise;
51
+ }
52
+ downloadCore(options = {}) {
53
+ return downloadManagedCore(options, this.daemonOptions.coreBinaryPath, this.daemonOptions.configPath);
54
+ }
55
+ isCoreInstalled(expectedVersion) {
56
+ return isManagedCoreInstalled(this.daemonOptions, expectedVersion);
57
+ }
58
+ isCoreConfigured() {
59
+ return isManagedCoreConfigured(this.daemonOptions);
60
+ }
61
+ resolveManagedConfigPath() {
62
+ return this.daemonOptions.configPath
63
+ ?? process.env.ZNT_CONFIG
64
+ ?? resolveManagedConfigPath(this.daemonOptions.coreBinaryPath);
65
+ }
66
+ getDefaultConfig() {
67
+ return getDefaultConfig(this.daemonOptions);
68
+ }
69
+ validateConfig(configPath = this.resolveManagedConfigPath(), options = {}) {
70
+ return validateManagedConfig(configPath, { ...this.daemonOptions, ...options });
71
+ }
72
+ storeSecret(reference, secret, signal) {
73
+ return storeManagedSecret(reference, secret, {
74
+ ...this.daemonOptions,
75
+ ...(signal ? { signal } : {}),
76
+ });
77
+ }
78
+ deleteSecret(reference, signal) {
79
+ return deleteManagedSecret(reference, {
80
+ ...this.daemonOptions,
81
+ ...(signal ? { signal } : {}),
82
+ });
83
+ }
84
+ getSetupStatus(options) {
85
+ return getSetupStatus(options, { ...this.daemonOptions, client: this });
86
+ }
87
+ setupManagedConfig(options) {
88
+ return setupManagedConfig(options, { ...this.daemonOptions, client: this });
89
+ }
90
+ removeCore() {
91
+ return removeManagedCore(this.daemonOptions);
92
+ }
93
+ async stopCore(options) {
94
+ try {
95
+ return await this.shutdown(options);
96
+ }
97
+ finally {
98
+ this.disconnect();
99
+ }
100
+ }
101
+ disconnect() {
102
+ this.connection.disconnect();
103
+ }
104
+ call(method, params = {}, options = {}) {
105
+ return this.connection.call(method, params, options);
106
+ }
107
+ info(options) {
108
+ return this.call("info", {}, options);
109
+ }
110
+ status(options) {
111
+ return this.call("status", {}, options);
112
+ }
113
+ logs(params = {}, options) {
114
+ return this.call("logs", params, options);
115
+ }
116
+ watchStatus(options = {}) {
117
+ return pollSnapshots((requestOptions) => this.status(requestOptions), options, DEFAULT_WATCH_INTERVAL_MS);
118
+ }
119
+ watchScanStatus(options = {}) {
120
+ return pollSnapshots((requestOptions) => this.scanStatus(requestOptions), options, DEFAULT_POLL_INTERVAL_MS);
121
+ }
122
+ watchLogs(options = {}) {
123
+ return pollLogSnapshots((params, requestOptions) => this.logs(params, requestOptions), options, DEFAULT_WATCH_INTERVAL_MS);
124
+ }
125
+ scan(params = {}, options) {
126
+ return this.call("scan", params, options);
127
+ }
128
+ scanStatus(options) {
129
+ return this.call("scan_status", {}, options);
130
+ }
131
+ async semanticSearch(params, options) {
132
+ const result = await this.call("znatok_semantic_search", params, options);
133
+ return result ?? [];
134
+ }
135
+ findSimilar(params, options) {
136
+ return this.call("znatok_find_similar", params, options);
137
+ }
138
+ getSubgraph(params, options) {
139
+ return this.call("znatok_get_subgraph", params, options);
140
+ }
141
+ fileOutline(params, options) {
142
+ return this.call("znatok_file_outline", params, options);
143
+ }
144
+ shutdown(options) {
145
+ return this.call("shutdown", {}, options);
146
+ }
147
+ async waitForScan(options = {}) {
148
+ const timeoutMs = options.timeoutMs ?? DEFAULT_SCAN_TIMEOUT_MS;
149
+ const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
150
+ const startedAt = Date.now();
151
+ for (;;) {
152
+ if (options.signal?.aborted) {
153
+ throw new ZntAbortError();
154
+ }
155
+ const elapsed = Date.now() - startedAt;
156
+ if (timeoutMs > 0 && elapsed >= timeoutMs) {
157
+ throw new ZntTimeoutError("scan_status", timeoutMs);
158
+ }
159
+ const requestTimeout = timeoutMs > 0
160
+ ? Math.min(this.connection.requestTimeoutMs, Math.max(1, timeoutMs - elapsed))
161
+ : this.connection.requestTimeoutMs;
162
+ const requestOptions = { timeoutMs: requestTimeout };
163
+ if (options.signal) {
164
+ requestOptions.signal = options.signal;
165
+ }
166
+ const progress = await this.scanStatus(requestOptions);
167
+ if (options.scanId && progress.scan_id && progress.scan_id !== options.scanId) {
168
+ throw new ZntProtocolError(`Expected scan_id ${options.scanId}, but daemon reports ${progress.scan_id}`);
169
+ }
170
+ if (progress.status === "completed") {
171
+ return progress;
172
+ }
173
+ if (progress.status === "error") {
174
+ throw new ZntScanError(progress);
175
+ }
176
+ await delay(pollIntervalMs, options.signal);
177
+ }
178
+ }
179
+ async scanAndWait(params = {}, options = {}) {
180
+ const started = await this.scan(params, options);
181
+ return this.waitForScan({ ...options, scanId: started.scan_id });
182
+ }
183
+ }
184
+ async function* pollSnapshots(load, options, defaultIntervalMs) {
185
+ const intervalMs = pollingInterval(options, defaultIntervalMs);
186
+ const requestOptions = pollingRequestOptions(options);
187
+ let firstPoll = true;
188
+ let previousSnapshot;
189
+ for (;;) {
190
+ if (options.signal?.aborted) {
191
+ throw new ZntAbortError();
192
+ }
193
+ if (!firstPoll || options.emitInitial === false) {
194
+ await delay(intervalMs, options.signal);
195
+ }
196
+ firstPoll = false;
197
+ const snapshot = await load(requestOptions);
198
+ if (options.signal?.aborted) {
199
+ throw new ZntAbortError();
200
+ }
201
+ const serialized = JSON.stringify(snapshot);
202
+ if (options.distinct === false || serialized !== previousSnapshot) {
203
+ previousSnapshot = serialized;
204
+ yield snapshot;
205
+ }
206
+ }
207
+ }
208
+ async function* pollLogSnapshots(load, options, defaultIntervalMs) {
209
+ const intervalMs = pollingInterval(options, defaultIntervalMs);
210
+ const requestOptions = pollingRequestOptions(options);
211
+ let firstPoll = true;
212
+ let streamID;
213
+ let afterID;
214
+ for (;;) {
215
+ if (options.signal?.aborted) {
216
+ throw new ZntAbortError();
217
+ }
218
+ if (!firstPoll || options.emitInitial === false) {
219
+ await delay(intervalMs, options.signal);
220
+ }
221
+ const params = streamID !== undefined && afterID !== undefined
222
+ ? { stream_id: streamID, after_id: afterID }
223
+ : {};
224
+ const snapshot = await load(params, requestOptions);
225
+ if (options.signal?.aborted) {
226
+ throw new ZntAbortError();
227
+ }
228
+ const streamChanged = streamID !== undefined && snapshot.stream_id !== streamID;
229
+ streamID = snapshot.stream_id;
230
+ afterID = snapshot.next_cursor;
231
+ const shouldEmit = firstPoll
232
+ || options.distinct === false
233
+ || streamChanged
234
+ || snapshot.truncated
235
+ || snapshot.entries.length > 0;
236
+ firstPoll = false;
237
+ if (shouldEmit) {
238
+ yield snapshot;
239
+ }
240
+ }
241
+ }
242
+ function pollingInterval(options, defaultIntervalMs) {
243
+ const intervalMs = options.intervalMs ?? defaultIntervalMs;
244
+ if (!Number.isFinite(intervalMs) || intervalMs < 0) {
245
+ throw new RangeError("intervalMs must be a finite non-negative number");
246
+ }
247
+ return intervalMs;
248
+ }
249
+ function pollingRequestOptions(options) {
250
+ const requestOptions = {};
251
+ if (options.timeoutMs !== undefined) {
252
+ requestOptions.timeoutMs = options.timeoutMs;
253
+ }
254
+ if (options.signal) {
255
+ requestOptions.signal = options.signal;
256
+ }
257
+ return requestOptions;
258
+ }
259
+ function delay(ms, signal) {
260
+ if (signal?.aborted) {
261
+ return Promise.reject(new ZntAbortError());
262
+ }
263
+ return new Promise((resolve, reject) => {
264
+ const cleanup = () => signal?.removeEventListener("abort", onAbort);
265
+ const timer = setTimeout(() => {
266
+ cleanup();
267
+ resolve();
268
+ }, Math.max(0, ms));
269
+ const onAbort = () => {
270
+ clearTimeout(timer);
271
+ cleanup();
272
+ reject(new ZntAbortError());
273
+ };
274
+ signal?.addEventListener("abort", onAbort, { once: true });
275
+ });
276
+ }
277
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5I,OAAO,EAAE,aAAa,EAA6B,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GAKtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,kBAAkB,GAKnB,MAAM,aAAa,CAAC;AAwBrB,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AAChD,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAIxC,MAAM,OAAO,SAAS;IACX,UAAU,CAAgB;IAClB,aAAa,CAAmB;IACzC,kBAAkB,CAA4B;IAEtD,YAAY,UAA4B,EAAE;QACxC,IAAI,CAAC,UAAU,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAChF,IAAI,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBACzE,MAAM,IAAI,0BAA0B,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC;gBAAE,MAAM,KAAK,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;gBAC3C,GAAG,IAAI,CAAC,aAAa;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,KAAK,IAAI,EAAE;oBAChB,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxC,CAAC;aACF,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,UAA+B,EAAE;QAC5C,OAAO,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACxG,CAAC;IAED,eAAe,CAAC,eAAwB;QACtC,OAAO,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IACrE,CAAC;IAED,gBAAgB;QACd,OAAO,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC;IAED,wBAAwB;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU;eAC/B,OAAO,CAAC,GAAG,CAAC,UAAU;eACtB,wBAAwB,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACnE,CAAC;IAED,gBAAgB;QACd,OAAO,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC;IAED,cAAc,CACZ,aAAqB,IAAI,CAAC,wBAAwB,EAAE,EACpD,UAA6D,EAAE;QAE/D,OAAO,qBAAqB,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,MAAc,EAAE,MAAoB;QACjE,OAAO,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE;YAC3C,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,MAAoB;QAClD,OAAO,mBAAmB,CAAC,SAAS,EAAE;YACpC,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,OAA+B;QAC5C,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,kBAAkB,CAAC,OAA2B;QAC5C,OAAO,kBAAkB,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,UAAU;QACR,OAAO,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAU,MAAc,EAAE,SAAqB,EAAE,EAAE,UAA0B,EAAE;QACjF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAU,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC,OAAwB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,OAAwB;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,SAAqB,EAAE,EAAE,OAAwB;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,UAA0B,EAAE;QACtC,OAAO,aAAa,CAClB,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAC/C,OAAO,EACP,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,UAA0B,EAAE;QAC1C,OAAO,aAAa,CAClB,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EACnD,OAAO,EACP,wBAAwB,CACzB,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,UAA0B,EAAE;QACpC,OAAO,gBAAgB,CACrB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAC7D,OAAO,EACP,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAqB,EAAE,EAAE,OAAwB;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,OAAwB;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAA4B,EAAE,OAAwB;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA4B,wBAAwB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrG,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,WAAW,CAAC,MAAyB,EAAE,OAAwB;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW,CAAC,MAAsB,EAAE,OAAwB;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW,CAAC,MAAyB,EAAE,OAAwB;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ,CAAC,OAAwB;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAA8B,EAAE;QAChD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,uBAAuB,CAAC;QAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,wBAAwB,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,SAAS,CAAC;YACR,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC5B,MAAM,IAAI,aAAa,EAAE,CAAC;YAC5B,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,IAAI,SAAS,GAAG,CAAC,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;gBAC1C,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,cAAc,GAAG,SAAS,GAAG,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;gBAC9E,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YACrC,MAAM,cAAc,GAAmB,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;YACrE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,cAAc,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACzC,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAEvD,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC9E,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,OAAO,CAAC,MAAM,wBAAwB,QAAQ,CAAC,OAAO,EAAE,CAC7E,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACpC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAAqB,EAAE,EACvB,UAA8B,EAAE;QAEhC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;CACF;AAED,KAAK,SAAS,CAAC,CAAC,aAAa,CAC3B,IAAmD,EACnD,OAAuB,EACvB,iBAAyB;IAEzB,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,gBAAoC,CAAC;IACzC,SAAS,CAAC;QACR,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAChD,MAAM,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,SAAS,GAAG,KAAK,CAAC;QAElB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;YAClE,gBAAgB,GAAG,UAAU,CAAC;YAC9B,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,gBAAgB,CAC9B,IAA0E,EAC1E,OAAuB,EACvB,iBAAyB;IAEzB,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,QAA4B,CAAC;IACjC,IAAI,OAA2B,CAAC;IAChC,SAAS,CAAC;QACR,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAChD,MAAM,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAe,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;YACxE,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,aAAa,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC;QAChF,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC9B,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC;QAC/B,MAAM,UAAU,GAAG,SAAS;eACvB,OAAO,CAAC,QAAQ,KAAK,KAAK;eAC1B,aAAa;eACb,QAAQ,CAAC,SAAS;eAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACjC,SAAS,GAAG,KAAK,CAAC;QAClB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAuB,EAAE,iBAAyB;IACzE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,UAAU,CAAC,iDAAiD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAuB;IACpD,MAAM,cAAc,GAAmB,EAAE,CAAC;IAC1C,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,cAAc,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,cAAc,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACzC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type ZntDaemonOptions } from "./daemon.js";
2
+ import type { GetSetupStatusOptions, SetupConfigOptions, SetupConfigResult, SetupLanguageRule, SetupMode, SetupRecommendation, SetupStatusResult } from "./types.js";
3
+ export type { GetSetupStatusOptions, SetupConfigOptions, SetupConfigResult, SetupLanguageRule, SetupMode, SetupRecommendation, SetupStatusResult, };
4
+ export declare function credentialReference(providerUrl: string): string;
5
+ export declare function mergeConfig(defaults: any, existing: any): any;
6
+ export declare function writeConfigAtomically(targetPath: string, content: string, validate: (temporaryPath: string) => Promise<void>): Promise<void>;
7
+ export interface SetupDaemonOptions extends ZntDaemonOptions {
8
+ client?: any;
9
+ signal?: AbortSignal;
10
+ }
11
+ export declare function setupManagedConfig(options: SetupConfigOptions, daemonOptions?: SetupDaemonOptions): Promise<SetupStatusResult>;
12
+ export declare function getSetupStatus(options?: GetSetupStatusOptions, daemonOptions?: SetupDaemonOptions): Promise<SetupStatusResult>;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACnB,iBAAiB,GAClB,CAAC;AAQF,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,CAiB7D;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACjD,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,aAAa,GAAE,kBAAuB,GACrC,OAAO,CAAC,iBAAiB,CAAC,CAgJ5B;AAED,wBAAsB,cAAc,CAClC,OAAO,GAAE,qBAA0B,EACnC,aAAa,GAAE,kBAAuB,GACrC,OAAO,CAAC,iBAAiB,CAAC,CAiG5B"}
package/dist/config.js ADDED
@@ -0,0 +1,304 @@
1
+ import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { parse, stringify } from "yaml";
4
+ import { getDefaultConfig, getInstalledCorePath, isManagedCoreInstalled, resolveManagedConfigPath, storeManagedSecret, deleteManagedSecret, validateManagedConfig, } from "./daemon.js";
5
+ const DEFAULT_RECOMMENDATIONS = [
6
+ { mode: "bm25", description: "Lexical BM25 search without an LLM or embeddings." },
7
+ { mode: "ollama", description: "Local generation and vector search; Ollama and its models must be installed." },
8
+ { mode: "openapi", description: "OpenRouter or another OpenAI-compatible provider; configure an embedding model and credential." },
9
+ ];
10
+ export function credentialReference(providerUrl) {
11
+ let service = "default";
12
+ try {
13
+ const host = new URL(providerUrl).hostname.toLowerCase();
14
+ service = host === "openrouter.ai" ? "openrouter" : host.replace(/[^a-z0-9.-]/g, "-");
15
+ }
16
+ catch {
17
+ // Config validation reports an invalid URL before this reference is used.
18
+ }
19
+ return `znt-keyring://${service}/default`;
20
+ }
21
+ export function mergeConfig(defaults, existing) {
22
+ if (Array.isArray(defaults) || Array.isArray(existing)) {
23
+ return existing ?? defaults;
24
+ }
25
+ if (defaults && typeof defaults === "object") {
26
+ const merged = {};
27
+ for (const key of Object.keys(defaults)) {
28
+ merged[key] = mergeConfig(defaults[key], existing?.[key]);
29
+ }
30
+ if (existing && typeof existing === "object") {
31
+ for (const key of Object.keys(existing)) {
32
+ if (!(key in merged))
33
+ merged[key] = existing[key];
34
+ }
35
+ }
36
+ return merged;
37
+ }
38
+ return existing ?? defaults;
39
+ }
40
+ export async function writeConfigAtomically(targetPath, content, validate) {
41
+ const directory = dirname(targetPath);
42
+ await mkdir(directory, { recursive: true, mode: 0o700 });
43
+ const temporaryPath = `${targetPath}.tmp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
44
+ try {
45
+ await writeFile(temporaryPath, content, { encoding: "utf8", mode: 0o600 });
46
+ await chmod(temporaryPath, 0o600);
47
+ await validate(temporaryPath);
48
+ await rename(temporaryPath, targetPath);
49
+ await chmod(targetPath, 0o600);
50
+ }
51
+ catch (error) {
52
+ try {
53
+ await rm(temporaryPath, { force: true });
54
+ }
55
+ catch {
56
+ // Ignore cleanup error
57
+ }
58
+ throw error;
59
+ }
60
+ }
61
+ export async function setupManagedConfig(options, daemonOptions = {}) {
62
+ if (!daemonOptions.client) {
63
+ await getInstalledCorePath(daemonOptions);
64
+ }
65
+ const explicitConfig = options.config_path ?? daemonOptions.configPath;
66
+ const configPath = resolve(explicitConfig ?? resolveManagedConfigPath(daemonOptions.coreBinaryPath));
67
+ const defaultsRaw = daemonOptions.client?.getDefaultConfig
68
+ ? await daemonOptions.client.getDefaultConfig()
69
+ : await getDefaultConfig(daemonOptions);
70
+ const defaults = parse(defaultsRaw) ?? {};
71
+ let existing = {};
72
+ try {
73
+ existing = parse(await readFile(configPath, "utf8")) ?? {};
74
+ }
75
+ catch {
76
+ // Config does not exist yet
77
+ }
78
+ const config = mergeConfig(defaults, existing);
79
+ config.llm ??= {};
80
+ config.semantic ??= {};
81
+ const existingMode = existing?.llm?.provider === "ollama"
82
+ ? "ollama"
83
+ : (existing?.llm?.provider === "" ? "bm25" : (existing?.llm?.provider === "openapi" ? "openapi" : undefined));
84
+ const mode = options.mode ?? existingMode ?? "openapi";
85
+ const previousProvider = existing?.llm?.provider;
86
+ const isSameProvider = previousProvider !== undefined && previousProvider === (mode === "bm25" ? "" : mode);
87
+ delete config.llm.token;
88
+ if (mode === "bm25") {
89
+ config.llm.provider = "";
90
+ config.llm.embed_model = "none";
91
+ config.semantic.mode = "fast";
92
+ delete config.llm.token_env;
93
+ delete config.llm.token_ref;
94
+ }
95
+ else if (mode === "ollama") {
96
+ config.llm.provider = "ollama";
97
+ config.llm.url = options.provider_url ?? (isSameProvider ? existing?.llm?.url : undefined) ?? "http://localhost:11434";
98
+ config.llm.model = options.model ?? (isSameProvider ? existing?.llm?.model : undefined) ?? "codegemma";
99
+ config.llm.embed_model = options.embed_model ?? (isSameProvider ? existing?.llm?.embed_model : undefined) ?? "bge-m3";
100
+ config.semantic.mode = options.semantic_mode ?? (isSameProvider ? existing?.semantic?.mode : undefined) ?? "fast";
101
+ delete config.llm.token_env;
102
+ delete config.llm.token_ref;
103
+ }
104
+ else if (mode === "openapi") {
105
+ const embedModel = options.embed_model ?? (isSameProvider ? existing?.llm?.embed_model : undefined) ?? "bge-m3";
106
+ if (!embedModel) {
107
+ throw new Error("openapi setup requires embed_model; use embed_model=none for lexical-only search");
108
+ }
109
+ const semanticMode = options.semantic_mode ?? (isSameProvider ? existing?.semantic?.mode : undefined) ?? "fast";
110
+ const defaultModel = isSameProvider ? existing?.llm?.model : null;
111
+ const model = options.model !== undefined ? (options.model ? options.model : null) : (defaultModel ?? null);
112
+ if (semanticMode === "llm" && !model) {
113
+ throw new Error("openapi setup requires model when semantic_mode is llm");
114
+ }
115
+ config.llm.provider = "openapi";
116
+ config.llm.url = options.provider_url ?? (isSameProvider ? existing?.llm?.url : undefined) ?? "https://api.openai.com/v1";
117
+ config.llm.model = model;
118
+ config.llm.embed_model = embedModel;
119
+ config.semantic.mode = semanticMode;
120
+ if (options.clear_api_key === true) {
121
+ delete config.llm.token_env;
122
+ delete config.llm.token_ref;
123
+ }
124
+ else if (options.credential_source === "env") {
125
+ if (!options.token_env)
126
+ throw new Error("credential_source=env requires token_env");
127
+ config.llm.token_env = options.token_env;
128
+ delete config.llm.token_ref;
129
+ }
130
+ else if (options.api_key) {
131
+ config.llm.token_ref = credentialReference(config.llm.url);
132
+ delete config.llm.token_env;
133
+ }
134
+ else {
135
+ if (isSameProvider && existing?.llm?.token_env) {
136
+ config.llm.token_env = existing.llm.token_env;
137
+ delete config.llm.token_ref;
138
+ }
139
+ else if (isSameProvider && existing?.llm?.token_ref && config.llm.url === existing?.llm?.url) {
140
+ config.llm.token_ref = existing.llm.token_ref;
141
+ delete config.llm.token_env;
142
+ }
143
+ else {
144
+ config.llm.token_ref = credentialReference(config.llm.url);
145
+ delete config.llm.token_env;
146
+ }
147
+ }
148
+ }
149
+ else {
150
+ throw new Error(`unsupported setup mode: ${mode}`);
151
+ }
152
+ if (options.exclude)
153
+ config.exclude = [...options.exclude];
154
+ if (options.description_language)
155
+ config.semantic.description_language = options.description_language;
156
+ if (options.languages && typeof options.languages === "object") {
157
+ config.languages ??= {};
158
+ for (const [lang, rules] of Object.entries(options.languages)) {
159
+ if (rules && rules.exclude) {
160
+ config.languages[lang] ??= {};
161
+ config.languages[lang].exclude = [...rules.exclude];
162
+ }
163
+ }
164
+ }
165
+ // Canonical performance constraints
166
+ config.llm.retry_delays_seconds = [60, 120, 300];
167
+ config.llm.max_bytes = 25000;
168
+ config.llm.max_embed_bytes = 63768;
169
+ config.semantic.concurrency = { semantic_workers: 6 };
170
+ config.semantic.throttling = { delay_ms: 10, adaptive: true };
171
+ const yamlText = stringify(config, { lineWidth: 0 });
172
+ await writeConfigAtomically(configPath, yamlText, async (temporaryPath) => {
173
+ if (daemonOptions.client?.validateConfig) {
174
+ await daemonOptions.client.validateConfig(temporaryPath, {
175
+ ...(daemonOptions.signal ? { signal: daemonOptions.signal } : {}),
176
+ });
177
+ }
178
+ else {
179
+ await validateManagedConfig(temporaryPath, {
180
+ ...daemonOptions,
181
+ ...(daemonOptions.signal ? { signal: daemonOptions.signal } : {}),
182
+ });
183
+ }
184
+ });
185
+ if (options.clear_api_key && existing?.llm?.token_ref) {
186
+ try {
187
+ if (daemonOptions.client?.deleteSecret) {
188
+ await daemonOptions.client.deleteSecret(existing.llm.token_ref);
189
+ }
190
+ else {
191
+ await deleteManagedSecret(existing.llm.token_ref, daemonOptions);
192
+ }
193
+ }
194
+ catch {
195
+ // Ignore if secret does not exist in keyring
196
+ }
197
+ }
198
+ else if (options.api_key && config.llm.token_ref) {
199
+ if (daemonOptions.client?.storeSecret) {
200
+ await daemonOptions.client.storeSecret(config.llm.token_ref, options.api_key);
201
+ }
202
+ else {
203
+ await storeManagedSecret(config.llm.token_ref, options.api_key, daemonOptions);
204
+ }
205
+ }
206
+ const checkProvider = options.check_provider !== false;
207
+ return getSetupStatus({ configPath, checkProvider }, daemonOptions);
208
+ }
209
+ export async function getSetupStatus(options = {}, daemonOptions = {}) {
210
+ const explicitConfig = options.configPath ?? daemonOptions.configPath;
211
+ const configPath = resolve(explicitConfig ?? resolveManagedConfigPath(daemonOptions.coreBinaryPath));
212
+ const coreInstalled = daemonOptions.client?.isCoreInstalled
213
+ ? await daemonOptions.client.isCoreInstalled()
214
+ : await isManagedCoreInstalled(daemonOptions);
215
+ let parsed;
216
+ try {
217
+ const raw = await readFile(configPath, "utf8");
218
+ parsed = parse(raw);
219
+ }
220
+ catch {
221
+ parsed = undefined;
222
+ }
223
+ if (!coreInstalled || !parsed || typeof parsed !== "object") {
224
+ return {
225
+ status: "unconfigured",
226
+ core_installed: coreInstalled,
227
+ config_path: configPath,
228
+ config_managed: explicitConfig === undefined,
229
+ recommendations: DEFAULT_RECOMMENDATIONS,
230
+ };
231
+ }
232
+ const hasCredential = Boolean(parsed?.llm?.token_ref || parsed?.llm?.token_env);
233
+ const credentialSource = parsed?.llm?.token_env ? "env" : (parsed?.llm?.token_ref ? "keyring" : undefined);
234
+ const tokenRef = parsed?.llm?.token_ref;
235
+ const tokenEnv = parsed?.llm?.token_env;
236
+ const checkProvider = options.checkProvider === true;
237
+ let providerChecked = false;
238
+ try {
239
+ if (daemonOptions.client?.validateConfig) {
240
+ await daemonOptions.client.validateConfig(configPath, {
241
+ ...(checkProvider ? { checkProvider: true } : {}),
242
+ ...(options.signal ? { signal: options.signal } : {}),
243
+ });
244
+ }
245
+ else {
246
+ await validateManagedConfig(configPath, {
247
+ ...daemonOptions,
248
+ ...(checkProvider ? { checkProvider: true } : {}),
249
+ ...(options.signal ? { signal: options.signal } : {}),
250
+ });
251
+ }
252
+ if (checkProvider) {
253
+ providerChecked = true;
254
+ }
255
+ }
256
+ catch (error) {
257
+ const rawMessage = String(error?.message ?? error);
258
+ const message = rawMessage.replace(/Bearer\s+\S+/gi, "Bearer [redacted]");
259
+ const status = /credential|token|keyring|environment variable/i.test(message) ? "credential_required" : "invalid";
260
+ return {
261
+ status,
262
+ core_installed: coreInstalled,
263
+ config_path: configPath,
264
+ config_managed: explicitConfig === undefined,
265
+ message,
266
+ recommendations: DEFAULT_RECOMMENDATIONS,
267
+ provider_url: parsed?.llm?.url,
268
+ mode: parsed?.llm?.provider === "ollama" ? "ollama" : (parsed?.llm?.provider === "" ? "bm25" : "openapi"),
269
+ semantic_mode: parsed?.semantic?.mode,
270
+ description_language: parsed?.semantic?.description_language,
271
+ embed_model: parsed?.llm?.embed_model,
272
+ model: parsed?.llm?.model ?? null,
273
+ ...(hasCredential !== undefined ? { has_credential: hasCredential } : {}),
274
+ ...(credentialSource ? { credential_source: credentialSource } : {}),
275
+ ...(tokenRef ? { token_ref: tokenRef } : {}),
276
+ ...(tokenEnv ? { token_env: tokenEnv } : {}),
277
+ exclude: parsed?.exclude,
278
+ languages: parsed?.languages,
279
+ };
280
+ }
281
+ const mode = parsed?.llm?.provider === "ollama"
282
+ ? "ollama"
283
+ : (parsed?.llm?.provider === "" ? "bm25" : "openapi");
284
+ return {
285
+ status: "ready",
286
+ core_installed: coreInstalled,
287
+ config_path: configPath,
288
+ config_managed: explicitConfig === undefined,
289
+ provider_checked: providerChecked,
290
+ provider_url: parsed?.llm?.url,
291
+ mode,
292
+ semantic_mode: parsed?.semantic?.mode,
293
+ description_language: parsed?.semantic?.description_language,
294
+ embed_model: parsed?.llm?.embed_model,
295
+ model: parsed?.llm?.model ?? null,
296
+ ...(hasCredential !== undefined ? { has_credential: hasCredential } : {}),
297
+ ...(credentialSource ? { credential_source: credentialSource } : {}),
298
+ ...(tokenRef ? { token_ref: tokenRef } : {}),
299
+ ...(tokenEnv ? { token_env: tokenEnv } : {}),
300
+ exclude: parsed?.exclude,
301
+ languages: parsed?.languages,
302
+ };
303
+ }
304
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}