smriti 0.1.0 → 0.3.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.
Files changed (44) hide show
  1. package/dist/auth/credentials.d.ts +11 -0
  2. package/dist/auth/credentials.d.ts.map +1 -0
  3. package/dist/auth/credentials.js +64 -0
  4. package/dist/auth/credentials.js.map +1 -0
  5. package/dist/auth/github.d.ts +48 -0
  6. package/dist/auth/github.d.ts.map +1 -0
  7. package/dist/auth/github.js +128 -0
  8. package/dist/auth/github.js.map +1 -0
  9. package/dist/config.d.ts +5 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +5 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/consolidation/index.d.ts +16 -0
  14. package/dist/consolidation/index.d.ts.map +1 -0
  15. package/dist/consolidation/index.js +109 -0
  16. package/dist/consolidation/index.js.map +1 -0
  17. package/dist/db/schema.d.ts.map +1 -1
  18. package/dist/db/schema.js +12 -0
  19. package/dist/db/schema.js.map +1 -1
  20. package/dist/db/search.d.ts.map +1 -1
  21. package/dist/db/search.js +2 -0
  22. package/dist/db/search.js.map +1 -1
  23. package/dist/db/store.d.ts +12 -0
  24. package/dist/db/store.d.ts.map +1 -1
  25. package/dist/db/store.js +59 -2
  26. package/dist/db/store.js.map +1 -1
  27. package/dist/index.js +179 -12
  28. package/dist/index.js.map +1 -1
  29. package/dist/server.d.ts.map +1 -1
  30. package/dist/server.js +103 -0
  31. package/dist/server.js.map +1 -1
  32. package/dist/sync/export.d.ts +9 -0
  33. package/dist/sync/export.d.ts.map +1 -0
  34. package/dist/sync/export.js +99 -0
  35. package/dist/sync/export.js.map +1 -0
  36. package/dist/sync/git.d.ts +10 -0
  37. package/dist/sync/git.d.ts.map +1 -0
  38. package/dist/sync/git.js +157 -0
  39. package/dist/sync/git.js.map +1 -0
  40. package/dist/sync/import.d.ts +9 -0
  41. package/dist/sync/import.d.ts.map +1 -0
  42. package/dist/sync/import.js +107 -0
  43. package/dist/sync/import.js.map +1 -0
  44. package/package.json +2 -2
