@grafema/api 0.2.5-beta

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 (70) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +219 -0
  3. package/dist/context.d.ts +22 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +18 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/dataloaders/index.d.ts +18 -0
  8. package/dist/dataloaders/index.d.ts.map +1 -0
  9. package/dist/dataloaders/index.js +17 -0
  10. package/dist/dataloaders/index.js.map +1 -0
  11. package/dist/dataloaders/nodeLoader.d.ts +19 -0
  12. package/dist/dataloaders/nodeLoader.d.ts.map +1 -0
  13. package/dist/dataloaders/nodeLoader.js +31 -0
  14. package/dist/dataloaders/nodeLoader.js.map +1 -0
  15. package/dist/index.d.ts +11 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/pagination.d.ts +50 -0
  20. package/dist/pagination.d.ts.map +1 -0
  21. package/dist/pagination.js +71 -0
  22. package/dist/pagination.js.map +1 -0
  23. package/dist/resolvers/edge.d.ts +22 -0
  24. package/dist/resolvers/edge.d.ts.map +1 -0
  25. package/dist/resolvers/edge.js +36 -0
  26. package/dist/resolvers/edge.js.map +1 -0
  27. package/dist/resolvers/index.d.ts +159 -0
  28. package/dist/resolvers/index.d.ts.map +1 -0
  29. package/dist/resolvers/index.js +21 -0
  30. package/dist/resolvers/index.js.map +1 -0
  31. package/dist/resolvers/mutation.d.ts +69 -0
  32. package/dist/resolvers/mutation.d.ts.map +1 -0
  33. package/dist/resolvers/mutation.js +82 -0
  34. package/dist/resolvers/mutation.js.map +1 -0
  35. package/dist/resolvers/node.d.ts +50 -0
  36. package/dist/resolvers/node.d.ts.map +1 -0
  37. package/dist/resolvers/node.js +69 -0
  38. package/dist/resolvers/node.js.map +1 -0
  39. package/dist/resolvers/query.d.ts +169 -0
  40. package/dist/resolvers/query.d.ts.map +1 -0
  41. package/dist/resolvers/query.js +188 -0
  42. package/dist/resolvers/query.js.map +1 -0
  43. package/dist/schema/enums.graphql +27 -0
  44. package/dist/schema/mutations.graphql +53 -0
  45. package/dist/schema/queries.graphql +213 -0
  46. package/dist/schema/scalars.graphql +2 -0
  47. package/dist/schema/subscriptions.graphql +84 -0
  48. package/dist/schema/types.graphql +440 -0
  49. package/dist/server.d.ts +31 -0
  50. package/dist/server.d.ts.map +1 -0
  51. package/dist/server.js +109 -0
  52. package/dist/server.js.map +1 -0
  53. package/package.json +51 -0
  54. package/src/context.ts +33 -0
  55. package/src/dataloaders/index.ts +24 -0
  56. package/src/dataloaders/nodeLoader.ts +41 -0
  57. package/src/index.ts +11 -0
  58. package/src/pagination.ts +109 -0
  59. package/src/resolvers/edge.ts +39 -0
  60. package/src/resolvers/index.ts +24 -0
  61. package/src/resolvers/mutation.ts +108 -0
  62. package/src/resolvers/node.ts +118 -0
  63. package/src/resolvers/query.ts +307 -0
  64. package/src/schema/enums.graphql +27 -0
  65. package/src/schema/mutations.graphql +53 -0
  66. package/src/schema/queries.graphql +213 -0
  67. package/src/schema/scalars.graphql +2 -0
  68. package/src/schema/subscriptions.graphql +84 -0
  69. package/src/schema/types.graphql +440 -0
  70. package/src/server.ts +140 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Query Resolvers
