@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 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,IAAU;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,uCAAuC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,IAA6B,EAC7B,OAAoB;QAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,aAAa,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tool: schema-gen
3
+ *
4
+ * 将 Agent 生成的内容写入 JSON Schema 文件
5
+ */
6
+ import type { Tool } from './types.js';
7
+ export declare const schemaGenTool: Tool;
8
+ //# sourceMappingURL=schema-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-gen.d.ts","sourceRoot":"","sources":["../../src/tools/schema-gen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,YAAY,CAAC;AAsChE,eAAO,MAAM,aAAa,EAAE,IAwD3B,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Tool: schema-gen
3
+ *
4
+ * 将 Agent 生成的内容写入 JSON Schema 文件
5
+ */
6
+ import path from 'node:path';
7
+ import fs from 'node:fs';
8
+ import { writeSchemaFile, isValidSchemaDocument } from '../shared/schema-utils.js';
9
+ const DEFINITION = {
10
+ type: 'function',
11
+ function: {
12
+ name: 'write_schema',
13
+ description: 'Write a JSON Schema document to the docs directory. ' +
14
+ 'Can create a new file or overwrite an existing file. ' +
15
+ 'Use mustExist=true for update-only mode.',
16
+ parameters: {
17
+ type: 'object',
18
+ properties: {
19
+ filename: {
20
+ type: 'string',
21
+ description: 'The filename for the schema file (e.g. "users.schema.json"). Must end with .schema.json',
22
+ },
23
+ schema: {
24
+ type: 'object',
25
+ description: 'The complete JSON Schema document object containing title, description, and endpoints array.',
26
+ },
27
+ mustExist: {
28
+ type: 'boolean',
29
+ description: 'If true, the target file must already exist. ' +
30
+ 'Use this when modifying an existing schema file to prevent accidental new file creation.',
31
+ },
32
+ },
33
+ required: ['filename', 'schema'],
34
+ },
35
+ },
36
+ };
37
+ export const schemaGenTool = {
38
+ name: 'write_schema',
39
+ description: 'Write a JSON Schema document to the docs directory',
40
+ definition: DEFINITION,
41
+ async execute(args, context) {
42
+ const filename = args.filename;
43
+ const schema = args.schema;
44
+ const mustExist = args.mustExist === true;
45
+ // 校验文件名
46
+ if (!filename.endsWith('.schema.json')) {
47
+ return {
48
+ success: false,
49
+ error: 'Filename must end with .schema.json',
50
+ };
51
+ }
52
+ // 校验 schema 结构
53
+ if (!isValidSchemaDocument(schema)) {
54
+ return {
55
+ success: false,
56
+ error: 'Invalid schema structure. Must contain title, description, and endpoints.',
57
+ };
58
+ }
59
+ // 确保 $schema 字段
60
+ if (!schema.$schema) {
61
+ schema.$schema = 'http://json-schema.org/draft-07/schema#';
62
+ }
63
+ const filepath = path.join(context.outDir, filename);
64
+ if (mustExist && !fs.existsSync(filepath)) {
65
+ return {
66
+ success: false,
67
+ error: `Schema file does not exist: ${filename}. ` +
68
+ 'Update-only mode is enabled (mustExist=true), so new file creation is blocked.',
69
+ };
70
+ }
71
+ writeSchemaFile(filepath, schema);
72
+ return {
73
+ success: true,
74
+ data: {
75
+ filepath,
76
+ endpointCount: schema.endpoints.length,
77
+ message: `Schema "${schema.title}" written to ${filepath}`,
78
+ },
79
+ };
80
+ },
81
+ };
82
+ //# sourceMappingURL=schema-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-gen.js","sourceRoot":"","sources":["../../src/tools/schema-gen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGnF,MAAM,UAAU,GAAsB;IACpC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,sDAAsD;YACtD,uDAAuD;YACvD,0CAA0C;QAC5C,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,yFAAyF;iBAC5F;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,8FAA8F;iBACjG;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,SAAS;oBACf,WAAW,EACT,+CAA+C;wBAC/C,0FAA0F;iBAC7F;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;SACjC;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oDAAoD;IACjE,UAAU,EAAE,UAAU;IAEtB,KAAK,CAAC,OAAO,CACX,IAA6B,EAC7B,OAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAwB,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;QAE1C,QAAQ;QACR,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,qCAAqC;aAC7C,CAAC;QACJ,CAAC;QAED,eAAe;QACf,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,2EAA2E;aACnF,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,GAAG,yCAAyC,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAErD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,+BAA+B,QAAQ,IAAI;oBAC3C,gFAAgF;aACnF,CAAC;QACJ,CAAC;QAED,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAElC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,QAAQ;gBACR,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;gBACtC,OAAO,EAAE,WAAW,MAAM,CAAC,KAAK,gBAAgB,QAAQ,EAAE;aAC3D;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tool: schema-validate
3
+ *
4
+ * 校验 JSON Schema 文件的合法性
5
+ */
6
+ import type { Tool } from './types.js';
7
+ export declare const schemaValidateTool: Tool;
8
+ //# sourceMappingURL=schema-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validate.d.ts","sourceRoot":"","sources":["../../src/tools/schema-validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,YAAY,CAAC;AA6BhE,eAAO,MAAM,kBAAkB,EAAE,IA4DhC,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Tool: schema-validate
3
+ *
4
+ * 校验 JSON Schema 文件的合法性
5
+ */
6
+ import { createRequire } from 'node:module';
7
+ import { readSchemaFile } from '../shared/schema-utils.js';
8
+ import path from 'node:path';
9
+ // Ajv CJS/ESM interop workaround
10
+ const require = createRequire(import.meta.url);
11
+ const Ajv = require('ajv');
12
+ const ajv = new Ajv.default({ allErrors: true });
13
+ const DEFINITION = {
14
+ type: 'function',
15
+ function: {
16
+ name: 'validate_schema',
17
+ description: 'Validate a JSON Schema file to check if all schema definitions within it are valid JSON Schema.',
18
+ parameters: {
19
+ type: 'object',
20
+ properties: {
21
+ filename: {
22
+ type: 'string',
23
+ description: 'The schema filename to validate (e.g. "users.schema.json")',
24
+ },
25
+ },
26
+ required: ['filename'],
27
+ },
28
+ },
29
+ };
30
+ export const schemaValidateTool = {
31
+ name: 'validate_schema',
32
+ description: 'Validate a JSON Schema file',
33
+ definition: DEFINITION,
34
+ async execute(args, context) {
35
+ const filename = args.filename;
36
+ const filepath = path.join(context.outDir, filename);
37
+ try {
38
+ const doc = readSchemaFile(filepath);
39
+ const errors = [];
40
+ // 校验每个 endpoint 的 request/response schema
41
+ for (const endpoint of doc.endpoints) {
42
+ // 校验 request body schema
43
+ if (endpoint.request?.body) {
44
+ const valid = ajv.validateSchema(endpoint.request.body);
45
+ if (!valid) {
46
+ errors.push(`${endpoint.method} ${endpoint.path} request.body: invalid schema`);
47
+ }
48
+ }
49
+ // 校验每个 response status 的 schema
50
+ for (const [status, schema] of Object.entries(endpoint.response)) {
51
+ const valid = ajv.validateSchema(schema);
52
+ if (!valid) {
53
+ errors.push(`${endpoint.method} ${endpoint.path} response.${status}: invalid schema`);
54
+ }
55
+ }
56
+ }
57
+ if (errors.length > 0) {
58
+ return {
59
+ success: false,
60
+ data: { errors },
61
+ error: `Found ${errors.length} validation error(s)`,
62
+ };
63
+ }
64
+ return {
65
+ success: true,
66
+ data: {
67
+ message: `Schema "${doc.title}" is valid (${doc.endpoints.length} endpoints)`,
68
+ },
69
+ };
70
+ }
71
+ catch (err) {
72
+ return {
73
+ success: false,
74
+ error: `Failed to read or parse schema file: ${err instanceof Error ? err.message : String(err)}`,
75
+ };
76
+ }
77
+ },
78
+ };
79
+ //# sourceMappingURL=schema-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validate.js","sourceRoot":"","sources":["../../src/tools/schema-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Tool 系统类型定义
3
+ */
4
+ import type { LLMToolDefinition } from '../llm/types.js';
5
+ /** Tool 执行结果 */
6
+ export interface ToolResult {
7
+ success: boolean;
8
+ data?: unknown;
9
+ error?: string;
10
+ }
11
+ /** Tool 执行上下文 */
12
+ export interface ToolContext {
13
+ /** 目标项目根目录 */
14
+ projectDir: string;
15
+ /** schema 输出目录的绝对路径 */
16
+ outDir: string;
17
+ }
18
+ /** Tool 定义接口 — 每个工具需要实现 */
19
+ export interface Tool {
20
+ /** 工具名称 (用于 function calling) */
21
+ name: string;
22
+ /** 工具描述 */
23
+ description: string;
24
+ /** OpenAI function calling 格式的参数 schema */
25
+ definition: LLMToolDefinition;
26
+ /** 执行工具 */
27
+ execute(args: Record<string, unknown>, context: ToolContext): Promise<ToolResult>;
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,gBAAgB;AAChB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2BAA2B;AAC3B,MAAM,WAAW,IAAI;IACnB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW;IACX,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tool 系统类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * TUI 根组件
3
+ *
4
+ * 组合所有子组件,处理内置命令,协调数据流
5
+ */
6
+ import React from 'react';
7
+ import type { AgentConfig } from '../agents/core/types.js';
8
+ interface AppProps {
9
+ agentConfig: AgentConfig;
10
+ }
11
+ export declare const App: React.FC<AppProps>;
12
+ export {};
13
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAexE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,UAAU,QAAQ;IAChB,WAAW,EAAE,WAAW,CAAC;CAC1B;AA4BD,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAkZlC,CAAC"}
@@ -0,0 +1,357 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * TUI 根组件
4
+ *
5
+ * 组合所有子组件,处理内置命令,协调数据流
6
+ */
7
+ import { useState, useCallback, useRef, useEffect } from 'react';
8
+ import { Box, useApp, useInput } from 'ink';
9
+ import { Header } from './components/Header.js';
10
+ import { Chat } from './components/Chat.js';
11
+ import { Input } from './components/Input.js';
12
+ import { StatusBar } from './components/StatusBar.js';
13
+ import { SchemaPreview } from './components/SchemaPreview.js';
14
+ import { useAgent } from './hooks/useAgent.js';
15
+ import { listSchemaFiles } from '../shared/schema-utils.js';
16
+ import { getOutDir } from '../shared/config.js';
17
+ import { startMockServer } from '../mocks/server.js';
18
+ import { startViewServer } from '../view/server.js';
19
+ /** 版本号 (与 package.json 保持一致) */
20
+ const VERSION = '0.1.0';
21
+ /** 内置命令帮助文本 */
22
+ const HELP_TEXT = `Available commands:
23
+ /help — Show this help message
24
+ /reset — Reset conversation history
25
+ /list — List generated schema files
26
+ /mock — Start mock server (optional: /mock <port>)
27
+ /mock stop — Stop mock server
28
+ /mock restart [port] — Restart mock server (also: /mock resart)
29
+ /view — Start docs viewer (optional: /view <port>)
30
+ /view stop — Stop docs viewer
31
+ /view restart [port] — Restart docs viewer (also: /view resart)
32
+ /abort — Abort current request (also: Esc)
33
+ /exit — Exit Loom (also: /quit, Ctrl+C)`;
34
+ function parsePort(raw) {
35
+ if (!raw)
36
+ return null;
37
+ const parsed = Number.parseInt(raw, 10);
38
+ if (Number.isNaN(parsed) || parsed < 1 || parsed > 65535) {
39
+ return null;
40
+ }
41
+ return parsed;
42
+ }
43
+ export const App = ({ agentConfig }) => {
44
+ const { exit } = useApp();
45
+ const { messages, state, toolProgress, sendMessage, abort, reset, isProcessing } = useAgent(agentConfig);
46
+ const [schemas, setSchemas] = useState([]);
47
+ const [mockState, setMockState] = useState('stopped');
48
+ const [mockPort, setMockPort] = useState(null);
49
+ const mockServerRef = useRef(null);
50
+ const [viewState, setViewState] = useState('stopped');
51
+ const [viewPort, setViewPort] = useState(null);
52
+ const viewServerRef = useRef(null);
53
+ const outDir = getOutDir(agentConfig.loomConfig, agentConfig.projectDir);
54
+ /** Esc 键中断当前请求 */
55
+ useInput((_, key) => {
56
+ if (key.escape && isProcessing) {
57
+ abort();
58
+ }
59
+ });
60
+ useEffect(() => {
61
+ return () => {
62
+ if (mockServerRef.current) {
63
+ void mockServerRef.current.close().catch(() => undefined);
64
+ mockServerRef.current = null;
65
+ }
66
+ if (viewServerRef.current) {
67
+ void viewServerRef.current.close().catch(() => undefined);
68
+ viewServerRef.current = null;
69
+ }
70
+ };
71
+ }, []);
72
+ /** 刷新 schema 文件列表 */
73
+ const refreshSchemas = useCallback(() => {
74
+ setSchemas(listSchemaFiles(outDir));
75
+ }, [outDir]);
76
+ /**
77
+ * 注入系统消息 (用于内置命令响应)
78
+ */
79
+ const [localMessages, setLocalMessages] = useState([]);
80
+ const sendSystemMessage = useCallback((content) => {
81
+ setLocalMessages((prev) => [
82
+ ...prev,
83
+ { type: 'system', content, timestamp: new Date() },
84
+ ]);
85
+ }, []);
86
+ const startMock = useCallback(async (port) => {
87
+ const host = agentConfig.loomConfig.mock.host || '0.0.0.0';
88
+ const files = listSchemaFiles(outDir);
89
+ const endpointCount = files.reduce((sum, file) => sum + file.endpointCount, 0);
90
+ setMockState('starting');
91
+ sendSystemMessage(`Starting mock server on port ${port}...`);
92
+ try {
93
+ const handle = await startMockServer({
94
+ port,
95
+ host,
96
+ docsDir: outDir,
97
+ silent: true,
98
+ });
99
+ mockServerRef.current = handle;
100
+ setMockState('running');
101
+ setMockPort(handle.port);
102
+ sendSystemMessage(`Mock server is running at http://localhost:${handle.port} (${endpointCount} routes from ${files.length} schema files).`);
103
+ }
104
+ catch (err) {
105
+ setMockState('stopped');
106
+ setMockPort(null);
107
+ const message = err instanceof Error ? err.message : 'Failed to start mock server.';
108
+ sendSystemMessage(`Failed to start mock server: ${message}`);
109
+ }
110
+ }, [agentConfig.loomConfig.mock.host, outDir, sendSystemMessage]);
111
+ const stopMock = useCallback(async (options) => {
112
+ const handle = mockServerRef.current;
113
+ if (!handle) {
114
+ return false;
115
+ }
116
+ setMockState('stopping');
117
+ if (!options?.silent) {
118
+ sendSystemMessage(`Stopping mock server on port ${handle.port}...`);
119
+ }
120
+ try {
121
+ await handle.close();
122
+ mockServerRef.current = null;
123
+ setMockState('stopped');
124
+ setMockPort(null);
125
+ if (!options?.silent) {
126
+ sendSystemMessage('Mock server stopped.');
127
+ }
128
+ return true;
129
+ }
130
+ catch (err) {
131
+ setMockState('running');
132
+ const message = err instanceof Error ? err.message : 'Failed to stop mock server.';
133
+ sendSystemMessage(`Failed to stop mock server: ${message}`);
134
+ return false;
135
+ }
136
+ }, [sendSystemMessage]);
137
+ const startView = useCallback(async (port) => {
138
+ const host = agentConfig.loomConfig.serve.host || '0.0.0.0';
139
+ const files = listSchemaFiles(outDir);
140
+ const endpointCount = files.reduce((sum, file) => sum + file.endpointCount, 0);
141
+ setViewState('starting');
142
+ sendSystemMessage(`Starting docs viewer on port ${port}...`);
143
+ try {
144
+ const handle = await startViewServer({
145
+ port,
146
+ host,
147
+ docsDir: outDir,
148
+ silent: true,
149
+ });
150
+ viewServerRef.current = handle;
151
+ setViewState('running');
152
+ setViewPort(handle.port);
153
+ sendSystemMessage(`Docs viewer is running at http://localhost:${handle.port} (${files.length} schema files, ${endpointCount} endpoints).`);
154
+ }
155
+ catch (err) {
156
+ setViewState('stopped');
157
+ setViewPort(null);
158
+ const message = err instanceof Error ? err.message : 'Failed to start docs viewer.';
159
+ sendSystemMessage(`Failed to start docs viewer: ${message}`);
160
+ }
161
+ }, [agentConfig.loomConfig.serve.host, outDir, sendSystemMessage]);
162
+ const stopView = useCallback(async (options) => {
163
+ const handle = viewServerRef.current;
164
+ if (!handle) {
165
+ return false;
166
+ }
167
+ setViewState('stopping');
168
+ if (!options?.silent) {
169
+ sendSystemMessage(`Stopping docs viewer on port ${handle.port}...`);
170
+ }
171
+ try {
172
+ await handle.close();
173
+ viewServerRef.current = null;
174
+ setViewState('stopped');
175
+ setViewPort(null);
176
+ if (!options?.silent) {
177
+ sendSystemMessage('Docs viewer stopped.');
178
+ }
179
+ return true;
180
+ }
181
+ catch (err) {
182
+ setViewState('running');
183
+ const message = err instanceof Error ? err.message : 'Failed to stop docs viewer.';
184
+ sendSystemMessage(`Failed to stop docs viewer: ${message}`);
185
+ return false;
186
+ }
187
+ }, [sendSystemMessage]);
188
+ /**
189
+ * 处理用户输入 — 先判断是否为内置命令
190
+ */
191
+ const handleSubmit = useCallback(async (input) => {
192
+ const tokens = input.trim().split(/\s+/).filter(Boolean);
193
+ const baseCmd = tokens[0]?.toLowerCase();
194
+ const arg1 = tokens[1]?.toLowerCase();
195
+ const arg2 = tokens[2];
196
+ switch (baseCmd) {
197
+ case '/exit':
198
+ case '/quit':
199
+ if (mockServerRef.current) {
200
+ await stopMock({ silent: true });
201
+ }
202
+ if (viewServerRef.current) {
203
+ await stopView({ silent: true });
204
+ }
205
+ exit();
206
+ return;
207
+ case '/help':
208
+ sendSystemMessage(HELP_TEXT);
209
+ return;
210
+ case '/reset':
211
+ reset();
212
+ setLocalMessages([]);
213
+ sendSystemMessage('Conversation has been reset.');
214
+ return;
215
+ case '/abort':
216
+ abort();
217
+ sendSystemMessage('Request aborted.');
218
+ return;
219
+ case '/list':
220
+ refreshSchemas();
221
+ const files = listSchemaFiles(outDir);
222
+ if (files.length === 0) {
223
+ sendSystemMessage('No schema files found in ' + outDir);
224
+ }
225
+ else {
226
+ const list = files
227
+ .map((f) => ` ${f.filename} — ${f.title} (${f.endpointCount} endpoints)`)
228
+ .join('\n');
229
+ sendSystemMessage(`Schema files:\n${list}`);
230
+ }
231
+ return;
232
+ case '/mock': {
233
+ if (mockState === 'starting' || mockState === 'stopping') {
234
+ sendSystemMessage('Mock server is busy, please wait...');
235
+ return;
236
+ }
237
+ if (arg1 === 'stop') {
238
+ if (tokens.length > 2) {
239
+ sendSystemMessage('Usage: /mock stop');
240
+ return;
241
+ }
242
+ const stopped = await stopMock();
243
+ if (!stopped) {
244
+ sendSystemMessage('Mock server is not running.');
245
+ }
246
+ return;
247
+ }
248
+ if (arg1 === 'restart' || arg1 === 'resart') {
249
+ if (tokens.length > 3) {
250
+ sendSystemMessage('Usage: /mock restart or /mock restart <1-65535>');
251
+ return;
252
+ }
253
+ const parsedRestartPort = parsePort(arg2);
254
+ if (arg2 && parsedRestartPort === null) {
255
+ sendSystemMessage('Invalid port. Usage: /mock restart <1-65535>');
256
+ return;
257
+ }
258
+ const restartPort = parsedRestartPort ?? mockPort ?? agentConfig.loomConfig.mock.port;
259
+ if (mockServerRef.current) {
260
+ sendSystemMessage(`Restarting mock server on port ${restartPort}...`);
261
+ const stopped = await stopMock({ silent: true });
262
+ if (!stopped) {
263
+ return;
264
+ }
265
+ }
266
+ await startMock(restartPort);
267
+ return;
268
+ }
269
+ if (arg1 && parsePort(arg1) === null) {
270
+ sendSystemMessage('Usage: /mock | /mock <1-65535> | /mock stop | /mock restart [1-65535]');
271
+ return;
272
+ }
273
+ if (mockState === 'running') {
274
+ sendSystemMessage(`Mock server already running at http://localhost:${mockPort ?? agentConfig.loomConfig.mock.port}. Use /mock restart to reload.`);
275
+ return;
276
+ }
277
+ const port = parsePort(arg1) ?? agentConfig.loomConfig.mock.port;
278
+ await startMock(port);
279
+ return;
280
+ }
281
+ case '/view': {
282
+ if (viewState === 'starting' || viewState === 'stopping') {
283
+ sendSystemMessage('Docs viewer is busy, please wait...');
284
+ return;
285
+ }
286
+ if (arg1 === 'stop') {
287
+ if (tokens.length > 2) {
288
+ sendSystemMessage('Usage: /view stop');
289
+ return;
290
+ }
291
+ const stopped = await stopView();
292
+ if (!stopped) {
293
+ sendSystemMessage('Docs viewer is not running.');
294
+ }
295
+ return;
296
+ }
297
+ if (arg1 === 'restart' || arg1 === 'resart') {
298
+ if (tokens.length > 3) {
299
+ sendSystemMessage('Usage: /view restart or /view restart <1-65535>');
300
+ return;
301
+ }
302
+ const parsedRestartPort = parsePort(arg2);
303
+ if (arg2 && parsedRestartPort === null) {
304
+ sendSystemMessage('Invalid port. Usage: /view restart <1-65535>');
305
+ return;
306
+ }
307
+ const restartPort = parsedRestartPort ?? viewPort ?? agentConfig.loomConfig.serve.port;
308
+ if (viewServerRef.current) {
309
+ sendSystemMessage(`Restarting docs viewer on port ${restartPort}...`);
310
+ const stopped = await stopView({ silent: true });
311
+ if (!stopped) {
312
+ return;
313
+ }
314
+ }
315
+ await startView(restartPort);
316
+ return;
317
+ }
318
+ if (arg1 && parsePort(arg1) === null) {
319
+ sendSystemMessage('Usage: /view | /view <1-65535> | /view stop | /view restart [1-65535]');
320
+ return;
321
+ }
322
+ if (viewState === 'running') {
323
+ sendSystemMessage(`Docs viewer already running at http://localhost:${viewPort ?? agentConfig.loomConfig.serve.port}. Use /view restart to reload.`);
324
+ return;
325
+ }
326
+ const port = parsePort(arg1) ?? agentConfig.loomConfig.serve.port;
327
+ await startView(port);
328
+ return;
329
+ }
330
+ }
331
+ // 非命令 → 发送给 Agent
332
+ await sendMessage(input);
333
+ refreshSchemas();
334
+ }, [
335
+ sendMessage,
336
+ reset,
337
+ abort,
338
+ refreshSchemas,
339
+ outDir,
340
+ exit,
341
+ sendSystemMessage,
342
+ startMock,
343
+ stopMock,
344
+ startView,
345
+ stopView,
346
+ mockState,
347
+ mockPort,
348
+ viewState,
349
+ viewPort,
350
+ agentConfig.loomConfig.mock.port,
351
+ agentConfig.loomConfig.serve.port,
352
+ ]);
353
+ // 合并 agent 消息和本地消息,按时间排序
354
+ const allMessages = [...messages, ...localMessages].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
355
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, { version: VERSION, projectDir: agentConfig.projectDir, outDir: outDir }), _jsx(Chat, { messages: allMessages }), _jsx(SchemaPreview, { schemas: schemas }), _jsx(StatusBar, { state: state, toolProgress: toolProgress }), _jsx(Input, { onSubmit: handleSubmit, disabled: isProcessing, placeholder: "Describe your API requirements..." })] }));
356
+ };
357
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"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"}