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.
- package/config/skills/agent/core/whatsapp-draft/SKILL.md +80 -0
- package/config/skills/agent/core/whatsapp-draft/execute.sh +84 -0
- package/config/skills/agent/core/whatsapp-draft/execute.test.sh +70 -0
- package/config/skills/agent/core/whatsapp-inbox/SKILL.md +75 -0
- package/config/skills/agent/core/whatsapp-inbox/execute.sh +87 -0
- package/config/skills/agent/core/whatsapp-inbox/execute.test.sh +68 -0
- package/config/skills/agent/core/whatsapp-read/SKILL.md +80 -0
- package/config/skills/agent/core/whatsapp-read/execute.sh +116 -0
- package/config/skills/agent/core/whatsapp-read/execute.test.sh +84 -0
- package/config/skills/agent/core/whatsapp-send/SKILL.md +70 -0
- package/config/skills/agent/core/whatsapp-send/execute.sh +84 -0
- package/config/skills/agent/core/whatsapp-send/execute.test.sh +79 -0
- package/dist/backend/backend/src/constants.d.ts +225 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +223 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts +54 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.js +204 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts +27 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.js +43 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +73 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +310 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +53 -4
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +5 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +7 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +4 -3
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +43 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts +67 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.js +118 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js +157 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js +208 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.js +183 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts +106 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.js +205 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts +86 -0
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-registry.js +121 -0
- package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +173 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.js +324 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.service.d.ts +146 -0
- package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.service.js +193 -0
- package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts +138 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.types.js +51 -0
- package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +238 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.js +495 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/login-rules.d.ts +162 -0
- package/dist/backend/backend/src/services/harness/login-rules.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/login-rules.js +344 -0
- package/dist/backend/backend/src/services/harness/login-rules.js.map +1 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts +59 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.js +108 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/index.d.ts +5 -1
- package/dist/backend/backend/src/services/whatsapp/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/index.js +5 -1
- package/dist/backend/backend/src/services/whatsapp/index.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.d.ts +59 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.js +108 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +74 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +82 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.d.ts +184 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.js +420 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.d.ts +243 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.js +538 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.d.ts +32 -2
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.js +65 -9
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +11 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.d.ts +59 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.js +159 -9
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.js.map +1 -1
- package/dist/backend/backend/src/types/whatsapp.types.d.ts +108 -0
- package/dist/backend/backend/src/types/whatsapp.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/whatsapp.types.js +9 -0
- package/dist/backend/backend/src/types/whatsapp.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +225 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +223 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +5 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +7 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js +4 -3
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts +67 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.js +118 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js +157 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js +208 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.js +183 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts +106 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.js +205 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts +86 -0
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-registry.js +121 -0
- package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +173 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.js +324 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.service.d.ts +146 -0
- package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.service.js +193 -0
- package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts +138 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.types.js +51 -0
- package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +238 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.js +495 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/login-rules.d.ts +162 -0
- package/dist/cli/backend/src/services/harness/login-rules.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/login-rules.js +344 -0
- package/dist/cli/backend/src/services/harness/login-rules.js.map +1 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts +59 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.js +108 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.js.map +1 -0
- package/dist/cli/cli/src/commands/harness-setup.d.ts +159 -0
- package/dist/cli/cli/src/commands/harness-setup.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/harness-setup.js +377 -0
- package/dist/cli/cli/src/commands/harness-setup.js.map +1 -0
- package/dist/cli/cli/src/commands/harness.d.ts +56 -0
- package/dist/cli/cli/src/commands/harness.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/harness.js +97 -0
- package/dist/cli/cli/src/commands/harness.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +108 -50
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +200 -191
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +18 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +18 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +22 -3
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/harness-engine.d.ts +99 -0
- package/dist/cli/cli/src/utils/harness-engine.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/harness-engine.js +143 -0
- package/dist/cli/cli/src/utils/harness-engine.js.map +1 -0
- package/dist/cli/cli/src/utils/prompt-io.d.ts +25 -0
- package/dist/cli/cli/src/utils/prompt-io.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/prompt-io.js +47 -0
- package/dist/cli/cli/src/utils/prompt-io.js.map +1 -0
- package/frontend/dist/assets/{index-8327e63e.css → index-0a2f783c.css} +1 -1
- package/frontend/dist/assets/{index-07e338a9.js → index-aaf65055.js} +309 -309
- package/frontend/dist/index.html +2 -2
- 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":"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"}
|
|
@@ -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"}
|