@teamlearners/clawops 0.39.0 → 0.41.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.
Files changed (34) hide show
  1. package/README.md +60 -0
  2. package/dist/agent/index.cjs +77 -77
  3. package/dist/agent/index.js +4 -4
  4. package/dist/agent/livekit/index.cjs +9 -9
  5. package/dist/agent/livekit/index.js +2 -2
  6. package/dist/{chunk-UOUNMCXE.cjs → chunk-7ZFSDBM6.cjs} +4 -4
  7. package/dist/{chunk-UOUNMCXE.cjs.map → chunk-7ZFSDBM6.cjs.map} +1 -1
  8. package/dist/chunk-H2KILE5I.js +6 -0
  9. package/dist/{chunk-NDFDYCFM.js.map → chunk-H2KILE5I.js.map} +1 -1
  10. package/dist/{chunk-OBGKLTIN.cjs → chunk-MXEZQRIL.cjs} +2 -2
  11. package/dist/chunk-MXEZQRIL.cjs.map +1 -0
  12. package/dist/{chunk-W4XFMJFU.js → chunk-OS5WZMBK.js} +3 -3
  13. package/dist/{chunk-W4XFMJFU.js.map → chunk-OS5WZMBK.js.map} +1 -1
  14. package/dist/{chunk-54GBFYZT.js → chunk-SXXOAPMG.js} +2 -2
  15. package/dist/chunk-SXXOAPMG.js.map +1 -0
  16. package/dist/chunk-WTG2QGQU.cjs +8 -0
  17. package/dist/{chunk-FI2WH67N.cjs.map → chunk-WTG2QGQU.cjs.map} +1 -1
  18. package/dist/{client-B_GblPxW.d.cts → client-DfN4wQXU.d.cts} +228 -27
  19. package/dist/{client-B_GblPxW.d.ts → client-DfN4wQXU.d.ts} +228 -27
  20. package/dist/index.cjs +148 -52
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +120 -25
  25. package/dist/index.js.map +1 -1
  26. package/dist/solapi/index.cjs +7 -7
  27. package/dist/solapi/index.d.cts +2 -2
  28. package/dist/solapi/index.d.ts +2 -2
  29. package/dist/solapi/index.js +2 -2
  30. package/package.json +1 -1
  31. package/dist/chunk-54GBFYZT.js.map +0 -1
  32. package/dist/chunk-FI2WH67N.cjs +0 -8
  33. package/dist/chunk-NDFDYCFM.js +0 -6
  34. package/dist/chunk-OBGKLTIN.cjs.map +0 -1
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as APIClient, a as APIClientOptions, b as APIConnectionError, c as APIError, d as APIResponseValidationError, e as APIStatusError, f as APITimeoutError, g as AccountContext, h as AgentConnectionError, i as AgentError, j as AssignmentLink, k as AssignmentLinkAssignment, l as AssignmentLinkCreateResponse, m as AssignmentLinkStatus, n as AssignmentLinks, o as AuthenticationError, B as BadRequestError, p as BlockedChannel, q as BlockedRecipient, r as BlockedRecipientSource, s as BlockedRecipientStatus, t as BlockedRecipients, u as BrandBubbleType, v as BrandMessageCreateParams, w as BrandSendParams, C as Call, x as CallContextParam, y as CallControlResponse, z as CallCreateParams, D as CallListParams, E as CallUpdateParams, F as Calls, G as ClawOps, H as ClawOpsError, I as ClawOpsErrorCode, J as ClawOpsOptions, K as ConflictError, L as InternalServerError, M as Kakao, N as KakaoBrandTemplate, O as KakaoBrandTemplateListParams, P as KakaoBrandTemplates, Q as KakaoChannel, R as KakaoChannelCategory, S as KakaoChannelCategoryList, T as KakaoChannelConnectParams, U as KakaoChannelListParams, V as KakaoChannelStatus, W as KakaoChannels, X as KakaoFallbackParams, Y as KakaoMessageCreateParams, Z as KakaoSendParams, _ as KakaoTemplate, $ as KakaoTemplateListParams, a0 as KakaoTemplates, a1 as KakaoTokenRequest, a2 as KakaoTokenRequestParams, a3 as Message, a4 as MessageCreateParams, a5 as MessageListParams, a6 as Messages, a7 as NotFoundError, a8 as NumberCreateParams, a9 as NumberListItem, aa as NumberUpdateParams, ab as NumberUpdateResponse, ac as Numbers, ad as Page, ae as PermissionDeniedError, af as PhoneNumber, ag as RateLimitError, ah as RecordingDownload, ai as Recordings, aj as RoutingType, ak as ServiceUnavailableError, al as SipCredential, am as SipCredentials, an as SipEndpoint, ao as SipEndpoints, ap as SolapiBridgeError, aq as TextMessageCreateParams, ar as UnprocessableEntityError, as as WebhookLog, at as WebhookLogs, au as WebhookVerificationError, av as Webhooks, G as default } from './client-B_GblPxW.cjs';
1
+ export { A as APIClient, a as APIClientOptions, b as APIConnectionError, c as APIError, d as APIResponseValidationError, e as APIStatusError, f as APITimeoutError, g as AccountContext, h as AgentConnectionError, i as AgentError, j as AssignmentLink, k as AssignmentLinkAssignment, l as AssignmentLinkCreateResponse, m as AssignmentLinkStatus, n as AssignmentLinks, o as AuthenticationError, B as BadRequestError, p as BlockedChannel, q as BlockedRecipient, r as BlockedRecipientSource, s as BlockedRecipientStatus, t as BlockedRecipients, u as BrandBubbleType, v as BrandFreeSendParams, w as BrandMessageCreateParams, x as BrandSendParams, y as BrandTemplateSendParams, C as Call, z as CallContextParam, D as CallControlResponse, E as CallCreateParams, F as CallListParams, G as CallUpdateParams, H as Calls, I as ClawOps, J as ClawOpsError, K as ClawOpsErrorCode, L as ClawOpsOptions, M as ConflictError, N as InternalServerError, O as Kakao, P as KakaoBrandImage, Q as KakaoBrandImages, R as KakaoBrandTemplate, S as KakaoBrandTemplateListParams, T as KakaoBrandTemplates, U as KakaoChannel, V as KakaoChannelCategory, W as KakaoChannelCategoryList, X as KakaoChannelConnectParams, Y as KakaoChannelListParams, Z as KakaoChannelStatus, _ as KakaoChannels, $ as KakaoFallbackParams, a0 as KakaoMessageCreateParams, a1 as KakaoSendParams, a2 as KakaoTemplate, a3 as KakaoTemplateListParams, a4 as KakaoTemplates, a5 as KakaoTokenRequest, a6 as KakaoTokenRequestParams, a7 as Message, a8 as MessageCreateParams, a9 as MessageListParams, aa as Messages, ab as NotFoundError, ac as NumberCreateParams, ad as NumberListItem, ae as NumberUpdateParams, af as NumberUpdateResponse, ag as Numbers, ah as Page, ai as PermissionDeniedError, aj as PhoneNumber, ak as RateLimitError, al as RecordingDownload, am as Recordings, an as RoutingType, ao as ServiceUnavailableError, ap as SipCredential, aq as SipCredentials, ar as SipEndpoint, as as SipEndpoints, at as SolapiBridgeError, au as TextMessageCreateParams, av as UnprocessableEntityError, aw as WebhookLog, ax as WebhookLogs, ay as WebhookVerificationError, az as Webhooks, I as default } from './client-DfN4wQXU.cjs';
2
2
  import { z } from 'zod';
