backpack-ontology 0.7.13 → 0.8.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 (122) hide show
  1. package/README.md +123 -0
  2. package/dist/bin/bp.d.ts +3 -0
  3. package/dist/bin/bp.d.ts.map +1 -0
  4. package/dist/bin/bp.js +8 -0
  5. package/dist/bin/bp.js.map +1 -0
  6. package/dist/cli/colors.d.ts +23 -0
  7. package/dist/cli/colors.d.ts.map +1 -0
  8. package/dist/cli/colors.js +40 -0
  9. package/dist/cli/colors.js.map +1 -0
  10. package/dist/cli/commands/auth.d.ts +4 -0
  11. package/dist/cli/commands/auth.d.ts.map +1 -0
  12. package/dist/cli/commands/auth.js +50 -0
  13. package/dist/cli/commands/auth.js.map +1 -0
  14. package/dist/cli/commands/cat.d.ts +3 -0
  15. package/dist/cli/commands/cat.d.ts.map +1 -0
  16. package/dist/cli/commands/cat.js +31 -0
  17. package/dist/cli/commands/cat.js.map +1 -0
  18. package/dist/cli/commands/cloud-admin.d.ts +7 -0
  19. package/dist/cli/commands/cloud-admin.d.ts.map +1 -0
  20. package/dist/cli/commands/cloud-admin.js +186 -0
  21. package/dist/cli/commands/cloud-admin.js.map +1 -0
  22. package/dist/cli/commands/completion.d.ts +3 -0
  23. package/dist/cli/commands/completion.d.ts.map +1 -0
  24. package/dist/cli/commands/completion.js +159 -0
  25. package/dist/cli/commands/completion.js.map +1 -0
  26. package/dist/cli/commands/containers.d.ts +3 -0
  27. package/dist/cli/commands/containers.d.ts.map +1 -0
  28. package/dist/cli/commands/containers.js +30 -0
  29. package/dist/cli/commands/containers.js.map +1 -0
  30. package/dist/cli/commands/context.d.ts +4 -0
  31. package/dist/cli/commands/context.d.ts.map +1 -0
  32. package/dist/cli/commands/context.js +61 -0
  33. package/dist/cli/commands/context.js.map +1 -0
  34. package/dist/cli/commands/doctor.d.ts +3 -0
  35. package/dist/cli/commands/doctor.d.ts.map +1 -0
  36. package/dist/cli/commands/doctor.js +74 -0
  37. package/dist/cli/commands/doctor.js.map +1 -0
  38. package/dist/cli/commands/graphs.d.ts +3 -0
  39. package/dist/cli/commands/graphs.d.ts.map +1 -0
  40. package/dist/cli/commands/graphs.js +68 -0
  41. package/dist/cli/commands/graphs.js.map +1 -0
  42. package/dist/cli/commands/init.d.ts +3 -0
  43. package/dist/cli/commands/init.d.ts.map +1 -0
  44. package/dist/cli/commands/init.js +56 -0
  45. package/dist/cli/commands/init.js.map +1 -0
  46. package/dist/cli/commands/kbs.d.ts +3 -0
  47. package/dist/cli/commands/kbs.d.ts.map +1 -0
  48. package/dist/cli/commands/kbs.js +258 -0
  49. package/dist/cli/commands/kbs.js.map +1 -0
  50. package/dist/cli/commands/ls.d.ts +3 -0
  51. package/dist/cli/commands/ls.d.ts.map +1 -0
  52. package/dist/cli/commands/ls.js +90 -0
  53. package/dist/cli/commands/ls.js.map +1 -0
  54. package/dist/cli/commands/mutate.d.ts +7 -0
  55. package/dist/cli/commands/mutate.d.ts.map +1 -0
  56. package/dist/cli/commands/mutate.js +268 -0
  57. package/dist/cli/commands/mutate.js.map +1 -0
  58. package/dist/cli/commands/open.d.ts +3 -0
  59. package/dist/cli/commands/open.d.ts.map +1 -0
  60. package/dist/cli/commands/open.js +59 -0
  61. package/dist/cli/commands/open.js.map +1 -0
  62. package/dist/cli/commands/search.d.ts +3 -0
  63. package/dist/cli/commands/search.d.ts.map +1 -0
  64. package/dist/cli/commands/search.js +63 -0
  65. package/dist/cli/commands/search.js.map +1 -0
  66. package/dist/cli/commands/show.d.ts +3 -0
  67. package/dist/cli/commands/show.d.ts.map +1 -0
  68. package/dist/cli/commands/show.js +82 -0
  69. package/dist/cli/commands/show.js.map +1 -0
  70. package/dist/cli/commands/version.d.ts +2 -0
  71. package/dist/cli/commands/version.d.ts.map +1 -0
  72. package/dist/cli/commands/version.js +18 -0
  73. package/dist/cli/commands/version.js.map +1 -0
  74. package/dist/cli/help.d.ts +3 -0
  75. package/dist/cli/help.d.ts.map +1 -0
  76. package/dist/cli/help.js +122 -0
  77. package/dist/cli/help.js.map +1 -0
  78. package/dist/cli/output.d.ts +35 -0
  79. package/dist/cli/output.d.ts.map +1 -0
  80. package/dist/cli/output.js +224 -0
  81. package/dist/cli/output.js.map +1 -0
  82. package/dist/cli/parser.d.ts +16 -0
  83. package/dist/cli/parser.d.ts.map +1 -0
  84. package/dist/cli/parser.js +131 -0
  85. package/dist/cli/parser.js.map +1 -0
  86. package/dist/cli/router.d.ts +2 -0
  87. package/dist/cli/router.d.ts.map +1 -0
  88. package/dist/cli/router.js +147 -0
  89. package/dist/cli/router.js.map +1 -0
  90. package/dist/cli/util/confirm.d.ts +3 -0
  91. package/dist/cli/util/confirm.d.ts.map +1 -0
  92. package/dist/cli/util/confirm.js +48 -0
  93. package/dist/cli/util/confirm.js.map +1 -0
  94. package/dist/core/backpack.d.ts +8 -0
  95. package/dist/core/backpack.d.ts.map +1 -1
  96. package/dist/core/backpack.js +32 -0
  97. package/dist/core/backpack.js.map +1 -1
  98. package/dist/mcp/tools/cloud-tools.d.ts +2 -2
  99. package/dist/mcp/tools/cloud-tools.d.ts.map +1 -1
  100. package/dist/mcp/tools/cloud-tools.js +244 -55
  101. package/dist/mcp/tools/cloud-tools.js.map +1 -1
  102. package/dist/ops/auth.d.ts +54 -0
  103. package/dist/ops/auth.d.ts.map +1 -0
  104. package/dist/ops/auth.js +181 -0
  105. package/dist/ops/auth.js.map +1 -0
  106. package/dist/ops/containers.d.ts +27 -0
  107. package/dist/ops/containers.d.ts.map +1 -0
  108. package/dist/ops/containers.js +150 -0
  109. package/dist/ops/containers.js.map +1 -0
  110. package/dist/ops/context.d.ts +51 -0
  111. package/dist/ops/context.d.ts.map +1 -0
  112. package/dist/ops/context.js +158 -0
  113. package/dist/ops/context.js.map +1 -0
  114. package/dist/ops/graphs.d.ts +69 -0
  115. package/dist/ops/graphs.d.ts.map +1 -0
  116. package/dist/ops/graphs.js +278 -0
  117. package/dist/ops/graphs.js.map +1 -0
  118. package/dist/ops/kb.d.ts +33 -0
  119. package/dist/ops/kb.d.ts.map +1 -0
  120. package/dist/ops/kb.js +176 -0
  121. package/dist/ops/kb.js.map +1 -0
  122. package/package.json +3 -2
