crewly 1.20.191 → 1.20.193

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 (541) hide show
  1. package/config/constants.ts +11 -0
  2. package/config/hooks/subagent-guard/subagent.sh +113 -0
  3. package/config/roles/architect/prompt.md +1 -1
  4. package/config/roles/auditor/prompt.md +1 -1
  5. package/config/roles/backend-developer/prompt.md +1 -1
  6. package/config/roles/content-strategist/prompt.md +2 -2
  7. package/config/roles/designer/prompt.md +1 -1
  8. package/config/roles/developer/prompt.md +2 -2
  9. package/config/roles/frontend-developer/prompt.md +1 -1
  10. package/config/roles/fullstack-dev/prompt.md +1 -1
  11. package/config/roles/generalist/prompt.md +1 -1
  12. package/config/roles/ops/prompt.md +1 -1
  13. package/config/roles/orchestrator/prompt.md +2 -2
  14. package/config/roles/product-manager/prompt.md +1 -1
  15. package/config/roles/qa/prompt.md +1 -1
  16. package/config/roles/qa-engineer/prompt.md +1 -1
  17. package/config/roles/researcher/prompt.md +1 -1
  18. package/config/roles/sales/prompt.md +1 -1
  19. package/config/roles/support/prompt.md +1 -1
  20. package/config/roles/team-leader/prompt.md +1 -1
  21. package/config/roles/tpm/prompt.md +1 -1
  22. package/config/roles/ux-designer/prompt.md +1 -1
  23. package/config/skills/_common/complete-body-shape.test.sh +17 -0
  24. package/config/skills/agent/core/complete-task/SKILL.md +27 -4
  25. package/config/skills/agent/core/complete-task/execute.sh +23 -3
  26. package/config/skills/agent/core/complete-task/execute.test.sh +34 -0
  27. package/config/skills/agent/core/handoff-task/execute.sh +1 -1
  28. package/config/skills/agent/core/report-status/SKILL.md +27 -4
  29. package/config/skills/agent/core/report-status/execute.sh +104 -4
  30. package/config/skills/agent/core/send-message/SKILL.md +6 -0
  31. package/config/skills/agent/core/send-message/execute.sh +17 -1
  32. package/config/skills/agent/core/send-message/execute.test.sh +81 -0
  33. package/config/skills/agent/core/todo-add/SKILL.md +16 -2
  34. package/config/skills/agent/core/todo-add/execute.sh +21 -5
  35. package/config/skills/agent/core/todo-add/execute.test.sh +14 -0
  36. package/config/skills/agent/core/todo-tasks/SKILL.md +4 -3
  37. package/config/skills/agent/core/todo-update/SKILL.md +13 -2
  38. package/config/skills/agent/core/todo-update/execute.sh +41 -3
  39. package/config/skills/agent/core/todo-update/execute.test.sh +7 -0
  40. package/config/skills/marketplace-registry.ts +4 -4
  41. package/config/skills/orchestrator/complete-task/SKILL.md +13 -6
  42. package/config/skills/orchestrator/complete-task/execute.sh +22 -3
  43. package/config/skills/orchestrator/delegate-task/execute.sh +2 -2
  44. package/config/skills/orchestrator/harness-login/SKILL.md +9 -1
  45. package/config/skills/orchestrator/harness-login/execute.sh +12 -4
  46. package/config/skills/orchestrator/harness-login/execute.test.sh +7 -0
  47. package/config/skills/team-leader/delegate-task/execute.sh +1 -1
  48. package/config/skills/team-leader/verify-output/SKILL.md +18 -1
  49. package/config/skills/team-leader/verify-output/execute.sh +28 -0
  50. package/config/skills/team-leader/verify-output/execute.test.sh +27 -0
  51. package/dist/backend/backend/src/constants.d.ts +181 -2
  52. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  53. package/dist/backend/backend/src/constants.js +183 -2
  54. package/dist/backend/backend/src/constants.js.map +1 -1
  55. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts +6 -0
  56. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts.map +1 -1
  57. package/dist/backend/backend/src/controllers/canva/canva.controller.js +15 -4
  58. package/dist/backend/backend/src/controllers/canva/canva.controller.js.map +1 -1
  59. package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
  60. package/dist/backend/backend/src/controllers/canva/canva.routes.js +3 -1
  61. package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
  62. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts +1 -1
  63. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +1 -1
  64. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  65. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +4 -1
  66. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  67. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -0
  68. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
  69. package/dist/backend/backend/src/controllers/connector/connector.controller.js +32 -3
  70. package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
  71. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts +41 -0
  72. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -0
  73. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +75 -0
  74. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -0
  75. package/dist/backend/backend/src/controllers/google/google.controller.d.ts +6 -0
  76. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  77. package/dist/backend/backend/src/controllers/google/google.controller.js +21 -2
  78. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  79. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  80. package/dist/backend/backend/src/controllers/google/google.routes.js +3 -1
  81. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  82. package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts.map +1 -1
  83. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +22 -3
  84. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -1
  85. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +19 -2
  86. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -1
  87. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +39 -6
  88. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -1
  89. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
  90. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +3 -1
  91. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
  92. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +9 -0
  93. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  94. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +71 -2
  95. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  96. package/dist/backend/backend/src/controllers/people/people.routes.d.ts +25 -0
  97. package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -0
  98. package/dist/backend/backend/src/controllers/people/people.routes.js +90 -0
  99. package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -0
  100. package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
  101. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  102. package/dist/backend/backend/src/controllers/security/approvals.controller.d.ts +26 -0
  103. package/dist/backend/backend/src/controllers/security/approvals.controller.d.ts.map +1 -0
  104. package/dist/backend/backend/src/controllers/security/approvals.controller.js +73 -0
  105. package/dist/backend/backend/src/controllers/security/approvals.controller.js.map +1 -0
  106. package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
  107. package/dist/backend/backend/src/controllers/session/session.controller.js +9 -0
  108. package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
  109. package/dist/backend/backend/src/controllers/slack/slack.controller.js +1 -1
  110. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  111. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +22 -1
  112. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  113. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +143 -3
  114. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  115. package/dist/backend/backend/src/controllers/system/usage.controller.d.ts +3 -3
  116. package/dist/backend/backend/src/controllers/system/usage.controller.js +3 -3
  117. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +25 -3
  118. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  119. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +125 -19
  120. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  121. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  122. package/dist/backend/backend/src/controllers/team/team.controller.js +14 -0
  123. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  124. package/dist/backend/backend/src/index.d.ts.map +1 -1
  125. package/dist/backend/backend/src/index.js +44 -1
  126. package/dist/backend/backend/src/index.js.map +1 -1
  127. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  128. package/dist/backend/backend/src/routes/api.routes.js +3 -0
  129. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  130. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  131. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  132. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  133. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  134. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  135. package/dist/backend/backend/src/services/agent/agent-registration.service.js +28 -3
  136. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  137. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  138. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  139. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +14 -3
  140. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  141. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  142. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  143. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  144. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  145. package/dist/backend/backend/src/services/agent/idle-detection.service.js +1 -1
  146. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  147. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  148. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  150. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  151. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  152. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  154. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  156. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +49 -5
  158. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  159. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  160. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  161. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  162. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  163. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  164. package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts +8 -0
  165. package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts.map +1 -1
  166. package/dist/backend/backend/src/services/browser/browser-approval.service.js +10 -0
  167. package/dist/backend/backend/src/services/browser/browser-approval.service.js.map +1 -1
  168. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts +17 -4
  169. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts.map +1 -1
  170. package/dist/backend/backend/src/services/canva/canva-token.service.js +49 -17
  171. package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
  172. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +55 -0
  173. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +80 -0
  175. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  176. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts +1 -1
  177. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js +1 -1
  178. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts +1 -1
  179. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js +1 -1
  180. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +17 -2
  181. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -1
  182. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +30 -6
  183. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
  184. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +38 -2
  185. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
  186. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +63 -1
  187. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
  188. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  189. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  190. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +204 -56
  191. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  192. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  193. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  194. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  195. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +9 -0
  196. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  197. package/dist/backend/backend/src/services/decisions/decision.service.js +11 -0
  198. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  199. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +3 -0
  201. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +25 -2
  203. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
  204. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +48 -7
  205. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
  206. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +207 -0
  207. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  208. package/dist/backend/backend/src/services/harness/claude-accounts.js +306 -0
  209. package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -0
  210. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  211. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  212. package/dist/backend/backend/src/services/harness/harness-credentials.store.js +48 -0
  213. package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  214. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  215. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  216. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +156 -19
  217. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  218. package/dist/backend/backend/src/services/harness/harness.types.d.ts +2 -0
  219. package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
  220. package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
  221. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +19 -4
  222. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  223. package/dist/backend/backend/src/services/harness/login-broker.service.js +46 -7
  224. package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
  225. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +18 -2
  226. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  227. package/dist/backend/backend/src/services/harness/owner-login-request.js +31 -7
  228. package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -1
  229. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  230. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  231. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  232. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  233. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
  234. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  235. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +29 -0
  236. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  237. package/dist/backend/backend/src/services/messaging/spend-capped-delivery.d.ts +54 -0
  238. package/dist/backend/backend/src/services/messaging/spend-capped-delivery.d.ts.map +1 -0
  239. package/dist/backend/backend/src/services/messaging/spend-capped-delivery.js +65 -0
  240. package/dist/backend/backend/src/services/messaging/spend-capped-delivery.js.map +1 -0
  241. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  242. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  243. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  244. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  245. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +87 -5
  246. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -1
  247. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +151 -12
  248. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -1
  249. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +17 -4
  250. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
  251. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +45 -17
  252. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -1
  253. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts +118 -2
  254. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -1
  255. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js +213 -45
  256. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -1
  257. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +53 -1
  258. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
  259. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +137 -60
  260. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
  261. package/dist/backend/backend/src/services/monitoring/model-pricing.d.ts +2 -1
  262. package/dist/backend/backend/src/services/monitoring/model-pricing.d.ts.map +1 -1
  263. package/dist/backend/backend/src/services/monitoring/model-pricing.js +13 -0
  264. package/dist/backend/backend/src/services/monitoring/model-pricing.js.map +1 -1
  265. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +9 -0
  266. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  267. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +32 -3
  268. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  269. package/dist/backend/backend/src/services/people/acting-for.service.d.ts +151 -0
  270. package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  271. package/dist/backend/backend/src/services/people/acting-for.service.js +224 -0
  272. package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -0
  273. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts +89 -0
  274. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  275. package/dist/backend/backend/src/services/people/dedicated-agent.js +113 -0
  276. package/dist/backend/backend/src/services/people/dedicated-agent.js.map +1 -0
  277. package/dist/backend/backend/src/services/people/grant-sharing.d.ts +79 -0
  278. package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -0
  279. package/dist/backend/backend/src/services/people/grant-sharing.js +135 -0
  280. package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -0
  281. package/dist/backend/backend/src/services/people/people-directory.service.d.ts +181 -0
  282. package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  283. package/dist/backend/backend/src/services/people/people-directory.service.js +317 -0
  284. package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -0
  285. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  286. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  287. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  288. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  289. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  290. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -1
  291. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +16 -2
  293. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
  294. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +60 -1
  295. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  296. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +140 -8
  297. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  298. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +1 -1
  299. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -1
  300. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  301. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  302. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  303. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  304. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  305. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +12 -2
  306. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  307. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +7 -1
  308. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -1
  309. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +18 -3
  310. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -1
  311. package/dist/backend/backend/src/services/security/approval-activity.service.d.ts +203 -0
  312. package/dist/backend/backend/src/services/security/approval-activity.service.d.ts.map +1 -0
  313. package/dist/backend/backend/src/services/security/approval-activity.service.js +279 -0
  314. package/dist/backend/backend/src/services/security/approval-activity.service.js.map +1 -0
  315. package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
  316. package/dist/backend/backend/src/services/skill/skill.service.js +14 -3
  317. package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
  318. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  319. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  320. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  321. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +22 -0
  322. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -1
  323. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +50 -0
  324. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -1
  325. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
  326. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  327. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
  328. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  329. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +54 -1
  330. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  331. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +260 -20
  332. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  333. package/dist/backend/backend/src/services/spend/spend-cap-command.js +1 -1
  334. package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -1
  335. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +48 -1
  336. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -1
  337. package/dist/backend/backend/src/services/spend/spend-cap.service.js +85 -2
  338. package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -1
  339. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts +105 -0
  340. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts.map +1 -0
  341. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js +238 -0
  342. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js.map +1 -0
  343. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  344. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +4 -0
  345. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  346. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +101 -14
  347. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -1
  348. package/dist/backend/backend/src/services/usage/usage-stats.service.js +183 -61
  349. package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -1
  350. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -0
  351. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  352. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +9 -0
  353. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  354. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +10 -0
  355. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  356. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +45 -2
  357. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  358. package/dist/backend/backend/src/types/index.d.ts +12 -1
  359. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  360. package/dist/backend/backend/src/types/index.js.map +1 -1
  361. package/dist/backend/backend/src/types/messaging.types.d.ts +5 -0
  362. package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
  363. package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
  364. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts +77 -0
  365. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts.map +1 -0
  366. package/dist/backend/backend/src/types/v2/completion-evidence.types.js +119 -0
  367. package/dist/backend/backend/src/types/v2/completion-evidence.types.js.map +1 -0
  368. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +13 -0
  369. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  370. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  371. package/dist/backend/build-info.json +2 -2
  372. package/dist/backend/config/constants.d.ts +11 -0
  373. package/dist/backend/config/constants.d.ts.map +1 -1
  374. package/dist/backend/config/constants.js +11 -0
  375. package/dist/backend/config/constants.js.map +1 -1
  376. package/dist/cli/backend/src/constants.d.ts +181 -2
  377. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  378. package/dist/cli/backend/src/constants.js +183 -2
  379. package/dist/cli/backend/src/constants.js.map +1 -1
  380. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  381. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  382. package/dist/cli/backend/src/services/agent/agent-registration.service.js +28 -3
  383. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  384. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  385. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  386. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +14 -3
  387. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  388. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  389. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  390. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  391. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  392. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  393. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  394. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  395. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  396. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  397. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  398. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  399. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  400. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  401. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  402. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +49 -5
  403. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  404. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  405. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  406. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  407. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  408. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  409. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +55 -0
  410. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  411. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +80 -0
  412. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  413. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts +1 -1
  414. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js +1 -1
  415. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  416. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  417. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +204 -56
  418. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  419. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  420. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  421. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  422. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +9 -0
  423. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  424. package/dist/cli/backend/src/services/decisions/decision.service.js +11 -0
  425. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  426. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +207 -0
  427. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  428. package/dist/cli/backend/src/services/harness/claude-accounts.js +306 -0
  429. package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -0
  430. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  431. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  432. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +48 -0
  433. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  434. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  435. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  436. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +156 -19
  437. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  438. package/dist/cli/backend/src/services/harness/harness.types.d.ts +2 -0
  439. package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
  440. package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
  441. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +19 -4
  442. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  443. package/dist/cli/backend/src/services/harness/login-broker.service.js +46 -7
  444. package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
  445. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +18 -2
  446. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  447. package/dist/cli/backend/src/services/harness/owner-login-request.js +31 -7
  448. package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -1
  449. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  450. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  451. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  452. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  453. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
  454. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  455. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +29 -0
  456. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  457. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  458. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  459. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  460. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  461. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts +197 -0
  462. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -0
  463. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js +455 -0
  464. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -0
  465. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts +2 -1
  466. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts.map +1 -1
  467. package/dist/cli/backend/src/services/monitoring/model-pricing.js +13 -0
  468. package/dist/cli/backend/src/services/monitoring/model-pricing.js.map +1 -1
  469. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +9 -0
  470. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  471. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +32 -3
  472. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  473. package/dist/cli/backend/src/services/people/acting-for.service.d.ts +151 -0
  474. package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  475. package/dist/cli/backend/src/services/people/acting-for.service.js +224 -0
  476. package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -0
  477. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts +89 -0
  478. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  479. package/dist/cli/backend/src/services/people/dedicated-agent.js +113 -0
  480. package/dist/cli/backend/src/services/people/dedicated-agent.js.map +1 -0
  481. package/dist/cli/backend/src/services/people/people-directory.service.d.ts +181 -0
  482. package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  483. package/dist/cli/backend/src/services/people/people-directory.service.js +317 -0
  484. package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -0
  485. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  486. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  487. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  488. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  489. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  490. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  491. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  492. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  493. package/dist/cli/backend/src/services/skill/skill.service.d.ts.map +1 -1
  494. package/dist/cli/backend/src/services/skill/skill.service.js +14 -3
  495. package/dist/cli/backend/src/services/skill/skill.service.js.map +1 -1
  496. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  497. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  498. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  499. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +22 -0
  500. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -1
  501. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +50 -0
  502. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -1
  503. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
  504. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  505. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
  506. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  507. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +54 -1
  508. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  509. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +260 -20
  510. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  511. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  512. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +4 -0
  513. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  514. package/dist/cli/backend/src/types/index.d.ts +12 -1
  515. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  516. package/dist/cli/backend/src/types/index.js.map +1 -1
  517. package/dist/cli/backend/src/types/messaging.types.d.ts +5 -0
  518. package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
  519. package/dist/cli/backend/src/types/messaging.types.js.map +1 -1
  520. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +13 -0
  521. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  522. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  523. package/dist/cli/cli/src/utils/marketplace.d.ts +21 -0
  524. package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
  525. package/dist/cli/cli/src/utils/marketplace.js +35 -1
  526. package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
  527. package/dist/cli/config/constants.d.ts +11 -0
  528. package/dist/cli/config/constants.d.ts.map +1 -1
  529. package/dist/cli/config/constants.js +11 -0
  530. package/dist/cli/config/constants.js.map +1 -1
  531. package/dist/cli/config/skills/marketplace-registry.d.ts +4 -4
  532. package/dist/cli/config/skills/marketplace-registry.js +4 -4
  533. package/frontend/dist/assets/index-465d1f8f.js +4955 -0
  534. package/frontend/dist/assets/index-5e967795.css +42 -0
  535. package/frontend/dist/index.html +2 -2
  536. package/package.json +1 -1
  537. package/packages/crewly-agent/src/runtime/tool-registry.test.ts +45 -0
  538. package/packages/crewly-agent/src/runtime/tool-registry.ts +40 -5
  539. package/packages/crewly-agent/src/test/isolated-home.test.ts +24 -0
  540. package/frontend/dist/assets/index-20a67829.css +0 -42
  541. package/frontend/dist/assets/index-49f50b45.js +0 -4952
