@geoly-ai/social-hub-sdk 0.1.19 → 0.1.21

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.
@@ -0,0 +1,49 @@
1
+ /**
2
+ * 派单(CyberRedd)品牌映射与接单团队的 SDK 类型(B4)。
3
+ * SDK 不依赖 contracts 包,类型在这里内联,与 `packages/contracts/src/intake-admin.ts` 同形
4
+ * (那边是权威定义;改契约时两边一起改)。路径是系统级 `/v1/system/intake-admin/*`,不拼 `/teams`;
5
+ * 仅不受限登录的 admin 可用(API key / 服务凭据 / 受限 CLI token 全 403)。
6
+ */
7
+ export type IntakeMappingStatus = "active" | "disabled";
8
+ export type IntakeBrandMapping = {
9
+ id: string;
10
+ externalBrandRef: string;
11
+ externalBrandName: string;
12
+ /** null = 已登记待映射。 */
13
+ brandId: string | null;
14
+ eligibleTeamIds: string[];
15
+ status: IntakeMappingStatus;
16
+ /** 乐观锁:PATCH 必带。 */
17
+ rowVersion: number;
18
+ unmappedAlertState: "none" | "pending" | "sent";
19
+ createdBy: string | null;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ };
23
+ export type ListIntakeBrandMappingsParams = {
24
+ status?: IntakeMappingStatus;
25
+ mapped?: "mapped" | "pending";
26
+ limit?: number;
27
+ offset?: number;
28
+ };
29
+ export type ListIntakeBrandMappingsResponse = {
30
+ items: IntakeBrandMapping[];
31
+ total: number;
32
+ limit: number;
33
+ offset: number;
34
+ hasMore: boolean;
35
+ };
36
+ export type UpdateIntakeBrandMappingInput = {
37
+ rowVersion: number;
38
+ brandId?: string | null;
39
+ eligibleTeamIds?: string[];
40
+ status?: IntakeMappingStatus;
41
+ externalBrandName?: string;
42
+ };
43
+ export type IntakeOrderTeam = {
44
+ teamId: string | null;
45
+ teamName: string | null;
46
+ status: "ok" | "missing" | "invalid" | "team_not_found";
47
+ updatedAt: string | null;
48
+ };
49
+ //# sourceMappingURL=intake-admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-admin.d.ts","sourceRoot":"","sources":["../src/intake-admin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAChD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAC;IACxD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 派单(CyberRedd)品牌映射与接单团队的 SDK 类型(B4)。
3
+ * SDK 不依赖 contracts 包,类型在这里内联,与 `packages/contracts/src/intake-admin.ts` 同形
4
+ * (那边是权威定义;改契约时两边一起改)。路径是系统级 `/v1/system/intake-admin/*`,不拼 `/teams`;
5
+ * 仅不受限登录的 admin 可用(API key / 服务凭据 / 受限 CLI token 全 403)。
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=intake-admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-admin.js","sourceRoot":"","sources":["../src/intake-admin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=intake-admin.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-admin.test.d.ts","sourceRoot":"","sources":["../src/intake-admin.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ /** 派单管理面 SDK:URL / 方法 / body 原样映射(系统级路径,不拼 /teams)。 */
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { SocialHubClient } from "./index.js";
4
+ const ID = "3f1c2b1e-6a2a-4a5a-9a1a-2b3c4d5e6f70";
5
+ const TEAM = "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa";
6
+ describe("intake admin SDK", () => {
7
+ const fetchMock = vi.fn();
8
+ beforeEach(() => {
9
+ fetchMock.mockResolvedValue({
10
+ ok: true,
11
+ status: 200,
12
+ headers: { get: () => null },
13
+ text: async () => JSON.stringify({ ok: true }),
14
+ });
15
+ vi.stubGlobal("fetch", fetchMock);
16
+ });
17
+ afterEach(() => {
18
+ vi.unstubAllGlobals();
19
+ fetchMock.mockReset();
20
+ });
21
+ const client = () => new SocialHubClient({
22
+ baseUrl: "https://hub.test",
23
+ apiKey: "sk_live_abc_def",
24
+ });
25
+ const call = (i = 0) => {
26
+ const [url, init] = fetchMock.mock.calls[i];
27
+ return {
28
+ url: new URL(url),
29
+ method: init?.method ?? "GET",
30
+ body: init?.body ? JSON.parse(init.body) : undefined,
31
+ };
32
+ };
33
+ it("list:query 原样,路径系统级", async () => {
34
+ await client().listIntakeBrandMappings({
35
+ mapped: "pending",
36
+ status: "active",
37
+ limit: 20,
38
+ offset: 40,
39
+ });
40
+ const { url, method } = call();
41
+ expect(method).toBe("GET");
42
+ expect(url.pathname).toBe("/v1/system/intake-admin/brand-mappings");
43
+ expect(url.searchParams.get("mapped")).toBe("pending");
44
+ expect(url.searchParams.get("status")).toBe("active");
45
+ expect(url.searchParams.get("limit")).toBe("20");
46
+ expect(url.searchParams.get("offset")).toBe("40");
47
+ });
48
+ it("get / update:id 转义,PATCH body 带 rowVersion", async () => {
49
+ await client().getIntakeBrandMapping(ID);
50
+ expect(call(0).url.pathname).toBe(`/v1/system/intake-admin/brand-mappings/${ID}`);
51
+ await client().updateIntakeBrandMapping(ID, {
52
+ rowVersion: 3,
53
+ status: "disabled",
54
+ });
55
+ expect(call(1).method).toBe("PATCH");
56
+ expect(call(1).body).toEqual({ rowVersion: 3, status: "disabled" });
57
+ });
58
+ it("order-team:GET / PUT { teamId }", async () => {
59
+ await client().getIntakeOrderTeam();
60
+ expect(call(0).url.pathname).toBe("/v1/system/intake-admin/order-team");
61
+ expect(call(0).method).toBe("GET");
62
+ await client().setIntakeOrderTeam(TEAM);
63
+ expect(call(1).method).toBe("PUT");
64
+ expect(call(1).body).toEqual({ teamId: TEAM });
65
+ });
66
+ });
67
+ //# sourceMappingURL=intake-admin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-admin.test.js","sourceRoot":"","sources":["../src/intake-admin.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * 派单(CyberRedd)运营面的 SDK 类型(B5-ext E3)。
3
+ * SDK 不依赖 contracts 包,类型在这里内联,与 `packages/contracts/src/intake-ops.ts` 同形
4
+ * (那边是权威定义;改契约时两边一起改)。仅两处有意放宽为开放类型:线程语境 snapshot(`Record<string, unknown>`,形状由服务端校验)、
5
+ * 审核摘要的 `status` / `identity.code`(审核域的枚举不属于本契约)。路径是系统级 `/v1/system/intake-ops/*`,不拼 `/teams`;
6
+ * 准入 = admin,或全局 manager 且是接单团队的真实 active 成员;API key / 服务凭据 / 受限 CLI token 全 403。
7
+ * 订单标识一律用 `hubRef`;所有写入口(异常登记除外,它可选)带 `rowVersion`(乐观锁,409 ROW_VERSION_CONFLICT = 过期)。
8
+ */
9
+ export type IntakeOpsOrderStatus = "received" | "accepted" | "rejected" | "scheduled" | "executing" | "published" | "failed" | "withdrawn" | "removed" | "deleted";
10
+ export type IntakeOpsKind = "reply" | "post" | "koc_campaign";
11
+ export type IntakeOpsOrderReasonCode = "TARGET_BLOCKED" | "NO_ELIGIBLE_ACCOUNT" | "RULES_VIOLATION" | "REVIEW_REJECTED" | "DEADLINE_AT_RISK" | "DEADLINE_MISSED" | "BRAND_UNMAPPED" | "EXECUTION_UNCONFIRMED" | "REMOVED_BY_MOD" | "ACCOUNT_SUSPENDED";
12
+ export type IntakeOpsCheckCode = "BRAND_UNRESOLVED" | "THREAD_CONTEXT_MISSING" | "THREAD_CONTEXT_PENDING" | "THREAD_CONTEXT_MANUAL_REQUIRED" | "THREAD_CONTEXT_BLOCKED" | "THREAD_LOCK_UNKNOWN" | "THREAD_CONTEXT_EMPTY" | "SUBREDDIT_RESTRICTED";
13
+ export type IntakeOpsDeliveryChannel = "internal" | "external_manual";
14
+ export type IntakeOpsLockStatus = "unlocked" | "locked" | "unknown";
15
+ export type IntakeOpsThreadContextState = "pending" | "ok" | "blocked_deleted" | "blocked_locked" | "manual_required" | "manual_provided" | "missing";
16
+ export type IntakeOpsRejectReasonCode = "TARGET_BLOCKED" | "NO_ELIGIBLE_ACCOUNT" | "RULES_VIOLATION";
17
+ export type IntakeOpsFailReasonCode = "TARGET_BLOCKED" | "RULES_VIOLATION" | "REVIEW_REJECTED";
18
+ export type IntakeOpsAnomalyReasonCode = "REVIEW_NOT_PASSED" | "DISCLOSURE_MISSING" | "ORDER_CLOSED" | "CONTENT_UNREVIEWED" | "OTHER";
19
+ export type IntakeOpsAction = "accept" | "reject" | "provide_thread_context" | "edit_draft" | "schedule" | "re_review" | "start" | "confirm_published" | "fail" | "register_anomaly";
20
+ export type ListIntakeOpsOrdersParams = {
21
+ status?: IntakeOpsOrderStatus;
22
+ kind?: IntakeOpsKind;
23
+ deliveryChannel?: IntakeOpsDeliveryChannel;
24
+ brandId?: string;
25
+ limit?: number;
26
+ offset?: number;
27
+ };
28
+ export type IntakeOpsOrderListItem = {
29
+ hubRef: string;
30
+ orderId: string;
31
+ kind: IntakeOpsKind;
32
+ status: IntakeOpsOrderStatus;
33
+ deliveryChannel: IntakeOpsDeliveryChannel | null;
34
+ rowVersion: number;
35
+ receivedAt: string;
36
+ deadlineAt: string;
37
+ brandId: string | null;
38
+ brandRef: string | null;
39
+ brandName: string | null;
40
+ subreddit: string | null;
41
+ contentType: "post" | "comment" | null;
42
+ bodyInvalid: boolean;
43
+ threadContextState: IntakeOpsThreadContextState | null;
44
+ lockStatus: IntakeOpsLockStatus | null;
45
+ /** true = Hub 没识别锁定 / 归档,接单前必须人工核实线程。 */
46
+ lockVerificationRequired: boolean;
47
+ };
48
+ export type ListIntakeOpsOrdersResponse = {
49
+ items: IntakeOpsOrderListItem[];
50
+ total: number;
51
+ limit: number;
52
+ offset: number;
53
+ hasMore: boolean;
54
+ };
55
+ export type IntakeOpsThreadContextSnapshot = Record<string, unknown>;
56
+ export type IntakeOpsOrderDetail = {
57
+ order: {
58
+ hubRef: string;
59
+ orderId: string;
60
+ kind: IntakeOpsKind;
61
+ status: IntakeOpsOrderStatus;
62
+ statusReasonCode: IntakeOpsOrderReasonCode | null;
63
+ deliveryChannel: IntakeOpsDeliveryChannel | null;
64
+ rowVersion: number;
65
+ receivedAt: string;
66
+ earliestAt: string;
67
+ deadlineAt: string;
68
+ acceptedAt: string | null;
69
+ scheduledAt: string | null;
70
+ executingAt: string | null;
71
+ terminalAt: string | null;
72
+ externalManualNote: string | null;
73
+ result: {
74
+ permalink: string;
75
+ postedAt: string;
76
+ accountRef: string;
77
+ finalBody: string;
78
+ repostRequired: boolean;
79
+ } | null;
80
+ };
81
+ brand: {
82
+ ref: string;
83
+ name: string;
84
+ brandId: string | null;
85
+ mapping: "mapped" | "unmapped";
86
+ };
87
+ content: {
88
+ contentVersion: number;
89
+ edited: boolean;
90
+ contentType: "post" | "comment";
91
+ title: string | null;
92
+ body: string;
93
+ disclosure: {
94
+ required: boolean;
95
+ text: string | null;
96
+ };
97
+ };
98
+ target: {
99
+ subreddit: string;
100
+ threadId: string | null;
101
+ parentCommentId: string | null;
102
+ threadPermalink: string | null;
103
+ };
104
+ accountRequirements: {
105
+ tier: string;
106
+ minAgeDays: number;
107
+ minKarma: number;
108
+ };
109
+ contactNote: string | null;
110
+ threadContext: {
111
+ state: IntakeOpsThreadContextState;
112
+ lockStatus: IntakeOpsLockStatus | null;
113
+ lockVerificationRequired: boolean;
114
+ lastErrorKind: string | null;
115
+ fetchedAt: string | null;
116
+ providedBy: string | null;
117
+ manualAlertDueAt: string | null;
118
+ snapshot: IntakeOpsThreadContextSnapshot | null;
119
+ } | null;
120
+ review: {
121
+ targetId: string;
122
+ status: string;
123
+ degradedKind: "retryable" | "permanent" | null;
124
+ contentVersion: number;
125
+ attempt: number | null;
126
+ identity: {
127
+ ok: boolean;
128
+ code: string | null;
129
+ };
130
+ } | null;
131
+ anomalies: Array<{
132
+ id: string;
133
+ reasonCode: IntakeOpsAnomalyReasonCode;
134
+ permalink: string;
135
+ postedAt: string;
136
+ registeredAt: string;
137
+ matchesOrderTarget: boolean;
138
+ }>;
139
+ checks: Array<{
140
+ code: IntakeOpsCheckCode;
141
+ level: "block" | "ack_required" | "info";
142
+ message: string;
143
+ }>;
144
+ allowedActions: IntakeOpsAction[];
145
+ };
146
+ /** 写入口的统一响应:重读后的订单详情。 */
147
+ export type IntakeOpsOrderResponse = {
148
+ order: IntakeOpsOrderDetail;
149
+ };
150
+ export type ProvideIntakeThreadContextInput = {
151
+ snapshot: IntakeOpsThreadContextSnapshot;
152
+ /** 只收 unlocked / unknown;locked 的单应 reject(TARGET_BLOCKED)。 */
153
+ lockStatus: "unlocked" | "unknown";
154
+ /** accepted 态写入 unknown 必须显式确认。 */
155
+ acknowledgements?: {
156
+ unknownThreadLock?: true;
157
+ };
158
+ rowVersion: number;
159
+ };
160
+ export type AcceptIntakeOrderInput = {
161
+ channel: IntakeOpsDeliveryChannel;
162
+ note?: string;
163
+ /** lock_status=unknown 的 reply 单必须带 { unknownThreadLock: true }。 */
164
+ acknowledgements?: {
165
+ unknownThreadLock?: true;
166
+ };
167
+ rowVersion: number;
168
+ };
169
+ export type RejectIntakeOrderInput = {
170
+ reasonCode: IntakeOpsRejectReasonCode;
171
+ /** 只进审计,不进对外事件。 */
172
+ internalNote?: string;
173
+ rowVersion: number;
174
+ };
175
+ export type EditIntakeOrderDraftInput = {
176
+ title?: string | null;
177
+ body: string;
178
+ rowVersion: number;
179
+ };
180
+ export type ScheduleIntakeOrderInput = {
181
+ /** ISO-8601 UTC 时刻。 */
182
+ plannedAt: string;
183
+ rowVersion: number;
184
+ };
185
+ export type ReReviewIntakeOrderInput = {
186
+ reason: string;
187
+ rowVersion: number;
188
+ };
189
+ export type StartIntakeOrderInput = {
190
+ rowVersion: number;
191
+ };
192
+ export type ConfirmIntakeOrderPublishedInput = {
193
+ permalink: string;
194
+ postedAt: string;
195
+ finalBody: string;
196
+ finalTitle?: string;
197
+ executedBy?: string;
198
+ /** 偏离审过内容必须显式 ack(acknowledged:true + note),否则 CONTENT_DRIFT。 */
199
+ contentDeviation?: {
200
+ acknowledged: true;
201
+ note: string;
202
+ };
203
+ rowVersion: number;
204
+ };
205
+ export type FailIntakeOrderInput = {
206
+ reasonCode: IntakeOpsFailReasonCode;
207
+ /** 运营声明「帖子当前不在 Reddit 上」,必须字面 true。 */
208
+ confirmNotPublished: true;
209
+ internalNote?: string;
210
+ rowVersion: number;
211
+ };
212
+ export type RegisterIntakeOrderAnomalyInput = {
213
+ reasonCode: IntakeOpsAnomalyReasonCode;
214
+ permalink: string;
215
+ postedAt: string;
216
+ finalBody?: string;
217
+ /** reasonCode=OTHER 时必填。 */
218
+ note?: string;
219
+ /** 可选;提供则仍比对。 */
220
+ rowVersion?: number;
221
+ };
222
+ export type RegisterIntakeOrderAnomalyResponse = {
223
+ created: boolean;
224
+ anomalyId: string;
225
+ order: IntakeOpsOrderDetail;
226
+ };
227
+ //# sourceMappingURL=intake-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-ops.d.ts","sourceRoot":"","sources":["../src/intake-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 派单(CyberRedd)运营面的 SDK 类型(B5-ext E3)。
3
+ * SDK 不依赖 contracts 包,类型在这里内联,与 `packages/contracts/src/intake-ops.ts` 同形
4
+ * (那边是权威定义;改契约时两边一起改)。仅两处有意放宽为开放类型:线程语境 snapshot(`Record<string, unknown>`,形状由服务端校验)、
5
+ * 审核摘要的 `status` / `identity.code`(审核域的枚举不属于本契约)。路径是系统级 `/v1/system/intake-ops/*`,不拼 `/teams`;
6
+ * 准入 = admin,或全局 manager 且是接单团队的真实 active 成员;API key / 服务凭据 / 受限 CLI token 全 403。
7
+ * 订单标识一律用 `hubRef`;所有写入口(异常登记除外,它可选)带 `rowVersion`(乐观锁,409 ROW_VERSION_CONFLICT = 过期)。
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=intake-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-ops.js","sourceRoot":"","sources":["../src/intake-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=intake-ops.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-ops.test.d.ts","sourceRoot":"","sources":["../src/intake-ops.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ /** 派单运营面 SDK:每个方法钉死 method + 完整 path(toBe)+ body。系统级路径,不拼 /teams。 */
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { SocialHubClient } from "./index.js";
4
+ const HUB = "3f1c2b1e-6a2a-4a5a-9a1a-2b3c4d5e6f70";
5
+ const BASE = `/v1/system/intake-ops/orders/${HUB}`;
6
+ describe("intake ops SDK", () => {
7
+ const fetchMock = vi.fn();
8
+ beforeEach(() => {
9
+ fetchMock.mockResolvedValue({
10
+ ok: true,
11
+ status: 200,
12
+ headers: { get: () => null },
13
+ text: async () => JSON.stringify({ ok: true }),
14
+ });
15
+ vi.stubGlobal("fetch", fetchMock);
16
+ });
17
+ afterEach(() => {
18
+ vi.unstubAllGlobals();
19
+ fetchMock.mockReset();
20
+ });
21
+ const client = () => new SocialHubClient({
22
+ baseUrl: "https://hub.test",
23
+ apiKey: "sk_live_abc_def",
24
+ });
25
+ const call = (i = 0) => {
26
+ const [url, init] = fetchMock.mock.calls[i];
27
+ return {
28
+ url: new URL(url),
29
+ method: init?.method ?? "GET",
30
+ body: init?.body ? JSON.parse(init.body) : undefined,
31
+ };
32
+ };
33
+ it("list:GET /orders + query 原样", async () => {
34
+ await client().listIntakeOpsOrders({
35
+ status: "accepted",
36
+ kind: "reply",
37
+ deliveryChannel: "external_manual",
38
+ brandId: HUB,
39
+ limit: 20,
40
+ offset: 40,
41
+ });
42
+ const { url, method } = call();
43
+ expect(method).toBe("GET");
44
+ expect(url.pathname).toBe("/v1/system/intake-ops/orders");
45
+ expect(url.searchParams.get("status")).toBe("accepted");
46
+ expect(url.searchParams.get("kind")).toBe("reply");
47
+ expect(url.searchParams.get("deliveryChannel")).toBe("external_manual");
48
+ expect(url.searchParams.get("brandId")).toBe(HUB);
49
+ expect(url.searchParams.get("limit")).toBe("20");
50
+ expect(url.searchParams.get("offset")).toBe("40");
51
+ });
52
+ it("list:无参不带 query", async () => {
53
+ await client().listIntakeOpsOrders();
54
+ expect(call().url.pathname + call().url.search).toBe("/v1/system/intake-ops/orders");
55
+ });
56
+ it("get:GET /orders/:hubRef", async () => {
57
+ await client().getIntakeOpsOrder(HUB);
58
+ expect(call().method).toBe("GET");
59
+ expect(call().url.pathname).toBe(BASE);
60
+ expect(call().body).toBeUndefined();
61
+ });
62
+ it("provideIntakeThreadContext:POST /thread-context", async () => {
63
+ const body = {
64
+ snapshot: { postTitle: "t" },
65
+ lockStatus: "unlocked",
66
+ rowVersion: 2,
67
+ };
68
+ await client().provideIntakeThreadContext(HUB, body);
69
+ expect(call().method).toBe("POST");
70
+ expect(call().url.pathname).toBe(`${BASE}/thread-context`);
71
+ expect(call().body).toEqual(body);
72
+ });
73
+ it("accept:POST /accept", async () => {
74
+ const body = {
75
+ channel: "external_manual",
76
+ acknowledgements: { unknownThreadLock: true },
77
+ rowVersion: 3,
78
+ };
79
+ await client().acceptIntakeOrder(HUB, body);
80
+ expect(call().method).toBe("POST");
81
+ expect(call().url.pathname).toBe(`${BASE}/accept`);
82
+ expect(call().body).toEqual(body);
83
+ });
84
+ it("reject:POST /reject", async () => {
85
+ const body = { reasonCode: "TARGET_BLOCKED", rowVersion: 3 };
86
+ await client().rejectIntakeOrder(HUB, body);
87
+ expect(call().method).toBe("POST");
88
+ expect(call().url.pathname).toBe(`${BASE}/reject`);
89
+ expect(call().body).toEqual(body);
90
+ });
91
+ it("editIntakeOrderDraft:PUT /draft", async () => {
92
+ const body = { title: null, body: "new body", rowVersion: 4 };
93
+ await client().editIntakeOrderDraft(HUB, body);
94
+ expect(call().method).toBe("PUT");
95
+ expect(call().url.pathname).toBe(`${BASE}/draft`);
96
+ expect(call().body).toEqual(body);
97
+ });
98
+ it("schedule:POST /schedule", async () => {
99
+ const body = { plannedAt: "2026-11-10T08:00:00.000Z", rowVersion: 5 };
100
+ await client().scheduleIntakeOrder(HUB, body);
101
+ expect(call().method).toBe("POST");
102
+ expect(call().url.pathname).toBe(`${BASE}/schedule`);
103
+ expect(call().body).toEqual(body);
104
+ });
105
+ it("re-review:POST /re-review", async () => {
106
+ const body = { reason: "edited disclosure", rowVersion: 6 };
107
+ await client().reReviewIntakeOrder(HUB, body);
108
+ expect(call().method).toBe("POST");
109
+ expect(call().url.pathname).toBe(`${BASE}/re-review`);
110
+ expect(call().body).toEqual(body);
111
+ });
112
+ it("start:POST /start", async () => {
113
+ await client().startIntakeOrder(HUB, { rowVersion: 7 });
114
+ expect(call().method).toBe("POST");
115
+ expect(call().url.pathname).toBe(`${BASE}/start`);
116
+ expect(call().body).toEqual({ rowVersion: 7 });
117
+ });
118
+ it("confirm-published:POST /confirm-published", async () => {
119
+ const body = {
120
+ permalink: "https://www.reddit.com/r/x/comments/abc/t/def/",
121
+ postedAt: "2026-11-10T09:00:00.000Z",
122
+ finalBody: "body",
123
+ contentDeviation: { acknowledged: true, note: "typo" },
124
+ rowVersion: 8,
125
+ };
126
+ await client().confirmIntakeOrderPublished(HUB, body);
127
+ expect(call().method).toBe("POST");
128
+ expect(call().url.pathname).toBe(`${BASE}/confirm-published`);
129
+ expect(call().body).toEqual(body);
130
+ });
131
+ it("fail:POST /fail", async () => {
132
+ const body = {
133
+ reasonCode: "REVIEW_REJECTED",
134
+ confirmNotPublished: true,
135
+ rowVersion: 9,
136
+ };
137
+ await client().failIntakeOrder(HUB, body);
138
+ expect(call().method).toBe("POST");
139
+ expect(call().url.pathname).toBe(`${BASE}/fail`);
140
+ expect(call().body).toEqual(body);
141
+ });
142
+ it("anomalies:POST /anomalies,rowVersion 可省", async () => {
143
+ const body = {
144
+ reasonCode: "REVIEW_NOT_PASSED",
145
+ permalink: "https://www.reddit.com/r/x/comments/abc/t/",
146
+ postedAt: "2026-11-10T09:00:00.000Z",
147
+ };
148
+ await client().registerIntakeOrderAnomaly(HUB, body);
149
+ expect(call().method).toBe("POST");
150
+ expect(call().url.pathname).toBe(`${BASE}/anomalies`);
151
+ expect(call().body).toEqual(body);
152
+ });
153
+ it("hubRef 会被转义,不能逃出路径段", async () => {
154
+ await client().getIntakeOpsOrder("a/b");
155
+ expect(call().url.pathname).toBe("/v1/system/intake-ops/orders/a%2Fb");
156
+ });
157
+ });
158
+ //# sourceMappingURL=intake-ops.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-ops.test.js","sourceRoot":"","sources":["../src/intake-ops.test.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,GAAG,GAAG,sCAAsC,CAAC;AACnD,MAAM,IAAI,GAAG,gCAAgC,GAAG,EAAE,CAAC;AAEnD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1B,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,CAAC,iBAAiB,CAAC;YAC1B,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;YAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;SAC/C,CAAC,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,SAAS,CAAC,SAAS,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,IAAI,eAAe,CAAC;QAClB,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,iBAAiB;KAC1B,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE;QACrB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA2B,CAAC;QACtE,OAAO;YACL,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC;YACjB,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK;YAC7B,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/D,CAAC;IACJ,CAAC,CAAC;IAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,EAAE,CAAC,mBAAmB,CAAC;YACjC,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,iBAAiB;YAClC,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,EAAE,CAAC,mBAAmB,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAClD,8BAA8B,CAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,IAAI,GAAG;YACX,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;YAC5B,UAAU,EAAE,UAAmB;YAC/B,UAAU,EAAE,CAAC;SACd,CAAC;QACF,MAAM,MAAM,EAAE,CAAC,0BAA0B,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,iBAA0B;YACnC,gBAAgB,EAAE,EAAE,iBAAiB,EAAE,IAAa,EAAE;YACtD,UAAU,EAAE,CAAC;SACd,CAAC;QACF,MAAM,MAAM,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,EAAE,UAAU,EAAE,gBAAyB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,0BAA0B,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QAC5D,MAAM,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,IAAI,GAAG;YACX,SAAS,EAAE,gDAAgD;YAC3D,QAAQ,EAAE,0BAA0B;YACpC,SAAS,EAAE,MAAM;YACjB,gBAAgB,EAAE,EAAE,YAAY,EAAE,IAAa,EAAE,IAAI,EAAE,MAAM,EAAE;YAC/D,UAAU,EAAE,CAAC;SACd,CAAC;QACF,MAAM,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,IAAI,GAAG;YACX,UAAU,EAAE,iBAA0B;YACtC,mBAAmB,EAAE,IAAa;YAClC,UAAU,EAAE,CAAC;SACd,CAAC;QACF,MAAM,MAAM,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,GAAG;YACX,UAAU,EAAE,mBAA4B;YACxC,SAAS,EAAE,4CAA4C;YACvD,QAAQ,EAAE,0BAA0B;SACrC,CAAC;QACF,MAAM,MAAM,EAAE,CAAC,0BAA0B,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,MAAM,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoly-ai/social-hub-sdk",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "type": "module",
5
5
  "description": "HTTP client for Social Ops Hub API",
6
6
  "repository": {