@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,54 @@
|
|
|
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.initializeDatabase = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
const InputRequest_1 = require("./dao/InputRequest");
|
|
15
|
+
const Run_1 = require("./dao/Run");
|
|
16
|
+
const migrations_1 = require("./migrations");
|
|
17
|
+
const FridayApp_1 = require("./models/FridayApp");
|
|
18
|
+
const FridayAppView_1 = require("./models/FridayAppView");
|
|
19
|
+
const InputRequest_2 = require("./models/InputRequest");
|
|
20
|
+
const Message_1 = require("./models/Message");
|
|
21
|
+
const ModelInvocationView_1 = require("./models/ModelInvocationView");
|
|
22
|
+
const Reply_1 = require("./models/Reply");
|
|
23
|
+
const Run_2 = require("./models/Run");
|
|
24
|
+
const RunView_1 = require("./models/RunView");
|
|
25
|
+
const Trace_1 = require("./models/Trace");
|
|
26
|
+
const initializeDatabase = (databaseConfig) => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
try {
|
|
28
|
+
const options = Object.assign(Object.assign({}, databaseConfig), { entities: [
|
|
29
|
+
Run_2.RunTable,
|
|
30
|
+
RunView_1.RunView,
|
|
31
|
+
Message_1.MessageTable,
|
|
32
|
+
Reply_1.ReplyTable,
|
|
33
|
+
InputRequest_2.InputRequestTable,
|
|
34
|
+
Trace_1.SpanTable,
|
|
35
|
+
ModelInvocationView_1.ModelInvocationView,
|
|
36
|
+
FridayApp_1.FridayAppMessageTable,
|
|
37
|
+
FridayApp_1.FridayAppReplyTable,
|
|
38
|
+
FridayAppView_1.FridayAppReplyView,
|
|
39
|
+
], synchronize: true, migrations: migrations_1.migrations, migrationsRun: true, logging: false });
|
|
40
|
+
const dataSource = new typeorm_1.DataSource(options);
|
|
41
|
+
yield dataSource.initialize();
|
|
42
|
+
const printingOptions = Object.assign(Object.assign({}, options), { entities: undefined, migrations: undefined });
|
|
43
|
+
console.debug(`Database initialized with options: ${JSON.stringify(printingOptions, null, 2)}`);
|
|
44
|
+
console.debug('Refresh the database ...');
|
|
45
|
+
yield Run_1.RunDao.updateRunStatusAtBeginning();
|
|
46
|
+
yield InputRequest_1.InputRequestDao.updateInputRequests();
|
|
47
|
+
console.debug('Done');
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Error initializing database', error);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
exports.initializeDatabase = initializeDatabase;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
const trpcExpress = __importStar(require("@trpc/server/adapters/express"));
|
|
49
|
+
const express_1 = __importDefault(require("express"));
|
|
50
|
+
const http_1 = require("http");
|
|
51
|
+
const opener_1 = __importDefault(require("opener"));
|
|
52
|
+
const path_1 = __importDefault(require("path"));
|
|
53
|
+
const portfinder_1 = __importDefault(require("portfinder"));
|
|
54
|
+
const config_1 = require("../../shared/src/config");
|
|
55
|
+
const banner_1 = require("../../shared/src/utils/banner");
|
|
56
|
+
const terminal_1 = require("../../shared/src/utils/terminal");
|
|
57
|
+
const database_1 = require("./database");
|
|
58
|
+
const grpc_server_1 = require("./otel/grpc-server");
|
|
59
|
+
const router_1 = __importDefault(require("./otel/router"));
|
|
60
|
+
const router_2 = require("./trpc/router");
|
|
61
|
+
const socket_1 = require("./trpc/socket");
|
|
62
|
+
function initializeServer() {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
try {
|
|
65
|
+
// Initialize the configuration
|
|
66
|
+
const configManager = config_1.ConfigManager.getInstance();
|
|
67
|
+
const config = configManager.getConfig();
|
|
68
|
+
portfinder_1.default.basePort = config.port;
|
|
69
|
+
portfinder_1.default.highestPort = portfinder_1.default.basePort + 2000;
|
|
70
|
+
// Handle HTTP port
|
|
71
|
+
const availableHttpPort = yield portfinder_1.default.getPortPromise();
|
|
72
|
+
if (availableHttpPort !== config.port) {
|
|
73
|
+
console.log(`HTTP port ${config.port} is already in use.`);
|
|
74
|
+
// Check if running in interactive environment
|
|
75
|
+
const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
|
|
76
|
+
let useNewPort;
|
|
77
|
+
if (isInteractive) {
|
|
78
|
+
useNewPort = yield (0, terminal_1.promptUser)(`Would you like to start the HTTP server on port ${availableHttpPort} instead? (y/n): `);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Non-interactive mode: automatically use available port
|
|
82
|
+
console.log(`Automatically using available HTTP port ${availableHttpPort} (non-interactive mode)`);
|
|
83
|
+
useNewPort = true;
|
|
84
|
+
}
|
|
85
|
+
if (useNewPort) {
|
|
86
|
+
yield configManager.setPort(availableHttpPort);
|
|
87
|
+
console.log(`HTTP server will start on port ${availableHttpPort}`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log('Exiting...');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Handle gRPC port
|
|
95
|
+
portfinder_1.default.basePort = config.otelGrpcPort;
|
|
96
|
+
portfinder_1.default.highestPort = portfinder_1.default.basePort + 2000;
|
|
97
|
+
const availableGrpcPort = yield portfinder_1.default.getPortPromise();
|
|
98
|
+
if (availableGrpcPort !== config.otelGrpcPort) {
|
|
99
|
+
console.log(`[OTEL gRPC] port ${config.otelGrpcPort} is already in use.`);
|
|
100
|
+
// Check if running in interactive environment
|
|
101
|
+
const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
|
|
102
|
+
let useNewPort;
|
|
103
|
+
if (isInteractive) {
|
|
104
|
+
useNewPort = yield (0, terminal_1.promptUser)(`Would you like to start the OTEL gRPC server on port ${availableGrpcPort} instead? (y/n): `);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Non-interactive mode: automatically use available port
|
|
108
|
+
console.log(`Automatically using available OTEL gRPC port ${availableGrpcPort} (non-interactive mode)`);
|
|
109
|
+
useNewPort = true;
|
|
110
|
+
}
|
|
111
|
+
if (useNewPort) {
|
|
112
|
+
yield configManager.setOtelGrpcPort(availableGrpcPort);
|
|
113
|
+
console.log(`OTEL gRPC server will start on port ${availableGrpcPort}`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
console.log('Exiting...');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Create APP instance
|
|
121
|
+
const app = (0, express_1.default)();
|
|
122
|
+
const httpServer = (0, http_1.createServer)(app);
|
|
123
|
+
// Initialize the database
|
|
124
|
+
yield (0, database_1.initializeDatabase)(config.database);
|
|
125
|
+
// Set TRPC router
|
|
126
|
+
app.use('/trpc', trpcExpress.createExpressMiddleware({
|
|
127
|
+
router: router_2.appRouter,
|
|
128
|
+
}));
|
|
129
|
+
app.use('/v1', express_1.default.raw({
|
|
130
|
+
type: [
|
|
131
|
+
'application/x-protobuf',
|
|
132
|
+
'application/vnd.google.protobuf',
|
|
133
|
+
'application/protobuf',
|
|
134
|
+
'application/octet-stream',
|
|
135
|
+
'application/json',
|
|
136
|
+
],
|
|
137
|
+
limit: '10mb',
|
|
138
|
+
}), router_1.default);
|
|
139
|
+
// Initialize SocketManager
|
|
140
|
+
socket_1.SocketManager.init(httpServer);
|
|
141
|
+
// Initialize and start OTEL gRPC server on a separate port
|
|
142
|
+
const actualGrpcPort = configManager.getConfig().otelGrpcPort;
|
|
143
|
+
const otelGrpcServer = new grpc_server_1.OtelGrpcServer();
|
|
144
|
+
try {
|
|
145
|
+
yield otelGrpcServer.start(actualGrpcPort);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.warn(`Failed to start OTEL gRPC server on port ${actualGrpcPort}, ` +
|
|
149
|
+
'traces will be received via HTTP endpoint /v1/traces:', error instanceof Error ? error.message : error);
|
|
150
|
+
}
|
|
151
|
+
// Serve static files in development mode
|
|
152
|
+
if (process.env.NODE_ENV === 'production') {
|
|
153
|
+
const publicPath = path_1.default.join(__dirname, '../../public');
|
|
154
|
+
app.use(express_1.default.static(publicPath));
|
|
155
|
+
app.use((req, res, next) => {
|
|
156
|
+
if (!req.path.startsWith('/trpc')) {
|
|
157
|
+
res.sendFile(path_1.default.join(publicPath, 'index.html'), {
|
|
158
|
+
dotfiles: 'allow',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
next();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
httpServer.listen(configManager.getConfig().port, () => {
|
|
167
|
+
const actualPort = configManager.getConfig().port;
|
|
168
|
+
const config = configManager.getConfig();
|
|
169
|
+
const mode = (process.env.NODE_ENV || 'production');
|
|
170
|
+
// Display startup banner
|
|
171
|
+
(0, banner_1.displayBanner)(config_1.APP_INFO.name.replace('-', '\n'), config_1.APP_INFO.version, actualPort, actualGrpcPort, config.database.database, mode);
|
|
172
|
+
if (process.env.NODE_ENV === 'production') {
|
|
173
|
+
(0, opener_1.default)(`http://localhost:${actualPort}/home`);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
return { httpServer, otelGrpcServer };
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
console.error('Error initializing server:', error);
|
|
180
|
+
console.error('Error stack:', error.stack);
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
// Set up the server and start listening
|
|
186
|
+
initializeServer()
|
|
187
|
+
.then(({ httpServer, otelGrpcServer }) => {
|
|
188
|
+
// Handle graceful shutdown
|
|
189
|
+
const cleanup = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
190
|
+
console.debug('Closing Socket.IO connections');
|
|
191
|
+
socket_1.SocketManager.close();
|
|
192
|
+
console.debug('Stopping gRPC server');
|
|
193
|
+
try {
|
|
194
|
+
yield otelGrpcServer.stop();
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error('Error stopping gRPC server:', error);
|
|
198
|
+
otelGrpcServer.forceShutdown();
|
|
199
|
+
}
|
|
200
|
+
console.debug('Closing HTTP server');
|
|
201
|
+
httpServer.close(() => {
|
|
202
|
+
console.debug('HTTP server closed');
|
|
203
|
+
process.exit(0);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
process.on('SIGTERM', cleanup);
|
|
207
|
+
process.on('SIGINT', cleanup);
|
|
208
|
+
})
|
|
209
|
+
.catch(() => {
|
|
210
|
+
process.exit(1);
|
|
211
|
+
});
|
|
@@ -0,0 +1,216 @@
|
|
|
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.AddMessageReplyForeignKey1730000000000 = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
/**
|
|
15
|
+
* Migration: Add Reply table and establish foreign key relationship with Message
|
|
16
|
+
*
|
|
17
|
+
* Tasks:
|
|
18
|
+
* 1. Create reply_table
|
|
19
|
+
* 2. Migrate historical data: create Reply records for all replyIds
|
|
20
|
+
* 3. Change message_table.replyId to a non-nullable foreign key
|
|
21
|
+
*/
|
|
22
|
+
class AddMessageReplyForeignKey1730000000000 {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.name = 'AddMessageReplyForeignKey1730000000000';
|
|
25
|
+
}
|
|
26
|
+
up(queryRunner) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
console.log('Starting migration: Adding Reply table and establishing foreign key relationship...');
|
|
29
|
+
// ========================================
|
|
30
|
+
// Step 0: Check current database state
|
|
31
|
+
// ========================================
|
|
32
|
+
const messageTableExists = yield queryRunner.hasTable('message_table');
|
|
33
|
+
console.log(`Database state check:`);
|
|
34
|
+
console.log(` - message_table exists: ${messageTableExists}`);
|
|
35
|
+
// Scenario 1: First-time installation - message_table does not exist
|
|
36
|
+
// TypeORM will create all tables from entity definitions, including foreign key relationships
|
|
37
|
+
if (!messageTableExists) {
|
|
38
|
+
console.log('⏭️ message_table does not exist. Skipping migration (first-time installation).');
|
|
39
|
+
console.log(' TypeORM will create all tables from entity definitions.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Scenario 2: Check if migration is already completed
|
|
43
|
+
// If foreign key constraint exists, migration has already been completed
|
|
44
|
+
const messageTable = yield queryRunner.getTable('message_table');
|
|
45
|
+
const hasForeignKey = messageTable === null || messageTable === void 0 ? void 0 : messageTable.foreignKeys.some((fk) => fk.columnNames.includes('replyId') &&
|
|
46
|
+
fk.referencedTableName === 'reply_table');
|
|
47
|
+
if (hasForeignKey) {
|
|
48
|
+
console.log('✅ Foreign key constraint already exists. Migration already completed.');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// ========================================
|
|
52
|
+
// Step 1: Create reply_table
|
|
53
|
+
// ========================================
|
|
54
|
+
console.log('Step 1: Creating reply_table...');
|
|
55
|
+
yield queryRunner.createTable(new typeorm_1.Table({
|
|
56
|
+
name: 'reply_table',
|
|
57
|
+
columns: [
|
|
58
|
+
{
|
|
59
|
+
name: 'replyId', // Keep camelCase, consistent with message_table
|
|
60
|
+
type: 'varchar',
|
|
61
|
+
isPrimary: true,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'replyRole',
|
|
65
|
+
type: 'varchar',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'replyName',
|
|
69
|
+
type: 'varchar',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'run_id', // Keep underscore, consistent with other tables
|
|
73
|
+
type: 'varchar',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'createdAt',
|
|
77
|
+
type: 'varchar',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'finishedAt',
|
|
81
|
+
type: 'varchar',
|
|
82
|
+
isNullable: true,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
}), true);
|
|
86
|
+
// Add foreign key for run_id
|
|
87
|
+
yield queryRunner.createForeignKey('reply_table', new typeorm_1.TableForeignKey({
|
|
88
|
+
name: 'FK_reply_run',
|
|
89
|
+
columnNames: ['run_id'],
|
|
90
|
+
referencedTableName: 'run_table',
|
|
91
|
+
referencedColumnNames: ['id'],
|
|
92
|
+
onDelete: 'CASCADE',
|
|
93
|
+
}));
|
|
94
|
+
console.log('reply_table created successfully');
|
|
95
|
+
// ========================================
|
|
96
|
+
// Step 2: Migrate historical data
|
|
97
|
+
// ========================================
|
|
98
|
+
console.log('Step 2: Migrating historical data to reply_table...');
|
|
99
|
+
// Query all messages (Note: column name is replyId in camelCase)
|
|
100
|
+
const allMessages = yield queryRunner.query(`SELECT id, run_id, msg, replyId FROM message_table ORDER BY id`);
|
|
101
|
+
console.log(`Found ${allMessages.length} messages to process`);
|
|
102
|
+
// Collect all unique Reply information
|
|
103
|
+
const replyMap = new Map();
|
|
104
|
+
let nullReplyCount = 0;
|
|
105
|
+
for (const message of allMessages) {
|
|
106
|
+
const msgData = typeof message.msg === 'string'
|
|
107
|
+
? JSON.parse(message.msg)
|
|
108
|
+
: message.msg;
|
|
109
|
+
const role = msgData.role || 'unknown';
|
|
110
|
+
const name = msgData.name || role;
|
|
111
|
+
const timestamp = msgData.timestamp || new Date().toISOString();
|
|
112
|
+
const hasReplyId = message.replyId && message.replyId !== '';
|
|
113
|
+
const replyIdToUse = hasReplyId ? message.replyId : message.id;
|
|
114
|
+
if (!replyMap.has(replyIdToUse)) {
|
|
115
|
+
replyMap.set(replyIdToUse, {
|
|
116
|
+
replyId: replyIdToUse,
|
|
117
|
+
role,
|
|
118
|
+
name,
|
|
119
|
+
runId: message.run_id,
|
|
120
|
+
createdAt: timestamp,
|
|
121
|
+
finishedAt: timestamp,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const existing = replyMap.get(replyIdToUse);
|
|
126
|
+
if (timestamp > existing.finishedAt) {
|
|
127
|
+
existing.finishedAt = timestamp;
|
|
128
|
+
existing.role = role;
|
|
129
|
+
existing.name = name;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!hasReplyId) {
|
|
133
|
+
nullReplyCount++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
console.log(`Need to create ${replyMap.size} Reply records, update ${nullReplyCount} messages`);
|
|
137
|
+
// Batch insert Reply records
|
|
138
|
+
let insertedCount = 0;
|
|
139
|
+
for (const reply of replyMap.values()) {
|
|
140
|
+
yield queryRunner.query(`INSERT INTO reply_table (replyId, replyRole, replyName, run_id, createdAt, finishedAt) VALUES (?, ?, ?, ?, ?, ?)`, [
|
|
141
|
+
reply.replyId,
|
|
142
|
+
reply.role,
|
|
143
|
+
reply.name,
|
|
144
|
+
reply.runId,
|
|
145
|
+
reply.createdAt,
|
|
146
|
+
reply.finishedAt,
|
|
147
|
+
]);
|
|
148
|
+
insertedCount++;
|
|
149
|
+
if (insertedCount % 100 === 0) {
|
|
150
|
+
console.log(`Progress: Inserted ${insertedCount}/${replyMap.size} Replies`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
console.log(`Created ${insertedCount} Reply records`);
|
|
154
|
+
// Batch update messages with NULL replyId
|
|
155
|
+
if (nullReplyCount > 0) {
|
|
156
|
+
console.log(`Starting to update replyId for ${nullReplyCount} messages...`);
|
|
157
|
+
yield queryRunner.query(`UPDATE message_table SET replyId = id WHERE replyId IS NULL OR replyId = ''`);
|
|
158
|
+
console.log(`Updated ${nullReplyCount} messages`);
|
|
159
|
+
}
|
|
160
|
+
// ========================================
|
|
161
|
+
// Step 3: Validate data integrity
|
|
162
|
+
// ========================================
|
|
163
|
+
console.log('Step 3: Validating data...');
|
|
164
|
+
const nullCount = yield queryRunner.query(`SELECT COUNT(*) as count FROM message_table WHERE replyId IS NULL OR replyId = ''`);
|
|
165
|
+
const count = nullCount[0].count || nullCount[0].COUNT;
|
|
166
|
+
if (count > 0) {
|
|
167
|
+
throw new Error(`Data migration failed: ${count} messages still have empty replyId`);
|
|
168
|
+
}
|
|
169
|
+
console.log('Validation passed: All messages have replyId');
|
|
170
|
+
// ========================================
|
|
171
|
+
// Step 4: Add foreign key constraint
|
|
172
|
+
// ========================================
|
|
173
|
+
console.log('Step 4: Adding foreign key constraint...');
|
|
174
|
+
// First change column to non-nullable
|
|
175
|
+
yield queryRunner.changeColumn('message_table', 'replyId', // Note: Keep camelCase naming
|
|
176
|
+
new typeorm_1.TableColumn({
|
|
177
|
+
name: 'replyId',
|
|
178
|
+
type: 'varchar',
|
|
179
|
+
isNullable: false,
|
|
180
|
+
}));
|
|
181
|
+
// Add foreign key constraint
|
|
182
|
+
yield queryRunner.createForeignKey('message_table', new typeorm_1.TableForeignKey({
|
|
183
|
+
name: 'FK_message_reply',
|
|
184
|
+
columnNames: ['replyId'], // Column name in message_table (camelCase)
|
|
185
|
+
referencedTableName: 'reply_table',
|
|
186
|
+
referencedColumnNames: ['replyId'], // Column name in reply_table (camelCase)
|
|
187
|
+
onDelete: 'CASCADE',
|
|
188
|
+
}));
|
|
189
|
+
console.log('Foreign key constraint added successfully');
|
|
190
|
+
console.log('✅ Migration completed!');
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
down(queryRunner) {
|
|
194
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
195
|
+
console.log('Starting migration rollback...');
|
|
196
|
+
// Drop foreign key constraint
|
|
197
|
+
const messageTable = yield queryRunner.getTable('message_table');
|
|
198
|
+
const foreignKey = messageTable === null || messageTable === void 0 ? void 0 : messageTable.foreignKeys.find((fk) => fk.columnNames.includes('replyId'));
|
|
199
|
+
if (foreignKey) {
|
|
200
|
+
yield queryRunner.dropForeignKey('message_table', foreignKey);
|
|
201
|
+
}
|
|
202
|
+
// Change column back to nullable
|
|
203
|
+
yield queryRunner.changeColumn('message_table', 'replyId', new typeorm_1.TableColumn({
|
|
204
|
+
name: 'replyId',
|
|
205
|
+
type: 'varchar',
|
|
206
|
+
isNullable: true,
|
|
207
|
+
}));
|
|
208
|
+
// Set Message replyId to NULL
|
|
209
|
+
yield queryRunner.query(`UPDATE message_table SET replyId = NULL`);
|
|
210
|
+
// Drop reply_table
|
|
211
|
+
yield queryRunner.dropTable('reply_table', true);
|
|
212
|
+
console.log('✅ Rollback completed');
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.AddMessageReplyForeignKey1730000000000 = AddMessageReplyForeignKey1730000000000;
|