@cerefox/memory 1.17.3 → 1.18.0

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.
@@ -15,7 +15,7 @@
15
15
  href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&display=swap"
16
16
  />
17
17
  <title>Cerefox</title>
18
- <script type="module" crossorigin src="/app/assets/index-D7YyXio_.js"></script>
18
+ <script type="module" crossorigin src="/app/assets/index-CxMT7hjH.js"></script>
19
19
  <link rel="stylesheet" crossorigin href="/app/assets/index-B0H_N4if.css">
20
20
  </head>
21
21
  <body>
@@ -18,7 +18,7 @@
18
18
  * doesn't touch `supabase/functions/` leaves it alone).
19
19
  */
20
20
 
21
- export const EF_VERSION = "1.17.3";
21
+ export const EF_VERSION = "1.18.0";
22
22
 
23
23
  /**
24
24
  * The Cerefox RELEASE version — what `cerefox --version` reports and what npm
@@ -36,7 +36,7 @@ export const EF_VERSION = "1.17.3";
36
36
  * is imported by the Deno Edge Functions, which cannot reach into the npm
37
37
  * package.
38
38
  */
39
- export const CEREFOX_VERSION = "1.17.3";
39
+ export const CEREFOX_VERSION = "1.18.0";
40
40
 
41
41
  /**
42
42
  * The most recent version whose EF-side SOURCE actually changed (#127).
@@ -2,7 +2,7 @@
2
2
  --
3
3
  -- Records how each chunk's content reconstructs into full document text:
4
4
  -- 1 = legacy — chunk contents were trimmed sections; reconstruction re-joins
5
- -- them with E'\n\n' (the pre-28D behaviour). All existing chunks.
5
+ -- them with E'\n\n' (the pre-28D behavior). All existing chunks.
6
6
  -- 2 = blind-stitch — chunk contents are an exact, gapless partition of the
7
7
  -- document; reconstruction is a plain concatenation (no separator
8
8
  -- synthesized on read). Written by the exact-partition chunker.
@@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS cerefox_document_relations (
12
12
  source_id UUID NOT NULL REFERENCES cerefox_documents(id) ON DELETE CASCADE,
13
13
  target_id UUID NOT NULL REFERENCES cerefox_documents(id) ON DELETE CASCADE,
14
14
  -- Free-text by design: agents define new types without a migration. The
15
- -- type dictionary (in the RPCs) gives known types behaviour; unknown types
15
+ -- type dictionary (in the RPCs) gives known types behavior; unknown types
16
16
  -- are stored and returned, just without special handling.
17
17
  rel_type TEXT NOT NULL,
18
18
  metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
@@ -55,5 +55,5 @@ BEGIN
55
55
  'Migration 0020: cerefox_ingest_document now preserves a document''s '
56
56
  'source when p_source is omitted. Before this, any content update '
57
57
  'without an explicit source silently rewrote provenance to ''agent'', '
58
- 'and migrate-format relabelled every document it converted (#191).';
58
+ 'and migrate-format relabeled every document it converted (#191).';
59
59
  END $$;
@@ -26,7 +26,7 @@
26
26
 
27
27
  ALTER TABLE cerefox_document_relations ENABLE ROW LEVEL SECURITY;
28
28
 
29
- -- Defence in depth: revoke the legacy blanket grants so the table is denied by
29
+ -- Defense in depth: revoke the legacy blanket grants so the table is denied by
30
30
  -- privilege as well as by RLS. Harmless where the grants were never made.
31
31
  REVOKE ALL ON TABLE cerefox_document_relations FROM anon;
32
32
 
@@ -32,7 +32,7 @@ BEGIN
32
32
 
33
33
  GRANT USAGE ON SCHEMA public TO service_role;
34
34
 
35
- -- Derived from the catalogue, not from a list someone has to remember.
35
+ -- Derived from the catalog, not from a list someone has to remember.
36
36
  FOR t IN
37
37
  SELECT c.relname
38
38
  FROM pg_class c
@@ -0,0 +1,22 @@
1
+ -- 0034_drop_vector_indexes.sql — drop the unused HNSW vector indexes (schema
2
+ -- 0.19.0, release 1.18.0).
3
+ --
4
+ -- Since 0.18.1 the hybrid search RPCs rank vector candidates by an exact scan
5
+ -- (`ORDER BY vec_score DESC`, see cerefox_hybrid_search in rpcs.sql), because
6
+ -- the HNSW index answered the bare-distance ordering with at most
7
+ -- `hnsw.ef_search` (40) rows, and on a store with heavy version churn those
8
+ -- were mostly not the nearest ones. The two indexes have served no query since,
9
+ -- while every chunk write still paid to maintain them and their quality kept
10
+ -- degrading.
11
+ --
12
+ -- The exact scan is fast at knowledge-base scale: measured on a 1-CPU / 1 GB
13
+ -- Postgres with 768-dim vectors, top-500 candidates took 2 ms at 2k chunks,
14
+ -- 56 ms at 50k and 181 ms at 100k. A default-configured HNSW index was slower
15
+ -- than that from 50k chunks and recalled 27% of the true top-250 at 100k.
16
+ -- `cerefox doctor` reports the current chunk count and warns past 100k; a
17
+ -- tuned index path for stores that large is tracked separately.
18
+ --
19
+ -- Idempotent: safe to re-run.
20
+
21
+ DROP INDEX IF EXISTS idx_cerefox_chunks_emb_primary;
22
+ DROP INDEX IF EXISTS idx_cerefox_chunks_emb_upgrade;
@@ -236,7 +236,7 @@ BEGIN
236
236
  fts_results AS (
237
237
  SELECT
238
238
  c.id,
239
- -- 0.18.0: normalisation 32 bounds the keyword score to
239
+ -- 0.18.0: normalization 32 bounds the keyword score to
240
240
  -- rank/(rank+1), in [0, 1) like the cosine it is fused with.
241
241
  -- Unbounded (up to ~4 when every term matches), one keyword
242
242
  -- hit outweighed any semantic evidence, and the same document
@@ -305,7 +305,8 @@ BEGIN
305
305
  -- hnsw.ef_search (40) rows: on a store with heavy version churn it
306
306
  -- returned far fewer candidates than asked for, mostly not the
307
307
  -- nearest ones. An exact scan is also faster at knowledge-base
308
- -- scale (thousands of chunks).
308
+ -- scale (thousands of chunks). 0.19.0 dropped the HNSW indexes
309
+ -- altogether (migration 0034).
309
310
  ORDER BY vec_score DESC
310
311
  LIMIT candidate_count
311
312
  ),
@@ -2005,7 +2006,7 @@ AS $$
2005
2006
  -- would share a timestamp and the order of operations inside the batch
2006
2007
  -- would be unrecoverable from the trail (iter-33). clock_timestamp()
2007
2008
  -- advances within a transaction, so entries stay orderable. Outside a
2008
- -- batch this is indistinguishable from the old behaviour.
2009
+ -- batch this is indistinguishable from the old behavior.
2009
2010
  clock_timestamp()
2010
2011
  )
2011
2012
  RETURNING id AS audit_id, cerefox_audit_log.created_at;
@@ -2516,7 +2517,7 @@ $$;
2516
2517
  -- docs/research/document-relations-and-semantic-graph.md
2517
2518
  --
2518
2519
  -- Type dictionary: rel_type is free text (any string is accepted and returned),
2519
- -- but a few KNOWN types carry behaviour. Keeping the dictionary in one place
2520
+ -- but a few KNOWN types carry behavior. Keeping the dictionary in one place
2520
2521
  -- here — rather than scattered CASE expressions — is what lets the set/delete
2521
2522
  -- RPCs stay symmetric with each other.
2522
2523
  -- symmetric both directions are written/removed together
@@ -3235,6 +3236,8 @@ SET search_path = public, pg_catalog
3235
3236
  AS $$
3236
3237
  -- Keep in lockstep with the `@version:` marker in schema.sql (cut_release.ts
3237
3238
  -- enforces it). Bump whenever schema.sql OR rpcs.sql changes.
3239
+ -- 0.19.0: migration 0034 drops the unused HNSW vector indexes (search has
3240
+ -- scanned exactly since 0.18.1). No RPC behavior change.
3238
3241
  -- 0.18.2: min_term_coverage built-in default 0.66 (two of three terms).
3239
3242
  -- 0.18.0's 0.67 required all three for a three-term query. RPC-only.
3240
3243
  -- 0.18.1: exact vector candidates. Hybrid and semantic search ordered by
@@ -3243,7 +3246,7 @@ AS $$
3243
3246
  -- they now order by the computed similarity (exact scan). Keyword matches
3244
3247
  -- carry their exact cosine into fusion. RPC-only.
3245
3248
  -- 0.18.0 (iteration 48): search calibration, RPC-only. Bounded keyword
3246
- -- score in hybrid fusion (ts_rank_cd normalisation 32); min_term_coverage
3249
+ -- score in hybrid fusion (ts_rank_cd normalization 32); min_term_coverage
3247
3250
  -- default 0.67; built-in min_search_score follows the store's embedder
3248
3251
  -- (new cerefox_default_min_search_score). docs/specs/search-calibration.md.
3249
3252
  -- 0.17.0 (#251): trash auto-purge. New cerefox_purge_expired_trash, called
@@ -3287,7 +3290,7 @@ AS $$
3287
3290
  -- 0.11.0 supersedes 0.10.6 (v1.2.1, #191): this branch carries that fix plus
3288
3291
  -- the partial-edit surface, and both migrations (0019, 0020) are in the
3289
3292
  -- sequence, so a store deploying this gets everything from both lines.
3290
- SELECT '0.18.2'::TEXT;
3293
+ SELECT '0.19.0'::TEXT;
3291
3294
  $$;
3292
3295
 
3293
3296
  -- ── cerefox_find_dead_links ──────────────────────────────────────────────────
@@ -5,7 +5,7 @@
5
5
  -- Requires extensions: vector (pgvector), uuid-ossp
6
6
  -- These are enabled at the top of db_deploy.py before this file is applied.
7
7
  --
8
- -- @version: 0.18.2
8
+ -- @version: 0.19.0
9
9
  -- The `@version` marker above is read by the schema-version-mismatch banner
10
10
  -- (see /api/v1/schema-version). Bump it whenever schema.sql OR rpcs.sql
11
11
  -- changes in a way that requires `cerefox server deploy` to be re-run —
@@ -166,7 +166,7 @@ CREATE TABLE IF NOT EXISTS cerefox_document_projects (
166
166
  -- ── Document relations (iteration 29) ─────────────────────────────────────────
167
167
  -- Typed, directed edges between documents. rel_type is free text by design so
168
168
  -- agents can define new types without a migration; the type dictionary lives in
169
- -- the RPCs and gives KNOWN types behaviour (symmetry, lifecycle side effects).
169
+ -- the RPCs and gives KNOWN types behavior (symmetry, lifecycle side effects).
170
170
  -- Design: docs/research/document-relations-and-semantic-graph.md §2.2.
171
171
 
172
172
  CREATE TABLE IF NOT EXISTS cerefox_document_relations (
@@ -267,17 +267,11 @@ CREATE INDEX IF NOT EXISTS idx_cerefox_chunks_fts
267
267
  ON cerefox_chunks USING GIN(fts)
268
268
  WHERE version_id IS NULL;
269
269
 
270
- -- Vector similarity — primary embedding, current chunks only
271
- CREATE INDEX IF NOT EXISTS idx_cerefox_chunks_emb_primary
272
- ON cerefox_chunks USING hnsw (embedding_primary vector_cosine_ops)
273
- WITH (m = 16, ef_construction = 64)
274
- WHERE version_id IS NULL;
275
-
276
- -- Vector similarity — upgrade embedding, current chunks only
277
- CREATE INDEX IF NOT EXISTS idx_cerefox_chunks_emb_upgrade
278
- ON cerefox_chunks USING hnsw (embedding_upgrade vector_cosine_ops)
279
- WITH (m = 16, ef_construction = 64)
280
- WHERE version_id IS NULL;
270
+ -- Vector similarity: deliberately NO index (0.19.0, migration 0034). Search
271
+ -- ranks vector candidates by an exact scan, which is both correct and fast at
272
+ -- knowledge-base scale; the HNSW indexes it replaced returned too few, mostly
273
+ -- wrong candidates on stores with version churn. Do not add one back without
274
+ -- the measurements in docs/specs/search-calibration.md (scale section).
281
275
 
282
276
  -- Partial unique index: enforces (document_id, chunk_index) uniqueness for
283
277
  -- current chunks. Archived chunks are excluded and may share chunk_index values
@@ -408,7 +402,7 @@ ON CONFLICT (key) DO NOTHING;
408
402
  -- The review workflow (agent writes land pending_review, a person approves)
409
403
  -- is OFF on a fresh install (#241): most stores have no reviewer, and a queue
410
404
  -- nobody drains is noise. Migration 0031 seeds TRUE on stores that predate the
411
- -- flag, so an upgrade never changes behaviour. Only this seed and that
405
+ -- flag, so an upgrade never changes behavior. Only this seed and that
412
406
  -- migration ever write the value; the toggle itself is `cerefox config set`.
413
407
  INSERT INTO cerefox_config (key, value)
414
408
  VALUES ('review_workflow_enabled', 'false')
@@ -491,7 +485,7 @@ ALTER TABLE cerefox_document_relations ENABLE ROW LEVEL SECURITY;
491
485
  -- Guarded: on the local (World B) stack this file deploys BEFORE roles.sql
492
486
  -- creates service_role, so missing-role must be a no-op (roles.sql re-runs the
493
487
  -- grants implicitly via its own PostgREST wiring; the next deploy picks them up).
494
- -- DERIVED from the catalogue, never listed. The list used to be a hand-written
488
+ -- DERIVED from the catalog, never listed. The list used to be a hand-written
495
489
  -- ARRAY and it drifted: cerefox_document_relations was added above and never
496
490
  -- added to the array, so a FRESH cloud deploy left that table with no Data API
497
491
  -- grant. Upgrades hid it (migration 0014 grants it inline) and the self-hosted
@@ -5731,7 +5731,7 @@
5731
5731
  },
5732
5732
  "/api/v1/version": {
5733
5733
  "get": {
5734
- "summary": "Server version and environment label.",
5734
+ "summary": "Server version, environment label, and the newest release on npm as the server last checked it (`latest`, plus `update_command` when it is newer).",
5735
5735
  "operationId": "get_version",
5736
5736
  "responses": {
5737
5737
  "200": {
@@ -5761,13 +5761,27 @@
5761
5761
  "string",
5762
5762
  "null"
5763
5763
  ]
5764
+ },
5765
+ "latest": {
5766
+ "type": [
5767
+ "string",
5768
+ "null"
5769
+ ]
5770
+ },
5771
+ "update_command": {
5772
+ "type": [
5773
+ "string",
5774
+ "null"
5775
+ ]
5764
5776
  }
5765
5777
  },
5766
5778
  "required": [
5767
5779
  "version",
5768
5780
  "git_commit_short",
5769
5781
  "build_date",
5770
- "env_label"
5782
+ "env_label",
5783
+ "latest",
5784
+ "update_command"
5771
5785
  ],
5772
5786
  "additionalProperties": false
5773
5787
  }
@@ -60,8 +60,12 @@ Postgres RPCs
60
60
  ```
61
61
 
62
62
  **ChatGPT Custom GPT Actions** call the eight primitive Edge Functions directly over HTTPS
63
- using an OpenAPI schema. `cerefox-mcp` is not involved (ChatGPT does not support the
64
- Streamable HTTP MCP protocol).
63
+ using an OpenAPI schema. `cerefox-mcp` is not involved. OpenAI retires Custom GPTs on **December 11, 2026**, and custom actions do not carry over to its plugins, so this path ends
64
+ then. ChatGPT now supports remote MCP connectors (OAuth or no auth, no static bearer
65
+ token), so its replacement is expected to be a connector to `cerefox-mcp` over OAuth,
66
+ like cloud Claude; see
67
+ [`chatgpt-after-custom-gpts.md`](../research/chatgpt-after-custom-gpts.md) and
68
+ [#326](https://github.com/fstamatelopoulos/cerefox/issues/326).
65
69
 
66
70
  **curl / scripts / custom HTTP clients** can also call the primitives directly using the
67
71
  same Cerefox token as a Bearer token.
@@ -213,7 +217,7 @@ single container with an internally-held token.
213
217
  | Claude Code / Cursor | HTTPS → `cerefox-mcp` | Cerefox access token (`cfx_pat_…`) | Advanced/fallback; prefer local MCP for daily use |
214
218
  | Claude Desktop | HTTPS → `cerefox-mcp` (via `supergateway`) | Cerefox access token (`cfx_pat_…`) | Advanced/fallback; prefer local MCP for daily use |
215
219
  | **Cloud Claude (claude.ai web + mobile)** | HTTPS → `cerefox-mcp` over **OAuth 2.1** | Owner-pinned OAuth access token (JWKS-verified) | Optional; memory in the browser + on the phone |
216
- | ChatGPT Custom GPT | HTTPS → primitive Edge Functions | Cerefox access token (`cfx_pat_…`) | AI assistant via GPT Actions |
220
+ | ChatGPT Custom GPT | HTTPS → primitive Edge Functions | Cerefox access token (`cfx_pat_…`) | AI assistant via GPT Actions; **ends 2026-12-11** (Custom GPTs retire) |
217
221
  | curl / HTTP scripts | HTTPS → primitive Edge Functions | Cerefox access token (`cfx_pat_…`) | Ad-hoc queries, automation |
218
222
  | Web UI (`cerefox web`) | Supabase REST API | Secret key (or legacy service_role) | Web UI backend (TS Hono) |
219
223
  | **HTTP client → `/api/v1`** | Plain HTTP to `cerefox web` / Cerefox Local | **None from loopback; API key otherwise** (v1.12.0) — `cerefox api-key generate` / `cerefox-local api-key` | A local program or bot harness that wants HTTP rather than MCP. Names itself with `X-Cerefox-Author` / `X-Cerefox-Requestor` (v1.11.0): a declared label for attribution, not a verified identity. See [`api.md`](api.md) |
@@ -179,7 +179,7 @@ default; Cerefox Local picks its own port and `cerefox-local status` prints it).
179
179
 
180
180
  | Method + path | Purpose |
181
181
  |---|---|
182
- | `GET /version` | Server version and environment label. |
182
+ | `GET /version` | Server version, environment label, and the newest release on npm as the server last checked it (`latest`, plus `update_command` when it is newer). |
183
183
  | `GET /schema-version` | Deployed schema version. |
184
184
  | `GET /openapi.json` | This API's OpenAPI 3.1 description, served by the version you are talking to. Every `/api/v1` response points at it with `Link: </api/v1/openapi.json>; rel="service-desc"` (RFC 8631). |
185
185
  | `GET /search?q=…` | Hybrid search (FTS + semantic). `&review_status=approved\|pending_review` filters server-side; `400` while the review workflow is off. The response's `embedder` (`openai` or `local`) says which scale the scores are on. |
@@ -773,11 +773,11 @@ These flat commands handle install, configuration, and health. Run any with `--h
773
773
  | Command | Purpose |
774
774
  |---|---|
775
775
  | `cerefox init` | Interactive first-run setup; writes `~/.cerefox/.env`, offers `server deploy` + self-docs ingest. |
776
- | `cerefox doctor` | Diagnose the install (credentials, DB reachability, schema version, whether the review workflow is on). |
776
+ | `cerefox doctor` | Diagnose the install (credentials, DB reachability, schema version, whether the review workflow is on, whether a newer release is out). |
777
777
  | `cerefox status` | Show connection + schema status. |
778
778
  | `cerefox configure-agent --tool <client>` | Write MCP client config (`claude-code`, `claude-desktop`, `cursor`, `codex`, `gemini`). |
779
779
  | `cerefox token generate` / `rotate` / `list` | Manage the Cerefox access token (`cfx_pat_…`) — the Edge Function Bearer credential (remote MCP, GPT Actions, curl). See the [`cerefox token`](#cerefox-token-generate--cerefox-token-rotate--cerefox-token-list) section above. |
780
- | `cerefox self-update` | Update the installed `@cerefox/memory` package. |
780
+ | `cerefox self-update` | Update the installed `@cerefox/memory` package. Other commands print a one-line notice when a newer release is out; see [configuration.md → Update check](configuration.md#update-check) to turn it off. |
781
781
  | `cerefox completion` | Emit a shell completion script. |
782
782
  | `cerefox backup create` / `cerefox backup restore` | File-system backup / restore of the knowledge base (see [`ops-scripts.md`](ops-scripts.md)). |
783
783
 
@@ -344,6 +344,27 @@ there matters.
344
344
 
345
345
  ---
346
346
 
347
+ ## Update check
348
+
349
+ Cerefox tells you when a newer release is on npm (v1.18.0, #323): one line after
350
+ a CLI command (at most once a day, only at a terminal), an `updates` row in
351
+ `cerefox doctor`, and a note in the web UI footer. Inside the Cerefox Local
352
+ container it points at `cerefox-local upgrade` instead of `cerefox self-update`.
353
+
354
+ The only network call is a GET of the `latest` release from the npm registry
355
+ (`registry.npmjs.org`), the same request `cerefox self-update` makes. It is made
356
+ by `cerefox web` (at startup, then daily), `cerefox mcp` (at startup, when the
357
+ last answer is over a day old), `cerefox doctor` and `cerefox self-update`.
358
+ Every other command only reads the saved answer, `update-check.json` in
359
+ `~/.cerefox` (or in `CEREFOX_CONFIG_DIR`, when set), so it never adds latency.
360
+ Offline, the check stays quiet.
361
+
362
+ | Variable | Default | Description |
363
+ |----------|---------|-------------|
364
+ | `CEREFOX_NO_UPDATE_CHECK` | _(unset)_ | Set to `1` to turn the check off entirely: no request to npm, and no notice anywhere. `NO_UPDATE_NOTIFIER` (the convention other CLIs use) and `CI` do the same. |
365
+
366
+ ---
367
+
347
368
  ## Logging
348
369
 
349
370
  | Variable | Default | Description |
@@ -422,7 +443,7 @@ cerefox server deploy --functions-only
422
443
 
423
444
  Contributors with a repo clone can instead redeploy individual functions with `npx supabase functions deploy cerefox-search` (and `cerefox-ingest`), or through the Supabase Dashboard → Edge Functions → Deploy.
424
445
 
425
- > **If you only use the local MCP server** (Claude Desktop, ChatGPT Desktop, Cursor), Step 3 is
446
+ > **If you only use the local MCP server** (Claude Code, Claude Desktop, Codex, Cursor), Step 3 is
426
447
  > optional — the Edge Functions are only used for GPT Actions and direct HTTP access.
427
448
 
428
449
  > **Future improvement**: the Edge Functions will be updated to read model config from Supabase
@@ -24,7 +24,7 @@ client; you can also run both in parallel.
24
24
  Three top-level paths plus a few special cases:
25
25
 
26
26
  - **Path A** — MCP server (local subprocess or remote Edge Function). Best for purpose-built agent clients like Claude Desktop, Cursor, and Claude Code's MCP integration.
27
- - **Path B** — direct Edge Function HTTP. Best for ChatGPT Custom GPTs and any HTTP caller (curl, scripts).
27
+ - **Path B** — direct Edge Function HTTP. For any HTTP caller (curl, scripts), and for ChatGPT Custom GPTs until OpenAI retires them on December 11, 2026.
28
28
  - **Path C** — local shell CLI invoked by a coding agent's Bash tool. Best for Claude Code, Codex CLI, opencode, OpenClaw, Hermes, and similar local-agent CLIs **when the user prefers not to configure MCP** but still wants the agent to read and write Cerefox.
29
29
 
30
30
  | Client | Path | Search | Requirements / caveats |
@@ -33,7 +33,8 @@ Three top-level paths plus a few special cases:
33
33
  | Claude Code (remote) | Path A-Remote — `cerefox-mcp` Edge Function | Hybrid | URL + Cerefox token only; no local install. Advanced/fallback — prefer Path A-Local |
34
34
  | Cursor (remote) | Path A-Remote — `cerefox-mcp` Edge Function | Hybrid | URL + Cerefox token only; no local install. Advanced/fallback — prefer Path A-Local |
35
35
  | OpenAI Codex CLI (remote) | Path A-Remote — `cerefox-mcp` Edge Function | Hybrid | URL + Cerefox token env var; TOML config. Advanced/fallback — prefer Path A-Local |
36
- | ChatGPT (chatgpt.com or desktop) | Path B — Custom GPT → Edge Functions | Hybrid | ChatGPT Plus required |
36
+ | ChatGPT (chatgpt.com or desktop) | Path B — Custom GPT → Edge Functions | Hybrid | ChatGPT Plus required. **Ends 2026-12-11** when Custom GPTs retire; see [ChatGPT Custom GPT](#chatgpt-custom-gpt-cloud--chatgptcom) |
37
+ | OpenAI Codex (CLI, and Codex threads in the ChatGPT desktop app) (local) | Path A-Local — `cerefox configure-agent --tool codex` | Hybrid | Writes `~/.codex/config.toml`; all 15 tools; zero Edge Function invocations. **Recommended for Codex** |
37
38
  | Claude Desktop (local) | Path A-Local — `@cerefox/memory` via `npx` | Hybrid | Local alternative; Node.js; zero Edge Function invocations |
38
39
  | Claude Code (local) | Path A-Local — `@cerefox/memory` via `npx` | Hybrid | Local alternative; zero Edge Function invocations |
39
40
  | Cursor (local) | Path A-Local — `@cerefox/memory` via `npx` | Hybrid | Local alternative; zero Edge Function invocations |
@@ -50,7 +51,8 @@ Three top-level paths plus a few special cases:
50
51
  > over the standard tool surface — no Cloud Run needed. Setup:
51
52
  > [setup-supabase Step 7](setup-supabase.md#step-7--oauth-for-cloud-agents-claudeai--mobile-optional)
52
53
  > + [Cloud Claude](#cloud-claude-claudeai-web--mobile-oauth) below. (An OAuth connector for
53
- > ChatGPT becomes possible on the same server but is not yet documented.)
54
+ > ChatGPT is expected to replace the Custom GPT path when Custom GPTs retire; it is being
55
+ > validated in [#326](https://github.com/fstamatelopoulos/cerefox/issues/326).)
54
56
 
55
57
  > **Perplexity** supports stdio-only MCP on macOS Desktop (via Helper App). Remote MCP is
56
58
  > "coming soon." Perplexity's CTO has signaled a strategic shift away from MCP (March 2026),
@@ -265,15 +267,26 @@ For the manual JSON (for the curious, or to debug if the CLI can't write your co
265
267
 
266
268
  ---
267
269
 
268
- ### ChatGPT Desktop
270
+ ### ChatGPT Desktop and Codex
269
271
 
270
- > **ChatGPT Desktop does not support local stdio MCP servers.**
271
- > OpenAI's MCP implementation for ChatGPT only supports remote servers via SSE or
272
- > streaming HTTP — not local subprocess (stdio) servers like `cerefox mcp`.
273
- > The "dev mode" MCP connector visible in the app also requires a public URL.
274
- >
275
- > **Use Path B (Custom GPT + Edge Functions) for all ChatGPT access** — both the web
276
- > app and the desktop app. The Custom GPT approach is fully validated and works well.
272
+ The ChatGPT desktop app hosts two different things, and they connect differently:
273
+
274
+ - **Codex threads** (and the Codex CLI) run local stdio MCP servers. Set them up with
275
+ `cerefox configure-agent --tool codex`, which writes the `cerefox` entry into
276
+ `~/.codex/config.toml`; the app's **Plugins → MCPs** screen edits the same entry. Start
277
+ a new Codex session after changing it (it reads the config at session start), then ask
278
+ it to call `cerefox_get_help`: the reply begins with the server version. All 15 tools
279
+ are available.
280
+ - **Regular ChatGPT chats** do not get local MCP servers, in the desktop app or anywhere
281
+ else. ChatGPT only connects to **remote** MCP servers (OAuth or no auth). Today ChatGPT
282
+ chats reach Cerefox through the [Custom GPT](#chatgpt-custom-gpt-cloud--chatgptcom)
283
+ path, which ends on December 11, 2026; see the notice there.
284
+
285
+ > **Tip**: `configure-agent` writes the `npx` form, which runs whatever version npx has
286
+ > cached. To keep Codex on the same version as your installed CLI (and start faster),
287
+ > point the entry at the binary instead: `command = "<path to cerefox>"`, `args = ["mcp"]`
288
+ > (`which cerefox` prints the path; use the full path, since GUI apps may not see your
289
+ > shell's `PATH`).
277
290
 
278
291
  ---
279
292
 
@@ -593,6 +606,8 @@ You have access to a personal knowledge base via the searchKnowledgeBase action.
593
606
  When the user asks a question, always search the knowledge base first using a
594
607
  relevant query. Present results by document title, citing the source for every claim.
595
608
  Use ingestNote to save any new information the user asks you to remember.
609
+ Pass author: "ChatGPT" on every action call, so your reads and writes are
610
+ attributed in the audit and usage logs.
596
611
  When UPDATING an existing document, first call getDocument and note its
597
612
  content_hash, then pass it as expected_content_hash on ingestNote. If you get a
598
613
  409 conflict, the document changed underneath you: call getDocument again, merge
@@ -620,6 +635,14 @@ Expected: JSON response with `results` array containing documents.
620
635
 
621
636
  ### ChatGPT Custom GPT (cloud — chatgpt.com)
622
637
 
638
+ > **Retiring on December 11, 2026.** OpenAI is retiring Custom GPTs in favor of plugins,
639
+ > and **custom actions do not carry over**: they have to be rebuilt as a connector or a
640
+ > custom MCP server. This section works until then, but do not build a new setup on it.
641
+ > ChatGPT will need a new connection, an MCP connector to `cerefox-mcp` over OAuth (the
642
+ > way [cloud Claude](#cloud-claude-claudeai-web--mobile-oauth) connects), which is being
643
+ > validated in [#326](https://github.com/fstamatelopoulos/cerefox/issues/326). Background and plan: [`chatgpt-after-custom-gpts.md`](../research/chatgpt-after-custom-gpts.md).
644
+ > For **Codex**, use the local MCP instead (see [ChatGPT Desktop and Codex](#chatgpt-desktop-and-codex)).
645
+
623
646
  A Custom GPT with Actions pointing at the Edge Functions gives ChatGPT full hybrid search from
624
647
  any browser — no local install, no MCP client, works free with ChatGPT Plus.
625
648
 
@@ -1084,15 +1107,16 @@ paths:
1084
1107
  In the action's **Authentication** settings:
1085
1108
  - Type: **API Key**
1086
1109
  - Auth type: **Bearer**
1087
- - API key: your **Cerefox access token** (`cfx_pat_…`). Generate it with
1088
- `cerefox token generate` (it prints the token once and sets it on Supabase).
1110
+ - API key: your **Cerefox access token** (`cfx_pat_…`). If you already have one
1111
+ (`cerefox token list` shows it; the value is `CEREFOX_ACCESS_TOKEN` in your `.env`),
1112
+ reuse it. Only on a first setup run `cerefox token generate`: it **replaces** the
1113
+ server's token, which breaks every client still using the old one. To add a second
1114
+ token alongside the first, use `cerefox token rotate`.
1089
1115
  The legacy Supabase anon key is no longer accepted (iter-28E).
1090
1116
 
1091
- > **Important:** ChatGPT resets the stored API key when you update the action
1092
- > schema. This release bumps the schema `info.version`, so on your next schema
1093
- > paste ChatGPT will clear the key — re-enter your **Cerefox access token** in the
1094
- > authentication settings. (That reset is expected here: it's what swaps you off
1095
- > the old anon key.)
1117
+ > **Important:** ChatGPT clears the stored API key whenever you save a changed action
1118
+ > schema. After pasting a new schema version, re-enter your **Cerefox access token** in
1119
+ > the authentication settings.
1096
1120
 
1097
1121
  **Step 4 — Save and test**
1098
1122
 
@@ -83,7 +83,8 @@ in place, so re-run it after upgrading. Detailed walkthrough:
83
83
  ## 3b. Generate the Edge Function access token
84
84
 
85
85
  The Edge Functions authenticate callers with a **Cerefox access token**. You need it
86
- if you'll connect a **Custom GPT** (GPT Actions) or a **remote HTTP MCP** client, and
86
+ if you'll connect a **Custom GPT** (GPT Actions, until OpenAI retires Custom GPTs on
87
+ December 11, 2026) or a **remote HTTP MCP** client, and
87
88
  for a fully-green `cerefox doctor`. The **local MCP** (local agents), **cloud Claude**
88
89
  (OAuth), and the CLI/web reach Supabase over the Data API and don't use it — so this
89
90
  step is optional if that's your whole setup, but it's quick and harmless to run:
@@ -147,8 +148,11 @@ clone the repo, run `bun install`, and use the contributor scripts
147
148
  - **Search from the CLI**: `cerefox search "your query"`
148
149
  - **Discover all commands**: `cerefox --help`
149
150
  - **Run the web UI**: `cerefox web` (TypeScript — Hono backend + React SPA); see [`cli.md`](cli.md)
150
- - **Connect more AI clients** (Cursor, Codex, ChatGPT GPT Actions, etc.):
151
- [`connect-agents.md`](connect-agents.md)
151
+ - **Connect more AI clients** (Cursor, Codex, Gemini, cloud Claude, etc.):
152
+ [`connect-agents.md`](connect-agents.md). Codex works with the local MCP
153
+ (`cerefox configure-agent --tool codex`). ChatGPT's Custom GPT path ends on
154
+ December 11, 2026; see
155
+ [`chatgpt-after-custom-gpts.md`](../research/chatgpt-after-custom-gpts.md)
152
156
  - **Configuration reference**: [`configuration.md`](configuration.md)
153
157
  - **Backup + restore**: [`ops-scripts.md`](ops-scripts.md)
154
158
 
@@ -220,6 +220,11 @@ FTS-only `mcp.supabase.com` path). This needs a one-time OAuth setup — see
220
220
  [Step 7](#step-7--oauth-for-cloud-agents-claudeai--mobile-optional) below.
221
221
 
222
222
  **For cloud ChatGPT** — create a Custom GPT with GPT Actions pointing at the Edge Functions.
223
+ This works until **December 11, 2026**, when OpenAI retires Custom GPTs (custom actions do
224
+ not carry over to its plugins). ChatGPT's replacement connection, an MCP connector over
225
+ OAuth like the cloud Claude one, is being validated in
226
+ [#326](https://github.com/fstamatelopoulos/cerefox/issues/326). **For Codex**, use the local
227
+ MCP: `cerefox configure-agent --tool codex`.
223
228
 
224
229
  See `docs/guides/connect-agents.md` for the complete guide including system prompts,
225
230
  architecture explanation, and ChatGPT GPT Actions setup.
@@ -223,7 +223,8 @@ MCP path needs no reconfiguration; for the local stdio server, restart the
223
223
  client. `cerefox configure-agent --tool <client>` (re)writes a client's config
224
224
  if you need it.
225
225
 
226
- **ChatGPT Custom GPT (GPT Actions):** after an upgrade, check the OpenAPI schema
226
+ **ChatGPT Custom GPT (GPT Actions, until December 11, 2026, when OpenAI retires
227
+ Custom GPTs):** after an upgrade, check the OpenAPI schema
227
228
  version in [`connect-agents.md`](connect-agents.md); if it changed, paste the new
228
229
  schema into the Custom GPT editor and **re-enter your Cerefox access token**
229
230
  (`cfx_pat_…`, from `cerefox token generate`) as the Bearer token. (The editor
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cerefox/memory",
3
- "version": "1.17.3",
3
+ "version": "1.18.0",
4
4
  "description": "Cerefox \u2014 user-owned shared memory for AI agents. CLI + stdio MCP server + web UI + ingestion for a knowledge base on your own Supabase project (or fully self-hosted with Cerefox Local).",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/fstamatelopoulos/cerefox",
@@ -40,7 +40,7 @@
40
40
  ],
41
41
  "dependencies": {
42
42
  "@hono/node-server": "^2.1.1",
43
- "@modelcontextprotocol/sdk": "^1.30.1",
43
+ "@modelcontextprotocol/sdk": "^1.32.1",
44
44
  "@supabase/supabase-js": "^2.117.2",
45
45
  "cli-progress": "^3.12.0",
46
46
  "commander": "^15.0.0",