@@ -9,7 +9,12 @@ print_usage() {
9
9
  cat <<'EOF_USAGE'
10
10
  Usage:
11
11
  # CLI flags (preferred — avoids shell escaping issues)
12
- bash execute.sh --session dev-1 --status done --summary "Fixed the bug" --project /path/to/project
12
+ bash execute.sh --session dev-1 --status done --summary "Fixed the bug" --project /path/to/project \
13
+ --artifact src/fix.ts --command "npm test" --exit-code 0 --output-tail "42 passed"
14
+
15
+ # Could not finish: done with a blocked step is recorded as BLOCKED, not done
16
+ bash execute.sh --session dev-1 --status done --summary "Fix written, tests blocked" \
17
+ --blocked-step "npm test" --blocked-reason "test DB unreachable"
13
18
 
14
19
  # Summary from stdin (for multi-line or special characters)
15
20
  echo "Fixed the bug — it's working" | bash execute.sh --session dev-1 --status done --project /path
@@ -37,6 +42,18 @@ Options:
37
42
  --progress Progress percentage (0-100, for structured format)
38
43
  --structured Use structured StatusReport format (true/false)
39
44
  --json | -j Raw JSON payload (same as legacy)
45
+
46
+ Evidence (status done — #873: "done" needs evidence):
47
+ --artifact <path> A file the work produced (absolute, relative to the
48
+ project/worktree, or an https URL). Must exist. Repeatable.
49
+ --command <cmd> A command you ran. Follow it with --exit-code (required)
50
+ --exit-code <n> and optionally --output-tail. Repeatable as a group.
51
+ --output-tail <text> Last lines of that command's output.
52
+ --blocked-step <step> You could not finish: the step that failed ...
53
+ --blocked-reason <why> ... and why. The WorkItem is recorded as BLOCKED, not done.
54
+ --evidence <json> Raw evidence array, e.g. '[{"type":"artifact","path":"/abs/f"}]'
55
+ A non-zero --exit-code or a missing artifact is rejected by the server. Without
56
+ any evidence, done is accepted this release with a warning; next release it is refused.
40
57
  --help | -h Show this help
41
58
  EOF_USAGE
42
59
  }
@@ -52,6 +69,28 @@ TASK_ID=""
52
69
  WORK_ITEM_ID=""
53
70
  PROGRESS=""
54
71
  STRUCTURED="false"
72
+ # Evidence entries built from flags (#873), as a JSON array.
73
+ FLAG_EVIDENCE='[]'
74
+ BLOCKED_STEP=""
75
+ BLOCKED_REASON=""
76
+ EVIDENCE_ARG=""
77
+
78
+ # add_evidence <jq-object-expression> [jq --arg pairs...]
79
+ # Appends one entry to FLAG_EVIDENCE.
80
+ add_evidence() {
81
+ local expr="$1"; shift
82
+ FLAG_EVIDENCE=$(printf '%s' "$FLAG_EVIDENCE" | jq -c "$@" ". + [${expr}]")
83
+ }
84
+
85
+ # set_last_command_field <field> <jq value expression> [jq --arg/--argjson pairs...]
86
+ # Sets a field on the most recent --command entry; refuses when there is none.
87
+ set_last_command_field() {
88
+ local field="$1" valexpr="$2" flag="$3"; shift 3
89
+ if [ "$(printf '%s' "$FLAG_EVIDENCE" | jq -r 'if length > 0 and .[-1].type == "command" then "yes" else "no" end')" != "yes" ]; then
90
+ error_exit "${flag} must follow --command <cmd>"
91
+ fi
92
+ FLAG_EVIDENCE=$(printf '%s' "$FLAG_EVIDENCE" | jq -c "$@" ".[-1].${field} = ${valexpr}")
93
+ }
55
94
 
56
95
  # Detect legacy JSON argument as the first parameter
57
96
  if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
@@ -109,6 +148,35 @@ while [[ $# -gt 0 ]]; do
109
148
  INPUT_JSON="$2"
110
149
  shift 2
111
150
  ;;
151
+ --artifact)
152
+ add_evidence '{type: "artifact", path: $p}' --arg p "$2"
153
+ shift 2
154
+ ;;
155
+ --command)
156
+ add_evidence '{type: "command", command: $c}' --arg c "$2"
157
+ shift 2
158
+ ;;
159
+ --exit-code)
160
+ [[ "$2" =~ ^-?[0-9]+$ ]] || error_exit "--exit-code must be an integer (got \"$2\")"
161
+ set_last_command_field exitCode '($n | tonumber)' --exit-code --arg n "$2"
162
+ shift 2
163
+ ;;
164
+ --output-tail)
165
+ set_last_command_field outputTail '$t' --output-tail --arg t "$2"
166
+ shift 2
167
+ ;;
168
+ --blocked-step)
169
+ BLOCKED_STEP="$2"
170
+ shift 2
171
+ ;;
172
+ --blocked-reason)
173
+ BLOCKED_REASON="$2"
174
+ shift 2
175
+ ;;
176
+ --evidence)
177
+ EVIDENCE_ARG="$2"
178
+ shift 2
179
+ ;;
112
180
  --help|-h)