3
3
 
4
4
  declare const VERSION: string;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as APIClient, a as APIClientOptions, b as APIConnectionError, c as APIError, d as APIResponseValidationError, e as APIStatusError, f as APITimeoutError, g as AccountContext, h as AgentConnectionError, i as AgentError, j as AssignmentLink, k as AssignmentLinkAssignment, l as AssignmentLinkCreateResponse, m as AssignmentLinkStatus, n as AssignmentLinks, o as AuthenticationError, B as BadRequestError, p as BlockedChannel, q as BlockedRecipient, r as BlockedRecipientSource, s as BlockedRecipientStatus, t as BlockedRecipients, u as BrandBubbleType, v as BrandMessageCreateParams, w as BrandSendParams, C as Call, x as CallContextParam, y as CallControlResponse, z as CallCreateParams, D as CallListParams, E as CallUpdateParams, F as Calls, G as ClawOps, H as ClawOpsError, I as ClawOpsErrorCode, J as ClawOpsOptions, K as ConflictError, L as InternalServerError, M as Kakao, N as KakaoBrandTemplate, O as KakaoBrandTemplateListParams, P as KakaoBrandTemplates, Q as KakaoChannel, R as KakaoChannelCategory, S as KakaoChannelCategoryList, T as KakaoChannelConnectParams, U as KakaoChannelListParams, V as KakaoChannelStatus, W as KakaoChannels, X as KakaoFallbackParams, Y as KakaoMessageCreateParams, Z as KakaoSendParams, _ as KakaoTemplate, $ as KakaoTemplateListParams, a0 as KakaoTemplates, a1 as KakaoTokenRequest, a2 as KakaoTokenRequestParams, a3 as Message, a4 as MessageCreateParams, a5 as MessageListParams, a6 as Messages, a7 as NotFoundError, a8 as NumberCreateParams, a9 as NumberListItem, aa as NumberUpdateParams, ab as NumberUpdateResponse, ac as Numbers, ad as Page, ae as PermissionDeniedError, af as PhoneNumber, ag as RateLimitError, ah as RecordingDownload, ai as Recordings, aj as RoutingType, ak as ServiceUnavailableError, al as SipCredential, am as SipCredentials, an as SipEndpoint, ao as SipEndpoints, ap as SolapiBridgeError, aq as TextMessageCreateParams, ar as UnprocessableEntityError, as as WebhookLog, at as WebhookLogs, au as WebhookVerificationError, av as Webhooks, G as default } from './client-B_GblPxW.js';
