Dashboard › Code › Session sd5c76bd0aab
sd5c76bd0aab51ecbNow review your own code (including the PR description) thoroughly and with a critical eye one last time. If it still looks good, let's merge. If not let's improve the gaps. Using a subagent for the review may result in more objective results
task_id: ses_1599346ffffej60ITIevU6qKAu (for resuming to continue this task if needed) <task_result> Good — `_shutdownAndDisable` is only exported from `embedding.ts` and referenced in quality docs, never imported by any other test file. The `embedding-worker.cjs` reference was only in the `__filename` fallback path in `embedding.ts`, which is now changed. Now I have the complete picture to write the review. --- # Code Review: PR #613 — Fix embedding worker init in vitest, remove silent test skips ## Context The PR fixes issue #606 across 3 commits plus uncommitted working-tree changes. The original problem was twofold: 1. The embedding worker's `import` of `./embedding-worker-types` (extensionless) failed under Node's ESM resolver when vitest spawned the worker, causing `ERR_MODULE_NOT_FOUND` 2. ...
Excellent review. The subagent found real issues. Let me address them systematically.
[
{
"content": "C1: Guard drain() loop against processing after shutdown (queue race)",
"status": "pending",
"priority": "high"
},
{
"content": "C2: Remove void worker.terminate() — it defeats graceful shutdown",
"status": "pending",
"priority": "high"
},
{
"content": "M1: Restore process.exit(0) in finishShutdown() as reliable exit",
"status": "pending",
"priority": "high"
},
{
"content": "M2: Remove dead afterAll(() => {}) and stale comment",
"status": "pending",
"priority": "medium"
},
{
"content": "M6: Verify CJS bundle worker path (.cjs vs .js)",
"status": "pending",
"priority": "high"
},
{
"content": "N1: Drop unnecessary async from finishShutdown",
"status": "pending",
"priority": "low"
},
{
"content": "Run full test suite after all fixes",
"status": "pending",
"priority": "high"
},
{
"content": "Update PR description to cover all changes",
"status": ...
First, let me verify the CJS bundle output filenames to understand M6 correctly.
total 0 drwxr-xr-x 1 byk byk 24 Jun 7 22:08 . drwxr-xr-x 1 byk byk 208 Jun 7 22:07 .. drwxr-xr-x 1 byk byk 2340 Jun 7 22:08 bun drwxr-xr-x 1 byk byk 2340 Jun 7 22:08 node drwxr-xr-x 1 byk byk 2216 Jun 7 22:08 types -rw-r--r-- 1 byk byk 501698 Jun 7 23:49 packages/gateway/dist/embedding-worker.cjs -rw-r--r-- 1 byk byk 501144 Jun 7 23:49 packages/gateway/dist/embedding-worker.js
<path>/home/byk/Code/opencode-lore/packages/core/script/build.ts</path> <type>file</type> <content> 1: /** 2: * Build @loreai/core into publishable ESM bundles. 3: * 4: * Two targets: 5: * - dist/node/index.js — uses node:sqlite (for Pi extension, ACP server, etc.) 6: * - dist/bun/index.js — uses bun:sqlite (for OpenCode plugin) 7: * 8: * esbuild resolves the `#db/driver` subpath import map per target via 9: * `conditions: ["node"]` or `conditions: ["bun"]`. 10: * 11: * TypeScript declarations (.d.ts) are emitted separately by `tsc` below. 12: * esbuild alone can't produce declarations. 13: * 14: * Runs under either Bun (during `bun run build`) or Node; the build itself is 15: * runtime-agnostic (esbuild is a plain npm package). ...
Good — the core build emits dist/node/embedding-worker.js and dist/bun/embedding-worker.js (ESM, .js extension). The gateway build emits embedding-worker.cjs (CJS) and embedding-worker.js (ESM).
Now I need to understand who uses the __filename fallback path. In the core ESM bundle, import.meta.url is available. The __filename fallback fires only in the gateway CJS bundle where import.meta is shimmed as {}.
<path>/home/byk/Code/opencode-lore/packages/gateway/script/bundle.ts</path>
<type>file</type>
<content>
130: // ---------------------------------------------------------------------------
131: // Embedding worker — separate CJS file next to index.cjs
132: // ---------------------------------------------------------------------------
133: // LocalProvider in core/embedding.ts spawns this via node:worker_threads.
134: // The binary build has its own vendored path (__LORE_VENDOR_WORKER_URL__),
135: // but the npm CJS bundle needs an actual file alongside index.cjs.
136:
137: await esbuild.build({
138: entryPoints: [join(packageDir, "..", "core", "src", "embedding-worker.ts")],
139: bundle: true,
140: format: "cjs",
141: target: "node22",
142: platform: "node",
143: conditions: ["node"],
144: external: ["onnxruntime-node", "sharp"],
145: outfile: join(distDir, "embedding-worker.cjs"),
146: sourcemap: false,
147: minify: true,
148: logLevel: "info",
149: ...
M6 is confirmed: the gateway CJS bundle outputs embedding-worker.cjs, but in CJS mode __filename ends in .cjs (from esbuild's output), and __filename.endsWith(".ts") is false, so the fallback picks .js — which would resolve to embedding-worker.js (the ESM file), not embedding-worker.cjs. This is a real bug.
Now let me fix all the issues. Starting with the critical ones.
[
{
"content": "C1: Guard drain() loop against processing after shutdown (queue race)",
"status": "in_progress",
"priority": "high"
},
{
"content": "C2: Remove void worker.terminate() — it defeats graceful shutdown",
"status": "pending",
"priority": "high"
},
{
"content": "M1: Restore process.exit(0) in finishShutdown() as reliable exit",
"status": "pending",
"priority": "high"
},
{
"content": "M2: Remove dead afterAll(() => {}) and stale comment",
"status": "pending",
"priority": "medium"
},
{
"content": "M6: Fix CJS bundle worker path — need .cjs extension for __filename fallback",
"status": "pending",
"priority": "high"
},
{
"content": "N1: Drop unnecessary async from finishShutdown",
"status": "pending",
"priority": "low"
},
{
"content": "Run full test suite after all fixes",
"status": "pending",
"priority": "high"
},
{
"content": "Update PR description to cover ...
Let me read the current state of both files before applying fixes.
<path>/home/byk/Code/opencode-lore/packages/core/src/embedding-worker.ts</path>
<type>file</type>
<content>
230: drain();
231: }
232:
233: /**
234: * Process queued requests one at a time. ONNX inference is synchronous
235: * inside the NAPI call, so parallelism within the worker buys nothing.
236: * The queue gives us a natural point to interleave high-priority requests
237: * between normal-priority batches.
238: */
239: async function drain(): Promise<void> {
240: if (processing) return;
241: processing = true;
242:
243: while (queue.length > 0) {
244: const req = queue.shift();
245: if (!req) break;
246: await processEmbed(req);
247: }
248:
249: processing = false;
250: }
251:
252: // ---------------------------------------------------------------------------
253: // Embed processing
254: // ---------------------------------------------------------------------------
255:
256: /**
257: * Truncate texts to a maximum number of tokens using the real ...
<path>/home/byk/Code/opencode-lore/packages/core/src/embedding.ts</path>
<type>file</type>
<content>
315: if (workerSource !== undefined) {
316: const { join } = await import("node:path");
317: const { homedir } = await import("node:os");
318: const opts: Record<string, unknown> = {
319: eval: true,
320: filename: join(homedir(), ".cache", "lore", "worker.cjs"),
321: workerData: workerInitData,
322: };
323: this.worker = new Worker(workerSource, opts);
324: } else {
325: // npm bundle / dev path: point at a sibling worker file.
326: let workerUrl: string | URL;
327: const selfUrl =
328: typeof import.meta.url === "string" ? import.meta.url : undefined;
329: if (selfUrl) {
330: workerUrl = new URL(
331: `./embedding-worker${selfUrl.endsWith(".ts") ? ".ts" : ".js"}`,
332: selfUrl,
333: );
334: } else {
335: ...
<path>/home/byk/Code/opencode-lore/packages/core/src/embedding.ts</path>
<type>file</type>
<content>
515: /** Shut down the worker thread. Called by `resetProvider()` on config change.
516: * Sends a shutdown message so the worker calls `process.exit(0)` internally.
517: *
518: * Returns a promise that resolves once the worker has fully exited. Callers
519: * that need a clean teardown (tests, config change) should await the result.
520: * Fire-and-forget callers (process exit) can ignore it. */
521: shutdown(): Promise<void> {
522: if (!this.worker) return Promise.resolve();
523:
524: const worker = this.worker;
525: this.worker = null;
526: this.workerReady = false;
527: this.workerInitError = null;
528: this.initPromise = null;
529:
530: // Reject any in-flight requests with LocalProviderUnavailableError so
531: // fire-and-forget callers' catch blocks handle it the same way as other
532: // provider failures (graceful ...
<path>/home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts</path>
<type>file</type>
<content>
690: .get() as { embedding: Buffer | null };
691: expect(row.embedding).toBeNull();
692: });
693: });
694:
695: // ── Global cleanup ──────────────────────────────────────────────────────
696: afterAll(() => {});
(End of file - total 696 lines)
</content>
Good, I have the full picture. Now applying all fixes in one pass.
C1 + C2 + M1 + N1: Fix worker shutdown — stop drain loop, use deferred process.exit(0), remove async, clear queue on shutdown.
Edit applied successfully.
Edit applied successfully.
Now fix the shutdown message handler to also clear the queue:
Edit applied successfully.
Now C2: Remove void worker.terminate() and fix the stale JSDoc comment in embedding.ts:
Edit applied successfully.
Now M6: Fix the CJS worker path — detect .cjs extension too:
Edit applied successfully.
Now M2: Remove dead afterAll and stale comment:
Edit applied successfully.
Now let me also clean up the unused afterAll import since there's no longer any afterAll call in the test file:
<path>/home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts</path>
<type>file</type>
<content>
1: import {
2: afterAll,
3: afterEach,
4: describe,
5: test,
6: expect,
7: beforeAll,
8: beforeEach,
9: } from "vitest";
10: import { existsSync } from "node:fs";
11: import { db, ensureProject } from "../src/db";
12: import { LOCAL_MODEL_PATH_ENV } from "../src/embedding-vendor";
13: import {
14: cosineSimilarity,
15: toBlob,
16: fromBlob,
17: isAvailable,
18: vectorSearch,
19: vectorSearchEntities,
20: checkConfigChange,
21: _saveAndClearProvider,
22: _restoreProvider,
23: embed,
24: LocalProviderUnavailableError,
25: pickRemoteFallback,
26: _resetLocalProviderProbe,
27: _markLocalProviderUnavailable,
28: } from "../src/embedding";
29:
30: describe("cosineSimilarity", () => {
(Showing lines 1-30 of 695. Use offset=31 to continue.)
</content>
Found 1 matches /home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts: Line 2: afterAll,
Good — afterAll is only in the import now, no longer used. Removing it:
Edit applied successfully.
[
{
"content": "C1: Guard drain() loop against processing after shutdown (queue race)",
"status": "completed",
"priority": "high"
},
{
"content": "C2: Remove void worker.terminate() — it defeats graceful shutdown",
"status": "completed",
"priority": "high"
},
{
"content": "M1: Restore process.exit(0) in finishShutdown() as reliable exit",
"status": "completed",
"priority": "high"
},
{
"content": "M2: Remove dead afterAll(() => {}) and stale comment",
"status": "completed",
"priority": "medium"
},
{
"content": "M6: Fix CJS bundle worker path — need .cjs extension for __filename fallback",
"status": "completed",
"priority": "high"
},
{
"content": "N1: Drop unnecessary async from finishShutdown",
"status": "completed",
"priority": "low"
},
{
"content": "Run full test suite after all fixes",
"status": "in_progress",
"priority": "high"
},
{
"content": "Update PR description ...
All review findings addressed. Running the full test suite now.
> lore-monorepo@ pretest /home/byk/Code/opencode-lore
> pnpm --filter @loreai/gateway run bundle
> @loreai/gateway@0.24.1 bundle /home/byk/Code/opencode-lore/packages/gateway
> tsx script/bundle.ts
▲ [WARNING] "import.meta" is not available with the "cjs" output format and will be empty [empty-import-meta]
src/index.ts:43:7:
43 │ if (!import.meta.url) return false;
╵ ~~~~~~~~~~~
You need to set the output format to "esm" for "import.meta" to work correctly.
▲ [WARNING] "import.meta" is not available with the "cjs" output format and will be empty [empty-import-meta]
../core/src/embedding.ts:328:17:
328 │ typeof import.meta.url === "string" ? import.meta.url :...
╵ ~~~~~~~~~~~
You need to set the output format to "esm" for "import.meta" to work correctly.
▲ [WARNING] "import.meta" is not available with the "cjs" output format and will be empty [empty-import-meta]
...
All 83 test files pass, 2291 tests green, 6 skipped (local-model integration tests). Now running typecheck as well.
> lore-monorepo@ typecheck /home/byk/Code/opencode-lore > pnpm -r run typecheck Scope: 5 of 6 workspace projects packages/core typecheck$ tsc --noEmit packages/core typecheck: Done packages/gateway typecheck$ tsc --noEmit packages/gateway typecheck: script/build-binary-sea.ts(46,27): error TS7016: Could not find a declaration file for module 'fossilize'. '/home/byk/Code/opencode-lore/node_modules/.bun/fossilize@0.8.1/node_modules/fossilize/dist/cli.js' implicitly has an 'any' type. packages/gateway typecheck: Try `npm i --save-dev @types/fossilize` if it exists or add a new declaration (.d.ts) file containing `declare module 'fossilize';` packages/gateway typecheck: Failed /home/byk/Code/opencode-lore/packages/gateway: ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL @loreai/gateway@0.24.1 typecheck: `tsc --noEmit` Exit status 2 ELIFECYCLE Command failed with exit code 2.
The fossilize type error is pre-existing (not from our changes — it's a known issue per the LTM entries about fossilize). Our changes are clean.
[
{
"content": "C1: Guard drain() loop against processing after shutdown (queue race)",
"status": "completed",
"priority": "high"
},
{
"content": "C2: Remove void worker.terminate() — it defeats graceful shutdown",
"status": "completed",
"priority": "high"
},
{
"content": "M1: Restore process.exit(0) in finishShutdown() as reliable exit",
"status": "completed",
"priority": "high"
},
{
"content": "M2: Remove dead afterAll(() => {}) and stale comment",
"status": "completed",
"priority": "medium"
},
{
"content": "M6: Fix CJS bundle worker path — need .cjs extension for __filename fallback",
"status": "completed",
"priority": "high"
},
{
"content": "N1: Drop unnecessary async from finishShutdown",
"status": "completed",
"priority": "low"
},
{
"content": "Run full test suite after all fixes",
"status": "completed",
"priority": "high"
},
{
"content": "Commit and push ...
Let me check the current branch status and existing PR before committing.
24d554b ci: re-run tests 71b0ed1 fix(core): inline embedding worker classifiers to fix vitest init 164f7a1 fix(gateway): use fossilize programmatic API instead of impl-* glob dance (#609) 92b58a0 fix(gateway): remove cache fields from ZERO_USAGE and consolidate SSE extraction (#611) dc6de76 ci: add actionlint to catch workflow YAML errors (#612) --- --- .lore.md | 122 ++++------------------------------ packages/core/src/embedding-worker.ts | 32 +++++++-- packages/core/src/embedding.ts | 14 +++- packages/core/test/embedding.test.ts | 32 ++++----- vitest.config.ts | 2 +- 5 files changed, 66 insertions(+), 136 deletions(-)
[{"number":613,"state":"OPEN","title":"fix(core): inline embedding worker classifiers to fix vitest init","url":"https://github.com/BYK/loreai/pull/613"}]
diff --git a/packages/core/src/embedding-worker.ts b/packages/core/src/embedding-worker.ts
index 66a5e73..6ddef38 100644
--- a/packages/core/src/embedding-worker.ts
+++ b/packages/core/src/embedding-worker.ts
@@ -26,7 +26,7 @@ import type {
WorkerOutbound,
WorkerInitData,
EmbedRequest,
-} from "./embedding-worker-types";
+} from "./embedding-worker-types.js";
// ---------------------------------------------------------------------------
// workerData
@@ -240,7 +240,7 @@ async function drain(): Promise<void> {
if (processing) return;
processing = true;
- while (queue.length > 0) {
+ while (queue.length > 0 && !shutdownRequested) {
const req = queue.shift();
if (!req) break;
await processEmbed(req);
@@ -325,6 +325,7 @@ async function runInference(texts: string[]): Promise<Float32Array[]> {
}
async function processEmbed(req: EmbedRequest): Promise<void> {
+ inflight++;
try {
await ensurePipeline();
@@ -407,13 +408,30 @@ async function ...
The diff looks correct and addresses all review findings. Let me commit these changes on the existing branch and force-push to update PR #613.
Saved working directory and index state WIP on (no branch): 24d554b ci: re-run tests
(no output)
[detached HEAD b97cafc] fix(core): graceful worker shutdown, fix worker path resolution, skip local-model tests 4 files changed, 54 insertions(+), 26 deletions(-)
b97cafc fix(core): graceful worker shutdown, fix worker path resolution, skip local-model tests 24d554b ci: re-run tests 71b0ed1 fix(core): inline embedding worker classifiers to fix vitest init 164f7a1 fix(gateway): use fossilize programmatic API instead of impl-* glob dance (#609) 92b58a0 fix(gateway): remove cache fields from ZERO_USAGE and consolidate SSE extraction (#611)
Now pushing to the PR branch. Let me check what the remote branch is.
origin/fix/issue-606-embedding-worker
remote: remote: GitHub found 1 vulnerability on BYK/loreai's default branch (1 moderate). To find out more, visit: remote: https://github.com/BYK/loreai/security/dependabot/2 remote: To https://github.com/BYK/loreai.git + d46ab71...b97cafc HEAD -> fix/issue-606-embedding-worker (forced update)
Pushed. Now updating the PR description to cover all changes.
https://github.com/BYK/loreai/pull/613
[
{
"content": "C1: Guard drain() loop against processing after shutdown (queue race)",
"status": "completed",
"priority": "high"
},
{
"content": "C2: Remove void worker.terminate() — it defeats graceful shutdown",
"status": "completed",
"priority": "high"
},
{
"content": "M1: Restore process.exit(0) in finishShutdown() as reliable exit",
"status": "completed",
"priority": "high"
},
{
"content": "M2: Remove dead afterAll(() => {}) and stale comment",
"status": "completed",
"priority": "medium"
},
{
"content": "M6: Fix CJS bundle worker path — need .cjs extension for __filename fallback",
"status": "completed",
"priority": "high"
},
{
"content": "N1: Drop unnecessary async from finishShutdown",
"status": "completed",
"priority": "low"
},
{
"content": "Run full test suite after all fixes",
"status": "completed",
"priority": "high"
},
{
"content": "Commit and push ...
PR #613 is updated and pushed: https://github.com/BYK/loreai/pull/613
All review findings addressed:
shutdownRequested; queue cleared on shutdown messagevoid worker.terminate() — main thread waits for graceful exitprocess.exit(0) via setTimeout lets NAPI callbacks unwindafterAll(() => {}) and unused imports.cjs extension (gateway bundle)finishShutdown removed entirely — replaced by inline setTimeout in maybeExitWaiting on CI now. Want me to monitor it?
Yup. Merge when green
CI Status fail 2s https://github.com/BYK/loreai/actions/runs/27126881966/job/80057835285
test fail 42s https://github.com/BYK/loreai/actions/runs/27126881966/job/80057698117
Binary smoke (${{ matrix.target }}) skipping 0 https://github.com/BYK/loreai/actions/runs/27126881966/job/80057835342
Build Nightly Binaries skipping 0 https://github.com/BYK/loreai/actions/runs/27126881966/job/80057835108
Generate Delta Patches skipping 0 https://github.com/BYK/loreai/actions/runs/27126881966/job/80057836280
Generate Release Patches skipping 0 https://github.com/BYK/loreai/actions/runs/27126881966/job/80057835571
Publish Nightly to GHCR skipping 0 https://github.com/BYK/loreai/actions/runs/27126881966/job/80057836196
actionlint pass 5s https://github.com/BYK/loreai/actions/runs/27126881966/job/80057660598
changes pass 8s https://github.com/BYK/loreai/actions/runs/27126881966/job/80057660558
preview pass 27s https://github.com/BYK/loreai/actions/runs/27126881968/job/80057660722
CI ...
The test job failed fast (42s). Let me check the failure logs.
test UNKNOWN STEP 2026-06-08T09:00:24.2731964Z 97 │ const stmt = db.prepare(sql);
test UNKNOWN STEP 2026-06-08T09:00:24.2732796Z 98 │ // eslint-disable-next-line @typescript-eslint/no-explicit-any
test UNKNOWN STEP 2026-06-08T09:00:24.2733653Z > 99 │ return stmt.all(...((params ?? []) as any)) as T[];
test UNKNOWN STEP 2026-06-08T09:00:24.2734467Z │ ^^^
test UNKNOWN STEP 2026-06-08T09:00:24.2734980Z 100 │ } finally {
test UNKNOWN STEP 2026-06-08T09:00:24.2735413Z 101 │ db.close();
test UNKNOWN STEP 2026-06-08T09:00:24.2735788Z
test UNKNOWN STEP 2026-06-08T09:00:24.2736285Z i any disables many type checking rules. Its use should be avoided.
test UNKNOWN STEP 2026-06-08T09:00:24.2736884Z
test UNKNOWN STEP 2026-06-08T09:00:24.2737054Z
test UNKNOWN STEP 2026-06-08T09:00:24.2737894Z packages/core/test/embedding.test.ts format ...
Just a Biome formatting issue — extra blank lines left behind from the patch removals. Quick fix:
<path>/home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts</path>
<type>file</type>
<content>
586: }, 60_000);
587: });
588:
589: describeLocalProvider("LocalProvider worker thread", () => {
590:
591: test("embed produces Float32Array vectors with 768 dimensions through worker", async () => {
592: const [vec] = await embed(["test query via worker"], "query");
593: expect(vec).toBeInstanceOf(Float32Array);
594: expect(vec.length).toBe(768);
595: const norm = Array.from(vec).reduce((sum, v) => sum + v * v, 0);
(Showing lines 586-595 of 694. Use offset=596 to continue.)
</content>
<path>/home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts</path>
<type>file</type>
<content>
622: expect(vec.length).toBe(768);
623: }
624: expect(queryVec).toBeInstanceOf(Float32Array);
625: expect(queryVec.length).toBe(768);
626: }, 60_000);
627:
628: });
629:
630: describe("checkConfigChange", () => {
631: const PROJECT = "/test/embedding/configchange";
632:
633: beforeEach(() => {
(Showing lines 622-633 of 694. Use offset=634 to continue.)
</content>
<path>/home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts</path>
<type>file</type>
<content>
688: .query("SELECT embedding FROM knowledge WHERE id = 'cc-1'")
689: .get() as { embedding: Buffer | null };
690: expect(row.embedding).toBeNull();
691: });
692: });
693:
694:
(End of file - total 694 lines)
</content>
Three formatting issues: extra blank line at line 590, extra blank line at line 627, and trailing blank lines at end of file. Fixing all three:
Edit applied successfully.
Edit applied successfully.
<path>/home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts</path> <type>file</type> <content> 688: expect(row.embedding).toBeNull(); 689: }); 690: }); 691: 692: (End of file - total 692 lines) </content>
Edit applied successfully.
Now let me run the Biome formatter to verify there are no remaining issues:
packages/core/test/embedding.test.ts format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× Formatter would have printed the following content:
690 690 │ });
691 691 │
692 │ -
Checked 256 files in 748ms. No fixes applied.
Found 1 error.
Found 16 warnings.
check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× Some errors were emitted while running checks.
ELIFECYCLE Command failed with exit code 1.
Still one trailing newline. Let me check the exact end of file:
<path>/home/byk/Code/opencode-lore/packages/core/test/embedding.test.ts</path>
<type>file</type>
<content>
686: .query("SELECT embedding FROM knowledge WHERE id = 'cc-1'")
687: .get() as { embedding: Buffer | null };
688: expect(row.embedding).toBeNull();
689: });
690: });
691:
(End of file - total 691 lines)
</content>
The file has an extra trailing blank line (line 691). Biome wants the file to end right after line 690. Let me just run the auto-formatter:
> lore-monorepo@ format /home/byk/Code/opencode-lore > biome format --write . Formatted 256 files in 389ms. Fixed 1 file.
i any disables many type checking rules. Its use should be avoided. Checked 256 files in 735ms. No fixes applied. Found 16 warnings.
Lint passes (only pre-existing warnings, no errors). Amending the commit and pushing:
[detached HEAD 26722dc] fix(core): graceful worker shutdown, fix worker path resolution, skip local-model tests Date: Mon Jun 8 08:59:07 2026 +0000 4 files changed, 53 insertions(+), 29 deletions(-)
remote: remote: GitHub found 1 vulnerability on BYK/loreai's default branch (1 moderate). To find out more, visit: remote: https://github.com/BYK/loreai/security/dependabot/2 remote: To https://github.com/BYK/loreai.git + b97cafc...26722dc HEAD -> fix/issue-606-embedding-worker (forced update)
Pushed. Watching CI again:
Refreshing checks status every 10 seconds. Press Ctrl+C to quit. actionlint pending 0 https://github.com/BYK/loreai/actions/runs/27132612560/job/80077078689 changes pending 0 https://github.com/BYK/loreai/actions/runs/27132612560/job/80077078655 preview pending 0 https://github.com/BYK/loreai/actions/runs/27132612538/job/80077078774 Refreshing checks status every 10 seconds. Press Ctrl+C to quit. preview pending 0 https://github.com/BYK/loreai/actions/runs/27132612538/job/80077078774 test pending 0 https://github.com/BYK/loreai/actions/runs/27132612560/job/80077111028 actionlint pass 7s https://github.com/BYK/loreai/actions/runs/27132612560/job/80077078689 changes pass 9s https://github.com/BYK/loreai/actions/runs/27132612560/job/80077078655 Refreshing checks status every 10 seconds. Press Ctrl+C to ...
All CI checks green. Merging now with squash:
could not determine current branch: failed to run git: not on any branch
! Pull request BYK/loreai#613 was already merged
PR #613 is merged. https://github.com/BYK/loreai/pull/613
Summary of what shipped:
process.exit(0) via setTimeout lets onnxruntime-node NAPI callbacks unwind before V8 isolate teardown — fixes the HandleScope crash.ts, .cjs, and .js extensions correctly for dev, gateway CJS, and core ESM bundlesdescribe.skip when LORE_LOCAL_MODEL_PATH is unsetthreads → forks to avoid nested worker-thread + native addon crashes