principles-disciple 1.8.1 → 1.8.3

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.
Files changed (508) hide show
  1. package/ADVANCED_CONFIG_ZH.md +97 -0
  2. package/AGENT_INSTALL.md +173 -0
  3. package/AGENT_INSTALL_EN.md +173 -0
  4. package/INSTALL.md +256 -0
  5. package/SKILL.md +63 -0
  6. package/docs/COMMAND_REFERENCE.md +76 -0
  7. package/docs/COMMAND_REFERENCE_EN.md +79 -0
  8. package/esbuild.config.js +75 -0
  9. package/openclaw.plugin.json +4 -4
  10. package/package.json +11 -13
  11. package/scripts/build-web.mjs +46 -0
  12. package/scripts/install-dependencies.cjs +47 -0
  13. package/scripts/sync-plugin.mjs +802 -0
  14. package/scripts/verify-build.mjs +109 -0
  15. package/src/agents/nocturnal-dreamer.md +152 -0
  16. package/src/agents/nocturnal-philosopher.md +138 -0
  17. package/src/agents/nocturnal-reflector.md +126 -0
  18. package/src/agents/nocturnal-scribe.md +164 -0
  19. package/src/commands/capabilities.ts +85 -0
  20. package/{dist/commands/context.js → src/commands/context.ts} +78 -38
  21. package/src/commands/evolution-status.ts +146 -0
  22. package/src/commands/export.ts +111 -0
  23. package/src/commands/focus.ts +533 -0
  24. package/src/commands/nocturnal-review.ts +311 -0
  25. package/src/commands/nocturnal-rollout.ts +763 -0
  26. package/src/commands/nocturnal-train.ts +1002 -0
  27. package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
  28. package/src/commands/principle-rollback.ts +27 -0
  29. package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
  30. package/src/commands/samples.ts +60 -0
  31. package/src/commands/strategy.ts +38 -0
  32. package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
  33. package/src/commands/workflow-debug.ts +128 -0
  34. package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
  35. package/src/config/errors.ts +163 -0
  36. package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
  37. package/src/constants/diagnostician.ts +66 -0
  38. package/src/constants/tools.ts +62 -0
  39. package/src/core/adaptive-thresholds.ts +476 -0
  40. package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
  41. package/{dist/core/config.js → src/core/config.ts} +158 -46
  42. package/src/core/control-ui-db.ts +435 -0
  43. package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
  44. package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
  45. package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
  46. package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
  47. package/src/core/empathy-keyword-matcher.ts +327 -0
  48. package/src/core/empathy-types.ts +218 -0
  49. package/src/core/event-log.ts +544 -0
  50. package/src/core/evolution-engine.ts +612 -0
  51. package/src/core/evolution-logger.ts +353 -0
  52. package/src/core/evolution-migration.ts +77 -0
  53. package/src/core/evolution-reducer.ts +731 -0
  54. package/src/core/evolution-types.ts +456 -0
  55. package/src/core/external-training-contract.ts +527 -0
  56. package/src/core/focus-history.ts +1458 -0
  57. package/src/core/hygiene/tracker.ts +117 -0
  58. package/{dist/core/init.js → src/core/init.ts} +39 -26
  59. package/src/core/local-worker-routing.ts +617 -0
  60. package/{dist/core/migration.js → src/core/migration.ts} +18 -11
  61. package/src/core/model-deployment-registry.ts +722 -0
  62. package/src/core/model-training-registry.ts +813 -0
  63. package/src/core/nocturnal-arbiter.ts +706 -0
  64. package/src/core/nocturnal-candidate-scoring.ts +392 -0
  65. package/src/core/nocturnal-compliance.ts +1075 -0
  66. package/src/core/nocturnal-dataset.ts +668 -0
  67. package/src/core/nocturnal-executability.ts +428 -0
  68. package/src/core/nocturnal-export.ts +390 -0
  69. package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
  70. package/src/core/nocturnal-trajectory-extractor.ts +484 -0
  71. package/src/core/nocturnal-trinity.ts +1384 -0
  72. package/src/core/pain.ts +122 -0
  73. package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
  74. package/{dist/core/paths.js → src/core/paths.ts} +13 -4
  75. package/src/core/principle-training-state.ts +450 -0
  76. package/src/core/profile.ts +226 -0
  77. package/src/core/promotion-gate.ts +822 -0
  78. package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
  79. package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +175 -62
  80. package/src/core/shadow-observation-registry.ts +534 -0
  81. package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
  82. package/src/core/thinking-models.ts +217 -0
  83. package/src/core/training-program.ts +630 -0
  84. package/src/core/trajectory-types.ts +243 -0
  85. package/src/core/trajectory.ts +1673 -0
  86. package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
  87. package/src/hooks/bash-risk.ts +171 -0
  88. package/src/hooks/edit-verification.ts +295 -0
  89. package/src/hooks/gate-block-helper.ts +160 -0
  90. package/src/hooks/gate.ts +210 -0
  91. package/src/hooks/gfi-gate.ts +177 -0
  92. package/src/hooks/lifecycle.ts +326 -0
  93. package/{dist/hooks/llm.js → src/hooks/llm.ts} +160 -80
  94. package/src/hooks/message-sanitize.ts +45 -0
  95. package/src/hooks/pain.ts +384 -0
  96. package/src/hooks/progressive-trust-gate.ts +174 -0
  97. package/src/hooks/prompt.ts +920 -0
  98. package/src/hooks/subagent.ts +207 -0
  99. package/src/hooks/thinking-checkpoint.ts +73 -0
  100. package/src/hooks/trajectory-collector.ts +290 -0
  101. package/src/http/principles-console-route.ts +716 -0
  102. package/src/i18n/commands.ts +117 -0
  103. package/src/index.ts +694 -0
  104. package/src/service/central-database.ts +831 -0
  105. package/src/service/control-ui-query-service.ts +888 -0
  106. package/src/service/evolution-query-service.ts +405 -0
  107. package/src/service/evolution-worker.ts +1646 -0
  108. package/src/service/health-query-service.ts +836 -0
  109. package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +235 -79
  110. package/src/service/nocturnal-service.ts +1015 -0
  111. package/src/service/nocturnal-target-selector.ts +532 -0
  112. package/src/service/phase3-input-filter.ts +237 -0
  113. package/src/service/runtime-summary-service.ts +757 -0
  114. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
  115. package/{dist/service/subagent-workflow/empathy-observer-workflow-manager.js → src/service/subagent-workflow/empathy-observer-workflow-manager.ts} +240 -117
  116. package/src/service/subagent-workflow/index.ts +51 -0
  117. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
  118. package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
  119. package/{dist/service/subagent-workflow/types.d.ts → src/service/subagent-workflow/types.ts} +137 -18
  120. package/src/service/subagent-workflow/workflow-store.ts +328 -0
  121. package/src/service/trajectory-service.ts +15 -0
  122. package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
  123. package/src/tools/deep-reflect.ts +349 -0
  124. package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
  125. package/src/types/event-types.ts +453 -0
  126. package/src/types/hygiene-types.ts +31 -0
  127. package/src/types/principle-tree-schema.ts +244 -0
  128. package/src/types/runtime-summary.ts +49 -0
  129. package/src/types.ts +74 -0
  130. package/src/utils/file-lock.ts +391 -0
  131. package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
  132. package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
  133. package/src/utils/io.ts +110 -0
  134. package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
  135. package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
  136. package/src/utils/subagent-probe.ts +94 -0
  137. package/templates/langs/en/skills/ai-sprint-orchestration/EXAMPLES.md +63 -0
  138. package/templates/langs/en/skills/ai-sprint-orchestration/REFERENCE.md +136 -0
  139. package/templates/langs/en/skills/ai-sprint-orchestration/SKILL.md +67 -0
  140. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +214 -0
  141. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +107 -0
  142. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +107 -0
  143. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +105 -0
  144. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +108 -0
  145. package/templates/langs/en/skills/ai-sprint-orchestration/references/workflow-v1-acceptance-checklist.md +58 -0
  146. package/templates/langs/en/skills/ai-sprint-orchestration/references/workflow-v1.4-work-unit-handoff.md +190 -0
  147. package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -0
  148. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/archive.mjs +310 -0
  149. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/contract-enforcement.mjs +683 -0
  150. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/decision.mjs +604 -0
  151. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/state-store.mjs +32 -0
  152. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/task-specs.mjs +707 -0
  153. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +3419 -0
  154. package/templates/langs/zh/skills/ai-sprint-orchestration/EXAMPLES.md +63 -0
  155. package/templates/langs/zh/skills/ai-sprint-orchestration/REFERENCE.md +136 -0
  156. package/templates/langs/zh/skills/ai-sprint-orchestration/SKILL.md +67 -0
  157. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +214 -0
  158. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +107 -0
  159. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +107 -0
  160. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +105 -0
  161. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +108 -0
  162. package/templates/langs/zh/skills/ai-sprint-orchestration/references/workflow-v1-acceptance-checklist.md +58 -0
  163. package/templates/langs/zh/skills/ai-sprint-orchestration/references/workflow-v1.4-work-unit-handoff.md +190 -0
  164. package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -0
  165. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/archive.mjs +310 -0
  166. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/contract-enforcement.mjs +683 -0
  167. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/decision.mjs +604 -0
  168. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/state-store.mjs +32 -0
  169. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/task-specs.mjs +707 -0
  170. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +3419 -0
  171. package/templates/langs/zh/skills/ai-sprint-orchestration/test/archive.test.mjs +230 -0
  172. package/templates/langs/zh/skills/ai-sprint-orchestration/test/contract-enforcement.test.mjs +672 -0
  173. package/templates/langs/zh/skills/ai-sprint-orchestration/test/decision.test.mjs +1321 -0
  174. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +1419 -0
  175. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
  176. package/templates/pain_settings.json +2 -1
  177. package/tests/README.md +120 -0
  178. package/tests/build-artifacts.test.ts +111 -0
  179. package/tests/commands/evolution-status.test.ts +222 -0
  180. package/tests/commands/evolver.test.ts +22 -0
  181. package/tests/commands/export.test.ts +78 -0
  182. package/tests/commands/nocturnal-review.test.ts +448 -0
  183. package/tests/commands/nocturnal-train.test.ts +97 -0
  184. package/tests/commands/pain.test.ts +108 -0
  185. package/tests/commands/samples.test.ts +65 -0
  186. package/tests/commands/strategy.test.ts +34 -0
  187. package/tests/commands/thinking-os.test.ts +88 -0
  188. package/tests/core/adaptive-thresholds.test.ts +261 -0
  189. package/tests/core/config-service.test.ts +89 -0
  190. package/tests/core/config.test.ts +90 -0
  191. package/tests/core/control-ui-db.test.ts +75 -0
  192. package/tests/core/core-template-guidance.test.ts +21 -0
  193. package/tests/core/detection-funnel.test.ts +63 -0
  194. package/tests/core/detection-service.test.ts +50 -0
  195. package/tests/core/dictionary-service.test.ts +116 -0
  196. package/tests/core/dictionary.test.ts +168 -0
  197. package/tests/core/empathy-keyword-matcher.test.ts +209 -0
  198. package/tests/core/event-log.test.ts +181 -0
  199. package/tests/core/evolution-e2e.test.ts +58 -0
  200. package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
  201. package/tests/core/evolution-engine.test.ts +562 -0
  202. package/tests/core/evolution-logger.test.ts +148 -0
  203. package/tests/core/evolution-migration.test.ts +50 -0
  204. package/tests/core/evolution-paths.test.ts +21 -0
  205. package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
  206. package/tests/core/evolution-reducer.test.ts +180 -0
  207. package/tests/core/evolution-types-loop.test.ts +48 -0
  208. package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
  209. package/tests/core/external-training-contract.test.ts +463 -0
  210. package/tests/core/focus-history.test.ts +682 -0
  211. package/tests/core/init-flatten.test.ts +69 -0
  212. package/tests/core/init-refactor.test.ts +87 -0
  213. package/tests/core/init-v1.3.test.ts +46 -0
  214. package/tests/core/init.test.ts +190 -0
  215. package/tests/core/local-worker-routing.test.ts +757 -0
  216. package/tests/core/migration.test.ts +84 -0
  217. package/tests/core/model-deployment-registry.test.ts +845 -0
  218. package/tests/core/model-training-registry.test.ts +889 -0
  219. package/tests/core/nocturnal-arbiter.test.ts +494 -0
  220. package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
  221. package/tests/core/nocturnal-compliance.test.ts +646 -0
  222. package/tests/core/nocturnal-dataset.test.ts +892 -0
  223. package/tests/core/nocturnal-executability.test.ts +357 -0
  224. package/tests/core/nocturnal-export.test.ts +462 -0
  225. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
  226. package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
  227. package/tests/core/nocturnal-trinity.test.ts +953 -0
  228. package/tests/core/pain.test.ts +33 -0
  229. package/tests/core/path-resolver.test.ts +57 -0
  230. package/tests/core/paths-refactor.test.ts +42 -0
  231. package/tests/core/phase7-rollout-integration.test.ts +477 -0
  232. package/tests/core/principle-training-state.test.ts +712 -0
  233. package/tests/core/profile.test.ts +56 -0
  234. package/tests/core/promotion-gate.test.ts +556 -0
  235. package/tests/core/risk-calculator.test.ts +168 -0
  236. package/tests/core/session-tracker.test.ts +191 -0
  237. package/tests/core/training-program.test.ts +472 -0
  238. package/tests/core/trajectory.test.ts +265 -0
  239. package/tests/core/workspace-context-factory.test.ts +18 -0
  240. package/tests/core/workspace-context.test.ts +134 -0
  241. package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
  242. package/tests/fixtures/production-compatibility.test.ts +147 -0
  243. package/tests/fixtures/production-mock-generator.ts +282 -0
  244. package/tests/hooks/bash-risk-integration.test.ts +137 -0
  245. package/tests/hooks/bash-risk.test.ts +81 -0
  246. package/tests/hooks/edit-verification.test.ts +678 -0
  247. package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
  248. package/tests/hooks/gate-edit-verification.test.ts +435 -0
  249. package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
  250. package/tests/hooks/gate.test.ts +271 -0
  251. package/tests/hooks/gfi-gate-unit.test.ts +422 -0
  252. package/tests/hooks/gfi-gate.test.ts +669 -0
  253. package/tests/hooks/lifecycle.test.ts +248 -0
  254. package/tests/hooks/llm.test.ts +308 -0
  255. package/tests/hooks/message-sanitize.test.ts +36 -0
  256. package/tests/hooks/pain.test.ts +141 -0
  257. package/tests/hooks/progressive-trust-gate.test.ts +277 -0
  258. package/tests/hooks/prompt.test.ts +1411 -0
  259. package/tests/hooks/subagent.test.ts +467 -0
  260. package/tests/hooks/thinking-gate.test.ts +313 -0
  261. package/tests/http/principles-console-route.test.ts +140 -0
  262. package/tests/hygiene-tracker.test.ts +77 -0
  263. package/tests/index.integration.test.ts +179 -0
  264. package/tests/index.shadow-routing.integration.test.ts +140 -0
  265. package/tests/index.test.ts +9 -0
  266. package/tests/integration/empathy-workflow-integration.test.ts +627 -0
  267. package/tests/service/control-ui-query-service.test.ts +121 -0
  268. package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
  269. package/tests/service/evolution-worker.test.ts +585 -0
  270. package/tests/service/nocturnal-runtime.test.ts +470 -0
  271. package/tests/service/nocturnal-service.test.ts +577 -0
  272. package/tests/service/nocturnal-target-selector.test.ts +615 -0
  273. package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
  274. package/tests/service/phase3-input-filter.test.ts +289 -0
  275. package/tests/service/runtime-summary-service.test.ts +919 -0
  276. package/tests/task-compliance.test.ts +166 -0
  277. package/tests/test-utils.ts +48 -0
  278. package/tests/tools/critique-prompt.test.ts +260 -0
  279. package/tests/tools/deep-reflect.test.ts +232 -0
  280. package/tests/tools/model-index.test.ts +246 -0
  281. package/tests/ui/app.test.tsx +114 -0
  282. package/tests/utils/file-lock.test.ts +407 -0
  283. package/tests/utils/hashing.test.ts +32 -0
  284. package/tests/utils/io.test.ts +39 -0
  285. package/tests/utils/nlp.test.ts +53 -0
  286. package/tests/utils/plugin-logger.test.ts +156 -0
  287. package/tsconfig.json +16 -0
  288. package/tsconfig.tsbuildinfo +1 -0
  289. package/ui/src/App.tsx +45 -0
  290. package/ui/src/api.ts +216 -0
  291. package/ui/src/charts.tsx +586 -0
  292. package/ui/src/components/ErrorState.tsx +6 -0
  293. package/ui/src/components/Loading.tsx +13 -0
  294. package/ui/src/components/ProtectedRoute.tsx +12 -0
  295. package/ui/src/components/Shell.tsx +91 -0
  296. package/ui/src/components/WorkspaceConfig.tsx +146 -0
  297. package/ui/src/components/index.ts +5 -0
  298. package/ui/src/context/auth.tsx +80 -0
  299. package/ui/src/context/theme.tsx +66 -0
  300. package/ui/src/hooks/useAutoRefresh.ts +39 -0
  301. package/ui/src/i18n/ui.ts +363 -0
  302. package/ui/src/main.tsx +16 -0
  303. package/ui/src/pages/EvolutionPage.tsx +352 -0
  304. package/ui/src/pages/FeedbackPage.tsx +140 -0
  305. package/ui/src/pages/GateMonitorPage.tsx +136 -0
  306. package/ui/src/pages/LoginPage.tsx +88 -0
  307. package/ui/src/pages/OverviewPage.tsx +238 -0
  308. package/ui/src/pages/SamplesPage.tsx +174 -0
  309. package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
  310. package/ui/src/styles.css +1661 -0
  311. package/ui/src/types.ts +368 -0
  312. package/ui/src/utils/format.ts +15 -0
  313. package/vitest.config.ts +23 -0
  314. package/dist/commands/capabilities.d.ts +0 -3
  315. package/dist/commands/capabilities.js +0 -73
  316. package/dist/commands/context.d.ts +0 -5
  317. package/dist/commands/evolution-status.d.ts +0 -4
  318. package/dist/commands/evolution-status.js +0 -117
  319. package/dist/commands/evolver.d.ts +0 -9
  320. package/dist/commands/evolver.js +0 -26
  321. package/dist/commands/export.d.ts +0 -2
  322. package/dist/commands/export.js +0 -98
  323. package/dist/commands/focus.d.ts +0 -14
  324. package/dist/commands/focus.js +0 -457
  325. package/dist/commands/nocturnal-review.d.ts +0 -24
  326. package/dist/commands/nocturnal-review.js +0 -265
  327. package/dist/commands/nocturnal-rollout.d.ts +0 -27
  328. package/dist/commands/nocturnal-rollout.js +0 -671
  329. package/dist/commands/nocturnal-train.d.ts +0 -25
  330. package/dist/commands/nocturnal-train.js +0 -919
  331. package/dist/commands/pain.d.ts +0 -5
  332. package/dist/commands/principle-rollback.d.ts +0 -4
  333. package/dist/commands/principle-rollback.js +0 -22
  334. package/dist/commands/rollback.d.ts +0 -19
  335. package/dist/commands/samples.d.ts +0 -2
  336. package/dist/commands/samples.js +0 -55
  337. package/dist/commands/strategy.d.ts +0 -3
  338. package/dist/commands/strategy.js +0 -29
  339. package/dist/commands/thinking-os.d.ts +0 -2
  340. package/dist/config/defaults/runtime.d.ts +0 -40
  341. package/dist/config/errors.d.ts +0 -84
  342. package/dist/config/errors.js +0 -94
  343. package/dist/config/index.js +0 -7
  344. package/dist/constants/diagnostician.d.ts +0 -12
  345. package/dist/constants/diagnostician.js +0 -56
  346. package/dist/constants/tools.d.ts +0 -17
  347. package/dist/constants/tools.js +0 -54
  348. package/dist/core/adaptive-thresholds.d.ts +0 -186
  349. package/dist/core/adaptive-thresholds.js +0 -300
  350. package/dist/core/config-service.d.ts +0 -15
  351. package/dist/core/config.d.ts +0 -129
  352. package/dist/core/control-ui-db.d.ts +0 -95
  353. package/dist/core/control-ui-db.js +0 -292
  354. package/dist/core/detection-funnel.d.ts +0 -33
  355. package/dist/core/detection-service.d.ts +0 -15
  356. package/dist/core/dictionary-service.d.ts +0 -15
  357. package/dist/core/dictionary.d.ts +0 -38
  358. package/dist/core/event-log.d.ts +0 -82
  359. package/dist/core/event-log.js +0 -463
  360. package/dist/core/evolution-engine.d.ts +0 -118
  361. package/dist/core/evolution-engine.js +0 -464
  362. package/dist/core/evolution-logger.d.ts +0 -137
  363. package/dist/core/evolution-logger.js +0 -256
  364. package/dist/core/evolution-migration.d.ts +0 -5
  365. package/dist/core/evolution-migration.js +0 -65
  366. package/dist/core/evolution-reducer.d.ts +0 -98
  367. package/dist/core/evolution-reducer.js +0 -465
  368. package/dist/core/evolution-types.d.ts +0 -287
  369. package/dist/core/evolution-types.js +0 -78
  370. package/dist/core/external-training-contract.d.ts +0 -276
  371. package/dist/core/external-training-contract.js +0 -269
  372. package/dist/core/focus-history.d.ts +0 -210
  373. package/dist/core/focus-history.js +0 -1185
  374. package/dist/core/hygiene/tracker.d.ts +0 -22
  375. package/dist/core/hygiene/tracker.js +0 -106
  376. package/dist/core/init.d.ts +0 -12
  377. package/dist/core/local-worker-routing.d.ts +0 -175
  378. package/dist/core/local-worker-routing.js +0 -525
  379. package/dist/core/migration.d.ts +0 -6
  380. package/dist/core/model-deployment-registry.d.ts +0 -218
  381. package/dist/core/model-deployment-registry.js +0 -503
  382. package/dist/core/model-training-registry.d.ts +0 -295
  383. package/dist/core/model-training-registry.js +0 -475
  384. package/dist/core/nocturnal-arbiter.d.ts +0 -159
  385. package/dist/core/nocturnal-arbiter.js +0 -534
  386. package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
  387. package/dist/core/nocturnal-candidate-scoring.js +0 -266
  388. package/dist/core/nocturnal-compliance.d.ts +0 -175
  389. package/dist/core/nocturnal-compliance.js +0 -824
  390. package/dist/core/nocturnal-dataset.d.ts +0 -224
  391. package/dist/core/nocturnal-dataset.js +0 -443
  392. package/dist/core/nocturnal-executability.d.ts +0 -85
  393. package/dist/core/nocturnal-executability.js +0 -331
  394. package/dist/core/nocturnal-export.d.ts +0 -124
  395. package/dist/core/nocturnal-export.js +0 -275
  396. package/dist/core/nocturnal-paths.d.ts +0 -124
  397. package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
  398. package/dist/core/nocturnal-trajectory-extractor.js +0 -307
  399. package/dist/core/nocturnal-trinity.d.ts +0 -311
  400. package/dist/core/nocturnal-trinity.js +0 -880
  401. package/dist/core/pain.d.ts +0 -4
  402. package/dist/core/pain.js +0 -70
  403. package/dist/core/path-resolver.d.ts +0 -46
  404. package/dist/core/paths.d.ts +0 -65
  405. package/dist/core/principle-training-state.d.ts +0 -121
  406. package/dist/core/principle-training-state.js +0 -321
  407. package/dist/core/profile.d.ts +0 -62
  408. package/dist/core/profile.js +0 -210
  409. package/dist/core/promotion-gate.d.ts +0 -238
  410. package/dist/core/promotion-gate.js +0 -529
  411. package/dist/core/risk-calculator.d.ts +0 -22
  412. package/dist/core/session-tracker.d.ts +0 -101
  413. package/dist/core/shadow-observation-registry.d.ts +0 -217
  414. package/dist/core/shadow-observation-registry.js +0 -308
  415. package/dist/core/system-logger.d.ts +0 -8
  416. package/dist/core/thinking-models.d.ts +0 -38
  417. package/dist/core/thinking-models.js +0 -170
  418. package/dist/core/training-program.d.ts +0 -233
  419. package/dist/core/training-program.js +0 -433
  420. package/dist/core/trajectory.d.ts +0 -411
  421. package/dist/core/trajectory.js +0 -1307
  422. package/dist/core/workspace-context.d.ts +0 -71
  423. package/dist/hooks/bash-risk.d.ts +0 -57
  424. package/dist/hooks/bash-risk.js +0 -137
  425. package/dist/hooks/edit-verification.d.ts +0 -62
  426. package/dist/hooks/edit-verification.js +0 -256
  427. package/dist/hooks/gate-block-helper.d.ts +0 -44
  428. package/dist/hooks/gate-block-helper.js +0 -119
  429. package/dist/hooks/gate.d.ts +0 -24
  430. package/dist/hooks/gate.js +0 -173
  431. package/dist/hooks/gfi-gate.d.ts +0 -40
  432. package/dist/hooks/gfi-gate.js +0 -113
  433. package/dist/hooks/lifecycle.d.ts +0 -5
  434. package/dist/hooks/lifecycle.js +0 -284
  435. package/dist/hooks/llm.d.ts +0 -13
  436. package/dist/hooks/message-sanitize.d.ts +0 -3
  437. package/dist/hooks/message-sanitize.js +0 -37
  438. package/dist/hooks/pain.d.ts +0 -5
  439. package/dist/hooks/pain.js +0 -301
  440. package/dist/hooks/progressive-trust-gate.d.ts +0 -52
  441. package/dist/hooks/progressive-trust-gate.js +0 -134
  442. package/dist/hooks/prompt.d.ts +0 -49
  443. package/dist/hooks/prompt.js +0 -905
  444. package/dist/hooks/subagent.d.ts +0 -10
  445. package/dist/hooks/subagent.js +0 -387
  446. package/dist/hooks/thinking-checkpoint.d.ts +0 -37
  447. package/dist/hooks/thinking-checkpoint.js +0 -51
  448. package/dist/hooks/trajectory-collector.d.ts +0 -32
  449. package/dist/hooks/trajectory-collector.js +0 -256
  450. package/dist/http/principles-console-route.d.ts +0 -9
  451. package/dist/http/principles-console-route.js +0 -681
  452. package/dist/i18n/commands.d.ts +0 -26
  453. package/dist/i18n/commands.js +0 -116
  454. package/dist/index.d.ts +0 -7
  455. package/dist/index.js +0 -581
  456. package/dist/service/central-database.d.ts +0 -104
  457. package/dist/service/central-database.js +0 -649
  458. package/dist/service/control-ui-query-service.d.ts +0 -221
  459. package/dist/service/control-ui-query-service.js +0 -543
  460. package/dist/service/empathy-observer-manager.d.ts +0 -88
  461. package/dist/service/empathy-observer-manager.js +0 -414
  462. package/dist/service/evolution-query-service.d.ts +0 -155
  463. package/dist/service/evolution-query-service.js +0 -258
  464. package/dist/service/evolution-worker.d.ts +0 -101
  465. package/dist/service/evolution-worker.js +0 -975
  466. package/dist/service/health-query-service.d.ts +0 -170
  467. package/dist/service/health-query-service.js +0 -662
  468. package/dist/service/nocturnal-runtime.d.ts +0 -183
  469. package/dist/service/nocturnal-service.d.ts +0 -163
  470. package/dist/service/nocturnal-service.js +0 -787
  471. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  472. package/dist/service/nocturnal-target-selector.js +0 -315
  473. package/dist/service/phase3-input-filter.d.ts +0 -73
  474. package/dist/service/phase3-input-filter.js +0 -172
  475. package/dist/service/runtime-summary-service.d.ts +0 -122
  476. package/dist/service/runtime-summary-service.js +0 -485
  477. package/dist/service/subagent-workflow/empathy-observer-workflow-manager.d.ts +0 -48
  478. package/dist/service/subagent-workflow/index.d.ts +0 -4
  479. package/dist/service/subagent-workflow/index.js +0 -3
  480. package/dist/service/subagent-workflow/runtime-direct-driver.d.ts +0 -77
  481. package/dist/service/subagent-workflow/runtime-direct-driver.js +0 -75
  482. package/dist/service/subagent-workflow/types.js +0 -11
  483. package/dist/service/subagent-workflow/workflow-store.d.ts +0 -26
  484. package/dist/service/subagent-workflow/workflow-store.js +0 -165
  485. package/dist/service/trajectory-service.d.ts +0 -2
  486. package/dist/service/trajectory-service.js +0 -15
  487. package/dist/tools/critique-prompt.d.ts +0 -14
  488. package/dist/tools/deep-reflect.d.ts +0 -39
  489. package/dist/tools/deep-reflect.js +0 -350
  490. package/dist/tools/model-index.d.ts +0 -9
  491. package/dist/types/event-types.d.ts +0 -306
  492. package/dist/types/event-types.js +0 -106
  493. package/dist/types/hygiene-types.d.ts +0 -20
  494. package/dist/types/hygiene-types.js +0 -12
  495. package/dist/types/runtime-summary.d.ts +0 -47
  496. package/dist/types/runtime-summary.js +0 -1
  497. package/dist/types.d.ts +0 -50
  498. package/dist/types.js +0 -22
  499. package/dist/utils/file-lock.d.ts +0 -71
  500. package/dist/utils/file-lock.js +0 -309
  501. package/dist/utils/glob-match.d.ts +0 -28
  502. package/dist/utils/hashing.d.ts +0 -9
  503. package/dist/utils/io.d.ts +0 -6
  504. package/dist/utils/io.js +0 -106
  505. package/dist/utils/nlp.d.ts +0 -9
  506. package/dist/utils/plugin-logger.d.ts +0 -39
  507. package/dist/utils/subagent-probe.d.ts +0 -34
  508. package/dist/utils/subagent-probe.js +0 -81
