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
@@ -1,525 +0,0 @@
1
- /**
2
- * Local Worker Routing Policy — Task Classification and Routing Decisions
3
- * ======================================================================
4
- *
5
- * PURPOSE: Provide an explainable, testable policy that decides whether a given
6
- * task can be delegated to a local-worker profile (local-reader or local-editor)
7
- * or must stay on the main agent.
8
- *
9
- * ARCHITECTURE:
10
- * - This module is POLICY ONLY — it makes routing decisions but does NOT execute them
11
- * - The main agent (or a delegation hook in a future phase) is responsible for
12
- * actually routing the task based on the RoutingDecision returned here
13
- * - All decisions are deterministic and based on structured input fields
14
- * - No model inference, no learning, no dynamic adaptation
15
- *
16
- * TASK CLASSIFICATION TAXONOMY:
17
- * reader_eligible — clearly suitable for local-reader
18
- * editor_eligible — clearly suitable for local-editor
19
- * high_entropy_disallowed — high-complexity tasks that must stay on main agent
20
- * risk_disallowed — tasks with destructive or high-risk signals
21
- * ambiguous_scope — tasks that are unclear and need main-agent judgment
22
- * deployment_unavailable — no enabled deployment exists for the target profile
23
- *
24
- * FAIL-CLOSED PRINCIPLE:
25
- * - When in doubt → stay_main
26
- * - Unclear intent → stay_main
27
- * - High complexity → stay_main
28
- * - Any risk signal → stay_main
29
- * - No enabled deployment → stay_main
30
- *
31
- * DESIGN CONSTRAINTS:
32
- * - No actual task execution
33
- * - No automatic learning or route optimization
34
- * - No Trinity or adaptive threshold logic
35
- * - Routing decisions are fully explainable (return `reason` + `blockers[]`)
36
- */
37
- import { isRoutingEnabledForProfile, getDeployment, } from './model-deployment-registry.js';
38
- import { isCheckpointDeployable } from './model-training-registry.js';
39
- import { getPromotionState } from './promotion-gate.js';
40
- // ---------------------------------------------------------------------------
41
- // Keyword Classifiers
42
- // ---------------------------------------------------------------------------
43
- /**
44
- * Keywords that indicate a task is suitable for `local-reader`.
45
- * Matched against taskIntent + taskDescription.
46
- */
47
- const READER_KEYWORDS = [
48
- 'read', 'view', 'show', 'get', 'find', 'search', 'grep', 'look',
49
- 'inspect', 'examine', 'list', 'cat', 'head', 'tail', 'diff',
50
- 'summary', 'summarize', 'extract', 'parse', 'review',
51
- 'check', 'verify', 'status', 'describe', 'explain_what',
52
- 'browse', 'fetch', 'show_content', 'file_content', 'code_read',
53
- ];
54
- /**
55
- * Keywords that indicate a task is suitable for `local-editor`.
56
- * Matched against taskIntent + taskDescription.
57
- */
58
- const EDITOR_KEYWORDS = [
59
- 'edit', 'update', 'modify', 'change', 'fix', 'patch', 'replace',
60
- 'add', 'remove', 'delete', 'insert', 'rewrite', 'refactor',
61
- 'apply', 'execute', 'run', 'transform', 'convert', 'migrate',
62
- 'write', 'create_file', 'append', 'touch', 'rename',
63
- ];
64
- /**
65
- * Keywords that indicate HIGH ENTROPY — tasks that must stay on main agent.
66
- * These indicate open-ended, multi-step, or ambiguous tasks.
67
- */
68
- const HIGH_ENTROPY_KEYWORDS = [
69
- 'design', 'architect', 'plan', 'strategy', 'roadmap', 'propose',
70
- 'research', 'investigate', 'explore', 'evaluate', 'compare',
71
- 'decide', 'choose', 'recommend', 'suggest', 'analyze_tradeoffs',
72
- 'unclear', 'vague', 'ambiguous', 'open_ended', 'multiple_options',
73
- 'architecture', 'system_design', 'high_level', 'blueprint',
74
- 'thinking', 'reasoning', '思考', '分析', '设计',
75
- ];
76
- /**
77
- * Keywords that indicate RISK — tasks that must stay on main agent.
78
- * These indicate destructive, irreversible, or production-sensitive operations.
79
- */
80
- const RISK_KEYWORDS = [
81
- 'rm', 'delete', 'remove', 'drop', 'truncate', 'destroy',
82
- 'force_push', 'force_reset', 'hard_reset', 'rebase_force',
83
- 'exec', 'eval', 'sudo', 'chmod_777', 'shutdown', 'reboot',
84
- 'production', 'prod', 'live', 'deploy', 'release',
85
- 'database', 'db_', 'migration', 'seed',
86
- 'secrets', 'credentials', 'password', 'api_key', 'token',
87
- 'bulk', 'batch', 'all_files', 'entire_', 'recursive_delete',
88
- ];
89
- /**
90
- * Risk file patterns — files whose modification indicates high risk.
91
- * Matched against requestedFiles using simple includes check.
92
- */
93
- const RISK_FILE_PATTERNS = [
94
- '.git/config',
95
- 'package-lock.json',
96
- 'yarn.lock',
97
- 'pnpm-lock.yaml',
98
- 'node_modules',
99
- '.env',
100
- 'secrets',
101
- 'credentials',
102
- '.aws/credentials',
103
- '~/.ssh/',
104
- '/etc/',
105
- 'production',
106
- '.k8s',
107
- 'docker-compose.yml',
108
- 'Dockerfile',
109
- ];
110
- /**
111
- * Tools that are inherently risky and indicate a task must stay on main agent.
112
- */
113
- const RISK_TOOLS = [
114
- 'bash', 'shell', 'exec', 'run_command', 'execute',
115
- 'git_push', 'git_force_push', 'git_reset',
116
- 'http_delete', 'DROP', 'DELETE *', 'truncate',
117
- 'sudo', 'chmod', 'chown',
118
- ];
119
- // ---------------------------------------------------------------------------
120
- // Classification Helpers
121
- // ---------------------------------------------------------------------------
122
- /**
123
- * Simple case-insensitive keyword match.
124
- */
125
- function containsKeyword(text, keywords) {
126
- if (!text)
127
- return false;
128
- const lower = text.toLowerCase();
129
- return keywords.some((kw) => lower.includes(kw));
130
- }
131
- /**
132
- * Check if any tool name looks like a risk tool.
133
- */
134
- function hasRiskTool(tools) {
135
- if (!tools || tools.length === 0)
136
- return false;
137
- const combined = tools.join(' ').toLowerCase();
138
- return RISK_TOOLS.some((rt) => combined.includes(rt));
139
- }
140
- /**
141
- * Check if any requested file matches a risk pattern.
142
- */
143
- function hasRiskFile(files) {
144
- if (!files || files.length === 0)
145
- return false;
146
- return files.some((f) => {
147
- const lower = f.toLowerCase();
148
- return RISK_FILE_PATTERNS.some((rp) => lower.includes(rp.toLowerCase()));
149
- });
150
- }
151
- /**
152
- * Compute a combined text from all input fields for keyword scanning.
153
- */
154
- function computeCombinedText(input) {
155
- const parts = [];
156
- if (input.taskIntent)
157
- parts.push(input.taskIntent);
158
- if (input.taskDescription)
159
- parts.push(input.taskDescription);
160
- if (input.expectedOutputShape)
161
- parts.push(input.expectedOutputShape);
162
- if (input.complexityHints)
163
- parts.push(input.complexityHints.join(' '));
164
- return parts.join(' ').toLowerCase();
165
- }
166
- // ---------------------------------------------------------------------------
167
- // Core Classification Logic
168
- // ---------------------------------------------------------------------------
169
- /**
170
- * Classify the task based on its input fields.
171
- * Returns a raw classification category (before deployment check).
172
- */
173
- function classifyTaskKind(input) {
174
- const text = computeCombinedText(input);
175
- const { taskIntent, taskDescription, requestedTools, requestedFiles, riskSignals, complexityHints } = input;
176
- // --- Step 1: Explicit risk signals always block ---
177
- if (riskSignals && riskSignals.length > 0) {
178
- return 'risk_disallowed';
179
- }
180
- // --- Step 2: High-entropy keyword detection ---
181
- if (complexityHints?.some((h) => ['multi_step', 'cross_file', 'ambiguous', 'requires_planning', 'open_ended', 'unclear'].includes(h))) {
182
- return 'high_entropy_disallowed';
183
- }
184
- if (containsKeyword(text, HIGH_ENTROPY_KEYWORDS)) {
185
- return 'high_entropy_disallowed';
186
- }
187
- // Architecture design keywords in intent or description
188
- if (containsKeyword(taskIntent, ['design', 'architect', 'plan', 'propose']) ||
189
- containsKeyword(taskDescription, ['design', 'architect', 'plan', 'propose'])) {
190
- return 'high_entropy_disallowed';
191
- }
192
- // --- Step 3: Risk keyword detection (intent/description text) ---
193
- // Check text-based risk signals even without explicit risk tools/files.
194
- // Must run BEFORE editor eligibility to prevent destructive keywords
195
- // (delete, remove, drop, etc.) from being misclassified as editor-eligible.
196
- if (containsKeyword(taskIntent, RISK_KEYWORDS) ||
197
- containsKeyword(taskDescription, RISK_KEYWORDS)) {
198
- return 'risk_disallowed';
199
- }
200
- // --- Step 4: Risk tool detection ---
201
- if (hasRiskTool(requestedTools ?? [])) {
202
- return 'risk_disallowed';
203
- }
204
- // --- Step 5: Risk file pattern detection ---
205
- if (hasRiskFile(requestedFiles ?? [])) {
206
- return 'risk_disallowed';
207
- }
208
- // --- Step 6: Reader eligibility ---
209
- // Task intent and description both clearly indicate reading/gathering
210
- const intentIsReader = containsKeyword(taskIntent, READER_KEYWORDS);
211
- const descIsReader = containsKeyword(taskDescription, READER_KEYWORDS);
212
- if (intentIsReader && (descIsReader || !taskDescription)) {
213
- return 'reader_eligible';
214
- }
215
- // --- Step 7: Editor eligibility ---
216
- // Bounded scope: editing a known set of files (1-3) is editor-eligible.
217
- // Large-scale multi-file editing (4+ distinct files) is inherently high-entropy
218
- // — requires coordinating changes across a large surface area and carries
219
- // significant unintended-change risk. Must stay on main agent.
220
- const uniqueFiles = requestedFiles
221
- ? [...new Set(requestedFiles.filter((f) => f.trim().length > 0))]
222
- : [];
223
- const intentIsEditor = containsKeyword(taskIntent, EDITOR_KEYWORDS);
224
- const descIsEditor = containsKeyword(taskDescription, EDITOR_KEYWORDS);
225
- if (intentIsEditor && (descIsEditor || !taskDescription)) {
226
- if (uniqueFiles.length >= 4) {
227
- return 'high_entropy_disallowed';
228
- }
229
- return 'editor_eligible';
230
- }
231
- // --- Step 8: Ambiguous scope ---
232
- // If we have some description but can't classify it clearly
233
- if (taskDescription && taskDescription.trim().length > 0) {
234
- const trimmed = taskDescription.trim();
235
- // Very short or generic descriptions → ambiguous
236
- if (trimmed.length < 20 || ['todo', 'fix', 'improve', 'change', 'update', 'something'].includes(trimmed.toLowerCase())) {
237
- return 'ambiguous_scope';
238
- }
239
- // Contains question words suggesting open-ended reasoning
240
- if (/\b(why|how|should|could|would|what if|should we|whether to)\b/i.test(trimmed)) {
241
- return 'ambiguous_scope';
242
- }
243
- }
244
- // --- Step 9: No sufficient information ---
245
- if (!taskIntent && !taskDescription) {
246
- return 'ambiguous_scope';
247
- }
248
- // Default to ambiguous rather than risky — fail to stay_main
249
- return 'ambiguous_scope';
250
- }
251
- /**
252
- * Build the reason string for a given classification.
253
- */
254
- function buildReason(classification, input) {
255
- const { taskIntent, taskDescription } = input;
256
- switch (classification) {
257
- case 'reader_eligible':
258
- return `Task "${taskIntent || taskDescription || '(unnamed)'}" is classified as reader_eligible. ` +
259
- `Keywords indicate focused reading, inspection, or information retrieval. ` +
260
- `No high-entropy or risk signals detected.`;
261
- case 'editor_eligible':
262
- return `Task "${taskIntent || taskDescription || '(unnamed)'}" is classified as editor_eligible. ` +
263
- `Keywords indicate bounded editing, modification, or repair. ` +
264
- `No high-entropy or risk signals detected.`;
265
- case 'high_entropy_disallowed': {
266
- const uniqueFiles = input.requestedFiles
267
- ? [...new Set(input.requestedFiles.filter((f) => f.trim().length > 0))]
268
- : [];
269
- const isLargeScaleEdit = uniqueFiles.length >= 4;
270
- if (isLargeScaleEdit) {
271
- return `Task "${taskIntent || taskDescription || '(unnamed)'}" is blocked as high_entropy_disallowed. ` +
272
- `Editing ${uniqueFiles.length} files simultaneously exceeds the bounded-scope limit for local-editor. ` +
273
- `Large-scale multi-file edits require the main agent's coordination and risk judgment.`;
274
- }
275
- return `Task "${taskIntent || taskDescription || '(unnamed)'}" is blocked as high_entropy_disallowed. ` +
276
- `Keywords indicate open-ended planning, architecture design, or ambiguous multi-step work. ` +
277
- `These tasks require the main agent's full reasoning capability.`;
278
- }
279
- case 'risk_disallowed':
280
- return `Task "${taskIntent || taskDescription || '(unnamed)'}" is blocked as risk_disallowed. ` +
281
- `Detected destructive, production, or irreversible operation signals. ` +
282
- `All risky operations must remain on the main agent with human oversight.`;
283
- case 'ambiguous_scope':
284
- return `Task "${taskIntent || taskDescription || '(unnamed)'}" is blocked as ambiguous_scope. ` +
285
- `The task description is too vague, too short, or contains open-ended question words. ` +
286
- `Main agent must clarify scope before delegation.`;
287
- case 'profile_mismatch':
288
- return `Task profile does not match the requested target profile. ` +
289
- `The task's natural classification is incompatible with the specified worker profile. ` +
290
- `Main agent must re-route or choose a compatible profile.`;
291
- case 'deployment_unavailable':
292
- return `No enabled deployment available for routing. ` +
293
- `Either no checkpoint is bound to the profile, or routing has been disabled. ` +
294
- `Main agent must handle this task.`;
295
- }
296
- }
297
- /**
298
- * Build the blockers list for a given classification.
299
- */
300
- function buildBlockers(classification, input) {
301
- switch (classification) {
302
- case 'reader_eligible':
303
- return [];
304
- case 'editor_eligible':
305
- return [];
306
- case 'high_entropy_disallowed': {
307
- const uniqueFiles = input.requestedFiles
308
- ? [...new Set(input.requestedFiles.filter((f) => f.trim().length > 0))]
309
- : [];
310
- const isLargeScaleEdit = uniqueFiles.length >= 4;
311
- return [
312
- isLargeScaleEdit
313
- ? `large-scale multi-file edit detected (${uniqueFiles.length} files): scope too broad for local-editor`
314
- : 'task contains high-entropy keywords (design/plan/architect/investigate)',
315
- 'complexity hint indicates multi-step or open-ended work',
316
- 'main agent required for full reasoning and judgment',
317
- ];
318
- }
319
- case 'risk_disallowed':
320
- return [
321
- 'risk tool requested (bash/exec/sudo/DROP/DELETE)',
322
- 'risk file pattern detected (production/secrets/.git/node_modules)',
323
- 'explicit risk signal present in input',
324
- 'main agent must supervise high-risk operations',
325
- ];
326
- case 'ambiguous_scope':
327
- return [
328
- 'task description too vague or generic',
329
- 'task intent not provided or unclear',
330
- 'open-ended question words detected',
331
- 'main agent must clarify scope before delegation',
332
- ];
333
- case 'profile_mismatch':
334
- return [
335
- 'task natural profile incompatible with requested target profile',
336
- 'main agent must re-route or select a compatible profile',
337
- ];
338
- case 'deployment_unavailable':
339
- return [
340
- 'no enabled deployment found for target profile',
341
- 'routing may be disabled in deployment registry',
342
- 'main agent must handle task directly',
343
- ];
344
- }
345
- }
346
- // ---------------------------------------------------------------------------
347
- // Public API
348
- // ---------------------------------------------------------------------------
349
- /**
350
- * Classify a task and produce a routing decision.
351
- *
352
- * This is the main entry point for routing policy evaluation.
353
- * It:
354
- * 1. Classifies the task kind based on keywords and heuristics
355
- * 2. Checks deployment availability for the target profile
356
- * 3. Returns a fully explainable RoutingDecision
357
- *
358
- * @param input - The routing input describing the task
359
- * @param stateDir - Workspace state directory (for deployment registry lookup)
360
- * @returns RoutingDecision with classification, reason, blockers, and routing verdict
361
- */
362
- export function classifyTask(input, stateDir) {
363
- // --- Determine the raw task classification ---
364
- const classification = classifyTaskKind(input);
365
- // --- Determine the target profile ---
366
- // If input specifies a target, use it. Otherwise, pick based on classification.
367
- // NOTE: When explicitly specified, we must validate profile-task compatibility below.
368
- const targetProfile = input.targetProfile ??
369
- (classification === 'reader_eligible'
370
- ? 'local-reader'
371
- : classification === 'editor_eligible'
372
- ? 'local-editor'
373
- : null);
374
- // --- Profile-task compatibility check ---
375
- // Only applies when input.targetProfile is EXPLICITLY set.
376
- // When auto-derived (input.targetProfile is null), compatibility is already
377
- // guaranteed by the auto-derivation logic above (reader_eligible → local-reader).
378
- // This check prevents routing a reader task to an editor profile (or vice versa)
379
- // when the caller explicitly requests the wrong profile.
380
- const isProfileCompatible = input.targetProfile === undefined
381
- ? true // Auto-derived profile is always compatible by construction
382
- : targetProfile === 'local-reader'
383
- ? classification === 'reader_eligible'
384
- : targetProfile === 'local-editor'
385
- ? classification === 'editor_eligible'
386
- : false;
387
- // --- Deployment availability check ---
388
- let deploymentCheck = {
389
- performed: false,
390
- profileAvailable: false,
391
- routingEnabled: false,
392
- checkpointDeployable: false,
393
- };
394
- if (targetProfile) {
395
- const deployment = getDeployment(stateDir, targetProfile);
396
- const activeCheckpointId = deployment?.activeCheckpointId ?? null;
397
- // Re-check deployability on every routing decision — a checkpoint may have been revoked
398
- const checkpointDeployable = activeCheckpointId
399
- ? isCheckpointDeployable(stateDir, activeCheckpointId)
400
- : false;
401
- deploymentCheck = {
402
- performed: true,
403
- profileAvailable: deployment !== null,
404
- routingEnabled: isRoutingEnabledForProfile(stateDir, targetProfile),
405
- checkpointDeployable,
406
- };
407
- }
408
- // --- Build the decision ---
409
- const blockers = buildBlockers(classification, input);
410
- const reason = buildReason(classification, input);
411
- // FAIL-CLOSED: route_local only if:
412
- // 1. Classification is eligible (reader_eligible or editor_eligible)
413
- // 2. A target profile was identified
414
- // 3. The task's natural profile is compatible with the target profile
415
- // 4. Deployment is available and routing is enabled
416
- const isEligibleForRouting = (classification === 'reader_eligible' || classification === 'editor_eligible') &&
417
- targetProfile !== null &&
418
- isProfileCompatible &&
419
- deploymentCheck.routingEnabled;
420
- const decision = isEligibleForRouting
421
- ? 'route_local'
422
- : 'stay_main';
423
- // Derive the final classification — preserves the root cause of stay_main:
424
- // - profile_mismatch: task would be eligible but wrong profile requested
425
- // - deployment_unavailable: eligible and compatible but no routing enabled
426
- // - raw classification: blocked by high_entropy / risk / ambiguous
427
- const isEligible = classification === 'reader_eligible' || classification === 'editor_eligible';
428
- const finalClassification = isEligibleForRouting
429
- ? classification
430
- : isEligible && targetProfile !== null && !isProfileCompatible
431
- ? 'profile_mismatch'
432
- : isEligible
433
- ? 'deployment_unavailable'
434
- : classification;
435
- // Build explainability fields specific to the stay_main reason
436
- let finalReason = reason;
437
- let finalBlockers = blockers;
438
- if (decision === 'stay_main') {
439
- if (finalClassification === 'profile_mismatch') {
440
- const wanted = classification === 'reader_eligible' ? 'local-reader' : 'local-editor';
441
- finalReason = `Task is ${classification} but was explicitly targeted at ${targetProfile}. ` +
442
- `Routing requires "${wanted}" profile. Ensure the task intent matches the requested profile.`;
443
- finalBlockers = [
444
- `profile mismatch: task is ${classification} but targetProfile is ${targetProfile}`,
445
- `required profile: ${wanted}`,
446
- ];
447
- }
448
- else if (finalClassification === 'deployment_unavailable') {
449
- if (!deploymentCheck.performed) {
450
- finalReason = reason;
451
- }
452
- else if (!deploymentCheck.profileAvailable) {
453
- finalReason = `Task is ${classification} but no deployment exists for ${targetProfile}. ` +
454
- `Bind a checkpoint via bindCheckpointToWorkerProfile() and enable routing.`;
455
- finalBlockers = [`no deployment found for profile: ${targetProfile}`];
456
- }
457
- else if (!deploymentCheck.checkpointDeployable) {
458
- finalReason = `Task is ${classification} but the active checkpoint has been revoked (no longer deployable). ` +
459
- `Re-bind a passing checkpoint or re-evaluate the current one.`;
460
- finalBlockers = [
461
- `active checkpoint is no longer deployable: ${targetProfile}`,
462
- 'revoked checkpoints must not be used for routing',
463
- ];
464
- }
465
- else if (!deploymentCheck.routingEnabled) {
466
- finalReason = `Task is ${classification} and deployment exists for ${targetProfile} but routing is not enabled. ` +
467
- `Enable routing via enableRoutingForProfile() in the deployment registry.`;
468
- finalBlockers = [`routing is disabled for profile: ${targetProfile}`];
469
- }
470
- }
471
- }
472
- // --- Get active checkpoint ID and state for shadow observation integration ---
473
- let activeCheckpointId = null;
474
- let activeCheckpointState = null;
475
- if (targetProfile && deploymentCheck.performed) {
476
- const deployment = getDeployment(stateDir, targetProfile);
477
- activeCheckpointId = deployment?.activeCheckpointId ?? null;
478
- if (activeCheckpointId) {
479
- const promotionState = getPromotionState(stateDir, activeCheckpointId);
480
- if (promotionState === 'shadow_ready' || promotionState === 'promotable' || promotionState === 'candidate_only') {
481
- activeCheckpointState = promotionState;
482
- }
483
- }
484
- }
485
- return {
486
- decision,
487
- targetProfile: decision === 'route_local' ? targetProfile : null,
488
- classification: finalClassification,
489
- reason: finalReason,
490
- blockers: decision === 'stay_main' ? finalBlockers : [],
491
- deploymentCheck,
492
- activeCheckpointId,
493
- activeCheckpointState: activeCheckpointState ?? undefined,
494
- shadowObservationId: undefined,
495
- };
496
- }
497
- /**
498
- * Convenience: check if a specific profile can handle a task.
499
- * Equivalent to calling classifyTask with targetProfile set.
500
- */
501
- export function canRouteToProfile(input, stateDir, profile) {
502
- const decision = classifyTask({ ...input, targetProfile: profile }, stateDir);
503
- return decision.decision === 'route_local';
504
- }
505
- // ---------------------------------------------------------------------------
506
- // Read-Only Query Helpers
507
- // ---------------------------------------------------------------------------
508
- /**
509
- * Check if any local worker routing is currently enabled for any profile.
510
- */
511
- export function isAnyLocalRoutingEnabled(stateDir) {
512
- return isRoutingEnabledForProfile(stateDir, 'local-reader') ||
513
- isRoutingEnabledForProfile(stateDir, 'local-editor');
514
- }
515
- /**
516
- * List all profiles that currently have routing enabled.
517
- */
518
- export function listEnabledProfiles(stateDir) {
519
- const enabled = [];
520
- if (isRoutingEnabledForProfile(stateDir, 'local-reader'))
521
- enabled.push('local-reader');
522
- if (isRoutingEnabledForProfile(stateDir, 'local-editor'))
523
- enabled.push('local-editor');
524
- return enabled;
525
- }
@@ -1,6 +0,0 @@
1
- import type { OpenClawPluginApi } from '../openclaw-sdk.js';
2
- /**
3
- * Handles migration of Principles Disciple files from legacy directories
4
- * (docs/ and memory/.state/) to the new hidden directory structure (.principles/ and .state/).
5
- */
6
- export declare function migrateDirectoryStructure(api: OpenClawPluginApi, workspaceDir: string): void;