@romiluz/clawmongo 2026.3.25 → 2026.3.27

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 (29) hide show
  1. package/README.md +22 -10
  2. package/dist/build-info.json +3 -3
  3. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  4. package/dist/{command-registry-8LCMETl9.js → command-registry-BEExVzem.js} +2 -2
  5. package/dist/{command-registry-HhghuS_n.js → command-registry-Bow_kWfU.js} +4 -4
  6. package/dist/{completion-cli-CjPcdpbr.js → completion-cli-B4hJ8HjW.js} +3 -3
  7. package/dist/{completion-cli-Ujj0nwzr.js → completion-cli-DQrts0Ip.js} +2 -2
  8. package/dist/{doctor-completion-D4wCwykH.js → doctor-completion-Dk8sgMOd.js} +1 -1
  9. package/dist/entry.js +1 -1
  10. package/dist/{gateway-cli-BpLqS4sE.js → gateway-cli-BAueAYsk.js} +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/{onboard-c0331xiO.js → onboard-BF8cNljJ.js} +1 -1
  13. package/dist/{onboarding-memory-DNeHKyRz.js → onboarding-memory-CTB-Vkbl.js} +20 -10
  14. package/dist/{program-BcokVyDe.js → program-BjkVOzbF.js} +2 -2
  15. package/dist/{prompt-select-styled-z9pi54Hp.js → prompt-select-styled-6vDD4Gjv.js} +1 -1
  16. package/dist/{register.maintenance-DVakq6Gu.js → register.maintenance-CjOZ-w_0.js} +5 -5
  17. package/dist/{register.onboard-DemZm7YR.js → register.onboard-GSGJTcJk.js} +2 -2
  18. package/dist/{register.setup-DTrlyJlW.js → register.setup-BD774nEM.js} +2 -2
  19. package/dist/{register.subclis-CfWnUdTd.js → register.subclis-BlqPR8UO.js} +3 -3
  20. package/dist/{register.subclis-DmsAQrVB.js → register.subclis-CeG9qCbt.js} +1 -1
  21. package/dist/{run-main-D88e0mh0.js → run-main-C4Box4Zo.js} +4 -4
  22. package/dist/{setup-C-dv8809.js → setup-CjQJLNqB.js} +2 -2
  23. package/dist/{setup.finalize-B11Mi8BM.js → setup.finalize-ChczeW6V.js} +4 -4
  24. package/dist/{update-cli-mNuSw-3W.js → update-cli-mBB0aHxZ.js} +5 -5
  25. package/docs/plans/2026-03-22-clawmongo-presentation-plan.md +7 -11
  26. package/docs/reference/mongodb-capabilities.md +1 -1
  27. package/docs/research/2026-03-22-atlas-local-preview-web.md +270 -0
  28. package/docs/start/clawmongo-getting-started.md +1 -1
  29. package/package.json +1 -1
package/README.md CHANGED
@@ -94,16 +94,28 @@ Full comparison with migration guidance: [ClawMongo vs Default Memory](docs/refe
94
94
  ClawMongo uses a canonical-truth-first architecture where **events are the single source of truth**. Everything else -- chunks, entities, relations, episodes, procedures -- is derived.
95
95
 
96
96
  ```text
97
- Inbound message / tool output
98
- -> writeEventAndProject()
99
- |
100
- +-- events collection (canonical, append-only)
101
- +-- chunks collection (projected from events, searchable)
102
- +-- ingest_runs collection (operational audit trail)
103
- |
104
- +-- extractAndUpsertEntities() (fire-and-forget)
105
- +-- entities collection (@mentions, #tags, URLs, paths, quoted names)
106
- +-- relations collection (links between entities, weighted, typed)
97
+ Write Path:
98
+ Message / tool output -> writeEventAndProject()
99
+ +-> events (canonical, append-only)
100
+ +-> chunks (projected, searchable)
101
+ +-> ingest_runs (audit trail)
102
+ +-> extractAndUpsertEntities()
103
+ +-> entities (@mentions, #tags, URLs, quoted names)
104
+ +-> relations (links between entities, weighted)
105
+ +-> checkAutoEpisodeTriggers()
106
+ +-> episodes (materialized from event windows)
107
+
108
+ Retrieval Path:
109
+ Query -> planRetrieval() -> score 8 paths by keyword heuristics
110
+ +-> active-critical (high-salience recent)
111
+ +-> structured (facts, preferences)
112
+ +-> episodic (summarized threads)
113
+ +-> graph ($graphLookup traversal)
114
+ +-> kb (knowledge base docs)
115
+ +-> hybrid ($rankFusion vector+text)
116
+ +-> raw-window (recent events)
117
+ +-> procedural (workflows)
118
+ -> rerankResults() -> deduplicate -> return to agent
107
119
  ```
108
120
 
109
121
  ### 20 Collections
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.25",
3
- "commit": "ba55574d91f05487cbb2a81d269f9fe6528ec6f6",
4
- "builtAt": "2026-03-22T11:51:16.866Z"
2
+ "version": "2026.3.27",
3
+ "commit": "20b81dc4cd0ac44e9001aa983753d9c0ec350205",
4
+ "builtAt": "2026-03-22T14:32:34.167Z"
5
5
  }
@@ -1 +1 @@
1
- 5cab91a06ed476e677050b89861baed3d839d13f1e94afd4b47dc984fce7faf2
1
+ 394a5d9034f4a78cfa90af252bc6079f55f43b523c7389e72038ef3d47cbd6b0
@@ -7,7 +7,7 @@ import "./subsystem-VzQeL-96.js";
7
7
  import "./ansi-BEJF8NKS.js";
8
8
  import "./boolean-C3GkJetE.js";
9
9
  import "./env-mRJH5TpF.js";
10
- import "./register.subclis-CfWnUdTd.js";
10
+ import "./register.subclis-BlqPR8UO.js";
11
11
  import "./core-command-descriptors-LG6MYVik.js";
12
- import { n as registerCoreCliByName } from "./command-registry-HhghuS_n.js";
12
+ import { n as registerCoreCliByName } from "./command-registry-Bow_kWfU.js";
13
13
  export { registerCoreCliByName };
@@ -1,5 +1,5 @@
1
1
  import { E as getPrimaryCommand, k as hasHelpOrVersion } from "./logger-CoEtkjhn.js";
2
- import { a as removeCommandByName, i as registerSubCliCommands, o as reparseProgramFromActionArgs } from "./register.subclis-CfWnUdTd.js";
2
+ import { a as removeCommandByName, i as registerSubCliCommands, o as reparseProgramFromActionArgs } from "./register.subclis-BlqPR8UO.js";
3
3
  import { t as getCoreCliCommandDescriptors } from "./core-command-descriptors-LG6MYVik.js";