@@ -0,0 +1,349 @@
1
+ import type { OpenClawPluginApi } from '../openclaw-sdk.js';
2
+ import { Type } from '@sinclair/typebox';
3
+ import * as fs from 'fs';
4
+ import * as path from 'node:path';
5
+ import { EventLogService } from '../core/event-log.js';
6
+ import { buildCritiquePromptV2 } from './critique-prompt.js';
7
+ import { resolvePdPath } from '../core/paths.js';
8
+ import { resolveWorkspaceDirFromApi } from '../core/path-resolver.js';
9
+ import { reflectionLogRetentionDays } from '../types.js';
10
+ import {
11
+ DeepReflectWorkflowManager,
12
+ deepReflectWorkflowSpec,
13
+ type DeepReflectTaskInput,
14
+ } from '../service/subagent-workflow/index.js';
15
+
16
+ function writeToReflectionLog(
17
+ workspaceDir: string,
18
+ context: string,
19
+ insights: string,
20
+ modelId?: string,
21
+ depth?: number
22
+ ): void {
23
+ const reflectionLogPath = resolvePdPath(workspaceDir, 'REFLECTION_LOG');
24
+ const memoryDir = path.dirname(reflectionLogPath);
25
+ if (!fs.existsSync(memoryDir)) {
26
+ fs.mkdirSync(memoryDir, { recursive: true });
27
+ }
28
+
29
+ const timestamp = new Date().toISOString();
30
+ const entry = `
31
+ ---
32
+ ## Reflection at ${timestamp}
33
+ **Model**: ${modelId || 'auto-select'}
34
+ **Depth**: ${depth || 2}
35
+
36
+ ### Context
37
+ ${context.substring(0, 500)}${context.length > 500 ? '...' : ''}
38
+
39
+ ### Insights
40
+ ${insights}
41
+
42
+ `;
43
+
44
+ const header = `# Reflection Log\n\n> Auto-generated by Deep Reflection Tool\n> Retention: ${reflectionLogRetentionDays} days\n`;
45
+
46
+ let existingContent = '';
47
+ if (fs.existsSync(reflectionLogPath)) {
48
+ existingContent = fs.readFileSync(reflectionLogPath, 'utf8');
49
+ }
50
+
51
+ const newContent = header + entry + existingContent.replace(header, '');
52
+
53
+ const tempPath = `${reflectionLogPath}.tmp`;
54
+ fs.writeFileSync(tempPath, newContent, 'utf8');
55
+ fs.renameSync(tempPath, reflectionLogPath);
56
+ }
57
+
58
+ function cleanupReflectionLog(workspaceDir: string): void {
59
+ const reflectionLogPath = resolvePdPath(workspaceDir, 'REFLECTION_LOG');
60
+
61
+ if (!fs.existsSync(reflectionLogPath)) return;
62
+
63
+ const content = fs.readFileSync(reflectionLogPath, 'utf8');
64
+ const cutoffDate = new Date();
65
+ cutoffDate.setDate(cutoffDate.getDate() - reflectionLogRetentionDays);
66
+
67
+ const entryPattern = /---\n## Reflection at (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})/g;
68
+ const parts = content.split(entryPattern);
69
+
70
+ const header = parts[0];
71
+ const validEntries: string[] = [];
72
+
73
+ for (let i = 1; i < parts.length; i += 2) {
74
+ const timestamp = parts[i];
75
+ const entryContent = parts[i + 1] || '';
76
+
77
+ const entryDate = new Date(timestamp);
78
+ if (entryDate >= cutoffDate) {
79
+ validEntries.push(`---\n## Reflection at ${timestamp}${entryContent}`);
80
+ }
81
+ }
82
+
83
+ if (validEntries.length < (parts.length - 1) / 2) {
84
+ const newContent = header + validEntries.join('');
85
+
86
+ const tempPath = `${reflectionLogPath}.tmp`;
87
+ fs.writeFileSync(tempPath, newContent, 'utf8');
88
+ fs.renameSync(tempPath, reflectionLogPath);
89
+ }
90
+ }
91
+
92
+ interface DeepReflectionConfig {
93
+ enabled: boolean;
94
+ mode: 'auto' | 'forced' | 'disabled';
95
+ auto_trigger_conditions: {
96
+ min_tool_calls: number;
97
+ error_rate_threshold: number;
98
+ high_gfi_threshold: number;
99
+ };
100
+ modelsDir?: string;
101
+ timeout_ms?: number;
102
+ }
103
+
104
+ const DEFAULT_CONFIG: DeepReflectionConfig = {
105
+ enabled: true,
106
+ mode: 'auto',
107
+ auto_trigger_conditions: {
108
+ min_tool_calls: 5,
109
+ error_rate_threshold: 0.3,
110
+ high_gfi_threshold: 70
111
+ },
112
+ timeout_ms: 60000
113
+ };
114
+
115
+ function safeLog(
116
+ api: OpenClawPluginApi | undefined,
117
+ level: 'info' | 'debug' | 'warn' | 'error',
118
+ message: string
119
+ ): void {
120
+ try {
121
+ if (api?.logger && typeof api.logger[level] === 'function') {
122
+ api.logger[level](message);
123
+ }
124
+ } catch {
125
+ // Never recurse on logger failures
126
+ }
127
+ }
128
+
129
+ function loadConfig(workspaceDir: string | undefined, api: OpenClawPluginApi): DeepReflectionConfig {
130
+ if (!workspaceDir) return DEFAULT_CONFIG;
131
+ const configPath = resolvePdPath(workspaceDir, 'PAIN_SETTINGS');
132
+ try {
133
+ if (fs.existsSync(configPath)) {
134
+ const raw = fs.readFileSync(configPath, 'utf-8');
135
+ const settings = JSON.parse(raw);
136
+ return { ...DEFAULT_CONFIG, ...settings.deep_reflection };
137
+ }
138
+ } catch (err) {
139
+ safeLog(api, 'warn', `[DeepReflect] Failed to load config: ${String(err)}`);
140
+ }
141
+ return DEFAULT_CONFIG;
142
+ }
143
+
144
+ function readStringParam(rawParams: Record<string, unknown>, key: string): string | undefined {
145
+ const value = rawParams[key];
146
+ if (typeof value === 'string') return value.trim() || undefined;
147
+
148
+ const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();
149
+ const snakeValue = rawParams[snakeKey];
150
+ if (typeof snakeValue === 'string') return snakeValue.trim() || undefined;
151
+
152
+ return undefined;
153
+ }
154
+
155
+ function readNumberParam(rawParams: Record<string, unknown>, key: string): number | undefined {
156
+ const value = rawParams[key];
157
+ if (typeof value === 'number') return value;
158
+
159
+ const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();
160
+ const snakeValue = rawParams[snakeKey];
161
+ if (typeof snakeValue === 'number') return snakeValue;
162
+
163
+ return undefined;
164
+ }
165
+
166
+ export function createDeepReflectTool(api: OpenClawPluginApi) {
167
+ return {
168
+ name: 'deep_reflect',
169
+ description: '执行深层次的元认知反思,分析当前任务的潜在风险、逻辑漏洞或架构改进点。',
170
+ parameters: Type.Object({
171
+ context: Type.String({ description: '需要反思的任务上下文、代码片段或当前遇到的困难。' }),
172
+ depth: Type.Optional(Type.Number({ description: '反思深度 (1-3)。1: 快速扫描, 2: 均衡分析, 3: 彻底解构。默认为 2。', minimum: 1, maximum: 3 })),
173
+ model_id: Type.Optional(Type.String({ description: '可选:强制指定使用的思维模型 ID。' }))
174
+ }),
175
+
176
+ async execute(
177
+ _toolCallId: string,
178
+ rawParams: Record<string, unknown>
179
+ ): Promise<{ content: Array<{ type: string; text: string }> }> {
180
+ const context = readStringParam(rawParams, 'context') || '';
181
+ const depth = readNumberParam(rawParams, 'depth') ?? 2;
182
+ const model_id = readStringParam(rawParams, 'model_id');
183
+
184
+ if (!context) {
185
+ return {
186
+ content: [{
187
+ type: 'text',
188
+ text: '❌ 错误: 必须提供反思上下文 (context)。'
189
+ }]
190
+ };
191
+ }
192
+
193
+ const effectiveWorkspaceDir =
194
+ (api.config?.workspaceDir as string)
195
+ || resolveWorkspaceDirFromApi(api)
196
+ || api.resolvePath?.('.');
197
+
198
+ if (!effectiveWorkspaceDir) {
199
+ return {
200
+ content: [{
201
+ type: 'text',
202
+ text: '❌ 反思执行失败: Workspace directory is required for deep reflection。请检查 API 配置或网络连接。'
203
+ }]
204
+ };
205
+ }
206
+
207
+ const config = loadConfig(effectiveWorkspaceDir, api);
208
+ if (config.mode === 'disabled' || !config.enabled) {
209
+ return {
210
+ content: [{
211
+ type: 'text',
212
+ text: '⏭️ Deep Reflection 已禁用。'
213
+ }]
214
+ };
215
+ }
216
+
217
+ if (model_id) {
218
+ safeLog(api, 'warn', `[DeepReflect] The 'model_id' parameter is deprecated. The agent will now auto-select models based on the context index.`);
219
+ }
220
+
221
+ const stateDir = resolvePdPath(effectiveWorkspaceDir, 'STATE_DIR');
222
+ const eventLog = EventLogService.get(stateDir, api.logger);
223
+
224
+ try {
225
+ // Use workspaceDir as parentSessionId proxy (OpenClaw does not expose sessionId to tools)
226
+ const parentSessionId = effectiveWorkspaceDir.replace(/[^a-zA-Z0-9_-]/g, '_').substring(0, 64);
227
+
228
+ const manager = new DeepReflectWorkflowManager({
229
+ workspaceDir: effectiveWorkspaceDir,
230
+ logger: api.logger,
231
+ subagent: api.runtime.subagent as any,
232
+ });
233
+
234
+ const taskInput: DeepReflectTaskInput = { context, depth, model_id };
235
+
236
+ const handle = await manager.startWorkflow(deepReflectWorkflowSpec, {
237
+ parentSessionId,
238
+ workspaceDir: effectiveWorkspaceDir,
239
+ taskInput,
240
+ });
241
+
242
+ // Wait for workflow completion via polling
243
+ const startTime = Date.now();
244
+ const timeoutMs = config.timeout_ms ?? 60000;
245
+ const pollInterval = 500;
246
+
247
+ while (Date.now() - startTime < timeoutMs) {
248
+ await new Promise(resolve => setTimeout(resolve, pollInterval));
249
+ const workflow = (manager as any).store.getWorkflow(handle.workflowId);
250
+ if (!workflow) break;
251
+
252
+ if (workflow.state === 'completed') {
253
+ // Extract insights from reflection log (written by persistResult)
254
+ const reflectionLogPath = resolvePdPath(effectiveWorkspaceDir, 'REFLECTION_LOG');
255
+ let insights = '';
256
+ if (fs.existsSync(reflectionLogPath)) {
257
+ const content = fs.readFileSync(reflectionLogPath, 'utf8');
258
+ // Extract most recent entry
259
+ const match = content.match(/### Insights\n([\s\S]*?)(?=---|$)/);
260
+ if (match) {
261
+ insights = match[1].trim();
262
+ }
263
+ }
264
+
265
+ if (eventLog) {
266
+ eventLog.recordDeepReflection(handle.childSessionKey, {
267
+ modelId: model_id || 'auto-select',
268
+ modelSelectionMode: model_id ? 'manual' : 'auto',
269
+ depth,
270
+ contextPreview: context.substring(0, 200),
271
+ resultPreview: insights.substring(0, 300),
272
+ durationMs: Date.now() - startTime,
273
+ passed: true,
274
+ timeout: false
275
+ });
276
+ }
277
+
278
+ manager.dispose();
279
+
280
+ return {
281
+ content: [{
282
+ type: 'text',
283
+ text: `
284
+ # 💎 Deep Reflection Insights
285
+ ---
286
+ **Selected Model(s)**: ${model_id || 'auto-select'}
287
+ **Reflection Depth**: ${depth}
288
+ **Analysis Duration**: ${((Date.now() - startTime) / 1000).toFixed(1)}s
289
+
290
+ ${insights || '反思完成,详见 REFLECTION_LOG。'}
291
+
292
+ ---
293
+ *Generated by Principles Disciple Meta-Cognitive Engine*
294
+ `.trim()
295
+ }]
296
+ };
297
+ }
298
+
299
+ if (workflow.state === 'terminal_error' || workflow.state === 'expired') {
300
+ manager.dispose();
301
+ throw new Error(`Deep-reflect workflow failed: ${workflow.state}`);
302
+ }
303
+ }
304
+
305
+ manager.dispose();
306
+ return {
307
+ content: [{
308
+ type: 'text',
309
+ text: '⚠️ 反思任务执行超时。你可以尝试减少上下文长度或增加深度。'
310
+ }]
311
+ };
312
+
313
+ } catch (err) {
314
+ const errorMsg = err instanceof Error ? err.message : String(err);
315
+ safeLog(api, 'error', `[DeepReflect] Reflection failed: ${errorMsg}`);
316
+
317
+ if (eventLog) {
318
+ eventLog.recordDeepReflection('deep-reflect-error', {
319
+ modelId: model_id || 'auto-select',
320
+ modelSelectionMode: model_id ? 'manual' : 'auto',
321
+ depth,
322
+ contextPreview: context.substring(0, 200),
323
+ durationMs: 0,
324
+ passed: false,
325
+ timeout: errorMsg.toLowerCase().includes('timeout'),
326
+ error: errorMsg
327
+ });
328
+ }
329
+
330
+ return {
331
+ content: [{
332
+ type: 'text',
333
+ text: `❌ 反思执行失败: ${errorMsg}。请检查 API 配置或网络连接。`
334
+ }]
335
+ };
336
+ }
337
+ }
338
+ };
339
+ }
340
+
341
+ export const deepReflectTool = {
342
+ name: 'deep_reflect',
343
+ description: '执行深层次的元认知反思,分析当前任务的潜在风险、逻辑漏洞或架构改进点。',
344
+ parameters: Type.Object({
345
+ context: Type.String({ description: '需要反思的任务上下文、代码片段或当前遇到的困难。' }),
346
+ depth: Type.Optional(Type.Number({ description: '反思深度 (1-3)。1: 快速扫描, 2: 均衡分析, 3: 彻底解构。默认为 2。', minimum: 1, maximum: 3 })),
347
+ model_id: Type.Optional(Type.String({ description: '可选:强制指定使用的思维模型 ID。' }))
348
+ }),
349
+ };
@@ -1,81 +1,97 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
+ import type { OpenClawPluginApi } from '../openclaw-sdk.js';
3
4
  import { WorkspaceContext } from '../core/workspace-context.js';
5
+
4
6
  // 安全日志函数
5
- function safeLog(api, level, message) {
7
+ function safeLog(
8
+ api: OpenClawPluginApi | undefined,
9
+ level: 'info' | 'debug' | 'warn' | 'error',
10
+ message: string
11
+ ): void {
6
12
  try {
7
13
  if (api?.logger && typeof api.logger[level] === 'function') {
8
14
  api.logger[level](message);
9
15
  }
10
- }
11
- catch {
16
+ } catch {
12
17
  // Ignore logging errors
13
18
  }
14
19
  }
20
+
15
21
  /**
16
22
  * 默认消息
17
23
  */
18
24
  const DEFAULT_MESSAGE = '(暂无扩展思维模型)';
25
+
19
26
  /**
20
27
  * 索引文件最大大小(字节)
21
28
  */
22
29
  const MAX_INDEX_SIZE = 50 * 1024; // 50KB
30
+
23
31
  /**
24
32
  * 加载自定义配置
25
33
  */
26
- function loadCustomConfig(wctx) {
34
+ function loadCustomConfig(wctx: WorkspaceContext): { modelsDir?: string } | undefined {
27
35
  try {
28
36
  const config = wctx.config;
29
37
  const modelsDir = config.get('deep_reflection.modelsDir');
30
38
  if (typeof modelsDir === 'string' && modelsDir.trim()) {
31
39
  return { modelsDir: modelsDir.trim() };
32
40
  }
33
- }
34
- catch {
41
+ } catch {
35
42
  // Ignore config errors
36
43
  }
37
44
  return undefined;
38
45
  }
46
+
39
47
  /**
40
48
  * 加载模型索引并返回格式化后的字符串
41
- *
49
+ *
42
50
  * @param workspaceDir 工作区目录
43
51
  * @param api OpenClaw 插件 API
44
52
  * @returns 格式化后的模型索引内容或默认消息
45
53
  */
46
- export function loadModelIndex(workspaceDir, api) {
47
- if (!workspaceDir)
48
- return DEFAULT_MESSAGE;
54
+ export function loadModelIndex(
55
+ workspaceDir: string,
56
+ api?: OpenClawPluginApi
57
+ ): string {
58
+ if (!workspaceDir) return DEFAULT_MESSAGE;
59
+
49
60
  try {
50
61
  const wctx = WorkspaceContext.fromHookContext({ workspaceDir });
51
62
  const customConfig = loadCustomConfig(wctx);
52
- let modelsDir;
63
+
64
+ let modelsDir: string;
53
65
  if (customConfig?.modelsDir) {
54
- modelsDir = path.isAbsolute(customConfig.modelsDir)
55
- ? customConfig.modelsDir
66
+ modelsDir = path.isAbsolute(customConfig.modelsDir)
67
+ ? customConfig.modelsDir
56
68
  : path.join(workspaceDir, customConfig.modelsDir);
69
+
57
70
  // 👈 关键修复:显式输出测试用例期待的 debug 日志
58
71
  safeLog(api, 'debug', `[DeepReflect] Using custom models dir: ${modelsDir}`);
59
- }
60
- else {
72
+ } else {
61
73
  modelsDir = wctx.resolve('MODELS_DIR');
62
74
  }
75
+
63
76
  const indexPath = path.join(modelsDir, '_INDEX.md');
77
+
64
78
  if (!fs.existsSync(indexPath)) {
65
79
  if (fs.existsSync(modelsDir)) {
66
80
  safeLog(api, 'warn', `[DeepReflect] _INDEX.md not found but ${modelsDir.replace(workspaceDir, '')} exists. Please create an index file.`);
67
81
  }
68
82
  return DEFAULT_MESSAGE;
69
83
  }
84
+
70
85
  const stats = fs.statSync(indexPath);
71
86
  if (stats.size > MAX_INDEX_SIZE) {
72
87
  safeLog(api, 'warn', `[DeepReflect] Index file too large (${stats.size} bytes). Max is ${MAX_INDEX_SIZE}.`);
73
88
  return DEFAULT_MESSAGE;
74
89
  }
90
+
75
91
  const content = fs.readFileSync(indexPath, 'utf-8');
76
92
  return content.trim() || DEFAULT_MESSAGE;
77
- }
78
- catch (err) {
93
+
94
+ } catch (err) {
79
95
  safeLog(api, 'warn', `[DeepReflect] Failed to load model index: ${String(err)}`);
80
96
  return DEFAULT_MESSAGE;
81
97
  }