@chainingintention/pi-web-cn 1.202610.2 → 1.202610.4

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 (202) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.js +129 -122
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/assets/PiWebApp-CN3g7SqA.js +4362 -0
  5. package/dist/client/assets/external-DUGCSDhZ.js +2 -0
  6. package/dist/client/assets/index-JduZlbIF.js +2 -0
  7. package/dist/client/index.html +4 -4
  8. package/dist/client/manifest.webmanifest +2 -1
  9. package/dist/localization.js +24 -0
  10. package/dist/localization.js.map +1 -0
  11. package/dist/nativeServices/serviceDoctor.js +45 -44
  12. package/dist/nativeServices/serviceDoctor.js.map +1 -1
  13. package/dist/pi-packages/captains-log/dist/browser/index.js +46 -45
  14. package/dist/pi-packages/captains-log/dist/browser/markdown.js +2 -1
  15. package/dist/pi-packages/captains-log/dist/browser/panel.js +56 -55
  16. package/dist/pi-packages/captains-log/i18n.js +7 -0
  17. package/dist/pi-packages/relays/i18n.js +7 -0
  18. package/dist/pi-packages/relays/markdownDocument.js +2 -1
  19. package/dist/pi-packages/relays/pi-web-plugin.js +8 -6
  20. package/dist/pi-packages/relays/relaysPanelElement.js +24 -23
  21. package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +124 -124
  22. package/dist/pi-web-plugins/git/browser/git-contract.js +13 -12
  23. package/dist/pi-web-plugins/git/browser/git-panel.js +25 -24
  24. package/dist/pi-web-plugins/git/browser/i18n.js +7 -0
  25. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +7 -3
  26. package/dist/pi-web-plugins/git/git-backend.js +10 -9
  27. package/dist/pi-web-plugins/git/i18n.js +7 -0
  28. package/dist/pi-web-plugins/git/server-plugin.js +21 -19
  29. package/dist/pi-web-plugins/info/i18n.js +7 -0
  30. package/dist/pi-web-plugins/info/infoInternals.js +57 -62
  31. package/dist/pi-web-plugins/info/pi-web-plugin.js +34 -36
  32. package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +3 -3
  33. package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +55 -52
  34. package/dist/pi-web-plugins/terminal/i18n.js +7 -0
  35. package/dist/pi-web-plugins/terminal/server-plugin.js +23 -21
  36. package/dist/pi-web-plugins/terminal/terminalService.js +22 -21
  37. package/dist/pi-web-plugins/updates/i18n.js +7 -0
  38. package/dist/pi-web-plugins/updates/pi-web-plugin.js +58 -54
  39. package/dist/pi-web-plugins/updates/updatesLogic.js +21 -20
  40. package/dist/pi-web-plugins/workspace-tasks/config.js +12 -11
  41. package/dist/pi-web-plugins/workspace-tasks/i18n.js +7 -0
  42. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +8 -6
  43. package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +20 -19
  44. package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +12 -11
  45. package/dist/pi-web-plugins/zh-cn/auth.json +9 -0
  46. package/dist/pi-web-plugins/zh-cn/bundled.json +176 -0
  47. package/dist/pi-web-plugins/zh-cn/cli.json +171 -0
  48. package/dist/pi-web-plugins/zh-cn/client.json +219 -0
  49. package/dist/pi-web-plugins/zh-cn/components.json +1002 -0
  50. package/dist/pi-web-plugins/zh-cn/config-errors.json +172 -0
  51. package/dist/pi-web-plugins/zh-cn/files.json +41 -0
  52. package/dist/pi-web-plugins/zh-cn/machines.json +28 -0
  53. package/dist/pi-web-plugins/zh-cn/main.json +459 -0
  54. package/dist/pi-web-plugins/zh-cn/management-errors.json +23 -0
  55. package/dist/pi-web-plugins/zh-cn/manifest.webmanifest +25 -0
  56. package/dist/pi-web-plugins/zh-cn/metadata.json +3 -0
  57. package/dist/pi-web-plugins/zh-cn/package.json +10 -0
  58. package/dist/pi-web-plugins/zh-cn/pi-web-plugin.js +16 -0
  59. package/dist/pi-web-plugins/zh-cn/projects.json +6 -0
  60. package/dist/pi-web-plugins/zh-cn/provider-auth.json +17 -0
  61. package/dist/pi-web-plugins/zh-cn/routing.json +68 -0
  62. package/dist/pi-web-plugins/zh-cn/server-main.json +99 -0
  63. package/dist/pi-web-plugins/zh-cn/server.json +174 -0
  64. package/dist/piWebVersionReport.js +17 -16
  65. package/dist/piWebVersionReport.js.map +1 -1
  66. package/dist/plugin-api.d.ts +4 -1
  67. package/dist/pluginRecoveryCli.js +25 -24
  68. package/dist/pluginRecoveryCli.js.map +1 -1
  69. package/dist/server/app.js +43 -28
  70. package/dist/server/app.js.map +1 -1
  71. package/dist/server/audit/normalToolAuditCli.js +45 -43
  72. package/dist/server/audit/normalToolAuditCli.js.map +1 -1
  73. package/dist/server/configRoutes.js +39 -30
  74. package/dist/server/configRoutes.js.map +1 -1
  75. package/dist/server/diagnostics/nodePtyNativeModule.js +7 -6
  76. package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -1
  77. package/dist/server/diagnostics/nodePtySpawnHelper.js +21 -20
  78. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -1
  79. package/dist/server/knownAutoInstallPiPackages.js +2 -2
  80. package/dist/server/knownAutoInstallPiPackages.js.map +1 -1
  81. package/dist/server/knownPiPackages.js +2 -2
  82. package/dist/server/knownPiPackages.js.map +1 -1
  83. package/dist/server/machines/machineClient.js +8 -6
  84. package/dist/server/machines/machineClient.js.map +1 -1
  85. package/dist/server/machines/machinePluginProxyRoutes.js +11 -10
  86. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
  87. package/dist/server/machines/machineProxyRoutes.js +27 -29
  88. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  89. package/dist/server/machines/machineRoutes.js +10 -12
  90. package/dist/server/machines/machineRoutes.js.map +1 -1
  91. package/dist/server/machines/machineService.js +17 -18
  92. package/dist/server/machines/machineService.js.map +1 -1
  93. package/dist/server/managementEmbed.js +26 -25
  94. package/dist/server/managementEmbed.js.map +1 -1
  95. package/dist/server/normalAuth.js +29 -26
  96. package/dist/server/normalAuth.js.map +1 -1
  97. package/dist/server/passwordVerifier.js +2 -1
  98. package/dist/server/passwordVerifier.js.map +1 -1
  99. package/dist/server/piPackageService.js +7 -5
  100. package/dist/server/piPackageService.js.map +1 -1
  101. package/dist/server/piWebPluginService.js +27 -11
  102. package/dist/server/piWebPluginService.js.map +1 -1
  103. package/dist/server/piWebStatus.js +16 -14
  104. package/dist/server/piWebStatus.js.map +1 -1
  105. package/dist/server/plugins/serverPluginRuntime.js +4 -2
  106. package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
  107. package/dist/server/projects/projectService.js +4 -3
  108. package/dist/server/projects/projectService.js.map +1 -1
  109. package/dist/server/sessiond/projectMutationRoutes.js +5 -4
  110. package/dist/server/sessiond/projectMutationRoutes.js.map +1 -1
  111. package/dist/server/sessiond/sessionProxyRoutes.js +11 -8
  112. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  113. package/dist/server/sessiond/workspaceCatalogRoutes.js +5 -3
  114. package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -1
  115. package/dist/server/sessiond.js +8 -3
  116. package/dist/server/sessiond.js.map +1 -1
  117. package/dist/server/sessions/authRoutes.js +20 -19
  118. package/dist/server/sessions/authRoutes.js.map +1 -1
  119. package/dist/server/sessions/authService.js +13 -10
  120. package/dist/server/sessions/authService.js.map +1 -1
  121. package/dist/server/sessions/builtinCommands.js +28 -21
  122. package/dist/server/sessions/builtinCommands.js.map +1 -1
  123. package/dist/server/sessions/oauthLoginFlowService.js +17 -15
  124. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
  125. package/dist/server/sessions/piSessionService.js +229 -208
  126. package/dist/server/sessions/piSessionService.js.map +1 -1
  127. package/dist/server/sessions/projectAuthService.js +5 -3
  128. package/dist/server/sessions/projectAuthService.js.map +1 -1
  129. package/dist/server/sessions/sessionArchiveMapping.js +8 -7
  130. package/dist/server/sessions/sessionArchiveMapping.js.map +1 -1
  131. package/dist/server/sessions/sessionCleanup.js +4 -3
  132. package/dist/server/sessions/sessionCleanup.js.map +1 -1
  133. package/dist/server/sessions/sessionCommandService.js +70 -67
  134. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  135. package/dist/server/sessions/sessionNotificationStore.js +12 -11
  136. package/dist/server/sessions/sessionNotificationStore.js.map +1 -1
  137. package/dist/server/sessions/sessionRoutes.js +74 -72
  138. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  139. package/dist/server/sessions/sessionTreeProjection.js +50 -49
  140. package/dist/server/sessions/sessionTreeProjection.js.map +1 -1
  141. package/dist/server/sessions/sessionUnreadStore.js +25 -2
  142. package/dist/server/sessions/sessionUnreadStore.js.map +1 -1
  143. package/dist/server/terminals/managementCommandRunService.js +13 -12
  144. package/dist/server/terminals/managementCommandRunService.js.map +1 -1
  145. package/dist/server/workbench/accessStateStore.js +9 -7
  146. package/dist/server/workbench/accessStateStore.js.map +1 -1
  147. package/dist/server/workbench/capabilitySearch.js +3 -2
  148. package/dist/server/workbench/capabilitySearch.js.map +1 -1
  149. package/dist/server/workbench/knowledgeSearch.js +8 -7
  150. package/dist/server/workbench/knowledgeSearch.js.map +1 -1
  151. package/dist/server/workbench/mcpClient.js +6 -5
  152. package/dist/server/workbench/mcpClient.js.map +1 -1
  153. package/dist/server/workbench/skillSync.js +4 -2
  154. package/dist/server/workbench/skillSync.js.map +1 -1
  155. package/dist/server/workbench/workbenchClient.js +8 -7
  156. package/dist/server/workbench/workbenchClient.js.map +1 -1
  157. package/dist/server/workbench/workbenchTools.js +8 -6
  158. package/dist/server/workbench/workbenchTools.js.map +1 -1
  159. package/dist/server/workingDirectory.js +3 -2
  160. package/dist/server/workingDirectory.js.map +1 -1
  161. package/dist/server/workspaceExplorerRoutes.js +16 -13
  162. package/dist/server/workspaceExplorerRoutes.js.map +1 -1
  163. package/dist/server/workspaces/fileContentService.js +11 -10
  164. package/dist/server/workspaces/fileContentService.js.map +1 -1
  165. package/dist/server/workspaces/fileOperationService.js +7 -6
  166. package/dist/server/workspaces/fileOperationService.js.map +1 -1
  167. package/dist/server/workspaces/filePreviewService.js +5 -4
  168. package/dist/server/workspaces/filePreviewService.js.map +1 -1
  169. package/dist/server/workspaces/fileSuggestions.js +2 -1
  170. package/dist/server/workspaces/fileSuggestions.js.map +1 -1
  171. package/dist/server/workspaces/pathAccessPolicy.js +24 -18
  172. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -1
  173. package/dist/server/workspaces/pathSafety.js +6 -5
  174. package/dist/server/workspaces/pathSafety.js.map +1 -1
  175. package/dist/server/workspaces/projectPiWebConfig.js +3 -2
  176. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
  177. package/dist/server/workspaces/workspaceRemovalService.js +4 -3
  178. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
  179. package/dist/server/workspaces/workspaceRouteErrors.js +4 -2
  180. package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -1
  181. package/dist/server/workspaces/workspaceUserError.js +18 -0
  182. package/dist/server/workspaces/workspaceUserError.js.map +1 -0
  183. package/dist/server-plugin-api.d.ts +3 -1
  184. package/dist/server-plugin-api.js.map +1 -1
  185. package/dist/serverPluginRecovery.js +3 -2
  186. package/dist/serverPluginRecovery.js.map +1 -1
  187. package/dist/shared/apiTypes.js.map +1 -1
  188. package/dist/shared/i18n.js +41 -0
  189. package/dist/shared/i18n.js.map +1 -0
  190. package/dist/shared/piWebConfigParsing.js +52 -49
  191. package/dist/shared/piWebConfigParsing.js.map +1 -1
  192. package/dist/shared/pluginApiTypes.d.ts +7 -0
  193. package/dist/shared/requiredTerminalPlugin.js +1 -1
  194. package/dist/shared/requiredTerminalPlugin.js.map +1 -1
  195. package/dist/shared/sessionDefaults.js +7 -6
  196. package/dist/shared/sessionDefaults.js.map +1 -1
  197. package/dist/shared/thinkingLevels.js +17 -16
  198. package/dist/shared/thinkingLevels.js.map +1 -1
  199. package/docs/config.md +10 -1
  200. package/docs/plugins.md +8 -0
  201. package/package.json +1 -1
  202. package/dist/client/assets/index-CFhaGb5m.js +0 -4357