@@ -0,0 +1,11 @@
1
+ export declare function saveGitHubToken(token: string, username: string, repoFullName: string): void;
2
+ export declare function getGitHubToken(): string | null;
3
+ export declare function getGitHubUsername(): string | null;
4
+ export declare function getSyncRepo(): string | null;
5
+ export declare function clearCredentials(): void;
6
+ export declare function getAuthStatus(): {
7
+ authenticated: boolean;
8
+ username: string | null;
9
+ sync_repo: string | null;
10
+ };
11
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AA8CA,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,IAAI,CAMN;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,wBAAgB,aAAa,IAAI;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAOA"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Credential store for Smriti.
3
+ * Stores tokens in ~/.smriti/credentials (chmod 600) —
4
+ * same pattern as ~/.aws/credentials, ~/.git-credentials.
5
+ * Abstracted behind an interface so we can swap in OS keychain later.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, unlinkSync, chmodSync, } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { getSmritiDir, ensureSmritiDir } from "../config.js";
10
+ const CREDS_FILENAME = "credentials";
11
+ function credsPath() {
12
+ return join(getSmritiDir(), CREDS_FILENAME);
13
+ }
14
+ function read() {
15
+ const p = credsPath();
16
+ if (!existsSync(p))
17
+ return {};
18
+ try {
19
+ return JSON.parse(readFileSync(p, "utf-8"));
20
+ }
21
+ catch {
22
+ return {};
23
+ }
24
+ }
25
+ function write(store) {
26
+ ensureSmritiDir();
27
+ const p = credsPath();
28
+ writeFileSync(p, JSON.stringify(store, null, 2), { encoding: "utf-8", mode: 0o600 });
29
+ // Enforce strict perms (belt + suspenders)
30
+ try {
31
+ chmodSync(p, 0o600);
32
+ }
33
+ catch { /* ignore on Windows */ }
34
+ }
35
+ export function saveGitHubToken(token, username, repoFullName) {
36
+ const store = read();
37
+ store.github_token = token;
38
+ store.github_username = username;
39
+ store.sync_repo = repoFullName;
40
+ write(store);
41
+ }
42
+ export function getGitHubToken() {
43
+ return read().github_token ?? null;
44
+ }
45
+ export function getGitHubUsername() {
46
+ return read().github_username ?? null;
47
+ }
48
+ export function getSyncRepo() {
49
+ return read().sync_repo ?? null;
50
+ }
51
+ export function clearCredentials() {
52
+ const p = credsPath();
53
+ if (existsSync(p))
54
+ unlinkSync(p);
55
+ }
56
+ export function getAuthStatus() {
57
+ const store = read();
58
+ return {
59
+ authenticated: !!store.github_token,
60
+ username: store.github_username ?? null,
61
+ sync_repo: store.sync_repo ?? null,
62
+ };
63
+ }
64
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,cAAc,GAAG,aAAa,CAAC;AAErC,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC;AAQD,SAAS,IAAI;IACX,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAoB,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,KAAsB;IACnC,eAAe,EAAE,CAAC;IAClB,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,2CAA2C;IAC3C,IAAI,CAAC;QAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAa,EACb,QAAgB,EAChB,YAAoB;IAEpB,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;IACrB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAC3B,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;IACjC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;IAC/B,KAAK,CAAC,KAAK,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,EAAE,CAAC,eAAe,IAAI,IAAI,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa;IAK3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;IACrB,OAAO;QACL,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY;QACnC,QAAQ,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;QACvC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * GitHub API client for Smriti sync.
3
+ * Uses fetch (Node 18+) — no extra dependencies.
4
+ * Token scopes required: repo (create/push private repos)
5
+ */
6
+ export interface DeviceCodeResponse {
7
+ device_code: string;
8
+ user_code: string;
9
+ verification_uri: string;
10
+ expires_in: number;
11
+ interval: number;
12
+ }
13
+ /** Step 1: Request a device code from GitHub */
14
+ export declare function requestDeviceCode(): Promise<DeviceCodeResponse>;
15
+ export type TokenPollResult = {
16
+ status: "complete";
17
+ token: string;
18
+ } | {
19
+ status: "pending";
20
+ } | {
21
+ status: "expired";
22
+ } | {
23
+ status: "error";
24
+ message: string;
25
+ };
26
+ /** Step 2: Poll until user completes browser auth */
27
+ export declare function pollForToken(deviceCode: string, intervalSec: number): Promise<string>;
28
+ export declare function hasClientId(): boolean;
29
+ export interface GitHubUser {
30
+ login: string;
31
+ name: string | null;
32
+ email: string | null;
33
+ }
34
+ export declare function getAuthenticatedUser(token: string): Promise<GitHubUser>;
35
+ export interface SyncRepo {
36
+ full_name: string;
37
+ clone_url: string;
38
+ html_url: string;
39
+ private: boolean;
40
+ }
41
+ export declare function ensureSyncRepo(token: string, username: string): Promise<SyncRepo>;
42
+ /**
43
+ * Build an authenticated HTTPS clone URL.
44
+ * Format: https://{username}:{token}@github.com/{owner}/{repo}.git
45
+ * This avoids SSH key setup entirely.
46
+ */
47
+ export declare function authenticatedCloneUrl(token: string, username: string, repoFullName: string): string;
48
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/auth/github.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gDAAgD;AAChD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAsBrE;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,qDAAqD;AACrD,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAmBD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ7E;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+BvF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnG"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * GitHub API client for Smriti sync.
3
+ * Uses fetch (Node 18+) — no extra dependencies.
4
+ * Token scopes required: repo (create/push private repos)
5
+ */
6
+ const GITHUB_API = "https://api.github.com";
7
+ const SYNC_REPO_NAME = "smriti-memories";
8
+ // Register at: https://github.com/settings/developers → OAuth Apps
9
+ // Enable "Device Flow" on the app. Client ID is public — no secret needed.
10
+ // Override with SMRITI_CLIENT_ID env var for forks/custom deployments.
11
+ const OAUTH_CLIENT_ID = process.env["SMRITI_CLIENT_ID"] ?? "Ov23li6kZdAWOlq402bQ";
12
+ /** Step 1: Request a device code from GitHub */
13
+ export async function requestDeviceCode() {
14
+ const res = await fetch("https://github.com/login/device/code", {
15
+ method: "POST",
16
+ headers: {
17
+ Accept: "application/json",
18
+ "Content-Type": "application/json",
19
+ },
20
+ body: JSON.stringify({
21
+ client_id: OAUTH_CLIENT_ID,
22
+ scope: "repo",
23
+ }),
24
+ });
25
+ if (!res.ok) {
26
+ throw new Error(`GitHub device code request failed: ${res.status} ${await res.text()}`);
27
+ }
28
+ const data = await res.json();
29
+ if (data.error) {
30
+ throw new Error(`GitHub error: ${data.error}`);
31
+ }
32
+ return data;
33
+ }
34
+ /** Step 2: Poll until user completes browser auth */
35
+ export async function pollForToken(deviceCode, intervalSec) {
36
+ const deadline = Date.now() + 10 * 60 * 1000; // 10 min max
37
+ while (Date.now() < deadline) {
38
+ await new Promise(r => setTimeout(r, intervalSec * 1000));
39
+ const res = await fetch("https://github.com/login/oauth/access_token", {
40
+ method: "POST",
41
+ headers: {
42
+ Accept: "application/json",
43
+ "Content-Type": "application/json",
44
+ },
45
+ body: JSON.stringify({
46
+ client_id: OAUTH_CLIENT_ID,
47
+ device_code: deviceCode,
48
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
49
+ }),
50
+ });
51
+ const data = await res.json();
52
+ if (data.access_token)
53
+ return data.access_token;
54
+ if (data.error === "authorization_pending")
55
+ continue;
56
+ if (data.error === "slow_down") {
57
+ await new Promise(r => setTimeout(r, 5000));
58
+ continue;
59
+ }
60
+ if (data.error === "expired_token")
61
+ throw new Error("Device code expired. Run smriti auth again.");
62
+ if (data.error === "access_denied")
63
+ throw new Error("Access denied by user.");
64
+ if (data.error)
65
+ throw new Error(`GitHub error: ${data.error}`);
66
+ }
67
+ throw new Error("Auth timed out. Run smriti auth again.");
68
+ }
69
+ export function hasClientId() {
70
+ return OAUTH_CLIENT_ID !== "Ov23liYOUR_CLIENT_ID_HERE";
71
+ }
72
+ async function ghFetch(path, token, opts = {}) {
73
+ return fetch(`${GITHUB_API}${path}`, {
74
+ ...opts,
75
+ headers: {
76
+ Authorization: `Bearer ${token}`,
77
+ Accept: "application/vnd.github+json",
78
+ "X-GitHub-Api-Version": "2022-11-28",
79
+ "Content-Type": "application/json",
80
+ ...(opts.headers ?? {}),
81
+ },
82
+ });
83
+ }
84
+ export async function getAuthenticatedUser(token) {
85
+ const res = await ghFetch("/user", token);
86
+ if (!res.ok) {
87
+ const body = await res.text();
88
+ throw new Error(`GitHub auth failed (${res.status}): ${body}`);
89
+ }
90
+ const data = (await res.json());
91
+ return { login: data.login, name: data.name ?? null, email: data.email ?? null };
92
+ }
93
+ export async function ensureSyncRepo(token, username) {
94
+ // Check if repo already exists
95
+ const checkRes = await ghFetch(`/repos/${username}/${SYNC_REPO_NAME}`, token);
96
+ if (checkRes.ok) {
97
+ const repo = (await checkRes.json());
98
+ return repo;
99
+ }
100
+ if (checkRes.status !== 404) {
101
+ throw new Error(`GitHub API error: ${checkRes.status} ${await checkRes.text()}`);
102
+ }
103
+ // Create the repo
104
+ const createRes = await ghFetch("/user/repos", token, {
105
+ method: "POST",
106
+ body: JSON.stringify({
107
+ name: SYNC_REPO_NAME,
108
+ description: "Smriti persistent memory sync — auto-managed by npx smriti",
109
+ private: true,
110
+ auto_init: true,
111
+ }),
112
+ });
113
+ if (!createRes.ok) {
114
+ throw new Error(`Failed to create sync repo: ${createRes.status} ${await createRes.text()}`);
115
+ }
116
+ const repo = (await createRes.json());
117
+ console.log(`✅ Created private repo: ${repo.html_url}`);
118
+ return repo;
119
+ }
120
+ /**
121
+ * Build an authenticated HTTPS clone URL.
122
+ * Format: https://{username}:{token}@github.com/{owner}/{repo}.git
123
+ * This avoids SSH key setup entirely.
124
+ */
125
+ export function authenticatedCloneUrl(token, username, repoFullName) {
126
+ return `https://${username}:${token}@github.com/${repoFullName}.git`;
127
+ }
128
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/auth/github.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -11,6 +11,11 @@ export interface SmritiConfig {
11
11
  transport: "stdio" | "http";
12
12
  port: number;
13
13
  };
