nolo-cli 0.1.23 → 0.1.29

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 (931) hide show
  1. package/README.md +25 -3
  2. package/agent-runtime/dialogStatus.ts +139 -0
  3. package/agent-runtime/hybridRecordStore.ts +30 -9
  4. package/agent-runtime/index.ts +8 -0
  5. package/agent-runtime/localLoop.ts +12 -4
  6. package/agent-runtime/localToolPolicy.ts +22 -10
  7. package/agent-runtime/localWorkspaceTools.ts +140 -374
  8. package/agent-runtime/runtimeToolPolicy.ts +43 -2
  9. package/agent-runtime/types.ts +5 -0
  10. package/agentAliases.ts +12 -15
  11. package/agentCommandSupport.ts +77 -0
  12. package/agentCreateCustomCommands.ts +273 -0
  13. package/agentDialogsCommands.ts +226 -0
  14. package/agentDoctorCommands.ts +203 -0
  15. package/agentInternalCommandEntries.ts +43 -0
  16. package/agentListCommands.ts +132 -0
  17. package/agentListHelpers.ts +187 -0
  18. package/agentMachineCommands.ts +476 -0
  19. package/agentPullCommand.ts +9 -9
  20. package/agentRecordCommands.ts +141 -0
  21. package/agentRecordHelpers.ts +452 -0
  22. package/agentRunCommand.ts +35 -411
  23. package/agentRunLocalWorkspace.ts +182 -0
  24. package/agentRunParsing.ts +279 -0
  25. package/agentRuntimeCommands.ts +7 -701
  26. package/agentSuperviseCommands.ts +8 -0
  27. package/agentUnpublishCommands.ts +112 -0
  28. package/ai/agent/_executeModel.ts +42 -16
  29. package/ai/agent/agentSlice.ts +8 -8
  30. package/ai/agent/appWorkingMemory.ts +2 -2
  31. package/ai/agent/avatarUtils.ts +1 -1
  32. package/ai/agent/buildEditingContext.ts +3 -3
  33. package/ai/agent/buildSystemPrompt.ts +32 -6
  34. package/ai/agent/cleanAgentMessages.ts +1 -1
  35. package/ai/agent/cliChatClient.ts +41 -7
  36. package/ai/agent/cliExecutor.ts +308 -27
  37. package/ai/agent/createAgentSchema.ts +3 -3
  38. package/ai/agent/executeToolCall.ts +2 -2
  39. package/ai/agent/fetchAgentContexts.ts +3 -3
  40. package/ai/agent/getFullChatContextKeys.ts +4 -4
  41. package/ai/agent/guidedCreation/assistant.ts +82 -0
  42. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  43. package/ai/agent/guidedCreation/draft.ts +62 -0
  44. package/ai/agent/guidedCreation/types.ts +38 -0
  45. package/ai/agent/hooks/fetchPublicAgents.ts +6 -6
  46. package/ai/agent/hooks/useAgentConfig.ts +49 -21
  47. package/ai/agent/hooks/useAgentDialog.ts +1 -1
  48. package/ai/agent/hooks/useAgentFormValidation.ts +9 -9
  49. package/ai/agent/hooks/usePublicAgents.ts +9 -9
  50. package/ai/agent/machineRunPermissions.ts +21 -3
  51. package/ai/agent/persistMessageWithFixedId.ts +4 -4
  52. package/ai/agent/planSlice.ts +1 -1
  53. package/ai/agent/referenceUtils.ts +4 -4
  54. package/ai/agent/runAgentBackground.ts +3 -3
  55. package/ai/agent/runAgentClientLoop.ts +12 -12
  56. package/ai/agent/runtimeGuidance.ts +2 -2
  57. package/ai/agent/server/fetchPublicAgents.ts +12 -7
  58. package/ai/agent/startParallelAgentStreams.ts +12 -12
  59. package/ai/agent/streamAgentChatTurn.ts +509 -36
  60. package/ai/agent/streamAgentChatTurnUtils.ts +22 -22
  61. package/ai/agent/utils/imageOutput.ts +2 -2
  62. package/ai/agent/utils/publicImageAgentMode.ts +1 -1
  63. package/ai/agent/utils/sortUtils.ts +1 -1
  64. package/ai/agent/web/useGuidedAgentCreation.ts +238 -0
  65. package/ai/ai.locale.ts +14 -2
  66. package/ai/chat/fetchUtils.native.ts +2 -2
  67. package/ai/chat/fetchUtils.ts +2 -2
  68. package/ai/chat/sendOpenAICompletionsRequest.native.ts +11 -11
  69. package/ai/chat/sendOpenAICompletionsRequest.ts +40 -15
  70. package/ai/chat/sendOpenAIResponseRequest.ts +17 -16
  71. package/ai/chat/shouldUseServerProxy.ts +1 -1
  72. package/ai/chat/updateTotalUsage.ts +1 -1
  73. package/ai/context/buildReferenceContext.ts +14 -14
  74. package/ai/context/calculateContextUsage.ts +1 -1
  75. package/ai/llm/generateRequestBody.ts +3 -3
  76. package/ai/llm/getPricing.ts +18 -4
  77. package/ai/llm/hooks/useModelPricing.ts +2 -2
  78. package/ai/llm/imagePricing.ts +1 -1
  79. package/ai/llm/kimi.ts +3 -0
  80. package/ai/llm/modelAvatar.ts +1 -0
  81. package/ai/llm/models.ts +3 -3
  82. package/ai/llm/providers.ts +9 -9
  83. package/ai/memory/capture.ts +1 -1
  84. package/ai/memory/consolidate.ts +1 -1
  85. package/ai/memory/delete.ts +2 -2
  86. package/ai/memory/query.ts +1 -1
  87. package/ai/memory/queryShared.ts +1 -1
  88. package/ai/memory/recentRelationshipRecap.ts +2 -2
  89. package/ai/memory/remember.ts +1 -1
  90. package/ai/memory/store.ts +1 -1
  91. package/ai/memory/storeShared.ts +2 -2
  92. package/ai/memory/understanding.ts +1 -1
  93. package/ai/messages/type.ts +1 -1
  94. package/ai/policy/personalizationDialog.ts +6 -6
  95. package/ai/policy/runtimePolicy.ts +1 -1
  96. package/ai/skills/referenceRuntime.ts +1 -1
  97. package/ai/skills/skillDiagnostics.ts +1 -1
  98. package/ai/skills/skillDocBuilder.ts +1 -1
  99. package/ai/skills/skillReferenceSummary.ts +1 -1
  100. package/ai/skills/skillSummaryMarker.ts +1 -1
  101. package/ai/taskRun/taskRunProtocol.ts +24 -10
  102. package/ai/token/calculatePrice.ts +5 -5
  103. package/ai/token/db.ts +3 -3
  104. package/ai/token/externalToolCost.ts +4 -4
  105. package/ai/token/hooks/useRecords.ts +3 -3
  106. package/ai/token/modelUsageQuery.ts +19 -2
  107. package/ai/token/openaiImageGenerationUsage.ts +2 -2
  108. package/ai/token/prepareTokenUsageData.ts +1 -1
  109. package/ai/token/query.ts +1 -1
  110. package/ai/token/queryUserTokens.ts +1 -1
  111. package/ai/token/resolveBillingTarget.ts +1 -1
  112. package/ai/token/saveTokenRecord.ts +5 -5
  113. package/ai/token/serverDialogProjection.ts +4 -4
  114. package/ai/token/serverTokenWriter.ts +3 -3
  115. package/ai/token/tokenThunks.ts +1 -1
  116. package/ai/tools/agent/agentTools.ts +21 -0
  117. package/ai/tools/agent/agentUpdateShared.ts +4 -4
  118. package/ai/tools/agent/callAgentTool.ts +3 -3
  119. package/ai/tools/agent/createAgentTool.ts +12 -12
  120. package/ai/tools/agent/createDialogTool.ts +3 -3
  121. package/ai/tools/agent/parallelBudget.ts +2 -2
  122. package/ai/tools/agent/prepareAgentDraftTool.ts +173 -0
  123. package/ai/tools/agent/presets/appBuilderPreset.ts +1 -1
  124. package/ai/tools/agent/runLlmTool.ts +1 -1
  125. package/ai/tools/agent/skillAgentPreset.ts +6 -6
  126. package/ai/tools/agent/updateAgentTool.ts +4 -4
  127. package/ai/tools/agent/updateSelfTool.ts +8 -8
  128. package/ai/tools/appTools.ts +3 -3
  129. package/ai/tools/category/createCategoryTool.ts +2 -2
  130. package/ai/tools/category/queryContentsByCategoryTool.ts +2 -2
  131. package/ai/tools/category/updateContentCategoryTool.ts +2 -2
  132. package/ai/tools/checkEnvTool.ts +52 -20
  133. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  134. package/ai/tools/createDocTool.ts +3 -3
  135. package/ai/tools/createPlanTool.ts +9 -9
  136. package/ai/tools/createSkillDocTool.ts +4 -4
  137. package/ai/tools/createWorkflowTool.ts +2 -2
  138. package/ai/tools/deleteSpacesTool.ts +5 -5
  139. package/ai/tools/deleteSpacesToolModel.ts +1 -1
  140. package/ai/tools/doctorSkillTool.ts +3 -3
  141. package/ai/tools/evalSkillTool.ts +3 -3
  142. package/ai/tools/{execBashTool.ts → execShellTool.ts} +44 -161
  143. package/ai/tools/executeSqlTool.ts +1 -1
  144. package/ai/tools/geminiImagePreviewTool.ts +9 -9
  145. package/ai/tools/importDataTool.ts +2 -2
  146. package/ai/tools/importSkillTool.ts +4 -4
  147. package/ai/tools/index.ts +61 -14
  148. package/ai/tools/listUserSpacesTool.ts +2 -2
  149. package/ai/tools/localFilesTool.ts +85 -9
  150. package/ai/tools/marxistsOfflineBook.ts +253 -0
  151. package/ai/tools/modelUsageTools.ts +4 -2
  152. package/ai/tools/openaiImageTool.ts +9 -9
  153. package/ai/tools/readDocTool.ts +3 -3
  154. package/ai/tools/readTool.ts +40 -9
  155. package/ai/tools/rememberMemoryTool.ts +3 -3
  156. package/ai/tools/remotionVideoTool.ts +7 -7
  157. package/ai/tools/searchDialogMessagesTool.ts +2 -2
  158. package/ai/tools/searchWorkspaceTool.ts +4 -4
  159. package/ai/tools/table/addTableRowTool.ts +2 -2
  160. package/ai/tools/table/createTableTool.ts +2 -2
  161. package/ai/tools/table/rowTools.ts +2 -2
  162. package/ai/tools/table/schemaTools.ts +3 -3
  163. package/ai/tools/table/shareTableTool.ts +5 -5
  164. package/ai/tools/table/toolShared.ts +6 -6
  165. package/ai/tools/toolApiClient.ts +49 -6
  166. package/ai/tools/toolNameAliases.ts +13 -0
  167. package/ai/tools/toolRunSlice.ts +2 -2
  168. package/ai/tools/updateContentTitleTool.ts +2 -2
  169. package/ai/tools/updateDocTool.ts +7 -7
  170. package/ai/tools/updateUserPreferenceProfileTool.ts +3 -3
  171. package/ai/workflow/workflowExecutor.ts +3 -3
  172. package/ai/workflow/workflowSlice.ts +1 -1
  173. package/app/actions/syncAppRecord.ts +73 -0
  174. package/app/admin/adminPages.ts +13 -0
  175. package/app/colors.ts +1 -0
  176. package/app/constants/animationSets.ts +21 -0
  177. package/app/constants/appEditor.ts +99 -0
  178. package/app/constants/clientDownloads.ts +54 -0
  179. package/app/constants/desktopReleaseManifest.ts +68 -0
  180. package/app/constants/homeTabs.ts +15 -0
  181. package/app/constants/routePaths.ts +15 -0
  182. package/app/email/emailApiRoutes.ts +14 -0
  183. package/app/favorite/favoriteSlice.ts +690 -0
  184. package/app/favorite/type.ts +43 -0
  185. package/app/favorite/useAgentFavorite.ts +43 -0
  186. package/app/favorite/useContentFavorite.ts +41 -0
  187. package/app/fetchOwnedApps.ts +269 -0
  188. package/app/guide/quickStartGuide.ts +128 -0
  189. package/app/hooks/deleteDbKey.ts +233 -0
  190. package/app/hooks/index.ts +4 -0
  191. package/app/hooks/useAppDetail.ts +208 -0
  192. package/app/hooks/useAppVersions.ts +52 -0
  193. package/app/hooks/useAutoResizeTextarea.ts +29 -0
  194. package/app/hooks/useChatPageTitle.ts +85 -0
  195. package/app/hooks/useClipboardFiles.ts +20 -0
  196. package/app/hooks/useDesktopLocalConnectorAutostart.ts +38 -0
  197. package/app/hooks/useDragResize.ts +91 -0
  198. package/app/hooks/useElementSizeVar.ts +24 -0
  199. package/app/hooks/useFileDropZone.ts +52 -0
  200. package/app/hooks/useHasMounted.ts +11 -0
  201. package/app/hooks/useImageLoadFallback.ts +19 -0
  202. package/app/hooks/useIsMobile.ts +46 -0
  203. package/app/hooks/useMyApps.ts +375 -0
  204. package/app/hooks/useMyContentItems.ts +91 -0
  205. package/app/hooks/useNewMessageNotification.ts +81 -0
  206. package/app/hooks/usePageMeta.ts +107 -0
  207. package/app/hooks/useRecentlyOpened.ts +84 -0
  208. package/app/hooks/useUnifiedStore.ts +11 -0
  209. package/app/hooks/useUserNotifications.ts +197 -0
  210. package/app/hooks.ts +55 -0
  211. package/app/i18n/clientResources.ts +65 -0
  212. package/app/i18n/i18n.base.ts +14 -0
  213. package/app/i18n/i18n.config.ts +62 -0
  214. package/app/i18n/i18n.server.ts +13 -0
  215. package/app/i18n/index.ts +15 -0
  216. package/app/i18n/mapLanguage.ts +11 -0
  217. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  218. package/app/i18n/translations/error.locale.ts +246 -0
  219. package/app/i18n/translations/interface.locale.ts +2174 -0
  220. package/app/i18n/translations/seo.locale.ts +129 -0
  221. package/app/i18n/types.ts +6 -0
  222. package/app/notifications/formatNotification.ts +134 -0
  223. package/app/notifications/model.ts +77 -0
  224. package/app/notifications/notificationSlice.ts +141 -0
  225. package/app/notifications/useNotificationActions.ts +67 -0
  226. package/app/pages/homeTabState.ts +57 -0
  227. package/app/pages/quickChatFlow.ts +109 -0
  228. package/app/pages/rechargeCheckout.ts +23 -0
  229. package/app/pages/usePageArt.ts +91 -0
  230. package/app/realtime/sharedSse.ts +182 -0
  231. package/app/reducer.ts +36 -0
  232. package/app/seo/pageMeta.ts +123 -0
  233. package/app/settings/config.ts +54 -0
  234. package/app/settings/dbActionThunks.ts +34 -0
  235. package/app/settings/defaultSpacePreference.ts +87 -0
  236. package/app/settings/navItems.ts +73 -0
  237. package/app/settings/prepareUserSetting.ts +11 -0
  238. package/app/settings/settingsRecord.ts +8 -0
  239. package/app/settings/web/chat-config/useAutoSaveGlobalPrompt.ts +59 -0
  240. package/app/settings/web/machineStatus.ts +23 -0
  241. package/app/settings/web/useSettingsStylesheet.ts +28 -0
  242. package/app/settings/web/userSecurityUtils.ts +21 -0
  243. package/app/stateViews/runtime.ts +86 -0
  244. package/app/store.ts +53 -0
  245. package/app/theme/colors.ts +280 -0
  246. package/app/theme/fontPreference.ts +77 -0
  247. package/app/theme/index.ts +7 -0
  248. package/app/theme/theme.config.ts +120 -0
  249. package/app/theme/themeModeBootstrap.ts +123 -0
  250. package/app/theme/useSystemTheme.ts +33 -0
  251. package/app/types/appSummary.ts +114 -0
  252. package/app/types.ts +358 -0
  253. package/app/utils/appDeploySource.ts +50 -0
  254. package/app/utils/appKeys.ts +55 -0
  255. package/app/utils/appRuntimeUrl.ts +51 -0
  256. package/app/utils/async.ts +28 -0
  257. package/app/utils/asyncMapStatus.ts +31 -0
  258. package/app/utils/clipboard.ts +86 -0
  259. package/app/utils/credits.ts +12 -0
  260. package/app/utils/desktopAgentRuntimeStatusClient.ts +42 -0
  261. package/app/utils/desktopAgentRuntimeTurnClient.ts +70 -0
  262. package/app/utils/desktopLocalConnectorClient.ts +83 -0
  263. package/app/utils/env.ts +12 -0
  264. package/app/utils/excelToSlate.ts +430 -0
  265. package/app/utils/fileReaders.ts +12 -0
  266. package/app/utils/fileUtils.ts +229 -0
  267. package/app/utils/imageUtils.native.ts +96 -0
  268. package/app/utils/imageUtils.ts +244 -0
  269. package/app/utils/ime.ts +43 -0
  270. package/app/utils/myContentItems.ts +290 -0
  271. package/app/utils/processDateRange.ts +30 -0
  272. package/app/utils/retryFetch.ts +61 -0
  273. package/app/utils/slateToExcel.ts +58 -0
  274. package/app/utils/toast.native.ts +42 -0
  275. package/app/utils/toast.ts +3 -0
  276. package/app/web/spaceInitGuard.ts +28 -0
  277. package/auth/action/signOutAction.ts +0 -0
  278. package/auth/action/signUpAction.ts +227 -0
  279. package/auth/actor.ts +16 -0
  280. package/auth/authSlice.ts +517 -0
  281. package/auth/billing.ts +130 -0
  282. package/auth/client/deleteUserRequest.ts +86 -0
  283. package/auth/client/loginRequest.ts +14 -0
  284. package/auth/hooks/useAuth.ts +9 -0
  285. package/auth/hooks/useDeleteOwnAccount.ts +50 -0
  286. package/auth/hooks/useDeleteOwnAccountFlow.ts +66 -0
  287. package/auth/hooks/useDeleteUser.ts +45 -0
  288. package/auth/hooks/useEnableUser.ts +50 -0
  289. package/auth/hooks/useFetchUsers.ts +77 -0
  290. package/auth/hooks/useRechargeUser.ts +82 -0
  291. package/auth/index.ts +1 -0
  292. package/auth/invite.ts +19 -0
  293. package/auth/locale.ts +84 -0
  294. package/auth/resetAuthScopedClientState.ts +27 -0
  295. package/auth/rn/tokenManager.ts +72 -0
  296. package/auth/routes.ts +127 -0
  297. package/auth/server/accessActivity.ts +143 -0
  298. package/auth/server/billingFullChainSimulator.ts +325 -0
  299. package/auth/server/billingUsageReport.ts +192 -0
  300. package/auth/server/cliLogin.ts +198 -0
  301. package/auth/server/creatorEarningCreditConversion.ts +515 -0
  302. package/auth/server/creatorEarningsLedger.ts +165 -0
  303. package/auth/server/creatorEarningsReport.ts +299 -0
  304. package/auth/server/creatorSettlementLedger.ts +386 -0
  305. package/auth/server/creatorSettlementReport.ts +442 -0
  306. package/auth/server/creatorSplitConfig.ts +191 -0
  307. package/auth/server/deduct.ts +270 -0
  308. package/auth/server/delete.ts +887 -0
  309. package/auth/server/disable.ts +61 -0
  310. package/auth/server/emailAutomation.ts +358 -0
  311. package/auth/server/emailAutomationConfig.ts +88 -0
  312. package/auth/server/emailAutomationRules.ts +94 -0
  313. package/auth/server/emailAutomationTemplates.ts +131 -0
  314. package/auth/server/emailAutomationTypes.ts +38 -0
  315. package/auth/server/emailDbConfig.ts +147 -0
  316. package/auth/server/emailDelivery.ts +960 -0
  317. package/auth/server/emailDeliveryGuards.ts +282 -0
  318. package/auth/server/emailPolicy.ts +43 -0
  319. package/auth/server/emailPreferences.ts +117 -0
  320. package/auth/server/emailProvider.ts +277 -0
  321. package/auth/server/emailReport.ts +439 -0
  322. package/auth/server/emailRuntimeConfig.ts +86 -0
  323. package/auth/server/emailScenarioNotifications.ts +340 -0
  324. package/auth/server/enable.ts +61 -0
  325. package/auth/server/getRechargeHistory.ts +110 -0
  326. package/auth/server/getUser.ts +71 -0
  327. package/auth/server/inviteReward.ts +295 -0
  328. package/auth/server/inviteRewardEmail.ts +1 -0
  329. package/auth/server/ledger.ts +422 -0
  330. package/auth/server/ledgerAudit.ts +424 -0
  331. package/auth/server/ledgerWitness.ts +472 -0
  332. package/auth/server/listusers.ts +154 -0
  333. package/auth/server/locks.ts +32 -0
  334. package/auth/server/login.ts +184 -0
  335. package/auth/server/productBillingSplits.ts +166 -0
  336. package/auth/server/productEntitlements.ts +139 -0
  337. package/auth/server/productPurchase.ts +382 -0
  338. package/auth/server/recharge.ts +284 -0
  339. package/auth/server/revenueShareLedger.ts +389 -0
  340. package/auth/server/revenueShareReport.ts +258 -0
  341. package/auth/server/revenueSplitPolicy.ts +119 -0
  342. package/auth/server/revokeSessions.ts +59 -0
  343. package/auth/server/route.ts +195 -0
  344. package/auth/server/sendEmail.ts +176 -0
  345. package/auth/server/shared.ts +51 -0
  346. package/auth/server/signup.ts +423 -0
  347. package/auth/server/signupIpQuota.ts +44 -0
  348. package/auth/server/token.ts +109 -0
  349. package/auth/server/tokenUsageBilling.ts +312 -0
  350. package/auth/server/transfer.ts +40 -0
  351. package/auth/server/utils.ts +200 -0
  352. package/auth/sessionTokenVersion.ts +38 -0
  353. package/auth/token.ts +63 -0
  354. package/auth/tokenCookie.ts +1 -0
  355. package/auth/types.ts +28 -0
  356. package/auth/utils.ts +108 -0
  357. package/auth/web/bootstrapAuthState.ts +60 -0
  358. package/auth/web/tokenManager.ts +61 -0
  359. package/auth/web/useRegister.ts +70 -0
  360. package/build.ts +16 -0
  361. package/buildPublish.ts +133 -0
  362. package/buildPublishArtifactAssembly.ts +346 -0
  363. package/buildPublishImportAnalysis.ts +237 -0
  364. package/chat/chat.locale.ts +804 -0
  365. package/chat/dialog/actions/addCybotAction.ts +52 -0
  366. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  367. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  368. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  369. package/chat/dialog/actions/compactDialogAndForkAction.ts +47 -0
  370. package/chat/dialog/actions/createDialogAction.ts +372 -0
  371. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  372. package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
  373. package/chat/dialog/actions/handleSendMessageResolver.ts +29 -0
  374. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  375. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  376. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  377. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  378. package/chat/dialog/actions/updateDialogSummaryAction.ts +405 -0
  379. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  380. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  381. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  382. package/chat/dialog/dialogAgents.ts +54 -0
  383. package/chat/dialog/dialogPageRenderMode.ts +182 -0
  384. package/chat/dialog/dialogSlice.ts +872 -0
  385. package/chat/dialog/dialogTitle.ts +81 -0
  386. package/chat/dialog/dialogTokenStats.ts +12 -0
  387. package/chat/dialog/dialogUrl.ts +6 -0
  388. package/chat/dialog/ensureDialogSpaceAction.ts +208 -0
  389. package/chat/dialog/goal.ts +108 -0
  390. package/chat/dialog/hooks/useStreamingSymbol.ts +63 -0
  391. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  392. package/chat/dialog/schedule.ts +17 -0
  393. package/chat/dialog/useCreateDialog.ts +52 -0
  394. package/chat/hooks/sendPermissionResolver.ts +128 -0
  395. package/chat/hooks/useChatInput.ts +99 -0
  396. package/chat/hooks/useChatInputSeed.ts +31 -0
  397. package/chat/hooks/useMessageInteraction.ts +412 -0
  398. package/chat/hooks/useSendPermission.ts +92 -0
  399. package/chat/hooks/useThinkingVisibility.ts +27 -0
  400. package/chat/messages/browserImageUrl.ts +48 -0
  401. package/chat/messages/deleteMessages.ts +47 -0
  402. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  403. package/chat/messages/fetchConvMsgs.ts +51 -0
  404. package/chat/messages/fetchMessages.ts +84 -0
  405. package/chat/messages/fileUrl.ts +13 -0
  406. package/chat/messages/generateMessageKey.ts +21 -0
  407. package/chat/messages/hooks/useBase64Migration.ts +115 -0
  408. package/chat/messages/messageAgent.ts +8 -0
  409. package/chat/messages/messageContent.ts +199 -0
  410. package/chat/messages/messageContract.ts +88 -0
  411. package/chat/messages/messageSlice.ts +1191 -0
  412. package/chat/messages/pendingAttachmentParts.ts +117 -0
  413. package/chat/messages/sendFirstMessage.ts +193 -0
  414. package/chat/messages/toolPresentation.ts +212 -0
  415. package/chat/messages/toolThunks.ts +625 -0
  416. package/chat/messages/types.ts +176 -0
  417. package/chat/messages/web/ChatDisplayContext.ts +14 -0
  418. package/chat/messages/web/ToolMessageTypes.ts +23 -0
  419. package/chat/messages/web/diffViewerModel.ts +61 -0
  420. package/chat/messages/web/groupToolEntries.ts +44 -0
  421. package/chat/messages/web/groupToolMessages.ts +35 -0
  422. package/chat/messages/web/inlineReactArtifactParser.ts +63 -0
  423. package/chat/messages/web/toolDisplayName.ts +22 -0
  424. package/chat/messages/web/useLoopStopReason.ts +43 -0
  425. package/chat/messages/ziweiChartDoc.ts +94 -0
  426. package/chat/web/docxToSlate.ts +597 -0
  427. package/chat/web/fileProcessor.ts +442 -0
  428. package/chat/web/hooks/useProgressiveDisplayCount.ts +102 -0
  429. package/chat/web/messageInputAgentUi.ts +189 -0
  430. package/chat/web/messageInputKeyBehavior.ts +53 -0
  431. package/chat/web/messageInputMention.ts +102 -0
  432. package/chat/web/messageInputSendResolver.ts +51 -0
  433. package/chat/web/messageSlashCommands.ts +10 -0
  434. package/chat/web/pdfOcrProcessor.ts +131 -0
  435. package/chat/web/sidebar/allViewSearch.ts +87 -0
  436. package/chat/web/sidebar/types.ts +12 -0
  437. package/chat/web/sidebar/useChatSidebarFilteredData.ts +141 -0
  438. package/chat/web/sidebar/useSidebarDragAndDrop.ts +56 -0
  439. package/cliCommandAdapters.ts +28 -0
  440. package/cliCommandDispatch.ts +66 -0
  441. package/cliCommandFactories.ts +66 -0
  442. package/cliCommandTypes.ts +49 -0
  443. package/cliEnvHelpers.ts +130 -0
  444. package/cliIoTypes.ts +3 -0
  445. package/client/agentRun.test.ts +123 -19
  446. package/client/agentRun.ts +62 -226
  447. package/client/agentRunLocalExecution.test.ts +123 -0
  448. package/client/agentRunLocalExecution.ts +124 -0
  449. package/client/agentRunRuntimeSelection.test.ts +158 -0
  450. package/client/agentRunRuntimeSelection.ts +155 -0
  451. package/client/hybridRecordStore.test.ts +42 -0
  452. package/client/hybridRecordStore.ts +11 -0
  453. package/client/localRuntimeAdapter.test.ts +189 -21
  454. package/client/localRuntimeAdapter.ts +84 -8
  455. package/client/localRuntimeDryRun.test.ts +5 -2
  456. package/client/profileConfig.test.ts +66 -0
  457. package/client/profileConfig.ts +41 -0
  458. package/client/streamingOutput.ts +1 -3
  459. package/client/taskRunPrompt.ts +7 -23
  460. package/commandRegistry.ts +13 -63
  461. package/connector-experimental/capabilities.ts +1 -0
  462. package/connector-experimental/daemonLauncher.ts +189 -0
  463. package/core/builtinAgents.ts +58 -0
  464. package/core/coin.ts +42 -0
  465. package/core/config.ts +15 -0
  466. package/core/crypto.ts +51 -0
  467. package/core/events/types.ts +145 -0
  468. package/core/generateKeyPairFromSeedV1.ts +15 -0
  469. package/core/generateMainKey.ts +22 -0
  470. package/core/init.ts +41 -0
  471. package/core/localOrigins.ts +8 -0
  472. package/core/password.ts +13 -0
  473. package/core/prefix.ts +23 -0
  474. package/create/editor/blockCommands.ts +118 -0
  475. package/create/editor/highlightExample.ts +66 -0
  476. package/create/editor/imageUpload.ts +66 -0
  477. package/create/editor/mark.ts +15 -0
  478. package/create/editor/plugins/normalizeChineseTypography.ts +85 -0
  479. package/create/editor/plugins/withBlockStructure.ts +53 -0
  480. package/create/editor/plugins/withChineseTypography.ts +61 -0
  481. package/create/editor/plugins/withLayout.ts +30 -0
  482. package/create/editor/plugins/withLinks.ts +13 -0
  483. package/create/editor/plugins/withMentions.ts +15 -0
  484. package/create/editor/plugins/withTables.ts +52 -0
  485. package/create/editor/tableCommands.ts +270 -0
  486. package/create/editor/theme/prism/default.ts +145 -0
  487. package/create/editor/theme/prism/githubDark.ts +139 -0
  488. package/create/editor/theme/prism/githubLight.ts +139 -0
  489. package/create/editor/theme/prism/index.ts +23 -0
  490. package/create/editor/theme/prism/okaidia.ts +197 -0
  491. package/create/editor/toolMentionOptions.ts +19 -0
  492. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  493. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  494. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  495. package/create/editor/transforms/markdownToSlate.ts +24 -0
  496. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  497. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  498. package/create/editor/transforms/slateToText.ts +33 -0
  499. package/create/editor/types.ts +120 -0
  500. package/create/editor/utils/editorFactory.ts +54 -0
  501. package/create/editor/utils/hasPlainCodeBlock.ts +39 -0
  502. package/create/editor/utils/linkCommands.ts +63 -0
  503. package/create/editor/utils/pdfToSlate.ts +706 -0
  504. package/create/editor/utils/slateUtils.ts +233 -0
  505. package/create/editor/utils/txtToSlate.ts +40 -0
  506. package/create/hooks/category.ts +82 -0
  507. package/create/routePaths.ts +5 -0
  508. package/create/space/addSpaceAction.ts +193 -0
  509. package/create/space/category/categoryActions.ts +427 -0
  510. package/create/space/changeSpaceAction.ts +36 -0
  511. package/create/space/constants.ts +8 -0
  512. package/create/space/content/addContentAction.ts +116 -0
  513. package/create/space/content/contentThunks.ts +90 -0
  514. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  515. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  516. package/create/space/content/moveContentAction.ts +285 -0
  517. package/create/space/content/updateContentCategoryAction.ts +154 -0
  518. package/create/space/content/updateContentTitleAction.ts +106 -0
  519. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  520. package/create/space/contentKeyUtils.ts +117 -0
  521. package/create/space/contentLabels.ts +56 -0
  522. package/create/space/contentTypeMeta.ts +169 -0
  523. package/create/space/deleteSpaceAction.ts +276 -0
  524. package/create/space/fetchSpaceAction.ts +70 -0
  525. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  526. package/create/space/hooks/agentFetchRetry.ts +19 -0
  527. package/create/space/hooks/useAgentFetcher.ts +149 -0
  528. package/create/space/hooks/useGroupedContent.ts +118 -0
  529. package/create/space/hooks/useSpaceEvents.ts +43 -0
  530. package/create/space/initialSpace.ts +78 -0
  531. package/create/space/loadDefaultSpaceAction.ts +57 -0
  532. package/create/space/member/addMemberAction.ts +79 -0
  533. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  534. package/create/space/member/memberThunks.ts +47 -0
  535. package/create/space/member/removeMemberAction.ts +67 -0
  536. package/create/space/publicCatalogSpace.ts +39 -0
  537. package/create/space/resolvePreferredSpaceId.ts +113 -0
  538. package/create/space/sidebarVisibleTypes.ts +214 -0
  539. package/create/space/space.locale.ts +981 -0
  540. package/create/space/spaceAccess.ts +182 -0
  541. package/create/space/spaceCollapsedState.ts +54 -0
  542. package/create/space/spaceKeys.ts +65 -0
  543. package/create/space/spaceSlice.ts +328 -0
  544. package/create/space/spaceThunks.ts +410 -0
  545. package/create/space/types.ts +27 -0
  546. package/create/space/updateSpaceAction.ts +107 -0
  547. package/create/space/utils/permissions.ts +47 -0
  548. package/create/space/validateSpacePermission.ts +38 -0
  549. package/create/types.ts +21 -0
  550. package/create/version/appVersionReplication.ts +160 -0
  551. package/create/version/versionApi.ts +142 -0
  552. package/customCodingAgentFlow.ts +208 -0
  553. package/customCodingAgentRecord.ts +179 -0
  554. package/database/actions/agentReadResolution.ts +33 -0
  555. package/database/actions/cacheMergedUserData.ts +1 -1
  556. package/database/actions/common.ts +44 -8
  557. package/database/actions/fetchUserData.ts +1 -1
  558. package/database/actions/fileContent.ts +3 -3
  559. package/database/actions/patch.ts +3 -3
  560. package/database/actions/read.ts +115 -76
  561. package/database/actions/readAndWait.ts +54 -86
  562. package/database/actions/readOutcome.ts +45 -0
  563. package/database/actions/readResolution.ts +102 -0
  564. package/database/actions/remove.ts +2 -2
  565. package/database/actions/upload.ts +4 -4
  566. package/database/actions/upsert.ts +2 -2
  567. package/database/actions/write.ts +4 -4
  568. package/database/client/handleError.ts +1 -1
  569. package/database/client/queryRequest.ts +1 -1
  570. package/database/dbSlice.ts +2 -2
  571. package/database/email.ts +1 -1
  572. package/database/hooks/useUserData.ts +4 -4
  573. package/database/keys.ts +2 -2
  574. package/database/runtimeServerContext.ts +3 -3
  575. package/database/server/actorAccess.ts +1 -1
  576. package/database/server/coreDataProxy.ts +43 -26
  577. package/database/server/cybotReadonly.ts +1 -1
  578. package/database/server/dataHandlers.ts +1 -1
  579. package/database/server/delete.ts +8 -8
  580. package/database/server/emailRepository.ts +7 -7
  581. package/database/server/fileService.ts +1 -1
  582. package/database/server/handleTransaction.ts +2 -2
  583. package/database/server/patch.ts +3 -3
  584. package/database/server/read.ts +5 -5
  585. package/database/server/resourceAccess.ts +2 -2
  586. package/database/server/routes.ts +3 -3
  587. package/database/server/write.ts +5 -5
  588. package/database/table/deleteTable.ts +1 -1
  589. package/database/userPreferenceRegister.ts +2 -2
  590. package/dialogDataAccess.ts +186 -0
  591. package/dialogInternalCommandEntries.ts +11 -0
  592. package/dialogReadCommands.ts +179 -0
  593. package/dialogReadHelpers.ts +226 -0
  594. package/dialogStatusCommands.ts +122 -0
  595. package/docInternalCommandEntries.ts +20 -0
  596. package/hybridReadHelpers.ts +109 -0
  597. package/index.ts +56 -197
  598. package/integrations/anthropic/anthropicModels.ts +47 -0
  599. package/integrations/anthropic/type.ts +41 -0
  600. package/integrations/deepseek/models.ts +67 -0
  601. package/integrations/google/models.ts +298 -0
  602. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  603. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  604. package/integrations/openai/flexTier.ts +102 -0
  605. package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
  606. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  607. package/integrations/openai/models.ts +271 -0
  608. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  609. package/integrations/openai/responsesHelpers.ts +297 -0
  610. package/integrations/postmark/index.ts +57 -0
  611. package/integrations/resend/index.ts +353 -0
  612. package/integrations/weather/getWeather.ts +24 -0
  613. package/integrations/weather/index.ts +6 -0
  614. package/integrations/weather/routes.ts +31 -0
  615. package/integrations/weather/weatherApi.ts +27 -0
  616. package/integrations/weather/weatherConstants.ts +2 -0
  617. package/integrations/weather/weatherI18n.ts +50 -0
  618. package/integrations/weather/weatherService.ts +50 -0
  619. package/integrations/weather/weatherTypes.ts +140 -0
  620. package/integrations/weather/weatherUtils.ts +46 -0
  621. package/integrations/x-reader/backends/localBrowser.ts +215 -0
  622. package/integrations/x-reader/backends/publicFallback.ts +31 -0
  623. package/integrations/x-reader/backends/rawCdp.ts +218 -0
  624. package/integrations/x-reader/bridge/chromeBridgeManager.ts +235 -0
  625. package/integrations/x-reader/bridge/readXPostWithBridge.ts +73 -0
  626. package/integrations/x-reader/fixtureParser.ts +101 -0
  627. package/integrations/x-reader/index.ts +9 -0
  628. package/integrations/x-reader/redaction.ts +27 -0
  629. package/integrations/x-reader/types.ts +109 -0
  630. package/integrations/x-reader/visibleTextParser.ts +108 -0
  631. package/integrations/xai/models.ts +13 -0
  632. package/internalCommandEntries.ts +20 -0
  633. package/machineCommandPrompts.ts +77 -0
  634. package/machineCommandResolution.ts +43 -0
  635. package/machineCommands.ts +104 -853
  636. package/machineDaemonCommands.ts +29 -0
  637. package/machineHeartbeatCommands.ts +29 -0
  638. package/machineStatusCommands.ts +95 -0
  639. package/machineWatchCommands.ts +41 -0
  640. package/machineWsPromptMaterialization.ts +89 -0
  641. package/machineWsRunDispatch.ts +570 -0
  642. package/machineWsSession.ts +148 -0
  643. package/package.json +126 -4
  644. package/pageCreateCommands.ts +219 -0
  645. package/pageDeleteCommands.ts +167 -0
  646. package/pageReadCommands.ts +151 -0
  647. package/pageUpdateCommands.ts +249 -0
  648. package/pageWriteHelpers.ts +209 -0
  649. package/publishPackage.ts +36 -0
  650. package/render/canvas/canvasEditContext.ts +1 -1
  651. package/render/layout/mainLayoutViewMode.ts +1 -1
  652. package/render/page/createPageAction.ts +12 -12
  653. package/render/page/docSlice.ts +8 -8
  654. package/render/page/server/createPage.ts +7 -7
  655. package/render/page/server/handleCreatePage.ts +2 -2
  656. package/render/page/types.ts +2 -2
  657. package/render/surf/utils/groupedWeatherData.ts +1 -1
  658. package/render/table/createTableAction.ts +7 -7
  659. package/render/table/deleteTableAction.ts +4 -4
  660. package/render/table/fetchAndCacheTableRows.ts +2 -2
  661. package/render/table/tableSlice.ts +6 -6
  662. package/render/table/types.ts +1 -1
  663. package/render/table/useCreateTable.ts +2 -2
  664. package/render/table/useTable.ts +2 -2
  665. package/render/table/utils/tableSerialization.ts +1 -1
  666. package/runtimeDoctorCommands.ts +118 -0
  667. package/runtimeInternalCommandEntries.ts +15 -0
  668. package/runtimePassthroughCommands.ts +22 -0
  669. package/scriptCommandEntries.ts +31 -0
  670. package/scriptPassthroughHelpers.ts +28 -0
  671. package/secretScanHelpers.ts +31 -0
  672. package/server/agentEmailRegistrationRoutes.ts +29 -0
  673. package/server/agentRunRouteContract.ts +9 -0
  674. package/server/agentRunRoutes.ts +10 -0
  675. package/server/api/methods.ts +333 -0
  676. package/server/api/tableHandlers.ts +55 -0
  677. package/server/api/types.ts +27 -0
  678. package/server/apiContract.ts +88 -0
  679. package/server/apiRouteAdapter.ts +218 -0
  680. package/server/appBundler.ts +90 -0
  681. package/server/appRoutes.ts +92 -0
  682. package/server/artifactIconsRoute.ts +89 -0
  683. package/server/artifactRuntimeRoute.ts +136 -0
  684. package/server/authenticateToken.ts +73 -0
  685. package/server/billingLedgerRoutes.ts +48 -0
  686. package/server/cliChatRoutes.ts +5 -0
  687. package/server/cloudflareRoutes.ts +35 -0
  688. package/server/coreHeaders.ts +29 -0
  689. package/server/coreReadiness.ts +39 -0
  690. package/server/coreRoutes.ts +65 -0
  691. package/server/coreRuntime.ts +93 -0
  692. package/server/createResponse.ts +68 -0
  693. package/server/cryptoPaymentRoutes.ts +8 -0
  694. package/server/databaseRoutes.ts +225 -0
  695. package/server/desktopRuntimeRoutes.ts +120 -0
  696. package/server/devBuildInfo.ts +51 -0
  697. package/server/devReload.ts +161 -0
  698. package/server/devToolPathPolicy.ts +59 -0
  699. package/server/devToolRoutes.ts +274 -0
  700. package/server/email/cloudflareEmailProvider.ts +119 -0
  701. package/server/email/cloudflareInboundBridge.ts +121 -0
  702. package/server/email/cloudflareInboundWorker.ts +28 -0
  703. package/server/email/provider.ts +149 -0
  704. package/server/email/providerRegistry.ts +22 -0
  705. package/server/emailInboundRoutes.ts +17 -0
  706. package/server/entry.ts +211 -0
  707. package/server/handleRPCRequest.ts +117 -0
  708. package/server/handlers/activityStatsHandler.ts +74 -0
  709. package/server/handlers/agentEmailRegistrationE2EHandler.ts +406 -0
  710. package/server/handlers/agentEmailRegistrationE2ERoutes.ts +6 -0
  711. package/server/handlers/agentRun/agentLookup.ts +77 -0
  712. package/server/handlers/agentRun/autonomousRuntime.ts +355 -0
  713. package/server/handlers/agentRun/backgroundRunDialog.ts +31 -0
  714. package/server/handlers/agentRun/builtinAgents.ts +347 -0
  715. package/server/handlers/agentRun/continueDialogContext.ts +90 -0
  716. package/server/handlers/agentRun/debugContext.ts +58 -0
  717. package/server/handlers/agentRun/dialogLookup.ts +67 -0
  718. package/server/handlers/agentRun/foregroundStreamDialog.ts +13 -0
  719. package/server/handlers/agentRun/index.ts +1630 -0
  720. package/server/handlers/agentRun/inheritedDialogPrompt.ts +111 -0
  721. package/server/handlers/agentRun/localRuntimeBootstrap.ts +69 -0
  722. package/server/handlers/agentRun/loop.ts +2210 -0
  723. package/server/handlers/agentRun/machineConnector.ts +235 -0
  724. package/server/handlers/agentRun/machineRunAudit.ts +49 -0
  725. package/server/handlers/agentRun/modelUsageToolHandlers.ts +368 -0
  726. package/server/handlers/agentRun/referenceRuntime.ts +50 -0
  727. package/server/handlers/agentRun/requestContext.ts +86 -0
  728. package/server/handlers/agentRun/response.ts +27 -0
  729. package/server/handlers/agentRun/runBilling.ts +108 -0
  730. package/server/handlers/agentRun/runDialogPreparation.ts +55 -0
  731. package/server/handlers/agentRun/runtimeBinding.ts +61 -0
  732. package/server/handlers/agentRun/runtimeContext.ts +143 -0
  733. package/server/handlers/agentRun/runtimeExecutionContext.ts +153 -0
  734. package/server/handlers/agentRun/runtimePreparation.ts +193 -0
  735. package/server/handlers/agentRun/runtimeRouting.ts +88 -0
  736. package/server/handlers/agentRun/runtimeSystemMessages.ts +165 -0
  737. package/server/handlers/agentRun/saveDialog.ts +1373 -0
  738. package/server/handlers/agentRun/syncRunDialog.ts +90 -0
  739. package/server/handlers/agentRun/tableActivityProjection.ts +132 -0
  740. package/server/handlers/agentRun/taskRunControlPrompt.ts +122 -0
  741. package/server/handlers/agentRun/taskRunToolHandler.ts +579 -0
  742. package/server/handlers/agentRun/toolExecutor.ts +2909 -0
  743. package/server/handlers/agentRun/toolPolicyGuards.ts +295 -0
  744. package/server/handlers/agentRun/types.ts +94 -0
  745. package/server/handlers/agentRun/workspaceLease.ts +58 -0
  746. package/server/handlers/alphaTestRouteGuard.ts +30 -0
  747. package/server/handlers/apifyActorHandler.ts +170 -0
  748. package/server/handlers/appDeployFlow.ts +876 -0
  749. package/server/handlers/appDeployHandler.ts +4 -0
  750. package/server/handlers/appDeployMutationHandlers.ts +133 -0
  751. package/server/handlers/appDeployReadHandlers.ts +321 -0
  752. package/server/handlers/appDeployShared.ts +230 -0
  753. package/server/handlers/appDeployStatusStore.ts +178 -0
  754. package/server/handlers/appDomainHandler.ts +476 -0
  755. package/server/handlers/appLegacyInfraCleanup.ts +7 -0
  756. package/server/handlers/appSandboxHandler.ts +1055 -0
  757. package/server/handlers/appSourceReadiness.ts +75 -0
  758. package/server/handlers/appSpaceAccess.ts +179 -0
  759. package/server/handlers/applyEditHandler.ts +544 -0
  760. package/server/handlers/applyLineEditsHandler.ts +1058 -0
  761. package/server/handlers/billingLedgerAuditHandler.ts +82 -0
  762. package/server/handlers/billingLedgerWitnessHandler.ts +161 -0
  763. package/server/handlers/billingUsageReportHandler.ts +90 -0
  764. package/server/handlers/browserToolHandler.ts +450 -0
  765. package/server/handlers/cfTextToSpeechHandler.ts +137 -0
  766. package/server/handlers/cfWhisperHandler.ts +206 -0
  767. package/server/handlers/chatBillingSse.ts +79 -0
  768. package/server/handlers/chatHandler.ts +797 -0
  769. package/server/handlers/chatProxyRouting.ts +404 -0
  770. package/server/handlers/chatUpstreamRetry.ts +162 -0
  771. package/server/handlers/checkEnvHandler.ts +250 -0
  772. package/server/handlers/cliChatHandler.ts +266 -0
  773. package/server/handlers/cloudflareBrowserHandler.ts +275 -0
  774. package/server/handlers/cloudflareCrawlHandler.ts +260 -0
  775. package/server/handlers/codeSearchHandler.ts +484 -0
  776. package/server/handlers/connector/connectorConnectionRegistry.ts +192 -0
  777. package/server/handlers/connector/connectorWebSocket.ts +117 -0
  778. package/server/handlers/creatorEarningsReportHandler.ts +97 -0
  779. package/server/handlers/creatorSettlementReportHandler.ts +98 -0
  780. package/server/handlers/deepseekOcrHandler.ts +114 -0
  781. package/server/handlers/deleteMemoryHandler.ts +115 -0
  782. package/server/handlers/desktopAgentRuntimeAdapter.ts +307 -0
  783. package/server/handlers/desktopAgentRuntimeHostFacts.ts +40 -0
  784. package/server/handlers/desktopAgentRuntimeStatusHandler.ts +54 -0
  785. package/server/handlers/desktopAgentRuntimeTurnHandler.ts +165 -0
  786. package/server/handlers/desktopAgentRuntimeTurnService.ts +352 -0
  787. package/server/handlers/desktopClipboardHandler.ts +104 -0
  788. package/server/handlers/desktopFiles/handler.ts +159 -0
  789. package/server/handlers/desktopFiles/operations.ts +202 -0
  790. package/server/handlers/desktopFiles/sandbox.ts +62 -0
  791. package/server/handlers/desktopFiles/store.ts +81 -0
  792. package/server/handlers/desktopLlamaRuntimeHandler.ts +360 -0
  793. package/server/handlers/desktopLocalConnectorHandler.ts +101 -0
  794. package/server/handlers/desktopUpdaterHandler.ts +132 -0
  795. package/server/handlers/dialogEvents.ts +10 -0
  796. package/server/handlers/emailInboundHandler.ts +65 -0
  797. package/server/handlers/eventBus.ts +160 -0
  798. package/server/handlers/exaSearchHandler.ts +73 -0
  799. package/server/handlers/execShellHandler.ts +661 -0
  800. package/server/handlers/favoriteHandlers.ts +417 -0
  801. package/server/handlers/fetchWebpageHandler.ts +117 -0
  802. package/server/handlers/fileOutlineHandler.ts +107 -0
  803. package/server/handlers/geminiImagePreviewHandler.ts +612 -0
  804. package/server/handlers/getDialogBillingHandler.ts +151 -0
  805. package/server/handlers/getTransactionsHandler.ts +107 -0
  806. package/server/handlers/googleNativeChat.ts +572 -0
  807. package/server/handlers/listFilesHandler.ts +139 -0
  808. package/server/handlers/machines/machineAuth.ts +149 -0
  809. package/server/handlers/machines/machineBinding.ts +59 -0
  810. package/server/handlers/machines/machineHandlers.ts +279 -0
  811. package/server/handlers/machines/machineInstallAssets.ts +563 -0
  812. package/server/handlers/machines/machineRegistry.ts +89 -0
  813. package/server/handlers/notificationEmitter.ts +189 -0
  814. package/server/handlers/notificationsHandler.ts +91 -0
  815. package/server/handlers/olmOcrHandler.ts +115 -0
  816. package/server/handlers/openaiImageHandler.ts +500 -0
  817. package/server/handlers/providerHealthHandler.ts +36 -0
  818. package/server/handlers/publicHandler.ts +209 -0
  819. package/server/handlers/readFileHandler.ts +300 -0
  820. package/server/handlers/readXPostHandler.ts +180 -0
  821. package/server/handlers/rememberMemoryHandler.ts +69 -0
  822. package/server/handlers/remotionRenderHandler.ts +236 -0
  823. package/server/handlers/renderMarkdownHandler.ts +66 -0
  824. package/server/handlers/revenueShareReportHandler.ts +96 -0
  825. package/server/handlers/searchRepoHandler.ts +159 -0
  826. package/server/handlers/tableAccess.ts +34 -0
  827. package/server/handlers/tableToolHandlers.ts +741 -0
  828. package/server/handlers/typecheckWorker.ts +54 -0
  829. package/server/handlers/userEvents.ts +6 -0
  830. package/server/handlers/userSecretsHandler.ts +210 -0
  831. package/server/handlers/versionHandler.ts +281 -0
  832. package/server/handlers/versionStore.ts +176 -0
  833. package/server/handlers/wereadGatewayHandler.ts +48 -0
  834. package/server/handlers/whisperHandler.ts +158 -0
  835. package/server/handlers/writeFileHandler.ts +168 -0
  836. package/server/html/desktopReleaseManifest.server.ts +17 -0
  837. package/server/html/generateErrorResponse.ts +22 -0
  838. package/server/html/serializeState.ts +9 -0
  839. package/server/html/ssrPreload.ts +247 -0
  840. package/server/html/template.ts +275 -0
  841. package/server/httpCompression.ts +102 -0
  842. package/server/index.ts +0 -0
  843. package/server/liveReloadScript.ts +105 -0
  844. package/server/luIconNames.ts +14 -0
  845. package/server/machineRoutes.ts +44 -0
  846. package/server/mediaRoutes.ts +25 -0
  847. package/server/memoryRoutes.ts +14 -0
  848. package/server/normalizedStatusRoutes.ts +23 -0
  849. package/server/payments/crypto/cryptoUsdcBaseAddressPool.ts +49 -0
  850. package/server/payments/crypto/cryptoUsdcBaseConfig.ts +120 -0
  851. package/server/payments/crypto/cryptoUsdcBasePaymentProvider.ts +134 -0
  852. package/server/payments/crypto/cryptoUsdcBaseScanner.ts +267 -0
  853. package/server/payments/crypto/cryptoUsdcBaseWatcher.ts +40 -0
  854. package/server/payments/crypto/cryptoUsdtTronAddressPool.ts +49 -0
  855. package/server/payments/crypto/cryptoUsdtTronConfig.ts +120 -0
  856. package/server/payments/crypto/cryptoUsdtTronPaymentProvider.ts +132 -0
  857. package/server/payments/crypto/cryptoUsdtTronScanner.ts +313 -0
  858. package/server/payments/crypto/cryptoUsdtTronWatcher.ts +40 -0
  859. package/server/payments/paymentProvider.ts +6 -0
  860. package/server/payments/paymentRoutes.ts +27 -0
  861. package/server/payments/rechargeCredits.ts +69 -0
  862. package/server/payments/waffo/waffoPaymentProvider.ts +341 -0
  863. package/server/preview/previewCapability.ts +90 -0
  864. package/server/preview/previewConfig.ts +54 -0
  865. package/server/preview/previewGateway.ts +71 -0
  866. package/server/preview/previewRealtime.ts +33 -0
  867. package/server/providerHealthProbe.ts +198 -0
  868. package/server/providerHealthRoutes.ts +19 -0
  869. package/server/publicPaths.ts +12 -0
  870. package/server/publicRequestHandler.ts +15 -0
  871. package/server/reactAppBuilder.ts +416 -0
  872. package/server/realtimeRoutes.ts +69 -0
  873. package/server/renderStream.ts +20 -0
  874. package/server/routeFactory.ts +45 -0
  875. package/server/routes.ts +125 -0
  876. package/server/safeTempFile.ts +48 -0
  877. package/server/scheduler/scheduledTaskRuntime.ts +228 -0
  878. package/server/scheduler/schedulerService.ts +290 -0
  879. package/server/serverDrain.ts +129 -0
  880. package/server/services/browserSessionManager.ts +354 -0
  881. package/server/shareRoutes.ts +86 -0
  882. package/server/sqliteRoutes.ts +141 -0
  883. package/server/taskRunBridgeRoutes.ts +95 -0
  884. package/server/tasks.ts +113 -0
  885. package/server/waffoPaymentRoutes.ts +5 -0
  886. package/server/webUtilityRoutes.ts +50 -0
  887. package/server/workerValidator.ts +224 -0
  888. package/share/action.ts +225 -0
  889. package/share/clientTableReplication.ts +160 -0
  890. package/share/helpers.ts +302 -0
  891. package/share/keys.ts +243 -0
  892. package/share/link.ts +40 -0
  893. package/share/loadOwnerShares.ts +154 -0
  894. package/share/paidAccess.ts +32 -0
  895. package/share/publicSharePolicy.ts +27 -0
  896. package/share/server/fetchCommunityShares.ts +45 -0
  897. package/share/server/helpers.ts +202 -0
  898. package/share/server/importShare.ts +148 -0
  899. package/share/server/listCommunityShares.ts +167 -0
  900. package/share/server/purchaseDoc.ts +224 -0
  901. package/share/server/readCommunityShareCover.ts +73 -0
  902. package/share/server/readSharedTable.ts +139 -0
  903. package/share/server/tableReplication.ts +351 -0
  904. package/share/shareSlice.ts +53 -0
  905. package/share/tableShareState.ts +74 -0
  906. package/share/types.ts +100 -0
  907. package/spaceCategoryCommands.ts +263 -0
  908. package/spaceCommands.ts +295 -0
  909. package/spaceDeleteCommands.ts +312 -0
  910. package/spaceInternalCommandEntries.ts +19 -0
  911. package/spaceMutationHelpers.ts +135 -0
  912. package/spaceReadCommands.ts +323 -0
  913. package/systemInternalCommandEntries.ts +65 -0
  914. package/tableCommands.ts +33 -133
  915. package/tableDataOutput.ts +41 -0
  916. package/tableDataSafety.ts +26 -0
  917. package/tableMetaCommands.ts +307 -0
  918. package/tableMutationCommands.ts +266 -0
  919. package/tableQueryParsing.ts +90 -0
  920. package/tableQueryRequest.ts +53 -0
  921. package/taskRunActions.ts +122 -0
  922. package/taskRunCommand.ts +8 -214
  923. package/taskRunParsing.ts +86 -0
  924. package/taskRunPromptShared.ts +55 -0
  925. package/tui/session.ts +43 -372
  926. package/tui/tuiCatalog.ts +22 -0
  927. package/tui/tuiCommandInterpreter.test.ts +169 -0
  928. package/tui/tuiCommandInterpreter.ts +253 -0
  929. package/tui/tuiPresentation.test.ts +154 -0
  930. package/tui/tuiPresentation.ts +146 -0
  931. package/workflowInternalCommandEntries.ts +31 -0
