@blocklet/payment-js 1.19.0 → 1.19.2

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
@@ -1,6 +1,6 @@
1
1
  # PaymentKit Node.js SDK
2
2
 
3
- A Node.js SDK for the PaymentKit API. This package allows you to manage resources in PaymentKit including customers, subscriptions, products, prices, payments, checkout sessions, usage records, and webhooks.
3
+ A Node.js SDK for the PaymentKit API. This package allows you to manage resources in PaymentKit including customers, subscriptions, products, prices, payments, checkout sessions, usage records, webhooks, and **credit-based billing with meters and credit grants**.
4
4
 
5
5
  ## Related Links
6
6
 
@@ -116,6 +116,54 @@ await payment.subscriptionItems.createUsageRecord({
116
116
  });
117
117
  ```
118
118
 
119
+ ### Credit-Based Billing with Meters
120
+
121
+ ```js
122
+ // Create a meter to track usage
123
+ const meter = await payment.meters.create({
124
+ name: 'API Calls',
125
+ event_name: 'api_calls',
126
+ aggregation_method: 'sum',
127
+ unit: 'calls',
128
+ description: 'Track API usage'
129
+ });
130
+
131
+ // Create a credit grant for a customer
132
+ const creditGrant = await payment.creditGrants.create({
133
+ customer_id: 'cus_xxx',
134
+ amount: '1000',
135
+ currency_id: 'pc_xxx',
136
+ category: 'promotional',
137
+ name: 'New user bonus credits',
138
+ expires_at: Math.floor(Date.now() / 1000) + (30 * 24 * 60 * 60) // 30 days
139
+ });
140
+
141
+ // Report usage events
142
+ const meterEvent = await payment.meterEvents.create({
143
+ event_name: 'api_calls',
144
+ payload: {
145
+ customer_id: 'cus_xxx',
146
+ value: '10',
147
+ subscription_id: 'sub_xxx'
148
+ },
149
+ identifier: `unique_${Date.now()}`,
150
+ timestamp: Math.floor(Date.now() / 1000)
151
+ });
152
+
153
+ // Check credit balance
154
+ const creditSummary = await payment.creditGrants.summary({
155
+ customer_id: 'cus_xxx'
156
+ });
157
+
158
+
159
+ // View transaction history
160
+ const transactions = await payment.creditTransactions.list({
161
+ customer_id: 'cus_xxx',
162
+ page: 1,
163
+ pageSize: 20
164
+ });
165
+ ```
166
+
119
167
  ### Handling Refunds
120
168
 
121
169
  ```js