@@ -1,3 +1,5 @@
1
+ import { UserFacingError, userFacingErrorMessage } from "../../shared/i18n.js";
2
+ import { loadNodeTranslator } from "../../localization.js";
1
3
  import { ASK_USER_ID_MAX_LENGTH, ASK_USER_OPTION_LIMIT, ASK_USER_OTHER_TEXT_MAX_LENGTH, ASK_USER_QUESTION_LIMIT, EXTENSION_DIALOG_ID_MAX_LENGTH, EXTENSION_DIALOG_INPUT_MAX_LENGTH, SESSION_TREE_CUSTOM_INSTRUCTIONS_MAX_LENGTH, SESSION_UNREAD_CATALOG_ID_MAX_LENGTH, SESSION_UNREAD_CWD_MAX_LENGTH, SESSION_UNREAD_SESSION_ID_MAX_LENGTH } from "../../shared/apiTypes.js";
2
4
  import { parseSessionDefaultsUpdate } from "../../shared/sessionDefaults.js";
3
5
  import { projectBrowserMessageResponse } from "../browserMessageProjection.js";
@@ -9,7 +11,7 @@ const MAX_NOTIFICATION_SESSION_ID_LENGTH = 512;
9
11
  const MAX_NOTIFICATION_CWD_LENGTH = 32 * 1024;