4
4
  //#region src/cli/program/command-registry.ts
5
5
  const shouldRegisterCorePrimaryOnly = (argv) => {
@@ -14,7 +14,7 @@ const coreEntries = [
14
14
  hasSubcommands: false
15
15
  }],
16
16
  register: async ({ program }) => {
17
- (await import("./register.setup-DTrlyJlW.js")).registerSetupCommand(program);
17
+ (await import("./register.setup-BD774nEM.js")).registerSetupCommand(program);
18
18
  }
19
19
  },
20
20
  {
@@ -24,7 +24,7 @@ const coreEntries = [
24
24
  hasSubcommands: false
25
25
  }],
26
26
  register: async ({ program }) => {
27
- (await import("./register.onboard-DemZm7YR.js")).registerOnboardCommand(program);
27
+ (await import("./register.onboard-GSGJTcJk.js")).registerOnboardCommand(program);
28
28
  }
29
29
  },
30
30
  {
@@ -81,7 +81,7 @@ const coreEntries = [
81
81
  }
82
82
  ],
83
83
  register: async ({ program }) => {
84
- (await import("./register.maintenance-DVakq6Gu.js")).registerMaintenanceCommands(program);
84
+ (await import("./register.maintenance-CjOZ-w_0.js")).registerMaintenanceCommands(program);
85
85
  }
86
86
  },