@@ -220,6 +268,35 @@ const webhook = await payment.webhookEndpoints.create({
220
268
  - `payment.subscriptionItems.listUsageRecordSummaries(id)`
221
269
  - `payment.subscriptionItems.listUsageRecords(params)`
222
270
 
271
+ ### Credit-Based Billing
272
+
273
+ #### Meters
274
+ - `payment.meters.create(data)` - Create a meter to track usage events
275
+ - `payment.meters.retrieve(id)` - Get meter details
276
+ - `payment.meters.update(id, data)` - Update meter configuration
277
+ - `payment.meters.list(params)` - List all meters
278
+ - `payment.meters.activate(id)` - Activate a meter
279
+ - `payment.meters.deactivate(id)` - Deactivate a meter
280
+
281
+ #### Meter Events
282
+ - `payment.meterEvents.create(data)` - Report usage events
283
+ - `payment.meterEvents.retrieve(id)` - Get meter event details
284
+ - `payment.meterEvents.list(params)` - List meter events
285
+ - `payment.meterEvents.stats(params)` - Get usage statistics
286
+ - `payment.meterEvents.pendingAmount(params)` - Get pending credit consumption
287
+
288
+ #### Credit Grants
289
+ - `payment.creditGrants.create(data)` - Create credit grants for customers
290
+ - `payment.creditGrants.retrieve(id)` - Get credit grant details
291
+ - `payment.creditGrants.update(id, data)` - Update credit grant metadata
292
+ - `payment.creditGrants.list(params)` - List credit grants
293
+ - `payment.creditGrants.summary(params)` - Get credit balance summary
294
+
295
+ #### Credit Transactions
296
+ - `payment.creditTransactions.retrieve(id)` - Get transaction details
297
+ - `payment.creditTransactions.list(params)` - List credit transactions
298
+ - `payment.creditTransactions.summary(params)` - Get usage and credit summary
299
+
223
300
  ### Webhooks
224
301
  - `payment.webhookEndpoints.create(data)`
225
302
  - `payment.webhookEndpoints.retrieve(id)`
@@ -227,6 +304,25 @@ const webhook = await payment.webhookEndpoints.create({
227
304
  - `payment.webhookEndpoints.list(params)`
228
305
  - `payment.webhookEndpoints.del(id)`
229
306
 
307
+ ## Credit-Based Billing
308
+
309
+ The PaymentKit SDK supports credit-based billing, allowing you to:
310
+
311
+ 1. **Track Usage with Meters**: Create meters to track specific usage events (API calls, storage usage, etc.)
312
+ 2. **Grant Credits**: Issue credits to customers through various methods (purchases, promotions, etc.)
313
+ 3. **Report Usage**: Submit usage events that consume credits automatically
314
+ 4. **Monitor Balances**: Check remaining credit balances and transaction history
315
+ 5. **Usage Analytics**: Get detailed statistics on usage patterns
316
+
317
+ ### Credit Grant Categories
318
+ - `paid`: Credits purchased by the customer
319
+ - `promotional`: Free credits given as promotions or bonuses
320
+
321
+ ### Meter Aggregation Methods
322
+ - `sum`: Sum all usage values
323
+ - `count`: Count number of events
324
+ - `last`: Use the last reported value
325
+
230
326
  ## Subscription Status
231
327
 
232
328
  A subscription can have the following statuses:
package/lib/index.d.ts CHANGED
@@ -289,6 +289,109 @@ declare const _default: {
289
289
  omit: never;
290
290
  }>>;
291
291
  };
292
+ meters: {
293
+ create: (data: import("./resources/meter").CreateMeterData, params?: never) => Promise<import("./resources/meter").TMeterExpanded>;
294
+ retrieve: (_params: string, data?: never) => Promise<import("./resources/meter").TMeterExpanded>;
295
+ update: (_params: string, data?: import("./resources/meter").UpdateMeterData) => Promise<import("./resources/meter").TMeterExpanded>;
296
+ list: (_params: {
297
+ event_name?: string;
298
+ livemode?: boolean;
299
+ q?: string;
300
+ } & {
301
+ page?: number;
302
+ pageSize?: number;
303
+ limit?: number;
304
+ starting_after?: string;
305
+ ending_before?: string;
306
+ order?: import("@blocklet/payment-types").OrderInput;
307
+ }, data?: never) => Promise<import("@blocklet/payment-types").Paginated<import("./resources/meter").TMeterExpanded>>;
308
+ activate: (_params: string, data?: never) => Promise<import("./resources/meter").TMeterExpanded>;
309
+ deactivate: (_params: string, data?: never) => Promise<import("./resources/meter").TMeterExpanded>;
310
+ };
311
+ meterEvents: {
312
+ create: (data: import("./resources/meter-event").CreateMeterEventData, params?: never) => Promise<import("@blocklet/payment-types").TMeterEventExpanded>;
313
+ retrieve: (_params: string, data?: never) => Promise<import("@blocklet/payment-types").TMeterEventExpanded>;
314
+ list: (_params: {
315
+ event_name?: string;
316
+ meter_id?: string;
317
+ customer_id?: string;
318
+ start?: number;
319
+ end?: number;
320
+ livemode?: boolean;
321
+ q?: string;
322
+ } & {
323
+ page?: number;
324
+ pageSize?: number;
325
+ limit?: number;
326
+ starting_after?: string;
327
+ ending_before?: string;
328
+ order?: import("@blocklet/payment-types").OrderInput;
329
+ }, data?: never) => Promise<import("@blocklet/payment-types").Paginated<import("@blocklet/payment-types").TMeterEventExpanded>>;
330
+ stats: (_params: {
331
+ meter_id: string;
332
+ start: number;
333
+ end: number;
334
+ customer_id?: string;
335
+ granularity?: "minute" | "hour" | "day";
336
+ }, data?: never) => Promise<import("@blocklet/payment-types").Paginated<import("./resources/meter-event").MeterEventStats>>;
337
+ pendingAmount: (_params: {
338
+ subscription_id?: string;
339
+ customer_id?: string;
340
+ currency_id?: string;
341
+ }, data?: never) => Promise<import("./resources/meter-event").PendingAmountSummary>;
342
+ };
343
+ creditGrants: {
344
+ create: (data: import("./resources/credit-grant").CreateCreditGrantData, params?: never) => Promise<import("@blocklet/payment-types").TCreditGrantExpanded>;
345
+ retrieve: (_params: string, data?: never) => Promise<import("@blocklet/payment-types").TCreditGrantExpanded>;
346
+ update: (_params: string, data?: import("./resources/credit-grant").UpdateCreditGrantData) => Promise<{
347
+ success: boolean;
348
+ }>;
349
+ list: (_params: {
350
+ customer_id?: string;
351
+ currency_id?: string;
352
+ status?: string;
353
+ livemode?: boolean;
354
+ q?: string;
355
+ } & {
356
+ page?: number;
357
+ pageSize?: number;
358
+ limit?: number;
359
+ starting_after?: string;
360
+ ending_before?: string;
361
+ order?: import("@blocklet/payment-types").OrderInput;
362
+ }, data?: never) => Promise<import("@blocklet/payment-types").Paginated<import("@blocklet/payment-types").TCreditGrantExpanded>>;
363
+ summary: (_params: {
364
+ customer_id: string;
365
+ subscription_id?: string;
366
+ }, data?: never) => Promise<import("./resources/credit-grant").CreditSummary>;
367
+ };
368
+ creditTransactions: {
369
+ retrieve: (_params: string, data?: never) => Promise<import("@blocklet/payment-types").TCreditTransactionExpanded>;
370
+ list: (_params: {
371
+ customer_id?: string;
372
+ subscription_id?: string;
373
+ credit_grant_id?: string;
374
+ source?: string;
375
+ start?: number;
376
+ end?: number;
377
+ livemode?: boolean;
378
+ q?: string;
379
+ } & {
380
+ page?: number;
381
+ pageSize?: number;
382
+ limit?: number;
383
+ starting_after?: string;
384
+ ending_before?: string;
385
+ order?: import("@blocklet/payment-types").OrderInput;
386
+ }, data?: never) => Promise<import("@blocklet/payment-types").Paginated<import("@blocklet/payment-types").TCreditTransactionExpanded>>;
387
+ summary: (_params: {
388
+ customer_id?: string;
389
+ subscription_id?: string;
390
+ currency_id?: string;
391
+ start?: number;
392
+ end?: number;
393
+ }, data?: never) => Promise<import("./resources/credit-transaction").UsageSummary>;
394
+ };
292
395
  environments: {
293
396
  getLivemode: () => boolean;
294
397
  setLivemode: (value: boolean) => void;
package/lib/index.js CHANGED
@@ -31,6 +31,10 @@ const subscription_item_1 = __importDefault(require("./resources/subscription-it
31
31
  const webhook_endpoint_1 = __importDefault(require("./resources/webhook-endpoint"));
32
32
  const refund_1 = __importDefault(require("./resources/refund"));
33
33
  const setting_1 = __importDefault(require("./resources/setting"));
34
+ const meter_1 = __importDefault(require("./resources/meter"));
35
+ const meter_event_1 = __importDefault(require("./resources/meter-event"));
36
+ const credit_grant_1 = __importDefault(require("./resources/credit-grant"));
37
+ const credit_transaction_1 = __importDefault(require("./resources/credit-transaction"));
34
38
  // auto detect livemode
35
39
  if (process.env.PAYMENT_LIVEMODE) {
36
40
  resource_1.environments.setLivemode(process.env.PAYMENT_LIVEMODE === 'true');
@@ -55,6 +59,10 @@ exports.default = {
55
59
  subscriptions: subscription_1.default,
56
60
  subscriptionItems: subscription_item_1.default,
57
61
  webhookEndpoints: webhook_endpoint_1.default,
62
+ meters: meter_1.default,
63
+ meterEvents: meter_event_1.default,
64
+ creditGrants: credit_grant_1.default,
65
+ creditTransactions: credit_transaction_1.default,
58
66
  environments: resource_1.environments,
59
67
  refunds: refund_1.default,
60
68
  settings: setting_1.default,
@@ -0,0 +1,56 @@
1
+ import type { Paginated, Pagination, TCreditGrantExpanded } from '@blocklet/payment-types';
2
+ export interface CreateCreditGrantData {
3
+ amount: string;
4
+ currency_id: string;
5
+ customer_id: string;
6
+ name?: string;
7
+ category: 'paid' | 'promotional';
8
+ priority?: number;
9
+ effective_at?: number;
10
+ expires_at?: number;
11
+ applicability_config?: {
12
+ scope?: {
13
+ prices?: string[];
14
+ price_type?: string;
15
+ };
16
+ };
17
+ metadata?: Record<string, any>;
18
+ }
19
+ export interface UpdateCreditGrantData {
20
+ metadata?: Record<string, any>;
21
+ }
22
+ export interface CreditSummary {
23
+ customer_id: string;
24
+ total_balance: Record<string, {
25
+ currency_id: string;
26
+ total_amount: string;
27
+ available_amount: string;
28
+ pending_amount: string;
29
+ currency: {
30
+ id: string;
31
+ symbol: string;
32
+ decimal: number;
33
+ };
34
+ }>;
35
+ }
36
+ type ListParams = Pagination<{
37
+ customer_id?: string;
38
+ currency_id?: string;
39
+ status?: string;
40
+ livemode?: boolean;
41
+ q?: string;
42
+ }>;
43
+ type SummaryParams = {
44
+ customer_id: string;
45
+ subscription_id?: string;
46
+ };
47
+ declare const _default: {
48
+ create: (data: CreateCreditGrantData, params?: never) => Promise<TCreditGrantExpanded>;
49
+ retrieve: (_params: string, data?: never) => Promise<TCreditGrantExpanded>;
50
+ update: (_params: string, data?: UpdateCreditGrantData) => Promise<{
51
+ success: boolean;
52
+ }>;
53
+ list: (_params: ListParams, data?: never) => Promise<Paginated<TCreditGrantExpanded>>;
54
+ summary: (_params: SummaryParams, data?: never) => Promise<CreditSummary>;
55
+ };
56
+ export default _default;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const resource_1 = require("../resource");
4
+ exports.default = {
5
+ create: (0, resource_1.createResourceCreateMethod)({
6
+ method: 'POST',
7
+ path: '/api/credit-grants',
8
+ }),
9
+ retrieve: (0, resource_1.createResourceMethod)({
10
+ method: 'GET',
11
+ path: '/api/credit-grants/{id}',
12
+ }),
13
+ update: (0, resource_1.createResourceMethod)({
14
+ method: 'PUT',
15
+ path: '/api/credit-grants/{id}',
16
+ }),
17
+ list: (0, resource_1.createResourceMethod)({
18
+ method: 'GET',
19
+ path: '/api/credit-grants',
20
+ }),
21
+ summary: (0, resource_1.createResourceMethod)({
22
+ method: 'GET',
23
+ path: '/api/credit-grants/summary',
24
+ }),
25
+ };
@@ -0,0 +1,62 @@
1
+ import type { Paginated, Pagination, TCreditTransactionExpanded } from '@blocklet/payment-types';
2
+ export interface TCreditTransaction {
3
+ id: string;
4
+ customer_id: string;
5
+ credit_grant_id: string;
6
+ meter_id?: string;
7
+ subscription_id?: string;
8
+ meter_event_id?: string;
9
+ type: 'grant' | 'consumption' | 'adjustment' | 'expiration';
10
+ amount: string;
11
+ running_balance: string;
12
+ description?: string;
13
+ livemode: boolean;
14
+ created_at: string;
15
+ updated_at: string;
16
+ metadata?: Record<string, any>;
17
+ }
18
+ export interface UsageSummary {
19
+ customer_id?: string;
20
+ subscription_id?: string;
21
+ currency_id?: string;
22
+ total_consumption: string;
23
+ total_grants: string;
24
+ net_balance: string;
25
+ transaction_count: number;
26
+ period_start?: string;
27
+ period_end?: string;
28
+ breakdown: {
29
+ by_type: Record<string, {
30
+ amount: string;
31
+ count: number;
32
+ }>;
33
+ by_meter?: Record<string, {
34
+ amount: string;
35
+ count: number;
36
+ meter_name: string;
37
+ }>;
38
+ };
39
+ }
40
+ type ListParams = Pagination<{
41
+ customer_id?: string;
42
+ subscription_id?: string;
43
+ credit_grant_id?: string;
44
+ source?: string;
45
+ start?: number;
46
+ end?: number;
47
+ livemode?: boolean;
48
+ q?: string;
49
+ }>;
50
+ type SummaryParams = {
51
+ customer_id?: string;
52
+ subscription_id?: string;
53
+ currency_id?: string;
54
+ start?: number;
55
+ end?: number;
56
+ };
57
+ declare const _default: {
58
+ retrieve: (_params: string, data?: never) => Promise<TCreditTransactionExpanded>;
59
+ list: (_params: ListParams, data?: never) => Promise<Paginated<TCreditTransactionExpanded>>;
60
+ summary: (_params: SummaryParams, data?: never) => Promise<UsageSummary>;
61
+ };
62
+ export default _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const resource_1 = require("../resource");
4
+ exports.default = {
5
+ retrieve: (0, resource_1.createResourceMethod)({
6
+ method: 'GET',
7
+ path: '/api/credit-transactions/{id}',
8
+ }),
9
+ list: (0, resource_1.createResourceMethod)({
10
+ method: 'GET',
11
+ path: '/api/credit-transactions',
12
+ }),
13
+ summary: (0, resource_1.createResourceMethod)({
14
+ method: 'GET',
15
+ path: '/api/credit-transactions/summary',
16
+ }),
17
+ };
@@ -0,0 +1,52 @@
1
+ import type { Paginated, Pagination, TMeterEventExpanded } from '@blocklet/payment-types';
2
+ export interface CreateMeterEventData {
3
+ event_name: string;
4
+ payload: {
5
+ customer_id: string;
6
+ value: string;
7
+ subscription_id?: string;
8
+ };
9
+ timestamp?: number;
10
+ identifier: string;
11
+ metadata?: Record<string, any>;
12
+ }
13
+ export interface MeterEventStats {
14
+ date: string;
15
+ timestamp: string;
16
+ event_count: number;
17
+ total_value: string;
18
+ }
19
+ export interface PendingAmountSummary {
20
+ currency_id: string;
21
+ total_pending: string;
22
+ count: number;
23
+ }
24
+ type ListParams = Pagination<{
25
+ event_name?: string;
26
+ meter_id?: string;
27
+ customer_id?: string;
28
+ start?: number;
29
+ end?: number;
30
+ livemode?: boolean;
31
+ q?: string;
32
+ }>;
33
+ type StatsParams = {
34
+ meter_id: string;
35
+ start: number;
36
+ end: number;
37
+ customer_id?: string;
38
+ granularity?: 'minute' | 'hour' | 'day';
39
+ };
40
+ type PendingAmountParams = {
41
+ subscription_id?: string;
42
+ customer_id?: string;
43
+ currency_id?: string;
44
+ };
45
+ declare const _default: {
46
+ create: (data: CreateMeterEventData, params?: never) => Promise<TMeterEventExpanded>;
47
+ retrieve: (_params: string, data?: never) => Promise<TMeterEventExpanded>;
48
+ list: (_params: ListParams, data?: never) => Promise<Paginated<TMeterEventExpanded>>;
49
+ stats: (_params: StatsParams, data?: never) => Promise<Paginated<MeterEventStats>>;
50
+ pendingAmount: (_params: PendingAmountParams, data?: never) => Promise<PendingAmountSummary>;
51
+ };
52
+ export default _default;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const resource_1 = require("../resource");
4
+ exports.default = {
5
+ create: (0, resource_1.createResourceCreateMethod)({
6
+ method: 'POST',
7
+ path: '/api/meter-events',
8
+ }),
9
+ retrieve: (0, resource_1.createResourceMethod)({
10
+ method: 'GET',
11
+ path: '/api/meter-events/{id}',
12
+ }),
13
+ list: (0, resource_1.createResourceMethod)({
14
+ method: 'GET',
15
+ path: '/api/meter-events',
16
+ }),
17
+ stats: (0, resource_1.createResourceMethod)({
18
+ method: 'GET',
19
+ path: '/api/meter-events/stats',
20
+ }),
21
+ pendingAmount: (0, resource_1.createResourceMethod)({
22
+ method: 'GET',
23
+ path: '/api/meter-events/pending-amount',
24
+ }),
25
+ };
@@ -0,0 +1,39 @@
1
+ import type { Paginated, Pagination, TMeter } from '@blocklet/payment-types';
2
+ export interface TMeterExpanded extends TMeter {
3
+ paymentCurrency?: {
4
+ id: string;
5
+ name: string;
6
+ symbol: string;
7
+ decimal: number;
8
+ type: string;
9
+ };
10
+ }
11
+ export interface CreateMeterData {
12
+ name: string;
13
+ event_name: string;
14
+ aggregation_method?: 'sum' | 'count' | 'last';
15
+ unit: string;
16
+ currency_id?: string;
17
+ description?: string;
18
+ metadata?: Record<string, any>;
19
+ }
20
+ export interface UpdateMeterData {
21
+ name?: string;
22
+ description?: string;
23
+ status?: 'active' | 'inactive';
24
+ metadata?: Record<string, any>;
25
+ }
26
+ type ListParams = Pagination<{
27
+ event_name?: string;
28
+ livemode?: boolean;
29
+ q?: string;
30
+ }>;
31
+ declare const _default: {
32
+ create: (data: CreateMeterData, params?: never) => Promise<TMeterExpanded>;
33
+ retrieve: (_params: string, data?: never) => Promise<TMeterExpanded>;
34
+ update: (_params: string, data?: UpdateMeterData) => Promise<TMeterExpanded>;
35
+ list: (_params: ListParams, data?: never) => Promise<Paginated<TMeterExpanded>>;
36
+ activate: (_params: string, data?: never) => Promise<TMeterExpanded>;
37
+ deactivate: (_params: string, data?: never) => Promise<TMeterExpanded>;
38
+ };
39
+ export default _default;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const resource_1 = require("../resource");
4
+ exports.default = {
5
+ create: (0, resource_1.createResourceCreateMethod)({
6
+ method: 'POST',
7
+ path: '/api/meters',
8
+ }),
9
+ retrieve: (0, resource_1.createResourceMethod)({
10
+ method: 'GET',
11
+ path: '/api/meters/{id}',
12
+ }),
13
+ update: (0, resource_1.createResourceMethod)({
14
+ method: 'PUT',
15
+ path: '/api/meters/{id}',
16
+ }),
17
+ list: (0, resource_1.createResourceMethod)({
18
+ method: 'GET',
19
+ path: '/api/meters',
20
+ }),
21
+ activate: (0, resource_1.createResourceMethod)({
22
+ method: 'PUT',
23
+ path: '/api/meters/{id}/activate',
24
+ }),
25
+ deactivate: (0, resource_1.createResourceMethod)({
26
+ method: 'PUT',
27
+ path: '/api/meters/{id}/deactivate',
28
+ }),
29
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/payment-js",
3
- "version": "1.19.0",
3
+ "version": "1.19.2",
4
4
  "description": "Node.js client for Payment Kit",
5
5
  "keywords": [
6
6
  "types",
@@ -36,7 +36,7 @@
36
36
  "url": "https://github.com/blocklet/payment-kit/issues"
37
37
  },
38
38
  "dependencies": {
39
- "@blocklet/payment-types": "1.19.0",
39
+ "@blocklet/payment-types": "1.19.2",
40
40
  "@blocklet/sdk": "^1.16.44"
41
41
  },
42
42
  "importSort": {
@@ -63,5 +63,5 @@
63
63
  "type-fest": "^4.41.0",
64
64
  "typescript": "5.5.4"
65
65
  },
66
- "gitHead": "2810263174bb900ebb5a431dc53930b08b4a8d6d"
66
+ "gitHead": "741c897204afc412721a942201516932bff59235"
67
67
  }