macro-agent 0.0.10 → 0.0.12

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 (518) hide show
  1. package/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
  2. package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
  3. package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
  4. package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
  5. package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
  6. package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
  7. package/.macro-agent/teams/self-driving/team.yaml +103 -0
  8. package/.macro-agent/teams/structured/prompts/developer.md +26 -0
  9. package/.macro-agent/teams/structured/prompts/lead.md +25 -0
  10. package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
  11. package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
  12. package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
  13. package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
  14. package/.macro-agent/teams/structured/team.yaml +89 -0
  15. package/.sudocode/issues.jsonl +56 -51
  16. package/.sudocode/specs.jsonl +8 -1
  17. package/CLAUDE.md +121 -30
  18. package/README.md +60 -3
  19. package/dist/acp/macro-agent.d.ts +4 -0
  20. package/dist/acp/macro-agent.d.ts.map +1 -1
  21. package/dist/acp/macro-agent.js +50 -4
  22. package/dist/acp/macro-agent.js.map +1 -1
  23. package/dist/acp/session-mapper.d.ts +20 -1
  24. package/dist/acp/session-mapper.d.ts.map +1 -1
  25. package/dist/acp/session-mapper.js +90 -1
  26. package/dist/acp/session-mapper.js.map +1 -1
  27. package/dist/acp/types.d.ts +24 -1
  28. package/dist/acp/types.d.ts.map +1 -1
  29. package/dist/acp/types.js.map +1 -1
  30. package/dist/agent/agent-manager.d.ts +40 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +172 -8
  33. package/dist/agent/agent-manager.js.map +1 -1
  34. package/dist/agent/types.d.ts +22 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/agent/types.js.map +1 -1
  37. package/dist/agent/wake.d.ts +15 -0
  38. package/dist/agent/wake.d.ts.map +1 -1
  39. package/dist/agent/wake.js +15 -0
  40. package/dist/agent/wake.js.map +1 -1
  41. package/dist/agent-detection/command-builder.d.ts +30 -0
  42. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  43. package/dist/agent-detection/command-builder.js +71 -0
  44. package/dist/agent-detection/command-builder.js.map +1 -0
  45. package/dist/agent-detection/detector.d.ts +84 -0
  46. package/dist/agent-detection/detector.d.ts.map +1 -0
  47. package/dist/agent-detection/detector.js +240 -0
  48. package/dist/agent-detection/detector.js.map +1 -0
  49. package/dist/agent-detection/index.d.ts +12 -0
  50. package/dist/agent-detection/index.d.ts.map +1 -0
  51. package/dist/agent-detection/index.js +14 -0
  52. package/dist/agent-detection/index.js.map +1 -0
  53. package/dist/agent-detection/registry.d.ts +53 -0
  54. package/dist/agent-detection/registry.d.ts.map +1 -0
  55. package/dist/agent-detection/registry.js +177 -0
  56. package/dist/agent-detection/registry.js.map +1 -0
  57. package/dist/agent-detection/types.d.ts +121 -0
  58. package/dist/agent-detection/types.d.ts.map +1 -0
  59. package/dist/agent-detection/types.js +20 -0
  60. package/dist/agent-detection/types.js.map +1 -0
  61. package/dist/api/server.d.ts +5 -1
  62. package/dist/api/server.d.ts.map +1 -1
  63. package/dist/api/server.js +362 -0
  64. package/dist/api/server.js.map +1 -1
  65. package/dist/api/types.d.ts +50 -1
  66. package/dist/api/types.d.ts.map +1 -1
  67. package/dist/cli/acp.d.ts +2 -0
  68. package/dist/cli/acp.d.ts.map +1 -1
  69. package/dist/cli/acp.js +8 -1
  70. package/dist/cli/acp.js.map +1 -1
  71. package/dist/cli/index.js +29 -0
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/mcp.js +38 -0
  74. package/dist/cli/mcp.js.map +1 -1
  75. package/dist/config/index.d.ts +2 -0
  76. package/dist/config/index.d.ts.map +1 -0
  77. package/dist/config/index.js +2 -0
  78. package/dist/config/index.js.map +1 -0
  79. package/dist/config/project-config.d.ts +46 -0
  80. package/dist/config/project-config.d.ts.map +1 -0
  81. package/dist/config/project-config.js +68 -0
  82. package/dist/config/project-config.js.map +1 -0
  83. package/dist/lifecycle/cascade.d.ts +1 -1
  84. package/dist/lifecycle/cascade.d.ts.map +1 -1
  85. package/dist/lifecycle/handlers/index.d.ts +4 -0
  86. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  87. package/dist/lifecycle/handlers/index.js +2 -0
  88. package/dist/lifecycle/handlers/index.js.map +1 -1
  89. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  90. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  91. package/dist/lifecycle/handlers/worker.js +35 -3
  92. package/dist/lifecycle/handlers/worker.js.map +1 -1
  93. package/dist/mail/conversation-map.d.ts +33 -0
  94. package/dist/mail/conversation-map.d.ts.map +1 -0
  95. package/dist/mail/conversation-map.js +61 -0
  96. package/dist/mail/conversation-map.js.map +1 -0
  97. package/dist/mail/index.d.ts +11 -0
  98. package/dist/mail/index.d.ts.map +1 -0
  99. package/dist/mail/index.js +11 -0
  100. package/dist/mail/index.js.map +1 -0
  101. package/dist/mail/mail-service.d.ts +85 -0
  102. package/dist/mail/mail-service.d.ts.map +1 -0
  103. package/dist/mail/mail-service.js +121 -0
  104. package/dist/mail/mail-service.js.map +1 -0
  105. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  106. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  107. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  108. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  109. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  110. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  111. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  112. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  113. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  114. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  115. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  116. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  117. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  118. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  119. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  120. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  121. package/dist/mail/stores/index.d.ts +12 -0
  122. package/dist/mail/stores/index.d.ts.map +1 -0
  123. package/dist/mail/stores/index.js +12 -0
  124. package/dist/mail/stores/index.js.map +1 -0
  125. package/dist/mail/stores/types.d.ts +146 -0
  126. package/dist/mail/stores/types.d.ts.map +1 -0
  127. package/dist/mail/stores/types.js +13 -0
  128. package/dist/mail/stores/types.js.map +1 -0
  129. package/dist/mail/turn-recorder.d.ts +30 -0
  130. package/dist/mail/turn-recorder.d.ts.map +1 -0
  131. package/dist/mail/turn-recorder.js +98 -0
  132. package/dist/mail/turn-recorder.js.map +1 -0
  133. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  134. package/dist/map/adapter/acp-over-map.js +32 -2
  135. package/dist/map/adapter/acp-over-map.js.map +1 -1
  136. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  137. package/dist/map/adapter/event-translator.js +4 -0
  138. package/dist/map/adapter/event-translator.js.map +1 -1
  139. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  140. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  141. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  142. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  143. package/dist/map/adapter/extensions/index.d.ts +10 -1
  144. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  145. package/dist/map/adapter/extensions/index.js +39 -0
  146. package/dist/map/adapter/extensions/index.js.map +1 -1
  147. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  148. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  149. package/dist/map/adapter/extensions/resume.js +59 -0
  150. package/dist/map/adapter/extensions/resume.js.map +1 -0
  151. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  152. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  153. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  154. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  155. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  156. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  157. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  158. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  159. package/dist/map/adapter/map-adapter.d.ts +34 -10
  160. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  161. package/dist/map/adapter/map-adapter.js +110 -14
  162. package/dist/map/adapter/map-adapter.js.map +1 -1
  163. package/dist/map/adapter/rpc-handler.d.ts +4 -1
  164. package/dist/map/adapter/rpc-handler.d.ts.map +1 -1
  165. package/dist/map/adapter/rpc-handler.js +6 -0
  166. package/dist/map/adapter/rpc-handler.js.map +1 -1
  167. package/dist/map/index.d.ts +1 -0
  168. package/dist/map/index.d.ts.map +1 -1
  169. package/dist/map/index.js +2 -0
  170. package/dist/map/index.js.map +1 -1
  171. package/dist/map/types.d.ts +3 -1
  172. package/dist/map/types.d.ts.map +1 -1
  173. package/dist/map/types.js.map +1 -1
  174. package/dist/mcp/mcp-server.d.ts +6 -0
  175. package/dist/mcp/mcp-server.d.ts.map +1 -1
  176. package/dist/mcp/mcp-server.js +45 -0
  177. package/dist/mcp/mcp-server.js.map +1 -1
  178. package/dist/mcp/tools/claim_task.d.ts +35 -0
  179. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  180. package/dist/mcp/tools/claim_task.js +58 -0
  181. package/dist/mcp/tools/claim_task.js.map +1 -0
  182. package/dist/mcp/tools/done.d.ts +15 -2
  183. package/dist/mcp/tools/done.d.ts.map +1 -1
  184. package/dist/mcp/tools/done.js +45 -10
  185. package/dist/mcp/tools/done.js.map +1 -1
  186. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  187. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  188. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  189. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  190. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  191. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  192. package/dist/mcp/tools/unclaim_task.js +47 -0
  193. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  194. package/dist/metrics/index.d.ts +2 -0
  195. package/dist/metrics/index.d.ts.map +1 -0
  196. package/dist/metrics/index.js +2 -0
  197. package/dist/metrics/index.js.map +1 -0
  198. package/dist/metrics/metrics.d.ts +79 -0
  199. package/dist/metrics/metrics.d.ts.map +1 -0
  200. package/dist/metrics/metrics.js +166 -0
  201. package/dist/metrics/metrics.js.map +1 -0
  202. package/dist/roles/capabilities.d.ts +1 -0
  203. package/dist/roles/capabilities.d.ts.map +1 -1
  204. package/dist/roles/capabilities.js +3 -0
  205. package/dist/roles/capabilities.js.map +1 -1
  206. package/dist/roles/types.d.ts +1 -1
  207. package/dist/roles/types.d.ts.map +1 -1
  208. package/dist/router/channels.d.ts +2 -4
  209. package/dist/router/channels.d.ts.map +1 -1
  210. package/dist/router/channels.js.map +1 -1
  211. package/dist/router/message-router.d.ts +85 -9
  212. package/dist/router/message-router.d.ts.map +1 -1
  213. package/dist/router/message-router.js +203 -14
  214. package/dist/router/message-router.js.map +1 -1
  215. package/dist/router/role-resolver.d.ts +10 -1
  216. package/dist/router/role-resolver.d.ts.map +1 -1
  217. package/dist/router/role-resolver.js +15 -1
  218. package/dist/router/role-resolver.js.map +1 -1
  219. package/dist/router/types.d.ts +30 -1
  220. package/dist/router/types.d.ts.map +1 -1
  221. package/dist/router/types.js.map +1 -1
  222. package/dist/server/combined-server.d.ts +6 -0
  223. package/dist/server/combined-server.d.ts.map +1 -1
  224. package/dist/server/combined-server.js +24 -2
  225. package/dist/server/combined-server.js.map +1 -1
  226. package/dist/store/event-store.d.ts +14 -1
  227. package/dist/store/event-store.d.ts.map +1 -1
  228. package/dist/store/event-store.js +456 -4
  229. package/dist/store/event-store.js.map +1 -1
  230. package/dist/store/types/agents.d.ts +1 -1
  231. package/dist/store/types/agents.d.ts.map +1 -1
  232. package/dist/store/types/conversations.d.ts +91 -0
  233. package/dist/store/types/conversations.d.ts.map +1 -0
  234. package/dist/store/types/conversations.js +8 -0
  235. package/dist/store/types/conversations.js.map +1 -0
  236. package/dist/store/types/events.d.ts +1 -1
  237. package/dist/store/types/events.d.ts.map +1 -1
  238. package/dist/store/types/events.js.map +1 -1
  239. package/dist/store/types/index.d.ts +2 -0
  240. package/dist/store/types/index.d.ts.map +1 -1
  241. package/dist/store/types/index.js +2 -0
  242. package/dist/store/types/index.js.map +1 -1
  243. package/dist/store/types/sessions.d.ts +44 -0
  244. package/dist/store/types/sessions.d.ts.map +1 -0
  245. package/dist/store/types/sessions.js +9 -0
  246. package/dist/store/types/sessions.js.map +1 -0
  247. package/dist/store/types/tasks.d.ts +2 -0
  248. package/dist/store/types/tasks.d.ts.map +1 -1
  249. package/dist/task/backend/memory.d.ts +4 -1
  250. package/dist/task/backend/memory.d.ts.map +1 -1
  251. package/dist/task/backend/memory.js +81 -0
  252. package/dist/task/backend/memory.js.map +1 -1
  253. package/dist/task/backend/types.d.ts +30 -0
  254. package/dist/task/backend/types.d.ts.map +1 -1
  255. package/dist/task/backend/types.js.map +1 -1
  256. package/dist/teams/index.d.ts +4 -0
  257. package/dist/teams/index.d.ts.map +1 -0
  258. package/dist/teams/index.js +4 -0
  259. package/dist/teams/index.js.map +1 -0
  260. package/dist/teams/team-loader.d.ts +20 -0
  261. package/dist/teams/team-loader.d.ts.map +1 -0
  262. package/dist/teams/team-loader.js +293 -0
  263. package/dist/teams/team-loader.js.map +1 -0
  264. package/dist/teams/team-runtime.d.ts +139 -0
  265. package/dist/teams/team-runtime.d.ts.map +1 -0
  266. package/dist/teams/team-runtime.js +613 -0
  267. package/dist/teams/team-runtime.js.map +1 -0
  268. package/dist/teams/types.d.ts +266 -0
  269. package/dist/teams/types.d.ts.map +1 -0
  270. package/dist/teams/types.js +20 -0
  271. package/dist/teams/types.js.map +1 -0
  272. package/dist/trigger/router/trigger-router.d.ts +30 -3
  273. package/dist/trigger/router/trigger-router.d.ts.map +1 -1
  274. package/dist/trigger/router/trigger-router.js +30 -3
  275. package/dist/trigger/router/trigger-router.js.map +1 -1
  276. package/dist/trigger/wake/types.d.ts +31 -5
  277. package/dist/trigger/wake/types.d.ts.map +1 -1
  278. package/dist/trigger/wake/types.js +19 -0
  279. package/dist/trigger/wake/types.js.map +1 -1
  280. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  281. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  282. package/dist/workspace/dataplane-adapter.js +1 -1
  283. package/dist/workspace/dataplane-adapter.js.map +1 -1
  284. package/dist/workspace/index.d.ts +1 -1
  285. package/dist/workspace/index.d.ts.map +1 -1
  286. package/dist/workspace/strategies/index.d.ts +6 -0
  287. package/dist/workspace/strategies/index.d.ts.map +1 -0
  288. package/dist/workspace/strategies/index.js +5 -0
  289. package/dist/workspace/strategies/index.js.map +1 -0
  290. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  291. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  292. package/dist/workspace/strategies/optimistic.js +121 -0
  293. package/dist/workspace/strategies/optimistic.js.map +1 -0
  294. package/dist/workspace/strategies/queue.d.ts +26 -0
  295. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  296. package/dist/workspace/strategies/queue.js +67 -0
  297. package/dist/workspace/strategies/queue.js.map +1 -0
  298. package/dist/workspace/strategies/registry.d.ts +37 -0
  299. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  300. package/dist/workspace/strategies/registry.js +63 -0
  301. package/dist/workspace/strategies/registry.js.map +1 -0
  302. package/dist/workspace/strategies/trunk.d.ts +20 -0
  303. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  304. package/dist/workspace/strategies/trunk.js +108 -0
  305. package/dist/workspace/strategies/trunk.js.map +1 -0
  306. package/dist/workspace/strategies/types.d.ts +104 -0
  307. package/dist/workspace/strategies/types.d.ts.map +1 -0
  308. package/dist/workspace/strategies/types.js +11 -0
  309. package/dist/workspace/strategies/types.js.map +1 -0
  310. package/dist/workspace/types.d.ts +1 -1
  311. package/dist/workspace/types.d.ts.map +1 -1
  312. package/dist/workspace/workspace-manager.d.ts +1 -1
  313. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  314. package/docs/implementation-details.md +1127 -0
  315. package/docs/implementation-summary.md +448 -0
  316. package/docs/mail-integration.md +608 -0
  317. package/docs/plan-self-driving-support.md +433 -0
  318. package/docs/spec-self-driving-support.md +462 -0
  319. package/docs/team-templates.md +860 -0
  320. package/docs/teams.md +233 -0
  321. package/package.json +5 -3
  322. package/src/acp/__tests__/integration.test.ts +161 -1
  323. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  324. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  325. package/src/acp/macro-agent.ts +79 -7
  326. package/src/acp/session-mapper.ts +108 -1
  327. package/src/acp/types.ts +33 -1
  328. package/src/agent/agent-manager.ts +278 -6
  329. package/src/agent/types.ts +27 -0
  330. package/src/agent/wake.ts +15 -0
  331. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  332. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  333. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  334. package/src/agent-detection/command-builder.ts +90 -0
  335. package/src/agent-detection/detector.ts +307 -0
  336. package/src/agent-detection/index.ts +36 -0
  337. package/src/agent-detection/registry.ts +200 -0
  338. package/src/agent-detection/types.ts +184 -0
  339. package/src/api/__tests__/conversation-api.test.ts +468 -0
  340. package/src/api/server.ts +425 -1
  341. package/src/api/types.ts +64 -1
  342. package/src/cli/acp.ts +9 -1
  343. package/src/cli/index.ts +44 -0
  344. package/src/cli/mcp.ts +47 -0
  345. package/src/config/index.ts +9 -0
  346. package/src/config/project-config.ts +107 -0
  347. package/src/lifecycle/cascade.ts +1 -1
  348. package/src/lifecycle/handlers/index.ts +8 -0
  349. package/src/lifecycle/handlers/worker.ts +48 -3
  350. package/src/mail/__tests__/conversation-lifecycle.test.ts +409 -0
  351. package/src/mail/__tests__/eventstore-stores.test.ts +1073 -0
  352. package/src/mail/__tests__/mail-full-agent.e2e.test.ts +575 -0
  353. package/src/mail/__tests__/mail-integration.test.ts +759 -0
  354. package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +1068 -0
  355. package/src/mail/__tests__/mail-service.test.ts +506 -0
  356. package/src/mail/__tests__/turn-recorder.test.ts +328 -0
  357. package/src/mail/conversation-map.ts +107 -0
  358. package/src/mail/index.ts +25 -0
  359. package/src/mail/mail-service.ts +257 -0
  360. package/src/mail/stores/eventstore-conversation-store.ts +146 -0
  361. package/src/mail/stores/eventstore-participant-store.ts +172 -0
  362. package/src/mail/stores/eventstore-thread-store.ts +129 -0
  363. package/src/mail/stores/eventstore-turn-store.ts +173 -0
  364. package/src/mail/stores/index.ts +12 -0
  365. package/src/mail/stores/types.ts +160 -0
  366. package/src/mail/turn-recorder.ts +124 -0
  367. package/src/map/README.md +79 -0
  368. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  369. package/src/map/adapter/__tests__/map-adapter.test.ts +90 -0
  370. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  371. package/src/map/adapter/acp-over-map.ts +45 -2
  372. package/src/map/adapter/event-translator.ts +4 -0
  373. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  374. package/src/map/adapter/extensions/index.ts +63 -0
  375. package/src/map/adapter/extensions/resume.ts +114 -0
  376. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  377. package/src/map/adapter/mail-handler-adapter.ts +429 -0
  378. package/src/map/adapter/map-adapter.ts +173 -27
  379. package/src/map/adapter/rpc-handler.ts +8 -1
  380. package/src/map/index.ts +3 -0
  381. package/src/map/types.ts +3 -1
  382. package/src/mcp/mcp-server.ts +67 -0
  383. package/src/mcp/tools/claim_task.ts +86 -0
  384. package/src/mcp/tools/done.ts +59 -10
  385. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  386. package/src/mcp/tools/unclaim_task.ts +71 -0
  387. package/src/metrics/index.ts +9 -0
  388. package/src/metrics/metrics.ts +280 -0
  389. package/src/roles/capabilities.ts +3 -0
  390. package/src/roles/types.ts +2 -1
  391. package/src/router/README.md +120 -0
  392. package/src/router/__tests__/message-router.test.ts +561 -0
  393. package/src/router/channels.ts +3 -4
  394. package/src/router/message-router.ts +308 -22
  395. package/src/router/role-resolver.ts +22 -1
  396. package/src/router/types.ts +36 -1
  397. package/src/server/combined-server.ts +36 -2
  398. package/src/store/README.md +134 -0
  399. package/src/store/event-store.ts +546 -3
  400. package/src/store/types/agents.ts +1 -1
  401. package/src/store/types/conversations.ts +129 -0
  402. package/src/store/types/events.ts +5 -1
  403. package/src/store/types/index.ts +2 -0
  404. package/src/store/types/sessions.ts +53 -0
  405. package/src/store/types/tasks.ts +3 -0
  406. package/src/task/backend/memory.ts +116 -0
  407. package/src/task/backend/types.ts +43 -0
  408. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  409. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  410. package/src/teams/__tests__/team-system.test.ts +1280 -0
  411. package/src/teams/index.ts +13 -0
  412. package/src/teams/team-loader.ts +434 -0
  413. package/src/teams/team-runtime.ts +727 -0
  414. package/src/teams/types.ts +377 -0
  415. package/src/trigger/router/trigger-router.ts +30 -3
  416. package/src/trigger/wake/types.ts +32 -5
  417. package/src/trigger/wake/wake-manager.ts +2 -2
  418. package/src/workspace/dataplane-adapter.ts +1 -1
  419. package/src/workspace/index.ts +1 -1
  420. package/src/workspace/strategies/index.ts +18 -0
  421. package/src/workspace/strategies/optimistic.ts +136 -0
  422. package/src/workspace/strategies/queue.ts +81 -0
  423. package/src/workspace/strategies/registry.ts +89 -0
  424. package/src/workspace/strategies/trunk.ts +123 -0
  425. package/src/workspace/strategies/types.ts +145 -0
  426. package/src/workspace/types.ts +1 -1
  427. package/src/workspace/workspace-manager.ts +1 -1
  428. package/.claude/settings.local.json +0 -59
  429. package/dist/map/utils/address-translation.d.ts +0 -99
  430. package/dist/map/utils/address-translation.d.ts.map +0 -1
  431. package/dist/map/utils/address-translation.js +0 -285
  432. package/dist/map/utils/address-translation.js.map +0 -1
  433. package/dist/map/utils/index.d.ts +0 -7
  434. package/dist/map/utils/index.d.ts.map +0 -1
  435. package/dist/map/utils/index.js +0 -7
  436. package/dist/map/utils/index.js.map +0 -1
  437. package/openspec/AGENTS.md +0 -456
  438. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/design.md +0 -128
  439. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/proposal.md +0 -49
  440. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/agent-manager/spec.md +0 -150
  441. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/cli-api/spec.md +0 -258
  442. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/event-store/spec.md +0 -160
  443. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/mcp-tools/spec.md +0 -224
  444. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/message-router/spec.md +0 -153
  445. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/task-manager/spec.md +0 -136
  446. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/tasks.md +0 -147
  447. package/openspec/project.md +0 -31
  448. package/openspec/specs/agent-manager/spec.md +0 -154
  449. package/openspec/specs/cli-api/spec.md +0 -262
  450. package/openspec/specs/event-store/spec.md +0 -164
  451. package/openspec/specs/mcp-tools/spec.md +0 -228
  452. package/openspec/specs/message-router/spec.md +0 -157
  453. package/openspec/specs/task-manager/spec.md +0 -140
  454. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  455. package/references/acp-factory-ref/LICENSE +0 -21
  456. package/references/acp-factory-ref/README.md +0 -341
  457. package/references/acp-factory-ref/package-lock.json +0 -3102
  458. package/references/acp-factory-ref/package.json +0 -96
  459. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  460. package/references/acp-factory-ref/python/LICENSE +0 -21
  461. package/references/acp-factory-ref/python/Makefile +0 -57
  462. package/references/acp-factory-ref/python/README.md +0 -253
  463. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  464. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  465. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  466. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  467. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  468. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  469. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  470. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  471. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  472. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  473. package/references/claude-code-acp/.prettierrc.json +0 -4
  474. package/references/claude-code-acp/CHANGELOG.md +0 -249
  475. package/references/claude-code-acp/LICENSE +0 -222
  476. package/references/claude-code-acp/README.md +0 -53
  477. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  478. package/references/claude-code-acp/eslint.config.js +0 -48
  479. package/references/claude-code-acp/package-lock.json +0 -4570
  480. package/references/claude-code-acp/package.json +0 -88
  481. package/references/claude-code-acp/scripts/release.sh +0 -119
  482. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  483. package/references/claude-code-acp/src/index.ts +0 -26
  484. package/references/claude-code-acp/src/lib.ts +0 -38
  485. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  486. package/references/claude-code-acp/src/settings.ts +0 -522
  487. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  488. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  489. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  490. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  491. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  492. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  493. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  494. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  495. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  496. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  497. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  498. package/references/claude-code-acp/src/tools.ts +0 -819
  499. package/references/claude-code-acp/src/utils.ts +0 -171
  500. package/references/claude-code-acp/tsconfig.json +0 -18
  501. package/references/claude-code-acp/vitest.config.ts +0 -19
  502. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -82
  503. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -9
  504. package/references/multi-agent-protocol/LICENSE +0 -21
  505. package/references/multi-agent-protocol/README.md +0 -113
  506. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -460
  507. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  508. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  509. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  510. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  511. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  512. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  513. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  514. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  515. package/references/multi-agent-protocol/package-lock.json +0 -3239
  516. package/references/multi-agent-protocol/package.json +0 -56
  517. package/references/multi-agent-protocol/schema/meta.json +0 -337
  518. package/references/multi-agent-protocol/schema/schema.json +0 -1828
