nolo-cli 0.1.40 → 0.1.41
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/hybridRecordStore.ts +5 -3
- package/ai/agent/_executeModel.ts +146 -0
- package/ai/agent/agentSlice.ts +556 -1
- package/ai/agent/appWorkingMemory.ts +126 -0
- package/ai/agent/buildEditingContext.ts +378 -0
- package/ai/agent/buildSystemPrompt.ts +585 -0
- package/ai/agent/canvasEditingContext.ts +49 -0
- package/ai/agent/cleanAgentMessages.ts +140 -0
- package/ai/agent/cliChatClient.ts +153 -0
- package/ai/agent/cliExecutor.ts +65 -6
- package/ai/agent/contextCompiler.ts +107 -0
- package/ai/agent/contextLayerContract.ts +44 -0
- package/ai/agent/createAgentSchema.ts +272 -0
- package/ai/agent/currentTimeContext.ts +65 -0
- package/ai/agent/executeToolCall.ts +58 -0
- package/ai/agent/fetchAgentContexts.ts +42 -0
- package/ai/agent/generatePrompt.ts +3 -0
- package/ai/agent/getFullChatContextKeys.ts +168 -0
- package/ai/agent/guidedCreation/capabilities.ts +84 -0
- package/ai/agent/guidedCreation/types.ts +38 -0
- package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
- package/ai/agent/liveAudioModel.ts +2 -0
- package/ai/agent/pageBuilderHandoffRules.ts +75 -0
- package/ai/agent/persistMessageWithFixedId.ts +37 -0
- package/ai/agent/planSlice.ts +259 -0
- package/ai/agent/referenceUtils.ts +229 -0
- package/ai/agent/runAgentBackground.ts +310 -0
- package/ai/agent/runAgentClientLoop.ts +164 -0
- package/ai/agent/runtimeGuidance.ts +116 -0
- package/ai/agent/serverOrigin.ts +7 -0
- package/ai/agent/startParallelAgentStreams.ts +424 -0
- package/ai/agent/startupProtocol.ts +53 -0
- package/ai/agent/streamAgentChatTurn.ts +2001 -0
- package/ai/agent/streamAgentChatTurnUtils.ts +860 -0
- package/ai/agent/toolFailureGuard.ts +99 -0
- package/ai/agent/types.ts +73 -0
- package/ai/agent/utils/imageOutput.ts +37 -0
- package/ai/agent/utils/publicImageAgentMode.ts +26 -0
- package/ai/ai.locale.ts +1095 -0
- package/ai/chat/accumulateToolCallChunks.ts +126 -0
- package/ai/chat/fetchUtils.ts +143 -0
- package/ai/chat/inlineImageUrlsForCustomProvider.ts +117 -0
- package/ai/chat/parseApiError.ts +67 -0
- package/ai/chat/parseMultilineSSE.ts +95 -0
- package/ai/chat/sendOpenAICompletionsRequest.ts +897 -0
- package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
- package/ai/chat/serverProxyRetry.ts +102 -0
- package/ai/chat/shouldUseServerProxy.ts +18 -0
- package/ai/chat/streamRetry.ts +46 -0
- package/ai/chat/updateTotalUsage.ts +89 -0
- package/ai/context/buildReferenceContext.ts +437 -0
- package/ai/context/retention.ts +165 -0
- package/ai/context/tokenUtils.ts +78 -0
- package/ai/llm/agentCapabilities.ts +74 -0
- package/ai/llm/deepinfra.ts +79 -0
- package/ai/llm/fireworks.ts +68 -0
- package/ai/llm/generateRequestBody.ts +165 -0
- package/ai/llm/getModelContextWindow.ts +93 -0
- package/ai/llm/getPricing.ts +252 -0
- package/ai/llm/imagePricing.ts +66 -0
- package/ai/llm/isResponseAPIModel.ts +13 -0
- package/ai/llm/kimi.ts +23 -0
- package/ai/llm/mimo.ts +99 -0
- package/ai/llm/mistral.ts +21 -0
- package/ai/llm/models.ts +45 -0
- package/ai/llm/openrouterModels.ts +6 -0
- package/ai/llm/providers.ts +313 -0
- package/ai/llm/reasoningModels.ts +27 -0
- package/ai/llm/types.ts +82 -0
- package/ai/llm/usageRequestOptions.ts +59 -0
- package/ai/memory/queryShared.ts +161 -0
- package/ai/memory/recentRelationshipRecap.ts +247 -0
- package/ai/memory/remember.ts +167 -0
- package/ai/memory/store.ts +20 -0
- package/ai/memory/storeShared.ts +76 -0
- package/ai/memory/types.ts +46 -0
- package/ai/memory/understanding.ts +349 -0
- package/ai/memory/understandingGreeting.ts +264 -0
- package/ai/policy/personalizationDialog.ts +333 -0
- package/ai/policy/runtimePolicy.ts +454 -0
- package/ai/policy/selfUpdateFields.ts +48 -0
- package/ai/policy/types.ts +64 -0
- package/ai/skills/referenceRuntime.ts +274 -0
- package/ai/skills/skillDiagnostics.ts +251 -0
- package/ai/skills/skillDocBuilder.ts +139 -0
- package/ai/skills/skillSummaryMarker.ts +26 -0
- package/ai/token/calculatePrice.ts +576 -0
- package/ai/token/missingUsageEstimate.ts +42 -0
- package/ai/token/normalizeUsage.ts +124 -0
- package/ai/token/openaiImageGenerationUsage.ts +56 -0
- package/ai/token/prepareTokenUsageData.ts +93 -0
- package/ai/token/resolveBillingTarget.ts +52 -0
- package/ai/token/saveTokenRecord.ts +53 -0
- package/ai/token/types.ts +103 -0
- package/ai/tools/agent/agentTools.ts +235 -0
- package/ai/tools/agent/agentUpdateShared.ts +311 -0
- package/ai/tools/agent/callAgentTool.ts +139 -0
- package/ai/tools/agent/createAgentTool.ts +512 -0
- package/ai/tools/agent/createDialogTool.ts +69 -0
- package/ai/tools/agent/createSkillAgentTool.ts +62 -0
- package/ai/tools/agent/parallelBudget.ts +221 -0
- package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
- package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
- package/ai/tools/agent/runLlmTool.ts +96 -0
- package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
- package/ai/tools/agent/skillAgentArgs.ts +106 -0
- package/ai/tools/agent/startAgentDialogTool.ts +53 -0
- package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
- package/ai/tools/agent/updateAgentTool.ts +96 -0
- package/ai/tools/agent/updateSelfTool.ts +113 -0
- package/ai/tools/amazonProductScraperTool.ts +86 -0
- package/ai/tools/apifyActorClient.ts +45 -0
- package/ai/tools/appEditGuard.ts +372 -0
- package/ai/tools/appReadSnapshot.ts +153 -0
- package/ai/tools/appTools.ts +1549 -0
- package/ai/tools/applyEditTool.ts +259 -0
- package/ai/tools/applyLineEditsTool.ts +315 -0
- package/ai/tools/browserTools/click.ts +33 -0
- package/ai/tools/browserTools/closeSession.ts +29 -0
- package/ai/tools/browserTools/common.ts +27 -0
- package/ai/tools/browserTools/openSession.ts +48 -0
- package/ai/tools/browserTools/readContent.ts +38 -0
- package/ai/tools/browserTools/selectOption.ts +46 -0
- package/ai/tools/browserTools/typeText.ts +42 -0
- package/ai/tools/category/createCategoryTool.ts +66 -0
- package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
- package/ai/tools/category/updateContentCategoryTool.ts +75 -0
- package/ai/tools/cfBrowserTools.ts +319 -0
- package/ai/tools/cfSpeechToTextTool.ts +49 -0
- package/ai/tools/checkEnvTool.ts +102 -0
- package/ai/tools/cloudflareCrawlTool.ts +289 -0
- package/ai/tools/codeSearchTool.ts +123 -0
- package/ai/tools/codeTools.ts +101 -0
- package/ai/tools/convertMarxistsBookTool.ts +103 -0
- package/ai/tools/createDocTool.ts +132 -0
- package/ai/tools/createSkillDocTool.ts +155 -0
- package/ai/tools/createWorkflowTool.ts +154 -0
- package/ai/tools/delayTool.ts +31 -0
- package/ai/tools/deleteSpacesTool.ts +325 -0
- package/ai/tools/deleteSpacesToolModel.ts +159 -0
- package/ai/tools/devReloadUtils.ts +29 -0
- package/ai/tools/dialogMessageSearch.ts +137 -0
- package/ai/tools/doctorSkillTool.ts +72 -0
- package/ai/tools/ecommerceScraperTool.ts +86 -0
- package/ai/tools/emailTools.ts +549 -0
- package/ai/tools/evalSkillTool.ts +92 -0
- package/ai/tools/exaSearchTool.ts +63 -0
- package/ai/tools/execShellTool.ts +266 -0
- package/ai/tools/executeSqlTool.ts +192 -0
- package/ai/tools/fetchWebpageSupport.ts +333 -0
- package/ai/tools/fetchWebpageTool.ts +97 -0
- package/ai/tools/geminiImagePreviewTool.ts +386 -0
- package/ai/tools/generateDocxTool.ts +215 -0
- package/ai/tools/googleSearchScraperTool.ts +106 -0
- package/ai/tools/importDataTool.ts +133 -0
- package/ai/tools/importSkillTool.ts +162 -0
- package/ai/tools/index.ts +2308 -0
- package/ai/tools/jdProductScraperTool.ts +821 -0
- package/ai/tools/listUserSpacesTool.ts +113 -0
- package/ai/tools/localFilesTool.ts +276 -0
- package/ai/tools/marxistsOfflineBook.ts +253 -0
- package/ai/tools/modelUsageTools.ts +206 -0
- package/ai/tools/noloWorkspaceReadTools.ts +467 -0
- package/ai/tools/olmOcrTool.ts +33 -0
- package/ai/tools/openaiImageTool.ts +267 -0
- package/ai/tools/prepareTools.ts +23 -0
- package/ai/tools/readDocTool.ts +88 -0
- package/ai/tools/readFileTool.ts +214 -0
- package/ai/tools/readTool.ts +194 -0
- package/ai/tools/readXPostTool.ts +229 -0
- package/ai/tools/readXhsProfileTool.ts +627 -0
- package/ai/tools/rememberMemoryTool.ts +84 -0
- package/ai/tools/remotionVideoTool.ts +151 -0
- package/ai/tools/searchDialogMessagesTool.ts +222 -0
- package/ai/tools/searchWorkspaceTool.ts +259 -0
- package/ai/tools/skillFollowup.ts +86 -0
- package/ai/tools/surfWeatherTool.ts +169 -0
- package/ai/tools/table/addTableRowTool.ts +217 -0
- package/ai/tools/table/createTableTool.ts +315 -0
- package/ai/tools/table/rowTools.ts +386 -0
- package/ai/tools/table/schemaTools.ts +244 -0
- package/ai/tools/table/shareTableTool.ts +148 -0
- package/ai/tools/table/toolShared.ts +129 -0
- package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
- package/ai/tools/toolApiClient.ts +279 -0
- package/ai/tools/toolResultError.ts +42 -0
- package/ai/tools/toolRunSlice.ts +303 -0
- package/ai/tools/toolSchemaCompatibility.ts +53 -0
- package/ai/tools/uiAskChoiceTool.ts +104 -0
- package/ai/tools/updateContentTitleTool.ts +84 -0
- package/ai/tools/updateDocTool.ts +105 -0
- package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
- package/ai/tools/wereadGatewayTool.ts +152 -0
- package/ai/tools/whisperTool.ts +76 -0
- package/ai/tools/writeFileTool.ts +213 -0
- package/ai/tools/youtubeScraperTool.ts +116 -0
- package/ai/tools/ziweiChartTool.ts +678 -0
- package/ai/types.ts +55 -0
- package/ai/workflow/workflowExecutor.ts +323 -0
- package/ai/workflow/workflowSlice.ts +73 -0
- package/ai/workflow/workflowTypes.ts +106 -0
- package/app/actions/syncAppRecord.ts +73 -0
- package/app/constants/animationSets.ts +21 -0
- package/app/constants/appEditor.ts +99 -0
- package/app/favorite/favoriteSlice.ts +690 -0
- package/app/favorite/type.ts +43 -0
- package/app/hooks/deleteDbKey.ts +233 -0
- package/app/i18n/client.ts +13 -0
- package/app/i18n/i18n.base.ts +14 -0
- package/app/i18n/i18n.config.ts +77 -0
- package/app/i18n/index.ts +15 -0
- package/app/i18n/mapLanguage.ts +11 -0
- package/app/i18n/translations/appBuilder.locale.ts +453 -0
- package/app/i18n/translations/error.locale.ts +246 -0
- package/app/i18n/translations/interface.locale.ts +2174 -0
- package/app/i18n/translations/pricing.locale.ts +397 -0
- package/app/i18n/translations/privacy.locale.ts +168 -0
- package/app/i18n/translations/seo.locale.ts +129 -0
- package/app/i18n/translations/terms.locale.ts +124 -0
- package/app/i18n/types.ts +6 -0
- package/app/notifications/model.ts +77 -0
- package/app/notifications/notificationSlice.ts +141 -0
- package/app/reducer.ts +36 -0
- package/app/settings/dbActionThunks.ts +34 -0
- package/app/settings/defaultSpacePreference.ts +87 -0
- package/app/settings/settingSlice.tsx +1212 -0
- package/app/settings/settingsRecord.ts +8 -0
- package/app/stateViews/runtime.ts +90 -0
- package/app/store.ts +55 -0
- package/app/theme/colors.ts +280 -0
- package/app/theme/fontPreference.ts +77 -0
- package/app/theme/theme.config.ts +120 -0
- package/app/theme/themeModeBootstrap.ts +123 -0
- package/app/types/appSummary.ts +114 -0
- package/app/types.ts +358 -0
- package/app/utils/appKeys.ts +55 -0
- package/app/utils/async.ts +28 -0
- package/app/utils/desktopAgentRuntimeTurnClient.ts +73 -0
- package/app/utils/env.ts +17 -0
- package/app/utils/fileUtils.ts +229 -0
- package/app/utils/imageUtils.ts +274 -0
- package/app/utils/myContentItems.ts +289 -0
- package/app/utils/retryAfter.ts +36 -0
- package/app/utils/retryFetch.ts +61 -0
- package/app/utils/toast.ts +3 -0
- package/auth/action/signUpAction.ts +227 -0
- package/auth/adminPermissions.ts +18 -0
- package/auth/authSlice.ts +531 -0
- package/auth/client/loginRequest.ts +14 -0
- package/auth/resetAuthScopedClientState.ts +27 -0
- package/auth/routes.ts +178 -0
- package/auth/token.ts +63 -0
- package/auth/types.ts +40 -0
- package/chat/chat.locale.ts +813 -0
- package/chat/dialog/actions/addCybotAction.ts +52 -0
- package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
- package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
- package/chat/dialog/actions/cleanupCliSession.ts +40 -0
- package/chat/dialog/actions/createDialogAction.ts +379 -0
- package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
- package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
- package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
- package/chat/dialog/actions/removeCybotAction.ts +6 -0
- package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
- package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
- package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
- package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
- package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
- package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
- package/chat/dialog/actions/updateTokensAction.ts +233 -0
- package/chat/dialog/dialogAgents.ts +72 -0
- package/chat/dialog/dialogSlice.ts +872 -0
- package/chat/dialog/dialogTitle.ts +81 -0
- package/chat/dialog/dialogTokenStats.ts +12 -0
- package/chat/dialog/dialogUrl.ts +6 -0
- package/chat/dialog/goal.ts +108 -0
- package/chat/dialog/objectAssistantRegistry.ts +286 -0
- package/chat/dialog/schedule.ts +17 -0
- package/chat/messages/fetchAndCacheMessages.ts +119 -0
- package/chat/messages/fetchConvMsgs.ts +51 -0
- package/chat/messages/fileUrl.ts +13 -0
- package/chat/messages/messageAgent.ts +8 -0
- package/chat/messages/messageContent.ts +199 -0
- package/chat/messages/messageContract.ts +88 -0
- package/chat/messages/messageSlice.ts +1367 -0
- package/chat/messages/toolThunks.ts +625 -0
- package/cli/client/agentRun.ts +27 -8
- package/cli/client/localRuntimeAdapter.ts +144 -28
- package/client/agentRun.test.ts +52 -0
- package/client/agentRun.ts +27 -8
- package/client/localRuntimeAdapter.test.ts +437 -6
- package/client/localRuntimeAdapter.ts +144 -28
- package/core/builtinAgents.ts +209 -0
- package/core/config.ts +15 -0
- package/core/crypto.ts +51 -0
- package/core/generateKeyPairFromSeedV1.ts +15 -0
- package/core/generateMainKey.ts +22 -0
- package/core/init.ts +41 -0
- package/core/localOrigins.ts +8 -0
- package/core/password.ts +13 -0
- package/core/prefix.ts +23 -0
- package/create/editor/transforms/fromMarkdown/index.ts +260 -0
- package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
- package/create/editor/transforms/fromMarkdown/table.ts +130 -0
- package/create/editor/transforms/markdownToSlate.ts +24 -0
- package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
- package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
- package/create/editor/transforms/slateToText.ts +33 -0
- package/create/editor/utils/slateUtils.ts +233 -0
- package/create/space/addSpaceAction.ts +193 -0
- package/create/space/category/categoryActions.ts +427 -0
- package/create/space/changeSpaceAction.ts +36 -0
- package/create/space/constants.ts +8 -0
- package/create/space/content/addContentAction.ts +116 -0
- package/create/space/content/contentThunks.ts +90 -0
- package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
- package/create/space/content/deleteMultipleContentAction.ts +112 -0
- package/create/space/content/moveContentAction.ts +285 -0
- package/create/space/content/updateContentCategoryAction.ts +154 -0
- package/create/space/content/updateContentTitleAction.ts +151 -0
- package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
- package/create/space/contentKeyUtils.ts +117 -0
- package/create/space/deleteSpaceAction.ts +276 -0
- package/create/space/fetchSpaceAction.ts +70 -0
- package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
- package/create/space/loadDefaultSpaceAction.ts +57 -0
- package/create/space/member/addMemberAction.ts +79 -0
- package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
- package/create/space/member/memberThunks.ts +47 -0
- package/create/space/member/removeMemberAction.ts +67 -0
- package/create/space/resolvePreferredSpaceId.ts +113 -0
- package/create/space/sidebarVisibleTypes.ts +241 -0
- package/create/space/space.locale.ts +1087 -0
- package/create/space/spaceAccess.ts +182 -0
- package/create/space/spaceCollapsedState.ts +54 -0
- package/create/space/spaceKeys.ts +65 -0
- package/create/space/spaceSlice.ts +328 -0
- package/create/space/spaceThunks.ts +410 -0
- package/create/space/types.ts +27 -0
- package/create/space/updateSpaceAction.ts +107 -0
- package/create/space/utils/permissions.ts +47 -0
- package/create/types.ts +21 -0
- package/database/actions/agentReadResolution.ts +33 -0
- package/database/actions/common.ts +243 -0
- package/database/actions/deleteFile.ts +40 -0
- package/database/actions/fileContent.ts +125 -0
- package/database/actions/patch.ts +155 -0
- package/database/actions/read.ts +358 -0
- package/database/actions/readAndWait.ts +260 -0
- package/database/actions/readRequestManager.ts +120 -0
- package/database/actions/readResolution.ts +125 -0
- package/database/actions/remove.ts +94 -0
- package/database/actions/replication.ts +477 -0
- package/database/actions/upload.ts +186 -0
- package/database/actions/upsert.ts +56 -0
- package/database/actions/write.ts +146 -0
- package/database/authority/ownerKey.ts +80 -0
- package/database/authority/recordAuthority.ts +67 -0
- package/database/authority/userAuthorityRegistry.ts +54 -0
- package/database/client/fetchUserData.ts +61 -0
- package/database/dbActionThunks.ts +1 -0
- package/database/dbSlice.ts +149 -0
- package/database/fileRing.ts +51 -0
- package/database/fileStorage.ts +232 -0
- package/database/fileUrl.ts +34 -0
- package/database/keys.ts +767 -0
- package/database/queryPrefixes.ts +14 -0
- package/database/requests.ts +443 -0
- package/database/runtimeServerContext.ts +54 -0
- package/database/tenantPlacement.ts +57 -0
- package/database/userPreferenceRegister.ts +131 -0
- package/database/utils/ulid.ts +1 -0
- package/integrations/anthropic/anthropicModels.ts +47 -0
- package/integrations/deepseek/models.ts +37 -0
- package/integrations/google/models.ts +341 -0
- package/integrations/openai/chatCompletionStreamMode.ts +10 -0
- package/integrations/openai/filterAndCleanMessages.ts +284 -0
- package/integrations/openai/flexTier.ts +102 -0
- package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
- package/integrations/openai/generateResponseRequestBody.ts +77 -0
- package/integrations/openai/models.ts +271 -0
- package/integrations/openai/providerBodyCompatibility.ts +23 -0
- package/integrations/openai/responsesHelpers.ts +297 -0
- package/integrations/x-reader/types.ts +109 -0
- package/integrations/xai/models.ts +13 -0
- package/integrations/xhs-reader/analyze/profileAnalyzer.ts +205 -0
- package/integrations/xhs-reader/backends/playwrightProfileCollector.ts +624 -0
- package/integrations/xhs-reader/bridge/readXhsProfileWithBridge.ts +227 -0
- package/integrations/xhs-reader/client/xhsWebApiClient.ts +229 -0
- package/integrations/xhs-reader/normalize.ts +390 -0
- package/integrations/xhs-reader/orchestrator.ts +178 -0
- package/integrations/xhs-reader/redaction.ts +68 -0
- package/integrations/xhs-reader/types.ts +244 -0
- package/integrations/xhs-reader/url.ts +57 -0
- package/package.json +430 -4
- package/render/page/createPageAction.ts +183 -0
- package/render/page/docSlice.ts +468 -0
- package/render/page/types.ts +17 -0
- package/render/table/createTableAction.ts +270 -0
- package/render/table/deleteTableAction.ts +193 -0
- package/render/table/fetchAndCacheTableRows.ts +174 -0
- package/render/table/tableSlice.ts +1106 -0
- package/render/table/toolValueUtils.ts +363 -0
- package/render/table/types.ts +252 -0
- package/render/table/utils/tableSerialization.ts +50 -0
- package/server/handlers/agentRun/types.ts +104 -0
- package/share/action.ts +225 -0
- package/share/helpers.ts +302 -0
- package/share/keys.ts +243 -0
- package/share/publicSharePolicy.ts +27 -0
- package/share/shareSlice.ts +53 -0
- package/share/types.ts +100 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// 文件路径: ai/agent/cleanAgentMessages.ts
|
|
2
|
+
|
|
3
|
+
import type { Message } from "../../chat/messages/types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 判断消息的文本内容是否“为空”(对人没意义)
|
|
7
|
+
*/
|
|
8
|
+
const isEmptyContent = (content: unknown): boolean => {
|
|
9
|
+
if (content == null) return true;
|
|
10
|
+
|
|
11
|
+
if (typeof content === "string") {
|
|
12
|
+
return content.trim().length === 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (Array.isArray(content)) {
|
|
16
|
+
return content.length === 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 为指定 Agent 构造“安全”的消息视图:
|
|
24
|
+
*
|
|
25
|
+
* 分层目标:
|
|
26
|
+
* - 这一层是「对话视角清洗」,不直接关心 OpenAI/Azure 精确协议,只关心:
|
|
27
|
+
* 1)当前 Agent 能看到什么历史;
|
|
28
|
+
* 2)哪些内部 plumbing 信息需要隐藏。
|
|
29
|
+
*
|
|
30
|
+
* 约定:
|
|
31
|
+
* - 所有 Agent:
|
|
32
|
+
* - 丢弃「assistant 且 content 为空 且 没有 tool 调用」的消息(通常是 streaming 占位,没实际内容)
|
|
33
|
+
*
|
|
34
|
+
* - 当前 Agent(cybotKey 匹配):
|
|
35
|
+
* - user / assistant / tool 消息:原样保留(保证自己工具链完整)
|
|
36
|
+
* - 特别地:即使 assistant 只有 tool 调用、没有文本,也要保留
|
|
37
|
+
*
|
|
38
|
+
* - 其它 Agent:
|
|
39
|
+
* - assistant 消息:
|
|
40
|
+
* - 删除所有 tool 调用字段(tool_calls / toolCalls),避免跨 Agent 的 call_id 冲突;
|
|
41
|
+
* - 使用 agentName 作为前缀,生成可读文本:
|
|
42
|
+
* - 有原始文本:`【AgentName】 原文...`
|
|
43
|
+
* - 没有原始文本:`【AgentName】(使用了工具生成回复)`
|
|
44
|
+
* - tool 消息:直接丢弃(内部 plumbing,对当前 Agent 没意义)
|
|
45
|
+
*
|
|
46
|
+
* - 其它角色(system 等):原样保留
|
|
47
|
+
*/
|
|
48
|
+
export const buildAgentViewMessages = (
|
|
49
|
+
allMessages: Message[],
|
|
50
|
+
currentCybotKey: string
|
|
51
|
+
): Message[] => {
|
|
52
|
+
const result: Message[] = [];
|
|
53
|
+
|
|
54
|
+
for (const msg of allMessages) {
|
|
55
|
+
if (!msg) continue;
|
|
56
|
+
|
|
57
|
+
const role = (msg as any).role;
|
|
58
|
+
if (!role) continue;
|
|
59
|
+
|
|
60
|
+
// 同时兼容内部字段 toolCalls 和 OpenAI 标准字段 tool_calls
|
|
61
|
+
const hasToolCalls =
|
|
62
|
+
(Array.isArray((msg as any).tool_calls) &&
|
|
63
|
+
(msg as any).tool_calls.length > 0) ||
|
|
64
|
+
(Array.isArray((msg as any).toolCalls) &&
|
|
65
|
+
(msg as any).toolCalls.length > 0);
|
|
66
|
+
|
|
67
|
+
const empty = isEmptyContent((msg as any).content);
|
|
68
|
+
|
|
69
|
+
// 1. 统一丢弃“空 assistant 且没有 tool 调用”的消息
|
|
70
|
+
// - 对所有 Agent 一视同仁,这类通常是 streaming 中途写入的占位,没实际内容
|
|
71
|
+
if (role === "assistant" && empty && !hasToolCalls) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const isCurrentAgent = (msg as any).cybotKey === currentCybotKey;
|
|
76
|
+
|
|
77
|
+
// ---- 用户消息:所有 Agent 都需要完整历史 ----
|
|
78
|
+
if (role === "user") {
|
|
79
|
+
result.push(msg);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ---- 助手消息 ----
|
|
84
|
+
if (role === "assistant") {
|
|
85
|
+
if (isCurrentAgent) {
|
|
86
|
+
// 当前 Agent 自己的历史回复:原样保留(包含 toolCalls / tool_calls)
|
|
87
|
+
result.push(msg);
|
|
88
|
+
} else {
|
|
89
|
+
// 其它 Agent 的回复:降级为纯文本 + 前缀,不再携带任何 tool 调用字段
|
|
90
|
+
const cloned: Message = { ...(msg as any) } as Message;
|
|
91
|
+
|
|
92
|
+
// 删掉所有工具调用字段,避免跨 Agent 的 call_id 污染
|
|
93
|
+
if ((cloned as any).tool_calls) {
|
|
94
|
+
delete (cloned as any).tool_calls;
|
|
95
|
+
}
|
|
96
|
+
if ((cloned as any).toolCalls) {
|
|
97
|
+
delete (cloned as any).toolCalls;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const rawAgentName = (cloned as any).agentName;
|
|
101
|
+
const agentName =
|
|
102
|
+
rawAgentName && String(rawAgentName).trim()
|
|
103
|
+
? String(rawAgentName).trim()
|
|
104
|
+
: "其他 Agent";
|
|
105
|
+
|
|
106
|
+
if (typeof cloned.content === "string") {
|
|
107
|
+
const trimmed = cloned.content.trim();
|
|
108
|
+
if (trimmed) {
|
|
109
|
+
cloned.content = `【${agentName}】 ${trimmed}`;
|
|
110
|
+
} else {
|
|
111
|
+
cloned.content = `【${agentName}】(使用了工具生成回复)`;
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
// 非字符串内容(理论上很少见),同样给一个占位说明
|
|
115
|
+
cloned.content = `【${agentName}】(使用了工具生成回复)`;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
result.push(cloned);
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ---- 工具消息 ----
|
|
124
|
+
if (role === "tool") {
|
|
125
|
+
if (isCurrentAgent) {
|
|
126
|
+
// 当前 Agent 自己的 tool 消息:保留,保证工具调用链可用
|
|
127
|
+
result.push(msg);
|
|
128
|
+
} else {
|
|
129
|
+
// 其它 Agent 的 tool 消息:全部丢弃,避免跨 Agent / 跨 provider 的 call_id 冲突
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// ---- 其它角色(system 等) ----
|
|
136
|
+
result.push(msg);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return result;
|
|
140
|
+
};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { selectCurrentServer } from "../../app/settings/settingSlice";
|
|
2
|
+
import { selectCurrentToken } from "../../auth/authSlice";
|
|
3
|
+
import type { RootState } from "../../app/store";
|
|
4
|
+
import type { CliProvider } from "./cliExecutor";
|
|
5
|
+
|
|
6
|
+
type CliChatAction = "start" | "turn" | "get" | "close";
|
|
7
|
+
|
|
8
|
+
type CliChatRequestBase = {
|
|
9
|
+
cliProvider?: CliProvider;
|
|
10
|
+
model?: string;
|
|
11
|
+
systemPrompt?: string;
|
|
12
|
+
reasoningEffort?: "low" | "medium" | "high" | "xhigh" | "max";
|
|
13
|
+
temperature?: number;
|
|
14
|
+
topP?: number;
|
|
15
|
+
frequencyPenalty?: number;
|
|
16
|
+
presencePenalty?: number;
|
|
17
|
+
maxTokens?: number;
|
|
18
|
+
enableThinking?: boolean;
|
|
19
|
+
thinkingBudget?: number;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
function getCliChatRequestConfig(thunkApi: any) {
|
|
23
|
+
const state = thunkApi.getState() as RootState;
|
|
24
|
+
const currentServer = selectCurrentServer(state);
|
|
25
|
+
const token = selectCurrentToken(state);
|
|
26
|
+
if (!currentServer) throw new Error("无法获取当前服务器地址。");
|
|
27
|
+
return { currentServer, token };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function postCliChat(
|
|
31
|
+
thunkApi: any,
|
|
32
|
+
body: Record<string, any>,
|
|
33
|
+
signal?: AbortSignal,
|
|
34
|
+
): Promise<Response> {
|
|
35
|
+
const { currentServer, token } = getCliChatRequestConfig(thunkApi);
|
|
36
|
+
return fetch(`${currentServer}/api/cli/chat`, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: {
|
|
39
|
+
"Content-Type": "application/json",
|
|
40
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
41
|
+
},
|
|
42
|
+
body: JSON.stringify(body),
|
|
43
|
+
signal,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function startCliChatSession(
|
|
48
|
+
thunkApi: any,
|
|
49
|
+
args: CliChatRequestBase & { systemPrompt?: string; cliProvider?: CliProvider },
|
|
50
|
+
) {
|
|
51
|
+
const response = await postCliChat(thunkApi, {
|
|
52
|
+
action: "start" satisfies CliChatAction,
|
|
53
|
+
cliProvider: args.cliProvider,
|
|
54
|
+
model: args.model,
|
|
55
|
+
systemPrompt: args.systemPrompt,
|
|
56
|
+
reasoningEffort: args.reasoningEffort,
|
|
57
|
+
temperature: args.temperature,
|
|
58
|
+
topP: args.topP,
|
|
59
|
+
frequencyPenalty: args.frequencyPenalty,
|
|
60
|
+
presencePenalty: args.presencePenalty,
|
|
61
|
+
maxTokens: args.maxTokens,
|
|
62
|
+
enableThinking: args.enableThinking,
|
|
63
|
+
thinkingBudget: args.thinkingBudget,
|
|
64
|
+
});
|
|
65
|
+
return response.json();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function getCliChatSession(
|
|
69
|
+
thunkApi: any,
|
|
70
|
+
args: { sessionId: string },
|
|
71
|
+
) {
|
|
72
|
+
const response = await postCliChat(thunkApi, {
|
|
73
|
+
action: "get" satisfies CliChatAction,
|
|
74
|
+
sessionId: args.sessionId,
|
|
75
|
+
});
|
|
76
|
+
return response.json();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function closeCliChatSession(
|
|
80
|
+
thunkApi: any,
|
|
81
|
+
args: { sessionId: string },
|
|
82
|
+
) {
|
|
83
|
+
const response = await postCliChat(thunkApi, {
|
|
84
|
+
action: "close" satisfies CliChatAction,
|
|
85
|
+
sessionId: args.sessionId,
|
|
86
|
+
});
|
|
87
|
+
return response.json();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export async function runCliChatTurnNonStreaming(
|
|
91
|
+
thunkApi: any,
|
|
92
|
+
args: CliChatRequestBase & {
|
|
93
|
+
prompt: string;
|
|
94
|
+
sessionId: string;
|
|
95
|
+
},
|
|
96
|
+
signal?: AbortSignal,
|
|
97
|
+
) {
|
|
98
|
+
const response = await postCliChat(
|
|
99
|
+
thunkApi,
|
|
100
|
+
{
|
|
101
|
+
action: "turn" satisfies CliChatAction,
|
|
102
|
+
sessionId: args.sessionId,
|
|
103
|
+
prompt: args.prompt,
|
|
104
|
+
model: args.model,
|
|
105
|
+
stream: false,
|
|
106
|
+
},
|
|
107
|
+
signal,
|
|
108
|
+
);
|
|
109
|
+
return response.json();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function createCliChatTurnStream(
|
|
113
|
+
thunkApi: any,
|
|
114
|
+
args: CliChatRequestBase & {
|
|
115
|
+
prompt: string;
|
|
116
|
+
sessionId?: string;
|
|
117
|
+
},
|
|
118
|
+
signal?: AbortSignal,
|
|
119
|
+
) {
|
|
120
|
+
return postCliChat(
|
|
121
|
+
thunkApi,
|
|
122
|
+
args.sessionId
|
|
123
|
+
? {
|
|
124
|
+
action: "turn" satisfies CliChatAction,
|
|
125
|
+
sessionId: args.sessionId,
|
|
126
|
+
prompt: args.prompt,
|
|
127
|
+
model: args.model,
|
|
128
|
+
reasoningEffort: args.reasoningEffort,
|
|
129
|
+
temperature: args.temperature,
|
|
130
|
+
topP: args.topP,
|
|
131
|
+
frequencyPenalty: args.frequencyPenalty,
|
|
132
|
+
presencePenalty: args.presencePenalty,
|
|
133
|
+
maxTokens: args.maxTokens,
|
|
134
|
+
enableThinking: args.enableThinking,
|
|
135
|
+
thinkingBudget: args.thinkingBudget,
|
|
136
|
+
}
|
|
137
|
+
: {
|
|
138
|
+
prompt: args.prompt,
|
|
139
|
+
model: args.model,
|
|
140
|
+
cliProvider: args.cliProvider,
|
|
141
|
+
systemPrompt: args.systemPrompt,
|
|
142
|
+
reasoningEffort: args.reasoningEffort,
|
|
143
|
+
temperature: args.temperature,
|
|
144
|
+
topP: args.topP,
|
|
145
|
+
frequencyPenalty: args.frequencyPenalty,
|
|
146
|
+
presencePenalty: args.presencePenalty,
|
|
147
|
+
maxTokens: args.maxTokens,
|
|
148
|
+
enableThinking: args.enableThinking,
|
|
149
|
+
thinkingBudget: args.thinkingBudget,
|
|
150
|
+
},
|
|
151
|
+
signal,
|
|
152
|
+
);
|
|
153
|
+
}
|
package/ai/agent/cliExecutor.ts
CHANGED
|
@@ -41,7 +41,7 @@ export interface CliImageInput {
|
|
|
41
41
|
|
|
42
42
|
export interface CliExecuteOptions {
|
|
43
43
|
model?: string;
|
|
44
|
-
timeout?: number; // ms
|
|
44
|
+
timeout?: number; // ms;各 CLI executor 可按任务类型设置自己的默认值
|
|
45
45
|
cwd?: string;
|
|
46
46
|
env?: Record<string, string | undefined>;
|
|
47
47
|
yolo?: boolean; // 允许所有工具,默认 true(后台任务常用)
|
|
@@ -70,6 +70,8 @@ type CliSessionMessage = {
|
|
|
70
70
|
content: string;
|
|
71
71
|
};
|
|
72
72
|
|
|
73
|
+
const DEFAULT_AGY_TIMEOUT_MS = 600_000;
|
|
74
|
+
|
|
73
75
|
export interface CliSessionHandle {
|
|
74
76
|
sessionId: string;
|
|
75
77
|
provider: CliProvider;
|
|
@@ -758,12 +760,49 @@ function formatCliTimeout(timeoutMs: number) {
|
|
|
758
760
|
return `${Math.max(1, Math.ceil(timeoutMs / 1000))}s`;
|
|
759
761
|
}
|
|
760
762
|
|
|
763
|
+
function tailText(value: string, maxChars = 1200): string {
|
|
764
|
+
if (value.length <= maxChars) return value;
|
|
765
|
+
return value.slice(value.length - maxChars);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
function terminateCliProcessGroup(
|
|
769
|
+
proc: ReturnType<typeof spawn>,
|
|
770
|
+
signal: NodeJS.Signals
|
|
771
|
+
) {
|
|
772
|
+
const pid = typeof proc.pid === "number" ? proc.pid : 0;
|
|
773
|
+
if (pid > 0 && process.platform !== "win32") {
|
|
774
|
+
try {
|
|
775
|
+
process.kill(-pid, signal);
|
|
776
|
+
return;
|
|
777
|
+
} catch {
|
|
778
|
+
// Fall back to the child process if the group is unavailable.
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
try {
|
|
782
|
+
proc.kill(signal);
|
|
783
|
+
} catch {
|
|
784
|
+
// Best effort cleanup only.
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
function buildAgyTimeoutError(timeout: number, stdout: string, stderr: string) {
|
|
789
|
+
const parts = [
|
|
790
|
+
`Antigravity CLI timed out after ${timeout}ms.`,
|
|
791
|
+
"agy print mode is agentic and can keep waiting for the conversation to become fully idle; prefer shorter scoped prompts or split the task into multiple turns.",
|
|
792
|
+
];
|
|
793
|
+
const stdoutTail = tailText(stdout).trim();
|
|
794
|
+
const stderrTail = tailText(stderr).trim();
|
|
795
|
+
if (stdoutTail) parts.push(`stdout tail:\n${stdoutTail}`);
|
|
796
|
+
if (stderrTail) parts.push(`stderr tail:\n${stderrTail}`);
|
|
797
|
+
return new Error(parts.join("\n"));
|
|
798
|
+
}
|
|
799
|
+
|
|
761
800
|
function executeAgy(
|
|
762
801
|
prompt: string,
|
|
763
802
|
options: CliExecuteOptions
|
|
764
803
|
): Promise<CliExecuteResult> {
|
|
765
804
|
const {
|
|
766
|
-
timeout =
|
|
805
|
+
timeout = DEFAULT_AGY_TIMEOUT_MS,
|
|
767
806
|
cwd = process.cwd(),
|
|
768
807
|
yolo = true,
|
|
769
808
|
} = options;
|
|
@@ -786,15 +825,28 @@ function executeAgy(
|
|
|
786
825
|
cwd,
|
|
787
826
|
env: buildCliProcessEnv(options.env),
|
|
788
827
|
stdio: ["ignore", "pipe", "pipe"],
|
|
828
|
+
detached: process.platform !== "win32",
|
|
789
829
|
});
|
|
790
830
|
let stdout = "";
|
|
791
831
|
let stderr = "";
|
|
792
832
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
833
|
+
let forceTimer: ReturnType<typeof setTimeout> | undefined;
|
|
834
|
+
let settled = false;
|
|
835
|
+
|
|
836
|
+
const clearTimers = () => {
|
|
837
|
+
if (timer) clearTimeout(timer);
|
|
838
|
+
if (forceTimer) clearTimeout(forceTimer);
|
|
839
|
+
};
|
|
793
840
|
|
|
794
841
|
if (timeout > 0) {
|
|
795
842
|
timer = setTimeout(() => {
|
|
796
|
-
|
|
797
|
-
|
|
843
|
+
if (settled) return;
|
|
844
|
+
settled = true;
|
|
845
|
+
terminateCliProcessGroup(proc, "SIGTERM");
|
|
846
|
+
forceTimer = setTimeout(() => {
|
|
847
|
+
terminateCliProcessGroup(proc, "SIGKILL");
|
|
848
|
+
}, 3_000);
|
|
849
|
+
reject(buildAgyTimeoutError(timeout, stdout, stderr));
|
|
798
850
|
}, timeout + 1_000);
|
|
799
851
|
}
|
|
800
852
|
|
|
@@ -807,7 +859,12 @@ function executeAgy(
|
|
|
807
859
|
});
|
|
808
860
|
|
|
809
861
|
proc.on("close", (code) => {
|
|
810
|
-
if (
|
|
862
|
+
if (settled) {
|
|
863
|
+
clearTimers();
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
866
|
+
settled = true;
|
|
867
|
+
clearTimers();
|
|
811
868
|
if (code !== 0 && code !== null) {
|
|
812
869
|
reject(new Error(`Antigravity CLI exited with code ${code}\nstderr: ${stderr}`));
|
|
813
870
|
return;
|
|
@@ -821,7 +878,9 @@ function executeAgy(
|
|
|
821
878
|
});
|
|
822
879
|
|
|
823
880
|
proc.on("error", (err) => {
|
|
824
|
-
if (
|
|
881
|
+
if (settled) return;
|
|
882
|
+
settled = true;
|
|
883
|
+
clearTimers();
|
|
825
884
|
reject(err);
|
|
826
885
|
});
|
|
827
886
|
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Simple deterministic hash for cache-key purposes (browser + server compatible)
|
|
2
|
+
function createHash(_algo: string) {
|
|
3
|
+
let buf = "";
|
|
4
|
+
return {
|
|
5
|
+
update(s: string) { buf += s; return this; },
|
|
6
|
+
digest(_enc: string) {
|
|
7
|
+
// FNV-1a 32-bit, hex-padded to 8 chars
|
|
8
|
+
let h = 0x811c9dc5;
|
|
9
|
+
for (let i = 0; i < buf.length; i++) {
|
|
10
|
+
h ^= buf.charCodeAt(i);
|
|
11
|
+
h = (h * 0x01000193) >>> 0;
|
|
12
|
+
}
|
|
13
|
+
return h.toString(16).padStart(8, "0");
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type ContextLayerOwner =
|
|
19
|
+
| "platform"
|
|
20
|
+
| "agent"
|
|
21
|
+
| "user"
|
|
22
|
+
| "runtime";
|
|
23
|
+
|
|
24
|
+
export type ContextLayerCacheScope = "static" | "session" | "turn";
|
|
25
|
+
|
|
26
|
+
export type ContextLayer = {
|
|
27
|
+
id: string;
|
|
28
|
+
owner: ContextLayerOwner;
|
|
29
|
+
content?: string | null;
|
|
30
|
+
tokenBudget?: number;
|
|
31
|
+
cacheScope?: ContextLayerCacheScope;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type CompiledContextLayer = {
|
|
35
|
+
id: string;
|
|
36
|
+
owner: ContextLayerOwner;
|
|
37
|
+
content: string;
|
|
38
|
+
cacheScope: ContextLayerCacheScope;
|
|
39
|
+
charCount: number;
|
|
40
|
+
estimatedTokens: number;
|
|
41
|
+
tokenBudget?: number;
|
|
42
|
+
budgetStatus?: "within-budget" | "over-budget";
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export type CompiledContext = {
|
|
46
|
+
content: string;
|
|
47
|
+
layers: CompiledContextLayer[];
|
|
48
|
+
cacheProfile: {
|
|
49
|
+
stablePrefixHash: string;
|
|
50
|
+
stablePrefixLayerIds: string[];
|
|
51
|
+
stablePrefixCharCount: number;
|
|
52
|
+
stablePrefixEstimatedTokens: number;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const hasLayerContent = (
|
|
57
|
+
layer: ContextLayer
|
|
58
|
+
): layer is ContextLayer & { content: string } => Boolean(layer.content);
|
|
59
|
+
|
|
60
|
+
export const estimateContextTokens = (content: string): number =>
|
|
61
|
+
Math.ceil(content.length / 4);
|
|
62
|
+
|
|
63
|
+
export const compileContextLayers = (
|
|
64
|
+
layers: ContextLayer[]
|
|
65
|
+
): CompiledContext => {
|
|
66
|
+
const compiledLayers = layers
|
|
67
|
+
.filter(hasLayerContent)
|
|
68
|
+
.map((layer): CompiledContextLayer => {
|
|
69
|
+
const estimatedTokens = estimateContextTokens(layer.content);
|
|
70
|
+
return {
|
|
71
|
+
id: layer.id,
|
|
72
|
+
owner: layer.owner,
|
|
73
|
+
content: layer.content,
|
|
74
|
+
cacheScope: layer.cacheScope ?? "turn",
|
|
75
|
+
charCount: layer.content.length,
|
|
76
|
+
estimatedTokens,
|
|
77
|
+
tokenBudget: layer.tokenBudget,
|
|
78
|
+
budgetStatus:
|
|
79
|
+
typeof layer.tokenBudget === "number"
|
|
80
|
+
? estimatedTokens <= layer.tokenBudget
|
|
81
|
+
? "within-budget"
|
|
82
|
+
: "over-budget"
|
|
83
|
+
: undefined,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
const stablePrefixLayers: CompiledContextLayer[] = [];
|
|
87
|
+
for (const layer of compiledLayers) {
|
|
88
|
+
if (layer.cacheScope === "turn") break;
|
|
89
|
+
stablePrefixLayers.push(layer);
|
|
90
|
+
}
|
|
91
|
+
const stablePrefixContent = stablePrefixLayers
|
|
92
|
+
.map((layer) => layer.content)
|
|
93
|
+
.join("\n\n");
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
content: compiledLayers.map((layer) => layer.content).join("\n\n"),
|
|
97
|
+
layers: compiledLayers,
|
|
98
|
+
cacheProfile: {
|
|
99
|
+
stablePrefixHash: createHash("sha256")
|
|
100
|
+
.update(stablePrefixContent)
|
|
101
|
+
.digest("hex"),
|
|
102
|
+
stablePrefixLayerIds: stablePrefixLayers.map((layer) => layer.id),
|
|
103
|
+
stablePrefixCharCount: stablePrefixContent.length,
|
|
104
|
+
stablePrefixEstimatedTokens: estimateContextTokens(stablePrefixContent),
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
type ContextLayerContractOptions = {
|
|
2
|
+
hasRememberMemoryTool?: boolean;
|
|
3
|
+
hasDocTools?: boolean;
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
export const buildContextLayerContractBlock = (
|
|
7
|
+
options: ContextLayerContractOptions = {}
|
|
8
|
+
): string => {
|
|
9
|
+
const lines = [
|
|
10
|
+
"--- 上下文分层约定 ---",
|
|
11
|
+
"不要把所有信息都塞进同一层。优先利用已有的 memory / knowledge / doc,而不是把它们混成一段长对话。",
|
|
12
|
+
"",
|
|
13
|
+
"层次边界:",
|
|
14
|
+
"1. memory layer:放短到中期、可复用但不必永久挂载的偏好、近期共识和压缩后的经验;要短、可检索、可替换。",
|
|
15
|
+
"2. knowledge layer:放稳定规则、长期有效事实和每轮都会反复依赖的说明;优先通过 prompt / references 自动加载。",
|
|
16
|
+
"3. doc layer:放需要跨轮次持续维护的外部工作台,例如 runbook、mission、incident、checkpoint、idea backlog、experiment log;需要时显式读取和更新。",
|
|
17
|
+
"",
|
|
18
|
+
"写入原则:",
|
|
19
|
+
"- 临时步骤、原始长日志、一次性思路,不要直接写进 memory 或 knowledge。",
|
|
20
|
+
"- 稳定行为规则、长期固定约束,优先沉淀到 knowledge layer。",
|
|
21
|
+
"- 用户偏好、最近形成的协作共识、近期反复有用的经验,优先沉淀到 memory layer。",
|
|
22
|
+
"- 需要跨轮次接力的任务状态、运行手册、事故记录、检查点,优先写入 doc layer。",
|
|
23
|
+
"",
|
|
24
|
+
"读取原则:",
|
|
25
|
+
"- 先用 knowledge layer 解决稳定规则问题。",
|
|
26
|
+
"- 再用 memory layer 补充近期偏好和延续性。",
|
|
27
|
+
"- 需要真实运行现场、任务状态或可共享工作台时,再读 doc layer。",
|
|
28
|
+
"- 当前用户输入始终高于 recent memory;recent memory 高于过旧的 doc 推断。",
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
if (options.hasRememberMemoryTool) {
|
|
32
|
+
lines.push(
|
|
33
|
+
"- 当某条偏好、近期共识或复用经验对未来明显有帮助时,可以调用 rememberMemory,但要写成简洁可复用的一句话;只有当前 dialog 明确绑定了 space,且内容属于共享协作规则时才写 space memory。"
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (options.hasDocTools) {
|
|
38
|
+
lines.push(
|
|
39
|
+
"- 当任务需要 24h 连续运行、跨 dialog 接力或人工与 agent 共读时,优先把 mission / runbook / incident / checkpoint / idea backlog / experiment log 写入 doc layer。"
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return lines.join("\n");
|
|
44
|
+
};
|