10
12
  const MAX_NOTIFICATION_DAEMON_ID_LENGTH = 512;
11
13
  const MAX_NOTIFICATION_ID_LENGTH = 1024;
12
- export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
14
+ export function registerSessionRoutes(app, sessions, eventHub, prefix = "", t = loadNodeTranslator("server")) {
13
15
  app.get(`${prefix}/sessions`, async (request, reply) => {
14
16
  if (request.query.cwd === undefined || request.query.cwd === "")
15
17
  return reply.code(400).send({ error: "cwd query parameter is required" });
@@ -17,7 +19,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
17
19
  return await sessions.list(normalizeRequestCwd(request.query.cwd), managementContextFromHeaders(request.headers));
18
20
  }
19
21
  catch (error) {
20
- return reply.code(400).send({ error: errorMessage(error) });
22
+ return reply.code(400).send({ error: errorMessage(error, t) });
21
23
  }
22
24
  });
23
25
  app.get(`${prefix}/sessions/search`, async (request, reply) => {
@@ -29,7 +31,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
29
31
  return await sessions.search(normalizeRequestCwd(request.query.cwd), request.query.q, managementContextFromHeaders(request.headers));
30
32
  }
31
33
  catch (error) {
32
- return reply.code(400).send({ error: errorMessage(error) });
34
+ return reply.code(400).send({ error: errorMessage(error, t) });
33
35
  }
34
36
  });
