CLI changelog
0.0.0-alpha.17
Section titled “0.0.0-alpha.17”Features
Section titled “Features”-
Reliable self-update —
dimple upgradenow runs the package manager with its own arguments, resolves npm, pnpm, Bun, or Yarn from the real executable path (including a standalone Bun binary’s virtualargv[1]), and probes the installed managers when the path is inconclusive. It also serializes concurrent upgrades with an owner-PID lock, keeps a Windows hard link to the running image while installing, and rejects non-semver registry versions before they reach a command.--checkstill reports the available version without installing. -
MCP search paging, filters, and recency —
memory_searchenforcesoffset + limit <= 200, matching the real candidate window, and reports a saturated window ashasMore.pathPrefixandsourceOnlyprefermetadata.filePathand match whole path segments. Thedimple://memoryresource readsDimple.recentinstead of running an empty search, with a 1..200 limit. -
Search and index — empty queries are rejected with
Sdk.InputError,--limitand MCP pages are bounded, anddimple docs-indexreconciles removed docs after a walk. The changed-file index reads at most the configured byte caps, and a model change is visible toindex --checkand the stale backfill. -
Startup and platform — the CLI entry lazy-loads commands, serve, MCP, and upgrade, and builds with splitting. The changed-file scan uses Effect
FileSystem,Path, andChildProcessSpawnerinstead ofnode:*APIs. Measurednode dist/cli.js --versiondropped from about 449 ms to 55 to 75 ms (Bun about 44 ms). -
Alpha.16 upgrade caveat — the published
0.0.0-alpha.16binary contains the old upgrade command, which passed the manager name twice and failed withUnknown command: "npm". Users on that version need one manual reinstall; later upgrades use the fixed flow:Terminal window npm install -g @ponraaj/dimple@latest# orbun add -g @ponraaj/dimple@latest
0.0.0-alpha.16
Section titled “0.0.0-alpha.16”Features
Section titled “Features”-
MCP capability surface and filtering — the 21 tools are defined once as capability contracts and projected through one toolkit. The daemon adds
?features=and?exclude_tools=filters plus matchingx-dimple-read-only,x-dimple-tools,x-dimple-features, andx-dimple-exclude-toolsheaders; a header wins over the query parameter.readonlyis applied after thetools/featuresallowlist, so a write tool cannot be re-added with?tools=. Always-available docs tools remain visible under a narrowed surface, andmaintenance_dreamis not advertised when the resolved config has nollmsection.memory_indexacceptschanged: truethrough the daemon’s git adapter andforce: true; explicit paths still work. -
Index defaults and forced re-embedding —
dimple indexwith no path indexes the git-changed files under the current directory.--changedselects every changed file in the repo,--allwalks the whole tree, and--forcere-embeds every selected unit (the whole tree when no path is given).--force --changedre-embeds every unit in the changed files only. A normal index re-embeds unchanged units whose vector is missing or belongs to another model, so a model change backfills on the next full run. -
Code-search and index-freshness —
memory_searchgainspathPrefix,kind(function,class,file,definition), andsourceOnlyfilters with file dedupe;memory_getaccepts inclusive file-line windows;dimple index --checkreports stale and missing units;dimple docs-indexindexes docs, changesets, and recent commits.dimple mcp status|stop|reload|--printno longer boot the store, and--printcarries the absolute config path and selected environment. -
Read-only filter bypass fixed —
?readonly=1combined with?tools=was a union, somemory_forgetcould be re-added. It is now an AND after the allowlist. -
dimple index --changedfixed — the computed changed-file list was discarded (only positionals reacheddimple.index, so a no-path run failed the non-emptypathsvalidation), and git paths from a subdirectory resolved against the wrong root. Changed paths now resolve fromgit rev-parse --show-topleveland scope to the requested roots. -
Docs ranking —
docs_searchnow ranks title and description evidence above repeated body mentions (body occurrences are capped), so the architecture page wins over incidental mentions in the MCP guide.
0.0.0-alpha.15
Section titled “0.0.0-alpha.15”-
Quantized search and topic-tree maintenance fixes —
float8andfloat1bitmodels now use the exact scan; the ANNvector_top_kindex is created forfloat32only, so quantized queries no longer fail withfailed to parse vector index parameters.topic.splitjobs carry a power-of-twosizeBucketderived from the routed leaf count, so a rejected split retries after the leaf grows instead of being deduped into the completed rejection.processSplitsattempts each over-limit leaf once per pass, largest first. Routing and topic resolution treatmaxDepthas a soft budget and continue to a real leaf; the old fallback attached memories to the internal__unassigned_active__node. -
Latest dependency stack — Effect 4.0.6, AI SDK v4 providers (
@ai-sdk/cohere4,@ai-sdk/google4,ai7.0.150), drizzle-orm 1.0.0-rc.5,@libsql/client0.18.0,web-tree-sitter0.27.1,@huggingface/transformers4.3.1, and TypeScript 7.0.2. The sandbox’s TS guest transpiler uses Bun’s transpiler under Bun andmodule.stripTypeScriptTypesunder Node.
0.0.0-alpha.14
Section titled “0.0.0-alpha.14”Features
Section titled “Features”-
MCP: bounded search payloads, recovery hints, and a findable update path —
memory_searchrows are ≤400-char snippets cut at a word boundary and ending in… [truncated — read with memory_get], withcontentChars/contentTruncatedmarking the cut (memory_getstays whole), so a search over indexed code can no longer put a whole 64 KB file unit on the wire. An empty search carries a recovery hint instead of a bare[].memory_writegainsreplace: truefor one-call updates (forget the active version, write the new content under the same key), and its description plus the MCP guide teach both update paths.docs_searchdrops question-phrasing stopwords, so filler-only queries find nothing and intent queries rank their page first.updateEmbeddingnow fails with a typed dimension error (invalid_paramsover MCP) instead of the vector index’s raw message. -
Drain visibility on the status surfaces —
dimple health, thedimple://healthresource, andmaintenance_healthnow reportjobs: the outstanding (offered, not yet finished) elements per job queue ({ queue, pending }). It answers the question a deferredmemory_indexleaves open — “is the embedding batch still running?” — and an empty array means everything is drained (the internal resume-signal queue is excluded). The counts come from a newQueueStatsservice in@dimple/workflow, one groupedCOUNT(*)over the queue table on the same libSQL client the queue store uses. -
MCP: paged search, bounded candidate review, offline docs pages —
memory_searchreturns at most 25 rows per call (10 by default) withhasMoreand a newoffsetinput (≤ 1000; deeper pages are refused asinvalid_params).graph_candidatescaps at 25 per call withhasMore. Every documentation page is served as adimple://docs/<path>resource, anddocs_searchhits andopen_in_dimpleresults carry that URI, so following a docs pointer works offline. -
Bulk routing no longer overwrites topic-tree member counts —
routeInsertManypersisted the call-local unit count intotopics.member_count, so every bulk pass (indexing,memory_write_many, the embed batch) replaced each topic’s total with the size of that pass; the health sweep reported a count mismatch and split/merge decisions read the wrong leaf size. Batch routing now accumulates the absolute final state per touched topic, matching sequentialrouteInsertcalls. -
dimple mcp startworks from the standalone executable — the daemon re-launch passedprocess.argv[1]unconditionally; inside a compiled binary that is Bun’s virtual entry (/$bunfs/root/<name>), so the child parsed the entry as the command, printed usage to.dimple/mcp.logand never listened whilemcp startreported a pid. The launcher now detects the standalone runtime (Bun.isStandaloneExecutable, or the virtual entry inBun.mainon the pinned 1.3.11 runtime, which predates that flag) and omits the entry argument;mcp startalso waits until the daemon is listening before reporting success, so a crashed child fails the command with the log path.
0.0.0-alpha.13
Section titled “0.0.0-alpha.13”Features
Section titled “Features”-
Session options in
dimple.jsonc:embedding.sessionOptionssets ONNX Runtime session options for every local model, and each model’s ownsessionOptionsoverrides it field by field: thread counts, execution mode, graph optimization level, the CPU arena and memory-pattern switches, the CUDA pair, and a per-modelwasm.numThreadsfor the WASM backend. The parallel-ingest recipe isintraOpNumThreads = floor(physicalCores / workers); the configuration reference carries the tuning guide. -
CPU-only session options no longer request CUDA: a session-options block emits a CUDA execution provider only when
gpuMemLimitorarenaExtendStrategyis set, so a CPU-only model is never pinned to a provider the runtime may not have.
0.0.0-alpha.12
Section titled “0.0.0-alpha.12”Features
Section titled “Features”-
dimple index --defer-embed: Write units and defer their embeddings plus topic routing to the durablememory.embed.batchjobs. The command returns once the units are stored and lexically searchable, and the summary reports the pending count; a later run or the MCP server’s workers drain them. The default stays fully synchronous. -
Faster indexing: New-unit writes go through the batched store path, measured on a pinned 235-unit corpus at 9,218 ms → 6,944 ms minimum for index plus 20 queries. ORT session options now reach the runtime (they were silently dropped) and the CPU arena is bounded.
-
MCP SDK 2.3.0:
dimple mcpruns on@modelcontextprotocol/server2.3.0 and@modelcontextprotocol/client2.3.0. Tool-schema conversion moved off the per-request path,tasks/getandtasks/cancelare servable on the 2026-07-28 era, and the one-server-per-request rule matches the existing per-request factory.
0.0.0-alpha.11
Section titled “0.0.0-alpha.11”Features
Section titled “Features”-
Standalone binaries + launcher: The
dimpleCLI now ships as prebuilt standalone binaries, with the npm package’sdimplecommand acting as a launcher. Six platform packages (@ponraaj/dimple-linux-x64,-linux-arm64,-linux-x64-musl,-darwin-arm64,-darwin-x64,-win32-x64) carry a single-file build of the CLI with the wasm ONNX engine embedded, so the local embedder runs offline without an install script; each package declares itsos/cpu/libcand ships the binary alone. The launcher resolves the platform package for the current machine, runs it with inherited stdio, and propagates its exit code;DIMPLE_BINARYoverrides the path. When no prebuilt package is present (unsupported platform,--omit=optional, or a failed resolution) it falls back to the Node bundle (dist/cli.js) with a message saying so.The six platform packages are exact
optionalDependenciesof@ponraaj/dimpleand ship in lockstep with it; no published tarball carries install scripts (npm 12 blocks dependency install scripts by default). This release verifies the cross-target binaries structurally (file type, pinned Bun runtime label, matching@libsqlnative) but has no macOS/Windows/arm64 runner, so those binaries are not executed by CI yet. Image models are unsupported (sharpis stubbed with a named error); text and code embeddings are the supported path. -
One MCP answer per call: MCP tool results now ship one answer instead of two copies of it. A successful tool call returns the payload once, minified, in
content[0].text, and no longer repeats it instructuredContent; every MCP client already reads that channel becausecontentis the mandatory one. Failures are unchanged:isError: trueplus the smallstructuredContent.error.{code,message}machine envelope (still documented in the MCP guide), and so is the dormant task-handle path, which keeps both channels because its top-level fields are a wire contract (the Tasks extension is not advertised in this build, pending the upstream era-gate fix).Effect on a real call, measured on a pinned fixture of five 720 B memories:
memory_search(limit=5)drops from 10,815 B to 5,056 B (−53%), andmemory_getfrom 2,161 B to 1,111 B (−48.6%). Both figures are the returned result object serialized as JSON; the JSON-RPC envelope adds ~35 B on top. Clients that read payloads fromstructuredContentmust read the text channel instead; the payload bytes are identical, only the indentation and the duplicate are gone.Also enforced now, with tests that refuse to be weakened: a per-tool
inputSchemabudget of 4,000 characters (the 16,384-character client drop is a silent failure mode) and a 24,000-character budget for the whole advertisedtools/list. Today’s surface is 21 tools, 11,970 B, withmemory_searchthe largest schema at 1,901 B.No tool was added, removed, renamed, or reshaped: the 21 names, titles, descriptions, and input schemas are byte-identical. The plan and the measured baseline live in
docs/mcp-efficiency-design.md; the rationale is borrowed from the Sentry and PostHog MCP servers. -
MCP annotations and opt-in narrowing: Every tool in the dimple MCP surface now carries the full annotation quartet (
readOnlyHint,destructiveHint,idempotentHint,openWorldHint), so a client can gate on it without guessing: the read-only tools arememory_get,memory_search,memory_embed,graph_candidates,graph_coverage,graph_explain,maintenance_health,docs_searchandopen_in_dimple;openWorldHintisfalseeverywhere, because dimple is a local, closed world and a constant hint would carry no signal.destructiveHintfollows the MCP definition (falsemeans the call performs only additive updates), applied through one rule: a tool is destructive when it can irreversibly hide, remove, or repurpose a live entity the caller did not name. Seven tools qualify:memory_forget,memory_index,graph_add_edge,graph_confirm,graph_reject,graph_expireandmaintenance_dream. The three that remove or retire the entity the caller named are the obvious set (memory_forgetdeletes the memory;graph_rejectandgraph_expireretire the edge); the other four matter because confirming (or inserting as confirmed) amemory_supersedesedge flips the old memoryactive → superseded, which drops it out of every read path and releases its logical key for reuse:graph_confirm, aconfirmed: truegraph_add_edge,memory_index’s superseding write plus its reconcile of vanished units, and the dream job’s confirmed supersedes relation all reach it.The loopback HTTP endpoint honours two opt-in query parameters for clients that want a narrower surface (stdio is unaffected: it has no URL and always serves everything):
?readonly=1: only the tools annotatedreadOnlyHint: true?tools=memory_get,graph_explain: exactly the named tools- both together: the union of the two sets
Tool names are matched exactly (no hyphen/underscore rewriting); an unknown name is answered
400with a message listing the valid tools. That body enumerates the tool surface, so it is produced only for a local caller: a request with noOrigin, or with a loopback origin (127.0.0.1,localhost,::1over http/https). Any other origin goes to the SDK handler untouched, where the daemon’s own localhost host/origin guards decide. With no query parameters the full 21-tool surface is served, exactly as before: nothing is hidden unless the client asks. -
Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.11
0.0.0-alpha.10
Section titled “0.0.0-alpha.10”Features
Section titled “Features”- CUDA session options for local embeddings (see the SDK changelog)
- Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.10
0.0.0-alpha.9
Section titled “0.0.0-alpha.9”- Queries are faster across the board (ANN vector search, lighter result payloads, single-pass graph context): see the SDK changelog
- Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.9
0.0.0-alpha.8
Section titled “0.0.0-alpha.8”Features
Section titled “Features”dimple upgrade: checks the npm registry for a newer CLI release and installs it with the package manager that installed you (auto-detected;--manageroverrides).--checkprints the available version without installing; no project config neededcode.execauto-install: the sandbox’ssecure-execpeer (and its platform sidecar) installs itself on first code-mode run
- Keyword search matches again: FTS5 treated the whole query as a
verbatim phrase, so multi-word queries (e.g.
import helper main) returned nothing unless the exact phrase appeared contiguously. Queries are now AND over tokens: every word must appear, anywhere. - Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.8
0.0.0-alpha.7
Section titled “0.0.0-alpha.7”Features
Section titled “Features”- MCP server:
dimple mcpexposes dimple to any MCP client over the 2026-07-28 protocol: asearchtool to discover the API surface, and a sandboxedcode.exectool with the full dimple API available inside the sandbox (dimple.write,dimple.search,dimple.graph.*, …), plus resources, prompts, and change notifications - Code-mode execution: run TS/JS in a secure, fresh-per-run sandbox
with the whole API as a
dimplenamespace: one line per operation, native control flow, andPromise.allfor parallel calls (deny-by-default permissions;secure-execis an optional peer) - API discovery: the
searchtool returns matching methods with signatures, when-to-use scenarios, and examples, so agents pick the right operation before writing code - Daemon lifecycle:
dimple mcp start/stop/reload/statusplus--printfor client config
semantic/keywordsearch profiles now actually switch the retrieval legs (previously accepted but ignored in ranking)updateEmbeddingis idempotent: re-embedding an existing memory replaces it in place instead of failing- MCP results exclude embedding vectors (~1.5 KB of JSON noise per result): smaller agent context, faster round-trips
- Prompt arguments with options (
limit,includePending) work with standard MCP clients (the 2026 spec passes them as strings) - TypeScript guests run on plain Node (typescript ^5; newer majors are rejected with a clear pin hint)
- The packed CLI runs on plain Node (no Bun-only runtime APIs) and installs cleanly in consumer projects
0.0.0-alpha.6
Section titled “0.0.0-alpha.6”dimple initproduced an invalid config template (baseUrlvsbaseURL): every command after a fresh init failed; the template now boots as-is with zero env vars- First-boot races when the jobs database / log files’ directories did not exist yet
0.0.0-alpha.5
Section titled “0.0.0-alpha.5”Features
Section titled “Features”- Runtime config reload: swap config (models, DB, settings) without restarting; failed reloads leave the current stack untouched
- Indexing lifecycle: re-indexing a changed file updates its memory in place; deleted files and removed definitions are demoted; renames surface as review candidates; code units never expire
- Call-graph edges: indexed code links callers to callees, same-file and across imports
- Query budgets: cap results by units, characters, or time
- Edge review: confirm / reject / expire candidate edges and explain a memory’s graph neighborhood
- Optional local models: transformers is auto-installed on first use; hosted embedding providers need nothing installed
- Remote databases: Turso (
libsql://) for store + jobs with env-var token resolution - CLI polish: stdout is data-only (logs go to stderr), compact
--json,dimple db-schema, fully annotateddimple init - Search profiles:
semantic/keywordmodes plus content-type filtering - Worker-ready builds: runs on edge runtimes without a filesystem service
- Confirming a supersede edge now flips the old memory in the same
transaction;
get/forget/updateEmbeddingaccept logical keys - Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.5
0.0.0-alpha.4
Section titled “0.0.0-alpha.4”Features
Section titled “Features”- Hosted embedding providers: OpenAI-compatible endpoints (OpenAI, ollama, vLLM, org gateways), Google, Cohere, and Amazon Bedrock
- Per-model runtime options: device, precision/dtype, pooling, normalization, cache directory
- Smaller embeddings on disk: quantized vector types (float8 is 4× smaller)
- Multiple models side by side: per-model trees; switching models backfills embeddings idempotently
- Tag-based publishing:
v<version>tags trigger verified npm publishes - Packaging: self-contained type declarations, READMEs, changelog in tarballs
--versionnow reports the real package version- Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.4
0.0.0-alpha.3
Section titled “0.0.0-alpha.3”--versionnow reports the real package version (was hardcoded)- Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.3
0.0.0-alpha.2
Section titled “0.0.0-alpha.2”Features
Section titled “Features”- Per-model embedding options (device/dtype/pooling/normalize/cacheDir),
full transformers dtype list, DB-level vector quantization
(
vectorType), package READMEs - Updated dependencies
- @ponraaj/dimple-sdk@0.0.0-alpha.2