@zhijianma/studio 1.0.10

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 (235) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +158 -0
  3. package/bin/cli.js +7 -0
  4. package/dist/app/friday/args.py +65 -0
  5. package/dist/app/friday/hook.py +52 -0
  6. package/dist/app/friday/main.py +164 -0
  7. package/dist/app/friday/model.py +124 -0
  8. package/dist/app/friday/tool/agentscope_tools.py +159 -0
  9. package/dist/app/friday/tool/utils.py +161 -0
  10. package/dist/app/friday/utils/common.py +28 -0
  11. package/dist/app/friday/utils/connect.py +63 -0
  12. package/dist/app/friday/utils/constants.py +8 -0
  13. package/dist/app/requirements.txt +1 -0
  14. package/dist/public/assets/001-aaron-Bb4ZO8rt.js +1 -0
  15. package/dist/public/assets/001-little girl-CnyQBZ0k.js +1 -0
  16. package/dist/public/assets/001-man-16-BO6NLPD_.js +1 -0
  17. package/dist/public/assets/002-avatar-C3FPnFjo.js +1 -0
  18. package/dist/public/assets/002-man-15-DfiiX2xR.js +1 -0
  19. package/dist/public/assets/002-old man-D4L-hA2l.js +1 -0
  20. package/dist/public/assets/003-avatar-UMXD80xE.js +1 -0
  21. package/dist/public/assets/003-cat-Cgyj1qJU.js +1 -0
  22. package/dist/public/assets/003-woman-20-Dy0WdjIG.js +1 -0
  23. package/dist/public/assets/004-avatar-D6Aw4tpO.js +1 -0
  24. package/dist/public/assets/004-dog-DUajs1ZO.js +1 -0
  25. package/dist/public/assets/004-woman-19-D5go5okE.js +1 -0
  26. package/dist/public/assets/005-avatar-NNQ3sWMe.js +1 -0
  27. package/dist/public/assets/005-child-SN-FoL0R.js +1 -0
  28. package/dist/public/assets/005-woman-18-AedSRg8a.js +1 -0
  29. package/dist/public/assets/006-avatar-FD8IUNL_.js +1 -0
  30. package/dist/public/assets/006-grandpa-T90IdpYr.js +1 -0
  31. package/dist/public/assets/006-man-14-DuMA-IZ-.js +1 -0
  32. package/dist/public/assets/007-avatar-eSQZtpkg.js +1 -0
  33. package/dist/public/assets/007-grandson-DV7UWhrR.js +1 -0
  34. package/dist/public/assets/007-man-13-owFTee2M.js +1 -0
  35. package/dist/public/assets/008-avatar-B9Rcm8D2.js +1 -0
  36. package/dist/public/assets/008-grandmother-1-BrQNVu9I.js +1 -0
  37. package/dist/public/assets/008-teenager-ClYxB7sG.js +1 -0
  38. package/dist/public/assets/009-avatar-DNSTEyOZ.js +1 -0
  39. package/dist/public/assets/009-grandfather-1-CPOn7LN0.js +1 -0
  40. package/dist/public/assets/009-grandmother-BAW_dEQC.js +1 -0
  41. package/dist/public/assets/010-avatar-CRXWH-A0.js +1 -0
  42. package/dist/public/assets/010-boy-1-C21LhAEr.js +1 -0
  43. package/dist/public/assets/011-woman-17-CI0UoPMR.js +1 -0
  44. package/dist/public/assets/012-avatar-BO5j-gGw.js +1 -0
  45. package/dist/public/assets/012-boy-T-hL8z9d.js +1 -0
  46. package/dist/public/assets/012-niece-M-tDMWMW.js +1 -0
  47. package/dist/public/assets/013-avatar-BTyOVKVo.js +1 -0
  48. package/dist/public/assets/013-granddaughter-D4VonRL-.js +1 -0
  49. package/dist/public/assets/013-woman-16-CuR7_ppw.js +1 -0
  50. package/dist/public/assets/014-avatar-DAW_Hvos.js +1 -0
  51. package/dist/public/assets/014-man-k8AXOF1Q.js +1 -0
  52. package/dist/public/assets/014-nurse-DnVigtmM.js +1 -0
  53. package/dist/public/assets/015-avatar-AxHR3j7h.js +1 -0
  54. package/dist/public/assets/015-woman-15-rDPwBxxc.js +1 -0
  55. package/dist/public/assets/015-woman-B71QRPrr.js +1 -0
  56. package/dist/public/assets/016-avatar-BVbMUisT.js +1 -0
  57. package/dist/public/assets/016-boy-BV_jzAu3.js +1 -0
  58. package/dist/public/assets/016-woman-14-D08zoPt9.js +1 -0
  59. package/dist/public/assets/017-gaming-BEpEpa1H.js +1 -0
  60. package/dist/public/assets/017-superpower-9xQAqiKN.js +1 -0
  61. package/dist/public/assets/017-uncle-EB1lmqAo.js +1 -0
  62. package/dist/public/assets/017-woman-13-BFsTAnGR.js +1 -0
  63. package/dist/public/assets/018-avatar-CnCLJXqW.js +1 -0
  64. package/dist/public/assets/018-young-QpIX6g3z.js +1 -0
  65. package/dist/public/assets/019-gaming-Dz5tR0Te.js +1 -0
  66. package/dist/public/assets/019-man-12-DiRb1dri.js +1 -0
  67. package/dist/public/assets/019-nephew-tXAgA9cr.js +1 -0
  68. package/dist/public/assets/020-avatar-Djtnu7jj.js +1 -0
  69. package/dist/public/assets/020-man-11-BNIZQyX4.js +1 -0
  70. package/dist/public/assets/020-young woman-BzklF8tq.js +1 -0
  71. package/dist/public/assets/021-aunt-CX9ikaTy.js +1 -0
  72. package/dist/public/assets/021-avatar-DP2sODK2.js +1 -0
  73. package/dist/public/assets/021-superhero-CIWREXp0.js +1 -0
  74. package/dist/public/assets/021-wizard-Dc9X50m_.js +1 -0
  75. package/dist/public/assets/021-woman-12-n9ipJK5z.js +1 -0
  76. package/dist/public/assets/022-father-B1_-ZTn1.js +1 -0
  77. package/dist/public/assets/022-woman-11-BUCsm06E.js +1 -0
  78. package/dist/public/assets/023-avatar-TeJ6vGqs.js +1 -0
  79. package/dist/public/assets/023-ghost-BYvGsa7H.js +1 -0
  80. package/dist/public/assets/023-man-10-Dfii-GE1.js +1 -0
  81. package/dist/public/assets/023-uncle-DoAMe1Iy.js +1 -0
  82. package/dist/public/assets/024-gaming-5ovd4aeT.js +1 -0
  83. package/dist/public/assets/024-man-9-CEenp_2W.js +1 -0
  84. package/dist/public/assets/024-prince-Fx3eCiNX.js +1 -0
  85. package/dist/public/assets/024-uncle-B6tqhqxU.js +1 -0
  86. package/dist/public/assets/025-gaming-CdlTp3Ub.js +1 -0
  87. package/dist/public/assets/025-man-8-Cfp6jNt4.js +1 -0
  88. package/dist/public/assets/025-man-BxhR-XTO.js +1 -0
  89. package/dist/public/assets/025-princess-Di5TdSnG.js +1 -0
  90. package/dist/public/assets/026-avatar-DojOPRVd.js +1 -0
  91. package/dist/public/assets/026-dad-CHaoMWM5.js +1 -0
  92. package/dist/public/assets/026-owl-Dl-UtZM8.js +1 -0
  93. package/dist/public/assets/026-woman-10-CywXJiaj.js +1 -0
  94. package/dist/public/assets/027-avatar-CrEyLmOb.js +1 -0
  95. package/dist/public/assets/027-girl-Box_GaMO.js +1 -0
  96. package/dist/public/assets/028-gaming-CmOZ2uGp.js +1 -0
  97. package/dist/public/assets/028-mom-tEacX7K4.js +1 -0
  98. package/dist/public/assets/028-woman-9-C1oq4sFk.js +1 -0
  99. package/dist/public/assets/029-boy-CVg6oMuZ.js +1 -0
  100. package/dist/public/assets/029-man-7-C4eeEeTQ.js +1 -0
  101. package/dist/public/assets/030-elf-C8vikAvx.js +1 -0
  102. package/dist/public/assets/030-gaming-ufCRMN7S.js +1 -0
  103. package/dist/public/assets/030-granddaughter-DVCp3D8k.js +1 -0
  104. package/dist/public/assets/030-woman-8-Bv_tRQci.js +1 -0
  105. package/dist/public/assets/031-avatar-D0u5HVaC.js +1 -0
  106. package/dist/public/assets/031-grandpa-jKj5oB8I.js +1 -0
  107. package/dist/public/assets/031-superhero-DfSkK-j2.js +1 -0
  108. package/dist/public/assets/031-woman-7-DJHfCbTS.js +1 -0
  109. package/dist/public/assets/032-avatar-BvY6LKIZ.js +1 -0
  110. package/dist/public/assets/032-grandson-DIjRxDr-.js +1 -0
  111. package/dist/public/assets/032-man-6-CU7pJmmt.js +1 -0
  112. package/dist/public/assets/033-avatar-Dviobgw8.js +1 -0
  113. package/dist/public/assets/033-elf-CTAEJgfN.js +1 -0
  114. package/dist/public/assets/033-grandfather-BCXPgoJj.js +1 -0
  115. package/dist/public/assets/033-man-5-wgMylvNO.js +1 -0
  116. package/dist/public/assets/034-avatar-BqtUHT3_.js +1 -0
  117. package/dist/public/assets/034-little girl-CrgnV25d.js +1 -0
  118. package/dist/public/assets/034-man-4-DJdzfcSi.js +1 -0
  119. package/dist/public/assets/035-gaming-Bp8xnJp_.js +1 -0
  120. package/dist/public/assets/035-mother-Ccg5FDO8.js +1 -0
  121. package/dist/public/assets/036-avatar-q6pZKQVf.js +1 -0
  122. package/dist/public/assets/036-father-DzpzeKJJ.js +1 -0
  123. package/dist/public/assets/036-goblin-vDsj4aP0.js +1 -0
  124. package/dist/public/assets/036-grandmother-BI_Fl_aR.js +1 -0
  125. package/dist/public/assets/037-avatar-CmfvVc7v.js +1 -0
  126. package/dist/public/assets/037-grandfather-Dtp4XH-s.js +1 -0
  127. package/dist/public/assets/037-sister-BQv83Uhf.js +1 -0
  128. package/dist/public/assets/038-gaming-UtXFtv5k.js +1 -0
  129. package/dist/public/assets/038-girl-Cwg5Rv36.js +1 -0
  130. package/dist/public/assets/038-gnome-HbogTmVa.js +1 -0
  131. package/dist/public/assets/038-woman-6-B7jMwsP0.js +1 -0
  132. package/dist/public/assets/039-avatar-Bb3kVg4l.js +1 -0
  133. package/dist/public/assets/039-man-3-BSjLnoLV.js +1 -0
  134. package/dist/public/assets/039-student-CIi32WG9.js +1 -0
  135. package/dist/public/assets/040-aunt-B5XQH_sJ.js +1 -0
  136. package/dist/public/assets/040-gaming-CzTjib4v.js +1 -0
  137. package/dist/public/assets/040-vampire-UFzaHu5c.js +1 -0
  138. package/dist/public/assets/040-woman-5-Byal-gfX.js +1 -0
  139. package/dist/public/assets/041-avatar-CPQN2PvT.js +1 -0
  140. package/dist/public/assets/041-little boy-DUZFMrmJ.js +1 -0
  141. package/dist/public/assets/041-queen-CqFzW3uO.js +1 -0
  142. package/dist/public/assets/041-woman-4-CKi_Q-ns.js +1 -0
  143. package/dist/public/assets/042-avatar-BatY-WQG.js +1 -0
  144. package/dist/public/assets/042-cyclops-DAxxBVqG.js +1 -0
  145. package/dist/public/assets/042-man-omzAnpu1.js +1 -0
  146. package/dist/public/assets/042-woman-3-2Ki1Qz3j.js +1 -0
  147. package/dist/public/assets/043-avatar-DN026abg.js +1 -0
  148. package/dist/public/assets/043-child-D8_xXkcm.js +1 -0
  149. package/dist/public/assets/043-genie-DK78Ykl6.js +1 -0
  150. package/dist/public/assets/043-woman-2-DMnB0A-0.js +1 -0
  151. package/dist/public/assets/044-avatar-Bz2FAXUw.js +1 -0
  152. package/dist/public/assets/044-avatar-DzDIyuj0.js +1 -0
  153. package/dist/public/assets/044-fairy-BT73odE0.js +1 -0
  154. package/dist/public/assets/044-sister-CtNPPHh-.js +1 -0
  155. package/dist/public/assets/045-avatar-DgiFAlxj.js +1 -0
  156. package/dist/public/assets/045-man-2-BZPavI2b.js +1 -0
  157. package/dist/public/assets/045-young-B39gytpm.js +1 -0
  158. package/dist/public/assets/046-avatar-ClHeZPOV.js +1 -0
  159. package/dist/public/assets/046-brother-BSvJBKnA.js +1 -0
  160. package/dist/public/assets/046-witch-CVjM2-iJ.js +1 -0
  161. package/dist/public/assets/046-woman-1-CHWuzLfU.js +1 -0
  162. package/dist/public/assets/047-avatar-DM01i1ZC.js +1 -0
  163. package/dist/public/assets/047-king-knA4oWNa.js +1 -0
  164. package/dist/public/assets/047-man-1-DRWdGzL5.js +1 -0
  165. package/dist/public/assets/048-father-B0wiM2h6.js +1 -0
  166. package/dist/public/assets/048-gaming-D7s83-h3.js +1 -0
  167. package/dist/public/assets/048-girl-CxGcfLgU.js +1 -0
  168. package/dist/public/assets/049-avatar-BfGDVwlO.js +1 -0
  169. package/dist/public/assets/049-little boy-Bu5mmsUf.js +1 -0
  170. package/dist/public/assets/049-man-B3xcAso3.js +1 -0
  171. package/dist/public/assets/050-avatar-itJOA0dd.js +1 -0
  172. package/dist/public/assets/050-boy-DEIcVyYT.js +1 -0
  173. package/dist/public/assets/050-knight-KRUkfXDS.js +1 -0
  174. package/dist/public/assets/051-avatar-fISL-mLU.js +1 -0
  175. package/dist/public/assets/052-avatar-BYrM0aPD.js +1 -0
  176. package/dist/public/assets/053-avatar-B-rnufvm.js +1 -0
  177. package/dist/public/assets/054-avatar-B7rwS7Qv.js +1 -0
  178. package/dist/public/assets/055-gaming-DqUOmMvT.js +1 -0
  179. package/dist/public/assets/056-avatar-D1lb7KL9.js +1 -0
  180. package/dist/public/assets/057-avatar-Df7NRaJW.js +1 -0
  181. package/dist/public/assets/058-avatar-C8zso2zk.js +1 -0
  182. package/dist/public/assets/059-avatar-zEhHpOcr.js +1 -0
  183. package/dist/public/assets/060-avatar-DkNabW8M.js +1 -0
  184. package/dist/public/assets/index-CWvY7i3l.css +1 -0
  185. package/dist/public/assets/index-Zxr-JuKD.js +820 -0
  186. package/dist/public/index.html +14 -0
  187. package/dist/public/logo.svg +42 -0
  188. package/dist/server/src/dao/FridayAppMessage.js +103 -0
  189. package/dist/server/src/dao/InputRequest.js +99 -0
  190. package/dist/server/src/dao/Message.js +42 -0
  191. package/dist/server/src/dao/Reply.js +96 -0
  192. package/dist/server/src/dao/Run.js +395 -0
  193. package/dist/server/src/dao/Trace.js +643 -0
  194. package/dist/server/src/database.js +54 -0
  195. package/dist/server/src/index.js +211 -0
  196. package/dist/server/src/migrations/1730000000000-AddMessageReplyForeignKey.js +216 -0
  197. package/dist/server/src/migrations/1740000000000-MigrateSpanTable.js +638 -0
  198. package/dist/server/src/migrations/index.js +19 -0
  199. package/dist/server/src/models/FridayApp.js +69 -0
  200. package/dist/server/src/models/FridayAppView.js +94 -0
  201. package/dist/server/src/models/InputRequest.js +41 -0
  202. package/dist/server/src/models/Message.js +39 -0
  203. package/dist/server/src/models/ModelInvocationView.js +127 -0
  204. package/dist/server/src/models/Reply.js +50 -0
  205. package/dist/server/src/models/Run.js +63 -0
  206. package/dist/server/src/models/RunView.js +111 -0
  207. package/dist/server/src/models/Trace.js +154 -0
  208. package/dist/server/src/otel/grpc-server.js +154 -0
  209. package/dist/server/src/otel/opentelemetry/proto/collector/trace/v1/trace_service.js +309 -0
  210. package/dist/server/src/otel/opentelemetry/proto/common/v1/common.js +747 -0
  211. package/dist/server/src/otel/opentelemetry/proto/resource/v1/resource.js +170 -0
  212. package/dist/server/src/otel/opentelemetry/proto/trace/v1/trace.js +1134 -0
  213. package/dist/server/src/otel/processor.js +395 -0
  214. package/dist/server/src/otel/router.js +128 -0
  215. package/dist/server/src/services/ReplyingStateManager.js +21 -0
  216. package/dist/server/src/trpc/router.js +385 -0
  217. package/dist/server/src/trpc/socket.js +589 -0
  218. package/dist/server/src/utils/index.js +17 -0
  219. package/dist/server/src/utils/processUtils.js +27 -0
  220. package/dist/shared/src/config/client.js +6 -0
  221. package/dist/shared/src/config/common.js +32 -0
  222. package/dist/shared/src/config/friday.js +168 -0
  223. package/dist/shared/src/config/index.js +19 -0
  224. package/dist/shared/src/config/server.js +104 -0
  225. package/dist/shared/src/index.js +18 -0
  226. package/dist/shared/src/types/index.js +20 -0
  227. package/dist/shared/src/types/messageForm.js +25 -0
  228. package/dist/shared/src/types/trace.js +20 -0
  229. package/dist/shared/src/types/trpc.js +98 -0
  230. package/dist/shared/src/types/usage.js +7 -0
  231. package/dist/shared/src/utils/banner.js +74 -0
  232. package/dist/shared/src/utils/objectUtils.js +74 -0
  233. package/dist/shared/src/utils/terminal.js +30 -0
  234. package/dist/shared/src/utils/timeUtils.js +86 -0
  235. package/package.json +89 -0
