backpack-ontology 0.7.6 → 0.7.8

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 (56) hide show
  1. package/dist/bin/backpack-sync.js +243 -65
  2. package/dist/bin/backpack-sync.js.map +1 -1
  3. package/dist/bin/backpack.js +7 -0
  4. package/dist/bin/backpack.js.map +1 -1
  5. package/dist/core/backpack.d.ts +7 -0
  6. package/dist/core/backpack.d.ts.map +1 -1
  7. package/dist/core/backpack.js +17 -0
  8. package/dist/core/backpack.js.map +1 -1
  9. package/dist/core/signal-detectors.d.ts +12 -0
  10. package/dist/core/signal-detectors.d.ts.map +1 -0
  11. package/dist/core/signal-detectors.js +591 -0
  12. package/dist/core/signal-detectors.js.map +1 -0
  13. package/dist/core/signal-store.d.ts +23 -0
  14. package/dist/core/signal-store.d.ts.map +1 -0
  15. package/dist/core/signal-store.js +179 -0
  16. package/dist/core/signal-store.js.map +1 -0
  17. package/dist/core/signal-types.d.ts +71 -0
  18. package/dist/core/signal-types.d.ts.map +1 -0
  19. package/dist/core/signal-types.js +12 -0
  20. package/dist/core/signal-types.js.map +1 -0
  21. package/dist/index.d.ts +5 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +5 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/server.d.ts.map +1 -1
  26. package/dist/mcp/server.js +5 -1
  27. package/dist/mcp/server.js.map +1 -1
  28. package/dist/mcp/tools/signal-tools.d.ts +4 -0
  29. package/dist/mcp/tools/signal-tools.d.ts.map +1 -0
  30. package/dist/mcp/tools/signal-tools.js +295 -0
  31. package/dist/mcp/tools/signal-tools.js.map +1 -0
  32. package/dist/sync/auto-sync.d.ts +10 -0
  33. package/dist/sync/auto-sync.d.ts.map +1 -0
  34. package/dist/sync/auto-sync.js +81 -0
  35. package/dist/sync/auto-sync.js.map +1 -0
  36. package/dist/sync/index.d.ts +10 -0
  37. package/dist/sync/index.d.ts.map +1 -0
  38. package/dist/sync/index.js +7 -0
  39. package/dist/sync/index.js.map +1 -0
  40. package/dist/sync/sync-client.d.ts +80 -0
  41. package/dist/sync/sync-client.d.ts.map +1 -0
  42. package/dist/sync/sync-client.js +539 -0
  43. package/dist/sync/sync-client.js.map +1 -0
  44. package/dist/sync/sync-relay.d.ts +40 -0
  45. package/dist/sync/sync-relay.d.ts.map +1 -0
  46. package/dist/sync/sync-relay.js +118 -0
  47. package/dist/sync/sync-relay.js.map +1 -0
  48. package/dist/sync/sync-state.d.ts +7 -0
  49. package/dist/sync/sync-state.d.ts.map +1 -0
  50. package/dist/sync/sync-state.js +63 -0
  51. package/dist/sync/sync-state.js.map +1 -0
  52. package/dist/sync/types.d.ts +106 -0
  53. package/dist/sync/types.d.ts.map +1 -0
  54. package/dist/sync/types.js +20 -0
  55. package/dist/sync/types.js.map +1 -0
  56. package/package.json +1 -1