35
37
  app.get(`${prefix}/sessions/pins`, async (request, reply) => {
@@ -39,7 +41,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
39
41
  return await sessions.listPinned(normalizeRequestCwd(request.query.cwd), managementContextFromHeaders(request.headers));
40
42
  }
41
43
  catch (error) {
42
- return reply.code(400).send({ error: errorMessage(error) });
44
+ return reply.code(400).send({ error: errorMessage(error, t) });
43
45
  }
44
46
  });
45
47
  app.post(`${prefix}/sessions`, async (request, reply) => {
@@ -56,7 +58,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
56
58
  });
57
59
  }
58
60
  catch (error) {
59
- return reply.code(400).send({ error: errorMessage(error) });
61
+ return reply.code(400).send({ error: errorMessage(error, t) });
60
62
  }
61
63
  });
62
64
  app.get(`${prefix}/sessions/notifications`, async (request, reply) => {
@@ -64,7 +66,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
64
66
  return await sessions.notificationCatalog(managementContextFromHeaders(request.headers));
65
67
  }
66
68
  catch (error) {
67
- return reply.code(400).send({ error: errorMessage(error) });
69
+ return reply.code(400).send({ error: errorMessage(error, t) });
68
70
  }
69
71
  });
70
72
  app.get(`${prefix}/sessions/unread`, async (request, reply) => {
@@ -72,7 +74,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
72
74
  return await sessions.unreadCatalog(managementContextFromHeaders(request.headers));
73
75
  }
74
76
  catch (error) {
75
- return reply.code(503).send({ error: errorMessage(error) });
77
+ return reply.code(503).send({ error: errorMessage(error, t) });
76
78
  }
77
79
  });
78
80
  app.post(`${prefix}/sessions/:sessionId/unread/acknowledge`, async (request, reply) => {
@@ -88,13 +90,13 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
88
90
  };
89
91
  }
90
92
  catch (error) {
91
- return reply.code(400).send({ error: errorMessage(error) });
93
+ return reply.code(400).send({ error: errorMessage(error, t) });
92
94
  }
93
95
  try {
94
96
  return await sessions.acknowledgeUnread(sessionId, acknowledgement, managementContextFromHeaders(request.headers));
95
97
  }
96
98
  catch (error) {
97
- return reply.code(503).send({ error: errorMessage(error) });
99
+ return reply.code(503).send({ error: errorMessage(error, t) });
98
100
  }
99
101
  });
100
102
  app.post(`${prefix}/sessions/cleanup/preview`, async (request, reply) => {
@@ -102,7 +104,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
102
104
  return await sessions.cleanupPreview(normalizeSessionCleanupRequest(optionalRecord(request.body)));
103
105
  }
104
106
  catch (error) {
105
- return reply.code(400).send({ error: errorMessage(error) });
107
+ return reply.code(400).send({ error: errorMessage(error, t) });
106
108
  }
107
109
  });
108
110
  app.post(`${prefix}/sessions/cleanup`, async (request, reply) => {
@@ -110,7 +112,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
110
112
  return await sessions.cleanup(normalizeSessionCleanupRequest(optionalRecord(request.body)), managementContextFromHeaders(request.headers));
111
113
  }
112
114
  catch (error) {
113
- return reply.code(400).send({ error: errorMessage(error) });
115
+ return reply.code(400).send({ error: errorMessage(error, t) });
114
116
  }
115
117
  });
116
118
  app.post(`${prefix}/sessions/bulk/archive`, async (request, reply) => {
@@ -118,7 +120,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
118
120
  return await sessions.archiveMany(bulkMutationRefsFromBody(request.body), managementContextFromHeaders(request.headers));
119
121
  }
120
122
  catch (error) {
121
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
123
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
122
124
  }
123
125
  });
124
126
  app.post(`${prefix}/sessions/bulk/delete-archived`, async (request, reply) => {
@@ -126,7 +128,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
126
128
  return await sessions.deleteArchivedMany(bulkMutationRefsFromBody(request.body), managementContextFromHeaders(request.headers));
127
129
  }
128
130
  catch (error) {
129
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
131
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
130
132
  }
131
133
  });