113
181
  print_usage
114
182
  exit 0
@@ -152,6 +220,7 @@ if [ -n "$INPUT_JSON" ]; then
152
220
  [ -z "$AGENT_ROLE" ] && AGENT_ROLE=$(printf '%s' "$INPUT" | jq -r '.role // .agentRole // empty')
153
221
  ARTIFACTS=$(printf '%s' "$INPUT" | jq -c '.artifacts // empty')
154
222
  BLOCKERS=$(printf '%s' "$INPUT" | jq -c '.blockers // empty')
223
+ [ -z "$EVIDENCE_ARG" ] && EVIDENCE_ARG=$(printf '%s' "$INPUT" | jq -c '.evidence // empty')
155
224
  USE_STRUCTURED=$(printf '%s' "$INPUT" | jq -r '.structured // "false"')
156
225
  [ "$USE_STRUCTURED" = "true" ] && STRUCTURED="true"
157
226
  else
@@ -159,6 +228,24 @@ else
159
228
  BLOCKERS=""
160
229
  fi
161
230
 
231
+ # Assemble the evidence block (#873): --evidence / JSON `evidence` first, then
232
+ # the entries from --artifact / --command / --blocked-step flags.
233
+ if [ -n "$EVIDENCE_ARG" ]; then
234
+ if ! printf '%s' "$EVIDENCE_ARG" | jq -e 'type == "array"' >/dev/null 2>&1; then
235
+ error_exit "evidence must be a JSON array, e.g. '[{\"type\":\"artifact\",\"path\":\"/abs/file\"}]'"
236
+ fi
237
+ else
238
+ EVIDENCE_ARG='[]'
239
+ fi
240
+ if [ -n "$BLOCKED_STEP" ] || [ -n "$BLOCKED_REASON" ]; then
241
+ [ -n "$BLOCKED_STEP" ] && [ -n "$BLOCKED_REASON" ] || error_exit "--blocked-step and --blocked-reason go together: name the step that failed and why"
242
+ add_evidence '{type: "blocked", step: $s, reason: $r}' --arg s "$BLOCKED_STEP" --arg r "$BLOCKED_REASON"
243
+ fi
244
+ if [ "$(printf '%s' "$FLAG_EVIDENCE" | jq '[.[] | select(.type == "command" and (has("exitCode") | not))] | length')" != "0" ]; then
245
+ error_exit "every --command needs --exit-code <n> after it: the exit code is the evidence"
246
+ fi
247
+ EVIDENCE=$(jq -cn --argjson a "$EVIDENCE_ARG" --argjson b "$FLAG_EVIDENCE" '$a + $b')
248
+
162
249
  require_param "sessionName (--session)" "$SESSION_NAME"
