@hyperlynq/synaptic 0.8.1 → 0.9.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.
- package/README.md +37 -13
- package/build/src/cli/sync.d.ts +10 -0
- package/build/src/cli/sync.js +170 -0
- package/build/src/cli/sync.js.map +1 -0
- package/build/src/cli.js +5 -0
- package/build/src/cli.js.map +1 -1
- package/build/src/hooks/session-start.js +17 -1
- package/build/src/hooks/session-start.js.map +1 -1
- package/build/src/hooks/stop.js +124 -24
- package/build/src/hooks/stop.js.map +1 -1
- package/build/src/server.js +4 -0
- package/build/src/server.js.map +1 -1
- package/build/src/storage/embedder.d.ts +11 -0
- package/build/src/storage/embedder.js +41 -0
- package/build/src/storage/embedder.js.map +1 -1
- package/build/src/storage/paths.d.ts +2 -0
- package/build/src/storage/paths.js +3 -0
- package/build/src/storage/paths.js.map +1 -1
- package/build/src/storage/signals.d.ts +13 -0
- package/build/src/storage/signals.js +73 -0
- package/build/src/storage/signals.js.map +1 -0
- package/build/src/storage/sqlite.d.ts +2 -0
- package/build/src/storage/sqlite.js +16 -8
- package/build/src/storage/sqlite.js.map +1 -1
- package/build/src/storage/sync-background.d.ts +16 -0
- package/build/src/storage/sync-background.js +48 -0
- package/build/src/storage/sync-background.js.map +1 -0
- package/build/src/storage/sync.d.ts +40 -0
- package/build/src/storage/sync.js +339 -0
- package/build/src/storage/sync.js.map +1 -0
- package/build/src/tools/context-search.js +2 -1
- package/build/src/tools/context-search.js.map +1 -1
- package/build/src/tools/context-status.d.ts +9 -0
- package/build/src/tools/context-status.js +12 -1
- package/build/src/tools/context-status.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background sync scheduler.
|
|
3
|
+
* Runs push/pull every 2 minutes while the MCP server is active.
|
|
4
|
+
*/
|
|
5
|
+
import { syncCycle, isSyncEnabled } from "./sync.js";
|
|
6
|
+
const SYNC_INTERVAL_MS = 2 * 60 * 1000; // 2 minutes
|
|
7
|
+
export class SyncScheduler {
|
|
8
|
+
index;
|
|
9
|
+
embedder;
|
|
10
|
+
timer = null;
|
|
11
|
+
running = false;
|
|
12
|
+
constructor(index, embedder) {
|
|
13
|
+
this.index = index;
|
|
14
|
+
this.embedder = embedder;
|
|
15
|
+
}
|
|
16
|
+
start() {
|
|
17
|
+
if (this.timer)
|
|
18
|
+
return;
|
|
19
|
+
if (!isSyncEnabled())
|
|
20
|
+
return;
|
|
21
|
+
this.timer = setInterval(() => this.tick(), SYNC_INTERVAL_MS);
|
|
22
|
+
this.timer.unref(); // don't keep process alive
|
|
23
|
+
}
|
|
24
|
+
stop() {
|
|
25
|
+
if (this.timer) {
|
|
26
|
+
clearInterval(this.timer);
|
|
27
|
+
this.timer = null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async tick() {
|
|
31
|
+
if (this.running)
|
|
32
|
+
return; // skip if previous tick is still in progress
|
|
33
|
+
this.running = true;
|
|
34
|
+
try {
|
|
35
|
+
const result = await syncCycle(this.index, this.embedder);
|
|
36
|
+
if (result.error) {
|
|
37
|
+
process.stderr.write(`[synaptic-sync] ${result.error}\n`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
process.stderr.write(`[synaptic-sync] tick error: ${err}\n`);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
this.running = false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=sync-background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-background.js","sourceRoot":"","sources":["../../../src/storage/sync-background.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAIrD,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEpD,MAAM,OAAO,aAAa;IAKd;IACA;IALF,KAAK,GAA0C,IAAI,CAAC;IACpD,OAAO,GAAG,KAAK,CAAC;IAExB,YACU,KAAmB,EACnB,QAAkB;QADlB,UAAK,GAAL,KAAK,CAAc;QACnB,aAAQ,GAAR,QAAQ,CAAU;IACzB,CAAC;IAEJ,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,aAAa,EAAE;YAAE,OAAO;QAE7B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,2BAA2B;IACjD,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,6CAA6C;QACvE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub-based context sync engine.
|
|
3
|
+
*
|
|
4
|
+
* Each machine writes to its own JSONL file (entries/{machineId}.jsonl).
|
|
5
|
+
* Entry IDs are globally unique → dedup is a simple ID check.
|
|
6
|
+
* Embeddings are NOT synced — regenerated locally on pull.
|
|
7
|
+
*/
|
|
8
|
+
import type { ContextIndex } from "./sqlite.js";
|
|
9
|
+
import type { Embedder } from "./embedder.js";
|
|
10
|
+
export interface SyncConfig {
|
|
11
|
+
machineId: string;
|
|
12
|
+
machineName: string;
|
|
13
|
+
repoName: string;
|
|
14
|
+
repoOwner: string;
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface SyncState {
|
|
18
|
+
config: SyncConfig;
|
|
19
|
+
lastPushAt: string | null;
|
|
20
|
+
lastPullAt: string | null;
|
|
21
|
+
remoteCursors: Record<string, number>;
|
|
22
|
+
}
|
|
23
|
+
export declare function readSyncState(): SyncState | null;
|
|
24
|
+
export declare function writeSyncState(state: SyncState): void;
|
|
25
|
+
export declare function isSyncEnabled(): boolean;
|
|
26
|
+
export declare function pushEntries(index: ContextIndex, state: SyncState): Promise<{
|
|
27
|
+
pushed: number;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function pullEntries(index: ContextIndex, embedder: Embedder, state: SyncState): Promise<{
|
|
30
|
+
pulled: number;
|
|
31
|
+
machines: string[];
|
|
32
|
+
}>;
|
|
33
|
+
export declare function syncCycle(index: ContextIndex, embedder: Embedder): Promise<{
|
|
34
|
+
pushed: number;
|
|
35
|
+
pulled: number;
|
|
36
|
+
error?: string;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function ensureSyncRepo(owner: string, repoName: string): Promise<void>;
|
|
39
|
+
export declare function registerMachine(owner: string, repoName: string, machineId: string, machineName: string): Promise<void>;
|
|
40
|
+
export declare function getGhUsername(): Promise<string>;
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub-based context sync engine.
|
|
3
|
+
*
|
|
4
|
+
* Each machine writes to its own JSONL file (entries/{machineId}.jsonl).
|
|
5
|
+
* Entry IDs are globally unique → dedup is a simple ID check.
|
|
6
|
+
* Embeddings are NOT synced — regenerated locally on pull.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
9
|
+
import { execFile } from "node:child_process";
|
|
10
|
+
import { promisify } from "node:util";
|
|
11
|
+
import { SYNC_STATE_PATH, SYNC_DIR } from "./paths.js";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
14
|
+
const GH_TIMEOUT = 15_000; // 15s for each gh call
|
|
15
|
+
// --- State management ---
|
|
16
|
+
export function readSyncState() {
|
|
17
|
+
try {
|
|
18
|
+
if (!existsSync(SYNC_STATE_PATH))
|
|
19
|
+
return null;
|
|
20
|
+
const raw = readFileSync(SYNC_STATE_PATH, "utf-8");
|
|
21
|
+
return JSON.parse(raw);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function writeSyncState(state) {
|
|
28
|
+
writeFileSync(SYNC_STATE_PATH, JSON.stringify(state, null, 2), "utf-8");
|
|
29
|
+
}
|
|
30
|
+
export function isSyncEnabled() {
|
|
31
|
+
const state = readSyncState();
|
|
32
|
+
if (!state?.config.enabled)
|
|
33
|
+
return false;
|
|
34
|
+
// Check gh is available
|
|
35
|
+
try {
|
|
36
|
+
const { execFileSync } = require("node:child_process");
|
|
37
|
+
execFileSync("gh", ["auth", "status"], { timeout: 5000, stdio: "pipe" });
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// --- GitHub helpers ---
|
|
45
|
+
async function execGh(args) {
|
|
46
|
+
const { stdout } = await execFileAsync("gh", args, {
|
|
47
|
+
timeout: GH_TIMEOUT,
|
|
48
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB for large JSONL files
|
|
49
|
+
});
|
|
50
|
+
return stdout;
|
|
51
|
+
}
|
|
52
|
+
function repoSlug(state) {
|
|
53
|
+
return `${state.config.repoOwner}/${state.config.repoName}`;
|
|
54
|
+
}
|
|
55
|
+
// --- Push ---
|
|
56
|
+
export async function pushEntries(index, state) {
|
|
57
|
+
const { machineId } = state.config;
|
|
58
|
+
const remotePath = `entries/${machineId}.jsonl`;
|
|
59
|
+
const localCache = join(SYNC_DIR, `${machineId}.jsonl`);
|
|
60
|
+
// Query entries newer than lastPushAt
|
|
61
|
+
const allEntries = state.lastPushAt
|
|
62
|
+
? index.list({ includeArchived: false }).filter(e => {
|
|
63
|
+
const entryTs = new Date(`${e.date}T${e.time}:00`).toISOString();
|
|
64
|
+
return entryTs > state.lastPushAt;
|
|
65
|
+
})
|
|
66
|
+
: index.list({ includeArchived: false });
|
|
67
|
+
if (allEntries.length === 0) {
|
|
68
|
+
return { pushed: 0 };
|
|
69
|
+
}
|
|
70
|
+
// Convert to syncable format
|
|
71
|
+
const newLines = allEntries.map(e => JSON.stringify(toSyncable(e)));
|
|
72
|
+
// Read existing local cache (to append)
|
|
73
|
+
let existingContent = "";
|
|
74
|
+
if (existsSync(localCache)) {
|
|
75
|
+
existingContent = readFileSync(localCache, "utf-8");
|
|
76
|
+
}
|
|
77
|
+
// Deduplicate: parse existing IDs from cache
|
|
78
|
+
const existingIds = new Set();
|
|
79
|
+
if (existingContent) {
|
|
80
|
+
for (const line of existingContent.split("\n")) {
|
|
81
|
+
if (!line.trim())
|
|
82
|
+
continue;
|
|
83
|
+
try {
|
|
84
|
+
const parsed = JSON.parse(line);
|
|
85
|
+
existingIds.add(parsed.id);
|
|
86
|
+
}
|
|
87
|
+
catch { /* skip corrupt lines */ }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Only append truly new entries
|
|
91
|
+
const deduped = newLines.filter(line => {
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(line);
|
|
94
|
+
return !existingIds.has(parsed.id);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
if (deduped.length === 0) {
|
|
101
|
+
return { pushed: 0 };
|
|
102
|
+
}
|
|
103
|
+
const updatedContent = existingContent + deduped.join("\n") + "\n";
|
|
104
|
+
// Write local cache
|
|
105
|
+
writeFileSync(localCache, updatedContent, "utf-8");
|
|
106
|
+
// Upload to GitHub
|
|
107
|
+
const contentB64 = Buffer.from(updatedContent).toString("base64");
|
|
108
|
+
// Get current file SHA (if exists) for update
|
|
109
|
+
let sha;
|
|
110
|
+
try {
|
|
111
|
+
const fileInfo = await execGh([
|
|
112
|
+
"api", `repos/${repoSlug(state)}/contents/${remotePath}`,
|
|
113
|
+
"--jq", ".sha",
|
|
114
|
+
]);
|
|
115
|
+
sha = fileInfo.trim();
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// File doesn't exist yet — will create
|
|
119
|
+
}
|
|
120
|
+
const body = {
|
|
121
|
+
message: `sync: ${machineId} +${deduped.length} entries`,
|
|
122
|
+
content: contentB64,
|
|
123
|
+
};
|
|
124
|
+
if (sha)
|
|
125
|
+
body.sha = sha;
|
|
126
|
+
await execGh([
|
|
127
|
+
"api", `repos/${repoSlug(state)}/contents/${remotePath}`,
|
|
128
|
+
"-X", "PUT",
|
|
129
|
+
"-f", `message=${body.message}`,
|
|
130
|
+
"-f", `content=${body.content}`,
|
|
131
|
+
...(sha ? ["-f", `sha=${sha}`] : []),
|
|
132
|
+
]);
|
|
133
|
+
// Update state
|
|
134
|
+
state.lastPushAt = new Date().toISOString();
|
|
135
|
+
writeSyncState(state);
|
|
136
|
+
return { pushed: deduped.length };
|
|
137
|
+
}
|
|
138
|
+
// --- Pull ---
|
|
139
|
+
export async function pullEntries(index, embedder, state) {
|
|
140
|
+
const { machineId } = state.config;
|
|
141
|
+
let totalPulled = 0;
|
|
142
|
+
const machinesSeen = [];
|
|
143
|
+
// List remote entry files
|
|
144
|
+
let remoteFiles;
|
|
145
|
+
try {
|
|
146
|
+
const raw = await execGh([
|
|
147
|
+
"api", `repos/${repoSlug(state)}/contents/entries`,
|
|
148
|
+
"--jq", "[.[] | {name: .name}]",
|
|
149
|
+
]);
|
|
150
|
+
remoteFiles = JSON.parse(raw);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// entries/ dir doesn't exist yet
|
|
154
|
+
return { pulled: 0, machines: [] };
|
|
155
|
+
}
|
|
156
|
+
for (const file of remoteFiles) {
|
|
157
|
+
// Skip our own file
|
|
158
|
+
const remoteMachineId = file.name.replace(".jsonl", "");
|
|
159
|
+
if (remoteMachineId === machineId)
|
|
160
|
+
continue;
|
|
161
|
+
machinesSeen.push(remoteMachineId);
|
|
162
|
+
// Download file content
|
|
163
|
+
let content;
|
|
164
|
+
try {
|
|
165
|
+
const raw = await execGh([
|
|
166
|
+
"api", `repos/${repoSlug(state)}/contents/entries/${file.name}`,
|
|
167
|
+
"--jq", ".content",
|
|
168
|
+
]);
|
|
169
|
+
content = Buffer.from(raw.trim(), "base64").toString("utf-8");
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
continue; // skip this machine's file
|
|
173
|
+
}
|
|
174
|
+
const lines = content.split("\n").filter(l => l.trim());
|
|
175
|
+
const cursor = state.remoteCursors[remoteMachineId] ?? 0;
|
|
176
|
+
// Skip already-processed lines
|
|
177
|
+
const newLines = lines.slice(cursor);
|
|
178
|
+
if (newLines.length === 0)
|
|
179
|
+
continue;
|
|
180
|
+
for (const line of newLines) {
|
|
181
|
+
let entry;
|
|
182
|
+
try {
|
|
183
|
+
entry = JSON.parse(line);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
continue; // skip corrupt line
|
|
187
|
+
}
|
|
188
|
+
// Dedup check
|
|
189
|
+
if (index.hasEntry(entry.id))
|
|
190
|
+
continue;
|
|
191
|
+
// Insert entry
|
|
192
|
+
const contextEntry = fromSyncable(entry);
|
|
193
|
+
const rowid = index.insert(contextEntry);
|
|
194
|
+
// Generate embedding locally
|
|
195
|
+
try {
|
|
196
|
+
const embedding = await embedder.embed(contextEntry.content);
|
|
197
|
+
index.insertVec(rowid, embedding);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Embedding failure is non-fatal
|
|
201
|
+
}
|
|
202
|
+
totalPulled++;
|
|
203
|
+
}
|
|
204
|
+
// Update cursor
|
|
205
|
+
state.remoteCursors[remoteMachineId] = lines.length;
|
|
206
|
+
}
|
|
207
|
+
// Update state
|
|
208
|
+
state.lastPullAt = new Date().toISOString();
|
|
209
|
+
writeSyncState(state);
|
|
210
|
+
return { pulled: totalPulled, machines: machinesSeen };
|
|
211
|
+
}
|
|
212
|
+
// --- Full sync cycle ---
|
|
213
|
+
export async function syncCycle(index, embedder) {
|
|
214
|
+
const state = readSyncState();
|
|
215
|
+
if (!state?.config.enabled) {
|
|
216
|
+
return { pushed: 0, pulled: 0, error: "sync not enabled" };
|
|
217
|
+
}
|
|
218
|
+
let pushed = 0;
|
|
219
|
+
let pulled = 0;
|
|
220
|
+
try {
|
|
221
|
+
const pushResult = await pushEntries(index, state);
|
|
222
|
+
pushed = pushResult.pushed;
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
return { pushed: 0, pulled: 0, error: `push failed: ${err}` };
|
|
226
|
+
}
|
|
227
|
+
// Re-read state after push (it was updated)
|
|
228
|
+
const freshState = readSyncState();
|
|
229
|
+
if (!freshState) {
|
|
230
|
+
return { pushed, pulled: 0, error: "state lost after push" };
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const pullResult = await pullEntries(index, embedder, freshState);
|
|
234
|
+
pulled = pullResult.pulled;
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
return { pushed, pulled: 0, error: `pull failed: ${err}` };
|
|
238
|
+
}
|
|
239
|
+
return { pushed, pulled };
|
|
240
|
+
}
|
|
241
|
+
// --- Init helpers ---
|
|
242
|
+
export async function ensureSyncRepo(owner, repoName) {
|
|
243
|
+
// Check if repo exists
|
|
244
|
+
try {
|
|
245
|
+
await execGh(["repo", "view", `${owner}/${repoName}`, "--json", "name"]);
|
|
246
|
+
return; // already exists
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// Doesn't exist — create it
|
|
250
|
+
}
|
|
251
|
+
await execGh([
|
|
252
|
+
"repo", "create", `${owner}/${repoName}`,
|
|
253
|
+
"--private",
|
|
254
|
+
"--description", "Synaptic context sync (auto-managed)",
|
|
255
|
+
]);
|
|
256
|
+
// Create manifest.json
|
|
257
|
+
const manifest = JSON.stringify({ version: 1, machines: {} }, null, 2);
|
|
258
|
+
const manifestB64 = Buffer.from(manifest).toString("base64");
|
|
259
|
+
await execGh([
|
|
260
|
+
"api", `repos/${owner}/${repoName}/contents/manifest.json`,
|
|
261
|
+
"-X", "PUT",
|
|
262
|
+
"-f", "message=init: create manifest",
|
|
263
|
+
"-f", `content=${manifestB64}`,
|
|
264
|
+
]);
|
|
265
|
+
// Create entries/ directory with .gitkeep
|
|
266
|
+
const gitkeepB64 = Buffer.from("").toString("base64");
|
|
267
|
+
await execGh([
|
|
268
|
+
"api", `repos/${owner}/${repoName}/contents/entries/.gitkeep`,
|
|
269
|
+
"-X", "PUT",
|
|
270
|
+
"-f", "message=init: create entries directory",
|
|
271
|
+
"-f", `content=${gitkeepB64}`,
|
|
272
|
+
]);
|
|
273
|
+
}
|
|
274
|
+
export async function registerMachine(owner, repoName, machineId, machineName) {
|
|
275
|
+
// Get current manifest
|
|
276
|
+
let manifest;
|
|
277
|
+
let sha;
|
|
278
|
+
try {
|
|
279
|
+
const raw = await execGh([
|
|
280
|
+
"api", `repos/${owner}/${repoName}/contents/manifest.json`,
|
|
281
|
+
"--jq", "{content: .content, sha: .sha}",
|
|
282
|
+
]);
|
|
283
|
+
const parsed = JSON.parse(raw);
|
|
284
|
+
sha = parsed.sha;
|
|
285
|
+
manifest = JSON.parse(Buffer.from(parsed.content, "base64").toString("utf-8"));
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
manifest = { version: 1, machines: {} };
|
|
289
|
+
sha = "";
|
|
290
|
+
}
|
|
291
|
+
manifest.machines[machineId] = { name: machineName };
|
|
292
|
+
const contentB64 = Buffer.from(JSON.stringify(manifest, null, 2)).toString("base64");
|
|
293
|
+
const args = [
|
|
294
|
+
"api", `repos/${owner}/${repoName}/contents/manifest.json`,
|
|
295
|
+
"-X", "PUT",
|
|
296
|
+
"-f", "message=sync: register machine " + machineName,
|
|
297
|
+
"-f", `content=${contentB64}`,
|
|
298
|
+
];
|
|
299
|
+
if (sha)
|
|
300
|
+
args.push("-f", `sha=${sha}`);
|
|
301
|
+
await execGh(args);
|
|
302
|
+
}
|
|
303
|
+
export async function getGhUsername() {
|
|
304
|
+
const raw = await execGh(["api", "user", "--jq", ".login"]);
|
|
305
|
+
return raw.trim();
|
|
306
|
+
}
|
|
307
|
+
// --- Conversion helpers ---
|
|
308
|
+
function toSyncable(entry) {
|
|
309
|
+
return {
|
|
310
|
+
id: entry.id,
|
|
311
|
+
date: entry.date,
|
|
312
|
+
time: entry.time,
|
|
313
|
+
type: entry.type,
|
|
314
|
+
tags: entry.tags,
|
|
315
|
+
content: entry.content,
|
|
316
|
+
tier: entry.tier ?? "working",
|
|
317
|
+
pinned: entry.pinned ?? false,
|
|
318
|
+
project: entry.project ?? null,
|
|
319
|
+
sessionId: entry.sessionId ?? null,
|
|
320
|
+
agentId: entry.agentId ?? null,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
function fromSyncable(s) {
|
|
324
|
+
return {
|
|
325
|
+
id: s.id,
|
|
326
|
+
date: s.date,
|
|
327
|
+
time: s.time,
|
|
328
|
+
type: s.type,
|
|
329
|
+
tags: s.tags,
|
|
330
|
+
content: s.content,
|
|
331
|
+
sourceFile: "sync",
|
|
332
|
+
tier: s.tier,
|
|
333
|
+
pinned: s.pinned,
|
|
334
|
+
project: s.project,
|
|
335
|
+
sessionId: s.sessionId,
|
|
336
|
+
agentId: s.agentId,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/storage/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,8 +34,9 @@ export const contextSearchSchema = {
|
|
|
34
34
|
.describe("Search mode: fast (BM25 keyword only), semantic (vector only), hybrid (both). Auto-detects if omitted."),
|
|
35
35
|
};
|
|
36
36
|
function autoDetectMode(query) {
|
|
37
|
+
// Only single-word ID-like queries (labels, exact keys) use BM25-only
|
|
37
38
|
const words = query.trim().split(/\s+/);
|
|
38
|
-
if (words.length
|
|
39
|
+
if (words.length === 1 && /^[a-z0-9_-]+$/i.test(words[0]))
|
|
39
40
|
return "fast";
|
|
40
41
|
return "hybrid";
|
|
41
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-search.js","sourceRoot":"","sources":["../../../src/tools/context-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IACzF,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;SAChG,QAAQ,EAAE;SACV,QAAQ,CAAC,sBAAsB,CAAC;IACnC,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;IACnD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,2BAA2B,CAAC;IACxC,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SAC1C,QAAQ,EAAE;SACV,QAAQ,CAAC,wCAAwC,CAAC;IACrD,gBAAgB,EAAE,CAAC;SAChB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,qCAAqC,CAAC;IAClD,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;SACpC,QAAQ,EAAE;SACV,QAAQ,CAAC,wGAAwG,CAAC;CACtH,CAAC;AAEF,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"context-search.js","sourceRoot":"","sources":["../../../src/tools/context-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,4 +10,13 @@ export declare function contextStatus(index: ContextIndex): {
|
|
|
10
10
|
tierDistribution: Record<string, number>;
|
|
11
11
|
archivedCount: number;
|
|
12
12
|
activePatterns: number;
|
|
13
|
+
sync: {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
machineId: string | null;
|
|
16
|
+
machineName: string | null;
|
|
17
|
+
repo: string | null;
|
|
18
|
+
lastPushAt: string | null;
|
|
19
|
+
lastPullAt: string | null;
|
|
20
|
+
knownMachines: number;
|
|
21
|
+
};
|
|
13
22
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readSyncState } from "../storage/sync.js";
|
|
1
2
|
export function contextStatus(index) {
|
|
2
3
|
const stats = index.status();
|
|
3
4
|
let dbSizeHuman;
|
|
@@ -10,6 +11,16 @@ export function contextStatus(index) {
|
|
|
10
11
|
else {
|
|
11
12
|
dbSizeHuman = `${(stats.dbSizeBytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
+
const syncState = readSyncState();
|
|
15
|
+
const sync = {
|
|
16
|
+
enabled: syncState?.config.enabled ?? false,
|
|
17
|
+
machineId: syncState?.config.machineId ?? null,
|
|
18
|
+
machineName: syncState?.config.machineName ?? null,
|
|
19
|
+
repo: syncState ? `${syncState.config.repoOwner}/${syncState.config.repoName}` : null,
|
|
20
|
+
lastPushAt: syncState?.lastPushAt ?? null,
|
|
21
|
+
lastPullAt: syncState?.lastPullAt ?? null,
|
|
22
|
+
knownMachines: syncState ? Object.keys(syncState.remoteCursors).length : 0,
|
|
23
|
+
};
|
|
24
|
+
return { ...stats, dbSizeHuman, sync };
|
|
14
25
|
}
|
|
15
26
|
//# sourceMappingURL=context-status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-status.js","sourceRoot":"","sources":["../../../src/tools/context-status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context-status.js","sourceRoot":"","sources":["../../../src/tools/context-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,aAAa,CAAC,KAAmB;IAkB/C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAE7B,IAAI,WAAmB,CAAC;IACxB,IAAI,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC;QAC7B,WAAW,GAAG,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC;IACzC,CAAC;SAAM,IAAI,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QAC3C,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;QAC3C,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;QAC9C,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;QAClD,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QACrF,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,IAAI;QACzC,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,IAAI;QACzC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KAC3E,CAAC;IAEF,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
package/package.json
CHANGED