132
134
  app.put(`${prefix}/sessions/:sessionId/pin`, async (request, reply) => {
@@ -135,7 +137,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
135
137
  return await sessions.setPinned(sessionLookupFromRequiredCwd(request.params.sessionId, body), true, managementContextFromHeaders(request.headers));
136
138
  }
137
139
  catch (error) {
138
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
140
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
139
141
  }
140
142
  });
141
143
  app.delete(`${prefix}/sessions/:sessionId/pin`, async (request, reply) => {
@@ -143,7 +145,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
143
145
  return await sessions.setPinned(sessionLookupFromRequiredCwd(request.params.sessionId, request.query), false, managementContextFromHeaders(request.headers));
144
146
  }
145
147
  catch (error) {
146
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
148
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
147
149
  }
148
150
  });
149
151
  app.get(`${prefix}/sessions/:sessionId/notifications`, async (request, reply) => {
@@ -151,7 +153,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
151
153
  return await sessions.notificationInbox(notificationRefFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
152
154
  }
153
155
  catch (error) {
154
- return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
156
+ return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
155
157
  }
156
158
  });
157
159
  app.post(`${prefix}/sessions/:sessionId/notifications/dismiss`, async (request, reply) => {
@@ -164,7 +166,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
164
166
  }, managementContextFromHeaders(request.headers));
165
167
  }
166
168
  catch (error) {
167
- return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
169
+ return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
168
170
  }
169
171
  });
170
172
  app.post(`${prefix}/sessions/:sessionId/notifications/dismiss-all`, async (request, reply) => {
@@ -178,11 +180,11 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
178
180
  }, managementContextFromHeaders(request.headers));
179
181
  }
180
182
  catch (error) {
181
- return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
183
+ return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
182
184
  }
183
185
  });
184
186
  app.get(`${prefix}/sessions/:sessionId/messages`, async (request, reply) => {
185
- const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply);
187
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
186
188
  if (ref === undefined)
187
189
  return reply;
188
190
  try {
@@ -191,18 +193,18 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
191
193
  return projectBrowserMessageResponse(messages);
192
194
  }
193
195
  catch (error) {
194
- return reply.code(404).send({ error: errorMessage(error) });
196
+ return reply.code(404).send({ error: errorMessage(error, t) });
195
197
  }
196
198
  });
197
199
  app.get(`${prefix}/sessions/:sessionId/status`, async (request, reply) => {
198
- const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply);
200
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
199
201
  if (ref === undefined)
200
202
  return reply;
201
203
  try {
202
204
  return await sessions.status(ref, managementContextFromHeaders(request.headers));
203
205
  }
204
206
  catch (error) {
205
- return reply.code(404).send({ error: errorMessage(error) });
207
+ return reply.code(404).send({ error: errorMessage(error, t) });
206
208
  }
207
209
  });
208
210
  app.get(`${prefix}/sessions/search-content`, async (request, reply) => {
@@ -214,40 +216,40 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
214
216
  return await sessions.searchContent(normalizeRequestCwd(request.query.cwd), request.query.q, managementContextFromHeaders(request.headers));
215
217
  }
216
218
  catch (error) {
217
- return reply.code(400).send({ error: errorMessage(error) });
219
+ return reply.code(400).send({ error: errorMessage(error, t) });
218
220
  }
219
221
  });
220
222
  app.get(`${prefix}/sessions/:sessionId/stream-snapshot`, async (request, reply) => {
221
- const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply);
223
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
222
224
  if (ref === undefined)
223
225
  return reply;
224
226
  try {
225
227
  return await sessions.streamSnapshot(ref, managementContextFromHeaders(request.headers));
226
228
  }
227
229
  catch (error) {
228
- return reply.code(404).send({ error: errorMessage(error) });
230
+ return reply.code(404).send({ error: errorMessage(error, t) });
229
231
  }
230
232
  });
231
233
  app.get(`${prefix}/sessions/:sessionId/models`, async (request, reply) => {
232
- const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply);
234
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
233
235
  if (ref === undefined)
234
236
  return reply;
235
237
  try {
236
238
  return { models: await sessions.availableModels(ref, managementContextFromHeaders(request.headers)) };
237
239
  }
238
240
  catch (error) {
239
- return reply.code(404).send({ error: errorMessage(error) });
241
+ return reply.code(404).send({ error: errorMessage(error, t) });
240
242
  }
241
243
  });
242
244
  app.get(`${prefix}/sessions/:sessionId/models/catalog`, async (request, reply) => {
243
- const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply);
245
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
244
246
  if (ref === undefined)
245
247
  return reply;
246
248
  try {
247
249
  return { models: await sessions.modelCatalog(ref, managementContextFromHeaders(request.headers)) };
248
250
  }
249
251
  catch (error) {
250
- return reply.code(404).send({ error: errorMessage(error) });
252
+ return reply.code(404).send({ error: errorMessage(error, t) });
251
253
  }
252
254
  });
253
255
  app.post(`${prefix}/sessions/:sessionId/models/enabled`, async (request, reply) => {
@@ -256,7 +258,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
256
258
  return { models: await sessions.setModelEnabled(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "provider"), requireString(body, "modelId"), requireBoolean(body, "enabled"), managementContextFromHeaders(request.headers)) };
257
259
  }
