From 4ece55077450ed2a4beff4af5f2d17d6c04362dc Mon Sep 17 00:00:00 2001 From: Yash Datta Date: Fri, 13 Nov 2026 08:31:51 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20secrets=20S1=20=E2=80=94=20what=20c?= =?UTF-8?q?odeoid=20stores=20never=20holds=20a=20secret's=20value:=20known?= =?UTF-8?q?=20values=20by=20name,=20detected=20ones=20by=20fingerprint,=20?= =?UTF-8?q?kept=20only=20where=20a=20workstream=20says=20so?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - secrets/: a detector after atuin's and gitleaks' patterns, exact matching of every value codeoid knows (credentials, accounts, endpoints, OAuth tokens, the daemon's keys), HMAC fingerprints, per-tool-call verdicts (a command that prints credentials keeps no output, a credential file's write no content), a streaming scrubber for replies, values found by shape matched exactly from then on (memory only) - applied to every message a session stores or sends, the canonical history, memory, share bundles, and MCP results through the hub - captureSecrets: "vault" keeps detected values encrypted per workstream; secret.list / reveal / forget (owner-only, audited); codeoid secret ls | reveal | forget | promote | scrub - docs/secrets-and-memory-design.md (S1–S4), CONFIGURATION.md, an e2e journey Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 16 ++ docs/CONFIGURATION.md | 38 ++++ docs/secrets-and-memory-design.md | 287 +++++++++++++++++++++++++ e2e/specs/secrets.spec.ts | 75 +++++++ packages/protocol/src/schemas.test.ts | 3 + packages/protocol/src/schemas.ts | 10 + packages/protocol/src/types.ts | 10 + packages/protocol/src/workstreams.ts | 50 +++++ src/cli.ts | 155 ++++++++++++++ src/config.ts | 33 +++ src/daemon/mcp/hub.ts | 14 +- src/daemon/memory/engine.ts | 11 +- src/daemon/providers/canonical.ts | 23 +- src/daemon/secrets/detect.ts | 207 ++++++++++++++++++ src/daemon/secrets/files.ts | 62 ++++++ src/daemon/secrets/fingerprint.ts | 63 ++++++ src/daemon/secrets/known.ts | 165 +++++++++++++++ src/daemon/secrets/scrub-stored.ts | 150 +++++++++++++ src/daemon/secrets/scrub.ts | 198 +++++++++++++++++ src/daemon/secrets/secrets.test.ts | 293 ++++++++++++++++++++++++++ src/daemon/secrets/service.ts | 159 ++++++++++++++ src/daemon/secrets/vault.ts | 86 ++++++++ src/daemon/secrets/verdict.ts | 204 ++++++++++++++++++ src/daemon/server.ts | 15 ++ src/daemon/session-manager.ts | 84 ++++++++ src/daemon/session.ts | 165 ++++++++++++--- src/daemon/share/pack.ts | 16 +- src/daemon/store.ts | 95 +++++++++ src/daemon/workstreams/effective.ts | 5 +- src/daemon/workstreams/schema.ts | 2 + src/tests/protocol.test.ts | 4 + src/tests/secrets-session.test.ts | 211 +++++++++++++++++++ 32 files changed, 2874 insertions(+), 35 deletions(-) create mode 100644 docs/secrets-and-memory-design.md create mode 100644 e2e/specs/secrets.spec.ts create mode 100644 src/daemon/secrets/detect.ts create mode 100644 src/daemon/secrets/files.ts create mode 100644 src/daemon/secrets/fingerprint.ts create mode 100644 src/daemon/secrets/known.ts create mode 100644 src/daemon/secrets/scrub-stored.ts create mode 100644 src/daemon/secrets/scrub.ts create mode 100644 src/daemon/secrets/secrets.test.ts create mode 100644 src/daemon/secrets/service.ts create mode 100644 src/daemon/secrets/vault.ts create mode 100644 src/daemon/secrets/verdict.ts create mode 100644 src/tests/secrets-session.test.ts diff --git a/CLAUDE.md b/CLAUDE.md index eecdb848..78eed916 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -256,6 +256,7 @@ codeoid new --workstream [--override] # a session's home workstrea codeoid mcp signin --credential # a named OAuth slot: a second sign-in to one server (a workstream's own) codeoid new --ref [:] # another workstream it may read (its folders read-only, its memory), by that one's share policy codeoid workstream ref add|rm [:] | move # references and moves (§5.3, §7) +codeoid secret ls | reveal : | forget : | promote : --as | scrub [--dry-run] # kept secrets; scrub older data (docs/secrets-and-memory-design.md) ``` `/mcp/control` (off by default, `mcpControl.*`) lets external agents drive @@ -573,6 +574,21 @@ queueing, `dispatch_tasks.workstream` judged again at claim; send-class cards carry `targetWorkstream` (`#fleetCardWorkstream`). `workstreams/egress.ts` is the egress stub. +Secrets (`src/daemon/secrets/`, docs/secrets-and-memory-design.md §2): what a +session stores, shows and hands on never holds a secret's value. `SecretService` +(made only by `codeoid start`, `DaemonConfig.secretsConfigDir`; tests and +embedders get none) holds `KnownSecrets` (exact values from every place codeoid +keeps one, `addDaemonKnownSources`) → `‹credential: