@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.
- package/LICENSE +15 -0
- package/README.md +465 -0
- package/dist/agents/core/agent.d.ts +65 -0
- package/dist/agents/core/agent.d.ts.map +1 -0
- package/dist/agents/core/agent.js +277 -0
- package/dist/agents/core/agent.js.map +1 -0
- package/dist/agents/core/prompt.d.ts +11 -0
- package/dist/agents/core/prompt.d.ts.map +1 -0
- package/dist/agents/core/prompt.js +117 -0
- package/dist/agents/core/prompt.js.map +1 -0
- package/dist/agents/core/types.d.ts +49 -0
- package/dist/agents/core/types.d.ts.map +1 -0
- package/dist/agents/core/types.js +5 -0
- package/dist/agents/core/types.js.map +1 -0
- package/dist/agents/memory/memory.d.ts +62 -0
- package/dist/agents/memory/memory.d.ts.map +1 -0
- package/dist/agents/memory/memory.js +113 -0
- package/dist/agents/memory/memory.js.map +1 -0
- package/dist/agents/memory/types.d.ts +15 -0
- package/dist/agents/memory/types.d.ts.map +1 -0
- package/dist/agents/memory/types.js +5 -0
- package/dist/agents/memory/types.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/client.d.ts +49 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +256 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/config.d.ts +13 -0
- package/dist/llm/config.d.ts.map +1 -0
- package/dist/llm/config.js +50 -0
- package/dist/llm/config.js.map +1 -0
- package/dist/llm/types.d.ts +74 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +17 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/mocks/generator.d.ts +10 -0
- package/dist/mocks/generator.d.ts.map +1 -0
- package/dist/mocks/generator.js +19 -0
- package/dist/mocks/generator.js.map +1 -0
- package/dist/mocks/router.d.ts +13 -0
- package/dist/mocks/router.d.ts.map +1 -0
- package/dist/mocks/router.js +44 -0
- package/dist/mocks/router.js.map +1 -0
- package/dist/mocks/server.d.ts +21 -0
- package/dist/mocks/server.d.ts.map +1 -0
- package/dist/mocks/server.js +36 -0
- package/dist/mocks/server.js.map +1 -0
- package/dist/serve.d.ts +17 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +56 -0
- package/dist/serve.js.map +1 -0
- package/dist/shared/config-wizard.d.ts +7 -0
- package/dist/shared/config-wizard.d.ts.map +1 -0
- package/dist/shared/config-wizard.js +84 -0
- package/dist/shared/config-wizard.js.map +1 -0
- package/dist/shared/config.d.ts +32 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +77 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/entity-utils.d.ts +30 -0
- package/dist/shared/entity-utils.d.ts.map +1 -0
- package/dist/shared/entity-utils.js +207 -0
- package/dist/shared/entity-utils.js.map +1 -0
- package/dist/shared/logger.d.ts +13 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +45 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/manifest-utils.d.ts +9 -0
- package/dist/shared/manifest-utils.d.ts.map +1 -0
- package/dist/shared/manifest-utils.js +110 -0
- package/dist/shared/manifest-utils.js.map +1 -0
- package/dist/shared/schema-entity-resolver.d.ts +15 -0
- package/dist/shared/schema-entity-resolver.d.ts.map +1 -0
- package/dist/shared/schema-entity-resolver.js +134 -0
- package/dist/shared/schema-entity-resolver.js.map +1 -0
- package/dist/shared/schema-utils.d.ts +21 -0
- package/dist/shared/schema-utils.d.ts.map +1 -0
- package/dist/shared/schema-utils.js +56 -0
- package/dist/shared/schema-utils.js.map +1 -0
- package/dist/shared/types.d.ts +130 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +5 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/tools/entity-file-ops.d.ts +10 -0
- package/dist/tools/entity-file-ops.d.ts.map +1 -0
- package/dist/tools/entity-file-ops.js +183 -0
- package/dist/tools/entity-file-ops.js.map +1 -0
- package/dist/tools/entity-workflow.d.ts +10 -0
- package/dist/tools/entity-workflow.d.ts.map +1 -0
- package/dist/tools/entity-workflow.js +447 -0
- package/dist/tools/entity-workflow.js.map +1 -0
- package/dist/tools/file-ops.d.ts +9 -0
- package/dist/tools/file-ops.d.ts.map +1 -0
- package/dist/tools/file-ops.js +83 -0
- package/dist/tools/file-ops.js.map +1 -0
- package/dist/tools/registry.d.ts +31 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +58 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/schema-gen.d.ts +8 -0
- package/dist/tools/schema-gen.d.ts.map +1 -0
- package/dist/tools/schema-gen.js +82 -0
- package/dist/tools/schema-gen.js.map +1 -0
- package/dist/tools/schema-validate.d.ts +8 -0
- package/dist/tools/schema-validate.d.ts.map +1 -0
- package/dist/tools/schema-validate.js +79 -0
- package/dist/tools/schema-validate.js.map +1 -0
- package/dist/tools/types.d.ts +29 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tui/app.d.ts +13 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +357 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components/Chat.d.ts +14 -0
- package/dist/tui/components/Chat.d.ts.map +1 -0
- package/dist/tui/components/Chat.js +24 -0
- package/dist/tui/components/Chat.js.map +1 -0
- package/dist/tui/components/Header.d.ts +14 -0
- package/dist/tui/components/Header.d.ts.map +1 -0
- package/dist/tui/components/Header.js +6 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/Input.d.ts +15 -0
- package/dist/tui/components/Input.d.ts.map +1 -0
- package/dist/tui/components/Input.js +74 -0
- package/dist/tui/components/Input.js.map +1 -0
- package/dist/tui/components/SchemaPreview.d.ts +13 -0
- package/dist/tui/components/SchemaPreview.d.ts.map +1 -0
- package/dist/tui/components/SchemaPreview.js +9 -0
- package/dist/tui/components/SchemaPreview.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +15 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/StatusBar.js +7 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/hooks/useAgent.d.ts +41 -0
- package/dist/tui/hooks/useAgent.d.ts.map +1 -0
- package/dist/tui/hooks/useAgent.js +180 -0
- package/dist/tui/hooks/useAgent.js.map +1 -0
- package/dist/view/frontend/components/App.d.ts +4 -0
- package/dist/view/frontend/components/App.d.ts.map +1 -0
- package/dist/view/frontend/components/App.js +35 -0
- package/dist/view/frontend/components/App.js.map +1 -0
- package/dist/view/frontend/components/EndpointDetailPage.d.ts +4 -0
- package/dist/view/frontend/components/EndpointDetailPage.d.ts.map +1 -0
- package/dist/view/frontend/components/EndpointDetailPage.js +103 -0
- package/dist/view/frontend/components/EndpointDetailPage.js.map +1 -0
- package/dist/view/frontend/components/HomePage.d.ts +4 -0
- package/dist/view/frontend/components/HomePage.d.ts.map +1 -0
- package/dist/view/frontend/components/HomePage.js +6 -0
- package/dist/view/frontend/components/HomePage.js.map +1 -0
- package/dist/view/frontend/components/ModuleDetailPage.d.ts +4 -0
- package/dist/view/frontend/components/ModuleDetailPage.d.ts.map +1 -0
- package/dist/view/frontend/components/ModuleDetailPage.js +64 -0
- package/dist/view/frontend/components/ModuleDetailPage.js.map +1 -0
- package/dist/view/frontend/components/ModulesPage.d.ts +4 -0
- package/dist/view/frontend/components/ModulesPage.d.ts.map +1 -0
- package/dist/view/frontend/components/ModulesPage.js +40 -0
- package/dist/view/frontend/components/ModulesPage.js.map +1 -0
- package/dist/view/frontend/index.d.ts +2 -0
- package/dist/view/frontend/index.d.ts.map +1 -0
- package/dist/view/frontend/index.js +15 -0
- package/dist/view/frontend/index.js.map +1 -0
- package/dist/view/frontend/types.d.ts +35 -0
- package/dist/view/frontend/types.d.ts.map +1 -0
- package/dist/view/frontend/types.js +2 -0
- package/dist/view/frontend/types.js.map +1 -0
- package/dist/view/frontend/utils/api.d.ts +5 -0
- package/dist/view/frontend/utils/api.d.ts.map +1 -0
- package/dist/view/frontend/utils/api.js +28 -0
- package/dist/view/frontend/utils/api.js.map +1 -0
- package/dist/view/public/bundle.js +104633 -0
- package/dist/view/public/bundle.js.map +7 -0
- package/dist/view/public/index.html +50 -0
- package/dist/view/routes/docs.d.ts +13 -0
- package/dist/view/routes/docs.d.ts.map +1 -0
- package/dist/view/routes/docs.js +53 -0
- package/dist/view/routes/docs.js.map +1 -0
- package/dist/view/routes/entities.d.ts +11 -0
- package/dist/view/routes/entities.d.ts.map +1 -0
- package/dist/view/routes/entities.js +39 -0
- package/dist/view/routes/entities.js.map +1 -0
- package/dist/view/routes/schema.d.ts +11 -0
- package/dist/view/routes/schema.d.ts.map +1 -0
- package/dist/view/routes/schema.js +43 -0
- package/dist/view/routes/schema.js.map +1 -0
- package/dist/view/server.d.ts +20 -0
- package/dist/view/server.d.ts.map +1 -0
- package/dist/view/server.js +54 -0
- package/dist/view/server.js.map +1 -0
- package/docgen.config.json +19 -0
- package/docgen.config.json.example +19 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|