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
|
@@ -11,38 +11,31 @@ import {
|
|
|
11
11
|
import { selectUserId } from "../../../auth/authSlice";
|
|
12
12
|
|
|
13
13
|
import { fetchPublicAgents as fetchLocal } from "../../agent/hooks/fetchPublicAgents";
|
|
14
|
-
import { remove } from "../../../database/dbSlice";
|
|
15
|
-
import { getAllServers } from "../../../database/actions/common";
|
|
16
14
|
import {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
dedupeRemotePublicAgents,
|
|
16
|
+
maskRemoteAgentsByLocalTombstones,
|
|
17
|
+
planPublicAgentCatalogView,
|
|
18
|
+
type PublicAgentFilterOptions,
|
|
19
|
+
type PublicAgentListOptions,
|
|
20
|
+
shouldPruneStalePublicAgentCache as shouldPruneStalePublicAgentCacheImpl,
|
|
21
|
+
} from "../../agent/publicAgentCatalog";
|
|
20
22
|
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} from "
|
|
23
|
+
getPublicAgentId,
|
|
24
|
+
getPublicAgentPruneDbKey,
|
|
25
|
+
matchesPublicAgentIdentifiers,
|
|
26
|
+
} from "../../agent/publicAgentIdentity";
|
|
27
|
+
import { remove } from "../../../database/dbSlice";
|
|
28
|
+
import { getAllServers } from "../../../database/actions/common";
|
|
29
|
+
import { isTombstoneRecord } from "../../../database/tombstones";
|
|
26
30
|
|
|
27
31
|
/* -------------------------------------------------------------------------- */
|
|
28
32
|
/* 类型定义 */
|
|
29
33
|
/* -------------------------------------------------------------------------- */
|
|
30
34
|
|
|
31
|
-
export interface UsePublicAgentsOptions
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
| "recommended"
|
|
35
|
-
| "newest"
|
|
36
|
-
| "popular"
|
|
37
|
-
| "rating"
|
|
38
|
-
| "outputPriceAsc"
|
|
39
|
-
| "outputPriceDesc"
|
|
40
|
-
| "favorite"; // 按收藏数排序
|
|
41
|
-
searchName?: string;
|
|
42
|
-
userId?: string;
|
|
43
|
-
imageOutputOnly?: boolean;
|
|
35
|
+
export interface UsePublicAgentsOptions
|
|
36
|
+
extends PublicAgentFilterOptions,
|
|
37
|
+
PublicAgentListOptions {
|
|
44
38
|
/** Filter agents that include this tool in their tools array */
|
|
45
|
-
toolName?: string;
|
|
46
39
|
/** Return list-card metadata only from remote public-agent APIs. */
|
|
47
40
|
summary?: boolean;
|
|
48
41
|
initialData?: Agent[];
|
|
@@ -55,79 +48,19 @@ interface PublicAgentsState {
|
|
|
55
48
|
data: Agent[];
|
|
56
49
|
}
|
|
57
50
|
|
|
58
|
-
const matchesExcludedAgent = (agent: Agent, excludedIds: Set<string>) => {
|
|
59
|
-
const identifiers = [(agent as any)?.dbKey, agent?.id]
|
|
60
|
-
.filter(Boolean)
|
|
61
|
-
.map((value) => String(value));
|
|
62
|
-
return identifiers.some((identifier) => excludedIds.has(identifier));
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const getAgentIdentifiers = (agent: Partial<Agent> | Record<string, any>) =>
|
|
66
|
-
[agent?.dbKey, agent?.id]
|
|
67
|
-
.filter(Boolean)
|
|
68
|
-
.map((value) => String(value));
|
|
69
|
-
|
|
70
51
|
/* -------------------------------------------------------------------------- */
|
|
71
52
|
/* 删除策略:最低投入档——误删抑制开关 */
|
|
72
53
|
/* -------------------------------------------------------------------------- */
|
|
73
54
|
|
|
74
|
-
const PRUNE_ONLY_WHEN_NO_SEARCH = true;
|
|
75
|
-
const PRUNE_ONLY_WHEN_SORT_NEWEST = true;
|
|
76
55
|
const PRUNE_LIMIT_MULTIPLIER = 5;
|
|
77
56
|
const PRUNE_LIMIT_CAP = 500;
|
|
78
57
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
/* -------------------------------------------------------------------------- */
|
|
86
|
-
/* 合并 + 差集删除计算 */
|
|
87
|
-
/* -------------------------------------------------------------------------- */
|
|
88
|
-
|
|
89
|
-
function mergeAgents(localData: Agent[], remoteData: Agent[]) {
|
|
90
|
-
const remoteIdSet = new Set(remoteData.map((a) => String(a.id)));
|
|
91
|
-
const merged: MAgent[] = [];
|
|
92
|
-
const toDelete: string[] = [];
|
|
93
|
-
|
|
94
|
-
// 本地优先
|
|
95
|
-
for (const local of localData) {
|
|
96
|
-
const id = String(local.id);
|
|
97
|
-
const remote = remoteIdSet.has(id)
|
|
98
|
-
? remoteData.find((r) => String(r.id) === id)
|
|
99
|
-
: undefined;
|
|
100
|
-
|
|
101
|
-
if (remote) {
|
|
102
|
-
const localTimestamp = getRecordTimestamp(local);
|
|
103
|
-
const remoteTimestamp = getRecordTimestamp(remote);
|
|
104
|
-
const newest =
|
|
105
|
-
remoteTimestamp >= localTimestamp
|
|
106
|
-
? { ...(local as any), ...(remote as any) }
|
|
107
|
-
: { ...(remote as any), ...(local as any) };
|
|
108
|
-
merged.push({
|
|
109
|
-
...newest,
|
|
110
|
-
__sort: buildSortMeta(local, remote),
|
|
111
|
-
});
|
|
112
|
-
} else {
|
|
113
|
-
toDelete.push(id);
|
|
114
|
-
merged.push({
|
|
115
|
-
...(local as any),
|
|
116
|
-
__sort: buildSortMeta(local, undefined),
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// 再补仅远程有的
|
|
122
|
-
for (const r of remoteData) {
|
|
123
|
-
const id = String(r.id);
|
|
124
|
-
const exists = merged.some((m) => String(m.id) === id);
|
|
125
|
-
if (!exists) {
|
|
126
|
-
merged.push({ ...(r as any), __sort: buildSortMeta(undefined, r) });
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return { merged, toDelete };
|
|
58
|
+
export function shouldPruneStalePublicAgentCache({
|
|
59
|
+
searchName,
|
|
60
|
+
}: {
|
|
61
|
+
searchName?: string;
|
|
62
|
+
}) {
|
|
63
|
+
return shouldPruneStalePublicAgentCacheImpl({ searchName });
|
|
131
64
|
}
|
|
132
65
|
|
|
133
66
|
/* -------------------------------------------------------------------------- */
|
|
@@ -209,6 +142,8 @@ export function usePublicAgents({
|
|
|
209
142
|
}));
|
|
210
143
|
|
|
211
144
|
const excludedIds = pendingExcludedIdsRef.current;
|
|
145
|
+
const servers = getAllServers(currentServer, syncServers);
|
|
146
|
+
const hasRemoteServers = servers.length > 0;
|
|
212
147
|
|
|
213
148
|
/* -------------------------- 1) 本地优先渲染 -------------------------- */
|
|
214
149
|
|
|
@@ -217,47 +152,43 @@ export function usePublicAgents({
|
|
|
217
152
|
tombstones: [],
|
|
218
153
|
};
|
|
219
154
|
let localDataForUi: Agent[] = [];
|
|
155
|
+
let localSortedForFallback: Agent[] = [];
|
|
220
156
|
|
|
221
157
|
try {
|
|
222
158
|
localResult = await fetchLocal(uiOptions);
|
|
223
159
|
localDataForUi =
|
|
224
160
|
excludedIds.size > 0
|
|
225
|
-
? localResult.data.filter(
|
|
161
|
+
? localResult.data.filter(
|
|
162
|
+
(agent) => !matchesPublicAgentIdentifiers(agent, excludedIds)
|
|
163
|
+
)
|
|
226
164
|
: localResult.data;
|
|
227
165
|
|
|
228
166
|
if (myReqId !== requestIdRef.current) return;
|
|
229
167
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
168
|
+
localSortedForFallback = planPublicAgentCatalogView({
|
|
169
|
+
localAgents: localDataForUi,
|
|
170
|
+
remoteAgents: [],
|
|
171
|
+
hasAuthoritativeRemoteResult: false,
|
|
172
|
+
currentUserId,
|
|
173
|
+
options: uiOptions,
|
|
174
|
+
}).localFallbackAgents;
|
|
234
175
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const kw = toolName.toLowerCase();
|
|
238
|
-
localFiltered = localFiltered.filter((a) =>
|
|
239
|
-
(a as any).tools?.some((t: string) => t.toLowerCase().includes(kw))
|
|
240
|
-
);
|
|
176
|
+
if (!hasRemoteServers) {
|
|
177
|
+
setState((prev) => ({ ...prev, data: localSortedForFallback }));
|
|
241
178
|
}
|
|
242
|
-
|
|
243
|
-
const localSorted = sortAgents(localFiltered, sortBy).slice(0, limit);
|
|
244
|
-
|
|
245
|
-
setState((prev) => ({ ...prev, data: localSorted }));
|
|
246
179
|
} catch {
|
|
247
180
|
// 本地失败不阻塞远程
|
|
248
181
|
}
|
|
249
182
|
|
|
250
183
|
/* -------------------------- 2) 构造远程服务器列表 --------------------- */
|
|
251
184
|
|
|
252
|
-
const servers = getAllServers(currentServer, syncServers);
|
|
253
|
-
|
|
254
185
|
// 若没有任何可用远程(离线或未配置),则结束(只保留本地)
|
|
255
186
|
if (servers.length === 0) {
|
|
256
187
|
if (excludedIds.size > 0) {
|
|
257
188
|
const stillPending = new Set(
|
|
258
189
|
Array.from(excludedIds).filter((identifier) =>
|
|
259
190
|
localResult.data.some((agent) =>
|
|
260
|
-
|
|
191
|
+
matchesPublicAgentIdentifiers(agent, new Set([identifier]))
|
|
261
192
|
)
|
|
262
193
|
)
|
|
263
194
|
);
|
|
@@ -290,97 +221,59 @@ export function usePublicAgents({
|
|
|
290
221
|
|
|
291
222
|
if (myReqId !== requestIdRef.current) return;
|
|
292
223
|
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
(
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
const existing = localTombstoneMap.get(identifier);
|
|
312
|
-
if (!existing || getRecordTimestamp(tombstone) > getRecordTimestamp(existing)) {
|
|
313
|
-
localTombstoneMap.set(identifier, tombstone);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const remoteData: Agent[] = Array.from(remoteMap.values()).filter((agent) => {
|
|
319
|
-
const matchingTombstones = getAgentIdentifiers(agent)
|
|
320
|
-
.map((identifier) => localTombstoneMap.get(identifier))
|
|
321
|
-
.filter(Boolean) as Array<Record<string, any>>;
|
|
322
|
-
if (matchingTombstones.length === 0) return true;
|
|
323
|
-
const newestLocalTombstone = matchingTombstones.reduce((latest, current) =>
|
|
324
|
-
getRecordTimestamp(current) > getRecordTimestamp(latest) ? current : latest
|
|
325
|
-
);
|
|
326
|
-
return getRecordTimestamp(agent) > getRecordTimestamp(newestLocalTombstone);
|
|
327
|
-
});
|
|
224
|
+
const hasAuthoritativeRemoteResult = remoteResults.some(
|
|
225
|
+
(res) => res.status === "fulfilled"
|
|
226
|
+
);
|
|
227
|
+
const remoteData = maskRemoteAgentsByLocalTombstones(
|
|
228
|
+
dedupeRemotePublicAgents(
|
|
229
|
+
remoteResults.flatMap((res, index) => {
|
|
230
|
+
if (res.status !== "fulfilled") return [];
|
|
231
|
+
const originServer = servers[index];
|
|
232
|
+
return (res.value?.data ?? [])
|
|
233
|
+
.filter((agent: Agent) => !isTombstoneRecord(agent))
|
|
234
|
+
.map((agent: Agent) => ({
|
|
235
|
+
...agent,
|
|
236
|
+
originServer,
|
|
237
|
+
}));
|
|
238
|
+
})
|
|
239
|
+
),
|
|
240
|
+
localResult.tombstones ?? []
|
|
241
|
+
);
|
|
328
242
|
const remoteDataForUi =
|
|
329
243
|
excludedIds.size > 0
|
|
330
|
-
? remoteData.filter(
|
|
244
|
+
? remoteData.filter(
|
|
245
|
+
(agent) => !matchesPublicAgentIdentifiers(agent, excludedIds)
|
|
246
|
+
)
|
|
331
247
|
: remoteData;
|
|
332
248
|
|
|
333
|
-
const
|
|
334
|
-
localDataForUi ?? [],
|
|
335
|
-
remoteDataForUi
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
const toDeleteFiltered = toDelete.filter((id) => {
|
|
341
|
-
const localItem = localResult.data.find((a) => String(a.id) === id) as any;
|
|
342
|
-
|
|
343
|
-
// 1. 主权保护:如果是我的 Agent,绝对不准自动删除
|
|
344
|
-
if (currentUserId && localItem?.userId === currentUserId) return false;
|
|
345
|
-
|
|
346
|
-
// 2. 时间宽限期:如果是最近 5 分钟内创建的,处于同步风险期,不准删除
|
|
347
|
-
const isRecentlyCreated =
|
|
348
|
-
Date.now() - toTimeMs(localItem?.createdAt) < 5 * 60 * 1000;
|
|
349
|
-
if (isRecentlyCreated) return false;
|
|
350
|
-
|
|
351
|
-
const origin = localItem?.meta?.origin; // "remote" | "local" | "both" | undefined
|
|
352
|
-
if (origin === "local") return false;
|
|
353
|
-
return true;
|
|
249
|
+
const viewPlan = planPublicAgentCatalogView({
|
|
250
|
+
localAgents: localDataForUi ?? [],
|
|
251
|
+
remoteAgents: remoteDataForUi,
|
|
252
|
+
hasAuthoritativeRemoteResult,
|
|
253
|
+
currentUserId,
|
|
254
|
+
options: uiOptions,
|
|
354
255
|
});
|
|
355
256
|
|
|
356
|
-
const toDeleteFilteredSet = new Set(toDeleteFiltered);
|
|
357
|
-
let filteredForUI = (merged as Agent[]).filter(
|
|
358
|
-
(a) => !toDeleteFilteredSet.has(String(a.id))
|
|
359
|
-
);
|
|
360
|
-
|
|
361
|
-
// Client-side toolName filter applied after merge — guards against servers
|
|
362
|
-
// that don't yet support the toolName param (e.g. old code still running).
|
|
363
|
-
if (toolName) {
|
|
364
|
-
const kw = toolName.toLowerCase();
|
|
365
|
-
filteredForUI = filteredForUI.filter((a) =>
|
|
366
|
-
(a as any).tools?.some((t: string) => t.toLowerCase().includes(kw))
|
|
367
|
-
);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
const finalSorted = sortAgents(filteredForUI, sortBy).slice(0, limit);
|
|
371
|
-
|
|
372
257
|
/* -------------------------- 5) 条件化删除本地缓存 -------------------- */
|
|
373
258
|
|
|
374
|
-
const canPruneScene =
|
|
375
|
-
|
|
376
|
-
|
|
259
|
+
const canPruneScene = shouldPruneStalePublicAgentCache({
|
|
260
|
+
searchName,
|
|
261
|
+
});
|
|
377
262
|
|
|
378
263
|
if (
|
|
379
264
|
canPruneScene &&
|
|
380
|
-
|
|
265
|
+
viewPlan.pruneIds.length > 0 &&
|
|
381
266
|
myReqId === requestIdRef.current
|
|
382
267
|
) {
|
|
383
|
-
|
|
268
|
+
viewPlan.pruneIds.forEach((id) => {
|
|
269
|
+
const localItem = localResult.data.find(
|
|
270
|
+
(agent) => getPublicAgentId(agent) === id
|
|
271
|
+
);
|
|
272
|
+
const dbKey = getPublicAgentPruneDbKey(localItem);
|
|
273
|
+
if (dbKey) {
|
|
274
|
+
dispatch(remove(dbKey));
|
|
275
|
+
}
|
|
276
|
+
});
|
|
384
277
|
}
|
|
385
278
|
|
|
386
279
|
if (myReqId !== requestIdRef.current) return;
|
|
@@ -391,10 +284,10 @@ export function usePublicAgents({
|
|
|
391
284
|
const identifierSet = new Set([identifier]);
|
|
392
285
|
return (
|
|
393
286
|
localResult.data.some((agent) =>
|
|
394
|
-
|
|
287
|
+
matchesPublicAgentIdentifiers(agent, identifierSet)
|
|
395
288
|
) ||
|
|
396
289
|
remoteData.some((agent) =>
|
|
397
|
-
|
|
290
|
+
matchesPublicAgentIdentifiers(agent, identifierSet)
|
|
398
291
|
)
|
|
399
292
|
);
|
|
400
293
|
})
|
|
@@ -402,13 +295,18 @@ export function usePublicAgents({
|
|
|
402
295
|
pendingExcludedIdsRef.current = stillPending;
|
|
403
296
|
}
|
|
404
297
|
|
|
405
|
-
setState({ loading: false, error: null, data:
|
|
298
|
+
setState({ loading: false, error: null, data: viewPlan.visibleAgents });
|
|
406
299
|
} catch (err: any) {
|
|
407
300
|
if (err?.name === "AbortError") return;
|
|
408
301
|
if (myReqId !== requestIdRef.current) return;
|
|
409
302
|
|
|
410
|
-
//
|
|
411
|
-
setState((prev) => ({
|
|
303
|
+
// 远程失败:没有已渲染数据时回退到本地缓存。
|
|
304
|
+
setState((prev) => ({
|
|
305
|
+
...prev,
|
|
306
|
+
data: prev.data.length > 0 ? prev.data : localSortedForFallback,
|
|
307
|
+
loading: false,
|
|
308
|
+
error: null,
|
|
309
|
+
}));
|
|
412
310
|
}
|
|
413
311
|
}, [
|
|
414
312
|
limit,
|
|
@@ -454,7 +352,7 @@ export function usePublicAgents({
|
|
|
454
352
|
excludedAgentIds.length > 0
|
|
455
353
|
? prev.data.filter(
|
|
456
354
|
(agent) =>
|
|
457
|
-
!
|
|
355
|
+
!matchesPublicAgentIdentifiers(
|
|
458
356
|
agent,
|
|
459
357
|
new Set(excludedAgentIds.map((value) => String(value)))
|
|
460
358
|
)
|