3
+ *
4
+ * Implements all Query type fields.
5
+ */
6
+ import type { BaseNodeRecord } from '@grafema/types';
7
+ import type { GraphQLContext } from '../context.js';
8
+ export interface NodeFilter {
9
+ type?: string | null;
10
+ name?: string | null;
11
+ file?: string | null;
12
+ exported?: boolean | null;
13
+ }
14
+ export declare const queryResolvers: {
15
+ /**
16
+ * Get node by ID.
17
+ *
18
+ * Complexity: O(1)
19
+ */
20
+ node(_: unknown, args: {
21
+ id: string;
22
+ }, context: GraphQLContext): Promise<BaseNodeRecord | null>;
23
+ /**
24
+ * Find nodes matching criteria with cursor-based pagination.
25
+ *
26
+ * Complexity: O(n) where n = nodes matching type filter
27
+ * This is acceptable because:
28
+ * - We filter by type first (uses RFDB's type index)
29
+ * - Results are paginated
30
+ */
31
+ nodes(_: unknown, args: {
32
+ filter?: NodeFilter | null;
33
+ first?: number | null;
34
+ after?: string | null;
35
+ }, context: GraphQLContext): Promise<import("../pagination.js").Connection<BaseNodeRecord>>;
36
+ /**
37
+ * BFS traversal.
38
+ *
39
+ * Complexity: O(V + E) for reachable subgraph
40
+ * Bounded by maxDepth parameter.
41
+ */
42
+ bfs(_: unknown, args: {
43
+ startIds: string[];
44
+ maxDepth: number;
45
+ edgeTypes: string[];
46
+ }, context: GraphQLContext): Promise<string[]>;
47
+ /**
48
+ * DFS traversal.
49
+ *
50
+ * Complexity: O(V + E) for reachable subgraph
51
+ */
52
+ dfs(_: unknown, args: {
53
+ startIds: string[];
54
+ maxDepth: number;
55
+ edgeTypes?: string[] | null;
56
+ }, context: GraphQLContext): Promise<string[]>;
57
+ /**
58
+ * Reachability check.
59
+ *
60
+ * Complexity: O(V + E) worst case, often O(d) with early termination
61
+ */
62
+ reachability(_: unknown, args: {
63
+ from: string;
64
+ to: string;
65
+ edgeTypes?: string[] | null;
66
+ maxDepth?: number | null;
67
+ }, context: GraphQLContext): Promise<boolean>;
68
+ /**
69
+ * Execute Datalog query.
70
+ *
71
+ * Complexity: Depends on query, bounded by RFDB's timeout
72
+ */
73
+ datalog(_: unknown, args: {
74
+ query: string;
75
+ limit?: number | null;
76
+ offset?: number | null;
77
+ }, context: GraphQLContext): Promise<{
78
+ success: boolean;
79
+ count: number;
80
+ results: {
81
+ bindings: {
82
+ [k: string]: string;
83
+ };
84
+ node: BaseNodeRecord | null;
85
+ }[];
86
+ error: null;
87
+ } | {
88
+ success: boolean;
89
+ count: number;
90
+ results: never[];
91
+ error: string;
92
+ }>;
93
+ /**
94
+ * Get graph statistics.
95
+ *
96
+ * Complexity: O(1) - cached in backend
97
+ */
98
+ stats(_: unknown, _args: unknown, context: GraphQLContext): Promise<import("@grafema/core/storage/backends/RFDBServerBackend").BackendStats>;
99
+ /**
100
+ * Get analysis status.
101
+ * Placeholder - actual implementation depends on analysis state tracking.
102
+ */
103
+ analysisStatus(_: unknown, _args: unknown, _context: GraphQLContext): Promise<{
104
+ running: boolean;
105
+ phase: null;
106
+ message: null;
107
+ servicesDiscovered: number;
108
+ servicesAnalyzed: number;
109
+ error: null;
110
+ }>;
111
+ /**
112
+ * List all guarantees.
113
+ * Placeholder - actual implementation depends on GuaranteeManager.
114
+ */
115
+ guarantees(_: unknown, _args: unknown, _context: GraphQLContext): Promise<never[]>;
116
+ /**
117
+ * Get guarantee by ID.
118
+ * Placeholder.
119
+ */
120
+ guarantee(_: unknown, _args: {
121
+ id: string;
122
+ }, _context: GraphQLContext): Promise<null>;
123
+ /**
124
+ * Find calls to a function/method.
125
+ * Placeholder - would reuse MCP handler logic.
126
+ */
127
+ findCalls(_: unknown, _args: {
128
+ target: string;
129
+ className?: string | null;
130
+ limit?: number | null;
131
+ offset?: number | null;
132
+ }, _context: GraphQLContext): Promise<never[]>;
133
+ /**
134
+ * Get function details.
135
+ * Placeholder - would reuse MCP handler logic.
136
+ */
137
+ getFunctionDetails(_: unknown, _args: {
138
+ name: string;
139
+ file?: string | null;
140
+ transitive?: boolean | null;
141
+ }, _context: GraphQLContext): Promise<null>;
142
+ /**
143
+ * Find guards protecting a node.
144
+ * Placeholder.
145
+ */
146
+ findGuards(_: unknown, _args: {
147
+ nodeId: string;
148
+ }, _context: GraphQLContext): Promise<never[]>;
149
+ /**
150
+ * Trace alias chain.
151
+ * Placeholder.
152
+ */
153
+ traceAlias(_: unknown, _args: {
154
+ variableName: string;
155
+ file: string;
156
+ maxDepth?: number | null;
157
+ }, _context: GraphQLContext): Promise<never[]>;
158
+ /**
159
+ * Trace data flow.
160
+ * Placeholder.
161
+ */
162
+ traceDataFlow(_: unknown, _args: {
163
+ source: string;
164
+ file?: string | null;
165
+ direction?: string | null;
166
+ maxDepth?: number | null;
167
+ }, _context: GraphQLContext): Promise<never[]>;
168
+ };
169
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/resolvers/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Query Resolvers
3
+ *
4
+ * Implements all Query type fields.
5
+ */
6
+ import { paginateArray } from '../pagination.js';
7
+ export const queryResolvers = {
8
+ /**
9
+ * Get node by ID.
10
+ *
11
+ * Complexity: O(1)
12
+ */
13
+ async node(_, args, context) {
14
+ return context.loaders.node.load(args.id);
15
+ },
16
+ /**
17
+ * Find nodes matching criteria with cursor-based pagination.
18
+ *
19
+ * Complexity: O(n) where n = nodes matching type filter
20
+ * This is acceptable because:
21
+ * - We filter by type first (uses RFDB's type index)
22
+ * - Results are paginated
23
+ */
24
+ async nodes(_, args, context) {
25
+ const filter = args.filter || {};
26
+ // Build query for backend
27
+ const query = {};
28
+ if (filter.type)
29
+ query.type = filter.type;
30
+ if (filter.name)
31
+ query.name = filter.name;
32
+ if (filter.file)
33
+ query.file = filter.file;
34
+ // Get all matching nodes
35
+ const nodes = await context.backend.getAllNodes(query);
36
+ // Apply exported filter (not supported by backend query)
37
+ let filteredNodes = nodes;
38
+ if (filter.exported !== null && filter.exported !== undefined) {
39
+ filteredNodes = nodes.filter((n) => n.exported === filter.exported);
40
+ }
41
+ return paginateArray(filteredNodes, args.first, args.after, (n) => n.id);
42
+ },
43
+ /**
44
+ * BFS traversal.
45
+ *
46
+ * Complexity: O(V + E) for reachable subgraph
47
+ * Bounded by maxDepth parameter.
48
+ */
49
+ async bfs(_, args, context) {
50
+ return context.backend.bfs(args.startIds, args.maxDepth, args.edgeTypes);
51
+ },
52
+ /**
53
+ * DFS traversal.
54
+ *
55
+ * Complexity: O(V + E) for reachable subgraph
56
+ */
57
+ async dfs(_, args, context) {
58
+ return context.backend.dfs(args.startIds, args.maxDepth, args.edgeTypes || []);
59
+ },
60
+ /**
61
+ * Reachability check.
62
+ *
63
+ * Complexity: O(V + E) worst case, often O(d) with early termination
64
+ */
65
+ async reachability(_, args, context) {
66
+ const maxDepth = args.maxDepth ?? 10;
67
+ const reachable = await context.backend.bfs([args.from], maxDepth, args.edgeTypes || []);
68
+ return reachable.includes(args.to);
69
+ },
70
+ /**
71
+ * Execute Datalog query.
72
+ *
73
+ * Complexity: Depends on query, bounded by RFDB's timeout
74
+ */
75
+ async datalog(_, args, context) {
76
+ const limit = args.limit ?? 50;
77
+ const offset = args.offset ?? 0;
78
+ try {
79
+ const results = await context.backend.checkGuarantee(args.query);
80
+ const total = results.length;
81
+ const paginatedResults = results.slice(offset, offset + limit);
82
+ // Enrich with node data
83
+ const enrichedResults = await Promise.all(paginatedResults.map(async (r) => {
84
+ const bindings = r.bindings || [];
85
+ const xBinding = bindings.find((b) => b.name === 'X');
86
+ const nodeId = xBinding?.value;
87
+ const node = nodeId
88
+ ? await context.loaders.node.load(String(nodeId))
89
+ : null;
90
+ return {
91
+ bindings: Object.fromEntries(bindings.map((b) => [b.name, b.value])),
92
+ node,
93
+ };
94
+ }));
95
+ return {
96
+ success: true,
97
+ count: total,
98
+ results: enrichedResults,
99
+ error: null,
100
+ };
101
+ }
102
+ catch (error) {
103
+ const message = error instanceof Error ? error.message : String(error);
104
+ return {
105
+ success: false,
106
+ count: 0,
107
+ results: [],
108
+ error: message,
109
+ };
110
+ }
111
+ },
112
+ /**
113
+ * Get graph statistics.
114
+ *
115
+ * Complexity: O(1) - cached in backend
116
+ */
117
+ async stats(_, _args, context) {
118
+ return context.backend.getStats();
119
+ },
120
+ /**
121
+ * Get analysis status.
122
+ * Placeholder - actual implementation depends on analysis state tracking.
123
+ */
124
+ async analysisStatus(_, _args, _context) {
125
+ // Placeholder - would need to track analysis state
126
+ return {
127
+ running: false,
128
+ phase: null,
129
+ message: null,
130
+ servicesDiscovered: 0,
131
+ servicesAnalyzed: 0,
132
+ error: null,
133
+ };
134
+ },
135
+ /**
136
+ * List all guarantees.
137
+ * Placeholder - actual implementation depends on GuaranteeManager.
138
+ */
139
+ async guarantees(_, _args, _context) {
140
+ // Placeholder - would need GuaranteeManager integration
141
+ return [];
142
+ },
143
+ /**
144
+ * Get guarantee by ID.
145
+ * Placeholder.
146
+ */
147
+ async guarantee(_, _args, _context) {
148
+ return null;
149
+ },
150
+ /**
151
+ * Find calls to a function/method.
152
+ * Placeholder - would reuse MCP handler logic.
153
+ */
154
+ async findCalls(_, _args, _context) {
155
+ // Placeholder - would reuse MCP find_calls handler
156
+ return [];
157
+ },
158
+ /**
159
+ * Get function details.
160
+ * Placeholder - would reuse MCP handler logic.
161
+ */
162
+ async getFunctionDetails(_, _args, _context) {
163
+ // Placeholder - would reuse MCP get_function_details handler
164
+ return null;
165
+ },
166
+ /**
167
+ * Find guards protecting a node.
168
+ * Placeholder.
169
+ */
170
+ async findGuards(_, _args, _context) {
171
+ return [];
172
+ },
173
+ /**
174
+ * Trace alias chain.
175
+ * Placeholder.
176
+ */
177
+ async traceAlias(_, _args, _context) {
178
+ return [];
179
+ },
180
+ /**
181
+ * Trace data flow.
182
+ * Placeholder.
183
+ */
184
+ async traceDataFlow(_, _args, _context) {
185
+ return [];
186
+ },
187
+ };
188
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/resolvers/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AASjD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B;;;;OAIG;IACH,KAAK,CAAC,IAAI,CACR,CAAU,EACV,IAAoB,EACpB,OAAuB;QAEvB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,CACT,CAAU,EACV,IAIC,EACD,OAAuB;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAEjC,0BAA0B;QAC1B,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAE1C,yBAAyB;QACzB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEvD,yDAAyD;QACzD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC9D,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,aAAa,CAClB,aAAa,EACb,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,EACV,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CACP,CAAU,EACV,IAAmE,EACnE,OAAuB;QAEvB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,GAAG,CACP,CAAU,EACV,IAA2E,EAC3E,OAAuB;QAEvB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CACxB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,IAAI,EAAE,CACrB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAChB,CAAU,EACV,IAKC,EACD,OAAuB;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CACzC,CAAC,IAAI,CAAC,IAAI,CAAC,EACX,QAAQ,EACR,IAAI,CAAC,SAAS,IAAI,EAAE,CACrB,CAAC;QACF,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CACX,CAAU,EACV,IAAsE,EACtE,OAAuB;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7B,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YAE/D,wBAAwB;YACxB,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,CAAC;gBAC/B,MAAM,IAAI,GAAG,MAAM;oBACjB,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACjD,CAAC,CAAC,IAAI,CAAC;gBACT,OAAO;oBACL,QAAQ,EAAE,MAAM,CAAC,WAAW,CAC1B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CACvC;oBACD,IAAI;iBACL,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,OAAO;aACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,CAAU,EAAE,KAAc,EAAE,OAAuB;QAC7D,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,CAAU,EAAE,KAAc,EAAE,QAAwB;QACvE,mDAAmD;QACnD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,kBAAkB,EAAE,CAAC;YACrB,gBAAgB,EAAE,CAAC;YACnB,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,CAAU,EAAE,KAAc,EAAE,QAAwB;QACnE,wDAAwD;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,CAAU,EACV,KAAqB,EACrB,QAAwB;QAExB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,CAAU,EACV,KAKC,EACD,QAAwB;QAExB,mDAAmD;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CACtB,CAAU,EACV,KAIC,EACD,QAAwB;QAExB,6DAA6D;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,CAAU,EACV,KAAyB,EACzB,QAAwB;QAExB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,CAAU,EACV,KAIC,EACD,QAAwB;QAExB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,CAAU,EACV,KAKC,EACD,QAAwB;QAExB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
@@ -0,0 +1,27 @@
1
+ """
2
+ Direction for graph traversal.
3
+ """
4
+ enum TraversalDirection {
5
+ FORWARD
6
+ BACKWARD
7
+ BOTH
8
+ }
9
+
10
+ """
11
+ Severity levels for guarantees.
12
+ """
13
+ enum Severity {
14
+ ERROR
15
+ WARNING
16
+ INFO
17
+ }
18
+
19
+ """
20
+ Priority levels for contract guarantees.
21
+ """
22
+ enum Priority {
23
+ CRITICAL
24
+ IMPORTANT
25
+ OBSERVED
26
+ TRACKED
27
+ }
@@ -0,0 +1,53 @@
1
+ type Mutation {
2
+ # ============================================================================
3
+ # Analysis
4
+ # ============================================================================
5
+
6
+ """
7
+ Run project analysis.
8
+ Blocks until complete (with timeout).
9
+ """
10
+ analyzeProject(
11
+ """Optional: analyze only this service"""
12
+ service: String
13
+
14
+ """Force re-analysis even if already analyzed"""
15
+ force: Boolean
16
+ ): AnalysisResult!
17
+
18
+ # ============================================================================
19
+ # Guarantees
20
+ # ============================================================================
21
+
22
+ """
23
+ Create a new guarantee.
24
+
25
+ For Datalog-based: provide name + rule
26
+ For contract-based: provide name + type + priority
27
+ """
28
+ createGuarantee(input: CreateGuaranteeInput!): Guarantee!
29
+
30
+ """
31
+ Delete a guarantee by name.
32
+ """
33
+ deleteGuarantee(name: String!): Boolean!
34
+
35
+ """
36
+ Check all guarantees or specific ones.
37
+ """
38
+ checkGuarantees(
39
+ """Specific guarantee names to check (null = all)"""
40
+ names: [String!]
41
+ ): GuaranteeCheckResult!
42
+
43
+ """
44
+ Check a single ad-hoc invariant without persisting.
45
+ """
46
+ checkInvariant(
47
+ """Datalog rule"""
48
+ rule: String!
49
+
50
+ """Description for error messages"""
51
+ description: String
52
+ ): GuaranteeResult!
53
+ }
@@ -0,0 +1,213 @@
1
+ type Query {
2
+ # ============================================================================
3
+ # Node Lookups
4
+ # ============================================================================
5
+
6
+ """
7
+ Get a single node by ID.
8
+ Returns null if not found.
9
+ """
10
+ node(id: ID!): Node
11
+
12
+ """
13
+ Find nodes matching filter criteria.
14
+ Uses cursor-based pagination (Relay spec).
15
+ """
16
+ nodes(
17
+ """Filter criteria"""
18
+ filter: NodeFilter
19
+
20
+ """Number of items to return (default: 50, max: 250)"""
21
+ first: Int
22
+
23
+ """Cursor to start after"""
24
+ after: String
25
+ ): NodeConnection!
26
+
27
+ # ============================================================================
28
+ # Graph Traversal
29
+ # ============================================================================
30
+
31
+ """
32
+ BFS traversal from starting nodes.
33
+ Returns all node IDs reachable within maxDepth.
34
+
35
+ Complexity: O(V + E) where V = reachable nodes, E = traversed edges
36
+ """
37
+ bfs(
38
+ """Starting node IDs"""
39
+ startIds: [ID!]!
40
+
41
+ """Maximum traversal depth"""
42
+ maxDepth: Int!
43
+
44
+ """Edge types to traverse (empty = all)"""
45
+ edgeTypes: [String!]!
46
+ ): [ID!]!
47
+
48
+ """
49
+ DFS traversal from starting nodes.
50
+ Returns all node IDs reachable within maxDepth.
51
+
52
+ Complexity: O(V + E) where V = reachable nodes, E = traversed edges
53
+ """
54
+ dfs(
55
+ """Starting node IDs"""
56
+ startIds: [ID!]!
57
+
58
+ """Maximum traversal depth"""
59
+ maxDepth: Int!
60
+
61
+ """Edge types to traverse (null = all)"""
62
+ edgeTypes: [String!]
63
+ ): [ID!]!
64
+
65
+ """
66
+ Check if a path exists between two nodes.
67
+ Uses BFS internally with early termination.
68
+
69
+ Complexity: O(V + E) worst case, often much faster with early termination
70
+ """
71
+ reachability(
72
+ """Source node ID"""
73
+ from: ID!
74
+
75
+ """Target node ID"""
76
+ to: ID!
77
+
78
+ """Edge types to traverse (null = all)"""
79
+ edgeTypes: [String!]
80
+
81
+ """Maximum depth to search (default: 10)"""
82
+ maxDepth: Int
83
+ ): Boolean!
84
+
85
+ # ============================================================================
86
+ # Datalog Queries
87
+ # ============================================================================
88
+
89
+ """
90
+ Execute a Datalog query on the code graph.
91
+
92
+ The query must define a violation/1 predicate.
93
+
94
+ Available predicates:
95
+ - node(Id, Type) - match nodes by type
96
+ - edge(Src, Dst, Type) - match edges
97
+ - attr(Id, Name, Value) - match node attributes
98
+
99
+ Example: violation(X) :- node(X, "FUNCTION"), attr(X, "async", true).
100
+ """
101
+ datalog(
102
+ """Datalog query defining violation/1"""
103
+ query: String!
104
+
105
+ """Maximum results (default: 50)"""
106
+ limit: Int
107
+
108
+ """Results to skip (for simple pagination)"""
109
+ offset: Int
110
+ ): DatalogResult!
111
+
112
+ # ============================================================================
113
+ # High-Level Queries (from MCP handlers)
114
+ # ============================================================================
115
+
116
+ """
117
+ Find all calls to a function/method.
118
+ """
119
+ findCalls(
120
+ """Function or method name"""
121
+ target: String!
122
+
123
+ """Optional class name for method calls"""
124
+ className: String
125
+
126
+ """Maximum results"""
127
+ limit: Int
128
+
129
+ """Results to skip"""
130
+ offset: Int
131
+ ): [CallInfo!]!
132
+
133
+ """
134
+ Get comprehensive function details including calls and callers.
135
+ """
136
+ getFunctionDetails(
137
+ """Function name"""
138
+ name: String!
139
+
140
+ """File path for disambiguation"""
141
+ file: String
142
+
143
+ """Follow transitive call chains"""
144
+ transitive: Boolean
145
+ ): FunctionDetails
146
+
147
+ """
148
+ Find guards (conditional scopes) protecting a node.
149
+ """
150
+ findGuards(
151
+ """Node ID to find guards for"""
152
+ nodeId: ID!
153
+ ): [GuardInfo!]!
154
+
155
+ """
156
+ Trace variable alias chain to original source.
157
+ """
158
+ traceAlias(
159
+ """Variable name"""
160
+ variableName: String!
161
+
162
+ """File where variable is defined"""
163
+ file: String!
164
+
165
+ """Maximum trace depth (default: 20)"""
166
+ maxDepth: Int
167
+ ): [Node!]!
168
+
169
+ """
170
+ Trace data flow from/to a node.
171
+ """
172
+ traceDataFlow(
173
+ """Source node ID or variable name"""
174
+ source: String!
175
+
176
+ """File path"""
177
+ file: String
178
+
179
+ """Direction of trace"""
180
+ direction: TraversalDirection
181
+
182
+ """Maximum depth (default: 10)"""
183
+ maxDepth: Int
184
+ ): [[String!]!]!
185
+
186
+ # ============================================================================
187
+ # Guarantees
188
+ # ============================================================================
189
+
190
+ """
191
+ List all defined guarantees.
192
+ """
193
+ guarantees: [Guarantee!]!
194
+
195
+ """
196
+ Get a specific guarantee by ID.
197
+ """
198
+ guarantee(id: ID!): Guarantee
199
+
200
+ # ============================================================================
201
+ # Statistics
202
+ # ============================================================================
203
+
204
+ """
205
+ Get graph statistics.
206
+ """
207
+ stats: GraphStats!
208
+
209
+ """
210
+ Get current analysis status.
211
+ """
212
+ analysisStatus: AnalysisStatus!
213
+ }
@@ -0,0 +1,2 @@
1
+ """Custom JSON scalar for arbitrary metadata."""
2
+ scalar JSON