@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,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;