1
+ export { A as APIClient, a as APIClientOptions, b as APIConnectionError, c as APIError, d as APIResponseValidationError, e as APIStatusError, f as APITimeoutError, g as AccountContext, h as AgentConnectionError, i as AgentError, j as AssignmentLink, k as AssignmentLinkAssignment, l as AssignmentLinkCreateResponse, m as AssignmentLinkStatus, n as AssignmentLinks, o as AuthenticationError, B as BadRequestError, p as BlockedChannel, q as BlockedRecipient, r as BlockedRecipientSource, s as BlockedRecipientStatus, t as BlockedRecipients, u as BrandBubbleType, v as BrandFreeSendParams, w as BrandMessageCreateParams, x as BrandSendParams, y as BrandTemplateSendParams, C as Call, z as CallContextParam, D as CallControlResponse, E as CallCreateParams, F as CallListParams, G as CallUpdateParams, H as Calls, I as ClawOps, J as ClawOpsError, K as ClawOpsErrorCode, L as ClawOpsOptions, M as ConflictError, N as InternalServerError, O as Kakao, P as KakaoBrandImage, Q as KakaoBrandImages, R as KakaoBrandTemplate, S as KakaoBrandTemplateListParams, T as KakaoBrandTemplates, U as KakaoChannel, V as KakaoChannelCategory, W as KakaoChannelCategoryList, X as KakaoChannelConnectParams, Y as KakaoChannelListParams, Z as KakaoChannelStatus, _ as KakaoChannels, $ as KakaoFallbackParams, a0 as KakaoMessageCreateParams, a1 as KakaoSendParams, a2 as KakaoTemplate, a3 as KakaoTemplateListParams, a4 as KakaoTemplates, a5 as KakaoTokenRequest, a6 as KakaoTokenRequestParams, a7 as Message, a8 as MessageCreateParams, a9 as MessageListParams, aa as Messages, ab as NotFoundError, ac as NumberCreateParams, ad as NumberListItem, ae as NumberUpdateParams, af as NumberUpdateResponse, ag as Numbers, ah as Page, ai as PermissionDeniedError, aj as PhoneNumber, ak as RateLimitError, al as RecordingDownload, am as Recordings, an as RoutingType, ao as ServiceUnavailableError, ap as SipCredential, aq as SipCredentials, ar as SipEndpoint, as as SipEndpoints, at as SolapiBridgeError, au as TextMessageCreateParams, av as UnprocessableEntityError, aw as WebhookLog, ax as WebhookLogs, ay as WebhookVerificationError, az as Webhooks, I as default } from './client-DfN4wQXU.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  declare const VERSION: string;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, INITIAL_RETRY_DELAY, MAX_RETRY_DELAY } from './chunk-35XJNMFU.js';
2
- import { APITimeoutError, APIConnectionError, makeStatusError, APIResponseValidationError, ClawOpsError } from './chunk-54GBFYZT.js';
3
- export { APIConnectionError, APIError, APIResponseValidationError, APIStatusError, APITimeoutError, AgentConnectionError, AgentError, AuthenticationError, BadRequestError, ClawOpsError, ConflictError, InternalServerError, NotFoundError, PermissionDeniedError, RateLimitError, ServiceUnavailableError, SolapiBridgeError, UnprocessableEntityError } from './chunk-54GBFYZT.js';
4
- import { VERSION } from './chunk-NDFDYCFM.js';
5
- export { VERSION } from './chunk-NDFDYCFM.js';
2
+ import { APITimeoutError, APIConnectionError, makeStatusError, APIResponseValidationError, ClawOpsError } from './chunk-SXXOAPMG.js';
3
+ export { APIConnectionError, APIError, APIResponseValidationError, APIStatusError, APITimeoutError, AgentConnectionError, AgentError, AuthenticationError, BadRequestError, ClawOpsError, ConflictError, InternalServerError, NotFoundError, PermissionDeniedError, RateLimitError, ServiceUnavailableError, SolapiBridgeError, UnprocessableEntityError } from './chunk-SXXOAPMG.js';
4
+ import { VERSION } from './chunk-H2KILE5I.js';
5
+ export { VERSION } from './chunk-H2KILE5I.js';
6
6
  import { z } from 'zod';
