@vegamo/loom 0.1.1

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 (196) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +465 -0
  3. package/dist/agents/core/agent.d.ts +65 -0
  4. package/dist/agents/core/agent.d.ts.map +1 -0
  5. package/dist/agents/core/agent.js +277 -0
  6. package/dist/agents/core/agent.js.map +1 -0
  7. package/dist/agents/core/prompt.d.ts +11 -0
  8. package/dist/agents/core/prompt.d.ts.map +1 -0
  9. package/dist/agents/core/prompt.js +117 -0
  10. package/dist/agents/core/prompt.js.map +1 -0
  11. package/dist/agents/core/types.d.ts +49 -0
  12. package/dist/agents/core/types.d.ts.map +1 -0
  13. package/dist/agents/core/types.js +5 -0
  14. package/dist/agents/core/types.js.map +1 -0
  15. package/dist/agents/memory/memory.d.ts +62 -0
  16. package/dist/agents/memory/memory.d.ts.map +1 -0
  17. package/dist/agents/memory/memory.js +113 -0
  18. package/dist/agents/memory/memory.js.map +1 -0
  19. package/dist/agents/memory/types.d.ts +15 -0
  20. package/dist/agents/memory/types.d.ts.map +1 -0
  21. package/dist/agents/memory/types.js +5 -0
  22. package/dist/agents/memory/types.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +104 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/llm/client.d.ts +49 -0
  28. package/dist/llm/client.d.ts.map +1 -0
  29. package/dist/llm/client.js +256 -0
  30. package/dist/llm/client.js.map +1 -0
  31. package/dist/llm/config.d.ts +13 -0
  32. package/dist/llm/config.d.ts.map +1 -0
  33. package/dist/llm/config.js +50 -0
  34. package/dist/llm/config.js.map +1 -0
  35. package/dist/llm/types.d.ts +74 -0
  36. package/dist/llm/types.d.ts.map +1 -0
  37. package/dist/llm/types.js +17 -0
  38. package/dist/llm/types.js.map +1 -0
  39. package/dist/mocks/generator.d.ts +10 -0
  40. package/dist/mocks/generator.d.ts.map +1 -0
  41. package/dist/mocks/generator.js +19 -0
  42. package/dist/mocks/generator.js.map +1 -0
  43. package/dist/mocks/router.d.ts +13 -0
  44. package/dist/mocks/router.d.ts.map +1 -0
  45. package/dist/mocks/router.js +44 -0
  46. package/dist/mocks/router.js.map +1 -0
  47. package/dist/mocks/server.d.ts +21 -0
  48. package/dist/mocks/server.d.ts.map +1 -0
  49. package/dist/mocks/server.js +36 -0
  50. package/dist/mocks/server.js.map +1 -0
  51. package/dist/serve.d.ts +17 -0
  52. package/dist/serve.d.ts.map +1 -0
  53. package/dist/serve.js +56 -0
  54. package/dist/serve.js.map +1 -0
  55. package/dist/shared/config-wizard.d.ts +7 -0
  56. package/dist/shared/config-wizard.d.ts.map +1 -0
  57. package/dist/shared/config-wizard.js +84 -0
  58. package/dist/shared/config-wizard.js.map +1 -0
  59. package/dist/shared/config.d.ts +32 -0
  60. package/dist/shared/config.d.ts.map +1 -0
  61. package/dist/shared/config.js +77 -0
  62. package/dist/shared/config.js.map +1 -0
  63. package/dist/shared/entity-utils.d.ts +30 -0
  64. package/dist/shared/entity-utils.d.ts.map +1 -0
  65. package/dist/shared/entity-utils.js +207 -0
  66. package/dist/shared/entity-utils.js.map +1 -0
  67. package/dist/shared/logger.d.ts +13 -0
  68. package/dist/shared/logger.d.ts.map +1 -0
  69. package/dist/shared/logger.js +45 -0
  70. package/dist/shared/logger.js.map +1 -0
  71. package/dist/shared/manifest-utils.d.ts +9 -0
  72. package/dist/shared/manifest-utils.d.ts.map +1 -0
  73. package/dist/shared/manifest-utils.js +110 -0
  74. package/dist/shared/manifest-utils.js.map +1 -0
  75. package/dist/shared/schema-entity-resolver.d.ts +15 -0
  76. package/dist/shared/schema-entity-resolver.d.ts.map +1 -0
  77. package/dist/shared/schema-entity-resolver.js +134 -0
  78. package/dist/shared/schema-entity-resolver.js.map +1 -0
  79. package/dist/shared/schema-utils.d.ts +21 -0
  80. package/dist/shared/schema-utils.d.ts.map +1 -0
  81. package/dist/shared/schema-utils.js +56 -0
  82. package/dist/shared/schema-utils.js.map +1 -0
  83. package/dist/shared/types.d.ts +130 -0
  84. package/dist/shared/types.d.ts.map +1 -0
  85. package/dist/shared/types.js +5 -0
  86. package/dist/shared/types.js.map +1 -0
  87. package/dist/tools/entity-file-ops.d.ts +10 -0
  88. package/dist/tools/entity-file-ops.d.ts.map +1 -0
  89. package/dist/tools/entity-file-ops.js +183 -0
  90. package/dist/tools/entity-file-ops.js.map +1 -0
  91. package/dist/tools/entity-workflow.d.ts +10 -0
  92. package/dist/tools/entity-workflow.d.ts.map +1 -0
  93. package/dist/tools/entity-workflow.js +447 -0
  94. package/dist/tools/entity-workflow.js.map +1 -0
  95. package/dist/tools/file-ops.d.ts +9 -0
  96. package/dist/tools/file-ops.d.ts.map +1 -0
  97. package/dist/tools/file-ops.js +83 -0
  98. package/dist/tools/file-ops.js.map +1 -0
  99. package/dist/tools/registry.d.ts +31 -0
  100. package/dist/tools/registry.d.ts.map +1 -0
  101. package/dist/tools/registry.js +58 -0
  102. package/dist/tools/registry.js.map +1 -0
  103. package/dist/tools/schema-gen.d.ts +8 -0
  104. package/dist/tools/schema-gen.d.ts.map +1 -0
  105. package/dist/tools/schema-gen.js +82 -0
  106. package/dist/tools/schema-gen.js.map +1 -0
  107. package/dist/tools/schema-validate.d.ts +8 -0
  108. package/dist/tools/schema-validate.d.ts.map +1 -0
  109. package/dist/tools/schema-validate.js +79 -0
  110. package/dist/tools/schema-validate.js.map +1 -0
  111. package/dist/tools/types.d.ts +29 -0
  112. package/dist/tools/types.d.ts.map +1 -0
  113. package/dist/tools/types.js +5 -0
  114. package/dist/tools/types.js.map +1 -0
  115. package/dist/tui/app.d.ts +13 -0
  116. package/dist/tui/app.d.ts.map +1 -0
  117. package/dist/tui/app.js +357 -0
  118. package/dist/tui/app.js.map +1 -0
  119. package/dist/tui/components/Chat.d.ts +14 -0
  120. package/dist/tui/components/Chat.d.ts.map +1 -0
  121. package/dist/tui/components/Chat.js +24 -0
  122. package/dist/tui/components/Chat.js.map +1 -0
  123. package/dist/tui/components/Header.d.ts +14 -0
  124. package/dist/tui/components/Header.d.ts.map +1 -0
  125. package/dist/tui/components/Header.js +6 -0
  126. package/dist/tui/components/Header.js.map +1 -0
  127. package/dist/tui/components/Input.d.ts +15 -0
  128. package/dist/tui/components/Input.d.ts.map +1 -0
  129. package/dist/tui/components/Input.js +74 -0
  130. package/dist/tui/components/Input.js.map +1 -0
  131. package/dist/tui/components/SchemaPreview.d.ts +13 -0
  132. package/dist/tui/components/SchemaPreview.d.ts.map +1 -0
  133. package/dist/tui/components/SchemaPreview.js +9 -0
  134. package/dist/tui/components/SchemaPreview.js.map +1 -0
  135. package/dist/tui/components/StatusBar.d.ts +15 -0
  136. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  137. package/dist/tui/components/StatusBar.js +7 -0
  138. package/dist/tui/components/StatusBar.js.map +1 -0
  139. package/dist/tui/hooks/useAgent.d.ts +41 -0
  140. package/dist/tui/hooks/useAgent.d.ts.map +1 -0
  141. package/dist/tui/hooks/useAgent.js +180 -0
  142. package/dist/tui/hooks/useAgent.js.map +1 -0
  143. package/dist/view/frontend/components/App.d.ts +4 -0
  144. package/dist/view/frontend/components/App.d.ts.map +1 -0
  145. package/dist/view/frontend/components/App.js +35 -0
  146. package/dist/view/frontend/components/App.js.map +1 -0
  147. package/dist/view/frontend/components/EndpointDetailPage.d.ts +4 -0
  148. package/dist/view/frontend/components/EndpointDetailPage.d.ts.map +1 -0
  149. package/dist/view/frontend/components/EndpointDetailPage.js +103 -0
  150. package/dist/view/frontend/components/EndpointDetailPage.js.map +1 -0
  151. package/dist/view/frontend/components/HomePage.d.ts +4 -0
  152. package/dist/view/frontend/components/HomePage.d.ts.map +1 -0
  153. package/dist/view/frontend/components/HomePage.js +6 -0
  154. package/dist/view/frontend/components/HomePage.js.map +1 -0
  155. package/dist/view/frontend/components/ModuleDetailPage.d.ts +4 -0
  156. package/dist/view/frontend/components/ModuleDetailPage.d.ts.map +1 -0
  157. package/dist/view/frontend/components/ModuleDetailPage.js +64 -0
  158. package/dist/view/frontend/components/ModuleDetailPage.js.map +1 -0
  159. package/dist/view/frontend/components/ModulesPage.d.ts +4 -0
  160. package/dist/view/frontend/components/ModulesPage.d.ts.map +1 -0
  161. package/dist/view/frontend/components/ModulesPage.js +40 -0
  162. package/dist/view/frontend/components/ModulesPage.js.map +1 -0
  163. package/dist/view/frontend/index.d.ts +2 -0
  164. package/dist/view/frontend/index.d.ts.map +1 -0
  165. package/dist/view/frontend/index.js +15 -0
  166. package/dist/view/frontend/index.js.map +1 -0
  167. package/dist/view/frontend/types.d.ts +35 -0
  168. package/dist/view/frontend/types.d.ts.map +1 -0
  169. package/dist/view/frontend/types.js +2 -0
  170. package/dist/view/frontend/types.js.map +1 -0
  171. package/dist/view/frontend/utils/api.d.ts +5 -0
  172. package/dist/view/frontend/utils/api.d.ts.map +1 -0
  173. package/dist/view/frontend/utils/api.js +28 -0
  174. package/dist/view/frontend/utils/api.js.map +1 -0
  175. package/dist/view/public/bundle.js +104633 -0
  176. package/dist/view/public/bundle.js.map +7 -0
  177. package/dist/view/public/index.html +50 -0
  178. package/dist/view/routes/docs.d.ts +13 -0
  179. package/dist/view/routes/docs.d.ts.map +1 -0
  180. package/dist/view/routes/docs.js +53 -0
  181. package/dist/view/routes/docs.js.map +1 -0
  182. package/dist/view/routes/entities.d.ts +11 -0
  183. package/dist/view/routes/entities.d.ts.map +1 -0
  184. package/dist/view/routes/entities.js +39 -0
  185. package/dist/view/routes/entities.js.map +1 -0
  186. package/dist/view/routes/schema.d.ts +11 -0
  187. package/dist/view/routes/schema.d.ts.map +1 -0
  188. package/dist/view/routes/schema.js +43 -0
  189. package/dist/view/routes/schema.js.map +1 -0
  190. package/dist/view/server.d.ts +20 -0
  191. package/dist/view/server.d.ts.map +1 -0
  192. package/dist/view/server.js +54 -0
  193. package/dist/view/server.js.map +1 -0
  194. package/docgen.config.json +19 -0
  195. package/docgen.config.json.example +19 -0
  196. package/package.json +79 -0
