@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,589 @@
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
+ exports.SocketManager = void 0;
49
+ exports.runPythonScript = runPythonScript;
50
+ const child_process_1 = require("child_process");
51
+ const socket_io_1 = require("socket.io");
52
+ const messageForm_1 = require("../../../shared/src/types/messageForm");
53
+ const trpc_1 = require("../../../shared/src/types/trpc");
54
+ const Run_1 = require("../dao/Run");
55
+ const dayjs_1 = __importDefault(require("dayjs"));
56
+ const fs = __importStar(require("node:fs"));
57
+ const src_1 = require("../../../shared/src");
58
+ const friday_1 = require("../../../shared/src/config/friday");
59
+ const FridayAppMessage_1 = require("../dao/FridayAppMessage");
60
+ const InputRequest_1 = require("../dao/InputRequest");
61
+ const Trace_1 = require("../dao/Trace");
62
+ const ReplyingStateManager_1 = require("../services/ReplyingStateManager");
63
+ class SocketManager {
64
+ static close() {
65
+ if (this.io) {
66
+ this.io.close();
67
+ }
68
+ }
69
+ static sendInterruptSignalToFriday() {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ this.io.of('/friday').emit(trpc_1.SocketEvents.server.interruptReply);
72
+ });
73
+ }
74
+ static init(httpServer) {
75
+ this.io = new socket_io_1.Server(httpServer, {
76
+ cors: {
77
+ origin: '*',
78
+ },
79
+ maxHttpBufferSize: Infinity,
80
+ });
81
+ const fridayNamespace = this.io.of('/friday');
82
+ fridayNamespace.on('connection', (socket) => {
83
+ console.debug(`${socket.id}: Friday app client connected`);
84
+ socket.on('disconnect', () => {
85
+ console.debug(`${socket.id}: Friday app client disconnected`);
86
+ });
87
+ });
88
+ // Python client connection
89
+ const pythonNamespace = this.io.of('/python');
90
+ pythonNamespace.on('connection', (socket) => {
91
+ const runId = socket.handshake.auth.run_id;
92
+ console.debug(`${socket.id}: Python client connected`);
93
+ socket.on('disconnect', () => __awaiter(this, void 0, void 0, function* () {
94
+ // Delete the input requests
95
+ yield InputRequest_1.InputRequestDao.deleteInputRequestsByRunId(runId);
96
+ this.changeRunStatusAndTriggerEvents(runId, messageForm_1.Status.DONE).catch((error) => {
97
+ console.error(error);
98
+ throw error;
99
+ });
100
+ }));
101
+ });
102
+ const clientNamespace = this.io.of('/client');
103
+ clientNamespace.on('connection', (socket) => {
104
+ console.debug('Client connected');
105
+ socket.on(trpc_1.SocketEvents.client.joinProjectListRoom, () => {
106
+ socket.join(trpc_1.SocketRoomName.ProjectListRoom);
107
+ console.debug(`${socket.id}: joined room: ${trpc_1.SocketRoomName.ProjectListRoom}`);
108
+ Run_1.RunDao.getAllProjects()
109
+ .then((projects) => {
110
+ // Push projects to the client
111
+ socket.emit(trpc_1.SocketEvents.server.pushProjects, projects);
112
+ })
113
+ .catch((error) => {
114
+ console.error(error);
115
+ throw error;
116
+ });
117
+ });
118
+ socket.on(trpc_1.SocketEvents.client.joinProjectRoom, (project, callback) => __awaiter(this, void 0, void 0, function* () {
119
+ const projectExist = yield Run_1.RunDao.doesProjectExist(project);
120
+ if (!projectExist) {
121
+ callback({
122
+ success: false,
123
+ message: `Project ${project} not found`,
124
+ });
125
+ }
126
+ else {
127
+ socket.join(`project-${project}`);
128
+ console.debug(`${socket.id}: joined room: project-${project}`);
129
+ // Return runs to this socket/client
130
+ Run_1.RunDao.getAllProjectRuns(project)
131
+ .then((runs) => {
132
+ // Push runs to the client
133
+ socket.emit(trpc_1.SocketEvents.server.pushRunsData, runs);
134
+ })
135
+ .catch((error) => {
136
+ console.error(error);
137
+ throw error;
138
+ });
139
+ }
140
+ }));
141
+ socket.on(trpc_1.SocketEvents.client.joinRunRoom, (runId, callback) => __awaiter(this, void 0, void 0, function* () {
142
+ const runExist = yield Run_1.RunDao.doesRunExist(runId);
143
+ if (!runExist) {
144
+ callback({
145
+ success: false,
146
+ message: `Run ${runId} not found`,
147
+ });
148
+ }
149
+ else {
150
+ socket.join(`run-${runId}`);
151
+ console.debug(`${socket.id}: joined room: run-${runId}`);
152
+ // Return run data, input requests and messages to this socket/client
153
+ Run_1.RunDao.getRunData(runId)
154
+ .then((data) => {
155
+ socket.emit(trpc_1.SocketEvents.server.pushRunData, data.runData);
156
+ socket.emit(trpc_1.SocketEvents.server.pushInputRequests, data.inputRequests);
157
+ // 对data.replies.messages按时间排序
158
+ data.replies.forEach((reply) => {
159
+ reply.messages.sort((a, b) => {
160
+ return a.timestamp.localeCompare(b.timestamp);
161
+ });
162
+ });
163
+ socket.emit(trpc_1.SocketEvents.server.pushMessages, data.replies);
164
+ socket.emit(trpc_1.SocketEvents.server.pushSpans, data.spans);
165
+ })
166
+ .catch((error) => {
167
+ console.error(error);
168
+ throw error;
169
+ });
170
+ // Return model invocation data
171
+ Trace_1.SpanDao.getModelInvocationData(runId).then((data) => {
172
+ socket.emit(trpc_1.SocketEvents.server.pushModelInvocationData, data);
173
+ });
174
+ }
175
+ }));
176
+ socket.on(trpc_1.SocketEvents.client.sendUserInputToServer, (requestId, blocksInput, structuredInput, callback) => __awaiter(this, void 0, void 0, function* () {
177
+ const inputRequest = yield InputRequest_1.InputRequestDao.getInputRequestByRequestId(requestId);
178
+ if (inputRequest === null) {
179
+ callback({
180
+ success: false,
181
+ message: `Input request ${requestId} not found`,
182
+ });
183
+ }
184
+ else {
185
+ const runId = inputRequest.runId;
186
+ yield InputRequest_1.InputRequestDao.deleteInputRequest(requestId);
187
+ // If input requests are empty, change the run status to finished
188
+ const res = yield Run_1.RunDao.getRunData(runId);
189
+ if (res.inputRequests.length === 0) {
190
+ this.changeRunStatusAndTriggerEvents(runId, messageForm_1.Status.RUNNING).catch((error) => {
191
+ console.error(error);
192
+ throw error;
193
+ });
194
+ }
195
+ // Emit the input to the python client
196
+ this.io
197
+ .of('/python')
198
+ .emit(trpc_1.SocketEvents.server.forwardUserInput, requestId, blocksInput, structuredInput);
199
+ }
200
+ }));
201
+ socket.on(trpc_1.SocketEvents.client.joinOverviewRoom, () => __awaiter(this, void 0, void 0, function* () {
202
+ socket.join(trpc_1.SocketRoomName.OverviewRoom);
203
+ console.debug(`${socket.id}: joined room: ${trpc_1.SocketRoomName.OverviewRoom}`);
204
+ // Return current overview data
205
+ const res = yield this._getOverViewData();
206
+ socket.emit(trpc_1.SocketEvents.server.pushOverviewData, res);
207
+ }));
208
+ socket.on(trpc_1.SocketEvents.client.leaveRoom, (room) => {
209
+ socket.leave(room);
210
+ console.debug(`${socket.id}: left room: ${room}`);
211
+ });
212
+ socket.on(trpc_1.SocketEvents.client.deleteProjects, (projects, callback) => __awaiter(this, void 0, void 0, function* () {
213
+ try {
214
+ yield Run_1.RunDao.deleteProjects(projects);
215
+ callback({
216
+ success: true,
217
+ message: `Success: ${projects.length} project deleted`,
218
+ });
219
+ // Update projectListRoom, overviewRoom,
220
+ this.broadcastOverviewDataToDashboardRoom();
221
+ this.broadcastRunToProjectListRoom();
222
+ }
223
+ catch (error) {
224
+ callback({
225
+ success: false,
226
+ message: `Error: ${error}`,
227
+ });
228
+ }
229
+ }));
230
+ socket.on(trpc_1.SocketEvents.client.deleteRuns, (runIds, callback) => __awaiter(this, void 0, void 0, function* () {
231
+ try {
232
+ const nDelete = yield Run_1.RunDao.deleteRuns(runIds);
233
+ callback({
234
+ success: nDelete === runIds.length,
235
+ message: `Deleted ${nDelete} runs`,
236
+ });
237
+ // Update data to overviewRoom, projectRoom
238
+ this.broadcastOverviewDataToDashboardRoom();
239
+ this.broadcastRunToProjectListRoom();
240
+ }
241
+ catch (error) {
242
+ callback({
243
+ success: false,
244
+ message: `Failed to delete runs: ${error}`,
245
+ });
246
+ }
247
+ }));
248
+ // friday app
249
+ socket.on(trpc_1.SocketEvents.client.getFridayConfig, (callback) => __awaiter(this, void 0, void 0, function* () {
250
+ console.debug(`${socket.id}: getFridayConfig`);
251
+ try {
252
+ // Send config to the client
253
+ const fridayConfig = friday_1.FridayConfigManager.getInstance().getConfig();
254
+ callback({
255
+ success: true,
256
+ data: fridayConfig,
257
+ message: 'Get Friday config successfully',
258
+ });
259
+ }
260
+ catch (error) {
261
+ console.error(error);
262
+ callback({
263
+ success: false,
264
+ data: null,
265
+ message: `Failed to get Friday config: ${error}`,
266
+ });
267
+ }
268
+ }));
269
+ socket.on(trpc_1.SocketEvents.client.saveFridayConfig, (config, callback) => __awaiter(this, void 0, void 0, function* () {
270
+ const fridayConfigManager = friday_1.FridayConfigManager.getInstance();
271
+ // Save the config to the file
272
+ fridayConfigManager.updateConfig(config);
273
+ callback({
274
+ success: true,
275
+ message: 'Save Friday config successfully',
276
+ });
277
+ }));
278
+ socket.on(trpc_1.SocketEvents.client.installFridayRequirements, (pythonEnv, callback) => __awaiter(this, void 0, void 0, function* () {
279
+ const fridayConfigManager = friday_1.FridayConfigManager.getInstance();
280
+ const res = yield fridayConfigManager.installRequirements(pythonEnv);
281
+ callback(res);
282
+ }));
283
+ socket.on(trpc_1.SocketEvents.client.joinFridayAppRoom, (callback) => __awaiter(this, void 0, void 0, function* () {
284
+ console.debug(`${socket.id}: joined room: ${trpc_1.SocketRoomName.FridayAppRoom}`);
285
+ socket.join(trpc_1.SocketRoomName.FridayAppRoom);
286
+ const replyingManager = ReplyingStateManager_1.ReplyingStateManager.getInstance();
287
+ // Push the replying state
288
+ socket.emit(trpc_1.SocketEvents.server.pushReplyingState, replyingManager.getReplyingState());
289
+ // Push the replies to the client
290
+ FridayAppMessage_1.FridayAppMessageDao.getRepliesBefore(undefined, 100)
291
+ .then((res) => {
292
+ socket.emit(trpc_1.SocketEvents.server.pushReplies, res.replies, res.hasMore);
293
+ })
294
+ .catch((error) => {
295
+ console.error(error);
296
+ callback({
297
+ success: false,
298
+ message: `Failed to get replies: ${error}`,
299
+ });
300
+ });
301
+ }));
302
+ socket.on(trpc_1.SocketEvents.client.verifyFridayConfig, (pythonEnv, callback) => __awaiter(this, void 0, void 0, function* () {
303
+ console.debug(`${socket.id}: verifyPythonEnv:`, pythonEnv);
304
+ // Verify if python exists
305
+ const result = friday_1.FridayConfigManager.getInstance().verifyPythonEnv(pythonEnv);
306
+ callback(result);
307
+ }));
308
+ socket.on(trpc_1.SocketEvents.client.sendUserInputToFridayApp, (name, role, content, callback) => __awaiter(this, void 0, void 0, function* () {
309
+ const replyingManager = ReplyingStateManager_1.ReplyingStateManager.getInstance();
310
+ const replyId = crypto.randomUUID();
311
+ const msgId = crypto.randomUUID();
312
+ FridayAppMessage_1.FridayAppMessageDao.saveReplyMessage(replyId, {
313
+ id: msgId,
314
+ name: name,
315
+ role: role,
316
+ content: content,
317
+ metadata: {},
318
+ timestamp: (0, dayjs_1.default)().format('YYYY-MM-DD HH:mm:ss.SSS'),
319
+ }, true)
320
+ .then((reply) => {
321
+ this.broadcastReplyToFridayAppRoom(reply);
322
+ })
323
+ .catch((error) => {
324
+ console.error(error);
325
+ callback({
326
+ success: false,
327
+ message: `Failed to add reply: ${error}`,
328
+ });
329
+ });
330
+ // Send the message to the python client
331
+ // TODO: move somewhere
332
+ const config = src_1.ConfigManager.getInstance().getConfig();
333
+ // Broad the replying state to the Friday app room
334
+ replyingManager.setReplyingState(true);
335
+ this.broadcastReplyingStateToFridayAppRoom();
336
+ const fridayConfigManager = friday_1.FridayConfigManager.getInstance();
337
+ const fridayConfig = fridayConfigManager.getConfig();
338
+ if (!fridayConfig) {
339
+ callback({
340
+ success: false,
341
+ message: 'Friday config not found. Please set it up first.',
342
+ });
343
+ return;
344
+ }
345
+ // Prepare the arguments for the Python script
346
+ const mainScriptPath = fridayConfig.mainScriptPath
347
+ ? fridayConfig.mainScriptPath
348
+ : fridayConfigManager.getDefaultMainScriptPath();
349
+ const args = [
350
+ mainScriptPath,
351
+ '--query',
352
+ JSON.stringify(content),
353
+ '--studio_url',
354
+ `http://localhost:${config.port}`,
355
+ ];
356
+ console.debug(fridayConfig);
357
+ for (const [key, value] of Object.entries(fridayConfig)) {
358
+ if (key !== 'pythonEnv' && key !== 'mainScriptPath') {
359
+ if (typeof value === 'object') {
360
+ args.push(`--${key}`, JSON.stringify(value));
361
+ }
362
+ else {
363
+ args.push(`--${key}`, value);
364
+ }
365
+ }
366
+ }
367
+ runPythonScript(fridayConfig.pythonEnv, args)
368
+ .then((result) => {
369
+ if (result.success) {
370
+ console.debug('[PYTHON SCRIPT OUTPUT]:', result.data);
371
+ }
372
+ else {
373
+ console.error('[PYTHON SCRIPT ERROR]:', result.error);
374
+ callback({
375
+ success: false,
376
+ message: result.error,
377
+ });
378
+ }
379
+ })
380
+ .catch((error) => {
381
+ console.error('[PYTHON SCRIPT ERROR]:', error);
382
+ callback({
383
+ success: false,
384
+ message: error,
385
+ });
386
+ })
387
+ .finally(() => {
388
+ replyingManager.setReplyingState(false);
389
+ this.broadcastReplyingStateToFridayAppRoom();
390
+ });
391
+ }));
392
+ socket.on(trpc_1.SocketEvents.client.interruptReplyOfFridayApp, () => __awaiter(this, void 0, void 0, function* () {
393
+ yield this.sendInterruptSignalToFriday();
394
+ }));
395
+ socket.on(trpc_1.SocketEvents.client.cleanHistoryOfFridayApp, () => __awaiter(this, void 0, void 0, function* () {
396
+ FridayAppMessage_1.FridayAppMessageDao.cleanHistoryMessages().then(() => {
397
+ const filePath = src_1.PATHS.getFridayDialogHistoryPath();
398
+ if (fs.existsSync(filePath)) {
399
+ fs.unlinkSync(filePath);
400
+ console.debug(`Deleted file: ${filePath}`);
401
+ }
402
+ else {
403
+ console.warn(`File not found: ${filePath}`);
404
+ }
405
+ // TODO: 告知client
406
+ this.broadcastReplyToFridayAppRoom(undefined, true);
407
+ });
408
+ }));
409
+ socket.on('disconnect', () => {
410
+ console.debug('Client disconnected');
411
+ });
412
+ });
413
+ }
414
+ /*
415
+ * Emit events to the project list room.
416
+ */
417
+ static broadcastRunToProjectListRoom() {
418
+ Run_1.RunDao.getAllProjects()
419
+ .then((projects) => {
420
+ // Push projects to the client
421
+ this.io
422
+ .of('/client')
423
+ .to(trpc_1.SocketRoomName.ProjectListRoom)
424
+ .emit(trpc_1.SocketEvents.server.pushProjects, projects);
425
+ })
426
+ .catch((error) => {
427
+ console.error(error);
428
+ throw error;
429
+ });
430
+ }
431
+ static broadcastRunToProjectRoom(project) {
432
+ Run_1.RunDao.getAllProjectRuns(project)
433
+ .then((runs) => {
434
+ // Push runs to the client
435
+ this.io
436
+ .of('/client')
437
+ .to(`project-${project}`)
438
+ .emit(trpc_1.SocketEvents.server.pushRunsData, runs);
439
+ })
440
+ .catch((error) => {
441
+ console.error(error);
442
+ throw error;
443
+ });
444
+ }
445
+ /*
446
+ * Emit events to the run room.
447
+ */
448
+ static broadcastMessageToRunRoom(runId, reply) {
449
+ this.io
450
+ .of('/client')
451
+ .to(`run-${runId}`)
452
+ .emit(trpc_1.SocketEvents.server.pushMessages, [reply]);
453
+ }
454
+ static broadcastSpanDataToRunRoom(spanDataArray) {
455
+ // Group spans by runId
456
+ const groupedSpans = {};
457
+ spanDataArray.forEach((spanData) => {
458
+ if (!groupedSpans[spanData.conversationId]) {
459
+ groupedSpans[spanData.conversationId] = [];
460
+ }
461
+ groupedSpans[spanData.conversationId].push(spanData);
462
+ });
463
+ // Send grouped spans to each run room
464
+ for (const runId in groupedSpans) {
465
+ this.io
466
+ .of('/client')
467
+ .to(`run-${runId}`)
468
+ .emit(trpc_1.SocketEvents.server.pushSpans, groupedSpans[runId]);
469
+ this.broadcastModelInvocationDataToRunRoom(runId);
470
+ }
471
+ }
472
+ static broadcastInputRequestToRunRoom(runId, inputRequest) {
473
+ this.io
474
+ .of('/client')
475
+ .to(`run-${runId}`)
476
+ .emit(trpc_1.SocketEvents.server.pushInputRequests, [inputRequest]);
477
+ }
478
+ static broadcastRunDataToRunRoom(runId, runData) {
479
+ this.io
480
+ .of('/client')
481
+ .to(`run-${runId}`)
482
+ .emit(trpc_1.SocketEvents.server.pushRunData, runData);
483
+ }
484
+ static clearInputRequestsToRunRoom(runId) {
485
+ this.io
486
+ .of('/client')
487
+ .to(`run-${runId}`)
488
+ .emit(trpc_1.SocketEvents.server.clearInputRequests);
489
+ }
490
+ static changeRunStatusAndTriggerEvents(runId, newStatus) {
491
+ return __awaiter(this, void 0, void 0, function* () {
492
+ const runExist = yield Run_1.RunDao.doesRunExist(runId);
493
+ if (runExist) {
494
+ // Update the run status to "finished"
495
+ yield Run_1.RunDao.changeRunStatus(runId, newStatus);
496
+ // Find the project by runId
497
+ const res = yield Run_1.RunDao.getRunData(runId);
498
+ const project = res.runData.project;
499
+ // Broadcast projects to all clients in the ProjectList room
500
+ this.broadcastRunToProjectListRoom();
501
+ // Broadcast runs to all clients in the project room
502
+ this.broadcastRunToProjectRoom(project);
503
+ // Broadcast run data to all clients in the run room
504
+ this.broadcastRunDataToRunRoom(runId, res.runData);
505
+ if (newStatus === messageForm_1.Status.DONE) {
506
+ // Clear the input requests for all clients in the run room
507
+ this.clearInputRequestsToRunRoom(runId);
508
+ }
509
+ }
510
+ });
511
+ }
512
+ static broadcastOverviewDataToDashboardRoom() {
513
+ this._getOverViewData()
514
+ .then((res) => {
515
+ this.io
516
+ .of('/client')
517
+ .to(trpc_1.SocketRoomName.OverviewRoom)
518
+ .emit(trpc_1.SocketEvents.server.pushOverviewData, res);
519
+ })
520
+ .catch((error) => {
521
+ console.error(error);
522
+ throw error;
523
+ });
524
+ }
525
+ static _getOverViewData() {
526
+ return __awaiter(this, void 0, void 0, function* () {
527
+ const res1 = yield Run_1.RunDao.getRunViewData();
528
+ const res2 = yield Trace_1.SpanDao.getModelInvocationViewData();
529
+ return Object.assign(Object.assign({}, res1), res2);
530
+ });
531
+ }
532
+ static broadcastModelInvocationDataToRunRoom(runId) {
533
+ Trace_1.SpanDao.getModelInvocationData(runId).then((data) => {
534
+ this.io
535
+ .of('/client')
536
+ .to(`run-${runId}`)
537
+ .emit(trpc_1.SocketEvents.server.pushModelInvocationData, data);
538
+ });
539
+ }
540
+ static broadcastReplyToFridayAppRoom(reply, override = false) {
541
+ this.io
542
+ .of('/client')
543
+ .to(trpc_1.SocketRoomName.FridayAppRoom)
544
+ .emit(trpc_1.SocketEvents.server.pushReplies, reply === undefined ? [] : [reply], false, override);
545
+ }
546
+ static broadcastReplyingStateToFridayAppRoom() {
547
+ const replyingManager = ReplyingStateManager_1.ReplyingStateManager.getInstance();
548
+ this.io
549
+ .of('/client')
550
+ .to(trpc_1.SocketRoomName.FridayAppRoom)
551
+ .emit(trpc_1.SocketEvents.server.pushReplyingState, replyingManager.getReplyingState());
552
+ }
553
+ }
554
+ exports.SocketManager = SocketManager;
555
+ function runPythonScript(pythonEnv, commands) {
556
+ return __awaiter(this, void 0, void 0, function* () {
557
+ return new Promise((resolve) => {
558
+ console.debug('The execute command:', pythonEnv, commands);
559
+ const pythonProcess = (0, child_process_1.spawn)(pythonEnv, commands, {
560
+ env: Object.assign(Object.assign({}, process.env), { FORCE_COLOR: '0' }),
561
+ });
562
+ let output = '';
563
+ let errorOutput = '';
564
+ // 收集标准输出
565
+ pythonProcess.stdout.on('data', (data) => {
566
+ output += data.toString();
567
+ });
568
+ // 收集错误输出
569
+ pythonProcess.stderr.on('data', (data) => {
570
+ errorOutput += data.toString();
571
+ });
572
+ // 进程结束时处理结果
573
+ pythonProcess.on('close', (code) => {
574
+ if (code === 0) {
575
+ resolve({
576
+ success: true,
577
+ data: output.trim(),
578
+ });
579
+ }
580
+ else {
581
+ resolve({
582
+ success: false,
583
+ error: errorOutput.trim(),
584
+ });
585
+ }
586
+ });
587
+ });
588
+ });
589
+ }
@@ -0,0 +1,17 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./processUtils"), exports);
@@ -0,0 +1,27 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.checkProcessByPid = void 0;
16
+ const find_process_1 = __importDefault(require("find-process"));
17
+ const checkProcessByPid = (pid) => __awaiter(void 0, void 0, void 0, function* () {
18
+ try {
19
+ const processes = yield (0, find_process_1.default)('pid', pid);
20
+ return processes.length > 0;
21
+ }
22
+ catch (err) {
23
+ console.error('Error checking process:', err);
24
+ return false;
25
+ }
26
+ });
27
+ exports.checkProcessByPid = checkProcessByPid;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientConfig = void 0;
4
+ exports.ClientConfig = {
5
+ socketPath: '/client',
6
+ };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_CONFIG = exports.APP_INFO = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const getVersion = () => {
10
+ let version = '';
11
+ try {
12
+ const packageJsonPath = path_1.default.join(__dirname, '../../../../', 'package.json');
13
+ const packageJson = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf8'));
14
+ version = packageJson.version || '';
15
+ }
16
+ catch (error) {
17
+ console.warn('Failed to read version from package.json:', error);
18
+ }
19
+ return version;
20
+ };
21
+ exports.APP_INFO = {
22
+ name: 'AgentScope-Studio',
23
+ version: getVersion(),
24
+ description: 'Your app description',
25
+ };
26
+ exports.DEFAULT_CONFIG = {
27
+ server: {
28
+ port: 3000,
29
+ otelGrpcPort: 4317,
30
+ host: 'localhost',
31
+ },
32
+ };