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,204 @@
1
+ /**
2
+ * Harness controller — REST handlers for `/api/harness` (web setup page).
3
+ *
4
+ * Contract: specs/onboarding-harness-login.md. Every response is
5
+ * `{ success: true, data }` or `{ success: false, error }`.
6
+ *
7
+ * Owner-only: install, orc choice, every login route and the API-key route
8
+ * refuse a request that carries an `X-Agent-Session` header (403) — an agent
9
+ * must not install software, switch the orchestrator's harness or log the
10
+ * machine in. This mirrors the tickets controller's owner check. `GET
11
+ * /api/harness` and `GET /api/harness/install/:jobId` stay readable.
12
+ *
13
+ * API keys are never echoed; errors never contain them.
14
+ *
15
+ * @module controllers/harness/harness.controller
16
+ */
17
+ import { readAgentSessionHeader } from '../../utils/agent-caller.utils.js';
18
+ import { HarnessApiKeyError } from '../../services/harness/harness-api-key.service.js';
19
+ import { HarnessInstallError } from '../../services/harness/harness-install.service.js';
20
+ import { UnknownHarnessError, getHarnessService } from '../../services/harness/harness.service.js';
21
+ import { LoginBrokerError } from '../../services/harness/login-broker.service.js';
22
+ /** HTTP status for each service error code. */
23
+ const ERROR_STATUS = {
24
+ unknown_harness: 404,
25
+ job_not_found: 404,
26
+ not_found: 404,
27
+ unsupported_method: 400,
28
+ unsupported: 400,
29
+ invalid_key: 400,
30
+ not_installed: 409,
31
+ not_active: 409,
32
+ login_failed: 422,
33
+ spawn_failed: 500,
34
+ };
35
+ /**
36
+ * Refuse a request made by an agent session.
37
+ *
38
+ * @param req - Express request
39
+ * @param res - Express response
40
+ * @param what - Action, for the message
41
+ * @returns True when refused (response sent)
42
+ */
43
+ export function refuseAgent(req, res, what) {
44
+ if (!readAgentSessionHeader(req))
45
+ return false;
46
+ res.status(403).json({ success: false, error: `Only the owner can ${what}` });
47
+ return true;
48
+ }
49
+ /**
50
+ * Send an error response for a thrown error.
51
+ *
52
+ * @param res - Express response
53
+ * @param error - Thrown value
54
+ */
55
+ export function sendError(res, error) {
56
+ if (error instanceof UnknownHarnessError) {
57
+ res.status(404).json({ success: false, error: error.message });
58
+ return;
59
+ }
60
+ if (error instanceof LoginBrokerError || error instanceof HarnessInstallError || error instanceof HarnessApiKeyError) {
61
+ res.status(ERROR_STATUS[error.code] ?? 500).json({ success: false, error: error.message, code: error.code });
62
+ return;
63
+ }
64
+ res.status(500).json({ success: false, error: error instanceof Error ? error.message : 'Internal error' });
65
+ }
66
+ /**
67
+ * Read a string route param.
68
+ *
69
+ * @param req - Express request
70
+ * @param name - Param name
71
+ * @returns The value ('' when missing)
72
+ */
73
+ function param(req, name) {
74
+ const value = req.params[name];
75
+ return typeof value === 'string' ? value : '';
76
+ }
77
+ /**
78
+ * Build the controller.
79
+ *
80
+ * @param getService - Service accessor (defaults to the backend singleton; resolved per request)
81
+ * @returns Handlers
82
+ */
83
+ export function createHarnessController(getService = getHarnessService) {
84
+ return {
85
+ /** GET / — statuses, orc harness, system tools */
86
+ async getOverview(_req, res) {
87
+ try {
88
+ res.json({ success: true, data: await getService().getOverview() });
89
+ }
90
+ catch (error) {
91
+ sendError(res, error);
92
+ }
93
+ },
94
+ /** POST /:id/install — start an install job */
95
+ async startInstall(req, res) {
96
+ if (refuseAgent(req, res, 'install harnesses'))
97
+ return;
98
+ try {
99
+ const job = getService().startInstall(param(req, 'id'));
100
+ res.json({ success: true, data: { jobId: job.jobId } });
101
+ }
102
+ catch (error) {
103
+ sendError(res, error);
104
+ }
105
+ },
106
+ /** GET /install/:jobId — install job progress */
107
+ async getInstallJob(req, res) {
108
+ try {
109
+ res.json({ success: true, data: getService().getInstallJob(param(req, 'jobId')) });
110
+ }
111
+ catch (error) {
112
+ sendError(res, error);
113
+ }
114
+ },
115
+ /** PUT /orc — choose the orchestrator's harness */
116
+ async setOrcHarness(req, res) {
117
+ if (refuseAgent(req, res, 'choose the orchestrator harness'))
118
+ return;
119
+ const harnessId = req.body?.harnessId;
120
+ if (typeof harnessId !== 'string' || harnessId.length === 0) {
121
+ res.status(400).json({ success: false, error: 'harnessId is required' });
122
+ return;
123
+ }
124
+ try {
125
+ const orcHarness = await getService().setOrcHarness(harnessId);
126
+ res.json({ success: true, data: { orcHarness } });
127
+ }
128
+ catch (error) {
129
+ sendError(res, error);
130
+ }
131
+ },
132
+ /** POST /:id/login — start a broker login */
133
+ async startLogin(req, res) {
134
+ if (refuseAgent(req, res, 'log harnesses in'))
135
+ return;
136
+ const method = req.body?.method;
137
+ if (typeof method !== 'string' || method.length === 0) {
138
+ res.status(400).json({ success: false, error: 'method is required' });
139
+ return;
140
+ }
141
+ try {
142
+ res.json({ success: true, data: getService().startLogin(param(req, 'id'), method) });
143
+ }
144
+ catch (error) {
145
+ sendError(res, error);
146
+ }
147
+ },
148
+ /** GET /login/:sessionId — login session state */
149
+ async getLogin(req, res) {
150
+ if (refuseAgent(req, res, 'read harness logins'))
151
+ return;
152
+ try {
153
+ res.json({ success: true, data: getService().broker.get(param(req, 'sessionId')) });
154
+ }
155
+ catch (error) {
156
+ sendError(res, error);
157
+ }
158
+ },
159
+ /** POST /login/:sessionId/input — type the user's reply */
160
+ async inputLogin(req, res) {
161
+ if (refuseAgent(req, res, 'log harnesses in'))
162
+ return;
163
+ const text = req.body?.text;
164
+ if (typeof text !== 'string' || text.trim().length === 0) {
165
+ res.status(400).json({ success: false, error: 'text is required' });
166
+ return;
167
+ }
168
+ try {
169
+ res.json({ success: true, data: getService().broker.input(param(req, 'sessionId'), text.trim()) });
170
+ }
171
+ catch (error) {
172
+ sendError(res, error);
173
+ }
174
+ },
175
+ /** POST /login/:sessionId/cancel — cancel a login */
176
+ async cancelLogin(req, res) {
177
+ if (refuseAgent(req, res, 'cancel harness logins'))
178
+ return;
179
+ try {
180
+ res.json({ success: true, data: getService().broker.cancel(param(req, 'sessionId')) });
181
+ }
182
+ catch (error) {
183
+ sendError(res, error);
184
+ }
185
+ },
186
+ /** POST /:id/api-key — validate and store an API key (never echoed) */
187
+ async submitApiKey(req, res) {
188
+ if (refuseAgent(req, res, 'set harness API keys'))
189
+ return;
190
+ const key = req.body?.key;
191
+ if (typeof key !== 'string' || key.trim().length === 0) {
192
+ res.status(400).json({ success: false, error: 'key is required' });
193
+ return;
194
+ }
195
+ try {
196
+ res.json({ success: true, data: await getService().submitApiKey(param(req, 'id'), key) });
197
+ }
198
+ catch (error) {
199
+ sendError(res, error);
200
+ }
201
+ },
202
+ };
203
+ }
204
+ //# sourceMappingURL=harness.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/harness/harness.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AACxF,OAAO,EAAkB,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AACnH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAElF,+CAA+C;AAC/C,MAAM,YAAY,GAA2B;IAC5C,eAAe,EAAE,GAAG;IACpB,aAAa,EAAE,GAAG;IAClB,SAAS,EAAE,GAAG;IACd,kBAAkB,EAAE,GAAG;IACvB,WAAW,EAAE,GAAG;IAChB,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,GAAG;IAClB,UAAU,EAAE,GAAG;IACf,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,GAAG;CACjB,CAAC;AAeF;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY,EAAE,GAAa,EAAE,IAAY;IACpE,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAa,EAAE,KAAc;IACtD,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO;IACR,CAAC;IACD,IAAI,KAAK,YAAY,gBAAgB,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;QACtH,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7G,OAAO;IACR,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAC5G,CAAC;AAED;;;;;;GAMG;AACH,SAAS,KAAK,CAAC,GAAY,EAAE,IAAY;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,aAAmC,iBAAiB;IAC3F,OAAO;QACN,kDAAkD;QAClD,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG;YAC1B,IAAI,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,+CAA+C;QAC/C,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG;YAC1B,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC;gBAAE,OAAO;YACvD,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBACxD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,iDAAiD;QACjD,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG;YAC3B,IAAI,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,mDAAmD;QACnD,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG;YAC3B,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,CAAC;gBAAE,OAAO;YACrE,MAAM,SAAS,GAAI,GAAG,CAAC,IAA4C,EAAE,SAAS,CAAC;YAC/E,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;gBACzE,OAAO;YACR,CAAC;YACD,IAAI,CAAC;gBACJ,MAAM,UAAU,GAAG,MAAM,UAAU,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC/D,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,6CAA6C;QAC7C,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG;YACxB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC;gBAAE,OAAO;YACtD,MAAM,MAAM,GAAI,GAAG,CAAC,IAAyC,EAAE,MAAM,CAAC;YACtE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;gBACtE,OAAO;YACR,CAAC;YACD,IAAI,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,kDAAkD;QAClD,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG;YACtB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,qBAAqB,CAAC;gBAAE,OAAO;YACzD,IAAI,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,2DAA2D;QAC3D,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG;YACxB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC;gBAAE,OAAO;YACtD,MAAM,IAAI,GAAI,GAAG,CAAC,IAAuC,EAAE,IAAI,CAAC;YAChE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACpE,OAAO;YACR,CAAC;YACD,IAAI,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,qDAAqD;QACrD,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG;YACzB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,CAAC;gBAAE,OAAO;YAC3D,IAAI,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,uEAAuE;QACvE,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG;YAC1B,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,CAAC;gBAAE,OAAO;YAC1D,MAAM,GAAG,GAAI,GAAG,CAAC,IAAsC,EAAE,GAAG,CAAC;YAC7D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACnE,OAAO;YACR,CAAC;YACD,IAAI,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Harness routes — mounted at `/api/harness` (specs/onboarding-harness-login.md).
3
+ *
4
+ * @module controllers/harness/harness.routes
5
+ */
6
+ import { Router } from 'express';
7
+ import type { HarnessService } from '../../services/harness/harness.service.js';
8
+ /**
9
+ * Create the harness router.
10
+ *
11
+ * Routes (static paths are registered before `/:id/...` so they never match as ids):
12
+ * - GET / — statuses, orc harness, system tools
13
+ * - GET /install/:jobId — install job progress
14
+ * - PUT /orc — choose the orchestrator harness { harnessId }
15
+ * - POST /orc — the same, for the relay (portal / phone carry GET and POST only)
16
+ * - GET /login/:sessionId — login session
17
+ * - POST /login/:sessionId/input — type the user's reply { text }
18
+ * - POST /login/:sessionId/cancel — cancel a login
19
+ * - POST /:id/install — start an install job
20
+ * - POST /:id/login — start a broker login { method }
21
+ * - POST /:id/api-key — store an API key { key }
22
+ *
23
+ * @param getService - Service accessor (tests inject a fake)
24
+ * @returns Express router for /api/harness
25
+ */
26
+ export declare function createHarnessRouter(getService?: () => HarnessService): Router;
27
+ //# sourceMappingURL=harness.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/harness/harness.routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAIhF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,GAAE,MAAM,cAAkC,GAAG,MAAM,CAehG"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Harness routes — mounted at `/api/harness` (specs/onboarding-harness-login.md).
3
+ *
4
+ * @module controllers/harness/harness.routes
5
+ */
6
+ import { Router } from 'express';
7
+ import { getHarnessService } from '../../services/harness/harness.service.js';
8
+ import { createHarnessController } from './harness.controller.js';
9
+ /**
10
+ * Create the harness router.
11
+ *
12
+ * Routes (static paths are registered before `/:id/...` so they never match as ids):
13
+ * - GET / — statuses, orc harness, system tools
14
+ * - GET /install/:jobId — install job progress
15
+ * - PUT /orc — choose the orchestrator harness { harnessId }
16
+ * - POST /orc — the same, for the relay (portal / phone carry GET and POST only)
17
+ * - GET /login/:sessionId — login session
18
+ * - POST /login/:sessionId/input — type the user's reply { text }
19
+ * - POST /login/:sessionId/cancel — cancel a login
20
+ * - POST /:id/install — start an install job
21
+ * - POST /:id/login — start a broker login { method }
22
+ * - POST /:id/api-key — store an API key { key }
23
+ *
24
+ * @param getService - Service accessor (tests inject a fake)
25
+ * @returns Express router for /api/harness
26
+ */
27
+ export function createHarnessRouter(getService = getHarnessService) {
28
+ const router = Router();
29
+ const controller = createHarnessController(getService);
30
+ router.get('/', controller.getOverview);
31
+ router.get('/install/:jobId', controller.getInstallJob);
32
+ router.put('/orc', controller.setOrcHarness);
33
+ // POST twin: the relay (portal / phone) only carries GET and POST.
34
+ router.post('/orc', controller.setOrcHarness);
35
+ router.get('/login/:sessionId', controller.getLogin);
36
+ router.post('/login/:sessionId/input', controller.inputLogin);
37
+ router.post('/login/:sessionId/cancel', controller.cancelLogin);
38
+ router.post('/:id/install', controller.startInstall);
39
+ router.post('/:id/login', controller.startLogin);
40
+ router.post('/:id/api-key', controller.submitApiKey);
41
+ return router;
42
+ }
43
+ //# sourceMappingURL=harness.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/harness/harness.routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAmC,iBAAiB;IACtF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IAC7C,mEAAmE;IACnE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * WhatsApp Inbox Controller
3
+ *
4
+ * Read API and reply drafts for the WhatsApp inbox connector, mounted under
5
+ * `/api/whatsapp`:
6
+ *
7
+ * | Method | Path | Who |
8
+ * |--------|-----------------------------|----------------|
9
+ * | GET | /inbox?limit=&includeGroups=| owner, agents |
10
+ * | GET | /chats?limit=&q= | owner, agents |
11
+ * | GET | /chats/:chatId/messages | owner, agents |
12
+ * | GET | /search?q=&limit= | owner, agents |
13
+ * | POST | /drafts {chatId, text} | owner, agents |
14
+ * | GET | /drafts?status=&limit= | owner, agents |
15
+ * | POST | /drafts/:id/discard | owner, agents |
16
+ * | POST | /drafts/:id/send | owner; agents only with the owner's 「发 <code>」 |
17
+ *
18
+ * Every response is `{ success, data }` or `{ success: false, error, code }`.
19
+ * The send gate is in `services/whatsapp/whatsapp-draft-gate.ts`.
20
+ *
21
+ * @module controllers/whatsapp/whatsapp-inbox
22
+ */
23
+ import { Router, Request } from 'express';
24
+ import { type WhatsAppInboxStore } from '../../services/whatsapp/whatsapp-inbox.store.js';
25
+ import type { WhatsAppOutgoingMessage } from '../../types/whatsapp.types.js';
26
+ /** The slice of WhatsAppService the inbox routes use. */
27
+ export interface WhatsAppInboxSender {
28
+ /** Whether the socket is connected */
29
+ isConnected(): boolean;
30
+ /** Send one text message */
31
+ sendMessage(msg: WhatsAppOutgoingMessage): Promise<void>;
32
+ }
33
+ /** Injectable dependencies (tests pass fakes). */
34
+ export interface WhatsAppInboxDeps {
35
+ /** Inbox store */
36
+ getStore: () => WhatsAppInboxStore;
37
+ /** Socket sender */
38
+ getSender: () => WhatsAppInboxSender;
39
+ /** Genuine owner chat messages created at/after `sinceMs`, newest first */
40
+ getOwnerMessagesSince: (sinceMs: number, limit: number) => string[];
41
+ /** Clock */
42
+ now: () => number;
43
+ /**
44
+ * Whether a request with no X-Agent-Session really is the owner: it must
45
+ * carry the API token (dashboard; the portal / phone relay adds it). An
46
+ * agent leaving out its session header is not the owner.
47
+ */
48
+ isOwnerRequest: (req: Request) => boolean;
49
+ }
50
+ /**
51
+ * Parse a `limit` query value, clamped to `[1, max]`.
52
+ *
53
+ * @param raw - Query value
54
+ * @param def - Default when absent/invalid
55
+ * @param max - Hard cap
56
+ * @returns The limit
57
+ */
58
+ export declare function parseLimit(raw: unknown, def: number, max: number): number;
59
+ /**
60
+ * Parse a boolean query flag (`true`/`1`/`yes`).
61
+ *
62
+ * @param raw - Query value
63
+ * @returns True only for an explicit truthy value
64
+ */
65
+ export declare function parseFlag(raw: unknown): boolean;
66
+ /**
67
+ * Create the inbox router.
68
+ *
69
+ * @param overrides - Dependency overrides (tests)
70
+ * @returns Router to mount under `/api/whatsapp`
71
+ */
72
+ export declare function createWhatsAppInboxRouter(overrides?: Partial<WhatsAppInboxDeps>): Router;
73
+ //# sourceMappingURL=whatsapp-inbox.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-inbox.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/whatsapp/whatsapp-inbox.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,MAAM,EAAE,OAAO,EAA0B,MAAM,SAAS,CAAC;AAIlE,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAQjH,OAAO,KAAK,EAAsC,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAIjH,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,WAAW,IAAI,OAAO,CAAC;IACvB,4BAA4B;IAC5B,WAAW,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,kBAAkB;IAClB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;IACnC,oBAAoB;IACpB,SAAS,EAAE,MAAM,mBAAmB,CAAC;IACrC,2EAA2E;IAC3E,qBAAqB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACpE,YAAY;IACZ,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB;;;;OAIG;IACH,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAWD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAE/C;AAyBD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,MAAM,CA4N5F"}