nolo-cli 0.1.30 → 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.
- package/agent-runtime/agentRecordConfig.ts +0 -2
- package/agent-runtime/hostAdapter.ts +0 -1
- package/agent-runtime/hostRuntimeCapabilities.ts +7 -0
- package/agent-runtime/hostRuntimeConfig.ts +86 -0
- package/agent-runtime/index.ts +13 -0
- package/agent-runtime/localToolPolicy.ts +13 -6
- package/agent-runtime/localWorkspaceTools.ts +333 -30
- package/agent-runtime/platformChatProvider.ts +4 -1
- package/agent-runtime/runtimeToolPolicy.ts +32 -47
- package/agent-runtime/shellCommandPolicy.ts +117 -0
- package/agent-runtime/toolGate.ts +38 -0
- package/agentRecordCommands.ts +1 -1
- package/agentRecordHelpers.ts +35 -20
- package/agentRunParsing.ts +18 -5
- package/agentRuntimeLocal.ts +10 -0
- package/ai/agent/agentRunDialogLineage.ts +56 -0
- package/ai/agent/agentSlice.ts +45 -10
- package/ai/agent/avatarUtils.ts +1 -1
- package/ai/agent/buildSystemPrompt.ts +1 -2
- package/ai/agent/cliExecutor.ts +330 -19
- package/ai/agent/createAgentSchema.ts +22 -0
- package/ai/agent/hooks/fetchPublicAgents.ts +14 -39
- package/ai/agent/hooks/usePublicAgents.ts +90 -192
- package/ai/agent/publicAgentCatalog.ts +359 -0
- package/ai/agent/publicAgentIdentity.ts +76 -0
- package/ai/agent/server/fetchPublicAgents.ts +21 -46
- package/ai/agent/serverOrigin.ts +7 -0
- package/ai/agent/streamAgentChatTurn.ts +23 -21
- package/ai/agent/streamAgentChatTurnUtils.ts +292 -6
- package/ai/agent/types.ts +2 -0
- package/ai/agent/web/agentDisplayUtils.ts +171 -0
- package/ai/agent/web/useAgentModelAvatarComponent.ts +32 -0
- package/ai/ai.locale.ts +8 -0
- package/ai/chat/sendOpenAICompletionsRequest.native.ts +15 -0
- package/ai/chat/sendOpenAICompletionsRequest.ts +93 -1
- package/ai/chat/sendOpenAIResponseRequest.ts +86 -9
- package/ai/chat/updateTotalUsage.ts +7 -0
- package/ai/llm/deepinfra.ts +30 -15
- package/ai/llm/mistral.ts +3 -4
- package/ai/llm/providers.ts +2 -0
- package/ai/llm/types.ts +15 -0
- package/ai/memory/capture.ts +3 -3
- package/ai/memory/consolidate.ts +2 -2
- package/ai/memory/delete.ts +4 -3
- package/ai/memory/query.ts +3 -3
- package/ai/memory/remember.ts +2 -2
- package/ai/memory/store.ts +3 -3
- package/ai/memory/storeShared.ts +3 -2
- package/ai/policy/commercialMultiplier.ts +16 -0
- package/ai/token/billingAdminAuditEvent.ts +68 -0
- package/ai/token/billingAdminAuditEventWriter.ts +41 -0
- package/ai/token/billingAnomaly.ts +90 -0
- package/ai/token/billingAnomalyLifecycle.ts +54 -0
- package/ai/token/billingAnomalyLifecycleWriter.ts +44 -0
- package/ai/token/billingAnomalyWriter.ts +41 -0
- package/ai/token/calculatePrice.ts +3 -2
- package/ai/token/deepinfraReconciliation.ts +153 -0
- package/ai/token/deepinfraRequestIdQuery.ts +92 -0
- package/ai/token/externalToolCost.ts +54 -41
- package/ai/token/missingUsageEstimate.ts +12 -3
- package/ai/token/normalizeUsage.ts +45 -5
- package/ai/token/openaiReconciliation.ts +188 -0
- package/ai/token/providerBillableEvent.ts +84 -0
- package/ai/token/providerBillableEventWriter.ts +36 -0
- package/ai/token/providerBillingAnomalyDrilldown.ts +308 -0
- package/ai/token/providerBillingDrilldown.ts +361 -0
- package/ai/token/providerBillingHealthReport.ts +366 -0
- package/ai/token/providerCall.ts +144 -0
- package/ai/token/providerCallSweeper.ts +168 -0
- package/ai/token/providerCallWriter.ts +33 -0
- package/ai/token/providerCredential.ts +89 -0
- package/ai/token/providerCredentialAnomaly.ts +154 -0
- package/ai/token/providerCredentialLifecycle.ts +59 -0
- package/ai/token/providerCredentialLifecycleWriter.ts +44 -0
- package/ai/token/providerCredentialRegistry.ts +83 -0
- package/ai/token/providerCredentialRegistryCommand.ts +97 -0
- package/ai/token/providerCredentialRegistryList.ts +124 -0
- package/ai/token/providerCredentialRegistryResolver.ts +150 -0
- package/ai/token/providerCredentialRegistryWriter.ts +41 -0
- package/ai/token/providerCredentialRotationCommand.ts +102 -0
- package/ai/token/providerCredentialRuntime.ts +56 -0
- package/ai/token/providerDispatchIntent.ts +67 -0
- package/ai/token/providerDispatchIntentWriter.ts +36 -0
- package/ai/token/providerGateway.ts +260 -0
- package/ai/token/providerReconciliation.ts +148 -0
- package/ai/token/providerReconciliationLocal.ts +97 -0
- package/ai/token/providerReconciliationRunner.ts +165 -0
- package/ai/token/providerReconciliationWriter.ts +41 -0
- package/ai/token/ratingResult.ts +202 -0
- package/ai/token/ratingResultWriter.ts +33 -0
- package/ai/token/serverDialogProjection.ts +5 -3
- package/ai/token/serverTokenWriter.ts +11 -3
- package/ai/token/types.ts +10 -0
- package/ai/tools/agent/callAgentTool.ts +3 -4
- package/ai/tools/agent/presets/appBuilderPreset.ts +5 -7
- package/ai/tools/agent/runStreamingAgentTool.ts +1 -2
- package/ai/tools/agent/streamParallelAgentsTool.ts +2 -3
- package/ai/tools/readXPostTool.ts +1 -5
- package/app/admin/adminPages.ts +9 -0
- package/app/i18n/i18n.config.ts +5 -0
- package/app/i18n/translations/pricing.locale.ts +397 -0
- package/app/utils/desktopAgentRuntimeStatusClient.ts +5 -4
- package/app/utils/desktopAgentRuntimeTurnClient.ts +4 -1
- package/app/utils/imageUtils.ts +64 -34
- package/auth/adminPermissions.ts +18 -0
- package/auth/authSlice.ts +26 -12
- package/auth/hooks/useFetchUsers.ts +3 -0
- package/auth/routes.ts +46 -0
- package/auth/server/accessActivity.ts +4 -3
- package/auth/server/adminPermissions.ts +43 -0
- package/auth/server/adminUsageReport.ts +375 -0
- package/auth/server/billingAnomalies.ts +235 -0
- package/auth/server/billingUsageReport.ts +41 -2
- package/auth/server/creatorEarningCreditConversion.ts +10 -2
- package/auth/server/deduct.ts +14 -7
- package/auth/server/delete.ts +10 -2
- package/auth/server/disable.ts +4 -3
- package/auth/server/emailAutomation.ts +7 -5
- package/auth/server/emailDbConfig.ts +4 -2
- package/auth/server/emailDelivery.ts +24 -20
- package/auth/server/emailDeliveryGuards.ts +10 -7
- package/auth/server/emailPreferences.ts +6 -4
- package/auth/server/emailReport.ts +6 -4
- package/auth/server/emailRuntimeConfig.ts +3 -3
- package/auth/server/emailScenarioNotifications.ts +9 -8
- package/auth/server/enable.ts +4 -3
- package/auth/server/getRechargeHistory.ts +3 -2
- package/auth/server/getUser.ts +3 -2
- package/auth/server/gptProAccess.ts +44 -0
- package/auth/server/inviteReward.ts +10 -7
- package/auth/server/listusers.ts +6 -4
- package/auth/server/login.ts +2 -2
- package/auth/server/productEntitlements.ts +7 -4
- package/auth/server/productPurchase.ts +10 -2
- package/auth/server/providerBillingDrilldown.ts +47 -0
- package/auth/server/providerBillingHealth.ts +71 -0
- package/auth/server/providerCredentials.ts +136 -0
- package/auth/server/recharge.ts +14 -8
- package/auth/server/revokeSessions.ts +4 -3
- package/auth/server/route.ts +77 -0
- package/auth/server/sendEmail.ts +5 -4
- package/auth/server/signup.ts +10 -3
- package/auth/server/token.ts +53 -55
- package/auth/server/tokenUsageBilling.ts +18 -7
- package/auth/server/usageManagementAccess.ts +43 -0
- package/auth/server/usageReport.ts +59 -0
- package/auth/types.ts +12 -0
- package/auth/utils.ts +24 -22
- package/authCommands.ts +36 -2
- package/buildPublish.ts +3 -1
- package/buildPublishArtifactAssembly.ts +62 -1
- package/buildPublishImportAnalysis.ts +21 -16
- package/chat/dialog/dialogLaunchScope.ts +32 -0
- package/chat/dialog/objectAssistantRegistry.ts +2 -2
- package/chat/dialog/useCreateDialog.ts +1 -1
- package/chat/hooks/useChatInput.ts +41 -10
- package/chat/messages/messageSlice.ts +5 -1
- package/chat/messages/pendingAttachmentParts.ts +28 -2
- package/chat/messages/sendFirstMessage.ts +76 -79
- package/chat/messages/types.ts +9 -0
- package/chat/messages/web/streamingMarkdownModel.ts +41 -0
- package/chat/messages/web/useStreamingReveal.ts +91 -0
- package/chat/web/messageInputAgentUi.ts +94 -6
- package/cliEnvHelpers.ts +8 -0
- package/cliRuntimeDoctorReport.ts +193 -0
- package/client/agentConfigResolver.test.ts +0 -2
- package/client/agentRun.test.ts +171 -10
- package/client/agentRun.ts +44 -637
- package/client/agentRunInput.ts +10 -0
- package/client/agentRunLocalExecutor.ts +179 -0
- package/client/agentRunServerTransport.ts +394 -0
- package/client/agentRunTaskRunRecorder.ts +176 -0
- package/client/localRuntimeAdapter.test.ts +236 -9
- package/client/localRuntimeAdapter.ts +221 -23
- package/client/localToolPolicy.test.ts +28 -4
- package/connector-experimental/daemonLauncher.ts +38 -4
- package/connectorRunArtifact.ts +34 -10
- package/connectorWebSocketTarget.ts +9 -5
- package/core/builtinAgents.ts +155 -11
- package/create/space/contentLabels.ts +1 -1
- package/create/space/contentTypeMeta.ts +3 -2
- package/create/space/sidebarVisibleTypes.ts +27 -0
- package/create/space/space.locale.ts +76 -4
- package/database/actions/agentReadResolution.ts +2 -8
- package/database/actions/read.ts +11 -9
- package/database/actions/readAndWait.ts +10 -5
- package/database/server/agentDelegation.ts +3 -2
- package/database/server/authorityStoreConformance.ts +209 -0
- package/database/server/authorityStoreTypes.ts +31 -0
- package/database/server/coreDataProxy.ts +1 -1
- package/database/server/dataHandlers.ts +13 -5
- package/database/server/db.ts +15 -34
- package/database/server/delete.ts +88 -71
- package/database/server/emailRepository.ts +11 -9
- package/database/server/fileService.ts +2 -1
- package/database/server/legacyServerDb.ts +58 -0
- package/database/server/levelAuthorityStore.ts +75 -0
- package/database/server/memoryAuthorityStore.ts +133 -0
- package/database/server/patch.ts +13 -12
- package/database/server/query.ts +3 -2
- package/database/server/read.ts +33 -30
- package/database/server/resourceAccess.ts +7 -5
- package/database/server/serverStoreFactory.ts +124 -0
- package/database/server/spaceMemberAuthority.ts +3 -2
- package/database/server/storeBatchCompat.ts +37 -0
- package/database/server/testAuthorityStore.ts +76 -0
- package/database/server/write.ts +29 -27
- package/integrations/anthropic/anthropicModels.ts +12 -12
- package/integrations/deepseek/models.ts +67 -67
- package/integrations/google/models.ts +111 -53
- package/integrations/openai/models.ts +22 -22
- package/integrations/xai/models.ts +1 -1
- package/localRuntimeDb.ts +39 -2
- package/machineCommandPrompts.ts +2 -0
- package/machineCommands.ts +193 -63
- package/machineWsRunDispatch.ts +80 -15
- package/machineWsSession.ts +39 -2
- package/noloReadBridgePrompt.ts +16 -0
- package/package.json +99 -6
- package/render/layout/mainLayoutViewMode.ts +25 -0
- package/render/page/server/createPage.ts +3 -1
- package/render/page/server/handleCreatePage.ts +2 -11
- package/runtimeDoctorCommands.ts +15 -66
- package/server/api/methods.ts +34 -12
- package/server/api/tableHandlers.ts +6 -3
- package/server/authenticateToken.ts +47 -2
- package/server/billingLedgerRoutes.ts +15 -0
- package/server/buildManifest.ts +54 -0
- package/server/coreReadiness.ts +34 -25
- package/server/coreRuntime.ts +15 -10
- package/server/handlers/activityStatsHandler.ts +5 -2
- package/server/handlers/agentEmailRegistrationE2EHandler.ts +25 -23
- package/server/handlers/agentRun/agentLookup.ts +1 -7
- package/server/handlers/agentRun/autonomousRuntime.ts +11 -10
- package/server/handlers/agentRun/builtinAgents.ts +12 -88
- package/server/handlers/agentRun/continueDialogContext.ts +15 -3
- package/server/handlers/agentRun/{inheritedDialogPrompt.ts → conversationReference.ts} +3 -3
- package/server/handlers/agentRun/dialogLookup.ts +4 -3
- package/server/handlers/agentRun/index.ts +864 -404
- package/server/handlers/agentRun/localRuntimeBootstrap.ts +17 -1
- package/server/handlers/agentRun/loop.ts +920 -508
- package/server/handlers/agentRun/machineConnector.ts +56 -8
- package/server/handlers/agentRun/machineRunAudit.ts +3 -2
- package/server/handlers/agentRun/modelUsageToolHandlers.ts +13 -10
- package/server/handlers/agentRun/requestContext.ts +12 -8
- package/server/handlers/agentRun/runtimeExecutionContext.ts +15 -3
- package/server/handlers/agentRun/runtimePreparation.ts +26 -24
- package/server/handlers/agentRun/runtimeRouting.ts +25 -40
- package/server/handlers/agentRun/runtimeSystemMessages.ts +65 -0
- package/server/handlers/agentRun/saveDialog.ts +97 -87
- package/server/handlers/agentRun/taskRunToolHandler.ts +9 -7
- package/server/handlers/agentRun/toolExecutor.ts +42 -78
- package/server/handlers/agentRun/types.ts +2 -1
- package/server/handlers/appDeployStatusStore.ts +17 -10
- package/server/handlers/appDomainHandler.ts +21 -15
- package/server/handlers/appLegacyInfraCleanup.ts +5 -2
- package/server/handlers/appSandboxHandler.ts +29 -8
- package/server/handlers/appSpaceAccess.ts +15 -8
- package/server/handlers/chatHandler.ts +22 -2
- package/server/handlers/chatUpstreamRetry.ts +225 -2
- package/server/handlers/connector/connectorConnectionRegistry.ts +55 -7
- package/server/handlers/connector/connectorWebSocket.ts +14 -10
- package/server/handlers/desktopAgentRuntimeAdapter.ts +4 -4
- package/server/handlers/desktopAgentRuntimeHostCapabilities.ts +25 -0
- package/server/handlers/desktopAgentRuntimeReadiness.ts +62 -0
- package/server/handlers/desktopAgentRuntimeStatusHandler.ts +38 -30
- package/server/handlers/desktopAgentRuntimeTurnHandler.ts +7 -3
- package/server/handlers/desktopAgentRuntimeTurnService.ts +39 -45
- package/server/handlers/desktopLlamaRuntimeHandler.ts +85 -51
- package/server/handlers/desktopUpdaterHandler.ts +132 -24
- package/server/handlers/favoriteHandlers.ts +8 -2
- package/server/handlers/getDialogBillingHandler.ts +4 -3
- package/server/handlers/getTransactionsHandler.ts +5 -2
- package/server/handlers/machines/machineBinding.ts +1 -0
- package/server/handlers/machines/machineHandlers.ts +0 -14
- package/server/handlers/machines/machineInstallAssets.ts +4 -2
- package/server/handlers/notificationEmitter.ts +5 -3
- package/server/handlers/notificationsHandler.ts +5 -2
- package/server/handlers/providerCallsRecentHandler.ts +234 -0
- package/server/handlers/providerReconciliationRunHandler.ts +180 -0
- package/server/handlers/providerRequestIdsHandler.ts +105 -0
- package/server/handlers/tableAccess.ts +6 -2
- package/server/handlers/tableToolHandlers.ts +28 -14
- package/server/handlers/userSecretsHandler.ts +17 -6
- package/server/handlers/versionHandler.ts +9 -4
- package/server/handlers/versionStore.ts +18 -10
- package/server/html/ssrPreload.ts +5 -3
- package/server/payments/crypto/cryptoUsdcBasePaymentProvider.ts +11 -8
- package/server/payments/crypto/cryptoUsdcBaseScanner.ts +12 -7
- package/server/payments/crypto/cryptoUsdtTronPaymentProvider.ts +11 -8
- package/server/payments/crypto/cryptoUsdtTronScanner.ts +9 -7
- package/server/payments/waffo/waffoPaymentProvider.ts +12 -9
- package/server/runtimeRole.ts +15 -0
- package/server/scheduler/scheduledTaskRuntime.ts +4 -2
- package/server/scheduler/schedulerService.ts +2 -2
- package/server/taskRunBridgeRoutes.ts +8 -5
- package/share/server/fetchCommunityShares.ts +1 -1
- package/share/server/helpers.ts +19 -17
- package/share/server/importShare.ts +9 -13
- package/share/server/listCommunityShares.ts +4 -4
- package/share/server/purchaseDoc.ts +8 -16
- package/share/server/readCommunityShareCover.ts +3 -2
- package/share/server/readSharedTable.ts +14 -13
- package/share/server/tableReplication.ts +42 -39
- package/spaceAttachCommands.ts +135 -0
- package/spaceInternalCommandEntries.ts +2 -0
- package/ai/agent/runtimeServerBase.ts +0 -37
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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'
|
|
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
|
-
* -
|
|
7
|
-
* - Keep
|
|
8
|
-
*
|
|
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:
|
|
20
|
-
outputPrice:
|
|
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
|
|
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
|
-
}>(
|
|
178
|
+
}>("../../integrations/x-reader/bridge/readXPostWithBridge.ts");
|
|
183
179
|
return readXPostWithBridge(url, args);
|
|
184
180
|
}
|
|
185
181
|
|
package/app/admin/adminPages.ts
CHANGED
|
@@ -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
|
+
};
|
package/app/i18n/i18n.config.ts
CHANGED
|
@@ -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,
|