258
260
  catch (error) {
259
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
261
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
260
262
  }
261
263
  });
262
264
  app.post(`${prefix}/sessions/:sessionId/models/scope`, async (request, reply) => {
@@ -264,11 +266,11 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
264
266
  const body = optionalRecord(request.body);
265
267
  const mode = body["mode"];
266
268
  if (!isSessionModelScopeMode(mode))
267
- throw new Error("mode 字段必须是 all 或 current");
269
+ throw new Error(t("server.main.6a6ece1f173c", "mode field must be all or current"));
268
270
  return { models: await sessions.setModelScope(sessionLookupFromBody(request.params.sessionId, body), mode, managementContextFromHeaders(request.headers)) };
269
271
  }
270
272
  catch (error) {
271
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
273
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
272
274
  }
273
275
  });
274
276
  app.post(`${prefix}/sessions/:sessionId/model`, async (request, reply) => {
@@ -277,7 +279,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
277
279
  return await sessions.setModel(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "provider"), requireString(body, "modelId"), managementContextFromHeaders(request.headers));
278
280
  }
279
281
  catch (error) {
280
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
282
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
281
283
  }
282
284
  });
283
285
  app.post(`${prefix}/sessions/:sessionId/model/cycle`, async (request, reply) => {
@@ -289,7 +291,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
289
291
  return await sessions.cycleModel(sessionLookupFromBody(request.params.sessionId, body), direction ?? "forward", managementContextFromHeaders(request.headers));
290
292
  }
291
293
  catch (error) {
292
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
294
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
293
295
  }
294
296
  });
295
297
  app.get(`${prefix}/sessions/:sessionId/defaults`, async (request, reply) => {
@@ -297,7 +299,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
297
299
  return await sessions.getSessionDefaults(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
298
300
  }
299
301
  catch (error) {
300
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
302
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
301
303
  }
302
304
  });
303
305
  app.post(`${prefix}/sessions/:sessionId/defaults`, async (request, reply) => {
@@ -306,18 +308,18 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
306
308
  return await sessions.setSessionDefaults(sessionLookupFromBody(request.params.sessionId, body), parseSessionDefaultsUpdate(body), managementContextFromHeaders(request.headers));
307
309
  }
308
310
  catch (error) {
309
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
311
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
310
312
  }
311
313
  });
312
314
  app.get(`${prefix}/sessions/:sessionId/thinking-levels`, async (request, reply) => {
313
- const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply);
315
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
314
316
  if (ref === undefined)
315
317
  return reply;
316
318
  try {
317
319
  return { levels: await sessions.availableThinkingLevels(ref, managementContextFromHeaders(request.headers)) };
318
320
  }
319
321
  catch (error) {
320
- return reply.code(404).send({ error: errorMessage(error) });
322
+ return reply.code(404).send({ error: errorMessage(error, t) });
321
323
  }
322
324
  });
323
325
  app.post(`${prefix}/sessions/:sessionId/thinking-level`, async (request, reply) => {
@@ -328,7 +330,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
328
330
  return await sessions.setThinkingLevel(sessionLookupFromBody(request.params.sessionId, body), requireThinkingLevel(body["level"]), managementContextFromHeaders(request.headers));
329
331
  }
330
332
  catch (error) {
331
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
333
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
332
334
  }
333
335
  });
334
336
  app.post(`${prefix}/sessions/:sessionId/thinking-level/cycle`, async (request, reply) => {
@@ -337,18 +339,18 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
337
339
  return await sessions.cycleThinkingLevel(sessionLookupFromBody(request.params.sessionId, body), managementContextFromHeaders(request.headers));
338
340
  }
339
341
  catch (error) {
340
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
342
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
341
343
  }
342
344
  });
343
345
  app.get(`${prefix}/sessions/:sessionId/commands`, async (request, reply) => {
344
- const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply);
346
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
345
347
  if (ref === undefined)
346
348
  return reply;
347
349
  try {
348
350
  return await sessions.commands(ref, managementContextFromHeaders(request.headers));
349
351
  }
350
352
  catch (error) {
351
- return reply.code(404).send({ error: errorMessage(error) });
353
+ return reply.code(404).send({ error: errorMessage(error, t) });
352
354
  }
353
355
  });
354
356
  app.post(`${prefix}/sessions/:sessionId/prompt`, async (request, reply) => {
@@ -359,7 +361,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
359
361
  return { accepted: true };
360
362
  }
361
363
  catch (error) {
362
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
364
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
363
365
  }
364
366
  });
365
367
  app.post(`${prefix}/sessions/:sessionId/queue/clear`, async (request, reply) => {
@@ -367,7 +369,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
367
369
  return await sessions.clearQueue(sessionLookupFromBody(request.params.sessionId, optionalRecord(request.body)), managementContextFromHeaders(request.headers));
368
370
  }
369
371
  catch (error) {
370
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
372
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
371
373
  }
372
374
  });
