@ryanstark24/sfgraph-server 1.1.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 (261) hide show
  1. package/dist/__tests__/context-cache.test.d.ts +2 -0
  2. package/dist/__tests__/context-cache.test.d.ts.map +1 -0
  3. package/dist/__tests__/context-cache.test.js +77 -0
  4. package/dist/__tests__/context-cache.test.js.map +1 -0
  5. package/dist/__tests__/context-default-factory.test.d.ts +2 -0
  6. package/dist/__tests__/context-default-factory.test.d.ts.map +1 -0
  7. package/dist/__tests__/context-default-factory.test.js +89 -0
  8. package/dist/__tests__/context-default-factory.test.js.map +1 -0
  9. package/dist/__tests__/network-egress.test.d.ts +2 -0
  10. package/dist/__tests__/network-egress.test.d.ts.map +1 -0
  11. package/dist/__tests__/network-egress.test.js +33 -0
  12. package/dist/__tests__/network-egress.test.js.map +1 -0
  13. package/dist/__tests__/shutdown.test.d.ts +2 -0
  14. package/dist/__tests__/shutdown.test.d.ts.map +1 -0
  15. package/dist/__tests__/shutdown.test.js +78 -0
  16. package/dist/__tests__/shutdown.test.js.map +1 -0
  17. package/dist/__tests__/tool-registry.test.d.ts +2 -0
  18. package/dist/__tests__/tool-registry.test.d.ts.map +1 -0
  19. package/dist/__tests__/tool-registry.test.js +21 -0
  20. package/dist/__tests__/tool-registry.test.js.map +1 -0
  21. package/dist/__tests__/zod-schema.test.d.ts +2 -0
  22. package/dist/__tests__/zod-schema.test.d.ts.map +1 -0
  23. package/dist/__tests__/zod-schema.test.js +15 -0
  24. package/dist/__tests__/zod-schema.test.js.map +1 -0
  25. package/dist/bin.d.ts +2 -0
  26. package/dist/bin.d.ts.map +1 -0
  27. package/dist/bin.js +14 -0
  28. package/dist/bin.js.map +1 -0
  29. package/dist/context.d.ts +29 -0
  30. package/dist/context.d.ts.map +1 -0
  31. package/dist/context.js +202 -0
  32. package/dist/context.js.map +1 -0
  33. package/dist/index.d.ts +8 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +6 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/server.d.ts +31 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +91 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/shutdown.d.ts +10 -0
  42. package/dist/shutdown.d.ts.map +1 -0
  43. package/dist/shutdown.js +43 -0
  44. package/dist/shutdown.js.map +1 -0
  45. package/dist/tool-registry.d.ts +31 -0
  46. package/dist/tool-registry.d.ts.map +1 -0
  47. package/dist/tool-registry.js +29 -0
  48. package/dist/tool-registry.js.map +1 -0
  49. package/dist/tools/__tests__/_fixture.d.ts +29 -0
  50. package/dist/tools/__tests__/_fixture.d.ts.map +1 -0
  51. package/dist/tools/__tests__/_fixture.js +59 -0
  52. package/dist/tools/__tests__/_fixture.js.map +1 -0
  53. package/dist/tools/__tests__/_runner.d.ts +10 -0
  54. package/dist/tools/__tests__/_runner.d.ts.map +1 -0
  55. package/dist/tools/__tests__/_runner.js +12 -0
  56. package/dist/tools/__tests__/_runner.js.map +1 -0
  57. package/dist/tools/__tests__/analyze_field.test.d.ts +2 -0
  58. package/dist/tools/__tests__/analyze_field.test.d.ts.map +1 -0
  59. package/dist/tools/__tests__/analyze_field.test.js +92 -0
  60. package/dist/tools/__tests__/analyze_field.test.js.map +1 -0
  61. package/dist/tools/__tests__/cross_layer_flow_map.test.d.ts +2 -0
  62. package/dist/tools/__tests__/cross_layer_flow_map.test.d.ts.map +1 -0
  63. package/dist/tools/__tests__/cross_layer_flow_map.test.js +111 -0
  64. package/dist/tools/__tests__/cross_layer_flow_map.test.js.map +1 -0
  65. package/dist/tools/__tests__/cross_org_diff.test.d.ts +2 -0
  66. package/dist/tools/__tests__/cross_org_diff.test.d.ts.map +1 -0
  67. package/dist/tools/__tests__/cross_org_diff.test.js +112 -0
  68. package/dist/tools/__tests__/cross_org_diff.test.js.map +1 -0
  69. package/dist/tools/__tests__/dead_code_audit.test.d.ts +2 -0
  70. package/dist/tools/__tests__/dead_code_audit.test.d.ts.map +1 -0
  71. package/dist/tools/__tests__/dead_code_audit.test.js +71 -0
  72. package/dist/tools/__tests__/dead_code_audit.test.js.map +1 -0
  73. package/dist/tools/__tests__/deployment_manifest_gen.test.d.ts +2 -0
  74. package/dist/tools/__tests__/deployment_manifest_gen.test.d.ts.map +1 -0
  75. package/dist/tools/__tests__/deployment_manifest_gen.test.js +143 -0
  76. package/dist/tools/__tests__/deployment_manifest_gen.test.js.map +1 -0
  77. package/dist/tools/__tests__/dispatcher.test.d.ts +2 -0
  78. package/dist/tools/__tests__/dispatcher.test.d.ts.map +1 -0
  79. package/dist/tools/__tests__/dispatcher.test.js +39 -0
  80. package/dist/tools/__tests__/dispatcher.test.js.map +1 -0
  81. package/dist/tools/__tests__/explain_code.test.d.ts +2 -0
  82. package/dist/tools/__tests__/explain_code.test.d.ts.map +1 -0
  83. package/dist/tools/__tests__/explain_code.test.js +88 -0
  84. package/dist/tools/__tests__/explain_code.test.js.map +1 -0
  85. package/dist/tools/__tests__/freshness_report.test.d.ts +2 -0
  86. package/dist/tools/__tests__/freshness_report.test.d.ts.map +1 -0
  87. package/dist/tools/__tests__/freshness_report.test.js +103 -0
  88. package/dist/tools/__tests__/freshness_report.test.js.map +1 -0
  89. package/dist/tools/__tests__/get_ingest_job.test.d.ts +2 -0
  90. package/dist/tools/__tests__/get_ingest_job.test.d.ts.map +1 -0
  91. package/dist/tools/__tests__/get_ingest_job.test.js +42 -0
  92. package/dist/tools/__tests__/get_ingest_job.test.js.map +1 -0
  93. package/dist/tools/__tests__/governor_risk_check.test.d.ts +2 -0
  94. package/dist/tools/__tests__/governor_risk_check.test.d.ts.map +1 -0
  95. package/dist/tools/__tests__/governor_risk_check.test.js +66 -0
  96. package/dist/tools/__tests__/governor_risk_check.test.js.map +1 -0
  97. package/dist/tools/__tests__/impact_from_git_diff.test.d.ts +2 -0
  98. package/dist/tools/__tests__/impact_from_git_diff.test.d.ts.map +1 -0
  99. package/dist/tools/__tests__/impact_from_git_diff.test.js +115 -0
  100. package/dist/tools/__tests__/impact_from_git_diff.test.js.map +1 -0
  101. package/dist/tools/__tests__/list_orgs.test.d.ts +2 -0
  102. package/dist/tools/__tests__/list_orgs.test.d.ts.map +1 -0
  103. package/dist/tools/__tests__/list_orgs.test.js +137 -0
  104. package/dist/tools/__tests__/list_orgs.test.js.map +1 -0
  105. package/dist/tools/__tests__/ping.test.d.ts +2 -0
  106. package/dist/tools/__tests__/ping.test.d.ts.map +1 -0
  107. package/dist/tools/__tests__/ping.test.js +10 -0
  108. package/dist/tools/__tests__/ping.test.js.map +1 -0
  109. package/dist/tools/__tests__/point_in_time_diff.test.d.ts +2 -0
  110. package/dist/tools/__tests__/point_in_time_diff.test.d.ts.map +1 -0
  111. package/dist/tools/__tests__/point_in_time_diff.test.js +64 -0
  112. package/dist/tools/__tests__/point_in_time_diff.test.js.map +1 -0
  113. package/dist/tools/__tests__/security_audit.test.d.ts +2 -0
  114. package/dist/tools/__tests__/security_audit.test.d.ts.map +1 -0
  115. package/dist/tools/__tests__/security_audit.test.js +99 -0
  116. package/dist/tools/__tests__/security_audit.test.js.map +1 -0
  117. package/dist/tools/__tests__/snapshot.test.d.ts +2 -0
  118. package/dist/tools/__tests__/snapshot.test.d.ts.map +1 -0
  119. package/dist/tools/__tests__/snapshot.test.js +54 -0
  120. package/dist/tools/__tests__/snapshot.test.js.map +1 -0
  121. package/dist/tools/__tests__/staleness_check.test.d.ts +2 -0
  122. package/dist/tools/__tests__/staleness_check.test.d.ts.map +1 -0
  123. package/dist/tools/__tests__/staleness_check.test.js +51 -0
  124. package/dist/tools/__tests__/staleness_check.test.js.map +1 -0
  125. package/dist/tools/__tests__/start_ingest_job.test.d.ts +2 -0
  126. package/dist/tools/__tests__/start_ingest_job.test.d.ts.map +1 -0
  127. package/dist/tools/__tests__/start_ingest_job.test.js +55 -0
  128. package/dist/tools/__tests__/start_ingest_job.test.js.map +1 -0
  129. package/dist/tools/__tests__/test_gap_intelligence.test.d.ts +2 -0
  130. package/dist/tools/__tests__/test_gap_intelligence.test.d.ts.map +1 -0
  131. package/dist/tools/__tests__/test_gap_intelligence.test.js +77 -0
  132. package/dist/tools/__tests__/test_gap_intelligence.test.js.map +1 -0
  133. package/dist/tools/__tests__/trace.test.d.ts +2 -0
  134. package/dist/tools/__tests__/trace.test.d.ts.map +1 -0
  135. package/dist/tools/__tests__/trace.test.js +130 -0
  136. package/dist/tools/__tests__/trace.test.js.map +1 -0
  137. package/dist/tools/__tests__/what_broke.test.d.ts +2 -0
  138. package/dist/tools/__tests__/what_broke.test.d.ts.map +1 -0
  139. package/dist/tools/__tests__/what_broke.test.js +60 -0
  140. package/dist/tools/__tests__/what_broke.test.js.map +1 -0
  141. package/dist/tools/__tests__/wip.test.d.ts +2 -0
  142. package/dist/tools/__tests__/wip.test.d.ts.map +1 -0
  143. package/dist/tools/__tests__/wip.test.js +173 -0
  144. package/dist/tools/__tests__/wip.test.js.map +1 -0
  145. package/dist/tools/_define.d.ts +11 -0
  146. package/dist/tools/_define.d.ts.map +1 -0
  147. package/dist/tools/_define.js +29 -0
  148. package/dist/tools/_define.js.map +1 -0
  149. package/dist/tools/_job-store.d.ts +19 -0
  150. package/dist/tools/_job-store.d.ts.map +1 -0
  151. package/dist/tools/_job-store.js +26 -0
  152. package/dist/tools/_job-store.js.map +1 -0
  153. package/dist/tools/_project-root.d.ts +20 -0
  154. package/dist/tools/_project-root.d.ts.map +1 -0
  155. package/dist/tools/_project-root.js +44 -0
  156. package/dist/tools/_project-root.js.map +1 -0
  157. package/dist/tools/analyze_field.d.ts +2 -0
  158. package/dist/tools/analyze_field.d.ts.map +1 -0
  159. package/dist/tools/analyze_field.js +77 -0
  160. package/dist/tools/analyze_field.js.map +1 -0
  161. package/dist/tools/cross_layer_flow_map.d.ts +2 -0
  162. package/dist/tools/cross_layer_flow_map.d.ts.map +1 -0
  163. package/dist/tools/cross_layer_flow_map.js +104 -0
  164. package/dist/tools/cross_layer_flow_map.js.map +1 -0
  165. package/dist/tools/cross_org_diff.d.ts +2 -0
  166. package/dist/tools/cross_org_diff.d.ts.map +1 -0
  167. package/dist/tools/cross_org_diff.js +59 -0
  168. package/dist/tools/cross_org_diff.js.map +1 -0
  169. package/dist/tools/dead_code_audit.d.ts +2 -0
  170. package/dist/tools/dead_code_audit.d.ts.map +1 -0
  171. package/dist/tools/dead_code_audit.js +67 -0
  172. package/dist/tools/dead_code_audit.js.map +1 -0
  173. package/dist/tools/deployment_manifest_gen.d.ts +2 -0
  174. package/dist/tools/deployment_manifest_gen.d.ts.map +1 -0
  175. package/dist/tools/deployment_manifest_gen.js +43 -0
  176. package/dist/tools/deployment_manifest_gen.js.map +1 -0
  177. package/dist/tools/explain_code.d.ts +2 -0
  178. package/dist/tools/explain_code.d.ts.map +1 -0
  179. package/dist/tools/explain_code.js +109 -0
  180. package/dist/tools/explain_code.js.map +1 -0
  181. package/dist/tools/freshness_report.d.ts +2 -0
  182. package/dist/tools/freshness_report.d.ts.map +1 -0
  183. package/dist/tools/freshness_report.js +66 -0
  184. package/dist/tools/freshness_report.js.map +1 -0
  185. package/dist/tools/get_ingest_job.d.ts +2 -0
  186. package/dist/tools/get_ingest_job.d.ts.map +1 -0
  187. package/dist/tools/get_ingest_job.js +24 -0
  188. package/dist/tools/get_ingest_job.js.map +1 -0
  189. package/dist/tools/governor_risk_check.d.ts +2 -0
  190. package/dist/tools/governor_risk_check.d.ts.map +1 -0
  191. package/dist/tools/governor_risk_check.js +50 -0
  192. package/dist/tools/governor_risk_check.js.map +1 -0
  193. package/dist/tools/impact_from_git_diff.d.ts +2 -0
  194. package/dist/tools/impact_from_git_diff.d.ts.map +1 -0
  195. package/dist/tools/impact_from_git_diff.js +67 -0
  196. package/dist/tools/impact_from_git_diff.js.map +1 -0
  197. package/dist/tools/index.d.ts +27 -0
  198. package/dist/tools/index.d.ts.map +1 -0
  199. package/dist/tools/index.js +28 -0
  200. package/dist/tools/index.js.map +1 -0
  201. package/dist/tools/list_orgs.d.ts +30 -0
  202. package/dist/tools/list_orgs.d.ts.map +1 -0
  203. package/dist/tools/list_orgs.js +302 -0
  204. package/dist/tools/list_orgs.js.map +1 -0
  205. package/dist/tools/ping.d.ts +3 -0
  206. package/dist/tools/ping.d.ts.map +1 -0
  207. package/dist/tools/ping.js +23 -0
  208. package/dist/tools/ping.js.map +1 -0
  209. package/dist/tools/point_in_time_diff.d.ts +2 -0
  210. package/dist/tools/point_in_time_diff.d.ts.map +1 -0
  211. package/dist/tools/point_in_time_diff.js +37 -0
  212. package/dist/tools/point_in_time_diff.js.map +1 -0
  213. package/dist/tools/security_audit.d.ts +2 -0
  214. package/dist/tools/security_audit.d.ts.map +1 -0
  215. package/dist/tools/security_audit.js +56 -0
  216. package/dist/tools/security_audit.js.map +1 -0
  217. package/dist/tools/snapshot_create.d.ts +2 -0
  218. package/dist/tools/snapshot_create.d.ts.map +1 -0
  219. package/dist/tools/snapshot_create.js +24 -0
  220. package/dist/tools/snapshot_create.js.map +1 -0
  221. package/dist/tools/snapshot_list.d.ts +2 -0
  222. package/dist/tools/snapshot_list.d.ts.map +1 -0
  223. package/dist/tools/snapshot_list.js +22 -0
  224. package/dist/tools/snapshot_list.js.map +1 -0
  225. package/dist/tools/staleness_check.d.ts +2 -0
  226. package/dist/tools/staleness_check.d.ts.map +1 -0
  227. package/dist/tools/staleness_check.js +50 -0
  228. package/dist/tools/staleness_check.js.map +1 -0
  229. package/dist/tools/start_ingest_job.d.ts +2 -0
  230. package/dist/tools/start_ingest_job.d.ts.map +1 -0
  231. package/dist/tools/start_ingest_job.js +83 -0
  232. package/dist/tools/start_ingest_job.js.map +1 -0
  233. package/dist/tools/test_gap_intelligence_from_git_diff.d.ts +2 -0
  234. package/dist/tools/test_gap_intelligence_from_git_diff.d.ts.map +1 -0
  235. package/dist/tools/test_gap_intelligence_from_git_diff.js +50 -0
  236. package/dist/tools/test_gap_intelligence_from_git_diff.js.map +1 -0
  237. package/dist/tools/trace_downstream.d.ts +2 -0
  238. package/dist/tools/trace_downstream.d.ts.map +1 -0
  239. package/dist/tools/trace_downstream.js +43 -0
  240. package/dist/tools/trace_downstream.js.map +1 -0
  241. package/dist/tools/trace_upstream.d.ts +2 -0
  242. package/dist/tools/trace_upstream.d.ts.map +1 -0
  243. package/dist/tools/trace_upstream.js +43 -0
  244. package/dist/tools/trace_upstream.js.map +1 -0
  245. package/dist/tools/what_broke.d.ts +2 -0
  246. package/dist/tools/what_broke.d.ts.map +1 -0
  247. package/dist/tools/what_broke.js +86 -0
  248. package/dist/tools/what_broke.js.map +1 -0
  249. package/dist/tools/wip_diff.d.ts +2 -0
  250. package/dist/tools/wip_diff.d.ts.map +1 -0
  251. package/dist/tools/wip_diff.js +55 -0
  252. package/dist/tools/wip_diff.js.map +1 -0
  253. package/dist/tools/wip_impact.d.ts +2 -0
  254. package/dist/tools/wip_impact.d.ts.map +1 -0
  255. package/dist/tools/wip_impact.js +55 -0
  256. package/dist/tools/wip_impact.js.map +1 -0
  257. package/dist/tools/wip_test_gap.d.ts +2 -0
  258. package/dist/tools/wip_test_gap.d.ts.map +1 -0
  259. package/dist/tools/wip_test_gap.js +50 -0
  260. package/dist/tools/wip_test_gap.js.map +1 -0
  261. package/package.json +61 -0
