micro-models-agent 2.10.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/assets/app.js +22 -4
  3. package/dist/assets/index.html +29 -0
  4. package/dist/assets/js/dom.js +2 -1
  5. package/dist/assets/js/feed.js +38 -26
  6. package/dist/assets/js/format.js +1 -1
  7. package/dist/assets/js/rail.js +114 -0
  8. package/dist/assets/js/settings-controls.js +2 -2
  9. package/dist/assets/js/settings.js +246 -51
  10. package/dist/assets/js/store.js +3 -0
  11. package/dist/assets/js/tabs.js +104 -2
  12. package/dist/assets/styles.css +215 -66
  13. package/dist/cli/cache-line.js +1 -0
  14. package/dist/cli/command-suggest.js +5 -4
  15. package/dist/cli/commands.js +231 -122
  16. package/dist/cli/completer.js +132 -31
  17. package/dist/cli/index.js +1 -0
  18. package/dist/cli/json-payload.js +4 -4
  19. package/dist/cli/main.js +166 -61
  20. package/dist/cli/onboarding-commands.js +126 -0
  21. package/dist/cli/plugin-commands.js +2 -1
  22. package/dist/cli/relaunch.js +16 -13
  23. package/dist/cli/repl-commands-lsp.js +75 -0
  24. package/dist/cli/repl-commands-skills.js +105 -0
  25. package/dist/cli/repl-commands.js +589 -266
  26. package/dist/cli/repl.js +436 -177
  27. package/dist/cli/run-result.js +5 -6
  28. package/dist/cli/security-commands.js +37 -28
  29. package/dist/cli/setup-order.js +4 -55
  30. package/dist/cli/setup-prompt.js +3 -2
  31. package/dist/cli/setup.js +27 -107
  32. package/dist/cli/web-command.js +98 -0
  33. package/dist/config/budget.js +5 -5
  34. package/dist/config/config.js +103 -96
  35. package/dist/config/defaults.js +38 -8
  36. package/dist/config/domains.js +24 -27
  37. package/dist/config/env.js +46 -0
  38. package/dist/config/experts.js +2 -0
  39. package/dist/config/index.js +1 -0
  40. package/dist/config/paths.js +56 -0
  41. package/dist/config/redact.js +44 -0
  42. package/dist/config/registry-extra.js +334 -0
  43. package/dist/config/registry.js +584 -0
  44. package/dist/config/security.js +35 -36
  45. package/dist/config/timeouts.js +74 -0
  46. package/dist/config/utils.js +16 -15
  47. package/dist/core/agent/artifact-progress.js +59 -0
  48. package/dist/core/agent/artifact-resolve.js +79 -0
  49. package/dist/core/agent/audit-gate.js +7 -3
  50. package/dist/core/agent/compaction.js +2 -2
  51. package/dist/core/agent/constants.js +33 -4
  52. package/dist/core/agent/context-log.js +454 -0
  53. package/dist/core/agent/context-renderer.js +5 -0
  54. package/dist/core/agent/critic-gate.js +132 -0
  55. package/dist/core/agent/hallucination-gate.js +148 -38
  56. package/dist/core/agent/loop-state.js +15 -0
  57. package/dist/core/agent/prefix-monitor.js +1 -1
  58. package/dist/core/agent/reasoning-resolver.js +10 -1
  59. package/dist/core/agent/token-tracker.js +7 -4
  60. package/dist/core/agent/tool-batch.js +93 -18
  61. package/dist/core/agent/tool-images.js +18 -0
  62. package/dist/core/agent/tool-output.js +65 -11
  63. package/dist/core/agent/tool-pairing.js +60 -0
  64. package/dist/core/agent-moe.js +25 -24
  65. package/dist/core/agent.js +429 -108
  66. package/dist/core/bootstrap/agent-phase.js +66 -0
  67. package/dist/core/bootstrap/config-phase.js +86 -0
  68. package/dist/core/bootstrap/modules-phase.js +269 -0
  69. package/dist/core/bootstrap/provider-phase.js +183 -0
  70. package/dist/core/bootstrap/session-phase.js +204 -0
  71. package/dist/core/bootstrap/state.js +94 -0
  72. package/dist/core/bootstrap/workspace-phase.js +115 -0
  73. package/dist/core/bootstrap.js +92 -660
  74. package/dist/core/crash-handler.js +17 -7
  75. package/dist/core/environment.js +37 -12
  76. package/dist/core/host-plan.js +43 -0
  77. package/dist/core/host.js +23 -0
  78. package/dist/core/index.js +1 -0
  79. package/dist/core/prompt-builder.js +17 -1
  80. package/dist/core/prompt-overflow.js +42 -43
  81. package/dist/core/session-logger.js +122 -30
  82. package/dist/core/system-prompt.js +117 -0
  83. package/dist/core/version.js +6 -4
  84. package/dist/core/web-host.js +34 -0
  85. package/dist/core/workspace.js +19 -15
  86. package/dist/i18n/en.json +106 -21
  87. package/dist/i18n/index.js +37 -3
  88. package/dist/i18n/ru.json +109 -21
  89. package/dist/index.js +7 -3
  90. package/dist/llm/image-utils.js +55 -64
  91. package/dist/llm/llm-errors.js +9 -0
  92. package/dist/llm/model-loader.js +10 -32
  93. package/dist/llm/models-dev.js +121 -0
  94. package/dist/llm/openai-compat.js +146 -73
  95. package/dist/llm/orchestrator.js +33 -11
  96. package/dist/llm/provider-budget.js +2 -2
  97. package/dist/llm/provider-context.js +233 -0
  98. package/dist/llm/provider.js +1 -1
  99. package/dist/llm/response.js +5 -0
  100. package/dist/llm/token-counter.js +27 -11
  101. package/dist/logger/app-logger.js +48 -22
  102. package/dist/logger/file-log.js +28 -19
  103. package/dist/logger/index.js +1 -0
  104. package/dist/main.js +24285 -22447
  105. package/dist/migration/backup.js +14 -3
  106. package/dist/migration/detect.js +12 -3
  107. package/dist/migration/index.js +1 -0
  108. package/dist/modules/artifacts/store.js +9 -8
  109. package/dist/modules/browser/actions.js +6 -0
  110. package/dist/modules/browser/bridge-client.js +14 -12
  111. package/dist/modules/browser/bridge-path.js +4 -4
  112. package/dist/modules/browser/console-buffer.js +37 -0
  113. package/dist/modules/browser/cookie-store.js +5 -0
  114. package/dist/modules/browser/driver-types.js +1 -0
  115. package/dist/modules/browser/driver.js +19 -11
  116. package/dist/modules/browser/index.js +3 -1
  117. package/dist/modules/browser/module.js +2 -1
  118. package/dist/modules/browser/session.js +10 -30
  119. package/dist/modules/browser/snapshot.js +19 -13
  120. package/dist/modules/browser/types.js +1 -0
  121. package/dist/modules/certification/cli.js +28 -20
  122. package/dist/modules/certification/fact-checker.js +9 -1
  123. package/dist/modules/certification/loader.js +9 -2
  124. package/dist/modules/certification/manifest.js +83 -21
  125. package/dist/modules/certification/runner.js +23 -13
  126. package/dist/modules/certification/scenarios.js +20 -20
  127. package/dist/modules/certification/syntax-scenarios.js +1 -2
  128. package/dist/modules/context/chunk-query.js +11 -9
  129. package/dist/modules/context/fact-extractor.js +37 -39
  130. package/dist/modules/context/index.js +1 -0
  131. package/dist/modules/context/manager.js +106 -80
  132. package/dist/modules/critic/client.js +176 -0
  133. package/dist/modules/critic/evidence.js +81 -0
  134. package/dist/modules/critic/provider.js +45 -0
  135. package/dist/modules/critic/tools.js +78 -0
  136. package/dist/modules/critic/types.js +1 -0
  137. package/dist/modules/execution/audit-runners.js +28 -34
  138. package/dist/modules/execution/auditor.js +53 -49
  139. package/dist/modules/execution/execution-plugin.js +142 -102
  140. package/dist/modules/execution/index.js +1 -1
  141. package/dist/modules/execution/input-from.js +37 -13
  142. package/dist/modules/execution/module.js +368 -191
  143. package/dist/modules/execution/moe-executor.js +53 -26
  144. package/dist/modules/execution/plan-actions.js +320 -202
  145. package/dist/modules/execution/plan-checks.js +35 -0
  146. package/dist/modules/execution/plan-coverage.js +36 -33
  147. package/dist/modules/execution/plan-steps.js +11 -3
  148. package/dist/modules/execution/plan-store.js +83 -17
  149. package/dist/modules/execution/plan-tool.js +89 -35
  150. package/dist/modules/execution/plan-validator.js +30 -10
  151. package/dist/modules/execution/planner.js +22 -13
  152. package/dist/modules/execution/stuck-detector.js +196 -93
  153. package/dist/modules/execution/tracker.js +22 -8
  154. package/dist/modules/execution/verifier.js +69 -48
  155. package/dist/modules/execution/windows-commands.js +12 -12
  156. package/dist/modules/hallucination/artifact-claim.js +93 -0
  157. package/dist/modules/hallucination/confidence.js +13 -11
  158. package/dist/modules/hallucination/consistency.js +10 -2
  159. package/dist/modules/hallucination/detector.js +10 -5
  160. package/dist/modules/hallucination/factual.js +43 -26
  161. package/dist/modules/hallucination/index.js +1 -0
  162. package/dist/modules/hallucination/js-identifiers.js +44 -45
  163. package/dist/modules/hallucination/llm-judge.js +17 -12
  164. package/dist/modules/hallucination/success-claim.js +59 -0
  165. package/dist/modules/indexer/cache.js +52 -4
  166. package/dist/modules/indexer/index.js +1 -0
  167. package/dist/modules/indexer/map-command.js +2 -4
  168. package/dist/modules/indexer/map-select.js +16 -16
  169. package/dist/modules/indexer/module.js +47 -12
  170. package/dist/modules/indexer/project-profile.js +8 -7
  171. package/dist/modules/indexer/symbols.js +15 -15
  172. package/dist/modules/indexer/walker.js +159 -29
  173. package/dist/modules/lsp/check-tool.js +7 -5
  174. package/dist/modules/lsp/client.js +39 -39
  175. package/dist/modules/lsp/command.js +17 -24
  176. package/dist/modules/lsp/config.js +12 -11
  177. package/dist/modules/lsp/index.js +1 -0
  178. package/dist/modules/lsp/module.js +48 -46
  179. package/dist/modules/lsp/probe.js +13 -14
  180. package/dist/modules/lsp/project-root.js +14 -17
  181. package/dist/modules/lsp/startup-check.js +18 -16
  182. package/dist/modules/mcp/client.js +59 -62
  183. package/dist/modules/mcp/index.js +1 -0
  184. package/dist/modules/mcp/module.js +66 -37
  185. package/dist/modules/mcp/registry.js +5 -0
  186. package/dist/modules/memory/index.js +1 -0
  187. package/dist/modules/memory/module.js +12 -8
  188. package/dist/modules/memory/search.js +4 -1
  189. package/dist/modules/memory/store.js +40 -2
  190. package/dist/modules/onboarding/init.js +47 -0
  191. package/dist/modules/onboarding/meet.js +30 -0
  192. package/dist/modules/onboarding/mode.js +30 -0
  193. package/dist/modules/onboarding/prompts.js +43 -0
  194. package/dist/modules/pipelines/engine.js +10 -0
  195. package/dist/modules/pipelines/index.js +1 -0
  196. package/dist/modules/pipelines/parser.js +4 -1
  197. package/dist/modules/pipelines/template.js +4 -0
  198. package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
  199. package/dist/modules/plugins/builtin/notify.js +2 -0
  200. package/dist/modules/plugins/index.js +1 -0
  201. package/dist/modules/plugins/loader.js +18 -3
  202. package/dist/modules/plugins/manager.js +37 -17
  203. package/dist/modules/pricing/index.js +10 -11
  204. package/dist/modules/pricing/prices.js +12 -12
  205. package/dist/modules/processes/index.js +1 -0
  206. package/dist/modules/processes/kill-tree.js +27 -31
  207. package/dist/modules/processes/registry.js +44 -25
  208. package/dist/modules/processes/runner.js +4 -4
  209. package/dist/modules/providers/capabilities.js +28 -0
  210. package/dist/modules/providers/create.js +3 -4
  211. package/dist/modules/providers/factory.js +7 -7
  212. package/dist/modules/providers/fallback.js +12 -12
  213. package/dist/modules/providers/health.js +4 -4
  214. package/dist/modules/providers/manager.js +50 -19
  215. package/dist/modules/providers/naming.js +15 -0
  216. package/dist/modules/providers/preflight.js +71 -0
  217. package/dist/modules/providers/presets.js +39 -8
  218. package/dist/modules/providers/registry.js +7 -2
  219. package/dist/modules/reasoning/policy.js +8 -6
  220. package/dist/modules/reasoning/probe.js +30 -25
  221. package/dist/modules/security/audit-log.js +19 -36
  222. package/dist/modules/security/audit-notifier.js +35 -75
  223. package/dist/modules/security/command-validator.js +99 -51
  224. package/dist/modules/security/content-scanner.js +8 -8
  225. package/dist/modules/security/data-sanitizer.js +9 -16
  226. package/dist/modules/security/encryption.js +32 -52
  227. package/dist/modules/security/index.js +2 -1
  228. package/dist/modules/security/network-validator.js +120 -43
  229. package/dist/modules/security/path-validator.js +61 -46
  230. package/dist/modules/security/protected-paths.js +73 -0
  231. package/dist/modules/security/rate-limiter.js +17 -49
  232. package/dist/modules/security/security-policies.js +25 -57
  233. package/dist/modules/security/session-encryption.js +32 -71
  234. package/dist/modules/security/session-isolation.js +15 -28
  235. package/dist/modules/session/auto-name.js +63 -0
  236. package/dist/modules/session/export.js +98 -0
  237. package/dist/modules/session/index.js +1 -0
  238. package/dist/modules/session/manager.js +79 -28
  239. package/dist/modules/session/module.js +4 -3
  240. package/dist/modules/session/store.js +57 -20
  241. package/dist/modules/setup/answers.js +35 -0
  242. package/dist/modules/setup/apply.js +79 -0
  243. package/dist/modules/setup/discovery.js +72 -0
  244. package/dist/modules/skills/index.js +1 -0
  245. package/dist/modules/skills/loader.js +9 -1
  246. package/dist/modules/skills/module.js +11 -0
  247. package/dist/modules/updater/changelog-reader.js +15 -16
  248. package/dist/modules/updater/checker.js +9 -4
  249. package/dist/modules/updater/dev-detect.js +7 -6
  250. package/dist/modules/updater/index.js +1 -0
  251. package/dist/modules/updater/module.js +17 -15
  252. package/dist/modules/user-profile/compressor.js +2 -0
  253. package/dist/modules/user-profile/index.js +1 -0
  254. package/dist/modules/user-profile/profile.js +10 -1
  255. package/dist/modules/webui/answer-api.js +29 -0
  256. package/dist/modules/webui/assets.js +50 -0
  257. package/dist/modules/webui/body.js +21 -0
  258. package/dist/modules/webui/commands-settings.js +209 -0
  259. package/dist/modules/webui/commands-shared.js +60 -0
  260. package/dist/modules/webui/commands.js +174 -0
  261. package/dist/modules/webui/config-api.js +134 -0
  262. package/dist/modules/webui/file-api.js +202 -0
  263. package/dist/modules/webui/forward.js +159 -0
  264. package/dist/modules/webui/history-api.js +112 -0
  265. package/dist/modules/webui/host-state.js +60 -0
  266. package/dist/modules/webui/i18n-api.js +9 -0
  267. package/dist/modules/webui/limits.js +6 -0
  268. package/dist/modules/webui/log-forward.js +20 -0
  269. package/dist/modules/webui/memory-commands.js +64 -0
  270. package/dist/modules/webui/model-cache.js +18 -0
  271. package/dist/modules/webui/module.js +148 -0
  272. package/dist/modules/webui/persist.js +24 -0
  273. package/dist/modules/webui/prompt-io.js +97 -0
  274. package/dist/modules/webui/providers-api.js +337 -0
  275. package/dist/modules/webui/providers-view.js +56 -0
  276. package/dist/modules/webui/reasoning-view.js +15 -0
  277. package/dist/modules/webui/run-agent.js +81 -0
  278. package/dist/modules/webui/server.js +284 -0
  279. package/dist/modules/webui/sessions-api.js +178 -0
  280. package/dist/modules/webui/settings-api.js +561 -0
  281. package/dist/modules/webui/setup-api.js +201 -0
  282. package/dist/modules/webui/state.js +74 -0
  283. package/dist/modules/webui/util.js +261 -0
  284. package/dist/output/bus.js +7 -2
  285. package/dist/output/channel.js +80 -28
  286. package/dist/output/format.js +2 -1
  287. package/dist/output/index.js +1 -0
  288. package/dist/output/json-sink.js +5 -3
  289. package/dist/output/machine.js +4 -3
  290. package/dist/output/session-sink.js +4 -4
  291. package/dist/tools/approve.js +4 -0
  292. package/dist/tools/attach-image.js +5 -4
  293. package/dist/tools/auto-fixer.js +26 -44
  294. package/dist/tools/auto-tags.js +83 -0
  295. package/dist/tools/bash.js +193 -116
  296. package/dist/tools/browser.js +76 -31
  297. package/dist/tools/chunk-query.js +14 -6
  298. package/dist/tools/create-dir.js +9 -5
  299. package/dist/tools/delete-file.js +9 -5
  300. package/dist/tools/download-file.js +32 -7
  301. package/dist/tools/edit-file.js +52 -14
  302. package/dist/tools/enable-tools.js +6 -6
  303. package/dist/tools/executor.js +132 -27
  304. package/dist/tools/file-info.js +3 -1
  305. package/dist/tools/filter-tools.js +3 -3
  306. package/dist/tools/glob-tool.js +4 -1
  307. package/dist/tools/grep-tool.js +13 -10
  308. package/dist/tools/hidden-tools-block.js +6 -6
  309. package/dist/tools/index.js +16 -8
  310. package/dist/tools/list-dir.js +4 -2
  311. package/dist/tools/load-skill.js +7 -0
  312. package/dist/tools/mcp-call.js +15 -4
  313. package/dist/tools/meet-done.js +14 -0
  314. package/dist/tools/move-file.js +14 -7
  315. package/dist/tools/path-utils.js +29 -29
  316. package/dist/tools/pipeline-run.js +29 -7
  317. package/dist/tools/preview.js +1 -1
  318. package/dist/tools/process-ids.js +31 -0
  319. package/dist/tools/process-kill.js +9 -16
  320. package/dist/tools/process-list.js +1 -0
  321. package/dist/tools/process-log.js +11 -16
  322. package/dist/tools/process-wait.js +63 -0
  323. package/dist/tools/prompt-io.js +4 -3
  324. package/dist/tools/question.js +172 -25
  325. package/dist/tools/read-file.js +55 -34
  326. package/dist/tools/recall.js +14 -8
  327. package/dist/tools/registry.js +6 -5
  328. package/dist/tools/remember.js +8 -4
  329. package/dist/tools/scope-request.js +11 -6
  330. package/dist/tools/search-history.js +5 -2
  331. package/dist/tools/session-info.js +2 -0
  332. package/dist/tools/set-thinking.js +8 -4
  333. package/dist/tools/subagent.js +59 -39
  334. package/dist/tools/syntax-validator.js +292 -90
  335. package/dist/tools/user-input.js +22 -18
  336. package/dist/tools/web-browse.js +9 -3
  337. package/dist/tools/web-fetch.js +12 -23
  338. package/dist/tools/web-search.js +7 -5
  339. package/dist/tools/write-file.js +45 -15
  340. package/dist/ui/action-log.js +13 -0
  341. package/dist/ui/box.js +4 -3
  342. package/dist/ui/colors.js +2 -0
  343. package/dist/ui/diff.js +6 -5
  344. package/dist/ui/index.js +1 -0
  345. package/dist/ui/line-editor.js +230 -122
  346. package/dist/ui/line-math.js +10 -2
  347. package/dist/ui/md-formatter.js +57 -37
  348. package/dist/ui/output.js +8 -3
  349. package/dist/ui/plan-view.js +21 -10
  350. package/dist/ui/renderer.js +393 -67
  351. package/dist/ui/spinner.js +16 -5
  352. package/dist/ui/table.js +15 -17
  353. package/dist/ui/theme.js +143 -0
  354. package/dist/utils/child-run.js +20 -0
  355. package/dist/utils/error.js +1 -1
  356. package/dist/utils/index.js +2 -0
  357. package/dist/utils/retry.js +2 -2
  358. package/dist/utils/truncate.js +1 -1
  359. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { normalizeInputFrom } from "./input-from";
