nolo-cli 0.1.29 → 0.1.31

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 (329) hide show
  1. package/agent-runtime/agentRecordConfig.ts +0 -2
  2. package/agent-runtime/hostAdapter.ts +0 -1
  3. package/agent-runtime/hostRuntimeCapabilities.ts +7 -0
  4. package/agent-runtime/hostRuntimeConfig.ts +86 -0
  5. package/agent-runtime/index.ts +13 -0
  6. package/agent-runtime/localToolPolicy.ts +13 -6
  7. package/agent-runtime/localWorkspaceTools.ts +333 -30
  8. package/agent-runtime/platformChatProvider.ts +4 -1
  9. package/agent-runtime/runtimeToolPolicy.ts +32 -47
  10. package/agent-runtime/shellCommandPolicy.ts +117 -0
  11. package/agent-runtime/toolGate.ts +38 -0
  12. package/agentCreateCustomCommands.ts +9 -4
  13. package/agentDialogsCommands.ts +4 -3
  14. package/agentDoctorCommands.ts +3 -3
  15. package/agentListCommands.ts +3 -3
  16. package/agentMachineCommands.ts +6 -6
  17. package/agentPullCommand.ts +4 -12
  18. package/agentRecordCommands.ts +5 -3
  19. package/agentRecordHelpers.ts +42 -23
  20. package/agentRunCommand.ts +2 -6
  21. package/agentRunParsing.ts +18 -5
  22. package/agentRuntimeLocal.ts +10 -0
  23. package/agentUnpublishCommands.ts +3 -2
  24. package/ai/agent/agentRunDialogLineage.ts +56 -0
  25. package/ai/agent/agentSlice.ts +45 -10
  26. package/ai/agent/avatarUtils.ts +1 -1
  27. package/ai/agent/buildSystemPrompt.ts +1 -2
  28. package/ai/agent/cliExecutor.ts +330 -19
  29. package/ai/agent/createAgentSchema.ts +22 -0
  30. package/ai/agent/hooks/fetchPublicAgents.ts +14 -39
  31. package/ai/agent/hooks/usePublicAgents.ts +90 -192
  32. package/ai/agent/publicAgentCatalog.ts +359 -0
  33. package/ai/agent/publicAgentIdentity.ts +76 -0
  34. package/ai/agent/server/fetchPublicAgents.ts +21 -46
  35. package/ai/agent/serverOrigin.ts +7 -0
  36. package/ai/agent/streamAgentChatTurn.ts +23 -21
  37. package/ai/agent/streamAgentChatTurnUtils.ts +292 -6
  38. package/ai/agent/types.ts +2 -0
  39. package/ai/agent/web/agentDisplayUtils.ts +171 -0
  40. package/ai/agent/web/useAgentModelAvatarComponent.ts +32 -0
  41. package/ai/ai.locale.ts +8 -0
  42. package/ai/chat/sendOpenAICompletionsRequest.native.ts +15 -0
  43. package/ai/chat/sendOpenAICompletionsRequest.ts +93 -1
  44. package/ai/chat/sendOpenAIResponseRequest.ts +86 -9
  45. package/ai/chat/updateTotalUsage.ts +7 -0
  46. package/ai/llm/deepinfra.ts +30 -15
  47. package/ai/llm/mistral.ts +3 -4
  48. package/ai/llm/providers.ts +2 -0
  49. package/ai/llm/types.ts +15 -0
  50. package/ai/memory/capture.ts +3 -3
  51. package/ai/memory/consolidate.ts +2 -2
  52. package/ai/memory/delete.ts +4 -3
  53. package/ai/memory/query.ts +3 -3
  54. package/ai/memory/remember.ts +2 -2
  55. package/ai/memory/store.ts +3 -3
  56. package/ai/memory/storeShared.ts +3 -2
  57. package/ai/policy/commercialMultiplier.ts +16 -0
  58. package/ai/token/billingAdminAuditEvent.ts +68 -0
  59. package/ai/token/billingAdminAuditEventWriter.ts +41 -0
  60. package/ai/token/billingAnomaly.ts +90 -0
  61. package/ai/token/billingAnomalyLifecycle.ts +54 -0
  62. package/ai/token/billingAnomalyLifecycleWriter.ts +44 -0
  63. package/ai/token/billingAnomalyWriter.ts +41 -0
  64. package/ai/token/calculatePrice.ts +3 -2
  65. package/ai/token/deepinfraReconciliation.ts +153 -0
  66. package/ai/token/deepinfraRequestIdQuery.ts +92 -0
  67. package/ai/token/externalToolCost.ts +54 -41
  68. package/ai/token/missingUsageEstimate.ts +12 -3
  69. package/ai/token/normalizeUsage.ts +45 -5
  70. package/ai/token/openaiReconciliation.ts +188 -0
  71. package/ai/token/providerBillableEvent.ts +84 -0
  72. package/ai/token/providerBillableEventWriter.ts +36 -0
  73. package/ai/token/providerBillingAnomalyDrilldown.ts +308 -0
  74. package/ai/token/providerBillingDrilldown.ts +361 -0
  75. package/ai/token/providerBillingHealthReport.ts +366 -0
  76. package/ai/token/providerCall.ts +144 -0
  77. package/ai/token/providerCallSweeper.ts +168 -0
  78. package/ai/token/providerCallWriter.ts +33 -0
  79. package/ai/token/providerCredential.ts +89 -0
  80. package/ai/token/providerCredentialAnomaly.ts +154 -0
  81. package/ai/token/providerCredentialLifecycle.ts +59 -0
  82. package/ai/token/providerCredentialLifecycleWriter.ts +44 -0
  83. package/ai/token/providerCredentialRegistry.ts +83 -0
  84. package/ai/token/providerCredentialRegistryCommand.ts +97 -0
  85. package/ai/token/providerCredentialRegistryList.ts +124 -0
  86. package/ai/token/providerCredentialRegistryResolver.ts +150 -0
  87. package/ai/token/providerCredentialRegistryWriter.ts +41 -0
  88. package/ai/token/providerCredentialRotationCommand.ts +102 -0
  89. package/ai/token/providerCredentialRuntime.ts +56 -0
  90. package/ai/token/providerDispatchIntent.ts +67 -0
  91. package/ai/token/providerDispatchIntentWriter.ts +36 -0
  92. package/ai/token/providerGateway.ts +260 -0
  93. package/ai/token/providerReconciliation.ts +148 -0
  94. package/ai/token/providerReconciliationLocal.ts +97 -0
  95. package/ai/token/providerReconciliationRunner.ts +165 -0
  96. package/ai/token/providerReconciliationWriter.ts +41 -0
  97. package/ai/token/ratingResult.ts +202 -0
  98. package/ai/token/ratingResultWriter.ts +33 -0
  99. package/ai/token/serverDialogProjection.ts +5 -3
  100. package/ai/token/serverTokenWriter.ts +11 -3
  101. package/ai/token/types.ts +10 -0
  102. package/ai/tools/agent/callAgentTool.ts +3 -4
  103. package/ai/tools/agent/presets/appBuilderPreset.ts +5 -7
  104. package/ai/tools/agent/runStreamingAgentTool.ts +1 -2
  105. package/ai/tools/agent/streamParallelAgentsTool.ts +2 -3
  106. package/ai/tools/readXPostTool.ts +1 -5
  107. package/app/admin/adminPages.ts +9 -0
  108. package/app/i18n/i18n.config.ts +5 -0
  109. package/app/i18n/translations/pricing.locale.ts +397 -0
  110. package/app/utils/desktopAgentRuntimeStatusClient.ts +5 -4
  111. package/app/utils/desktopAgentRuntimeTurnClient.ts +4 -1
  112. package/app/utils/imageUtils.ts +64 -34
  113. package/auth/adminPermissions.ts +18 -0
  114. package/auth/authSlice.ts +26 -12
  115. package/auth/hooks/useFetchUsers.ts +3 -0
  116. package/auth/routes.ts +46 -0
  117. package/auth/server/accessActivity.ts +4 -3
  118. package/auth/server/adminPermissions.ts +43 -0
  119. package/auth/server/adminUsageReport.ts +375 -0
  120. package/auth/server/billingAnomalies.ts +235 -0
  121. package/auth/server/billingUsageReport.ts +41 -2
  122. package/auth/server/creatorEarningCreditConversion.ts +10 -2
  123. package/auth/server/deduct.ts +14 -7
  124. package/auth/server/delete.ts +10 -2
  125. package/auth/server/disable.ts +4 -3
  126. package/auth/server/emailAutomation.ts +7 -5
  127. package/auth/server/emailDbConfig.ts +4 -2
  128. package/auth/server/emailDelivery.ts +24 -20
  129. package/auth/server/emailDeliveryGuards.ts +10 -7
  130. package/auth/server/emailPreferences.ts +6 -4
  131. package/auth/server/emailReport.ts +6 -4
  132. package/auth/server/emailRuntimeConfig.ts +3 -3
  133. package/auth/server/emailScenarioNotifications.ts +9 -8
  134. package/auth/server/enable.ts +4 -3
  135. package/auth/server/getRechargeHistory.ts +3 -2
  136. package/auth/server/getUser.ts +3 -2
  137. package/auth/server/gptProAccess.ts +44 -0
  138. package/auth/server/inviteReward.ts +10 -7
  139. package/auth/server/listusers.ts +6 -4
  140. package/auth/server/login.ts +2 -2
  141. package/auth/server/productEntitlements.ts +7 -4
  142. package/auth/server/productPurchase.ts +10 -2
  143. package/auth/server/providerBillingDrilldown.ts +47 -0
  144. package/auth/server/providerBillingHealth.ts +71 -0
  145. package/auth/server/providerCredentials.ts +136 -0
  146. package/auth/server/recharge.ts +14 -8
  147. package/auth/server/revokeSessions.ts +4 -3
  148. package/auth/server/route.ts +77 -0
  149. package/auth/server/sendEmail.ts +5 -4
  150. package/auth/server/signup.ts +10 -3
  151. package/auth/server/token.ts +53 -55
  152. package/auth/server/tokenUsageBilling.ts +18 -7
  153. package/auth/server/usageManagementAccess.ts +43 -0
  154. package/auth/server/usageReport.ts +59 -0
  155. package/auth/types.ts +12 -0
  156. package/auth/utils.ts +24 -22
  157. package/authCommands.ts +36 -2
  158. package/buildPublish.ts +3 -1
  159. package/buildPublishArtifactAssembly.ts +62 -1
  160. package/buildPublishImportAnalysis.ts +21 -16
  161. package/chat/dialog/dialogLaunchScope.ts +32 -0
  162. package/chat/dialog/objectAssistantRegistry.ts +2 -2
  163. package/chat/dialog/useCreateDialog.ts +1 -1
  164. package/chat/hooks/useChatInput.ts +41 -10
  165. package/chat/messages/messageSlice.ts +5 -1
  166. package/chat/messages/pendingAttachmentParts.ts +28 -2
  167. package/chat/messages/sendFirstMessage.ts +76 -79
  168. package/chat/messages/types.ts +9 -0
  169. package/chat/messages/web/streamingMarkdownModel.ts +41 -0
  170. package/chat/messages/web/useStreamingReveal.ts +91 -0
  171. package/chat/web/messageInputAgentUi.ts +94 -6
  172. package/cliEnvHelpers.ts +68 -13
  173. package/cliRuntimeDoctorReport.ts +193 -0
  174. package/client/agentConfigResolver.test.ts +0 -2
  175. package/client/agentRun.test.ts +171 -10
  176. package/client/agentRun.ts +44 -637
  177. package/client/agentRunInput.ts +10 -0
  178. package/client/agentRunLocalExecutor.ts +179 -0
  179. package/client/agentRunServerTransport.ts +394 -0
  180. package/client/agentRunTaskRunRecorder.ts +176 -0
  181. package/client/localRuntimeAdapter.test.ts +236 -9
  182. package/client/localRuntimeAdapter.ts +221 -23
  183. package/client/localToolPolicy.test.ts +28 -4
  184. package/connector-experimental/daemonLauncher.ts +38 -4
  185. package/connectorRunArtifact.ts +34 -10
  186. package/connectorWebSocketTarget.ts +40 -15
  187. package/core/builtinAgents.ts +155 -11
  188. package/create/space/contentLabels.ts +1 -1
  189. package/create/space/contentTypeMeta.ts +3 -2
  190. package/create/space/sidebarVisibleTypes.ts +27 -0
  191. package/create/space/space.locale.ts +76 -4
  192. package/database/actions/agentReadResolution.ts +2 -8
  193. package/database/actions/read.ts +11 -9
  194. package/database/actions/readAndWait.ts +10 -5
  195. package/database/server/agentDelegation.ts +3 -2
  196. package/database/server/authorityStoreConformance.ts +209 -0
  197. package/database/server/authorityStoreTypes.ts +31 -0
  198. package/database/server/coreDataProxy.ts +1 -1
  199. package/database/server/dataHandlers.ts +13 -5
  200. package/database/server/db.ts +15 -34
  201. package/database/server/delete.ts +88 -71
  202. package/database/server/emailRepository.ts +11 -9
  203. package/database/server/fileService.ts +2 -1
  204. package/database/server/legacyServerDb.ts +58 -0
  205. package/database/server/levelAuthorityStore.ts +75 -0
  206. package/database/server/memoryAuthorityStore.ts +133 -0
  207. package/database/server/patch.ts +13 -12
  208. package/database/server/query.ts +3 -2
  209. package/database/server/read.ts +33 -30
  210. package/database/server/resourceAccess.ts +7 -5
  211. package/database/server/serverStoreFactory.ts +124 -0
  212. package/database/server/spaceMemberAuthority.ts +3 -2
  213. package/database/server/storeBatchCompat.ts +37 -0
  214. package/database/server/testAuthorityStore.ts +76 -0
  215. package/database/server/write.ts +29 -27
  216. package/dialogReadCommands.ts +2 -1
  217. package/dialogStatusCommands.ts +2 -1
  218. package/integrations/anthropic/anthropicModels.ts +12 -12
  219. package/integrations/deepseek/models.ts +67 -67
  220. package/integrations/google/models.ts +111 -53
  221. package/integrations/openai/models.ts +22 -22
  222. package/integrations/xai/models.ts +1 -1
  223. package/localRuntimeDb.ts +39 -2
  224. package/machineCommandPrompts.ts +2 -0
  225. package/machineCommands.ts +193 -62
  226. package/machineStatusCommands.ts +4 -12
  227. package/machineWsRunDispatch.ts +80 -15
  228. package/machineWsSession.ts +46 -2
  229. package/noloReadBridgePrompt.ts +16 -0
  230. package/package.json +114 -21
  231. package/pageCreateCommands.ts +2 -2
  232. package/pageDeleteCommands.ts +3 -3
  233. package/pageReadCommands.ts +3 -3
  234. package/pageUpdateCommands.ts +3 -3
  235. package/render/layout/mainLayoutViewMode.ts +25 -0
  236. package/render/page/server/createPage.ts +3 -1
  237. package/render/page/server/handleCreatePage.ts +2 -11
  238. package/runtimeDoctorCommands.ts +18 -69
  239. package/server/api/methods.ts +34 -12
  240. package/server/api/tableHandlers.ts +6 -3
  241. package/server/authenticateToken.ts +47 -2
  242. package/server/billingLedgerRoutes.ts +15 -0
  243. package/server/buildManifest.ts +54 -0
  244. package/server/coreReadiness.ts +34 -25
  245. package/server/coreRuntime.ts +15 -10
  246. package/server/handlers/activityStatsHandler.ts +5 -2
  247. package/server/handlers/agentEmailRegistrationE2EHandler.ts +25 -23
  248. package/server/handlers/agentRun/agentLookup.ts +1 -7
  249. package/server/handlers/agentRun/autonomousRuntime.ts +11 -10
  250. package/server/handlers/agentRun/builtinAgents.ts +12 -88
  251. package/server/handlers/agentRun/continueDialogContext.ts +15 -3
  252. package/server/handlers/agentRun/{inheritedDialogPrompt.ts → conversationReference.ts} +3 -3
  253. package/server/handlers/agentRun/dialogLookup.ts +4 -3
  254. package/server/handlers/agentRun/index.ts +864 -404
  255. package/server/handlers/agentRun/localRuntimeBootstrap.ts +17 -1
  256. package/server/handlers/agentRun/loop.ts +920 -508
  257. package/server/handlers/agentRun/machineConnector.ts +56 -8
  258. package/server/handlers/agentRun/machineRunAudit.ts +3 -2
  259. package/server/handlers/agentRun/modelUsageToolHandlers.ts +13 -10
  260. package/server/handlers/agentRun/requestContext.ts +12 -8
  261. package/server/handlers/agentRun/runtimeExecutionContext.ts +15 -3
  262. package/server/handlers/agentRun/runtimePreparation.ts +26 -24
  263. package/server/handlers/agentRun/runtimeRouting.ts +25 -40
  264. package/server/handlers/agentRun/runtimeSystemMessages.ts +65 -0
  265. package/server/handlers/agentRun/saveDialog.ts +97 -87
  266. package/server/handlers/agentRun/taskRunToolHandler.ts +9 -7
  267. package/server/handlers/agentRun/toolExecutor.ts +42 -78
  268. package/server/handlers/agentRun/types.ts +2 -1
  269. package/server/handlers/appDeployStatusStore.ts +17 -10
  270. package/server/handlers/appDomainHandler.ts +21 -15
  271. package/server/handlers/appLegacyInfraCleanup.ts +5 -2
  272. package/server/handlers/appSandboxHandler.ts +29 -8
  273. package/server/handlers/appSpaceAccess.ts +15 -8
  274. package/server/handlers/chatHandler.ts +22 -2
  275. package/server/handlers/chatUpstreamRetry.ts +225 -2
  276. package/server/handlers/connector/connectorConnectionRegistry.ts +55 -7
  277. package/server/handlers/connector/connectorWebSocket.ts +14 -10
  278. package/server/handlers/desktopAgentRuntimeAdapter.ts +4 -4
  279. package/server/handlers/desktopAgentRuntimeHostCapabilities.ts +25 -0
  280. package/server/handlers/desktopAgentRuntimeReadiness.ts +62 -0
  281. package/server/handlers/desktopAgentRuntimeStatusHandler.ts +38 -30
  282. package/server/handlers/desktopAgentRuntimeTurnHandler.ts +7 -3
  283. package/server/handlers/desktopAgentRuntimeTurnService.ts +39 -45
  284. package/server/handlers/desktopLlamaRuntimeHandler.ts +85 -51
  285. package/server/handlers/desktopUpdaterHandler.ts +132 -24
  286. package/server/handlers/favoriteHandlers.ts +8 -2
  287. package/server/handlers/getDialogBillingHandler.ts +4 -3
  288. package/server/handlers/getTransactionsHandler.ts +5 -2
  289. package/server/handlers/machines/machineBinding.ts +1 -0
  290. package/server/handlers/machines/machineHandlers.ts +0 -14
  291. package/server/handlers/machines/machineInstallAssets.ts +4 -2
  292. package/server/handlers/notificationEmitter.ts +5 -3
  293. package/server/handlers/notificationsHandler.ts +5 -2
  294. package/server/handlers/providerCallsRecentHandler.ts +234 -0
  295. package/server/handlers/providerReconciliationRunHandler.ts +180 -0
  296. package/server/handlers/providerRequestIdsHandler.ts +105 -0
  297. package/server/handlers/tableAccess.ts +6 -2
  298. package/server/handlers/tableToolHandlers.ts +28 -14
  299. package/server/handlers/userSecretsHandler.ts +17 -6
  300. package/server/handlers/versionHandler.ts +9 -4
  301. package/server/handlers/versionStore.ts +18 -10
  302. package/server/html/ssrPreload.ts +5 -3
  303. package/server/payments/crypto/cryptoUsdcBasePaymentProvider.ts +11 -8
  304. package/server/payments/crypto/cryptoUsdcBaseScanner.ts +12 -7
  305. package/server/payments/crypto/cryptoUsdtTronPaymentProvider.ts +11 -8
  306. package/server/payments/crypto/cryptoUsdtTronScanner.ts +9 -7
  307. package/server/payments/waffo/waffoPaymentProvider.ts +12 -9
  308. package/server/runtimeRole.ts +15 -0
  309. package/server/scheduler/scheduledTaskRuntime.ts +4 -2
  310. package/server/scheduler/schedulerService.ts +2 -2
  311. package/server/taskRunBridgeRoutes.ts +8 -5
  312. package/share/server/fetchCommunityShares.ts +1 -1
  313. package/share/server/helpers.ts +19 -17
  314. package/share/server/importShare.ts +9 -13
  315. package/share/server/listCommunityShares.ts +4 -4
  316. package/share/server/purchaseDoc.ts +8 -16
  317. package/share/server/readCommunityShareCover.ts +3 -2
  318. package/share/server/readSharedTable.ts +14 -13
  319. package/share/server/tableReplication.ts +42 -39
  320. package/spaceAttachCommands.ts +135 -0
  321. package/spaceCategoryCommands.ts +6 -6
  322. package/spaceCommands.ts +3 -3
  323. package/spaceDeleteCommands.ts +2 -2
  324. package/spaceInternalCommandEntries.ts +2 -0
  325. package/spaceReadCommands.ts +3 -3
  326. package/tableMetaCommands.ts +2 -2
  327. package/taskRunCommand.ts +11 -0
  328. package/ai/agent/runtimeServerBase.ts +0 -37
  329. package/server/handlers/desktopAgentRuntimeHostFacts.ts +0 -40