@@ -0,0 +1,158 @@
1
+ // CLI active-scope state: which backpack (local) or container (cloud)
2
+ // the user is currently working with. Stored as a single small JSON
3
+ // file under configDir so `bp` runs are stateful across invocations
4
+ // without taking a lock or making `bp ls` slow.
5
+ import * as fs from "node:fs/promises";
6
+ import * as path from "node:path";
7
+ import { configDir } from "../core/paths.js";
8
+ import { resolveCloudToken, getRelayUrl, assertSafeRelay } from "./auth.js";
9
+ function contextFilePath() {
10
+ return path.join(configDir(), "cli-context.json");
11
+ }
12
+ function backpacksRegistryPath() {
13
+ return path.join(configDir(), "backpacks.json");
14
+ }
15
+ /**
16
+ * Read the current CLI context. Falls back to the active local backpack
17
+ * from the registry, then to a cloud-no-container default if signed in.
18
+ * Never throws — callers can rely on always getting *some* context.
19
+ */
20
+ export async function getContext() {
21
+ // 1. Explicit CLI state file wins
22
+ try {
23
+ const raw = await fs.readFile(contextFilePath(), "utf8");
24
+ const parsed = JSON.parse(raw);
25
+ if (parsed.source === "local" || parsed.source === "cloud") {
26
+ return {
27
+ source: parsed.source,
28
+ backpackPath: parsed.backpackPath,
29
+ cloudContainer: parsed.cloudContainer,
30
+ };
31
+ }
32
+ }
33
+ catch { /* no state yet */ }
34
+ // 2. Fall back to the registered active local backpack
35
+ const local = await readActiveLocalBackpack();
36
+ if (local) {
37
+ return { source: "local", backpackPath: local };
38
+ }
39
+ // 3. Last resort: cloud, no container filter (works only if signed in)
40
+ return { source: "cloud" };
41
+ }
42
+ export async function setContext(ctx) {
43
+ await fs.mkdir(path.dirname(contextFilePath()), { recursive: true });
44
+ await fs.writeFile(contextFilePath(), JSON.stringify(ctx, null, 2), "utf8");
45
+ }
46
+ export async function clearContext() {
47
+ try {
48
+ await fs.unlink(contextFilePath());
49
+ }
50
+ catch { /* already gone */ }
51
+ }
52
+ async function readActiveLocalBackpack() {
53
+ try {
54
+ const raw = await fs.readFile(backpacksRegistryPath(), "utf8");
55
+ const reg = JSON.parse(raw);
56
+ return typeof reg.active === "string" ? reg.active : null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ async function readAllLocalBackpacks() {
63
+ try {
64
+ const raw = await fs.readFile(backpacksRegistryPath(), "utf8");
65
+ const reg = JSON.parse(raw);
66
+ if (!Array.isArray(reg.paths))
67
+ return [];
68
+ return reg.paths.map((p) => ({ name: path.basename(p), path: p }));
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ async function readCloudContainers(token) {
75
+ try {
76
+ assertSafeRelay(getRelayUrl());
77
+ const res = await fetch(`${getRelayUrl()}/api/sync/backpacks`, {
78
+ headers: { Authorization: `Bearer ${token}` },
79
+ });
80
+ if (!res.ok)
81
+ return [];
82
+ const body = await res.json();
83
+ return body.backpacks ?? [];
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ }
89
+ /**
90
+ * Discover every context the user could switch to: local backpacks from
91
+ * the registry, and cloud sync_backpacks from the relay if signed in.
92
+ */
93
+ export async function listContexts() {
94
+ const out = [];
95
+ for (const bp of await readAllLocalBackpacks()) {
96
+ out.push({ name: `local:${bp.name}`, source: "local", backpackPath: bp.path, detail: bp.path });
97
+ }
98
+ const token = await resolveCloudToken();
99
+ if (token) {
100
+ for (const c of await readCloudContainers(token)) {
101
+ const detail = c.origin_kind === "local" && c.origin_device_name
102
+ ? `device-synced from ${c.origin_device_name}`
103
+ : "cloud-native";
104
+ out.push({ name: `cloud:${c.name}`, source: "cloud", cloudContainer: c.name, detail });
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ /**
110
+ * Resolve a user-supplied context name. Three outcomes:
111
+ * - exact / case-insensitive / unique-bare match → `{ ctx }`
112
+ * - bare name matches multiple contexts (e.g. local:personal AND cloud:personal)
113
+ * → `{ ctx: null, ambiguous: ["local:personal", "cloud:personal"] }`
114
+ * - no plausible match → `{ ctx: null, suggestions: [...] }`
115
+ */
116
+ export async function resolveContextName(input) {
117
+ const all = await listContexts();
118
+ const lower = input.toLowerCase();
119
+ const exact = all.find((c) => c.name === input);
120
+ if (exact)
121
+ return { ctx: exact };
122
+ const prefixed = all.find((c) => c.name.toLowerCase() === lower);
123
+ if (prefixed)
124
+ return { ctx: prefixed };
125
+ // Bare name (no `source:` prefix) → look for matches by suffix
126
+ const bareMatches = all.filter((c) => c.name.split(":").pop()?.toLowerCase() === lower);
127
+ if (bareMatches.length === 1)
128
+ return { ctx: bareMatches[0] };
129
+ if (bareMatches.length > 1) {
130
+ return { ctx: null, ambiguous: bareMatches.map((m) => m.name) };
131
+ }
132
+ // No bare match: offer suggestions
133
+ const suggestions = all
134
+ .map((c) => ({ name: c.name, score: similarityScore(c.name.toLowerCase(), lower) }))
135
+ .sort((a, b) => b.score - a.score)
136
+ .slice(0, 3)
137
+ .filter((s) => s.score > 0)
138
+ .map((s) => s.name);
139
+ return { ctx: null, suggestions };
140
+ }
141
+ function similarityScore(a, b) {
142
+ if (a.includes(b))
143
+ return 100 - (a.length - b.length);
144
+ if (b.includes(a))
145
+ return 100 - (b.length - a.length);
146
+ let common = 0;
147
+ for (const ch of new Set(b))
148
+ if (a.includes(ch))
149
+ common++;
150
+ return common;
151
+ }
152
+ export function describeContext(ctx) {
153
+ if (ctx.source === "local") {
154
+ return ctx.backpackPath ? `local:${path.basename(ctx.backpackPath)}` : "local";
155
+ }
156
+ return ctx.cloudContainer ? `cloud:${ctx.cloudContainer}` : "cloud (all containers)";
157
+ }
158
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/ops/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { LearningGraphData } from "../core/types.js";
2
+ export interface GraphSummary {
3
+ name: string;
4
+ description?: string;
5
+ tags?: string[];
6
+ nodeCount: number;
7
+ edgeCount: number;
8
+ /** Only meaningful for cloud graphs. */
9
+ encrypted?: boolean;
10
+ /** Cloud sync_backpack name, when source = cloud. */
11
+ sourceBackpack?: string;
12
+ /** "local" or "cloud" — where this row came from. */
13
+ origin: "local" | "cloud";
14
+ }
15
+ /** List graphs visible in the current context. */
16
+ export declare function listGraphs(): Promise<GraphSummary[]>;
17
+ export type GraphFetchResult = {
18
+ kind: "ok";
19
+ data: LearningGraphData;
20
+ } | {
21
+ kind: "missing";
22
+ } | {
23
+ kind: "encrypted";
24
+ };
25
+ /** Fetch a single graph's full data. Tagged result so callers can
26
+ * distinguish 404 (missing) from encrypted-on-cloud (server only has
27
+ * ciphertext) without making a second round-trip. */
28
+ export declare function getGraph(name: string): Promise<GraphFetchResult>;
29
+ /** Find a single summary by name without fetching the full graph data. */
30
+ export declare function getGraphSummary(name: string): Promise<GraphSummary | null>;
31
+ /** Create a new empty graph in the active context. */
32
+ export declare function createGraph(name: string, opts?: {
33
+ description?: string;
34
+ }): Promise<void>;
35
+ /** Delete a graph by name. Cloud is soft-delete (server-side), local is hard. */
36
+ export declare function deleteGraph(name: string): Promise<void>;
37
+ export declare function renameGraph(oldName: string, newName: string): Promise<void>;
38
+ /** Upsert a full graph payload by name. Used by `bp apply -f file`.
39
+ * Atomic on the local path — preserves branches, snapshots, snippets,
40
+ * the lock heartbeat. The cloud path is server-side idempotent. */
41
+ export declare function applyGraph(name: string, data: LearningGraphData): Promise<{
42
+ created: boolean;
43
+ }>;
44
+ export interface SearchHit {
45
+ graphName: string;
46
+ nodeId: string;
47
+ nodeType: string;
48
+ label: string;
49
+ }
50
+ export interface SearchResult {
51
+ hits: SearchHit[];
52
+ /** How many graphs we actually opened — capped to maxGraphs. */
53
+ graphsScanned: number;
54
+ /** Total graphs in scope (including encrypted ones we couldn't scan). */
55
+ graphsInScope: number;
56
+ /** Graphs skipped because they were encrypted or unscannable. */
57
+ graphsSkipped: number;
58
+ /** Hit a cap and stopped scanning. Surface this to the user so a "no
59
+ * matches" result doesn't look authoritative. */
60
+ truncated: boolean;
61
+ }
62
+ /** Search node properties across graphs in the current scope. Caps the
63
+ * number of graphs scanned (default 50) so a `bp search` against a 1000-
64
+ * graph backpack doesn't fan out into 1000 sequential GETs. */
65
+ export declare function searchGraphs(query: string, opts?: {
66
+ hitsPerGraph?: number;
67
+ maxGraphs?: number;
68
+ }): Promise<SearchResult>;
69
+ //# sourceMappingURL=graphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphs.d.ts","sourceRoot":"","sources":["../../src/ops/graphs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM1D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3B;AAsCD,kDAAkD;AAClD,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAgC1D;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B;;qDAEqD;AACrD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6BtE;AAED,0EAA0E;AAC1E,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAGhF;AAID,sDAAsD;AACtD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlG;AAED,iFAAiF;AACjF,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBjF;AAED;;mEAEmE;AACnE,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8BrG;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB;qDACiD;IACjD,SAAS,EAAE,OAAO,CAAC;CACpB;AAKD;;+DAE+D;AAC/D,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,OAAO,CAAC,YAAY,CAAC,CAqCvB"}
@@ -0,0 +1,278 @@
1
+ // Graph operations — the unified read surface that picks local vs cloud
2
+ // based on the active CLI context. Both the CLI and (eventually) MCP
3
+ // tools should funnel through this so behavior stays consistent.
4
+ import { Backpack } from "../core/backpack.js";
5
+ import { JsonFileBackend } from "../storage/json-file-backend.js";
6
+ import { getContext } from "./context.js";
7
+ import { resolveCloudToken, getRelayUrl, assertSafeRelay } from "./auth.js";
8
+ /** Lazily build a Backpack handle scoped to the active local folder. */
9
+ async function localBackpack() {
10
+ const ctx = await getContext();
11
+ if (ctx.source !== "local" || !ctx.backpackPath) {
12
+ throw new Error("active context is not a local backpack");
13
+ }
14
+ const backend = new JsonFileBackend(undefined, { graphsDirOverride: ctx.backpackPath });
15
+ await backend.initialize();
16
+ return new Backpack(backend);
17
+ }
18
+ async function fetchCloudGraphs(token) {
19
+ assertSafeRelay(getRelayUrl());
20
+ const res = await fetch(`${getRelayUrl()}/api/graphs`, {
21
+ headers: { Authorization: `Bearer ${token}` },
22
+ });
23
+ if (!res.ok) {
24
+ if (res.status === 401)
25
+ throw new Error("cloud session expired — run `bp login` to refresh");
26
+ throw new Error(`cloud /api/graphs returned HTTP ${res.status}`);
27
+ }
28
+ const body = await res.json();
29
+ return Array.isArray(body) ? body : [];
30
+ }
31
+ /** List graphs visible in the current context. */
32
+ export async function listGraphs() {
33
+ const ctx = await getContext();
34
+ if (ctx.source === "local") {
35
+ const bp = await localBackpack();
36
+ const summaries = await bp.listOntologies();
37
+ return summaries.map((s) => ({
38
+ name: s.name,
39
+ description: s.description,
40
+ tags: s.tags,
41
+ nodeCount: s.nodeCount,
42
+ edgeCount: s.edgeCount,
43
+ origin: "local",
44
+ }));
45
+ }
46
+ // Cloud: list everything the user has access to, filter by container.
47
+ const token = await resolveCloudToken();
48
+ if (!token)
49
+ throw new Error("not signed in — run `bp login` first");
50
+ const rows = await fetchCloudGraphs(token);
51
+ const wantContainer = (ctx.cloudContainer ?? "").trim();
52
+ const filtered = wantContainer
53
+ ? rows.filter((g) => g.sourceBackpack === wantContainer)
54
+ : rows;
55
+ return filtered.map((g) => ({
56
+ name: g.name,
57
+ description: g.description,
58
+ tags: [],
59
+ nodeCount: g.nodeCount ?? 0,
60
+ edgeCount: g.edgeCount ?? 0,
61
+ encrypted: g.encrypted,
62
+ sourceBackpack: g.sourceBackpack,
63
+ origin: "cloud",
64
+ }));
65
+ }
66
+ /** Fetch a single graph's full data. Tagged result so callers can
67
+ * distinguish 404 (missing) from encrypted-on-cloud (server only has
68
+ * ciphertext) without making a second round-trip. */
69
+ export async function getGraph(name) {
70
+ const ctx = await getContext();
71
+ if (ctx.source === "local") {
72
+ const bp = await localBackpack();
73
+ try {
74
+ const data = await bp.loadOntology(name);
75
+ return { kind: "ok", data };
76
+ }
77
+ catch (err) {
78
+ const msg = err.message;
79
+ if (/not found/i.test(msg))
80
+ return { kind: "missing" };
81
+ throw err;
82
+ }
83
+ }
84
+ const token = await resolveCloudToken();
85
+ if (!token)
86
+ throw new Error("not signed in — run `bp login` first");
87
+ assertSafeRelay(getRelayUrl());
88
+ const res = await fetch(`${getRelayUrl()}/api/graphs/${encodeURIComponent(name)}`, {
89
+ headers: { Authorization: `Bearer ${token}` },
90
+ });
91
+ if (res.status === 404)
92
+ return { kind: "missing" };
93
+ if (!res.ok) {
94
+ if (res.status === 401)
95
+ throw new Error("cloud session expired — run `bp login` to refresh");
96
+ throw new Error(`cloud /api/graphs/${name} returned HTTP ${res.status}`);
97
+ }
98
+ const data = await res.json();
99
+ // /api/graphs/{name} returns `null` for encrypted graphs (the server
100
+ // only has ciphertext, no plaintext to send).
101
+ if (data === null)
102
+ return { kind: "encrypted" };
103
+ return { kind: "ok", data: data };
104
+ }
105
+ /** Find a single summary by name without fetching the full graph data. */
106
+ export async function getGraphSummary(name) {
107
+ const all = await listGraphs();
108
+ return all.find((g) => g.name === name) ?? null;
109
+ }
110
+ /* ─────────────── Mutations ─────────────── */
111
+ /** Create a new empty graph in the active context. */
112
+ export async function createGraph(name, opts = {}) {
113
+ const ctx = await getContext();
114
+ if (ctx.source === "local") {
115
+ const bp = await localBackpack();
116
+ await bp.createOntology(name, opts.description ?? "");
117
+ return;
118
+ }
119
+ // Cloud: PUT /api/graphs/{name} with an empty graph payload. New
120
+ // cloud-native graphs land in the server's default "cloud" container;
121
+ // use `bp graphs move` to relocate.
122
+ const token = await resolveCloudToken();
123
+ if (!token)
124
+ throw new Error("not signed in — run `bp login` first");
125
+ assertSafeRelay(getRelayUrl());
126
+ const now = new Date().toISOString();
127
+ const empty = {
128
+ metadata: { name, description: opts.description ?? "", createdAt: now, updatedAt: now },
129
+ nodes: [],
130
+ edges: [],
131
+ };
132
+ const res = await fetch(`${getRelayUrl()}/api/graphs/${encodeURIComponent(name)}`, {
133
+ method: "PUT",
134
+ headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` },
135
+ body: JSON.stringify(empty),
136
+ });
137
+ if (!res.ok) {
138
+ if (res.status === 401)
139
+ throw new Error("cloud session expired — run `bp login` to refresh");
140
+ throw new Error(`cloud create returned HTTP ${res.status}`);
141
+ }
142
+ }
143
+ /** Delete a graph by name. Cloud is soft-delete (server-side), local is hard. */
144
+ export async function deleteGraph(name) {
145
+ const ctx = await getContext();
146
+ if (ctx.source === "local") {
147
+ const bp = await localBackpack();
148
+ await bp.deleteOntology(name);
149
+ return;
150
+ }
151
+ const token = await resolveCloudToken();
152
+ if (!token)
153
+ throw new Error("not signed in — run `bp login` first");
154
+ assertSafeRelay(getRelayUrl());
155
+ const res = await fetch(`${getRelayUrl()}/api/graphs/${encodeURIComponent(name)}`, {
156
+ method: "DELETE",
157
+ headers: { Authorization: `Bearer ${token}` },
158
+ });
159
+ if (res.status === 404)
160
+ throw new Error(`graph "${name}" not found in the current scope`);
161
+ if (!res.ok) {
162
+ if (res.status === 401)
163
+ throw new Error("cloud session expired — run `bp login` to refresh");
164
+ throw new Error(`cloud delete returned HTTP ${res.status}`);
165
+ }
166
+ }
167
+ export async function renameGraph(oldName, newName) {
168
+ const ctx = await getContext();
169
+ if (ctx.source === "local") {
170
+ const bp = await localBackpack();
171
+ await bp.renameOntology(oldName, newName);
172
+ return;
173
+ }
174
+ const token = await resolveCloudToken();
175
+ if (!token)
176
+ throw new Error("not signed in — run `bp login` first");
177
+ assertSafeRelay(getRelayUrl());
178
+ const res = await fetch(`${getRelayUrl()}/api/graphs/${encodeURIComponent(oldName)}/rename`, {
179
+ method: "POST",
180
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
181
+ body: JSON.stringify({ name: newName }),
182
+ });
183
+ if (res.status === 404)
184
+ throw new Error(`graph "${oldName}" not found in the current scope`);
185
+ if (!res.ok) {
186
+ if (res.status === 401)
187
+ throw new Error("cloud session expired — run `bp login` to refresh");
188
+ if (res.status === 409)
189
+ throw new Error(`a graph named "${newName}" already exists`);
190
+ throw new Error(`cloud rename returned HTTP ${res.status}`);
191
+ }
192
+ }
193
+ /** Upsert a full graph payload by name. Used by `bp apply -f file`.
194
+ * Atomic on the local path — preserves branches, snapshots, snippets,
195
+ * the lock heartbeat. The cloud path is server-side idempotent. */
196
+ export async function applyGraph(name, data) {
197
+ const ctx = await getContext();
198
+ if (ctx.source === "local") {
199
+ const bp = await localBackpack();
200
+ const exists = await bp.ontologyExists(name);
201
+ if (exists) {
202
+ await bp.saveOntologyData(name, data);
203
+ }
204
+ else {
205
+ await bp.createOntologyFromData(name, data);
206
+ }
207
+ return { created: !exists };
208
+ }
209
+ const token = await resolveCloudToken();
210
+ if (!token)
211
+ throw new Error("not signed in — run `bp login` first");
212
+ assertSafeRelay(getRelayUrl());
213
+ // Note: the relay's PUT /api/graphs/{name} doesn't honor an
214
+ // X-Backpack-Source-Name hint for new graphs (only the legacy
215
+ // /sync endpoint does). New cloud-native graphs land in the default
216
+ // "cloud" container. Use `bp graphs move <name> --to <container>`
217
+ // (Step 4) after creation if you need them in a specific container.
218
+ const res = await fetch(`${getRelayUrl()}/api/graphs/${encodeURIComponent(name)}`, {
219
+ method: "PUT",
220
+ headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` },
221
+ body: JSON.stringify(data),
222
+ });
223
+ if (!res.ok) {
224
+ if (res.status === 401)
225
+ throw new Error("cloud session expired — run `bp login` to refresh");
226
+ throw new Error(`cloud apply returned HTTP ${res.status}`);
227
+ }
228
+ return { created: false };
229
+ }
230
+ const SEARCH_DEFAULT_MAX_GRAPHS = 50;
231
+ const SEARCH_DEFAULT_HITS_PER_GRAPH = 5;
232
+ /** Search node properties across graphs in the current scope. Caps the
233
+ * number of graphs scanned (default 50) so a `bp search` against a 1000-
234
+ * graph backpack doesn't fan out into 1000 sequential GETs. */
235
+ export async function searchGraphs(query, opts = {}) {
236
+ const trimmed = query.trim();
237
+ if (!trimmed) {
238
+ return { hits: [], graphsScanned: 0, graphsInScope: 0, graphsSkipped: 0, truncated: false };
239
+ }
240
+ const q = trimmed.toLowerCase();
241
+ const hitsPerGraph = opts.hitsPerGraph ?? SEARCH_DEFAULT_HITS_PER_GRAPH;
242
+ const maxGraphs = opts.maxGraphs ?? SEARCH_DEFAULT_MAX_GRAPHS;
243
+ const summaries = await listGraphs();
244
+ const scannable = summaries.filter((s) => !s.encrypted);
245
+ const truncated = scannable.length > maxGraphs;
246
+ const targets = scannable.slice(0, maxGraphs);
247
+ const hits = [];
248
+ for (const s of targets) {
249
+ let result;
250
+ try {
251
+ result = await getGraph(s.name);
252
+ }
253
+ catch {
254
+ continue;
255
+ }
256
+ if (result.kind !== "ok")
257
+ continue;
258
+ let countInThis = 0;
259
+ for (const n of result.data.nodes) {
260
+ const label = Object.values(n.properties ?? {}).find((v) => typeof v === "string") ?? n.id;
261
+ const haystack = (n.type + " " + Object.values(n.properties ?? {}).filter((v) => typeof v === "string").join(" ")).toLowerCase();
262
+ if (haystack.includes(q)) {
263
+ hits.push({ graphName: s.name, nodeId: n.id, nodeType: n.type, label });
264
+ countInThis++;
265
+ if (countInThis >= hitsPerGraph)
266
+ break;
267
+ }
268
+ }
269
+ }
270
+ return {
271
+ hits,
272
+ graphsScanned: targets.length,
273
+ graphsInScope: summaries.length,
274
+ graphsSkipped: summaries.length - targets.length,
275
+ truncated,
276
+ };
277
+ }
278
+ //# sourceMappingURL=graphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphs.js","sourceRoot":"","sources":["../../src/ops/graphs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface KBSummary {
2
+ id: string;
3
+ title: string;
4
+ tags: string[];
5
+ sourceGraphs: string[];
6
+ collection?: string;
7
+ /** Cloud sync_backpack name when origin = cloud. */
8
+ sourceBackpack?: string;
9
+ origin: "local" | "cloud";
10
+ }
11
+ /** List KB documents in the active context. */
12
+ export declare function listKB(): Promise<KBSummary[]>;
13
+ export interface KBDocument extends KBSummary {
14
+ content: string;
15
+ }
16
+ export interface KBSaveInput {
17
+ /** Existing id when updating; omit for create. */
18
+ id?: string;
19
+ title: string;
20
+ content: string;
21
+ tags?: string[];
22
+ sourceGraphs?: string[];
23
+ collection?: string;
24
+ }
25
+ /** Create or update a KB document. Local writes go through DocumentStore.
26
+ * Cloud writes hit /api/kb/documents (POST for create, PUT for update). */
27
+ export declare function saveKB(input: KBSaveInput): Promise<{
28
+ id: string;
29
+ created: boolean;
30
+ }>;
31
+ export declare function deleteKB(id: string): Promise<void>;
32
+ export declare function getKB(id: string): Promise<KBDocument | null>;
33
+ //# sourceMappingURL=kb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb.d.ts","sourceRoot":"","sources":["../../src/ops/kb.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3B;AA+BD,+CAA+C;AAC/C,wBAAsB,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAuCnD;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;2EAC2E;AAC3E,wBAAsB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAmC1F;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBxD;AAED,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAsClE"}