memshare-mcp 0.2.6

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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +243 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +702 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/cli/ui.d.ts +28 -0
  8. package/dist/cli/ui.d.ts.map +1 -0
  9. package/dist/cli/ui.js +104 -0
  10. package/dist/cli/ui.js.map +1 -0
  11. package/dist/index.d.ts +15 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +15 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/mcp/server.d.ts +6 -0
  16. package/dist/mcp/server.d.ts.map +1 -0
  17. package/dist/mcp/server.js +176 -0
  18. package/dist/mcp/server.js.map +1 -0
  19. package/dist/memory/project.d.ts +15 -0
  20. package/dist/memory/project.d.ts.map +1 -0
  21. package/dist/memory/project.js +77 -0
  22. package/dist/memory/project.js.map +1 -0
  23. package/dist/memory/redact.d.ts +35 -0
  24. package/dist/memory/redact.d.ts.map +1 -0
  25. package/dist/memory/redact.js +275 -0
  26. package/dist/memory/redact.js.map +1 -0
  27. package/dist/memory/store.d.ts +75 -0
  28. package/dist/memory/store.d.ts.map +1 -0
  29. package/dist/memory/store.js +325 -0
  30. package/dist/memory/store.js.map +1 -0
  31. package/dist/memory/types.d.ts +165 -0
  32. package/dist/memory/types.d.ts.map +1 -0
  33. package/dist/memory/types.js +88 -0
  34. package/dist/memory/types.js.map +1 -0
  35. package/dist/sharing/bundle.d.ts +36 -0
  36. package/dist/sharing/bundle.d.ts.map +1 -0
  37. package/dist/sharing/bundle.js +130 -0
  38. package/dist/sharing/bundle.js.map +1 -0
  39. package/dist/sharing/export.d.ts +54 -0
  40. package/dist/sharing/export.d.ts.map +1 -0
  41. package/dist/sharing/export.js +77 -0
  42. package/dist/sharing/export.js.map +1 -0
  43. package/dist/sharing/import.d.ts +59 -0
  44. package/dist/sharing/import.d.ts.map +1 -0
  45. package/dist/sharing/import.js +101 -0
  46. package/dist/sharing/import.js.map +1 -0
  47. package/package.json +69 -0
