bikky 0.3.5 → 0.3.6

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 (141) hide show
  1. package/README.md +11 -4
  2. package/dist/cli.js +26 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +21 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +249 -2
  7. package/dist/config.js.map +1 -1
  8. package/dist/config.test.js +84 -1
  9. package/dist/config.test.js.map +1 -1
  10. package/dist/daemon/consolidation.d.ts +4 -1
  11. package/dist/daemon/consolidation.d.ts.map +1 -1
  12. package/dist/daemon/consolidation.js +18 -4
  13. package/dist/daemon/consolidation.js.map +1 -1
  14. package/dist/daemon/entity-typing.d.ts +33 -11
  15. package/dist/daemon/entity-typing.d.ts.map +1 -1
  16. package/dist/daemon/entity-typing.js +203 -74
  17. package/dist/daemon/entity-typing.js.map +1 -1
  18. package/dist/daemon/entity-typing.test.d.ts +2 -0
  19. package/dist/daemon/entity-typing.test.d.ts.map +1 -0
  20. package/dist/daemon/entity-typing.test.js +50 -0
  21. package/dist/daemon/entity-typing.test.js.map +1 -0
  22. package/dist/daemon/episode-summary.d.ts +1 -8
  23. package/dist/daemon/episode-summary.d.ts.map +1 -1
  24. package/dist/daemon/episode-summary.js +33 -16
  25. package/dist/daemon/episode-summary.js.map +1 -1
  26. package/dist/daemon/episode-summary.test.js +6 -3
  27. package/dist/daemon/episode-summary.test.js.map +1 -1
  28. package/dist/daemon/extraction.d.ts.map +1 -1
  29. package/dist/daemon/extraction.js +14 -5
  30. package/dist/daemon/extraction.js.map +1 -1
  31. package/dist/daemon/loop.d.ts.map +1 -1
  32. package/dist/daemon/loop.js +9 -1
  33. package/dist/daemon/loop.js.map +1 -1
  34. package/dist/daemon/loop.test.d.ts +2 -0
  35. package/dist/daemon/loop.test.d.ts.map +1 -0
  36. package/dist/daemon/loop.test.js +85 -0
  37. package/dist/daemon/loop.test.js.map +1 -0
  38. package/dist/daemon/maintenance-state.d.ts +36 -0
  39. package/dist/daemon/maintenance-state.d.ts.map +1 -0
  40. package/dist/daemon/maintenance-state.js +95 -0
  41. package/dist/daemon/maintenance-state.js.map +1 -0
  42. package/dist/daemon/maintenance-state.test.d.ts +2 -0
  43. package/dist/daemon/maintenance-state.test.d.ts.map +1 -0
  44. package/dist/daemon/maintenance-state.test.js +56 -0
  45. package/dist/daemon/maintenance-state.test.js.map +1 -0
  46. package/dist/daemon/qdrant.d.ts +22 -0
  47. package/dist/daemon/qdrant.d.ts.map +1 -1
  48. package/dist/daemon/qdrant.js +62 -10
  49. package/dist/daemon/qdrant.js.map +1 -1
  50. package/dist/daemon/qdrant.test.js +57 -1
  51. package/dist/daemon/qdrant.test.js.map +1 -1
  52. package/dist/daemon/relations.d.ts +47 -34
  53. package/dist/daemon/relations.d.ts.map +1 -1
  54. package/dist/daemon/relations.js +241 -155
  55. package/dist/daemon/relations.js.map +1 -1
  56. package/dist/daemon/relations.test.d.ts +2 -0
  57. package/dist/daemon/relations.test.d.ts.map +1 -0
  58. package/dist/daemon/relations.test.js +36 -0
  59. package/dist/daemon/relations.test.js.map +1 -0
  60. package/dist/daemon/session-index.d.ts +1 -8
  61. package/dist/daemon/session-index.d.ts.map +1 -1
  62. package/dist/daemon/session-index.js +8 -10
  63. package/dist/daemon/session-index.js.map +1 -1
  64. package/dist/daemon/session-index.test.js +14 -8
  65. package/dist/daemon/session-index.test.js.map +1 -1
  66. package/dist/daemon/session-summary.d.ts +1 -8
  67. package/dist/daemon/session-summary.d.ts.map +1 -1
  68. package/dist/daemon/session-summary.js +17 -12
  69. package/dist/daemon/session-summary.js.map +1 -1
  70. package/dist/daemon/session-summary.test.js +5 -3
  71. package/dist/daemon/session-summary.test.js.map +1 -1
  72. package/dist/daemon/workstream-summary.d.ts +1 -8
  73. package/dist/daemon/workstream-summary.d.ts.map +1 -1
  74. package/dist/daemon/workstream-summary.js +22 -14
  75. package/dist/daemon/workstream-summary.js.map +1 -1
  76. package/dist/daemon/workstream-summary.test.js +6 -3
  77. package/dist/daemon/workstream-summary.test.js.map +1 -1
  78. package/dist/lib/qdrant-client.d.ts +34 -0
  79. package/dist/lib/qdrant-client.d.ts.map +1 -1
  80. package/dist/lib/qdrant-client.js +54 -0
  81. package/dist/lib/qdrant-client.js.map +1 -1
  82. package/dist/lib/qdrant-client.test.js +49 -1
  83. package/dist/lib/qdrant-client.test.js.map +1 -1
  84. package/dist/llm/inference/index.d.ts +2 -1
  85. package/dist/llm/inference/index.d.ts.map +1 -1
  86. package/dist/llm/inference/index.js +37 -2
  87. package/dist/llm/inference/index.js.map +1 -1
  88. package/dist/llm/inference/index.test.js +44 -3
  89. package/dist/llm/inference/index.test.js.map +1 -1
  90. package/dist/llm/inference/providers/bedrock.d.ts +23 -0
  91. package/dist/llm/inference/providers/bedrock.d.ts.map +1 -1
  92. package/dist/llm/inference/providers/bedrock.js +10 -1
  93. package/dist/llm/inference/providers/bedrock.js.map +1 -1
  94. package/dist/llm/inference/providers/bedrock.test.js +49 -2
  95. package/dist/llm/inference/providers/bedrock.test.js.map +1 -1
  96. package/dist/llm/inference/providers/ollama.d.ts.map +1 -1
  97. package/dist/llm/inference/providers/ollama.js +7 -1
  98. package/dist/llm/inference/providers/ollama.js.map +1 -1
  99. package/dist/llm/inference/providers/openai.d.ts.map +1 -1
  100. package/dist/llm/inference/providers/openai.js +7 -1
  101. package/dist/llm/inference/providers/openai.js.map +1 -1
  102. package/dist/llm/inference/providers/openai.test.js +38 -2
  103. package/dist/llm/inference/providers/openai.test.js.map +1 -1
  104. package/dist/llm/inference/providers/portkey.d.ts.map +1 -1
  105. package/dist/llm/inference/providers/portkey.js +7 -1
  106. package/dist/llm/inference/providers/portkey.js.map +1 -1
  107. package/dist/llm/inference/types.d.ts +15 -0
  108. package/dist/llm/inference/types.d.ts.map +1 -1
  109. package/dist/llm/telemetry.d.ts +8 -1
  110. package/dist/llm/telemetry.d.ts.map +1 -1
  111. package/dist/llm/telemetry.js.map +1 -1
  112. package/dist/mcp/taxonomy.d.ts.map +1 -1
  113. package/dist/mcp/taxonomy.js +10 -0
  114. package/dist/mcp/taxonomy.js.map +1 -1
  115. package/dist/mcp/taxonomy.test.js +13 -2
  116. package/dist/mcp/taxonomy.test.js.map +1 -1
  117. package/dist/mcp/tools.d.ts.map +1 -1
  118. package/dist/mcp/tools.js +28 -25
  119. package/dist/mcp/tools.js.map +1 -1
  120. package/dist/mcp/tools.test.js +70 -5
  121. package/dist/mcp/tools.test.js.map +1 -1
  122. package/dist/privacy/redaction.d.ts +21 -0
  123. package/dist/privacy/redaction.d.ts.map +1 -0
  124. package/dist/privacy/redaction.js +83 -0
  125. package/dist/privacy/redaction.js.map +1 -0
  126. package/dist/privacy/redaction.test.d.ts +2 -0
  127. package/dist/privacy/redaction.test.d.ts.map +1 -0
  128. package/dist/privacy/redaction.test.js +51 -0
  129. package/dist/privacy/redaction.test.js.map +1 -0
  130. package/dist/prompts/relations.d.ts.map +1 -1
  131. package/dist/prompts/relations.js +60 -14
  132. package/dist/prompts/relations.js.map +1 -1
  133. package/dist/status.d.ts +94 -0
  134. package/dist/status.d.ts.map +1 -0
  135. package/dist/status.js +378 -0
  136. package/dist/status.js.map +1 -0
  137. package/dist/status.test.d.ts +5 -0
  138. package/dist/status.test.d.ts.map +1 -0
  139. package/dist/status.test.js +203 -0
  140. package/dist/status.test.js.map +1 -0
  141. package/package.json +1 -1