@@ -9,10 +9,9 @@ import {
9
9
  } from "@waffo/pancake-ts";
10
10
  import { ulid } from "ulid";
11
11
  import { CORS_HEADERS_AUTH } from "../../../auth/utils";
12
- import { handleToken } from "../../../auth/server/token";
12
+ import { readUserFromRequest } from "../../../auth/server/token";
13
13
  import { rechargeUserBalance } from "../../../auth/server/recharge";
14
- import serverDb from "../../../database/server/db";
15
- import { createResponse } from "../../createResponse";
14
+ import { getServerAuthorityStore } from "../../../database/server/db";
16
15
  import type { PaymentProvider } from "../paymentProvider";
17
16
  import {
18
17
  getRechargeCreditLimits,
@@ -63,6 +62,8 @@ const jsonError = (
63
62
  const paymentKey = (paymentRequestId: string) =>
64
63
  `${WAFFO_PAYMENT_PREFIX}${paymentRequestId}`;
65
64
 
65
+ const getWaffoStore = () => getServerAuthorityStore();
66
+
66
67
  const getMerchantId = () =>
67
68
  process.env.WAFFO_MERCHANT_ID?.trim() || DEFAULT_MERCHANT_ID;
68
69
 
@@ -156,8 +157,10 @@ export const handleCreateWaffoOrder = async (req: Request) => {
156
157
  );
157
158
  }
158
159
 
159
- const authResult = await handleToken(req, createResponse());
160
- if (authResult instanceof Response) return authResult;
160
+ const authResult = await readUserFromRequest(req);
161
+ if (!authResult?.userId) {
162
+ return jsonError(401, "Authentication required.", "AUTH_REQUIRED");
163
+ }
161
164
 
162
165
  let body: any = {};
163
166
  try {
@@ -178,7 +181,7 @@ export const handleCreateWaffoOrder = async (req: Request) => {
178
181
  const { credits } = validation;
179
182
 
180
183
  const userId = String(authResult.userId || "");
181
- const user = await serverDb.get(`user:${userId}`).catch(() => null);
184
+ const user = await getWaffoStore().get(`user:${userId}`).catch(() => null);
182
185
  const username =
183
186
  typeof user?.username === "string"
184
187
  ? user.username
@@ -233,7 +236,7 @@ export const handleCreateWaffoOrder = async (req: Request) => {
233
236
  tokenExpiresAt: result.tokenExpiresAt,
234
237
  },
235
238
  };
236
- await serverDb.put(paymentKey(paymentRequestId), record);
239
+ await getWaffoStore().put(paymentKey(paymentRequestId), record);
237
240
 
238
241
  return jsonResponse({
239
242
  success: true,
@@ -300,7 +303,7 @@ export const handleWaffoWebhook = async (req: Request) => {
300
303
  }
301
304
 
302
305
  const key = paymentKey(paymentRequestId);
303
- const record = (await serverDb.get(key).catch(() => null)) as
306
+ const record = (await getWaffoStore().get(key).catch(() => null)) as
304
307
  | WaffoPaymentRecord
305
308
  | null;
306
309
  if (!record) {
@@ -310,7 +313,7 @@ export const handleWaffoWebhook = async (req: Request) => {
310
313
  });
311
314
  }
312
315
 
313
- await serverDb.put(key, {
316
+ await getWaffoStore().put(key, {
314
317
  ...record,
315
318
  status: "paid",
316
319
  updatedAt: Date.now(),
@@ -0,0 +1,15 @@
1
+ export type NoloRuntimeRole = "core" | "overlay" | "web";
2
+
3
+ export function resolveRuntimeRole(
4
+ env: Record<string, string | undefined> = process.env
5
+ ): NoloRuntimeRole {
6
+ const raw = String(env.NOLO_SERVER_RUNTIME_ROLE || "")
7
+ .trim()
8
+ .toLowerCase();
9
+ if (raw === "overlay" || raw === "web") return raw;
10
+ return "core";
11
+ }
12
+
13
+ export function shouldRunBackgroundWorkers(role: NoloRuntimeRole): boolean {
14
+ return role === "core";
15
+ }
@@ -1,6 +1,6 @@
1
1
  import type { Agent, DialogConfig, ScheduledTaskConfig } from "../../app/types";
2
2
  import { DataType } from "../../create/types";
3
- import serverDb from "../../database/server/db";
3
+ import { getServerAuthorityStore } from "../../database/server/db";
4
4
  import { createDialogKey, createUserKey } from "../../database/keys";
5
5
  import { extractCustomId } from "../../core/prefix";
6
6
  import { resolveMemoryRuntime } from "../../ai/memory/runtime";
@@ -23,8 +23,10 @@ import { resolveAutonomousRuntimeContext } from "../handlers/agentRun/autonomous
23
23
 
24
24
  export const DEFAULT_SCHEDULED_MAX_ROUNDS = 12;
25
25
 
26
+ const getScheduledTaskRuntimeStore = () => getServerAuthorityStore();
27
+
26
28
  const defaultRuntimeDeps = {
27
- serverDb,
29
+ serverDb: getScheduledTaskRuntimeStore(),
28
30
  fetchConvMsgs,
29
31
  runAgentLoop,
30
32
  appendToExistingDialog,
@@ -7,13 +7,13 @@
7
7
  * 生命周期由 server/entry.ts 管理(startAgentTaskScheduler / stopAgentTaskScheduler)。
8
8
  */
9
9
 
10
- import serverDb from "../../database/server/db";
10
+ import { getServerAuthorityStore } from "../../database/server/db";
11
11
  import { DataType } from "../../create/types";
12
12
  import type { DialogConfig, ScheduledTaskConfig } from "../../app/types";
13
13
  import { executeScheduledTaskRun } from "./scheduledTaskRuntime";
14
14
 
15
15
  const defaultSchedulerDeps = {
16
- serverDb,
16
+ serverDb: getServerAuthorityStore(),
17
17
  executeScheduledTaskRun,
18
18
  };
19
19
 
@@ -1,8 +1,8 @@
1
- import { handleToken } from "../auth/server/token";
1
+ import { readUserFromRequest } from "../auth/server/token";
2
2
  import { createApiRouteFamily } from "./apiRouteAdapter";
3
3
  import { DataType } from "../create/types";
4
4
  import { createKey } from "../database/keys";
5
- import serverDb from "../database/server/db";
5
+ import { getServerAuthorityStore } from "../database/server/db";
6
6
  import { fetchMessages } from "../chat/messages/fetchMessages";
7
7
  import { authenticateMachineToken } from "./handlers/machines/machineAuth";
8
8
  import {
@@ -15,6 +15,8 @@ const JSON_HEADERS: Record<string, string> = {
15
15
  "Access-Control-Allow-Origin": "*",
16
16
  };
17
17
 
18
+ const getTaskRunBridgeStore = () => getServerAuthorityStore();
19
+
18
20
  function json(body: unknown, status = 200) {
19
21
  return new Response(JSON.stringify(body), { status, headers: JSON_HEADERS });
20
22
  }
@@ -24,7 +26,7 @@ async function authenticateTaskRunBridge(req: Request): Promise<{ userId: string
24
26
  if (machineAuth instanceof Response) return machineAuth;
25
27
  if (machineAuth?.userId) return { userId: machineAuth.userId };
26
28
 
27
- const user = await handleToken(req as any, {});
29
+ const user = await readUserFromRequest(req);
28
30
  if (!user?.userId) {
29
31
  return json({ ok: false, error: "Unauthorized" }, 401);
30
32
  }
@@ -70,9 +72,10 @@ export async function handleDialogReadBridge(req: Request) {
70
72
  : 50;
71
73
 
72
74
  try {
75
+ const store = getTaskRunBridgeStore();
73
76
  const [meta, msgs] = await Promise.all([
74
- serverDb.get(expectedDialogKey),
75
- fetchMessages(serverDb, dialogId, { limit, throwOnError: true }),
77
+ store.get(expectedDialogKey),
78
+ fetchMessages(store, dialogId, { limit, throwOnError: true }),
76
79
  ]);
77
80
  return json({ ok: true, meta, msgs });
78
81
  } catch (error) {
@@ -1,7 +1,7 @@
1
1
  // 路径: share/server/fetchCommunityShares.ts
2
2
  // 职责:SSR 专用——直接读取 serverDb,获取社区分享列表,供 render.tsx 预载使用
3
3
 
4
- import serverDb, { ensureServerDbOpen } from "../../database/server/db";
4
+ import { ensureServerDbOpen } from "../../database/server/db";
5
5
  import { shareKey } from "../keys";
6
6
  import type { ShareSummary } from "../types";
7
7
  import { scanIndexToSummaries } from "./helpers";
@@ -1,4 +1,4 @@
1
- import serverDb from "../../database/server/db";
1
+ import { getServerAuthorityStore } from "../../database/server/db";
2
2
  import { shareKey } from "../keys";
3
3
  import { isShareType, type ShareSummary, type ShareType } from "../types";
4
4
  import { DataType } from "../../create/types";
@@ -48,12 +48,13 @@ export const resolveIndexedDbKey = (raw: any): string => {
48
48
  return "";
49
49
  };
50
50
 
51
- export const readShareByDbKey = async (dbKey: string): Promise<any | null> => {
52
- try {
53
- return await serverDb.get(dbKey);
54
- } catch (error: unknown) {
55
- if (isLevelNotFoundError(error)) return null;
56
- throw error;
51
+ export const readShareByDbKey = async (dbKey: string): Promise<any | null> => {
52
+ const store = getServerAuthorityStore();
53
+ try {
54
+ return await store.get(dbKey);
55
+ } catch (error: unknown) {
56
+ if (isLevelNotFoundError(error)) return null;
57
+ throw error;
57
58
  }
58
59
  };
59
60
 
@@ -165,15 +166,16 @@ export const toShareSummary = (
165
166
 
166
167
  // ── Generic index scan → ShareSummary[] ─────────────────────────────
167
168
 
168
- export const scanIndexToSummaries = async (
169
- range: { start: string; end: string },
170
- limit: number,
171
- cursor: string | undefined,
172
- summaryOptions: ToSummaryOptions = {}
173
- ): Promise<{ shares: ShareSummary[]; nextCursor?: string }> => {
174
- const shares: ShareSummary[] = [];
175
- const seen = new Set<string>();
176
- let lastIndexKey = "";
169
+ export const scanIndexToSummaries = async (
170
+ range: { start: string; end: string },
171
+ limit: number,
172
+ cursor: string | undefined,
173
+ summaryOptions: ToSummaryOptions = {}
174
+ ): Promise<{ shares: ShareSummary[]; nextCursor?: string }> => {
175
+ const store = getServerAuthorityStore();
176
+ const shares: ShareSummary[] = [];
177
+ const seen = new Set<string>();
178
+ let lastIndexKey = "";
177
179
 
178
180
  const iterOptions: any = { gte: range.start, lte: range.end };
179
181
  if (cursor) {
@@ -181,7 +183,7 @@ export const scanIndexToSummaries = async (
181
183
  delete iterOptions.gte;
182
184
  }
183
185
 
184
- for await (const [indexKey, rawIndexValue] of serverDb.iterator(iterOptions)) {
186
+ for await (const [indexKey, rawIndexValue] of store.iterator(iterOptions)) {
185
187
  if (shares.length >= limit) {
186
188
  return { shares, nextCursor: lastIndexKey };
187
189
  }
@@ -12,12 +12,12 @@
12
12
  * 5. importCount +1(一次,不重复)
13
13
  */
14
14
 
15
- import { handleToken } from "../../auth/server/token";
15
+ import { readUserFromRequest } from "../../auth/server/token";
16
16
  import {
17
17
  getProductPriceCredits,
18
18
  hasActiveEntitlement,
19
19
  } from "../../auth/server/productEntitlements";
20
- import serverDb from "../../database/server/db";
20
+ import { getServerAuthorityStore } from "../../database/server/db";
21
21
  import { logger } from "../../auth/server/shared";
22
22
  import { createPageServer } from "../../render/page/server/createPage";
23
23
  import { resolveSharePaidAccess } from "../paidAccess";
@@ -37,22 +37,17 @@ const extractToken = (req: Request): string | null => {
37
37
 
38
38
  /** 认证,token 无效 / 缺失时返回 null */
39
39
  async function authenticate(req: Request): Promise<string | null> {
40
- const authReq: any = { headers: { get: (k: string) => req.headers.get(k) } };
41
- const mockRes: any = { status: () => ({ json: () => null }) };
42
- try {
43
- const user = await handleToken(authReq, mockRes);
44
- return user?.userId ?? null;
45
- } catch {
46
- return null;
47
- }
40
+ const user = await readUserFromRequest(req);
41
+ return user?.userId ?? null;
48
42
  }
49
43
 
50
44
  /** 原子自增 importCount(最终一致,不需要严格原子性) */
51
45
  async function incrementImportCount(token: string): Promise<void> {
46
+ const store = getServerAuthorityStore();
52
47
  const dbKey = `share-${token}`;
53
48
  try {
54
- const record: any = await serverDb.get(dbKey);
55
- await serverDb.put(dbKey, {
49
+ const record: any = await store.get(dbKey);
50
+ await store.put(dbKey, {
56
51
  ...record,
57
52
  meta: { ...(record?.meta ?? {}), importCount: (record?.meta?.importCount ?? 0) + 1 },
58
53
  });
@@ -70,6 +65,7 @@ export async function handleImportShare(req: Request): Promise<Response> {
70
65
  new Response(JSON.stringify({ success: false, message: "请先登录" }), { status: 401, headers: CORS_HEADERS });
71
66
 
72
67
  try {
68
+ const store = getServerAuthorityStore();
73
69
  // 1. 鉴权
74
70
  const userId = await authenticate(req);
75
71
  if (!userId) return json401();
@@ -81,7 +77,7 @@ export async function handleImportShare(req: Request): Promise<Response> {
81
77
  // 3. 读取 share 记录
82
78
  let shareData: any;
83
79
  try {
84
- shareData = await serverDb.get(`share-${token}`);
80
+ shareData = await store.get(`share-${token}`);
85
81
  } catch {
86
82
  return new Response(
87
83
  JSON.stringify({ success: false, message: "分享不存在" }),
@@ -1,4 +1,4 @@
1
- import { ensureServerDbOpen } from "../../database/server/db";
1
+ import { ensureServerDbOpen, getServerAuthorityStore } from "../../database/server/db";
2
2
  import { shareKey } from "../keys";
3
3
  import { normalizeUserId } from "../helpers";
4
4
  import {
@@ -9,7 +9,6 @@ import {
9
9
  scanIndexToSummaries,
10
10
  toShareSummary,
11
11
  } from "./helpers";
12
- import serverDb from "../../database/server/db";
13
12
  import { parseToken, verifyToken } from "../../auth/token";
14
13
  import { assertSessionTokenVersion } from "../../auth/sessionTokenVersion";
15
14
  import { DB_PREFIX } from "../../database/keys";
@@ -43,6 +42,7 @@ export const handleListCreatorCommunityShares = async (req: ShareListRequest) =>
43
42
 
44
43
  try {
45
44
  await ensureServerDbOpen();
45
+ const store = getServerAuthorityStore();
46
46
 
47
47
  const range = shareKey.communityCreatorRange(requestedUserId);
48
48
  const result = await scanIndexToSummaries(range, limit, cursor, {
@@ -55,7 +55,7 @@ export const handleListCreatorCommunityShares = async (req: ShareListRequest) =>
55
55
  if (result.shares.length === 0 && !cursor) {
56
56
  const shareRange = shareKey.range();
57
57
  const legacyShares = [];
58
- for await (const [dbKey, rawValue] of serverDb.iterator({
58
+ for await (const [dbKey, rawValue] of store.iterator({
59
59
  gte: shareRange.start,
60
60
  lte: shareRange.end,
61
61
  })) {
@@ -116,7 +116,7 @@ const getAuthorizedUserId = async (req: Request): Promise<string | null> => {
116
116
  if (!userId || typeof userId !== "string") return null;
117
117
 
118
118
  try {
119
- const user = await serverDb.get(`${DB_PREFIX.USER}${userId}`);
119
+ const user = await getServerAuthorityStore().get(`${DB_PREFIX.USER}${userId}`);
120
120
  if (!user?.publicKey || user?.isDisabled) return null;
121
121
 
122
122
  const payload = verifyToken(token, user.publicKey);
@@ -9,8 +9,8 @@
9
9
  * - 检查当前用户是否有权访问(已购买或免费)
10
10
  */
11
11
 
12
- import { handleToken } from "../../auth/server/token";
13
- import serverDb from "../../database/server/db";
12
+ import { readUserFromRequest } from "../../auth/server/token";
13
+ import { getServerAuthorityStore } from "../../database/server/db";
14
14
  import { logger } from "../../auth/server/shared";
15
15
  import {
16
16
  getProductPriceCredits,
@@ -36,24 +36,15 @@ const extractToken = (req: Request): string | null => {
36
36
 
37
37
  /** 认证并返回 userId,无 token 时返回 null(不抛错) */
38
38
  async function authenticate(req: Request): Promise<string | null> {
39
- const authReq: any = { headers: { get: (k: string) => req.headers.get(k) } };
40
- // mock res:handleToken 在 token 缺失或无效时会调用 res.status().json()
41
- // 我们用 mock 让它静默返回 null
42
- const mockRes: any = {
43
- status: () => ({ json: () => null }),
44
- };
45
- try {
46
- const user = await handleToken(authReq, mockRes);
47
- return user?.userId ?? null;
48
- } catch {
49
- return null;
50
- }
39
+ const user = await readUserFromRequest(req);
40
+ return user?.userId ?? null;
51
41
  }
52
42
 
53
43
  // ── POST /api/share/:token/purchase ──────────────────────────────────
54
44
 
55
45
  export async function handlePurchaseDoc(req: Request): Promise<Response> {
56
46
  try {
47
+ const store = getServerAuthorityStore();
57
48
  const userId = await authenticate(req);
58
49
  if (!userId) {
59
50
  return new Response(
@@ -74,7 +65,7 @@ export async function handlePurchaseDoc(req: Request): Promise<Response> {
74
65
  const shareDbKey = `share-${token}`;
75
66
  let shareData: any;
76
67
  try {
77
- shareData = await serverDb.get(shareDbKey);
68
+ shareData = await store.get(shareDbKey);
78
69
  } catch {
79
70
  return new Response(
80
71
  JSON.stringify({ success: false, message: "分享不存在" }),
@@ -158,6 +149,7 @@ export async function handlePurchaseDoc(req: Request): Promise<Response> {
158
149
 
159
150
  export async function handleCheckDocAccess(req: Request): Promise<Response> {
160
151
  try {
152
+ const store = getServerAuthorityStore();
161
153
  const userId = await authenticate(req);
162
154
  const token = extractToken(req);
163
155
 
@@ -171,7 +163,7 @@ export async function handleCheckDocAccess(req: Request): Promise<Response> {
171
163
  // 读取 share 记录获取价格
172
164
  let shareData: any;
173
165
  try {
174
- shareData = await serverDb.get(`share-${token}`);
166
+ shareData = await store.get(`share-${token}`);
175
167
  } catch {
176
168
  return new Response(
177
169
  JSON.stringify({ success: false, message: "分享不存在" }),
@@ -1,5 +1,6 @@
1
1
  import { Buffer } from "node:buffer";
2
- import { ensureServerDbOpen } from "../../database/server/db";
2
+ import { getServerAuthorityStore } from "../../database/server/db";
3
+ import { ensureDbOpen } from "../../database/server/ensureDbOpen";
3
4
  import { shareKey } from "../keys";
4
5
  import { toSafeString } from "../helpers";
5
6
  import { errorResponse, readShareByDbKey } from "./helpers";
@@ -39,7 +40,7 @@ export const handleReadCommunityShareCover = async (req: CommunityCoverRequest)
39
40
  }
40
41
 
41
42
  try {
42
- await ensureServerDbOpen();
43
+ await ensureDbOpen(getServerAuthorityStore());
43
44
 
44
45
  const rawShare = await readShareByDbKey(shareKey.create(token));
45
46
  if (!rawShare || rawShare?.meta?.visibility !== "community") {
@@ -1,4 +1,4 @@
1
- import serverDb from "../../database/server/db";
1
+ import { getServerAuthorityStore } from "../../database/server/db";
2
2
  import { rowKey } from "../../database/keys";
3
3
  import { DataType } from "../../create/types";
4
4
  import { isTombstoneRecord } from "../../database/tombstones";
@@ -62,12 +62,13 @@ const resolveRowLimit = (value: unknown): number | null => {
62
62
  return parsed;
63
63
  };
64
64
 
65
- export async function readSharedTablePreview(
66
- token: string,
67
- options: ReadSharedTablePreviewOptions = {}
68
- ): Promise<SharedTablePreview | null> {
69
- const rowLimit = resolveRowLimit(options.rowLimit);
70
- const shareData = await readShareByDbKey(`share-${token}`);
65
+ export async function readSharedTablePreview(
66
+ token: string,
67
+ options: ReadSharedTablePreviewOptions = {}
68
+ ): Promise<SharedTablePreview | null> {
69
+ const store = getServerAuthorityStore();
70
+ const rowLimit = resolveRowLimit(options.rowLimit);
71
+ const shareData = await readShareByDbKey(`share-${token}`);
71
72
  if (!shareData || isTombstoneRecord(shareData)) return null;
72
73
 
73
74
  const liveTable = toLiveTableMetadata(shareData);
@@ -85,12 +86,12 @@ export async function readSharedTablePreview(
85
86
  : null;
86
87
  if (!tenantId || !tableId) return null;
87
88
 
88
- const rows: Record<string, unknown>[] = [];
89
- const { gte, lte } = rowKey.range(tenantId, tableId);
90
- for await (const [, value] of serverDb.iterator({ gte, lte })) {
91
- if (value?.type === DataType.TABLE_ROW && !value?.deletedAt) {
92
- rows.push(value);
93
- if (rowLimit != null && rows.length >= rowLimit) break;
89
+ const rows: Record<string, unknown>[] = [];
90
+ const { gte, lte } = rowKey.range(tenantId, tableId);
91
+ for await (const [, value] of store.iterator({ gte, lte })) {
92
+ if (value?.type === DataType.TABLE_ROW && !value?.deletedAt) {
93
+ rows.push(value);
94
+ if (rowLimit != null && rows.length >= rowLimit) break;
94
95
  }
95
96
  }
96
97
 
@@ -1,8 +1,8 @@
1
- import serverDb from "../../database/server/db";
2
- import { rowKey } from "../../database/keys";
3
- import { noloWriteRequest } from "../../database/requests";
4
- import { isTombstoneRecord } from "../../database/tombstones";
5
- import { readShareByDbKey } from "./helpers";
1
+ import { getServerAuthorityStore } from "../../database/server/db";
2
+ import { rowKey } from "../../database/keys";
3
+ import { noloWriteRequest } from "../../database/requests";
4
+ import { isTombstoneRecord } from "../../database/tombstones";
5
+ import { readShareByDbKey } from "./helpers";
6
6
 
7
7
  type BootstrapArgs = {
8
8
  shareDbKey: string;
@@ -58,16 +58,17 @@ type MutationArgs = {
58
58
  ) => Promise<void>;
59
59
  };
60
60
 
61
- const defaultPatchShareMeta = async (
62
- shareDbKey: string,
63
- changes: Record<string, unknown>
64
- ) => {
65
- const shareRecord = await readShareByDbKey(shareDbKey);
66
- if (!shareRecord || isTombstoneRecord(shareRecord)) return;
67
- await serverDb.put(shareDbKey, {
68
- ...shareRecord,
69
- meta: {
70
- ...(shareRecord.meta ?? {}),
61
+ const defaultPatchShareMeta = async (
62
+ shareDbKey: string,
63
+ changes: Record<string, unknown>
64
+ ) => {
65
+ const store = getServerAuthorityStore();
66
+ const shareRecord = await readShareByDbKey(shareDbKey);
67
+ if (!shareRecord || isTombstoneRecord(shareRecord)) return;
68
+ await store.put(shareDbKey, {
69
+ ...shareRecord,
70
+ meta: {
71
+ ...(shareRecord.meta ?? {}),
71
72
  ...changes,
72
73
  },
73
74
  });
@@ -95,15 +96,16 @@ export const isLiveTableShareRecord = (shareRecord: any, tableDbKey?: string): b
95
96
 
96
97
  export const patchShareMeta = defaultPatchShareMeta;
97
98
 
98
- export async function findActiveLiveShareByTable(
99
- tenantId: string,
100
- tableId: string
101
- ): Promise<(Record<string, unknown> & { dbKey: string }) | null> {
102
- const tableDbKey = `meta-${tenantId}-${tableId}`;
103
- for await (const [dbKey, value] of serverDb.iterator({
104
- gte: "share-",
105
- lte: "share-\uffff",
106
- })) {
99
+ export async function findActiveLiveShareByTable(
100
+ tenantId: string,
101
+ tableId: string
102
+ ): Promise<(Record<string, unknown> & { dbKey: string }) | null> {
103
+ const store = getServerAuthorityStore();
104
+ const tableDbKey = `meta-${tenantId}-${tableId}`;
105
+ for await (const [dbKey, value] of store.iterator({
106
+ gte: "share-",
107
+ lte: "share-\uffff",
108
+ })) {
107
109
  if (isLiveTableShareRecord(value, tableDbKey)) {
108
110
  return {
109
111
  ...value,
@@ -112,21 +114,22 @@ export async function findActiveLiveShareByTable(
112
114
  }
113
115
  }
114
116
  return null;
115
- }
116
-
117
- const defaultLoadOriginTableSnapshot = async (tableDbKey: string) => {
118
- const tableMeta = await serverDb.get(tableDbKey);
119
- const tenantId =
120
- typeof tableMeta?.tenantId === "string" ? tableMeta.tenantId : "";
121
- const tableId = typeof tableMeta?.tableId === "string" ? tableMeta.tableId : "";
122
- const rows: any[] = [];
123
-
124
- if (tenantId && tableId) {
125
- const { gte, lte } = rowKey.range(tenantId, tableId);
126
- for await (const [, value] of serverDb.iterator({ gte, lte })) {
127
- if (!value?.deletedAt) {
128
- rows.push(value);
129
- }
117
+ }
118
+
119
+ const defaultLoadOriginTableSnapshot = async (tableDbKey: string) => {
120
+ const store = getServerAuthorityStore();
121
+ const tableMeta = await store.get(tableDbKey);
122
+ const tenantId =
123
+ typeof tableMeta?.tenantId === "string" ? tableMeta.tenantId : "";
124
+ const tableId = typeof tableMeta?.tableId === "string" ? tableMeta.tableId : "";
125
+ const rows: any[] = [];
126
+
127
+ if (tenantId && tableId) {
128
+ const { gte, lte } = rowKey.range(tenantId, tableId);
129
+ for await (const [, value] of store.iterator({ gte, lte })) {
130
+ if (!value?.deletedAt) {
131
+ rows.push(value);
132
+ }
130
133
  }
131
134
  }
132
135