cli-jaw 2.1.1 → 2.1.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 (477) hide show
  1. package/README.ja.md +8 -6
  2. package/README.ko.md +8 -6
  3. package/README.md +18 -11
  4. package/README.zh-CN.md +8 -6
  5. package/dist/bin/cli-jaw.js +19 -3
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser.js +1 -1
  8. package/dist/bin/commands/browser.js.map +1 -1
  9. package/dist/bin/commands/chat-search.js +71 -0
  10. package/dist/bin/commands/chat-search.js.map +1 -0
  11. package/dist/bin/commands/chat.js +98 -58
  12. package/dist/bin/commands/chat.js.map +1 -1
  13. package/dist/bin/commands/dispatch.js +130 -5
  14. package/dist/bin/commands/dispatch.js.map +1 -1
  15. package/dist/bin/commands/goal.js +66 -9
  16. package/dist/bin/commands/goal.js.map +1 -1
  17. package/dist/bin/commands/history.js +61 -0
  18. package/dist/bin/commands/history.js.map +1 -0
  19. package/dist/bin/commands/lock.js +104 -0
  20. package/dist/bin/commands/lock.js.map +1 -0
  21. package/dist/bin/commands/memory.js +23 -2
  22. package/dist/bin/commands/memory.js.map +1 -1
  23. package/dist/bin/commands/orchestrate.js.map +1 -1
  24. package/dist/bin/commands/project.js +4 -1
  25. package/dist/bin/commands/project.js.map +1 -1
  26. package/dist/bin/commands/tui/fullscreen-mode.js +237 -0
  27. package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -0
  28. package/dist/bin/commands/tui/input-handler.js +139 -52
  29. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  30. package/dist/bin/commands/tui/overlays.js +177 -70
  31. package/dist/bin/commands/tui/overlays.js.map +1 -1
  32. package/dist/bin/commands/tui/renderer.js +70 -20
  33. package/dist/bin/commands/tui/renderer.js.map +1 -1
  34. package/dist/bin/commands/tui/simple-mode.js +1 -2
  35. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  36. package/dist/bin/commands/tui/tui-io.js +8 -0
  37. package/dist/bin/commands/tui/tui-io.js.map +1 -0
  38. package/dist/bin/commands/tui/types.js +9 -0
  39. package/dist/bin/commands/tui/types.js.map +1 -1
  40. package/dist/bin/commands/tui/ws-handler.js +115 -23
  41. package/dist/bin/commands/tui/ws-handler.js.map +1 -1
  42. package/dist/bin/commands/worker.js +159 -0
  43. package/dist/bin/commands/worker.js.map +1 -0
  44. package/dist/bin/postinstall.js +0 -76
  45. package/dist/bin/postinstall.js.map +1 -1
  46. package/dist/lib/mcp/format-converters.js +21 -2
  47. package/dist/lib/mcp/format-converters.js.map +1 -1
  48. package/dist/lib/mcp/mcp-registry.js +75 -0
  49. package/dist/lib/mcp/mcp-registry.js.map +1 -0
  50. package/dist/lib/stt.js +1 -1
  51. package/dist/lib/stt.js.map +1 -1
  52. package/dist/lib/upload.js +7 -0
  53. package/dist/lib/upload.js.map +1 -1
  54. package/dist/scripts/fresh-install-smoke.js +1 -1
  55. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  56. package/dist/server.js +151 -22
  57. package/dist/server.js.map +1 -1
  58. package/dist/src/agent/agy-runtime.js +1 -0
  59. package/dist/src/agent/agy-runtime.js.map +1 -1
  60. package/dist/src/agent/agy-transcript-watcher.js +78 -0
  61. package/dist/src/agent/agy-transcript-watcher.js.map +1 -0
  62. package/dist/src/agent/agy-transcript.js +158 -0
  63. package/dist/src/agent/agy-transcript.js.map +1 -0
  64. package/dist/src/agent/args.js +51 -5
  65. package/dist/src/agent/args.js.map +1 -1
  66. package/dist/src/agent/claude-e-runtime.js +1 -1
  67. package/dist/src/agent/claude-e-runtime.js.map +1 -1
  68. package/dist/src/agent/codex-app-client.js +2 -2
  69. package/dist/src/agent/codex-app-client.js.map +1 -1
  70. package/dist/src/agent/cursor-runtime.js +1 -0
  71. package/dist/src/agent/cursor-runtime.js.map +1 -1
  72. package/dist/src/agent/error-classifier.js +6 -1
  73. package/dist/src/agent/error-classifier.js.map +1 -1
  74. package/dist/src/agent/events/claude.js +1 -0
  75. package/dist/src/agent/events/claude.js.map +1 -1
  76. package/dist/src/agent/events/codex.js +0 -44
  77. package/dist/src/agent/events/codex.js.map +1 -1
  78. package/dist/src/agent/events/helpers.js +52 -5
  79. package/dist/src/agent/events/helpers.js.map +1 -1
  80. package/dist/src/agent/events/opencode.js +6 -2
  81. package/dist/src/agent/events/opencode.js.map +1 -1
  82. package/dist/src/agent/events/summary.js +3 -2
  83. package/dist/src/agent/events/summary.js.map +1 -1
  84. package/dist/src/agent/events/tool-labels.js +8 -5
  85. package/dist/src/agent/events/tool-labels.js.map +1 -1
  86. package/dist/src/agent/kiro-auth.js +213 -0
  87. package/dist/src/agent/kiro-auth.js.map +1 -0
  88. package/dist/src/agent/kiro-models.js +79 -0
  89. package/dist/src/agent/kiro-models.js.map +1 -0
  90. package/dist/src/agent/kiro-runtime.js +314 -0
  91. package/dist/src/agent/kiro-runtime.js.map +1 -0
  92. package/dist/src/agent/lifecycle-handler.js +208 -23
  93. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  94. package/dist/src/agent/memory-flush-controller.js +3 -4
  95. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  96. package/dist/src/agent/resume-classifier.js +18 -1
  97. package/dist/src/agent/resume-classifier.js.map +1 -1
  98. package/dist/src/agent/session-persistence.js +2 -2
  99. package/dist/src/agent/session-persistence.js.map +1 -1
  100. package/dist/src/agent/smoke-detector.js +3 -0
  101. package/dist/src/agent/smoke-detector.js.map +1 -1
  102. package/dist/src/agent/spawn/queue.js +11 -5
  103. package/dist/src/agent/spawn/queue.js.map +1 -1
  104. package/dist/src/agent/spawn/resume.js +6 -1
  105. package/dist/src/agent/spawn/resume.js.map +1 -1
  106. package/dist/src/agent/spawn-env.js +1 -1
  107. package/dist/src/agent/spawn-env.js.map +1 -1
  108. package/dist/src/agent/spawn.js +231 -43
  109. package/dist/src/agent/spawn.js.map +1 -1
  110. package/dist/src/agent/watchdog.js +1 -1
  111. package/dist/src/agent/watchdog.js.map +1 -1
  112. package/dist/src/browser/actions.js +0 -8
  113. package/dist/src/browser/actions.js.map +1 -1
  114. package/dist/src/browser/adaptive-fetch/browser-escalation.js +5 -29
  115. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
  116. package/dist/src/browser/adaptive-fetch/browser-runtime.js +5 -14
  117. package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -1
  118. package/dist/src/browser/adaptive-fetch/browser-session.js +14 -28
  119. package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -1
  120. package/dist/src/browser/adaptive-fetch/challenge-detector.js +4 -26
  121. package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -1
  122. package/dist/src/browser/adaptive-fetch/content-scorer.js +5 -29
  123. package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -1
  124. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +0 -64
  125. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -1
  126. package/dist/src/browser/adaptive-fetch/fetcher.js +4 -19
  127. package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -1
  128. package/dist/src/browser/adaptive-fetch/human-loop.js +0 -26
  129. package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -1
  130. package/dist/src/browser/adaptive-fetch/index.js +74 -145
  131. package/dist/src/browser/adaptive-fetch/index.js.map +1 -1
  132. package/dist/src/browser/adaptive-fetch/metadata.js +1 -41
  133. package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -1
  134. package/dist/src/browser/adaptive-fetch/output.js +1 -18
  135. package/dist/src/browser/adaptive-fetch/output.js.map +1 -1
  136. package/dist/src/browser/adaptive-fetch/reader-adapters.js +43 -75
  137. package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -1
  138. package/dist/src/browser/adaptive-fetch/safety.js +5 -48
  139. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
  140. package/dist/src/browser/adaptive-fetch/third-party-readers.js +0 -11
  141. package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -1
  142. package/dist/src/browser/adaptive-fetch/trace.js +3 -18
  143. package/dist/src/browser/adaptive-fetch/trace.js.map +1 -1
  144. package/dist/src/browser/adaptive-fetch/transforms.js +0 -23
  145. package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -1
  146. package/dist/src/browser/adaptive-fetch/types.js +3 -0
  147. package/dist/src/browser/adaptive-fetch/types.js.map +1 -0
  148. package/dist/src/browser/adaptive-fetch/validators.js +0 -17
  149. package/dist/src/browser/adaptive-fetch/validators.js.map +1 -1
  150. package/dist/src/browser/adaptive-fetch/waf-profiles.js +0 -10
  151. package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -1
  152. package/dist/src/browser/connection.js +1 -1
  153. package/dist/src/browser/connection.js.map +1 -1
  154. package/dist/src/browser/web-ai/chatgpt-response.js +0 -1
  155. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  156. package/dist/src/browser/web-ai/chatgpt.js +0 -33
  157. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  158. package/dist/src/browser/web-ai/diagnostics.js +0 -16
  159. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  160. package/dist/src/browser/web-ai/doctor.js.map +1 -1
  161. package/dist/src/browser/web-ai/errors.js +1 -1
  162. package/dist/src/browser/web-ai/errors.js.map +1 -1
  163. package/dist/src/browser/web-ai/grok-live.js +2 -0
  164. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  165. package/dist/src/cli/claude-models.js +2 -2
  166. package/dist/src/cli/claude-models.js.map +1 -1
  167. package/dist/src/cli/command-context.js.map +1 -1
  168. package/dist/src/cli/commands.js +16 -4
  169. package/dist/src/cli/commands.js.map +1 -1
  170. package/dist/src/cli/compact.js +2 -1
  171. package/dist/src/cli/compact.js.map +1 -1
  172. package/dist/src/cli/handlers/session-handlers.js +34 -0
  173. package/dist/src/cli/handlers/session-handlers.js.map +1 -0
  174. package/dist/src/cli/handlers-project.js.map +1 -1
  175. package/dist/src/cli/handlers-runtime.js +2 -0
  176. package/dist/src/cli/handlers-runtime.js.map +1 -1
  177. package/dist/src/cli/handlers-workflows.js +85 -17
  178. package/dist/src/cli/handlers-workflows.js.map +1 -1
  179. package/dist/src/cli/handlers.js +84 -43
  180. package/dist/src/cli/handlers.js.map +1 -1
  181. package/dist/src/cli/readiness.js +17 -1
  182. package/dist/src/cli/readiness.js.map +1 -1
  183. package/dist/src/cli/registry-live.js +17 -0
  184. package/dist/src/cli/registry-live.js.map +1 -0
  185. package/dist/src/cli/registry.js +51 -10
  186. package/dist/src/cli/registry.js.map +1 -1
  187. package/dist/src/cli/tui/composer.js +135 -5
  188. package/dist/src/cli/tui/composer.js.map +1 -1
  189. package/dist/src/cli/tui/diffview.js +41 -0
  190. package/dist/src/cli/tui/diffview.js.map +1 -0
  191. package/dist/src/cli/tui/editor.js +45 -0
  192. package/dist/src/cli/tui/editor.js.map +1 -0
  193. package/dist/src/cli/tui/file-mention.js +78 -0
  194. package/dist/src/cli/tui/file-mention.js.map +1 -0
  195. package/dist/src/cli/tui/highlight.js +82 -0
  196. package/dist/src/cli/tui/highlight.js.map +1 -0
  197. package/dist/src/cli/tui/keymap.js +21 -0
  198. package/dist/src/cli/tui/keymap.js.map +1 -1
  199. package/dist/src/cli/tui/markdown.js +124 -0
  200. package/dist/src/cli/tui/markdown.js.map +1 -0
  201. package/dist/src/cli/tui/mode.js +26 -0
  202. package/dist/src/cli/tui/mode.js.map +1 -0
  203. package/dist/src/cli/tui/overlay.js +121 -98
  204. package/dist/src/cli/tui/overlay.js.map +1 -1
  205. package/dist/src/cli/tui/render/frame.js +72 -0
  206. package/dist/src/cli/tui/render/frame.js.map +1 -0
  207. package/dist/src/cli/tui/render/layout.js +22 -0
  208. package/dist/src/cli/tui/render/layout.js.map +1 -0
  209. package/dist/src/cli/tui/render/mouse.js +25 -0
  210. package/dist/src/cli/tui/render/mouse.js.map +1 -0
  211. package/dist/src/cli/tui/render/scheduler.js +37 -0
  212. package/dist/src/cli/tui/render/scheduler.js.map +1 -0
  213. package/dist/src/cli/tui/render/viewport.js +82 -0
  214. package/dist/src/cli/tui/render/viewport.js.map +1 -0
  215. package/dist/src/cli/tui/renderers.js +37 -0
  216. package/dist/src/cli/tui/renderers.js.map +1 -1
  217. package/dist/src/cli/tui/stream.js +48 -0
  218. package/dist/src/cli/tui/stream.js.map +1 -0
  219. package/dist/src/cli/tui/text-buffer.js +143 -0
  220. package/dist/src/cli/tui/text-buffer.js.map +1 -0
  221. package/dist/src/cli/tui/theme.js +128 -0
  222. package/dist/src/cli/tui/theme.js.map +1 -0
  223. package/dist/src/cli/tui/transcript.js +4 -0
  224. package/dist/src/cli/tui/transcript.js.map +1 -1
  225. package/dist/src/command-contract/help-renderer.js +1 -1
  226. package/dist/src/command-contract/help-renderer.js.map +1 -1
  227. package/dist/src/core/chat-sessions.js +63 -0
  228. package/dist/src/core/chat-sessions.js.map +1 -0
  229. package/dist/src/core/cli-detection.js +14 -0
  230. package/dist/src/core/cli-detection.js.map +1 -1
  231. package/dist/src/core/compact.js +43 -11
  232. package/dist/src/core/compact.js.map +1 -1
  233. package/dist/src/core/config.js +14 -1
  234. package/dist/src/core/config.js.map +1 -1
  235. package/dist/src/core/db.js +52 -12
  236. package/dist/src/core/db.js.map +1 -1
  237. package/dist/src/core/employees.js +2 -2
  238. package/dist/src/core/employees.js.map +1 -1
  239. package/dist/src/core/main-session.js +3 -2
  240. package/dist/src/core/main-session.js.map +1 -1
  241. package/dist/src/discord/bot.js.map +1 -1
  242. package/dist/src/discord/discord-file.js +1 -1
  243. package/dist/src/discord/discord-file.js.map +1 -1
  244. package/dist/src/discord/send-only-client.js +1 -3
  245. package/dist/src/discord/send-only-client.js.map +1 -1
  246. package/dist/src/goal/heartbeat.js +113 -7
  247. package/dist/src/goal/heartbeat.js.map +1 -1
  248. package/dist/src/goal/store.js +44 -5
  249. package/dist/src/goal/store.js.map +1 -1
  250. package/dist/src/ide/diff.js +37 -0
  251. package/dist/src/ide/diff.js.map +1 -1
  252. package/dist/src/manager/launchd-service.js +1 -1
  253. package/dist/src/manager/launchd-service.js.map +1 -1
  254. package/dist/src/manager/lifecycle-helpers.js +14 -0
  255. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  256. package/dist/src/manager/lifecycle-store.js.map +1 -1
  257. package/dist/src/manager/lifecycle.js +94 -5
  258. package/dist/src/manager/lifecycle.js.map +1 -1
  259. package/dist/src/manager/notes/routes.js +0 -31
  260. package/dist/src/manager/notes/routes.js.map +1 -1
  261. package/dist/src/manager/notes/ws.js.map +1 -1
  262. package/dist/src/manager/preview-link-policy.js +11 -4
  263. package/dist/src/manager/preview-link-policy.js.map +1 -1
  264. package/dist/src/manager/registry.js.map +1 -1
  265. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  266. package/dist/src/manager/scan.js +36 -1
  267. package/dist/src/manager/scan.js.map +1 -1
  268. package/dist/src/manager/server.js +42 -7
  269. package/dist/src/manager/server.js.map +1 -1
  270. package/dist/src/manager/shutdown.js +8 -3
  271. package/dist/src/manager/shutdown.js.map +1 -1
  272. package/dist/src/manager/systemd-service.js +1 -1
  273. package/dist/src/manager/systemd-service.js.map +1 -1
  274. package/dist/src/memory/indexing.js +49 -1
  275. package/dist/src/memory/indexing.js.map +1 -1
  276. package/dist/src/memory/keyword-expand.js +0 -187
  277. package/dist/src/memory/keyword-expand.js.map +1 -1
  278. package/dist/src/memory/runtime.js +3 -2
  279. package/dist/src/memory/runtime.js.map +1 -1
  280. package/dist/src/memory/shared.js.map +1 -1
  281. package/dist/src/messaging/send.js +66 -7
  282. package/dist/src/messaging/send.js.map +1 -1
  283. package/dist/src/orchestrator/collect.js +3 -2
  284. package/dist/src/orchestrator/collect.js.map +1 -1
  285. package/dist/src/orchestrator/distribute.js +9 -3
  286. package/dist/src/orchestrator/distribute.js.map +1 -1
  287. package/dist/src/orchestrator/friction.js +59 -0
  288. package/dist/src/orchestrator/friction.js.map +1 -0
  289. package/dist/src/orchestrator/gateway.js +4 -4
  290. package/dist/src/orchestrator/gateway.js.map +1 -1
  291. package/dist/src/orchestrator/pipeline.js +89 -45
  292. package/dist/src/orchestrator/pipeline.js.map +1 -1
  293. package/dist/src/orchestrator/sanitize.js +69 -0
  294. package/dist/src/orchestrator/sanitize.js.map +1 -0
  295. package/dist/src/orchestrator/seed.js +50 -0
  296. package/dist/src/orchestrator/seed.js.map +1 -0
  297. package/dist/src/orchestrator/state-machine.js +215 -76
  298. package/dist/src/orchestrator/state-machine.js.map +1 -1
  299. package/dist/src/orchestrator/worker-monitor.js +1 -1
  300. package/dist/src/orchestrator/worker-monitor.js.map +1 -1
  301. package/dist/src/orchestrator/worker-progress.js +29 -0
  302. package/dist/src/orchestrator/worker-progress.js.map +1 -0
  303. package/dist/src/orchestrator/worker-registry.js +63 -2
  304. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  305. package/dist/src/prompt/builder.js +190 -115
  306. package/dist/src/prompt/builder.js.map +1 -1
  307. package/dist/src/prompt/templates/a1-system.md +124 -61
  308. package/dist/src/prompt/templates/control-system.md +2 -2
  309. package/dist/src/prompt/templates/employee.md +41 -56
  310. package/dist/src/prompt/templates/orchestration.md +23 -8
  311. package/dist/src/prompt/templates/skills.md +6 -0
  312. package/dist/src/routes/browser.js +3 -3
  313. package/dist/src/routes/browser.js.map +1 -1
  314. package/dist/src/routes/employees.js +4 -4
  315. package/dist/src/routes/employees.js.map +1 -1
  316. package/dist/src/routes/goal.js +48 -4
  317. package/dist/src/routes/goal.js.map +1 -1
  318. package/dist/src/routes/heartbeat.js +1 -1
  319. package/dist/src/routes/heartbeat.js.map +1 -1
  320. package/dist/src/routes/i18n.js +1 -1
  321. package/dist/src/routes/i18n.js.map +1 -1
  322. package/dist/src/routes/jaw-memory.js +1 -1
  323. package/dist/src/routes/jaw-memory.js.map +1 -1
  324. package/dist/src/routes/memory.js.map +1 -1
  325. package/dist/src/routes/messaging.js +8 -3
  326. package/dist/src/routes/messaging.js.map +1 -1
  327. package/dist/src/routes/orchestrate.js +267 -117
  328. package/dist/src/routes/orchestrate.js.map +1 -1
  329. package/dist/src/routes/quota-agy-reverse.js +6 -5
  330. package/dist/src/routes/quota-agy-reverse.js.map +1 -1
  331. package/dist/src/routes/quota-kiro-reverse.js +187 -0
  332. package/dist/src/routes/quota-kiro-reverse.js.map +1 -0
  333. package/dist/src/routes/quota.js +68 -6
  334. package/dist/src/routes/quota.js.map +1 -1
  335. package/dist/src/routes/settings.js +37 -8
  336. package/dist/src/routes/settings.js.map +1 -1
  337. package/dist/src/routes/skills.js.map +1 -1
  338. package/dist/src/security/path-guards.js +0 -3
  339. package/dist/src/security/path-guards.js.map +1 -1
  340. package/dist/src/security/security-audit-log.js.map +1 -1
  341. package/dist/src/shared/shell-command-display.js +51 -0
  342. package/dist/src/shared/shell-command-display.js.map +1 -0
  343. package/dist/src/telegram/bot.js.map +1 -1
  344. package/dist/src/trace/store.js +32 -0
  345. package/dist/src/trace/store.js.map +1 -1
  346. package/dist/src/types/cli-engine.js +1 -0
  347. package/dist/src/types/cli-engine.js.map +1 -1
  348. package/dist/src/workflows/employee-boundary.js +7 -7
  349. package/dist/src/workflows/employee-boundary.js.map +1 -1
  350. package/dist/src/workflows/handoff.js +16 -16
  351. package/dist/src/workflows/handoff.js.map +1 -1
  352. package/dist/src/workflows/scope-sandbox.js +58 -0
  353. package/dist/src/workflows/scope-sandbox.js.map +1 -0
  354. package/package.json +1 -1
  355. package/public/assets/providers/kiro-color.svg +15 -0
  356. package/public/assets/providers/kiro.svg +14 -0
  357. package/public/css/chat.css +27 -0
  358. package/public/css/modals.css +79 -0
  359. package/public/css/orc-state.css +10 -6
  360. package/public/css/sidebar.css +85 -0
  361. package/public/css/variables.css +6 -2
  362. package/public/dist/assets/{Agent-CIUGaUVn.js → Agent-DBKNQ6tp.js} +1 -1
  363. package/public/dist/assets/{DocPanel-C1pGgE-S.js → DocPanel-BU16GUlB.js} +1 -1
  364. package/public/dist/assets/DocPanel-gU-WkgyA.css +1 -0
  365. package/public/dist/assets/Employees-F0ssNuO-.js +1 -0
  366. package/public/dist/assets/{FolderPanel-DSkanaGN.js → FolderPanel-DT0fU8f2.js} +1 -1
  367. package/public/dist/assets/Heartbeat-fsuLzY9c.js +1 -0
  368. package/public/dist/assets/Mcp-_Yq4N3Sk.js +4 -0
  369. package/public/dist/assets/{Memory-BgN8djV4.js → Memory-CRR8kotI.js} +1 -1
  370. package/public/dist/assets/{ModelProvider-DHQ1Zvw0.js → ModelProvider-DQgISbKw.js} +1 -1
  371. package/public/dist/assets/agent-meta-C4mauPL5.js +1 -0
  372. package/public/dist/assets/app-0OQhPpTG.css +1 -0
  373. package/public/dist/assets/app-CSqIyg9A.js +55 -0
  374. package/public/dist/assets/constants-BHMkzpN_.js +1 -0
  375. package/public/dist/assets/{employees-DiNLzEXS.js → employees-CZdWHH-r.js} +7 -7
  376. package/public/dist/assets/idb-cache-0LNMskFB.js +1 -0
  377. package/public/dist/assets/idb-cache-5H89a4l8.js +1 -0
  378. package/public/dist/assets/manager-CGTQ5EIm.js +12 -0
  379. package/public/dist/assets/manager-UBunDqMH.css +1 -0
  380. package/public/dist/assets/{memory-B_nn0A4v.js → memory-B3QSmj_e.js} +9 -9
  381. package/public/dist/assets/memory-DOBqiuPc.js +1 -0
  382. package/public/dist/assets/{provider-icons-XEfJPGTe.js → provider-icons-Crv6yvlG.js} +35 -6
  383. package/public/dist/assets/render-J11oxfnl.js +28 -0
  384. package/public/dist/assets/settings-BV_2Bh0_.js +1 -0
  385. package/public/dist/assets/settings-m_cim0ov.js +151 -0
  386. package/public/dist/assets/sidebar-ZBXdBgF7.js +49 -0
  387. package/public/dist/assets/{skills-COa4iSwL.js → skills-CjaBmIPV.js} +6 -6
  388. package/public/dist/assets/skills-Xm3fl1zr.js +1 -0
  389. package/public/dist/assets/{slash-commands-C_ePvrPi.js → slash-commands-71jc07Wf.js} +1 -1
  390. package/public/dist/assets/slash-commands-BO6ssnAz.js +1 -0
  391. package/public/dist/assets/{trace-drawer-CY4z_Ie8.js → trace-drawer-Czvf2P2o.js} +1 -1
  392. package/public/dist/assets/ui-CverZJnd.js +1 -0
  393. package/public/dist/assets/ui-qKxy-4p9.js +142 -0
  394. package/public/dist/index.html +113 -86
  395. package/public/dist/manager/index.html +2 -2
  396. package/public/index.html +111 -84
  397. package/public/js/constants.ts +34 -11
  398. package/public/js/features/chat-messages.ts +13 -2
  399. package/public/js/features/chat-search.ts +5 -1
  400. package/public/js/features/chat.ts +86 -44
  401. package/public/js/features/employees.ts +7 -2
  402. package/public/js/features/idb-cache.ts +4 -0
  403. package/public/js/features/media-lightbox.ts +40 -0
  404. package/public/js/features/message-history.ts +55 -7
  405. package/public/js/features/pending-queue.ts +28 -4
  406. package/public/js/features/process-block.ts +32 -17
  407. package/public/js/features/process-log-adapter.ts +11 -2
  408. package/public/js/features/settings-cli-status-render.ts +161 -0
  409. package/public/js/features/settings-cli-status.ts +136 -187
  410. package/public/js/features/settings-core.ts +5 -1
  411. package/public/js/features/settings-mcp.ts +513 -7
  412. package/public/js/features/settings-types.ts +1 -0
  413. package/public/js/features/settings.ts +1 -1
  414. package/public/js/features/tool-ui.ts +18 -4
  415. package/public/js/features/transport-status-row.ts +3 -0
  416. package/public/js/features/ui-status.ts +5 -1
  417. package/public/js/main.ts +5 -0
  418. package/public/js/preview-parent-origin.ts +14 -0
  419. package/public/js/provider-icons.ts +6 -1
  420. package/public/js/render/file-links.ts +10 -2
  421. package/public/js/render/markdown.ts +16 -0
  422. package/public/js/ui.ts +8 -1
  423. package/public/js/virtual-scroll.ts +19 -0
  424. package/public/js/ws.ts +151 -15
  425. package/public/locales/en.json +9 -2
  426. package/public/locales/ja.json +9 -2
  427. package/public/locales/ko.json +9 -2
  428. package/public/locales/zh.json +9 -2
  429. package/public/manager/src/App.tsx +13 -70
  430. package/public/manager/src/InstancePreview.tsx +56 -11
  431. package/public/manager/src/SidebarRailRouter.tsx +32 -4
  432. package/public/manager/src/components/InstanceRow.tsx +0 -1
  433. package/public/manager/src/components/WorkbenchHeader.tsx +17 -7
  434. package/public/manager/src/doc-panel/DocPanel.tsx +14 -1
  435. package/public/manager/src/doc-panel/doc-panel.css +16 -0
  436. package/public/manager/src/folder-panel/FolderPanel.tsx +13 -2
  437. package/public/manager/src/hooks/useElectronDroppedPaths.ts +89 -0
  438. package/public/manager/src/hooks/useInstanceMessageEvents.ts +4 -15
  439. package/public/manager/src/manager-components.css +35 -1
  440. package/public/manager/src/manager-polish.css +11 -1
  441. package/public/manager/src/manager-shortcut-runner.ts +107 -0
  442. package/public/manager/src/manager-shortcuts.ts +15 -0
  443. package/public/manager/src/panels/desktop-bridge.ts +13 -0
  444. package/public/manager/src/settings/SettingsSidebar.tsx +1 -1
  445. package/public/manager/src/settings/components/sidebar-filter.ts +2 -0
  446. package/public/manager/src/settings/pages/Mcp.tsx +311 -43
  447. package/public/manager/src/settings/pages/components/McpServerCard.tsx +89 -55
  448. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +32 -9
  449. package/public/manager/src/settings/pages/components/employees-helpers.ts +1 -0
  450. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +1 -0
  451. package/public/manager/src/settings/pages/mcp-helpers.ts +54 -12
  452. package/public/manager/src/settings/types.ts +1 -0
  453. package/public/manager/src/types.ts +2 -1
  454. package/scripts/fresh-install-smoke.ts +1 -1
  455. package/scripts/smoke/agy-transcript-tail-smoke.mjs +89 -0
  456. package/public/dist/assets/DocPanel-CL1scIfq.css +0 -1
  457. package/public/dist/assets/Employees-BL9MAzzx.js +0 -1
  458. package/public/dist/assets/Heartbeat-D64JCg4t.js +0 -1
  459. package/public/dist/assets/Mcp-wYwJA_61.js +0 -3
  460. package/public/dist/assets/agent-meta-BhEbjy4P.js +0 -1
  461. package/public/dist/assets/app-2Rz848bQ.js +0 -48
  462. package/public/dist/assets/app-BW-Xz2p6.css +0 -1
  463. package/public/dist/assets/constants-ahKI_aEG.js +0 -1
  464. package/public/dist/assets/idb-cache-BnZfG5FD.js +0 -1
  465. package/public/dist/assets/idb-cache-CZ3JdK8r.js +0 -1
  466. package/public/dist/assets/manager-CfyZloIP.js +0 -12
  467. package/public/dist/assets/manager-DyrwJLZr.css +0 -1
  468. package/public/dist/assets/memory-CCjNFWmO.js +0 -1
  469. package/public/dist/assets/render-CgDEBoCX.js +0 -28
  470. package/public/dist/assets/settings-CY_6tGuS.js +0 -1
  471. package/public/dist/assets/settings-DWW4GzNc.js +0 -66
  472. package/public/dist/assets/sidebar-DQKE5IA1.js +0 -23
  473. package/public/dist/assets/skills-DYTlqoke.js +0 -1
  474. package/public/dist/assets/slash-commands-D7CU5oso.js +0 -1
  475. package/public/dist/assets/ui-Car1OUvV.js +0 -1
  476. package/public/dist/assets/ui-DK_9ndj0.js +0 -140
  477. /package/public/dist/assets/{locale-DT1WRaeJ.js → locale-BHMJIzyw.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"worker-monitor.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-monitor.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,2DAA2D;AAC3D,6DAA6D;AAW7D,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACtD,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;QACvC,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEvB,OAAO;QACH,KAAK,CAAC,MAAiD;YACnD,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,GAAG,KAAK,CAAC;YACpB,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAmB;YACpB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;QACD,IAAI;YACA,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;KACJ,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"worker-monitor.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-monitor.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,2DAA2D;AAC3D,6DAA6D;AAW7D,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACtD,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;QACvC,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEvB,OAAO;QACH,KAAK,CAAC,OAAkD;YACpD,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,GAAG,KAAK,CAAC;YACpB,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAmB;YACpB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;QACD,IAAI;YACA,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { sanitizeToolLogForDurableStorage, } from '../shared/tool-log-sanitize.js';
2
+ import { displayShellCommand, displayShellCommandDetail, } from '../shared/shell-command-display.js';
3
+ export function isThinkingEntry(entry) {
4
+ const type = String(entry.toolType || '').toLowerCase();
5
+ const label = String(entry.label || '').toLowerCase();
6
+ return type === 'thinking' || entry.icon === '💭' || label.includes('thinking') || label.includes('reasoning');
7
+ }
8
+ export function sanitizeWorkerProgressTools(entries) {
9
+ const sanitized = sanitizeToolLogForDurableStorage(entries);
10
+ return sanitized
11
+ .filter((entry) => !isThinkingEntry(entry))
12
+ .map((entry) => {
13
+ const detail = entry.detail
14
+ ? displayShellCommandDetail(entry.detail).replace(/\s+/g, ' ').trim().slice(0, 240)
15
+ : '';
16
+ return {
17
+ ...entry,
18
+ label: displayShellCommand(entry.label),
19
+ ...(detail ? { detail } : {}),
20
+ };
21
+ });
22
+ }
23
+ export function previewText(value, max = 200) {
24
+ const text = String(value || '').replace(/\s+/g, ' ').trim();
25
+ if (!text)
26
+ return undefined;
27
+ return text.length > max ? `${text.slice(0, max - 1)}…` : text;
28
+ }
29
+ //# sourceMappingURL=worker-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-progress.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gCAAgC,GAEnC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,mBAAmB,EACnB,yBAAyB,GAC5B,MAAM,oCAAoC,CAAC;AAwB5C,MAAM,UAAU,eAAe,CAAC,KAAiE;IAC7F,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IACxD,MAAM,SAAS,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;IAC5D,OAAO,SAAS;SACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC1C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACX,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;YACvB,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACnF,CAAC,CAAC,EAAE,CAAC;QACT,OAAO;YACH,GAAG,KAAK;YACR,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;IACN,CAAC,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,GAAG,GAAG,GAAG;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC"}
@@ -1,7 +1,9 @@
1
1
  // ─── Worker Registry ────────────────────────────────
2
2
  // In-memory registry tracking worker ownership and result handoff.
3
3
  import { stripUndefined } from '../core/strip-undefined.js';
4
+ import { previewText, sanitizeWorkerProgressTools, } from './worker-progress.js';
4
5
  const workers = new Map();
6
+ const previousRuns = new Map();
5
7
  // Phase 7: thrown when a worker slot with the same agentId is already running.
6
8
  // Prevents double-dispatch from overwriting the in-flight slot and losing results.
7
9
  export class WorkerBusyError extends Error {
@@ -31,6 +33,8 @@ export function claimWorker(emp, task, replayMeta) {
31
33
  replayClaimed: false,
32
34
  replayAttempts: 0,
33
35
  result: null,
36
+ tools: [],
37
+ progressUpdatedAt: null,
34
38
  replayMeta: replayMeta && Object.keys(replayMeta).length ? { ...replayMeta } : undefined,
35
39
  });
36
40
  workers.set(emp.id, slot);
@@ -46,13 +50,42 @@ export function updateWorkerPhase(agentId, phase, phaseLabel) {
46
50
  slot.phase = phase;
47
51
  slot.phaseLabel = phaseLabel;
48
52
  }
49
- export function finishWorker(agentId, result) {
53
+ function toProgressRun(slot) {
54
+ const resultPreview = previewText(slot.result, 240);
55
+ return {
56
+ agentId: slot.agentId,
57
+ employeeName: slot.employeeName,
58
+ state: slot.state,
59
+ taskPreview: previewText(slot.task, 200) || '',
60
+ startedAt: slot.startedAt,
61
+ completedAt: slot.completedAt,
62
+ progressUpdatedAt: slot.progressUpdatedAt,
63
+ ...(resultPreview ? { resultPreview } : {}),
64
+ tools: slot.tools,
65
+ };
66
+ }
67
+ function rememberCompletedRun(slot) {
68
+ if (slot.state === 'running')
69
+ return;
70
+ previousRuns.set(slot.agentId, toProgressRun(slot));
71
+ }
72
+ export function updateWorkerTools(agentId, tools) {
73
+ const slot = workers.get(agentId);
74
+ if (!slot)
75
+ return;
76
+ slot.tools = sanitizeWorkerProgressTools(tools);
77
+ slot.progressUpdatedAt = Date.now();
78
+ }
79
+ export function finishWorker(agentId, result, tools = []) {
50
80
  const slot = workers.get(agentId);
51
81
  if (!slot)
52
82
  return;
53
83
  slot.state = 'done';
54
84
  slot.completedAt = Date.now();
55
85
  slot.result = result;
86
+ if (tools.length > 0)
87
+ updateWorkerTools(agentId, tools);
88
+ rememberCompletedRun(slot);
56
89
  slot.pendingReplay = true;
57
90
  }
58
91
  export function failWorker(agentId, result) {
@@ -62,6 +95,7 @@ export function failWorker(agentId, result) {
62
95
  slot.state = 'failed';
63
96
  slot.completedAt = Date.now();
64
97
  slot.result = result;
98
+ rememberCompletedRun(slot);
65
99
  slot.pendingReplay = false; // Failed workers don't need replay — no result to feed back to Boss
66
100
  }
67
101
  export function cancelWorker(agentId) {
@@ -71,8 +105,28 @@ export function cancelWorker(agentId) {
71
105
  slot.state = 'cancelled';
72
106
  slot.completedAt = Date.now();
73
107
  slot.pendingReplay = false;
108
+ rememberCompletedRun(slot);
74
109
  workers.delete(agentId);
75
110
  }
111
+ export function getWorkerProgressSnapshot(agentId) {
112
+ const slot = workers.get(agentId);
113
+ const previous = previousRuns.get(agentId) || null;
114
+ if (!slot && !previous)
115
+ return null;
116
+ return {
117
+ agentId,
118
+ employeeName: slot?.employeeName || previous?.employeeName || agentId,
119
+ current: slot?.state === 'running' ? toProgressRun(slot) : null,
120
+ previous: slot && slot.state !== 'running' ? toProgressRun(slot) : previous,
121
+ generatedAt: Date.now(),
122
+ };
123
+ }
124
+ export function listWorkerProgressSnapshots() {
125
+ const ids = new Set([...workers.keys(), ...previousRuns.keys()]);
126
+ return [...ids]
127
+ .map(getWorkerProgressSnapshot)
128
+ .filter((value) => Boolean(value));
129
+ }
76
130
  export function getActiveWorkers() {
77
131
  return [...workers.values()].filter((slot) => slot.state === 'running');
78
132
  }
@@ -94,7 +148,12 @@ export function listPendingWorkerResults() {
94
148
  const results = [];
95
149
  for (const slot of workers.values()) {
96
150
  if (slot.state === 'done' && slot.pendingReplay && !slot.replayClaimed && slot.result !== null) {
97
- results.push(stripUndefined({ agentId: slot.agentId, text: slot.result, meta: slot.replayMeta }));
151
+ results.push(stripUndefined({
152
+ agentId: slot.agentId,
153
+ text: slot.result,
154
+ tools: slot.tools.length > 0 ? slot.tools : undefined,
155
+ meta: slot.replayMeta,
156
+ }));
98
157
  }
99
158
  }
100
159
  return results;
@@ -125,9 +184,11 @@ export function releaseWorkerReplay(agentId) {
125
184
  console.error(`[worker-registry] ${agentId} replay failed 3 times — marking as failed`);
126
185
  slot.state = 'failed';
127
186
  slot.pendingReplay = false;
187
+ rememberCompletedRun(slot);
128
188
  }
129
189
  }
130
190
  export function clearAllWorkers() {
131
191
  workers.clear();
192
+ previousRuns.clear();
132
193
  }
133
194
  //# sourceMappingURL=worker-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-registry.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-registry.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-registry.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,13 @@ import fs from 'fs';
2
2
  import os from 'os';
3
3
  import { createHash } from 'crypto';
4
4
  import { join } from 'path';
5
- import { settings, JAW_HOME, PROMPTS_DIR, SKILLS_DIR, SKILLS_REF_DIR, loadHeartbeatFile, deriveCdpPort } from '../core/config.js';
5
+ import { settings, JAW_HOME, PROMPTS_DIR, SKILLS_DIR, SKILLS_REF_DIR, loadHeartbeatFile, deriveCdpPort, getProjectDirs } from '../core/config.js';
6
6
  import { expandHomePath } from '../core/path-expand.js';
7
7
  import { stripUndefined } from '../core/strip-undefined.js';
8
8
  import { getEmployees } from '../core/db.js';
9
9
  import { memoryFlushCounter } from '../agent/spawn.js';
10
10
  import { describeHeartbeatSchedule, normalizeHeartbeatSchedule } from '../memory/heartbeat-schedule.js';
11
- import { buildTaskSnapshot, getMemoryStatus, loadProfileSummary } from '../memory/runtime.js';
11
+ import { buildTaskSnapshot, loadProfileSummary } from '../memory/runtime.js';
12
12
  import { buildMemoryInjection } from '../memory/injection.js';
13
13
  import { loadAndRender, loadTemplate, renderTemplate, parseWorkerContexts, clearTemplateCache } from './template-loader.js';
14
14
  import { findStaticEmployee } from '../core/employees.js';
@@ -21,6 +21,101 @@ function getRepoBundledSkillPath(...parts) {
21
21
  function findFirstExistingPath(paths) {
22
22
  return paths.find(p => fs.existsSync(p)) || null;
23
23
  }
24
+ function findSkillPath(skillName) {
25
+ return findFirstExistingPath([
26
+ join(SKILLS_DIR, skillName, 'SKILL.md'),
27
+ join(SKILLS_REF_DIR, skillName, 'SKILL.md'),
28
+ getRepoBundledSkillPath('skills', skillName, 'SKILL.md'),
29
+ getRepoBundledSkillPath('skills_ref', skillName, 'SKILL.md'),
30
+ ]);
31
+ }
32
+ function normalizeSkillDescription(description) {
33
+ return String(description || '')
34
+ .trim()
35
+ .replace(/^["']|["']$/g, '')
36
+ .replace(/\s+/g, ' ');
37
+ }
38
+ function normalizeSkillMetadataList(value) {
39
+ if (Array.isArray(value))
40
+ return value.map(v => String(v).trim()).filter(Boolean);
41
+ const raw = String(value || '').trim();
42
+ if (!raw)
43
+ return [];
44
+ const unwrapped = raw.replace(/^\[/, '').replace(/\]$/, '');
45
+ return unwrapped.split(',').map(v => v.trim().replace(/^["']|["']$/g, '')).filter(Boolean);
46
+ }
47
+ function parseTopLevelSkillMetadataList(content, field) {
48
+ const match = content.match(new RegExp(`^${field}:\\s*(.+)$`, 'm'));
49
+ return normalizeSkillMetadataList(match?.[1]);
50
+ }
51
+ function parseSkillMetadataObject(content) {
52
+ const frontmatter = content.match(/^---\n([\s\S]*?)\n---/);
53
+ const source = frontmatter?.[1] || content;
54
+ const metadataMatch = source.match(/^metadata:\s*\n([\s\S]*)$/m);
55
+ if (!metadataMatch?.[1])
56
+ return {};
57
+ let raw = metadataMatch[1];
58
+ const nextTopLevelKey = raw.search(/\n[A-Za-z0-9_-]+:\s*/);
59
+ if (nextTopLevelKey >= 0)
60
+ raw = raw.slice(0, nextTopLevelKey);
61
+ try {
62
+ const parsed = JSON.parse(raw.trim());
63
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
64
+ }
65
+ catch {
66
+ return {};
67
+ }
68
+ }
69
+ function parseSkillMetadataList(content, field) {
70
+ const topLevel = parseTopLevelSkillMetadataList(content, field);
71
+ const metadata = parseSkillMetadataObject(content);
72
+ const nested = normalizeSkillMetadataList(metadata[field]);
73
+ return [...new Set([...topLevel, ...nested])];
74
+ }
75
+ function formatSkillRoutingMetadata(skill) {
76
+ const keywords = normalizeSkillMetadataList(skill.keywords);
77
+ const triggers = normalizeSkillMetadataList(skill.triggers);
78
+ const parts = [];
79
+ if (keywords.length)
80
+ parts.push(`keywords: ${keywords.join(', ')}`);
81
+ if (triggers.length)
82
+ parts.push(`triggers: ${triggers.join(', ')}`);
83
+ return parts.length ? ` [${parts.join('; ')}]` : '';
84
+ }
85
+ function readSkillMetadata(skillName, skillPath) {
86
+ if (!skillPath || !fs.existsSync(skillPath))
87
+ return { name: skillName, description: '', keywords: [], triggers: [] };
88
+ try {
89
+ const content = fs.readFileSync(skillPath, 'utf8');
90
+ const nameMatch = content.match(/^name:\s*(.+)/m);
91
+ const descMatch = content.match(/^description:\s*"?(.+?)"?\s*$/m);
92
+ return {
93
+ name: nameMatch?.[1]?.trim() || skillName,
94
+ description: normalizeSkillDescription(descMatch?.[1]),
95
+ keywords: parseSkillMetadataList(content, 'keywords'),
96
+ triggers: parseSkillMetadataList(content, 'triggers'),
97
+ };
98
+ }
99
+ catch {
100
+ return { name: skillName, description: '', keywords: [], triggers: [] };
101
+ }
102
+ }
103
+ export function formatSkillListItem(skill) {
104
+ const name = String(skill.name || skill.id).trim();
105
+ const label = name && name !== skill.id ? `${name} (${skill.id})` : skill.id;
106
+ const description = normalizeSkillDescription(skill.description);
107
+ const routing = formatSkillRoutingMetadata(skill);
108
+ return description ? `- ${label} — ${description}${routing}` : `- ${label}${routing}`;
109
+ }
110
+ function formatSkillPath(skillName, skillPath) {
111
+ if (!skillPath)
112
+ return `${skillName}: unavailable`;
113
+ const meta = readSkillMetadata(skillName, skillPath);
114
+ const label = meta.name && meta.name !== skillName ? `${meta.name} (${skillName})` : skillName;
115
+ return meta.description
116
+ ? `${label}: ${skillPath} — ${meta.description}${formatSkillRoutingMetadata(meta)}`
117
+ : `${label}: ${skillPath}${formatSkillRoutingMetadata(meta)}`;
118
+ }
24
119
  // ─── Legacy A1 Source Hashes ─────────────────────────
25
120
  // MD5 hashes of source templates (unrendered) for every historical pre-hash version.
26
121
  // Used to identify known stock files during pre-hash migration.
@@ -64,6 +159,8 @@ export function loadActiveSkills() {
64
159
  id: d.name,
65
160
  name: nameMatch?.[1]?.trim() || d.name,
66
161
  description: descMatch?.[1]?.trim() || '',
162
+ keywords: parseSkillMetadataList(content, 'keywords'),
163
+ triggers: parseSkillMetadataList(content, 'triggers'),
67
164
  content,
68
165
  };
69
166
  })
@@ -148,6 +245,8 @@ const DESKTOP_CONTROL_ANCHOR_OPEN = '<!-- anchor:desktop-control -->';
148
245
  const DESKTOP_CONTROL_ANCHOR_CLOSE = '<!-- /anchor:desktop-control -->';
149
246
  const DASHBOARD_CONNECTOR_ANCHOR_OPEN = '<!-- anchor:dashboard-connector-intent -->';
150
247
  const DASHBOARD_CONNECTOR_ANCHOR_CLOSE = '<!-- /anchor:dashboard-connector-intent -->';
248
+ const SESSION_POLL_ANCHOR_OPEN = '<!-- anchor:session-poll -->';
249
+ const SESSION_POLL_ANCHOR_CLOSE = '<!-- /anchor:session-poll -->';
151
250
  function extractAnchorBlock(rendered, open, close) {
152
251
  const start = rendered.indexOf(open);
153
252
  const end = rendered.indexOf(close);
@@ -164,14 +263,6 @@ function appendAnchorIfMissing(fileContent, rendered, open, close) {
164
263
  const sep = fileContent.endsWith('\n') ? '\n' : '\n\n';
165
264
  return fileContent + sep + block + '\n';
166
265
  }
167
- /**
168
- * Extract the Desktop/Browser Control anchor block from the rendered A1
169
- * template. Returns null when the template lacks the anchor pair (keeps
170
- * future refactors from silently producing empty appends).
171
- */
172
- function extractDesktopControlAnchor(rendered) {
173
- return extractAnchorBlock(rendered, DESKTOP_CONTROL_ANCHOR_OPEN, DESKTOP_CONTROL_ANCHOR_CLOSE);
174
- }
175
266
  /**
176
267
  * Safely append the Desktop/Browser Control anchor block to a user-edited
177
268
  * A1 file when the anchor is missing. Returns true when an append was made.
@@ -182,6 +273,9 @@ function ensureDesktopControlAnchor(fileContent, rendered) {
182
273
  function ensureDashboardConnectorAnchor(fileContent, rendered) {
183
274
  return appendAnchorIfMissing(fileContent, rendered, DASHBOARD_CONNECTOR_ANCHOR_OPEN, DASHBOARD_CONNECTOR_ANCHOR_CLOSE);
184
275
  }
276
+ function ensureSessionPollAnchor(fileContent, rendered) {
277
+ return appendAnchorIfMissing(fileContent, rendered, SESSION_POLL_ANCHOR_OPEN, SESSION_POLL_ANCHOR_CLOSE);
278
+ }
185
279
  // ─── Initialize prompt files ─────────────────────────
186
280
  export function initPromptFiles() {
187
281
  const a1Content = getA1Content();
@@ -217,7 +311,12 @@ export function initPromptFiles() {
217
311
  userText = appendedConnector;
218
312
  console.log('[prompt] A-1.md: appended dashboard-connector-intent anchor (user edits preserved)');
219
313
  }
220
- if (appendedDesktop || appendedConnector) {
314
+ const appendedSessionPoll = ensureSessionPollAnchor(userText, a1Content);
315
+ if (appendedSessionPoll) {
316
+ userText = appendedSessionPoll;
317
+ console.log('[prompt] A-1.md: appended session-poll anchor (user edits preserved)');
318
+ }
319
+ if (appendedDesktop || appendedConnector || appendedSessionPoll) {
221
320
  fs.writeFileSync(A1_PATH, userText);
222
321
  }
223
322
  else {
@@ -335,21 +434,6 @@ function appendLegacyMemoryContext(prompt) {
335
434
  catch { /* memory not ready */ }
336
435
  return next;
337
436
  }
338
- function appendAdvancedMemoryContext(prompt, currentPrompt, providedSnapshot = '') {
339
- let next = prompt;
340
- const profile = loadProfileSummary(800);
341
- const snapshot = providedSnapshot || buildTaskSnapshot(currentPrompt, 2800);
342
- next += '\n\n---\n## Memory Runtime\n';
343
- next += '- indexed memory context is active\n';
344
- next += '- use task snapshot and profile context before assuming missing memory\n';
345
- if (profile) {
346
- next += '\n\n## Profile Context\n' + profile;
347
- }
348
- if (snapshot) {
349
- next += '\n\n' + snapshot;
350
- }
351
- return next;
352
- }
353
437
  export function shouldIncludeVisionClickHint(activeCli) {
354
438
  return activeCli === 'codex';
355
439
  }
@@ -358,9 +442,13 @@ export function getSystemPrompt(opts = {}) {
358
442
  const a1 = fs.existsSync(A1_PATH) ? fs.readFileSync(A1_PATH, 'utf8') : getA1Content();
359
443
  const a2 = fs.existsSync(A2_PATH) ? fs.readFileSync(A2_PATH, 'utf8') : '';
360
444
  let prompt = `${a1}\n\n${a2}`;
445
+ const projectDirs = getProjectDirs();
446
+ if (projectDirs && projectDirs.length > 0) {
447
+ const rootLines = projectDirs.map(d => `Project root: ${d}`).join('\n');
448
+ prompt = `${rootLines}\n\n${prompt}`;
449
+ }
361
450
  const currentPrompt = String(opts.currentPrompt || '').trim();
362
451
  const forDisk = opts.forDisk === true;
363
- const mem = getMemoryStatus();
364
452
  // Phase 15: Telegram guidance is now part of A1_CONTENT (hardcoded)
365
453
  // No dynamic injection needed — Bot-First policy with curl examples included
366
454
  if (!forDisk) {
@@ -433,7 +521,10 @@ export function getSystemPrompt(opts = {}) {
433
521
  prompt += '\n\n---\n' + renderTemplate(loadTemplate('heartbeat-jobs.md'), vars);
434
522
  }
435
523
  }
436
- catch { /* heartbeat.json not ready */ }
524
+ catch (error) {
525
+ prompt += '\n\n---\n## Heartbeat Jobs\n';
526
+ prompt += `Heartbeat file failed to load: ${error.message}\n`;
527
+ }
437
528
  try {
438
529
  const activeSkills = loadActiveSkills();
439
530
  const refSkills = loadSkillRegistry();
@@ -443,9 +534,21 @@ export function getSystemPrompt(opts = {}) {
443
534
  prompt += '\n\n---\n## Skills System\n';
444
535
  const vars = getTemplateVars();
445
536
  vars["ACTIVE_SKILLS_COUNT"] = String(activeSkills.length);
446
- vars["ACTIVE_SKILLS_LIST"] = activeSkills.map(s => `- ${s.name} (${s.id})`).join('\n');
537
+ vars["ACTIVE_SKILLS_LIST"] = activeSkills.map(s => formatSkillListItem({
538
+ id: s.id,
539
+ name: s.name,
540
+ description: s.description,
541
+ keywords: s.keywords,
542
+ triggers: s.triggers,
543
+ })).join('\n');
447
544
  vars["REF_SKILLS_COUNT"] = String(availableRef.length);
448
- vars["REF_SKILLS_LIST"] = availableRef.map(s => s.id).join(', ');
545
+ vars["REF_SKILLS_LIST"] = availableRef.map(s => formatSkillListItem({
546
+ id: s.id,
547
+ name: s.name,
548
+ description: s.description,
549
+ keywords: s.keywords,
550
+ triggers: s.triggers,
551
+ })).join('\n');
449
552
  // Only render sections that have content
450
553
  if (activeSkills.length > 0 && availableRef.length > 0) {
451
554
  prompt += renderTemplate(loadTemplate('skills.md'), vars);
@@ -460,8 +563,9 @@ export function getSystemPrompt(opts = {}) {
460
563
  else {
461
564
  // Only ref skills
462
565
  const tmpl = loadTemplate('skills.md');
566
+ const matchingSection = tmpl.split('### Active Skills')[0];
463
567
  const refSection = tmpl.substring(tmpl.indexOf('### Available Skills'));
464
- prompt += renderTemplate(refSection, vars);
568
+ prompt += renderTemplate(matchingSection + refSection, vars);
465
569
  }
466
570
  }
467
571
  }
@@ -514,9 +618,19 @@ export function getEmployeePrompt(emp) {
514
618
  const activeSkills = loadActiveSkills();
515
619
  if (activeSkills.length > 0) {
516
620
  let section = `\n## Active Skills (${activeSkills.length})\n`;
517
- section += `Installed skills — automatically triggered by the CLI.\n`;
621
+ section += `Installed skills — automatically triggered by the CLI. Use each description to decide whether to read its SKILL.md.\n`;
622
+ section += `Read active skills from ${SKILLS_DIR}/<skill-id>/SKILL.md.\n`;
623
+ section += `Match by intent, not exact words: compare the request, files, domain nouns, output, and task verbs against visible skill names, descriptions, and any listed metadata, keywords, or triggers.\n`;
624
+ section += `When uncertain, inspect the best candidate: if metadata suggests a plausible match, read that SKILL.md once before deciding it does not apply.\n`;
625
+ section += `Search intent override: for "검색", "검색해", "찾아봐", "알아봐", "look up", or "search" targeting external/current/docs/library information, inspect the active search skill before local Grep/Glob.\n`;
518
626
  for (const s of activeSkills) {
519
- section += `- ${s.name} (${s.id})\n`;
627
+ section += `${formatSkillListItem({
628
+ id: s.id,
629
+ name: s.name,
630
+ description: s.description,
631
+ keywords: s.keywords,
632
+ triggers: s.triggers,
633
+ })}\n`;
520
634
  }
521
635
  vars["ACTIVE_SKILLS_SECTION"] = section;
522
636
  }
@@ -525,12 +639,16 @@ export function getEmployeePrompt(emp) {
525
639
  return renderTemplate(loadTemplate('employee.md'), vars);
526
640
  }
527
641
  // ─── Employee Prompt v2 (orchestration phase-aware) ──
528
- export function getEmployeePromptV2(emp, role, currentPhase) {
642
+ export function getEmployeePromptV2(emp, role, currentPhase, opts) {
529
643
  const phase = Number(currentPhase);
530
- const cacheKey = `${emp.id || emp.name}:${role}:${phase}:${settings["workingDir"] || '~'}`;
644
+ const cacheKey = `${emp.id || emp.name}:${role}:${phase}:${settings["workingDir"] || '~'}:${opts?.mutable ? 'mut' : 'ro'}:${opts?.scope || ''}`;
531
645
  if (promptCache.has(cacheKey))
532
646
  return promptCache.get(cacheKey);
533
647
  let prompt = getEmployeePrompt(emp);
648
+ // --mutable: override the hard read-only block in employee.md
649
+ if (opts?.mutable) {
650
+ prompt = prompt.replace(/- ⛔ Do NOT create, modify, or delete files\..*/, `- ✅ You are authorized to create or modify files${opts.scope ? ` inside \`${opts.scope}\`` : ''}. Protected paths (.git, .env, settings.json) remain blocked.`);
651
+ }
534
652
  // Static-employee system prompt patch (Control etc.) injected near the top
535
653
  // so role-specific guidance downstream can still override style/tone.
536
654
  const staticSpec = findStaticEmployee(emp?.name || '');
@@ -544,91 +662,48 @@ export function getEmployeePromptV2(emp, role, currentPhase) {
544
662
  console.warn(`[prompt] ${staticSpec.name} system patch load failed:`, e.message);
545
663
  }
546
664
  }
547
- // Static-employee declared skills are injected INLINE so the employee never
548
- // needs to read skill files from disk. Previously `skills: [...]` was metadata
549
- // only employees tried `sed`/`cat` on absolute paths (often wrong), wasting
550
- // a turn and sometimes failing entirely. The skill content now lives in the
551
- // system prompt; reference files (`reference/*.md`) stay on disk for deep
552
- // lookups the employee can do with `cli-jaw skill read <name> <ref>`.
665
+ // Skill bodies are intentionally not inlined. Each employee receives a
666
+ // compact path contract and reads only the guide needed for the task.
667
+ const devCommonPath = findSkillPath('dev');
668
+ const scaffoldingPath = findSkillPath('dev-scaffolding');
669
+ const ROLE_SKILL_NAME_MAP = {
670
+ frontend: 'dev-frontend',
671
+ backend: 'dev-backend',
672
+ data: 'dev-data',
673
+ docs: 'doc-coauthoring',
674
+ custom: null,
675
+ };
676
+ const roleSkillName = ROLE_SKILL_NAME_MAP[role] ?? null;
677
+ const roleSkillPath = roleSkillName ? findSkillPath(roleSkillName) : null;
678
+ const pabcdPath = findSkillPath('dev-pabcd');
679
+ const reviewerPath = findSkillPath('dev-code-reviewer');
680
+ const testingPath = findSkillPath('dev-testing');
681
+ prompt += `\n\n## Skill Loading Contract`;
682
+ prompt += `\nSkill bodies are not preloaded. Read each guide once, only when the task requires it.`;
683
+ prompt += `\n- Match by intent, not exact words: compare the task, files, domain nouns, output, and task verbs against visible skill names, descriptions, and any listed metadata, keywords, or triggers.`;
684
+ prompt += `\n- When uncertain, inspect the best candidate: if metadata suggests a plausible match, read that SKILL.md once before deciding it does not apply.`;
685
+ prompt += `\n- Search intent override: for "검색", "검색해", "찾아봐", "알아봐", "look up", or "search" targeting external/current/docs/library information, inspect the active search skill before local Grep/Glob.`;
686
+ prompt += `\n- Common dev guide: ${formatSkillPath('dev', devCommonPath)}`;
687
+ prompt += `\n- Scaffolding guide: ${formatSkillPath('dev-scaffolding', scaffoldingPath)} (read only for new projects, new modules, or structure audits)`;
553
688
  if (staticSpec?.skills?.length) {
689
+ prompt += `\n- Static employee skills:`;
554
690
  for (const skillName of staticSpec.skills) {
555
- const skillPath = findFirstExistingPath([
556
- join(SKILLS_DIR, skillName, 'SKILL.md'),
557
- join(SKILLS_REF_DIR, skillName, 'SKILL.md'),
558
- getRepoBundledSkillPath('skills', skillName, 'SKILL.md'),
559
- getRepoBundledSkillPath('skills_ref', skillName, 'SKILL.md'),
560
- ]);
561
- if (skillPath && fs.existsSync(skillPath)) {
562
- prompt += `\n\n## Skill: ${skillName} (inlined — do NOT read from disk)\n${fs.readFileSync(skillPath, 'utf8')}`;
563
- }
564
- else {
565
- console.warn(`[prompt] ${staticSpec.name}: skill '${skillName}' not found on disk — check SKILLS_DIR/SKILLS_REF_DIR`);
566
- }
691
+ prompt += `\n - ${formatSkillPath(skillName, findSkillPath(skillName))}`;
567
692
  }
568
693
  }
569
- // ─── 1. Common dev skill (always injected)
570
- const devCommonPath = findFirstExistingPath([
571
- join(SKILLS_DIR, 'dev', 'SKILL.md'),
572
- getRepoBundledSkillPath('skills', 'dev', 'SKILL.md'),
573
- ]);
574
- if (devCommonPath) {
575
- prompt += `\n\n## Development Guide (Common)\n${fs.readFileSync(devCommonPath, 'utf8')}`;
576
- }
577
- // ─── 1b. Scaffolding guide (always injected)
578
- const scaffoldingPath = findFirstExistingPath([
579
- join(SKILLS_DIR, 'dev-scaffolding', 'SKILL.md'),
580
- getRepoBundledSkillPath('skills', 'dev-scaffolding', 'SKILL.md'),
581
- ]);
582
- if (scaffoldingPath) {
583
- prompt += `\n\n## Project Scaffolding Guide\n${fs.readFileSync(scaffoldingPath, 'utf8')}`;
584
- }
585
- // ─── 2. Role-based dev skill injection
586
- const ROLE_SKILL_MAP = {
587
- frontend: findFirstExistingPath([
588
- join(SKILLS_DIR, 'dev-frontend', 'SKILL.md'),
589
- getRepoBundledSkillPath('skills', 'dev-frontend', 'SKILL.md'),
590
- ]),
591
- backend: findFirstExistingPath([
592
- join(SKILLS_DIR, 'dev-backend', 'SKILL.md'),
593
- getRepoBundledSkillPath('skills', 'dev-backend', 'SKILL.md'),
594
- ]),
595
- data: findFirstExistingPath([
596
- join(SKILLS_DIR, 'dev-data', 'SKILL.md'),
597
- getRepoBundledSkillPath('skills', 'dev-data', 'SKILL.md'),
598
- ]),
599
- docs: findFirstExistingPath([
600
- join(SKILLS_DIR, 'documentation', 'SKILL.md'),
601
- getRepoBundledSkillPath('skills', 'documentation', 'SKILL.md'),
602
- ]),
603
- custom: null,
604
- };
605
- const skillPath = ROLE_SKILL_MAP[role];
606
- if (skillPath && fs.existsSync(skillPath)) {
607
- prompt += `\n\n## Development Guide (${role})\n${fs.readFileSync(skillPath, 'utf8')}`;
608
- }
609
- // ─── 3a. Plan audit phase(2) → inject dev-code-reviewer
694
+ prompt += `\n\n## Role Contract`;
695
+ prompt += `\n- Role: ${role}`;
696
+ prompt += `\n- Role guide: ${roleSkillName ? formatSkillPath(roleSkillName, roleSkillPath) : 'none'}`;
697
+ prompt += `\n- Apply this role on every assigned task. Before role-specific implementation or review, read the role guide once if it is available.`;
698
+ prompt += `\n- Also read the common dev guide before modifying code.`;
699
+ prompt += `\n\n## Phase Guide`;
700
+ prompt += `\n- Use the phase context below as the source of truth for what this employee should do now.`;
701
+ prompt += `\n- Full PABCD guide: ${formatSkillPath('dev-pabcd', pabcdPath)} (read only if phase rules are unclear).`;
610
702
  if (phase === 2) {
611
- const reviewerPath = findFirstExistingPath([
612
- join(SKILLS_DIR, 'dev-code-reviewer', 'SKILL.md'),
613
- join(SKILLS_REF_DIR, 'dev-code-reviewer', 'SKILL.md'),
614
- getRepoBundledSkillPath('skills', 'dev-code-reviewer', 'SKILL.md'),
615
- getRepoBundledSkillPath('skills_ref', 'dev-code-reviewer', 'SKILL.md'),
616
- ]);
617
- if (reviewerPath) {
618
- prompt += `\n\n## Code Review Guide (Phase 2 — Strict Audit)\n${fs.readFileSync(reviewerPath, 'utf8')}`;
619
- }
703
+ prompt += `\n- Phase 2 audit: read ${formatSkillPath('dev-code-reviewer', reviewerPath)} before reviewing plans or code.`;
620
704
  }
621
- // ─── 3b. Debug/check phase(4) → inject dev-testing
622
- if (phase === 4) {
623
- const testingPath = findFirstExistingPath([
624
- join(SKILLS_DIR, 'dev-testing', 'SKILL.md'),
625
- join(SKILLS_REF_DIR, 'dev-testing', 'SKILL.md'),
626
- getRepoBundledSkillPath('skills', 'dev-testing', 'SKILL.md'),
627
- getRepoBundledSkillPath('skills_ref', 'dev-testing', 'SKILL.md'),
628
- ]);
629
- if (testingPath) {
630
- prompt += `\n\n## Testing Guide (Phase 4)\n${fs.readFileSync(testingPath, 'utf8')}`;
631
- }
705
+ else if (phase === 4) {
706
+ prompt += `\n- Phase 4 check: read ${formatSkillPath('dev-testing', testingPath)} before designing or running verification.`;
632
707
  }
633
708
  // ─── 4. Employee context (PABCD-aware)
634
709
  const workerContexts = parseWorkerContexts();
@@ -641,7 +716,7 @@ export function getEmployeePromptV2(emp, role, currentPhase) {
641
716
  prompt += `\n- Report results clearly with specific file paths and line numbers`;
642
717
  prompt += `\n- Your process cwd may be an isolated temporary directory. Do NOT treat process.cwd() as the repository root.`;
643
718
  prompt += `\n- Use the task's ## Workspace Context block as the source of truth for Project root and Devlog root.`;
644
- prompt += `\n- Resolve relative repository paths against Project root, and prefer absolute paths in commands and reports.`;
719
+ prompt += `\n- Resolve relative repository paths against Project root, and always use absolute paths in commands and reports.`;
645
720
  prompt += `\n\n## Delegation Rules`;
646
721
  prompt += `\n- Execute the assigned task directly in this employee session.`;
647
722
  prompt += `\n- You CAN use CLI sub-agents (Task/Agent tool) for parallel work: research, file reads, code analysis. This is encouraged.`;