package/dist/status.js ADDED
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Read-only health diagnostics for `bikky status`.
3
+ */
4
+ import { getActiveConfigEnvOverrides, inspectConfigFile, loadConfig, } from "./config.js";
5
+ import { getDaemonStatus } from "./lifecycle.js";
6
+ import { embed, getEmbeddingConfig, getEmbeddingProvider, getInferenceProvider, initEmbedding, initLLM, listEmbeddingProviders, listInferenceProviders, } from "./llm/index.js";
7
+ import { getCollectionVectorSize, inspectPayloadIndexes, QdrantClient, QdrantNotFoundError, } from "./lib/qdrant-client.js";
8
+ import { QDRANT_INDEXES } from "./mcp/taxonomy.js";
9
+ import { MAINTENANCE_STATE_PATH, readMaintenanceState, } from "./daemon/maintenance-state.js";
10
+ const API_KEY_REQUIRED_PROVIDERS = new Set(["openai", "portkey"]);
11
+ const SENSITIVE_QUERY_PARAM = /(api[-_]?key|access[-_]?token|token|secret|password|credential|auth)/i;
12
+ function diagnosticIssue(issue) {
13
+ return {
14
+ severity: issue.severity === "error" ? "error" : "warning",
15
+ path: issue.path,
16
+ message: issue.message,
17
+ };
18
+ }
19
+ function statusFromIssues(issues) {
20
+ if (issues.some((issue) => issue.severity === "error"))
21
+ return "error";
22
+ if (issues.length > 0)
23
+ return "warn";
24
+ return "ok";
25
+ }
26
+ function errMessage(err) {
27
+ return err instanceof Error ? err.message : String(err);
28
+ }
29
+ function apiKeyIssue(provider, apiKey) {
30
+ if (!API_KEY_REQUIRED_PROVIDERS.has(provider))
31
+ return null;
32
+ return apiKey ? null : `${provider} provider requires an API key`;
33
+ }
34
+ function numberOrNull(value) {
35
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
36
+ }
37
+ export function sanitizeStatusUrl(url) {
38
+ if (!url)
39
+ return null;
40
+ try {
41
+ const parsed = new URL(url);
42
+ parsed.username = "";
43
+ parsed.password = "";
44
+ for (const key of [...parsed.searchParams.keys()]) {
45
+ if (SENSITIVE_QUERY_PARAM.test(key))
46
+ parsed.searchParams.set(key, "REDACTED");
47
+ }
48
+ return parsed.toString().replace(/\/$/, parsed.pathname === "/" ? "" : "/");
49
+ }
50
+ catch {
51
+ return url
52
+ .replace(/\/\/[^/@\s]+@/, "//[REDACTED]@")
53
+ .replace(/([?&][^=&#]*(?:api[-_]?key|access[-_]?token|token|secret|password|credential|auth)[^=&#]*=)[^&#]*/gi, "$1REDACTED");
54
+ }
55
+ }
56
+ function collectConfigStatus() {
57
+ const file = inspectConfigFile();
58
+ const issues = file.issues.map(diagnosticIssue);
59
+ return {
60
+ status: statusFromIssues(issues),
61
+ path: file.path,
62
+ exists: file.exists,
63
+ parse_error: file.parse_error,
64
+ env_overrides: getActiveConfigEnvOverrides(),
65
+ issues,
66
+ };
67
+ }
68
+ async function collectQdrantStatus(cfg, embeddingDimensions, opts) {
69
+ const qdrantUrl = typeof cfg.qdrant_url === "string" ? cfg.qdrant_url : null;
70
+ const collection = typeof cfg.collection === "string" && cfg.collection ? cfg.collection : "bikky";
71
+ const base = {
72
+ status: "error",
73
+ configured: Boolean(qdrantUrl),
74
+ reachable: false,
75
+ url: sanitizeStatusUrl(qdrantUrl),
76
+ collection,
77
+ collection_exists: false,
78
+ points_count: null,
79
+ vectors_count: null,
80
+ vector_size: null,
81
+ expected_vector_size: embeddingDimensions,
82
+ expected_indexes: QDRANT_INDEXES.length,
83
+ present_indexes: 0,
84
+ missing_indexes: [],
85
+ mismatched_indexes: [],
86
+ error: null,
87
+ };
88
+ if (!qdrantUrl) {
89
+ return { ...base, error: "Qdrant URL is not configured" };
90
+ }
91
+ const client = new QdrantClient({
92
+ url: qdrantUrl,
93
+ apiKey: typeof cfg.qdrant_api_key === "string" ? cfg.qdrant_api_key : null,
94
+ collection,
95
+ timeoutMs: opts.qdrantTimeoutMs ?? Math.min(numberOrNull(cfg.qdrant_client.timeout_ms) ?? 5_000, 5_000),
96
+ retries: 0,
97
+ });
98
+ try {
99
+ await client.request("GET", "/collections");
100
+ base.reachable = true;
101
+ }
102
+ catch (err) {
103
+ return { ...base, error: errMessage(err) };
104
+ }
105
+ try {
106
+ const info = await client.getCollectionInfo();
107
+ const readiness = inspectPayloadIndexes(info, QDRANT_INDEXES);
108
+ const vectorSize = getCollectionVectorSize(info);
109
+ const vectorMismatch = vectorSize !== null && embeddingDimensions !== null && vectorSize !== embeddingDimensions;
110
+ base.collection_exists = true;
111
+ base.points_count = typeof info.points_count === "number" ? info.points_count : null;
112
+ base.vectors_count = typeof info.vectors_count === "number" ? info.vectors_count : null;
113
+ base.vector_size = vectorSize;
114
+ base.present_indexes = Object.keys(readiness.present).length;
115
+ base.missing_indexes = readiness.missing;
116
+ base.mismatched_indexes = readiness.mismatched;
117
+ base.status = vectorMismatch || readiness.mismatched.length > 0
118
+ ? "error"
119
+ : readiness.missing.length > 0
120
+ ? "warn"
121
+ : "ok";
122
+ base.error = vectorMismatch
123
+ ? `Qdrant vector size ${vectorSize} does not match embedding dimensions ${embeddingDimensions}`
124
+ : readiness.mismatched.length > 0
125
+ ? "Qdrant payload indexes have schema mismatches"
126
+ : null;
127
+ return base;
128
+ }
129
+ catch (err) {
130
+ if (err instanceof QdrantNotFoundError) {
131
+ return { ...base, reachable: true, collection_exists: false, error: `Collection '${collection}' does not exist` };
132
+ }
133
+ return { ...base, reachable: true, error: errMessage(err) };
134
+ }
135
+ }
136
+ async function collectEmbeddingStatus(cfg, live) {
137
+ const dimensions = numberOrNull(cfg.embedding.dimensions) ?? undefined;
138
+ const base = {
139
+ status: "error",
140
+ provider: cfg.embedding.provider,
141
+ model: cfg.embedding.model,
142
+ base_url: sanitizeStatusUrl(cfg.embedding.base_url) ?? "",
143
+ dimensions,
144
+ live_checked: false,
145
+ error: null,
146
+ };
147
+ try {
148
+ getEmbeddingProvider(cfg.embedding.provider);
149
+ const keyIssue = apiKeyIssue(cfg.embedding.provider, cfg.embedding.api_key);
150
+ if (keyIssue)
151
+ return { ...base, error: keyIssue };
152
+ const resolved = initEmbedding({
153
+ provider: cfg.embedding.provider,
154
+ model: cfg.embedding.model,
155
+ dimensions,
156
+ baseUrl: cfg.embedding.base_url,
157
+ apiKey: cfg.embedding.api_key,
158
+ extra: cfg.embedding.extra ?? {},
159
+ timeoutMs: cfg.embedding.timeout_ms,
160
+ retries: cfg.embedding.retries,
161
+ retryBaseDelayMs: cfg.embedding.retry_base_delay_ms,
162
+ });
163
+ base.provider = resolved.provider;
164
+ base.model = resolved.model;
165
+ base.base_url = sanitizeStatusUrl(resolved.baseUrl) ?? "";
166
+ base.dimensions = resolved.dimensions;
167
+ if (live) {
168
+ await embed("bikky status embedding check");
169
+ base.live_checked = true;
170
+ }
171
+ return { ...base, status: "ok" };
172
+ }
173
+ catch (err) {
174
+ const known = listEmbeddingProviders().map((p) => p.name).sort().join(", ");
175
+ return { ...base, error: `${errMessage(err)} (available embedding providers: ${known})` };
176
+ }
177
+ }
178
+ function collectLlmStatus(cfg) {
179
+ const base = {
180
+ status: "error",
181
+ provider: cfg.llm.provider,
182
+ model: cfg.llm.model,
183
+ base_url: sanitizeStatusUrl(cfg.llm.base_url) ?? "",
184
+ live_checked: false,
185
+ error: null,
186
+ };
187
+ try {
188
+ getInferenceProvider(cfg.llm.provider);
189
+ if (cfg.llm.fallback_provider)
190
+ getInferenceProvider(cfg.llm.fallback_provider);
191
+ const keyIssue = apiKeyIssue(cfg.llm.provider, cfg.llm.api_key);
192
+ if (keyIssue)
193
+ return { ...base, error: keyIssue };
194
+ const resolved = initLLM({
195
+ config: {
196
+ provider: cfg.llm.provider,
197
+ model: cfg.llm.model,
198
+ baseUrl: cfg.llm.base_url,
199
+ apiKey: cfg.llm.api_key,
200
+ fallback: cfg.llm.fallback_provider ?? null,
201
+ extra: cfg.llm.extra ?? {},
202
+ timeoutMs: cfg.llm.timeout_ms,
203
+ retries: cfg.llm.retries,
204
+ retryBaseDelayMs: cfg.llm.retry_base_delay_ms,
205
+ },
206
+ });
207
+ return {
208
+ ...base,
209
+ status: "ok",
210
+ provider: resolved.provider,
211
+ model: resolved.model,
212
+ base_url: sanitizeStatusUrl(resolved.baseUrl) ?? "",
213
+ };
214
+ }
215
+ catch (err) {
216
+ const known = listInferenceProviders().map((p) => p.name).sort().join(", ");
217
+ return { ...base, error: `${errMessage(err)} (available LLM providers: ${known})` };
218
+ }
219
+ }
220
+ function collectDaemonStatus() {
221
+ const daemon = getDaemonStatus();
222
+ return {
223
+ status: daemon.running ? "ok" : "warn",
224
+ running: daemon.running,
225
+ pid: daemon.pid,
226
+ };
227
+ }
228
+ function collectMaintenanceStatus() {
229
+ const state = readMaintenanceState();
230
+ const jobStatus = (jobName) => {
231
+ const job = state.jobs[jobName];
232
+ return {
233
+ last_run_at: job.last_run_at,
234
+ cursor_updated_at: job.cursor_updated_at,
235
+ last_summary: job.last_summary,
236
+ };
237
+ };
238
+ const summaries = [state.jobs.relation_inference.last_summary, state.jobs.entity_typing.last_summary];
239
+ const hasError = summaries.some((summary) => summary?.status === "error");
240
+ return {
241
+ status: hasError ? "warn" : "ok",
242
+ state_path: MAINTENANCE_STATE_PATH,
243
+ relation_inference: jobStatus("relation_inference"),
244
+ entity_typing: jobStatus("entity_typing"),
245
+ };
246
+ }
247
+ async function collectUiStatus(opts) {
248
+ const url = opts.uiUrl ?? "http://localhost:1422/health";
249
+ const reportedUrl = sanitizeStatusUrl(url) ?? url;
250
+ if (opts.checkUi === false) {
251
+ return { status: "skipped", checked: false, url: reportedUrl, ok: null, error: null };
252
+ }
253
+ try {
254
+ const signal = AbortSignal.timeout(opts.uiTimeoutMs ?? 750);
255
+ const resp = await fetch(url, { signal });
256
+ if (!resp.ok) {
257
+ return { status: "warn", checked: true, url: reportedUrl, ok: false, error: `HTTP ${resp.status}` };
258
+ }
259
+ const body = await resp.json().catch(() => null);
260
+ const ok = body?.ok === true;
261
+ return { status: ok ? "ok" : "warn", checked: true, url: reportedUrl, ok, error: ok ? null : "health response did not include ok=true" };
262
+ }
263
+ catch (err) {
264
+ return { status: "skipped", checked: true, url: reportedUrl, ok: null, error: errMessage(err) };
265
+ }
266
+ }
267
+ export async function collectStatus(opts = {}) {
268
+ const live = opts.live !== false;
269
+ const config = collectConfigStatus();
270
+ const cfg = loadConfig();
271
+ const embedding = await collectEmbeddingStatus(cfg, live);
272
+ const qdrant = await collectQdrantStatus(cfg, embedding.dimensions ?? getEmbeddingConfigSafe(), opts);
273
+ const llm = collectLlmStatus(cfg);
274
+ const daemon = collectDaemonStatus();
275
+ const maintenance = collectMaintenanceStatus();
276
+ const ui = await collectUiStatus(opts);
277
+ const required = [config.status, qdrant.status, embedding.status, llm.status];
278
+ return {
279
+ ok: required.every((status) => status !== "error"),
280
+ config,
281
+ qdrant,
282
+ embedding,
283
+ llm,
284
+ daemon,
285
+ maintenance,
286
+ ui,
287
+ mcp: { status: "ok", message: "managed by your editor (stdio)" },
288
+ };
289
+ }
290
+ function getEmbeddingConfigSafe() {
291
+ try {
292
+ return getEmbeddingConfig().dimensions;
293
+ }
294
+ catch {
295
+ return null;
296
+ }
297
+ }
298
+ function icon(status) {
299
+ switch (status) {
300
+ case "ok": return "🟢";
301
+ case "warn": return "🟡";
302
+ case "error": return "🔴";
303
+ case "skipped": return "⚪";
304
+ }
305
+ }
306
+ function qdrantSummary(qdrant) {
307
+ if (!qdrant.configured)
308
+ return "not configured";
309
+ if (!qdrant.reachable)
310
+ return `unreachable (${qdrant.error ?? "unknown error"})`;
311
+ if (!qdrant.collection_exists)
312
+ return qdrant.error ?? "collection missing";
313
+ const matchingIndexes = qdrant.expected_indexes - qdrant.missing_indexes.length - qdrant.mismatched_indexes.length;
314
+ const indexSummary = `${matchingIndexes}/${qdrant.expected_indexes} expected indexes`;
315
+ const details = [
316
+ `collection '${qdrant.collection}'`,
317
+ indexSummary,
318
+ qdrant.vector_size !== null ? `vector size ${qdrant.vector_size}` : null,
319
+ ].filter(Boolean).join(", ");
320
+ return qdrant.error ? `${details} — ${qdrant.error}` : details;
321
+ }
322
+ function maintenanceJobSummary(label, job) {
323
+ const summary = job.last_summary;
324
+ if (!summary)
325
+ return `${label}: never run`;
326
+ const parts = [
327
+ `${label}: ${summary.status}`,
328
+ `last ${summary.ran_at}`,
329
+ `candidates ${summary.candidates_seen}`,
330
+ `LLM ${summary.llm_calls}`,
331
+ `accepted ${summary.accepted}`,
332
+ ];
333
+ if (summary.deterministic !== undefined)
334
+ parts.push(`deterministic ${summary.deterministic}`);
335
+ if (summary.skipped_reason)
336
+ parts.push(`reason ${summary.skipped_reason}`);
337
+ if (summary.error)
338
+ parts.push(`error ${summary.error}`);
339
+ return parts.join(", ");
340
+ }
341
+ export function formatStatusReport(report) {
342
+ const lines = [];
343
+ const configLabel = report.config.exists ? report.config.path : `${report.config.path} (not created yet)`;
344
+ lines.push(`Config: ${icon(report.config.status)} ${report.config.status} — ${configLabel}`);
345
+ if (report.config.env_overrides.length > 0) {
346
+ lines.push(` env overrides: ${report.config.env_overrides.join(", ")}`);
347
+ }
348
+ for (const issue of report.config.issues) {
349
+ lines.push(` ${issue.severity}: ${issue.path ? `${issue.path}: ` : ""}${issue.message}`);
350
+ }
351
+ lines.push(`Qdrant: ${icon(report.qdrant.status)} ${report.qdrant.status} — ${qdrantSummary(report.qdrant)}`);
352
+ if (report.qdrant.missing_indexes.length > 0) {
353
+ lines.push(` missing indexes: ${report.qdrant.missing_indexes.map((idx) => idx.field_name).join(", ")}`);
354
+ }
355
+ if (report.qdrant.mismatched_indexes.length > 0) {
356
+ const mismatches = report.qdrant.mismatched_indexes
357
+ .map((idx) => `${idx.field_name} expected ${idx.expected_schema}, got ${idx.actual_schema ?? "missing"}`)
358
+ .join("; ");
359
+ lines.push(` index mismatches: ${mismatches}`);
360
+ }
361
+ const embLive = report.embedding.live_checked ? "live check passed" : "configured";
362
+ lines.push(`Embedding:${icon(report.embedding.status).padStart(4, " ")} ${report.embedding.status} — ` +
363
+ `${report.embedding.provider}/${report.embedding.model} (${report.embedding.dimensions ?? "?"}d), ${embLive}` +
364
+ `${report.embedding.error ? ` — ${report.embedding.error}` : ""}`);
365
+ lines.push(`LLM: ${icon(report.llm.status)} ${report.llm.status} — ` +
366
+ `${report.llm.provider}/${report.llm.model}, provider config checked (no live chat)` +
367
+ `${report.llm.error ? ` — ${report.llm.error}` : ""}`);
368
+ lines.push(`Daemon: ${icon(report.daemon.status)} ${report.daemon.running ? `running (PID ${report.daemon.pid})` : "stopped"}`);
369
+ lines.push(`Maint: ${icon(report.maintenance.status)} ${maintenanceJobSummary("relations", report.maintenance.relation_inference)}`);
370
+ lines.push(` ${maintenanceJobSummary("entity typing", report.maintenance.entity_typing)}`);
371
+ lines.push(`UI: ${icon(report.ui.status)} ${report.ui.checked ? report.ui.url : "not checked"}${report.ui.error ? ` — ${report.ui.error}` : ""}`);
372
+ lines.push(`MCP: ${icon(report.mcp.status)} ${report.mcp.message}`);
373
+ return lines.join("\n");
374
+ }
375
+ export function statusExitCode(report) {
376
+ return report.ok ? 0 : 1;
377
+ }
378
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for read-only `bikky status` diagnostics.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../src/status.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Tests for read-only `bikky status` diagnostics.
3
+ */
4
+ import { describe, it, before, beforeEach, after } from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ import os from "node:os";
9
+ const TEST_BIKKY_HOME = fs.mkdtempSync(path.join(os.tmpdir(), "bikky-home-status-"));
10
+ process.env.BIKKY_HOME = TEST_BIKKY_HOME;
11
+ const { CONFIG_PATH, resetConfig } = await import("./config.js");
12
+ const { QDRANT_INDEXES } = await import("./mcp/taxonomy.js");
13
+ const { collectStatus, formatStatusReport, sanitizeStatusUrl, statusExitCode } = await import("./status.js");
14
+ const realFetch = globalThis.fetch;
15
+ function writeConfig(config) {
16
+ fs.mkdirSync(path.dirname(CONFIG_PATH), { recursive: true });
17
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
18
+ }
19
+ function installStatusFetch(opts = {}) {
20
+ const vectorSize = opts.vectorSize ?? 1024;
21
+ const payload_schema = Object.fromEntries(QDRANT_INDEXES
22
+ .filter((idx) => idx.field_name !== opts.missingIndex)
23
+ .map((idx) => [idx.field_name, { data_type: idx.field_schema }]));
24
+ globalThis.fetch = (async (input) => {
25
+ const url = typeof input === "string" ? input : input.toString();
26
+ if (url.endsWith("/collections")) {
27
+ return new Response(JSON.stringify({ result: { collections: [{ name: "bikky" }] } }), { status: 200 });
28
+ }
29
+ if (url.endsWith("/collections/bikky")) {
30
+ return new Response(JSON.stringify({
31
+ result: {
32
+ points_count: 12,
33
+ vectors_count: 12,
34
+ payload_schema,
35
+ config: {
36
+ params: {
37
+ vectors: { size: opts.collectionVectorSize ?? vectorSize, distance: "Cosine" },
38
+ },
39
+ },
40
+ },
41
+ }), { status: 200 });
42
+ }
43
+ if (url.endsWith("/v1/embeddings")) {
44
+ return new Response(JSON.stringify({
45
+ data: [{ embedding: Array.from({ length: vectorSize }, () => 0.1) }],
46
+ }), { status: 200 });
47
+ }
48
+ throw new Error(`unexpected fetch: ${url}`);
49
+ });
50
+ }
51
+ describe("status diagnostics", () => {
52
+ before(() => {
53
+ process.env.BIKKY_HOME = TEST_BIKKY_HOME;
54
+ });
55
+ after(() => {
56
+ globalThis.fetch = realFetch;
57
+ fs.rmSync(TEST_BIKKY_HOME, { recursive: true, force: true });
58
+ });
59
+ beforeEach(() => {
60
+ resetConfig();
61
+ globalThis.fetch = realFetch;
62
+ fs.rmSync(TEST_BIKKY_HOME, { recursive: true, force: true });
63
+ fs.mkdirSync(TEST_BIKKY_HOME, { recursive: true });
64
+ delete process.env.QDRANT_URL;
65
+ delete process.env.QDRANT_API_KEY;
66
+ delete process.env.BIKKY_COLLECTION;
67
+ delete process.env.EMBEDDING_PROVIDER;
68
+ delete process.env.EMBEDDING_MODEL;
69
+ delete process.env.EMBEDDING_BASE_URL;
70
+ delete process.env.EMBEDDING_DIMENSIONS;
71
+ delete process.env.OPENAI_API_KEY;
72
+ delete process.env.LLM_PROVIDER;
73
+ delete process.env.LLM_MODEL;
74
+ delete process.env.LLM_BASE_URL;
75
+ });
76
+ it("surfaces corrupt config instead of looking like defaults", async () => {
77
+ fs.mkdirSync(path.dirname(CONFIG_PATH), { recursive: true });
78
+ fs.writeFileSync(CONFIG_PATH, "{not-json");
79
+ const report = await collectStatus({ live: false, checkUi: false });
80
+ assert.equal(report.ok, false);
81
+ assert.equal(report.config.status, "error");
82
+ assert.ok(report.config.parse_error);
83
+ assert.equal(statusExitCode(report), 1);
84
+ });
85
+ it("reports missing payload indexes without failing overall health", async () => {
86
+ writeConfig({
87
+ qdrant_url: "https://qdrant.test",
88
+ collection: "bikky",
89
+ embedding: {
90
+ provider: "ollama",
91
+ model: "qwen3-embedding:0.6b",
92
+ dimensions: 1024,
93
+ base_url: "http://localhost:11434",
94
+ },
95
+ llm: {
96
+ provider: "ollama",
97
+ model: "qwen2.5:7b",
98
+ base_url: "http://localhost:11434",
99
+ },
100
+ });
101
+ installStatusFetch({ missingIndex: "entities" });
102
+ const report = await collectStatus({ live: true, checkUi: false });
103
+ assert.equal(report.ok, true);
104
+ assert.equal(report.qdrant.status, "warn");
105
+ assert.deepEqual(report.qdrant.missing_indexes.map((idx) => idx.field_name), ["entities"]);
106
+ assert.equal(report.embedding.status, "ok");
107
+ assert.equal(report.embedding.live_checked, true);
108
+ assert.match(formatStatusReport(report), /missing indexes: entities/);
109
+ });
110
+ it("fails when collection vector size differs from configured embedding dimensions", async () => {
111
+ writeConfig({
112
+ qdrant_url: "https://qdrant.test",
113
+ collection: "bikky",
114
+ embedding: {
115
+ provider: "ollama",
116
+ model: "qwen3-embedding:0.6b",
117
+ dimensions: 1024,
118
+ base_url: "http://localhost:11434",
119
+ },
120
+ llm: {
121
+ provider: "ollama",
122
+ model: "qwen2.5:7b",
123
+ base_url: "http://localhost:11434",
124
+ },
125
+ });
126
+ installStatusFetch({ collectionVectorSize: 1536 });
127
+ const report = await collectStatus({ live: true, checkUi: false });
128
+ assert.equal(report.ok, false);
129
+ assert.equal(report.qdrant.status, "error");
130
+ assert.match(report.qdrant.error ?? "", /does not match embedding dimensions/);
131
+ });
132
+ it("catches unknown providers before runtime memory operations", async () => {
133
+ writeConfig({
134
+ qdrant_url: "https://qdrant.test",
135
+ collection: "bikky",
136
+ embedding: { provider: "missing-embedder", model: "x", dimensions: 3 },
137
+ llm: { provider: "missing-llm", model: "x" },
138
+ });
139
+ installStatusFetch({ vectorSize: 3 });
140
+ const report = await collectStatus({ live: false, checkUi: false });
141
+ assert.equal(report.ok, false);
142
+ assert.equal(report.embedding.status, "error");
143
+ assert.match(report.embedding.error ?? "", /Unknown embedding provider/);
144
+ assert.equal(report.llm.status, "error");
145
+ assert.match(report.llm.error ?? "", /Unknown inference provider/);
146
+ });
147
+ it("sanitizes credentials from URLs in reports", async () => {
148
+ assert.equal(sanitizeStatusUrl("https://user:secret@example.com:6333/path?api_key=abc&ok=1"), "https://example.com:6333/path?api_key=REDACTED&ok=1");
149
+ writeConfig({
150
+ qdrant_url: "https://qdrant.test",
151
+ collection: "bikky",
152
+ embedding: {
153
+ provider: "ollama",
154
+ model: "qwen3-embedding:0.6b",
155
+ dimensions: 1024,
156
+ base_url: "https://user:secret@embed.example/v1?token=abc",
157
+ },
158
+ llm: {
159
+ provider: "ollama",
160
+ model: "qwen2.5:7b",
161
+ base_url: "https://user:secret@llm.example/v1?password=abc",
162
+ },
163
+ });
164
+ installStatusFetch();
165
+ const report = await collectStatus({ live: false, checkUi: false });
166
+ assert.equal(report.embedding.base_url, "https://embed.example/v1?token=REDACTED");
167
+ assert.equal(report.llm.base_url, "https://llm.example/v1?password=REDACTED");
168
+ });
169
+ it("includes daemon maintenance summaries without making live calls", async () => {
170
+ const stateDir = path.join(TEST_BIKKY_HOME, "state");
171
+ fs.mkdirSync(stateDir, { recursive: true });
172
+ fs.writeFileSync(path.join(stateDir, "maintenance-state.json"), JSON.stringify({
173
+ version: 1,
174
+ jobs: {
175
+ relation_inference: {
176
+ last_run_at: "2026-04-27T10:00:00.000Z",
177
+ cursor_updated_at: "2026-04-27T09:59:00.000Z",
178
+ recent_attempts: {},
179
+ last_summary: {
180
+ job: "relation_inference",
181
+ ran_at: "2026-04-27T10:00:00.000Z",
182
+ status: "success",
183
+ candidates_seen: 3,
184
+ llm_calls: 2,
185
+ accepted: 1,
186
+ },
187
+ },
188
+ entity_typing: {
189
+ last_run_at: null,
190
+ cursor_updated_at: null,
191
+ recent_attempts: {},
192
+ last_summary: null,
193
+ },
194
+ },
195
+ }));
196
+ const report = await collectStatus({ live: false, checkUi: false });
197
+ assert.equal(report.maintenance.status, "ok");
198
+ assert.equal(report.maintenance.relation_inference.last_summary?.llm_calls, 2);
199
+ assert.match(formatStatusReport(report), /Maint:/);
200
+ assert.match(formatStatusReport(report), /relations: success/);
201
+ });
202
+ });
203
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../src/status.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bikky",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "Shared memory for AI coding sessions — MCP server + background daemon",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-or-later",