373
375
  app.post(`${prefix}/sessions/:sessionId/ask/submit`, async (request, reply) => {
@@ -377,7 +379,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
377
379
  return await sessions.submitAsk(sessionLookupFromBody(request.params.sessionId, body), askId, askUserSubmissionFromBody(body), managementContextFromHeaders(request.headers));
378
380
  }
379
381
  catch (error) {
380
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
382
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
381
383
  }
382
384
  });
383
385
  app.post(`${prefix}/sessions/:sessionId/ask/cancel`, async (request, reply) => {
@@ -386,7 +388,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
386
388
  return await sessions.cancelAsk(sessionLookupFromBody(request.params.sessionId, body), requireBoundedId(body["askId"], "askId"), managementContextFromHeaders(request.headers));
387
389
  }
388
390
  catch (error) {
389
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
391
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
390
392
  }
391
393
  });
392
394
  app.post(`${prefix}/sessions/:sessionId/dialogs/answer`, async (request, reply) => {
@@ -396,7 +398,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
396
398
  return await sessions.answerDialog(sessionLookupFromBody(request.params.sessionId, body), answer.dialogId, answer.value, managementContextFromHeaders(request.headers));
397
399
  }
398
400
  catch (error) {
399
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
401
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
400
402
  }
401
403
  });
402
404
  app.post(`${prefix}/sessions/:sessionId/dialogs/cancel`, async (request, reply) => {
@@ -406,7 +408,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
406
408
  return await sessions.cancelDialog(sessionLookupFromBody(request.params.sessionId, body), cancel.dialogId, managementContextFromHeaders(request.headers));
407
409
  }
408
410
  catch (error) {
409
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
411
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
410
412
  }
411
413
  });
412
414
  app.post(`${prefix}/sessions/:sessionId/warnings/dismiss`, async (request, reply) => {
@@ -415,7 +417,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
415
417
  return await sessions.dismissWarning(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "dismissId"), managementContextFromHeaders(request.headers));
416
418
  }
417
419
  catch (error) {
418
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
420
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
419
421
  }
420
422
  });
421
423
  app.post(`${prefix}/sessions/:sessionId/attachments`, async (request, reply) => {
@@ -428,7 +430,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
428
430
  return { attachments };
429
431
  }
430
432
  catch (error) {
431
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
433
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
432
434
  }
433
435
  });
434
436
  app.post(`${prefix}/sessions/:sessionId/shell`, async (request, reply) => {
@@ -438,7 +440,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
438
440
  return { accepted: true };
439
441
  }
440
442
  catch (error) {
441
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
443
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
442
444
  }
443
445
  });
444
446
  app.post(`${prefix}/sessions/:sessionId/commands/run`, async (request, reply) => {
@@ -447,7 +449,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
447
449
  return await sessions.runCommand(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "text"), managementContextFromHeaders(request.headers));
448
450
  }
449
451
  catch (error) {
450
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
452
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
451
453
  }
452
454
  });
453
455
  app.post(`${prefix}/sessions/:sessionId/commands/respond`, async (request, reply) => {
@@ -456,7 +458,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
456
458
  return await sessions.respondToCommand(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "requestId"), requireString(body, "value"), managementContextFromHeaders(request.headers));
457
459
  }
458
460
  catch (error) {
459
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
461
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
460
462
  }
461
463
  });
462
464
  app.post(`${prefix}/sessions/:sessionId/tree/navigate`, async (request, reply) => {
@@ -465,7 +467,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
465
467
  return await sessions.navigateTree(sessionLookupFromBody(request.params.sessionId, body), sessionTreeNavigateRequestFromBody(body), managementContextFromHeaders(request.headers));
466
468
  }
467
469
  catch (error) {
468
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
470
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
469
471
  }
470
472
  });
471
473
  app.post(`${prefix}/sessions/:sessionId/tree/fork`, async (request, reply) => {
@@ -474,7 +476,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
474
476
  return await sessions.forkFromTree(sessionLookupFromBody(request.params.sessionId, body), sessionTreeForkRequestFromBody(body), managementContextFromHeaders(request.headers));
475
477
  }
476
478
  catch (error) {
477
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
479
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
478
480
  }
479
481
  });
480
482
  app.post(`${prefix}/sessions/:sessionId/abort`, async (request, reply) => {
@@ -483,7 +485,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
483
485
  return { aborted: true };
484
486
  }
485
487
  catch (error) {
486
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
488
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
487
489
  }
488
490
  });
489
491
  app.post(`${prefix}/sessions/:sessionId/stop`, async (request, reply) => {
@@ -492,7 +494,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
492
494
  return { stopped: true };
493
495
  }
494
496
  catch (error) {
495
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
497
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
496
498
  }
497
499
  });
498
500
  app.post(`${prefix}/sessions/:sessionId/archive`, async (request, reply) => {
@@ -501,7 +503,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
501
503
  return { archived: true };
502
504
  }
503
505
  catch (error) {
504
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
506
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
505
507
  }
506
508
  });