14
+ sync: {
15
+ export_dir: string;
16
+ repo_path: string | null;
17
+ auto_sync_hours: number | null;
18
+ };
14
19
  }
15
20
  export declare function ensureSmritiDir(): void;
16
21
  export declare function loadConfig(): SmritiConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,UAAU,EAAE;QACV,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC;KAC3B,CAAC;IACF,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAoBD,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED,wBAAgB,UAAU,IAAI,YAAY,CAazC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,UAAU,EAAE;QACV,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC;KAC3B,CAAC;IACF,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;KAChC,CAAC;CACH;AAyBD,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED,wBAAgB,UAAU,IAAI,YAAY,CAazC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
package/dist/config.js CHANGED
@@ -16,6 +16,11 @@ const DEFAULT_CONFIG = {
16
16
  transport: "stdio",
17
17
  port: 3838,
18
18
  },
19
+ sync: {
20
+ export_dir: join(SMRITI_DIR, "export"),
21
+ repo_path: null,
22
+ auto_sync_hours: null,
23
+ },
19
24
  };
20
25
  export function ensureSmritiDir() {
21
26
  if (!existsSync(SMRITI_DIR)) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAiBlC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,cAAc,GAAiB;IACnC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IACrC,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,yBAAyB;KACjC;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,OAAO;KAClB;IACD,MAAM,EAAE;QACN,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,IAAI;KACX;CACF,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,eAAe,EAAE,CAAC;IAClB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;YACxD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IACD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAsBlC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,cAAc,GAAiB;IACnC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IACrC,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,yBAAyB;KACjC;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,OAAO;KAClB;IACD,MAAM,EAAE;QACN,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,IAAI;KACX;IACD,IAAI,EAAE;QACJ,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;QACtC,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,IAAI;KACtB;CACF,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,eAAe,EAAE,CAAC;IAClB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;YACxD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IACD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { EmbeddingEngine } from "../embedding/engine.js";
3
+ export interface ConsolidationResult {
4
+ merged: number;
5
+ promoted: number;
6
+ archived: number;
7
+ groups: Array<{
8
+ summary: string;
9
+ source_ids: string[];
10
+ }>;
11
+ }
12
+ export declare function consolidateMemories(db: Database.Database, embedder: EmbeddingEngine, opts?: {
13
+ dry_run?: boolean;
14
+ days?: number;
15
+ }): Promise<ConsolidationResult>;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/consolidation/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC1D;AA0BD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,eAAe,EACzB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC,mBAAmB,CAAC,CA+F9B"}
@@ -0,0 +1,109 @@
1
+ import { getAllThoughts, insertThought, archiveThoughts, updateThoughtTier } from "../db/store.js";
2
+ import { vectorSearch } from "../db/search.js";
3
+ import { RulesExtractor } from "../extraction/rules.js";
4
+ const SIMILARITY_THRESHOLD = 0.88;
5
+ const MIN_GROUP_SIZE = 3;
6
+ const STALE_DAYS = 30;
7
+ /** Cosine similarity between two Float32Arrays */
8
+ function cosineSim(a, b) {
9
+ let dot = 0, normA = 0, normB = 0;
10
+ for (let i = 0; i < a.length; i++) {
11
+ dot += a[i] * b[i];
12
+ normA += a[i] * a[i];
13
+ normB += b[i] * b[i];
14
+ }
15
+ return dot / (Math.sqrt(normA) * Math.sqrt(normB) + 1e-8);
16
+ }
17
+ /** Summarise a group of thoughts into one representative sentence */
18
+ function summariseGroup(thoughts) {
19
+ // Heuristic: pick the longest thought as the base, then append unique topics
20
+ const base = [...thoughts].sort((a, b) => b.text.length - a.text.length)[0];
21
+ const allTopics = [...new Set(thoughts.flatMap(t => t.topics))].slice(0, 5);
22
+ const topicSuffix = allTopics.length > 0 ? ` [Topics: ${allTopics.join(", ")}]` : "";
23
+ return base.text.trim() + topicSuffix;
24
+ }
25
+ export async function consolidateMemories(db, embedder, opts = {}) {
26
+ const dry = opts.dry_run ?? false;
27
+ const since = new Date(Date.now() - (opts.days ?? 7) * 86400_000).toISOString();
28
+ // 1. Get recent working thoughts
29
+ const thoughts = getAllThoughts(db, { tier: "working", since });
30
+ if (thoughts.length < MIN_GROUP_SIZE) {
31
+ return { merged: 0, promoted: 0, archived: 0, groups: [] };
32
+ }
33
+ // 2. Embed all thoughts (batch)
34
+ const embeddings = await Promise.all(thoughts.map(t => embedder.embed(t.text)));
35
+ // 3. Greedy grouping by similarity
36
+ const used = new Set();
37
+ const groups = [];
38
+ for (let i = 0; i < thoughts.length; i++) {
39
+ if (used.has(i))
40
+ continue;
41
+ const group = [i];
42
+ for (let j = i + 1; j < thoughts.length; j++) {
43
+ if (used.has(j))
44
+ continue;
45
+ if (cosineSim(embeddings[i], embeddings[j]) >= SIMILARITY_THRESHOLD) {
46
+ group.push(j);
47
+ used.add(j);
48
+ }
49
+ }
50
+ if (group.length >= MIN_GROUP_SIZE) {
51
+ group.forEach(idx => used.add(idx));
52
+ groups.push({ indices: group });
53
+ }
54
+ }
55
+ const extractor = new RulesExtractor();
56
+ const mergedGroups = [];
57
+ let mergedCount = 0;
58
+ let archivedCount = 0;
59
+ // 4. Merge each group
60
+ for (const group of groups) {
61
+ const groupThoughts = group.indices.map(i => thoughts[i]);
62
+ const summary = summariseGroup(groupThoughts);
63
+ const sourceIds = groupThoughts.map(t => t.id);
64
+ if (!dry) {
65
+ const metadata = extractor.extract(summary);
66
+ metadata.type = "insight";
67
+ const embedding = await embedder.embed(summary);
68
+ insertThought(db, summary, embedding, {
69
+ ...metadata,
70
+ tier: "long_term",
71
+ consolidated_from: sourceIds,
72
+ source: "consolidation",
73
+ });
74
+ archivedCount += archiveThoughts(db, sourceIds);
75
+ mergedCount++;
76
+ }
77
+ mergedGroups.push({ summary, source_ids: sourceIds });
78
+ }
79
+ // 5. Promote well-connected non-grouped working thoughts → long_term
80
+ const staleDate = new Date(Date.now() - STALE_DAYS * 86400_000).toISOString();
81
+ const staleThoughts = getAllThoughts(db, { tier: "working" }).filter(t => t.created_at < staleDate);
82
+ let promotedCount = 0;
83
+ for (const t of staleThoughts) {
84
+ if (!dry) {
85
+ // Check if this thought has semantic neighbours (suggests it's important)
86
+ const emb = await embedder.embed(t.text);
87
+ const neighbours = vectorSearch(db, emb, { limit: 3 });
88
+ const hasNeighbours = neighbours.filter(n => n.thought.id !== t.id && n.score > 0.75).length >= 2;
89
+ if (hasNeighbours) {
90
+ updateThoughtTier(db, t.id, "long_term");
91
+ promotedCount++;
92
+ }
93
+ else {
94
+ archiveThoughts(db, [t.id]);
95
+ archivedCount++;
96
+ }
97
+ }
98
+ else {
99
+ promotedCount++; // dry-run estimate
100
+ }
101
+ }
102
+ return {
103
+ merged: mergedCount,
104
+ promoted: promotedCount,
105
+ archived: archivedCount,
106
+ groups: mergedGroups,
107
+ };
108
+ }
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/consolidation/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAwC9D"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAsD9D"}
package/dist/db/schema.js CHANGED
@@ -16,6 +16,8 @@ export function initDatabase(dbPath) {
16
16
  topics TEXT NOT NULL DEFAULT '[]',
17
17
  actions TEXT NOT NULL DEFAULT '[]',
18
18
  sentiment TEXT NOT NULL DEFAULT 'neutral',
19
+ tier TEXT NOT NULL DEFAULT 'working',
20
+ consolidated_from TEXT NOT NULL DEFAULT '[]',
19
21
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
20
22
  updated_at TEXT NOT NULL DEFAULT (datetime('now'))
21
23
  );
