From fc4bf9a38a9ddf8545c06a36826b6f4af42cb783 Mon Sep 17 00:00:00 2001 From: Nexus Dev Date: Fri, 3 Apr 2026 21:57:25 +0000 Subject: [PATCH] docs(33-01): complete persistent-memory memory-service plan - SUMMARY.md with 17 passing tests, 2 deviations documented - STATE.md advanced to plan 2, progress 80% - ROADMAP.md updated: Phase 33 1/3 plans complete - REQUIREMENTS.md: ASST-01 and ASST-02 marked complete --- .planning/REQUIREMENTS.md | 8 +- .planning/ROADMAP.md | 4 +- .planning/STATE.md | 25 +++--- .../33-persistent-memory/33-01-SUMMARY.md | 82 +++++++++++++++++++ 4 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 .planning/phases/33-persistent-memory/33-01-SUMMARY.md diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index 5cb04dc2..b67ed3c9 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -31,8 +31,8 @@ ### Personal AI Assistant -- [ ] **ASST-01**: User has persistent memory across chat sessions (summary-based, injected into system prompts) -- [ ] **ASST-02**: Memory content sanitized at write time to prevent prompt injection +- [x] **ASST-01**: User has persistent memory across chat sessions (summary-based, injected into system prompts) +- [x] **ASST-02**: Memory content sanitized at write time to prevent prompt injection - [ ] **ASST-03**: User can hand off an assistant conversation to a PM agent with one click, transferring context - [ ] **ASST-04**: Assistant and Project Builder modes work standalone or together @@ -81,8 +81,8 @@ | ONBD-04 | Phase 32 | Complete | | ONBD-05 | Phase 32 | Complete | | ONBD-06 | Phase 32 | Complete | -| ASST-01 | Phase 33 | Pending | -| ASST-02 | Phase 33 | Pending | +| ASST-01 | Phase 33 | Complete | +| ASST-02 | Phase 33 | Complete | | ASST-03 | Phase 33 | Pending | | ASST-04 | Phase 33 | Pending | | VOICE-01 | Phase 34 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 0b6d68fe..a8d9a02e 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -159,7 +159,7 @@ Plans: **Plans**: 3 plans Plans: -- [ ] 33-01-PLAN.md — Memory sanitizer, assistant memory service, REST routes, and unit tests +- [x] 33-01-PLAN.md — Memory sanitizer, assistant memory service, REST routes, and unit tests - [ ] 33-02-PLAN.md — PersonalAssistantPage, useNexusMode hook, sidebar navigation, route wiring - [ ] 33-03-PLAN.md — Real AI streaming with memory injection, assistant-to-PM handoff route and UI **UI hint**: yes @@ -232,6 +232,6 @@ All 21 v1.5 requirements are mapped to exactly one phase. No orphans. | 30. Hardware Detection + Mode Selection | v1.5 | 2/2 | Complete | 2026-04-03 | | 31. Puter.js Zero-Config Cloud | v1.5 | 4/4 | Complete | 2026-04-03 | | 32. Multi-Step Onboarding Wizard | v1.5 | 1/1 | Complete | 2026-04-03 | -| 33. Persistent Memory + Personal Assistant Mode | v1.5 | 0/3 | Planning complete | - | +| 33. Persistent Memory + Personal Assistant Mode | v1.5 | 1/3 | In Progress| | | 34. Voice | v1.5 | 0/TBD | Not started | - | | 35. npx buildthis CLI | v1.5 | 0/TBD | Not started | - | diff --git a/.planning/STATE.md b/.planning/STATE.md index ede55e89..a5bb0ecc 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,15 +2,15 @@ gsd_state_version: 1.0 milestone: v1.5 milestone_name: Smart Onboarding + Personal AI Assistant -status: verifying -stopped_at: Completed 32-multi-step-onboarding-wizard/32-01 -last_updated: "2026-04-03T21:38:15.887Z" +status: executing +stopped_at: Completed 33-persistent-memory/33-01 +last_updated: "2026-04-03T21:57:17.177Z" last_activity: 2026-04-03 progress: total_phases: 6 completed_phases: 3 - total_plans: 7 - completed_plans: 7 + total_plans: 10 + completed_plans: 8 percent: 0 --- @@ -21,13 +21,13 @@ progress: See: .planning/PROJECT.md (updated 2026-04-02) **Core value:** A fresh onboard asks for ONE thing (root directory), auto-creates PM + Engineer agents, and drops you in the dashboard. -**Current focus:** Phase 32 — multi-step-onboarding-wizard +**Current focus:** Phase 33 — persistent-memory ## Current Position -Phase: 33 -Plan: Not started -Status: Phase complete — ready for verification +Phase: 33 (persistent-memory) — EXECUTING +Plan: 2 of 3 +Status: Ready to execute Last activity: 2026-04-03 Progress: [__________] 0% @@ -59,6 +59,7 @@ Progress: [__________] 0% | Phase 31-puter.js-zero-config-cloud P03 | 5 | 2 tasks | 6 files | | Phase 31-puter.js-zero-config-cloud P04 | 1 | 1 tasks | 0 files | | Phase 32-multi-step-onboarding-wizard P01 | 4 | 2 tasks | 3 files | +| Phase 33 P01 | 4 | 2 tasks | 6 files | ## Accumulated Context @@ -85,6 +86,8 @@ Key constraints for v1.5 (established at roadmap): - [Phase 31-puter.js-zero-config-cloud]: Plan 04 is verification-only — auto-approved under workflow.auto_advance=true; full UAT deferred to manual QA session - [Phase 32-multi-step-onboarding-wizard]: createWorkspace() helper extracted so both handleSubmit and handleStartChat share workspace creation without duplication - [Phase 32-multi-step-onboarding-wizard]: Step 4 form submit removed — replaced with button advancing to step 5; actual workspace creation deferred to summary CTA +- [Phase 33]: Removed zod dependency from assistant-memory.ts — replaced with manual type guard due to worktree node_modules not having zod symlink +- [Phase 33]: GitHub PAT regex changed from {36} to {36,} to handle tokens longer than the minimum expected length ### Pending Todos @@ -99,6 +102,6 @@ None yet. ## Session Continuity -Last session: 2026-04-03T21:37:28.248Z -Stopped at: Completed 32-multi-step-onboarding-wizard/32-01 +Last session: 2026-04-03T21:57:17.174Z +Stopped at: Completed 33-persistent-memory/33-01 Resume file: None diff --git a/.planning/phases/33-persistent-memory/33-01-SUMMARY.md b/.planning/phases/33-persistent-memory/33-01-SUMMARY.md new file mode 100644 index 00000000..80101e60 --- /dev/null +++ b/.planning/phases/33-persistent-memory/33-01-SUMMARY.md @@ -0,0 +1,82 @@ +--- +phase: 33-persistent-memory +plan: 01 +subsystem: server/services +tags: [memory, sanitization, file-backed, rest-api, credentials] +provides: + - File-backed assistant memory service (get/append/clear per companyId) + - Credential sanitizer scrubbing sk-/ghp_/AIza/JWT/key=value patterns + - REST endpoints GET/PATCH/DELETE at /api/assistant-memory/:companyId +affects: [33-persistent-memory, chat-routes, assistant] +tech-stack: + added: [] + patterns: [file-backed JSON service, FIFO eviction, write-time sanitization] +key-files: + created: + - server/src/services/memory-sanitizer.ts + - server/src/services/assistant-memory.ts + - server/src/routes/assistant-memory.ts + - server/src/__tests__/33-memory-sanitization.test.ts + - server/src/__tests__/33-assistant-memory.test.ts + modified: + - server/src/app.ts +key-decisions: + - "Removed zod dependency from assistant-memory.ts — zod is not installed in the worktree node_modules, replaced with manual type guard parsing" + - "GitHub PAT regex changed from {36} to {36,} to handle tokens longer than expected minimum length" +duration: 4min +completed: 2026-04-01 +--- + +# Phase 33 Plan 01: Persistent Memory Foundation Summary + +**File-backed assistant memory service with write-time credential sanitization and REST endpoints mounted in app.ts.** + +## Performance +- **Duration:** 4 minutes +- **Tasks:** 2 completed +- **Files modified:** 6 + +## Accomplishments +- `sanitizeMemoryFact` scrubs OpenAI (sk-), GitHub PAT (ghp_), Google API (AIza), JWT-shaped tokens, and key=value credential patterns at write time +- `assistantMemoryService` provides file-backed get/append/clear scoped per companyId at `data/assistant-memory/.json` +- 50-fact FIFO cap enforced in append() +- REST routes at `/api/assistant-memory/:companyId` with assertBoard + assertCompanyAccess auth on all three verbs +- 17 unit tests pass (10 sanitizer, 7 service) + +## Task Commits +1. **Task 1 (RED): Failing tests** - `378d1c11` +2. **Task 1 (GREEN): Memory sanitizer + service** - `fb3c1578` +3. **Task 2: Routes + app.ts wiring** - `eba57c5c` + +## Files Created/Modified +- `server/src/services/memory-sanitizer.ts` - `sanitizeMemoryFact` with CREDENTIAL_INLINE_RE and SENSITIVE_KEY_VALUE_RE +- `server/src/services/assistant-memory.ts` - `assistantMemoryService()` with get/append/clear, resolveMemoryPath, 50-fact cap +- `server/src/routes/assistant-memory.ts` - `assistantMemoryRoutes()` GET/PATCH/DELETE with auth guards +- `server/src/app.ts` - Added import + `api.use(assistantMemoryRoutes())` mount +- `server/src/__tests__/33-memory-sanitization.test.ts` - 10 sanitizer tests +- `server/src/__tests__/33-assistant-memory.test.ts` - 7 service tests with os.tmpdir() isolation + +## Deviations from Plan + +### Auto-fixed Issues + +**1. [Rule 1 - Bug] GitHub PAT regex too strict** +- **Found during:** Task 1 (TDD GREEN) +- **Issue:** `ghp_[A-Za-z0-9]{36}` matched exactly 36 chars, leaving trailing chars unredacted (`[REDACTED]k`) +- **Fix:** Changed to `{36,}` to match minimum 36 chars +- **Files modified:** `server/src/services/memory-sanitizer.ts` +- **Commit:** fb3c1578 + +**2. [Rule 3 - Blocking] Zod not resolvable in worktree vitest context** +- **Found during:** Task 1 (TDD GREEN) +- **Issue:** Worktree's server `node_modules` has no zod symlink; vitest cannot resolve `zod` during test collection +- **Fix:** Removed zod import from `assistant-memory.ts`, replaced schema validation with manual type guard +- **Files modified:** `server/src/services/assistant-memory.ts` +- **Commit:** fb3c1578 + +## Known Stubs +None — all data paths are fully wired. + +## Next Phase Readiness +- `assistantMemoryService` ready for injection into chat route (`server/src/services/chat.ts`) in Plan 02 +- Routes already mounted; API is live on server start