tianxincode 1.0.0
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 +201 -0
- package/README.md +57 -0
- package/dist/api/api.types.d.ts +350 -0
- package/dist/api/api.types.d.ts.map +1 -0
- package/dist/api/api.types.js +12 -0
- package/dist/api/api.types.js.map +1 -0
- package/dist/api/chat.routes.d.ts +26 -0
- package/dist/api/chat.routes.d.ts.map +1 -0
- package/dist/api/chat.routes.js +275 -0
- package/dist/api/chat.routes.js.map +1 -0
- package/dist/api/config.routes.d.ts +10 -0
- package/dist/api/config.routes.d.ts.map +1 -0
- package/dist/api/config.routes.js +150 -0
- package/dist/api/config.routes.js.map +1 -0
- package/dist/api/db.routes.d.ts +12 -0
- package/dist/api/db.routes.d.ts.map +1 -0
- package/dist/api/db.routes.js +108 -0
- package/dist/api/db.routes.js.map +1 -0
- package/dist/api/files.routes.d.ts +14 -0
- package/dist/api/files.routes.d.ts.map +1 -0
- package/dist/api/files.routes.js +220 -0
- package/dist/api/files.routes.js.map +1 -0
- package/dist/api/filesystem.routes.d.ts +10 -0
- package/dist/api/filesystem.routes.d.ts.map +1 -0
- package/dist/api/filesystem.routes.js +181 -0
- package/dist/api/filesystem.routes.js.map +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +25 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/lsp.d.ts +5 -0
- package/dist/api/lsp.d.ts.map +1 -0
- package/dist/api/lsp.js +103 -0
- package/dist/api/lsp.js.map +1 -0
- package/dist/api/projects.routes.d.ts +18 -0
- package/dist/api/projects.routes.d.ts.map +1 -0
- package/dist/api/projects.routes.js +306 -0
- package/dist/api/projects.routes.js.map +1 -0
- package/dist/api/session.routes.d.ts +18 -0
- package/dist/api/session.routes.d.ts.map +1 -0
- package/dist/api/session.routes.js +186 -0
- package/dist/api/session.routes.js.map +1 -0
- package/dist/api/skills.routes.d.ts +6 -0
- package/dist/api/skills.routes.d.ts.map +1 -0
- package/dist/api/skills.routes.js +54 -0
- package/dist/api/skills.routes.js.map +1 -0
- package/dist/cli/args.d.ts +49 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +77 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/cli.types.d.ts +22 -0
- package/dist/cli/cli.types.d.ts.map +1 -0
- package/dist/cli/cli.types.js +5 -0
- package/dist/cli/cli.types.js.map +1 -0
- package/dist/cli/commands.d.ts +30 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +263 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/components/App.d.ts +34 -0
- package/dist/components/App.d.ts.map +1 -0
- package/dist/components/App.js +639 -0
- package/dist/components/App.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/tx.config.d.ts +31 -0
- package/dist/config/tx.config.d.ts.map +1 -0
- package/dist/config/tx.config.js +29 -0
- package/dist/config/tx.config.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/lsp/client.d.ts +55 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +252 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/downloader.d.ts +17 -0
- package/dist/lsp/downloader.d.ts.map +1 -0
- package/dist/lsp/downloader.js +302 -0
- package/dist/lsp/downloader.js.map +1 -0
- package/dist/lsp/index.d.ts +13 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +30 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/launch.d.ts +17 -0
- package/dist/lsp/launch.d.ts.map +1 -0
- package/dist/lsp/launch.js +69 -0
- package/dist/lsp/launch.js.map +1 -0
- package/dist/lsp/manager.d.ts +19 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +251 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/server.d.ts +11 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +302 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/sql.d.ts +11 -0
- package/dist/lsp/sql.d.ts.map +1 -0
- package/dist/lsp/sql.js +23 -0
- package/dist/lsp/sql.js.map +1 -0
- package/dist/lsp/types.d.ts +58 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +13 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/modules/ai/ai.service.d.ts +182 -0
- package/dist/modules/ai/ai.service.d.ts.map +1 -0
- package/dist/modules/ai/ai.service.js +280 -0
- package/dist/modules/ai/ai.service.js.map +1 -0
- package/dist/modules/ai/ai.types.d.ts +54 -0
- package/dist/modules/ai/ai.types.d.ts.map +1 -0
- package/dist/modules/ai/ai.types.js +2 -0
- package/dist/modules/ai/ai.types.js.map +1 -0
- package/dist/modules/ai/index.d.ts +6 -0
- package/dist/modules/ai/index.d.ts.map +1 -0
- package/dist/modules/ai/index.js +5 -0
- package/dist/modules/ai/index.js.map +1 -0
- package/dist/modules/ai/openai.provider.d.ts +138 -0
- package/dist/modules/ai/openai.provider.d.ts.map +1 -0
- package/dist/modules/ai/openai.provider.js +279 -0
- package/dist/modules/ai/openai.provider.js.map +1 -0
- package/dist/modules/ai/react/index.d.ts +5 -0
- package/dist/modules/ai/react/index.d.ts.map +1 -0
- package/dist/modules/ai/react/index.js +4 -0
- package/dist/modules/ai/react/index.js.map +1 -0
- package/dist/modules/ai/react/prompt/role.txt +51 -0
- package/dist/modules/ai/react/react.parser.d.ts +75 -0
- package/dist/modules/ai/react/react.parser.d.ts.map +1 -0
- package/dist/modules/ai/react/react.parser.js +278 -0
- package/dist/modules/ai/react/react.parser.js.map +1 -0
- package/dist/modules/ai/react/react.prompts.d.ts +26 -0
- package/dist/modules/ai/react/react.prompts.d.ts.map +1 -0
- package/dist/modules/ai/react/react.prompts.js +180 -0
- package/dist/modules/ai/react/react.prompts.js.map +1 -0
- package/dist/modules/ai/react/react.types.d.ts +47 -0
- package/dist/modules/ai/react/react.types.d.ts.map +1 -0
- package/dist/modules/ai/react/react.types.js +2 -0
- package/dist/modules/ai/react/react.types.js.map +1 -0
- package/dist/modules/ai/react.agent.d.ts +40 -0
- package/dist/modules/ai/react.agent.d.ts.map +1 -0
- package/dist/modules/ai/react.agent.js +136 -0
- package/dist/modules/ai/react.agent.js.map +1 -0
- package/dist/modules/ai/summarizer/index.d.ts +4 -0
- package/dist/modules/ai/summarizer/index.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/index.js +3 -0
- package/dist/modules/ai/summarizer/index.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.d.ts +15 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.js +47 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.service.d.ts +24 -0
- package/dist/modules/ai/summarizer/summarizer.service.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.service.js +153 -0
- package/dist/modules/ai/summarizer/summarizer.service.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.types.d.ts +21 -0
- package/dist/modules/ai/summarizer/summarizer.types.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.types.js +5 -0
- package/dist/modules/ai/summarizer/summarizer.types.js.map +1 -0
- package/dist/modules/config/config.service.d.ts +32 -0
- package/dist/modules/config/config.service.d.ts.map +1 -0
- package/dist/modules/config/config.service.js +163 -0
- package/dist/modules/config/config.service.js.map +1 -0
- package/dist/modules/config/config.types.d.ts +44 -0
- package/dist/modules/config/config.types.d.ts.map +1 -0
- package/dist/modules/config/config.types.js +21 -0
- package/dist/modules/config/config.types.js.map +1 -0
- package/dist/modules/config/index.d.ts +10 -0
- package/dist/modules/config/index.d.ts.map +1 -0
- package/dist/modules/config/index.js +10 -0
- package/dist/modules/config/index.js.map +1 -0
- package/dist/modules/context/context.service.d.ts +46 -0
- package/dist/modules/context/context.service.d.ts.map +1 -0
- package/dist/modules/context/context.service.js +216 -0
- package/dist/modules/context/context.service.js.map +1 -0
- package/dist/modules/context/context.types.d.ts +30 -0
- package/dist/modules/context/context.types.d.ts.map +1 -0
- package/dist/modules/context/context.types.js +5 -0
- package/dist/modules/context/context.types.js.map +1 -0
- package/dist/modules/context/index.d.ts +10 -0
- package/dist/modules/context/index.d.ts.map +1 -0
- package/dist/modules/context/index.js +10 -0
- package/dist/modules/context/index.js.map +1 -0
- package/dist/modules/db/db.service.d.ts +97 -0
- package/dist/modules/db/db.service.d.ts.map +1 -0
- package/dist/modules/db/db.service.js +387 -0
- package/dist/modules/db/db.service.js.map +1 -0
- package/dist/modules/db/db.types.d.ts +8 -0
- package/dist/modules/db/db.types.d.ts.map +1 -0
- package/dist/modules/db/db.types.js +7 -0
- package/dist/modules/db/db.types.js.map +1 -0
- package/dist/modules/db/index.d.ts +10 -0
- package/dist/modules/db/index.d.ts.map +1 -0
- package/dist/modules/db/index.js +9 -0
- package/dist/modules/db/index.js.map +1 -0
- package/dist/modules/logger/index.d.ts +2 -0
- package/dist/modules/logger/index.d.ts.map +1 -0
- package/dist/modules/logger/index.js +2 -0
- package/dist/modules/logger/index.js.map +1 -0
- package/dist/modules/logger/logger.d.ts +26 -0
- package/dist/modules/logger/logger.d.ts.map +1 -0
- package/dist/modules/logger/logger.js +57 -0
- package/dist/modules/logger/logger.js.map +1 -0
- package/dist/modules/memory/index.d.ts +9 -0
- package/dist/modules/memory/index.d.ts.map +1 -0
- package/dist/modules/memory/index.js +9 -0
- package/dist/modules/memory/index.js.map +1 -0
- package/dist/modules/memory/memory.service.d.ts +191 -0
- package/dist/modules/memory/memory.service.d.ts.map +1 -0
- package/dist/modules/memory/memory.service.js +282 -0
- package/dist/modules/memory/memory.service.js.map +1 -0
- package/dist/modules/memory/memory.types.d.ts +13 -0
- package/dist/modules/memory/memory.types.d.ts.map +1 -0
- package/dist/modules/memory/memory.types.js +5 -0
- package/dist/modules/memory/memory.types.js.map +1 -0
- package/dist/modules/session/index.d.ts +9 -0
- package/dist/modules/session/index.d.ts.map +1 -0
- package/dist/modules/session/index.js +9 -0
- package/dist/modules/session/index.js.map +1 -0
- package/dist/modules/session/session.service.d.ts +252 -0
- package/dist/modules/session/session.service.d.ts.map +1 -0
- package/dist/modules/session/session.service.js +406 -0
- package/dist/modules/session/session.service.js.map +1 -0
- package/dist/modules/session/session.types.d.ts +34 -0
- package/dist/modules/session/session.types.d.ts.map +1 -0
- package/dist/modules/session/session.types.js +5 -0
- package/dist/modules/session/session.types.js.map +1 -0
- package/dist/modules/skill/index.d.ts +8 -0
- package/dist/modules/skill/index.d.ts.map +1 -0
- package/dist/modules/skill/index.js +7 -0
- package/dist/modules/skill/index.js.map +1 -0
- package/dist/modules/skill/skill.service.d.ts +72 -0
- package/dist/modules/skill/skill.service.d.ts.map +1 -0
- package/dist/modules/skill/skill.service.js +283 -0
- package/dist/modules/skill/skill.service.js.map +1 -0
- package/dist/modules/skill/skill.tool.d.ts +19 -0
- package/dist/modules/skill/skill.tool.d.ts.map +1 -0
- package/dist/modules/skill/skill.tool.js +92 -0
- package/dist/modules/skill/skill.tool.js.map +1 -0
- package/dist/modules/skill/skill.txt +18 -0
- package/dist/modules/skill/skill.types.d.ts +40 -0
- package/dist/modules/skill/skill.types.d.ts.map +1 -0
- package/dist/modules/skill/skill.types.js +6 -0
- package/dist/modules/skill/skill.types.js.map +1 -0
- package/dist/modules/skill/skills.manager.d.ts +30 -0
- package/dist/modules/skill/skills.manager.d.ts.map +1 -0
- package/dist/modules/skill/skills.manager.js +182 -0
- package/dist/modules/skill/skills.manager.js.map +1 -0
- package/dist/modules/tools/builtin/bash.d.ts +3 -0
- package/dist/modules/tools/builtin/bash.d.ts.map +1 -0
- package/dist/modules/tools/builtin/bash.js +124 -0
- package/dist/modules/tools/builtin/bash.js.map +1 -0
- package/dist/modules/tools/builtin/bash.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/bash.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/bash.tool.js +52 -0
- package/dist/modules/tools/builtin/bash.tool.js.map +1 -0
- package/dist/modules/tools/builtin/bash.txt +81 -0
- package/dist/modules/tools/builtin/code_search.d.ts +3 -0
- package/dist/modules/tools/builtin/code_search.d.ts.map +1 -0
- package/dist/modules/tools/builtin/code_search.js +85 -0
- package/dist/modules/tools/builtin/code_search.js.map +1 -0
- package/dist/modules/tools/builtin/code_search.txt +18 -0
- package/dist/modules/tools/builtin/edit-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/edit-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/edit-file.tool.js +58 -0
- package/dist/modules/tools/builtin/edit-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/edit_file.d.ts +3 -0
- package/dist/modules/tools/builtin/edit_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/edit_file.js +69 -0
- package/dist/modules/tools/builtin/edit_file.js.map +1 -0
- package/dist/modules/tools/builtin/edit_file.txt +10 -0
- package/dist/modules/tools/builtin/glob.d.ts +3 -0
- package/dist/modules/tools/builtin/glob.d.ts.map +1 -0
- package/dist/modules/tools/builtin/glob.js +84 -0
- package/dist/modules/tools/builtin/glob.js.map +1 -0
- package/dist/modules/tools/builtin/glob.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/glob.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/glob.tool.js +81 -0
- package/dist/modules/tools/builtin/glob.tool.js.map +1 -0
- package/dist/modules/tools/builtin/glob.txt +10 -0
- package/dist/modules/tools/builtin/grep.d.ts +3 -0
- package/dist/modules/tools/builtin/grep.d.ts.map +1 -0
- package/dist/modules/tools/builtin/grep.js +93 -0
- package/dist/modules/tools/builtin/grep.js.map +1 -0
- package/dist/modules/tools/builtin/grep.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/grep.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/grep.tool.js +96 -0
- package/dist/modules/tools/builtin/grep.tool.js.map +1 -0
- package/dist/modules/tools/builtin/grep.txt +12 -0
- package/dist/modules/tools/builtin/index.d.ts +8 -0
- package/dist/modules/tools/builtin/index.d.ts.map +1 -0
- package/dist/modules/tools/builtin/index.js +88 -0
- package/dist/modules/tools/builtin/index.js.map +1 -0
- package/dist/modules/tools/builtin/lsp.d.ts +7 -0
- package/dist/modules/tools/builtin/lsp.d.ts.map +1 -0
- package/dist/modules/tools/builtin/lsp.js +125 -0
- package/dist/modules/tools/builtin/lsp.js.map +1 -0
- package/dist/modules/tools/builtin/lsp.txt +19 -0
- package/dist/modules/tools/builtin/memory.d.ts +3 -0
- package/dist/modules/tools/builtin/memory.d.ts.map +1 -0
- package/dist/modules/tools/builtin/memory.js +76 -0
- package/dist/modules/tools/builtin/memory.js.map +1 -0
- package/dist/modules/tools/builtin/memory.txt +36 -0
- package/dist/modules/tools/builtin/read-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/read-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/read-file.tool.js +46 -0
- package/dist/modules/tools/builtin/read-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/read_file.d.ts +3 -0
- package/dist/modules/tools/builtin/read_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/read_file.js +99 -0
- package/dist/modules/tools/builtin/read_file.js.map +1 -0
- package/dist/modules/tools/builtin/read_file.txt +15 -0
- package/dist/modules/tools/builtin/todo_read.d.ts +6 -0
- package/dist/modules/tools/builtin/todo_read.d.ts.map +1 -0
- package/dist/modules/tools/builtin/todo_read.js +24 -0
- package/dist/modules/tools/builtin/todo_read.js.map +1 -0
- package/dist/modules/tools/builtin/todo_read.txt +14 -0
- package/dist/modules/tools/builtin/todo_write.d.ts +6 -0
- package/dist/modules/tools/builtin/todo_write.d.ts.map +1 -0
- package/dist/modules/tools/builtin/todo_write.js +45 -0
- package/dist/modules/tools/builtin/todo_write.js.map +1 -0
- package/dist/modules/tools/builtin/todo_write.txt +46 -0
- package/dist/modules/tools/builtin/web_fetch.d.ts +3 -0
- package/dist/modules/tools/builtin/web_fetch.d.ts.map +1 -0
- package/dist/modules/tools/builtin/web_fetch.js +51 -0
- package/dist/modules/tools/builtin/web_fetch.js.map +1 -0
- package/dist/modules/tools/builtin/web_fetch.txt +15 -0
- package/dist/modules/tools/builtin/web_search.d.ts +3 -0
- package/dist/modules/tools/builtin/web_search.d.ts.map +1 -0
- package/dist/modules/tools/builtin/web_search.js +99 -0
- package/dist/modules/tools/builtin/web_search.js.map +1 -0
- package/dist/modules/tools/builtin/web_search.txt +16 -0
- package/dist/modules/tools/builtin/write-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/write-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/write-file.tool.js +38 -0
- package/dist/modules/tools/builtin/write-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/write_file.d.ts +3 -0
- package/dist/modules/tools/builtin/write_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/write_file.js +46 -0
- package/dist/modules/tools/builtin/write_file.js.map +1 -0
- package/dist/modules/tools/builtin/write_file.txt +9 -0
- package/dist/modules/tools/index.d.ts +11 -0
- package/dist/modules/tools/index.d.ts.map +1 -0
- package/dist/modules/tools/index.js +10 -0
- package/dist/modules/tools/index.js.map +1 -0
- package/dist/modules/tools/tool.service.d.ts +207 -0
- package/dist/modules/tools/tool.service.d.ts.map +1 -0
- package/dist/modules/tools/tool.service.js +331 -0
- package/dist/modules/tools/tool.service.js.map +1 -0
- package/dist/modules/tools/tool.types.d.ts +39 -0
- package/dist/modules/tools/tool.types.d.ts.map +1 -0
- package/dist/modules/tools/tool.types.js +5 -0
- package/dist/modules/tools/tool.types.js.map +1 -0
- package/dist/web/index.d.ts +10 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +20 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/web.service.d.ts +95 -0
- package/dist/web/web.service.d.ts.map +1 -0
- package/dist/web/web.service.js +396 -0
- package/dist/web/web.service.js.map +1 -0
- package/package.json +57 -0
- package/web/dist/assets/Layout-Bb76CGAL.js +1 -0
- package/web/dist/assets/element-icons-B-tDfklg.woff +0 -0
- package/web/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
- package/web/dist/assets/index-DQRR0ggU.js +199 -0
- package/web/dist/assets/index-KTH-myBB.css +1 -0
- package/web/dist/index.html +14 -0
- package/web/index.html +13 -0
- package/web/package.json +24 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话服务模块
|
|
3
|
+
*
|
|
4
|
+
* 本模块负责会话 (Session) 的管理和操作
|
|
5
|
+
*
|
|
6
|
+
* 核心功能:
|
|
7
|
+
* 1. 会话 CRUD - 创建、读取、更新、删除会话
|
|
8
|
+
* 2. 会话切换 - 维护当前活跃的会话
|
|
9
|
+
* 3. 状态管理 - 缓存会话列表和当前会话 ID
|
|
10
|
+
* 4. Token 统计 - 追踪每个会话的 Token 使用量
|
|
11
|
+
* 5. 上下文压缩 - 记录摘要消息位置,供压缩算法使用
|
|
12
|
+
* 6. 项目关联 - 将会话与项目路径关联
|
|
13
|
+
*
|
|
14
|
+
* 数据模型:
|
|
15
|
+
* - Session: 包含 id, title, projectPath, summaryMessageId,
|
|
16
|
+
* promptTokens, completionTokens, cost, createdAt, updatedAt
|
|
17
|
+
* - SessionState: 包含 currentSessionId 和 sessions 数组
|
|
18
|
+
*
|
|
19
|
+
* 典型使用场景:
|
|
20
|
+
* - 用户开始新对话时创建会话
|
|
21
|
+
* - 用户切换不同项目时切换会话
|
|
22
|
+
* - 查看会话历史记录
|
|
23
|
+
* - 统计 Token 使用量 (用于计费或配额控制)
|
|
24
|
+
*/
|
|
25
|
+
import { DbService } from '../db/db.service.js';
|
|
26
|
+
import { Session, SessionState, SessionStats } from './session.types.js';
|
|
27
|
+
/**
|
|
28
|
+
* SessionService 类
|
|
29
|
+
*
|
|
30
|
+
* 会话服务提供会话的完整生命周期管理
|
|
31
|
+
* 每个会话代表用户与 AI 的一次对话会话
|
|
32
|
+
*
|
|
33
|
+
* 会话状态说明:
|
|
34
|
+
* - currentSessionId: 当前活跃的会话 ID
|
|
35
|
+
* - sessions: 内存中缓存的会话列表
|
|
36
|
+
*
|
|
37
|
+
* 持久化:
|
|
38
|
+
* - 所有会话数据存储在 SQLite 数据库的 sessions 表中
|
|
39
|
+
* - 内存中维护状态缓存,用于快速访问
|
|
40
|
+
*/
|
|
41
|
+
export declare class SessionService {
|
|
42
|
+
/** 数据库服务实例 */
|
|
43
|
+
private db;
|
|
44
|
+
/**
|
|
45
|
+
* 会话状态
|
|
46
|
+
*
|
|
47
|
+
* 维护当前会话 ID 和会话列表的缓存
|
|
48
|
+
* 初始状态:没有当前会话,没有缓存的会话
|
|
49
|
+
*/
|
|
50
|
+
private state;
|
|
51
|
+
/**
|
|
52
|
+
* 构造函数
|
|
53
|
+
*
|
|
54
|
+
* @param db - 数据库服务实例,如果未提供则使用默认实例
|
|
55
|
+
*
|
|
56
|
+
* 注意:SessionService 依赖 DbService,需要确保数据库已初始化
|
|
57
|
+
*/
|
|
58
|
+
constructor(db?: DbService);
|
|
59
|
+
/**
|
|
60
|
+
* 创建新会话
|
|
61
|
+
*
|
|
62
|
+
* 执行流程:
|
|
63
|
+
* 1. 生成唯一的 UUID 作为会话 ID
|
|
64
|
+
* 2. 将会话信息插入数据库
|
|
65
|
+
* 3. 从数据库读取刚创建的会话对象
|
|
66
|
+
* 4. 将新会话添加到内存缓存的最前面
|
|
67
|
+
*
|
|
68
|
+
* @param title - 会话标题,如 "Chat Session"
|
|
69
|
+
* @param projectPath - 项目路径 (可选),用于关联特定项目
|
|
70
|
+
* @returns {Session} 创建的会话对象
|
|
71
|
+
*/
|
|
72
|
+
create(title: string, projectPath?: string): Session;
|
|
73
|
+
/**
|
|
74
|
+
* 获取会话
|
|
75
|
+
*
|
|
76
|
+
* 根据会话 ID 从数据库查询会话信息
|
|
77
|
+
*
|
|
78
|
+
* @param id - 会话 ID
|
|
79
|
+
* @returns {Session | undefined} 会话对象,如果不存在则返回 undefined
|
|
80
|
+
*/
|
|
81
|
+
get(id: string): Session | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* 获取所有会话
|
|
84
|
+
*
|
|
85
|
+
* 从数据库查询所有会话,按更新时间降序排列
|
|
86
|
+
* 同时更新内存中的会话缓存
|
|
87
|
+
*
|
|
88
|
+
* @returns {Session[]} 会话数组
|
|
89
|
+
*/
|
|
90
|
+
getAll(): Session[];
|
|
91
|
+
/**
|
|
92
|
+
* 更新会话
|
|
93
|
+
*
|
|
94
|
+
* 可更新字段:title, projectPath
|
|
95
|
+
* 同时更新数据库和内存缓存
|
|
96
|
+
*
|
|
97
|
+
* @param id - 会话 ID
|
|
98
|
+
* @param data - 要更新的字段
|
|
99
|
+
*/
|
|
100
|
+
update(id: string, data: Partial<Pick<Session, 'title' | 'projectPath'>>): void;
|
|
101
|
+
/**
|
|
102
|
+
* 删除会话
|
|
103
|
+
*
|
|
104
|
+
* 从数据库删除会话记录
|
|
105
|
+
* 同时清理内存缓存
|
|
106
|
+
*
|
|
107
|
+
* 注意:如果删除的是当前会话,需要清空 currentSessionId
|
|
108
|
+
*
|
|
109
|
+
* @param id - 会话 ID
|
|
110
|
+
*/
|
|
111
|
+
delete(id: string): void;
|
|
112
|
+
/**
|
|
113
|
+
* 更新会话的访问时间
|
|
114
|
+
*
|
|
115
|
+
* 每次访问或操作会话时调用
|
|
116
|
+
* 用于排序最近使用的会话
|
|
117
|
+
*
|
|
118
|
+
* @param id - 会话 ID
|
|
119
|
+
*/
|
|
120
|
+
touch(id: string): void;
|
|
121
|
+
/**
|
|
122
|
+
* 切换到指定会话
|
|
123
|
+
*
|
|
124
|
+
* 将当前活跃会话切换为指定会话
|
|
125
|
+
* 同时更新该会话的访问时间
|
|
126
|
+
*
|
|
127
|
+
* @param id - 要切换到的会话 ID
|
|
128
|
+
* @returns {Session | undefined} 切换后的会话对象
|
|
129
|
+
*/
|
|
130
|
+
switchTo(id: string): Session | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* 获取当前会话
|
|
133
|
+
*
|
|
134
|
+
* @returns {Session | undefined} 当前会话对象,如果没有当前会话则返回 undefined
|
|
135
|
+
*/
|
|
136
|
+
getCurrent(): Session | undefined;
|
|
137
|
+
/**
|
|
138
|
+
* 获取当前会话 ID
|
|
139
|
+
*
|
|
140
|
+
* @returns {string | null} 当前会话 ID,如果没有当前会话则返回 null
|
|
141
|
+
*/
|
|
142
|
+
getCurrentId(): string | null;
|
|
143
|
+
/**
|
|
144
|
+
* 获取最近的会话列表
|
|
145
|
+
*
|
|
146
|
+
* @param limit - 返回数量限制,默认 10
|
|
147
|
+
* @returns {Session[]} 最近更新的会话数组
|
|
148
|
+
*/
|
|
149
|
+
getRecent(limit?: number): Session[];
|
|
150
|
+
/**
|
|
151
|
+
* 搜索会话
|
|
152
|
+
*
|
|
153
|
+
* 根据标题或项目路径搜索会话
|
|
154
|
+
*
|
|
155
|
+
* @param query - 搜索关键词
|
|
156
|
+
* @returns {Session[]} 匹配的会话数组
|
|
157
|
+
*/
|
|
158
|
+
search(query: string): Session[];
|
|
159
|
+
/**
|
|
160
|
+
* 清空当前会话
|
|
161
|
+
*
|
|
162
|
+
* 将 currentSessionId 设置为 null
|
|
163
|
+
* 不删除任何会话数据
|
|
164
|
+
*/
|
|
165
|
+
clearCurrent(): void;
|
|
166
|
+
/**
|
|
167
|
+
* 获取会话状态
|
|
168
|
+
*
|
|
169
|
+
* 返回当前会话 ID 和会话列表的副本
|
|
170
|
+
*
|
|
171
|
+
* @returns {SessionState} 会话状态对象
|
|
172
|
+
*/
|
|
173
|
+
getState(): SessionState;
|
|
174
|
+
/**
|
|
175
|
+
* 根据项目路径获取或创建会话
|
|
176
|
+
*
|
|
177
|
+
* 如果项目路径已存在会话,返回最近更新的会话
|
|
178
|
+
* 如果不存在,创建新会话
|
|
179
|
+
*
|
|
180
|
+
* @param projectPath - 项目路径
|
|
181
|
+
* @param title - 标题 (可选,默认根据项目路径生成)
|
|
182
|
+
* @returns {Session} 会话对象
|
|
183
|
+
*/
|
|
184
|
+
getOrCreateByPath(projectPath: string, title?: string): Session;
|
|
185
|
+
/**
|
|
186
|
+
* 更新 Token 使用统计
|
|
187
|
+
*
|
|
188
|
+
* 累加会话的 Token 使用量
|
|
189
|
+
* 用于追踪每个会话的资源消耗
|
|
190
|
+
*
|
|
191
|
+
* @param sessionId - 会话 ID
|
|
192
|
+
* @param promptTokens - 提示词 Token 数量
|
|
193
|
+
* @param completionTokens - 补全 Token 数量
|
|
194
|
+
* @param cost - 费用 (可选,默认 0)
|
|
195
|
+
*/
|
|
196
|
+
updateTokenUsage(sessionId: string, promptTokens: number, completionTokens: number, cost?: number): void;
|
|
197
|
+
/**
|
|
198
|
+
* 更新摘要消息 ID
|
|
199
|
+
*
|
|
200
|
+
* 当会话压缩后,记录压缩点位置
|
|
201
|
+
* 下次获取消息时从该位置开始
|
|
202
|
+
*
|
|
203
|
+
* @param sessionId - 会话 ID
|
|
204
|
+
* @param summaryMessageId - 摘要消息 ID
|
|
205
|
+
*/
|
|
206
|
+
updateSummary(sessionId: string, summaryMessageId: number): void;
|
|
207
|
+
/**
|
|
208
|
+
* 重置 Token 统计
|
|
209
|
+
*
|
|
210
|
+
* 将会话的 Token 计数归零
|
|
211
|
+
*
|
|
212
|
+
* @param sessionId - 会话 ID
|
|
213
|
+
*/
|
|
214
|
+
resetTokens(sessionId: string): void;
|
|
215
|
+
/**
|
|
216
|
+
* 获取会话统计信息
|
|
217
|
+
*
|
|
218
|
+
* @param sessionId - 会话 ID
|
|
219
|
+
* @param threshold - Token 阈值 (用于计算百分比)
|
|
220
|
+
* @returns {SessionStats} 统计信息对象
|
|
221
|
+
*/
|
|
222
|
+
getStats(sessionId: string, threshold: number): SessionStats;
|
|
223
|
+
/**
|
|
224
|
+
* 将数据库行转换为 Session 对象
|
|
225
|
+
*
|
|
226
|
+
* 数据库表字段使用下划线命名 (snake_case)
|
|
227
|
+
* Session 对象使用驼峰命名 (camelCase)
|
|
228
|
+
*
|
|
229
|
+
* @param row - 数据库行对象
|
|
230
|
+
* @returns {Session} Session 对象
|
|
231
|
+
*/
|
|
232
|
+
private rowToSession;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* 会话服务单例实例
|
|
236
|
+
*
|
|
237
|
+
* 在整个应用中共享同一个 SessionService 实例
|
|
238
|
+
*
|
|
239
|
+
* 使用方式:
|
|
240
|
+
* import { sessionService } from '../session/index.js';
|
|
241
|
+
*
|
|
242
|
+
* // 创建会话
|
|
243
|
+
* const session = sessionService.create('My Chat');
|
|
244
|
+
*
|
|
245
|
+
* // 切换会话
|
|
246
|
+
* sessionService.switchTo(session.id);
|
|
247
|
+
*
|
|
248
|
+
* // 获取当前会话
|
|
249
|
+
* const current = sessionService.getCurrent();
|
|
250
|
+
*/
|
|
251
|
+
export declare const sessionService: SessionService;
|
|
252
|
+
//# sourceMappingURL=session.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.service.d.ts","sourceRoot":"","sources":["../../../src/modules/session/session.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,SAAS,EAAiC,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAoB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG3F;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAc;IACzB,cAAc;IACd,OAAO,CAAC,EAAE,CAAY;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,KAAK,CAGX;IAEF;;;;;;OAMG;gBACS,EAAE,CAAC,EAAE,SAAS;IAI1B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IAuBpD;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAMpC;;;;;;;OAOG;IACH,MAAM,IAAI,OAAO,EAAE;IAUnB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAAC,CAAC,GAAG,IAAI;IA+B/E;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAexB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIvB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAYzC;;;;OAIG;IACH,UAAU,IAAI,OAAO,GAAG,SAAS;IAKjC;;;;OAIG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;;;;OAKG;IACH,SAAS,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,EAAE;IAQxC;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE;IAQhC;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAIpB;;;;;;OAMG;IACH,QAAQ,IAAI,YAAY;IAIxB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAgB/D;;;;;;;;;;OAUG;IACH,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,IAAI,GAAE,MAAU,GACf,IAAI;IAYP;;;;;;;;OAQG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAUhE;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAWpC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY;IA4B5D;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;CAarB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话服务模块
|
|
3
|
+
*
|
|
4
|
+
* 本模块负责会话 (Session) 的管理和操作
|
|
5
|
+
*
|
|
6
|
+
* 核心功能:
|
|
7
|
+
* 1. 会话 CRUD - 创建、读取、更新、删除会话
|
|
8
|
+
* 2. 会话切换 - 维护当前活跃的会话
|
|
9
|
+
* 3. 状态管理 - 缓存会话列表和当前会话 ID
|
|
10
|
+
* 4. Token 统计 - 追踪每个会话的 Token 使用量
|
|
11
|
+
* 5. 上下文压缩 - 记录摘要消息位置,供压缩算法使用
|
|
12
|
+
* 6. 项目关联 - 将会话与项目路径关联
|
|
13
|
+
*
|
|
14
|
+
* 数据模型:
|
|
15
|
+
* - Session: 包含 id, title, projectPath, summaryMessageId,
|
|
16
|
+
* promptTokens, completionTokens, cost, createdAt, updatedAt
|
|
17
|
+
* - SessionState: 包含 currentSessionId 和 sessions 数组
|
|
18
|
+
*
|
|
19
|
+
* 典型使用场景:
|
|
20
|
+
* - 用户开始新对话时创建会话
|
|
21
|
+
* - 用户切换不同项目时切换会话
|
|
22
|
+
* - 查看会话历史记录
|
|
23
|
+
* - 统计 Token 使用量 (用于计费或配额控制)
|
|
24
|
+
*/
|
|
25
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
26
|
+
import { dbService as defaultDbService } from '../db/db.service.js';
|
|
27
|
+
/**
|
|
28
|
+
* SessionService 类
|
|
29
|
+
*
|
|
30
|
+
* 会话服务提供会话的完整生命周期管理
|
|
31
|
+
* 每个会话代表用户与 AI 的一次对话会话
|
|
32
|
+
*
|
|
33
|
+
* 会话状态说明:
|
|
34
|
+
* - currentSessionId: 当前活跃的会话 ID
|
|
35
|
+
* - sessions: 内存中缓存的会话列表
|
|
36
|
+
*
|
|
37
|
+
* 持久化:
|
|
38
|
+
* - 所有会话数据存储在 SQLite 数据库的 sessions 表中
|
|
39
|
+
* - 内存中维护状态缓存,用于快速访问
|
|
40
|
+
*/
|
|
41
|
+
export class SessionService {
|
|
42
|
+
/**
|
|
43
|
+
* 构造函数
|
|
44
|
+
*
|
|
45
|
+
* @param db - 数据库服务实例,如果未提供则使用默认实例
|
|
46
|
+
*
|
|
47
|
+
* 注意:SessionService 依赖 DbService,需要确保数据库已初始化
|
|
48
|
+
*/
|
|
49
|
+
constructor(db) {
|
|
50
|
+
/**
|
|
51
|
+
* 会话状态
|
|
52
|
+
*
|
|
53
|
+
* 维护当前会话 ID 和会话列表的缓存
|
|
54
|
+
* 初始状态:没有当前会话,没有缓存的会话
|
|
55
|
+
*/
|
|
56
|
+
this.state = {
|
|
57
|
+
currentSessionId: null, // 当前活跃会话 ID
|
|
58
|
+
sessions: [], // 缓存的会话列表
|
|
59
|
+
};
|
|
60
|
+
this.db = db || defaultDbService;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 创建新会话
|
|
64
|
+
*
|
|
65
|
+
* 执行流程:
|
|
66
|
+
* 1. 生成唯一的 UUID 作为会话 ID
|
|
67
|
+
* 2. 将会话信息插入数据库
|
|
68
|
+
* 3. 从数据库读取刚创建的会话对象
|
|
69
|
+
* 4. 将新会话添加到内存缓存的最前面
|
|
70
|
+
*
|
|
71
|
+
* @param title - 会话标题,如 "Chat Session"
|
|
72
|
+
* @param projectPath - 项目路径 (可选),用于关联特定项目
|
|
73
|
+
* @returns {Session} 创建的会话对象
|
|
74
|
+
*/
|
|
75
|
+
create(title, projectPath) {
|
|
76
|
+
// ========== 生成会话 ID ==========
|
|
77
|
+
// 使用 uuid 库生成全局唯一标识符
|
|
78
|
+
const id = uuidv4();
|
|
79
|
+
// ========== 插入数据库 ==========
|
|
80
|
+
// 执行 INSERT 语句,将会话信息存入数据库
|
|
81
|
+
this.db.run('INSERT INTO sessions (id, title, project_path) VALUES (?, ?, ?)', [id, title, projectPath || null] // projectPath 为 null 如果未提供
|
|
82
|
+
);
|
|
83
|
+
// ========== 获取会话对象 ==========
|
|
84
|
+
// 从数据库读取刚创建的会话,确保数据一致性
|
|
85
|
+
const session = this.get(id);
|
|
86
|
+
// ========== 更新内存缓存 ==========
|
|
87
|
+
// unshift 将新会话添加到数组最前面 (最新的会话排在前面)
|
|
88
|
+
this.state.sessions.unshift(session);
|
|
89
|
+
return session;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 获取会话
|
|
93
|
+
*
|
|
94
|
+
* 根据会话 ID 从数据库查询会话信息
|
|
95
|
+
*
|
|
96
|
+
* @param id - 会话 ID
|
|
97
|
+
* @returns {Session | undefined} 会话对象,如果不存在则返回 undefined
|
|
98
|
+
*/
|
|
99
|
+
get(id) {
|
|
100
|
+
// 查询单条记录
|
|
101
|
+
const row = this.db.get('SELECT * FROM sessions WHERE id = ?', [id]);
|
|
102
|
+
return row ? this.rowToSession(row) : undefined;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 获取所有会话
|
|
106
|
+
*
|
|
107
|
+
* 从数据库查询所有会话,按更新时间降序排列
|
|
108
|
+
* 同时更新内存中的会话缓存
|
|
109
|
+
*
|
|
110
|
+
* @returns {Session[]} 会话数组
|
|
111
|
+
*/
|
|
112
|
+
getAll() {
|
|
113
|
+
// 查询所有记录,按 updated_at 降序 (最近更新的在前)
|
|
114
|
+
const rows = this.db.all('SELECT * FROM sessions ORDER BY updated_at DESC');
|
|
115
|
+
// 更新内存缓存
|
|
116
|
+
this.state.sessions = rows.map(this.rowToSession);
|
|
117
|
+
return this.state.sessions;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 更新会话
|
|
121
|
+
*
|
|
122
|
+
* 可更新字段:title, projectPath
|
|
123
|
+
* 同时更新数据库和内存缓存
|
|
124
|
+
*
|
|
125
|
+
* @param id - 会话 ID
|
|
126
|
+
* @param data - 要更新的字段
|
|
127
|
+
*/
|
|
128
|
+
update(id, data) {
|
|
129
|
+
const updates = [];
|
|
130
|
+
const values = [];
|
|
131
|
+
// 构建动态更新语句
|
|
132
|
+
if (data.title !== undefined) {
|
|
133
|
+
updates.push('title = ?');
|
|
134
|
+
values.push(data.title);
|
|
135
|
+
}
|
|
136
|
+
if (data.projectPath !== undefined) {
|
|
137
|
+
updates.push('project_path = ?');
|
|
138
|
+
values.push(data.projectPath);
|
|
139
|
+
}
|
|
140
|
+
// 如果有需要更新的字段
|
|
141
|
+
if (updates.length > 0) {
|
|
142
|
+
// 添加 updated_at 自动更新
|
|
143
|
+
updates.push('updated_at = CURRENT_TIMESTAMP');
|
|
144
|
+
values.push(id);
|
|
145
|
+
// 执行 UPDATE 语句
|
|
146
|
+
this.db.run(`UPDATE sessions SET ${updates.join(', ')} WHERE id = ?`, values);
|
|
147
|
+
// 更新内存缓存中的会话对象
|
|
148
|
+
const index = this.state.sessions.findIndex(s => s.id === id);
|
|
149
|
+
if (index !== -1) {
|
|
150
|
+
this.state.sessions[index] = this.get(id);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 删除会话
|
|
156
|
+
*
|
|
157
|
+
* 从数据库删除会话记录
|
|
158
|
+
* 同时清理内存缓存
|
|
159
|
+
*
|
|
160
|
+
* 注意:如果删除的是当前会话,需要清空 currentSessionId
|
|
161
|
+
*
|
|
162
|
+
* @param id - 会话 ID
|
|
163
|
+
*/
|
|
164
|
+
delete(id) {
|
|
165
|
+
// 删除会话的所有消息
|
|
166
|
+
this.db.run('DELETE FROM messages WHERE session_id = ?', [id]);
|
|
167
|
+
// 删除数据库记录
|
|
168
|
+
this.db.run('DELETE FROM sessions WHERE id = ?', [id]);
|
|
169
|
+
// 如果删除的是当前会话,清空当前会话 ID
|
|
170
|
+
if (this.state.currentSessionId === id) {
|
|
171
|
+
this.state.currentSessionId = null;
|
|
172
|
+
}
|
|
173
|
+
// 从内存缓存中移除
|
|
174
|
+
this.state.sessions = this.state.sessions.filter(s => s.id !== id);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 更新会话的访问时间
|
|
178
|
+
*
|
|
179
|
+
* 每次访问或操作会话时调用
|
|
180
|
+
* 用于排序最近使用的会话
|
|
181
|
+
*
|
|
182
|
+
* @param id - 会话 ID
|
|
183
|
+
*/
|
|
184
|
+
touch(id) {
|
|
185
|
+
this.db.run('UPDATE sessions SET updated_at = CURRENT_TIMESTAMP WHERE id = ?', [id]);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 切换到指定会话
|
|
189
|
+
*
|
|
190
|
+
* 将当前活跃会话切换为指定会话
|
|
191
|
+
* 同时更新该会话的访问时间
|
|
192
|
+
*
|
|
193
|
+
* @param id - 要切换到的会话 ID
|
|
194
|
+
* @returns {Session | undefined} 切换后的会话对象
|
|
195
|
+
*/
|
|
196
|
+
switchTo(id) {
|
|
197
|
+
const session = this.get(id);
|
|
198
|
+
if (!session)
|
|
199
|
+
return undefined;
|
|
200
|
+
// 设置当前会话 ID
|
|
201
|
+
this.state.currentSessionId = id;
|
|
202
|
+
// 更新访问时间
|
|
203
|
+
this.touch(id);
|
|
204
|
+
return session;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 获取当前会话
|
|
208
|
+
*
|
|
209
|
+
* @returns {Session | undefined} 当前会话对象,如果没有当前会话则返回 undefined
|
|
210
|
+
*/
|
|
211
|
+
getCurrent() {
|
|
212
|
+
if (!this.state.currentSessionId)
|
|
213
|
+
return undefined;
|
|
214
|
+
return this.get(this.state.currentSessionId);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* 获取当前会话 ID
|
|
218
|
+
*
|
|
219
|
+
* @returns {string | null} 当前会话 ID,如果没有当前会话则返回 null
|
|
220
|
+
*/
|
|
221
|
+
getCurrentId() {
|
|
222
|
+
return this.state.currentSessionId;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* 获取最近的会话列表
|
|
226
|
+
*
|
|
227
|
+
* @param limit - 返回数量限制,默认 10
|
|
228
|
+
* @returns {Session[]} 最近更新的会话数组
|
|
229
|
+
*/
|
|
230
|
+
getRecent(limit = 10) {
|
|
231
|
+
const rows = this.db.all('SELECT * FROM sessions ORDER BY updated_at DESC LIMIT ?', [limit]);
|
|
232
|
+
return rows.map(this.rowToSession);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* 搜索会话
|
|
236
|
+
*
|
|
237
|
+
* 根据标题或项目路径搜索会话
|
|
238
|
+
*
|
|
239
|
+
* @param query - 搜索关键词
|
|
240
|
+
* @returns {Session[]} 匹配的会话数组
|
|
241
|
+
*/
|
|
242
|
+
search(query) {
|
|
243
|
+
const rows = this.db.all("SELECT * FROM sessions WHERE title LIKE ? OR project_path LIKE ? ORDER BY updated_at DESC", [`%${query}%`, `%${query}%`]);
|
|
244
|
+
return rows.map(this.rowToSession);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* 清空当前会话
|
|
248
|
+
*
|
|
249
|
+
* 将 currentSessionId 设置为 null
|
|
250
|
+
* 不删除任何会话数据
|
|
251
|
+
*/
|
|
252
|
+
clearCurrent() {
|
|
253
|
+
this.state.currentSessionId = null;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 获取会话状态
|
|
257
|
+
*
|
|
258
|
+
* 返回当前会话 ID 和会话列表的副本
|
|
259
|
+
*
|
|
260
|
+
* @returns {SessionState} 会话状态对象
|
|
261
|
+
*/
|
|
262
|
+
getState() {
|
|
263
|
+
return { ...this.state };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* 根据项目路径获取或创建会话
|
|
267
|
+
*
|
|
268
|
+
* 如果项目路径已存在会话,返回最近更新的会话
|
|
269
|
+
* 如果不存在,创建新会话
|
|
270
|
+
*
|
|
271
|
+
* @param projectPath - 项目路径
|
|
272
|
+
* @param title - 标题 (可选,默认根据项目路径生成)
|
|
273
|
+
* @returns {Session} 会话对象
|
|
274
|
+
*/
|
|
275
|
+
getOrCreateByPath(projectPath, title) {
|
|
276
|
+
// 查询该项目的最近会话
|
|
277
|
+
const existing = this.db.get('SELECT * FROM sessions WHERE project_path = ? ORDER BY updated_at DESC LIMIT 1', [projectPath]);
|
|
278
|
+
// 如果存在,返回该会话
|
|
279
|
+
if (existing) {
|
|
280
|
+
return this.rowToSession(existing);
|
|
281
|
+
}
|
|
282
|
+
// 如果不存在,创建新会话
|
|
283
|
+
return this.create(title || `Session for ${projectPath}`, projectPath);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 更新 Token 使用统计
|
|
287
|
+
*
|
|
288
|
+
* 累加会话的 Token 使用量
|
|
289
|
+
* 用于追踪每个会话的资源消耗
|
|
290
|
+
*
|
|
291
|
+
* @param sessionId - 会话 ID
|
|
292
|
+
* @param promptTokens - 提示词 Token 数量
|
|
293
|
+
* @param completionTokens - 补全 Token 数量
|
|
294
|
+
* @param cost - 费用 (可选,默认 0)
|
|
295
|
+
*/
|
|
296
|
+
updateTokenUsage(sessionId, promptTokens, completionTokens, cost = 0) {
|
|
297
|
+
this.db.run(`UPDATE sessions
|
|
298
|
+
SET prompt_tokens = prompt_tokens + ?,
|
|
299
|
+
completion_tokens = completion_tokens + ?,
|
|
300
|
+
cost = cost + ?,
|
|
301
|
+
updated_at = CURRENT_TIMESTAMP
|
|
302
|
+
WHERE id = ?`, [promptTokens, completionTokens, cost, sessionId]);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* 更新摘要消息 ID
|
|
306
|
+
*
|
|
307
|
+
* 当会话压缩后,记录压缩点位置
|
|
308
|
+
* 下次获取消息时从该位置开始
|
|
309
|
+
*
|
|
310
|
+
* @param sessionId - 会话 ID
|
|
311
|
+
* @param summaryMessageId - 摘要消息 ID
|
|
312
|
+
*/
|
|
313
|
+
updateSummary(sessionId, summaryMessageId) {
|
|
314
|
+
this.db.run(`UPDATE sessions
|
|
315
|
+
SET summary_message_id = ?,
|
|
316
|
+
updated_at = CURRENT_TIMESTAMP
|
|
317
|
+
WHERE id = ?`, [summaryMessageId, sessionId]);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* 重置 Token 统计
|
|
321
|
+
*
|
|
322
|
+
* 将会话的 Token 计数归零
|
|
323
|
+
*
|
|
324
|
+
* @param sessionId - 会话 ID
|
|
325
|
+
*/
|
|
326
|
+
resetTokens(sessionId) {
|
|
327
|
+
this.db.run(`UPDATE sessions
|
|
328
|
+
SET prompt_tokens = 0,
|
|
329
|
+
completion_tokens = 0,
|
|
330
|
+
updated_at = CURRENT_TIMESTAMP
|
|
331
|
+
WHERE id = ?`, [sessionId]);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* 获取会话统计信息
|
|
335
|
+
*
|
|
336
|
+
* @param sessionId - 会话 ID
|
|
337
|
+
* @param threshold - Token 阈值 (用于计算百分比)
|
|
338
|
+
* @returns {SessionStats} 统计信息对象
|
|
339
|
+
*/
|
|
340
|
+
getStats(sessionId, threshold) {
|
|
341
|
+
const session = this.get(sessionId);
|
|
342
|
+
if (!session) {
|
|
343
|
+
return {
|
|
344
|
+
promptTokens: 0,
|
|
345
|
+
completionTokens: 0,
|
|
346
|
+
totalTokens: 0,
|
|
347
|
+
threshold,
|
|
348
|
+
percentUsed: 0,
|
|
349
|
+
willCompact: false,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
// 计算总 Token 数
|
|
353
|
+
const totalTokens = session.promptTokens + session.completionTokens;
|
|
354
|
+
// 计算使用百分比
|
|
355
|
+
const percentUsed = threshold > 0 ? Math.round((totalTokens / threshold) * 100) : 0;
|
|
356
|
+
return {
|
|
357
|
+
promptTokens: session.promptTokens,
|
|
358
|
+
completionTokens: session.completionTokens,
|
|
359
|
+
totalTokens,
|
|
360
|
+
threshold,
|
|
361
|
+
percentUsed,
|
|
362
|
+
willCompact: totalTokens >= threshold, // 是否需要压缩
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* 将数据库行转换为 Session 对象
|
|
367
|
+
*
|
|
368
|
+
* 数据库表字段使用下划线命名 (snake_case)
|
|
369
|
+
* Session 对象使用驼峰命名 (camelCase)
|
|
370
|
+
*
|
|
371
|
+
* @param row - 数据库行对象
|
|
372
|
+
* @returns {Session} Session 对象
|
|
373
|
+
*/
|
|
374
|
+
rowToSession(row) {
|
|
375
|
+
return {
|
|
376
|
+
id: row.id,
|
|
377
|
+
title: row.title,
|
|
378
|
+
projectPath: row.project_path,
|
|
379
|
+
summaryMessageId: row.summary_message_id ?? null,
|
|
380
|
+
promptTokens: row.prompt_tokens || 0,
|
|
381
|
+
completionTokens: row.completion_tokens || 0,
|
|
382
|
+
cost: row.cost || 0,
|
|
383
|
+
createdAt: row.created_at,
|
|
384
|
+
updatedAt: row.updated_at,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* 会话服务单例实例
|
|
390
|
+
*
|
|
391
|
+
* 在整个应用中共享同一个 SessionService 实例
|
|
392
|
+
*
|
|
393
|
+
* 使用方式:
|
|
394
|
+
* import { sessionService } from '../session/index.js';
|
|
395
|
+
*
|
|
396
|
+
* // 创建会话
|
|
397
|
+
* const session = sessionService.create('My Chat');
|
|
398
|
+
*
|
|
399
|
+
* // 切换会话
|
|
400
|
+
* sessionService.switchTo(session.id);
|
|
401
|
+
*
|
|
402
|
+
* // 获取当前会话
|
|
403
|
+
* const current = sessionService.getCurrent();
|
|
404
|
+
*/
|
|
405
|
+
export const sessionService = new SessionService();
|
|
406
|
+
//# sourceMappingURL=session.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.service.js","sourceRoot":"","sources":["../../../src/modules/session/session.service.ts"],"names":[],"mappings":"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"}
|