@@ -0,0 +1,395 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RunDao = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const src_1 = require("../../../shared/src");
15
+ const Run_1 = require("../models/Run");
16
+ const RunView_1 = require("../models/RunView");
17
+ const utils_1 = require("../utils");
18
+ const Trace_1 = require("./Trace");
19
+ class RunDao {
20
+ static doesProjectExist(project) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ try {
23
+ const run = yield Run_1.RunTable.findOne({ where: { project } });
24
+ return run !== null;
25
+ }
26
+ catch (error) {
27
+ console.error(error);
28
+ throw error;
29
+ }
30
+ });
31
+ }
32
+ static doesRunExist(runId) {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ try {
35
+ const run = yield Run_1.RunTable.findOne({ where: { id: runId } });
36
+ return run !== null;
37
+ }
38
+ catch (error) {
39
+ console.error(error);
40
+ throw error;
41
+ }
42
+ });
43
+ }
44
+ static addRun(runData) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ try {
47
+ const run = Run_1.RunTable.create(Object.assign({}, runData));
48
+ yield run.save();
49
+ }
50
+ catch (error) {
51
+ console.error(error);
52
+ throw error;
53
+ }
54
+ });
55
+ }
56
+ /**
57
+ * Retrieve paginated projects with aggregated run statistics
58
+ *
59
+ * This method performs an optimized database query to fetch project data with:
60
+ * - Count of runs by status (running, pending, finished)
61
+ * - Total number of runs per project
62
+ * - Project creation timestamp (earliest run timestamp)
63
+ * - Support for pagination, sorting, and filtering
64
+ *
65
+ * @param pagination - Object containing page and pageSize
66
+ * @param pagination.page - Current page number (1-based)
67
+ * @param pagination.pageSize - Number of items per page
68
+ *
69
+ * @param sort - Optional sorting configuration
70
+ * @param sort.field - Field to sort by (project, running, pending, finished, total, createdAt)
71
+ * @param sort.order - Sort direction ('asc' or 'desc')
72
+ *
73
+ * @param filters - Optional filters for querying
74
+ * @param filters.project - Project name filter (uses LIKE for partial matching)
75
+ *
76
+ * @returns Promise resolving to TableData structure containing:
77
+ * - list: Array of ProjectData objects
78
+ * - total: Total number of projects (before pagination)
79
+ * - page: Current page number
80
+ * - pageSize: Items per page
81
+ *
82
+ * @throws Error if database query fails
83
+ *
84
+ * @example
85
+ * const result = await RunDao.getProjects(
86
+ * { page: 1, pageSize: 10 },
87
+ * { field: 'total', order: 'desc' },
88
+ * { project: 'agent' }
89
+ * );
90
+ * // Returns: { list: [...], total: 25, page: 1, pageSize: 10 }
91
+ */
92
+ static getProjects(pagination, sort, filters) {
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ var _a;
95
+ try {
96
+ // Build base query with aggregations using parameterized queries
97
+ let queryBuilder = Run_1.RunTable.createQueryBuilder('run')
98
+ .select('run.project', 'project')
99
+ .addSelect('SUM(CASE WHEN run.status = :runningStatus THEN 1 ELSE 0 END)', 'running')
100
+ .addSelect('SUM(CASE WHEN run.status = :pendingStatus THEN 1 ELSE 0 END)', 'pending')
101
+ .addSelect('SUM(CASE WHEN run.status = :doneStatus THEN 1 ELSE 0 END)', 'finished')
102
+ .addSelect('COUNT(*)', 'total')
103
+ .addSelect('MIN(run.timestamp)', 'createdAt')
104
+ .groupBy('run.project')
105
+ .setParameters({
106
+ runningStatus: src_1.Status.RUNNING,
107
+ pendingStatus: src_1.Status.PENDING,
108
+ doneStatus: src_1.Status.DONE,
109
+ });
110
+ // Apply filters using HAVING (since we're using GROUP BY)
111
+ if (filters === null || filters === void 0 ? void 0 : filters.project) {
112
+ queryBuilder = queryBuilder.having('run.project LIKE :projectFilter', {
113
+ projectFilter: `%${filters.project}%`,
114
+ });
115
+ }
116
+ // Apply sorting
117
+ const sortField = (sort === null || sort === void 0 ? void 0 : sort.field) || 'createdAt';
118
+ const sortOrder = (((_a = sort === null || sort === void 0 ? void 0 : sort.order) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || 'DESC');
119
+ switch (sortField) {
120
+ case 'project':
121
+ queryBuilder.orderBy('run.project', sortOrder);
122
+ break;
123
+ case 'running':
124
+ case 'pending':
125
+ case 'finished':
126
+ case 'total':
127
+ case 'createdAt':
128
+ queryBuilder.orderBy(sortField, sortOrder);
129
+ break;
130
+ default:
131
+ queryBuilder.orderBy('createdAt', 'DESC');
132
+ }
133
+ // Clone query for count (before pagination)
134
+ const countQuery = queryBuilder.clone();
135
+ const totalResult = yield countQuery.getRawMany();
136
+ const total = totalResult.length;
137
+ // Apply pagination
138
+ const offset = (pagination.page - 1) * pagination.pageSize;
139
+ queryBuilder.limit(pagination.pageSize).offset(offset);
140
+ // Execute paginated query
141
+ const result = yield queryBuilder.getRawMany();
142
+ // Map results to ProjectData type
143
+ const list = result.map((row) => ({
144
+ project: row.project,
145
+ running: Number(row.running) || 0,
146
+ pending: Number(row.pending) || 0,
147
+ finished: Number(row.finished) || 0,
148
+ total: Number(row.total) || 0,
149
+ createdAt: row.createdAt,
150
+ }));
151
+ return {
152
+ list,
153
+ total,
154
+ page: pagination.page,
155
+ pageSize: pagination.pageSize,
156
+ };
157
+ }
158
+ catch (error) {
159
+ console.error('Error in getProjects:', error);
160
+ throw error;
161
+ }
162
+ });
163
+ }
164
+ static getAllProjects() {
165
+ return __awaiter(this, void 0, void 0, function* () {
166
+ try {
167
+ const result = yield Run_1.RunTable.createQueryBuilder('run')
168
+ .select('DISTINCT run.project', 'project')
169
+ .addSelect((qb) => qb
170
+ .select('COUNT(*)')
171
+ .from(Run_1.RunTable, 'r')
172
+ .where('r.project = run.project')
173
+ .andWhere('r.status = :running', {
174
+ running: src_1.Status.RUNNING,
175
+ }), 'running')
176
+ .addSelect((qb) => qb
177
+ .select('COUNT(*)')
178
+ .from(Run_1.RunTable, 'r')
179
+ .where('r.project = run.project')
180
+ .andWhere('r.status = :pending', {
181
+ pending: src_1.Status.PENDING,
182
+ }), 'pending')
183
+ .addSelect((qb) => qb
184
+ .select('COUNT(*)')
185
+ .from(Run_1.RunTable, 'r')
186
+ .where('r.project = run.project')
187
+ .andWhere('r.status = :finished', {
188
+ finished: src_1.Status.DONE,
189
+ }), 'finished')
190
+ .addSelect((qb) => qb
191
+ .select('MIN(r.timestamp)')
192
+ .from(Run_1.RunTable, 'r')
193
+ .where('r.project = run.project'), 'createdAt')
194
+ .groupBy('run.project')
195
+ .getRawMany();
196
+ return result.map((row) => ({
197
+ project: row.project,
198
+ running: parseInt(row.running),
199
+ pending: parseInt(row.pending),
200
+ finished: parseInt(row.finished),
201
+ total: parseInt(row.running) +
202
+ parseInt(row.pending) +
203
+ parseInt(row.finished),
204
+ createdAt: row.createdAt,
205
+ }));
206
+ }
207
+ catch (error) {
208
+ console.error(error);
209
+ throw error;
210
+ }
211
+ });
212
+ }
213
+ /*
214
+ * Get all runs for a project
215
+ */
216
+ static getAllProjectRuns(project) {
217
+ return __awaiter(this, void 0, void 0, function* () {
218
+ try {
219
+ const result = yield Run_1.RunTable.find({
220
+ where: { project },
221
+ order: { timestamp: 'DESC' },
222
+ });
223
+ return result.map((row) => ({
224
+ id: row.id,
225
+ project: row.project,
226
+ name: row.name,
227
+ timestamp: row.timestamp,
228
+ run_dir: row.run_dir,
229
+ pid: row.pid,
230
+ status: row.status,
231
+ }));
232
+ }
233
+ catch (error) {
234
+ console.error(error);
235
+ throw error;
236
+ }
237
+ });
238
+ }
239
+ static getRunData(runId) {
240
+ return __awaiter(this, void 0, void 0, function* () {
241
+ try {
242
+ const result = yield Run_1.RunTable.findOne({
243
+ where: { id: runId },
244
+ relations: ['replies', 'replies.messages', 'inputRequests'],
245
+ });
246
+ const spans = yield Trace_1.SpanDao.getSpansByConversationId(runId);
247
+ if (result) {
248
+ return {
249
+ runData: {
250
+ id: result.id,
251
+ project: result.project,
252
+ name: result.name,
253
+ timestamp: result.timestamp,
254
+ run_dir: result.run_dir,
255
+ pid: result.pid,
256
+ status: result.status,
257
+ },
258
+ inputRequests: result.inputRequests.map((row) => ({
259
+ requestId: row.requestId,
260
+ agentId: row.agentId,
261
+ agentName: row.agentName,
262
+ structuredInput: row.structuredInput,
263
+ })),
264
+ replies: result.replies.map((row) => ({
265
+ replyId: row.replyId,
266
+ replyRole: row.replyRole,
267
+ replyName: row.replyName,
268
+ createdAt: row.createdAt,
269
+ finishedAt: row.finishedAt,
270
+ messages: row.messages.map((msg) => ({
271
+ id: msg.id,
272
+ name: msg.msg.name,
273
+ role: msg.msg.role,
274
+ content: msg.msg.content,
275
+ timestamp: msg.msg.timestamp,
276
+ metadata: msg.msg.metadata,
277
+ })),
278
+ })),
279
+ spans: spans,
280
+ };
281
+ }
282
+ else {
283
+ throw new Error(`Run with id ${runId} not found`);
284
+ }
285
+ }
286
+ catch (error) {
287
+ console.error(error);
288
+ throw error;
289
+ }
290
+ });
291
+ }
292
+ static changeRunStatus(runId, newStatus) {
293
+ return __awaiter(this, void 0, void 0, function* () {
294
+ try {
295
+ const run = yield Run_1.RunTable.findOne({ where: { id: runId } });
296
+ if (run) {
297
+ run.status = newStatus;
298
+ yield run.save();
299
+ }
300
+ else {
301
+ throw new Error(`Run with id ${runId} not found`);
302
+ }
303
+ }
304
+ catch (error) {
305
+ console.error(error);
306
+ throw error;
307
+ }
308
+ });
309
+ }
310
+ static updateRunStatusAtBeginning() {
311
+ return __awaiter(this, void 0, void 0, function* () {
312
+ try {
313
+ const runs = yield Run_1.RunTable.find({
314
+ where: [{ status: src_1.Status.RUNNING }, { status: src_1.Status.PENDING }],
315
+ });
316
+ for (const run of runs) {
317
+ const processExists = yield (0, utils_1.checkProcessByPid)(run.pid);
318
+ if (!processExists) {
319
+ run.status = src_1.Status.DONE;
320
+ yield run.save();
321
+ }
322
+ }
323
+ }
324
+ catch (error) {
325
+ console.error(error);
326
+ throw error;
327
+ }
328
+ });
329
+ }
330
+ static getRunViewData() {
331
+ return __awaiter(this, void 0, void 0, function* () {
332
+ // Get run view data
333
+ const runViewData = yield RunView_1.RunView.find();
334
+ // Search four projects that are updated most recently
335
+ const recentProjects = yield Run_1.RunTable.createQueryBuilder('run')
336
+ .select('run.project', 'project')
337
+ .addSelect('MAX(run.timestamp)', 'lastUpdateTime')
338
+ .addSelect('COUNT(*)', 'runCount')
339
+ // 按项目分组
340
+ .groupBy('run.project')
341
+ // 按最后更新时间降序排序
342
+ .orderBy('lastUpdateTime', 'DESC')
343
+ // 限制返回4个结果
344
+ .limit(4)
345
+ .getRawMany();
346
+ return Object.assign(Object.assign({}, runViewData[0]), { recentProjects: recentProjects.map((project) => ({
347
+ name: project.project,
348
+ lastUpdateTime: project.lastUpdateTime,
349
+ runCount: parseInt(project.runCount),
350
+ })) });
351
+ });
352
+ }
353
+ static deleteRuns(runIds) {
354
+ return __awaiter(this, void 0, void 0, function* () {
355
+ try {
356
+ if (runIds.length > 0) {
357
+ yield Trace_1.SpanDao.deleteSpansByConversationIds(runIds);
358
+ }
359
+ const conditions = {
360
+ id: (0, typeorm_1.In)(runIds),
361
+ };
362
+ const result = yield Run_1.RunTable.delete(conditions);
363
+ return result.affected;
364
+ }
365
+ catch (error) {
366
+ console.error('Error deleting runs:', error);
367
+ throw error;
368
+ }
369
+ });
370
+ }
371
+ static deleteProjects(projects) {
372
+ return __awaiter(this, void 0, void 0, function* () {
373
+ try {
374
+ const runsToDelete = yield Run_1.RunTable.find({
375
+ where: { project: (0, typeorm_1.In)(projects) },
376
+ select: ['id'],
377
+ });
378
+ const runIds = runsToDelete.map((run) => run.id);
379
+ if (runIds.length > 0) {
380
+ yield Trace_1.SpanDao.deleteSpansByConversationIds(runIds);
381
+ }
382
+ const conditions = {
383
+ project: (0, typeorm_1.In)(projects),
384
+ };
385
+ const result = yield Run_1.RunTable.delete(conditions);
386
+ return result.affected;
387
+ }
388
+ catch (error) {
389
+ console.error('Error deleting projects:', error);
390
+ throw error;
391
+ }
392
+ });
393
+ }
394
+ }
395
+ exports.RunDao = RunDao;