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
@@ -0,0 +1,202 @@
1
+ import { findModelConfig } from "../llm/providers";
2
+ import { calculatePrice, type Usage } from "./calculatePrice";
3
+ import {
4
+ isOpenAIFlexPricedModel,
5
+ resolveOpenAIServiceTier,
6
+ type OpenAIServiceTier,
7
+ } from "../../integrations/openai/flexTier";
8
+ import { resolveCommercialMultiplier } from "../policy/commercialMultiplier";
9
+
10
+ export type RatingResultSnapshot = {
11
+ provider: string;
12
+ model: string;
13
+ serviceTier?: string;
14
+ providerCurrency: "USD";
15
+ settlementCurrency: "CREDITS";
16
+ commercialMultiplier: number;
17
+ providerUnitPrices: {
18
+ input: number;
19
+ output: number;
20
+ cachingWrite?: number;
21
+ cachingRead?: number;
22
+ inputCacheHit?: number;
23
+ };
24
+ settlementUnitPrices: {
25
+ input: number;
26
+ output: number;
27
+ cachingWrite?: number;
28
+ cachingRead?: number;
29
+ inputCacheHit?: number;
30
+ };
31
+ pricingVersion: string;
32
+ formulaVersion: string;
33
+ roundingPolicy: "credits_6dp";
34
+ };
35
+
36
+ export type RatingResult = {
37
+ id: string;
38
+ billableEventId: string;
39
+ provider: string;
40
+ model: string;
41
+ platformCredits: number;
42
+ snapshot: RatingResultSnapshot;
43
+ createdAt: string;
44
+ };
45
+
46
+ type CreateRatingResultInput = {
47
+ ratingId: string;
48
+ billableEventId: string;
49
+ provider: string;
50
+ model: string;
51
+ serviceTier?: string;
52
+ usage: Usage;
53
+ createdAt: string;
54
+ };
55
+
56
+ export const buildRatingResultKey = (ratingId: string) =>
57
+ `rating-result-${ratingId}`;
58
+
59
+ const maybeNumber = (value: unknown) =>
60
+ typeof value === "number" && Number.isFinite(value) ? value : undefined;
61
+
62
+ const divideDefined = (value: unknown, divisor: number) => {
63
+ const numeric = maybeNumber(value);
64
+ return typeof numeric === "number" ? numeric / divisor : undefined;
65
+ };
66
+
67
+ const scaleDefined = (value: unknown, multiplier: number) => {
68
+ const numeric = maybeNumber(value);
69
+ return typeof numeric === "number" ? numeric * multiplier : undefined;
70
+ };
71
+
72
+ const compactPrice = <T extends Record<string, number | undefined>>(price: T) =>
73
+ Object.fromEntries(
74
+ Object.entries(price).filter(([, value]) => typeof value === "number")
75
+ ) as { [K in keyof T]: number };
76
+
77
+ const resolveSettlementUnitPrices = ({
78
+ provider,
79
+ model,
80
+ serviceTier,
81
+ usage,
82
+ }: {
83
+ provider: string;
84
+ model: string;
85
+ serviceTier?: string;
86
+ usage: Usage;
87
+ }) => {
88
+ const modelConfig = findModelConfig(provider, model);
89
+ if (!modelConfig?.price) {
90
+ return { input: 0, output: 0 };
91
+ }
92
+
93
+ let input = modelConfig.price.input;
94
+ let output = modelConfig.price.output;
95
+ let cachingWrite = modelConfig.price.cachingWrite;
96
+ let cachingRead = modelConfig.price.cachingRead;
97
+ let inputCacheHit = modelConfig.price.inputCacheHit;
98
+
99
+ const effectiveOpenAIServiceTier = resolveOpenAIServiceTier({
100
+ providerName: provider,
101
+ model,
102
+ requestedServiceTier: serviceTier as OpenAIServiceTier | undefined,
103
+ });
104
+ if (
105
+ provider === "openai" &&
106
+ effectiveOpenAIServiceTier === "flex" &&
107
+ !isOpenAIFlexPricedModel(model)
108
+ ) {
109
+ input *= 0.5;
110
+ output *= 0.5;
111
+ if (typeof cachingWrite === "number") cachingWrite *= 0.5;
112
+ if (typeof cachingRead === "number") cachingRead *= 0.5;
113
+ if (typeof inputCacheHit === "number") inputCacheHit *= 0.5;
114
+ }
115
+
116
+ if (modelConfig.pricingStrategy?.type === "tiered_context") {
117
+ const tiers = [...(modelConfig.pricingStrategy.tiers || [])].sort(
118
+ (a, b) => a.minContext - b.minContext
119
+ );
120
+ for (const tier of tiers) {
121
+ if ((usage.input_tokens || 0) >= tier.minContext) {
122
+ input = tier.price.input;
123
+ output = tier.price.output;
124
+ cachingWrite = tier.price.cachingWrite;
125
+ cachingRead = tier.price.cachingRead;
126
+ inputCacheHit = tier.price.inputCacheHit;
127
+ }
128
+ }
129
+ }
130
+
131
+ return compactPrice({
132
+ input,
133
+ output,
134
+ cachingWrite,
135
+ cachingRead,
136
+ inputCacheHit,
137
+ });
138
+ };
139
+
140
+ export const createRatingResult = (
141
+ input: CreateRatingResultInput
142
+ ): RatingResult => {
143
+ const price = calculatePrice({
144
+ provider: input.provider,
145
+ modelName: input.model,
146
+ billingServiceTier: input.serviceTier,
147
+ usage: input.usage,
148
+ });
149
+ const commercialMultiplier = resolveCommercialMultiplier(
150
+ input.provider,
151
+ input.model
152
+ );
153
+ const settlementUnitPrices = resolveSettlementUnitPrices({
154
+ provider: input.provider,
155
+ model: input.model,
156
+ serviceTier: input.serviceTier,
157
+ usage: input.usage,
158
+ });
159
+
160
+ return {
161
+ id: input.ratingId,
162
+ billableEventId: input.billableEventId,
163
+ provider: input.provider,
164
+ model: input.model,
165
+ platformCredits: price.cost,
166
+ snapshot: {
167
+ provider: input.provider,
168
+ model: input.model,
169
+ serviceTier: input.serviceTier,
170
+ providerCurrency: "USD",
171
+ settlementCurrency: "CREDITS",
172
+ commercialMultiplier,
173
+ providerUnitPrices: compactPrice({
174
+ input: settlementUnitPrices.input / commercialMultiplier,
175
+ output: settlementUnitPrices.output / commercialMultiplier,
176
+ cachingWrite: divideDefined(
177
+ settlementUnitPrices.cachingWrite,
178
+ commercialMultiplier
179
+ ),
180
+ cachingRead: divideDefined(
181
+ settlementUnitPrices.cachingRead,
182
+ commercialMultiplier
183
+ ),
184
+ inputCacheHit: divideDefined(
185
+ settlementUnitPrices.inputCacheHit,
186
+ commercialMultiplier
187
+ ),
188
+ }),
189
+ settlementUnitPrices: compactPrice({
190
+ input: scaleDefined(settlementUnitPrices.input, 1),
191
+ output: scaleDefined(settlementUnitPrices.output, 1),
192
+ cachingWrite: scaleDefined(settlementUnitPrices.cachingWrite, 1),
193
+ cachingRead: scaleDefined(settlementUnitPrices.cachingRead, 1),
194
+ inputCacheHit: scaleDefined(settlementUnitPrices.inputCacheHit, 1),
195
+ }),
196
+ pricingVersion: "model-registry-current",
197
+ formulaVersion: "token-rating-v1",
198
+ roundingPolicy: "credits_6dp",
199
+ },
200
+ createdAt: input.createdAt,
201
+ };
202
+ };
@@ -0,0 +1,33 @@
1
+ import { buildRatingResultKey, type RatingResult } from "./ratingResult";
2
+
3
+ export type RatingResultStore = {
4
+ get(key: string): Promise<unknown>;
5
+ put(key: string, value: unknown): Promise<void>;
6
+ };
7
+
8
+ const isMissingRecordError = (error: unknown) => {
9
+ if (!error || typeof error !== "object") return false;
10
+ const code = (error as { code?: unknown }).code;
11
+ return code === "LEVEL_NOT_FOUND" || code === "NOT_FOUND";
12
+ };
13
+
14
+ export async function writeRatingResult({
15
+ store,
16
+ rating,
17
+ }: {
18
+ store: RatingResultStore;
19
+ rating: RatingResult;
20
+ }): Promise<{ key: string }> {
21
+ const key = buildRatingResultKey(rating.id);
22
+ let existing: unknown;
23
+ try {
24
+ existing = await store.get(key);
25
+ } catch (error) {
26
+ if (!isMissingRecordError(error)) throw error;
27
+ }
28
+ if (existing) {
29
+ throw new Error(`rating result already exists: ${key}`);
30
+ }
31
+ await store.put(key, rating);
32
+ return { key };
33
+ }
@@ -1,12 +1,13 @@
1
1
  import pino from "pino";