@@ -23,6 +25,16 @@ export function initDatabase(dbPath) {
23
25
  CREATE INDEX IF NOT EXISTS idx_thoughts_type ON thoughts(type);
24
26
  CREATE INDEX IF NOT EXISTS idx_thoughts_created ON thoughts(created_at);
25
27
  `);
28
+ // v0.2 migration: add tier + consolidated_from columns if they don't exist
29
+ const cols = db.prepare("PRAGMA table_info(thoughts)").all().map(c => c.name);
30
+ if (!cols.includes("tier")) {
31
+ db.exec("ALTER TABLE thoughts ADD COLUMN tier TEXT NOT NULL DEFAULT 'working'");
32
+ }
33
+ if (!cols.includes("consolidated_from")) {
34
+ db.exec("ALTER TABLE thoughts ADD COLUMN consolidated_from TEXT NOT NULL DEFAULT '[]'");
35
+ }
36
+ // Create tier index after migration (column guaranteed to exist)
37
+ db.exec("CREATE INDEX IF NOT EXISTS idx_thoughts_tier ON thoughts(tier)");
26
38
  // Create virtual table for vector search if it doesn't exist
27
39
  const vtableExists = db
28
40
  .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='thought_vectors'")
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,mBAAmB;AAErD,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;GAiBP,CAAC,CAAC;IAEH,6DAA6D;IAC7D,MAAM,YAAY,GAAG,EAAE;SACpB,OAAO,CACN,8EAA8E,CAC/E;SACA,GAAG,EAAE,CAAC;IAET,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,IAAI,CAAC;;0BAEc,aAAa;;KAElC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,mBAAmB;AAErD,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;GAmBP,CAAC,CAAC;IAEH,2EAA2E;IAC3E,MAAM,IAAI,GAAI,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxC,EAAE,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IAC1F,CAAC;IAED,iEAAiE;IACjE,EAAE,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAE1E,6DAA6D;IAC7D,MAAM,YAAY,GAAG,EAAE;SACpB,OAAO,CACN,8EAA8E,CAC/E;SACA,GAAG,EAAE,CAAC;IAET,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,IAAI,CAAC;;0BAEc,aAAa;;KAElC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/db/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAe1C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,YAAY,EAC5B,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,YAAY,EAAE,CA+ChB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/db/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAiB1C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,YAAY,EAC5B,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,YAAY,EAAE,CAiDhB"}
package/dist/db/search.js CHANGED
@@ -25,9 +25,11 @@ export function vectorSearch(db, queryEmbedding, opts) {
25
25
  results.push({
26
26
  thought: {
27
27
  ...row,
28
+ tier: (row.tier ?? "working"),
28
29
  people: JSON.parse(row.people),
29
30
  topics: JSON.parse(row.topics),
30
31
  actions: JSON.parse(row.actions),
32
+ consolidated_from: JSON.parse(row.consolidated_from ?? "[]"),
31
33
  },
32
34
  distance: vr.distance,
33
35
  score: Math.round(Math.max(0, 1 / (1 + vr.distance)) * 100) / 100,
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/db/search.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,YAAY,CAC1B,EAAqB,EACrB,cAA4B,EAC5B,IAIC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAE9B,0CAA0C;IAC1C,MAAM,UAAU,GAAG,EAAE;SAClB,OAAO,CACN;;;;eAIS,CACV;SACA,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAGjD,CAAC;IAEJ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,wCAAwC,CAAC;aACjD,GAAG,CAAC,EAAE,CAAC,KAAK,CAA2B,CAAC;QAE3C,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,gBAAgB;QAChB,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK;YAAE,SAAS;QACxD,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,SAAS;QAElD,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE;gBACP,GAAG,GAAG;gBACN,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAa;gBAC1C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAa;gBAC1C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAa;aAC7C;YACD,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;SAClE,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;IACrC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/db/search.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,YAAY,CAC1B,EAAqB,EACrB,cAA4B,EAC5B,IAIC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAE9B,0CAA0C;IAC1C,MAAM,UAAU,GAAG,EAAE;SAClB,OAAO,CACN;;;;eAIS,CACV;SACA,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAGjD,CAAC;IAEJ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,wCAAwC,CAAC;aACjD,GAAG,CAAC,EAAE,CAAC,KAAK,CAA2B,CAAC;QAE3C,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,gBAAgB;QAChB,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK;YAAE,SAAS;QACxD,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,SAAS;QAElD,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE;gBACP,GAAG,GAAG;gBACN,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAqC;gBACjE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAa;gBAC1C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAa;gBAC1C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAa;gBAC5C,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAa;aACzE;YACD,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;SAClE,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;IACrC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type Database from "better-sqlite3";
2
+ export type ThoughtTier = "working" | "long_term" | "archived";
2
3
  export interface Thought {
3
4
  id: string;
4
5
  text: string;
@@ -8,6 +9,8 @@ export interface Thought {
8
9
  topics: string[];
9
10
  actions: string[];
10
11
  sentiment: string;
12
+ tier: ThoughtTier;
13
+ consolidated_from: string[];
11
14
  created_at: string;
12
15
  updated_at: string;
13
16
  }
@@ -18,7 +21,15 @@ export declare function insertThought(db: Database.Database, text: string, embed
18
21
  topics?: string[];
19
22
  actions?: string[];
20
23
  sentiment?: string;
24
+ tier?: ThoughtTier;
25
+ consolidated_from?: string[];
21
26
  }): Thought;
27
+ export declare function updateThoughtTier(db: Database.Database, id: string, tier: ThoughtTier): boolean;
28
+ export declare function archiveThoughts(db: Database.Database, ids: string[]): number;
29
+ export declare function getAllThoughts(db: Database.Database, opts?: {
30
+ tier?: ThoughtTier | "active";
31
+ since?: string;
32
+ }): Thought[];
22
33
  export declare function getThought(db: Database.Database, id: string): Thought | null;
23
34
  export declare function deleteThought(db: Database.Database, id: string): boolean;
24
35
  export declare function getRecentThoughts(db: Database.Database, opts: {
@@ -27,6 +38,7 @@ export declare function getRecentThoughts(db: Database.Database, opts: {
27
38
  topic?: string;
28
39
  person?: string;
29
40
  limit?: number;
41
+ tier?: ThoughtTier | "active";
30
42
  }): Thought[];
31
43
  export declare function getStats(db: Database.Database, period: "week" | "month" | "all"): {
32
44
  total: number;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/db/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAwBD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,EACvB,QAAQ,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAqCT;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,GAAG,IAAI,CAKhB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAOxE;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,EAAE,CAgCX;AAED,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAC/B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB,CAyDA"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/db/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AA4BD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,EACvB,QAAQ,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GACA,OAAO,CA2CT;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,WAAW,GAChB,OAAO,CAMT;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAW5E;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3D,OAAO,EAAE,CAoBX;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,GAAG,IAAI,CAKhB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAOxE;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;CAC/B,GACA,OAAO,EAAE,CA0CX;AAED,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAC/B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB,CAyDA"}