163
250
  require_param "status (--status)" "$STATUS"
164
251
  require_param "summary (--summary)" "$SUMMARY"
@@ -297,18 +384,31 @@ if [ "$STATUS" = "done" ]; then
297
384
  # `completeItem`). Prior shape `{summary}` 400'd with
298
385
  # `agentId is required` + `summary required in body.result`,
299
386
  # forcing every worker into a direct-curl workaround.
387
+ #
388
+ # #873: the evidence block goes in result.evidence. Omitted when empty
389
+ # (the server then warns this release, refuses the next).
300
390
  COMPLETE_BODY=$(jq -n \
301
391
  --arg agentId "$SESSION_NAME" \
302
392
  --arg summary "$SUMMARY" \
303
- '{agentId: $agentId, result: {summary: $summary}}')
393
+ --argjson evidence "$EVIDENCE" \
394
+ '{agentId: $agentId, result: ({summary: $summary} + (if ($evidence | length) > 0 then {evidence: $evidence} else {} end))}')
304
395
  # No `|| true`. A swallowed failure here is the inverse of the bug above:
305
396
  # report-status would announce success while the WorkItem stayed open, and
306
397
  # that is equally invisible. Report what actually happened either way.
307
398
  if COMPLETE_RESULT=$(api_call POST "/task-pool/complete/${TARGET_WI_ID}" "$COMPLETE_BODY" 2>&1); then
308
399
  # Echo the resolved id even on the happy path. Silent-but-correct is how
309
400
  # this class hides — the caller must be able to see WHICH item closed.
310
- jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" \
311
- '{completedWorkItem: $id, resolvedBy: $how}' >&2
401
+ # A `blocked` evidence entry is recorded as blocked, not done (#873);
402
+ # a completion without evidence carries the server's warning.
403
+ COMPLETE_WARNING=$(printf '%s' "$COMPLETE_RESULT" | jq -rs '(map(select(type == "object" and has("success"))) | last // {}) | .warning // empty' 2>/dev/null || true)
404
+ COMPLETE_RECORDED=$(printf '%s' "$COMPLETE_RESULT" | jq -rs '(map(select(type == "object" and has("success"))) | last // {}) | .recordedAs // empty' 2>/dev/null || true)
405
+ if [ "$COMPLETE_RECORDED" = "blocked" ]; then
406
+ jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" \
407
+ '{workItem: $id, markedAs: "blocked", resolvedBy: $how, note: "blocked evidence: recorded as blocked, not done"}' >&2
408
+ else
409
+ jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" --arg w "$COMPLETE_WARNING" \
410
+ '{completedWorkItem: $id, resolvedBy: $how} + (if $w != "" then {warning: $w} else {} end)' >&2
411
+ fi
312
412
  else
313
413
  jq -n --arg id "$TARGET_WI_ID" --arg err "$COMPLETE_RESULT" \
314
414
  '{warning: "status reported, but completing the WorkItem FAILED — it is still open", workItemId: $id, error: $err}' >&2
@@ -76,3 +76,9 @@ bash execute.sh '{"to":"qa-1","message":"PR #42 is ready for review."}'
76
76
  ## Output
77
77
 
78
78
  JSON confirmation of message delivery.
79
+
80
+ If the recipient cannot take the message now, the output has `"queued": true`
81
+ and `"delivered": false` with a `note`. With `"spendCapped": true` the
82
+ recipient has hit its daily token cap: the message waits and is delivered
83
+ automatically when the cap resets at midnight or the owner boosts it. Do not
84
+ resend a queued message.
@@ -98,4 +98,20 @@ require_param "message (--message)" "$MESSAGE"
98
98
 
99
99
  BODY=$(jq -n --arg data "$MESSAGE" --arg mode "message" '{data: $data, mode: $mode}')
100
100
 
