@prmichaelsen/remember-mcp 2.2.1 → 2.3.1
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/AGENT.md +98 -5
- package/CHANGELOG.md +45 -0
- package/README.md +43 -3
- package/agent/commands/acp.init.md +376 -0
- package/agent/commands/acp.package-install.md +347 -0
- package/agent/commands/acp.proceed.md +311 -0
- package/agent/commands/acp.report.md +392 -0
- package/agent/commands/acp.status.md +280 -0
- package/agent/commands/acp.sync.md +323 -0
- package/agent/commands/acp.update.md +301 -0
- package/agent/commands/acp.validate.md +385 -0
- package/agent/commands/acp.version-check-for-updates.md +275 -0
- package/agent/commands/acp.version-check.md +190 -0
- package/agent/commands/acp.version-update.md +288 -0
- package/agent/commands/command.template.md +273 -0
- package/agent/design/core-memory-user-profile.md +1253 -0
- package/agent/design/ghost-profiles-pseudonymous-identity.md +194 -0
- package/agent/design/publish-tools-confirmation-flow.md +922 -0
- package/agent/milestones/milestone-10-shared-spaces.md +169 -0
- package/agent/progress.yaml +90 -4
- package/agent/scripts/install.sh +118 -0
- package/agent/scripts/update.sh +22 -10
- package/agent/scripts/version.sh +35 -0
- package/agent/tasks/task-27-implement-llm-provider-interface.md +51 -0
- package/agent/tasks/task-28-implement-llm-provider-factory.md +64 -0
- package/agent/tasks/task-29-update-config-for-llm.md +71 -0
- package/agent/tasks/task-30-implement-bedrock-provider.md +147 -0
- package/agent/tasks/task-31-implement-background-job-service.md +120 -0
- package/agent/tasks/task-32-test-llm-provider-integration.md +152 -0
- package/agent/tasks/task-34-create-confirmation-token-service.md +191 -0
- package/agent/tasks/task-35-create-space-memory-types-schema.md +183 -0
- package/agent/tasks/task-36-implement-remember-publish.md +227 -0
- package/agent/tasks/task-37-implement-remember-confirm.md +225 -0
- package/agent/tasks/task-38-implement-remember-deny.md +161 -0
- package/agent/tasks/task-39-implement-remember-search-space.md +188 -0
- package/agent/tasks/task-40-implement-remember-query-space.md +193 -0
- package/agent/tasks/task-41-configure-firestore-ttl.md +188 -0
- package/agent/tasks/task-42-create-tests-shared-spaces.md +216 -0
- package/agent/tasks/task-43-update-documentation.md +255 -0
- package/agent/tasks/task-44-implement-remember-retract.md +263 -0
- package/agent/tasks/task-45-fix-publish-false-success-bug.md +230 -0
- package/dist/llm/types.d.ts +1 -0
- package/dist/server-factory.js +1000 -1
- package/dist/server.js +1002 -3
- package/dist/services/confirmation-token.service.d.ts +99 -0
- package/dist/services/confirmation-token.service.spec.d.ts +5 -0
- package/dist/tools/confirm.d.ts +20 -0
- package/dist/tools/deny.d.ts +19 -0
- package/dist/tools/publish.d.ts +22 -0
- package/dist/tools/query-space.d.ts +28 -0
- package/dist/tools/search-space.d.ts +29 -0
- package/dist/types/space-memory.d.ts +80 -0
- package/dist/weaviate/space-schema.d.ts +59 -0
- package/dist/weaviate/space-schema.spec.d.ts +5 -0
- package/package.json +1 -1
- package/src/llm/types.ts +0 -0
- package/src/server-factory.ts +33 -0
- package/src/server.ts +33 -0
- package/src/services/confirmation-token.service.spec.ts +254 -0
- package/src/services/confirmation-token.service.ts +265 -0
- package/src/tools/confirm.ts +219 -0
- package/src/tools/create-memory.ts +7 -0
- package/src/tools/deny.ts +70 -0
- package/src/tools/publish.ts +190 -0
- package/src/tools/query-space.ts +197 -0
- package/src/tools/search-space.ts +189 -0
- package/src/types/space-memory.ts +94 -0
- package/src/weaviate/space-schema.spec.ts +131 -0
- package/src/weaviate/space-schema.ts +275 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Ghost Profiles - Pseudonymous Identity System
|
|
2
|
+
|
|
3
|
+
**Concept**: Users can publish under pseudonymous "ghost" profiles while maintaining accountability
|
|
4
|
+
**Created**: 2026-02-16
|
|
5
|
+
**Status**: Concept / Future Design
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
A "ghost" is a pseudonymous profile that users can create to publish memories under different identities. Users can have N ghost profiles, each with a unique name.
|
|
12
|
+
|
|
13
|
+
### Key Concept
|
|
14
|
+
|
|
15
|
+
- **User-Chosen Names**: Users choose their own ghost names (subject to uniqueness)
|
|
16
|
+
- **Public Attribution**: Memories show ghost name (e.g., "ShadowThought")
|
|
17
|
+
- **Private Accountability**: System knows actual `user_id` for permissions
|
|
18
|
+
- **Multiple Personas**: Users can create multiple ghosts
|
|
19
|
+
- **Unique Names**: Ghost names are globally unique (first-come, first-served)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Use Cases
|
|
24
|
+
|
|
25
|
+
1. **Privacy**: Share thoughts without revealing real identity
|
|
26
|
+
2. **Multiple Personas**: Different ghosts for different topics/communities
|
|
27
|
+
3. **Reputation Building**: Build reputation under a consistent pseudonym
|
|
28
|
+
4. **Experimentation**: Try different voices/perspectives
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Core Questions to Explore
|
|
33
|
+
|
|
34
|
+
### Identity Management
|
|
35
|
+
- How are ghost profiles created?
|
|
36
|
+
- How many ghosts can a user have?
|
|
37
|
+
- Can ghost names be changed?
|
|
38
|
+
- How to ensure ghost name uniqueness?
|
|
39
|
+
|
|
40
|
+
### Attribution
|
|
41
|
+
- ✅ Memories show ghost name (not user_id)
|
|
42
|
+
- Can users switch between ghosts?
|
|
43
|
+
- Can users publish as themselves vs. a ghost?
|
|
44
|
+
|
|
45
|
+
### Permissions & Trust
|
|
46
|
+
- Does trust apply to user_id or ghost?
|
|
47
|
+
- Can ghosts have different trust levels?
|
|
48
|
+
- How to prevent abuse (creating many ghosts)?
|
|
49
|
+
|
|
50
|
+
### Discovery
|
|
51
|
+
- Can users discover other ghosts by the same author?
|
|
52
|
+
- Should there be a way to "verify" a ghost belongs to someone?
|
|
53
|
+
- Can ghosts follow each other?
|
|
54
|
+
|
|
55
|
+
### Storage
|
|
56
|
+
- Where are ghost profiles stored? (Firestore)
|
|
57
|
+
- What metadata does a ghost have?
|
|
58
|
+
- How to link ghost to user_id securely?
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Potential Schema
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
interface Ghost {
|
|
66
|
+
ghost_id: string; // Firestore document ID (unique internal ID)
|
|
67
|
+
ghost_name: string; // User-chosen display name (unique globally)
|
|
68
|
+
user_id: string; // Actual owner (private, for permissions)
|
|
69
|
+
created_at: string;
|
|
70
|
+
bio?: string; // Optional ghost bio
|
|
71
|
+
avatar?: string; // Optional avatar
|
|
72
|
+
stats: {
|
|
73
|
+
memories_published: number;
|
|
74
|
+
discovery_count: number;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Firestore path: ghosts/{ghost_id}
|
|
79
|
+
// Index on: ghost_name (for uniqueness check)
|
|
80
|
+
|
|
81
|
+
interface VoidMemory {
|
|
82
|
+
// ... existing fields
|
|
83
|
+
author_id: string; // user_id (private, for permissions only)
|
|
84
|
+
ghost_id?: string; // Optional: Firestore ID of ghost (reference only)
|
|
85
|
+
attribution: 'user' | 'ghost';
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Storage**:
|
|
90
|
+
- **Firestore**: `ghosts/{ghost_id}` - Ghost profile data
|
|
91
|
+
- **Firestore Index**: On `ghost_id` (document ID, automatic)
|
|
92
|
+
- **Uniqueness**: Validated manually by querying all ghosts before creation
|
|
93
|
+
- **Weaviate**: Void memories store ONLY `ghost_id` (not ghost_name)
|
|
94
|
+
|
|
95
|
+
**Uniqueness Validation**:
|
|
96
|
+
```typescript
|
|
97
|
+
// Before creating ghost
|
|
98
|
+
const existingGhosts = await db.collection('ghosts')
|
|
99
|
+
.where('ghost_name', '==', requestedName)
|
|
100
|
+
.limit(1)
|
|
101
|
+
.get();
|
|
102
|
+
|
|
103
|
+
if (!existingGhosts.empty) {
|
|
104
|
+
throw new Error('Ghost name already taken');
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Display Logic**:
|
|
109
|
+
- When displaying memories, fetch `ghost_name` from Firestore via `ghost_id`
|
|
110
|
+
- This ensures name changes propagate automatically
|
|
111
|
+
- If `attribution === 'ghost'`: Fetch and show `ghost_name` from `ghosts/{ghost_id}`
|
|
112
|
+
- If `attribution === 'user'`: Show user's real name/ID
|
|
113
|
+
- `author_id` (user_id) is NEVER shown publicly, only used for permissions
|
|
114
|
+
|
|
115
|
+
**Trade-off**:
|
|
116
|
+
- ✅ Ghost name changes propagate automatically
|
|
117
|
+
- ✅ No stale data in Weaviate
|
|
118
|
+
- ✅ Manual uniqueness validation (full control)
|
|
119
|
+
- ❌ Requires Firestore lookup for each memory display (can be cached)
|
|
120
|
+
- ❌ Uniqueness check requires full collection scan (can optimize with index)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Integration with Publishing
|
|
125
|
+
|
|
126
|
+
### Modified Flow
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
Agent: remember_publish(memory_id, target="void", ghost_id="ghost_123")
|
|
130
|
+
↓
|
|
131
|
+
System: Validates ghost belongs to user, generates token
|
|
132
|
+
↓
|
|
133
|
+
Response: { status: "pending", token: "...", payload: {...} }
|
|
134
|
+
↓
|
|
135
|
+
Agent: "Publish as ghost 'ShadowThought'?"
|
|
136
|
+
↓
|
|
137
|
+
User: "Yes" → remember_confirm(token)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Future Tools
|
|
143
|
+
|
|
144
|
+
- `remember_create_ghost(ghost_name, bio)` - Create new ghost profile
|
|
145
|
+
- `remember_list_ghosts()` - List user's ghost profiles
|
|
146
|
+
- `remember_update_ghost(ghost_id, updates)` - Update ghost profile
|
|
147
|
+
- `remember_delete_ghost(ghost_id)` - Delete ghost (requires confirmation)
|
|
148
|
+
- `remember_search_space(query, ghost_name)` - Filter by ghost
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Benefits
|
|
153
|
+
|
|
154
|
+
✅ **Privacy**: Pseudonymous publishing
|
|
155
|
+
✅ **Accountability**: System knows real user_id
|
|
156
|
+
✅ **Flexibility**: Multiple personas
|
|
157
|
+
✅ **Reputation**: Build consistent identity
|
|
158
|
+
✅ **Safety**: Can't fully hide (user_id tracked)
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Challenges
|
|
163
|
+
|
|
164
|
+
❌ **Complexity**: Additional layer of identity
|
|
165
|
+
❌ **Abuse Prevention**: Users creating many ghosts
|
|
166
|
+
❌ **Name Squatting**: Popular ghost names taken
|
|
167
|
+
❌ **Trust Model**: How does trust work with ghosts?
|
|
168
|
+
❌ **Discovery**: Finding ghosts vs. users
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Design Decisions Needed
|
|
173
|
+
|
|
174
|
+
1. **Ghost Limits**: How many ghosts per user?
|
|
175
|
+
2. **Name Policy**: Length, characters, uniqueness
|
|
176
|
+
3. **Trust Model**: Per-user or per-ghost?
|
|
177
|
+
4. **Verification**: Can users prove ghost ownership?
|
|
178
|
+
5. **Deletion**: What happens to memories when ghost deleted?
|
|
179
|
+
6. **Migration**: Can memories move between ghosts?
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Next Steps
|
|
184
|
+
|
|
185
|
+
1. Explore trust model implications
|
|
186
|
+
2. Design ghost creation/management tools
|
|
187
|
+
3. Consider abuse prevention mechanisms
|
|
188
|
+
4. Design ghost discovery features
|
|
189
|
+
5. Plan migration path from current attribution
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
**Status**: Concept - Requires intensive design work
|
|
194
|
+
**Recommendation**: Implement basic publishing first, add ghosts in future milestone
|