crewly 1.20.122 → 1.20.124

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 (225) hide show
  1. package/config/skills/agent/core/whatsapp-draft/SKILL.md +80 -0
  2. package/config/skills/agent/core/whatsapp-draft/execute.sh +84 -0
  3. package/config/skills/agent/core/whatsapp-draft/execute.test.sh +70 -0
  4. package/config/skills/agent/core/whatsapp-inbox/SKILL.md +75 -0
  5. package/config/skills/agent/core/whatsapp-inbox/execute.sh +87 -0
  6. package/config/skills/agent/core/whatsapp-inbox/execute.test.sh +68 -0
  7. package/config/skills/agent/core/whatsapp-read/SKILL.md +80 -0
  8. package/config/skills/agent/core/whatsapp-read/execute.sh +116 -0
  9. package/config/skills/agent/core/whatsapp-read/execute.test.sh +84 -0
  10. package/config/skills/agent/core/whatsapp-send/SKILL.md +70 -0
  11. package/config/skills/agent/core/whatsapp-send/execute.sh +84 -0
  12. package/config/skills/agent/core/whatsapp-send/execute.test.sh +79 -0
  13. package/dist/backend/backend/src/constants.d.ts +225 -0
  14. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  15. package/dist/backend/backend/src/constants.js +223 -0
  16. package/dist/backend/backend/src/constants.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts +54 -0
  18. package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -0
  19. package/dist/backend/backend/src/controllers/harness/harness.controller.js +204 -0
  20. package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -0
  21. package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts +27 -0
  22. package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts.map +1 -0
  23. package/dist/backend/backend/src/controllers/harness/harness.routes.js +43 -0
  24. package/dist/backend/backend/src/controllers/harness/harness.routes.js.map +1 -0
  25. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +73 -0
  26. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -0
  27. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +310 -0
  28. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -0
  29. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +53 -4
  31. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
  32. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  33. package/dist/backend/backend/src/routes/api.routes.js +4 -0
  34. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  35. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +5 -0
  36. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  37. package/dist/backend/backend/src/services/agent/agent-registration.service.js +7 -0
  38. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  39. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
  41. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  42. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
  43. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +4 -3
  45. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +43 -1
  48. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  49. package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts +67 -0
  50. package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
  51. package/dist/backend/backend/src/services/harness/claude-config.utils.js +118 -0
  52. package/dist/backend/backend/src/services/harness/claude-config.utils.js.map +1 -0
  53. package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
  54. package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
  55. package/dist/backend/backend/src/services/harness/harness-api-key.service.js +157 -0
  56. package/dist/backend/backend/src/services/harness/harness-api-key.service.js.map +1 -0
  57. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
  58. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
  59. package/dist/backend/backend/src/services/harness/harness-credentials.store.js +208 -0
  60. package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -0
  61. package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
  62. package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
  63. package/dist/backend/backend/src/services/harness/harness-exec.utils.js +183 -0
  64. package/dist/backend/backend/src/services/harness/harness-exec.utils.js.map +1 -0
  65. package/dist/backend/backend/src/services/harness/harness-install.service.d.ts +106 -0
  66. package/dist/backend/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
  67. package/dist/backend/backend/src/services/harness/harness-install.service.js +205 -0
  68. package/dist/backend/backend/src/services/harness/harness-install.service.js.map +1 -0
  69. package/dist/backend/backend/src/services/harness/harness-registry.d.ts +86 -0
  70. package/dist/backend/backend/src/services/harness/harness-registry.d.ts.map +1 -0
  71. package/dist/backend/backend/src/services/harness/harness-registry.js +121 -0
  72. package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -0
  73. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +173 -0
  74. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
  75. package/dist/backend/backend/src/services/harness/harness-status.service.js +324 -0
  76. package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -0
  77. package/dist/backend/backend/src/services/harness/harness.service.d.ts +146 -0
  78. package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -0
  79. package/dist/backend/backend/src/services/harness/harness.service.js +193 -0
  80. package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -0
  81. package/dist/backend/backend/src/services/harness/harness.types.d.ts +138 -0
  82. package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -0
  83. package/dist/backend/backend/src/services/harness/harness.types.js +51 -0
  84. package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -0
  85. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +238 -0
  86. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
  87. package/dist/backend/backend/src/services/harness/login-broker.service.js +495 -0
  88. package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -0
  89. package/dist/backend/backend/src/services/harness/login-rules.d.ts +162 -0
  90. package/dist/backend/backend/src/services/harness/login-rules.d.ts.map +1 -0
  91. package/dist/backend/backend/src/services/harness/login-rules.js +344 -0
  92. package/dist/backend/backend/src/services/harness/login-rules.js.map +1 -0
  93. package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts +59 -0
  94. package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
  95. package/dist/backend/backend/src/services/harness/orc-harness.store.js +108 -0
  96. package/dist/backend/backend/src/services/harness/orc-harness.store.js.map +1 -0
  97. package/dist/backend/backend/src/services/whatsapp/index.d.ts +5 -1
  98. package/dist/backend/backend/src/services/whatsapp/index.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/whatsapp/index.js +5 -1
  100. package/dist/backend/backend/src/services/whatsapp/index.js.map +1 -1
  101. package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.d.ts +59 -0
  102. package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.d.ts.map +1 -0
  103. package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.js +108 -0
  104. package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.js.map +1 -0
  105. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +74 -0
  106. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -0
  107. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +82 -0
  108. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -0
  109. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.d.ts +184 -0
  110. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.d.ts.map +1 -0
  111. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.js +420 -0
  112. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.js.map +1 -0
  113. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.d.ts +243 -0
  114. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.d.ts.map +1 -0
  115. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.js +538 -0
  116. package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.js.map +1 -0
  117. package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.d.ts +32 -2
  118. package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.js +65 -9
  120. package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.js.map +1 -1
  121. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
  122. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +11 -0
  123. package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
  124. package/dist/backend/backend/src/services/whatsapp/whatsapp.service.d.ts +59 -1
  125. package/dist/backend/backend/src/services/whatsapp/whatsapp.service.d.ts.map +1 -1
  126. package/dist/backend/backend/src/services/whatsapp/whatsapp.service.js +159 -9
  127. package/dist/backend/backend/src/services/whatsapp/whatsapp.service.js.map +1 -1
  128. package/dist/backend/backend/src/types/whatsapp.types.d.ts +108 -0
  129. package/dist/backend/backend/src/types/whatsapp.types.d.ts.map +1 -1
  130. package/dist/backend/backend/src/types/whatsapp.types.js +9 -0
  131. package/dist/backend/backend/src/types/whatsapp.types.js.map +1 -1
  132. package/dist/backend/build-info.json +2 -2
  133. package/dist/cli/backend/src/constants.d.ts +225 -0
  134. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  135. package/dist/cli/backend/src/constants.js +223 -0
  136. package/dist/cli/backend/src/constants.js.map +1 -1
  137. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +5 -0
  138. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  139. package/dist/cli/backend/src/services/agent/agent-registration.service.js +7 -0
  140. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  141. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  142. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
  143. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  144. package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
  145. package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
  146. package/dist/cli/backend/src/services/cloud/cloud-client.service.js +4 -3
  147. package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -1
  148. package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts +67 -0
  149. package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
  150. package/dist/cli/backend/src/services/harness/claude-config.utils.js +118 -0
  151. package/dist/cli/backend/src/services/harness/claude-config.utils.js.map +1 -0
  152. package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
  153. package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
  154. package/dist/cli/backend/src/services/harness/harness-api-key.service.js +157 -0
  155. package/dist/cli/backend/src/services/harness/harness-api-key.service.js.map +1 -0
  156. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
  157. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
  158. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +208 -0
  159. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -0
  160. package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
  161. package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
  162. package/dist/cli/backend/src/services/harness/harness-exec.utils.js +183 -0
  163. package/dist/cli/backend/src/services/harness/harness-exec.utils.js.map +1 -0
  164. package/dist/cli/backend/src/services/harness/harness-install.service.d.ts +106 -0
  165. package/dist/cli/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
  166. package/dist/cli/backend/src/services/harness/harness-install.service.js +205 -0
  167. package/dist/cli/backend/src/services/harness/harness-install.service.js.map +1 -0
  168. package/dist/cli/backend/src/services/harness/harness-registry.d.ts +86 -0
  169. package/dist/cli/backend/src/services/harness/harness-registry.d.ts.map +1 -0
  170. package/dist/cli/backend/src/services/harness/harness-registry.js +121 -0
  171. package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -0
  172. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +173 -0
  173. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
  174. package/dist/cli/backend/src/services/harness/harness-status.service.js +324 -0
  175. package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -0
  176. package/dist/cli/backend/src/services/harness/harness.service.d.ts +146 -0
  177. package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -0
  178. package/dist/cli/backend/src/services/harness/harness.service.js +193 -0
  179. package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -0
  180. package/dist/cli/backend/src/services/harness/harness.types.d.ts +138 -0
  181. package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -0
  182. package/dist/cli/backend/src/services/harness/harness.types.js +51 -0
  183. package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -0
  184. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +238 -0
  185. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
  186. package/dist/cli/backend/src/services/harness/login-broker.service.js +495 -0
  187. package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -0
  188. package/dist/cli/backend/src/services/harness/login-rules.d.ts +162 -0
  189. package/dist/cli/backend/src/services/harness/login-rules.d.ts.map +1 -0
  190. package/dist/cli/backend/src/services/harness/login-rules.js +344 -0
  191. package/dist/cli/backend/src/services/harness/login-rules.js.map +1 -0
  192. package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts +59 -0
  193. package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
  194. package/dist/cli/backend/src/services/harness/orc-harness.store.js +108 -0
  195. package/dist/cli/backend/src/services/harness/orc-harness.store.js.map +1 -0
  196. package/dist/cli/cli/src/commands/harness-setup.d.ts +159 -0
  197. package/dist/cli/cli/src/commands/harness-setup.d.ts.map +1 -0
  198. package/dist/cli/cli/src/commands/harness-setup.js +377 -0
  199. package/dist/cli/cli/src/commands/harness-setup.js.map +1 -0
  200. package/dist/cli/cli/src/commands/harness.d.ts +56 -0
  201. package/dist/cli/cli/src/commands/harness.d.ts.map +1 -0
  202. package/dist/cli/cli/src/commands/harness.js +97 -0
  203. package/dist/cli/cli/src/commands/harness.js.map +1 -0
  204. package/dist/cli/cli/src/commands/onboard.d.ts +108 -50
  205. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  206. package/dist/cli/cli/src/commands/onboard.js +200 -191
  207. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  208. package/dist/cli/cli/src/constants.d.ts +18 -0
  209. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  210. package/dist/cli/cli/src/constants.js +18 -0
  211. package/dist/cli/cli/src/constants.js.map +1 -1
  212. package/dist/cli/cli/src/index.js +22 -3
  213. package/dist/cli/cli/src/index.js.map +1 -1
  214. package/dist/cli/cli/src/utils/harness-engine.d.ts +99 -0
  215. package/dist/cli/cli/src/utils/harness-engine.d.ts.map +1 -0
  216. package/dist/cli/cli/src/utils/harness-engine.js +143 -0
  217. package/dist/cli/cli/src/utils/harness-engine.js.map +1 -0
  218. package/dist/cli/cli/src/utils/prompt-io.d.ts +25 -0
  219. package/dist/cli/cli/src/utils/prompt-io.d.ts.map +1 -0
  220. package/dist/cli/cli/src/utils/prompt-io.js +47 -0
  221. package/dist/cli/cli/src/utils/prompt-io.js.map +1 -0
  222. package/frontend/dist/assets/{index-8327e63e.css → index-0a2f783c.css} +1 -1
  223. package/frontend/dist/assets/{index-07e338a9.js → index-aaf65055.js} +309 -309
  224. package/frontend/dist/index.html +2 -2
  225. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-rules.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/login-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnE,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAChC,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,uEAAuE;IACvE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mDAAmD;IACnD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAcD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAM5C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CA4BrE;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,MAAM,EAAE,CA+BV;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,UAAQ,GAAG,MAAM,EAAE,CAEtF;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChE,cAAc,CAwChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAmBxF;AAED,6DAA6D;AAC7D,eAAO,MAAM,wBAAwB,EAAE,YAetC,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,uBAAuB,EAAE,YAiBrC,CAAC;AAKF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEzF"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Login rules — per-harness patterns the login broker applies to terminal text.