101
- api_call POST "/terminal/${TO}/write" "$BODY"
101
+ RESP=$(api_call POST "/terminal/${TO}/write" "$BODY")
102
+
103
+ # A 202 `queued` answer means the message was NOT typed into the recipient's
104
+ # session yet: it is held on its queue (daily token cap `spendCapped`, agent
105
+ # still starting, session down, …) and delivered automatically later (#937).
106
+ # Say so plainly so the sender neither treats it as read nor resends it.
107
+ if printf '%s' "$RESP" | jq -e 'type == "object" and .queued == true' >/dev/null 2>&1; then
108
+ printf '%s' "$RESP" | jq -c --arg to "$TO" '. + {
109
+ delivered: false,
110
+ note: (if .spendCapped == true
111
+ then "Not delivered yet: \($to) has hit its daily token cap and takes no new turns. Your message is queued and is delivered automatically when the cap resets at midnight or the owner boosts it. Do not resend; do not wait on a reply today."
112
+ else "Not delivered yet: your message to \($to) is queued and is delivered automatically. Do not resend."
113
+ end)
114
+ }'
115
+ else
116
+ printf '%s\n' "$RESP"
117
+ fi
@@ -0,0 +1,81 @@
1
+ #!/bin/bash
2
+ # Tests for agent send-message execute.sh
3
+ #
4
+ # Runs a COPY of the real execute.sh under a stubbed api_call (the
5
+ # set-team-lead / delegate-task pattern), so the script logic is exercised
6
+ # verbatim without a backend.
7
+ #
8
+ # Coverage:
9
+ # 1. POSTs to /terminal/<to>/write with mode=message
10
+ # 2. a normal write is printed unchanged
11
+ # 3. a daily-token-cap hold (202 queued, spendCapped) is reported as
12
+ # queued, not delivered, with a do-not-resend note (#937)
13
+ # 4. another queued answer is reported as queued, not delivered
14
+ # 5. an HTTP error still fails the skill
15
+
16
+ set -euo pipefail
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ PASS=0
19
+ FAIL=0
20
+
21
+ CALL_LOG=$(mktemp)
22
+ RESP_FILE=$(mktemp)
23
+ SKILL_PARENT=$(mktemp -d)
24
+ trap 'rm -rf "$SKILL_PARENT" "$CALL_LOG" "$RESP_FILE"' EXIT
25
+
26
+ mkdir -p "$SKILL_PARENT/_common" "$SKILL_PARENT/core/send-message"
27
+ REAL_LIB="$(cd "$SCRIPT_DIR/../../.." && pwd)/_common/lib.sh"
28
+ cat > "$SKILL_PARENT/_common/lib.sh" <<STUB
29
+ source "$REAL_LIB"
30
+ api_call() {
31
+ local method="\$1" path="\$2" body="\${3:-}"
32
+ echo "\${method} \${path} \$(printf '%s' "\$body" | jq -c .)" >> "${CALL_LOG}"
33
+ if [ "\$(cat "${RESP_FILE}")" = "FAIL" ]; then
34
+ echo '{"error":true,"status":404,"details":"not found"}' >&2
35
+ return 1
36
+ fi
37
+ cat "${RESP_FILE}"
38
+ }
39
+ STUB
40
+ cp "$SCRIPT_DIR/execute.sh" "$SKILL_PARENT/core/send-message/execute.sh"
41
+ RUN="$SKILL_PARENT/core/send-message/execute.sh"
42
+
43
+ check() {
44
+ local desc="$1" haystack="$2" pattern="$3"
45
+ if printf '%s' "$haystack" | grep -qF -- "$pattern"; then
46
+ echo " PASS: $desc"; PASS=$((PASS + 1))
47
+ else
48
+ echo " FAIL: $desc (expected '$pattern' in: $haystack)"; FAIL=$((FAIL + 1))
49
+ fi
50
+ }
51
+
52
+ echo "=== agent send-message ==="
53
+
54
+ > "$CALL_LOG"
55
+ echo '{"success":true,"message":"Data written successfully"}' > "$RESP_FILE"
56
+ OUT=$(bash "$RUN" --to qa-1 --message "PR #42 is ready" 2>/dev/null)
57
+ check "posts to /write in message mode" "$(cat "$CALL_LOG")" 'POST /terminal/qa-1/write {"data":"PR #42 is ready","mode":"message"}'
58
+ check "a written message is printed unchanged" "$OUT" '"message":"Data written successfully"'
59
+
60
+ echo '{"success":true,"queued":true,"spendCapped":true,"message":"[SPEND_CAP] Ella hit its daily token cap (5M tokens); message queued"}' > "$RESP_FILE"
61
+ OUT=$(bash "$RUN" --to ella-1 --message "hi" 2>/dev/null)
62
+ check "cap hold: reported as not delivered" "$OUT" '"delivered":false'
63
+ check "cap hold: keeps queued + spendCapped" "$OUT" '"spendCapped":true'
64
+ check "cap hold: names the cap and says not to resend" "$OUT" 'ella-1 has hit its daily token cap'
65
+ check "cap hold: do-not-resend" "$OUT" 'Do not resend'
66
+
67
+ echo '{"success":true,"queued":true,"message":"Message queued until agent is ready"}' > "$RESP_FILE"
68
+ OUT=$(bash "$RUN" --to dana-1 --message "hi" 2>/dev/null)
69
+ check "other queue: reported as not delivered" "$OUT" '"delivered":false'
70
+ check "other queue: generic note" "$OUT" 'your message to dana-1 is queued'
71
+
72
+ echo 'FAIL' > "$RESP_FILE"
73
+ if bash "$RUN" --to ghost --message "hi" >/dev/null 2>&1; then
74
+ echo " FAIL: an HTTP error must fail the skill"; FAIL=$((FAIL + 1))
75
+ else
76
+ echo " PASS: an HTTP error fails the skill"; PASS=$((PASS + 1))
77
+ fi
78
+
79
+ echo ""
80
+ echo "Results: $PASS passed, $FAIL failed"
81
+ [ "$FAIL" -eq 0 ]
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: To Do Add
3
- description: Add a task to one of the owner's Microsoft To Do lists — title, optional due date, note and importance (via the Microsoft grant held by Crewly Cloud).
4
- version: 1.0.0
3
+ description: Add a task to one of the owner's Microsoft To Do lists — title, optional due date, note, importance and steps (checklist items) (via the Microsoft grant held by Crewly Cloud).
4
+ version: 1.1.0
5
5
  category: productivity
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -18,6 +18,7 @@ triggers:
18
18
  - add a microsoft to do task
19
19
  - remind me in to do
20
20
  - create an outlook task
21
+ - add a task with steps
21
22
  tags:
22
23
  - microsoft
23
24
  - todo
@@ -35,8 +36,13 @@ execution:
35
36
  ```bash
36
37
  bash execute.sh --title "Buy milk" # default list ("Tasks")
37
38
  bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 is in Drive"
39
+ bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # ONE task with three steps
38
40
  ```
39
41
 
42
+ When the owner asks for items as **steps of one task** (a shopping run, a
43
+ packing list), use `--steps` — do not put them in the note, and do not make
44
+ one task per item unless he asked for separate tasks.
45
+
40
46
  | Flag | Meaning |
41
47
  |---|---|
42
48
  | `--title` | Task title (required) |
@@ -44,13 +50,21 @@ bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --import
44
50
  | `--due` | Due date `YYYY-MM-DD` |
45
51
  | `--note` | Note shown under the task |
46
52
  | `--importance` | `low` \| `normal` \| `high` |
53
+ | `--steps` | Comma-separated steps (checklist items), in order |
54
+ | `--step` | One step; repeat it for more (for a step that contains a comma) |
47
55
 
48
56
  ## Output
49
57
 
50
58
  ```json
51
59
  {"success":true,"list":"Work","task":{"id":"AAMk…","title":"Send deck to Ann","status":"notStarted","importance":"high","due":"2026-10-01","note":"v3 is in Drive"}}
60
+ {"success":true,"list":"Groceries","task":{"id":"AAMk…","title":"Costco","status":"notStarted","steps":[{"id":"…","title":"Eggs","checked":false},{"id":"…","title":"Milk","checked":false}]}}
52
61
  ```
53
62
 