@@ -1,522 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import * as os from "node:os";
4
- import { minimatch } from "minimatch";
5
- import { ACP_TOOL_NAME_PREFIX, acpToolNames } from "./tools.js";
6
- import { CLAUDE_CONFIG_DIR } from "./acp-agent.js";
7
-
8
- /**
9
- * Permission rule format examples:
10
- * - "Read" - matches all Read tool calls
11
- * - "Read(./.env)" - matches specific path
12
- * - "Read(./.env.*)" - glob pattern
13
- * - "Read(./secrets/**)" - recursive glob
14
- * - "Bash(npm run lint)" - exact command prefix
15
- * - "Bash(npm run:*)" - command prefix with wildcard
16
- *
17
- * Docs: https://code.claude.com/docs/en/iam#tool-specific-permission-rules
18
- */
19
-
20
- export interface PermissionSettings {
21
- allow?: string[];
22
- deny?: string[];
23
- ask?: string[];
24
- additionalDirectories?: string[];
25
- defaultMode?: string;
26
- }
27
-
28
- export interface ClaudeCodeSettings {
29
- permissions?: PermissionSettings;
30
- env?: Record<string, string>;
31
- }
32
-
33
- export type PermissionDecision = "allow" | "deny" | "ask";
34
-
35
- export interface PermissionCheckResult {
36
- decision: PermissionDecision;
37
- rule?: string;
38
- source?: "allow" | "deny" | "ask";
39
- }
40
-
41
- interface ParsedRule {
42
- toolName: string;
43
- argument?: string;
44
- isWildcard?: boolean;
45
- }
46
-
47
- /**
48
- * Shell operators that can be used for command chaining/injection
49
- * These should cause a prefix match to fail to prevent bypasses like:
50
- * - "safe-cmd && malicious-cmd"
51
- * - "safe-cmd; malicious-cmd"
52
- * - "safe-cmd | malicious-cmd"
53
- * - "safe-cmd || malicious-cmd"
54
- * - "$(malicious-cmd)"
55
- * - "`malicious-cmd`"
56
- */
57
- const SHELL_OPERATORS = ["&&", "||", ";", "|", "$(", "`", "\n"];
58
-
59
- /**
60
- * Checks if a string contains shell operators that could allow command chaining
61
- */
62
- function containsShellOperator(str: string): boolean {
63
- return SHELL_OPERATORS.some((op) => str.includes(op));
64
- }
65
-
66
- /*
67
- * Tools that modify files. Per Claude Code docs:
68
- * "Edit rules apply to all built-in tools that edit files."
69
- * This means an Edit(...) rule should match Write, MultiEdit, etc.
70
- */
71
- const FILE_EDITING_TOOLS = [acpToolNames.edit, acpToolNames.write];
72
-
73
- /**
74
- * Tools that read files. Per Claude Code docs:
75
- * "Claude will make a best-effort attempt to apply Read rules to all built-in tools
76
- * that read files like Grep and Glob."
77
- * This means a Read(...) rule should match Grep, Glob, etc.
78
- */
79
- const FILE_READING_TOOLS = [acpToolNames.read];
80
-
81
- /**
82
- * Functions to extract the relevant argument from tool input for permission matching
83
- */
84
- const TOOL_ARG_ACCESSORS: Record<string, (input: unknown) => string | undefined> = {
85
- mcp__acp__Read: (input) => (input as { file_path?: string })?.file_path,
86
- mcp__acp__Edit: (input) => (input as { file_path?: string })?.file_path,
87
- mcp__acp__Write: (input) => (input as { file_path?: string })?.file_path,
88
- mcp__acp__Bash: (input) => (input as { command?: string })?.command,
89
- };
90
-
91
- /**
92
- * Parses a permission rule string into its components
93
- * Examples:
94
- * "Read" -> { toolName: "Read" }
95
- * "Read(./.env)" -> { toolName: "Read", argument: "./.env" }
96
- * "Bash(npm run:*)" -> { toolName: "Bash", argument: "npm run", isWildcard: true }
97
- */
98
- function parseRule(rule: string): ParsedRule {
99
- const match = rule.match(/^(\w+)(?:\((.+)\))?$/);
100
- if (!match) {
101
- return { toolName: rule };
102
- }
103
-
104
- const [, toolName, argument] = match;
105
-
106
- if (argument && argument.endsWith(":*")) {
107
- return {
108
- toolName,
109
- argument: argument.slice(0, -2),
110
- isWildcard: true,
111
- };
112
- }
113
-
114
- return { toolName, argument };
115
- }
116
-
117
- /**
118
- * Normalizes a path for comparison:
119
- * - Expands ~ to home directory
120
- * - Resolves relative paths against cwd
121
- * - Normalizes path separators
122
- */
123
- function normalizePath(filePath: string, cwd: string): string {
124
- if (filePath.startsWith("~/")) {
125
- filePath = path.join(os.homedir(), filePath.slice(2));
126
- } else if (filePath.startsWith("./")) {
127
- filePath = path.join(cwd, filePath.slice(2));
128
- } else if (!path.isAbsolute(filePath)) {
129
- filePath = path.join(cwd, filePath);
130
- }
131
- return path.normalize(filePath);
132
- }
133
-
134
- /**
135
- * Checks if a file path matches a glob pattern
136
- */
137
- function matchesGlob(pattern: string, filePath: string, cwd: string): boolean {
138
- const normalizedPattern = normalizePath(pattern, cwd);
139
- const normalizedPath = normalizePath(filePath, cwd);
140
-
141
- return minimatch(normalizedPath, normalizedPattern, {
142
- dot: true,
143
- matchBase: false,
144
- nocase: process.platform === "win32",
145
- });
146
- }
147
-
148
- /**
149
- * Checks if a tool invocation matches a parsed permission rule
150
- */
151
- function matchesRule(rule: ParsedRule, toolName: string, toolInput: unknown, cwd: string): boolean {
152
- // Per Claude Code docs:
153
- // - "Edit rules apply to all built-in tools that edit files."
154
- // - "Claude will make a best-effort attempt to apply Read rules to all built-in tools
155
- // that read files like Grep, Glob, and LS."
156
- const ruleAppliesToTool =
157
- rule.toolName === "Bash" ||
158
- (rule.toolName === "Edit" && FILE_EDITING_TOOLS.includes(toolName)) ||
159
- (rule.toolName === "Read" && FILE_READING_TOOLS.includes(toolName));
160
-
161
- if (!ruleAppliesToTool) {
162
- return false;
163
- }
164
-
165
- if (!rule.argument) {
166
- return true;
167
- }
168
-
169
- const argAccessor = TOOL_ARG_ACCESSORS[toolName];
170
- if (!argAccessor) {
171
- return true;
172
- }
173
-
174
- const actualArg = argAccessor(toolInput);
175
- if (!actualArg) {
176
- return false;
177
- }
178
-
179
- if (toolName === acpToolNames.bash) {
180
- // Per Claude Code docs: https://code.claude.com/docs/en/iam#tool-specific-permission-rules
181
- // - Bash(npm run build) matches the EXACT command "npm run build"
182
- // - Bash(npm run test:*) matches commands STARTING WITH "npm run test"
183
- // The :* suffix enables prefix matching, without it the match is exact
184
- //
185
- // Also from docs: "Claude Code is aware of shell operators (like &&) so a prefix match
186
- // rule like Bash(safe-cmd:*) won't give it permission to run the command safe-cmd && other-cmd"
187
- if (rule.isWildcard) {
188
- if (!actualArg.startsWith(rule.argument)) {
189
- return false;
190
- }
191
- // Check that the matched prefix isn't followed by shell operators that could
192
- // allow command chaining/injection
193
- const remainder = actualArg.slice(rule.argument.length);
194
- if (containsShellOperator(remainder)) {
195
- return false;
196
- }
197
- return true;
198
- }
199
- return actualArg === rule.argument;
200
- }
201
-
202
- // For file-based tools (Read, Edit, Write), use glob matching
203
- return matchesGlob(rule.argument, actualArg, cwd);
204
- }
205
-
206
- /**
207
- * Reads and parses a JSON settings file, returning an empty object if not found or invalid
208
- */
209
- async function loadSettingsFile(filePath: string | null): Promise<ClaudeCodeSettings> {
210
- if (!filePath) {
211
- return {};
212
- }
213
-
214
- try {
215
- const content = await fs.promises.readFile(filePath, "utf-8");
216
- return JSON.parse(content) as ClaudeCodeSettings;
217
- } catch {
218
- return {};
219
- }
220
- }
221
-
222
- /**
223
- * Gets the enterprise settings path based on the current platform
224
- */
225
- export function getManagedSettingsPath(): string {
226
- switch (process.platform) {
227
- case "darwin":
228
- return "/Library/Application Support/ClaudeCode/managed-settings.json";
229
- case "linux":
230
- return "/etc/claude-code/managed-settings.json";
231
- case "win32":
232
- return "C:\\Program Files\\ClaudeCode\\managed-settings.json";
233
- default:
234
- return "/etc/claude-code/managed-settings.json";
235
- }
236
- }
237
-
238
- export interface SettingsManagerOptions {
239
- onChange?: () => void;
240
- logger?: { log: (...args: any[]) => void; error: (...args: any[]) => void };
241
- }
242
-
243
- /**
244
- * Manages Claude Code settings from multiple sources with proper precedence.
245
- *
246
- * Settings are loaded from (in order of increasing precedence):
247
- * 1. User settings (~/.claude/settings.json)
248
- * 2. Project settings (<cwd>/.claude/settings.json)
249
- * 3. Local project settings (<cwd>/.claude/settings.local.json)
250
- * 4. Enterprise managed settings (platform-specific path)
251
- *
252
- * The manager watches all settings files for changes and automatically reloads.
253
- */
254
- export class SettingsManager {
255
- private cwd: string;
256
- private userSettings: ClaudeCodeSettings = {};
257
- private projectSettings: ClaudeCodeSettings = {};
258
- private localSettings: ClaudeCodeSettings = {};
259
- private enterpriseSettings: ClaudeCodeSettings = {};
260
- private mergedSettings: ClaudeCodeSettings = {};
261
- private watchers: fs.FSWatcher[] = [];
262
- private onChange?: () => void;
263
- private logger: { log: (...args: any[]) => void; error: (...args: any[]) => void };
264
- private initialized = false;
265
- private debounceTimer: ReturnType<typeof setTimeout> | null = null;
266
-
267
- constructor(cwd: string, options?: SettingsManagerOptions) {
268
- this.cwd = cwd;
269
- this.onChange = options?.onChange;
270
- this.logger = options?.logger ?? console;
271
- }
272
-
273
- /**
274
- * Initialize the settings manager by loading all settings and setting up file watchers
275
- */
276
- async initialize(): Promise<void> {
277
- if (this.initialized) {
278
- return;
279
- }
280
-
281
- await this.loadAllSettings();
282
- this.setupWatchers();
283
- this.initialized = true;
284
- }
285
-
286
- /**
287
- * Returns the path to the user settings file
288
- */
289
- private getUserSettingsPath(): string {
290
- return path.join(CLAUDE_CONFIG_DIR, "settings.json");
291
- }
292
-
293
- /**
294
- * Returns the path to the project settings file
295
- */
296
- private getProjectSettingsPath(): string {
297
- return path.join(this.cwd, ".claude", "settings.json");
298
- }
299
-
300
- /**
301
- * Returns the path to the local project settings file
302
- */
303
- private getLocalSettingsPath(): string {
304
- return path.join(this.cwd, ".claude", "settings.local.json");
305
- }
306
-
307
- /**
308
- * Loads settings from all sources
309
- */
310
- private async loadAllSettings(): Promise<void> {
311
- const [userSettings, projectSettings, localSettings, enterpriseSettings] = await Promise.all([
312
- loadSettingsFile(this.getUserSettingsPath()),
313
- loadSettingsFile(this.getProjectSettingsPath()),
314
- loadSettingsFile(this.getLocalSettingsPath()),
315
- loadSettingsFile(getManagedSettingsPath()),
316
- ]);
317
-
318
- this.userSettings = userSettings;
319
- this.projectSettings = projectSettings;
320
- this.localSettings = localSettings;
321
- this.enterpriseSettings = enterpriseSettings;
322
-
323
- this.mergeSettings();
324
- }
325
-
326
- /**
327
- * Merges all settings sources with proper precedence.
328
- * For permissions, rules from all sources are combined.
329
- * Deny rules always take precedence during permission checks.
330
- */
331
- private mergeSettings(): void {
332
- const allSettings = [
333
- this.userSettings,
334
- this.projectSettings,
335
- this.localSettings,
336
- this.enterpriseSettings,
337
- ];
338
-
339
- const merged: ClaudeCodeSettings = {
340
- permissions: {
341
- allow: [],
342
- deny: [],
343
- ask: [],
344
- },
345
- };
346
-
347
- for (const settings of allSettings) {
348
- if (settings.permissions) {
349
- if (settings.permissions.allow) {
350
- merged.permissions!.allow!.push(...settings.permissions.allow);
351
- }
352
- if (settings.permissions.deny) {
353
- merged.permissions!.deny!.push(...settings.permissions.deny);
354
- }
355
- if (settings.permissions.ask) {
356
- merged.permissions!.ask!.push(...settings.permissions.ask);
357
- }
358
- if (settings.permissions.additionalDirectories) {
359
- merged.permissions!.additionalDirectories = [
360
- ...(merged.permissions!.additionalDirectories || []),
361
- ...settings.permissions.additionalDirectories,
362
- ];
363
- }
364
- if (settings.permissions.defaultMode) {
365
- merged.permissions!.defaultMode = settings.permissions.defaultMode;
366
- }
367
- }
368
-
369
- if (settings.env) {
370
- merged.env = { ...merged.env, ...settings.env };
371
- }
372
- }
373
-
374
- this.mergedSettings = merged;
375
- }
376
-
377
- /**
378
- * Sets up file watchers for all settings files
379
- */
380
- private setupWatchers(): void {
381
- const paths = [
382
- this.getUserSettingsPath(),
383
- this.getProjectSettingsPath(),
384
- this.getLocalSettingsPath(),
385
- getManagedSettingsPath(),
386
- ];
387
-
388
- for (const filePath of paths) {
389
- if (!filePath) continue;
390
-
391
- try {
392
- const dir = path.dirname(filePath);
393
- const filename = path.basename(filePath);
394
-
395
- if (fs.existsSync(dir)) {
396
- const watcher = fs.watch(dir, (eventType, changedFilename) => {
397
- if (changedFilename === filename) {
398
- this.handleSettingsChange();
399
- }
400
- });
401
-
402
- watcher.on("error", (error) => {
403
- this.logger.error(`Settings watcher error for ${filePath}:`, error);
404
- });
405
-
406
- this.watchers.push(watcher);
407
- }
408
- } catch (error) {
409
- this.logger.error(`Failed to set up watcher for ${filePath}:`, error);
410
- }
411
- }
412
- }
413
-
414
- /**
415
- * Handles settings file changes with debouncing to avoid rapid reloads
416
- */
417
- private handleSettingsChange(): void {
418
- if (this.debounceTimer) {
419
- clearTimeout(this.debounceTimer);
420
- }
421
-
422
- this.debounceTimer = setTimeout(async () => {
423
- this.debounceTimer = null;
424
- try {
425
- await this.loadAllSettings();
426
- this.onChange?.();
427
- } catch (error) {
428
- this.logger.error("Failed to reload settings:", error);
429
- }
430
- }, 100);
431
- }
432
-
433
- /**
434
- * Checks if a tool invocation is allowed based on the loaded settings.
435
- *
436
- * @param toolName - The tool name (can be ACP-prefixed like mcp__acp__Read or plain like Read)
437
- * @param toolInput - The tool input object
438
- * @returns The permission decision and matching rule info
439
- */
440
- checkPermission(toolName: string, toolInput: unknown): PermissionCheckResult {
441
- if (!toolName.startsWith(ACP_TOOL_NAME_PREFIX)) {
442
- return { decision: "ask" };
443
- }
444
-
445
- const permissions = this.mergedSettings.permissions;
446
-
447
- if (!permissions) {
448
- return { decision: "ask" };
449
- }
450
-
451
- // Check deny rules first (highest priority)
452
- for (const rule of permissions.deny || []) {
453
- const parsed = parseRule(rule);
454
- if (matchesRule(parsed, toolName, toolInput, this.cwd)) {
455
- return { decision: "deny", rule, source: "deny" };
456
- }
457
- }
458
-
459
- // Check allow rules
460
- for (const rule of permissions.allow || []) {
461
- const parsed = parseRule(rule);
462
- if (matchesRule(parsed, toolName, toolInput, this.cwd)) {
463
- return { decision: "allow", rule, source: "allow" };
464
- }
465
- }
466
-
467
- // Check ask rules
468
- for (const rule of permissions.ask || []) {
469
- const parsed = parseRule(rule);
470
- if (matchesRule(parsed, toolName, toolInput, this.cwd)) {
471
- return { decision: "ask", rule, source: "ask" };
472
- }
473
- }
474
-
475
- // No matching rule - default to ask
476
- return { decision: "ask" };
477
- }
478
-
479
- /**
480
- * Returns the current merged settings
481
- */
482
- getSettings(): ClaudeCodeSettings {
483
- return this.mergedSettings;
484
- }
485
-
486
- /**
487
- * Returns the current working directory
488
- */
489
- getCwd(): string {
490
- return this.cwd;
491
- }
492
-
493
- /**
494
- * Updates the working directory and reloads project-specific settings
495
- */
496
- async setCwd(cwd: string): Promise<void> {
497
- if (this.cwd === cwd) {
498
- return;
499
- }
500
-
501
- this.dispose();
502
- this.cwd = cwd;
503
- this.initialized = false;
504
- await this.initialize();
505
- }
506
-
507
- /**
508
- * Disposes of file watchers and cleans up resources
509
- */
510
- dispose(): void {
511
- if (this.debounceTimer) {
512
- clearTimeout(this.debounceTimer);
513
- this.debounceTimer = null;
514
- }
515
-
516
- for (const watcher of this.watchers) {
517
- watcher.close();
518
- }
519
- this.watchers = [];
520
- this.initialized = false;
521
- }
522
- }
@@ -1,5 +0,0 @@
1
- ---
2
- description: 10 * 3 = 30
3
- ---
4
-
5
- What is 10 \* 3. Only respond with the number.
@@ -1,6 +0,0 @@
1
- ---
2
- description: Say hello
3
- argument-hint: name
4
- ---
5
-
6
- Respond with "Hello $1" and nothing else.