87
87
  {
@@ -9,8 +9,8 @@ import "./boolean-C3GkJetE.js";
9
9
  import "./env-mRJH5TpF.js";
10
10
  import "./utils-seFh26xW.js";
11
11
  import "./links-kyhxxZ1i.js";
12
- import { a as registerCompletionCli } from "./completion-cli-Ujj0nwzr.js";
13
- import "./register.subclis-CfWnUdTd.js";
14
- import "./command-registry-HhghuS_n.js";
12
+ import { a as registerCompletionCli } from "./completion-cli-DQrts0Ip.js";
13
+ import "./register.subclis-BlqPR8UO.js";
14
+ import "./command-registry-Bow_kWfU.js";
15
15
  import "./program-context-BoWQV6OT.js";
16
16
  export { registerCompletionCli };
@@ -3,8 +3,8 @@ import { r as theme } from "./theme-CdOoMzRk.js";
3
3
  import { c as routeLogsToStderr } from "./subsystem-VzQeL-96.js";
4
4
  import { h as pathExists } from "./utils-seFh26xW.js";
5
5
  import { t as formatDocsLink } from "./links-kyhxxZ1i.js";
6
- import { r as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-CfWnUdTd.js";
7
- import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-HhghuS_n.js";
6
+ import { r as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-BlqPR8UO.js";
7
+ import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-Bow_kWfU.js";
8
8
  import { t as getProgramContext } from "./program-context-BoWQV6OT.js";
9
9
  import path from "node:path";
10
10
  import os from "node:os";
@@ -1,7 +1,7 @@
1
1
  import { n as resolveOpenClawPackageRoot } from "./openclaw-root-CwSo78_f.js";
2
2
  import { n as resolveCliName } from "./cli-name-CflIHvyV.js";
3
3
  import { t as note } from "./note-BnDVMCVo.js";
4
- import { c as usesSlowDynamicCompletion, i as isCompletionInstalled, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-Ujj0nwzr.js";
4
+ import { c as usesSlowDynamicCompletion, i as isCompletionInstalled, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-DQrts0Ip.js";
5
5
  import path from "node:path";
6
6
  import { spawnSync } from "node:child_process";
7
7
  //#region src/commands/doctor-completion.ts
package/dist/entry.js CHANGED
@@ -199,7 +199,7 @@ function tryHandleRootHelpFastPath(argv, deps = {}) {
199
199
  }
200
200
  function runMainOrRootHelp(argv) {
201
201
  if (tryHandleRootHelpFastPath(argv)) return;
202
- import("./run-main-D88e0mh0.js").then(({ runCli }) => runCli(argv)).catch((error) => {
202
+ import("./run-main-C4Box4Zo.js").then(({ runCli }) => runCli(argv)).catch((error) => {
203
203
  console.error("[openclaw] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
204
204
  process$1.exitCode = 1;
205
205
  });
@@ -236,7 +236,7 @@ import { _ as computePreviousRunAtMs, g as computeNextRunAtMs, h as coerceFinite
236
236
  import { a as resolveNpmChannelTag, n as compareSemverStrings, p as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-8M6LXFES.js";
237
237
  import { r as resolveConfiguredDeferredChannelPluginIds } from "./channel-plugin-ids-DfzIFHve.js";
238
238
  import "./setup.secret-input-DALXyJR2.js";
239
- import { t as runSetupWizard } from "./setup-C-dv8809.js";
239
+ import { t as runSetupWizard } from "./setup-CjQJLNqB.js";
240
240
  import { a as resolveApnsAuthConfigFromEnv, c as shouldClearStoredApnsRegistration, d as parseMessageWithAttachments, f as formatForLog, g as setGatewayWsLogStyle, h as summarizeAgentEventForWsLog, l as resolveApnsRelayConfigFromEnv, m as shouldLogWs, n as loadApnsRegistration, o as sendApnsAlert, p as logWs, r as normalizeApnsEnvironment, s as sendApnsBackgroundWake, t as clearApnsRegistrationIfCurrent, u as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-DQN5pcl6.js";
241
241
  import { _ as buildGogWatchStartArgs, g as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, w as resolveGmailHookRuntimeConfig } from "./gmail-setup-utils-DvwS5fry.js";
242
242
  import { i as loadAgentIdentity, o as pruneAgentConfig, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-CDS6iAat.js";
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ let saveSessionStore;
29
29
  let toWhatsappJid;
30
30
  let waitForever;
31
31
  async function loadLegacyCliDeps() {
32
- const [{ installGaxiosFetchCompat }, { runCli }] = await Promise.all([import("./gaxios-fetch-compat-CZFw_C-b.js"), import("./run-main-D88e0mh0.js")]);
32
+ const [{ installGaxiosFetchCompat }, { runCli }] = await Promise.all([import("./gaxios-fetch-compat-CZFw_C-b.js"), import("./run-main-C4Box4Zo.js")]);
33
33
  return {
34
34
  installGaxiosFetchCompat,
35
35
  runCli
@@ -10,7 +10,7 @@ import "./daemon-runtime-DZ89fADl.js";
10
10
  import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, c as handleReset, g as resolveControlUiLinks, m as randomToken, n as applyWizardMetadata, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput } from "./onboard-helpers-D3xV_T96.js";
11
11
  import { t as WizardCancelledError } from "./prompts-si9A7fzB.js";
12
12
  import { t as createClackPrompter } from "./clack-prompter-QEV3P7rT.js";
13
- import { t as runSetupWizard } from "./setup-C-dv8809.js";
13
+ import { t as runSetupWizard } from "./setup-CjQJLNqB.js";
14
14
  import { n as logConfigUpdated } from "./logging-BM4mQ53W.js";
15
15
  import { i as resolveManifestProviderOnboardAuthFlags } from "./provider-auth-choices-BfWvatIg.js";
16
16
  import { n as isDeprecatedAuthChoice, r as normalizeLegacyOnboardAuthChoice } from "./auth-choice-legacy-DrWHCwV-.js";
@@ -12,6 +12,7 @@ import "./logger-DtlnPe_E.js";
12
12
  import "./exec-BnXF7JCz.js";
13
13
  import { t as resolveOpenClawPackageName } from "./openclaw-root-CwSo78_f.js";
14
14
  import "./workspace-DuH1agxz.js";
15
+ import { t as WizardCancelledError } from "./prompts-si9A7fzB.js";
15
16
  import path from "node:path";
16
17
  import "node:fs/promises";
17
18
  //#region src/wizard/onboarding-memory.ts
@@ -19,19 +20,18 @@ function shouldShowNoDockerHint(reason) {
19
20
  const lower = reason.toLowerCase();
20
21
  return lower.includes("docker") || lower.includes("compose");
21
22
  }
22
- async function showNoDockerLocalHint(prompter) {
23
+ async function showDockerRequiredHint(prompter) {
23
24
  await prompter.note([
24
- "Docker is optional. Local MongoDB works without Docker.",
25
+ "Docker is required for ClawMongo. The mongodb-atlas-local:preview Docker image bundles mongod + mongot in one container.",
25
26
  "",
26
- "Standalone (basic):",
27
- " mongod --dbpath ./data/db --port 27017",
27
+ "Install Docker Desktop: https://docs.docker.com/get-docker/",
28
28
  "",
29
- "Replica set (recommended for transactions + change streams):",
30
- " mongod --dbpath ./data/db --port 27017 --replSet rs0",
31
- " mongosh --eval \"rs.initiate()\"",
29
+ "Then start atlas-local:",
30
+ " ./docker/mongodb/start-preview.sh",
32
31
  "",
33
- "Then continue with URI: mongodb://localhost:27017/openclaw"
34
- ].join("\n"), "Local MongoDB (No Docker)");
32
+ "Or manually:",
33
+ " docker run -d -p 27017:27017 -e VOYAGE_API_KEY=$VOYAGE_API_KEY --name clawmongo-preview mongodb/mongodb-atlas-local:preview"
34
+ ].join("\n"), "Docker Required");
35
35
  }
36
36
  /**
37
37
  * Interactive memory setup for the onboarding wizard.
@@ -41,12 +41,22 @@ async function setupMemoryBackend(config, prompter) {
41
41
  return setupMongoDBMemory(config, prompter, await resolveOpenClawPackageName() === "@romiluz/clawmongo");
42
42
  }
43
43
  async function setupMongoDBMemory(config, prompter, isClawMongo) {
44
+ if (isClawMongo && !process.env.VOYAGE_API_KEY) {
45
+ const voyageKey = await prompter.text({
46
+ message: "Enter your Voyage AI API key (required for auto-embeddings)",
47
+ placeholder: "pa-...",
48
+ validate: (val) => !val?.trim() ? "Voyage AI API key is required" : void 0
49
+ });
50
+ if (typeof voyageKey === "symbol") throw new WizardCancelledError();
51
+ process.env.VOYAGE_API_KEY = voyageKey.trim();
52
+ await prompter.note("VOYAGE_API_KEY set for this session. Add it to your shell profile for persistence:\n export VOYAGE_API_KEY=" + voyageKey.trim(), "Voyage AI");
53
+ }
44
54
  if (isClawMongo) try {
45
55
  const { attemptAutoSetup } = await import("./mongodb-auto-setup-QcwgZSN9.js");
46
56
  const autoResult = await attemptAutoSetup(prompter);
47
57
  if (autoResult.success) return continueMongoDBSetup(config, prompter, isClawMongo, autoResult.uri);
48
58
  await prompter.note(autoResult.reason, "Auto-Setup");
49
- if (shouldShowNoDockerHint(autoResult.reason)) await showNoDockerLocalHint(prompter);
59
+ if (shouldShowNoDockerHint(autoResult.reason)) await showDockerRequiredHint(prompter);
50
60
  } catch {}
51
61
  const existingUri = config.memory?.mongodb?.uri?.trim();
52
62
  return continueMongoDBSetup(config, prompter, isClawMongo, (await prompter.text({
@@ -15,8 +15,8 @@ import "./registry-DgTkDMz3.js";
15
15
  import { n as resolveCliName } from "./cli-name-CflIHvyV.js";
16
16
  import "./ports-lsof-BLsmHaCG.js";
17
17
  import { n as resolveCliChannelOptions } from "./channel-options-DgceIrBT.js";
18
- import "./register.subclis-CfWnUdTd.js";
19
- import { i as registerProgramCommands } from "./command-registry-HhghuS_n.js";
18
+ import "./register.subclis-BlqPR8UO.js";
19
+ import { i as registerProgramCommands } from "./command-registry-Bow_kWfU.js";
20
20
  import { n as setProgramContext } from "./program-context-BoWQV6OT.js";
21
21
  import "./ports-D5BpbpwU.js";
22
22
  import { t as emitCliBanner } from "./banner-D9XjhoFM.js";
@@ -68,7 +68,7 @@ import { n as logConfigUpdated } from "./logging-BM4mQ53W.js";
68
68
  import { n as resolveProviderAuthLoginCommand, t as buildProviderAuthRecoveryHint } from "./provider-auth-guidance-D4-q7IHl.js";
69
69
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-DDDsik9S.js";
70
70
  import { t as formatHealthCheckFailure } from "./health-format-D5jsS7Ch.js";
71
- import { n as doctorShellCompletion } from "./doctor-completion-D4wCwykH.js";
71
+ import { n as doctorShellCompletion } from "./doctor-completion-Dk8sgMOd.js";
72
72
  import { a as stripUnknownConfigKeys, i as resolveConfigPathTarget, n as formatConfigPath, r as noteOpencodeProviderOverrides, t as runDoctorConfigPreflight } from "./doctor-config-preflight-BJ0lGLTO.js";
73
73
  import { a as isMattermostMutableAllowEntry, i as isMSTeamsMutableAllowEntry, n as isGoogleChatMutableAllowEntry, o as isSlackMutableAllowEntry, r as isIrcMutableAllowEntry, s as isZalouserMutableGroupEntry, t as isDiscordMutableAllowEntry } from "./mutable-allowlist-detectors-ppdORIro.js";
74
74
  import { t as resolveDefaultChannelAccountContext } from "./channel-account-context-DZhZw4oo.js";
@@ -183,9 +183,9 @@ import "./matrix-migration-snapshot-CRKiHq6Y.js";
183
183
  import "./setup-group-access-BYV3O8yu.js";
184
184
  import "./skills-status-Cr-YPNJU.js";
185
185
  import "./note-BnDVMCVo.js";
186
- import "./completion-cli-Ujj0nwzr.js";
187
- import "./register.subclis-CfWnUdTd.js";
188
- import "./command-registry-HhghuS_n.js";
186
+ import "./completion-cli-DQrts0Ip.js";
187
+ import "./register.subclis-BlqPR8UO.js";
188
+ import "./command-registry-Bow_kWfU.js";
189
189
  import "./program-context-BoWQV6OT.js";
190
190
  import "./heartbeat-summary-CMwt9qam.js";
191
191
  import "./health-DU_pBiid.js";
@@ -197,8 +197,8 @@ import "./logging-BM4mQ53W.js";
197
197
  import "./provider-auth-guidance-D4-q7IHl.js";
198
198
  import "./systemd-linger-DDDsik9S.js";
199
199
  import "./health-format-D5jsS7Ch.js";
200
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-z9pi54Hp.js";
201
- import "./doctor-completion-D4wCwykH.js";
200
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-6vDD4Gjv.js";
201
+ import "./doctor-completion-Dk8sgMOd.js";
202
202
  import "./doctor-config-preflight-BJ0lGLTO.js";
203
203
  import "./channel-account-context-DZhZw4oo.js";
204
204
  import "./doctor-state-migrations-Cdk3ep_f.js";
@@ -165,12 +165,12 @@ import "./onboard-helpers-D3xV_T96.js";
165
165
  import "./note-BnDVMCVo.js";
166
166
  import "./clack-prompter-QEV3P7rT.js";
167
167
  import "./setup.secret-input-DALXyJR2.js";
168
- import "./setup-C-dv8809.js";
168
+ import "./setup-CjQJLNqB.js";
169
169
  import "./logging-BM4mQ53W.js";
170
170
  import { i as resolveManifestProviderOnboardAuthFlags } from "./provider-auth-choices-BfWvatIg.js";
171
171
  import "./provider-wizard-DQd5eYhX.js";
172
172
  import { n as formatAuthChoiceChoicesForCli } from "./auth-choice-options-DvqJHFOp.js";
173
- import { n as CORE_ONBOARD_AUTH_FLAGS, t as setupWizardCommand } from "./onboard-c0331xiO.js";
173
+ import { n as CORE_ONBOARD_AUTH_FLAGS, t as setupWizardCommand } from "./onboard-BF8cNljJ.js";
174
174
  //#region src/cli/program/register.onboard.ts
175
175
  function resolveInstallDaemonFlag(command, opts) {
176
176
  if (!command || typeof command !== "object") return;
@@ -166,10 +166,10 @@ import "./onboard-helpers-D3xV_T96.js";
166
166
  import "./note-BnDVMCVo.js";
167
167
  import "./clack-prompter-QEV3P7rT.js";
168
168
  import "./setup.secret-input-DALXyJR2.js";
169
- import "./setup-C-dv8809.js";
169
+ import "./setup-CjQJLNqB.js";
170
170
  import { n as logConfigUpdated, t as formatConfigPath } from "./logging-BM4mQ53W.js";
171
171
  import "./provider-auth-choices-BfWvatIg.js";
172
- import { t as setupWizardCommand } from "./onboard-c0331xiO.js";
172
+ import { t as setupWizardCommand } from "./onboard-BF8cNljJ.js";
173
173
  import JSON5 from "json5";
174
174
  import fs from "node:fs/promises";
175
175
  //#region src/commands/setup.ts
@@ -58,7 +58,7 @@ const entries = [
58
58
  description: "Run, inspect, and query the WebSocket Gateway",
59
59
  hasSubcommands: true,
60
60
  register: async (program) => {
61
- (await import("./gateway-cli-BpLqS4sE.js")).registerGatewayCli(program);
61
+ (await import("./gateway-cli-BAueAYsk.js")).registerGatewayCli(program);
62
62
  }
63
63
  },
64
64
  {
@@ -264,7 +264,7 @@ const entries = [
264
264
  description: "Update OpenClaw and inspect update channel status",
265
265
  hasSubcommands: true,
266
266
  register: async (program) => {
267
- (await import("./update-cli-mNuSw-3W.js")).registerUpdateCli(program);
267
+ (await import("./update-cli-mBB0aHxZ.js")).registerUpdateCli(program);
268
268
  }
269
269
  },
270
270
  {
@@ -280,7 +280,7 @@ const entries = [
280
280
  description: "Generate shell completion script",
281
281
  hasSubcommands: false,
282
282
  register: async (program) => {
283
- (await import("./completion-cli-CjPcdpbr.js")).registerCompletionCli(program);
283
+ (await import("./completion-cli-B4hJ8HjW.js")).registerCompletionCli(program);
284
284
  }
285
285
  }
286
286
  ];
@@ -7,6 +7,6 @@ import "./subsystem-VzQeL-96.js";
7
7
  import "./ansi-BEJF8NKS.js";
8
8
  import "./boolean-C3GkJetE.js";
9
9
  import "./env-mRJH5TpF.js";
10
- import { n as loadValidatedConfigForPluginRegistration, r as registerSubCliByName } from "./register.subclis-CfWnUdTd.js";
10
+ import { n as loadValidatedConfigForPluginRegistration, r as registerSubCliByName } from "./register.subclis-BlqPR8UO.js";
11
11
  import "./subcli-descriptors-rdyciU1f.js";
12
12
  export { loadValidatedConfigForPluginRegistration, registerSubCliByName };
@@ -381,7 +381,7 @@ async function runCli(argv = process$1.argv) {
381
381
  }
382
382
  if (await tryRouteCli(normalizedArgv)) return;
383
383
  enableConsoleCapture();
384
- const { buildProgram } = await import("./program-BcokVyDe.js");
384
+ const { buildProgram } = await import("./program-BjkVOzbF.js");
385
385
  const program = buildProgram();
386
386
  const { installUnhandledRejectionHandler } = await import("./unhandled-rejections-O6cVOz2D.js");
387
387
  installUnhandledRejectionHandler();
@@ -395,10 +395,10 @@ async function runCli(argv = process$1.argv) {
395
395
  const { getProgramContext } = await import("./program-context-BpsjGnnn.js");
396
396
  const ctx = getProgramContext(program);
397
397
  if (ctx) {
398
- const { registerCoreCliByName } = await import("./command-registry-8LCMETl9.js");
398
+ const { registerCoreCliByName } = await import("./command-registry-BEExVzem.js");
399
399
  await registerCoreCliByName(program, ctx, primary, parseArgv);
400
400
  }
401
- const { registerSubCliByName } = await import("./register.subclis-DmsAQrVB.js");
401
+ const { registerSubCliByName } = await import("./register.subclis-CeG9qCbt.js");
402
402
  await registerSubCliByName(program, primary);
403
403
  }
404
404
  if (!shouldSkipPluginCommandRegistration({
@@ -407,7 +407,7 @@ async function runCli(argv = process$1.argv) {
407
407
  hasBuiltinPrimary: primary !== null && program.commands.some((command) => command.name() === primary)
408
408
  })) {
409
409
  const { registerPluginCliCommands } = await import("./cli-FF5823nM.js");
410
- const { loadValidatedConfigForPluginRegistration } = await import("./register.subclis-DmsAQrVB.js");
410
+ const { loadValidatedConfigForPluginRegistration } = await import("./register.subclis-CeG9qCbt.js");
411
411
  const config = await loadValidatedConfigForPluginRegistration();
412
412
  if (config) registerPluginCliCommands(program, config);
413
413
  }
@@ -278,7 +278,7 @@ async function runSetupWizard(opts, runtime = defaultRuntime, prompter) {
278
278
  try {
279
279
  const { resolveOpenClawPackageName } = await import("./openclaw-root-UnGmA1la.js");
280
280
  if (await resolveOpenClawPackageName() === "@romiluz/clawmongo") {
281
- const { setupMemoryBackend } = await import("./onboarding-memory-DNeHKyRz.js");
281
+ const { setupMemoryBackend } = await import("./onboarding-memory-CTB-Vkbl.js");
282
282
  nextConfig = await setupMemoryBackend(nextConfig, prompter);
283
283
  }
284
284
  } catch (err) {}
@@ -387,7 +387,7 @@ async function runSetupWizard(opts, runtime = defaultRuntime, prompter) {
387
387
  mode
388
388
  });
389
389
  await writeConfigFile(nextConfig);
390
- const { finalizeSetupWizard } = await import("./setup.finalize-B11Mi8BM.js");
390
+ const { finalizeSetupWizard } = await import("./setup.finalize-ChczeW6V.js");
391
391
  const { launchedTui } = await finalizeSetupWizard({
392
392
  flow,
393
393
  opts,
@@ -173,16 +173,16 @@ import "./launchd-BkEfiyeS.js";
173
173
  import { n as resolveGatewayService, t as describeGatewayServiceRestart } from "./service-CruMJqe9.js";
174
174
  import { i as isSystemdUserServiceAvailable } from "./systemd-CvJKJn75.js";
175
175
  import "./note-BnDVMCVo.js";
176
- import { r as installCompletion } from "./completion-cli-Ujj0nwzr.js";
177
- import "./register.subclis-CfWnUdTd.js";
178
- import "./command-registry-HhghuS_n.js";
176
+ import { r as installCompletion } from "./completion-cli-DQrts0Ip.js";
177
+ import "./register.subclis-BlqPR8UO.js";
178
+ import "./command-registry-Bow_kWfU.js";
179
179
  import "./program-context-BoWQV6OT.js";
180
180
  import "./heartbeat-summary-CMwt9qam.js";
181
181
  import { r as healthCommand } from "./health-DU_pBiid.js";
182
182
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-B8co16VR.js";
183
183
  import { t as resolveSetupSecretInputString } from "./setup.secret-input-DALXyJR2.js";
184
184
  import { t as formatHealthCheckFailure } from "./health-format-D5jsS7Ch.js";
185
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-D4wCwykH.js";
185
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Dk8sgMOd.js";
186
186
  import { t as runTui } from "./tui-Dj52JiFV.js";
187
187
  import path from "node:path";
188
188
  import os from "node:os";
@@ -198,9 +198,9 @@ import "./note-BnDVMCVo.js";
198
198
  import "./npm-pack-install-BBxs0rto.js";
199
199
  import "./skill-scanner-tuyTk8QC.js";
200
200
  import "./installs-hUBrmugM.js";
201
- import { r as installCompletion } from "./completion-cli-Ujj0nwzr.js";
202
- import "./register.subclis-CfWnUdTd.js";
203
- import "./command-registry-HhghuS_n.js";
201
+ import { r as installCompletion } from "./completion-cli-DQrts0Ip.js";
202
+ import "./register.subclis-BlqPR8UO.js";
203
+ import "./command-registry-Bow_kWfU.js";
204
204
  import "./program-context-BoWQV6OT.js";
205
205
  import { n as renderTable, t as getTerminalTableWidth } from "./table-BnaYTso2.js";
206
206
  import "./heartbeat-summary-CMwt9qam.js";
@@ -215,8 +215,8 @@ import "./provider-auth-guidance-D4-q7IHl.js";
215
215
  import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from "./update-BLx9BWCo.js";
216
216
  import "./systemd-linger-DDDsik9S.js";
217
217
  import "./health-format-D5jsS7Ch.js";
218
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-z9pi54Hp.js";
219
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-D4wCwykH.js";
218
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-6vDD4Gjv.js";
219
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Dk8sgMOd.js";
220
220
  import "./doctor-config-preflight-BJ0lGLTO.js";
221
221
  import "./channel-account-context-DZhZw4oo.js";
222
222
  import "./doctor-state-migrations-Cdk3ep_f.js";
@@ -496,27 +496,23 @@ to a working personal AI assistant with MongoDB-native memory in about 10 minute
496
496
  ### Required
497
497
 
498
498
  - **Node.js 22+** (24 recommended)
499
- - **MongoDB 7.0+** with mongot (MongoDB Community Search)
500
- - **Voyage AI API key** (for automated embeddings)
499
+ - **MongoDB** via `mongodb-atlas-local:preview` Docker image (bundles mongod + mongot + auto-embeddings)
500
+ - **Voyage AI API key** (set as VOYAGE_API_KEY env var on the container)
501
501
  - **LLM API key** (Anthropic Claude recommended, or OpenAI, Google, etc.)
502
502
 
503
503
  ### MongoDB Setup Options
504
504
 
505
- #### Option A: Docker (Quickest)
505
+ #### Option A: Docker with atlas-local:preview (Quickest)
506
506
 
507
- [Docker compose with mongodb + mongot, ready to go]
507
+ [Single container: docker compose -f docker/mongodb/docker-compose.preview.yml up -d]
508
508
 
509
- #### Option B: Local Install
509
+ #### Option B: Atlas CLI Local Deployment
510
510
 
511
- [mongod + mongot install steps for macOS/Linux]
512
-
513
- #### Option C: MongoDB Atlas
514
-
515
- [Atlas cluster with Search enabled, connection string]
511
+ [atlas deployments setup clawmongo --type local --port 27017]
516
512
 
517
513
  ### Voyage AI Setup
518
514
 
519
- [Sign up at voyageai.com, get API key, configure in mongot]
515
+ [Sign up at voyageai.com, get API key, set VOYAGE_API_KEY env var on container]
520
516
 
521
517
  ## Install ClawMongo
522
518
 
@@ -33,7 +33,7 @@ With mongot's `autoEmbed`, ClawMongo eliminates the embedding pipeline entirely.
33
33
 
34
34
  mongot delegates to the Voyage AI API using the `autoEmbed` field type in vector search index definitions. At index time, mongot reads the text field from each document and sends it to `voyage-4-large` for embedding. At query time, `$vectorSearch` sends the query text to mongot, which embeds it and runs approximate nearest neighbor (ANN) search.
35
35
 
36
- Configuration: set `memory.mongodb.embeddingMode = "automated"` in ClawMongo config. Provide a Voyage AI API key in your mongot configuration.
36
+ Configuration: set `memory.mongodb.embeddingMode = "automated"` in ClawMongo config. Set the `VOYAGE_API_KEY` environment variable on the `mongodb-atlas-local:preview` container (or pass it to `start-preview.sh`).
37
37
 
38
38
  ### Configuration Example
39
39
 
@@ -0,0 +1,270 @@
1
+ # Web Research: MongoDB Atlas Local (Preview) — mongod + mongot bundled Docker image
2
+
3
+ ## Execution
4
+ - Preferred backend: websearch+webfetch
5
+ - Allowed fallbacks: websearch-only, webfetch-only
6
+ - Research round: 1 (understanding Atlas Local and why it supersedes separate mongod + mongot)
7
+
8
+ ## Sources Used
9
+ - WebFetch on `raw.githubusercontent.com/mongodb/docs-atlas-cli/master/source/atlas-cli-deploy-docker.txt` — official Atlas CLI Docker deployment docs (verbatim RST source)
10
+ - WebFetch on `raw.githubusercontent.com/mongodb/docs-atlas-cli/master/source/atlas-cli-deploy-local.txt` — official Atlas CLI local deployment docs (verbatim RST source)
11
+ - WebFetch on `raw.githubusercontent.com/mongodb/docs-atlas-cli/master/source/atlas-cli-deploy-fts.txt` — Atlas CLI FTS + AVS docs
12
+ - Docker Hub API `hub.docker.com/v2/repositories/mongodb/mongodb-atlas-local/tags/` — confirmed all available tags including `preview`
13
+ - Live page fetch `mongodb.com/docs/atlas/atlas-vector-search/crud-embeddings/create-embeddings-automatic/` — auto-embedding feature docs with full content extraction
14
+ - Live page fetch `mongodb.com/docs/atlas/atlas-vector-search/deployment-options/` — deployment option recommendations
15
+
16
+ **Bright Data:** Not available; fell back to WebFetch + curl for raw sources.
17
+
18
+ ## Research Quality
19
+ - Status: COMPLETE
20
+ - Quality level: high
21
+ - Backend mode: websearch+webfetch
22
+
23
+ ---
24
+
25
+ ## 1. What Is MongoDB Atlas Local?
26
+
27
+ MongoDB Atlas Local (`mongodb/mongodb-atlas-local`) is an official Docker image that packages a **single-node MongoDB replica set** alongside the **mongot search process** (the same Apache Lucene-based Atlas Search / Atlas Vector Search engine that runs in the cloud) into one container. It provides a self-contained local development environment that mirrors the Atlas cloud experience — including Atlas Search indexes ($search), Atlas Vector Search ($vectorSearch), and the preview auto-embedding feature — without requiring a cloud account or a separate mongot installation.
28
+
29
+ The image is maintained by MongoDB and published to Docker Hub at:
30
+
31
+ ```
32
+ mongodb/mongodb-atlas-local
33
+ ```
34
+
35
+ ---
36
+
37
+ ## 2. Docker Image Tags
38
+
39
+ Confirmed from the Docker Hub API (as of 2026-03-20, the latest rebuild date):
40
+
41
+ | Tag pattern | Purpose |
42
+ |---|---|
43
+ | `latest` | Current stable release (maps to latest MongoDB 8.x + mongot) |
44
+ | `8.2`, `8.2.6`, `8.2.6-20260320T081259Z` | Stable MongoDB 8.2.x + mongot |
45
+ | `8.0`, `8.0.20`, etc. | Stable MongoDB 8.0.x + mongot |
46
+ | `7.0`, `7.0.31`, etc. | Stable MongoDB 7.0.x + mongot |
47
+ | `preview` | **Pre-release channel** — currently tracks MongoDB 8.2 + mongot with auto-embedding (Voyage AI) enabled. Separate from `latest`; ~70 MB smaller per arch than `latest` as of 2026-03-20 |
48
+
49
+ The `preview` digest as of 2026-03-20: `sha256:4f4c43e8711ce31660b931bd96e76e679b311702a0cc49e03c926615aaf4c868`
50
+
51
+ The `latest` digest as of same date: `sha256:a3a49321a2be227f5de99015ac939be2c89d90725d8548c6f81147f175f70d8f` (different — they are distinct builds)
52
+
53
+ Both support `linux/amd64` and `linux/arm64`.
54
+
55
+ ---
56
+
57
+ ## 3. What the Image Bundles
58
+
59
+ - **mongod** — MongoDB Community Edition (the database engine, configured as a single-node replica set)
60
+ - **mongot** — MongoDB's internal search/vector search process (Apache Lucene-based), which handles:
61
+ - `$search` queries (full-text, fuzzy, phrase, wildcard, boolean)
62
+ - `$vectorSearch` queries (ANN, ENN)
63
+ - Atlas Search index management
64
+ - Automated embedding generation (in `preview` tag, requires Voyage AI API key)
65
+ - **Built-in health check** — the container reports `healthy` when both mongod and mongot are ready, so no custom health check is required in Docker Compose
66
+ - **Authentication support** — via `MONGODB_INITDB_ROOT_USERNAME` / `MONGODB_INITDB_ROOT_PASSWORD` environment variables
67
+ - **Data persistence** — via Docker volumes on `/data/db` and `/data/configdb`
68
+
69
+ ---
70
+
71
+ ## 4. Why This Supersedes Running mongod + mongot Separately
72
+
73
+ ### Before Atlas Local
74
+
75
+ Running Atlas Search + Vector Search locally required:
76
+ 1. Install MongoDB Community or Enterprise Edition (`mongod`)
77
+ 2. Separately download, install, and configure `mongot` (the search process)
78
+ 3. Configure `mongot` to bind to `mongod` via keyfile / keyfile path
79
+ 4. Manage startup order (mongot must start before search indexes are built)
80
+ 5. Manage both processes separately (logs, restarts, upgrades)
81
+ 6. No official Docker image bundled them together — DIY setup was complex
82
+
83
+ ### With Atlas Local
84
+
85
+ Single command replaces all of the above:
86
+ ```sh
87
+ docker run -p 27017:27017 mongodb/mongodb-atlas-local
88
+ ```
89
+
90
+ Or with Docker Compose:
91
+ ```yaml
92
+ services:
93
+ mongodb:
94
+ image: mongodb/mongodb-atlas-local
95
+ environment:
96
+ - MONGODB_INITDB_ROOT_USERNAME=user
97
+ - MONGODB_INITDB_ROOT_PASSWORD=pass
98
+ ports:
99
+ - 27017:27017
100
+ volumes:
101
+ - data:/data/db
102
+ - config:/data/configdb
103
+ volumes:
104
+ data:
105
+ config:
106
+ ```
107
+
108
+ Key advantages:
109
+ - **Single container, single pull** — one image contains everything
110
+ - **Correct startup sequencing** — the entrypoint ensures mongot starts in the right order relative to mongod; do not override the `command` in Docker Compose or it breaks this
111
+ - **Built-in health check** — poll `docker inspect .State.Health.Status` to know when to connect; no custom scripts needed
112
+ - **Parity with Atlas cloud** — the same mongot binary that runs in Atlas runs in this container, so `$search` / `$vectorSearch` index definitions, aggregation pipeline stages, and behavior match production exactly
113
+ - **CLI-managed** — the Atlas CLI (`atlas deployments setup`) uses this image under the hood; it handles the full lifecycle (create, pause, start, delete, logs)
114
+ - **Version-pinned deployments** — use `mongodb/mongodb-atlas-local:8.0` or `:7.0` to pin the MongoDB version across team environments
115
+ - **Preview channel** — `mongodb/mongodb-atlas-local:preview` gives access to in-development features (auto-embeddings) ahead of stable release
116
+
117
+ ---
118
+
119
+ ## 5. Auto-Embedding / Voyage AI Integration (Preview Feature)
120
+
121
+ ### What It Is
122
+
123
+ "Automated Embedding" is a Preview feature available in MongoDB Community Edition **v8.2 and later**, delivered via the `preview` Docker tag.
124
+
125
+ Official statement from the docs:
126
+ > "Automated embedding is available as a Preview feature only for MongoDB Community Edition v8.2 and later. The feature and the corresponding documentation might change at any time during the Preview period."
127
+
128
+ ### How It Works
129
+
130
+ When deploying `mongodb/mongodb-atlas-local:preview` (or MongoDB 8.2 with mongot started with Voyage AI API keys), you provide a Voyage AI API key at startup. mongot uses this key to:
131
+
132
+ 1. **Index-time**: automatically call the Voyage AI embedding API for every text field you designate as `autoEmbed` type in the Vector Search index definition. Embeddings are generated for existing documents and kept in sync as documents are inserted/updated.
133
+ 2. **Query-time**: automatically call the Voyage AI embedding API to embed the query text before running `$vectorSearch`. You pass a plain string via `query.text` instead of a pre-computed vector.
134
+
135
+ The generated embeddings are stored in a **separate system collection** on the same cluster (not in the user-facing document).
136
+
137
+ ### Index Definition (autoEmbed type)
138
+
139
+ ```json
140
+ {
141
+ "fields": [
142
+ {
143
+ "type": "vectorSearch",
144
+ "path": "summary",
145
+ "autoEmbed": {
146
+ "embeddingModel": "voyage-4"
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ ```
152
+
153
+ ### Query (natural language text, no pre-computed vector)
154
+
155
+ ```js
156
+ db.collection.aggregate([
157
+ {
158
+ "$vectorSearch": {
159
+ "index": "myVectorIndex",
160
+ "path": "summary",
161
+ "query": { "text": "properties near amusement parks" },
162
+ "numCandidates": 100,
163
+ "limit": 10
164
+ }
165
+ }
166
+ ])
167
+ ```
168
+
169
+ ### Supported Voyage AI Embedding Models
170
+
171
+ | Model | Use Case |
172
+ |---|---|
173
+ | `voyage-4-lite` | High-volume, cost-sensitive applications |
174
+ | `voyage-4` (recommended) | General text search, balanced performance |
175
+ | `voyage-4-large` | Maximum accuracy for complex semantic relationships |
176
+ | `voyage-code-3` | Code search and technical documentation |
177
+
178
+ ### API Key Recommendation
179
+
180
+ MongoDB recommends two separate Voyage AI API keys:
181
+ - One for **indexing operations** (higher throughput, tolerant of delays)
182
+ - One for **query operations** (low-latency, user-facing)
183
+
184
+ Keys can be generated via Atlas UI (which also provides monitoring + rate limiting UI) or directly from Voyage AI.
185
+
186
+ ### Why This Matters for ClawMongo
187
+
188
+ ClawMongo v2 currently calls the Voyage AI API externally from application code (via the `mongodb-search.ts` / hybrid pipeline). With auto-embedding in the `preview` image:
189
+ - No application code needed to call Voyage AI at index time or query time
190
+ - mongot handles embedding generation and sync automatically
191
+ - `$vectorSearch` queries can use plain text (`query.text`) instead of pre-computed vectors
192
+ - This simplifies the architecture: ClawMongo could delegate all embedding lifecycle to mongot
193
+
194
+ ---
195
+
196
+ ## 6. Key Limitations (Preview Status)
197
+
198
+ From the official auto-embedding docs (as of 2026-03-22):
199
+
200
+ 1. **Preview means unstable** — "The feature and the corresponding documentation might change at any time during the Preview period." API surface, behavior, or index definition syntax may break between preview releases.
201
+
202
+ 2. **Deployment scope** — Auto-embedding is **not yet available** for:
203
+ - Atlas clusters (cloud)
204
+ - Local Atlas deployments via the Atlas CLI (`atlas deployments setup`)
205
+ - MongoDB Enterprise Edition
206
+ - It is **only** available for MongoDB Community Edition with mongot deployed via Docker, tarball, or package manager, or via the MongoDB Controllers for Kubernetes Operator with MongoDB 8.2+.
207
+
208
+ 3. **Minimum version** — MongoDB Community Edition v8.2+ required (8.0 and 7.0 tags do not include auto-embedding support in mongot).
209
+
210
+ 4. **Cost** — Every insert/update/query triggers Voyage AI API calls billed to your Voyage AI account. Pricing is per-token.
211
+
212
+ 5. **Standard Atlas Local limitations** (not preview-specific):
213
+ - No concurrent search queries
214
+ - Max 1024 boolean clauses in a single search query
215
+ - Single-node replica set only (no sharding)
216
+ - For CLI-managed local deployments: only deployments created via `atlas deployments` CLI are manageable through it
217
+ - Tested OS: macOS 13.2+, RHEL/CentOS 8/9, Ubuntu 22.04/24.04, Debian 11/12, Amazon Linux 2023, Windows 10/11; min 2 CPU cores, 2 GB RAM
218
+
219
+ 6. **Do not override ENTRYPOINT** — The `mongodb/mongodb-atlas-local` image has a custom entrypoint that starts both mongod and mongot in the correct sequence. If you add a `command:` key in Docker Compose, it overrides the entrypoint and mongot will not start correctly. This is the #1 gotcha when migrating from `mongo:` image.
220
+
221
+ ---
222
+
223
+ ## 7. Comparison: mongod Standalone vs Atlas Local vs Preview
224
+
225
+ | Aspect | `mongo:8.0` (raw mongod) | `mongodb/mongodb-atlas-local` (stable) | `mongodb/mongodb-atlas-local:preview` |
226
+ |---|---|---|---|
227
+ | Atlas Search ($search) | No | Yes | Yes |
228
+ | Atlas Vector Search ($vectorSearch) | No | Yes | Yes |
229
+ | Auto-embeddings (Voyage AI) | No | No | Yes (Preview) |
230
+ | Built-in health check | No | Yes | Yes |
231
+ | Single container | Yes | Yes | Yes |
232
+ | Production-safe | Yes | Dev/test only | No (Preview) |
233
+ | Min MongoDB version | Any | 7.0+ | 8.2+ |
234
+
235
+ ---
236
+
237
+ ## What Changed the Recommendation
238
+
239
+ The single highest-signal finding: **auto-embedding in the `preview` tag requires MongoDB 8.2+ and is a Preview feature that is explicitly NOT available in the stable tags or via `atlas deployments setup`.** Users wanting auto-embeddings must use `mongodb/mongodb-atlas-local:preview` directly via Docker (not through the Atlas CLI `atlas deployments` command).
240
+
241
+ For ClawMongo users who want the simpler zero-embedding-code experience with Voyage AI, the `preview` tag is the only supported path today. For users who want a stable embedding pipeline, the stable `8.2` tag (without `preview`) with manually-managed Voyage AI calls in application code is the safer choice.
242
+
243
+ ---
244
+
245
+ ## Gotchas / Warnings
246
+
247
+ - **Never add `command:` to Docker Compose when using `mongodb-atlas-local`** — it overrides the entrypoint and mongot will not start. Remove any `command:` from existing Docker Compose files when migrating from `mongo:` image.
248
+ - **Preview tag is not stable** — documentation and behavior can change at any time; do not use `preview` in production.
249
+ - **`preview` and `latest` are different builds** — they have different digests and different sizes. Do not assume `preview` is ahead of `latest`; they track different feature channels.
250
+ - **MongoDB 8.2 is the minimum for auto-embeddings** — using `preview` tag with MongoDB 7.0 base image equivalent would not give auto-embedding; the `preview` tag ships with the 8.2 server.
251
+ - **Health check polling required** — wait for `docker inspect .State.Health.Status == healthy` before connecting; the container takes time for both mongod and mongot to initialize.
252
+ - **Connection string must include `directConnection=true`** — single-node replica set requires direct connection: `mongodb://localhost:27017/?directConnection=true`.
253
+ - **Voyage AI API key at startup** — for auto-embeddings, the API key must be passed to mongot at container startup time (via environment variable or config), not after the fact.
254
+ - **Token billing starts immediately** — as soon as auto-embedding is configured, every document insert/update/query incurs Voyage AI token charges.
255
+ - **Not for production workloads** — Atlas Local is a dev/test image; it is a single-node replica set with no HA, no backups, and no enterprise support.
256
+
257
+ ---
258
+
259
+ ## References
260
+
261
+ - https://hub.docker.com/r/mongodb/mongodb-atlas-local (Docker Hub — confirmed tag list via API)
262
+ - https://raw.githubusercontent.com/mongodb/docs-atlas-cli/master/source/atlas-cli-deploy-docker.txt (official Docker deployment tutorial source)
263
+ - https://raw.githubusercontent.com/mongodb/docs-atlas-cli/master/source/atlas-cli-deploy-local.txt (official local deployment tutorial source)
264
+ - https://raw.githubusercontent.com/mongodb/docs-atlas-cli/master/source/atlas-cli-deploy-pvt-registry.txt (private registry / tag info)
265
+ - https://www.mongodb.com/docs/atlas/atlas-vector-search/crud-embeddings/create-embeddings-automatic/ (auto-embedding feature documentation — key source)
266
+ - https://www.mongodb.com/docs/atlas/atlas-vector-search/deployment-options/ (deployment option recommendations)
267
+
268
+ ---
269
+
270
+ Web research complete.
@@ -252,7 +252,7 @@ ClawMongo falls back to BSON `$text` indexes when mongot is unavailable, but vec
252
252
 
253
253
  ### Voyage AI embedding errors
254
254
 
255
- Verify your Voyage AI API key is correctly configured in mongot. Test embedding generation:
255
+ Verify the `VOYAGE_API_KEY` environment variable is set on the atlas-local container. Test embedding generation:
256
256
 
257
257
  ```bash
258
258
  curl -X POST "https://api.voyageai.com/v1/embeddings" \
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@romiluz/clawmongo",
3
- "version": "2026.3.25",
3
+ "version": "2026.3.27",
4
4
  "description": "OpenClaw, but it remembers. Full AI assistant (22 channels, 78 extensions, voice, apps) with MongoDB memory - vector search, knowledge graph, event-sourcing, KB, and 8 retrieval paths. Nothing is ever lost.",
5
5
  "keywords": [
6
6
  "agent-memory",