@@ -0,0 +1,447 @@
1
+ /**
2
+ * Tool: entity-workflow
3
+ *
4
+ * 实体影响分析 / 联动同步 / 校验
5
+ */
6
+ import { createRequire } from 'node:module';
7
+ import { listSchemaFiles, readSchemaFile, writeSchemaFile } from '../shared/schema-utils.js';
8
+ import { rebuildManifest } from '../shared/manifest-utils.js';
9
+ import { parseEntityRefConfig, readEntityFile, resolveEntityFilename, resolveEntitySchemaByRef, } from '../shared/entity-utils.js';
10
+ // Ajv CJS/ESM interop workaround
11
+ const require = createRequire(import.meta.url);
12
+ const Ajv = require('ajv');
13
+ const ajv = new Ajv.default({ allErrors: true });
14
+ const ENTITY_REF_KEY = 'x-entity-ref';
15
+ const OVERRIDE_KEYS = new Set([
16
+ 'title',
17
+ 'description',
18
+ 'nullable',
19
+ 'deprecated',
20
+ 'readOnly',
21
+ 'writeOnly',
22
+ 'default',
23
+ 'example',
24
+ 'examples',
25
+ ]);
26
+ function normalizeToken(value) {
27
+ return value.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
28
+ }
29
+ function parseStringArray(raw) {
30
+ if (!Array.isArray(raw)) {
31
+ return null;
32
+ }
33
+ if (!raw.every((item) => typeof item === 'string' && item.trim().length > 0)) {
34
+ return null;
35
+ }
36
+ return raw.map((item) => item.trim());
37
+ }
38
+ function escapeJsonPointer(segment) {
39
+ return segment.replace(/~/g, '~0').replace(/\//g, '~1');
40
+ }
41
+ function walkSchemaNodes(value, pointer, callback) {
42
+ if (Array.isArray(value)) {
43
+ value.forEach((item, index) => {
44
+ walkSchemaNodes(item, `${pointer}/${index}`, callback);
45
+ });
46
+ return;
47
+ }
48
+ if (typeof value !== 'object' || value === null) {
49
+ return;
50
+ }
51
+ const node = value;
52
+ callback(node, pointer || '/');
53
+ for (const [key, child] of Object.entries(node)) {
54
+ walkSchemaNodes(child, `${pointer}/${escapeJsonPointer(key)}`, callback);
55
+ }
56
+ }
57
+ function visitEntityRefNodes(filename, endpoint, callback) {
58
+ const visitScope = (scope, schema) => {
59
+ walkSchemaNodes(schema, '', (node, pointer) => {
60
+ if (node[ENTITY_REF_KEY] !== undefined) {
61
+ callback({
62
+ filename,
63
+ endpoint,
64
+ scope,
65
+ jsonPointer: pointer || '/',
66
+ node,
67
+ });
68
+ }
69
+ });
70
+ };
71
+ if (endpoint.request?.body) {
72
+ visitScope('request.body', endpoint.request.body);
73
+ }
74
+ if (endpoint.request?.query) {
75
+ visitScope('request.query', endpoint.request.query);
76
+ }
77
+ if (endpoint.request?.params) {
78
+ visitScope('request.params', endpoint.request.params);
79
+ }
80
+ if (endpoint.request?.headers) {
81
+ visitScope('request.headers', endpoint.request.headers);
82
+ }
83
+ for (const [statusCode, schema] of Object.entries(endpoint.response)) {
84
+ visitScope(`response.${statusCode}`, schema);
85
+ }
86
+ }
87
+ function stableStringify(value) {
88
+ if (value === null || typeof value !== 'object') {
89
+ return JSON.stringify(value);
90
+ }
91
+ if (Array.isArray(value)) {
92
+ return `[${value.map((item) => stableStringify(item)).join(',')}]`;
93
+ }
94
+ const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
95
+ return `{${entries
96
+ .map(([key, v]) => `${JSON.stringify(key)}:${stableStringify(v)}`)
97
+ .join(',')}}`;
98
+ }
99
+ function buildSyncedNode(currentNode, resolvedSchema) {
100
+ const next = JSON.parse(JSON.stringify(resolvedSchema));
101
+ next[ENTITY_REF_KEY] = currentNode[ENTITY_REF_KEY];
102
+ for (const [key, value] of Object.entries(currentNode)) {
103
+ if (key === ENTITY_REF_KEY) {
104
+ continue;
105
+ }
106
+ if (key.startsWith('x-') || OVERRIDE_KEYS.has(key)) {
107
+ next[key] = JSON.parse(JSON.stringify(value));
108
+ }
109
+ }
110
+ return next;
111
+ }
112
+ function shouldIncludeByFields(refFields, filterFields) {
113
+ if (filterFields.length === 0) {
114
+ return true;
115
+ }
116
+ // 全量引用默认受影响
117
+ if (!refFields || refFields.length === 0) {
118
+ return true;
119
+ }
120
+ return refFields.some((field) => filterFields.includes(field));
121
+ }
122
+ const IMPACT_DEFINITION = {
123
+ type: 'function',
124
+ function: {
125
+ name: 'entity_impact',
126
+ description: 'Analyze which schema files and endpoints are impacted by one entity change.',
127
+ parameters: {
128
+ type: 'object',
129
+ properties: {
130
+ entity: {
131
+ type: 'string',
132
+ description: 'Entity name to analyze (e.g. "User").',
133
+ },
134
+ fields: {
135
+ type: 'array',
136
+ items: { type: 'string' },
137
+ description: 'Optional changed fields. If provided, impact will focus on references related to these fields.',
138
+ },
139
+ },
140
+ required: ['entity'],
141
+ },
142
+ },
143
+ };
144
+ export const entityImpactTool = {
145
+ name: 'entity_impact',
146
+ description: 'Analyze impact of one entity change',
147
+ definition: IMPACT_DEFINITION,
148
+ async execute(args, context) {
149
+ const entity = typeof args.entity === 'string' ? args.entity.trim() : '';
150
+ if (!entity) {
151
+ return { success: false, error: 'entity is required' };
152
+ }
153
+ const fields = parseStringArray(args.fields) ?? [];
154
+ const manifest = rebuildManifest(context.outDir);
155
+ const target = normalizeToken(entity);
156
+ const matchedRefs = manifest.references.filter((ref) => {
157
+ if (normalizeToken(ref.entity) !== target) {
158
+ return false;
159
+ }
160
+ return shouldIncludeByFields(ref.fields, fields);
161
+ });
162
+ const endpointMap = new Map();
163
+ const fileSet = new Set();
164
+ for (const ref of matchedRefs) {
165
+ fileSet.add(ref.filename);
166
+ const endpointKey = `${ref.filename}::${ref.method}::${ref.path}`;
167
+ if (!endpointMap.has(endpointKey)) {
168
+ endpointMap.set(endpointKey, {
169
+ filename: ref.filename,
170
+ method: ref.method,
171
+ path: ref.path,
172
+ });
173
+ }
174
+ }
175
+ let riskLevel = 'low';
176
+ if (matchedRefs.length >= 12 || endpointMap.size >= 8) {
177
+ riskLevel = 'high';
178
+ }
179
+ else if (matchedRefs.length > 0) {
180
+ riskLevel = 'medium';
181
+ }
182
+ return {
183
+ success: true,
184
+ data: {
185
+ entity,
186
+ fields,
187
+ riskLevel,
188
+ impactedFiles: Array.from(fileSet).sort(),
189
+ impactedEndpoints: Array.from(endpointMap.values()),
190
+ impactedRefs: matchedRefs,
191
+ summary: matchedRefs.length === 0
192
+ ? `No references found for entity "${entity}".`
193
+ : `Found ${matchedRefs.length} references in ${fileSet.size} files.`,
194
+ },
195
+ };
196
+ },
197
+ };
198
+ const SYNC_DEFINITION = {
199
+ type: 'function',
200
+ function: {
201
+ name: 'entity_sync',
202
+ description: 'Sync endpoint schemas from one entity definition. ' +
203
+ 'Use apply=false for dry-run, apply=true to write files.',
204
+ parameters: {
205
+ type: 'object',
206
+ properties: {
207
+ entity: {
208
+ type: 'string',
209
+ description: 'Entity name to sync (e.g. "User").',
210
+ },
211
+ fields: {
212
+ type: 'array',
213
+ items: { type: 'string' },
214
+ description: 'Optional changed fields. If provided, only matched references will be synced.',
215
+ },
216
+ apply: {
217
+ type: 'boolean',
218
+ description: 'Whether to write synced results to schema files. Default false.',
219
+ },
220
+ },
221
+ required: ['entity'],
222
+ },
223
+ },
224
+ };
225
+ export const entitySyncTool = {
226
+ name: 'entity_sync',
227
+ description: 'Sync endpoints from entity references',
228
+ definition: SYNC_DEFINITION,
229
+ async execute(args, context) {
230
+ const entityInput = typeof args.entity === 'string' ? args.entity.trim() : '';
231
+ if (!entityInput) {
232
+ return { success: false, error: 'entity is required' };
233
+ }
234
+ const fields = parseStringArray(args.fields) ?? [];
235
+ const apply = args.apply === true;
236
+ const entityFilename = resolveEntityFilename(context.outDir, entityInput);
237
+ if (!entityFilename) {
238
+ return { success: false, error: `Entity not found: ${entityInput}` };
239
+ }
240
+ const entityDoc = readEntityFile(context.outDir, entityFilename);
241
+ const targetToken = normalizeToken(entityDoc.title || entityInput);
242
+ const files = listSchemaFiles(context.outDir);
243
+ const changedFiles = new Set();
244
+ const changes = [];
245
+ const conflicts = [];
246
+ for (const file of files) {
247
+ const doc = readSchemaFile(file.filepath);
248
+ let fileChanged = false;
249
+ for (const endpoint of doc.endpoints) {
250
+ visitEntityRefNodes(file.filename, endpoint, (ctx) => {
251
+ const parsed = parseEntityRefConfig(ctx.node[ENTITY_REF_KEY]);
252
+ if (!parsed) {
253
+ conflicts.push({
254
+ filename: ctx.filename,
255
+ method: endpoint.method,
256
+ path: endpoint.path,
257
+ scope: ctx.scope,
258
+ jsonPointer: ctx.jsonPointer,
259
+ error: 'Invalid x-entity-ref format',
260
+ });
261
+ return;
262
+ }
263
+ if (normalizeToken(parsed.entity) !== targetToken) {
264
+ return;
265
+ }
266
+ if (!shouldIncludeByFields(parsed.pick, fields)) {
267
+ return;
268
+ }
269
+ try {
270
+ const resolved = resolveEntitySchemaByRef(entityDoc, parsed);
271
+ const nextNode = buildSyncedNode(ctx.node, resolved.schema);
272
+ const changed = stableStringify(ctx.node) !== stableStringify(nextNode);
273
+ if (!changed) {
274
+ return;
275
+ }
276
+ changes.push({
277
+ filename: ctx.filename,
278
+ method: endpoint.method,
279
+ path: endpoint.path,
280
+ scope: ctx.scope,
281
+ jsonPointer: ctx.jsonPointer,
282
+ fields: resolved.fields,
283
+ });
284
+ if (apply) {
285
+ for (const key of Object.keys(ctx.node)) {
286
+ delete ctx.node[key];
287
+ }
288
+ Object.assign(ctx.node, nextNode);
289
+ fileChanged = true;
290
+ }
291
+ }
292
+ catch (err) {
293
+ conflicts.push({
294
+ filename: ctx.filename,
295
+ method: endpoint.method,
296
+ path: endpoint.path,
297
+ scope: ctx.scope,
298
+ jsonPointer: ctx.jsonPointer,
299
+ error: err instanceof Error ? err.message : String(err),
300
+ });
301
+ }
302
+ });
303
+ }
304
+ if (apply && fileChanged) {
305
+ writeSchemaFile(file.filepath, doc);
306
+ changedFiles.add(file.filename);
307
+ }
308
+ }
309
+ if (apply) {
310
+ rebuildManifest(context.outDir);
311
+ }
312
+ return {
313
+ success: conflicts.length === 0,
314
+ data: {
315
+ entity: entityDoc.title,
316
+ entityFile: entityFilename,
317
+ mode: apply ? 'apply' : 'dry-run',
318
+ fields,
319
+ changedFileCount: apply ? changedFiles.size : new Set(changes.map((c) => c.filename)).size,
320
+ changedFiles: apply
321
+ ? Array.from(changedFiles).sort()
322
+ : Array.from(new Set(changes.map((c) => String(c.filename)))).sort(),
323
+ changeCount: changes.length,
324
+ changes,
325
+ conflictCount: conflicts.length,
326
+ conflicts,
327
+ },
328
+ error: conflicts.length > 0 ? `Found ${conflicts.length} sync conflict(s)` : undefined,
329
+ };
330
+ },
331
+ };
332
+ const VALIDATE_DEFINITION = {
333
+ type: 'function',
334
+ function: {
335
+ name: 'entity_validate',
336
+ description: 'Validate entity references across schema files, including entity existence and field validity.',
337
+ parameters: {
338
+ type: 'object',
339
+ properties: {
340
+ entity: {
341
+ type: 'string',
342
+ description: 'Optional entity name to validate only related references.',
343
+ },
344
+ filename: {
345
+ type: 'string',
346
+ description: 'Optional schema filename to validate one file only.',
347
+ },
348
+ all: {
349
+ type: 'boolean',
350
+ description: 'Validate all schema files and all entity refs.',
351
+ },
352
+ },
353
+ },
354
+ },
355
+ };
356
+ export const entityValidateTool = {
357
+ name: 'entity_validate',
358
+ description: 'Validate entity reference consistency',
359
+ definition: VALIDATE_DEFINITION,
360
+ async execute(args, context) {
361
+ const filterEntity = typeof args.entity === 'string' ? args.entity.trim() : '';
362
+ const filterFilename = typeof args.filename === 'string' ? args.filename.trim() : '';
363
+ const validateAll = args.all === true || (!filterEntity && !filterFilename);
364
+ const files = listSchemaFiles(context.outDir).filter((file) => {
365
+ if (validateAll)
366
+ return true;
367
+ if (filterFilename)
368
+ return file.filename === filterFilename;
369
+ return true;
370
+ });
371
+ const entityCache = new Map();
372
+ const errors = [];
373
+ const warnings = [];
374
+ let checkedRefs = 0;
375
+ let checkedFiles = 0;
376
+ for (const file of files) {
377
+ const doc = readSchemaFile(file.filepath);
378
+ checkedFiles++;
379
+ for (const endpoint of doc.endpoints) {
380
+ // 验证 scope 根 schema 本身是合法 JSON Schema
381
+ const scopes = [];
382
+ if (endpoint.request?.body)
383
+ scopes.push({ label: 'request.body', schema: endpoint.request.body });
384
+ if (endpoint.request?.query)
385
+ scopes.push({ label: 'request.query', schema: endpoint.request.query });
386
+ if (endpoint.request?.params)
387
+ scopes.push({ label: 'request.params', schema: endpoint.request.params });
388
+ if (endpoint.request?.headers)
389
+ scopes.push({ label: 'request.headers', schema: endpoint.request.headers });
390
+ for (const [statusCode, schema] of Object.entries(endpoint.response)) {
391
+ scopes.push({ label: `response.${statusCode}`, schema });
392
+ }
393
+ for (const scope of scopes) {
394
+ if (!ajv.validateSchema(scope.schema)) {
395
+ errors.push(`${file.filename} ${endpoint.method} ${endpoint.path} ${scope.label}: invalid JSON Schema`);
396
+ }
397
+ }
398
+ visitEntityRefNodes(file.filename, endpoint, (ctx) => {
399
+ const parsed = parseEntityRefConfig(ctx.node[ENTITY_REF_KEY]);
400
+ if (!parsed) {
401
+ errors.push(`${ctx.filename} ${endpoint.method} ${endpoint.path} ${ctx.scope}${ctx.jsonPointer}: invalid x-entity-ref format`);
402
+ return;
403
+ }
404
+ if (!validateAll && filterEntity) {
405
+ if (normalizeToken(parsed.entity) !== normalizeToken(filterEntity)) {
406
+ return;
407
+ }
408
+ }
409
+ checkedRefs++;
410
+ const resolvedFilename = resolveEntityFilename(context.outDir, parsed.entity);
411
+ if (!resolvedFilename) {
412
+ errors.push(`${ctx.filename} ${endpoint.method} ${endpoint.path} ${ctx.scope}${ctx.jsonPointer}: entity "${parsed.entity}" not found`);
413
+ return;
414
+ }
415
+ let cached = entityCache.get(resolvedFilename);
416
+ if (!cached) {
417
+ const entityDoc = readEntityFile(context.outDir, resolvedFilename);
418
+ cached = { filename: resolvedFilename, doc: entityDoc };
419
+ entityCache.set(resolvedFilename, cached);
420
+ }
421
+ try {
422
+ resolveEntitySchemaByRef(cached.doc, parsed);
423
+ }
424
+ catch (err) {
425
+ errors.push(`${ctx.filename} ${endpoint.method} ${endpoint.path} ${ctx.scope}${ctx.jsonPointer}: ${err instanceof Error ? err.message : String(err)}`);
426
+ return;
427
+ }
428
+ if (!parsed.pick || parsed.pick.length === 0) {
429
+ warnings.push(`${ctx.filename} ${endpoint.method} ${endpoint.path} ${ctx.scope}${ctx.jsonPointer}: full entity reference "${parsed.entity}"`);
430
+ }
431
+ });
432
+ }
433
+ }
434
+ rebuildManifest(context.outDir);
435
+ return {
436
+ success: errors.length === 0,
437
+ data: {
438
+ checkedFiles,
439
+ checkedRefs,
440
+ errors,
441
+ warnings,
442
+ },
443
+ error: errors.length > 0 ? `Found ${errors.length} validation error(s)` : undefined,
444
+ };
445
+ },
446
+ };
447
+ //# sourceMappingURL=entity-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-workflow.js","sourceRoot":"","sources":["../../src/tools/entity-workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tool: file-ops
3
+ *
4
+ * 文件操作工具 — 读取已有 schema、列出 docs 目录内容
5
+ */
6
+ import type { Tool } from './types.js';
7
+ export declare const listSchemasTool: Tool;
8
+ export declare const readSchemaTool: Tool;
9
+ //# sourceMappingURL=file-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ops.d.ts","sourceRoot":"","sources":["../../src/tools/file-ops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,YAAY,CAAC;AAuBhE,eAAO,MAAM,eAAe,EAAE,IAwB7B,CAAC;AA0BF,eAAO,MAAM,cAAc,EAAE,IAsB5B,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Tool: file-ops
3
+ *
4
+ * 文件操作工具 — 读取已有 schema、列出 docs 目录内容
5
+ */
6
+ import { listSchemaFiles, readSchemaFile } from '../shared/schema-utils.js';
7
+ import path from 'node:path';
8
+ // ============================================================
9
+ // list_schemas — 列出所有已有的 schema 文件
10
+ // ============================================================
11
+ const LIST_DEFINITION = {
12
+ type: 'function',
13
+ function: {
14
+ name: 'list_schemas',
15
+ description: 'List all existing JSON Schema files in the docs directory. ' +
16
+ 'Returns filename, title, description, and endpoint count for each.',
17
+ parameters: {
18
+ type: 'object',
19
+ properties: {},
20
+ },
21
+ },
22
+ };
23
+ export const listSchemasTool = {
24
+ name: 'list_schemas',
25
+ description: 'List all existing schema files',
26
+ definition: LIST_DEFINITION,
27
+ async execute(_args, context) {
28
+ const files = listSchemaFiles(context.outDir);
29
+ return {
30
+ success: true,
31
+ data: {
32
+ count: files.length,
33
+ files: files.map((f) => ({
34
+ filename: f.filename,
35
+ title: f.title,
36
+ description: f.description,
37
+ endpointCount: f.endpointCount,
38
+ })),
39
+ },
40
+ };
41
+ },
42
+ };
43
+ // ============================================================
44
+ // read_schema — 读取指定 schema 文件的完整内容
45
+ // ============================================================
46
+ const READ_DEFINITION = {
47
+ type: 'function',
48
+ function: {
49
+ name: 'read_schema',
50
+ description: 'Read the full content of an existing JSON Schema file. ' +
51
+ 'Useful for reviewing or modifying existing API definitions.',
52
+ parameters: {
53
+ type: 'object',
54
+ properties: {
55
+ filename: {
56
+ type: 'string',
57
+ description: 'The schema filename to read (e.g. "users.schema.json")',
58
+ },
59
+ },
60
+ required: ['filename'],
61
+ },
62
+ },
63
+ };
64
+ export const readSchemaTool = {
65
+ name: 'read_schema',
66
+ description: 'Read an existing schema file',
67
+ definition: READ_DEFINITION,
68
+ async execute(args, context) {
69
+ const filename = args.filename;
70
+ const filepath = path.join(context.outDir, filename);
71
+ try {
72
+ const doc = readSchemaFile(filepath);
73
+ return { success: true, data: doc };
74
+ }
75
+ catch (err) {
76
+ return {
77
+ success: false,
78
+ error: `Failed to read schema file: ${err instanceof Error ? err.message : String(err)}`,
79
+ };
80
+ }
81
+ },
82
+ };
83
+ //# sourceMappingURL=file-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ops.js","sourceRoot":"","sources":["../../src/tools/file-ops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,+DAA+D;AAC/D,mCAAmC;AACnC,+DAA+D;AAE/D,MAAM,eAAe,GAAsB;IACzC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,6DAA6D;YAC7D,oEAAoE;QACtE,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,gCAAgC;IAC7C,UAAU,EAAE,eAAe;IAE3B,KAAK,CAAC,OAAO,CACX,KAA8B,EAC9B,OAAoB;QAEpB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;iBAC/B,CAAC,CAAC;aACJ;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAE/D,MAAM,eAAe,GAAsB;IACzC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,yDAAyD;YACzD,6DAA6D;QAC/D,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wDAAwD;iBACtE;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,8BAA8B;IAC3C,UAAU,EAAE,eAAe;IAE3B,KAAK,CAAC,OAAO,CACX,IAA6B,EAC7B,OAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAErD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACzF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 工具注册中心
3
+ *
4
+ * 管理所有可用的 Agent 工具,提供注册、查询和执行能力
5
+ */
6
+ import type { Tool, ToolContext, ToolResult } from './types.js';
7
+ import type { LLMToolDefinition } from '../llm/types.js';
8
+ export declare class ToolRegistry {
9
+ private tools;
10
+ /**
11
+ * 注册一个工具
12
+ */
13
+ register(tool: Tool): void;
14
+ /**
15
+ * 批量注册工具
16
+ */
17
+ registerAll(tools: Tool[]): void;
18
+ /**
19
+ * 获取所有工具的 LLM function calling 定义
20
+ */
21
+ getDefinitions(): LLMToolDefinition[];
22
+ /**
23
+ * 根据名称执行工具
24
+ */
25
+ execute(name: string, args: Record<string, unknown>, context: ToolContext): Promise<ToolResult>;
26
+ /**
27
+ * 获取已注册的工具名称列表
28
+ */
29
+ getToolNames(): string[];
30
+ }
31
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA2B;IAExC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQ1B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAMhC;;OAEG;IACH,cAAc,IAAI,iBAAiB,EAAE;IAIrC;;OAEG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IAiBtB;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;CAGzB"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 工具注册中心
3
+ *
4
+ * 管理所有可用的 Agent 工具,提供注册、查询和执行能力
5
+ */
6
+ import { logger } from '../shared/logger.js';
7
+ export class ToolRegistry {
8
+ tools = new Map();
9
+ /**
10
+ * 注册一个工具
11
+ */
12
+ register(tool) {
13
+ if (this.tools.has(tool.name)) {
14
+ logger.warn(`Tool "${tool.name}" is already registered, overwriting.`);
15
+ }
16
+ this.tools.set(tool.name, tool);
17
+ logger.debug(`Tool registered: ${tool.name}`);
18
+ }
19
+ /**
20
+ * 批量注册工具
21
+ */
22
+ registerAll(tools) {
23
+ for (const tool of tools) {
24
+ this.register(tool);
25
+ }
26
+ }
27
+ /**
28
+ * 获取所有工具的 LLM function calling 定义
29
+ */
30
+ getDefinitions() {
31
+ return Array.from(this.tools.values()).map((t) => t.definition);
32
+ }
33
+ /**
34
+ * 根据名称执行工具
35
+ */
36
+ async execute(name, args, context) {
37
+ const tool = this.tools.get(name);
38
+ if (!tool) {
39
+ return { success: false, error: `Unknown tool: ${name}` };
40
+ }
41
+ logger.debug(`Executing tool: ${name}`, args);
42
+ try {
43
+ return await tool.execute(args, context);
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : String(err);
47
+ logger.error(`Tool "${name}" failed: ${message}`);
48
+ return { success: false, error: message };
49
+ }
50
+ }
51
+ /**
52
+ * 获取已注册的工具名称列表
53
+ */
54
+ getToolNames() {
55
+ return Array.from(this.tools.keys());
56
+ }
57
+ }
58
+ //# sourceMappingURL=registry.js.map