507
509
  app.post(`${prefix}/sessions/:sessionId/archive-tree`, async (request, reply) => {
@@ -509,7 +511,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
509
511
  return await sessions.archiveTree(sessionLookupFromBody(request.params.sessionId, optionalRecord(request.body)), managementContextFromHeaders(request.headers));
510
512
  }
511
513
  catch (error) {
512
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
514
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
513
515
  }
514
516
  });
515
517
  app.post(`${prefix}/sessions/:sessionId/restore`, async (request, reply) => {
@@ -518,7 +520,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
518
520
  return { restored: true };
519
521
  }
520
522
  catch (error) {
521
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
523
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
522
524
  }
523
525
  });
524
526
  app.delete(`${prefix}/sessions/:sessionId`, async (request, reply) => {
@@ -527,7 +529,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
527
529
  return { deleted: true };
528
530
  }
529
531
  catch (error) {
530
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
532
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
531
533
  }
532
534
  });
533
535
  app.post(`${prefix}/sessions/:sessionId/reload`, async (request, reply) => {
@@ -536,7 +538,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
536
538
  return { reloaded: true };
537
539
  }
538
540
  catch (error) {
539
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
541
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
540
542
  }
541
543
  });
542
544
  app.post(`${prefix}/sessions/:sessionId/detach-parent`, async (request, reply) => {
@@ -545,7 +547,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
545
547
  return { detached: true };
546
548
  }
547
549
  catch (error) {
548
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
550
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
549
551
  }
550
552
  });
551
553
  app.get(`${prefix}/sessions/:sessionId/events`, { websocket: true }, (socket, request) => {
@@ -574,7 +576,7 @@ function parseBulkMutationRef(value) {
574
576
  throw new Error("id field must not be empty");
575
577
  const cwd = record["cwd"];
576
578
  if (typeof cwd !== "string" || cwd === "")
577
- throw new Error("cwd field is required");
579
+ throw new UserFacingError("routing.cwdRequired", "cwd field is required");
578
580
  return { id, cwd: normalizeRequestCwd(cwd) };
579
581
  }
580
582
  function notificationRefFromQuery(id, query) {
@@ -591,12 +593,12 @@ function notificationRef(id, cwd) {
591
593
  cwd: normalizeRequestCwd(cwd),
592
594
  };
593
595
  }
594
- function sessionRefFromQueryOr400(id, query, reply) {
596
+ function sessionRefFromQueryOr400(id, query, reply, t) {
595
597
  try {
596
598
  return sessionLookupFromQuery(id, query);
597
599
  }
598
600
  catch (error) {
599
- reply.code(400).send({ error: errorMessage(error) });
601
+ reply.code(400).send({ error: errorMessage(error, t) });
600
602
  return undefined;
601
603
  }
602
604
  }
@@ -620,7 +622,7 @@ function sessionLookupFromBody(id, body) {
620
622
  function sessionLookupFromRequiredCwd(id, value, message = "cwd query parameter is required") {
621
623
  const cwd = value.cwd;
622
624
  if (typeof cwd !== "string" || cwd === "")
623
- throw new Error(message);
625
+ throw new UserFacingError(message === "cwd field is required" ? "routing.cwdRequired" : "routing.cwdQueryRequired", message);
624
626
  return { id, cwd: normalizeRequestCwd(cwd) };
625
627
  }
626
628
  function sessionTreeNavigateRequestFromBody(body) {
@@ -701,10 +703,10 @@ function extensionDialogAnswerFromBody(body) {
701
703
  return { dialogId, value };
702
704
  if (typeof value === "string") {
703
705
  if (value.length > EXTENSION_DIALOG_INPUT_MAX_LENGTH)
704
- throw new Error("value exceeds its length limit");
706
+ throw new UserFacingError("routing.valueLength", "value exceeds its length limit");
705
707
  return { dialogId, value };
706
708
  }
707
- throw new Error("value must be a boolean or string");
709
+ throw new UserFacingError("routing.valueType", "value must be a boolean or string");
708
710
  }
709
711
  function extensionDialogCancelFromBody(body) {
710
712
  return { dialogId: requireNonEmptyBoundedString(body["dialogId"], "dialogId", EXTENSION_DIALOG_ID_MAX_LENGTH) };
@@ -787,8 +789,8 @@ function optionalNumber(value) {
787
789
  function isSessionModelScopeMode(value) {
788
790
  return value === "all" || value === "current";
789
791
  }
790
- function errorMessage(error) {
791
- return error instanceof Error ? error.message : String(error);
792
+ function errorMessage(error, t = loadNodeTranslator("server")) {
793
+ return userFacingErrorMessage(error, t);
792
794
  }
793
795
  function mutationErrorStatus(error) {
794
796
  return isSessionNotFoundError(error) ? 404 : 400;
@@ -797,7 +799,7 @@ function notificationErrorStatus(error) {
797
799
  return isSessionNotFoundError(error) ? 404 : 400;
798
800
  }
799
801
  function isSessionNotFoundError(error) {
800
- const message = errorMessage(error);
802
+ const message = error instanceof Error ? error.message : String(error);
801
803
  return message === "Session not found" || message === "Archived session not found" || message === "未找到会话" || message === "未找到已归档会话";
802
804
  }
803
805
  function isRecord(value) {