crewly 1.20.122 → 1.20.123
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 +107 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +105 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- 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/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/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +29 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- 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 +107 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +105 -0
- package/dist/cli/backend/src/constants.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/frontend/dist/assets/{index-07e338a9.js → index-daf43f1a.js} +268 -268
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -9,9 +9,15 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { Router } from 'express';
|
|
11
11
|
import { getWhatsAppService } from '../../services/whatsapp/whatsapp.service.js';
|
|
12
|
-
import {
|
|
12
|
+
import { applyBridgeForMode } from '../../services/whatsapp/whatsapp-initializer.js';
|
|
13
|
+
import { markWhatsAppDisconnected, saveWhatsAppConnection, } from '../../services/whatsapp/whatsapp-connection-config.js';
|
|
14
|
+
import { isWhatsAppMode } from '../../types/whatsapp.types.js';
|
|
13
15
|
import { WHATSAPP_CONSTANTS } from '../../constants.js';
|
|
16
|
+
import { readAgentSessionHeader } from '../../utils/agent-caller.utils.js';
|
|
17
|
+
import { LoggerService } from '../../services/core/logger.service.js';
|
|
18
|
+
import { createWhatsAppInboxRouter } from './whatsapp-inbox.controller.js';
|
|
14
19
|
const router = Router();
|
|
20
|
+
const logger = LoggerService.getInstance().createComponentLogger('WhatsAppController');
|
|
15
21
|
/**
|
|
16
22
|
* GET /api/whatsapp/status
|
|
17
23
|
*
|
|
@@ -42,12 +48,23 @@ router.get('/status', async (req, res, next) => {
|
|
|
42
48
|
* Start WhatsApp connection. Returns the QR code for pairing
|
|
43
49
|
* if not already authenticated.
|
|
44
50
|
*
|
|
51
|
+
* @body mode - `inbox` (default: read-only + drafts, never auto-sends) or `assistant` (orchestrator auto-replies)
|
|
45
52
|
* @body allowedContacts - Array of allowed phone numbers (optional)
|
|
46
53
|
* @body authStatePath - Custom auth state path (optional)
|
|
47
54
|
* @returns Connection status and QR code if pending
|
|
48
55
|
*/
|
|
49
56
|
router.post('/connect', async (req, res, next) => {
|
|
50
57
|
try {
|
|
58
|
+
const requestedMode = req.body?.mode ?? WHATSAPP_CONSTANTS.DEFAULT_CONNECT_MODE;
|
|
59
|
+
if (!isWhatsAppMode(requestedMode)) {
|
|
60
|
+
res.status(400).json({
|
|
61
|
+
success: false,
|
|
62
|
+
code: WHATSAPP_CONSTANTS.ERROR_CODES.INVALID_MODE,
|
|
63
|
+
error: `mode must be '${WHATSAPP_CONSTANTS.MODES.INBOX}' or '${WHATSAPP_CONSTANTS.MODES.ASSISTANT}'`,
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const mode = requestedMode;
|
|
51
68
|
const service = getWhatsAppService();
|
|
52
69
|
if (service.isConnected()) {
|
|
53
70
|
res.json({
|
|
@@ -62,6 +79,7 @@ router.post('/connect', async (req, res, next) => {
|
|
|
62
79
|
authStatePath: req.body.authStatePath,
|
|
63
80
|
allowedContacts: req.body.allowedContacts ||
|
|
64
81
|
process.env.WHATSAPP_ALLOWED_CONTACTS?.split(',').filter(Boolean),
|
|
82
|
+
mode,
|
|
65
83
|
};
|
|
66
84
|
// Set up a one-time QR listener to return in response
|
|
67
85
|
const qrPromise = new Promise((resolve) => {
|
|
@@ -77,9 +95,17 @@ router.post('/connect', async (req, res, next) => {
|
|
|
77
95
|
});
|
|
78
96
|
});
|
|
79
97
|
await service.initialize(config);
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
98
|
+
// The orchestrator bridge (auto-replies) runs only in assistant mode.
|
|
99
|
+
await applyBridgeForMode(mode);
|
|
100
|
+
// Remember the mode so a restart reconnects the same way.
|
|
101
|
+
try {
|
|
102
|
+
await saveWhatsAppConnection(config, mode);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger.warn('Could not persist WhatsApp connection config', {
|
|
106
|
+
error: error instanceof Error ? error.message : String(error),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
83
109
|
const qrCode = await qrPromise;
|
|
84
110
|
res.json({
|
|
85
111
|
success: true,
|
|
@@ -105,6 +131,14 @@ router.post('/disconnect', async (req, res, next) => {
|
|
|
105
131
|
try {
|
|
106
132
|
const service = getWhatsAppService();
|
|
107
133
|
await service.disconnect();
|
|
134
|
+
try {
|
|
135
|
+
await markWhatsAppDisconnected();
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
logger.warn('Could not persist WhatsApp disconnect', {
|
|
139
|
+
error: error instanceof Error ? error.message : String(error),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
108
142
|
res.json({
|
|
109
143
|
success: true,
|
|
110
144
|
message: 'WhatsApp disconnected',
|
|
@@ -118,6 +152,8 @@ router.post('/disconnect', async (req, res, next) => {
|
|
|
118
152
|
* POST /api/whatsapp/send
|
|
119
153
|
*
|
|
120
154
|
* Send a text message via WhatsApp (for testing/manual use).
|
|
155
|
+
* In inbox mode agents (X-Agent-Session) are refused: they must write a
|
|
156
|
+
* draft and wait for the owner's confirmation.
|
|
121
157
|
*
|
|
122
158
|
* @body to - Destination chat JID (required, e.g., "1234567890@s.whatsapp.net")
|
|
123
159
|
* @body text - Message text (required)
|
|
@@ -141,6 +177,17 @@ router.post('/send', async (req, res, next) => {
|
|
|
141
177
|
return;
|
|
142
178
|
}
|
|
143
179
|
const service = getWhatsAppService();
|
|
180
|
+
const agentSession = readAgentSessionHeader(req);
|
|
181
|
+
if (agentSession && service.isInboxMode()) {
|
|
182
|
+
logger.warn('Refused agent direct send in inbox mode', { agentSession });
|
|
183
|
+
res.status(403).json({
|
|
184
|
+
success: false,
|
|
185
|
+
code: WHATSAPP_CONSTANTS.ERROR_CODES.AGENT_SEND_FORBIDDEN,
|
|
186
|
+
error: 'WhatsApp is in inbox mode: agents cannot send directly. Create a draft (POST /api/whatsapp/drafts) ' +
|
|
187
|
+
'and ask the owner to reply 「发 <code>」.',
|
|
188
|
+
});
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
144
191
|
if (!service.isConnected()) {
|
|
145
192
|
res.status(503).json({
|
|
146
193
|
success: false,
|
|
@@ -181,5 +228,7 @@ router.get('/qr', async (req, res, next) => {
|
|
|
181
228
|
next(error);
|
|
182
229
|
}
|
|
183
230
|
});
|
|
231
|
+
// Inbox read API + reply drafts (/inbox, /chats, /search, /drafts).
|
|
232
|
+
router.use(createWhatsAppInboxRouter());
|
|
184
233
|
export default router;
|
|
185
234
|
//# sourceMappingURL=whatsapp.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/whatsapp/whatsapp.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"whatsapp.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/whatsapp/whatsapp.controller.ts"],"names":[],"mappings":"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"}
|
package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-reference.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACzD,IAAI,SAAuB;IAC3B,QAAQ,SAAK;IACb,SAAS,SAAO;IAChB,WAAW,UAAS;IAEpB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAclD;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"skills-reference.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACzD,IAAI,SAAuB;IAC3B,QAAQ,SAAK;IACb,SAAS,SAAO;IAChB,WAAW,UAAS;IAEpB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAclD;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2EvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA0DzB;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,kBAAkB;IAyD1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAmC1B"}
|
|
@@ -81,6 +81,11 @@ export class SkillsReferenceModule {
|
|
|
81
81
|
'to authorize it, tell them what you are waiting on, and stop there.',
|
|
82
82
|
'',
|
|
83
83
|
'Consent is per product, so an account connected for Calendar cannot read Drive.',
|
|
84
|
+
'',
|
|
85
|
+
'**WhatsApp (owner\'s personal account, inbox mode)** — read and draft only:',
|
|
86
|
+
`\`${p}/whatsapp-inbox\` (chats needing a reply), \`whatsapp-read\` (a chat / search),`,
|
|
87
|
+
'`whatsapp-draft` (saves a reply as W12 — never sends), `whatsapp-send` (only after the',
|
|
88
|
+
'owner replies 「发 W12」). Never auto-reply; summarise, don\'t paste chats elsewhere.',
|
|
84
89
|
].join('\n');
|
|
85
90
|
}
|
|
86
91
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,OAAO,qBAAqB;IACjC,IAAI,GAAG,mBAAmB,CAAC;IAC3B,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,GAAG,CAAC;IAChB,WAAW,GAAG,KAAK,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,OAAqB;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEtD,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACpE,IAAI,aAAa,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,eAAe,CAAC,MAAoB;QAC3C,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,eAAe,OAAO,CAAC;QAC3C,OAAO;YACN,0CAA0C;YAC1C,EAAE;YACF,+EAA+E;YAC/E,uFAAuF;YACvF,EAAE;YACF,OAAO,CAAC,+DAA+D;YACvE,OAAO,CAAC,6CAA6C;YACrD,OAAO,CAAC,iDAAiD;YACzD,OAAO,CAAC,uFAAuF;YAC/F,OAAO,CAAC,yFAAyF;YACjG,OAAO,CAAC,qFAAqF;YAC7F,OAAO,CAAC,qEAAqE;YAC7E,OAAO,CAAC,8EAA8E;YACtF,OAAO,CAAC,sEAAsE;YAC9E,EAAE;YACF,sFAAsF;YACtF,qFAAqF;YACrF,4EAA4E;YAC5E,EAAE;YACF,oGAAoG;YACpG,oDAAoD,CAAC,oCAAoC;YACzF,qEAAqE;YACrE,EAAE;YACF,iFAAiF;
|
|
1
|
+
{"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mobile-api-relay.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/mobile-api-relay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"mobile-api-relay.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/mobile-api-relay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAQhF,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,0BAA0B,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/E,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,0BAA0B,KAAK,IAAI,GAAG,IAAI,CAAC;IAChF,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3F;AAED,4DAA4D;AAC5D,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA4D1F,CAAC;AAgBF;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAI5E;AAMD,2BAA2B;AAC3B,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,qBAAqB,CAAC;IACjC,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,OAAO,CAA4D;gBAE/D,OAAO,EAAE,qBAAqB;IAQ1C,6CAA6C;IAC7C,KAAK,IAAI,IAAI;IAab,uDAAuD;IACvD,IAAI,IAAI,IAAI;IAOZ;;;;;;OAMG;YACW,aAAa;CAuE5B"}
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import { TICKET_CONSTANTS } from '../../constants.js';
|
|
23
23
|
import { LoggerService } from '../core/logger.service.js';
|
|
24
|
+
import { API_SECURITY_CONSTANTS } from '../../../../config/constants.js';
|
|
25
|
+
import { getApiToken } from '../core/api-token.service.js';
|
|
24
26
|
// ---------------------------------------------------------------------------
|
|
25
27
|
// Allowlist
|
|
26
28
|
// ---------------------------------------------------------------------------
|
|
@@ -85,7 +87,25 @@ export const MOBILE_API_ALLOWLIST = [
|
|
|
85
87
|
{ method: 'POST', prefix: '/escalations/' }, // …/:id/resolve
|
|
86
88
|
{ method: 'POST', prefix: '/approvals/' }, // …/:id/approve|reject
|
|
87
89
|
{ method: 'POST', prefix: '/tickets/' }, // …/:id/dismiss|verify|reject|acceptance|update|self-check
|
|
90
|
+
// WhatsApp reply drafts: the owner reviews and sends / discards from the
|
|
91
|
+
// phone or portal (reading the inbox itself stays on the machine).
|
|
92
|
+
{ method: 'GET', prefix: '/whatsapp/drafts' },
|
|
93
|
+
{ method: 'POST', prefix: '/whatsapp/drafts/' },
|
|
88
94
|
];
|
|
95
|
+
/**
|
|
96
|
+
* The owner's API token header for relayed calls (empty when no token).
|
|
97
|
+
*
|
|
98
|
+
* @returns Header map
|
|
99
|
+
*/
|
|
100
|
+
function ownerTokenHeader() {
|
|
101
|
+
try {
|
|
102
|
+
const token = getApiToken();
|
|
103
|
+
return token ? { [API_SECURITY_CONSTANTS.TOKEN_HEADER]: token } : {};
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
89
109
|
/**
|
|
90
110
|
* Check a request against {@link MOBILE_API_ALLOWLIST}. Also rejects path
|
|
91
111
|
* traversal (`..`), protocol-relative tricks, and non-`/`-rooted paths.
|
|
@@ -185,7 +205,15 @@ export class MobileApiRelayService {
|
|
|
185
205
|
method,
|
|
186
206
|
// Marks the call as the phone's, so an owner message it posts is
|
|
187
207
|
// filed as a `mobile` ticket (specs/ticket-loop.md).
|
|
188
|
-
|
|
208
|
+
// The relay only carries the Cloud-authenticated owner's calls, so it
|
|
209
|
+
// presents the owner's API token: owner-only actions (sending a
|
|
210
|
+
// WhatsApp draft) can tell it apart from an agent that merely left
|
|
211
|
+
// out its session header.
|
|
212
|
+
headers: {
|
|
213
|
+
'Content-Type': 'application/json',
|
|
214
|
+
[TICKET_CONSTANTS.CLIENT_HEADER]: TICKET_CONSTANTS.MOBILE_CLIENT,
|
|
215
|
+
...ownerTokenHeader(),
|
|
216
|
+
},
|
|
189
217
|
...(method === 'POST' && payload.body !== undefined
|
|
190
218
|
? { body: JSON.stringify(payload.body) }
|
|
191
219
|
: {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mobile-api-relay.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/mobile-api-relay.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"mobile-api-relay.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/mobile-api-relay.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,5 +7,9 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export { WhatsAppService, getWhatsAppService, resetWhatsAppService } from './whatsapp.service.js';
|
|
9
9
|
export { WhatsAppOrchestratorBridge, getWhatsAppOrchestratorBridge, resetWhatsAppOrchestratorBridge, type WhatsAppBridgeConfig, } from './whatsapp-orchestrator-bridge.js';
|
|
10
|
-
export { initializeWhatsAppIfConfigured, isWhatsAppConfigured, getWhatsAppConfigFromEnv, shutdownWhatsApp, type WhatsAppInitResult, type WhatsAppInitOptions, } from './whatsapp-initializer.js';
|
|
10
|
+
export { initializeWhatsAppIfConfigured, isWhatsAppConfigured, getWhatsAppConfigFromEnv, getWhatsAppModeFromEnv, resolveStartupWhatsAppConfig, applyBridgeForMode, shutdownWhatsApp, type WhatsAppInitResult, type WhatsAppInitOptions, } from './whatsapp-initializer.js';
|
|
11
|
+
export { WhatsAppInboxStore, getWhatsAppInboxStore, resetWhatsAppInboxStore, getDefaultInboxDbPath, } from './whatsapp-inbox.store.js';
|
|
12
|
+
export { WhatsAppInboxCapture } from './whatsapp-inbox-capture.js';
|
|
13
|
+
export { decideDraftSend, isConfirmationFor } from './whatsapp-draft-gate.js';
|
|
14
|
+
export { loadWhatsAppConnection, saveWhatsAppConnection, markWhatsAppDisconnected, type PersistedWhatsAppConnection, } from './whatsapp-connection-config.js';
|
|
11
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/whatsapp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,EAC/B,KAAK,oBAAoB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/whatsapp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,EAC/B,KAAK,oBAAoB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,4BAA4B,EAC5B,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,2BAA2B,GACjC,MAAM,iCAAiC,CAAC"}
|
|
@@ -7,5 +7,9 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export { WhatsAppService, getWhatsAppService, resetWhatsAppService } from './whatsapp.service.js';
|
|
9
9
|
export { WhatsAppOrchestratorBridge, getWhatsAppOrchestratorBridge, resetWhatsAppOrchestratorBridge, } from './whatsapp-orchestrator-bridge.js';
|
|
10
|
-
export { initializeWhatsAppIfConfigured, isWhatsAppConfigured, getWhatsAppConfigFromEnv, shutdownWhatsApp, } from './whatsapp-initializer.js';
|
|
10
|
+
export { initializeWhatsAppIfConfigured, isWhatsAppConfigured, getWhatsAppConfigFromEnv, getWhatsAppModeFromEnv, resolveStartupWhatsAppConfig, applyBridgeForMode, shutdownWhatsApp, } from './whatsapp-initializer.js';
|
|
11
|
+
export { WhatsAppInboxStore, getWhatsAppInboxStore, resetWhatsAppInboxStore, getDefaultInboxDbPath, } from './whatsapp-inbox.store.js';
|
|
12
|
+
export { WhatsAppInboxCapture } from './whatsapp-inbox-capture.js';
|
|
13
|
+
export { decideDraftSend, isConfirmationFor } from './whatsapp-draft-gate.js';
|
|
14
|
+
export { loadWhatsAppConnection, saveWhatsAppConnection, markWhatsAppDisconnected, } from './whatsapp-connection-config.js';
|
|
11
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../backend/src/services/whatsapp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,GAEhC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,GAGjB,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../backend/src/services/whatsapp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,GAEhC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,4BAA4B,EAC5B,kBAAkB,EAClB,gBAAgB,GAGjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WhatsApp Connection Config Persistence
|
|
3
|
+
*
|
|
4
|
+
* Stores how the owner last connected WhatsApp (mode, allowed contacts,
|
|
5
|
+
* whether to reconnect on boot) at `~/.crewly/whatsapp/connection.json`, so
|
|
6
|
+
* a restart keeps inbox mode instead of silently falling back to the
|
|
7
|
+
* auto-replying assistant.
|
|
8
|
+
*
|
|
9
|
+
* @module services/whatsapp/whatsapp-connection-config
|
|
10
|
+
*/
|
|
11
|
+
import { type WhatsAppConfig, type WhatsAppMode } from '../../types/whatsapp.types.js';
|
|
12
|
+
/**
|
|
13
|
+
* What is persisted about a WhatsApp connection.
|
|
14
|
+
*/
|
|
15
|
+
export interface PersistedWhatsAppConnection {
|
|
16
|
+
/** Connection mode */
|
|
17
|
+
mode: WhatsAppMode;
|
|
18
|
+
/** Reconnect on server start (true after connect, false after an explicit disconnect) */
|
|
19
|
+
autoConnect: boolean;
|
|
20
|
+
/** Allowed contacts (assistant mode only uses these) */
|
|
21
|
+
allowedContacts?: string[];
|
|
22
|
+
/** Display phone number */
|
|
23
|
+
phoneNumber?: string;
|
|
24
|
+
/** Custom auth-state directory */
|
|
25
|
+
authStatePath?: string;
|
|
26
|
+
/** Epoch ms of the last write */
|
|
27
|
+
updatedAt: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Path of the persisted connection config.
|
|
31
|
+
*
|
|
32
|
+
* @returns `<crewly home>/whatsapp/connection.json`
|
|
33
|
+
*/
|
|
34
|
+
export declare function getConnectionConfigPath(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Read the persisted connection config.
|
|
37
|
+
*
|
|
38
|
+
* @returns The config, or null when absent, unreadable or malformed
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadWhatsAppConnection(): Promise<PersistedWhatsAppConnection | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Persist the config a connection was started with (auto-connect on).
|
|
43
|
+
*
|
|
44
|
+
* @param config - The config passed to `WhatsAppService.initialize`
|
|
45
|
+
* @param mode - The resolved mode
|
|
46
|
+
*/
|
|
47
|
+
export declare function saveWhatsAppConnection(config: WhatsAppConfig, mode: WhatsAppMode): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Turn auto-connect off after an explicit disconnect, keeping the mode.
|
|
50
|
+
*/
|
|
51
|
+
export declare function markWhatsAppDisconnected(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Convert a persisted record into a service config.
|
|
54
|
+
*
|
|
55
|
+
* @param persisted - Stored record
|
|
56
|
+
* @returns Config for `WhatsAppService.initialize`
|
|
57
|
+
*/
|
|
58
|
+
export declare function toWhatsAppConfig(persisted: PersistedWhatsAppConnection): WhatsAppConfig;
|
|
59
|
+
//# sourceMappingURL=whatsapp-connection-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-connection-config.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/whatsapp/whatsapp-connection-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAAkB,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMvG;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,sBAAsB;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,yFAAyF;IACzF,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAqB1F;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtG;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI9D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,2BAA2B,GAAG,cAAc,CAOvF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WhatsApp Connection Config Persistence
|
|
3
|
+
*
|
|
4
|
+
* Stores how the owner last connected WhatsApp (mode, allowed contacts,
|
|
5
|
+
* whether to reconnect on boot) at `~/.crewly/whatsapp/connection.json`, so
|
|
6
|
+
* a restart keeps inbox mode instead of silently falling back to the
|
|
7
|
+
* auto-replying assistant.
|
|
8
|
+
*
|
|
9
|
+
* @module services/whatsapp/whatsapp-connection-config
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs, existsSync } from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { WHATSAPP_CONSTANTS } from '../../constants.js';
|
|
14
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
15
|
+
import { isWhatsAppMode } from '../../types/whatsapp.types.js';
|
|
16
|
+
/** Owner-only file mode for the config file. */
|
|
17
|
+
const PRIVATE_FILE_MODE = 0o600;
|
|
18
|
+
const PRIVATE_DIR_MODE = 0o700;
|
|
19
|
+
/**
|
|
20
|
+
* Path of the persisted connection config.
|
|
21
|
+
*
|
|
22
|
+
* @returns `<crewly home>/whatsapp/connection.json`
|
|
23
|
+
*/
|
|
24
|
+
export function getConnectionConfigPath() {
|
|
25
|
+
return path.join(getCrewlyHomePath(), WHATSAPP_CONSTANTS.DATA_DIR, WHATSAPP_CONSTANTS.CONNECTION_CONFIG_FILE);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read the persisted connection config.
|
|
29
|
+
*
|
|
30
|
+
* @returns The config, or null when absent, unreadable or malformed
|
|
31
|
+
*/
|
|
32
|
+
export async function loadWhatsAppConnection() {
|
|
33
|
+
const file = getConnectionConfigPath();
|
|
34
|
+
try {
|
|
35
|
+
if (!existsSync(file))
|
|
36
|
+
return null;
|
|
37
|
+
const parsed = JSON.parse(await fs.readFile(file, 'utf8'));
|
|
38
|
+
if (!parsed || typeof parsed !== 'object')
|
|
39
|
+
return null;
|
|
40
|
+
const p = parsed;
|
|
41
|
+
if (!isWhatsAppMode(p.mode))
|
|
42
|
+
return null;
|
|
43
|
+
return {
|
|
44
|
+
mode: p.mode,
|
|
45
|
+
autoConnect: p.autoConnect === true,
|
|
46
|
+
allowedContacts: Array.isArray(p.allowedContacts)
|
|
47
|
+
? p.allowedContacts.filter((c) => typeof c === 'string')
|
|
48
|
+
: undefined,
|
|
49
|
+
phoneNumber: typeof p.phoneNumber === 'string' ? p.phoneNumber : undefined,
|
|
50
|
+
authStatePath: typeof p.authStatePath === 'string' ? p.authStatePath : undefined,
|
|
51
|
+
updatedAt: typeof p.updatedAt === 'number' ? p.updatedAt : 0,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Persist the config a connection was started with (auto-connect on).
|
|
60
|
+
*
|
|
61
|
+
* @param config - The config passed to `WhatsAppService.initialize`
|
|
62
|
+
* @param mode - The resolved mode
|
|
63
|
+
*/
|
|
64
|
+
export async function saveWhatsAppConnection(config, mode) {
|
|
65
|
+
const record = {
|
|
66
|
+
mode,
|
|
67
|
+
autoConnect: true,
|
|
68
|
+
allowedContacts: config.allowedContacts,
|
|
69
|
+
phoneNumber: config.phoneNumber,
|
|
70
|
+
authStatePath: config.authStatePath,
|
|
71
|
+
updatedAt: Date.now(),
|
|
72
|
+
};
|
|
73
|
+
await writeConnection(record);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Turn auto-connect off after an explicit disconnect, keeping the mode.
|
|
77
|
+
*/
|
|
78
|
+
export async function markWhatsAppDisconnected() {
|
|
79
|
+
const current = await loadWhatsAppConnection();
|
|
80
|
+
if (!current)
|
|
81
|
+
return;
|
|
82
|
+
await writeConnection({ ...current, autoConnect: false, updatedAt: Date.now() });
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert a persisted record into a service config.
|
|
86
|
+
*
|
|
87
|
+
* @param persisted - Stored record
|
|
88
|
+
* @returns Config for `WhatsAppService.initialize`
|
|
89
|
+
*/
|
|
90
|
+
export function toWhatsAppConfig(persisted) {
|
|
91
|
+
return {
|
|
92
|
+
mode: persisted.mode,
|
|
93
|
+
allowedContacts: persisted.allowedContacts,
|
|
94
|
+
phoneNumber: persisted.phoneNumber,
|
|
95
|
+
authStatePath: persisted.authStatePath,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Write the record owner-only.
|
|
100
|
+
*
|
|
101
|
+
* @param record - Record to write
|
|
102
|
+
*/
|
|
103
|
+
async function writeConnection(record) {
|
|
104
|
+
const file = getConnectionConfigPath();
|
|
105
|
+
await fs.mkdir(path.dirname(file), { recursive: true, mode: PRIVATE_DIR_MODE });
|
|
106
|
+
await fs.writeFile(file, JSON.stringify(record, null, 2), { mode: PRIVATE_FILE_MODE });
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=whatsapp-connection-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-connection-config.js","sourceRoot":"","sources":["../../../../../../backend/src/services/whatsapp/whatsapp-connection-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WhatsApp Draft Send Gate
|
|
3
|
+
*
|
|
4
|
+
* Decides whether a reply draft may be sent. Owner decision (2026-09-24):
|
|
5
|
+
* nothing is ever sent to WhatsApp without the owner's explicit
|
|
6
|
+
* confirmation, one message at a time.
|
|
7
|
+
*
|
|
8
|
+
* - A request with no `X-Agent-Session` header is the owner (dashboard,
|
|
9
|
+
* mobile, portal) — the click is the confirmation.
|
|
10
|
+
* - An agent may send only when a genuine owner chat message (from
|
|
11
|
+
* `ChatV2Service.getRecentOwnerMessageContents`, which agents cannot
|
|
12
|
+
* write) created after the draft says 「发 W12」 for this draft's code, and
|
|
13
|
+
* the draft is at most `DRAFT_CONFIRM_WINDOW_MS` old. Because the owner
|
|
14
|
+
* message must post-date the draft, bounding the draft's age also bounds
|
|
15
|
+
* the confirmation to that window.
|
|
16
|
+
*
|
|
17
|
+
* @module services/whatsapp/whatsapp-draft-gate
|
|
18
|
+
*/
|
|
19
|
+
import type { WhatsAppDraft } from '../../types/whatsapp.types.js';
|
|
20
|
+
/** Why an agent's send was refused. */
|
|
21
|
+
export type DraftSendRefusal = 'no_confirmation' | 'window_expired';
|
|
22
|
+
/** Outcome of {@link decideDraftSend}. */
|
|
23
|
+
export type DraftSendDecision = {
|
|
24
|
+
allowed: true;
|
|
25
|
+
via: 'owner' | 'owner_confirmation';
|
|
26
|
+
confirmation?: string;
|
|
27
|
+
} | {
|
|
28
|
+
allowed: false;
|
|
29
|
+
reason: DraftSendRefusal;
|
|
30
|
+
};
|
|
31
|
+
/** Inputs for {@link decideDraftSend}. */
|
|
32
|
+
export interface DraftSendContext {
|
|
33
|
+
/** The draft (must be pending — checked by the caller) */
|
|
34
|
+
draft: WhatsAppDraft;
|
|
35
|
+
/** `X-Agent-Session` of the caller; undefined = owner */
|
|
36
|
+
agentSession: string | undefined;
|
|
37
|
+
/** Owner message texts created at/after `sinceMs`, newest first */
|
|
38
|
+
ownerMessagesSince: (sinceMs: number) => string[];
|
|
39
|
+
/** Current epoch ms */
|
|
40
|
+
now: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Whether one owner message confirms sending a given draft.
|
|
44
|
+
*
|
|
45
|
+
* @param text - Owner message text
|
|
46
|
+
* @param draft - The draft
|
|
47
|
+
* @returns True for 「发 W12」 / 「发送 12」 / "send #W12" / 「确认发送 W12」 naming this draft
|
|
48
|
+
*/
|
|
49
|
+
export declare function isConfirmationFor(text: string, draft: Pick<WhatsAppDraft, 'seq'>): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Decide whether the caller may send this draft now.
|
|
52
|
+
*
|
|
53
|
+
* @param ctx - Draft, caller, owner-message source, clock
|
|
54
|
+
* @returns Allowed (and why), or refused (and why)
|
|
55
|
+
*/
|
|
56
|
+
export declare function decideDraftSend(ctx: DraftSendContext): DraftSendDecision;
|
|
57
|
+
/**
|
|
58
|
+
* The instruction an agent must follow after drafting: show the owner the
|
|
59
|
+
* draft and ask for 「发 <code>」.
|
|
60
|
+
*
|
|
61
|
+
* @param draft - The draft
|
|
62
|
+
* @param recipient - Human label for the recipient (chat name or JID)
|
|
63
|
+
* @returns Instruction text
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildOwnerConfirmPrompt(draft: Pick<WhatsAppDraft, 'code' | 'text'>, recipient: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Human message for a refused agent send.
|
|
68
|
+
*
|
|
69
|
+
* @param draft - The draft
|
|
70
|
+
* @param reason - Refusal reason
|
|
71
|
+
* @returns Message for the 403 body
|
|
72
|
+
*/
|
|
73
|
+
export declare function buildRefusalMessage(draft: Pick<WhatsAppDraft, 'code'>, reason: DraftSendRefusal): string;
|
|
74
|
+
//# sourceMappingURL=whatsapp-draft-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp-draft-gate.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/whatsapp/whatsapp-draft-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAMnE,uCAAuC;AACvC,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEpE,0CAA0C;AAC1C,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEjD,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,KAAK,EAAE,aAAa,CAAC;IACrB,yDAAyD;IACzD,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mEAAmE;IACnE,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAClD,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,OAAO,CAI1F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,iBAAiB,CASxE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM9G;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAYxG"}
|