2
+ /** Валидирует план: подзадачи, теги экспертов, циклы, пересечения, input_from. */
2
3
  export function validatePlan(plan, config) {
3
4
  const errors = [];
4
5
  const warnings = [];
@@ -30,9 +31,10 @@ export function validatePlan(plan, config) {
30
31
  };
31
32
  }
32
33
  /**
33
- * Every input_from reference must point at an existing subtask and be backed
34
- * by a depends_on edge — otherwise the reader may run before its producer.
34
+ * Каждая ссылка input_from обязана указывать на существующую подзадачу и
35
+ * подкрепляться ребром depends_on — иначе читатель стартует раньше продьюсера.
35
36
  */
37
+ /** Валидирует ссылки input_from: неизвестные — ошибки, недостающие depends_on — автофиксы. */
36
38
  export function validateInputFromRefs(subtasks) {
37
39
  const errors = [];
38
40
  const autoFixes = [];
@@ -49,6 +51,7 @@ export function validateInputFromRefs(subtasks) {
49
51
  }
50
52
  return { errors, autoFixes };
51
53
  }
54
+ /** Проверяет, что все expert_tag подзадач известны из конфига. Возвращает ошибки. */
52
55
  export function expertTagsExist(subtasks, config) {
53
56
  const errors = [];
54
57
  const knownExperts = new Set(Object.keys(config.experts || {}));
@@ -59,6 +62,7 @@ export function expertTagsExist(subtasks, config) {
59
62
  }
60
63
  return errors;
61
64
  }