@@ -0,0 +1,325 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import * as fs from "node:fs/promises";
4
+ import * as os from "node:os";
5
+ import * as path from "node:path";
6
+ import { Config, DEFAULT_CONFIG, MemoryItem, SuggestionFile, } from "./types.js";
7
+ /**
8
+ * Where the store lives. MEMSHARE_DIR wins, so a second identity can run side
9
+ * by side on one machine -- which is also how the two-person sharing flow is
10
+ * tested without two laptops.
11
+ */
12
+ export function resolveMemoryDir() {
13
+ const fromEnv = process.env.MEMSHARE_DIR;
14
+ if (fromEnv && fromEnv.trim() !== "")
15
+ return expandHome(fromEnv.trim());
16
+ return path.join(os.homedir(), ".memshare");
17
+ }
18
+ export function expandHome(p) {
19
+ if (p === "~")
20
+ return os.homedir();
21
+ if (p.startsWith("~/") || p.startsWith("~\\")) {
22
+ return path.join(os.homedir(), p.slice(2));
23
+ }
24
+ return path.resolve(p);
25
+ }
26
+ /** Stable identity for a memory's text, used to dedup on import. */
27
+ export function contentKey(content) {
28
+ const normalised = content.trim().replace(/\s+/g, " ").toLowerCase();
29
+ return createHash("sha256").update(normalised, "utf8").digest("hex");
30
+ }
31
+ export class MemoryStore {
32
+ root;
33
+ constructor(root = resolveMemoryDir()) {
34
+ this.root = root;
35
+ }
36
+ get memoriesDir() {
37
+ return path.join(this.root, "memories");
38
+ }
39
+ get bundlesDir() {
40
+ return path.join(this.root, "bundles");
41
+ }
42
+ get configPath() {
43
+ return path.join(this.root, "config.json");
44
+ }
45
+ get suggestionsPath() {
46
+ return path.join(this.root, "suggestions.json");
47
+ }
48
+ exists() {
49
+ return existsSync(this.configPath);
50
+ }
51
+ /** Creates the directory layout and a config file. Safe to re-run. */
52
+ async init(overrides = {}) {
53
+ await fs.mkdir(this.memoriesDir, { recursive: true });
54
+ await fs.mkdir(this.bundlesDir, { recursive: true });
55
+ const existing = this.exists() ? await this.readConfig() : DEFAULT_CONFIG;
56
+ const config = Config.parse({ ...existing, ...overrides, memoryDir: this.root });
57
+ await this.writeConfig(config);
58
+ return config;
59
+ }
60
+ async readConfig() {
61
+ try {
62
+ const raw = await fs.readFile(this.configPath, "utf8");
63
+ return Config.parse(JSON.parse(raw));
64
+ }
65
+ catch (err) {
66
+ if (isNotFound(err))
67
+ return { ...DEFAULT_CONFIG, memoryDir: this.root };
68
+ throw new Error(`Could not read ${this.configPath}: ${describe(err)}`);
69
+ }
70
+ }
71
+ async writeConfig(config) {
72
+ await fs.mkdir(this.root, { recursive: true });
73
+ await writeJsonAtomic(this.configPath, config);
74
+ }
75
+ itemPath(id) {
76
+ return path.join(this.memoriesDir, `mem_${id}.json`);
77
+ }
78
+ async add(input) {
79
+ const config = await this.readConfig();
80
+ const now = new Date().toISOString();
81
+ const item = MemoryItem.parse({
82
+ id: input.id ?? randomUUID(),
83
+ content: input.content.trim(),
84
+ tags: normaliseTags(input.tags ?? []),
85
+ source: {
86
+ tool: input.source?.tool ?? "cli",
87
+ ...(input.source?.sessionId ? { sessionId: input.source.sessionId } : {}),
88
+ timestamp: input.source?.timestamp ?? now,
89
+ },
90
+ confidence: input.confidence ?? "stated",
91
+ visibility: input.visibility ?? config.defaultVisibility,
92
+ createdAt: now,
93
+ updatedAt: now,
94
+ ...(input.expiresAt ? { expiresAt: input.expiresAt } : {}),
95
+ ...(input.importedFrom ? { importedFrom: input.importedFrom } : {}),
96
+ });
97
+ await fs.mkdir(this.memoriesDir, { recursive: true });
98
+ await writeJsonAtomic(this.itemPath(item.id), item);
99
+ return item;
100
+ }
101
+ async get(id) {
102
+ try {
103
+ const raw = await fs.readFile(this.itemPath(id), "utf8");
104
+ return MemoryItem.parse(JSON.parse(raw));
105
+ }
106
+ catch (err) {
107
+ if (isNotFound(err))
108
+ return undefined;
109
+ throw err;
110
+ }
111
+ }
112
+ /** Every item on disk, newest first. Malformed files are skipped, not fatal. */
113
+ async all() {
114
+ let names;
115
+ try {
116
+ names = await fs.readdir(this.memoriesDir);
117
+ }
118
+ catch (err) {
119
+ if (isNotFound(err))
120
+ return [];
121
+ throw err;
122
+ }
123
+ const items = [];
124
+ for (const name of names) {
125
+ if (!name.startsWith("mem_") || !name.endsWith(".json"))
126
+ continue;
127
+ try {
128
+ const raw = await fs.readFile(path.join(this.memoriesDir, name), "utf8");
129
+ items.push(MemoryItem.parse(JSON.parse(raw)));
130
+ }
131
+ catch {
132
+ // A corrupt or hand-edited file should not take down the whole store.
133
+ continue;
134
+ }
135
+ }
136
+ items.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
137
+ return items;
138
+ }
139
+ async list(filter = {}) {
140
+ const now = Date.now();
141
+ const wanted = filter.tags ? normaliseTags(filter.tags) : undefined;
142
+ const query = filter.query?.trim().toLowerCase();
143
+ const tool = filter.tool?.trim().toLowerCase();
144
+ let items = await this.all();
145
+ items = items.filter((item) => {
146
+ if (!filter.includeExpired && isExpired(item, now))
147
+ return false;
148
+ if (filter.visibility && item.visibility !== filter.visibility)
149
+ return false;
150
+ if (filter.confidence && item.confidence !== filter.confidence)
151
+ return false;
152
+ if (tool && item.source.tool.toLowerCase() !== tool)
153
+ return false;
154
+ if (wanted && wanted.length > 0) {
155
+ if (!item.tags.some((t) => wanted.includes(t.toLowerCase())))
156
+ return false;
157
+ }
158
+ if (query) {
159
+ const haystack = `${item.content} ${item.tags.join(" ")}`.toLowerCase();
160
+ if (!haystack.includes(query))
161
+ return false;
162
+ }
163
+ return true;
164
+ });
165
+ if (filter.limit !== undefined && filter.limit >= 0) {
166
+ items = items.slice(0, filter.limit);
167
+ }
168
+ return items;
169
+ }
170
+ async update(id, patch) {
171
+ const current = await this.get(id);
172
+ if (!current)
173
+ return undefined;
174
+ const next = MemoryItem.parse({
175
+ ...current,
176
+ ...patch,
177
+ ...(patch.tags ? { tags: normaliseTags(patch.tags) } : {}),
178
+ updatedAt: new Date().toISOString(),
179
+ });
180
+ await writeJsonAtomic(this.itemPath(id), next);
181
+ return next;
182
+ }
183
+ async remove(id) {
184
+ try {
185
+ await fs.unlink(this.itemPath(id));
186
+ return true;
187
+ }
188
+ catch (err) {
189
+ if (isNotFound(err))
190
+ return false;
191
+ throw err;
192
+ }
193
+ }
194
+ /** Deletes items whose expiresAt has passed. Returns how many went. */
195
+ async pruneExpired() {
196
+ const now = Date.now();
197
+ const items = await this.all();
198
+ let removed = 0;
199
+ for (const item of items) {
200
+ if (isExpired(item, now) && (await this.remove(item.id)))
201
+ removed += 1;
202
+ }
203
+ return removed;
204
+ }
205
+ async listTags() {
206
+ const items = await this.list();
207
+ const tags = new Set();
208
+ for (const item of items)
209
+ for (const tag of item.tags)
210
+ tags.add(tag);
211
+ return [...tags].sort((a, b) => a.localeCompare(b));
212
+ }
213
+ /** Content keys of every stored item, for import-time dedup. */
214
+ async contentKeys() {
215
+ const items = await this.all();
216
+ return new Set(items.map((i) => contentKey(i.content)));
217
+ }
218
+ async readSuggestions() {
219
+ try {
220
+ const raw = await fs.readFile(this.suggestionsPath, "utf8");
221
+ return SuggestionFile.parse(JSON.parse(raw)).suggestions;
222
+ }
223
+ catch (err) {
224
+ if (isNotFound(err))
225
+ return [];
226
+ throw err;
227
+ }
228
+ }
229
+ async writeSuggestions(suggestions) {
230
+ await fs.mkdir(this.root, { recursive: true });
231
+ await writeJsonAtomic(this.suggestionsPath, { suggestions });
232
+ }
233
+ async addSuggestions(entries, source = {}) {
234
+ const now = new Date().toISOString();
235
+ const existing = await this.readSuggestions();
236
+ const seen = new Set(existing.map((s) => contentKey(s.content)));
237
+ const stored = await this.contentKeys();
238
+ const added = [];
239
+ for (const entry of entries) {
240
+ const content = entry.content.trim();
241
+ if (content === "")
242
+ continue;
243
+ const key = contentKey(content);
244
+ // Don't re-propose what is already pending or already saved.
245
+ if (seen.has(key) || stored.has(key))
246
+ continue;
247
+ seen.add(key);
248
+ added.push({
249
+ id: randomUUID(),
250
+ content,
251
+ tags: normaliseTags(entry.tags ?? []),
252
+ source: {
253
+ tool: source.tool ?? "assistant",
254
+ ...(source.sessionId ? { sessionId: source.sessionId } : {}),
255
+ timestamp: source.timestamp ?? now,
256
+ },
257
+ suggestedAt: now,
258
+ });
259
+ }
260
+ if (added.length > 0)
261
+ await this.writeSuggestions([...existing, ...added]);
262
+ return added;
263
+ }
264
+ async removeSuggestions(ids) {
265
+ const drop = new Set(ids);
266
+ const remaining = (await this.readSuggestions()).filter((s) => !drop.has(s.id));
267
+ await this.writeSuggestions(remaining);
268
+ }
269
+ }
270
+ export function isExpired(item, now = Date.now()) {
271
+ if (!item.expiresAt)
272
+ return false;
273
+ const at = Date.parse(item.expiresAt);
274
+ return !Number.isNaN(at) && at <= now;
275
+ }
276
+ export function normaliseTags(tags) {
277
+ const out = [];
278
+ for (const raw of tags) {
279
+ const tag = raw.trim().toLowerCase();
280
+ if (tag !== "" && !out.includes(tag))
281
+ out.push(tag);
282
+ }
283
+ return out;
284
+ }
285
+ /** Parses --tags "a,b" (repeatable) into a flat tag list. */
286
+ export function parseTagList(value) {
287
+ if (value === undefined)
288
+ return [];
289
+ const parts = Array.isArray(value) ? value : [value];
290
+ return normaliseTags(parts.flatMap((v) => v.split(",")));
291
+ }
292
+ /** Turns 7d / 12h / 30m, or an ISO date, into an absolute ISO timestamp. */
293
+ export function parseDuration(value, from = new Date()) {
294
+ const match = /^(\d+)\s*([smhdw])$/i.exec(value.trim());
295
+ if (match) {
296
+ const amount = Number(match[1]);
297
+ const unit = match[2].toLowerCase();
298
+ const ms = {
299
+ s: 1000,
300
+ m: 60_000,
301
+ h: 3_600_000,
302
+ d: 86_400_000,
303
+ w: 604_800_000,
304
+ };
305
+ return new Date(from.getTime() + amount * ms[unit]).toISOString();
306
+ }
307
+ const parsed = Date.parse(value);
308
+ if (Number.isNaN(parsed)) {
309
+ throw new Error(`Cannot read "${value}" as a duration (try 7d, 12h) or a date.`);
310
+ }
311
+ return new Date(parsed).toISOString();
312
+ }
313
+ /** Write via temp file + rename so a crash can't leave a half-written record. */
314
+ export async function writeJsonAtomic(file, data) {
315
+ const tmp = `${file}.${process.pid}.tmp`;
316
+ await fs.writeFile(tmp, `${JSON.stringify(data, null, 2)}\n`, "utf8");
317
+ await fs.rename(tmp, file);
318
+ }
319
+ function isNotFound(err) {
320
+ return err?.code === "ENOENT";
321
+ }
322
+ function describe(err) {
323
+ return err instanceof Error ? err.message : String(err);
324
+ }
325
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Bundle schema version. Bump the minor when adding optional fields, the major
4
+ * when an old importer could misread a new bundle.
5
+ */
6
+ export declare const SCHEMA_VERSION = "0.1.0";
7
+ /** ISO-8601 timestamp. Kept permissive on purpose: any Date-parseable string. */
8
+ export declare const IsoDateTime: z.ZodString;
9
+ export declare const Confidence: z.ZodEnum<{
10
+ imported: "imported";
11
+ inferred: "inferred";
12
+ stated: "stated";
13
+ }>;
14
+ export type Confidence = z.infer<typeof Confidence>;
15
+ export declare const Visibility: z.ZodEnum<{
16
+ private: "private";
17
+ shareable: "shareable";
18
+ }>;
19
+ export type Visibility = z.infer<typeof Visibility>;
20
+ export declare const Mode: z.ZodEnum<{
21
+ auto: "auto";
22
+ manual: "manual";
23
+ suggest: "suggest";
24
+ }>;
25
+ export type Mode = z.infer<typeof Mode>;
26
+ export declare const MemorySource: z.ZodObject<{
27
+ tool: z.ZodString;
28
+ sessionId: z.ZodOptional<z.ZodString>;
29
+ timestamp: z.ZodString;
30
+ }, z.core.$strip>;
31
+ export type MemorySource = z.infer<typeof MemorySource>;
32
+ /** Set on items that arrived in someone else's bundle. */
33
+ export declare const ImportProvenance: z.ZodObject<{
34
+ bundleId: z.ZodString;
35
+ exportedBy: z.ZodString;
36
+ importedAt: z.ZodString;
37
+ originalId: z.ZodOptional<z.ZodString>;
38
+ }, z.core.$strip>;
39
+ export type ImportProvenance = z.infer<typeof ImportProvenance>;
40
+ export declare const MemoryItem: z.ZodObject<{
41
+ id: z.ZodString;
42
+ content: z.ZodString;
43
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
44
+ source: z.ZodObject<{
45
+ tool: z.ZodString;
46
+ sessionId: z.ZodOptional<z.ZodString>;
47
+ timestamp: z.ZodString;
48
+ }, z.core.$strip>;
49
+ confidence: z.ZodEnum<{
50
+ imported: "imported";
51
+ inferred: "inferred";
52
+ stated: "stated";
53
+ }>;
54
+ visibility: z.ZodEnum<{
55
+ private: "private";
56
+ shareable: "shareable";
57
+ }>;
58
+ createdAt: z.ZodString;
59
+ updatedAt: z.ZodString;
60
+ expiresAt: z.ZodOptional<z.ZodString>;
61
+ importedFrom: z.ZodOptional<z.ZodObject<{
62
+ bundleId: z.ZodString;
63
+ exportedBy: z.ZodString;
64
+ importedAt: z.ZodString;
65
+ originalId: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>>;
67
+ }, z.core.$strip>;
68
+ export type MemoryItem = z.infer<typeof MemoryItem>;
69
+ export declare const BundleMetadata: z.ZodObject<{
70
+ bundleId: z.ZodString;
71
+ exportedBy: z.ZodString;
72
+ exportedAt: z.ZodString;
73
+ description: z.ZodOptional<z.ZodString>;
74
+ exportedFor: z.ZodOptional<z.ZodString>;
75
+ schemaVersion: z.ZodString;
76
+ contentHash: z.ZodString;
77
+ expiresAt: z.ZodOptional<z.ZodString>;
78
+ }, z.core.$strip>;
79
+ export type BundleMetadata = z.infer<typeof BundleMetadata>;
80
+ export declare const MemoryBundle: z.ZodObject<{
81
+ metadata: z.ZodObject<{
82
+ bundleId: z.ZodString;
83
+ exportedBy: z.ZodString;
84
+ exportedAt: z.ZodString;
85
+ description: z.ZodOptional<z.ZodString>;
86
+ exportedFor: z.ZodOptional<z.ZodString>;
87
+ schemaVersion: z.ZodString;
88
+ contentHash: z.ZodString;
89
+ expiresAt: z.ZodOptional<z.ZodString>;
90
+ }, z.core.$strip>;
91
+ items: z.ZodArray<z.ZodObject<{
92
+ id: z.ZodString;
93
+ content: z.ZodString;
94
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
95
+ source: z.ZodObject<{
96
+ tool: z.ZodString;
97
+ sessionId: z.ZodOptional<z.ZodString>;
98
+ timestamp: z.ZodString;
99
+ }, z.core.$strip>;
100
+ confidence: z.ZodEnum<{
101
+ imported: "imported";
102
+ inferred: "inferred";
103
+ stated: "stated";
104
+ }>;
105
+ visibility: z.ZodEnum<{
106
+ private: "private";
107
+ shareable: "shareable";
108
+ }>;
109
+ createdAt: z.ZodString;
110
+ updatedAt: z.ZodString;
111
+ expiresAt: z.ZodOptional<z.ZodString>;
112
+ importedFrom: z.ZodOptional<z.ZodObject<{
113
+ bundleId: z.ZodString;
114
+ exportedBy: z.ZodString;
115
+ importedAt: z.ZodString;
116
+ originalId: z.ZodOptional<z.ZodString>;
117
+ }, z.core.$strip>>;
118
+ }, z.core.$strip>>;
119
+ }, z.core.$strip>;
120
+ export type MemoryBundle = z.infer<typeof MemoryBundle>;
121
+ export declare const Config: z.ZodObject<{
122
+ displayName: z.ZodDefault<z.ZodString>;
123
+ mode: z.ZodDefault<z.ZodEnum<{
124
+ auto: "auto";
125
+ manual: "manual";
126
+ suggest: "suggest";
127
+ }>>;
128
+ defaultVisibility: z.ZodDefault<z.ZodEnum<{
129
+ private: "private";
130
+ shareable: "shareable";
131
+ }>>;
132
+ autoRedactPII: z.ZodDefault<z.ZodBoolean>;
133
+ autoProjectTag: z.ZodDefault<z.ZodBoolean>;
134
+ memoryDir: z.ZodDefault<z.ZodString>;
135
+ }, z.core.$strip>;
136
+ export type Config = z.infer<typeof Config>;
137
+ export declare const DEFAULT_CONFIG: Config;
138
+ /** A pending item proposed by an assistant in "suggest" mode. */
139
+ export declare const Suggestion: z.ZodObject<{
140
+ id: z.ZodString;
141
+ content: z.ZodString;
142
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
143
+ source: z.ZodObject<{
144
+ tool: z.ZodString;
145
+ sessionId: z.ZodOptional<z.ZodString>;
146
+ timestamp: z.ZodString;
147
+ }, z.core.$strip>;
148
+ suggestedAt: z.ZodString;
149
+ }, z.core.$strip>;
150
+ export type Suggestion = z.infer<typeof Suggestion>;
151
+ export declare const SuggestionFile: z.ZodObject<{
152
+ suggestions: z.ZodDefault<z.ZodArray<z.ZodObject<{
153
+ id: z.ZodString;
154
+ content: z.ZodString;
155
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
156
+ source: z.ZodObject<{
157
+ tool: z.ZodString;
158
+ sessionId: z.ZodOptional<z.ZodString>;
159
+ timestamp: z.ZodString;
160
+ }, z.core.$strip>;
161
+ suggestedAt: z.ZodString;
162
+ }, z.core.$strip>>>;
163
+ }, z.core.$strip>;
164
+ export type SuggestionFile = z.infer<typeof SuggestionFile>;
165
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,iFAAiF;AACjF,eAAO,MAAM,WAAW,aAIpB,CAAC;AAEL,eAAO,MAAM,UAAU;;;;EAA6C,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,UAAU;;;EAAmC,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,IAAI;;;;EAAwC,CAAC;AAC1D,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,eAAO,MAAM,YAAY;;;;iBAKvB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB;;;;;iBAM3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAWrB,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,cAAc;;;;;;;;;iBAYzB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGvB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;iBASjB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,MAO5B,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,UAAU;;;;;;;;;;iBAMrB,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,cAAc;;;;;;;;;;;;iBAEzB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Bundle schema version. Bump the minor when adding optional fields, the major
4
+ * when an old importer could misread a new bundle.
5
+ */
6
+ export const SCHEMA_VERSION = "0.1.0";
7
+ /** ISO-8601 timestamp. Kept permissive on purpose: any Date-parseable string. */
8
+ export const IsoDateTime = z
9
+ .string()
10
+ .refine((s) => !Number.isNaN(Date.parse(s)), {
11
+ message: "must be an ISO-8601 timestamp",
12
+ });
13
+ export const Confidence = z.enum(["stated", "inferred", "imported"]);
14
+ export const Visibility = z.enum(["private", "shareable"]);
15
+ export const Mode = z.enum(["auto", "suggest", "manual"]);
16
+ export const MemorySource = z.object({
17
+ /** Which adapter wrote this: "claude", "chatgpt", "cli", "import", ... */
18
+ tool: z.string().min(1),
19
+ sessionId: z.string().optional(),
20
+ timestamp: IsoDateTime,
21
+ });
22
+ /** Set on items that arrived in someone else's bundle. */
23
+ export const ImportProvenance = z.object({
24
+ bundleId: z.string().min(1),
25
+ exportedBy: z.string().min(1),
26
+ importedAt: IsoDateTime,
27
+ /** The id the item had in the sender's store. */
28
+ originalId: z.string().min(1).optional(),
29
+ });
30
+ export const MemoryItem = z.object({
31
+ id: z.string().min(1),
32
+ content: z.string().min(1),
33
+ tags: z.array(z.string().min(1)).default([]),
34
+ source: MemorySource,
35
+ confidence: Confidence,
36
+ visibility: Visibility,
37
+ createdAt: IsoDateTime,
38
+ updatedAt: IsoDateTime,
39
+ expiresAt: IsoDateTime.optional(),
40
+ importedFrom: ImportProvenance.optional(),
41
+ });
42
+ export const BundleMetadata = z.object({
43
+ bundleId: z.string().min(1),
44
+ /** A display name, deliberately not a verified identity. */
45
+ exportedBy: z.string().min(1),
46
+ exportedAt: IsoDateTime,
47
+ /** Free-text note for the recipient, and who it was prepared for. */
48
+ description: z.string().optional(),
49
+ exportedFor: z.string().optional(),
50
+ schemaVersion: z.string().min(1),
51
+ /** SHA-256 over the canonicalised `items` array. */
52
+ contentHash: z.string().length(64),
53
+ expiresAt: IsoDateTime.optional(),
54
+ });
55
+ export const MemoryBundle = z.object({
56
+ metadata: BundleMetadata,
57
+ items: z.array(MemoryItem),
58
+ });
59
+ export const Config = z.object({
60
+ displayName: z.string().min(1).default("anonymous"),
61
+ mode: Mode.default("auto"),
62
+ defaultVisibility: Visibility.default("private"),
63
+ autoRedactPII: z.boolean().default(true),
64
+ /** Tag captured memories with the current git repo / folder name. */
65
+ autoProjectTag: z.boolean().default(true),
66
+ /** Informational: the live location always comes from resolveMemoryDir(). */
67
+ memoryDir: z.string().default("~/.memshare"),
68
+ });
69
+ export const DEFAULT_CONFIG = {
70
+ displayName: "anonymous",
71
+ mode: "auto",
72
+ defaultVisibility: "private",
73
+ autoRedactPII: true,
74
+ autoProjectTag: true,
75
+ memoryDir: "~/.memshare",
76
+ };
77
+ /** A pending item proposed by an assistant in "suggest" mode. */
78
+ export const Suggestion = z.object({
79
+ id: z.string().min(1),
80
+ content: z.string().min(1),
81
+ tags: z.array(z.string().min(1)).default([]),
82
+ source: MemorySource,
83
+ suggestedAt: IsoDateTime,
84
+ });
85
+ export const SuggestionFile = z.object({
86
+ suggestions: z.array(Suggestion).default([]),
87
+ });
88
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { MemoryBundle, type MemoryItem } from "../memory/types.js";
2
+ export declare const BUNDLE_EXTENSION = ".memshare.json";
3
+ /**
4
+ * Deterministic JSON: object keys sorted, no incidental whitespace. Two people
5
+ * hashing the same items must get the same digest, whatever order their
6
+ * JSON runtime happened to produce.
7
+ */
8
+ export declare function canonicalize(value: unknown): string;
9
+ /** SHA-256 over the canonicalised items array. */
10
+ export declare function computeContentHash(items: MemoryItem[]): string;
11
+ export interface CreateBundleOptions {
12
+ items: MemoryItem[];
13
+ /** Display name of the sender. Not a verified identity. */
14
+ exportedBy: string;
15
+ description?: string;
16
+ exportedFor?: string;
17
+ /** Absolute ISO timestamp after which the recipient should refuse it. */
18
+ expiresAt?: string;
19
+ }
20
+ export declare function createBundle(options: CreateBundleOptions): MemoryBundle;
21
+ /** e.g. `bundle-a3f8c2d1.memshare.json` */
22
+ export declare function bundleFileName(bundle: MemoryBundle): string;
23
+ export interface ValidationResult {
24
+ ok: boolean;
25
+ bundle?: MemoryBundle;
26
+ /** Problems that make the bundle unsafe to import. */
27
+ errors: string[];
28
+ /** Problems worth showing the user, but not disqualifying. */
29
+ warnings: string[];
30
+ }
31
+ /** Schema, hash integrity, schema-version and expiry checks, in that order. */
32
+ export declare function validateBundle(raw: unknown, now?: Date): ValidationResult;
33
+ export declare function writeBundleFile(bundle: MemoryBundle, destination: string): Promise<string>;
34
+ /** Reads and validates a bundle file. Never throws on bad content. */
35
+ export declare function readBundleFile(file: string, now?: Date): Promise<ValidationResult>;
36
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/sharing/bundle.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,YAAY,EAGZ,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOnD;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAE9D;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAavE;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAG3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,sDAAsD;IACtD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,gBAAgB,CAmDrF;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,sEAAsE;AACtE,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAuB3B"}