memtrails 0.4.2 → 0.4.3

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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@ versions follow [Semantic Versioning](https://semver.org/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.4.3] — 2026-11-05
9
+
10
+ - Fixes: the first start no longer fails with "Qdrant exited (101) while starting" where the system has no CA
11
+ certificates, as in the official slim Node image. Qdrant will not start without them, though it makes no outside
12
+ call here: it now gets the host's `SSL_CERT_FILE`, or the certificates the library carries. All three languages.
13
+
8
14
  ## [0.4.2] — 2026-11-05
9
15
 
10
16
  - Fixes: the first start no longer fails when run as root (as in most containers) with "is not this user's alone":
@@ -4,6 +4,7 @@ import { chmodSync, closeSync, mkdirSync, openSync, readFileSync, renameSync, rm
4
4
  import { createServer } from 'node:net';
5
5
  import { uptime } from 'node:os';
6
6
  import { join, resolve } from 'node:path';
7
+ import { rootCertificates } from 'node:tls';
7
8
  /** A port the OS says is free on loopback. */
8
9
  async function freePort() {
9
10
  return new Promise((resolve, reject) => {
@@ -95,13 +96,15 @@ function commandOf(pid) {
95
96
  }
96
97
  }
97
98
  /** What Qdrant gets of the environment: what a process needs to run and the key. None of the host's secrets, and none
98
- * of its QDRANT__* variables — they override the config (QDRANT__SERVICE__HOST=0.0.0.0 would open it to the network). */
99
- function childEnv(apiKey) {
99
+ * of its QDRANT__* variables — they override the config (QDRANT__SERVICE__HOST=0.0.0.0 would open it to the network).
100
+ * Qdrant does not start without CA certificates, though it makes no outside call here, and a slim container has none:
101
+ * it gets the host's SSL_CERT_FILE, or `caFile`. */
102
+ function childEnv(apiKey, caFile) {
100
103
  const env = {};
101
104
  for (const k of ['PATH', 'HOME', 'TMPDIR', 'TEMP', 'TMP', 'SystemRoot', 'USERPROFILE'])
102
105
  if (process.env[k] !== undefined)
103
106
  env[k] = process.env[k];
104
- return { ...env, QDRANT__SERVICE__API_KEY: apiKey, QDRANT__TELEMETRY_DISABLED: 'true' };
107
+ return { ...env, SSL_CERT_FILE: process.env.SSL_CERT_FILE || caFile, QDRANT__SERVICE__API_KEY: apiKey, QDRANT__TELEMETRY_DISABLED: 'true' };
105
108
  }
106
109
  /** Every Qdrant this process started and has not seen exit: stopped when the host exits without `close()` (an 'exit'
107
110
  * handler can only send the signal; a host killed outright leaves its Qdrant to the next start's reapLeftover). */
@@ -156,13 +159,15 @@ export class QdrantProcess {
156
159
  const apiKey = randomBytes(24).toString('hex');
157
160
  const config = join(this.opts.dir, 'config.yaml');
158
161
  writeFileSync(config, qdrantConfig(this.opts.dir, port), { mode: 0o600 });
162
+ const caFile = join(this.opts.dir, 'ca.pem');
163
+ writeFileSync(caFile, `${rootCertificates.join('\n')}\n`, { mode: 0o600 }); // the ones Node carries
159
164
  const fd = openLog(this.opts.dir);
160
165
  let child;
161
166
  try {
162
167
  child = spawn(this.opts.binary, ['--config-path', config, '--disable-telemetry'], {
163
168
  cwd: this.opts.dir,
164
169
  stdio: ['ignore', fd, fd],
165
- env: childEnv(apiKey),
170
+ env: childEnv(apiKey, caFile),
166
171
  });
167
172
  }
168
173
  finally {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memtrails",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Retrieval and exploration for any text — e-mail, chat, notes, documents, news, commits, conversations. Searchable at once, on your own machine, in any language; optional consolidation into typed knowledge with a language model.",
5
5
  "keywords": [
6
6
  "retrieval",