@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.
- package/LICENSE +202 -0
- package/README.md +158 -0
- package/bin/cli.js +7 -0
- package/dist/app/friday/args.py +65 -0
- package/dist/app/friday/hook.py +52 -0
- package/dist/app/friday/main.py +164 -0
- package/dist/app/friday/model.py +124 -0
- package/dist/app/friday/tool/agentscope_tools.py +159 -0
- package/dist/app/friday/tool/utils.py +161 -0
- package/dist/app/friday/utils/common.py +28 -0
- package/dist/app/friday/utils/connect.py +63 -0
- package/dist/app/friday/utils/constants.py +8 -0
- package/dist/app/requirements.txt +1 -0
- package/dist/public/assets/001-aaron-Bb4ZO8rt.js +1 -0
- package/dist/public/assets/001-little girl-CnyQBZ0k.js +1 -0
- package/dist/public/assets/001-man-16-BO6NLPD_.js +1 -0
- package/dist/public/assets/002-avatar-C3FPnFjo.js +1 -0
- package/dist/public/assets/002-man-15-DfiiX2xR.js +1 -0
- package/dist/public/assets/002-old man-D4L-hA2l.js +1 -0
- package/dist/public/assets/003-avatar-UMXD80xE.js +1 -0
- package/dist/public/assets/003-cat-Cgyj1qJU.js +1 -0
- package/dist/public/assets/003-woman-20-Dy0WdjIG.js +1 -0
- package/dist/public/assets/004-avatar-D6Aw4tpO.js +1 -0
- package/dist/public/assets/004-dog-DUajs1ZO.js +1 -0
- package/dist/public/assets/004-woman-19-D5go5okE.js +1 -0
- package/dist/public/assets/005-avatar-NNQ3sWMe.js +1 -0
- package/dist/public/assets/005-child-SN-FoL0R.js +1 -0
- package/dist/public/assets/005-woman-18-AedSRg8a.js +1 -0
- package/dist/public/assets/006-avatar-FD8IUNL_.js +1 -0
- package/dist/public/assets/006-grandpa-T90IdpYr.js +1 -0
- package/dist/public/assets/006-man-14-DuMA-IZ-.js +1 -0
- package/dist/public/assets/007-avatar-eSQZtpkg.js +1 -0
- package/dist/public/assets/007-grandson-DV7UWhrR.js +1 -0
- package/dist/public/assets/007-man-13-owFTee2M.js +1 -0
- package/dist/public/assets/008-avatar-B9Rcm8D2.js +1 -0
- package/dist/public/assets/008-grandmother-1-BrQNVu9I.js +1 -0
- package/dist/public/assets/008-teenager-ClYxB7sG.js +1 -0
- package/dist/public/assets/009-avatar-DNSTEyOZ.js +1 -0
- package/dist/public/assets/009-grandfather-1-CPOn7LN0.js +1 -0
- package/dist/public/assets/009-grandmother-BAW_dEQC.js +1 -0
- package/dist/public/assets/010-avatar-CRXWH-A0.js +1 -0
- package/dist/public/assets/010-boy-1-C21LhAEr.js +1 -0
- package/dist/public/assets/011-woman-17-CI0UoPMR.js +1 -0
- package/dist/public/assets/012-avatar-BO5j-gGw.js +1 -0
- package/dist/public/assets/012-boy-T-hL8z9d.js +1 -0
- package/dist/public/assets/012-niece-M-tDMWMW.js +1 -0
- package/dist/public/assets/013-avatar-BTyOVKVo.js +1 -0
- package/dist/public/assets/013-granddaughter-D4VonRL-.js +1 -0
- package/dist/public/assets/013-woman-16-CuR7_ppw.js +1 -0
- package/dist/public/assets/014-avatar-DAW_Hvos.js +1 -0
- package/dist/public/assets/014-man-k8AXOF1Q.js +1 -0
- package/dist/public/assets/014-nurse-DnVigtmM.js +1 -0
- package/dist/public/assets/015-avatar-AxHR3j7h.js +1 -0
- package/dist/public/assets/015-woman-15-rDPwBxxc.js +1 -0
- package/dist/public/assets/015-woman-B71QRPrr.js +1 -0
- package/dist/public/assets/016-avatar-BVbMUisT.js +1 -0
- package/dist/public/assets/016-boy-BV_jzAu3.js +1 -0
- package/dist/public/assets/016-woman-14-D08zoPt9.js +1 -0
- package/dist/public/assets/017-gaming-BEpEpa1H.js +1 -0
- package/dist/public/assets/017-superpower-9xQAqiKN.js +1 -0
- package/dist/public/assets/017-uncle-EB1lmqAo.js +1 -0
- package/dist/public/assets/017-woman-13-BFsTAnGR.js +1 -0
- package/dist/public/assets/018-avatar-CnCLJXqW.js +1 -0
- package/dist/public/assets/018-young-QpIX6g3z.js +1 -0
- package/dist/public/assets/019-gaming-Dz5tR0Te.js +1 -0
- package/dist/public/assets/019-man-12-DiRb1dri.js +1 -0
- package/dist/public/assets/019-nephew-tXAgA9cr.js +1 -0
- package/dist/public/assets/020-avatar-Djtnu7jj.js +1 -0
- package/dist/public/assets/020-man-11-BNIZQyX4.js +1 -0
- package/dist/public/assets/020-young woman-BzklF8tq.js +1 -0
- package/dist/public/assets/021-aunt-CX9ikaTy.js +1 -0
- package/dist/public/assets/021-avatar-DP2sODK2.js +1 -0
- package/dist/public/assets/021-superhero-CIWREXp0.js +1 -0
- package/dist/public/assets/021-wizard-Dc9X50m_.js +1 -0
- package/dist/public/assets/021-woman-12-n9ipJK5z.js +1 -0
- package/dist/public/assets/022-father-B1_-ZTn1.js +1 -0
- package/dist/public/assets/022-woman-11-BUCsm06E.js +1 -0
- package/dist/public/assets/023-avatar-TeJ6vGqs.js +1 -0
- package/dist/public/assets/023-ghost-BYvGsa7H.js +1 -0
- package/dist/public/assets/023-man-10-Dfii-GE1.js +1 -0
- package/dist/public/assets/023-uncle-DoAMe1Iy.js +1 -0
- package/dist/public/assets/024-gaming-5ovd4aeT.js +1 -0
- package/dist/public/assets/024-man-9-CEenp_2W.js +1 -0
- package/dist/public/assets/024-prince-Fx3eCiNX.js +1 -0
- package/dist/public/assets/024-uncle-B6tqhqxU.js +1 -0
- package/dist/public/assets/025-gaming-CdlTp3Ub.js +1 -0
- package/dist/public/assets/025-man-8-Cfp6jNt4.js +1 -0
- package/dist/public/assets/025-man-BxhR-XTO.js +1 -0
- package/dist/public/assets/025-princess-Di5TdSnG.js +1 -0
- package/dist/public/assets/026-avatar-DojOPRVd.js +1 -0
- package/dist/public/assets/026-dad-CHaoMWM5.js +1 -0
- package/dist/public/assets/026-owl-Dl-UtZM8.js +1 -0
- package/dist/public/assets/026-woman-10-CywXJiaj.js +1 -0
- package/dist/public/assets/027-avatar-CrEyLmOb.js +1 -0
- package/dist/public/assets/027-girl-Box_GaMO.js +1 -0
- package/dist/public/assets/028-gaming-CmOZ2uGp.js +1 -0
- package/dist/public/assets/028-mom-tEacX7K4.js +1 -0
- package/dist/public/assets/028-woman-9-C1oq4sFk.js +1 -0
- package/dist/public/assets/029-boy-CVg6oMuZ.js +1 -0
- package/dist/public/assets/029-man-7-C4eeEeTQ.js +1 -0
- package/dist/public/assets/030-elf-C8vikAvx.js +1 -0
- package/dist/public/assets/030-gaming-ufCRMN7S.js +1 -0
- package/dist/public/assets/030-granddaughter-DVCp3D8k.js +1 -0
- package/dist/public/assets/030-woman-8-Bv_tRQci.js +1 -0
- package/dist/public/assets/031-avatar-D0u5HVaC.js +1 -0
- package/dist/public/assets/031-grandpa-jKj5oB8I.js +1 -0
- package/dist/public/assets/031-superhero-DfSkK-j2.js +1 -0
- package/dist/public/assets/031-woman-7-DJHfCbTS.js +1 -0
- package/dist/public/assets/032-avatar-BvY6LKIZ.js +1 -0
- package/dist/public/assets/032-grandson-DIjRxDr-.js +1 -0
- package/dist/public/assets/032-man-6-CU7pJmmt.js +1 -0
- package/dist/public/assets/033-avatar-Dviobgw8.js +1 -0
- package/dist/public/assets/033-elf-CTAEJgfN.js +1 -0
- package/dist/public/assets/033-grandfather-BCXPgoJj.js +1 -0
- package/dist/public/assets/033-man-5-wgMylvNO.js +1 -0
- package/dist/public/assets/034-avatar-BqtUHT3_.js +1 -0
- package/dist/public/assets/034-little girl-CrgnV25d.js +1 -0
- package/dist/public/assets/034-man-4-DJdzfcSi.js +1 -0
- package/dist/public/assets/035-gaming-Bp8xnJp_.js +1 -0
- package/dist/public/assets/035-mother-Ccg5FDO8.js +1 -0
- package/dist/public/assets/036-avatar-q6pZKQVf.js +1 -0
- package/dist/public/assets/036-father-DzpzeKJJ.js +1 -0
- package/dist/public/assets/036-goblin-vDsj4aP0.js +1 -0
- package/dist/public/assets/036-grandmother-BI_Fl_aR.js +1 -0
- package/dist/public/assets/037-avatar-CmfvVc7v.js +1 -0
- package/dist/public/assets/037-grandfather-Dtp4XH-s.js +1 -0
- package/dist/public/assets/037-sister-BQv83Uhf.js +1 -0
- package/dist/public/assets/038-gaming-UtXFtv5k.js +1 -0
- package/dist/public/assets/038-girl-Cwg5Rv36.js +1 -0
- package/dist/public/assets/038-gnome-HbogTmVa.js +1 -0
- package/dist/public/assets/038-woman-6-B7jMwsP0.js +1 -0
- package/dist/public/assets/039-avatar-Bb3kVg4l.js +1 -0
- package/dist/public/assets/039-man-3-BSjLnoLV.js +1 -0
- package/dist/public/assets/039-student-CIi32WG9.js +1 -0
- package/dist/public/assets/040-aunt-B5XQH_sJ.js +1 -0
- package/dist/public/assets/040-gaming-CzTjib4v.js +1 -0
- package/dist/public/assets/040-vampire-UFzaHu5c.js +1 -0
- package/dist/public/assets/040-woman-5-Byal-gfX.js +1 -0
- package/dist/public/assets/041-avatar-CPQN2PvT.js +1 -0
- package/dist/public/assets/041-little boy-DUZFMrmJ.js +1 -0
- package/dist/public/assets/041-queen-CqFzW3uO.js +1 -0
- package/dist/public/assets/041-woman-4-CKi_Q-ns.js +1 -0
- package/dist/public/assets/042-avatar-BatY-WQG.js +1 -0
- package/dist/public/assets/042-cyclops-DAxxBVqG.js +1 -0
- package/dist/public/assets/042-man-omzAnpu1.js +1 -0
- package/dist/public/assets/042-woman-3-2Ki1Qz3j.js +1 -0
- package/dist/public/assets/043-avatar-DN026abg.js +1 -0
- package/dist/public/assets/043-child-D8_xXkcm.js +1 -0
- package/dist/public/assets/043-genie-DK78Ykl6.js +1 -0
- package/dist/public/assets/043-woman-2-DMnB0A-0.js +1 -0
- package/dist/public/assets/044-avatar-Bz2FAXUw.js +1 -0
- package/dist/public/assets/044-avatar-DzDIyuj0.js +1 -0
- package/dist/public/assets/044-fairy-BT73odE0.js +1 -0
- package/dist/public/assets/044-sister-CtNPPHh-.js +1 -0
- package/dist/public/assets/045-avatar-DgiFAlxj.js +1 -0
- package/dist/public/assets/045-man-2-BZPavI2b.js +1 -0
- package/dist/public/assets/045-young-B39gytpm.js +1 -0
- package/dist/public/assets/046-avatar-ClHeZPOV.js +1 -0
- package/dist/public/assets/046-brother-BSvJBKnA.js +1 -0
- package/dist/public/assets/046-witch-CVjM2-iJ.js +1 -0
- package/dist/public/assets/046-woman-1-CHWuzLfU.js +1 -0
- package/dist/public/assets/047-avatar-DM01i1ZC.js +1 -0
- package/dist/public/assets/047-king-knA4oWNa.js +1 -0
- package/dist/public/assets/047-man-1-DRWdGzL5.js +1 -0
- package/dist/public/assets/048-father-B0wiM2h6.js +1 -0
- package/dist/public/assets/048-gaming-D7s83-h3.js +1 -0
- package/dist/public/assets/048-girl-CxGcfLgU.js +1 -0
- package/dist/public/assets/049-avatar-BfGDVwlO.js +1 -0
- package/dist/public/assets/049-little boy-Bu5mmsUf.js +1 -0
- package/dist/public/assets/049-man-B3xcAso3.js +1 -0
- package/dist/public/assets/050-avatar-itJOA0dd.js +1 -0
- package/dist/public/assets/050-boy-DEIcVyYT.js +1 -0
- package/dist/public/assets/050-knight-KRUkfXDS.js +1 -0
- package/dist/public/assets/051-avatar-fISL-mLU.js +1 -0
- package/dist/public/assets/052-avatar-BYrM0aPD.js +1 -0
- package/dist/public/assets/053-avatar-B-rnufvm.js +1 -0
- package/dist/public/assets/054-avatar-B7rwS7Qv.js +1 -0
- package/dist/public/assets/055-gaming-DqUOmMvT.js +1 -0
- package/dist/public/assets/056-avatar-D1lb7KL9.js +1 -0
- package/dist/public/assets/057-avatar-Df7NRaJW.js +1 -0
- package/dist/public/assets/058-avatar-C8zso2zk.js +1 -0
- package/dist/public/assets/059-avatar-zEhHpOcr.js +1 -0
- package/dist/public/assets/060-avatar-DkNabW8M.js +1 -0
- package/dist/public/assets/index-CWvY7i3l.css +1 -0
- package/dist/public/assets/index-Zxr-JuKD.js +820 -0
- package/dist/public/index.html +14 -0
- package/dist/public/logo.svg +42 -0
- package/dist/server/src/dao/FridayAppMessage.js +103 -0
- package/dist/server/src/dao/InputRequest.js +99 -0
- package/dist/server/src/dao/Message.js +42 -0
- package/dist/server/src/dao/Reply.js +96 -0
- package/dist/server/src/dao/Run.js +395 -0
- package/dist/server/src/dao/Trace.js +643 -0
- package/dist/server/src/database.js +54 -0
- package/dist/server/src/index.js +211 -0
- package/dist/server/src/migrations/1730000000000-AddMessageReplyForeignKey.js +216 -0
- package/dist/server/src/migrations/1740000000000-MigrateSpanTable.js +638 -0
- package/dist/server/src/migrations/index.js +19 -0
- package/dist/server/src/models/FridayApp.js +69 -0
- package/dist/server/src/models/FridayAppView.js +94 -0
- package/dist/server/src/models/InputRequest.js +41 -0
- package/dist/server/src/models/Message.js +39 -0
- package/dist/server/src/models/ModelInvocationView.js +127 -0
- package/dist/server/src/models/Reply.js +50 -0
- package/dist/server/src/models/Run.js +63 -0
- package/dist/server/src/models/RunView.js +111 -0
- package/dist/server/src/models/Trace.js +154 -0
- package/dist/server/src/otel/grpc-server.js +154 -0
- package/dist/server/src/otel/opentelemetry/proto/collector/trace/v1/trace_service.js +309 -0
- package/dist/server/src/otel/opentelemetry/proto/common/v1/common.js +747 -0
- package/dist/server/src/otel/opentelemetry/proto/resource/v1/resource.js +170 -0
- package/dist/server/src/otel/opentelemetry/proto/trace/v1/trace.js +1134 -0
- package/dist/server/src/otel/processor.js +395 -0
- package/dist/server/src/otel/router.js +128 -0
- package/dist/server/src/services/ReplyingStateManager.js +21 -0
- package/dist/server/src/trpc/router.js +385 -0
- package/dist/server/src/trpc/socket.js +589 -0
- package/dist/server/src/utils/index.js +17 -0
- package/dist/server/src/utils/processUtils.js +27 -0
- package/dist/shared/src/config/client.js +6 -0
- package/dist/shared/src/config/common.js +32 -0
- package/dist/shared/src/config/friday.js +168 -0
- package/dist/shared/src/config/index.js +19 -0
- package/dist/shared/src/config/server.js +104 -0
- package/dist/shared/src/index.js +18 -0
- package/dist/shared/src/types/index.js +20 -0
- package/dist/shared/src/types/messageForm.js +25 -0
- package/dist/shared/src/types/trace.js +20 -0
- package/dist/shared/src/types/trpc.js +98 -0
- package/dist/shared/src/types/usage.js +7 -0
- package/dist/shared/src/utils/banner.js +74 -0
- package/dist/shared/src/utils/objectUtils.js +74 -0
- package/dist/shared/src/utils/terminal.js +30 -0
- package/dist/shared/src/utils/timeUtils.js +86 -0
- 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;
|