63
+ Steps are created after the task. If one fails, the task still exists and
64
+ the answer lists it in `failedSteps` (`[{"step":"Milk","error":"…"}]`):
65
+ add it with todo-update `--add-steps` — do **not** run todo-add again, that
66
+ would make a second task.
67
+
54
68
  A list that does not exist is not created — make it with todo-lists
55
69
  `--create` first.
56
70
 
@@ -7,6 +7,7 @@
7
7
  # Usage:
8
8
  # bash execute.sh --title "Buy milk" # default list
9
9
  # bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
10
+ # bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # one task, three steps
10
11
  # bash execute.sh '{"list":"Groceries","title":"Eggs"}'
11
12
  # =============================================================================
12
13
  set -euo pipefail
@@ -18,7 +19,8 @@ print_usage() {
18
19
  Usage:
19
20
  bash execute.sh --title "Buy milk" # default list
20
21
  bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
21
- bash execute.sh '{"list":"Groceries","title":"Eggs"}'
22
+ bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # one task, three steps
23
+ bash execute.sh '{"list":"Groceries","title":"Costco","steps":["Eggs","Milk"]}'
22
24
 
23
25
  Options:
24
26
  --title, -t Task title (required)
@@ -26,6 +28,8 @@ Options:
26
28
  --due Due date, YYYY-MM-DD
27
29
  --note Note text shown under the task
28
30
  --importance low | normal | high
31
+ --steps Comma-separated steps (checklist items) to create on the task
32
+ --step One step; repeat for more (use when a step contains a comma)
29
33
  --help | -h Show this help
30
34
  EOF_USAGE
31
35
  }
