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,118 @@
1
+ // HTTP client for the Backpack Sync Protocol v0.1 relay endpoints.
2
+ // Used by SyncClient (OSS) and the cloud MCP sidecar (when configured for sync).
3
+ import { SyncVersionConflictError, SYNC_PROTOCOL_VERSION, } from "./types.js";
4
+ export class SyncRelayClient {
5
+ baseUrl;
6
+ getToken;
7
+ fetchImpl;
8
+ constructor(opts) {
9
+ this.baseUrl = opts.baseUrl.replace(/\/+$/, "");
10
+ this.getToken =
11
+ typeof opts.token === "string"
12
+ ? () => Promise.resolve(opts.token)
13
+ : opts.token;
14
+ this.fetchImpl = opts.fetchImpl ?? fetch;
15
+ }
16
+ async headers(extra) {
17
+ const token = await this.getToken();
18
+ return {
19
+ Authorization: `Bearer ${token}`,
20
+ "Content-Type": "application/json",
21
+ "X-Backpack-Sync-Protocol": SYNC_PROTOCOL_VERSION,
22
+ ...(extra ?? {}),
23
+ };
24
+ }
25
+ async request(method, path, body) {
26
+ const init = {
27
+ method,
28
+ headers: await this.headers(),
29
+ };
30
+ if (body !== undefined) {
31
+ init.body = JSON.stringify(body);
32
+ }
33
+ const url = `${this.baseUrl}${path}`;
34
+ return this.fetchImpl(url, init);
35
+ }
36
+ /** POST /api/sync/register — idempotent. Returns the canonical record. */
37
+ async register(input) {
38
+ const res = await this.request("POST", "/api/sync/register", input);
39
+ if (!res.ok) {
40
+ throw await errorFromResponse(res, "register failed");
41
+ }
42
+ return (await res.json());
43
+ }
44
+ /** GET /api/sync/backpacks — list the user's sync backpacks. */
45
+ async listBackpacks() {
46
+ const res = await this.request("GET", "/api/sync/backpacks");
47
+ if (!res.ok) {
48
+ throw await errorFromResponse(res, "listBackpacks failed");
49
+ }
50
+ const body = (await res.json());
51
+ return body.backpacks ?? [];
52
+ }
53
+ /** GET /api/sync/backpacks/{id}/manifest. */
54
+ async manifest(backpackId) {
55
+ const res = await this.request("GET", `/api/sync/backpacks/${encodeURIComponent(backpackId)}/manifest`);
56
+ if (!res.ok) {
57
+ throw await errorFromResponse(res, "manifest failed");
58
+ }
59
+ return (await res.json());
60
+ }
61
+ /** GET one artifact. */
62
+ async getArtifact(backpackId, artifactId) {
63
+ const res = await this.request("GET", `/api/sync/backpacks/${encodeURIComponent(backpackId)}/artifacts/${encodeURIComponent(artifactId)}`);
64
+ if (!res.ok) {
65
+ throw await errorFromResponse(res, "getArtifact failed");
66
+ }
67
+ return (await res.json());
68
+ }
69
+ /**
70
+ * PUT one artifact. expectedVersion is the version the client believes the
71
+ * server holds. Pass 0 for new artifacts. Throws SyncVersionConflictError
72
+ * on 409. Returns the new artifact (with assigned version).
73
+ */
74
+ async putArtifact(backpackId, artifactId, content, expectedVersion) {
75
+ const res = await this.request("PUT", `/api/sync/backpacks/${encodeURIComponent(backpackId)}/artifacts/${encodeURIComponent(artifactId)}`, { expected_version: expectedVersion, content });
76
+ if (res.status === 409) {
77
+ const body = (await res.json().catch(() => ({})));
78
+ const cur = body.current;
79
+ throw new SyncVersionConflictError(artifactId, cur?.version ?? 0, cur?.content_hash ?? "");
80
+ }
81
+ if (!res.ok) {
82
+ throw await errorFromResponse(res, "putArtifact failed");
83
+ }
84
+ return (await res.json());
85
+ }
86
+ /** DELETE one artifact (tombstones it). */
87
+ async deleteArtifact(backpackId, artifactId) {
88
+ const res = await this.request("DELETE", `/api/sync/backpacks/${encodeURIComponent(backpackId)}/artifacts/${encodeURIComponent(artifactId)}`);
89
+ if (res.status === 404)
90
+ return; // already gone, idempotent
91
+ if (!res.ok) {
92
+ throw await errorFromResponse(res, "deleteArtifact failed");
93
+ }
94
+ }
95
+ /** DELETE the entire sync backpack. */
96
+ async deleteBackpack(backpackId) {
97
+ const res = await this.request("DELETE", `/api/sync/backpacks/${encodeURIComponent(backpackId)}`);
98
+ if (res.status === 404)
99
+ return;
100
+ if (!res.ok) {
101
+ throw await errorFromResponse(res, "deleteBackpack failed");
102
+ }
103
+ }
104
+ }
105
+ async function errorFromResponse(res, prefix) {
106
+ const text = await res.text().catch(() => "");
107
+ let detail = text;
108
+ try {
109
+ const parsed = JSON.parse(text);
110
+ if (parsed?.error)
111
+ detail = parsed.error;
112
+ }
113
+ catch {
114
+ // not JSON, keep raw text
115
+ }
116
+ return new Error(`${prefix}: ${res.status} ${res.statusText}${detail ? ` — ${detail}` : ""}`);
117
+ }
118
+ //# sourceMappingURL=sync-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-relay.js","sourceRoot":"","sources":["../../src/sync/sync-relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BackpackSyncState, ArtifactSyncState } from "./types.js";
2
+ export declare function readSyncState(backpackPath: string): Promise<BackpackSyncState | null>;
3
+ export declare function writeSyncState(backpackPath: string, state: BackpackSyncState): Promise<void>;
4
+ export declare function deleteSyncState(backpackPath: string): Promise<void>;
5
+ export declare function emptyArtifactState(): ArtifactSyncState;
6
+ export declare function isStateInitialized(state: BackpackSyncState | null): state is BackpackSyncState;
7
+ //# sourceMappingURL=sync-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-state.d.ts","sourceRoot":"","sources":["../../src/sync/sync-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAavE,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAmB3F;AAED,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE;AAED,wBAAgB,kBAAkB,IAAI,iBAAiB,CAOtD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,KAAK,IAAI,iBAAiB,CAE9F"}
@@ -0,0 +1,63 @@
1
+ // Per-backpack sync state, persisted to <backpack-path>/.sync/state.json.
2
+ // Atomic writes (.tmp + rename) for crash safety.
3
+ import * as fs from "node:fs/promises";
4
+ import * as path from "node:path";
5
+ const STATE_DIR = ".sync";
6
+ const STATE_FILE = "state.json";
7
+ function stateDir(backpackPath) {
8
+ return path.join(backpackPath, STATE_DIR);
9
+ }
10
+ function statePath(backpackPath) {
11
+ return path.join(stateDir(backpackPath), STATE_FILE);
12
+ }
13
+ export async function readSyncState(backpackPath) {
14
+ try {
15
+ const raw = await fs.readFile(statePath(backpackPath), "utf8");
16
+ const parsed = JSON.parse(raw);
17
+ if (!parsed.backpack_id || !parsed.relay_url)
18
+ return null;
19
+ return {
20
+ backpack_id: parsed.backpack_id,
21
+ name: parsed.name ?? "",
22
+ relay_url: parsed.relay_url,
23
+ registered_at: parsed.registered_at ?? new Date().toISOString(),
24
+ last_sync_at: parsed.last_sync_at ?? null,
25
+ last_synced_metadata_version: parsed.last_synced_metadata_version ?? 0,
26
+ artifacts: parsed.artifacts ?? {},
27
+ };
28
+ }
29
+ catch (err) {
30
+ const e = err;
31
+ if (e.code === "ENOENT")
32
+ return null;
33
+ throw err;
34
+ }
35
+ }
36
+ export async function writeSyncState(backpackPath, state) {
37
+ const dir = stateDir(backpackPath);
38
+ await fs.mkdir(dir, { recursive: true });
39
+ const target = statePath(backpackPath);
40
+ const tmp = `${target}.tmp`;
41
+ await fs.writeFile(tmp, JSON.stringify(state, null, 2), "utf8");
42
+ await fs.rename(tmp, target);
43
+ }
44
+ export async function deleteSyncState(backpackPath) {
45
+ try {
46
+ await fs.rm(stateDir(backpackPath), { recursive: true, force: true });
47
+ }
48
+ catch {
49
+ // best effort
50
+ }
51
+ }
52
+ export function emptyArtifactState() {
53
+ return {
54
+ version: 0,
55
+ content_hash: "",
56
+ last_synced_version: 0,
57
+ modified_at: new Date(0).toISOString(),
58
+ };
59
+ }
60
+ export function isStateInitialized(state) {
61
+ return state !== null && !!state.backpack_id && !!state.relay_url;
62
+ }
63
+ //# sourceMappingURL=sync-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-state.js","sourceRoot":"","sources":["../../src/sync/sync-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ export declare const SYNC_PROTOCOL_VERSION = "1";
2
+ /** Stable kind tags used to namespace artifact ids. */
3
+ export declare const ARTIFACT_KIND_GRAPH: "graph";
4
+ export declare const ARTIFACT_KIND_KB_DOC: "kb_doc";
5
+ export type ArtifactKind = typeof ARTIFACT_KIND_GRAPH | typeof ARTIFACT_KIND_KB_DOC;
6
+ export interface SyncBackpack {
7
+ id: string;
8
+ owner_user_id: string;
9
+ name: string;
10
+ color: string;
11
+ tags: string[];
12
+ metadata_version: number;
13
+ metadata_content_hash: string;
14
+ created_at: string;
15
+ updated_at: string;
16
+ }
17
+ export interface SyncArtifactSummary {
18
+ artifact_id: string;
19
+ version: number;
20
+ content_hash: string;
21
+ modified_at: string;
22
+ deleted?: boolean;
23
+ }
24
+ export interface SyncManifest {
25
+ backpack_id: string;
26
+ name: string;
27
+ color: string;
28
+ tags: string[];
29
+ metadata_version: number;
30
+ metadata_content_hash: string;
31
+ artifacts: SyncArtifactSummary[];
32
+ }
33
+ export interface SyncArtifact {
34
+ artifact_id: string;
35
+ version: number;
36
+ content_hash: string;
37
+ modified_at: string;
38
+ content: unknown;
39
+ }
40
+ /** Content shape for graph artifacts (matches relay's wrapping). */
41
+ export interface GraphArtifactContent {
42
+ kind: typeof ARTIFACT_KIND_GRAPH;
43
+ name: string;
44
+ data: unknown;
45
+ }
46
+ /** Content shape for KB document artifacts. */
47
+ export interface KBDocArtifactContent {
48
+ kind: typeof ARTIFACT_KIND_KB_DOC;
49
+ id: string;
50
+ title: string;
51
+ content: string;
52
+ tags: string[];
53
+ source_graphs: string[];
54
+ source_node_ids: string[];
55
+ collection: string;
56
+ created_at: string;
57
+ updated_at: string;
58
+ }
59
+ /** Per-artifact local sync state, persisted in <backpack>/.sync/state.json. */
60
+ export interface ArtifactSyncState {
61
+ version: number;
62
+ content_hash: string;
63
+ last_synced_version: number;
64
+ modified_at: string;
65
+ }
66
+ /** On-disk state for one backpack's sync registration. */
67
+ export interface BackpackSyncState {
68
+ backpack_id: string;
69
+ name: string;
70
+ relay_url: string;
71
+ registered_at: string;
72
+ last_sync_at: string | null;
73
+ /**
74
+ * Last metadata_version observed at sync time. Reserved for future
75
+ * use when backpack-level metadata (name, color, tags) syncs through
76
+ * the protocol; v0.1 sets but does not act on this field.
77
+ */
78
+ last_synced_metadata_version: number;
79
+ artifacts: Record<string, ArtifactSyncState>;
80
+ }
81
+ /** Result of a sync run. */
82
+ export interface SyncRunResult {
83
+ pushed: string[];
84
+ pulled: string[];
85
+ deleted_local: string[];
86
+ deleted_remote: string[];
87
+ conflicts: ConflictRecord[];
88
+ errors: SyncError[];
89
+ }
90
+ export interface ConflictRecord {
91
+ artifact_id: string;
92
+ conflict_path: string;
93
+ remote_version: number;
94
+ }
95
+ export interface SyncError {
96
+ artifact_id?: string;
97
+ message: string;
98
+ }
99
+ /** Thrown when the server's version disagrees with the client's expectation. */
100
+ export declare class SyncVersionConflictError extends Error {
101
+ readonly artifactId: string;
102
+ readonly serverVersion: number;
103
+ readonly serverHash: string;
104
+ constructor(artifactId: string, serverVersion: number, serverHash: string);
105
+ }
106
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ // Sync Protocol v0.1 types — shared by client + relay implementations.
2
+ // Mirrors backpack-app's internal/model/sync.go shapes.
3
+ export const SYNC_PROTOCOL_VERSION = "1";
4
+ /** Stable kind tags used to namespace artifact ids. */
5
+ export const ARTIFACT_KIND_GRAPH = "graph";
6
+ export const ARTIFACT_KIND_KB_DOC = "kb_doc";
7
+ /** Thrown when the server's version disagrees with the client's expectation. */
8
+ export class SyncVersionConflictError extends Error {
9
+ artifactId;
10
+ serverVersion;
11
+ serverHash;
12
+ constructor(artifactId, serverVersion, serverHash) {
13
+ super(`sync version conflict on ${artifactId} (server version ${serverVersion})`);
14
+ this.artifactId = artifactId;
15
+ this.serverVersion = serverVersion;
16
+ this.serverHash = serverHash;
17
+ this.name = "SyncVersionConflictError";
18
+ }
19
+ }
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,wDAAwD;AAExD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAiB,CAAC;AA4GtD,gFAAgF;AAChF,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAE/B;IACA;IACA;IAHlB,YACkB,UAAkB,EAClB,aAAqB,EACrB,UAAkB;QAElC,KAAK,CAAC,4BAA4B,UAAU,oBAAoB,aAAa,GAAG,CAAC,CAAC;QAJlE,eAAU,GAAV,UAAU,CAAQ;QAClB,kBAAa,GAAb,aAAa,CAAQ;QACrB,eAAU,GAAV,UAAU,CAAQ;QAGlC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "backpack-ontology",
3
- "version": "0.7.6",
3
+ "version": "0.7.8",
4
4
  "description": "A persistent learning graph engine for Claude Code via MCP — structured knowledge that carries forward across sessions",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Noah Irzinger",