@zooique/memora 2.0.0 → 3.0.0
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/CHANGELOG.md +1028 -0
- package/README.en.md +305 -0
- package/README.md +303 -148
- package/config.example.json +43 -0
- package/dist/agent/agent.d.ts +438 -295
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1368 -836
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +117 -39
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +574 -71
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/budget.d.ts +131 -0
- package/dist/agent/budget.d.ts.map +1 -0
- package/dist/agent/budget.js +128 -0
- package/dist/agent/budget.js.map +1 -0
- package/dist/agent/builtinToolHandlers.d.ts +229 -17
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +758 -70
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +198 -7
- package/dist/agent/builtinTools.d.ts.map +1 -1
- package/dist/agent/builtinTools.js +646 -14
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/compaction.d.ts +93 -0
- package/dist/agent/compaction.d.ts.map +1 -0
- package/dist/agent/compaction.js +192 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/constants.d.ts +139 -18
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +154 -18
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +126 -76
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +197 -135
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/contextPreparer.d.ts +78 -0
- package/dist/agent/contextPreparer.d.ts.map +1 -0
- package/dist/agent/contextPreparer.js +128 -0
- package/dist/agent/contextPreparer.js.map +1 -0
- package/dist/agent/duplicateInterceptor.d.ts +67 -0
- package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
- package/dist/agent/duplicateInterceptor.js +82 -0
- package/dist/agent/duplicateInterceptor.js.map +1 -0
- package/dist/agent/guardRail.d.ts +166 -0
- package/dist/agent/guardRail.d.ts.map +1 -0
- package/dist/agent/guardRail.js +333 -0
- package/dist/agent/guardRail.js.map +1 -0
- package/dist/agent/loop.d.ts +718 -253
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +2215 -648
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +21 -74
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +32 -105
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +20 -88
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
- package/dist/agent/managers/chatLockManager.js +31 -103
- package/dist/agent/managers/chatLockManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +85 -0
- package/dist/agent/managers/dedupManager.d.ts.map +1 -0
- package/dist/agent/managers/dedupManager.js +248 -0
- package/dist/agent/managers/dedupManager.js.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.js +178 -0
- package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
- package/dist/agent/managers/llmCaller.d.ts +124 -0
- package/dist/agent/managers/llmCaller.d.ts.map +1 -0
- package/dist/agent/managers/llmCaller.js +417 -0
- package/dist/agent/managers/llmCaller.js.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts +21 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.js +32 -0
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
- package/dist/agent/managers/loopMetrics.d.ts +58 -0
- package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
- package/dist/agent/managers/loopMetrics.js +68 -0
- package/dist/agent/managers/loopMetrics.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +56 -192
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +24 -0
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
- package/dist/agent/managers/memoryGovernance.js +46 -0
- package/dist/agent/managers/memoryGovernance.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +59 -393
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +92 -736
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
- package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
- package/dist/agent/managers/roundSummaryGenerator.js +201 -0
- package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
- package/dist/agent/managers/sessionArchiver.d.ts +19 -63
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +83 -157
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts +286 -57
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +846 -85
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/sessionNamer.d.ts +35 -0
- package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
- package/dist/agent/managers/sessionNamer.js +104 -0
- package/dist/agent/managers/sessionNamer.js.map +1 -0
- package/dist/agent/managers/streamAccumulator.d.ts +20 -0
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
- package/dist/agent/managers/streamAccumulator.js +15 -0
- package/dist/agent/managers/streamAccumulator.js.map +1 -0
- package/dist/agent/managers/textPolishManager.d.ts +8 -44
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
- package/dist/agent/managers/textPolishManager.js +12 -47
- package/dist/agent/managers/textPolishManager.js.map +1 -1
- package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
- package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
- package/dist/agent/managers/toolCallHelpers.js +161 -0
- package/dist/agent/managers/toolCallHelpers.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +57 -87
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +166 -246
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +134 -84
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +419 -133
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/needsPlanning.d.ts +28 -0
- package/dist/agent/needsPlanning.d.ts.map +1 -0
- package/dist/agent/needsPlanning.js +68 -0
- package/dist/agent/needsPlanning.js.map +1 -0
- package/dist/agent/seed/index.d.ts +11 -0
- package/dist/agent/seed/index.d.ts.map +1 -0
- package/dist/agent/seed/index.js +10 -0
- package/dist/agent/seed/index.js.map +1 -0
- package/dist/agent/seed/orchestrator.d.ts +83 -0
- package/dist/agent/seed/orchestrator.d.ts.map +1 -0
- package/dist/agent/seed/orchestrator.js +260 -0
- package/dist/agent/seed/orchestrator.js.map +1 -0
- package/dist/agent/seed/prepare.d.ts +49 -0
- package/dist/agent/seed/prepare.d.ts.map +1 -0
- package/dist/agent/seed/prepare.js +107 -0
- package/dist/agent/seed/prepare.js.map +1 -0
- package/dist/agent/seed/types.d.ts +115 -0
- package/dist/agent/seed/types.d.ts.map +1 -0
- package/dist/agent/seed/types.js +15 -0
- package/dist/agent/seed/types.js.map +1 -0
- package/dist/agent/sessionStateMachine.d.ts +78 -0
- package/dist/agent/sessionStateMachine.d.ts.map +1 -0
- package/dist/agent/sessionStateMachine.js +182 -0
- package/dist/agent/sessionStateMachine.js.map +1 -0
- package/dist/agent/taskTableRenderer.d.ts +51 -0
- package/dist/agent/taskTableRenderer.d.ts.map +1 -0
- package/dist/agent/taskTableRenderer.js +115 -0
- package/dist/agent/taskTableRenderer.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +255 -9
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +956 -20
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/toolLedger.d.ts +120 -0
- package/dist/agent/toolLedger.d.ts.map +1 -0
- package/dist/agent/toolLedger.js +149 -0
- package/dist/agent/toolLedger.js.map +1 -0
- package/dist/agent/toolResultCache.d.ts +134 -0
- package/dist/agent/toolResultCache.d.ts.map +1 -0
- package/dist/agent/toolResultCache.js +243 -0
- package/dist/agent/toolResultCache.js.map +1 -0
- package/dist/agent/toolResultOffload.d.ts +59 -0
- package/dist/agent/toolResultOffload.d.ts.map +1 -0
- package/dist/agent/toolResultOffload.js +70 -0
- package/dist/agent/toolResultOffload.js.map +1 -0
- package/dist/agent/toolRunner.d.ts +59 -0
- package/dist/agent/toolRunner.d.ts.map +1 -0
- package/dist/agent/toolRunner.js +147 -0
- package/dist/agent/toolRunner.js.map +1 -0
- package/dist/agent/tracer.d.ts +99 -107
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +24 -69
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +512 -162
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -51
- package/dist/agent/types.js.map +1 -1
- package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
- package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
- package/dist/code-exec/codeExecutionProvider.js +57 -0
- package/dist/code-exec/codeExecutionProvider.js.map +1 -0
- package/dist/code-exec/types.d.ts +37 -0
- package/dist/code-exec/types.d.ts.map +1 -0
- package/dist/code-exec/types.js +12 -0
- package/dist/code-exec/types.js.map +1 -0
- package/dist/config/expandEnvVars.d.ts +22 -0
- package/dist/config/expandEnvVars.d.ts.map +1 -0
- package/dist/config/expandEnvVars.js +38 -0
- package/dist/config/expandEnvVars.js.map +1 -0
- package/dist/config/loader.d.ts +59 -242
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +237 -194
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +69 -74
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +93 -63
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +2 -3
- package/dist/llm/abortSignal.d.ts.map +1 -1
- package/dist/llm/abortSignal.js +2 -3
- package/dist/llm/abortSignal.js.map +1 -1
- package/dist/llm/factory.d.ts +29 -25
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +34 -69
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +25 -40
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +181 -129
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +29 -42
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +11 -10
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/types.d.ts +54 -11
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +0 -5
- package/dist/llm/types.js.map +1 -1
- package/dist/logging/logger.d.ts +8 -29
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +43 -233
- package/dist/logging/logger.js.map +1 -1
- package/dist/logging/loggerInterface.d.ts +9 -8
- package/dist/logging/loggerInterface.d.ts.map +1 -1
- package/dist/memory/gcService.d.ts +164 -0
- package/dist/memory/gcService.d.ts.map +1 -0
- package/dist/memory/gcService.js +215 -0
- package/dist/memory/gcService.js.map +1 -0
- package/dist/memory/governance.d.ts +17 -0
- package/dist/memory/governance.d.ts.map +1 -0
- package/dist/memory/governance.js +17 -0
- package/dist/memory/governance.js.map +1 -0
- package/dist/memory/inMemoryRoundStore.d.ts +124 -0
- package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
- package/dist/memory/inMemoryRoundStore.js +216 -0
- package/dist/memory/inMemoryRoundStore.js.map +1 -0
- package/dist/memory/inMemorySessionStore.d.ts +92 -0
- package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
- package/dist/memory/inMemorySessionStore.js +219 -0
- package/dist/memory/inMemorySessionStore.js.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.js +183 -0
- package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +26 -141
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +48 -187
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/keywordsTouch.d.ts +20 -0
- package/dist/memory/keywordsTouch.d.ts.map +1 -0
- package/dist/memory/keywordsTouch.js +25 -0
- package/dist/memory/keywordsTouch.js.map +1 -0
- package/dist/memory/lockManager.d.ts +7 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +35 -11
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +30 -128
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +39 -171
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +22 -37
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +78 -85
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/roundStore.d.ts +629 -0
- package/dist/memory/roundStore.d.ts.map +1 -0
- package/dist/memory/roundStore.js +116 -0
- package/dist/memory/roundStore.js.map +1 -0
- package/dist/memory/sessionStore.d.ts +70 -61
- package/dist/memory/sessionStore.d.ts.map +1 -1
- package/dist/memory/sessionStore.js +23 -1
- package/dist/memory/sessionStore.js.map +1 -1
- package/dist/memory/sessionViewLoader.d.ts +141 -0
- package/dist/memory/sessionViewLoader.d.ts.map +1 -0
- package/dist/memory/sessionViewLoader.js +65 -0
- package/dist/memory/sessionViewLoader.js.map +1 -0
- package/dist/memory/sourceValidation.d.ts +18 -9
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +35 -29
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +45 -126
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/types.d.ts +82 -168
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +116 -79
- package/dist/memory/types.js.map +1 -1
- package/dist/project-search/projectSearchProvider.d.ts +29 -0
- package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
- package/dist/project-search/projectSearchProvider.js +57 -0
- package/dist/project-search/projectSearchProvider.js.map +1 -0
- package/dist/project-search/terms.d.ts +14 -0
- package/dist/project-search/terms.d.ts.map +1 -0
- package/dist/project-search/terms.js +68 -0
- package/dist/project-search/terms.js.map +1 -0
- package/dist/project-search/types.d.ts +139 -0
- package/dist/project-search/types.d.ts.map +1 -0
- package/dist/project-search/types.js +8 -0
- package/dist/project-search/types.js.map +1 -0
- package/dist/role-pack/capabilityMap.d.ts +28 -0
- package/dist/role-pack/capabilityMap.d.ts.map +1 -0
- package/dist/role-pack/capabilityMap.js +56 -0
- package/dist/role-pack/capabilityMap.js.map +1 -0
- package/dist/role-pack/constants.d.ts +21 -0
- package/dist/role-pack/constants.d.ts.map +1 -0
- package/dist/role-pack/constants.js +21 -0
- package/dist/role-pack/constants.js.map +1 -0
- package/dist/role-pack/rolePackManager.d.ts +269 -0
- package/dist/role-pack/rolePackManager.d.ts.map +1 -0
- package/dist/role-pack/rolePackManager.js +1082 -0
- package/dist/role-pack/rolePackManager.js.map +1 -0
- package/dist/role-pack/strategyKeys.d.ts +100 -0
- package/dist/role-pack/strategyKeys.d.ts.map +1 -0
- package/dist/role-pack/strategyKeys.js +184 -0
- package/dist/role-pack/strategyKeys.js.map +1 -0
- package/dist/role-pack/strategyResolver.d.ts +109 -0
- package/dist/role-pack/strategyResolver.d.ts.map +1 -0
- package/dist/role-pack/strategyResolver.js +304 -0
- package/dist/role-pack/strategyResolver.js.map +1 -0
- package/dist/role-pack/types.d.ts +237 -0
- package/dist/role-pack/types.d.ts.map +1 -0
- package/dist/role-pack/types.js +8 -0
- package/dist/role-pack/types.js.map +1 -0
- package/dist/role-pack/validator.d.ts +38 -0
- package/dist/role-pack/validator.d.ts.map +1 -0
- package/dist/role-pack/validator.js +436 -0
- package/dist/role-pack/validator.js.map +1 -0
- package/dist/security/pathGuard.d.ts +69 -72
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +151 -131
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillLayer3.d.ts +91 -0
- package/dist/skill/skillLayer3.d.ts.map +1 -0
- package/dist/skill/skillLayer3.js +104 -0
- package/dist/skill/skillLayer3.js.map +1 -0
- package/dist/skill/skillManager.d.ts +127 -56
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +318 -163
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/skillScriptRunner.d.ts +97 -0
- package/dist/skill/skillScriptRunner.d.ts.map +1 -0
- package/dist/skill/skillScriptRunner.js +271 -0
- package/dist/skill/skillScriptRunner.js.map +1 -0
- package/dist/skill/types.d.ts +73 -17
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/skill/types.js +5 -1
- package/dist/skill/types.js.map +1 -1
- package/dist/utils/array.d.ts +5 -6
- package/dist/utils/array.d.ts.map +1 -1
- package/dist/utils/array.js +6 -6
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/atomicWrite.d.ts +8 -0
- package/dist/utils/atomicWrite.d.ts.map +1 -0
- package/dist/utils/atomicWrite.js +31 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/backgroundTask.d.ts +38 -0
- package/dist/utils/backgroundTask.d.ts.map +1 -0
- package/dist/utils/backgroundTask.js +117 -0
- package/dist/utils/backgroundTask.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +79 -0
- package/dist/utils/configResourceManager.d.ts.map +1 -0
- package/dist/utils/configResourceManager.js +150 -0
- package/dist/utils/configResourceManager.js.map +1 -0
- package/dist/utils/errors.d.ts +48 -56
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +60 -58
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +141 -63
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +50 -35
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/fileSafe.d.ts +20 -0
- package/dist/utils/fileSafe.d.ts.map +1 -0
- package/dist/utils/fileSafe.js +56 -0
- package/dist/utils/fileSafe.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +2 -3
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +6 -5
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/hash.d.ts +12 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +27 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/http.d.ts +17 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +29 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/json.d.ts +1 -1
- package/dist/utils/json.js +1 -1
- package/dist/utils/math.d.ts +34 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +47 -14
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +2 -3
- package/dist/utils/objects.d.ts.map +1 -1
- package/dist/utils/objects.js +2 -3
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/recallDefaults.d.ts +16 -0
- package/dist/utils/recallDefaults.d.ts.map +1 -0
- package/dist/utils/recallDefaults.js +16 -0
- package/dist/utils/recallDefaults.js.map +1 -0
- package/dist/utils/safeTimer.d.ts +8 -36
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +9 -37
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/scanner.d.ts +97 -17
- package/dist/utils/scanner.d.ts.map +1 -1
- package/dist/utils/scanner.js +269 -47
- package/dist/utils/scanner.js.map +1 -1
- package/dist/utils/segmenter.d.ts +20 -29
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +230 -88
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +15 -32
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +25 -44
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +37 -0
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +56 -0
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +13 -1
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +18 -1
- package/dist/utils/toError.js.map +1 -1
- package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
- package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
- package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
- package/dist/web-fetch/types.d.ts +30 -0
- package/dist/web-fetch/types.d.ts.map +1 -0
- package/dist/web-fetch/types.js +7 -0
- package/dist/web-fetch/types.js.map +1 -0
- package/dist/web-fetch/webFetchProvider.d.ts +10 -0
- package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/webFetchProvider.js +28 -0
- package/dist/web-fetch/webFetchProvider.js.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.js +199 -0
- package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
- package/dist/web-search/types.d.ts +46 -0
- package/dist/web-search/types.d.ts.map +1 -0
- package/dist/web-search/types.js +2 -0
- package/dist/{persona → web-search}/types.js.map +1 -1
- package/dist/web-search/webSearchProvider.d.ts +10 -0
- package/dist/web-search/webSearchProvider.d.ts.map +1 -0
- package/dist/web-search/webSearchProvider.js +30 -0
- package/dist/web-search/webSearchProvider.js.map +1 -0
- package/docs/architecture/role-pack-authoring-guide.md +243 -0
- package/docs/architecture/role-pack-spec.md +767 -0
- package/docs/memora-api-reference.md +1175 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +843 -0
- package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
- package/package.json +105 -83
- package/role-packs/README.md +41 -0
- package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
- package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
- package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +441 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +48 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
- package/dist/agent/guardrail.d.ts +0 -47
- package/dist/agent/guardrail.d.ts.map +0 -1
- package/dist/agent/guardrail.js +0 -51
- package/dist/agent/guardrail.js.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.js +0 -150
- package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
- package/dist/agent/managers/configManager.d.ts +0 -125
- package/dist/agent/managers/configManager.d.ts.map +0 -1
- package/dist/agent/managers/configManager.js +0 -194
- package/dist/agent/managers/configManager.js.map +0 -1
- package/dist/agent/managers/insightExtractor.d.ts +0 -139
- package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
- package/dist/agent/managers/insightExtractor.js +0 -401
- package/dist/agent/managers/insightExtractor.js.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -198
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.js +0 -349
- package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
- package/dist/agent/managers/relationBuilder.d.ts +0 -131
- package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
- package/dist/agent/managers/relationBuilder.js +0 -192
- package/dist/agent/managers/relationBuilder.js.map +0 -1
- package/dist/agent/personaMatcher.d.ts +0 -29
- package/dist/agent/personaMatcher.d.ts.map +0 -1
- package/dist/agent/personaMatcher.js +0 -60
- package/dist/agent/personaMatcher.js.map +0 -1
- package/dist/agent/userFactExtractor.d.ts +0 -25
- package/dist/agent/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/userFactExtractor.js +0 -81
- package/dist/agent/userFactExtractor.js.map +0 -1
- package/dist/eval/evalRunner.d.ts +0 -94
- package/dist/eval/evalRunner.d.ts.map +0 -1
- package/dist/eval/evalRunner.js +0 -141
- package/dist/eval/evalRunner.js.map +0 -1
- package/dist/eval/evalTypes.d.ts +0 -148
- package/dist/eval/evalTypes.d.ts.map +0 -1
- package/dist/eval/evalTypes.js +0 -118
- package/dist/eval/evalTypes.js.map +0 -1
- package/dist/eval/scenarios.d.ts +0 -33
- package/dist/eval/scenarios.d.ts.map +0 -1
- package/dist/eval/scenarios.js +0 -109
- package/dist/eval/scenarios.js.map +0 -1
- package/dist/llm/embedding.d.ts +0 -67
- package/dist/llm/embedding.d.ts.map +0 -1
- package/dist/llm/embedding.js +0 -184
- package/dist/llm/embedding.js.map +0 -1
- package/dist/memory/hybridMerge.d.ts +0 -54
- package/dist/memory/hybridMerge.d.ts.map +0 -1
- package/dist/memory/hybridMerge.js +0 -36
- package/dist/memory/hybridMerge.js.map +0 -1
- package/dist/memory/inMemoryRelationStore.d.ts +0 -51
- package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
- package/dist/memory/inMemoryRelationStore.js +0 -65
- package/dist/memory/inMemoryRelationStore.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -49
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -93
- package/dist/memory/loader.js.map +0 -1
- package/dist/memory/recall.d.ts +0 -66
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js +0 -142
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/relationStore.d.ts +0 -78
- package/dist/memory/relationStore.d.ts.map +0 -1
- package/dist/memory/relationStore.js +0 -2
- package/dist/memory/relationStore.js.map +0 -1
- package/dist/memory/store.d.ts +0 -50
- package/dist/memory/store.d.ts.map +0 -1
- package/dist/memory/store.js +0 -161
- package/dist/memory/store.js.map +0 -1
- package/dist/memory/userProfile.d.ts +0 -156
- package/dist/memory/userProfile.d.ts.map +0 -1
- package/dist/memory/userProfile.js +0 -320
- package/dist/memory/userProfile.js.map +0 -1
- package/dist/memory/vectorStore.d.ts +0 -185
- package/dist/memory/vectorStore.d.ts.map +0 -1
- package/dist/memory/vectorStore.js +0 -257
- package/dist/memory/vectorStore.js.map +0 -1
- package/dist/persona/personaManager.d.ts +0 -160
- package/dist/persona/personaManager.d.ts.map +0 -1
- package/dist/persona/personaManager.js +0 -414
- package/dist/persona/personaManager.js.map +0 -1
- package/dist/persona/types.d.ts +0 -32
- package/dist/persona/types.d.ts.map +0 -1
- package/dist/persona/types.js +0 -5
package/dist/utils/toError.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 纯逻辑 toError — 零依赖,浏览器 / Node.js 通用
|
|
3
3
|
*
|
|
4
4
|
* 将 catch 块中的 unknown 值安全转换为 Error 对象。
|
|
5
|
-
* 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging
|
|
5
|
+
* 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging/ 模块。
|
|
6
6
|
*
|
|
7
7
|
* 转换规则(5 分支,与精灵 shared/toError.ts 行为对齐):
|
|
8
8
|
* 1. Error 实例:原样返回
|
|
@@ -14,4 +14,16 @@
|
|
|
14
14
|
* null/undefined 返回 '未知错误',比 'null'/'undefined' 更友好。
|
|
15
15
|
*/
|
|
16
16
|
export declare function toError(err: unknown): Error;
|
|
17
|
+
/**
|
|
18
|
+
* 判断错误对象是否带指定 Node.js 错误码(如 ENOENT)
|
|
19
|
+
*
|
|
20
|
+
* 收口「catch 块判断 err.code」的同语义多实现:builtinToolHandlers 4 处与
|
|
21
|
+
* config/loader 1 处曾各自手写同一判定(typeof/code in/=== 三连)。node:fs 抛出的
|
|
22
|
+
* 错误为 Error & { code },IPC 序列化错误亦带 code 字段;非对象/null 安全返回 false。
|
|
23
|
+
*
|
|
24
|
+
* @param err catch 块捕获的 unknown 值
|
|
25
|
+
* @param code 目标错误码(如 'ENOENT')
|
|
26
|
+
* @returns 是否命中指定错误码
|
|
27
|
+
*/
|
|
28
|
+
export declare function isNodeErrorCode(err: unknown, code: string): boolean;
|
|
17
29
|
//# sourceMappingURL=toError.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toError.d.ts","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAwB3C"}
|
|
1
|
+
{"version":3,"file":"toError.d.ts","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAwB3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnE"}
|
package/dist/utils/toError.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 纯逻辑 toError — 零依赖,浏览器 / Node.js 通用
|
|
3
3
|
*
|
|
4
4
|
* 将 catch 块中的 unknown 值安全转换为 Error 对象。
|
|
5
|
-
* 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging
|
|
5
|
+
* 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging/ 模块。
|
|
6
6
|
*
|
|
7
7
|
* 转换规则(5 分支,与精灵 shared/toError.ts 行为对齐):
|
|
8
8
|
* 1. Error 实例:原样返回
|
|
@@ -39,4 +39,21 @@ export function toError(err) {
|
|
|
39
39
|
// 5. 基础类型(number/boolean/symbol/null/undefined)
|
|
40
40
|
return new Error(String(err ?? '未知错误'));
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* 判断错误对象是否带指定 Node.js 错误码(如 ENOENT)
|
|
44
|
+
*
|
|
45
|
+
* 收口「catch 块判断 err.code」的同语义多实现:builtinToolHandlers 4 处与
|
|
46
|
+
* config/loader 1 处曾各自手写同一判定(typeof/code in/=== 三连)。node:fs 抛出的
|
|
47
|
+
* 错误为 Error & { code },IPC 序列化错误亦带 code 字段;非对象/null 安全返回 false。
|
|
48
|
+
*
|
|
49
|
+
* @param err catch 块捕获的 unknown 值
|
|
50
|
+
* @param code 目标错误码(如 'ENOENT')
|
|
51
|
+
* @returns 是否命中指定错误码
|
|
52
|
+
*/
|
|
53
|
+
export function isNodeErrorCode(err, code) {
|
|
54
|
+
return (err !== null &&
|
|
55
|
+
typeof err === 'object' &&
|
|
56
|
+
'code' in err &&
|
|
57
|
+
err.code === code);
|
|
58
|
+
}
|
|
42
59
|
//# sourceMappingURL=toError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toError.js","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,yBAAyB;IACzB,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC;IACrC,kBAAkB;IAClB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,4CAA4C;IAC5C,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAA6B,CAAC,OAAO,KAAK,QAAQ,EAC1D,CAAC;QACD,OAAO,IAAI,KAAK,CAAE,GAA2B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,0DAA0D;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
1
|
+
{"version":3,"file":"toError.js","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,yBAAyB;IACzB,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC;IACrC,kBAAkB;IAClB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,4CAA4C;IAC5C,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAA6B,CAAC,OAAO,KAAK,QAAQ,EAC1D,CAAC;QACD,OAAO,IAAI,KAAK,CAAE,GAA2B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,0DAA0D;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,IAAY;IACxD,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,IAAI,CACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基于 fetch 的默认网页抓取实现(FetchWebFetchProvider)
|
|
3
|
+
* 使用 Node.js 18+ 内置 fetch,零依赖。仅用于"开箱即用"场景,
|
|
4
|
+
* 生产环境建议宿主实现 IFetchProvider 用专用抓取服务(渲染 / 代理 / 限流)。
|
|
5
|
+
*/
|
|
6
|
+
import type { FetchedPage, FetchOptions, IFetchProvider } from '../web-fetch/types.js';
|
|
7
|
+
/** 默认网页抓取实现:Node 内置 fetch + 正文清洗 + 截断 */
|
|
8
|
+
export declare class FetchWebFetchProvider implements IFetchProvider {
|
|
9
|
+
/**
|
|
10
|
+
* 抓取 URL:带超时控制(共享 fetchWithTimeout),返回清洗后的正文纯文本。
|
|
11
|
+
*/
|
|
12
|
+
fetch(url: string, options?: FetchOptions): Promise<FetchedPage>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=fetchWebFetchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWebFetchProvider.d.ts","sourceRoot":"","sources":["../../src/web-fetch/fetchWebFetchProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAoDtF,yCAAyC;AACzC,qBAAa,qBAAsB,YAAW,cAAc;IAC1D;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CAiBvE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { BROWSER_UA, fetchWithTimeout } from '../utils/http.js';
|
|
2
|
+
/** 单次请求超时(ms):抓取通常 1-3s 返回,10s 覆盖慢网络且不至于拖死主循环 */
|
|
3
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
4
|
+
/** 默认正文截断上限(字符) */
|
|
5
|
+
const DEFAULT_MAX_CHARS = 8_000;
|
|
6
|
+
/** 原始 HTML 可接受上限(字符):防超大页面占满内存,超限直接截断再清洗 */
|
|
7
|
+
const MAX_RAW_CHARS = 50_000;
|
|
8
|
+
/**
|
|
9
|
+
* HTML → 正文纯文本:去 script/style/head + 去标签 + 解实体 + 去控制字符 + 压缩空白 + 截断。
|
|
10
|
+
* 用正则而非 DOM 解析,避免引入 jsdom 依赖(对齐 fetchWebSearchProvider 的零依赖思路)。
|
|
11
|
+
*
|
|
12
|
+
* @param html 原始 HTML
|
|
13
|
+
* @param maxChars 正文截断上限
|
|
14
|
+
* @returns 清洗后的纯文本
|
|
15
|
+
*/
|
|
16
|
+
function stripHtmlToText(html, maxChars) {
|
|
17
|
+
const text = html
|
|
18
|
+
// 先剔除脚本/样式/头部(正文无关且含特殊字符)
|
|
19
|
+
.replace(/<script[\s\S]*?<\/script>/gi, ' ')
|
|
20
|
+
.replace(/<style[\s\S]*?<\/style>/gi, ' ')
|
|
21
|
+
.replace(/<head[\s\S]*?<\/head>/gi, ' ')
|
|
22
|
+
// 再剔除剩余标签
|
|
23
|
+
.replace(/<[^>]+>/g, ' ')
|
|
24
|
+
// 解码常见 HTML 实体
|
|
25
|
+
.replace(/ /gi, ' ')
|
|
26
|
+
.replace(/&/gi, '&')
|
|
27
|
+
.replace(/</gi, '<')
|
|
28
|
+
.replace(/>/gi, '>')
|
|
29
|
+
.replace(/"/gi, '"')
|
|
30
|
+
.replace(/'/gi, "'")
|
|
31
|
+
// 去控制字符(防转义/终端注入,对齐 toolExecutor.sanitizeExternalText 语义)
|
|
32
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, '')
|
|
33
|
+
// 压缩空白:行内空格折叠 + 多空行归一
|
|
34
|
+
.replace(/[ \t]+/g, ' ')
|
|
35
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
36
|
+
.trim();
|
|
37
|
+
return text.length > maxChars ? `${text.slice(0, maxChars)}…` : text;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 从 <title> 提取页面标题(清洗后截断)
|
|
41
|
+
*/
|
|
42
|
+
function extractTitle(html) {
|
|
43
|
+
const match = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(html);
|
|
44
|
+
return match ? stripHtmlToText(match[1], 200) : '';
|
|
45
|
+
}
|
|
46
|
+
/** 默认网页抓取实现:Node 内置 fetch + 正文清洗 + 截断 */
|
|
47
|
+
export class FetchWebFetchProvider {
|
|
48
|
+
/**
|
|
49
|
+
* 抓取 URL:带超时控制(共享 fetchWithTimeout),返回清洗后的正文纯文本。
|
|
50
|
+
*/
|
|
51
|
+
async fetch(url, options) {
|
|
52
|
+
const maxChars = options?.maxChars ?? DEFAULT_MAX_CHARS;
|
|
53
|
+
const response = await fetchWithTimeout(url, REQUEST_TIMEOUT_MS, BROWSER_UA);
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}`);
|
|
56
|
+
}
|
|
57
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
58
|
+
const raw = await response.text();
|
|
59
|
+
// 超限原始响应直接截断再清洗,防超大页面拖慢/占满内存
|
|
60
|
+
const content = stripHtmlToText(raw.slice(0, MAX_RAW_CHARS), maxChars);
|
|
61
|
+
return {
|
|
62
|
+
url: response.url || url,
|
|
63
|
+
title: extractTitle(raw),
|
|
64
|
+
content,
|
|
65
|
+
contentType,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=fetchWebFetchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWebFetchProvider.js","sourceRoot":"","sources":["../../src/web-fetch/fetchWebFetchProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,iDAAiD;AACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,mBAAmB;AACnB,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEhC,4CAA4C;AAC5C,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,QAAgB;IACrD,MAAM,IAAI,GAAG,IAAI;QACf,0BAA0B;SACzB,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC;QACxC,UAAU;SACT,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;QACzB,eAAe;SACd,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;QACxB,0DAA0D;SACzD,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC;QAC/D,sBAAsB;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;IACV,OAAO,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,KAAK,GAAG,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,yCAAyC;AACzC,MAAM,OAAO,qBAAqB;IAChC;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,OAAsB;QAC7C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClC,6BAA6B;QAC7B,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvE,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG;YACxB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;YACxB,OAAO;YACP,WAAW;SACZ,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 网页抓取提供者接口定义:让 memora 内核具备可注入的网页正文抓取能力。
|
|
3
|
+
* 宿主实现 IFetchProvider 注入自定义抓取实现(接口注入,遵循 IWebSearchProvider 模式;零依赖)。
|
|
4
|
+
* 与 web_search 成对构成「搜索→抓取」闭环:web_search 给出候选 URL,web_fetch 读正文。
|
|
5
|
+
*/
|
|
6
|
+
/** 抓取到的网页内容 */
|
|
7
|
+
export interface FetchedPage {
|
|
8
|
+
/** 页面 URL(若发生重定向则返回实际地址) */
|
|
9
|
+
url: string;
|
|
10
|
+
/** 页面标题(无标题时为空串) */
|
|
11
|
+
title: string;
|
|
12
|
+
/** 清洗后的正文纯文本 */
|
|
13
|
+
content: string;
|
|
14
|
+
/** 内容类型(如 "text/html"、"application/pdf"),无法识别时为空串 */
|
|
15
|
+
contentType?: string;
|
|
16
|
+
}
|
|
17
|
+
/** 抓取选项 */
|
|
18
|
+
export interface FetchOptions {
|
|
19
|
+
/** 返回正文最大字符数(默认 8000) */
|
|
20
|
+
maxChars?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 网页抓取提供者接口:宿主实现并注入 AgentOptions.fetchProvider 提供抓取能力;
|
|
24
|
+
* 未注入时 Agent 不会暴露 web_fetch 工具给 LLM。
|
|
25
|
+
*/
|
|
26
|
+
export interface IFetchProvider {
|
|
27
|
+
/** 抓取 URL 并返回清洗后的正文纯文本 */
|
|
28
|
+
fetch(url: string, options?: FetchOptions): Promise<FetchedPage>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-fetch/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAClE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web-fetch/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 网页抓取集成入口:提供带超时保护的加载包装,组合默认实现或宿主自定义实现。
|
|
3
|
+
* 抓取失败时降级返回友好错误信息,不中断对话流程(30s 超时防卡死 Agent 主循环)。
|
|
4
|
+
*/
|
|
5
|
+
import type { FetchedPage, FetchOptions, IFetchProvider } from '../web-fetch/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 带超时和错误处理的抓取包装:超时或失败时不抛异常,返回降级提示页。
|
|
8
|
+
*/
|
|
9
|
+
export declare function safeFetch(provider: IFetchProvider, url: string, options?: FetchOptions): Promise<FetchedPage>;
|
|
10
|
+
//# sourceMappingURL=webFetchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webFetchProvider.d.ts","sourceRoot":"","sources":["../../src/web-fetch/webFetchProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtF;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC,CAoBtB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** 网页抓取超时时间(毫秒) */
|
|
2
|
+
const FETCH_TIMEOUT_MS = 30_000;
|
|
3
|
+
/**
|
|
4
|
+
* 带超时和错误处理的抓取包装:超时或失败时不抛异常,返回降级提示页。
|
|
5
|
+
*/
|
|
6
|
+
export async function safeFetch(provider, url, options) {
|
|
7
|
+
let timer;
|
|
8
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
9
|
+
timer = setTimeout(() => reject(new Error('网页抓取超时(30s)')), FETCH_TIMEOUT_MS);
|
|
10
|
+
});
|
|
11
|
+
try {
|
|
12
|
+
return await Promise.race([provider.fetch(url, options), timeoutPromise]);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
// 抓取失败不抛异常,返回降级提示页
|
|
16
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
17
|
+
return {
|
|
18
|
+
url,
|
|
19
|
+
title: '网页抓取暂不可用',
|
|
20
|
+
content: `抓取失败:${message}。请稍后重试,或检查网络连接。`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
// 成功/失败均清理超时定时器,防残留定时器拖住进程
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=webFetchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webFetchProvider.js","sourceRoot":"","sources":["../../src/web-fetch/webFetchProvider.ts"],"names":[],"mappings":"AAMA,mBAAmB;AACnB,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAwB,EACxB,GAAW,EACX,OAAsB;IAEtB,IAAI,KAAgD,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAc,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC5D,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAmB;QACnB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,GAAG;YACH,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,QAAQ,OAAO,iBAAiB;SAC1C,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,2BAA2B;QAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基于 fetch 的默认网络搜索实现(FetchWebSearchProvider)
|
|
3
|
+
* 多后端降级链:Bing(国内可达,首选)→ DuckDuckGo(备用),各端点独立超时,失败/空结果时降级到下一端点。
|
|
4
|
+
* 使用 Node.js 18+ 内置 fetch,零依赖。仅用于"开箱即用"场景,生产环境建议宿主实现 IWebSearchProvider 用专用搜索 API。
|
|
5
|
+
*/
|
|
6
|
+
import type { IWebSearchProvider, SearchResult, WebSearchOptions, SearchEndpoint } from '../web-search/types.js';
|
|
7
|
+
/** 可切换的内置搜索引擎名(宿主设置 memora.searchEngine 对应枚举) */
|
|
8
|
+
export type SearchEngineName = 'bing' | 'duckduckgo' | 'baidu' | 'sogou';
|
|
9
|
+
/**
|
|
10
|
+
* 构建搜索端点降级链:入参为「内核预设名(SearchEngineName)| 宿主自定义 SearchEndpoint」混排,
|
|
11
|
+
* 按给定顺序组装;宿主传入的自定义端点优先生效,未知预设名忽略。
|
|
12
|
+
* 全部无效 / 空列表回退默认链(Bing→DuckDuckGo),保证零配置也开箱可用。
|
|
13
|
+
* 主推宿主接入:生产环境建议宿主自建 SearchEndpoint[](自带 URL+解析)注入,内核预设仅作保底。
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildSearchEndpoints(items: readonly (SearchEngineName | SearchEndpoint)[]): readonly SearchEndpoint[];
|
|
16
|
+
/** 默认搜索实现:多后端降级链(Bing → DuckDuckGo),每端点独立超时。生产建议宿主自定义 IWebSearchProvider */
|
|
17
|
+
export declare class FetchWebSearchProvider implements IWebSearchProvider {
|
|
18
|
+
/** 端点降级链(可注入替换,测试与宿主定制用) */
|
|
19
|
+
private readonly endpoints;
|
|
20
|
+
constructor(endpoints?: readonly SearchEndpoint[]);
|
|
21
|
+
/**
|
|
22
|
+
* 搜索互联网,返回结构化结果。依次尝试各端点,非空结果即成功;
|
|
23
|
+
* 若某个端点成功响应但无命中视为"无结果",全部失败(网络/HTTP 错误)时抛聚合错误,由 safeSearch 降级。
|
|
24
|
+
*/
|
|
25
|
+
search(query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=fetchWebSearchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWebSearchProvider.d.ts","sourceRoot":"","sources":["../../src/web-search/fetchWebSearchProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAyH/B,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAoCzE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,CAAC,gBAAgB,GAAG,cAAc,CAAC,EAAE,GACpD,SAAS,cAAc,EAAE,CAO3B;AAED,4EAA4E;AAC5E,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,4BAA4B;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;gBAE1C,SAAS,GAAE,SAAS,cAAc,EAAsB;IAIpE;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAuCjF"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { BROWSER_UA, fetchWithTimeout } from '../utils/http.js';
|
|
2
|
+
/** 单端点请求超时(ms):Bing 通常 1-2s 返回,10s 覆盖慢网络且不至于拖死主循环 */
|
|
3
|
+
const ENDPOINT_TIMEOUT_MS = 10_000;
|
|
4
|
+
/**
|
|
5
|
+
* 从 Bing 结果页 HTML 提取结果:标题+链接在 <h2><a>,摘要在 <p class="b_lineclamp*">。
|
|
6
|
+
* 用正则而非 DOM 解析,避免引入 jsdom 依赖。
|
|
7
|
+
*/
|
|
8
|
+
function parseBingHtml(html, limit) {
|
|
9
|
+
const results = [];
|
|
10
|
+
const titleRegex = /<h2[^>]*><a[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a><\/h2>/g;
|
|
11
|
+
const snippetRegex = /<p[^>]*class="b_lineclamp[^"]*"[^>]*>([\s\S]*?)<\/p>/g;
|
|
12
|
+
const titles = [];
|
|
13
|
+
let match;
|
|
14
|
+
while ((match = titleRegex.exec(html)) !== null && titles.length < limit) {
|
|
15
|
+
const url = match[1].replace(/&/g, '&').trim();
|
|
16
|
+
const title = match[2].replace(/<[^>]*>/g, '').trim();
|
|
17
|
+
if (title && url) {
|
|
18
|
+
titles.push({ url, title });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const snippets = [];
|
|
22
|
+
while ((match = snippetRegex.exec(html)) !== null && snippets.length < limit) {
|
|
23
|
+
const snippet = match[1].replace(/<[^>]*>/g, '').trim();
|
|
24
|
+
if (snippet)
|
|
25
|
+
snippets.push(snippet);
|
|
26
|
+
}
|
|
27
|
+
for (let i = 0; i < Math.min(titles.length, limit); i++) {
|
|
28
|
+
results.push({
|
|
29
|
+
title: titles[i].title,
|
|
30
|
+
url: titles[i].url,
|
|
31
|
+
snippet: snippets[i] ?? '',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return results;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 从 DuckDuckGo HTML 响应提取结果:标题/链接在 <a class="result__a">,摘要在 <a class="result__snippet">。
|
|
38
|
+
*/
|
|
39
|
+
function parseDuckDuckGoHtml(html, limit) {
|
|
40
|
+
const results = [];
|
|
41
|
+
const resultRegex = /<a[^>]*class="result__a"[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/g;
|
|
42
|
+
const snippetRegex = /<a[^>]*class="result__snippet"[^>]*>([\s\S]*?)<\/a>/g;
|
|
43
|
+
const titles = [];
|
|
44
|
+
let match;
|
|
45
|
+
while ((match = resultRegex.exec(html)) !== null && titles.length < limit) {
|
|
46
|
+
const url = match[1].replace(/\/\/duckduckgo\.com\/l\/\?uddg=/, ''); // 解码跳转链接(两条 URL 前缀指向同一处)
|
|
47
|
+
const title = match[2].replace(/<[^>]*>/g, '').trim();
|
|
48
|
+
if (title && url) {
|
|
49
|
+
titles.push({
|
|
50
|
+
url: decodeURIComponent(url),
|
|
51
|
+
title,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const snippets = [];
|
|
56
|
+
while ((match = snippetRegex.exec(html)) !== null && snippets.length < limit) {
|
|
57
|
+
const snippet = match[1].replace(/<[^>]*>/g, '').trim();
|
|
58
|
+
if (snippet)
|
|
59
|
+
snippets.push(snippet);
|
|
60
|
+
}
|
|
61
|
+
for (let i = 0; i < Math.min(titles.length, limit); i++) {
|
|
62
|
+
results.push({
|
|
63
|
+
title: titles[i].title,
|
|
64
|
+
url: titles[i].url,
|
|
65
|
+
snippet: snippets[i] ?? '',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 百度搜索结果页 HTML 解析(中文场景命中质量通常优于 Bing 抓取)。
|
|
72
|
+
* 结构:结果条目 h3[class*=c-title] 内 <a href>,摘要取紧随的 content-right / c-abstract 块。
|
|
73
|
+
* 反爬时页面无结果结构 → 返回空数组,由降级链自动切换下一点端。
|
|
74
|
+
*/
|
|
75
|
+
function parseBaiduHtml(html, limit) {
|
|
76
|
+
const results = [];
|
|
77
|
+
const itemRegex = /<h3[^>]*>[\s\S]*?<a[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<\/h3>/gi;
|
|
78
|
+
let match;
|
|
79
|
+
while ((match = itemRegex.exec(html)) !== null && results.length < limit) {
|
|
80
|
+
const url = match[1].replace(/&/g, '&').trim();
|
|
81
|
+
const title = match[2].replace(/<[^>]*>/g, '').trim();
|
|
82
|
+
if (!url || !title)
|
|
83
|
+
continue;
|
|
84
|
+
// 摘要:标题块之后 800 字符范围内取首个内容摘要块(新版 content-right / 旧版 c-abstract)
|
|
85
|
+
const after = html.slice(match.index + match[0].length, match.index + match[0].length + 800);
|
|
86
|
+
const snipMatch = /(?:content-right|c-abstract)[^>]*>([\s\S]*?)<\/span>/i.exec(after);
|
|
87
|
+
const snippet = snipMatch?.[1]?.replace(/<[^>]*>/g, '').trim() ?? '';
|
|
88
|
+
results.push({ title, url, snippet });
|
|
89
|
+
}
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 搜狗搜索结果页 HTML 解析。结构:div.vrwrap > h3.vr-title > a[href],摘要 .str_info / .space-txt。
|
|
94
|
+
*/
|
|
95
|
+
function parseSogouHtml(html, limit) {
|
|
96
|
+
const results = [];
|
|
97
|
+
const itemRegex = /<h3[^>]*>[\s\S]*?<a[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<\/h3>/gi;
|
|
98
|
+
let match;
|
|
99
|
+
while ((match = itemRegex.exec(html)) !== null && results.length < limit) {
|
|
100
|
+
const url = match[1].replace(/&/g, '&').trim();
|
|
101
|
+
const title = match[2].replace(/<[^>]*>/g, '').trim();
|
|
102
|
+
if (!url || !title)
|
|
103
|
+
continue;
|
|
104
|
+
const after = html.slice(match.index + match[0].length, match.index + match[0].length + 800);
|
|
105
|
+
const snipMatch = /(?:str_info|space-txt)[^>]*>([\s\S]*?)<\/(?:div|p)>/i.exec(after);
|
|
106
|
+
const snippet = snipMatch?.[1]?.replace(/<[^>]*>/g, '').trim() ?? '';
|
|
107
|
+
results.push({ title, url, snippet });
|
|
108
|
+
}
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 内置端点注册表(零配置保底基线,非真理源):端点名 → 定义。
|
|
113
|
+
* FetchWebSearchProvider 默认链与 buildSearchEndpoints 的预设名均取自此处;
|
|
114
|
+
* 宿主可传入自定义 SearchEndpoint 覆盖/扩展,无需改这里。
|
|
115
|
+
*/
|
|
116
|
+
const SEARCH_ENDPOINT_REGISTRY = {
|
|
117
|
+
bing: {
|
|
118
|
+
name: 'Bing',
|
|
119
|
+
buildUrl: (query) => `https://www.bing.com/search?q=${encodeURIComponent(query)}`,
|
|
120
|
+
parse: parseBingHtml,
|
|
121
|
+
},
|
|
122
|
+
duckduckgo: {
|
|
123
|
+
name: 'DuckDuckGo',
|
|
124
|
+
buildUrl: (query) => `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`,
|
|
125
|
+
parse: parseDuckDuckGoHtml,
|
|
126
|
+
},
|
|
127
|
+
baidu: {
|
|
128
|
+
name: 'Baidu',
|
|
129
|
+
buildUrl: (query) => `https://www.baidu.com/s?wd=${encodeURIComponent(query)}`,
|
|
130
|
+
parse: parseBaiduHtml,
|
|
131
|
+
},
|
|
132
|
+
sogou: {
|
|
133
|
+
name: 'Sogou',
|
|
134
|
+
buildUrl: (query) => `https://www.sogou.com/web?query=${encodeURIComponent(query)}`,
|
|
135
|
+
parse: parseSogouHtml,
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
/** 默认端点降级链:Bing(国内可达)→ DuckDuckGo(备用) */
|
|
139
|
+
const DEFAULT_ENDPOINTS = [
|
|
140
|
+
SEARCH_ENDPOINT_REGISTRY.bing,
|
|
141
|
+
SEARCH_ENDPOINT_REGISTRY.duckduckgo,
|
|
142
|
+
];
|
|
143
|
+
/**
|
|
144
|
+
* 构建搜索端点降级链:入参为「内核预设名(SearchEngineName)| 宿主自定义 SearchEndpoint」混排,
|
|
145
|
+
* 按给定顺序组装;宿主传入的自定义端点优先生效,未知预设名忽略。
|
|
146
|
+
* 全部无效 / 空列表回退默认链(Bing→DuckDuckGo),保证零配置也开箱可用。
|
|
147
|
+
* 主推宿主接入:生产环境建议宿主自建 SearchEndpoint[](自带 URL+解析)注入,内核预设仅作保底。
|
|
148
|
+
*/
|
|
149
|
+
export function buildSearchEndpoints(items) {
|
|
150
|
+
const picked = items
|
|
151
|
+
.map((item) => typeof item === 'string' ? SEARCH_ENDPOINT_REGISTRY[item] : item)
|
|
152
|
+
.filter((e) => e !== undefined && e !== null);
|
|
153
|
+
return picked.length > 0 ? picked : DEFAULT_ENDPOINTS;
|
|
154
|
+
}
|
|
155
|
+
/** 默认搜索实现:多后端降级链(Bing → DuckDuckGo),每端点独立超时。生产建议宿主自定义 IWebSearchProvider */
|
|
156
|
+
export class FetchWebSearchProvider {
|
|
157
|
+
/** 端点降级链(可注入替换,测试与宿主定制用) */
|
|
158
|
+
endpoints;
|
|
159
|
+
constructor(endpoints = DEFAULT_ENDPOINTS) {
|
|
160
|
+
this.endpoints = endpoints;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 搜索互联网,返回结构化结果。依次尝试各端点,非空结果即成功;
|
|
164
|
+
* 若某个端点成功响应但无命中视为"无结果",全部失败(网络/HTTP 错误)时抛聚合错误,由 safeSearch 降级。
|
|
165
|
+
*/
|
|
166
|
+
async search(query, options) {
|
|
167
|
+
const limit = options?.limit ?? 5;
|
|
168
|
+
const errors = [];
|
|
169
|
+
// 是否有端点成功响应(HTTP ok)——区分「无命中」与「全部失败」
|
|
170
|
+
let anyOk = false;
|
|
171
|
+
for (const endpoint of this.endpoints) {
|
|
172
|
+
try {
|
|
173
|
+
const response = await fetchWithTimeout(endpoint.buildUrl(query), ENDPOINT_TIMEOUT_MS, BROWSER_UA);
|
|
174
|
+
if (!response.ok) {
|
|
175
|
+
errors.push(`${endpoint.name}: HTTP ${response.status} ${response.statusText}`);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
anyOk = true;
|
|
179
|
+
const html = await response.text();
|
|
180
|
+
const results = endpoint.parse(html, limit);
|
|
181
|
+
// 空结果(该端点无命中)继续尝试下一端点
|
|
182
|
+
if (results.length > 0) {
|
|
183
|
+
// 打标实际服务的后端名称,供降级透出:同批次结果来自同一端点
|
|
184
|
+
return results.map((r) => ({ ...r, endpoint: endpoint.name }));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
errors.push(`${endpoint.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// 至少一个端点成功响应但均无命中 → 搜索成功、无结果(非失败,safeSearch 不降级提示)
|
|
192
|
+
if (anyOk) {
|
|
193
|
+
return [];
|
|
194
|
+
}
|
|
195
|
+
// 全部失败 → 抛聚合错误,由 safeSearch 降级为友好提示
|
|
196
|
+
throw new Error(`所有搜索端点均失败:${errors.join(';')}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=fetchWebSearchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWebSearchProvider.js","sourceRoot":"","sources":["../../src/web-search/fetchWebSearchProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 网络搜索提供者接口定义:让 memora 内核具备可注入的网络搜索能力。
|
|
3
|
+
* 宿主实现 IWebSearchProvider 注入自定义搜索引擎(接口注入,遵循 LlmProvider 模式;零依赖)。
|
|
4
|
+
*/
|
|
5
|
+
/** 单条搜索结果 */
|
|
6
|
+
export interface SearchResult {
|
|
7
|
+
/** 搜索结果标题 */
|
|
8
|
+
title: string;
|
|
9
|
+
/** 搜索结果链接 */
|
|
10
|
+
url: string;
|
|
11
|
+
/** 搜索结果摘要 */
|
|
12
|
+
snippet: string;
|
|
13
|
+
/**
|
|
14
|
+
* 实际服务的搜索后端名称(如 'Bing' / 'DuckDuckGo')。
|
|
15
|
+
* 降级发生时由 FetchWebSearchProvider 打标,供宿主/工具结果透出「已降级」提示;
|
|
16
|
+
* 可选:自定义 IWebSearchProvider 可不填(向后兼容,现有调用方忽略此字段)。
|
|
17
|
+
*/
|
|
18
|
+
endpoint?: string;
|
|
19
|
+
}
|
|
20
|
+
/** 搜索选项 */
|
|
21
|
+
export interface WebSearchOptions {
|
|
22
|
+
/** 返回结果数量上限(默认 5) */
|
|
23
|
+
limit?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 搜索端点契约:名称 + URL 构造 + HTML 解析。
|
|
27
|
+
* 宿主可构造自己的 SearchEndpoint 注入 FetchWebSearchProvider / buildSearchEndpoints,
|
|
28
|
+
* 内核内置 SEARCH_ENDPOINT_REGISTRY 仅作零配置保底基线(非真理源)。
|
|
29
|
+
*/
|
|
30
|
+
export interface SearchEndpoint {
|
|
31
|
+
/** 端点名称(降级打标 / 结果透出用) */
|
|
32
|
+
name: string;
|
|
33
|
+
/** 由查询构造请求 URL */
|
|
34
|
+
buildUrl(query: string): string;
|
|
35
|
+
/** 从结果页 HTML 解析出结构化结果 */
|
|
36
|
+
parse(html: string, limit: number): SearchResult[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 网络搜索提供者接口:宿主实现并注入 AgentOptions.webSearchProvider 提供搜索能力;
|
|
40
|
+
* 未注入时 Agent 不会暴露 web_search 工具给 LLM。
|
|
41
|
+
*/
|
|
42
|
+
export interface IWebSearchProvider {
|
|
43
|
+
/** 搜索互联网,返回结构化结果列表 */
|
|
44
|
+
search(query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-search/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,yBAAyB;IACzB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CACpD;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CAC5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web-search/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 网络搜索集成入口:提供带超时保护的加载包装,组合默认实现或宿主自定义实现。
|
|
3
|
+
* 搜索失败时降级返回友好错误信息,不中断对话流程(30s 超时防卡死 Agent 主循环)。
|
|
4
|
+
*/
|
|
5
|
+
import type { IWebSearchProvider, SearchResult, WebSearchOptions } from '../web-search/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 带超时和错误处理的搜索包装:超时或失败时不抛异常,返回降级提示信息。
|
|
8
|
+
*/
|
|
9
|
+
export declare function safeSearch(provider: IWebSearchProvider, query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
|
|
10
|
+
//# sourceMappingURL=webSearchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSearchProvider.d.ts","sourceRoot":"","sources":["../../src/web-search/webSearchProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKhG;;GAEG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** 网络搜索超时时间(毫秒) */
|
|
2
|
+
const SEARCH_TIMEOUT_MS = 30_000;
|
|
3
|
+
/**
|
|
4
|
+
* 带超时和错误处理的搜索包装:超时或失败时不抛异常,返回降级提示信息。
|
|
5
|
+
*/
|
|
6
|
+
export async function safeSearch(provider, query, options) {
|
|
7
|
+
let timer;
|
|
8
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
9
|
+
timer = setTimeout(() => reject(new Error('网络搜索超时(30s)')), SEARCH_TIMEOUT_MS);
|
|
10
|
+
});
|
|
11
|
+
try {
|
|
12
|
+
return await Promise.race([provider.search(query, options), timeoutPromise]);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
// 搜索失败不抛异常,返回降级提示
|
|
16
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
17
|
+
return [
|
|
18
|
+
{
|
|
19
|
+
title: '网络搜索暂不可用',
|
|
20
|
+
url: '',
|
|
21
|
+
snippet: `搜索失败:${message}。请稍后重试,或检查网络连接。`,
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
// 成功/失败均清理超时定时器,防残留定时器拖住进程
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=webSearchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSearchProvider.js","sourceRoot":"","sources":["../../src/web-search/webSearchProvider.ts"],"names":[],"mappings":"AAMA,mBAAmB;AACnB,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA4B,EAC5B,KAAa,EACb,OAA0B;IAE1B,IAAI,KAAgD,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/D,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kBAAkB;QAClB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL;gBACE,KAAK,EAAE,UAAU;gBACjB,GAAG,EAAE,EAAE;gBACP,OAAO,EAAE,QAAQ,OAAO,iBAAiB;aAC1C;SACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,2BAA2B;QAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|