65
+ /** Ищет циклы в графе depends_on (DFS). Возвращает ошибки. */
62
66
  export function hasCycle(subtasks) {
63
67
  const edges = new Map();
64
68
  for (const s of subtasks) {
@@ -92,6 +96,7 @@ export function hasCycle(subtasks) {
92
96
  }
93
97
  return errors;
94
98
  }
99
+ /** Ищет write-write пересечения allowed_files без цепочки зависимостей. Возвращает ошибки. */
95
100
  export function hasAllowedFilesOverlap(subtasks) {
96
101
  const errors = [];
97
102
  const writeFiles = new Map();
@@ -116,6 +121,15 @@ export function hasAllowedFilesOverlap(subtasks) {
116
121
  }
117
122
  return errors;
118
123
  }
124
+ /** Два спека путей пересекаются, если равны или один — каталог-предок другого. */
125
+ function pathsOverlap(a, b) {
126
+ const na = a.replace(/\\/g, "/").replace(/\/+$/, "");
127
+ const nb = b.replace(/\\/g, "/").replace(/\/+$/, "");
128
+ if (na === nb)
129
+ return true;
130
+ return na.startsWith(`${nb}/`) || nb.startsWith(`${na}/`);
131
+ }
132
+ /** Ищет read-after-write пересечения (писатель vs read_only читателя). Пустые depends_on — автофикс. */
119
133
  export function deleteReadOverlap(subtasks) {
120
134
  const results = [];
121
135
  for (let i = 0; i < subtasks.length; i++) {
@@ -128,13 +142,10 @@ export function deleteReadOverlap(subtasks) {
128
142
  continue;
129
143
  const readFiles = new Set(reader.read_only_files);
130
144
  const writeFiles = writer.allowed_files;
131
- const overlapping = writeFiles.filter((f) => {
132
- for (const rf of readFiles) {
133
- if (f.startsWith(rf) || rf.startsWith(f))
134
- return true;
135
- }
136
- return false;
137
- });
145
+ // Точное совпадение или настоящий каталог-предок, НЕ строковый префикс:
146
+ // иначе сиблинги `src/main.ts` (писатель) vs `src/main.tsx` (читатель)
147
+ // ложно флаговались.
148
+ const overlapping = writeFiles.filter((f) => [...readFiles].some((rf) => pathsOverlap(f, rf)));
138
149
  if (overlapping.length > 0 && !reader.depends_on?.includes(writer.id)) {
139
150
  const canAutoFix = !reader.depends_on || reader.depends_on.length === 0;
140
151
  if (canAutoFix) {
@@ -157,8 +168,17 @@ export function deleteReadOverlap(subtasks) {
157
168
  }
158
169
  return results;
159
170
  }
171
+ /** Применяет автофиксы (добавление depends_on) к копии плана, оригинал не мутирует. */
160
172
  export function applyAutoFixes(plan, autoFixes) {
161
- const fixed = { ...plan, subtasks: plan.subtasks.map((s) => ({ ...s })) };
173
+ // Глубокое-ish клонирование: копируем каждый массив `depends_on`, чтобы пуши
174
+ // ниже не мутировали план вызывающего (поверхностный `{...s}` делил массив).
175
+ const fixed = {
176
+ ...plan,
177
+ subtasks: plan.subtasks.map((s) => ({
178
+ ...s,
179
+ depends_on: [...(s.depends_on ?? [])],
180
+ })),
181
+ };
162
182
  for (const fix of autoFixes) {
163
183
  const sub = fixed.subtasks.find((s) => s.id === fix.subtaskId);
164
184
  if (!sub)
@@ -7,10 +7,10 @@ function generatePlanId() {
7
7
  return `plan_${id}`;
8
8
  }
9
9
  /**
10
- * Single source of truth for plan progress counting (ses_mt4fn58c: `show`
11
- * said "6/7 done, complete" while `list` said "7/7" for the same plan —
12
- * one counted only "done", the other counted done+skipped). A skipped step
13
- * needs no further work, so it counts as settled everywhere.
10
+ * Единый источник правды подсчёта прогресса (ses_mt4fn58c: `show` говорил
11
+ * "6/7 done, complete", а `list` — "7/7" для того же плана: один считал только
12
+ * "done", другой done+skipped). Пропущенный шаг работы не требует, поэтому
13
+ * везде считается settled.
14
14
  */
15
15
  export function getPlanProgress(plan) {
16
16
  const done = plan.steps.filter((s) => s.status === "done").length;
@@ -19,8 +19,10 @@ export function getPlanProgress(plan) {
19
19
  const settled = done + skipped;
20
20
  return { done, skipped, total, settled, terminal: total > 0 && settled === total };
21
21
  }
22
+ /** Создатель планов: create, re-plan, промпт-блок. */
22
23
  export class PlanCreator {
23
- static createPlan(title, stepDescriptions, baseDir, kinds) {
24
+ /** Создаёт новый план из заголовка и описаний шагов. */
25
+ static createPlan(title, stepDescriptions, baseDir, kinds, checks) {
24
26
  const stepCount = stepDescriptions.length;
25
27
  return {
26
28
  id: generatePlanId(),
@@ -30,26 +32,29 @@ export class PlanCreator {
30
32
  description: desc,
31
33
  status: "pending",
32
34
  kind: kinds?.[i] ?? "create",
35
+ ...(checks?.[i] ? { check: checks[i] } : {}),
33
36
  })),
34
37
  createdAt: new Date().toISOString(),
35
38
  baseDir,
36
39
  };
37
40
  }
38
- static replan(plan, newSteps, title) {
41
+ /** Re-plan: сохраняет done/skipped шаги, заменяет остальные новыми. */
42
+ static replan(plan, newSteps, title, newChecks) {
39
43
  const kept = plan.steps.filter((s) => s.status === "done" || s.status === "skipped");
40
44
  const baseTitle = plan.title.replace(/^\[\d+[^]]*\]\s*/, "");
41
45
  const newTitle = title || baseTitle;
42
46
  const totalSteps = kept.length + newSteps.length;
43
- const added = newSteps.map((desc) => ({
44
- id: -1, // renumbered below
47
+ const added = newSteps.map((desc, i) => ({
48
+ id: -1, // перенумеруется ниже
45
49
  description: desc,
46
50
  status: "pending",
47
51
  kind: "create",
52
+ ...(newChecks?.[i] ? { check: newChecks[i] } : {}),
48
53
  }));
49
- // Renumber every step (kept + added) sequentially. Kept steps keep their
50
- // status and kind but may collide with the added ids when the original
51
- // plan skipped/pending steps in the middle (e.g. done 1, done 3 → kept
52
- // [1,3], added [2…] collides with kept id 3).
54
+ // Перенумеровываем все шаги (сохранённые + новые) подряд. Сохранённые держат
55
+ // статус и kind, но их id могут коллизить с новыми, если исходный план
56
+ // пропускал/пендил шаги в середине (напр. done 1, done 3 → сохранённые
57
+ // [1,3], новые [2…] коллизят с сохранённым id 3).
53
58
  const steps = [...kept, ...added].map((s, i) => ({ ...s, id: i + 1 }));
54
59
  return {
55
60
  id: plan.id,
@@ -60,6 +65,7 @@ export class PlanCreator {
60
65
  name: plan.name,
61
66
  };
62
67
  }
68
+ /** Рендерит план чеклистом для промпта (иконки статусов, checks, подзадачи). */
63
69
  static toPromptBlock(plan, currentStepIndex) {
64
70
  const date = plan.createdAt.slice(0, 10);
65
71
  const p = getPlanProgress(plan);
@@ -85,8 +91,11 @@ export class PlanCreator {
85
91
  : "[ ]";
86
92
  const note = step.note ? ` — ${step.note}` : "";
87
93
  lines.push(`${icon} ${step.id}. ${step.description}${note}`);
94
+ if (step.check) {
95
+ lines.push(` ↳ check: ${step.check}`);
96
+ }
88
97
  for (const sub of step.subtasks ?? []) {
89
- lines.push(` ${sub.done ? "[x]" : "[ ]"} ${sub.text}`);
98
+ lines.push(` [${sub.id}] ${sub.done ? "[x]" : "[ ]"} ${sub.text}`);
90
99
  }
91
100
  }
92
101
  return lines.join("\n");