@@ -38,6 +42,12 @@ fail_from() {
38
42
 
39
43
  uri() { jq -rn --arg v "$1" '$v|@uri'; }
40
44
 
45
+ # Append step titles to a JSON array: $1 = array, $2 = text, $3 = "split" to
46
+ # split the text on commas. Titles are trimmed; empty ones are dropped.
47
+ add_steps() {
48
+ jq -c --arg v "$2" --arg mode "${3:-}" '. + (if $mode == "split" then ($v | split(",")) else [$v] end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0)))' <<<"$1"
49
+ }
50
+
41
51
  # api_call may print a one-line warning to stderr (no CREWLY_SESSION_NAME);
42
52
  # the backend answer is always the last line. On failure print the mapped
43
53
  # failure JSON (fail_from) and return 1.
@@ -52,7 +62,7 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
52
62
  INPUT_JSON="$1"
53
63
  shift || true
54
64
  fi
55
- TITLE=""; LIST=""; DUE=""; NOTE=""; IMPORTANCE=""
65
+ TITLE=""; LIST=""; DUE=""; NOTE=""; IMPORTANCE=""; STEPS='[]'
56
66
  while [[ $# -gt 0 ]]; do
57
67
  case "$1" in
58
68
  --title|-t) [ $# -ge 2 ] || error_exit "--title requires a value"; TITLE="$2"; shift 2 ;;
@@ -60,6 +70,8 @@ while [[ $# -gt 0 ]]; do
60
70
  --due) [ $# -ge 2 ] || error_exit "--due requires a value"; DUE="$2"; shift 2 ;;
61
71
  --note) [ $# -ge 2 ] || error_exit "--note requires a value"; NOTE="$2"; shift 2 ;;
62
72
  --importance) [ $# -ge 2 ] || error_exit "--importance requires a value"; IMPORTANCE="$2"; shift 2 ;;
73
+ --steps) [ $# -ge 2 ] || error_exit "--steps requires a value"; STEPS=$(add_steps "$STEPS" "$2" split); shift 2 ;;
74
+ --step) [ $# -ge 2 ] || error_exit "--step requires a value"; STEPS=$(add_steps "$STEPS" "$2"); shift 2 ;;
63
75
  --help|-h) print_usage; exit 0 ;;
64
76
  *) error_exit "Unknown option: $1" ;;
65
77
  esac
@@ -71,14 +83,18 @@ if [ -n "$INPUT_JSON" ]; then
71
83
  [ -z "$DUE" ] && DUE=$(printf '%s' "$INPUT" | jq -r '.due // empty')
72
84
  [ -z "$NOTE" ] && NOTE=$(printf '%s' "$INPUT" | jq -r '.note // empty')
73
85
  [ -z "$IMPORTANCE" ] && IMPORTANCE=$(printf '%s' "$INPUT" | jq -r '.importance // empty')
86
+ if [ "$STEPS" = '[]' ]; then
87
+ STEPS=$(printf '%s' "$INPUT" | jq -c '.steps // [] | if type == "string" then split(",") else map(tostring) end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))')
88
+ fi
74
89
  fi
75
90
  [ -n "$TITLE" ] || error_exit "--title is required"
76
91
  if [ -n "$DUE" ] && ! [[ "$DUE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then error_exit "--due must look like 2026-10-01"; fi
77
- BODY=$(jq -cn --arg title "$TITLE" --arg list "$LIST" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" \
92
+ BODY=$(jq -cn --arg title "$TITLE" --arg list "$LIST" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" --argjson steps "$STEPS" \
78
93
  '{title: $title}
79
94
  + (if $list != "" then {list: $list} else {} end)
80
95
  + (if $due != "" then {due: $due} else {} end)
81
96
  + (if $note != "" then {note: $note} else {} end)
82
- + (if $imp != "" then {importance: $imp} else {} end)')
97
+ + (if $imp != "" then {importance: $imp} else {} end)
98
+ + (if ($steps | length) > 0 then {steps: $steps} else {} end)')
83
99
  RESPONSE=$(call POST "/microsoft-todo/tasks" "$BODY") || { printf '%s\n' "$RESPONSE"; exit 1; }
84
- printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task}'
100
+ printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task} + (if .data.failedSteps then {failedSteps: .data.failedSteps} else {} end)'
@@ -33,6 +33,8 @@ class H(BaseHTTPRequestHandler):
33
33
  out = {'list': LIST, 'count': 1, 'tasks': [{'id': 'T1', 'title': 'Milk', 'status': 'notStarted', 'due': '2026-10-01'}]}
34
34
  elif path == '/api/microsoft-todo/tasks':
35
35
  out = {'list': LIST, 'task': {'id': 'T2', 'title': (data or {}).get('title'), 'status': 'notStarted'}}
36
+ if (data or {}).get('title') == 'partial':
37
+ out['failedSteps'] = [{'step': 'Milk', 'error': 'Forbidden: no'}]
36
38
  elif method == 'PATCH':
37
39
  out = {'list': LIST, 'task': {'id': path.rsplit('/', 1)[1], 'title': 'Milk', 'status': 'completed'}}
38
40
  elif method == 'DELETE':
@@ -69,6 +71,18 @@ run '{"list":"Groceries","title":"Eggs"}' >/dev/null
69
71
  check "json input" "$(last '.body')" '{"title":"Eggs","list":"Groceries"}'
70
72
  check "title required" "$(run_err --list Work | jq -r .error)" "--title is required"
71
73
  check "bad due" "$(run_err --title x --due tomorrow | jq -r .error)" "--due must look like 2026-10-01"
74
+ run --title "Costco" --steps "Eggs, Milk,,Bread " >/dev/null
75
+ check "steps: comma list, trimmed, empties dropped" "$(last '.body')" '{"title":"Costco","steps":["Eggs","Milk","Bread"]}'
76
+ run --title "Costco" --step "Eggs, large" --step Milk >/dev/null
77
+ check "steps: repeated --step keeps commas" "$(last '.body.steps')" '["Eggs, large","Milk"]'
78
+ run '{"title":"Costco","steps":["Eggs","Milk"]}' >/dev/null
79
+ check "steps: json array" "$(last '.body.steps')" '["Eggs","Milk"]'
80
+ run '{"title":"Costco","steps":"Eggs,Milk"}' >/dev/null
81
+ check "steps: json string" "$(last '.body.steps')" '["Eggs","Milk"]'
82
+ run --title "Plain" --steps " , " >/dev/null
83
+ check "steps: none left means no steps field" "$(last '.body')" '{"title":"Plain"}'
84
+ OUT=$(run --title partial --steps "Eggs,Milk")
85
+ check "steps: failed steps are reported" "$(printf '%s' "$OUT" | jq -c '[.success,.failedSteps]')" '[true,[{"step":"Milk","error":"Forbidden: no"}]]'
72
86
  OUT=$(run --title no-grant || true)
73
87
  check "not connected" "$(printf '%s' "$OUT" | jq -r .reason)" "not_connected"
74
88
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: To Do Tasks
3
- description: List the tasks in one of the owner's Microsoft To Do lists — open tasks by default, --all to include completed ones (via the Microsoft grant held by Crewly Cloud). Read-only.
4
- version: 1.0.0
3
+ description: List the tasks in one of the owner's Microsoft To Do lists — open tasks by default, --all to include completed ones, with each task's steps (via the Microsoft grant held by Crewly Cloud). Read-only.
4
+ version: 1.1.0
5
5
  category: productivity
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -46,7 +46,8 @@ bash execute.sh --list Work --limit 20 # default 50, max 100
46
46
  ```
47
47
 
48
48
  `importance` appears only when not normal; `note` is plain text, cut at
49
- 200 characters. `hasMore: true` means the list has more tasks than the
49
+ 200 characters. `steps` (checklist items, in To Do order, each with `id`,
50
+ `title` and `checked`) appears only on tasks that have steps. `hasMore: true` means the list has more tasks than the
50
51
  limit. Use the task `id` with todo-update.
51
52
 
52
53
  ## Failures
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: To Do Update
3
- description: Complete, reopen, retitle, re-date or delete a task in one of the owner's Microsoft To Do lists (via the Microsoft grant held by Crewly Cloud).
4
- version: 1.0.0
3
+ description: Complete, reopen, retitle, re-date or delete a task — and add, tick, untick or remove its steps — in one of the owner's Microsoft To Do lists (via the Microsoft grant held by Crewly Cloud).
4
+ version: 1.1.0
5
5
  category: productivity
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -38,8 +38,18 @@ bash execute.sh --list Work --task <id> --title "Send v4 deck" --due 2026-10-03
38
38
  bash execute.sh --list Work --task <id> --due none # clear the due date
39
39
  bash execute.sh --list Work --task <id> --reopen
40
40
  bash execute.sh --list Work --task <id> --delete # cannot be undone
41
+ bash execute.sh --list Groceries --task <id> --add-steps "Butter,Ham"
42
+ bash execute.sh --list Groceries --task <id> --check-steps "Eggs,Milk" # tick steps
43
+ bash execute.sh --list Groceries --task <id> --uncheck-steps Eggs # untick
44
+ bash execute.sh --list Groceries --task <id> --remove-steps Bread # delete a step
41
45
  ```
42
46
 
47
+ Steps are named by title (case-insensitive) or by step id from todo-tasks.
48
+ `--add-step` / `--check-step` / `--uncheck-step` / `--remove-step` take one
49
+ step each and can be repeated, for a step whose title contains a comma.
50
+ Adding steps changes the existing task; it never creates a new one. A step
51
+ name that matches nothing (or two steps) fails before anything is changed.
52
+
43
53
  `--task` is the id from todo-tasks. `--list` is the list the task is in
44
54
  (name or id; the default list when omitted). Changes can be combined in one
45
55
  call; `--delete` ignores the others.
@@ -48,6 +58,7 @@ call; `--delete` ignores the others.
48
58
 
49
59
  ```json
50
60
  {"success":true,"list":"Groceries","task":{"id":"AAMk…","title":"Milk","status":"completed","completedAt":"2026-09-23"}}
61
+ {"success":true,"list":"Groceries","task":{"id":"AAMk…","title":"Costco","status":"notStarted","steps":[{"id":"…","title":"Eggs","checked":true},{"id":"…","title":"Butter","checked":false}]}}
51
62
  {"success":true,"deleted":true,"list":"Work","taskId":"AAMk…"}
52
63
  ```
53
64
 
@@ -10,6 +10,7 @@
10
10
  # bash execute.sh --list Work --task <taskId> --due none # clear the due date
11
11
  # bash execute.sh --list Work --task <taskId> --reopen
12
12
  # bash execute.sh --list Work --task <taskId> --delete
13
+ # bash execute.sh --list Groceries --task <taskId> --add-steps "Butter,Ham" --check-steps "Eggs"
13
14
  # bash execute.sh '{"list":"Work","task":"AAMk…","complete":true}'
14
15
  # =============================================================================
15
16
  set -euo pipefail
@@ -24,6 +25,7 @@ Usage:
24
25
  bash execute.sh --list Work --task <taskId> --due none # clear the due date
25
26
  bash execute.sh --list Work --task <taskId> --reopen
26
27
  bash execute.sh --list Work --task <taskId> --delete
28
+ bash execute.sh --list Groceries --task <taskId> --add-steps "Butter,Ham" --check-steps "Eggs"
27
29
  bash execute.sh '{"list":"Work","task":"AAMk…","complete":true}'
28
30
 
29
31
  Options:
@@ -36,6 +38,12 @@ Options:
36
38
  --note Replace the note
37
39
  --importance low | normal | high
38
40
  --delete Delete the task (cannot be undone)
41
+ --add-steps Comma-separated steps to append to the task
42
+ --check-steps Comma-separated steps to tick, by title (case-insensitive) or step id
43
+ --uncheck-steps Comma-separated steps to untick, by title or id
44
+ --remove-steps Comma-separated steps to delete, by title or id
45
+ --add-step, --check-step, --uncheck-step, --remove-step
46
+ One step each; repeat for more (use when a step contains a comma)
39
47
  --help | -h Show this help
40
48
  EOF_USAGE
41
49
  }
@@ -48,6 +56,17 @@ fail_from() {
48
56
 
49
57
  uri() { jq -rn --arg v "$1" '$v|@uri'; }
50
58
 
59
+ # Append step titles / ids to a JSON array: $1 = array, $2 = text, $3 =
60
+ # "split" to split the text on commas. Trimmed; empty ones are dropped.
61
+ add_steps() {
62
+ jq -c --arg v "$2" --arg mode "${3:-}" '. + (if $mode == "split" then ($v | split(",")) else [$v] end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0)))' <<<"$1"
63
+ }
64
+
65
+ # Step list from the JSON input: $1 = key; an array or a comma string.
66
+ input_steps() {
67
+ printf '%s' "$INPUT" | jq -c --arg k "$1" '.[$k] // [] | if type == "string" then split(",") else map(tostring) end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))'
68
+ }
69
+
51
70
  # api_call may print a one-line warning to stderr (no CREWLY_SESSION_NAME);
52
71
  # the backend answer is always the last line. On failure print the mapped
53
72
  # failure JSON (fail_from) and return 1.
@@ -63,6 +82,7 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
63
82
  shift || true
64
83
  fi
65
84
  TASK=""; LIST=""; COMPLETE=""; TITLE=""; DUE=""; NOTE=""; IMPORTANCE=""; DELETE=""
85
+ ADD_STEPS='[]'; CHECK_STEPS='[]'; UNCHECK_STEPS='[]'; REMOVE_STEPS='[]'
66
86
  while [[ $# -gt 0 ]]; do
67
87
  case "$1" in
68
88
  --task) [ $# -ge 2 ] || error_exit "--task requires a value"; TASK="$2"; shift 2 ;;
@@ -74,6 +94,14 @@ while [[ $# -gt 0 ]]; do
74
94
  --note) [ $# -ge 2 ] || error_exit "--note requires a value"; NOTE="$2"; shift 2 ;;
75
95
  --importance) [ $# -ge 2 ] || error_exit "--importance requires a value"; IMPORTANCE="$2"; shift 2 ;;
76
96
  --delete) DELETE="1"; shift ;;
97
+ --add-steps) [ $# -ge 2 ] || error_exit "--add-steps requires a value"; ADD_STEPS=$(add_steps "$ADD_STEPS" "$2" split); shift 2 ;;
98
+ --add-step) [ $# -ge 2 ] || error_exit "--add-step requires a value"; ADD_STEPS=$(add_steps "$ADD_STEPS" "$2"); shift 2 ;;
99
+ --check-steps) [ $# -ge 2 ] || error_exit "--check-steps requires a value"; CHECK_STEPS=$(add_steps "$CHECK_STEPS" "$2" split); shift 2 ;;
100
+ --check-step) [ $# -ge 2 ] || error_exit "--check-step requires a value"; CHECK_STEPS=$(add_steps "$CHECK_STEPS" "$2"); shift 2 ;;
101
+ --uncheck-steps) [ $# -ge 2 ] || error_exit "--uncheck-steps requires a value"; UNCHECK_STEPS=$(add_steps "$UNCHECK_STEPS" "$2" split); shift 2 ;;
102
+ --uncheck-step) [ $# -ge 2 ] || error_exit "--uncheck-step requires a value"; UNCHECK_STEPS=$(add_steps "$UNCHECK_STEPS" "$2"); shift 2 ;;
103
+ --remove-steps) [ $# -ge 2 ] || error_exit "--remove-steps requires a value"; REMOVE_STEPS=$(add_steps "$REMOVE_STEPS" "$2" split); shift 2 ;;
104
+ --remove-step) [ $# -ge 2 ] || error_exit "--remove-step requires a value"; REMOVE_STEPS=$(add_steps "$REMOVE_STEPS" "$2"); shift 2 ;;
77
105
  --help|-h) print_usage; exit 0 ;;
78
106
  *) error_exit "Unknown option: $1" ;;
79
107
  esac
@@ -88,6 +116,10 @@ if [ -n "$INPUT_JSON" ]; then
88
116
  [ -z "$NOTE" ] && NOTE=$(printf '%s' "$INPUT" | jq -r '.note // empty')
89
117
  [ -z "$IMPORTANCE" ] && IMPORTANCE=$(printf '%s' "$INPUT" | jq -r '.importance // empty')
90
118
  [ -z "$DELETE" ] && DELETE=$(printf '%s' "$INPUT" | jq -r 'if .delete == true then "1" else empty end')
119
+ [ "$ADD_STEPS" = '[]' ] && ADD_STEPS=$(input_steps addSteps)
120
+ [ "$CHECK_STEPS" = '[]' ] && CHECK_STEPS=$(input_steps checkSteps)
121
+ [ "$UNCHECK_STEPS" = '[]' ] && UNCHECK_STEPS=$(input_steps uncheckSteps)
122
+ [ "$REMOVE_STEPS" = '[]' ] && REMOVE_STEPS=$(input_steps removeSteps)
91
123
  fi
92
124
  [ -n "$TASK" ] || error_exit "--task is required (ids come from todo-tasks)"
93
125
  if [ -n "$DELETE" ]; then
@@ -100,16 +132,22 @@ fi
100
132
  if [ -n "$DUE" ] && [ "$DUE" != "none" ] && ! [[ "$DUE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
101
133
  error_exit "--due must look like 2026-10-01, or none to clear it"
102
134
  fi
103
- if [ -z "$COMPLETE" ] && [ -z "$TITLE" ] && [ -z "$DUE" ] && [ -z "$NOTE" ] && [ -z "$IMPORTANCE" ]; then
104
- error_exit "nothing to change: give --complete, --reopen, --title, --due, --note, --importance or --delete"
135
+ STEP_CHANGES="${ADD_STEPS}${CHECK_STEPS}${UNCHECK_STEPS}${REMOVE_STEPS}"
136
+ if [ -z "$COMPLETE" ] && [ -z "$TITLE" ] && [ -z "$DUE" ] && [ -z "$NOTE" ] && [ -z "$IMPORTANCE" ] && [ "$STEP_CHANGES" = '[][][][]' ]; then
137
+ error_exit "nothing to change: give --complete, --reopen, --title, --due, --note, --importance, a step change or --delete"
105
138
  fi
106
139
  BODY=$(jq -cn --arg list "$LIST" --arg complete "$COMPLETE" --arg title "$TITLE" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" \
140
+ --argjson add "$ADD_STEPS" --argjson check "$CHECK_STEPS" --argjson uncheck "$UNCHECK_STEPS" --argjson remove "$REMOVE_STEPS" \
107
141
  '{}
108
142
  + (if $list != "" then {list: $list} else {} end)
109
143
  + (if $complete != "" then {complete: ($complete == "true")} else {} end)
110
144
  + (if $title != "" then {title: $title} else {} end)
111
145
  + (if $due == "none" then {due: null} elif $due != "" then {due: $due} else {} end)
112
146
  + (if $note != "" then {note: $note} else {} end)
113
- + (if $imp != "" then {importance: $imp} else {} end)')
147
+ + (if $imp != "" then {importance: $imp} else {} end)
148
+ + (if ($add | length) > 0 then {addSteps: $add} else {} end)
149
+ + (if ($check | length) > 0 then {checkSteps: $check} else {} end)
150
+ + (if ($uncheck | length) > 0 then {uncheckSteps: $uncheck} else {} end)
151
+ + (if ($remove | length) > 0 then {removeSteps: $remove} else {} end)')
114
152
  RESPONSE=$(call PATCH "/microsoft-todo/tasks/$(uri "$TASK")" "$BODY") || { printf '%s\n' "$RESPONSE"; exit 1; }
115
153
  printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task}'
@@ -75,6 +75,13 @@ check "json input" "$(last '[.path,.body]')" '["/api/microsoft-todo/tasks/T7",{"
75
75
  check "task required" "$(run_err --complete | jq -r .error)" "--task is required (ids come from todo-tasks)"
76
76
  check "nothing to change" "$(run_err --task T1 | jq -r .error | cut -c1-17)" "nothing to change"
77
77
  check "bad due" "$(run_err --task T1 --due 1/10 | jq -r .error)" "--due must look like 2026-10-01, or none to clear it"
78
+ run --list Groceries --task T1 --add-steps "Butter, Ham" --check-steps Eggs --uncheck-step "Milk, oat" --remove-steps Bread >/dev/null
79
+ check "steps: body" "$(last '[.method,.path,.body]')" '["PATCH","/api/microsoft-todo/tasks/T1",{"list":"Groceries","addSteps":["Butter","Ham"],"checkSteps":["Eggs"],"uncheckSteps":["Milk, oat"],"removeSteps":["Bread"]}]'
80
+ run --task T1 --add-step Butter >/dev/null
81
+ check "steps: a step change alone is a change" "$(last '.body')" '{"addSteps":["Butter"]}'
82
+ run '{"task":"T1","checkSteps":["Eggs"],"removeSteps":"Bread,Ham"}' >/dev/null
83
+ check "steps: json input" "$(last '.body')" '{"checkSteps":["Eggs"],"removeSteps":["Bread","Ham"]}'
84
+ check "steps: blank is still nothing to change" "$(run_err --task T1 --add-steps ' , ' | jq -r .error | cut -c1-17)" "nothing to change"
78
85
  OUT=$(run --list no-grant --task T1 --complete || true)
79
86
  check "not connected" "$(printf '%s' "$OUT" | jq -r .reason)" "not_connected"
80
87