3
+ *
4
+ * The broker runs a harness's own login command in a PTY and learns what is
5
+ * happening purely from the screen: the sign-in URL, a one-time code, a
6
+ * "paste the code" prompt, success and failure. Nothing here talks to a
7
+ * harness API.
8
+ *
9
+ * Terminal text is messy, so it is normalized first:
10
+ * - ANSI/OSC escapes are removed; OSC 8 hyperlink targets are kept as URL
11
+ * candidates; cursor-forward (`CSI n C`) and cursor-to-column (`CSI n G`)
12
+ * become spaces, which restores the gaps TUIs draw between words.
13
+ * - TUIs such as Claude Code's may render words without spaces, so prompt,
14
+ * success and failure patterns are matched against both the normalized text
15
+ * and a copy with all spaces removed (patterns use `\s*` between words).
16
+ * - A URL (or token) that a TUI wrapped at the terminal width continues on
17
+ * the next line(s); {@link extractWrappedRuns} joins those back.
18
+ *
19
+ * Values are only accepted once they are complete — followed by more output —
20
+ * so a URL that arrives split across two PTY chunks is never exposed half-way.
21
+ *
22
+ * Rule sets are built from real output captured on 2026-09-25 (Claude Code
23
+ * 2.1.282 `claude setup-token`, codex-cli 0.156.1 `codex login --device-auth`);
24
+ * see login-rules.test.ts.
25
+ *
26
+ * @module services/harness/login-rules
27
+ */
28
+ /* eslint-disable no-control-regex -- terminal escape sequences (ESC, BEL, …) are control characters by definition */
29
+ import { HARNESS_CONSTANTS } from '../../constants.js';
30
+ /** Characters a URL may contain (RFC 3986 unreserved + reserved + `%`). */
31
+ const URL_CHAR_CLASS = "A-Za-z0-9\\-._~:/?#\\[\\]@!$&'()*+,;=%";
32
+ /** A line made only of URL characters (a wrapped URL continuation). */
33
+ const URL_CONTINUATION = new RegExp(`^[${URL_CHAR_CLASS}]+$`);
34
+ /** A run of URL characters starting with http(s)://. */
35
+ const URL_RUN = new RegExp(`https?://[${URL_CHAR_CLASS}]+`, 'g');
36
+ /** Characters of a token-like secret. */
37
+ const TOKEN_CONTINUATION = /^[A-Za-z0-9_-]+$/;
38
+ /**
39
+ * Patterns that look like credentials. Screen text exposed to front ends has
40
+ * every match replaced with {@link HARNESS_CONSTANTS.LOGIN.REDACTED}.
41
+ */
42
+ export const SECRET_PATTERNS = [
43
+ /sk-ant-[A-Za-z0-9_-]{8,}/g,
44
+ /sk-(?:proj-|svcacct-)?[A-Za-z0-9_-]{20,}/g,
45
+ /eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,
46
+ /\b(?:ghp|gho|ghs|ghu|github_pat|xox[abpr])[-_][A-Za-z0-9_-]{16,}/g,
47
+ /AIza[0-9A-Za-z_-]{30,}/g,
48
+ ];
49
+ /**
50
+ * Normalize raw PTY output for rule matching.
51
+ *
52
+ * @param raw - Raw bytes from the PTY, as a string
53
+ * @returns Normalized text, a spaceless copy and OSC 8 hyperlink targets
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * normalizeTerminalOutput('\x1b[1mPaste\x1b[1Ccode\x1b[0m\r\n').text; // 'Paste code\n'
58
+ * ```
59
+ */
60
+ export function normalizeTerminalOutput(raw) {
61
+ const hyperlinks = [];
62
+ let text = raw.replace(/\x1b\]8;[^;\x07\x1b]*;([^\x07\x1b]*)(?:\x07|\x1b\\)/g, (_match, uri) => {
63
+ if (uri && !hyperlinks.includes(uri))
64
+ hyperlinks.push(uri);
65
+ return '';
66
+ });
67
+ text = text
68
+ // Other OSC sequences (window title, etc.)
69
+ .replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, '')
70
+ // `\r\r\n` (TUIs) and `\r\n` are one line break; a lone `\r` redraws a line
71
+ .replace(/\r+\n/g, '\n')
72
+ .replace(/\r/g, '\n')
73
+ // Cursor forward: TUIs use it instead of printing spaces
74
+ .replace(/\x1b\[(\d*)C/g, (_match, n) => ' '.repeat(Math.max(1, Number(n) || 1)))
75
+ // Remaining CSI sequences, except cursor-to-column (resolved below)
76
+ .replace(/\x1b\[[0-?]*[ -/]*([@-~])/g, (match, final) => (final === 'G' ? match : ''));
77
+ text = resolveColumnMoves(text)
78
+ // Charset selection and other two-character escapes
79
+ .replace(/\x1b[()][0-9A-Za-z]/g, '')
80
+ .replace(/\x1b[@-Z\\-_]/g, '')
81
+ // Other control characters except newline and tab
82
+ .replace(/[\x00-\x08\x0b-\x1f\x7f]/g, '')
83
+ .split('\n')
84
+ .map((line) => line.replace(/[ \t]+$/, ''))
85
+ .join('\n')
86
+ // Runs of blank lines (TUI frames) collapse to one
87
+ .replace(/\n{3,}/g, '\n\n');
88
+ return { text, spaceless: text.replace(/[ \t]+/g, ''), hyperlinks };
89
+ }
90
+ /**
91
+ * Turn cursor-to-column moves (`CSI n G`) into spaces.
92
+ *
93
+ * TUIs such as Claude Code's place each word with `CSI n G` instead of
94
+ * printing the space before it (captured 2026-09-25:
95
+ * `\x1b[2GPaste\x1b[8Gcode\x1b[13Ghere…`). Moving right pads the line with
96
+ * spaces up to column n; moving left (an overwrite) becomes a single space.
97
+ *
98
+ * @param text - Text whose only remaining CSI sequences are `CSI n G`
99
+ * @returns Text with the moves replaced
100
+ */
101
+ function resolveColumnMoves(text) {
102
+ let out = '';
103
+ let column = 0;
104
+ let last = 0;
105
+ const pattern = /\x1b\[(\d*)G/g;
106
+ const advance = (chunk) => {
107
+ out += chunk;
108
+ const newline = chunk.lastIndexOf('\n');
109
+ column = newline === -1 ? column + chunk.length : chunk.length - newline - 1;
110
+ };
111
+ let match;
112
+ while ((match = pattern.exec(text)) !== null) {
113
+ advance(text.slice(last, match.index));
114
+ const target = Math.max(1, Number(match[1]) || 1) - 1;
115
+ if (target > column)
116
+ advance(' '.repeat(target - column));
117
+ else if (target < column && target > 0)
118
+ advance(' ');
119
+ last = match.index + match[0].length;
120
+ }
121
+ advance(text.slice(last));
122
+ return out;
123
+ }
124
+ /**
125
+ * Find runs (URLs, tokens) and join the ones a TUI wrapped across lines.
126
+ *
127
+ * A run that reaches the end of a line at least `minWrappedLineLength` long
128
+ * continues on the next line when that line consists only of continuation
129
+ * characters. Joining stops at the first line that is shorter than the
130
+ * minimum (the last piece of a wrapped run) or that is not a continuation.
131
+ *
132
+ * A run is only returned when it is complete: it ends before the end of its
133
+ * line, or a non-empty line follows it. A run still being written at the end
134
+ * of the buffer (possibly continued by the next PTY chunk) is skipped — unless
135
+ * `final` is set because the process has exited.
136
+ *
137
+ * @param text - Normalized text
138
+ * @param runPattern - Pattern matching a run on one line (the `g` flag is added)
139
+ * @param continuation - Pattern a whole continuation line must match
140
+ * @param options - `minWrappedLineLength` (Infinity disables joining), `final` (no more output will come)
141
+ * @returns Complete runs, in order of appearance
142
+ *
143
+ * @example
144
+ * ```ts
145
+ * extractWrappedRuns('https://x.io/' + 'a'.repeat(40) + '\nbcd\nnext line\n', /https:\/\/\S+/, /^[a-z]+$/);
146
+ * // ['https://x.io/aaaa…abcd']
147
+ * ```
148
+ */
149
+ export function extractWrappedRuns(text, runPattern, continuation, options = {}) {
150
+ const minWrappedLineLength = options.minWrappedLineLength ?? HARNESS_CONSTANTS.LOGIN.WRAPPED_LINE_MIN_LENGTH;
151
+ const lines = text.split('\n');
152
+ const runs = [];
153
+ for (let i = 0; i < lines.length; i++) {
154
+ const line = lines[i];
155
+ const pattern = new RegExp(runPattern.source, runPattern.flags.includes('g') ? runPattern.flags : `${runPattern.flags}g`);
156
+ let match;
157
+ while ((match = pattern.exec(line)) !== null) {
158
+ let run = match[0];
159
+ const reachesEnd = match.index + run.length === line.length;
160
+ let lastLine = i;
161
+ if (reachesEnd && line.length >= minWrappedLineLength) {
162
+ let previousLength = line.length;
163
+ let j = i + 1;
164
+ while (j < lines.length && previousLength >= minWrappedLineLength && lines[j].length > 0 && continuation.test(lines[j])) {
165
+ run += lines[j];
166
+ previousLength = lines[j].length;
167
+ lastLine = j;
168
+ j++;
169
+ }
170
+ }
171
+ // Complete when the run ends inside its line, or when output
172
+ // continues on a later non-empty line.
173
+ const complete = options.final === true || !reachesEnd || lines.slice(lastLine + 1).some((later) => later.length > 0);
174
+ if (complete)
175
+ runs.push(run);
176
+ if (match[0].length === 0)
177
+ pattern.lastIndex++;
178
+ }
179
+ }
180
+ return runs;
181
+ }
182
+ /**
183
+ * All complete URLs on the screen (wrapped ones joined), plus hyperlink targets.
184
+ *
185
+ * @param screen - Normalized screen
186
+ * @param final - The process has exited: accept runs at the end of the buffer
187
+ * @returns URL candidates
188
+ */
189
+ export function extractUrlCandidates(screen, final = false) {
190
+ return [...extractWrappedRuns(screen.text, URL_RUN, URL_CONTINUATION, { final }), ...screen.hyperlinks];
191
+ }
192
+ /**
193
+ * Line of `text` that contains character offset `index`.
194
+ *
195
+ * @param text - Text
196
+ * @param index - Offset
197
+ * @returns The trimmed line
198
+ */
199
+ function lineAt(text, index) {
200
+ const start = text.lastIndexOf('\n', index - 1) + 1;
201
+ const endIdx = text.indexOf('\n', index);
202
+ return text.slice(start, endIdx === -1 ? text.length : endIdx).trim();
203
+ }
204
+ /**
205
+ * First match of a pattern in the text or its spaceless copy.
206
+ *
207
+ * @param pattern - Pattern (flags other than `g` are kept)
208
+ * @param screen - Normalized screen
209
+ * @returns The line that matched, or null
210
+ */
211
+ function matchLine(pattern, screen) {
212
+ const nonGlobal = new RegExp(pattern.source, pattern.flags.replace('g', ''));
213
+ for (const text of [screen.text, screen.spaceless]) {
214
+ const found = nonGlobal.exec(text);
215
+ if (found)
216
+ return lineAt(text, found.index);
217
+ }
218
+ return null;
219
+ }
220
+ /**
221
+ * Apply a rule set to the screen.
222
+ *
223
+ * @param rules - Rule set for the harness login method
224
+ * @param screen - Whole session screen, normalized
225
+ * @param options - `promptScreen`: screen since the user's last input (input prompt and failures are read
226
+ * from it; defaults to `screen`); `final`: the process has exited
227
+ * @returns What was found
228
+ */
229
+ export function evaluateLoginRules(rules, screen, options = {}) {
230
+ const promptScreen = options.promptScreen ?? screen;
231
+ const final = options.final === true;
232
+ const urls = extractUrlCandidates(screen, final).filter((candidate) => rules.urlPattern.test(candidate));
233
+ // Redraws repeat the URL; the longest candidate is the most complete one.
234
+ const url = urls.reduce((best, candidate) => (best === null || candidate.length > best.length ? candidate : best), null);
235
+ let userCode = null;
236
+ if (rules.userCodePattern) {
237
+ const found = new RegExp(rules.userCodePattern.source, rules.userCodePattern.flags.replace('g', '')).exec(screen.text);
238
+ userCode = found?.[1] ?? null;
239
+ }
240
+ let secret = null;
241
+ if (rules.secretPattern) {
242
+ // Tokens are far shorter than the broker's PTY width, so they are never
243
+ // wrapped; joining is disabled to avoid gluing a following word on.
244
+ const tokenRuns = extractWrappedRuns(screen.text, rules.secretPattern, TOKEN_CONTINUATION, {
245
+ minWrappedLineLength: Number.POSITIVE_INFINITY,
246
+ final,
247
+ });
248
+ secret = tokenRuns.length > 0 ? tokenRuns[tokenRuns.length - 1] : null;
249
+ }
250
+ const needsInput = rules.inputPromptPattern ? matchLine(rules.inputPromptPattern, promptScreen) !== null : false;
251
+ const successText = rules.successPattern ? matchLine(rules.successPattern, screen) !== null : false;
252
+ const succeeded = rules.successRequiresSecret ? secret !== null : successText || secret !== null;
253
+ // Failures are read from the output since the user's last input, so a
254
+ // rejected code that the user then corrects does not fail the session.
255
+ let failureMessage = null;
256
+ for (const pattern of rules.failurePatterns) {
257
+ const line = matchLine(pattern, promptScreen);
258
+ if (line) {
259
+ failureMessage = line;
260
+ break;
261
+ }
262
+ }
263
+ return { url, userCode, needsInput, succeeded, failureMessage, secret };
264
+ }
265
+ /**
266
+ * Replace anything that looks like a credential with a placeholder.
267
+ *
268
+ * Besides {@link SECRET_PATTERNS}, every known secret is removed — including
269
+ * the pieces of one a TUI wrapped over several lines.
270
+ *
271
+ * @param text - Text to redact
272
+ * @param knownSecrets - Secrets captured in this session
273
+ * @returns Redacted text
274
+ */
275
+ export function redactSecrets(text, knownSecrets = []) {
276
+ const { REDACTED, REDACT_MIN_FRAGMENT } = HARNESS_CONSTANTS.LOGIN;
277
+ let result = text;
278
+ for (const secret of knownSecrets) {
279
+ if (!secret)
280
+ continue;
281
+ result = result.split(secret).join(REDACTED);
282
+ // Wrapped pieces of the secret, one per line
283
+ result = result
284
+ .split('\n')
285
+ .map((line) => {
286
+ const trimmed = line.trim();
287
+ return trimmed.length >= REDACT_MIN_FRAGMENT && secret.includes(trimmed) ? line.replace(trimmed, REDACTED) : line;
288
+ })
289
+ .join('\n');
290
+ }
291
+ for (const pattern of SECRET_PATTERNS) {
292
+ result = result.replace(pattern, REDACTED);
293
+ }
294
+ return result;
295
+ }
296
+ /** Claude Code `claude setup-token` (subscription login). */
297
+ export const CLAUDE_SETUP_TOKEN_RULES = {
298
+ harnessId: HARNESS_CONSTANTS.IDS.CLAUDE_CODE,
299
+ method: 'subscription',
300
+ urlPattern: /^https:\/\/(?:[a-z0-9-]+\.)*(?:claude\.com|claude\.ai|anthropic\.com)\/\S*oauth\/authorize\?\S+/,
301
+ inputPromptPattern: /paste\s*code\s*here\s*if\s*prompted/i,
302
+ failurePatterns: [
303
+ /invalid\s*code\.?\s*please\s*make\s*sure/i,
304
+ /OAuth\s*error/i,
305
+ /login\s*failed/i,
306
+ /authentication\s*failed/i,
307
+ ],
308
+ secretPattern: /sk-ant-oat01-[A-Za-z0-9_-]{20,}/g,
309
+ successRequiresSecret: true,
310
+ successOnExitZero: false,
311
+ verifyAfterSuccess: false,
312
+ };
313
+ /** Codex `codex login --device-auth` (ChatGPT device-code login). */
314
+ export const CODEX_DEVICE_AUTH_RULES = {
315
+ harnessId: HARNESS_CONSTANTS.IDS.CODEX_CLI,
316
+ method: 'device',
317
+ urlPattern: /^https:\/\/auth\.openai\.com\/codex\/device\S*$/,
318
+ // The code follows "Enter this one-time code ..." on the next line; the
319
+ // lookahead makes sure it is complete (followed by whitespace).
320
+ userCodePattern: /one-time\s*code[^\n]*\n\s*([A-Z0-9]{4,}-[A-Z0-9]{4,})(?=\s)/i,
321
+ successPattern: /successfully\s*logged\s*in/i,
322
+ failurePatterns: [
323
+ /login\s*(?:failed|error)/i,
324
+ /device\s*code\s*(?:has\s*)?expired/i,
325
+ /authorization\s*(?:was\s*)?(?:denied|declined)/i,
326
+ /^\s*error:/im,
327
+ ],
328
+ successRequiresSecret: false,
329
+ successOnExitZero: true,
330
+ verifyAfterSuccess: true,
331
+ };
332
+ /** Every rule set, by harness and method. */
333
+ const RULE_SETS = [CLAUDE_SETUP_TOKEN_RULES, CODEX_DEVICE_AUTH_RULES];
334
+ /**
335
+ * The rule set for a harness login method.
336
+ *
337
+ * @param harnessId - Harness id
338
+ * @param method - Login method id
339
+ * @returns The rule set, or undefined when the method is not brokered
340
+ */
341
+ export function getLoginRules(harnessId, method) {
342
+ return RULE_SETS.find((rules) => rules.harnessId === harnessId && rules.method === method);
343
+ }
344
+ //# sourceMappingURL=login-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-rules.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/login-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Which harness the orchestrator runs on.
3
+ *
4
+ * The orchestrator's runtime is `runtimeType` in
5
+ * `<crewlyHome>/teams/orchestrator/config.json` — the same field
6
+ * `PUT /api/orchestrator/runtime` and StorageService.updateOrchestratorRuntimeType
7
+ * write, and the one the orchestrator is launched with (a `DEFAULT_RUNTIME`
8
+ * env var still overrides it at boot). Setting the orc harness also sets
9
+ * `settings.general.defaultRuntime`, so new team members default to the one
10
+ * harness first-time setup installed.
11
+ *
12
+ * This module writes the file directly (same lock key and atomic write as
13
+ * StorageService) instead of instantiating StorageService, so the CLI can use
14
+ * it without starting the backend's logger. `get` never creates the file:
15
+ * a fresh machine reports null ("not chosen yet").
16
+ *
17
+ * @module services/harness/orc-harness.store
18
+ */
19
+ import type { HarnessId } from './harness.types.js';
20
+ /** Updates `settings.general.defaultRuntime`. */
21
+ export type DefaultRuntimeUpdater = (harnessId: HarnessId) => Promise<void>;
22
+ /** Injectable dependencies. */
23
+ export interface OrcHarnessStoreDeps {
24
+ /** Crewly home dir (defaults to CREWLY_HOME / ~/.crewly, resolved per call) */
25
+ crewlyHome?: () => string;
26
+ /** Settings updater; defaults to the backend SettingsService singleton */
27
+ updateDefaultRuntime?: DefaultRuntimeUpdater;
28
+ }
29
+ /** Reads and writes the orchestrator's harness. */
30
+ export declare class OrcHarnessStore {
31
+ private readonly crewlyHome;
32
+ private readonly updateDefaultRuntime;
33
+ /**
34
+ * @param deps - Injectable dependencies (all optional)
35
+ */
36
+ constructor(deps?: OrcHarnessStoreDeps);
37
+ /**
38
+ * Orchestrator config file path.
39
+ *
40
+ * @returns `<crewlyHome>/teams/orchestrator/config.json`
41
+ */
42
+ getFilePath(): string;
43
+ /**
44
+ * The orchestrator's runtime, if one is recorded.
45
+ *
46
+ * @returns Runtime id, or null when nothing is recorded yet
47
+ */
48
+ get(): Promise<string | null>;
49
+ /**
50
+ * Set the orchestrator's harness (and the default runtime for new members).
51
+ *
52
+ * Takes effect the next time the orchestrator starts.
53
+ *
54
+ * @param harnessId - Harness id
55
+ * @returns The harness id now recorded
56
+ */
57
+ set(harnessId: HarnessId): Promise<string>;
58
+ }
59
+ //# sourceMappingURL=orc-harness.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orc-harness.store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/orc-harness.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iDAAiD;AACjD,MAAM,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5E,+BAA+B;AAC/B,MAAM,WAAW,mBAAmB;IACnC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;CAC7C;AAWD,mDAAmD;AACnD,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwB;IAE7D;;OAEG;gBACS,IAAI,GAAE,mBAAwB;IAK1C;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASnC;;;;;;;OAOG;IACG,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CA+BhD"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Which harness the orchestrator runs on.
3
+ *
4
+ * The orchestrator's runtime is `runtimeType` in
5
+ * `<crewlyHome>/teams/orchestrator/config.json` — the same field
6
+ * `PUT /api/orchestrator/runtime` and StorageService.updateOrchestratorRuntimeType
7
+ * write, and the one the orchestrator is launched with (a `DEFAULT_RUNTIME`
8
+ * env var still overrides it at boot). Setting the orc harness also sets
9
+ * `settings.general.defaultRuntime`, so new team members default to the one
10
+ * harness first-time setup installed.
11
+ *
12
+ * This module writes the file directly (same lock key and atomic write as
13
+ * StorageService) instead of instantiating StorageService, so the CLI can use
14
+ * it without starting the backend's logger. `get` never creates the file:
15
+ * a fresh machine reports null ("not chosen yet").
16
+ *
17
+ * @module services/harness/orc-harness.store
18
+ */
19
+ import { promises as fs } from 'fs';
20
+ import * as path from 'path';
21
+ import { CREWLY_CONSTANTS, HARNESS_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
22
+ import { atomicWriteFile, withOperationLock } from '../../utils/file-io.utils.js';
23
+ import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
24
+ import { getSettingsService } from '../settings/settings.service.js';
25
+ /**
26
+ * Default updater: the backend's settings singleton (keeps its cache coherent).
27
+ *
28
+ * @param harnessId - Harness id
29
+ */
30
+ const defaultUpdateDefaultRuntime = async (harnessId) => {
31
+ await getSettingsService().updateSettings({ general: { defaultRuntime: harnessId } });
32
+ };
33
+ /** Reads and writes the orchestrator's harness. */
34
+ export class OrcHarnessStore {
35
+ crewlyHome;
36
+ updateDefaultRuntime;
37
+ /**
38
+ * @param deps - Injectable dependencies (all optional)
39
+ */
40
+ constructor(deps = {}) {
41
+ this.crewlyHome = deps.crewlyHome ?? getCrewlyHomePath;
42
+ this.updateDefaultRuntime = deps.updateDefaultRuntime ?? defaultUpdateDefaultRuntime;
43
+ }
44
+ /**
45
+ * Orchestrator config file path.
46
+ *
47
+ * @returns `<crewlyHome>/teams/orchestrator/config.json`
48
+ */
49
+ getFilePath() {
50
+ return path.join(this.crewlyHome(), ...HARNESS_CONSTANTS.ORCHESTRATOR_CONFIG_SEGMENTS);
51
+ }
52
+ /**
53
+ * The orchestrator's runtime, if one is recorded.
54
+ *
55
+ * @returns Runtime id, or null when nothing is recorded yet
56
+ */
57
+ async get() {
58
+ try {
59
+ const parsed = JSON.parse(await fs.readFile(this.getFilePath(), 'utf-8'));
60
+ return typeof parsed.runtimeType === 'string' && parsed.runtimeType.length > 0 ? parsed.runtimeType : null;
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * Set the orchestrator's harness (and the default runtime for new members).
68
+ *
69
+ * Takes effect the next time the orchestrator starts.
70
+ *
71
+ * @param harnessId - Harness id
72
+ * @returns The harness id now recorded
73
+ */
74
+ async set(harnessId) {
75
+ const file = this.getFilePath();
76
+ await withOperationLock(file, async () => {
77
+ let orchestrator;
78
+ try {
79
+ orchestrator = JSON.parse(await fs.readFile(file, 'utf-8'));
80
+ }
81
+ catch {
82
+ const now = new Date().toISOString();
83
+ orchestrator = {
84
+ sessionName: CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME,
85
+ agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
86
+ workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
87
+ runtimeType: RUNTIME_TYPES.CLAUDE_CODE,
88
+ createdAt: now,
89
+ updatedAt: now,
90
+ };
91
+ }
92
+ orchestrator.runtimeType = harnessId;
93
+ orchestrator.updatedAt = new Date().toISOString();
94
+ await fs.mkdir(path.dirname(file), { recursive: true });
95
+ await atomicWriteFile(file, JSON.stringify(orchestrator, null, 2));
96
+ });
97
+ // The orchestrator runtime is what matters; a settings failure (e.g. an
98
+ // invalid settings file) must not undo or fail the orc choice.
99
+ try {
100
+ await this.updateDefaultRuntime(harnessId);
101
+ }
102
+ catch {
103
+ // Default runtime for new members stays as it was.
104
+ }
105
+ return harnessId;
106
+ }
107
+ }
108
+ //# sourceMappingURL=orc-harness.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orc-harness.store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/orc-harness.store.ts"],"names":[],"mappings":"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"}