@zooique/memora 2.0.3 → 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 -272
- package/README.md +303 -260
- package/config.example.json +43 -0
- package/dist/agent/agent.d.ts +376 -408
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1166 -926
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +105 -43
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +543 -75
- 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 +225 -38
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +748 -132
- 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 +137 -20
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +152 -20
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +119 -77
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +192 -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 +716 -295
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +2178 -664
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +19 -287
- 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 +31 -115
- package/dist/agent/managers/dedupManager.d.ts.map +1 -1
- package/dist/agent/managers/dedupManager.js +48 -136
- package/dist/agent/managers/dedupManager.js.map +1 -1
- 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 +8 -25
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.js +7 -24
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
- 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 +85 -207
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +10 -42
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
- package/dist/agent/managers/memoryGovernance.js +19 -36
- package/dist/agent/managers/memoryGovernance.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +59 -268
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +91 -442
- 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 -68
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +76 -147
- 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 +8 -33
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
- package/dist/agent/managers/streamAccumulator.js +4 -29
- package/dist/agent/managers/streamAccumulator.js.map +1 -1
- 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 +9 -41
- 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 +55 -100
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +164 -268
- 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 +236 -10
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +932 -21
- 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 +510 -169
- 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 +27 -98
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +110 -223
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +67 -77
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -69
- 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 +22 -32
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +29 -46
- 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 +179 -120
- 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 -31
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +28 -215
- 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 +11 -44
- package/dist/memory/governance.d.ts.map +1 -1
- package/dist/memory/governance.js +11 -64
- package/dist/memory/governance.js.map +1 -1
- 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 +25 -175
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +32 -221
- 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 +2 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +6 -8
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +30 -129
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +39 -189
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +14 -62
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +27 -111
- 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 +10 -12
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +16 -32
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +44 -150
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/types.d.ts +65 -164
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +81 -83
- 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 +136 -19
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +312 -61
- 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 -16
- 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 +40 -72
- package/dist/utils/configResourceManager.d.ts.map +1 -1
- package/dist/utils/configResourceManager.js +78 -76
- package/dist/utils/configResourceManager.js.map +1 -1
- package/dist/utils/errors.d.ts +44 -69
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +54 -71
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +104 -103
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +37 -45
- 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 +2 -3
- 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 +25 -3
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +32 -16
- 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 -19
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +230 -97
- 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 +416 -476
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
- 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 -100
- 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 -49
- package/dist/agent/guardrail.d.ts.map +0 -1
- package/dist/agent/guardrail.js +0 -59
- 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 -146
- package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
- package/dist/agent/managers/configManager.d.ts +0 -209
- package/dist/agent/managers/configManager.d.ts.map +0 -1
- package/dist/agent/managers/configManager.js +0 -331
- 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 -239
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.js +0 -413
- 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 -88
- 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 -79
- 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 -50
- package/dist/memory/hybridMerge.d.ts.map +0 -1
- package/dist/memory/hybridMerge.js +0 -51
- package/dist/memory/hybridMerge.js.map +0 -1
- package/dist/memory/inMemoryRelationStore.d.ts +0 -58
- package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
- package/dist/memory/inMemoryRelationStore.js +0 -80
- package/dist/memory/inMemoryRelationStore.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -51
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -100
- package/dist/memory/loader.js.map +0 -1
- package/dist/memory/recall.d.ts +0 -82
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js +0 -157
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/relationStore.d.ts +0 -95
- 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 -71
- package/dist/memory/store.d.ts.map +0 -1
- package/dist/memory/store.js +0 -199
- package/dist/memory/store.js.map +0 -1
- package/dist/memory/userProfile.d.ts +0 -180
- package/dist/memory/userProfile.d.ts.map +0 -1
- package/dist/memory/userProfile.js +0 -381
- package/dist/memory/userProfile.js.map +0 -1
- package/dist/memory/vectorStore.d.ts +0 -179
- package/dist/memory/vectorStore.d.ts.map +0 -1
- package/dist/memory/vectorStore.js +0 -284
- package/dist/memory/vectorStore.js.map +0 -1
- package/dist/persona/personaManager.d.ts +0 -109
- package/dist/persona/personaManager.d.ts.map +0 -1
- package/dist/persona/personaManager.js +0 -315
- 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
|
@@ -1,34 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 技能管理器 — 继承 ConfigResourceManager
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* - 启动时扫描 configDir/skills/ 目录
|
|
6
|
-
* - 通过关键词匹配 + trigger 正则选择技能
|
|
7
|
-
* - 支持运行时 register() 注入技能
|
|
8
|
-
*
|
|
9
|
-
* 设计原则:
|
|
10
|
-
* - 单层目录:<configDir>/skills/(宿主负责汇总全局+项目级技能到 configDir)
|
|
11
|
-
* - 与 PersonaManager 共享 ConfigResourceManager 基类(消除重复扫描/匹配/生命周期)
|
|
12
|
-
*
|
|
13
|
-
* 触发词说明:
|
|
14
|
-
* 每个 skill 文件的 frontmatter 声明 keywords(逗号分隔)和 trigger(触发正则,可选)。
|
|
15
|
-
* skill 文件命名规范:`<技能名>.md`(如"去AI味.md""审视角.md""写代码.md")。
|
|
2
|
+
* 技能管理器 — 继承 ConfigResourceManager。
|
|
3
|
+
* 单层目录 <configDir>/skills/(宿主负责汇总全局+项目级技能到 configDir)。
|
|
4
|
+
* 三级渐进披露:L1 元数据常驻 / L2 read_skill 按需 / L3 resources+scripts。
|
|
16
5
|
*/
|
|
17
6
|
import { logger } from '../logging/logger.js';
|
|
18
7
|
import { configError } from '../utils/errors.js';
|
|
19
8
|
import { ConfigResourceManager } from '../utils/configResourceManager.js';
|
|
20
|
-
import {
|
|
9
|
+
import { scanMarkdownDir } from '../utils/scanner.js';
|
|
10
|
+
import { parseFrontmatter } from '../utils/frontmatter.js';
|
|
11
|
+
import { discoverSkillLayer3, projectDiscoveredLayer3, resolveSkillDir, findLayer3Resource, resolveLayer3ResourcePath, resolveLayer3ScriptPath, } from '../skill/skillLayer3.js';
|
|
12
|
+
import { readFileCapped, existsSyncSafe } from '../utils/fileSafe.js';
|
|
21
13
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* score < 此阈值的匹配不激活技能(避免低匹配度噪音)。
|
|
25
|
-
* 与 PersonaManager 的 KEYWORD_HIGH_CONFIDENCE_THRESHOLD (0.3) 一致。
|
|
14
|
+
* L1 阈值保护:技能数超过此值时压缩 L1 描述为 20 字摘要。
|
|
15
|
+
* SSOT:全局技能(SkillManager)与角色包内嵌技能(RolePackManager)共用同一渐进披露阈值。
|
|
26
16
|
*/
|
|
27
|
-
const
|
|
17
|
+
export const L1_COMPRESSED_THRESHOLD = 30;
|
|
18
|
+
/** L1 阈值保护:技能数超过此值时切换为 list_skills 工具动态查询(SSOT 同一来源) */
|
|
19
|
+
export const L1_LIST_TOOL_THRESHOLD = 50;
|
|
20
|
+
/**
|
|
21
|
+
* 解析来源层(agent / project):SSOT 收口——仅接受合法枚举值,
|
|
22
|
+
* 非法/缺失回退 'project'(与历史默认一致,防御 frontmatter 手误导致契约外值透传宿主)。
|
|
23
|
+
*/
|
|
24
|
+
function resolveLayer(raw) {
|
|
25
|
+
return raw === 'agent' ? 'agent' : 'project';
|
|
26
|
+
}
|
|
28
27
|
/**
|
|
29
28
|
* 技能管理器
|
|
30
29
|
*/
|
|
31
30
|
export class SkillManager extends ConfigResourceManager {
|
|
31
|
+
/**
|
|
32
|
+
* 已被用户技能覆盖的内置技能名。
|
|
33
|
+
*
|
|
34
|
+
* 与基类 runtimeNames 记账互补:runtimeNames 说明「该项无内核扫描真理源」,
|
|
35
|
+
* 本集合说明「同名磁盘(内置)项被用户版覆盖」——reload 扫描回同名内置时
|
|
36
|
+
* 以用户版为准(基类 isUserOverride 钩子)。load()(纯内置重载)时一并清空。
|
|
37
|
+
*/
|
|
38
|
+
userOverrides = new Set();
|
|
39
|
+
/**
|
|
40
|
+
* 禁用的技能名集合:宿主配置形态启停。命中者
|
|
41
|
+
* get() 返回 null(read_skill/L3 全链路经 get 短路)+ buildSkillList 不枚举。
|
|
42
|
+
* list 快照保持完整——宿主 UI 依据同名设置标注「已禁用」徽章(对 LLM 静默)。
|
|
43
|
+
*
|
|
44
|
+
* **作用域 = 全局技能池(内置/用户)**:角色包内嵌技能由 RolePackManager 持有、
|
|
45
|
+
* 不经本管理器(其启用判据 = 角色是否激活),对本集**免疫**——角色包技能
|
|
46
|
+
* 「随角色启停、不可按名禁用」(见宿主 skillAggregation 定案声明)。
|
|
47
|
+
*/
|
|
48
|
+
disabledNames = new Set();
|
|
32
49
|
/**
|
|
33
50
|
* @param configDir 配置目录(技能文件在 <configDir>/skills/ 下)
|
|
34
51
|
*/
|
|
@@ -44,59 +61,54 @@ export class SkillManager extends ConfigResourceManager {
|
|
|
44
61
|
async load() {
|
|
45
62
|
return this.loadItems();
|
|
46
63
|
}
|
|
47
|
-
/**
|
|
48
|
-
* 根据用户输入匹配最合适的技能
|
|
49
|
-
*
|
|
50
|
-
* 匹配流程:
|
|
51
|
-
* 1. 先检查所有 trigger 正则,命中直接返回(最高优先级,score=1.0)
|
|
52
|
-
* 2. 再检查关键词匹配(复用基类 findBestKeywordMatch)
|
|
53
|
-
* 3. 关键词得分 < SKILL_MATCH_MIN_SCORE 的匹配不激活
|
|
54
|
-
*
|
|
55
|
-
* @param userInput 用户输入文本
|
|
56
|
-
* @returns 匹配结果,无匹配返回 null
|
|
57
|
-
*/
|
|
58
|
-
match(userInput) {
|
|
59
|
-
if (this.items.length === 0)
|
|
60
|
-
return null;
|
|
61
|
-
// 1. trigger 正则匹配(最高优先级)
|
|
62
|
-
for (const skill of this.items) {
|
|
63
|
-
if (skill.trigger?.test(userInput)) {
|
|
64
|
-
logger.debug({ skill: skill.name, trigger: skill.trigger.source }, '技能触发器匹配');
|
|
65
|
-
return { skill, score: 1.0 };
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// 2. 关键词匹配(委托基类)
|
|
69
|
-
const best = this.findBestKeywordMatch(userInput, SKILL_MATCH_MIN_SCORE);
|
|
70
|
-
if (!best)
|
|
71
|
-
return null;
|
|
72
|
-
logger.debug({ matched: best.item.name, score: best.score }, '技能关键词匹配');
|
|
73
|
-
return { skill: best.item, score: best.score };
|
|
74
|
-
}
|
|
75
64
|
// ── 公共方法 ──────────────────────────────────────
|
|
76
65
|
/**
|
|
77
66
|
* 根据技能名获取技能
|
|
78
67
|
*/
|
|
79
68
|
get(name) {
|
|
69
|
+
// 禁用技能对 LLM 不可见:get=null → read_skill 报未找到、L3 全链路短路
|
|
70
|
+
if (this.disabledNames.has(name))
|
|
71
|
+
return null;
|
|
80
72
|
return this.items.find((s) => s.name === name) ?? null;
|
|
81
73
|
}
|
|
82
74
|
/**
|
|
83
|
-
*
|
|
75
|
+
* 设置禁用技能清单(配置形态启停;装配期一次性注入,可由 reloadConfig 重设)
|
|
76
|
+
*
|
|
77
|
+
* @param names 禁用的技能名(命中者 L1/L2/L3 全不可用;对 LLM 语义 = 不存在)
|
|
84
78
|
*/
|
|
85
|
-
|
|
86
|
-
|
|
79
|
+
setDisabledSkills(names) {
|
|
80
|
+
this.disabledNames.clear();
|
|
81
|
+
for (const name of names)
|
|
82
|
+
this.disabledNames.add(name);
|
|
83
|
+
logger.info({ count: this.disabledNames.size }, '技能禁用集已设置');
|
|
87
84
|
}
|
|
88
85
|
/**
|
|
89
|
-
*
|
|
86
|
+
* 当前禁用技能名快照(只读)——宿主 UI 渲染「已禁用」徽章的真源。
|
|
87
|
+
*
|
|
88
|
+
* 为何由内核提供而非宿主自读一份配置:**实际生效的禁用集在内核**(`disabledNames` 是
|
|
89
|
+
* `get()` / `buildSkillList()` 的判据)。宿主若另读 workspace 配置,会出现「UI 标注的」
|
|
90
|
+
* 与「实际生效的」两源分叉(如 reloadConfig 重设后不同步)。
|
|
90
91
|
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
92
|
+
* ⚠️ 对 **LLM** 仍然静默:本 getter 仅供宿主 UI 对照显示,
|
|
93
|
+
* **不得**出现在工具返回、L1 清单或任何进入上下文的文本里(语义 = 技能不存在)。
|
|
94
|
+
*/
|
|
95
|
+
get disabledSkillNames() {
|
|
96
|
+
return [...this.disabledNames];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 注册运行时注入的技能(如 confirmConfigSuggestion 持久化技能);同名重复注册被拒绝。
|
|
100
|
+
*
|
|
101
|
+
* 必须走基类 registerRuntimeItem 登记——直接 push 进 items 会被 reload() 的磁盘扫描结果覆盖
|
|
102
|
+
* (运行时注入项无磁盘真理源,reload 保留依赖 runtimeNames 记账;设定记忆不写记忆库)。
|
|
93
103
|
*/
|
|
94
104
|
register(skill) {
|
|
95
105
|
if (this.items.some((s) => s.name === skill.name)) {
|
|
96
|
-
throw configError(`技能 "${skill.name}" 已存在,不能重复注册`, undefined, [
|
|
106
|
+
throw configError(`技能 "${skill.name}" 已存在,不能重复注册`, undefined, [
|
|
107
|
+
'请使用不同的技能名称',
|
|
108
|
+
]);
|
|
97
109
|
}
|
|
98
|
-
this.
|
|
99
|
-
logger.info({ name: skill.name
|
|
110
|
+
this.registerRuntimeItem(skill);
|
|
111
|
+
logger.info({ name: skill.name }, '技能已注册(运行时注入)');
|
|
100
112
|
}
|
|
101
113
|
/**
|
|
102
114
|
* 构建 system prompt 中的技能段
|
|
@@ -109,16 +121,255 @@ export class SkillManager extends ConfigResourceManager {
|
|
|
109
121
|
return '';
|
|
110
122
|
return `【当前技能】${skill.name}\n${skill.content}`;
|
|
111
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* 格式化单个技能为 Prompt 字符串
|
|
126
|
+
*
|
|
127
|
+
* SSOT:所有技能展示(System Prompt、Tool 回调)必须走此方法保证格式统一。
|
|
128
|
+
* compress=true 时描述截断至 20 字(技能较多时的 token 节约)。
|
|
129
|
+
*/
|
|
130
|
+
static formatSkillForPrompt(skill, fallbackName, compress = false) {
|
|
131
|
+
const label = skill?.name || fallbackName || '';
|
|
132
|
+
if (!label)
|
|
133
|
+
return '';
|
|
134
|
+
let desc = '';
|
|
135
|
+
if (skill?.description) {
|
|
136
|
+
const descText = compress && skill.description.length > 20
|
|
137
|
+
? skill.description.slice(0, 20) + '…'
|
|
138
|
+
: skill.description;
|
|
139
|
+
desc = `:${descText}`;
|
|
140
|
+
}
|
|
141
|
+
const hasL3 = skill?.layer3 && (skill.layer3.resources.length > 0 || skill.layer3.scripts.length > 0);
|
|
142
|
+
const l3Tag = hasL3 ? '(含资源/脚本)' : '';
|
|
143
|
+
return `- ${label}${desc}${l3Tag}`;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 对 **LLM 可见**的技能条目——渐进披露可用性判据的**唯一真理源**。
|
|
147
|
+
*
|
|
148
|
+
* 判据两条(缺一不可):
|
|
149
|
+
* ① 有 `description`(渐进披露的唯一依据:缺则模型不知何时激活);
|
|
150
|
+
* ② 未命中 `disabledNames`(启停:对模型语义 = 不存在)。
|
|
151
|
+
*
|
|
152
|
+
* ⚠️ **L1 枚举**(`buildSkillList`)与 **`list_skills` 工具侧**(assembler 注入回调)
|
|
153
|
+
* 必须共用本方法:两者同为 **LLM 消费**、是同一份清单的两个交付通道,
|
|
154
|
+
* 判据一旦分叉即「双轨镜像」(同一模型在两条路径看到不同技能集)。
|
|
155
|
+
* 教训:启停/可用性过滤须两侧同步——单侧漏改会让禁用技能在另一通道仍可见。
|
|
156
|
+
*
|
|
157
|
+
* 注:本方法**不**过滤 L3 归属,也不做排序——排序由调用方决定(两通道排序本就不同)。
|
|
158
|
+
*/
|
|
159
|
+
listAvailable() {
|
|
160
|
+
return this.items.filter((s) => s.description?.trim() && !this.disabledNames.has(s.name));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 构建全局技能清单块(渐进披露 L1),与角色包技能清单同格式。
|
|
164
|
+
* 两级技能同构:通用技能全局激活,角色包技能随角色激活;LLM 按需调 read_skill 读正文(L2)。
|
|
165
|
+
* 含 resources/scripts 的技能附加 "(含资源/脚本)" 标记。
|
|
166
|
+
*
|
|
167
|
+
* L1 阈值保护(与角色包 buildSystemPrompt 同构):
|
|
168
|
+
* ≤ 30 技能:完整 L1(name + full description)
|
|
169
|
+
* 31-50 技能:压缩 L1(name + 20 字摘要)
|
|
170
|
+
* > 50 技能:切换 list_skills 工具动态查询,不在 system prompt 枚举
|
|
171
|
+
*/
|
|
172
|
+
buildSkillList() {
|
|
173
|
+
// 可用性 + 禁用过滤**收口于 listAvailable**(LLM 可见集唯一真理源,
|
|
174
|
+
// 与 list_skills 工具侧共用;此处不再自写 filter,防两通道判据分叉)。
|
|
175
|
+
// 不进清单者由宿主 UI 显式标注而非静默隐藏:「未生效」= 健康徽章 / 禁用 = 「已禁用」徽章。
|
|
176
|
+
const candidates = this.listAvailable();
|
|
177
|
+
if (candidates.length === 0)
|
|
178
|
+
return '';
|
|
179
|
+
const skillCount = candidates.length;
|
|
180
|
+
// L1 阈值保护:超上限不枚举,提示用 list_skills 工具动态查询
|
|
181
|
+
if (skillCount > L1_LIST_TOOL_THRESHOLD) {
|
|
182
|
+
return `【通用技能(${skillCount} 个,数量较多,使用 list_skills 工具查询具体清单)】`;
|
|
183
|
+
}
|
|
184
|
+
const compressed = skillCount > L1_COMPRESSED_THRESHOLD;
|
|
185
|
+
const listed = candidates
|
|
186
|
+
.map((skill) => SkillManager.formatSkillForPrompt(skill, undefined, compressed))
|
|
187
|
+
.filter(Boolean);
|
|
188
|
+
if (listed.length === 0)
|
|
189
|
+
return '';
|
|
190
|
+
const modeNote = compressed
|
|
191
|
+
? '(技能较多,描述已压缩至 20 字,可用 read_skill 读取完整正文)'
|
|
192
|
+
: '(渐进披露 L1,按需调用 read_skill 读取正文)';
|
|
193
|
+
return `【通用技能${modeNote}】\n${listed.join('\n')}`;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 校验单技能文件(写→验→用闭环,宿主 UI 校验入口)。
|
|
197
|
+
* 复用 parser frontmatter 解析做单一真理源,不重写解析;只做确定性结构检查,不做语义 schema。
|
|
198
|
+
* 判级(三点强化):
|
|
199
|
+
* - error:无 frontmatter / description 缺失/空(渐进披露唯一依据,缺则技能不可用)/ 正文空
|
|
200
|
+
* - warning:layer 非法(回退 project)
|
|
201
|
+
*/
|
|
202
|
+
async validateFile(filePath) {
|
|
203
|
+
const issues = [];
|
|
204
|
+
// 读取收口于 fileSafe.readFileCapped(统一长度上限保护,与角色包内容读取同级)
|
|
205
|
+
const raw = await readFileCapped(filePath);
|
|
206
|
+
if (raw === null) {
|
|
207
|
+
return {
|
|
208
|
+
ok: false,
|
|
209
|
+
issues: [{ level: 'error', field: 'file', message: '无法读取技能文件' }],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const { frontmatter, body } = parseFrontmatter(raw);
|
|
213
|
+
// 无 frontmatter 结构(fallback:整体落入 body 且无任何键值)→ 不被识别
|
|
214
|
+
if (Object.keys(frontmatter).length === 0 && body === raw) {
|
|
215
|
+
issues.push({
|
|
216
|
+
level: 'error',
|
|
217
|
+
field: 'frontmatter',
|
|
218
|
+
message: '缺少 frontmatter(文件需以 --- 开头声明 name/description)',
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
const desc = frontmatter['description'];
|
|
222
|
+
if (!desc || !desc.trim()) {
|
|
223
|
+
issues.push({
|
|
224
|
+
level: 'error',
|
|
225
|
+
field: 'description',
|
|
226
|
+
message: '缺少 description:渐进披露不暴露,模型不知何时激活此技能',
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
if (!body.trim()) {
|
|
230
|
+
issues.push({ level: 'error', field: 'body', message: '技能正文为空,无可执行指令' });
|
|
231
|
+
}
|
|
232
|
+
const layer = frontmatter['layer'];
|
|
233
|
+
if (layer && layer !== 'agent' && layer !== 'project') {
|
|
234
|
+
issues.push({
|
|
235
|
+
level: 'warning',
|
|
236
|
+
field: 'layer',
|
|
237
|
+
message: `layer 值「${layer}」非法,将回退为 project`,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
return { ok: issues.every((i) => i.level !== 'error'), issues };
|
|
241
|
+
}
|
|
242
|
+
// ── L3 资源/脚本访问 ──────────────────────────────────
|
|
243
|
+
/**
|
|
244
|
+
* 读取技能的 L3 资源文件(渐进披露 L3);资源须在 layer3 中且路径不逃逸其来源子目录
|
|
245
|
+
* (resources/ 或 references/,兼容主流 references/ 辅助文档目录)
|
|
246
|
+
*/
|
|
247
|
+
async readResource(skillName, resourcePath) {
|
|
248
|
+
const skill = this.get(skillName);
|
|
249
|
+
if (!skill)
|
|
250
|
+
return null;
|
|
251
|
+
// 白名单前置:资源须已由扫描登记在 layer3 中(未登记 → 静默 null)
|
|
252
|
+
if (!findLayer3Resource(skill.layer3, resourcePath))
|
|
253
|
+
return null;
|
|
254
|
+
// 路径解析(按条目来源子目录选基目录 + 路径穿越防护)收口于 skillLayer3(SSOT)
|
|
255
|
+
const skillDir = resolveSkillDir(skill.filePath);
|
|
256
|
+
const resourceFullPath = resolveLayer3ResourcePath(skillDir, skill.layer3, resourcePath);
|
|
257
|
+
if (!resourceFullPath) {
|
|
258
|
+
logger.warn({ skill: skillName, resourcePath }, 'read_resource 路径穿越被阻止');
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
// 读取收口于 fileSafe.readFileCapped:长度上限保护与角色包内嵌技能同级(差异点取更全面形态)
|
|
262
|
+
const content = await readFileCapped(resourceFullPath);
|
|
263
|
+
if (content === null) {
|
|
264
|
+
logger.warn({ skill: skillName, resourcePath }, '读取 L3 资源失败');
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
return content;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* 列出技能的 L3 资源
|
|
271
|
+
*/
|
|
272
|
+
listResources(skillName) {
|
|
273
|
+
const skill = this.get(skillName);
|
|
274
|
+
return skill?.layer3?.resources ?? [];
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 列出技能的 L3 脚本
|
|
278
|
+
*/
|
|
279
|
+
listScripts(skillName) {
|
|
280
|
+
const skill = this.get(skillName);
|
|
281
|
+
return skill?.layer3?.scripts ?? [];
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* 获取脚本的完整路径(须在 layer3 中且路径不逃逸 scripts/ 目录)
|
|
285
|
+
*/
|
|
286
|
+
getScriptPath(skillName, scriptPath) {
|
|
287
|
+
const skill = this.get(skillName);
|
|
288
|
+
if (!skill)
|
|
289
|
+
return null;
|
|
290
|
+
const skillDir = resolveSkillDir(skill.filePath);
|
|
291
|
+
const fullPath = resolveLayer3ScriptPath(skillDir, skill.layer3, scriptPath);
|
|
292
|
+
if (!fullPath)
|
|
293
|
+
return null;
|
|
294
|
+
// 存在性校验与角色包内嵌技能对齐(差异点取更全面形态):防止交出指向缺失脚本的路径
|
|
295
|
+
return existsSyncSafe(fullPath) ? fullPath : null;
|
|
296
|
+
}
|
|
112
297
|
// ── 基类抽象方法实现 ──────────────────────────────
|
|
113
|
-
|
|
298
|
+
/**
|
|
299
|
+
* 加载用户目录的技能(宿主调用,用于扩展内置技能池)
|
|
300
|
+
*
|
|
301
|
+
* 与 load() 的区别:
|
|
302
|
+
* - load() 从 configDir/skills/ 扫描内置技能(有磁盘真理源)
|
|
303
|
+
* - loadExtraDir() 从额外目录扫描用户技能(运行时注入,reload 时保留)
|
|
304
|
+
*
|
|
305
|
+
* 设计哲学:内核保持单一真理源(configDir/skills/),宿主负责扩展用户目录。
|
|
306
|
+
* 用户技能通过 registerRuntimeItem 注入,reload() 时会保留(同名冲突以磁盘为准)。
|
|
307
|
+
*
|
|
308
|
+
* @param dir 用户技能目录(如 ~/.memora/skills/)
|
|
309
|
+
* @returns 加载的技能数量
|
|
310
|
+
*/
|
|
311
|
+
async loadExtraDir(dir) {
|
|
312
|
+
const entries = await scanMarkdownDir(dir);
|
|
313
|
+
let count = 0;
|
|
314
|
+
for (const entry of entries) {
|
|
315
|
+
// 已是用户覆盖项(本会话此前注入过):幂等跳过,避免同名双存重复注入
|
|
316
|
+
if (this.userOverrides.has(entry.name))
|
|
317
|
+
continue;
|
|
318
|
+
const existingIdx = this.items.findIndex((s) => s.name === entry.name);
|
|
319
|
+
const skill = await this.createEntry(entry);
|
|
320
|
+
if (!skill)
|
|
321
|
+
continue;
|
|
322
|
+
// 同名覆盖(对齐主流「用户可覆盖内置」):用户版生效——
|
|
323
|
+
// 移除内置版(磁盘真理源,reload 可重扫)、
|
|
324
|
+
// 登记 userOverrides 供 reload 保持用户版胜出(基类 isUserOverride 钩子);
|
|
325
|
+
// 不覆盖则用户同名技能会被静默丢弃。
|
|
326
|
+
if (existingIdx >= 0) {
|
|
327
|
+
this.items.splice(existingIdx, 1);
|
|
328
|
+
this.userOverrides.add(entry.name);
|
|
329
|
+
logger.info({ name: entry.name }, '用户技能覆盖内置技能');
|
|
330
|
+
}
|
|
331
|
+
this.registerRuntimeItem(skill);
|
|
332
|
+
count++;
|
|
333
|
+
}
|
|
334
|
+
logger.info({ count, dir }, '用户技能加载完成');
|
|
335
|
+
return count;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* 用户覆盖声明:userOverrides 中记录的同名技能,reload 扫描回内置版时
|
|
339
|
+
* 用户版胜出、内置版剔除(基类 retainRuntimeItems 消费)。其余同名不声明——
|
|
340
|
+
* 保持基类默认「磁盘(内置)赢」语义(如 register() 运行时技能撞内置仍内置赢)。
|
|
341
|
+
*/
|
|
342
|
+
isUserOverride(name) {
|
|
343
|
+
return this.userOverrides.has(name);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* load()(纯内置重载)后 userOverrides 一并清空——与基类 runtimeNames 同寿命:
|
|
347
|
+
* load() 整体替换 items、运行时注入全丢,账目须同步;否则残留名字会在未来
|
|
348
|
+
* loadExtraDir 同名时被幂等跳过(见其开头判定),用户技能静默丢失。
|
|
349
|
+
*/
|
|
350
|
+
onAfterLoad() {
|
|
351
|
+
this.userOverrides.clear();
|
|
352
|
+
}
|
|
353
|
+
async createEntry(entry) {
|
|
354
|
+
// L3 隔离纪律(对齐 Claude Code 主流):仅「文件夹形态」(入口为 SKILL.md)才发现
|
|
355
|
+
// resources/ scripts/。顶层裸 .md 单文件技能目录 = 技能池共享根,同级扫描会把别的技能的
|
|
356
|
+
// resources/scripts 误归给自己 → 污染。故裸 .md 为纯 L1/L2,需要 L3 资源/脚本必须用文件夹+SKILL.md。
|
|
357
|
+
//
|
|
358
|
+
// 该规则与角色包内嵌技能**逐字同构**;发现与投影均已收口于 skillLayer3
|
|
359
|
+
// (discoverSkillLayer3 + projectDiscoveredLayer3,SSOT)——两侧各写一遍投影,
|
|
360
|
+
// 改一处即静默漂移。
|
|
361
|
+
const discovered = await discoverSkillLayer3(entry.filePath);
|
|
362
|
+
const layer3 = projectDiscoveredLayer3(discovered);
|
|
114
363
|
return {
|
|
115
364
|
name: entry.name,
|
|
116
|
-
keywords: parseKeywords(entry.frontmatter),
|
|
117
|
-
trigger: parseTrigger(entry.frontmatter),
|
|
118
365
|
description: entry.frontmatter['description'],
|
|
119
366
|
content: entry.body.trim(),
|
|
120
367
|
filePath: entry.filePath,
|
|
121
|
-
layer
|
|
368
|
+
// 来源层(agent / project):解析 frontmatter.layer,非法/缺失回退 project(与现状默认一致)。
|
|
369
|
+
// ⚠️ 展示语义不由本字段单独决定:宿主以 filePath 前缀为主判据,
|
|
370
|
+
// 本字段仅在无路径/未命中时兜底(project → 用户源,agent → 内置源)。
|
|
371
|
+
layer: resolveLayer(entry.frontmatter['layer']),
|
|
372
|
+
layer3,
|
|
122
373
|
};
|
|
123
374
|
}
|
|
124
375
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillManager.js","sourceRoot":"","sources":["../../src/skill/skillManager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skillManager.js","sourceRoot":"","sources":["../../src/skill/skillManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { CodeExecutionResult } from '../code-exec/types.js';
|
|
2
|
+
import type { ScriptRuntime } from '../utils/scanner.js';
|
|
3
|
+
/** 脚本执行结果(= CodeExecutionResult,复用代码执行结果形态,SSOT 不重复定义) */
|
|
4
|
+
export type ScriptExecutionResult = CodeExecutionResult;
|
|
5
|
+
/**
|
|
6
|
+
* Windows 平台 shell 档脚本守卫
|
|
7
|
+
*
|
|
8
|
+
* 缺陷事实链:`.sh` → runtime `shell`(scanner.SCRIPT_RUNTIME_MAP)→ win32 派发
|
|
9
|
+
* `cmd /c <path>`(resolveCommand shell 分支)——而 `.sh` 不是 cmd 原生可执行类型
|
|
10
|
+
* (只有 `.bat`/`.cmd` 是),命令退到「Windows 关联程序」路径:status=0 但
|
|
11
|
+
* stdout/stderr 全空(静默空跑)。`formatExecutionResult` 见 status=0 向模型报
|
|
12
|
+
* 「成功」→ 模型认定脚本已跑完 → 静默失败。
|
|
13
|
+
* `.ps1` 同理:`cmd /c` 不起 PowerShell,同样静默空跑(不新增 powershell runtime 档——
|
|
14
|
+
* 那是新能力,留待宿主 shell 选型一并设计)。
|
|
15
|
+
*
|
|
16
|
+
* 本守卫改的是「喂给判据的事实」(Win 下喂进 spawn 的 `cmd /c foo.sh` 只会制造假
|
|
17
|
+
* status=0),非判据本身——属止血。POSIX 不受影响(`sh <path>` 合法)。
|
|
18
|
+
*
|
|
19
|
+
* @param scriptPath 脚本路径
|
|
20
|
+
* @param runtime 运行时(node/python/shell)
|
|
21
|
+
* @param platform 当前平台(win32 才拦截;参数化便于测试)
|
|
22
|
+
* @returns 命中拦截返回显式错误文案(含替代方案),否则 null
|
|
23
|
+
*/
|
|
24
|
+
export declare function guardWindowsShellScript(scriptPath: string, runtime: ScriptRuntime, platform: NodeJS.Platform): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* 执行技能脚本:在隔离子进程中运行,收集 stdout/stderr/exitCode/timedOut
|
|
27
|
+
*
|
|
28
|
+
* @param scriptPath 脚本绝对路径
|
|
29
|
+
* @param runtime 运行时(node/python/shell 白名单三档)
|
|
30
|
+
* @param args 传给脚本的参数数组
|
|
31
|
+
* @param timeoutMs 超时(毫秒,限制在 [1s, MAX_TIMEOUT_MS] 内)
|
|
32
|
+
* @param cwd 子进程工作目录(可选;run_project_script 以项目根为 cwd,
|
|
33
|
+
* 使项目脚本可加载项目本地依赖/相对数据文件)
|
|
34
|
+
* @param nodePath node 可执行文件路径(可选,缺省 'node' 走 PATH)——供宿主注入真实
|
|
35
|
+
* node 路径用。
|
|
36
|
+
* ⚠️ 宿主尚未接入——`hosts/memora-vscode` 零注入点,故实际恒走缺省 `'node'`。
|
|
37
|
+
* 且真解不止「传个路径」:Electron 宿主(VS Code)的
|
|
38
|
+
* `process.execPath` 指向应用二进制,需配 `ELECTRON_RUN_AS_NODE` 一类环境变量才能以
|
|
39
|
+
* node 语义执行 `.mjs` **文件**,而内核只收路径、不收环境(边界铁律:内核不持有平台知识)。
|
|
40
|
+
* ⇒ 真解 = 接口扩展(宿主上报运行时环境,内核零解释转发),留待与宿主 shell 选型同批。
|
|
41
|
+
* 此处保留该可选参数:接入点已就绪,扩展时无须再动调用链。
|
|
42
|
+
*/
|
|
43
|
+
export declare function runSkillScript(scriptPath: string, runtime: ScriptRuntime, args?: string[], timeoutMs?: number, cwd?: string, nodePath?: string): Promise<ScriptExecutionResult>;
|
|
44
|
+
/**
|
|
45
|
+
* 兜底判定:python runtime 在 Windows 下进入兜底链(纯函数,平台参数化可测)
|
|
46
|
+
*
|
|
47
|
+
* @param runtime 脚本运行时
|
|
48
|
+
* @param platform 当前平台(process.platform;参数化便于测试)
|
|
49
|
+
* @returns 是否应进入「py -3 → cmd /c python」兜底链
|
|
50
|
+
*/
|
|
51
|
+
export declare function shouldFallbackPythonToPy(runtime: ScriptRuntime, platform: NodeJS.Platform): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* python 是否不可用(判定「要不要继续走兜底链」)
|
|
54
|
+
*
|
|
55
|
+
* 两种失败形态任一命中即不可用:
|
|
56
|
+
* ① enoent —— spawn 未找到 python 命令(PATH 缺 python / 只装 py 启动器)
|
|
57
|
+
* ② exitCode 9009 —— spawn 命中 Windows Store 空壳启动器 python.exe,它非文件缺失、
|
|
58
|
+
* 而是启动后立即以 9009(Windows「命令未找到」)退出。此形态 spawn 不报 ENOENT、
|
|
59
|
+
* `enoent` 标记为 false,必须靠退出码识别,否则 python 被误判「执行失败」而非「不可用」。
|
|
60
|
+
*
|
|
61
|
+
* @param result 单次执行结果(含 enoent/exitCode 标记)
|
|
62
|
+
* @param platform 当前平台(win32 之外的平台不判 9009——非 Windows「命令未找到」语义)
|
|
63
|
+
*/
|
|
64
|
+
export declare function isPythonUnavailable(result: ScriptExecutionResult & {
|
|
65
|
+
enoent: boolean;
|
|
66
|
+
}, platform: NodeJS.Platform): boolean;
|
|
67
|
+
/** formatExecutionResult 的三态标签配置:前缀与详情文案(run_skill_script / run_code 各自定制) */
|
|
68
|
+
export interface ExecutionResultFormatLabels {
|
|
69
|
+
/** 三态前缀标签('SCRIPT' → [SCRIPT_TIMEOUT]/[SCRIPT_ERROR];'CODE' → [CODE_TIMEOUT]/[CODE_ERROR]) */
|
|
70
|
+
kind: 'SCRIPT' | 'CODE';
|
|
71
|
+
/** 超时详情文案(如「脚本执行超时(超过 120s)」) */
|
|
72
|
+
timeoutDetail: string;
|
|
73
|
+
/** 失败详情文案(如「代码执行失败」) */
|
|
74
|
+
errorDetail: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 执行结果三态格式化(run_skill_script 与 run_code 共用的格式化真理源)
|
|
78
|
+
*
|
|
79
|
+
* 超时 / 非零退出码 / 成功三态;前缀与文案由 labels 定制,成功分支统一
|
|
80
|
+
* 「无输出兜底 + stderr 附加」。stdout/stderr 须由调用方先行净化。
|
|
81
|
+
*
|
|
82
|
+
* @param result 执行结果
|
|
83
|
+
* @param labels 三态前缀标签与详情文案
|
|
84
|
+
* @returns 格式化后的可读字符串(供工具返回值注入 LLM 上下文)
|
|
85
|
+
*/
|
|
86
|
+
export declare function formatExecutionResult(result: CodeExecutionResult, labels: ExecutionResultFormatLabels): string;
|
|
87
|
+
/**
|
|
88
|
+
* 格式化脚本执行结果为可读字符串(供 tool 返回值):formatExecutionResult 的 SCRIPT 变体
|
|
89
|
+
*
|
|
90
|
+
* 超时文案的「超过 Ns」取本次**实际**超时(经 normalizeTimeoutMs 钳制),不再恒写上限 600s:
|
|
91
|
+
* 默认 60s 超时却报「超过 600s」是对 LLM 的谎报,会诱导它盲目调大 timeout_ms 重试。
|
|
92
|
+
*
|
|
93
|
+
* @param result 执行结果
|
|
94
|
+
* @param timeoutMs 本次实际超时(毫秒);省略则用 DEFAULT_TIMEOUT_MS(与执行侧默认同源)
|
|
95
|
+
*/
|
|
96
|
+
export declare function formatScriptResult(result: ScriptExecutionResult, timeoutMs?: number): string;
|
|
97
|
+
//# sourceMappingURL=skillScriptRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillScriptRunner.d.ts","sourceRoot":"","sources":["../../src/skill/skillScriptRunner.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,0DAA0D;AAC1D,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAoBxD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,GACxB,MAAM,GAAG,IAAI,CAaf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,MAAM,EAAO,EACnB,SAAS,GAAE,MAA2B,EACtC,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAgHhC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,GACxB,OAAO,CAET;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,qBAAqB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,EACnD,QAAQ,EAAE,MAAM,CAAC,QAAQ,GACxB,OAAO,CAGT;AAgCD,8EAA8E;AAC9E,MAAM,WAAW,2BAA2B;IAC1C,8FAA8F;IAC9F,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,2BAA2B,GAClC,MAAM,CAaR;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,qBAAqB,EAC7B,SAAS,GAAE,MAA2B,GACrC,MAAM,CAMR"}
|