@@ -0,0 +1,202 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { loadBetterSqlite3 } from "@ryanstark24/sfgraph-core";
4
+ import { ErrorCode, SfgraphError, asOrgId, getSfgraphPaths, safeOrgDbPath, validateOrgIdentifier, } from "@ryanstark24/sfgraph-shared";
5
+ let factory = null;
6
+ /**
7
+ * Per-orgId cache so we reuse stores across tool calls. Bounded to
8
+ * `CONTEXT_CACHE_MAX` entries — when full, the oldest entry is evicted
9
+ * and its store is closed. Prevents unbounded file-handle / memory growth
10
+ * when an agent rotates through many orgs.
11
+ */
12
+ const CONTEXT_CACHE_MAX = 8;
13
+ const contextCache = new Map();
14
+ /**
15
+ * Salesforce Organization IDs start with the `00D` key-prefix and are
16
+ * 15 or 18 chars total. We use this regex (rather than naked string length)
17
+ * to decide whether a user-supplied identifier is an orgId or an alias —
18
+ * a 15/18-char alias would otherwise be misclassified.
19
+ */
20
+ const SF_ORG_ID_RE = /^00D[A-Za-z0-9]{12}([A-Za-z0-9]{3})?$/;
21
+ function isSalesforceOrgId(s) {
22
+ return SF_ORG_ID_RE.test(s);
23
+ }
24
+ async function closeStoreQuietly(ctx) {
25
+ try {
26
+ await ctx.graphStore.close?.();
27
+ }
28
+ catch {
29
+ // best-effort
30
+ }
31
+ }
32
+ function rememberInCache(key, ctx) {
33
+ // Evict oldest if full. Map preserves insertion order so the first key is
34
+ // the oldest. fire-and-forget close — eviction must be synchronous w.r.t.
35
+ // the cache state.
36
+ while (contextCache.size >= CONTEXT_CACHE_MAX) {
37
+ const oldestKey = contextCache.keys().next().value;
38
+ if (oldestKey === undefined)
39
+ break;
40
+ const oldest = contextCache.get(oldestKey);
41
+ contextCache.delete(oldestKey);
42
+ if (oldest)
43
+ void closeStoreQuietly(oldest);
44
+ }
45
+ contextCache.set(key, ctx);
46
+ }
47
+ export function setToolContextFactory(fn) {
48
+ factory = fn;
49
+ // Tests swap factories — clear cache so they don't see stale stores.
50
+ contextCache.clear();
51
+ }
52
+ /**
53
+ * Resolve a `ToolContext` for the given org. Validates the identifier,
54
+ * caches the result by canonical orgId so repeated tool calls reuse the
55
+ * same open stores instead of opening fresh handles each time.
56
+ */
57
+ export async function getToolContext(opts = {}) {
58
+ if (!factory) {
59
+ factory = defaultFactory;
60
+ }
61
+ const rawKey = opts.orgId ?? "default";
62
+ // Always validate the user-supplied identifier at the entry point — even
63
+ // when a test factory is installed — so security checks aren't bypassed.
64
+ validateOrgIdentifier(rawKey);
65
+ const cached = contextCache.get(rawKey);
66
+ if (cached)
67
+ return cached;
68
+ const ctx = await factory(opts);
69
+ // Cache by the raw key so repeated calls with the same alias / id reuse
70
+ // the same store. The factory's own canonical-orgId resolution is still
71
+ // applied inside ctx.orgId.
72
+ rememberInCache(rawKey, ctx);
73
+ return ctx;
74
+ }
75
+ /**
76
+ * Close every cached store and clear the cache. Wired into shutdown handlers
77
+ * so file handles aren't leaked when the MCP server exits. Idempotent.
78
+ */
79
+ export async function closeAllContexts() {
80
+ const entries = [...contextCache.values()];
81
+ contextCache.clear();
82
+ for (const ctx of entries) {
83
+ await closeStoreQuietly(ctx);
84
+ }
85
+ }
86
+ /** Exposed for tests so they can assert the cache bound. */
87
+ export function _contextCacheSize() {
88
+ return contextCache.size;
89
+ }
90
+ /**
91
+ * Resolve an alias to the canonical orgId by scanning local `<orgId>.sqlite`
92
+ * files for an `_sfgraph_orgs` row with `alias = ?`. Returns the orgId if
93
+ * found, else `null`. Doing this BEFORE we build the DB path keeps the
94
+ * on-disk file keyed by orgId (not by the user-supplied alias).
95
+ */
96
+ async function resolveAliasToOrgId(dataDir, alias) {
97
+ if (!existsSync(dataDir))
98
+ return null;
99
+ let files = [];
100
+ try {
101
+ files = readdirSync(dataDir).filter((f) => f.endsWith(".sqlite") && !f.startsWith("backups"));
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ const { createRequire } = await import("node:module");
107
+ const nodeRequire = createRequire(import.meta.url);
108
+ let Database;
109
+ try {
110
+ Database = loadBetterSqlite3(nodeRequire);
111
+ }
112
+ catch {
113
+ return null;
114
+ }
115
+ const Ctor = Database;
116
+ for (const f of files) {
117
+ const candidate = f.replace(/\.sqlite$/, "");
118
+ if (!isSalesforceOrgId(candidate)) {
119
+ continue; // skip files whose name isn't a real orgId
120
+ }
121
+ const dbPath = path.join(dataDir, f);
122
+ try {
123
+ const db = new Ctor(dbPath, { readonly: true, fileMustExist: true });
124
+ try {
125
+ const row = db.prepare("SELECT id FROM _sfgraph_orgs WHERE alias = ?").get(alias);
126
+ if (row?.id)
127
+ return row.id;
128
+ }
129
+ finally {
130
+ db.close();
131
+ }
132
+ }
133
+ catch {
134
+ // ignore unreadable / non-sfgraph dbs
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+ /**
140
+ * Try to resolve an alias to an orgId via the `sf` CLI's authenticated
141
+ * orgs. Used as a fallback so a freshly-authenticated alias that has never
142
+ * been ingested still works without silently creating an empty DB keyed by
143
+ * the alias string.
144
+ */
145
+ async function resolveAliasViaSfCli(alias) {
146
+ try {
147
+ const core = await import("@ryanstark24/sfgraph-core");
148
+ const resolved = await core.resolveOrg(alias);
149
+ if (resolved?.orgId && isSalesforceOrgId(String(resolved.orgId))) {
150
+ return String(resolved.orgId);
151
+ }
152
+ }
153
+ catch {
154
+ /* alias not known to sf CLI */
155
+ }
156
+ return null;
157
+ }
158
+ async function defaultFactory(opts) {
159
+ const orgIdOrAlias = opts.orgId ?? "default";
160
+ // Hard-fail on malformed input BEFORE any path joinery.
161
+ validateOrgIdentifier(orgIdOrAlias);
162
+ const paths = getSfgraphPaths();
163
+ // Resolve alias -> orgId up-front so the on-disk file is always
164
+ // <dataDir>/<orgId>.sqlite, not <dataDir>/<alias>.sqlite.
165
+ let resolvedOrgId = orgIdOrAlias;
166
+ if (isSalesforceOrgId(orgIdOrAlias)) {
167
+ resolvedOrgId = orgIdOrAlias;
168
+ }
169
+ else {
170
+ const fromLocal = await resolveAliasToOrgId(paths.data, orgIdOrAlias);
171
+ if (fromLocal) {
172
+ validateOrgIdentifier(fromLocal);
173
+ resolvedOrgId = fromLocal;
174
+ }
175
+ else {
176
+ const fromSf = await resolveAliasViaSfCli(orgIdOrAlias);
177
+ if (fromSf) {
178
+ validateOrgIdentifier(fromSf);
179
+ resolvedOrgId = fromSf;
180
+ }
181
+ else {
182
+ // Unknown alias: no existing ingested DB and no sf-CLI binding. Reject
183
+ // rather than silently creating an empty `<alias>.sqlite`.
184
+ throw new SfgraphError(ErrorCode.E_INVALID_ORG_IDENTIFIER, `unknown org identifier '${orgIdOrAlias}': not a Salesforce 15/18-char orgId, no existing sfgraph DB has this alias, and the sf CLI does not recognise it. Run 'sf org login web --alias ${orgIdOrAlias}' and then 'sfgraph ingest --org ${orgIdOrAlias}' first.`);
185
+ }
186
+ }
187
+ }
188
+ const dbPath = safeOrgDbPath(paths.data, resolvedOrgId);
189
+ const { SqliteGraphStore, SqliteSnapshotStore } = await import("@ryanstark24/sfgraph-core");
190
+ const graphStore = new SqliteGraphStore({ dbPath });
191
+ await graphStore.init();
192
+ const snapshotStore = new SqliteSnapshotStore({
193
+ dbPath,
194
+ db: graphStore.db,
195
+ skipMigrations: true,
196
+ });
197
+ await snapshotStore.init();
198
+ const db = graphStore.db;
199
+ const ctx = { graphStore, snapshotStore, orgId: asOrgId(resolvedOrgId), db };
200
+ return ctx;
201
+ }
202
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { SfgraphMcpServer } from "./server.js";
2
+ export { ToolRegistry } from "./tool-registry.js";
3
+ export type { ToolHandler, ToolSchema, RegisteredTool } from "./tool-registry.js";
4
+ export { installShutdownHandlers } from "./shutdown.js";
5
+ export type { ShutdownOpts, Disposer } from "./shutdown.js";
6
+ export { pingTool } from "./tools/ping.js";
7
+ export { runMcpServer } from "./bin.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { SfgraphMcpServer } from "./server.js";
2
+ export { ToolRegistry } from "./tool-registry.js";
3
+ export { installShutdownHandlers } from "./shutdown.js";
4
+ export { pingTool } from "./tools/ping.js";
5
+ export { runMcpServer } from "./bin.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { ToolRegistry } from "./tool-registry.js";
2
+ export interface SfgraphMcpServerOpts {
3
+ registry?: ToolRegistry;
4
+ }
5
+ export declare class SfgraphMcpServer {
6
+ readonly registry: ToolRegistry;
7
+ constructor(opts?: SfgraphMcpServerOpts);
8
+ registerDefaults(): void;
9
+ /**
10
+ * Side-effect import every tool module so they register on defaultRegistry,
11
+ * then copy missing tools into this.registry.
12
+ */
13
+ loadAllTools(): Promise<void>;
14
+ /**
15
+ * Start the stdio MCP server. Lazy-imports the SDK so tests/CLI work without
16
+ * forcing the SDK load when not needed.
17
+ */
18
+ startStdio(): Promise<void>;
19
+ /**
20
+ * Public dispatcher used by stdio handler and tests. Returns MCP-shape response.
21
+ */
22
+ dispatch(name: string, args: Record<string, unknown>): Promise<{
23
+ content: Array<{
24
+ type: "text";
25
+ text: string;
26
+ }>;
27
+ isError?: boolean;
28
+ _meta?: Record<string, unknown>;
29
+ }>;
30
+ }
31
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAGnE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;gBAEpB,IAAI,GAAE,oBAAyB;IAI3C,gBAAgB,IAAI,IAAI;IAMxB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IASnC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BjC;;OAEG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;QACT,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;CAoCH"}
package/dist/server.js ADDED
@@ -0,0 +1,91 @@
1
+ import { ToolRegistry, defaultRegistry } from "./tool-registry.js";
2
+ import { pingTool } from "./tools/ping.js";
3
+ export class SfgraphMcpServer {
4
+ registry;
5
+ constructor(opts = {}) {
6
+ this.registry = opts.registry ?? new ToolRegistry();
7
+ }
8
+ registerDefaults() {
9
+ if (!this.registry.get("ping")) {
10
+ this.registry.register(pingTool.name, pingTool.handler, pingTool.schema);
11
+ }
12
+ }
13
+ /**
14
+ * Side-effect import every tool module so they register on defaultRegistry,
15
+ * then copy missing tools into this.registry.
16
+ */
17
+ async loadAllTools() {
18
+ await import("./tools/index.js");
19
+ for (const t of defaultRegistry.list()) {
20
+ if (!this.registry.get(t.name)) {
21
+ this.registry.register(t.name, t.handler, t.schema);
22
+ }
23
+ }
24
+ }
25
+ /**
26
+ * Start the stdio MCP server. Lazy-imports the SDK so tests/CLI work without
27
+ * forcing the SDK load when not needed.
28
+ */
29
+ async startStdio() {
30
+ await this.loadAllTools();
31
+ const sdk = await import("@modelcontextprotocol/sdk/server/index.js");
32
+ const stdioMod = await import("@modelcontextprotocol/sdk/server/stdio.js");
33
+ const typesMod = await import("@modelcontextprotocol/sdk/types.js");
34
+ const server = new sdk.Server({ name: "sfgraph", version: "0.0.0" }, { capabilities: { tools: {} } });
35
+ server.setRequestHandler(typesMod.ListToolsRequestSchema, async () => ({
36
+ tools: this.registry.list().map((t) => ({
37
+ name: t.name,
38
+ description: t.schema.description,
39
+ inputSchema: t.schema.inputSchema ?? { type: "object" },
40
+ })),
41
+ }));
42
+ server.setRequestHandler(typesMod.CallToolRequestSchema, async (req) => {
43
+ const params = req
44
+ .params;
45
+ return this.dispatch(params.name, params.arguments ?? {});
46
+ });
47
+ const transport = new stdioMod.StdioServerTransport();
48
+ await server.connect(transport);
49
+ }
50
+ /**
51
+ * Public dispatcher used by stdio handler and tests. Returns MCP-shape response.
52
+ */
53
+ async dispatch(name, args) {
54
+ const tool = this.registry.get(name);
55
+ if (!tool) {
56
+ return {
57
+ content: [{ type: "text", text: `unknown tool ${name}` }],
58
+ isError: true,
59
+ _meta: { code: "UNKNOWN_TOOL" },
60
+ };
61
+ }
62
+ try {
63
+ const result = (await tool.handler(args));
64
+ const text = typeof result.markdown === "string" ? result.markdown : JSON.stringify(result);
65
+ return {
66
+ content: [{ type: "text", text }],
67
+ _meta: {
68
+ summary: result.summary,
69
+ data: result.data,
70
+ follow_up_tools: result.follow_up_tools,
71
+ },
72
+ };
73
+ }
74
+ catch (err) {
75
+ const e = err;
76
+ if (e?.name === "ZodError") {
77
+ return {
78
+ content: [{ type: "text", text: `invalid input: ${JSON.stringify(e.issues)}` }],
79
+ isError: true,
80
+ _meta: { code: "INVALID_INPUT", issues: e.issues },
81
+ };
82
+ }
83
+ return {
84
+ content: [{ type: "text", text: `error: ${e?.message ?? String(err)}` }],
85
+ isError: true,
86
+ _meta: { code: "TOOL_ERROR" },
87
+ };
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAM3C,MAAM,OAAO,gBAAgB;IAClB,QAAQ,CAAe;IAEhC,YAAY,OAA6B,EAAE;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,YAAY,EAAE,CAAC;IACtD,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAC3B,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EACrC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;QAEF,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACrE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW;gBACjC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;aACxD,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrE,MAAM,MAAM,GAAI,GAAyE;iBACtF,MAAM,CAAC;YACV,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QACtD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,IAA6B;QAM7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,IAAI,EAAE,EAAE,CAAC;gBACzD,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;aAChC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAA4B,CAAC;YACrE,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC5F,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjC,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,eAAe,EAAE,MAAM,CAAC,eAAe;iBACxC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAA4D,CAAC;YACvE,IAAI,CAAC,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBAC/E,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;iBACnD,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;aAC9B,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export interface ShutdownOpts {
2
+ onShutdown: () => Promise<void> | void;
3
+ watchdogMs?: number;
4
+ signalEmitter?: NodeJS.EventEmitter;
5
+ stdinEmitter?: NodeJS.EventEmitter;
6
+ exit?: (code: number) => void;
7
+ }
8
+ export type Disposer = () => void;
9
+ export declare function installShutdownHandlers(opts: ShutdownOpts): Disposer;
10
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAElC,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CA+CpE"}
@@ -0,0 +1,43 @@
1
+ export function installShutdownHandlers(opts) {
2
+ const { onShutdown, watchdogMs = 3000, signalEmitter = process, stdinEmitter = process.stdin, exit = (code) => process.exit(code), } = opts;
3
+ let fired = false;
4
+ let watchdog;
5
+ const trigger = (_reason) => {
6
+ if (fired)
7
+ return;
8
+ fired = true;
9
+ watchdog = setTimeout(() => exit(1), watchdogMs);
10
+ // Don't keep event loop alive solely for the watchdog
11
+ if (typeof watchdog.unref === "function")
12
+ watchdog.unref();
13
+ Promise.resolve()
14
+ .then(() => onShutdown())
15
+ .catch(() => { })
16
+ .finally(() => {
17
+ if (watchdog)
18
+ clearTimeout(watchdog);
19
+ // Force exit after a brief tick so the stdio MCP transport can flush
20
+ // any final response and pending console writes can drain. Without
21
+ // this, a lingering jsforce HTTP agent or sqlite handle could keep
22
+ // the loop alive — user has to ^C twice to actually quit.
23
+ setTimeout(() => exit(0), 50).unref();
24
+ });
25
+ };
26
+ const onSigint = () => trigger("SIGINT");
27
+ const onSigterm = () => trigger("SIGTERM");
28
+ const onStdinEnd = () => trigger("stdin-end");
29
+ const onStdinClose = () => trigger("stdin-close");
30
+ signalEmitter.on("SIGINT", onSigint);
31
+ signalEmitter.on("SIGTERM", onSigterm);
32
+ stdinEmitter.on("end", onStdinEnd);
33
+ stdinEmitter.on("close", onStdinClose);
34
+ return () => {
35
+ signalEmitter.off("SIGINT", onSigint);
36
+ signalEmitter.off("SIGTERM", onSigterm);
37
+ stdinEmitter.off("end", onStdinEnd);
38
+ stdinEmitter.off("close", onStdinClose);
39
+ if (watchdog)
40
+ clearTimeout(watchdog);
41
+ };
42
+ }
43
+ //# sourceMappingURL=shutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,uBAAuB,CAAC,IAAkB;IACxD,MAAM,EACJ,UAAU,EACV,UAAU,GAAG,IAAI,EACjB,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,CAAC,KAAK,EAC5B,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GACpC,GAAG,IAAI,CAAC;IACT,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,QAAoC,CAAC;IAEzC,MAAM,OAAO,GAAG,CAAC,OAAe,EAAQ,EAAE;QACxC,IAAI,KAAK;YAAE,OAAO;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACjD,sDAAsD;QACtD,IAAI,OAAQ,QAAgB,CAAC,KAAK,KAAK,UAAU;YAAG,QAAgB,CAAC,KAAK,EAAE,CAAC;QAC7E,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;aACxB,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aACf,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,QAAQ;gBAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrC,qEAAqE;YACrE,mEAAmE;YACnE,mEAAmE;YACnE,0DAA0D;YAC1D,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAExD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEvC,OAAO,GAAG,EAAE;QACV,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACpC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface ToolHandlerResult {
2
+ [key: string]: unknown;
3
+ }
4
+ export type ToolHandler = (input: Record<string, unknown>) => Promise<ToolHandlerResult>;
5
+ export interface ToolSchema {
6
+ description: string;
7
+ inputSchema?: Record<string, unknown>;
8
+ }
9
+ export interface RegisteredTool {
10
+ name: string;
11
+ handler: ToolHandler;
12
+ schema: ToolSchema;
13
+ }
14
+ export declare class ToolRegistry {
15
+ private readonly tools;
16
+ register(name: string, handler: ToolHandler, schema: ToolSchema): void;
17
+ get(name: string): RegisteredTool | undefined;
18
+ list(): RegisteredTool[];
19
+ clear(): void;
20
+ }
21
+ /**
22
+ * Global default registry. `defineTool` registers here on side-effect import.
23
+ */
24
+ export declare const defaultRegistry: ToolRegistry;
25
+ export declare function registerTool(spec: {
26
+ name: string;
27
+ description: string;
28
+ inputSchema: Record<string, unknown>;
29
+ execute: ToolHandler;
30
+ }): void;
31
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEzF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAE3D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAOtE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,cAAc,EAAE;IAIxB,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,cAAqB,CAAC;AAElD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,WAAW,CAAC;CACtB,GAAG,IAAI,CAKP"}
@@ -0,0 +1,29 @@
1
+ export class ToolRegistry {
2
+ tools = new Map();
3
+ register(name, handler, schema) {
4
+ if (this.tools.has(name)) {
5
+ throw new Error(`tool '${name}' already registered`);
6
+ }
7
+ this.tools.set(name, { name, handler, schema });
8
+ }
9
+ get(name) {
10
+ return this.tools.get(name);
11
+ }
12
+ list() {
13
+ return Array.from(this.tools.values());
14
+ }
15
+ clear() {
16
+ this.tools.clear();
17
+ }
18
+ }
19
+ /**
20
+ * Global default registry. `defineTool` registers here on side-effect import.
21
+ */
22
+ export const defaultRegistry = new ToolRegistry();
23
+ export function registerTool(spec) {
24
+ defaultRegistry.register(spec.name, spec.execute, {
25
+ description: spec.description,
26
+ inputSchema: spec.inputSchema,
27
+ });
28
+ }
29
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,YAAY;IACN,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE3D,QAAQ,CAAC,IAAY,EAAE,OAAoB,EAAE,MAAkB;QAC7D,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,sBAAsB,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,YAAY,EAAE,CAAC;AAElD,MAAM,UAAU,YAAY,CAAC,IAK5B;IACC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;QAChD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { REL_TYPES } from "@ryanstark24/sfgraph-core";
2
+ import { type OrgId } from "@ryanstark24/sfgraph-shared";
3
+ import { type ToolContext } from "../../context.js";
4
+ export interface Fixture {
5
+ ctx: ToolContext;
6
+ orgId: OrgId;
7
+ workDir: string;
8
+ addNode: (n: {
9
+ qualifiedName: string;
10
+ label: string;
11
+ attributes?: Record<string, unknown>;
12
+ sourceHash?: string;
13
+ firstSeenAt?: number;
14
+ lastSeenAt?: number;
15
+ lastModifiedAt?: number;
16
+ }) => void;
17
+ addEdge: (e: {
18
+ srcQualifiedName: string;
19
+ dstQualifiedName: string;
20
+ relType: string;
21
+ attributes?: Record<string, unknown>;
22
+ firstSeenAt?: number;
23
+ lastSeenAt?: number;
24
+ }) => void;
25
+ cleanup: () => Promise<void>;
26
+ }
27
+ export declare function createFixture(orgIdStr?: string): Promise<Fixture>;
28
+ export { REL_TYPES };
29
+ //# sourceMappingURL=_fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fixture.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/_fixture.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,SAAS,EAGV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,KAAK,EAAsC,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,CAAC,EAAE;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,KAAK,IAAI,CAAC;IACX,OAAO,EAAE,CAAC,CAAC,EAAE;QACX,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAsB,aAAa,CAAC,QAAQ,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAoDvE;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { mkdtempSync, rmSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import path from "node:path";
4
+ import { REL_TYPES, SqliteGraphStore, SqliteSnapshotStore, } from "@ryanstark24/sfgraph-core";
5
+ import { asOrgId, asQualifiedName, asSha256 } from "@ryanstark24/sfgraph-shared";
6
+ import { setToolContextFactory } from "../../context.js";
7
+ export async function createFixture(orgIdStr = "org1") {
8
+ const workDir = mkdtempSync(path.join(tmpdir(), "sfg-tool-"));
9
+ const dbPath = path.join(workDir, "g.sqlite");
10
+ const graphStore = new SqliteGraphStore({ dbPath, backupDir: path.join(workDir, "bkp") });
11
+ await graphStore.init();
12
+ const snapshotStore = new SqliteSnapshotStore({
13
+ dbPath,
14
+ db: graphStore.db,
15
+ skipMigrations: true,
16
+ });
17
+ await snapshotStore.init();
18
+ const orgId = asOrgId(orgIdStr);
19
+ const ctx = { graphStore, snapshotStore, orgId };
20
+ setToolContextFactory(async () => ctx);
21
+ const fix = {
22
+ ctx,
23
+ orgId,
24
+ workDir,
25
+ addNode(n) {
26
+ const fact = {
27
+ orgId,
28
+ qualifiedName: asQualifiedName(n.qualifiedName),
29
+ label: n.label,
30
+ attributes: n.attributes ?? {},
31
+ sourceHash: asSha256(n.sourceHash ?? `h-${n.qualifiedName}`),
32
+ firstSeenAt: n.firstSeenAt ?? 1,
33
+ lastSeenAt: n.lastSeenAt ?? 1,
34
+ lastModifiedAt: n.lastModifiedAt ?? Date.now(),
35
+ };
36
+ graphStore.mergeNodes([fact]);
37
+ },
38
+ addEdge(e) {
39
+ const fact = {
40
+ orgId,
41
+ srcQualifiedName: asQualifiedName(e.srcQualifiedName),
42
+ dstQualifiedName: asQualifiedName(e.dstQualifiedName),
43
+ relType: e.relType,
44
+ attributes: e.attributes ?? {},
45
+ firstSeenAt: e.firstSeenAt ?? 1,
46
+ lastSeenAt: e.lastSeenAt ?? 1,
47
+ };
48
+ graphStore.mergeEdges([fact]);
49
+ },
50
+ async cleanup() {
51
+ setToolContextFactory(null);
52
+ await graphStore.close();
53
+ rmSync(workDir, { recursive: true, force: true });
54
+ },
55
+ };
56
+ return fix;
57
+ }
58
+ export { REL_TYPES };
59
+ //# sourceMappingURL=_fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fixture.js","sourceRoot":"","sources":["../../../src/tools/__tests__/_fixture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { defaultRegistry } from "../../tool-registry.js";
2
+ import "../index.js";
3
+ export declare function callTool(name: string, args: Record<string, unknown>): Promise<{
4
+ summary: string;
5
+ markdown: string;
6
+ data: unknown;
7
+ follow_up_tools?: string[];
8
+ }>;
9
+ export { defaultRegistry };
10
+ //# sourceMappingURL=_runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_runner.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/_runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,aAAa,CAAC;AAErB,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC,CAUD;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { defaultRegistry } from "../../tool-registry.js";
2
+ // Side-effect load all tools.
3
+ import "../index.js";
4
+ export async function callTool(name, args) {
5
+ const tool = defaultRegistry.get(name);
6
+ if (!tool)
7
+ throw new Error(`tool not registered: ${name}`);
8
+ const r = (await tool.handler(args));
9
+ return r;
10
+ }
11
+ export { defaultRegistry };
12
+ //# sourceMappingURL=_runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_runner.js","sourceRoot":"","sources":["../../../src/tools/__tests__/_runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,8BAA8B;AAC9B,OAAO,aAAa,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,IAA6B;IAO7B,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAKlC,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analyze_field.test.d.ts.map