@feelflow/ffid-sdk 12.2.2 → 13.0.1

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 CHANGED
@@ -20,6 +20,28 @@ yarn add @feelflow/ffid-sdk
20
20
  pnpm add @feelflow/ffid-sdk
21
21
  ```
22
22
 
23
+ ### 必要な Node.js のバージョン(13.0.0〜)
24
+
25
+ 13.0.0 以降は **Node.js 26.12.1 以上**が必要です(`engines.node: ">=26.12.1"`)。Node 18 / 20 はサポート終了済みで、22 / 24 も外して FeelFlow の全サービスを Node 26 に統一しています。下限の 26.12.1 は 2026 年 10 月の Node セキュリティリリースです。
26
+
27
+ 利用側は次の順で移行してください。
28
+
29
+ 1. サービスの実行環境(ローカル・CI・Vercel 等の配備先)を Node 26.12.1 以上へ移す
30
+ 2. その後に `@feelflow/ffid-sdk` を `^13.0.1` へ上げる(13.0.1 は API キーを載せた要求が 3xx を追従しないようにした修正を含みます。詳細は [CHANGELOG](./CHANGELOG.md) の 13.0.1)
31
+
32
+ Node 26.12.1 未満の環境(26.0〜26.12.0 を含む)で 13 を入れると npm は `EBADENGINE` の警告を出し(`engine-strict=true` ならインストールを拒否します)、動作は保証しません。Node を上げられないサービスは 12.x に留めてください。
33
+
34
+ 13.0.0 では、ほかに代理店 API(`@feelflow/ffid-sdk/agency`)から次を外しています。どれも 12.x の時点で非推奨・保存されない・呼ぶと失敗する、のいずれかだったものです。
35
+
36
+ - 非推奨の markup 課金方式: `FFIDAgencyBillingType` の `'markup'` と、`defaultMarkupRate` / `defaultMarkupFixed` / `markupRate` / `markupFixed`(型からは外しましたが、FFID 側で markup の代理店が残っている間は応答に `'markup'` が届きえます。網羅的な `switch` には `default` を残してください)
37
+ - `updateBranding()` の引数の `logoUrl` / `faviconUrl`(引数の型は `FFIDUpdateAgencyBrandingRequest`。ロゴとファビコンは `uploadAsset()` で変える)
38
+ - 代理店クライアントの `getMembers()` / `addMember()` / `updateMember()` / `removeMember()`(FFID 側の route が無く失敗していた)。代理店のロールは代理店の実体である組織でのロールから導出されるので、メンバーは下の「Organization member management」の組織メンバー API に、`getAgency()` の応答の `organizationId`(13.0.0 で型に追加)を渡して管理する。`linkOrganization()` で紐付けた顧客組織の ID ではありません。⚠️ FFID は代理店そのものを応答の `data` に入れて返すので、値は `result.data.organizationId` にあります(SDK の型は `{ agency }` と包んだ形で、実際と食い違っています。#7177 で直します)
39
+ - 代理店クライアントの `createSubAgency()`(FFID が常に `SUB_AGENCY_CREATION_REMOVED` を返し、必ず失敗していた。サブ代理店の新規作成は廃止)
40
+
41
+ また、`FFIDAgencyErrorCode` に FFID の代理店のエラーコード表の全値(`UNKNOWN_SETTINGS_KEY` / `INVALID_FIELD_TYPE` / `MISSING_REQUIRED_FIELD` など 88 個)を加えました。閉じた union への追加なので、網羅的な `switch` や `Record<FFIDAgencyErrorCode, …>` には分岐・キーの追加が要ります。表の外のコード(共通層の `METHOD_NOT_ALLOWED` など)も届きうるので、`default` は残してください。
42
+
43
+ 移行手順は [CHANGELOG](./CHANGELOG.md) の 13.0.0 を参照してください。
44
+
23
45
  ## 統合ガイド
24
46
 
25
47
  ### ニュースレター登録・目的別停止(12.2.0)
@@ -509,7 +531,7 @@ await ffid.updateMemberRole({
509
531
 
510
532
  - `addMember` は既存 FFID ユーザーを active member として追加します。招待メール送信や token 発行は行いません。
511
533
  - `role` は `admin` / `member` / `viewer` のみ指定可能です。`owner` は追加・昇格 API では扱いません。
512
- - agency client と同じ呼び味が必要な場合は `ffid.addMember(organizationId, { email, role })` も使えます。
534
+ - 位置引数の形 `ffid.addMember(organizationId, { email, role })` も使えます。12.x までの代理店クライアントの `addMember(agencyId, …)` と形は同じですが、第 1 引数は組織の ID(代理店なら `getAgency()` の応答の `data.organizationId`)で、`role` は上の 3 つだけです(旧代理店ロールの `sales` / `support` はありません)。
513
535
  - 未登録の人を招待する(招待メールと受諾リンクを FFID が送る)ときは `inviteMember({ organizationId, email, role, inviterUserId })` を使います。`inviterUserId` は、サービスで招待を操作した人の FFID ユーザー ID です。FFID の「保留中の招待」と招待メールに、その人が招待者として出ます。
514
536
  - service-key モードでは `inviterUserId` を渡してください。その人が対象の組織の owner / admin でなければ 403 `FORBIDDEN`(`details.reason: 'inviter_not_organization_admin'`)で、招待は作られません。省略すると従来どおり組織の owner が招待者になり、メールの招待者名は `service:<serviceCode>` です。
515
537
  - token モードでは省略します(ログイン中の利用者が招待者になります)。別の人の ID を渡すと 400 `VALIDATION_ERROR` です。
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunkD6CCHTHL_cjs = require('../chunk-D6CCHTHL.cjs');
3
4
  var chunkMDHKSVLP_cjs = require('../chunk-MDHKSVLP.cjs');
4
5
 
5
6
  // src/agency/ffid-agency-client.ts
@@ -113,35 +114,6 @@ function createFFIDAgencyClient(config = {}) {
113
114
  body: JSON.stringify(data)
114
115
  });
115
116
  }
116
- async function getMembers(agencyId) {
117
- const err = validateIds([agencyId, "agencyId"]);
118
- if (err) return err;
119
- return fetchWithCredentials(`/${encodeURIComponent(agencyId)}/members`);
120
- }
121
- async function addMember(agencyId, data) {
122
- const err = validateIds([agencyId, "agencyId"]);
123
- if (err) return err;
124
- return fetchWithCredentials(`/${encodeURIComponent(agencyId)}/members`, {
125
- method: "POST",
126
- body: JSON.stringify(data)
127
- });
128
- }
129
- async function updateMember(agencyId, userId, data) {
130
- const err = validateIds([agencyId, "agencyId"], [userId, "userId"]);
131
- if (err) return err;
132
- return fetchWithCredentials(
133
- `/${encodeURIComponent(agencyId)}/members/${encodeURIComponent(userId)}`,
134
- { method: "PUT", body: JSON.stringify(data) }
135
- );
136
- }
137
- async function removeMember(agencyId, userId) {
138
- const err = validateIds([agencyId, "agencyId"], [userId, "userId"]);
139
- if (err) return err;
140
- return fetchWithCredentials(
141
- `/${encodeURIComponent(agencyId)}/members/${encodeURIComponent(userId)}`,
142
- { method: "DELETE" }
143
- );
144
- }
145
117
  async function getOrganizations(agencyId) {
146
118
  const err = validateIds([agencyId, "agencyId"]);
147
119
  if (err) return err;
@@ -176,14 +148,6 @@ function createFFIDAgencyClient(config = {}) {
176
148
  if (err) return err;
177
149
  return fetchWithCredentials(`/${encodeURIComponent(agencyId)}/sub-agencies`);
178
150
  }
179
- async function createSubAgency(agencyId, data) {
180
- const err = validateIds([agencyId, "agencyId"]);
181
- if (err) return err;
182
- return fetchWithCredentials(`/${encodeURIComponent(agencyId)}/sub-agencies`, {
183
- method: "POST",
184
- body: JSON.stringify(data)
185
- });
186
- }
187
151
  async function getHierarchy(agencyId) {
188
152
  const err = validateIds([agencyId, "agencyId"]);
189
153
  if (err) return err;
@@ -289,11 +253,6 @@ function createFFIDAgencyClient(config = {}) {
289
253
  getAgencies,
290
254
  getAgency,
291
255
  updateAgency,
292
- // Members
293
- getMembers,
294
- addMember,
295
- updateMember,
296
- removeMember,
297
256
  // Organizations
298
257
  getOrganizations,
299
258
  linkOrganization,
@@ -301,7 +260,6 @@ function createFFIDAgencyClient(config = {}) {
301
260
  provisionOrganization,
302
261
  // Sub-Agencies
303
262
  getSubAgencies,
304
- createSubAgency,
305
263
  // Hierarchy
306
264
  getHierarchy,
307
265
  // Branding
@@ -362,6 +320,7 @@ function createFFIDAgencyServerClient(config) {
362
320
  try {
363
321
  response = await fetch(url, {
364
322
  method: "POST",
323
+ ...chunkD6CCHTHL_cjs.CREDENTIAL_REDIRECT_INIT,
365
324
  headers: {
366
325
  "Content-Type": "application/json",
367
326
  [AGENCY_API_KEY_HEADER]: apiKey
@@ -379,6 +338,11 @@ function createFFIDAgencyServerClient(config) {
379
338
  }
380
339
  };
381
340
  }
341
+ if (chunkD6CCHTHL_cjs.isRedirectResponse(response)) {
342
+ return {
343
+ error: { code: FFID_AGENCY_ERROR_CODES.NETWORK_ERROR, message: chunkD6CCHTHL_cjs.credentialRedirectMessage(response) }
344
+ };
345
+ }
382
346
  let payload;
383
347
  try {
384
348
  payload = await response.json();
@@ -1,12 +1,26 @@
1
1
  export { D as DEFAULT_API_BASE_URL } from '../constants-Ce2eXQtB.cjs';
2
2
 
3
+ /**
4
+ * FFID の代理店 API が返すエラーコード(13.0.0〜)。
5
+ *
6
+ * FFID 本体の `src/lib/agencies/errors.ts` の `AGENCY_ERROR_CODES` の値を、定義順のまま写したもの。
7
+ * 食い違いは root の `npm run sdk:verify-sync`(`scripts/verify-sdk-constants-sync.ts`)が落とす。
8
+ * サーバーにコードを足したら、同じ PR でここにも足す(足さないと上の同期検査が落ちる)。閉じた union への
9
+ * 追加は網羅的な `switch` / `Record` を書く利用者には破壊的になるので、SDK の版の上げ方は FFID の
10
+ * GIT_WORKFLOW §8.2 に従って判断する。
11
+ *
12
+ * 型(`FFIDAgencyServerErrorCode`)を導くためだけに使い、公開 export にはしない。
13
+ */
14
+ declare const FFID_AGENCY_SERVER_ERROR_CODES: readonly ["UNAUTHORIZED", "FORBIDDEN", "NOT_AGENCY_MEMBER", "NOT_AGENCY_ADMIN", "NOT_AGENCY_OWNER", "NOT_PLATFORM_OWNER", "SUB_AGENCY_CREATION_REMOVED", "MISSING_REQUIRED_FIELD", "INVALID_AGENCY_NAME", "INVALID_EMAIL", "INVALID_ROLE", "INVALID_AGENCY_ID", "INVALID_MEMBER_ID", "INVALID_ORGANIZATION_ID", "INVALID_COMMISSION_RATE", "INVALID_BILLING_OVERRIDE", "INVALID_STATUS", "INVALID_JSON", "AGENCY_NOT_FOUND", "MEMBER_NOT_FOUND", "USER_NOT_FOUND", "ORGANIZATION_NOT_FOUND", "MAX_HIERARCHY_DEPTH_EXCEEDED", "PARENT_AGENCY_NOT_FOUND", "SUB_AGENCY_NOT_FOUND", "INACTIVE_PARENT_AGENCY", "CIRCULAR_HIERARCHY_DETECTED", "MEMBER_ALREADY_EXISTS", "ORGANIZATION_ALREADY_LINKED", "ORGANIZATION_IS_AGENCY", "ORGANIZATION_LINKED_TO_OTHER_AGENCY", "CANNOT_REMOVE_OWNER", "CANNOT_CHANGE_OWNER_ROLE", "AGENCY_SLUG_EXISTS", "INVALID_BILLING_TYPE", "INVALID_FIELD_TYPE", "INVALID_INVITE_LINK_LABEL", "INVALID_SEARCH_QUERY", "UNKNOWN_SETTINGS_KEY", "BILLING_TYPE_CHANGE_NOT_ALLOWED", "STRIPE_CUSTOMER_REQUIRED", "INVOICE_NOT_FOUND", "INVALID_PAYMENT_TERMS", "INVALID_WHOLESALE_DISCOUNT_RATE", "NO_BILLABLE_ORGANIZATIONS", "INVOICE_FINALIZED_NOT_RECORDED", "INVOICE_SEND_FAILED", "INVALID_PERIOD", "INVALID_INVITE_LINK_LIMIT", "INVITE_LINK_EXPIRED", "INVITE_LINK_NOT_FOUND", "INVITE_LINK_REVOKED", "INVITE_LINK_EXHAUSTED", "ORGANIZATION_SLUG_CONFLICT", "INVALID_ORGANIZATION_SLUG", "INVALID_ORGANIZATION_NAME", "INVALID_BILLING_EMAIL", "INVALID_IDEMPOTENCY_KEY", "IDEMPOTENCY_KEY_REUSED", "ORGANIZATION_SLUG_RESERVED", "OWNER_ACCOUNT_UNAVAILABLE", "OWNER_ALREADY_SIGNED_IN", "OWNER_EMAIL_UNDELIVERABLE", "WELCOME_EMAIL_RECIPIENT_AMBIGUOUS", "WELCOME_EMAIL_COOLDOWN", "WELCOME_EMAIL_SEND_FAILED", "MISSING_API_KEY", "INVALID_API_KEY_FORMAT", "INVALID_API_KEY", "REVOKED_API_KEY", "EXPIRED_API_KEY", "SERVICE_UNAVAILABLE", "API_KEY_NOT_FOUND", "INVALID_API_KEY_ID", "INVALID_API_KEY_NAME", "INVALID_API_KEY_SCOPE", "INVALID_API_KEY_EXPIRY", "INVALID_WEBHOOK_URL", "INVALID_COLOR", "INVALID_DOMAIN", "DOMAIN_ALREADY_IN_USE", "DOMAIN_VERIFICATION_FAILED", "DOMAIN_NOT_CONFIGURED", "INVALID_COMPANY_NAME", "INVALID_FROM_EMAIL", "FILE_TOO_LARGE", "INVALID_FILE_TYPE", "FILE_UPLOAD_FAILED", "VERCEL_API_ERROR", "INTERNAL_ERROR", "SLUG_GENERATION_EXHAUSTED"];
15
+
3
16
  /**
4
17
  * FFID Agency SDK Type Definitions
5
18
  *
6
19
  * Types for the FeelFlow ID Agency Management SDK.
7
- * Used for managing agencies, members, organizations, branding,
20
+ * Used for managing agencies, organizations, branding,
8
21
  * domain, email settings, billing, and hierarchy.
9
22
  */
23
+
10
24
  /**
11
25
  * Configuration for the FFID Agency Client
12
26
  */
@@ -31,19 +45,28 @@ type FFIDAgencyStatus = 'active' | 'suspended' | 'inactive';
31
45
  /**
32
46
  * 代理店の課金方式。
33
47
  *
34
- * `'markup'` は非推奨(FFID #6507)。既存データの値として残している。`updateBilling()` は
35
- * 互換のため今も `'markup'` を受け付けるが、新しく設定しないこと。受け取った値を網羅的に
36
- * 扱う箇所では引き続き `'markup'` を扱うこと。
48
+ * 13.0.0 で非推奨の `'markup'` を外した(FFID #6507 / #6714)。ただし FFID 側の値と列の削除は #6714 で
49
+ * 別に行うので、それまでは markup の代理店の応答に `'markup'` が届きうる(SDK は応答を実行時に検証しない)。
50
+ * 受け取った値を網羅的に扱う箇所(`switch` / `Record<FFIDAgencyBillingType, …>` の参照)では、想定外の
51
+ * 値の分岐(`default`)を残すこと。
37
52
  */
38
- type FFIDAgencyBillingType = 'direct' | 'consolidated' | 'markup';
39
- type FFIDAgencyMemberRole = 'owner' | 'admin' | 'sales' | 'support';
40
- type FFIDAgencyMemberStatus = 'active' | 'invited' | 'suspended';
53
+ type FFIDAgencyBillingType = 'direct' | 'consolidated';
41
54
  type FFIDAgencyBillingOverride = 'default' | 'direct' | 'exempt';
42
55
  type FFIDSslStatus = 'pending' | 'active' | 'failed';
43
56
  interface FFIDAgency {
44
57
  id: string;
45
58
  name: string;
46
59
  slug: string;
60
+ /**
61
+ * この代理店の実体である組織の ID(FFID #5817。13.0.0 で型に追加。FFID は以前から返している)。
62
+ * 代理店のロールはこの組織での利用者のロールから導出されるので、代理店のメンバーは
63
+ * `createFFIDClient()` の組織メンバー API(`listMembers` など)にこの ID を渡して管理する。
64
+ *
65
+ * ⚠️ `getAgency()` の応答では、FFID は代理店そのものを `data` に入れて返す(値は
66
+ * `result.data.organizationId`)。`FFIDAgencyClient.getAgency` の型が宣言する `{ agency }` の形とは
67
+ * 食い違っている(FFID #7177 で直す)。
68
+ */
69
+ organizationId: string;
47
70
  isPlatformOwner: boolean;
48
71
  parentAgencyId: string | null;
49
72
  status: FFIDAgencyStatus;
@@ -65,6 +88,13 @@ interface FFIDAgencyBrandingSettings {
65
88
  secondaryColor?: string;
66
89
  companyName?: string;
67
90
  }
91
+ /**
92
+ * {@link FFIDAgencyClient.updateBranding} の引数。
93
+ *
94
+ * 13.0.0 で `logoUrl` / `faviconUrl` を外した(FFID #6972 / #6714)。FFID は 2 つを保存しないので、
95
+ * ロゴとファビコンは {@link FFIDAgencyClient.uploadAsset} で変える。
96
+ */
97
+ type FFIDUpdateAgencyBrandingRequest = Omit<FFIDAgencyBrandingSettings, 'logoUrl' | 'faviconUrl'>;
68
98
  interface FFIDAgencyDnsRecord {
69
99
  type: string;
70
100
  name: string;
@@ -81,23 +111,6 @@ interface FFIDAgencyEmailSettings {
81
111
  fromEmail?: string;
82
112
  replyTo?: string;
83
113
  }
84
- interface FFIDAgencyMember {
85
- userId: string;
86
- email: string;
87
- displayName: string | null;
88
- avatarUrl: string | null;
89
- role: FFIDAgencyMemberRole;
90
- status: FFIDAgencyMemberStatus;
91
- joinedAt: string | null;
92
- invitedAt: string | null;
93
- }
94
- interface FFIDAddAgencyMemberRequest {
95
- email: string;
96
- role?: FFIDAgencyMemberRole;
97
- }
98
- interface FFIDUpdateAgencyMemberRequest {
99
- role: FFIDAgencyMemberRole;
100
- }
101
114
  interface FFIDAgencyOrganization {
102
115
  id: string;
103
116
  agencyId: string;
@@ -106,10 +119,6 @@ interface FFIDAgencyOrganization {
106
119
  organizationSlug: string;
107
120
  billingOverride: FFIDAgencyBillingOverride;
108
121
  commissionRate: number | null;
109
- /** @deprecated markup 課金方式は非推奨(FFID #6507)。帳票用の既存値を読むだけで、更新する API は無い。 */
110
- markupRate: number | null;
111
- /** @deprecated markup 課金方式は非推奨(FFID #6507)。帳票用の既存値を読むだけで、更新する API は無い。 */
112
- markupFixed: number | null;
113
122
  /** 組織単位の卸割引率 override(%、0〜100)。null = 代理店デフォルトに従う。 */
114
123
  wholesaleDiscountRate: number | null;
115
124
  notes: string | null;
@@ -180,11 +189,6 @@ interface FFIDLinkOrganizationRequest {
180
189
  wholesaleDiscountRate?: number | null;
181
190
  notes?: string;
182
191
  }
183
- interface FFIDCreateSubAgencyRequest {
184
- name: string;
185
- contactEmail?: string;
186
- settings?: FFIDAgencySettings;
187
- }
188
192
  interface FFIDAgencyHierarchyNode {
189
193
  agency: FFIDAgency;
190
194
  children: FFIDAgencyHierarchyNode[];
@@ -201,10 +205,6 @@ interface FFIDAgencyBillingConfig {
201
205
  stripeCustomerId: string | null;
202
206
  invoiceEmail: string | null;
203
207
  paymentTerms: number | null;
204
- /** @deprecated markup 課金方式は非推奨(FFID #6507)。帳票用の既存値を読むだけで、更新する API は無い。 */
205
- defaultMarkupRate: number | null;
206
- /** @deprecated markup 課金方式は非推奨(FFID #6507)。帳票用の既存値を読むだけで、更新する API は無い。 */
207
- defaultMarkupFixed: number | null;
208
208
  /** 代理店デフォルト卸割引率(%、0〜100)。null = 未設定(定価請求)。 */
209
209
  wholesaleDiscountRate: number | null;
210
210
  }
@@ -212,16 +212,6 @@ interface FFIDUpdateAgencyBillingRequest {
212
212
  billingType?: FFIDAgencyBillingType;
213
213
  invoiceEmail?: string;
214
214
  paymentTerms?: number;
215
- /**
216
- * @deprecated FFID はこの項目を受け付けず、送っても黙って捨てる(FFID #6507)。
217
- * markup 課金方式は非推奨で、値を更新する手段は無い。
218
- */
219
- defaultMarkupRate?: number;
220
- /**
221
- * @deprecated FFID はこの項目を受け付けず、送っても黙って捨てる(FFID #6507)。
222
- * markup 課金方式は非推奨で、値を更新する手段は無い。
223
- */
224
- defaultMarkupFixed?: number;
225
215
  /** 代理店デフォルト卸割引率(%、0〜100)。null で未設定に戻す。 */
226
216
  wholesaleDiscountRate?: number | null;
227
217
  }
@@ -269,6 +259,10 @@ interface FFIDAgencyClient {
269
259
  agencies: FFIDAgency[];
270
260
  count: number;
271
261
  }>>;
262
+ /**
263
+ * ⚠️ FFID は代理店そのものを `data` に入れて返す(`data.agency` ではない)。この型の `{ agency }` は
264
+ * 実際の応答と食い違っている。代理店クライアントの応答型の総点検は FFID #7177 で 13.x として行う。
265
+ */
272
266
  getAgency(agencyId: string): Promise<FFIDAgencyApiResponse<{
273
267
  agency: FFIDAgency;
274
268
  }>>;
@@ -281,19 +275,6 @@ interface FFIDAgencyClient {
281
275
  updateAgency(agencyId: string, data: FFIDUpdateAgencyRequest): Promise<FFIDAgencyApiResponse<{
282
276
  agency: FFIDAgency;
283
277
  }>>;
284
- getMembers(agencyId: string): Promise<FFIDAgencyApiResponse<{
285
- members: FFIDAgencyMember[];
286
- count: number;
287
- }>>;
288
- addMember(agencyId: string, data: FFIDAddAgencyMemberRequest): Promise<FFIDAgencyApiResponse<{
289
- member: FFIDAgencyMember;
290
- }>>;
291
- updateMember(agencyId: string, userId: string, data: FFIDUpdateAgencyMemberRequest): Promise<FFIDAgencyApiResponse<{
292
- member: FFIDAgencyMember;
293
- }>>;
294
- removeMember(agencyId: string, userId: string): Promise<FFIDAgencyApiResponse<{
295
- message: string;
296
- }>>;
297
278
  getOrganizations(agencyId: string): Promise<FFIDAgencyApiResponse<{
298
279
  organizations: FFIDAgencyOrganization[];
299
280
  count: number;
@@ -318,9 +299,6 @@ interface FFIDAgencyClient {
318
299
  agencies: FFIDAgency[];
319
300
  count: number;
320
301
  }>>;
321
- createSubAgency(agencyId: string, data: FFIDCreateSubAgencyRequest): Promise<FFIDAgencyApiResponse<{
322
- agency: FFIDAgency;
323
- }>>;
324
302
  getHierarchy(agencyId: string): Promise<FFIDAgencyApiResponse<FFIDAgencyHierarchyResponse>>;
325
303
  getBranding(agencyId: string): Promise<FFIDAgencyApiResponse<{
326
304
  branding: FFIDAgencyBrandingSettings;
@@ -329,15 +307,13 @@ interface FFIDAgencyClient {
329
307
  * ブランディング(色 2 種・会社名)を更新する。
330
308
  *
331
309
  * FFID は型にないキーを 400 `UNKNOWN_SETTINGS_KEY` で拒否する(FFID #6972。`error.details.fields`
332
- * にキー名)。`logoUrl` / `faviconUrl` は型が許すので受け付けるが、**保存しない** —
333
- * ロゴとファビコンは {@link FFIDAgencyClient.uploadAsset} で変える。2 つはこのメソッドの
334
- * 引数の型から次の major 版で外す。
310
+ * にキー名)。`logoUrl` / `faviconUrl` は 13.0.0 で引数の型から外した。FFID は既知のキーとして
311
+ * 受け付けるが**保存しない** — ロゴとファビコンは {@link FFIDAgencyClient.uploadAsset} で変える。
335
312
  *
336
- * ⚠️ `error.code` の型({@link FFIDAgencyErrorCode})は `UNKNOWN_SETTINGS_KEY` を含まない
337
- * (閉じた union にコードを足すのは破壊的変更なので次の major 版で扱う)。実行時には届くので、
338
- * 比べるときは `(error.code as string) === 'UNKNOWN_SETTINGS_KEY'` とする。
313
+ * `UNKNOWN_SETTINGS_KEY` は 13.0.0 で {@link FFIDAgencyErrorCode} に入ったので、
314
+ * `error.code === 'UNKNOWN_SETTINGS_KEY'` とキャストなしで比べられる。
339
315
  */
340
- updateBranding(agencyId: string, data: FFIDAgencyBrandingSettings): Promise<FFIDAgencyApiResponse<{
316
+ updateBranding(agencyId: string, data: FFIDUpdateAgencyBrandingRequest): Promise<FFIDAgencyApiResponse<{
341
317
  branding: FFIDAgencyBrandingSettings;
342
318
  }>>;
343
319
  uploadAsset(agencyId: string, file: File, type: FFIDAgencyAssetType): Promise<FFIDAgencyApiResponse<{
@@ -377,7 +353,21 @@ interface FFIDAgencyClient {
377
353
  getRevenue(agencyId: string): Promise<FFIDAgencyApiResponse<FFIDAgencyRevenue>>;
378
354
  }
379
355
  type FFIDAgencySdkErrorCode = 'NETWORK_ERROR' | 'PARSE_ERROR' | 'UNKNOWN_ERROR' | 'VALIDATION_ERROR';
380
- type FFIDAgencyServerErrorCode = 'UNAUTHORIZED' | 'FORBIDDEN' | 'NOT_FOUND' | 'VALIDATION_ERROR' | 'INTERNAL_ERROR' | 'CONFLICT';
356
+ /**
357
+ * FFID の代理店 API が返すエラーコード。
358
+ *
359
+ * 13.0.0 から FFID の代理店のエラーコード表 `AGENCY_ERROR_CODES` の全値(`./server-error-codes`)を含む。
360
+ * 12.x までは 6 個だけで、`UNKNOWN_SETTINGS_KEY`(FFID #6972)や `INVALID_FIELD_TYPE` /
361
+ * `MISSING_REQUIRED_FIELD` など、FFID が実際に返すコードが入っていなかった。
362
+ *
363
+ * ⚠️ 代理店 API の応答に載るのはこの表のコードだけではない。共通層の 405 `METHOD_NOT_ALLOWED` や、
364
+ * 請求書の 500 `invalid_db_timestamp` などは表の外で、SDK はそのまま `error.code` に通す。
365
+ * `error.code` を網羅的に扱う箇所では、想定外の値の分岐(`default`)を残すこと。
366
+ *
367
+ * `NOT_FOUND` / `VALIDATION_ERROR` / `CONFLICT` は 12.x から型にあるが、`AGENCY_ERROR_CODES` に無い
368
+ * (`VALIDATION_ERROR` は SDK 自身の入力検査のコードとしても使う)。互換のため残している。
369
+ */
370
+ type FFIDAgencyServerErrorCode = (typeof FFID_AGENCY_SERVER_ERROR_CODES)[number] | 'NOT_FOUND' | 'VALIDATION_ERROR' | 'CONFLICT';
381
371
  type FFIDAgencyErrorCode = FFIDAgencySdkErrorCode | FFIDAgencyServerErrorCode;
382
372
  interface FFIDAgencyServerError {
383
373
  code: FFIDAgencyErrorCode;
@@ -435,10 +425,11 @@ type FFIDAgencyApiResponse<T> = {
435
425
  /**
436
426
  * このクライアントが返しうるエラーコード。
437
427
  *
438
- * `FFIDAgencyErrorCode`(SDK 内部で定義した閉じた集合)には、サーバーが実際に
439
- * 返す `ORGANIZATION_SLUG_CONFLICT` / `INVALID_ORGANIZATION_SLUG` /
440
- * `REVOKED_API_KEY` などが含まれていない。閉じた union のふりをすると、
441
- * 利用者が書いた exhaustive な `switch` が実行時に全部 `default` に落ちる。
428
+ * `FFIDAgencyErrorCode`(SDK 内部で定義した閉じた集合)は 13.0.0 から FFID の
429
+ * `AGENCY_ERROR_CODES` の全値を含む(12.x までは `ORGANIZATION_SLUG_CONFLICT` /
430
+ * `INVALID_ORGANIZATION_SLUG` / `REVOKED_API_KEY` なども欠けていた)。それでも、
431
+ * SDK より新しい FFID が足したコードは SDK を上げるまで届きうる。閉じた union のふりを
432
+ * すると、利用者が書いた exhaustive な `switch` が実行時に `default` に落ちる。
442
433
  * **開いた集合であることを型で正直に表す。**
443
434
  *
444
435
  * ⚠️ `types.ts` の `FFIDAgencyServerErrorCode` とは**別物**。あちらは
@@ -455,9 +446,10 @@ interface FFIDAgencyServerClientError {
455
446
  /**
456
447
  * サーバークライアントの応答。
457
448
  *
458
- * Cookie クライアントの `FFIDAgencyApiResponse` は `code` が閉じた union だが、
459
- * それは SDK 内部で作るコードしか載らないため。こちらは**サーバーのコードを
460
- * そのまま通す**ので、型も開いておく必要がある。
449
+ * Cookie クライアントの `FFIDAgencyApiResponse` は `code` が閉じた union
450
+ * (`FFIDAgencyErrorCode`)だが、実際にはサーバーのコードを素通しするので、表の外の
451
+ * コードも届きうる(`FFIDAgencyServerErrorCode` の注記)。こちらは**サーバーのコードを
452
+ * そのまま通す**ことを型でも表すため、開いておく。
461
453
  */
462
454
  type FFIDAgencyServerClientResponse<T> = {
463
455
  data: T;
@@ -555,4 +547,4 @@ declare const FFID_AGENCY_ERROR_CODES: {
555
547
  declare function createFFIDAgencyClient(config?: FFIDAgencyClientConfig): FFIDAgencyClient;
556
548
 
557
549
  export { FFID_AGENCY_ERROR_CODES, createFFIDAgencyClient, createFFIDAgencyServerClient };
558
- export type { FFIDAddAgencyMemberRequest, FFIDAgency, FFIDAgencyApiResponse, FFIDAgencyAssetType, FFIDAgencyBillingConfig, FFIDAgencyBillingOverride, FFIDAgencyBillingSummary, FFIDAgencyBillingType, FFIDAgencyBrandingSettings, FFIDAgencyClient, FFIDAgencyClientConfig, FFIDAgencyDnsRecord, FFIDAgencyDomainSettings, FFIDAgencyEmailSettings, FFIDAgencyError, FFIDAgencyErrorCode, FFIDAgencyHierarchyNode, FFIDAgencyHierarchyResponse, FFIDAgencyInvoice, FFIDAgencyInvoiceStatus, FFIDAgencyLogger, FFIDAgencyMember, FFIDAgencyMemberRole, FFIDAgencyMemberStatus, FFIDAgencyOrganization, FFIDAgencyRevenue, FFIDAgencySdkErrorCode, FFIDAgencyServerClient, FFIDAgencyServerClientConfig, FFIDAgencyServerClientError, FFIDAgencyServerClientErrorCode, FFIDAgencyServerClientResponse, FFIDAgencyServerError, FFIDAgencyServerErrorCode, FFIDAgencyServerResponse, FFIDAgencySettings, FFIDAgencyStatus, FFIDCreateSubAgencyRequest, FFIDLinkOrganizationRequest, FFIDProvisionOrganizationRequest, FFIDProvisionedOrganization, FFIDSetupDomainRequest, FFIDSslStatus, FFIDUpdateAgencyBillingRequest, FFIDUpdateAgencyMemberRequest, FFIDUpdateAgencyRequest, FFIDUpdateEmailSettingsRequest, FFIDWelcomeEmailOutcome };
550
+ export type { FFIDAgency, FFIDAgencyApiResponse, FFIDAgencyAssetType, FFIDAgencyBillingConfig, FFIDAgencyBillingOverride, FFIDAgencyBillingSummary, FFIDAgencyBillingType, FFIDAgencyBrandingSettings, FFIDAgencyClient, FFIDAgencyClientConfig, FFIDAgencyDnsRecord, FFIDAgencyDomainSettings, FFIDAgencyEmailSettings, FFIDAgencyError, FFIDAgencyErrorCode, FFIDAgencyHierarchyNode, FFIDAgencyHierarchyResponse, FFIDAgencyInvoice, FFIDAgencyInvoiceStatus, FFIDAgencyLogger, FFIDAgencyOrganization, FFIDAgencyRevenue, FFIDAgencySdkErrorCode, FFIDAgencyServerClient, FFIDAgencyServerClientConfig, FFIDAgencyServerClientError, FFIDAgencyServerClientErrorCode, FFIDAgencyServerClientResponse, FFIDAgencyServerError, FFIDAgencyServerErrorCode, FFIDAgencyServerResponse, FFIDAgencySettings, FFIDAgencyStatus, FFIDLinkOrganizationRequest, FFIDProvisionOrganizationRequest, FFIDProvisionedOrganization, FFIDSetupDomainRequest, FFIDSslStatus, FFIDUpdateAgencyBillingRequest, FFIDUpdateAgencyBrandingRequest, FFIDUpdateAgencyRequest, FFIDUpdateEmailSettingsRequest, FFIDWelcomeEmailOutcome };