7
7
  import { timingSafeEqual, createHmac } from 'crypto';
8
8
 
@@ -21,6 +21,11 @@ function validateBaseUrl(url) {
21
21
  `base_url\uC740 HTTPS\uB97C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4 (\uBC1B\uC740 \uAC12: '${url}'). \uB85C\uCEEC \uAC1C\uBC1C \uC2DC\uC5D0\uB294 http://localhost\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`
22
22
  );
23
23
  }
24
+ function serializeBody(body) {
25
+ if (body instanceof FormData) return { payload: body, contentType: null };
26
+ if (!body) return { payload: void 0, contentType: "application/json" };
27
+ return { payload: JSON.stringify(body), contentType: "application/json" };
28
+ }
24
29
  var APIClient = class {
25
30
  _apiKey;
26
31
  _baseURL;
@@ -49,6 +54,9 @@ var APIClient = class {
49
54
  }
50
55
  async _send(method2, path, options = {}) {
51
56
  const headers = this._buildHeaders(options.extraHeaders);
57
+ const { payload, contentType } = serializeBody(options.body);
58
+ if (contentType === null) delete headers["Content-Type"];
59
+ else headers["Content-Type"] = contentType;
52
60
  const params = new URLSearchParams();
53
61
  const queryObj = { ...options.query, ...options.extraQuery };
54
62
  for (const [k, v] of Object.entries(queryObj)) {
@@ -66,7 +74,7 @@ var APIClient = class {
66
74
  response = await this._fetch(url, {
67
75
  method: method2,
68
76
  headers,
69
- body: options.body ? JSON.stringify(options.body) : void 0,
77
+ body: payload,
70
78
  signal: controller.signal
71
79
  });
72
80
  } catch (err) {
@@ -322,9 +330,22 @@ var AssignmentLinks = class extends APIResource {
322
330
  };
323
331
  var BlockedRecipientSchema = z.object({
324
332
  id: z.string(),
325
- /** 국내 표기로 정규화된 번호 (예 '01012345678'). */
326
- number: z.string(),
327
- channel: z.enum(["call", "message"]),
333
+ /**
334
+ * 수신거부한 상대. **채널과 무관하게 항상 이 칸에 들어갑니다** —
335
+ * `call`·`message` 면 국내 표기로 정규화된 전화번호(예 `'01012345678'`),
336
+ * `email` 이면 소문자로 정규화된 이메일 주소(예 `'kim@example.com'`).
337
+ *
338
+ * 채널이 늘어도 이 칸 하나만 읽으면 됩니다.
339
+ */
340
+ recipient: z.string(),
341
+ /**
342
+ * ⚠️ `email` 이 2026-09-07 에 추가됐습니다. 이 값을 **enum 으로 좁히지 마세요** —
343
+ * 서버가 채널을 늘리면 옛 SDK 가 파싱 단계에서 통째로 실패합니다. 실제로 그 일이
344
+ * 있었습니다: `['call','message']` 로 굳혀 둔 탓에, 이메일 항목이 하나라도 섞이면
345
+ * 목록 조회 전체가 깨졌습니다. 알려진 값은 `BlockedChannel` 로 노출하되 파싱은
346
+ * 열어 둡니다.
347
+ */
348
+ channel: z.string(),
328
349
  /** 지금 차단 중인지. 해제분도 이력으로 조회되므로 이 값으로 구분한다. */
329
350
  active: z.boolean(),
330
351
  source: z.string(),
@@ -342,16 +363,17 @@ var BlockedRecipientSchema = z.object({
342
363
  // src/resources/blocked-recipients.ts
343
364
  var BlockedRecipients = class extends APIResource {
344
365
  /**
345
- * 번호를 수신거부 명단에 등록합니다.
366
+ * 수신거부 명단에 등록합니다.
346
367
  *
347
- * 하이픈·`+82` 표기 모두 허용되며 국내 표기로 정규화되어 저장됩니다.
368
+ * `recipient` 형식은 `channel` 정합니다 `call`·`message` 는 **전화번호**(하이픈·`+82`
369
+ * 표기 모두 허용, 국내 표기로 정규화되어 저장), `email` 은 **이메일 주소**(소문자로 정규화).
348
370
  *
349
- * **멱등입니다** — 이미 차단 중인 (번호, 채널)을 다시 등록해도 에러가 아니라 기존 항목을
371
+ * **멱등입니다** — 이미 차단 중인 (대상, 채널)을 다시 등록해도 에러가 아니라 기존 항목을
350
372
  * 돌려줍니다. 같은 사람이 수신거부를 두 번 요청하는 것은 정상 상황이기 때문입니다.
351
373
  */
352
374
  async create(params, options = {}) {
353
375
  const body = stripNotGiven({
354
- number: params.number,
376
+ recipient: params.recipient,
355
377
  channel: params.channel,
356
378
  source: params.source,
357
379
  sourceRef: params.sourceRef,
@@ -370,7 +392,7 @@ var BlockedRecipients = class extends APIResource {
370
392
  async list(params = {}, options = {}) {
371
393
  const query = stripNotGiven({
372
394
  channel: params.channel,
373
- number: params.number,
395
+ recipient: params.recipient,
374
396
  status: params.status,
375
397
  page: params.page,
376
398
  pageSize: params.pageSize
@@ -416,14 +438,11 @@ var BlockedRecipients = class extends APIResource {
416
438
  */
417
439
  async release(blockId, params = {}, options = {}) {
418
440
  const body = stripNotGiven({ note: params.note });
419
- return this._client._deleteWithResponse(
420
- `${this._basePath}/blocked-recipients/${blockId}`,
421
- {
422
- body: Object.keys(body).length ? body : void 0,
423
- castTo: BlockedRecipientSchema,
424
- ...options
425
- }
426
- );
441
+ return this._client._deleteWithResponse(`${this._basePath}/blocked-recipients/${blockId}`, {
442
+ body: Object.keys(body).length ? body : void 0,
443
+ castTo: BlockedRecipientSchema,
444
+ ...options
445
+ });
427
446
  }
428
447
  };
429
448
  var CallSchema = z.object({
@@ -710,6 +729,16 @@ var KakaoBrandTemplateSchema = z.object({
710
729
  createdAt: z.string(),
711
730
  updatedAt: z.string()
712
731
  }).passthrough();
732
+ var KakaoBrandImageSchema = z.object({
733
+ id: z.string(),
734
+ /** 업로드할 때 지정한 말풍선 유형. 규격이 유형마다 달라 다른 유형엔 재사용할 수 없다. */
735
+ bubbleType: z.string(),
736
+ /** `'main'` | `'sub'`. 서브는 와이드리스트형에만 있다(메인 2:1, 서브 1:1). */
737
+ slot: z.string(),
738
+ /** 업로드한 원본 파일 이름. */
739
+ name: z.string().nullable(),
740
+ createdAt: z.string()
741
+ }).passthrough();
713
742
  var KakaoChannelCategorySchema = z.object({
714
743
  /** 채널 연결의 `categoryCode` 에 그대로 보내는 값. */
715
744
  code: z.string(),
@@ -881,6 +910,63 @@ var KakaoBrandTemplates = class extends APIResource {
881
910
  return page;
882
911
  }
883
912
  };
913
+ var KakaoBrandImages = class extends APIResource {
914
+ get _path() {
915
+ return `${this._basePath}/kakao/brand-images`;
916
+ }
917
+ /**
918
+ * 이미지를 올리고 발송에 쓸 `id` 를 받는다.
919
+ *
920
+ * ```ts
921
+ * const image = await client.kakao.brandImages.upload({
922
+ * file: readFileSync('banner.png'),
923
+ * filename: 'banner.png',
924
+ * bubbleType: 'WIDE',
925
+ * });
926
+ * await client.messages.create({
927
+ * to: '01012345678',
928
+ * from: '07012345678',
929
+ * brand: {
930
+ * channelId,
931
+ * free: { chatBubbleType: 'WIDE', content: '신메뉴가 나왔어요.', imageId: image.id },
932
+ * },
933
+ * });
934
+ * ```
935
+ *
936
+ * ⚠️ `TEXT` 는 이미지 자리가 없어 `400` 이다. 자동완성에 뜨지만 쓸 수 없다.
937
+ *
938
+ * ⚠️ **상한은 5MB 다.** 넘으면 `400`, 10MB 를 넘으면 업로드 검증기가 먼저 끊어 `413` 이고
939
+ * **`code` 가 없다** — 즉 "너무 크다" 가 두 모양으로 온다.
940
+ *
941
+ * @param params.filename 원본 파일 이름. 목록에서 사람이 알아볼 유일한 단서다.
942
+ * @param params.slot 와이드리스트형에서 작은 항목에 쓸 이미지면 `'sub'`. 기본은 `'main'`.
943
+ */
944
+ async upload(params, options = {}) {
945
+ const form = new FormData();
946
+ const blob = params.file instanceof Blob ? params.file : new Blob([params.file]);
947
+ form.append("image", blob, params.filename);
948
+ form.append("bubbleType", params.bubbleType);
949
+ if (params.slot) form.append("slot", params.slot);
950
+ return this._client._post(this._path, {
951
+ body: form,
952
+ castTo: z.object({ id: z.string() }).passthrough(),
953
+ ...options
954
+ });
955
+ }
956
+ /** 올려 둔 이미지 목록. **`id` 를 잃었을 때 되찾는 경로다.** */
957
+ async list(params = {}, options = {}) {
958
+ const query = stripNotGiven({ page: params.page, pageSize: params.pageSize });
959
+ const path = this._path;
960
+ const raw = await this._client._get(path, {
961
+ castTo: PageSchema(KakaoBrandImageSchema),
962
+ query: Object.keys(query).length ? query : void 0,
963
+ ...options
964
+ });
965
+ const page = new Page(raw.data, raw.meta);
966
+ page._setClient(this._client, path, KakaoBrandImageSchema, query);
967
+ return page;
968
+ }
969
+ };
884
970
  var Kakao = class extends APIResource {
885
971
  get channels() {
886
972
  return new KakaoChannels(this._client, this._accountId);
@@ -892,6 +978,10 @@ var Kakao = class extends APIResource {
892
978
  get brandTemplates() {
893
979
  return new KakaoBrandTemplates(this._client, this._accountId);
894
980
  }
981
+ /** 자유형 말풍선에 실을 이미지. 템플릿형은 이미지가 템플릿에 들어 있어 필요 없다. */
982
+ get brandImages() {
983
+ return new KakaoBrandImages(this._client, this._accountId);
984
+ }
895
985
  /**
896
986
  * 채널 연결 시 지정할 업종 카테고리 목록.
897
987
  *
@@ -934,7 +1024,12 @@ var MessageSchema = z.object({
934
1024
  }).passthrough();
935
1025
 
936
1026
  // src/resources/messages.ts
937
- var templateBlock = (p) => p && stripNotGiven({ ChannelId: p.channelId, TemplateId: p.templateId, Variables: p.variables });
1027
+ var sendBlock = (p) => p && stripNotGiven({
1028
+ ChannelId: p.channelId,
1029
+ TemplateId: p.templateId,
1030
+ Variables: p.variables,
1031
+ Free: p.free
1032
+ });
938
1033
  var Messages = class extends APIResource {
939
1034
  /**
940
1035
  * 문자(SMS/LMS/MMS) 또는 카카오 알림톡·브랜드 메시지를 발송합니다.
@@ -973,8 +1068,8 @@ var Messages = class extends APIResource {
973
1068
  MediaUrl: params.mediaUrl,
974
1069
  IdempotencyKey: params.idempotencyKey,
975
1070
  // 중첩 객체는 손으로 조립한다 — stripNotGiven 은 한 겹만 훑는다.
976
- Kakao: templateBlock(params.kakao),
977
- Brand: templateBlock(params.brand),
1071
+ Kakao: sendBlock(params.kakao),
1072
+ Brand: sendBlock(params.brand),
978
1073
  Fallback: params.fallback && stripNotGiven({
979
1074
  Type: params.fallback.type,
980
1075
  Subject: params.fallback.subject,
@@ -1382,6 +1477,6 @@ var ClawOps = class extends APIClient {
1382
1477
  // src/client-default.ts
1383
1478
  var client_default_default = ClawOps;
1384
1479
 
1385
- export { APIClient, AccountContext, AssignmentLinks, BlockedRecipients, Calls, ClawOps, Kakao, KakaoBrandTemplates, KakaoChannels, KakaoTemplates, Messages, Numbers, Page, Recordings, SipCredentials, SipEndpoints, WebhookLogs, WebhookVerificationError, Webhooks, client_default_default as default };
1480
+ export { APIClient, AccountContext, AssignmentLinks, BlockedRecipients, Calls, ClawOps, Kakao, KakaoBrandImages, KakaoBrandTemplates, KakaoChannels, KakaoTemplates, Messages, Numbers, Page, Recordings, SipCredentials, SipEndpoints, WebhookLogs, WebhookVerificationError, Webhooks, client_default_default as default };
1386
1481
  //# sourceMappingURL=index.js.map
1387
1482
  //# sourceMappingURL=index.js.map