- src/ollama-client.ts: Detect HTTP 404 on /api/chat and throw a descriptive
ApiError with the model name and the exact ollama pull command needed.
- src/error-handler.ts: For API_ERROR type, return the error message directly
instead of prefixing with 'API error: ', so the user-friendly 404 message
is shown cleanly in the Obsidian notice.
- tests/ollama-client.test.ts: Update 404 assertions to match the new
descriptive error message.
- src/semantic-cache.ts: Replace require('chromadb') with static import and
use proper ChromaClient/Collection types instead of any. Fix camelCase
API parameters (queryEmbeddings, nResults) and wrap single embedding into
Embedding[] for upsert. Fix clearCache to call client.reset() instead of
collection.reset() (matches actual chromadb API).
- src/workflow-engine/workflow-engine.ts: Fix unnecessary escapes in regex,
remove redundant 'as unknown' assertion, handle never type in template
literal, and add type annotations to replace callback to satisfy
no-unsafe-argument and no-base-to-string rules.
- tests/semantic-cache.test.ts: Update mocks to include client.reset() and
adjust clearCache assertions to match new implementation.
- Bundle chromadb into main.js via esbuild instead of externalizing it.
Obsidian's renderer cannot resolve bare require('chromadb') against a
plugin-local node_modules. By bundling, the client library is inlined and
works out of the box with just manifest.json + main.js.
- Remove eager cache initialization from OllamaClient constructor to avoid
unhandled promise rejections when chromadb/ChromaDB is unavailable.
- Fix 'Failed to execute fetch on Window: Illegal invocation' by wrapping
the default fetch fallback in an arrow function:
this.fetchFn = fetchFn ?? ((url, init) => fetch(url, init));
This preserves the window binding when fetch is called later.
- Update install.sh and README to remove the obsolete node_modules/chromadb
copy step.
- Update ollama-client-cache tests to reflect that cache initialization is
no longer eager.
Replace dynamic ESM import with require() for chromadb to ensure
Electron can resolve the package against the plugin's node_modules.
Also wrap default fetch fallback in an arrow function to avoid
potential strict mode issues with global fetch.
The root cause: Obsidian's plugin loader expects main.js at the plugin root
alongside manifest.json. The previous 'dist/' output + shim approach caused
'Cannot find module ./dist/main.js' because dist/ was either missing or not
resolved correctly in Obsidian's module loader.
Changes:
- build: use esbuild to bundle all source into a single main.js (61KB)
tsc --noEmit for type checking; esbuild for the actual bundle
- main.js: no longer a shim — it's the fully bundled plugin
- package.json: added esbuild as devDependency; obsidian moved to devDeps
- install.sh: remove dist/ copy step, add cleanup of old dist/ from vault
- README.md: updated manual install steps to reflect bundling
- package.json: move obsidian from dependencies to devDependencies
(it is a type stub — having it in dependencies risks shadowing
Obsidian's built-in API if node_modules is present in the plugin folder)
- main.js: explicitly extract default export from dist/main.js so the
shim works with both plugin.default and direct-export loader patterns
Obsidian's plugin loader expects main.js at the plugin root alongside
manifest.json — it does not resolve subdirectory paths in the 'main'
field. Added a thin CommonJS shim that re-exports from dist/main.js.
- main.js: new entry shim (module.exports = require('./dist/main.js'))
- manifest.json: 'main' changed from 'dist/main.js' to 'main.js'
- install.sh: copy main.js shim to plugin folder, verify its presence
- README.md: add main.js to manual install instructions