@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,14 @@
1
+ /**
2
+ * Chat 组件
3
+ *
4
+ * 显示对话历史,支持多种消息类型的差异化渲染
5
+ * 支持 streaming 消息 (显示闪烁光标)
6
+ */
7
+ import React from 'react';
8
+ import type { ChatMessage } from '../hooks/useAgent.js';
9
+ interface ChatProps {
10
+ messages: ChatMessage[];
11
+ }
12
+ export declare const Chat: React.FC<ChatProps>;
13
+ export {};
14
+ //# sourceMappingURL=Chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Chat.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,UAAU,SAAS;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAiED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAQpC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ /** 根据消息类型渲染单条消息 */
5
+ const MessageItem = ({ msg }) => {
6
+ switch (msg.type) {
7
+ case 'user':
8
+ return (_jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { bold: true, color: "blue", children: ["You:", ' '] }), _jsx(Text, { wrap: "wrap", children: msg.content })] }));
9
+ case 'assistant':
10
+ return (_jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: "green", children: "Loom:" }), _jsxs(Box, { marginLeft: 2, children: [_jsx(Text, { wrap: "wrap", children: msg.content }), msg.streaming && (_jsx(Text, { color: "green", children: _jsx(Spinner, { type: "dots" }) }))] })] }));
11
+ case 'tool_activity':
12
+ return (_jsx(Box, { marginLeft: 2, children: _jsxs(Text, { color: "cyan", dimColor: true, children: [' -> ', msg.content] }) }));
13
+ case 'error':
14
+ return (_jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { bold: true, color: "red", children: ["Error:", ' '] }), _jsx(Text, { color: "red", wrap: "wrap", children: msg.content })] }));
15
+ case 'system':
16
+ return (_jsx(Box, { marginBottom: 1, marginLeft: 2, children: _jsx(Text, { color: "magenta", dimColor: true, children: msg.content }) }));
17
+ default:
18
+ return null;
19
+ }
20
+ };
21
+ export const Chat = ({ messages }) => {
22
+ return (_jsx(Box, { flexDirection: "column", paddingX: 1, children: messages.map((msg, i) => (_jsx(MessageItem, { msg: msg }, i))) }));
23
+ };
24
+ //# sourceMappingURL=Chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.js","sourceRoot":"","sources":["../../../src/tui/components/Chat.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAOlC,mBAAmB;AACnB,MAAM,WAAW,GAAmC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;IAC9D,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,CACL,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,qBAChB,GAAG,IACH,EACP,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,GAAG,CAAC,OAAO,GAAQ,IAClC,CACP,CAAC;QAEJ,KAAK,WAAW;YACd,OAAO,CACL,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aAC1C,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,sBAEjB,EACP,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,aAChB,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,GAAG,CAAC,OAAO,GAAQ,EACrC,GAAG,CAAC,SAAS,IAAI,CAChB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YACjB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,CACR,IACG,IACF,CACP,CAAC;QAEJ,KAAK,eAAe;YAClB,OAAO,CACL,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,mBACxB,OAAO,EAAE,GAAG,CAAC,OAAO,IAChB,GACH,CACP,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO,CACL,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK,uBACb,GAAG,IACL,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,YAAE,GAAG,CAAC,OAAO,GAAQ,IAC9C,CACP,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO,CACL,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,YACjC,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,kBAC3B,GAAG,CAAC,OAAO,GACP,GACH,CACP,CAAC;QAEJ;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxD,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACpC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,WAAW,IAAS,GAAG,EAAE,GAAG,IAAX,CAAC,CAAc,CAClC,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Header 组件
3
+ *
4
+ * 显示 Loom 欢迎信息、版本号、当前目标目录和快捷命令提示
5
+ */
6
+ import React from 'react';
7
+ interface HeaderProps {
8
+ version: string;
9
+ projectDir: string;
10
+ outDir: string;
11
+ }
12
+ export declare const Header: React.FC<HeaderProps>;
13
+ export {};
14
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAsDxC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export const Header = ({ version, projectDir, outDir }) => {
4
+ return (_jsx(Box, { flexDirection: "column", paddingX: 1, marginBottom: 1, children: _jsxs(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 2, flexDirection: "column", children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Loom v", version] }), _jsx(Text, { color: "gray", children: "AI-powered JSON Schema document generator" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: "Project: " }), _jsx(Text, { color: "white", children: projectDir })] }), _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: "Output: " }), _jsx(Text, { color: "white", children: outDir })] }), _jsx(Text, { children: " " }), _jsx(Text, { color: "gray", children: "Type your API requirements, or use commands:" }), _jsx(Text, { color: "gray", children: "/help Show help message" }), _jsx(Text, { color: "gray", children: "/reset Reset conversation history" }), _jsx(Text, { color: "gray", children: "/list List generated schema files" }), _jsx(Text, { color: "gray", children: "/mock Manage mock server" }), _jsx(Text, { color: "gray", children: "/mock stop" }), _jsx(Text, { color: "gray", children: "/mock restart" }), _jsx(Text, { color: "gray", children: "/view Manage docs viewer" }), _jsx(Text, { color: "gray", children: "/view stop" }), _jsx(Text, { color: "gray", children: "/view restart" }), _jsx(Text, { color: "gray", children: "/exit Exit Loom" })] }) }));
5
+ };
6
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;IAC/E,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,YACtD,MAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aAC7E,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,uBACb,OAAO,IACV,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0DAAiD,EACnE,KAAC,IAAI,oBAAS,EACd,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0BAAiB,EACnC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,UAAU,GAAQ,IAClC,EACP,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0BAAiB,EACnC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,MAAM,GAAQ,IAC9B,EACP,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,6DAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,4DAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,qEAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,sEAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,6DAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,2BAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8BAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,6DAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,2BAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8BAEX,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oDAEX,IACH,GACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Input 组件
3
+ *
4
+ * 基于 ink-text-input,支持光标移动、删除等完整编辑能力
5
+ * 额外实现: 输入历史 (上/下箭头)
6
+ */
7
+ import React from 'react';
8
+ interface InputProps {
9
+ onSubmit: (value: string) => void;
10
+ disabled?: boolean;
11
+ placeholder?: string;
12
+ }
13
+ export declare const Input: React.FC<InputProps>;
14
+ export {};
15
+ //# sourceMappingURL=Input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Input.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAiD,MAAM,OAAO,CAAC;AAItE,UAAU,UAAU;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqBD,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAqGtC,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Input 组件
4
+ *
5
+ * 基于 ink-text-input,支持光标移动、删除等完整编辑能力
6
+ * 额外实现: 输入历史 (上/下箭头)
7
+ */
8
+ import { useState, useCallback, useMemo, useRef } from 'react';
9
+ import { Box, Text, useInput } from 'ink';
10
+ import TextInput from 'ink-text-input';
11
+ const COMMAND_SUGGESTIONS = [
12
+ { command: '/help', description: 'Show help message' },
13
+ { command: '/reset', description: 'Reset conversation history' },
14
+ { command: '/list', description: 'List generated schema files' },
15
+ { command: '/mock', description: 'Start mock server (optional: /mock <port>)' },
16
+ { command: '/mock stop', description: 'Stop mock server' },
17
+ { command: '/mock restart', description: 'Restart mock server (optional: <port>)' },
18
+ { command: '/view', description: 'Start docs viewer (optional: /view <port>)' },
19
+ { command: '/view stop', description: 'Stop docs viewer' },
20
+ { command: '/view restart', description: 'Restart docs viewer (optional: <port>)' },
21
+ { command: '/abort', description: 'Abort current request' },
22
+ { command: '/exit', description: 'Exit Loom' },
23
+ ];
24
+ export const Input = ({ onSubmit, disabled = false, placeholder = 'Type your message...', }) => {
25
+ const [value, setValue] = useState('');
26
+ const historyRef = useRef([]);
27
+ const historyIndexRef = useRef(-1);
28
+ const commandSuggestions = useMemo(() => {
29
+ if (!value.startsWith('/')) {
30
+ return [];
31
+ }
32
+ const normalized = value.toLowerCase();
33
+ return COMMAND_SUGGESTIONS.filter((item) => item.command.startsWith(normalized));
34
+ }, [value]);
35
+ // 处理上/下箭头浏览历史
36
+ useInput((_, key) => {
37
+ if (disabled)
38
+ return;
39
+ if (key.upArrow && historyRef.current.length > 0) {
40
+ const newIndex = Math.min(historyIndexRef.current + 1, historyRef.current.length - 1);
41
+ historyIndexRef.current = newIndex;
42
+ setValue(historyRef.current[historyRef.current.length - 1 - newIndex] || '');
43
+ }
44
+ if (key.downArrow) {
45
+ const newIndex = historyIndexRef.current - 1;
46
+ if (newIndex < 0) {
47
+ historyIndexRef.current = -1;
48
+ setValue('');
49
+ }
50
+ else {
51
+ historyIndexRef.current = newIndex;
52
+ setValue(historyRef.current[historyRef.current.length - 1 - newIndex] || '');
53
+ }
54
+ }
55
+ });
56
+ const handleSubmit = useCallback((submitValue) => {
57
+ const trimmed = submitValue.trim();
58
+ if (!trimmed)
59
+ return;
60
+ // 记入历史 (去重最后一条)
61
+ const history = historyRef.current;
62
+ if (history[history.length - 1] !== trimmed) {
63
+ history.push(trimmed);
64
+ }
65
+ historyIndexRef.current = -1;
66
+ onSubmit(trimmed);
67
+ setValue('');
68
+ }, [onSubmit]);
69
+ if (disabled) {
70
+ return (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: "gray", dimColor: true, children: ['> ', "Waiting for response..."] }) }));
71
+ }
72
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "blue", bold: true, children: '> ' }), _jsx(TextInput, { value: value, onChange: setValue, onSubmit: handleSubmit, placeholder: placeholder })] }), commandSuggestions.length > 0 && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: "gray", dimColor: true, children: "Available commands:" }), commandSuggestions.map((item) => (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: item.command.padEnd(14, ' ') }), _jsx(Text, { color: "gray", dimColor: true, children: item.description })] }, item.command)))] }))] }));
73
+ };
74
+ //# sourceMappingURL=Input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../src/tui/components/Input.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * SchemaPreview 组件
3
+ *
4
+ * 在 TUI 中预览已生成的 schema 文件列表
5
+ */
6
+ import React from 'react';
7
+ import type { SchemaFileMeta } from '../../shared/types.js';
8
+ interface SchemaPreviewProps {
9
+ schemas: SchemaFileMeta[];
10
+ }
11
+ export declare const SchemaPreview: React.FC<SchemaPreviewProps>;
12
+ export {};
13
+ //# sourceMappingURL=SchemaPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaPreview.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SchemaPreview.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,UAAU,kBAAkB;IAC1B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAqBtD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export const SchemaPreview = ({ schemas }) => {
4
+ if (schemas.length === 0) {
5
+ return null;
6
+ }
7
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Generated Schemas:" }), schemas.map((schema, i) => (_jsxs(Box, { marginLeft: 1, children: [_jsx(Text, { color: "white", children: schema.filename }), _jsxs(Text, { color: "gray", children: [' ', "- ", schema.title, " (", schema.endpointCount, " endpoints)"] })] }, i)))] }));
8
+ };
9
+ //# sourceMappingURL=SchemaPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaPreview.js","sourceRoot":"","sources":["../../../src/tui/components/SchemaPreview.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IACzE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aAC1D,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,mCAEhB,EACN,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,MAAC,GAAG,IAAS,UAAU,EAAE,CAAC,aACxB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,MAAM,CAAC,QAAQ,GAAQ,EAC5C,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aACf,GAAG,QACD,MAAM,CAAC,KAAK,QAAI,MAAM,CAAC,aAAa,mBAClC,KALC,CAAC,CAML,CACP,CAAC,IACE,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * StatusBar 组件
3
+ *
4
+ * 显示 Agent 当前状态,活跃状态时带 Spinner 动画
5
+ */
6
+ import React from 'react';
7
+ import type { AgentState } from '../../agents/core/types.js';
8
+ import type { ToolProgress } from '../hooks/useAgent.js';
9
+ interface StatusBarProps {
10
+ state: AgentState;
11
+ toolProgress: ToolProgress | null;
12
+ }
13
+ export declare const StatusBar: React.FC<StatusBarProps>;
14
+ export {};
15
+ //# sourceMappingURL=StatusBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,cAAc;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA0C9C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ export const StatusBar = ({ state, toolProgress }) => {
5
+ return (_jsxs(Box, { paddingX: 1, marginY: 0, children: [state === 'idle' && (_jsx(Text, { color: "green", children: "Ready" })), state === 'thinking' && (_jsxs(Box, { children: [_jsx(Text, { color: "yellow", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { color: "yellow", children: " Thinking..." })] })), state === 'streaming' && (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { color: "green", children: " Responding..." })] })), state === 'calling_tool' && (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { color: "cyan", children: [' ', toolProgress ? toolProgress.message : 'Running tool...'] })] })), state === 'error' && (_jsx(Text, { color: "red", children: "Error occurred \u2014 you can continue typing" }))] }));
6
+ };
7
+ //# sourceMappingURL=StatusBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AASlC,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;IAC7E,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,aACzB,KAAK,KAAK,MAAM,IAAI,CACnB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,sBAAa,CACjC,EAEA,KAAK,KAAK,UAAU,IAAI,CACvB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAClB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,6BAAoB,IACpC,CACP,EAEA,KAAK,KAAK,WAAW,IAAI,CACxB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YACjB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,+BAAsB,IACrC,CACP,EAEA,KAAK,KAAK,cAAc,IAAI,CAC3B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAChB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aACf,GAAG,EACH,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,IACnD,IACH,CACP,EAEA,KAAK,KAAK,OAAO,IAAI,CACpB,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,8DAAgD,CAClE,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * useAgent hook
3
+ *
4
+ * 封装 Agent 的交互逻辑,供 TUI 组件使用
5
+ *
6
+ * 能力:
7
+ * - Streaming 逐字输出 (content_delta 实时追加到最后一条 assistant 消息)
8
+ * - Tool 调用进度可见
9
+ * - 错误自动恢复
10
+ * - 请求取消
11
+ */
12
+ import type { AgentConfig, AgentState } from '../../agents/core/types.js';
13
+ /** 对话消息类型 */
14
+ export type ChatMessageType = 'user' | 'assistant' | 'tool_activity' | 'error' | 'system';
15
+ /** 对话消息 */
16
+ export interface ChatMessage {
17
+ type: ChatMessageType;
18
+ content: string;
19
+ /** tool_activity 类型时记录工具名称 */
20
+ toolName?: string;
21
+ /** 该消息是否还在 streaming 中 (assistant 消息) */
22
+ streaming?: boolean;
23
+ timestamp: Date;
24
+ }
25
+ /** 当前正在执行的 tool 信息 */
26
+ export interface ToolProgress {
27
+ name: string;
28
+ message: string;
29
+ }
30
+ interface UseAgentReturn {
31
+ messages: ChatMessage[];
32
+ state: AgentState;
33
+ toolProgress: ToolProgress | null;
34
+ sendMessage: (input: string) => Promise<void>;
35
+ abort: () => void;
36
+ reset: () => void;
37
+ isProcessing: boolean;
38
+ }
39
+ export declare function useAgent(config: AgentConfig): UseAgentReturn;
40
+ export {};
41
+ //# sourceMappingURL=useAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgent.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAc,MAAM,4BAA4B,CAAC;AAEtF,aAAa;AACb,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,eAAe,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1F,WAAW;AACX,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CA+M5D"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * useAgent hook
3
+ *
4
+ * 封装 Agent 的交互逻辑,供 TUI 组件使用
5
+ *
6
+ * 能力:
7
+ * - Streaming 逐字输出 (content_delta 实时追加到最后一条 assistant 消息)
8
+ * - Tool 调用进度可见
9
+ * - 错误自动恢复
10
+ * - 请求取消
11
+ */
12
+ import { useState, useCallback, useRef } from 'react';
13
+ import { Agent } from '../../agents/core/agent.js';
14
+ export function useAgent(config) {
15
+ const agentRef = useRef(null);
16
+ const [messages, setMessages] = useState([]);
17
+ const [state, setState] = useState('idle');
18
+ const [toolProgress, setToolProgress] = useState(null);
19
+ // 添加消息的 helper
20
+ const addMessage = useCallback((type, content, extra) => {
21
+ setMessages((prev) => [
22
+ ...prev,
23
+ {
24
+ type,
25
+ content,
26
+ toolName: extra?.toolName,
27
+ streaming: extra?.streaming,
28
+ timestamp: new Date(),
29
+ },
30
+ ]);
31
+ }, []);
32
+ // 追加内容到最后一条 assistant 消息 (streaming)
33
+ const appendToLastAssistant = useCallback((delta) => {
34
+ setMessages((prev) => {
35
+ const lastIdx = prev.length - 1;
36
+ if (lastIdx < 0 || prev[lastIdx].type !== 'assistant')
37
+ return prev;
38
+ const updated = [...prev];
39
+ updated[lastIdx] = {
40
+ ...updated[lastIdx],
41
+ content: updated[lastIdx].content + delta,
42
+ };
43
+ return updated;
44
+ });
45
+ }, []);
46
+ // 标记最后一条 assistant 消息 streaming 结束
47
+ const finalizeLastAssistant = useCallback(() => {
48
+ setMessages((prev) => {
49
+ const lastIdx = prev.length - 1;
50
+ if (lastIdx < 0 || prev[lastIdx].type !== 'assistant')
51
+ return prev;
52
+ const updated = [...prev];
53
+ updated[lastIdx] = { ...updated[lastIdx], streaming: false };
54
+ return updated;
55
+ });
56
+ }, []);
57
+ /**
58
+ * 处理 Agent 事件
59
+ */
60
+ const handleAgentEvent = useCallback((event) => {
61
+ switch (event.type) {
62
+ case 'state_change':
63
+ if (event.state) {
64
+ setState(event.state);
65
+ if (event.state !== 'calling_tool') {
66
+ setToolProgress(null);
67
+ }
68
+ }
69
+ break;
70
+ case 'content_delta':
71
+ // Streaming 文本增量 → 追加到当前 assistant 消息
72
+ if (event.delta) {
73
+ appendToLastAssistant(event.delta);
74
+ }
75
+ break;
76
+ case 'tool_start':
77
+ if (event.tool) {
78
+ const progress = {
79
+ name: event.tool.name,
80
+ message: `Calling ${event.tool.name}...`,
81
+ };
82
+ setToolProgress(progress);
83
+ addMessage('tool_activity', progress.message, {
84
+ toolName: event.tool.name,
85
+ });
86
+ }
87
+ break;
88
+ case 'tool_end':
89
+ if (event.tool) {
90
+ const status = event.tool.success ? 'done' : 'failed';
91
+ addMessage('tool_activity', `${event.tool.name}: ${event.tool.message || status}`, { toolName: event.tool.name });
92
+ }
93
+ setToolProgress(null);
94
+ break;
95
+ case 'reply_done':
96
+ finalizeLastAssistant();
97
+ break;
98
+ case 'error':
99
+ if (event.error) {
100
+ addMessage('error', event.error);
101
+ }
102
+ break;
103
+ }
104
+ }, [appendToLastAssistant, finalizeLastAssistant, addMessage]);
105
+ // 懒初始化 Agent
106
+ const getAgent = useCallback(() => {
107
+ if (!agentRef.current) {
108
+ const agent = new Agent(config);
109
+ agent.onEvent = handleAgentEvent;
110
+ agentRef.current = agent;
111
+ }
112
+ return agentRef.current;
113
+ }, [config, handleAgentEvent]);
114
+ const sendMessage = useCallback(async (input) => {
115
+ // 如果之前是 error 状态,自动恢复
116
+ setState((prev) => (prev === 'error' ? 'idle' : prev));
117
+ const agent = getAgent();
118
+ // 添加用户消息
119
+ addMessage('user', input);
120
+ // 预创建一条空的 assistant 消息 (streaming 模式会逐字填充)
121
+ addMessage('assistant', '', { streaming: true });
122
+ try {
123
+ const reply = await agent.chat(input);
124
+ // Streaming 模式下内容已经通过 content_delta 逐字填入
125
+ // 非 streaming 模式或 tool call 后的最终回复,需要直接设置内容
126
+ setMessages((prev) => {
127
+ const lastIdx = prev.length - 1;
128
+ if (lastIdx >= 0 && prev[lastIdx].type === 'assistant') {
129
+ // 如果 streaming 已经填充了内容,不覆盖
130
+ // 如果是空的 (非 streaming 或 tool call 后),填入完整回复
131
+ if (!prev[lastIdx].content && reply.content) {
132
+ const updated = [...prev];
133
+ updated[lastIdx] = {
134
+ ...updated[lastIdx],
135
+ content: reply.content,
136
+ streaming: false,
137
+ };
138
+ return updated;
139
+ }
140
+ // 标记 streaming 结束
141
+ const updated = [...prev];
142
+ updated[lastIdx] = { ...updated[lastIdx], streaming: false };
143
+ return updated;
144
+ }
145
+ return prev;
146
+ });
147
+ // 如果生成了 schema 文件,追加提示
148
+ if (reply.schemasGenerated.length > 0) {
149
+ addMessage('system', `Generated: ${reply.schemasGenerated.join(', ')}`);
150
+ }
151
+ }
152
+ catch (err) {
153
+ const errorMsg = err instanceof Error ? err.message : 'Unknown error occurred';
154
+ // 如果预创建的 assistant 消息还是空的,移除它
155
+ setMessages((prev) => {
156
+ const lastIdx = prev.length - 1;
157
+ if (lastIdx >= 0 &&
158
+ prev[lastIdx].type === 'assistant' &&
159
+ !prev[lastIdx].content) {
160
+ return prev.slice(0, -1);
161
+ }
162
+ return prev;
163
+ });
164
+ addMessage('error', errorMsg);
165
+ setState('error');
166
+ }
167
+ }, [getAgent, addMessage]);
168
+ const abort = useCallback(() => {
169
+ agentRef.current?.abort();
170
+ }, []);
171
+ const reset = useCallback(() => {
172
+ agentRef.current?.reset();
173
+ setMessages([]);
174
+ setState('idle');
175
+ setToolProgress(null);
176
+ }, []);
177
+ const isProcessing = state === 'thinking' || state === 'streaming' || state === 'calling_tool';
178
+ return { messages, state, toolProgress, sendMessage, abort, reset, isProcessing };
179
+ }
180
+ //# sourceMappingURL=useAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgent.js","sourceRoot":"","sources":["../../../src/tui/hooks/useAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ declare const App: React.FC;
3
+ export default App;
4
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/view/frontend/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,QAAA,MAAM,GAAG,EAAE,KAAK,CAAC,EAoFhB,CAAC;AAEF,eAAe,GAAG,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Outlet, Link } from 'react-router-dom';
4
+ import { fetchModules } from '../utils/api.ts';
5
+ const App = () => {
6
+ const [modules, setModules] = useState([]);
7
+ const [loading, setLoading] = useState(true);
8
+ const [error, setError] = useState(null);
9
+ useEffect(() => {
10
+ fetchModules()
11
+ .then((data) => {
12
+ setModules(data);
13
+ setLoading(false);
14
+ })
15
+ .catch((err) => {
16
+ setError(err.message);
17
+ setLoading(false);
18
+ });
19
+ }, []);
20
+ return (_jsxs("div", { style: { display: 'flex', minHeight: '100vh' }, children: [_jsxs("aside", { style: {
21
+ width: '280px',
22
+ background: '#1a1a2e',
23
+ color: '#fff',
24
+ padding: '1.5rem',
25
+ overflowY: 'auto',
26
+ flexShrink: 0,
27
+ }, children: [_jsxs("h1", { style: { fontSize: '1.5rem', marginBottom: '1.5rem' }, children: [_jsx("i", { className: "fas fa-book" }), " DocuGen"] }), _jsx("nav", { children: _jsxs("ul", { style: { listStyle: 'none', padding: 0 }, children: [_jsx("li", { style: { marginBottom: '0.5rem' }, children: _jsxs(Link, { to: "/modules", style: { color: '#fff', textDecoration: 'none' }, children: [_jsx("i", { className: "fas fa-layer-group" }), " All Modules"] }) }), _jsx("li", { style: { marginBottom: '0.5rem' }, children: _jsxs(Link, { to: "/search", style: { color: '#fff', textDecoration: 'none' }, children: [_jsx("i", { className: "fas fa-search" }), " Search"] }) })] }) }), _jsx("h2", { style: { fontSize: '1rem', marginTop: '2rem', marginBottom: '0.5rem', opacity: 0.8 }, children: "API Modules" }), loading ? (_jsx("div", { style: { color: '#aaa' }, children: "Loading modules..." })) : error ? (_jsx("div", { style: { color: '#ff6b6b' }, children: error })) : modules.length === 0 ? (_jsx("div", { style: { color: '#aaa' }, children: "No modules found" })) : (_jsx("ul", { style: { listStyle: 'none', padding: 0 }, children: modules.map(mod => (_jsx("li", { style: { marginBottom: '0.5rem' }, children: _jsxs(Link, { to: `/modules/${mod.filename}`, style: { color: '#a0a0ff', textDecoration: 'none' }, children: [_jsx("i", { className: "fas fa-folder" }), " ", mod.title, _jsxs("span", { style: { fontSize: '0.8rem', marginLeft: '0.5rem', opacity: 0.7 }, children: ["(", mod.endpointCount, ")"] })] }) }, mod.filename))) }))] }), _jsx("main", { style: {
28
+ flex: 1,
29
+ padding: '2rem',
30
+ overflowY: 'auto',
31
+ background: '#f8f9fa',
32
+ }, children: _jsx(Outlet, {}) })] }));
33
+ };
34
+ export default App;
35
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../../../src/view/frontend/components/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ declare const EndpointDetailPage: React.FC;
3
+ export default EndpointDetailPage;
4
+ //# sourceMappingURL=EndpointDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EndpointDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/view/frontend/components/EndpointDetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAgF/B,CAAC;AAkIF,eAAe,kBAAkB,CAAC"}