@@ -0,0 +1,295 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { z } from "zod";
4
+ import { trackEvent } from "../../core/telemetry.js";
5
+ import { dataDir } from "../../core/paths.js";
6
+ export function registerSignalTools(server, backpack) {
7
+ server.registerTool("backpack_signal_list", {
8
+ title: "List Signals",
9
+ description: "List active signals for the current backpack. Signals are derived insights — concentration risks, bridge nodes, orphan clusters, cross-graph entities — computed from graph structure and KB content. Filter by graph, kind, severity, or text search. Search 'chester' to find signals touching Chester across all graphs.",
10
+ inputSchema: {
11
+ graph: z.string().optional().describe("Filter to signals involving this graph"),
12
+ kind: z.string().optional().describe("Filter by signal kind (e.g. 'concentration_risk', 'bridge_node', 'cross_graph_entity')"),
13
+ severity: z.string().optional().describe("Filter by severity: 'critical', 'high', 'medium', 'low'"),
14
+ query: z.string().optional().describe("Text search across signal titles, descriptions, and graph names"),
15
+ },
16
+ annotations: { readOnlyHint: true },
17
+ }, async ({ graph, kind, severity, query }) => {
18
+ try {
19
+ const store = await backpack.signals();
20
+ const result = await store.list({
21
+ graph,
22
+ kind: kind,
23
+ severity,
24
+ query,
25
+ });
26
+ trackEvent("tool_call", { tool: "backpack_signal_list" });
27
+ if (result.signals.length === 0) {
28
+ const msg = result.computedAt
29
+ ? `No active signals${graph ? ` for "${graph}"` : ""}${query ? ` matching "${query}"` : ""}. ${result.dismissed} dismissed. Last detected: ${result.computedAt}`
30
+ : "No signals detected yet. Run backpack_signal_detect to scan the backpack.";
31
+ return { content: [{ type: "text", text: msg }] };
32
+ }
33
+ const lines = result.signals.map((s) => {
34
+ const graphs = s.graphNames.join(", ");
35
+ return `[${s.severity.toUpperCase()}] ${s.title}\n Kind: ${s.kind} | Graphs: ${graphs} | Score: ${s.score.toFixed(1)}\n Evidence nodes: ${s.evidenceNodeIds.slice(0, 5).join(", ")}${s.evidenceNodeIds.length > 5 ? "…" : ""}\n ID: ${s.id}`;
36
+ });
37
+ const header = `${result.signals.length} active signal${result.signals.length > 1 ? "s" : ""}${result.dismissed ? ` (${result.dismissed} dismissed)` : ""} — last detected ${result.computedAt}`;
38
+ return {
39
+ content: [{ type: "text", text: `${header}\n\n${lines.join("\n\n")}` }],
40
+ };
41
+ }
42
+ catch (err) {
43
+ return {
44
+ content: [{ type: "text", text: `Error: ${err.message}` }],
45
+ isError: true,
46
+ };
47
+ }
48
+ });
49
+ server.registerTool("backpack_signal_detect", {
50
+ title: "Detect Signals",
51
+ description: "Scan ALL graphs and KB documents in the active backpack to detect signals. Runs structural detectors (concentration risk, bridge nodes, orphan clusters, stale clusters, sparse types) and cross-cutting detectors (cross-graph entities, type overlap). Results are persisted to signals.json. Run this after mining, adding nodes, or writing KB docs.",
52
+ inputSchema: {},
53
+ }, async () => {
54
+ try {
55
+ const store = await backpack.signals();
56
+ // Load all graphs
57
+ const summaries = await backpack.listOntologies();
58
+ const graphs = [];
59
+ for (const s of summaries) {
60
+ try {
61
+ const data = await backpack.loadOntology(s.name);
62
+ graphs.push({ name: s.name, data });
63
+ }
64
+ catch {
65
+ // skip graphs that fail to load
66
+ }
67
+ }
68
+ // Load KB doc metadata
69
+ let docs = [];
70
+ try {
71
+ const docStore = await backpack.documents();
72
+ const result = await docStore.list({ limit: 500 });
73
+ docs = result.documents;
74
+ }
75
+ catch {
76
+ // KB might not be configured
77
+ }
78
+ const result = await store.detect(graphs, docs);
79
+ trackEvent("tool_call", { tool: "backpack_signal_detect" });
80
+ if (result.signals.length === 0) {
81
+ return {
82
+ content: [{ type: "text", text: `Detection complete. No signals found across ${graphs.length} graph${graphs.length !== 1 ? "s" : ""} and ${docs.length} KB doc${docs.length !== 1 ? "s" : ""}. ${result.dismissed} previously dismissed.` }],
83
+ };
84
+ }
85
+ const bySeverity = {};
86
+ for (const s of result.signals)
87
+ bySeverity[s.severity] = (bySeverity[s.severity] ?? 0) + 1;
88
+ const summary = Object.entries(bySeverity)
89
+ .filter(([, count]) => count > 0)
90
+ .map(([sev, count]) => `${count} ${sev}`)
91
+ .join(", ");
92
+ // Build node label lookup for evidence context
93
+ const nodeLabels = new Map();
94
+ for (const { data } of graphs) {
95
+ for (const node of data.nodes) {
96
+ const label = Object.values(node.properties).find((v) => typeof v === "string" && v.length > 0) ?? node.id;
97
+ const propSummary = Object.entries(node.properties)
98
+ .filter(([, v]) => v !== undefined && v !== null && String(v).length < 80)
99
+ .slice(0, 3)
100
+ .map(([k, v]) => `${k}: ${v}`)
101
+ .join(", ");
102
+ nodeLabels.set(node.id, { label, type: node.type, props: propSummary });
103
+ }
104
+ }
105
+ // Output top signals with full evidence context for LLM enrichment
106
+ const topSignals = result.signals.slice(0, 15);
107
+ const signalBlocks = topSignals.map((s, i) => {
108
+ const evidenceContext = s.evidenceNodeIds.slice(0, 5).map((nid) => {
109
+ const info = nodeLabels.get(nid);
110
+ return info ? ` - "${info.label}" (${info.type}${info.props ? `: ${info.props}` : ""})` : ` - ${nid}`;
111
+ }).join("\n");
112
+ return `${i + 1}. [${s.severity.toUpperCase()}] ${s.title}\n Kind: ${s.kind} | Graphs: ${s.graphNames.join(", ")}\n Description: ${s.description}\n Evidence nodes:\n${evidenceContext || " (none)"}`;
113
+ });
114
+ const more = result.signals.length > 15
115
+ ? `\n\n… and ${result.signals.length - 15} more (use backpack_signal_list to see all)`
116
+ : "";
117
+ const enrichmentPrompt = `\n\n---\nYou now have ${result.signals.length} signals with evidence context. For the HIGH and MEDIUM signals above, write a brief enrichment — 1-2 sentences explaining WHY this signal matters in the context of this specific backpack and what the user should consider doing about it. Use the evidence node labels and properties to make it specific, not generic. Then save the enriched descriptions back to the signals using backpack_signal_list to review.`;
118
+ return {
119
+ content: [{
120
+ type: "text",
121
+ text: `Detected ${result.signals.length} signal${result.signals.length > 1 ? "s" : ""} across ${graphs.length} graph${graphs.length !== 1 ? "s" : ""} (${summary})${result.dismissed ? ` — ${result.dismissed} dismissed` : ""}:\n\n${signalBlocks.join("\n\n")}${more}${enrichmentPrompt}`,
122
+ }],
123
+ };
124
+ }
125
+ catch (err) {
126
+ return {
127
+ content: [{ type: "text", text: `Error: ${err.message}` }],
128
+ isError: true,
129
+ };
130
+ }
131
+ });
132
+ server.registerTool("backpack_signal_dismiss", {
133
+ title: "Dismiss Signal",
134
+ description: "Dismiss a signal by ID. Dismissed signals won't appear in signal_list until the backpack state changes enough to produce a different signal at that location. Use this to acknowledge a signal you've seen and don't need surfaced anymore.",
135
+ inputSchema: {
136
+ signalId: z.string().describe("ID of the signal to dismiss"),
137
+ },
138
+ }, async ({ signalId }) => {
139
+ try {
140
+ const store = await backpack.signals();
141
+ await store.dismiss(signalId);
142
+ trackEvent("tool_call", { tool: "backpack_signal_dismiss" });
143
+ return {
144
+ content: [{ type: "text", text: `Signal "${signalId}" dismissed.` }],
145
+ };
146
+ }
147
+ catch (err) {
148
+ return {
149
+ content: [{ type: "text", text: `Error: ${err.message}` }],
150
+ isError: true,
151
+ };
152
+ }
153
+ });
154
+ server.registerTool("backpack_signal_configure", {
155
+ title: "Configure Signals",
156
+ description: "Adjust signal detection sensitivity and enable/disable specific detector kinds. Sensitivity is 0.0–1.0: lower values surface fewer, higher-confidence signals; higher values surface more signals including lower-confidence ones. Default is 0.5.",
157
+ inputSchema: {
158
+ sensitivity: z.number().min(0).max(1).optional().describe("Detection sensitivity (0.0 = only critical, 1.0 = everything). Default 0.5."),
159
+ disabledKinds: z.array(z.string()).optional().describe("Signal kinds to disable (e.g. ['sparse_type', 'stale_cluster'])"),
160
+ },
161
+ }, async ({ sensitivity, disabledKinds }) => {
162
+ try {
163
+ const store = await backpack.signals();
164
+ const config = await store.configure({
165
+ sensitivity,
166
+ disabledKinds: disabledKinds,
167
+ });
168
+ trackEvent("tool_call", { tool: "backpack_signal_configure" });
169
+ return {
170
+ content: [{
171
+ type: "text",
172
+ text: `Signal config updated:\n Sensitivity: ${config.sensitivity}\n Disabled kinds: ${config.disabledKinds.length > 0 ? config.disabledKinds.join(", ") : "(none)"}`,
173
+ }],
174
+ };
175
+ }
176
+ catch (err) {
177
+ return {
178
+ content: [{ type: "text", text: `Error: ${err.message}` }],
179
+ isError: true,
180
+ };
181
+ }
182
+ });
183
+ server.registerTool("backpack_signal_enrich", {
184
+ title: "Enrich Signal Descriptions",
185
+ description: "Update signal descriptions with LLM-enriched contextual explanations. After running signal_detect, use this to rewrite signal descriptions with richer context that explains WHY the signal matters and what to do about it. Pass an array of {id, description} pairs.",
186
+ inputSchema: {
187
+ enrichments: z.array(z.object({
188
+ id: z.string().describe("Signal ID"),
189
+ description: z.string().describe("Enriched description with contextual explanation"),
190
+ })).describe("Array of signal ID + enriched description pairs"),
191
+ },
192
+ }, async ({ enrichments }) => {
193
+ try {
194
+ const store = await backpack.signals();
195
+ const file = await store.load();
196
+ let updated = 0;
197
+ for (const { id, description } of enrichments) {
198
+ const signal = file.signals.find((s) => s.id === id);
199
+ if (signal) {
200
+ signal.description = description;
201
+ updated++;
202
+ }
203
+ }
204
+ if (updated > 0) {
205
+ await store.save(file);
206
+ }
207
+ trackEvent("tool_call", { tool: "backpack_signal_enrich" });
208
+ return {
209
+ content: [{ type: "text", text: `Enriched ${updated} signal description${updated !== 1 ? "s" : ""}.` }],
210
+ };
211
+ }
212
+ catch (err) {
213
+ return {
214
+ content: [{ type: "text", text: `Error: ${err.message}` }],
215
+ isError: true,
216
+ };
217
+ }
218
+ });
219
+ server.registerTool("backpack_signal_selected", {
220
+ title: "Get Selected Signals",
221
+ description: "Read the signals the user has selected in the viewer. Returns the full signal data with evidence context for each checked signal. Use this when the user says 'look at my selected signals', 'enrich these', 'mine these signals', or 'write a KB for these signals'.",
222
+ inputSchema: {},
223
+ annotations: { readOnlyHint: true },
224
+ }, async () => {
225
+ try {
226
+ // Read viewer state to get selected signal IDs
227
+ const statePath = path.join(dataDir(), "viewer-state.json");
228
+ let selectedIds = [];
229
+ try {
230
+ const raw = await fs.readFile(statePath, "utf8");
231
+ const state = JSON.parse(raw);
232
+ selectedIds = state.selectedSignalIds ?? [];
233
+ }
234
+ catch {
235
+ return {
236
+ content: [{ type: "text", text: "No viewer state available — the viewer may not be running, or no signals are selected." }],
237
+ };
238
+ }
239
+ if (selectedIds.length === 0) {
240
+ return {
241
+ content: [{ type: "text", text: "No signals selected. Check signals in the viewer's Signals tab, then try again." }],
242
+ };
243
+ }
244
+ // Load full signal data
245
+ const store = await backpack.signals();
246
+ const file = await store.load();
247
+ const selectedSet = new Set(selectedIds);
248
+ const selected = file.signals.filter((s) => selectedSet.has(s.id));
249
+ if (selected.length === 0) {
250
+ return {
251
+ content: [{ type: "text", text: `${selectedIds.length} signal ID(s) selected in viewer but none match current signals.json. Try re-detecting signals.` }],
252
+ };
253
+ }
254
+ // Load node labels for evidence context
255
+ const summaries = await backpack.listOntologies();
256
+ const nodeLabels = new Map();
257
+ for (const s of summaries) {
258
+ try {
259
+ const data = await backpack.loadOntology(s.name);
260
+ for (const node of data.nodes) {
261
+ const label = Object.values(node.properties).find((v) => typeof v === "string" && v.length > 0) ?? node.id;
262
+ const propSummary = Object.entries(node.properties)
263
+ .filter(([, v]) => v !== undefined && v !== null && String(v).length < 80)
264
+ .slice(0, 4)
265
+ .map(([k, v]) => `${k}: ${v}`)
266
+ .join(", ");
267
+ nodeLabels.set(node.id, { label, type: node.type, props: propSummary });
268
+ }
269
+ }
270
+ catch { /* skip */ }
271
+ }
272
+ const blocks = selected.map((s, i) => {
273
+ const evidence = s.evidenceNodeIds.slice(0, 6).map((nid) => {
274
+ const info = nodeLabels.get(nid);
275
+ return info ? ` - "${info.label}" (${info.type}${info.props ? `: ${info.props}` : ""})` : ` - ${nid}`;
276
+ }).join("\n");
277
+ return `${i + 1}. [${s.severity.toUpperCase()}] ${s.title}\n Kind: ${s.kind} | Graphs: ${s.graphNames.join(", ")}${s.tags.length > 0 ? ` | Tags: ${s.tags.join(", ")}` : ""}\n ${s.description}\n Evidence:\n${evidence || " (none)"}`;
278
+ });
279
+ trackEvent("tool_call", { tool: "backpack_signal_selected" });
280
+ return {
281
+ content: [{
282
+ type: "text",
283
+ text: `${selected.length} signal${selected.length > 1 ? "s" : ""} selected:\n\n${blocks.join("\n\n")}`,
284
+ }],
285
+ };
286
+ }
287
+ catch (err) {
288
+ return {
289
+ content: [{ type: "text", text: `Error: ${err.message}` }],
290
+ isError: true,
291
+ };
292
+ }
293
+ });
294
+ }
295
+ //# sourceMappingURL=signal-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/signal-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface AutoSyncOptions {
2
+ /** Suppress all output (used in tests). */
3
+ silent?: boolean;
4
+ }
5
+ /**
6
+ * Trigger a pull for every registered backpack that has sync state.
7
+ * Returns immediately; the actual sync runs in the background.
8
+ */
9
+ export declare function runStartupSync(opts?: AutoSyncOptions): void;
10
+ //# sourceMappingURL=auto-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-sync.d.ts","sourceRoot":"","sources":["../../src/sync/auto-sync.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,eAAoB,GAAG,IAAI,CAM/D"}
@@ -0,0 +1,81 @@
1
+ // Auto-sync hooks for the local MCP server.
2
+ //
3
+ // Runs in the background on MCP server startup: for each registered backpack
4
+ // that has sync state on disk, run a `pull` so the user picks up any changes
5
+ // that landed via cloud MCP / phone / web while the local MCP wasn't running.
6
+ //
7
+ // All errors are logged to stderr (stdout is reserved for the MCP protocol)
8
+ // and never block server startup.
9
+ import * as crypto from "node:crypto";
10
+ import { listBackpacks } from "../core/backpacks-registry.js";
11
+ import { OAuthClient } from "../auth/oauth.js";
12
+ import { SyncClient } from "./sync-client.js";
13
+ import { SyncRelayClient } from "./sync-relay.js";
14
+ import { readSyncState } from "./sync-state.js";
15
+ /**
16
+ * Trigger a pull for every registered backpack that has sync state.
17
+ * Returns immediately; the actual sync runs in the background.
18
+ */
19
+ export function runStartupSync(opts = {}) {
20
+ void runStartupSyncAsync(opts).catch((err) => {
21
+ if (!opts.silent) {
22
+ process.stderr.write(`auto-sync: top-level error — ${err.message}\n`);
23
+ }
24
+ });
25
+ }
26
+ async function runStartupSyncAsync(opts) {
27
+ let backpacks;
28
+ try {
29
+ backpacks = await listBackpacks();
30
+ }
31
+ catch (err) {
32
+ if (!opts.silent) {
33
+ process.stderr.write(`auto-sync: could not list backpacks — ${err.message}\n`);
34
+ }
35
+ return;
36
+ }
37
+ for (const entry of backpacks) {
38
+ const state = await readSyncState(entry.path).catch(() => null);
39
+ if (!state || !state.relay_url || !state.backpack_id)
40
+ continue;
41
+ const tokenProvider = await buildTokenProvider(state.relay_url);
42
+ if (!tokenProvider) {
43
+ if (!opts.silent) {
44
+ process.stderr.write(`auto-sync: ${entry.name} has sync state but no auth available — skipping\n`);
45
+ }
46
+ continue;
47
+ }
48
+ const relay = new SyncRelayClient({ baseUrl: state.relay_url, token: tokenProvider });
49
+ const client = new SyncClient({ backpackPath: entry.path, relay });
50
+ try {
51
+ const result = await client.pull();
52
+ if (!opts.silent) {
53
+ const summary = result.pulled.length === 0 && result.deleted_local.length === 0 && result.errors.length === 0
54
+ ? "in sync"
55
+ : `pulled ${result.pulled.length}, deleted ${result.deleted_local.length}, errors ${result.errors.length}`;
56
+ process.stderr.write(`auto-sync: ${entry.name} — ${summary}\n`);
57
+ }
58
+ }
59
+ catch (err) {
60
+ if (!opts.silent) {
61
+ process.stderr.write(`auto-sync: ${entry.name} — ${err.message}\n`);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ async function buildTokenProvider(relayUrl) {
67
+ // Static bearer token from env (CI / scripted setups)
68
+ if (process.env.BACKPACK_APP_TOKEN) {
69
+ const tok = process.env.BACKPACK_APP_TOKEN;
70
+ return () => Promise.resolve(tok);
71
+ }
72
+ // OAuth via .mcp.json (same path the MCP server already uses)
73
+ const clientId = process.env.BACKPACK_APP_CLIENT_ID;
74
+ const issuerUrl = process.env.BACKPACK_APP_ISSUER_URL;
75
+ if (!clientId || !issuerUrl)
76
+ return null;
77
+ const cacheKey = crypto.createHash("sha256").update(relayUrl).digest("hex").slice(0, 12);
78
+ const oauth = new OAuthClient(clientId, issuerUrl, cacheKey);
79
+ return () => oauth.getAccessToken();
80
+ }
81
+ //# sourceMappingURL=auto-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-sync.js","sourceRoot":"","sources":["../../src/sync/auto-sync.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,kCAAkC;AAElC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB,EAAE;IACvD,KAAK,mBAAmB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAiC,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAqB;IACtD,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAA0C,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,WAAW;YAAE,SAAS;QAE/D,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,cAAc,KAAK,CAAC,IAAI,oDAAoD,CAC7E,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;oBAC3F,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,aAAa,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC/G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,MAAO,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,sDAAsD;IACtD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACtD,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7D,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { SyncClient, hashContent, parseArtifactId } from "./sync-client.js";
2
+ export type { SyncClientOptions, RegisterOptions } from "./sync-client.js";
3
+ export { SyncRelayClient } from "./sync-relay.js";
4
+ export type { SyncRelayClientOptions, TokenProvider } from "./sync-relay.js";
5
+ export { ARTIFACT_KIND_GRAPH, ARTIFACT_KIND_KB_DOC, SYNC_PROTOCOL_VERSION, SyncVersionConflictError, } from "./types.js";
6
+ export type { ArtifactKind, ArtifactSyncState, BackpackSyncState, ConflictRecord, GraphArtifactContent, KBDocArtifactContent, SyncArtifact, SyncArtifactSummary, SyncBackpack, SyncError, SyncManifest, SyncRunResult, } from "./types.js";
7
+ export { readSyncState, writeSyncState, deleteSyncState, isStateInitialized, emptyArtifactState, } from "./sync-state.js";
8
+ export { runStartupSync } from "./auto-sync.js";
9
+ export type { AutoSyncOptions } from "./auto-sync.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // Public entry point for the sync module.
2
+ export { SyncClient, hashContent, parseArtifactId } from "./sync-client.js";
3
+ export { SyncRelayClient } from "./sync-relay.js";
4
+ export { ARTIFACT_KIND_GRAPH, ARTIFACT_KIND_KB_DOC, SYNC_PROTOCOL_VERSION, SyncVersionConflictError, } from "./types.js";
5
+ export { readSyncState, writeSyncState, deleteSyncState, isStateInitialized, emptyArtifactState, } from "./sync-state.js";
6
+ export { runStartupSync } from "./auto-sync.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAepB,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { type BackpackSyncState, type SyncManifest, type SyncRunResult } from "./types.js";
2
+ import { SyncRelayClient } from "./sync-relay.js";
3
+ export interface SyncClientOptions {
4
+ /** Absolute path to the backpack on disk (where graphs/ + _documents/ live). */
5
+ backpackPath: string;
6
+ /** Relay client (constructed by caller, who handles auth). */
7
+ relay: SyncRelayClient;
8
+ /** Display name of the backpack (used at register time). */
9
+ name?: string;
10
+ /** Color (hex) of the backpack — derived from path by default. */
11
+ color?: string;
12
+ /** Tags to assign at register time. */
13
+ tags?: string[];
14
+ }
15
+ export interface RegisterOptions {
16
+ name: string;
17
+ color?: string;
18
+ tags?: string[];
19
+ /** Optional pre-existing UUID (for idempotent re-registration). */
20
+ backpackId?: string;
21
+ }
22
+ export declare class SyncClient {
23
+ private readonly backpackPath;
24
+ private readonly relay;
25
+ private graphsBackend;
26
+ private docStore;
27
+ private kbMounts;
28
+ constructor(opts: SyncClientOptions);
29
+ /** Read sync state from disk, or null if this backpack is not registered. */
30
+ getState(): Promise<BackpackSyncState | null>;
31
+ /**
32
+ * Register this backpack with the relay. Idempotent — if the backpack is
33
+ * already registered and the relay knows about it, returns existing state.
34
+ * If a backpack_id is provided (e.g. from a previous registration), reuses it.
35
+ */
36
+ register(opts: RegisterOptions): Promise<BackpackSyncState>;
37
+ /** Unregister: delete server-side and local sync state. */
38
+ unregister(): Promise<void>;
39
+ /**
40
+ * Compute a status diff without performing any writes. Useful for
41
+ * `backpack-sync status` and the viewer's pending-changes badge.
42
+ */
43
+ status(): Promise<{
44
+ registered: boolean;
45
+ state: BackpackSyncState | null;
46
+ localOnly: string[];
47
+ remoteOnly: string[];
48
+ diverged: string[];
49
+ upToDate: number;
50
+ }>;
51
+ /** Push every local artifact whose hash differs from its tracked synced hash. */
52
+ push(): Promise<SyncRunResult>;
53
+ /** Pull every remote artifact whose version is newer than the locally tracked one. */
54
+ pull(): Promise<SyncRunResult>;
55
+ /** Bidirectional: pull then push. */
56
+ sync(): Promise<SyncRunResult>;
57
+ private requireState;
58
+ private getRelayBaseUrl;
59
+ private getGraphsBackend;
60
+ private getKBStore;
61
+ private scanLocalArtifacts;
62
+ private writeLocalArtifact;
63
+ private deleteLocalArtifact;
64
+ private writeConflictFile;
65
+ private handleConflict;
66
+ }
67
+ /**
68
+ * Canonical hash: sorted-keys at every level of the JSON tree, no
69
+ * whitespace. Matches backpack-app's `repository.canonicalContentHash`
70
+ * so client-computed hashes survive a round-trip through PostgreSQL JSONB
71
+ * normalization.
72
+ */
73
+ export declare function hashContent(content: unknown): string;
74
+ export declare function parseArtifactId(id: string): {
75
+ kind: string;
76
+ key: string;
77
+ };
78
+ /** Manifest = SyncManifest, re-exported here for convenience. */
79
+ export type { SyncManifest };
80
+ //# sourceMappingURL=sync-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-client.d.ts","sourceRoot":"","sources":["../../src/sync/sync-client.ts"],"names":[],"mappings":"AA2BA,OAAO,EAKL,KAAK,iBAAiB,EAGtB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAQpB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,KAAK,EAAE,eAAe,CAAC;IACvB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAgC;gBAEpC,IAAI,EAAE,iBAAiB;IAOnC,6EAA6E;IACvE,QAAQ,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAInD;;;;OAIG;IACG,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2BjE,2DAA2D;IACrD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC;QACtB,UAAU,EAAE,OAAO,CAAC;QACpB,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;QAChC,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAuDF,iFAAiF;IAC3E,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IA4CpC,sFAAsF;IAChF,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IA2GpC,qCAAqC;IAC/B,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;YAetB,YAAY;IAU1B,OAAO,CAAC,eAAe;YAYT,gBAAgB;YAQhB,UAAU;YAkBV,kBAAkB;YAsElB,kBAAkB;YA+BlB,mBAAmB;YAmBnB,iBAAiB;YAWjB,cAAc;CA0B7B;AAID;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAGpD;AA2BD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAMzE;AAoBD,iEAAiE;AACjE,YAAY,EAAE,YAAY,EAAE,CAAC"}