2
2
 
3
- import serverDb from "../../database/server/db";
3
+ import { getServerAuthorityStore } from "../../database/server/db";
4
4
  import { createKey } from "../../database/keys";
5
5
  import { DataType } from "../../create/types";
6
6
  import { isLevelNotFoundError } from "../../share/helpers";
7
7
 
8
8
  const logger = pino({ name: "server-dialog-projection" });
9
9
  const dialogProjectionQueue = new Map<string, Promise<void>>();
10
+ const getServerDialogProjectionStore = () => getServerAuthorityStore();
10
11
 
11
12
  interface ApplyServerDialogProjectionDeltaOpts {
12
13
  userId: string;
@@ -19,6 +20,7 @@ interface ApplyServerDialogProjectionDeltaOpts {
19
20
  export async function applyServerDialogProjectionDelta(
20
21
  opts: ApplyServerDialogProjectionDeltaOpts,
21
22
  ): Promise<void> {
23
+ const store = getServerDialogProjectionStore();
22
24
  const {
23
25
  userId,
24
26
  dialogId,
@@ -35,7 +37,7 @@ export async function applyServerDialogProjectionDelta(
35
37
  const nextTask = previousTask.catch(() => undefined).then(async () => {
36
38
  let existingDialog: any;
37
39
  try {
38
- existingDialog = await serverDb.get(dialogKey);
40
+ existingDialog = await store.get(dialogKey);
39
41
  } catch (error) {
40
42
  if (isLevelNotFoundError(error)) {
41
43
  logger.warn(
@@ -54,7 +56,7 @@ export async function applyServerDialogProjectionDelta(
54
56
  throw error;
55
57
  }
56
58
 
57
- await serverDb.put(dialogKey, {
59
+ await store.put(dialogKey, {
58
60
  ...existingDialog,
59
61
  inputTokens: (existingDialog.inputTokens ?? 0) + inputTokensDelta,
60
62
  outputTokens: (existingDialog.outputTokens ?? 0) + outputTokensDelta,
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { ulid } from "ulid";
6
6
  import { format } from "date-fns";
7
- import serverDb from "../../database/server/db";
7
+ import { getServerAuthorityStore } from "../../database/server/db";
8
8
  import { createKey, createTokenKey, createTokenStatsKey } from "../../database/keys";
9
9
  import { DataType } from "../../create/types";
10
10
  import type { RawUsage } from "./types";
@@ -13,6 +13,7 @@ import { prepareTokenUsageData } from "./prepareTokenUsageData";
13
13
  import { applyServerDialogProjectionDelta } from "./serverDialogProjection";
14
14
 
15
15
  const logger = pino({ name: "server-token-writer" });
16
+ const getServerTokenWriterStore = () => getServerAuthorityStore();
16
17
 
17
18
  interface WriteTokenOpts {
18
19
  userId: string;
@@ -34,6 +35,7 @@ interface WriteTokenOpts {
34
35
  }
35
36
 
36
37
  export async function writeServerTokenRecord(opts: WriteTokenOpts): Promise<{ cost: number; recordKey: string; tokenRecord: any }> {
38
+ const store = getServerTokenWriterStore();
37
39
  const { userId, username = "", agentKey, agentConfig, runId, rawUsage } = opts;
38
40
 
39
41
  const prepared = prepareTokenUsageData({
@@ -75,6 +77,12 @@ export async function writeServerTokenRecord(opts: WriteTokenOpts): Promise<{ co
75
77
  output_tokens: usage.output_tokens,
76
78
  cache_creation_input_tokens: usage.cache_creation_input_tokens,
77
79
  cache_read_input_tokens: usage.cache_read_input_tokens,
80
+ ...(usage.provider_response_ids
81
+ ? { provider_response_ids: usage.provider_response_ids }
82
+ : {}),
83
+ ...(usage.provider_request_ids
84
+ ? { provider_request_ids: usage.provider_request_ids }
85
+ : {}),
78
86
  cost,
79
87
  pay,
80
88
  createdAt: timestamp,
@@ -86,7 +94,7 @@ export async function writeServerTokenRecord(opts: WriteTokenOpts): Promise<{ co
86
94
  const statsKey = createTokenStatsKey(userId, dateKey);
87
95
  let stats: any;
88
96
  try {
89
- stats = await serverDb.get(statsKey);
97
+ stats = await store.get(statsKey);
90
98
  } catch {
91
99
  stats = null;
92
100
  }
@@ -120,7 +128,7 @@ export async function writeServerTokenRecord(opts: WriteTokenOpts): Promise<{ co
120
128
  providers: { ...updatedStats.providers, [providerName]: inc(updatedStats.providers?.[providerName]) },
121
129
  };
122
130
 
123
- await serverDb.batch([
131
+ await store.batchWrite([
124
132
  { type: "put", key: recordKey, value: tokenRecord },
125
133
  { type: "put", key: statsKey, value: newStats },
126
134
  ]);
package/ai/token/types.ts CHANGED
@@ -21,6 +21,8 @@ interface BillingUsageMetadata {
21
21
  billing_service_tier?: string;
22
22
  billing_estimated?: boolean;
23
23
  image_generation_count?: number;
24
+ provider_response_ids?: string[];
25
+ provider_request_ids?: string[];
24
26
  }
25
27
 
26
28
  // 原始用量类型
@@ -29,6 +31,9 @@ export interface RawUsageType1 extends BillingUsageMetadata {
29
31
  input_tokens?: number;
30
32
  cache_creation_input_tokens?: number;
31
33
  cache_read_input_tokens?: number;
34
+ input_tokens_details?: {
35
+ cached_tokens?: number;
36
+ };
32
37
  }
33
38
 
34
39
  export interface RawUsageType2 extends BillingUsageMetadata {
@@ -37,6 +42,9 @@ export interface RawUsageType2 extends BillingUsageMetadata {
37
42
  total_tokens: number;
38
43
  prompt_cache_hit_tokens: number;
39
44
  prompt_cache_miss_tokens: number;
45
+ prompt_tokens_details?: {
46
+ cached_tokens?: number;
47
+ };
40
48
  }
41
49
 
42
50
  export type RawUsage = RawUsageType1 | RawUsageType2;
@@ -75,6 +83,8 @@ export interface TokenRecord {
75
83
  input_tokens: number;
76
84
  cost: number;
77
85
  image_generation_count?: number;
86
+ provider_response_ids?: string[];
87
+ provider_request_ids?: string[];
78
88
  pay: any;
79
89
  createdAt: number; // UTC timestamp
80
90
  type: string;
@@ -10,7 +10,7 @@ import { runAgentBackground } from "../../agent/runAgentBackground";
10
10
  *
11
11
  * 用于开展一个子对话(sub-dialog),只关心执行结果。支持两种执行模式:
12
12
  * - "server"(默认):通过服务端 agent run 接口后台异步执行,结果写回 DB 并通过 SSE 回传,
13
- * 适合大多数子任务,也能复用服务端 runtime auto-routing。
13
+ * 适合大多数子任务,也支持显式指定远端 `serverBase`。
14
14
  * - "client":客户端同步执行,在当前 Redux 上下文中直接调用 runAgent,
15
15
  * 适合确认只需本地轻量执行的子任务。
16
16
  *
@@ -42,7 +42,7 @@ export const callAgentFunctionSchema = {
42
42
  type: "string",
43
43
  enum: ["client", "server"],
44
44
  description:
45
- "执行模式:'server'(默认)为服务端后台异步执行,能复用 runtime auto-routing;" +
45
+ "执行模式:'server'(默认)为服务端后台异步执行,也支持显式指定远端 serverBase;" +
46
46
  "'client' 为客户端同步执行,适合明确只需本地轻量完成的任务。",
47
47
  default: "server",
48
48
  },
@@ -50,8 +50,7 @@ export const callAgentFunctionSchema = {
50
50
  type: "string",
51
51
  description:
52
52
  "可选。目标 Agent 所在的 nolo server origin,例如 Windows 机器通过 Cloudflare 暴露的 https://win.example.com。" +
53
- "仅 server 模式使用;跨域目标必须由服务端 AGENT_TOOL_ALLOWED_SERVER_BASES 明确放行。" +
54
- "如果目标 Agent 记录声明了 delegation.serverBase / runtimeServerBase,服务端会在未显式传入时自动路由。",
53
+ "仅 server 模式使用;跨域目标必须由服务端 AGENT_TOOL_ALLOWED_SERVER_BASES 明确放行。",
55
54
  },
56
55
  },
57
56
  required: ["agentKey", "task"],
@@ -3,11 +3,9 @@
3
3
  * 用途:在 AgentForm 中预填充,或通过 createAgent 工具一键创建
4
4
  *
5
5
  * Maintenance note:
6
- * - The online App Builder agent record is the runtime source of truth.
7
- * - Keep this preset as a creation/bootstrap template only.
8
- * - To make App Builder fully online-truth-only, replace consumers of this
9
- * preset with a read/pull of agent-pub-01APPBUILDER00000001YAII3I and leave
10
- * only a tiny emergency placeholder here.
6
+ * - This preset now also backs the built-in runtime fallback record.
7
+ * - Keep changes here compatible with both guided creation and the built-in
8
+ * App Builder entry point.
11
9
  */
12
10
  import { FIREWORKS_KIMI_LATEST_MODEL } from "../../../llm/kimi";
13
11
 
@@ -16,8 +14,8 @@ export const APP_BUILDER_PRESET = {
16
14
  introduction: "帮你把想法变成真正可以访问的网站型小应用,无需任何编程知识",
17
15
  model: FIREWORKS_KIMI_LATEST_MODEL,
18
16
  provider: "fireworks",
19
- inputPrice: 7.6,
20
- outputPrice: 32,
17
+ inputPrice: 0.95 * 8,
18
+ outputPrice: 4 * 8,
21
19
  useServerProxy: true,
22
20
  greeting:
23
21
  `你好!我是 App Builder 🚀
@@ -32,8 +32,7 @@ export const runStreamingAgentFunctionSchema = {
32
32
  type: "string",
33
33
  description:
34
34
  "可选。目标 Agent 所在的 nolo server origin,例如 Windows 机器通过 Cloudflare 暴露的 https://win.example.com。" +
35
- "跨域目标必须由服务端 AGENT_TOOL_ALLOWED_SERVER_BASES 明确放行。" +
36
- "如果目标 Agent 记录声明了 delegation.serverBase / runtimeServerBase,服务端会在未显式传入时自动路由。",
35
+ "跨域目标必须由服务端 AGENT_TOOL_ALLOWED_SERVER_BASES 明确放行。",
37
36
  },
38
37
  },
39
38
  required: ["agentKey", "userInput"],
@@ -31,8 +31,7 @@ export const streamParallelAgentsFunctionSchema = {
31
31
  type: "string",
32
32
  description:
33
33
  "可选:该 Agent 所在的 nolo server origin,例如 Windows 机器通过 Cloudflare 暴露的 https://win.example.com。" +
34
- "跨域目标必须由服务端 AGENT_TOOL_ALLOWED_SERVER_BASES 明确放行。" +
35
- "如果目标 Agent 记录声明了 delegation.serverBase / runtimeServerBase,服务端会在未显式传入时自动路由。",
34
+ "跨域目标必须由服务端 AGENT_TOOL_ALLOWED_SERVER_BASES 明确放行。",
36
35
  },
37
36
  },
38
37
  required: ["agentKey"],
@@ -41,7 +40,7 @@ export const streamParallelAgentsFunctionSchema = {
41
40
  serverBase: {
42
41
  type: "string",
43
42
  description:
44
- "可选:默认目标 nolo server origin。agents[*].serverBase 会覆盖此值;目标 Agent 记录的 runtime 元数据可在未传值时自动补齐。",
43
+ "可选:默认目标 nolo server origin。agents[*].serverBase 会覆盖此值;未传时默认使用当前 server。",
45
44
  },
46
45
  timeoutMs: {
47
46
  type: "number",
@@ -170,16 +170,12 @@ async function readWithDefaultBridge(
170
170
  >(
171
171
  specifier: string,
172
172
  ) => Promise<T>;
173
- const bridgeModuleUrl = new URL(
174
- "../../integrations/x-reader/bridge/readXPostWithBridge.ts",
175
- import.meta.url,
176
- ).href;
177
173
  const { readXPostWithBridge } = await importBridge<{
178
174
  readXPostWithBridge: (
179
175
  url: string,
180
176
  args: { keepOpen?: boolean; profileDir?: string; headless?: boolean },
181
177
  ) => Promise<XReadResult<XPost>>;
182
- }>(bridgeModuleUrl);
178
+ }>("../../integrations/x-reader/bridge/readXPostWithBridge.ts");
183
179
  return readXPostWithBridge(url, args);
184
180
  }
185
181
 
@@ -1,9 +1,11 @@
1
1
  import { isSystemAdmin, nolotusId, copilotDemoId } from "../../core/init";
2
+ import { hasUsageManagementPermission } from "../../auth/adminPermissions";
2
3
 
3
4
  export const SYSTEM_ADMIN_USER_IDS = [nolotusId, copilotDemoId];
4
5
 
5
6
  export const ADMIN_PAGE_PATHS = {
6
7
  users: "/life/users",
8
+ usageManagement: "/life/users/usage",
7
9
  email: "/life/users/email",
8
10
  providerHealth: "/life/users/provider-health",
9
11
  legacyEmail: "/admin/email",
@@ -11,3 +13,10 @@ export const ADMIN_PAGE_PATHS = {
11
13
 
12
14
  export const canAccessSystemAdminPage = (userId?: string | null) =>
13
15
  isSystemAdmin(userId);
16
+
17
+ export const canAccessUsageManagementPage = (
18
+ user?: { userId?: string | null; adminPermissions?: unknown } | null
19
+ ) => {
20
+ if (isSystemAdmin(user?.userId)) return true;
21
+ return hasUsageManagementPermission(user);
22
+ };
@@ -8,6 +8,7 @@ import interfaceLocale from "./translations/interface.locale";
8
8
  import errorLocale from "./translations/error.locale";
9
9
  import seoLocale from "./translations/seo.locale";
10
10
  import appBuilderLocale from "./translations/appBuilder.locale";
11
+ import pricingLocale from "./translations/pricing.locale";
11
12
 
12
13
  export const resources = {
13
14
  [Language.EN]: {
@@ -15,6 +16,7 @@ export const resources = {
15
16
  ...interfaceLocale[Language.EN].translation,
16
17
  ...errorLocale[Language.EN].translation,
17
18
  ...appBuilderLocale[Language.EN].translation,
19
+ ...pricingLocale[Language.EN].translation,
18
20
  seo: seoLocale[Language.EN],
19
21
  },
20
22
  space: spaceLocale[Language.EN].translation,
@@ -26,6 +28,7 @@ export const resources = {
26
28
  ...interfaceLocale[Language.ZH_CN].translation,
27
29
  ...errorLocale[Language.ZH_CN].translation,
28
30
  ...appBuilderLocale[Language.ZH_CN].translation,
31
+ ...pricingLocale[Language.ZH_CN].translation,
29
32
  seo: seoLocale[Language.ZH_CN],
30
33
  },
31
34
  space: spaceLocale[Language.ZH_CN].translation,
@@ -37,6 +40,7 @@ export const resources = {
37
40
  ...interfaceLocale[Language.ZH_HANT].translation,
38
41
  ...errorLocale[Language.ZH_HANT].translation,
39
42
  ...appBuilderLocale[Language.ZH_HANT].translation,
43
+ ...pricingLocale[Language.ZH_HANT].translation,
40
44
  seo: seoLocale[Language.ZH_HANT],
41
45
  },
42
46
  space: spaceLocale[Language.ZH_HANT].translation,
@@ -48,6 +52,7 @@ export const resources = {
48
52
  ...interfaceLocale[Language.JA].translation,
49
53
  ...errorLocale[Language.JA].translation,
50
54
  ...appBuilderLocale[Language.JA].translation,
55
+ ...pricingLocale[Language.JA].translation,
51
56
  seo: seoLocale[Language.JA],
52
57
  },
53
58
  space: spaceLocale[Language.JA].translation,