@teamlearners/clawops 0.34.0 → 0.35.0
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/README.md +53 -5
- package/dist/agent/index.cjs +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/{chunk-QNWXGJTJ.js → chunk-M6BYGYJO.js} +3 -3
- package/dist/{chunk-QNWXGJTJ.js.map → chunk-M6BYGYJO.js.map} +1 -1
- package/dist/{chunk-2IHVQDIP.cjs → chunk-NT6ZS3TQ.cjs} +3 -3
- package/dist/{chunk-2IHVQDIP.cjs.map → chunk-NT6ZS3TQ.cjs.map} +1 -1
- package/dist/index.cjs +8 -8
- package/dist/index.js +2 -2
- package/dist/solapi/index.cjs +26 -4
- package/dist/solapi/index.cjs.map +1 -1
- package/dist/solapi/index.d.cts +21 -8
- package/dist/solapi/index.d.ts +21 -8
- package/dist/solapi/index.js +26 -4
- package/dist/solapi/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -493,14 +493,35 @@ const messageService = new ClawOpsMessageService({
|
|
|
493
493
|
mode: 'sweep', // 리포트를 주기적으로 훑는다
|
|
494
494
|
intervalMs: 5 * 60_000, // 기본 5분
|
|
495
495
|
lookbackMs: 60 * 60_000, // 커서가 없을 때 거슬러 볼 구간. 기본 1시간
|
|
496
|
-
|
|
496
|
+
except: RECOMMENDED_EXCLUDED_CODES, // 기본은 3XXX 전부. 덮으면 안 되는 것만 뺀다
|
|
497
497
|
types: ['ATA'], // 훑을 타입. 친구톡까지 보려면 ['ATA','CTA','CTI']
|
|
498
498
|
onFallback: (e) => logger.info({ messageId: e.messageId, statusCode: e.statusCode }, '대체발송'),
|
|
499
499
|
onBlocked: (e) => logger.warn({ messageId: e.messageId, reason: e.reason }, '대체발송 못 함'),
|
|
500
|
+
onError: (e) => logger.error({ err: e }, '스윕 실패'), // ← 지정하지 않으면 조용히 넘어갑니다
|
|
500
501
|
},
|
|
501
502
|
});
|
|
502
503
|
```
|
|
503
504
|
|
|
505
|
+
⚠️ **`onError` 를 지정하지 않으면 스윕이 통째로 실패해도 아무 소리가 나지 않습니다.** 솔라피
|
|
506
|
+
조회가 막히거나 자격증명이 만료되면 다음 주기에 다시 시도할 뿐이고, 그동안 대체발송은
|
|
507
|
+
한 건도 나가지 않습니다. 실패가 계속되면 **문자가 안 나가는데 로그도 조용한** 상태가 되므로,
|
|
508
|
+
운영에 올리실 때는 반드시 지정하십시오.
|
|
509
|
+
|
|
510
|
+
`onError` 는 스윕 **전체**가 실패했을 때만 불립니다. 개별 건의 실패는 `onBlocked` 로 갑니다
|
|
511
|
+
(문구를 만들지 못했거나 ClawOps 가 거절한 경우) — 한 건이 실패해도 나머지는 그대로 진행됩니다.
|
|
512
|
+
|
|
513
|
+
커서를 프로세스 밖에 보관하시려면 `initialCursor` 로 넣고 `onCursor` 로 받으십시오. 재시작 후
|
|
514
|
+
같은 구간을 다시 훑는 것을 줄여 줍니다(멱등키가 있어 중복 발송은 어차피 막히지만, 요청은 아낍니다).
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
fallback: {
|
|
518
|
+
enabled: true,
|
|
519
|
+
mode: 'sweep',
|
|
520
|
+
initialCursor: await loadCursor(), // 없으면 lookbackMs 만큼 거슬러 본다
|
|
521
|
+
onCursor: (cursor) => saveCursor(cursor), // 직렬화 가능한 값만 담겨 있습니다
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
504
525
|
**켜기만 하면 됩니다.** 커서·저장소·크론이 필요 없습니다. 발송할 때 `customFields` 에 마커를
|
|
505
526
|
심어 두고, 스윕이 그 마커가 있는 실패 건만 골라 문자를 보냅니다. 고객이 솔라피로 직접 보낸
|
|
506
527
|
알림톡은 마커가 없어 건드리지 않습니다.
|
|
@@ -513,10 +534,37 @@ const messageService = new ClawOpsMessageService({
|
|
|
513
534
|
ClawOps 가 대체 문자를 거절하면 `onBlocked` 에 `reason: 'send_rejected'` 로 알리고, 다음 스윕이
|
|
514
535
|
다시 시도합니다(멱등키가 같아 중복 발송은 되지 않습니다).
|
|
515
536
|
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
537
|
+
##### 어떤 코드를 대체발송할지
|
|
538
|
+
|
|
539
|
+
**기본은 3XXX 전부입니다.** 코드를 골라 담지 않았습니다 — 알림톡이라고 `31xx` 만 오는 게
|
|
540
|
+
아니기 때문입니다. 실측에서 알림톡 건에 `3058`(전송경로 없음)이 돌아왔습니다. 목록을 추리면
|
|
541
|
+
그렇게 새는 코드가 조용히 미발송이 됩니다.
|
|
542
|
+
|
|
543
|
+
대신 **문자로 덮으면 안 되는 코드가 섞여 있습니다.** `RECOMMENDED_EXCLUDED_CODES` 를
|
|
544
|
+
`except` 로 넘겨 빼시는 것을 권합니다.
|
|
545
|
+
|
|
546
|
+
| 군 | 코드 | 덮으면 생기는 일 |
|
|
547
|
+
|---|---|---|
|
|
548
|
+
| 수신거부 | `3061` | 080 수신거부한 분께 문자가 나갑니다 |
|
|
549
|
+
| 스팸·발신번호 변작 차단 | `3054` `3055` `3059` `3112` `3113` | 막힌 발송을 문자로 우회하는 셈이 됩니다 |
|
|
550
|
+
| 설정 오류 | `3013` `3101` `3103` `3105` `3106` `3109` `3117` | 전건이 실패하는데 문자가 덮어, 알림톡이 깨진 걸 오래 모르게 됩니다. 단가도 조용히 올라갑니다 |
|
|
551
|
+
| 시간 규제 | `3108` | 발송 가능 시간이 아닌데 문자로 나갑니다 |
|
|
552
|
+
|
|
553
|
+
```typescript
|
|
554
|
+
import { RECOMMENDED_EXCLUDED_CODES } from '@teamlearners/clawops/solapi';
|
|
555
|
+
|
|
556
|
+
fallback: {
|
|
557
|
+
enabled: true,
|
|
558
|
+
mode: 'sweep',
|
|
559
|
+
except: RECOMMENDED_EXCLUDED_CODES, // 권장 제외
|
|
560
|
+
// except: [...RECOMMENDED_EXCLUDED_CODES, '3032'], // 더 빼려면 이어 붙이십시오
|
|
561
|
+
}
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
`on` 은 반대로 **대상을 좁힙니다** — 주시면 그 코드만 나갑니다. `on` 으로 좁힌 뒤 `except` 로
|
|
565
|
+
다시 뺄 수도 있습니다. `on: []` 는 아무것도 보내지 않는다는 뜻이라 기본(전부)과 구별됩니다.
|
|
566
|
+
|
|
567
|
+
빠진 코드는 조용히 사라지지 않고 `onBlocked` 에 `reason: 'code_not_eligible'` 로 **알립니다.**
|
|
520
568
|
|
|
521
569
|
**상주 프로세스가 없다면**(서버리스·크론) 같은 일을 하는 함수를 직접 부르십시오.
|
|
522
570
|
|
package/dist/agent/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkNT6ZS3TQ_cjs = require('../chunk-NT6ZS3TQ.cjs');
|
|
4
4
|
var chunkTVDUOKJD_cjs = require('../chunk-TVDUOKJD.cjs');
|
|
5
5
|
var chunkQD2ZY4UP_cjs = require('../chunk-QD2ZY4UP.cjs');
|
|
6
6
|
var fs = require('fs');
|
|
@@ -729,7 +729,7 @@ var MAX_ERROR_MESSAGE_LENGTH = 200;
|
|
|
729
729
|
function getSdkInfo() {
|
|
730
730
|
return {
|
|
731
731
|
name: "clawops-node",
|
|
732
|
-
version:
|
|
732
|
+
version: chunkNT6ZS3TQ_cjs.VERSION,
|
|
733
733
|
runtime: `node/${process.versions.node}`,
|
|
734
734
|
os: `${process.platform}/${os__default.default.arch()}`
|
|
735
735
|
};
|
|
@@ -1474,7 +1474,7 @@ var ClawOpsAgent = class _ClawOpsAgent {
|
|
|
1474
1474
|
constructor(options) {
|
|
1475
1475
|
this._apiKey = options.apiKey ?? process.env["CLAWOPS_API_KEY"] ?? "";
|
|
1476
1476
|
this._accountId = options.accountId ?? process.env["CLAWOPS_ACCOUNT_ID"] ?? "";
|
|
1477
|
-
this._baseUrl = options.baseUrl ??
|
|
1477
|
+
this._baseUrl = options.baseUrl ?? chunkNT6ZS3TQ_cjs.DEFAULT_BASE_URL;
|
|
1478
1478
|
this._fromNumber = options.from;
|
|
1479
1479
|
this._session = options.session;
|
|
1480
1480
|
this._recording = options.recording ?? false;
|
package/dist/agent/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_BASE_URL, VERSION } from '../chunk-
|
|
1
|
+
import { DEFAULT_BASE_URL, VERSION } from '../chunk-M6BYGYJO.js';
|
|
2
2
|
import { AgentError, AgentConnectionError } from '../chunk-36JABW7P.js';
|
|
3
3
|
import { NOOP_LOGGER, resolveBuiltinTools, createAgentLogger, createPipelineLogger, BufferingCall, attachBuffered, ulawToPcm16, resamplePcm16, getBuiltinToolSchemas, BUILTIN_TOOL_NAMES, executeBuiltinTool, CALL_NOT_READY_RESULT, pcm16ToUlaw, applyUlawGain } from '../chunk-4YLSDMLL.js';
|
|
4
4
|
export { BUILTIN_TOOL_NAMES, BuiltinTool, DECODE_TABLE, createAgentLogger, createPipelineLogger, executeBuiltinTool, getBuiltinToolSchemas, isBuiltinTool, pcm16ToUlaw, resamplePcm16, ulawToPcm16 } from '../chunk-4YLSDMLL.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/version.ts
|
|
2
|
-
var VERSION = "0.
|
|
2
|
+
var VERSION = "0.35.0" ;
|
|
3
3
|
|
|
4
4
|
// src/constants.ts
|
|
5
5
|
var DEFAULT_BASE_URL = "https://api.claw-ops.com";
|
|
@@ -9,5 +9,5 @@ var INITIAL_RETRY_DELAY = 500;
|
|
|
9
9
|
var MAX_RETRY_DELAY = 8e3;
|
|
10
10
|
|
|
11
11
|
export { DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, INITIAL_RETRY_DELAY, MAX_RETRY_DELAY, VERSION };
|
|
12
|
-
//# sourceMappingURL=chunk-
|
|
13
|
-
//# sourceMappingURL=chunk-
|
|
12
|
+
//# sourceMappingURL=chunk-M6BYGYJO.js.map
|
|
13
|
+
//# sourceMappingURL=chunk-M6BYGYJO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/constants.ts"],"names":[],"mappings":";AAEO,IAAM,OAAA,GACT,QAAA;;;ACHG,IAAM,gBAAA,GAAmB;AACzB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB;AACxB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/constants.ts"],"names":[],"mappings":";AAEO,IAAM,OAAA,GACT,QAAA;;;ACHG,IAAM,gBAAA,GAAmB;AACzB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB;AACxB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB","file":"chunk-M6BYGYJO.js","sourcesContent":["declare const __PKG_VERSION__: string;\n\nexport const VERSION: string = typeof __PKG_VERSION__ !== 'undefined'\n ? __PKG_VERSION__\n : 'dev';\n","export const DEFAULT_BASE_URL = 'https://api.claw-ops.com';\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const DEFAULT_TIMEOUT = 600_000; // ms\nexport const INITIAL_RETRY_DELAY = 500; // ms\nexport const MAX_RETRY_DELAY = 8_000; // ms\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/version.ts
|
|
4
|
-
var VERSION = "0.
|
|
4
|
+
var VERSION = "0.35.0" ;
|
|
5
5
|
|
|
6
6
|
// src/constants.ts
|
|
7
7
|
var DEFAULT_BASE_URL = "https://api.claw-ops.com";
|
|
@@ -16,5 +16,5 @@ exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
|
|
|
16
16
|
exports.INITIAL_RETRY_DELAY = INITIAL_RETRY_DELAY;
|
|
17
17
|
exports.MAX_RETRY_DELAY = MAX_RETRY_DELAY;
|
|
18
18
|
exports.VERSION = VERSION;
|
|
19
|
-
//# sourceMappingURL=chunk-
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
19
|
+
//# sourceMappingURL=chunk-NT6ZS3TQ.cjs.map
|
|
20
|
+
//# sourceMappingURL=chunk-NT6ZS3TQ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/constants.ts"],"names":[],"mappings":";;;AAEO,IAAM,OAAA,GACT,QAAA;;;ACHG,IAAM,gBAAA,GAAmB;AACzB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB;AACxB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/constants.ts"],"names":[],"mappings":";;;AAEO,IAAM,OAAA,GACT,QAAA;;;ACHG,IAAM,gBAAA,GAAmB;AACzB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB;AACxB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB","file":"chunk-NT6ZS3TQ.cjs","sourcesContent":["declare const __PKG_VERSION__: string;\n\nexport const VERSION: string = typeof __PKG_VERSION__ !== 'undefined'\n ? __PKG_VERSION__\n : 'dev';\n","export const DEFAULT_BASE_URL = 'https://api.claw-ops.com';\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const DEFAULT_TIMEOUT = 600_000; // ms\nexport const INITIAL_RETRY_DELAY = 500; // ms\nexport const MAX_RETRY_DELAY = 8_000; // ms\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var chunkNT6ZS3TQ_cjs = require('./chunk-NT6ZS3TQ.cjs');
|
|
6
6
|
var chunkTVDUOKJD_cjs = require('./chunk-TVDUOKJD.cjs');
|
|
7
7
|
var zod = require('zod');
|
|
8
8
|
var crypto = require('crypto');
|
|
@@ -31,9 +31,9 @@ var APIClient = class {
|
|
|
31
31
|
_defaultHeaders;
|
|
32
32
|
constructor(options) {
|
|
33
33
|
this._apiKey = options.apiKey;
|
|
34
|
-
this._baseURL = validateBaseUrl((options.baseURL ??
|
|
35
|
-
this._maxRetries = options.maxRetries ??
|
|
36
|
-
this._timeout = options.timeout ??
|
|
34
|
+
this._baseURL = validateBaseUrl((options.baseURL ?? chunkNT6ZS3TQ_cjs.DEFAULT_BASE_URL).replace(/\/+$/, ""));
|
|
35
|
+
this._maxRetries = options.maxRetries ?? chunkNT6ZS3TQ_cjs.DEFAULT_MAX_RETRIES;
|
|
36
|
+
this._timeout = options.timeout ?? chunkNT6ZS3TQ_cjs.DEFAULT_TIMEOUT;
|
|
37
37
|
this._fetch = options.fetch ?? globalThis.fetch;
|
|
38
38
|
this._defaultHeaders = options.defaultHeaders ?? {};
|
|
39
39
|
}
|
|
@@ -42,7 +42,7 @@ var APIClient = class {
|
|
|
42
42
|
Authorization: `Bearer ${this._apiKey}`,
|
|
43
43
|
"Content-Type": "application/json",
|
|
44
44
|
Accept: "application/json",
|
|
45
|
-
"User-Agent": `claw-ops-node/${
|
|
45
|
+
"User-Agent": `claw-ops-node/${chunkNT6ZS3TQ_cjs.VERSION}`,
|
|
46
46
|
...this._defaultHeaders
|
|
47
47
|
};
|
|
48
48
|
if (extra) Object.assign(headers, extra);
|
|
@@ -124,7 +124,7 @@ var APIClient = class {
|
|
|
124
124
|
return status === 408 || status === 409 || status === 429 || status >= 500;
|
|
125
125
|
}
|
|
126
126
|
_retryDelay(retriesTaken) {
|
|
127
|
-
const delay = Math.min(
|
|
127
|
+
const delay = Math.min(chunkNT6ZS3TQ_cjs.INITIAL_RETRY_DELAY * 2 ** retriesTaken, chunkNT6ZS3TQ_cjs.MAX_RETRY_DELAY);
|
|
128
128
|
return delay * (1 + Math.random());
|
|
129
129
|
}
|
|
130
130
|
_sleep(ms) {
|
|
@@ -995,7 +995,7 @@ var ClawOps = class extends APIClient {
|
|
|
995
995
|
if (!accountId) {
|
|
996
996
|
throw new chunkTVDUOKJD_cjs.ClawOpsError("accountId\uB97C \uC9C0\uC815\uD558\uAC70\uB098 CLAWOPS_ACCOUNT_ID \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694.");
|
|
997
997
|
}
|
|
998
|
-
const baseURL = options.baseURL ?? process.env.CLAWOPS_BASE_URL ??
|
|
998
|
+
const baseURL = options.baseURL ?? process.env.CLAWOPS_BASE_URL ?? chunkNT6ZS3TQ_cjs.DEFAULT_BASE_URL;
|
|
999
999
|
super({
|
|
1000
1000
|
apiKey,
|
|
1001
1001
|
baseURL,
|
|
@@ -1046,7 +1046,7 @@ var client_default_default = ClawOps;
|
|
|
1046
1046
|
|
|
1047
1047
|
Object.defineProperty(exports, "VERSION", {
|
|
1048
1048
|
enumerable: true,
|
|
1049
|
-
get: function () { return
|
|
1049
|
+
get: function () { return chunkNT6ZS3TQ_cjs.VERSION; }
|
|
1050
1050
|
});
|
|
1051
1051
|
Object.defineProperty(exports, "APIConnectionError", {
|
|
1052
1052
|
enumerable: true,
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, VERSION, INITIAL_RETRY_DELAY, MAX_RETRY_DELAY } from './chunk-
|
|
2
|
-
export { VERSION } from './chunk-
|
|
1
|
+
import { DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, VERSION, INITIAL_RETRY_DELAY, MAX_RETRY_DELAY } from './chunk-M6BYGYJO.js';
|
|
2
|
+
export { VERSION } from './chunk-M6BYGYJO.js';
|
|
3
3
|
import { APITimeoutError, APIConnectionError, makeStatusError, APIResponseValidationError, ClawOpsError } from './chunk-36JABW7P.js';
|
|
4
4
|
export { APIConnectionError, APIError, APIResponseValidationError, APIStatusError, APITimeoutError, AgentConnectionError, AgentError, AuthenticationError, BadRequestError, ClawOpsError, ConflictError, InternalServerError, NotFoundError, PermissionDeniedError, RateLimitError, ServiceUnavailableError, SolapiBridgeError, UnprocessableEntityError } from './chunk-36JABW7P.js';
|
|
5
5
|
import { z } from 'zod';
|
package/dist/solapi/index.cjs
CHANGED
|
@@ -128,7 +128,27 @@ async function deliverFallback(request, solapi, context) {
|
|
|
128
128
|
// src/solapi/sweep.ts
|
|
129
129
|
var FALLBACK_MARKER_FIELD = "clawopsFallback";
|
|
130
130
|
var FALLBACK_MARKER_VALUE = "1";
|
|
131
|
-
var
|
|
131
|
+
var RECOMMENDED_EXCLUDED_CODES = [
|
|
132
|
+
// 수신거부 — 문자로 대체하면 거부한 사람에게 보내는 것이 된다
|
|
133
|
+
"3061",
|
|
134
|
+
// 스팸·발신번호 변작 차단 — 막힌 발송을 문자로 우회하는 셈이 된다
|
|
135
|
+
"3054",
|
|
136
|
+
"3055",
|
|
137
|
+
"3059",
|
|
138
|
+
"3112",
|
|
139
|
+
"3113",
|
|
140
|
+
// 설정 오류 — 전건이 실패한다. 문자가 덮으면 알림톡이 깨진 걸 몇 달간 모르고,
|
|
141
|
+
// 단가도 알림톡에서 문자로 조용히 올라간다
|
|
142
|
+
"3013",
|
|
143
|
+
"3101",
|
|
144
|
+
"3103",
|
|
145
|
+
"3105",
|
|
146
|
+
"3106",
|
|
147
|
+
"3109",
|
|
148
|
+
"3117",
|
|
149
|
+
// 발송 가능 시간이 아님 — 문자로 대체하면 야간 발송이 된다
|
|
150
|
+
"3108"
|
|
151
|
+
];
|
|
132
152
|
var DEFAULT_SWEEP_TYPES = ["ATA"];
|
|
133
153
|
var DELIVERY_FAILURE = /^3\d{3}$/;
|
|
134
154
|
var IN_FLIGHT_CODE = "3000";
|
|
@@ -138,7 +158,8 @@ var MAX_PAGES = 50;
|
|
|
138
158
|
var firstRecipient = (to) => Array.isArray(to) ? to[0] : to;
|
|
139
159
|
var timeOf = (row) => row.dateUpdated ?? row.dateCreated;
|
|
140
160
|
async function sweepFailedAlimtalk(options) {
|
|
141
|
-
const targets = new Set(options.on
|
|
161
|
+
const targets = options.on ? new Set(options.on) : null;
|
|
162
|
+
const excluded = new Set(options.except ?? []);
|
|
142
163
|
const boundary = new Set(options.cursor?.seen ?? []);
|
|
143
164
|
const templateCache = options.templateCache ?? /* @__PURE__ */ new Map();
|
|
144
165
|
const window = options.lookbackMs ?? DEFAULT_LOOKBACK_MS;
|
|
@@ -181,7 +202,7 @@ async function sweepFailedAlimtalk(options) {
|
|
|
181
202
|
if (row.customFields?.[FALLBACK_MARKER_FIELD] !== FALLBACK_MARKER_VALUE) continue;
|
|
182
203
|
const code = String(row.statusCode ?? "");
|
|
183
204
|
if (code === IN_FLIGHT_CODE || !DELIVERY_FAILURE.test(code)) continue;
|
|
184
|
-
if (!targets.has(code)) {
|
|
205
|
+
if (targets !== null && !targets.has(code) || excluded.has(code)) {
|
|
185
206
|
ineligible.push(row);
|
|
186
207
|
continue;
|
|
187
208
|
}
|
|
@@ -583,6 +604,7 @@ function startSweepLoop(options, sweep, solapi, templateCache) {
|
|
|
583
604
|
cursor,
|
|
584
605
|
lookbackMs: sweep.lookbackMs,
|
|
585
606
|
on: sweep.on,
|
|
607
|
+
except: sweep.except,
|
|
586
608
|
types: sweep.types,
|
|
587
609
|
fallbackField: sweep.field,
|
|
588
610
|
concurrency: options.concurrency,
|
|
@@ -653,9 +675,9 @@ Object.defineProperty(exports, "SolapiBridgeError", {
|
|
|
653
675
|
});
|
|
654
676
|
exports.CLAWOPS_FAILURE_STATUS_CODE = CLAWOPS_FAILURE_STATUS_CODE;
|
|
655
677
|
exports.ClawOpsMessageService = ClawOpsMessageService;
|
|
656
|
-
exports.DEFAULT_FALLBACK_CODES = DEFAULT_FALLBACK_CODES;
|
|
657
678
|
exports.DEFAULT_FALLBACK_FIELD = DEFAULT_FALLBACK_FIELD;
|
|
658
679
|
exports.FALLBACK_MARKER_FIELD = FALLBACK_MARKER_FIELD;
|
|
680
|
+
exports.RECOMMENDED_EXCLUDED_CODES = RECOMMENDED_EXCLUDED_CODES;
|
|
659
681
|
exports.resolveFallbackText = resolveFallbackText;
|
|
660
682
|
exports.sweepFailedAlimtalk = sweepFailedAlimtalk;
|
|
661
683
|
//# sourceMappingURL=index.cjs.map
|