@@ -0,0 +1,1058 @@
1
+ // 文件路径: packages/server/handlers/applyLineEditsHandler.ts
2
+
3
+ import path from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { mkdir } from "node:fs/promises";
6
+ import { file as bunFile, write as bunWrite } from "bun";
7
+ import { diffLines } from "diff";
8
+
9
+ const ALLOW_TYPECHECK_BYPASS = process.env.ALLOW_TYPECHECK_BYPASS === "1";
10
+ const DEFAULT_TYPECHECK_TIMEOUT_MS = 15000;
11
+ type CodeEditValidationMode = "syntax" | "typecheck" | "none";
12
+ const DEFAULT_CODE_EDIT_VALIDATION_MODE: CodeEditValidationMode = "syntax";
13
+
14
+ type LineEditCommon = {
15
+ /**
16
+ * 可选:LLM 在规划这次编辑时看到的原始代码片段。
17
+ *
18
+ * 用法建议:
19
+ * - replaceRange / deleteRange:填入 startLine~endLine 对应的那几行原文(用 \n 拼起来)。
20
+ * - insertBefore / insertAfter:填入插入点附近的一两行(通常是插入点所在行)。
21
+ *
22
+ * 行为(提高成功率,而不是拦截):
23
+ * - 后端会把传入的 startLine / endLine / line 当成“粗定位”;
24
+ * - 若提供 originalSnippet,会在这个行号附近优先搜索同样的片段;
25
+ * - 若能在附近找到,就以搜索结果为准自动纠正编辑位置;
26
+ * - 若找不到,则退化为直接按行号编辑(与当前行为一致),不会额外拒绝。
27
+ */
28
+ originalSnippet?: string;
29
+ };
30
+
31
+ type ReplaceRangeEdit = LineEditCommon & {
32
+ type: "replaceRange";
33
+ startLine: number;
34
+ endLine: number;
35
+ replacement: string;
36
+ };
37
+
38
+ type InsertBeforeEdit = LineEditCommon & {
39
+ type: "insertBefore";
40
+ line: number;
41
+ content: string;
42
+ };
43
+
44
+ type InsertAfterEdit = LineEditCommon & {
45
+ type: "insertAfter";
46
+ line: number;
47
+ content: string;
48
+ };
49
+
50
+ type DeleteRangeEdit = LineEditCommon & {
51
+ type: "deleteRange";
52
+ startLine: number;
53
+ endLine: number;
54
+ };
55
+
56
+ type LineEdit =
57
+ | ReplaceRangeEdit
58
+ | InsertBeforeEdit
59
+ | InsertAfterEdit
60
+ | DeleteRangeEdit;
61
+
62
+ interface ApplyLineEditsRequestBody {
63
+ filePath: string;
64
+ edits: LineEdit[];
65
+ }
66
+
67
+ export type TypeCheckResult =
68
+ | {
69
+ success: true;
70
+ kind: "ok";
71
+ errors: string[];
72
+ }
73
+ | {
74
+ success: false;
75
+ kind: "syntax-errors" | "type-errors" | "timeout" | "unavailable";
76
+ errors: string[];
77
+ };
78
+
79
+ type TypeCheckFailureResult = Extract<TypeCheckResult, { success: false }>;
80
+
81
+ const JSON_HEADERS = {
82
+ "Content-Type": "application/json; charset=utf-8",
83
+ "Access-Control-Allow-Origin": "*",
84
+ };
85
+
86
+ // 与 read/write/list/search 保持一致:以当前进程工作目录作为项目根
87
+ const PROJECT_ROOT = path.resolve(process.env.PROJECT_ROOT ?? process.cwd());
88
+ const CODE_EDIT_VALIDATION_MODE = parseCodeEditValidationMode(
89
+ process.env.CODE_EDIT_VALIDATION_MODE
90
+ );
91
+ const TYPECHECK_TIMEOUT_MS = parsePositiveTimeoutMs(
92
+ process.env.TYPECHECK_TIMEOUT_MS,
93
+ DEFAULT_TYPECHECK_TIMEOUT_MS
94
+ );
95
+
96
+ function parseCodeEditValidationMode(
97
+ value: string | undefined
98
+ ): CodeEditValidationMode {
99
+ switch (value) {
100
+ case "none":
101
+ case "typecheck":
102
+ case "syntax":
103
+ return value;
104
+ default:
105
+ return DEFAULT_CODE_EDIT_VALIDATION_MODE;
106
+ }
107
+ }
108
+
109
+ function parsePositiveTimeoutMs(value: string | undefined, fallback: number): number {
110
+ if (!value) return fallback;
111
+ const parsed = Number(value);
112
+ if (!Number.isFinite(parsed) || parsed <= 0) {
113
+ return fallback;
114
+ }
115
+ return Math.floor(parsed);
116
+ }
117
+
118
+ function typeCheckSuccessResult(): TypeCheckResult {
119
+ return { success: true, kind: "ok", errors: [] };
120
+ }
121
+
122
+ export function shouldBypassTypeCheckFailure(
123
+ result: TypeCheckFailureResult,
124
+ allowBypass = ALLOW_TYPECHECK_BYPASS
125
+ ): boolean {
126
+ if (!allowBypass) return false;
127
+ return result.kind === "timeout" || result.kind === "unavailable";
128
+ }
129
+
130
+ function typeCheckFailureResult(
131
+ kind: TypeCheckFailureResult["kind"],
132
+ errors: string[]
133
+ ): TypeCheckFailureResult {
134
+ return { success: false, kind, errors };
135
+ }
136
+
137
+ function isTypeCheckResult(value: unknown): value is TypeCheckResult {
138
+ if (!value || typeof value !== "object") return false;
139
+ const candidate = value as Partial<TypeCheckResult>;
140
+ return (
141
+ typeof candidate.success === "boolean" &&
142
+ (candidate.kind === "ok" ||
143
+ candidate.kind === "syntax-errors" ||
144
+ candidate.kind === "type-errors" ||
145
+ candidate.kind === "timeout" ||
146
+ candidate.kind === "unavailable") &&
147
+ Array.isArray(candidate.errors) &&
148
+ candidate.errors.every((item) => typeof item === "string")
149
+ );
150
+ }
151
+
152
+ function getDisplayPath(filePath: string): string {
153
+ const relativePath = path.relative(PROJECT_ROOT, filePath);
154
+ return relativePath && !relativePath.startsWith("..") ? relativePath : filePath;
155
+ }
156
+
157
+ function getTypeCheckWorkerPath(): string {
158
+ return path.join(PROJECT_ROOT, "packages/server/handlers/typecheckWorker.ts");
159
+ }
160
+
161
+ function getTypeCheckRuntime(): string {
162
+ return Bun.which("bun") ?? process.execPath;
163
+ }
164
+
165
+ function getSyntaxLoader(filePath: string): "js" | "jsx" | "ts" | "tsx" | null {
166
+ switch (path.extname(filePath).toLowerCase()) {
167
+ case ".js":
168
+ return "js";
169
+ case ".jsx":
170
+ return "jsx";
171
+ case ".ts":
172
+ return "ts";
173
+ case ".tsx":
174
+ return "tsx";
175
+ default:
176
+ return null;
177
+ }
178
+ }
179
+
180
+ function formatWorkerStream(text: string): string[] {
181
+ const trimmed = text.trim();
182
+ if (!trimmed) return [];
183
+ return trimmed
184
+ .split("\n")
185
+ .slice(0, 6)
186
+ .map((line) => line.trim())
187
+ .filter(Boolean);
188
+ }
189
+
190
+ async function performTypeCheckInSubprocess(
191
+ filePath: string,
192
+ content: string,
193
+ originalContent: string
194
+ ): Promise<TypeCheckResult> {
195
+ const workerPath = getTypeCheckWorkerPath();
196
+ const displayPath = getDisplayPath(filePath);
197
+
198
+ return await new Promise<TypeCheckResult>((resolve) => {
199
+ let settled = false;
200
+ let stdout = "";
201
+ let stderr = "";
202
+
203
+ const finish = (result: TypeCheckResult) => {
204
+ if (settled) return;
205
+ settled = true;
206
+ resolve(result);
207
+ };
208
+
209
+ const child = spawn(getTypeCheckRuntime(), [workerPath], {
210
+ cwd: PROJECT_ROOT,
211
+ env: process.env,
212
+ stdio: ["pipe", "pipe", "pipe"],
213
+ });
214
+
215
+ const timer = setTimeout(() => {
216
+ child.kill("SIGKILL");
217
+ finish(
218
+ typeCheckFailureResult("timeout", [
219
+ `Type check timed out after ${TYPECHECK_TIMEOUT_MS}ms for ${displayPath}.`,
220
+ ])
221
+ );
222
+ }, TYPECHECK_TIMEOUT_MS);
223
+
224
+ const finishAndCleanup = (result: TypeCheckResult) => {
225
+ clearTimeout(timer);
226
+ finish(result);
227
+ };
228
+
229
+ child.stdout.setEncoding("utf8");
230
+ child.stdout.on("data", (chunk: string) => {
231
+ stdout += chunk;
232
+ });
233
+
234
+ child.stderr.setEncoding("utf8");
235
+ child.stderr.on("data", (chunk: string) => {
236
+ stderr += chunk;
237
+ });
238
+
239
+ child.on("error", (error) => {
240
+ finishAndCleanup(
241
+ typeCheckFailureResult("unavailable", [
242
+ `Type check worker failed to start for ${displayPath}: ${error.message}`,
243
+ ])
244
+ );
245
+ });
246
+
247
+ child.stdin.on("error", (error) => {
248
+ finishAndCleanup(
249
+ typeCheckFailureResult("unavailable", [
250
+ `Failed to send type check payload for ${displayPath}: ${error.message}`,
251
+ ])
252
+ );
253
+ });
254
+
255
+ child.on("close", (code, signal) => {
256
+ if (settled) return;
257
+ clearTimeout(timer);
258
+
259
+ const trimmedStdout = stdout.trim();
260
+ if (code === 0) {
261
+ if (!trimmedStdout) {
262
+ finish(
263
+ typeCheckFailureResult("unavailable", [
264
+ `Type check worker returned no result for ${displayPath}.`,
265
+ ...formatWorkerStream(stderr),
266
+ ])
267
+ );
268
+ return;
269
+ }
270
+
271
+ try {
272
+ const parsed = JSON.parse(trimmedStdout);
273
+ if (!isTypeCheckResult(parsed)) {
274
+ throw new Error("Worker returned invalid type check result shape.");
275
+ }
276
+ finish(parsed);
277
+ return;
278
+ } catch (error) {
279
+ finish(
280
+ typeCheckFailureResult("unavailable", [
281
+ `Failed to parse type check worker output for ${displayPath}: ${
282
+ error instanceof Error ? error.message : String(error)
283
+ }`,
284
+ ...formatWorkerStream(stderr),
285
+ ])
286
+ );
287
+ return;
288
+ }
289
+ }
290
+
291
+ finish(
292
+ typeCheckFailureResult("unavailable", [
293
+ `Type check worker exited unexpectedly for ${displayPath}: code=${code ?? "null"} signal=${signal ?? "none"}.`,
294
+ ...formatWorkerStream(stderr),
295
+ ...formatWorkerStream(trimmedStdout),
296
+ ])
297
+ );
298
+ });
299
+
300
+ child.stdin.end(
301
+ JSON.stringify({
302
+ filePath,
303
+ content,
304
+ originalContent,
305
+ })
306
+ );
307
+ });
308
+ }
309
+
310
+ export function performSyntaxCheck(
311
+ filePath: string,
312
+ content: string
313
+ ): TypeCheckResult {
314
+ const loader = getSyntaxLoader(filePath);
315
+ if (!loader) {
316
+ return typeCheckSuccessResult();
317
+ }
318
+
319
+ try {
320
+ new Bun.Transpiler({ loader }).transformSync(content);
321
+ return typeCheckSuccessResult();
322
+ } catch (error) {
323
+ return typeCheckFailureResult("syntax-errors", [
324
+ `Syntax error in ${getDisplayPath(filePath)}: ${
325
+ error instanceof Error ? error.message : String(error)
326
+ }`,
327
+ ]);
328
+ }
329
+ }
330
+
331
+ export function buildTypeCheckFailureResponse(
332
+ filePath: string,
333
+ result: TypeCheckFailureResult
334
+ ): {
335
+ status: number;
336
+ body: {
337
+ success: false;
338
+ filePath: string;
339
+ error: string;
340
+ details: string[];
341
+ suggestion: string;
342
+ };
343
+ } {
344
+ if (result.kind === "syntax-errors") {
345
+ return {
346
+ status: 400,
347
+ body: {
348
+ success: false,
349
+ filePath,
350
+ error: "Syntax check failed",
351
+ details: result.errors,
352
+ suggestion: "Please fix the syntax errors above and retry.",
353
+ },
354
+ };
355
+ }
356
+
357
+ if (result.kind === "type-errors") {
358
+ return {
359
+ status: 400,
360
+ body: {
361
+ success: false,
362
+ filePath,
363
+ error: "Type check failed",
364
+ details: result.errors,
365
+ suggestion: "Please fix the type errors above and retry.",
366
+ },
367
+ };
368
+ }
369
+
370
+ const error =
371
+ result.kind === "timeout"
372
+ ? "Type check timed out"
373
+ : "Type checker unavailable";
374
+
375
+ return {
376
+ status: 503,
377
+ body: {
378
+ success: false,
379
+ filePath,
380
+ error,
381
+ details: result.errors,
382
+ suggestion:
383
+ "Retry later, reduce the edit scope, or set ALLOW_TYPECHECK_BYPASS=1 for emergency override.",
384
+ },
385
+ };
386
+ }
387
+
388
+ /**
389
+ * 校验并解析 filePath,确保不会跳出 PROJECT_ROOT
390
+ */
391
+ export function resolveSafePath(filePath: string): string {
392
+ if (!filePath || typeof filePath !== "string") {
393
+ throw new Error("Invalid filePath");
394
+ }
395
+
396
+ if (filePath.includes("\0")) {
397
+ throw new Error("Invalid filePath");
398
+ }
399
+
400
+ const absRoot = path.resolve(PROJECT_ROOT);
401
+ const absPath = path.resolve(absRoot, filePath);
402
+ const rel = path.relative(absRoot, absPath);
403
+
404
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
405
+ throw new Error("filePath is outside of project root");
406
+ }
407
+
408
+ return absPath;
409
+ }
410
+
411
+ /**
412
+ * 对 TypeScript 文件执行完整项目级类型检查(仅在 CODE_EDIT_VALIDATION_MODE=typecheck 时使用)
413
+ *
414
+ * 策略:基于项目级 tsconfig + TypeScript Compiler API,
415
+ * 在内存中覆盖目标文件内容进行检查,不写磁盘临时文件。
416
+ */
417
+ export async function performTypeCheckInProcess(
418
+ filePath: string,
419
+ content: string,
420
+ _originalContent: string
421
+ ): Promise<TypeCheckResult> {
422
+ try {
423
+ // 只检查 .ts 和 .tsx 文件
424
+ if (!filePath.match(/\.(ts|tsx)$/i)) {
425
+ return typeCheckSuccessResult();
426
+ }
427
+
428
+ const tsModule = await import("typescript").catch(() => null);
429
+ if (!tsModule) {
430
+ if (ALLOW_TYPECHECK_BYPASS) {
431
+ console.warn("[performTypeCheck] TypeScript module not found, bypassing type check");
432
+ return typeCheckSuccessResult();
433
+ }
434
+ return typeCheckFailureResult("unavailable", ["TypeScript module not found"]);
435
+ }
436
+
437
+ const ts = tsModule.default ?? tsModule;
438
+ const configFilePath = ts.findConfigFile(PROJECT_ROOT, ts.sys.fileExists, "tsconfig.json");
439
+ if (!configFilePath) {
440
+ if (ALLOW_TYPECHECK_BYPASS) {
441
+ console.warn("[performTypeCheck] tsconfig.json not found, bypassing type check");
442
+ return typeCheckSuccessResult();
443
+ }
444
+ return typeCheckFailureResult("unavailable", [
445
+ "tsconfig.json not found in project root",
446
+ ]);
447
+ }
448
+
449
+ const configRead = ts.readConfigFile(configFilePath, ts.sys.readFile);
450
+ if (configRead.error) {
451
+ const message = ts.flattenDiagnosticMessageText(configRead.error.messageText, "\n");
452
+ return typeCheckFailureResult("unavailable", [
453
+ `TS${configRead.error.code}: ${message}`,
454
+ ]);
455
+ }
456
+
457
+ const parsedConfig = ts.parseJsonConfigFileContent(
458
+ configRead.config,
459
+ ts.sys,
460
+ path.dirname(configFilePath),
461
+ undefined,
462
+ configFilePath
463
+ );
464
+ if (parsedConfig.errors && parsedConfig.errors.length > 0) {
465
+ const errors = parsedConfig.errors
466
+ .slice(0, 10)
467
+ .map((diag: any) => `TS${diag.code}: ${ts.flattenDiagnosticMessageText(diag.messageText, "\n")}`);
468
+ return typeCheckFailureResult("unavailable", errors);
469
+ }
470
+
471
+ const targetAbsPath = path.resolve(filePath);
472
+ const rootNames = parsedConfig.fileNames.includes(targetAbsPath)
473
+ ? parsedConfig.fileNames
474
+ : [...parsedConfig.fileNames, targetAbsPath];
475
+
476
+ const compilerOptions = {
477
+ ...parsedConfig.options,
478
+ noEmit: true,
479
+ };
480
+
481
+ const host = ts.createCompilerHost(compilerOptions, true);
482
+ const originalReadFile = host.readFile;
483
+ host.readFile = (name: string): string | undefined => {
484
+ if (path.resolve(name) === targetAbsPath) {
485
+ return content;
486
+ }
487
+ return originalReadFile(name);
488
+ };
489
+
490
+ const program = ts.createProgram({
491
+ rootNames,
492
+ options: compilerOptions,
493
+ host,
494
+ projectReferences: parsedConfig.projectReferences,
495
+ });
496
+
497
+ const allDiagnostics = ts.getPreEmitDiagnostics(program);
498
+ const fileDiagnostics = allDiagnostics.filter((diag: any) => {
499
+ if (!diag.file?.fileName) return false;
500
+ return path.resolve(diag.file.fileName) === targetAbsPath;
501
+ });
502
+
503
+ const blockingDiagnostics = fileDiagnostics.filter((diag: any) => diag.code !== 2307);
504
+
505
+ if (blockingDiagnostics.length > 0) {
506
+ const errors = blockingDiagnostics.slice(0, 10).map((diag: any) => {
507
+ const message = ts.flattenDiagnosticMessageText(diag.messageText, "\n");
508
+ return `TS${diag.code}: ${message}`;
509
+ });
510
+ return typeCheckFailureResult("type-errors", errors);
511
+ }
512
+
513
+ return typeCheckSuccessResult();
514
+ } catch (e) {
515
+ const message = e instanceof Error ? e.message : String(e);
516
+
517
+ if (ALLOW_TYPECHECK_BYPASS) {
518
+ console.warn("[performTypeCheck] Type check bypassed due to ALLOW_TYPECHECK_BYPASS=1:", message);
519
+ return typeCheckSuccessResult();
520
+ }
521
+ return typeCheckFailureResult("unavailable", [
522
+ `Type checker unavailable: ${message}`,
523
+ "Install TypeScript (tsc) on server or set ALLOW_TYPECHECK_BYPASS=1 for emergency override.",
524
+ ]);
525
+ }
526
+ }
527
+
528
+ export async function performTypeCheck(
529
+ filePath: string,
530
+ content: string,
531
+ originalContent: string
532
+ ): Promise<TypeCheckResult> {
533
+ const displayPath = getDisplayPath(filePath);
534
+ const startedAt = Date.now();
535
+ console.log(
536
+ `[performTypeCheck] start file=${displayPath} mode=${CODE_EDIT_VALIDATION_MODE} timeoutMs=${TYPECHECK_TIMEOUT_MS}`
537
+ );
538
+
539
+ let result: TypeCheckResult;
540
+ if (CODE_EDIT_VALIDATION_MODE === "none") {
541
+ result = typeCheckSuccessResult();
542
+ } else if (CODE_EDIT_VALIDATION_MODE === "syntax") {
543
+ result = performSyntaxCheck(filePath, content);
544
+ } else {
545
+ try {
546
+ result = await performTypeCheckInSubprocess(
547
+ filePath,
548
+ content,
549
+ originalContent
550
+ );
551
+ } catch (error) {
552
+ result = typeCheckFailureResult("unavailable", [
553
+ `Failed to run type check for ${displayPath}: ${
554
+ error instanceof Error ? error.message : String(error)
555
+ }`,
556
+ ]);
557
+ }
558
+ }
559
+
560
+ if (!result.success && shouldBypassTypeCheckFailure(result)) {
561
+ console.warn(
562
+ `[performTypeCheck] bypassing ${result.kind} for ${displayPath} because ALLOW_TYPECHECK_BYPASS=1`
563
+ );
564
+ result = typeCheckSuccessResult();
565
+ }
566
+
567
+ console.log(
568
+ `[performTypeCheck] done file=${displayPath} mode=${CODE_EDIT_VALIDATION_MODE} success=${result.success} kind=${result.kind} durationMs=${
569
+ Date.now() - startedAt
570
+ }`
571
+ );
572
+ return result;
573
+ }
574
+
575
+ /** 校验并强制解析为正整数:支持字符串数字("5")和整数浮点(5.0),<= 0 报验证错误 */
576
+ export function ensurePositiveInt(value: unknown, name: string): number {
577
+ let n: number;
578
+ if (typeof value === "string") {
579
+ n = Number(value);
580
+ } else if (typeof value === "number") {
581
+ n = value;
582
+ } else {
583
+ throw Object.assign(new Error(`${name} must be positive integer, got ${JSON.stringify(value)}`), { isValidation: true });
584
+ }
585
+ if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0) {
586
+ // 对整数浮点(如 5.0)做自动取整
587
+ const floored = Math.floor(n);
588
+ if (floored > 0 && Math.abs(n - floored) < 1e-9) return floored;
589
+ throw Object.assign(new Error(`${name} must be positive integer, got ${value}`), { isValidation: true });
590
+ }
591
+ return n;
592
+ }
593
+
594
+ // ---- snippet 辅助函数(纯函数,方便单测)----
595
+
596
+ type LineRange = { startLine: number; endLine: number };
597
+
598
+ /**
599
+ * 把 \r\n 正规化成 \n 再按行拆分。
600
+ */
601
+ export function splitToLines(text: string): string[] {
602
+ if (!text) return [];
603
+ const normalized =
604
+ text.indexOf("\r\n") >= 0 ? text.replace(/\r\n/g, "\n") : text;
605
+ return normalized.split("\n");
606
+ }
607
+
608
+ /**
609
+ * 在 hint 附近的窗口里寻找 snippetLines 的精确匹配(按行完全相等)。
610
+ * 找到则返回实际的 [startLine, endLine](1-based),否则返回 null。
611
+ */
612
+ function findSnippetAroundHint(
613
+ fileLines: string[],
614
+ snippetLines: string[],
615
+ hintStartLine: number,
616
+ windowRadius: number
617
+ ): LineRange | null {
618
+ if (snippetLines.length === 0 || fileLines.length === 0) return null;
619
+ if (snippetLines.length > fileLines.length) return null;
620
+
621
+ const n = fileLines.length;
622
+ const m = snippetLines.length;
623
+
624
+ const hintIndex = Math.min(Math.max(hintStartLine - 1, 0), n - 1);
625
+ const startIndex = Math.max(0, hintIndex - windowRadius);
626
+ const endIndex = Math.min(n - m, hintIndex + windowRadius);
627
+
628
+ for (let i = startIndex; i <= endIndex; i++) {
629
+ let match = true;
630
+ for (let j = 0; j < m; j++) {
631
+ if (fileLines[i + j] !== snippetLines[j]) {
632
+ match = false;
633
+ break;
634
+ }
635
+ }
636
+ if (match) {
637
+ return { startLine: i + 1, endLine: i + m };
638
+ }
639
+ }
640
+ return null;
641
+ }
642
+
643
+ /**
644
+ * 在整个文件里寻找 snippetLines 的第一次精确匹配。
645
+ * 找到则返回 [startLine, endLine],否则 null。
646
+ */
647
+ function findSnippetInFile(
648
+ fileLines: string[],
649
+ snippetLines: string[]
650
+ ): LineRange | null {
651
+ if (snippetLines.length === 0 || fileLines.length === 0) return null;
652
+ if (snippetLines.length > fileLines.length) return null;
653
+
654
+ const n = fileLines.length;
655
+ const m = snippetLines.length;
656
+
657
+ for (let i = 0; i <= n - m; i++) {
658
+ let match = true;
659
+ for (let j = 0; j < m; j++) {
660
+ if (fileLines[i + j] !== snippetLines[j]) {
661
+ match = false;
662
+ break;
663
+ }
664
+ }
665
+ if (match) {
666
+ return { startLine: i + 1, endLine: i + m };
667
+ }
668
+ }
669
+ return null;
670
+ }
671
+
672
+ /**
673
+ * 综合行号+snippet,给出“最佳行区间”:
674
+ * - 先在 hint 附近的窗口里找 snippet;
675
+ * - 找不到再全文件找;
676
+ * - 全都找不到则退回原始 hint 区间(裁剪到合法范围)。
677
+ */
678
+ export function resolveRangeWithSnippet(
679
+ fileLines: string[],
680
+ hintRange: LineRange,
681
+ originalSnippet?: string
682
+ ): LineRange {
683
+ const totalLines = fileLines.length;
684
+ if (!totalLines) {
685
+ return { startLine: 1, endLine: 0 }; // 空文件,后续逻辑会特别处理
686
+ }
687
+
688
+ // 先把 hint 行号裁剪到 [1, totalLines]
689
+ const boundedStart = Math.min(
690
+ Math.max(hintRange.startLine, 1),
691
+ totalLines
692
+ );
693
+ const boundedEnd = Math.min(
694
+ Math.max(hintRange.endLine, boundedStart),
695
+ totalLines
696
+ );
697
+ let bestRange: LineRange = {
698
+ startLine: boundedStart,
699
+ endLine: boundedEnd,
700
+ };
701
+
702
+ if (!originalSnippet) {
703
+ return bestRange;
704
+ }
705
+
706
+ const snippetLines = splitToLines(originalSnippet);
707
+ if (snippetLines.length === 0) {
708
+ return bestRange;
709
+ }
710
+
711
+ const windowRadius = 50;
712
+
713
+ const around = findSnippetAroundHint(
714
+ fileLines,
715
+ snippetLines,
716
+ hintRange.startLine,
717
+ windowRadius
718
+ );
719
+ if (around) {
720
+ return around;
721
+ }
722
+
723
+ const anywhere = findSnippetInFile(fileLines, snippetLines);
724
+ if (anywhere) {
725
+ return anywhere;
726
+ }
727
+
728
+ // 找不到 snippet,就退回裁剪后的 hint 区间,不额外报错
729
+ return bestRange;
730
+ }
731
+
732
+ /**
733
+ * 对 insertBefore/insertAfter:用 originalSnippet 当锚点定位插入行。
734
+ * - 若 snippet 能找到,则以 snippet 的起始或结束行为基准插入;
735
+ * - 若找不到,则退化为用行号(并裁剪到合法范围)。
736
+ */
737
+ export function resolveInsertLineWithSnippet(
738
+ fileLines: string[],
739
+ hintLine: number,
740
+ originalSnippet: string | undefined,
741
+ mode: "before" | "after"
742
+ ): number {
743
+ const totalLines = fileLines.length;
744
+ if (!totalLines) {
745
+ // 空文件:insertBefore(1)/insertAfter(1) 都等价于在文件头(也是尾)追加
746
+ return 1;
747
+ }
748
+
749
+ const maxLine = mode === "before" ? totalLines + 1 : totalLines;
750
+ const boundedLine = Math.min(Math.max(hintLine, 1), maxLine);
751
+
752
+ if (!originalSnippet) {
753
+ return mode === "before" ? boundedLine : boundedLine;
754
+ }
755
+
756
+ const snippetLines = splitToLines(originalSnippet);
757
+ if (snippetLines.length === 0 || snippetLines.length > totalLines) {
758
+ return mode === "before" ? boundedLine : boundedLine;
759
+ }
760
+
761
+ const windowRadius = 50;
762
+ const around = findSnippetAroundHint(
763
+ fileLines,
764
+ snippetLines,
765
+ hintLine,
766
+ windowRadius
767
+ );
768
+ const anywhere = around ?? findSnippetInFile(fileLines, snippetLines);
769
+
770
+ if (!anywhere) {
771
+ return mode === "before" ? boundedLine : boundedLine;
772
+ }
773
+
774
+ if (mode === "before") {
775
+ return anywhere.startLine;
776
+ }
777
+ // after:插在 snippet 之后一行
778
+ return anywhere.endLine;
779
+ }
780
+
781
+ /**
782
+ * 在内存中按顺序应用一组 LineEdit。
783
+ * 注意:后续 edit 的“hint 行号”是基于“前一个 edit 应用之后”的文本。
784
+ * 使用统一的 \n 作为行分隔符。
785
+ */
786
+ export function applyLineEditsToText(original: string, edits: LineEdit[]): string {
787
+ let text = original;
788
+
789
+ for (let i = 0; i < edits.length; i++) {
790
+ const edit = edits[i];
791
+ const lines = text.split(/\n/); // original 已经是统一的 \n
792
+
793
+ switch (edit.type) {
794
+ case "replaceRange": {
795
+ // 若提供了 originalSnippet,行号作为搜索 hint 可以缺省(默认 1)
796
+ const startLineHint = (edit.startLine == null && edit.originalSnippet)
797
+ ? 1
798
+ : ensurePositiveInt(edit.startLine, "startLine");
799
+ const endLineHint = (edit.endLine == null && edit.originalSnippet)
800
+ ? 1
801
+ : ensurePositiveInt(edit.endLine, "endLine");
802
+ if (startLineHint > endLineHint) {
803
+ throw new Error(
804
+ "startLine must be <= endLine for replaceRange"
805
+ );
806
+ }
807
+
808
+ const resolved = resolveRangeWithSnippet(
809
+ lines,
810
+ { startLine: startLineHint, endLine: endLineHint },
811
+ edit.originalSnippet
812
+ );
813
+
814
+ const before = lines.slice(0, resolved.startLine - 1);
815
+ const after = lines.slice(resolved.endLine);
816
+ // 兼容模型有时误用 newSnippet 字段(正确字段名为 replacement)
817
+ const replacementText = edit.replacement ?? (edit as any).newSnippet;
818
+ const replacementLines = replacementText
819
+ ? splitToLines(replacementText)
820
+ : [];
821
+
822
+ text = [...before, ...replacementLines, ...after].join("\n");
823
+ break;
824
+ }
825
+ case "insertBefore": {
826
+ const lineHint = (edit.line == null && edit.originalSnippet)
827
+ ? 1
828
+ : ensurePositiveInt(edit.line, "line");
829
+ const insertLine = resolveInsertLineWithSnippet(
830
+ lines,
831
+ lineHint,
832
+ edit.originalSnippet,
833
+ "before"
834
+ );
835
+ const insertIndex = Math.min(insertLine - 1, lines.length);
836
+ const before = lines.slice(0, insertIndex);
837
+ const after = lines.slice(insertIndex);
838
+ const insertLines = edit.content
839
+ ? splitToLines(edit.content)
840
+ : [];
841
+
842
+ text = [...before, ...insertLines, ...after].join("\n");
843
+ break;
844
+ }
845
+ case "insertAfter": {
846
+ const lineHint = (edit.line == null && edit.originalSnippet)
847
+ ? 1
848
+ : ensurePositiveInt(edit.line, "line");
849
+ const anchorLine = resolveInsertLineWithSnippet(
850
+ lines,
851
+ lineHint,
852
+ edit.originalSnippet,
853
+ "after"
854
+ );
855
+ const insertIndex = Math.min(anchorLine, lines.length);
856
+ const before = lines.slice(0, insertIndex);
857
+ const after = lines.slice(insertIndex);
858
+ const insertLines = edit.content
859
+ ? splitToLines(edit.content)
860
+ : [];
861
+
862
+ text = [...before, ...insertLines, ...after].join("\n");
863
+ break;
864
+ }
865
+ case "deleteRange": {
866
+ const startLineHint = (edit.startLine == null && edit.originalSnippet)
867
+ ? 1
868
+ : ensurePositiveInt(edit.startLine, "startLine");
869
+ const endLineHint = (edit.endLine == null && edit.originalSnippet)
870
+ ? 1
871
+ : ensurePositiveInt(edit.endLine, "endLine");
872
+ if (startLineHint > endLineHint) {
873
+ throw new Error(
874
+ "startLine must be <= endLine for deleteRange"
875
+ );
876
+ }
877
+
878
+ const resolved = resolveRangeWithSnippet(
879
+ lines,
880
+ { startLine: startLineHint, endLine: endLineHint },
881
+ edit.originalSnippet
882
+ );
883
+
884
+ const before = lines.slice(0, resolved.startLine - 1);
885
+ const after = lines.slice(resolved.endLine);
886
+ text = [...before, ...after].join("\n");
887
+ break;
888
+ }
889
+ default: {
890
+ const _exhaustiveCheck: never = edit;
891
+ throw new Error(
892
+ `Unsupported line edit type: ${(edit as any).type}`
893
+ );
894
+ }
895
+ }
896
+ }
897
+
898
+ return text;
899
+ }
900
+
901
+ export async function handleApplyLineEdits(req: Request): Promise<Response> {
902
+ try {
903
+ const body = (await req.json()) as Partial<ApplyLineEditsRequestBody>;
904
+
905
+ if (!body.filePath || !Array.isArray(body.edits) || body.edits.length === 0) {
906
+ return new Response(
907
+ JSON.stringify({
908
+ error: "filePath and non-empty edits are required",
909
+ }),
910
+ { status: 400, headers: JSON_HEADERS }
911
+ );
912
+ }
913
+
914
+ const targetPath = resolveSafePath(body.filePath);
915
+
916
+ // 读原文件内容
917
+ let originalRaw: string;
918
+ try {
919
+ originalRaw = await bunFile(targetPath).text();
920
+ } catch (e: any) {
921
+ const code = e?.code || e?.errno || e?.name;
922
+ const msg = String(e?.message || "");
923
+ if (code === "ENOENT" || /ENOENT|no such file|not exist/i.test(msg)) {
924
+ return new Response(
925
+ JSON.stringify({
926
+ error: `File does not exist: ${body.filePath}`,
927
+ }),
928
+ { status: 404, headers: JSON_HEADERS }
929
+ );
930
+ }
931
+
932
+ console.error(
933
+ "[handleApplyLineEdits] read file error:",
934
+ e,
935
+ "targetPath:",
936
+ targetPath
937
+ );
938
+ return new Response(
939
+ JSON.stringify({
940
+ error: `File cannot be read: ${body.filePath}`,
941
+ }),
942
+ { status: 500, headers: JSON_HEADERS }
943
+ );
944
+ }
945
+
946
+ // 记录原始换行风格,便于最终写回时保持一致
947
+ const hadCRLF = originalRaw.indexOf("\r\n") >= 0;
948
+ const originalText = hadCRLF
949
+ ? originalRaw.replace(/\r\n/g, "\n")
950
+ : originalRaw;
951
+
952
+ // 在内存中应用编辑(基于统一的 \n)
953
+ const editSummary = (body.edits as LineEdit[]).map((e: any) =>
954
+ e.type === "replaceRange" || e.type === "deleteRange"
955
+ ? `${e.type}(${e.startLine}-${e.endLine})`
956
+ : `${e.type}(L${e.line})`
957
+ ).join(", ");
958
+ console.log(`[applyLineEdits] file=${body.filePath} edits=[${editSummary}]`);
959
+ const newText = applyLineEditsToText(
960
+ originalText,
961
+ body.edits as LineEdit[]
962
+ );
963
+
964
+ // 若内容未变化,可早退
965
+ if (newText === originalText) {
966
+ return new Response(
967
+ JSON.stringify({
968
+ success: true,
969
+ filePath: body.filePath,
970
+ editCount: body.edits.length,
971
+ changed: false,
972
+ message: "Edits applied but content is identical to original.",
973
+ newContent: newText,
974
+ diff: [], // 没变化就给空 diff
975
+ }),
976
+ { status: 200, headers: JSON_HEADERS }
977
+ );
978
+ }
979
+
980
+ // 对 TypeScript 文件执行轻量校验(默认语法检查,可切换到完整类型检查)
981
+ const isTypeScriptFile = /\.(ts|tsx)$/i.test(body.filePath);
982
+ if (isTypeScriptFile) {
983
+ console.log(`[applyLineEdits] validate:start file=${body.filePath}`);
984
+ const typeCheckResult = await performTypeCheck(targetPath, newText, originalText);
985
+ console.log(
986
+ `[applyLineEdits] validate:done file=${body.filePath} success=${typeCheckResult.success} kind=${typeCheckResult.kind}`
987
+ );
988
+ if (!typeCheckResult.success) {
989
+ console.warn(`[applyLineEdits] validation failed for ${body.filePath}:`, typeCheckResult.errors);
990
+ const failure = buildTypeCheckFailureResponse(
991
+ body.filePath,
992
+ typeCheckResult
993
+ );
994
+ return new Response(
995
+ JSON.stringify(failure.body),
996
+ { status: failure.status, headers: JSON_HEADERS }
997
+ );
998
+ }
999
+ // 类型检查通过后写入文件
1000
+ const diff = diffLines(originalText, newText);
1001
+ const outputText = hadCRLF ? newText.replace(/\n/g, "\r\n") : newText;
1002
+ const dir = path.dirname(targetPath);
1003
+ console.log(`[applyLineEdits] write:start file=${body.filePath}`);
1004
+ await mkdir(dir, { recursive: true });
1005
+ await bunWrite(targetPath, outputText);
1006
+ console.log(`[applyLineEdits] write:done file=${body.filePath}`);
1007
+ return new Response(
1008
+ JSON.stringify({
1009
+ success: true,
1010
+ filePath: body.filePath,
1011
+ editCount: body.edits.length,
1012
+ changed: true,
1013
+ newContent: newText,
1014
+ diff,
1015
+ }),
1016
+ { status: 200, headers: JSON_HEADERS }
1017
+ );
1018
+ }
1019
+
1020
+ // 生成 diff(基于统一的 \n)
1021
+ const diff = diffLines(originalText, newText);
1022
+
1023
+ // 写回文件时尽量保持原始换行风格
1024
+ const outputText = hadCRLF ? newText.replace(/\n/g, "\r\n") : newText;
1025
+ const dir = path.dirname(targetPath);
1026
+ await mkdir(dir, { recursive: true });
1027
+ await bunWrite(targetPath, outputText);
1028
+
1029
+ return new Response(
1030
+ JSON.stringify({
1031
+ success: true,
1032
+ filePath: body.filePath,
1033
+ editCount: body.edits.length,
1034
+ changed: true,
1035
+ newContent: newText, // 统一为 \n,给前端预览用
1036
+ diff,
1037
+ }),
1038
+ { status: 200, headers: JSON_HEADERS }
1039
+ );
1040
+ } catch (e: any) {
1041
+ const message = e?.message || String(e);
1042
+ // 行号校验错误 → 400(客户端输入问题),其余 → 500(服务器异常)
1043
+ const isValidation = e?.isValidation === true ||
1044
+ /must be positive integer|startLine must be <= endLine/.test(message);
1045
+ if (isValidation) {
1046
+ console.warn("[handleApplyLineEdits] validation error:", message);
1047
+ return new Response(JSON.stringify({ error: message }), {
1048
+ status: 400,
1049
+ headers: JSON_HEADERS,
1050
+ });
1051
+ }
1052
+ console.error("[handleApplyLineEdits] unexpected error:", e);
1053
+ return new Response(JSON.stringify({ error: message }), {
1054
+ status: 500,
1055
+ headers: JSON_HEADERS,
1056
+ });
1057
+ }
1058
+ }