@absolutejs/billing 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/changelog.json +16 -0
- package/dist/creditWork.d.ts +9 -1
- package/dist/creditWork.js +16 -2
- package/dist/creditWork.js.map +3 -3
- package/docs/prepaid-credits.md +15 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,12 @@ This file is generated by `absolute-changelog` from the entries in
|
|
|
6
6
|
`changelog/`. Edit an entry, not this file — and add new ones under
|
|
7
7
|
`changelog/unreleased/`.
|
|
8
8
|
|
|
9
|
+
## 0.12.0 — 2026-09-13
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Add estimate-based background work admission while preserving exact-ID recovery and hard charge caps.** (`CreditWork`, `CreditWorkAdmission`, `canAffordCreditStep`, `createPostgresCreditWork`)
|
|
14
|
+
|
|
9
15
|
## 0.11.0 — 2026-09-13
|
|
10
16
|
|
|
11
17
|
### Changed
|
package/changelog.json
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
"contract": 1,
|
|
3
3
|
"name": "@absolutejs/billing",
|
|
4
4
|
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"changes": [
|
|
7
|
+
{
|
|
8
|
+
"kind": "added",
|
|
9
|
+
"summary": "Add estimate-based background work admission while preserving exact-ID recovery and hard charge caps.",
|
|
10
|
+
"symbols": [
|
|
11
|
+
"CreditWork",
|
|
12
|
+
"CreditWorkAdmission",
|
|
13
|
+
"canAffordCreditStep",
|
|
14
|
+
"createPostgresCreditWork"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"date": "2026-09-13",
|
|
19
|
+
"version": "0.12.0"
|
|
20
|
+
},
|
|
5
21
|
{
|
|
6
22
|
"changes": [
|
|
7
23
|
{
|
package/dist/creditWork.d.ts
CHANGED
|
@@ -3,7 +3,15 @@ export type DeferredCreditBinding = {
|
|
|
3
3
|
effectId: string;
|
|
4
4
|
authorizationId: string;
|
|
5
5
|
};
|
|
6
|
+
/** Trusted server-side admission policy, evaluated only for a new claim.
|
|
7
|
+
* This is an estimate-based floor, not a provider-cost guarantee or authorization. */
|
|
8
|
+
export type CreditWorkAdmission = {
|
|
9
|
+
minimumCredits: number;
|
|
10
|
+
policy: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const canAffordCreditStep: (budget: number, charged: number, minimumCredits: number) => boolean;
|
|
6
13
|
export type CreditWork = {
|
|
14
|
+
admission?: CreditWorkAdmission;
|
|
7
15
|
deferred?: DeferredCreditBinding;
|
|
8
16
|
checkpoint?: {
|
|
9
17
|
revision: number;
|
|
@@ -37,7 +45,7 @@ export declare const createPostgresCreditWork: (client: CreditSqlClient, schema?
|
|
|
37
45
|
* Unknown outcomes keep credits reserved and require operator reconciliation. */
|
|
38
46
|
finishDeferred: (accountId: string, workId: string, binding: DeferredCreditBinding, outcome: "succeeded" | "failed" | "unknown", result: string) => Promise<CreditWork>;
|
|
39
47
|
get: (accountId: string, workId: string) => Promise<CreditWork | null>;
|
|
40
|
-
begin: (accountId: string, workId: string, request: string, budget: number) => Promise<{
|
|
48
|
+
begin: (accountId: string, workId: string, request: string, budget: number, admit?: () => Promise<CreditWorkAdmission>) => Promise<{
|
|
41
49
|
fresh: boolean;
|
|
42
50
|
work: CreditWork;
|
|
43
51
|
}>;
|
package/dist/creditWork.js
CHANGED
|
@@ -328,6 +328,11 @@ var createPostgresCreditAccountStore = (client, schema = "billing_credits") => {
|
|
|
328
328
|
};
|
|
329
329
|
|
|
330
330
|
// src/creditWork.ts
|
|
331
|
+
var canAffordCreditStep = (budget, charged, minimumCredits) => {
|
|
332
|
+
if (![budget, charged, minimumCredits].every(Number.isSafeInteger) || budget < 1 || charged < 0 || charged > budget || minimumCredits < 1)
|
|
333
|
+
throw new Error("Invalid credit step budget");
|
|
334
|
+
return budget - charged >= minimumCredits;
|
|
335
|
+
};
|
|
331
336
|
var namespace2 = (value) => {
|
|
332
337
|
if (!/^[a-z][a-z0-9_]*$/.test(value))
|
|
333
338
|
throw new Error("Invalid credit schema name");
|
|
@@ -468,7 +473,7 @@ var createPostgresCreditWork = (client, schema = "billing_credits") => {
|
|
|
468
473
|
id(workId);
|
|
469
474
|
return client.transaction(async (sql) => await read(sql, accountId, workId) ?? null);
|
|
470
475
|
},
|
|
471
|
-
begin: (accountId, workId, request, budget) => {
|
|
476
|
+
begin: (accountId, workId, request, budget, admit) => {
|
|
472
477
|
id(accountId);
|
|
473
478
|
id(workId);
|
|
474
479
|
integer2(budget);
|
|
@@ -482,12 +487,20 @@ var createPostgresCreditWork = (client, schema = "billing_credits") => {
|
|
|
482
487
|
throw new Error("Credit work ID reused with different input");
|
|
483
488
|
return { fresh: false, work: existing };
|
|
484
489
|
}
|
|
490
|
+
const admission = admit ? await admit() : undefined;
|
|
491
|
+
if (admission) {
|
|
492
|
+
if (typeof admission.policy !== "string" || !admission.policy || admission.policy.length > 256)
|
|
493
|
+
throw new Error("Invalid credit admission policy");
|
|
494
|
+
if (!canAffordCreditStep(budget, 0, admission.minimumCredits))
|
|
495
|
+
throw new Error(`This work requires at least ${admission.minimumCredits} service credits. No credits reserved; request a new estimate and user-approved budget.`);
|
|
496
|
+
}
|
|
485
497
|
await ledger(sql).execute(accountId, `work-reserve:${workId}`, {
|
|
486
498
|
kind: "reserve",
|
|
487
499
|
reservationId: `work:${workId}`,
|
|
488
500
|
credits: budget
|
|
489
501
|
});
|
|
490
502
|
const work = {
|
|
503
|
+
...admission ? { admission: { minimumCredits: admission.minimumCredits, policy: admission.policy } } : {},
|
|
491
504
|
request,
|
|
492
505
|
budget,
|
|
493
506
|
charged: 0,
|
|
@@ -532,9 +545,10 @@ var createPostgresCreditWork = (client, schema = "billing_credits") => {
|
|
|
532
545
|
};
|
|
533
546
|
};
|
|
534
547
|
export {
|
|
548
|
+
canAffordCreditStep,
|
|
535
549
|
createPostgresCreditWork,
|
|
536
550
|
creditWorkPostgresSchemaSql
|
|
537
551
|
};
|
|
538
552
|
|
|
539
|
-
//# debugId=
|
|
553
|
+
//# debugId=2C69834D9628E60664756E2164756E21
|
|
540
554
|
//# sourceMappingURL=creditWork.js.map
|
package/dist/creditWork.js.map
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/** Service-credit accounting. Host authorization and payment verification happen\n * before these commands. Every command and its receipt commit in one transaction. */\nexport type CreditAccount = {\n periodId: string;\n periodEnd: string | null;\n periodAllowance: number;\n periodRemaining: number;\n purchasedRemaining: number;\n promotionalRemaining: number;\n debt: number;\n reserved: number;\n consumed: number;\n};\nexport type CreditAllocation = {\n period: number;\n purchased: number;\n promotional: number;\n};\nexport type CreditReservation = {\n id: string;\n periodId: string;\n allocation: CreditAllocation;\n status: \"reserved\" | \"settled\" | \"released\";\n charged: number | null;\n};\nexport type CreditCommand =\n | { kind: \"grant\"; bucket: \"purchased\" | \"promotional\"; credits: number }\n | { kind: \"reverse\"; bucket: \"purchased\" | \"promotional\"; credits: number }\n | {\n kind: \"period\";\n periodId: string;\n periodEnd: string | null;\n allowance: number;\n }\n | { kind: \"reserve\"; reservationId: string; credits: number }\n | { kind: \"settle\"; reservationId: string; credits: number }\n | { kind: \"release\"; reservationId: string }\n | { kind: \"debit\"; credits: number; allowDebt?: boolean; reference?: string };\nexport type CreditReceipt = {\n command: CreditCommand;\n account: CreditAccount;\n reservation?: CreditReservation;\n};\nexport type CreditTransaction = {\n account: CreditAccount;\n receipt: (operationId: string) => Promise<CreditReceipt | null>;\n reservation: (id: string) => Promise<CreditReservation | null>;\n save: (operationId: string, receipt: CreditReceipt) => Promise<void>;\n};\nexport type CreditAccountStore = {\n /** Persist seed once. Never overwrite an existing account. */\n initialize: (accountId: string, seed: CreditAccount) => Promise<void>;\n read: (accountId: string) => Promise<CreditAccount | null>;\n /** Lock one account, serialize its commands across processes, and roll back\n * account, reservation and receipt together if the callback fails. */\n transaction: <T>(\n accountId: string,\n run: (tx: CreditTransaction) => Promise<T>,\n ) => Promise<T>;\n};\nconst integer = (value: number) => {\n if (!Number.isSafeInteger(value) || value < 0)\n throw new Error(\"Credits must be nonnegative safe integers\");\n return value;\n};\nconst periodIdentity = (value: string) => {\n if (\n !Number.isFinite(Date.parse(value)) ||\n new Date(value).toISOString() !== value\n )\n throw new Error(\"Credit period ID must be an ISO UTC start timestamp\");\n return value;\n};\nconst identity = (value: string) => {\n if (!value || value.length > 256)\n throw new Error(\"Credit identity is invalid\");\n return value;\n};\nexport const validateCreditAccount = (account: CreditAccount) => {\n periodIdentity(account.periodId);\n if (\n account.periodEnd !== null &&\n periodIdentity(account.periodEnd) <= account.periodId\n )\n throw new Error(\"Credit period end must follow its start\");\n for (const key of [\n \"periodAllowance\",\n \"periodRemaining\",\n \"purchasedRemaining\",\n \"promotionalRemaining\",\n \"debt\",\n \"reserved\",\n \"consumed\",\n ] as const)\n integer(account[key]);\n integer(\n account.periodRemaining +\n account.purchasedRemaining +\n account.promotionalRemaining,\n );\n if (account.periodRemaining > account.periodAllowance)\n throw new Error(\"Period balance exceeds its allowance\");\n};\nexport const availableCredits = (account: CreditAccount) =>\n Math.max(\n 0,\n account.periodRemaining +\n account.purchasedRemaining +\n account.promotionalRemaining -\n account.debt,\n );\n\n/** Preserve the currently observable legacy balance without inventing purchase\n * provenance. Historical mixed bonus grants remain promotional carryover. */\nexport const migrateLegacyCreditAccount = (input: {\n periodId: string;\n periodEnd?: string | null;\n periodAllowance: number;\n bonusCredits: number;\n consumed: number;\n}): CreditAccount => {\n integer(input.periodAllowance);\n integer(input.consumed);\n if (!Number.isSafeInteger(input.bonusCredits))\n throw new Error(\"Invalid legacy bonus credits\");\n const account: CreditAccount = {\n periodId: input.periodId,\n periodEnd: input.periodEnd ?? null,\n periodAllowance: input.periodAllowance,\n periodRemaining: Math.max(0, input.periodAllowance - input.consumed),\n purchasedRemaining: 0,\n promotionalRemaining: Math.max(\n 0,\n input.bonusCredits - Math.max(0, input.consumed - input.periodAllowance),\n ),\n debt:\n Math.max(0, -input.bonusCredits) +\n Math.max(\n 0,\n input.consumed -\n input.periodAllowance -\n Math.max(0, input.bonusCredits),\n ),\n reserved: 0,\n consumed: input.consumed,\n };\n validateCreditAccount(account);\n return account;\n};\nconst allocationTotal = (value: CreditAllocation) =>\n value.period + value.promotional + value.purchased;\nconst take = (account: CreditAccount, credits: number): CreditAllocation => {\n // A reversal liability consumes existing available credits exactly once.\n let owed = account.debt;\n for (const key of [\n \"periodRemaining\",\n \"promotionalRemaining\",\n \"purchasedRemaining\",\n ] as const) {\n const covered = Math.min(account[key], owed);\n account[key] -= covered;\n owed -= covered;\n }\n account.debt = owed;\n const period = Math.min(account.periodRemaining, credits);\n const promotional = Math.min(account.promotionalRemaining, credits - period);\n const purchased = Math.min(\n account.purchasedRemaining,\n credits - period - promotional,\n );\n account.periodRemaining -= period;\n account.promotionalRemaining -= promotional;\n account.purchasedRemaining -= purchased;\n return { period, promotional, purchased };\n};\nconst grant = (\n account: CreditAccount,\n key: \"periodRemaining\" | \"purchasedRemaining\" | \"promotionalRemaining\",\n credits: number,\n) => {\n const covered = Math.min(account.debt, credits);\n account.debt -= covered;\n account[key] = integer(account[key] + credits - covered);\n};\nconst normalize = (command: CreditCommand): CreditCommand => {\n switch (command.kind) {\n case \"grant\":\n case \"reverse\":\n if (command.bucket !== \"purchased\" && command.bucket !== \"promotional\")\n throw new Error(\"Invalid credit bucket\");\n return {\n kind: command.kind,\n bucket: command.bucket,\n credits: integer(command.credits),\n };\n case \"period\":\n return {\n kind: command.kind,\n periodId: periodIdentity(command.periodId),\n periodEnd:\n command.periodEnd === null ? null : periodIdentity(command.periodEnd),\n allowance: integer(command.allowance),\n };\n case \"reserve\":\n case \"settle\":\n return {\n kind: command.kind,\n reservationId: identity(command.reservationId),\n credits: integer(command.credits),\n };\n case \"release\":\n return {\n kind: command.kind,\n reservationId: identity(command.reservationId),\n };\n case \"debit\":\n return {\n kind: command.kind,\n credits: integer(command.credits),\n allowDebt: command.allowDebt === true,\n ...(command.reference === undefined\n ? {}\n : { reference: identity(command.reference) }),\n };\n default:\n throw new Error(\"Invalid credit command\");\n }\n};\nexport const createCreditAccountLedger = (store: CreditAccountStore) => ({\n initialize: async (accountId: string, seed: CreditAccount) => {\n identity(accountId);\n validateCreditAccount(seed);\n await store.initialize(accountId, seed);\n },\n receipt: (accountId: string, operationId: string) =>\n store.transaction(identity(accountId), (tx) =>\n tx.receipt(identity(operationId)),\n ),\n balance: (accountId: string) => store.read(identity(accountId)),\n execute: async (\n accountId: string,\n operationId: string,\n input: CreditCommand,\n ): Promise<CreditReceipt> => {\n identity(accountId);\n identity(operationId);\n const command = normalize(input);\n return store.transaction(accountId, async (tx) => {\n const previous = await tx.receipt(operationId);\n if (previous) {\n if (\n JSON.stringify(normalize(previous.command)) !==\n JSON.stringify(command)\n )\n throw new Error(\"Credit operation ID reused with different input\");\n return previous;\n }\n const account = { ...tx.account };\n validateCreditAccount(account);\n let reservation: CreditReservation | undefined;\n switch (command.kind) {\n case \"grant\":\n grant(\n account,\n command.bucket === \"purchased\"\n ? \"purchasedRemaining\"\n : \"promotionalRemaining\",\n command.credits,\n );\n break;\n case \"reverse\": {\n const key =\n command.bucket === \"purchased\"\n ? \"purchasedRemaining\"\n : \"promotionalRemaining\";\n const covered = Math.min(account[key], command.credits);\n account[key] -= covered;\n account.debt += command.credits - covered;\n break;\n }\n case \"period\":\n if (command.periodId < account.periodId)\n throw new Error(\"Credit period cannot move backwards\");\n if (command.periodId === account.periodId) {\n // Upgrades add only the increase. Downgrades take effect next period.\n const increase = Math.max(\n 0,\n command.allowance - account.periodAllowance,\n );\n if (account.periodEnd === null)\n account.periodEnd = command.periodEnd;\n account.periodAllowance += increase;\n grant(account, \"periodRemaining\", increase);\n } else {\n account.periodId = command.periodId;\n account.periodEnd = command.periodEnd;\n account.periodAllowance = command.allowance;\n account.periodRemaining = 0;\n account.consumed = 0;\n grant(account, \"periodRemaining\", command.allowance);\n }\n break;\n case \"debit\": {\n if (!command.allowDebt && availableCredits(account) < command.credits)\n throw new Error(\"Insufficient credits\");\n const used = allocationTotal(take(account, command.credits));\n account.debt += command.credits - used;\n account.consumed += command.credits;\n break;\n }\n case \"reserve\":\n if (command.credits === 0)\n throw new Error(\"Reservation must be positive\");\n if (await tx.reservation(command.reservationId))\n throw new Error(\"Credit reservation already exists\");\n if (availableCredits(account) < command.credits)\n throw new Error(\"Insufficient credits\");\n reservation = {\n id: command.reservationId,\n periodId: account.periodId,\n allocation: take(account, command.credits),\n status: \"reserved\",\n charged: null,\n };\n account.reserved += command.credits;\n break;\n case \"settle\":\n case \"release\": {\n const held = await tx.reservation(command.reservationId);\n if (!held || held.status !== \"reserved\")\n throw new Error(\"Credit reservation is not active\");\n const total = allocationTotal(held.allocation);\n const charged = command.kind === \"settle\" ? command.credits : 0;\n if (charged > total)\n throw new Error(\"Charge exceeds reserved credits\");\n let refund = total - charged;\n for (const [bucket, key] of [\n [\"purchased\", \"purchasedRemaining\"],\n [\"promotional\", \"promotionalRemaining\"],\n [\"period\", \"periodRemaining\"],\n ] as const) {\n const restored = Math.min(held.allocation[bucket], refund);\n refund -= restored;\n if (bucket !== \"period\" || held.periodId === account.periodId)\n grant(account, key, restored);\n }\n account.reserved -= total;\n if (held.periodId === account.periodId) account.consumed += charged;\n reservation = {\n ...held,\n status: command.kind === \"settle\" ? \"settled\" : \"released\",\n charged,\n };\n break;\n }\n }\n validateCreditAccount(account);\n const receipt: CreditReceipt = {\n command,\n account,\n ...(reservation ? { reservation } : {}),\n };\n await tx.save(operationId, receipt);\n return receipt;\n });\n },\n});\n\n/** Portal access and funded MCP access are independent. Period-only free\n * allowances do not silently unlock prepaid work; carryover grants may. */\nexport const creditEntitlements = (input: {\n subscribed: boolean;\n prepaidEnabled: boolean;\n account: CreditAccount | null;\n}) => {\n const funded =\n input.prepaidEnabled &&\n input.account !== null &&\n input.account.purchasedRemaining + input.account.promotionalRemaining > 0 &&\n availableCredits(input.account) > 0;\n return {\n portal: input.subscribed,\n mcp: input.subscribed\n ? (\"member\" as const)\n : funded\n ? (\"prepaid\" as const)\n : (\"free\" as const),\n };\n};\n",
|
|
6
6
|
"import {\n validateCreditAccount,\n type CreditAccount,\n type CreditAccountStore,\n type CreditReceipt,\n type CreditReservation,\n} from \"./prepaid\";\nexport type CreditSql = {\n query: (\n query: string,\n parameters: readonly unknown[],\n ) => Promise<{ rows: Record<string, unknown>[] }>;\n};\nexport type CreditSqlClient = CreditSql & {\n transaction: <T>(run: (sql: CreditSql) => Promise<T>) => Promise<T>;\n};\nconst namespace = (value: string) => {\n if (!/^[a-z][a-z0-9_]*$/.test(value))\n throw new Error(\"Invalid credit schema name\");\n return value;\n};\nexport const creditAccountPostgresSchemaSql = (schema = \"billing_credits\") => {\n const n = namespace(schema);\n return `CREATE SCHEMA IF NOT EXISTS ${n};\nCREATE TABLE IF NOT EXISTS ${n}.accounts (\n account_id text PRIMARY KEY, state jsonb NOT NULL, initial_state jsonb NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE TABLE IF NOT EXISTS ${n}.operations (\n account_id text NOT NULL REFERENCES ${n}.accounts(account_id), operation_id text NOT NULL,\n receipt jsonb NOT NULL, created_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (account_id, operation_id)\n);\nCREATE TABLE IF NOT EXISTS ${n}.reservations (\n account_id text NOT NULL REFERENCES ${n}.accounts(account_id), reservation_id text NOT NULL,\n state jsonb NOT NULL, updated_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (account_id, reservation_id)\n);`;\n};\nexport const createPostgresCreditAccountStore = (\n client: CreditSqlClient,\n schema = \"billing_credits\",\n): CreditAccountStore => {\n const n = namespace(schema);\n const read = async (sql: CreditSql, accountId: string, lock = false) => {\n const { rows } = await sql.query(\n `SELECT state FROM ${n}.accounts WHERE account_id = $1${lock ? \" FOR UPDATE\" : \"\"}`,\n [accountId],\n );\n if (!rows[0]) return null;\n const state = rows[0].state as CreditAccount;\n validateCreditAccount(state);\n return state;\n };\n return {\n initialize: async (accountId, seed) => {\n validateCreditAccount(seed);\n await client.query(\n `INSERT INTO ${n}.accounts (account_id, state, initial_state) VALUES ($1, $2::text::jsonb, $2::text::jsonb) ON CONFLICT DO NOTHING`,\n [accountId, JSON.stringify(seed)],\n );\n },\n read: (accountId) => read(client, accountId),\n transaction: (accountId, run) =>\n client.transaction(async (sql) => {\n const account = await read(sql, accountId, true);\n if (!account) throw new Error(\"Credit account is not initialized\");\n return run({\n account,\n receipt: async (operationId) => {\n const { rows } = await sql.query(\n `SELECT receipt FROM ${n}.operations WHERE account_id = $1 AND operation_id = $2`,\n [accountId, operationId],\n );\n return (rows[0]?.receipt as CreditReceipt | undefined) ?? null;\n },\n reservation: async (id) => {\n const { rows } = await sql.query(\n `SELECT state FROM ${n}.reservations WHERE account_id = $1 AND reservation_id = $2`,\n [accountId, id],\n );\n return (rows[0]?.state as CreditReservation | undefined) ?? null;\n },\n save: async (operationId, receipt) => {\n await sql.query(\n `UPDATE ${n}.accounts SET state = $2::text::jsonb, updated_at = now() WHERE account_id = $1`,\n [accountId, JSON.stringify(receipt.account)],\n );\n if (receipt.reservation)\n await sql.query(\n `INSERT INTO ${n}.reservations (account_id, reservation_id, state) VALUES ($1, $2, $3::text::jsonb) ON CONFLICT (account_id, reservation_id) DO UPDATE SET state = EXCLUDED.state, updated_at = now()`,\n [\n accountId,\n receipt.reservation.id,\n JSON.stringify(receipt.reservation),\n ],\n );\n await sql.query(\n `INSERT INTO ${n}.operations (account_id, operation_id, receipt) VALUES ($1, $2, $3::text::jsonb)`,\n [accountId, operationId, JSON.stringify(receipt)],\n );\n },\n });\n }),\n };\n};\n",
|
|
7
|
-
"import { createCreditAccountLedger } from \"./prepaid\";\nimport {\n createPostgresCreditAccountStore,\n type CreditSql,\n type CreditSqlClient,\n} from \"./prepaidPostgres\";\nexport type DeferredCreditBinding = {\n effectId: string;\n authorizationId: string;\n};\nexport type CreditWork = {\n deferred?: DeferredCreditBinding;\n checkpoint?: { revision: number; value: string };\n request: string;\n budget: number;\n charged: number;\n absorbed: number;\n status: \"running\" | \"completed\" | \"failed\";\n result: string | null;\n};\nconst namespace = (value: string) => {\n if (!/^[a-z][a-z0-9_]*$/.test(value))\n throw new Error(\"Invalid credit schema name\");\n return value;\n};\nconst id = (value: string) => {\n if (!value || value.length > 128) throw new Error(\"Invalid credit work ID\");\n};\nconst integer = (value: number) => {\n if (!Number.isSafeInteger(value) || value < 0)\n throw new Error(\"Invalid credit work amount\");\n};\nexport const creditWorkPostgresSchemaSql = (schema = \"billing_credits\") => {\n const n = namespace(schema);\n return `CREATE TABLE IF NOT EXISTS ${n}.work (\n account_id text NOT NULL REFERENCES ${n}.accounts(account_id), work_id text NOT NULL,\n state jsonb NOT NULL, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(account_id, work_id)\n );\n CREATE TABLE IF NOT EXISTS ${n}.work_usage (\n account_id text NOT NULL, work_id text NOT NULL, event_id text NOT NULL,\n credits bigint NOT NULL CHECK (credits >= 0), charged bigint NOT NULL CHECK (charged >= 0 AND charged <= credits), reference text NOT NULL,\n PRIMARY KEY(account_id, work_id, event_id), FOREIGN KEY(account_id, work_id) REFERENCES ${n}.work(account_id, work_id)\n );`;\n};\n/** Durable execution claim + capped customer charge. A crash leaves work running\n * and its credits held: never automatically rerun an uncertain external effect.\n * Provider cost over the agreed budget is recorded as absorbed, not customer debt. */\nexport const createPostgresCreditWork = (\n client: CreditSqlClient,\n schema = \"billing_credits\",\n) => {\n const n = namespace(schema);\n const read = async (sql: CreditSql, accountId: string, workId: string) => {\n const { rows } = await sql.query(\n `SELECT state FROM ${n}.work WHERE account_id = $1 AND work_id = $2 FOR UPDATE`,\n [accountId, workId],\n );\n return rows[0]?.state as CreditWork | undefined;\n };\n const save = (\n sql: CreditSql,\n accountId: string,\n workId: string,\n state: CreditWork,\n ) =>\n sql.query(\n `UPDATE ${n}.work SET state = $3::text::jsonb, updated_at = now() WHERE account_id = $1 AND work_id = $2`,\n [accountId, workId, JSON.stringify(state)],\n );\n const ledger = (sql: CreditSql) =>\n createCreditAccountLedger(\n createPostgresCreditAccountStore(\n { ...sql, transaction: (run) => run(sql) },\n schema,\n ),\n );\n const bindingMatches = (work: CreditWork, binding: DeferredCreditBinding) => {\n id(binding.effectId);\n id(binding.authorizationId);\n if (\n work.deferred?.effectId !== binding.effectId ||\n work.deferred.authorizationId !== binding.authorizationId\n )\n throw new Error(\"Deferred credit authorization mismatch\");\n };\n const finish = (\n accountId: string,\n workId: string,\n result: string,\n failed: boolean,\n binding?: DeferredCreditBinding,\n ) => {\n id(accountId);\n id(workId);\n return client.transaction(async (sql) => {\n await sql.query(\n `SELECT account_id FROM ${n}.accounts WHERE account_id = $1 FOR UPDATE`,\n [accountId],\n );\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n if (binding) bindingMatches(work, binding);\n else if (work.deferred)\n throw new Error(\"Deferred work requires its bound worker outcome\");\n if (work.status !== \"running\") return work;\n await ledger(sql).execute(accountId, `work-settle:${workId}`, {\n kind: \"settle\",\n reservationId: `work:${workId}`,\n credits: work.charged,\n });\n work.status = failed ? \"failed\" : \"completed\";\n work.result = result;\n await save(sql, accountId, workId, work);\n return work;\n });\n };\n return {\n /** Bound durable progress only: the caller must already own the effect lease.\n * CAS prevents stale workers from overwriting a newer checkpoint. */\n checkpointDeferred: (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n expectedRevision: number,\n value: string,\n ) => {\n id(accountId);\n id(workId);\n integer(expectedRevision);\n if (expectedRevision === Number.MAX_SAFE_INTEGER || typeof value !== \"string\" || value.length > 1_000_000)\n throw new Error(\"Invalid credit work checkpoint\");\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n bindingMatches(work, binding);\n if (work.status !== \"running\") throw new Error(\"Credit work already finished\");\n if ((work.checkpoint?.revision ?? 0) !== expectedRevision)\n throw new Error(\"Credit work checkpoint revision mismatch\");\n work.checkpoint = { revision: expectedRevision + 1, value };\n await save(sql, accountId, workId, work);\n return work.checkpoint;\n });\n },\n /** Call inside the same transaction as begin, authorization binding and outbox\n * enqueue. This transfers a reservation, never starts work or grants a lease. */\n handoff: (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n ) => {\n id(accountId);\n id(workId);\n id(binding.effectId);\n id(binding.authorizationId);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n if (work.deferred) {\n bindingMatches(work, binding);\n return work;\n }\n if (work.status !== \"running\")\n throw new Error(\"Credit work already finished\");\n work.deferred = {\n effectId: binding.effectId,\n authorizationId: binding.authorizationId,\n };\n await save(sql, accountId, workId, work);\n return work;\n });\n },\n /** Trusted worker reattaches accounting after its durable execution claim.\n * This is NOT execution authorization or permission to retry a provider. */\n resumeDeferred: (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n ) => {\n id(accountId);\n id(workId);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n bindingMatches(work, binding);\n return work;\n });\n },\n /** Settle only a durable terminal result after all usage writes are drained.\n * Unknown outcomes keep credits reserved and require operator reconciliation. */\n finishDeferred: async (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n outcome: \"succeeded\" | \"failed\" | \"unknown\",\n result: string,\n ) => {\n if (\n outcome !== \"succeeded\" &&\n outcome !== \"failed\" &&\n outcome !== \"unknown\"\n )\n throw new Error(\"Invalid deferred outcome\");\n if (outcome !== \"unknown\")\n return finish(accountId, workId, result, outcome === \"failed\", binding);\n id(accountId);\n id(workId);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n bindingMatches(work, binding);\n return work;\n });\n },\n get: (accountId: string, workId: string) => {\n id(accountId);\n id(workId);\n return client.transaction(\n async (sql) => (await read(sql, accountId, workId)) ?? null,\n );\n },\n begin: (\n accountId: string,\n workId: string,\n request: string,\n budget: number,\n ) => {\n id(accountId);\n id(workId);\n integer(budget);\n if (!budget || !request || request.length > 256)\n throw new Error(\"Invalid credit work request\");\n return client.transaction(async (sql) => {\n // One account lock serializes competing claims, including absent work rows.\n await sql.query(\n `SELECT account_id FROM ${n}.accounts WHERE account_id = $1 FOR UPDATE`,\n [accountId],\n );\n const existing = await read(sql, accountId, workId);\n if (existing) {\n if (existing.request !== request || existing.budget !== budget)\n throw new Error(\"Credit work ID reused with different input\");\n return { fresh: false, work: existing };\n }\n await ledger(sql).execute(accountId, `work-reserve:${workId}`, {\n kind: \"reserve\",\n reservationId: `work:${workId}`,\n credits: budget,\n });\n const work: CreditWork = {\n request,\n budget,\n charged: 0,\n absorbed: 0,\n status: \"running\",\n result: null,\n };\n await sql.query(\n `INSERT INTO ${n}.work (account_id, work_id, state) VALUES ($1, $2, $3::text::jsonb)`,\n [accountId, workId, JSON.stringify(work)],\n );\n return { fresh: true, work };\n });\n },\n record: (\n accountId: string,\n workId: string,\n eventId: string,\n credits: number,\n reference: string,\n ) => {\n id(accountId);\n id(workId);\n id(eventId);\n integer(credits);\n id(reference);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n const { rows } = await sql.query(\n `SELECT credits, charged, reference FROM ${n}.work_usage WHERE account_id = $1 AND work_id = $2 AND event_id = $3`,\n [accountId, workId, eventId],\n );\n const previous = rows[0];\n if (previous) {\n if (\n Number(previous.credits) !== credits ||\n previous.reference !== reference\n )\n throw new Error(\"Credit work event reused with different input\");\n return { charged: Number(previous.charged), fresh: false };\n }\n if (work.status !== \"running\")\n throw new Error(\"Credit work already finished\");\n const charged = Math.min(credits, work.budget - work.charged);\n work.charged += charged;\n work.absorbed += credits - charged;\n integer(work.charged);\n integer(work.absorbed);\n await sql.query(\n `INSERT INTO ${n}.work_usage (account_id, work_id, event_id, credits, charged, reference) VALUES ($1, $2, $3, $4, $5, $6)`,\n [accountId, workId, eventId, credits, charged, reference],\n );\n await save(sql, accountId, workId, work);\n return { charged, fresh: true };\n });\n },\n finish: (\n accountId: string,\n workId: string,\n result: string,\n failed = false,\n ) => finish(accountId, workId, result, failed),\n };\n};\n"
|
|
7
|
+
"import { createCreditAccountLedger } from \"./prepaid\";\nimport {\n createPostgresCreditAccountStore,\n type CreditSql,\n type CreditSqlClient,\n} from \"./prepaidPostgres\";\nexport type DeferredCreditBinding = {\n effectId: string;\n authorizationId: string;\n};\n/** Trusted server-side admission policy, evaluated only for a new claim.\n * This is an estimate-based floor, not a provider-cost guarantee or authorization. */\nexport type CreditWorkAdmission = { minimumCredits: number; policy: string };\nexport const canAffordCreditStep = (budget: number, charged: number, minimumCredits: number) => {\n if (![budget, charged, minimumCredits].every(Number.isSafeInteger) || budget < 1 || charged < 0 || charged > budget || minimumCredits < 1)\n throw new Error(\"Invalid credit step budget\");\n return budget - charged >= minimumCredits;\n};\nexport type CreditWork = {\n admission?: CreditWorkAdmission;\n deferred?: DeferredCreditBinding;\n checkpoint?: { revision: number; value: string };\n request: string;\n budget: number;\n charged: number;\n absorbed: number;\n status: \"running\" | \"completed\" | \"failed\";\n result: string | null;\n};\nconst namespace = (value: string) => {\n if (!/^[a-z][a-z0-9_]*$/.test(value))\n throw new Error(\"Invalid credit schema name\");\n return value;\n};\nconst id = (value: string) => {\n if (!value || value.length > 128) throw new Error(\"Invalid credit work ID\");\n};\nconst integer = (value: number) => {\n if (!Number.isSafeInteger(value) || value < 0)\n throw new Error(\"Invalid credit work amount\");\n};\nexport const creditWorkPostgresSchemaSql = (schema = \"billing_credits\") => {\n const n = namespace(schema);\n return `CREATE TABLE IF NOT EXISTS ${n}.work (\n account_id text NOT NULL REFERENCES ${n}.accounts(account_id), work_id text NOT NULL,\n state jsonb NOT NULL, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(account_id, work_id)\n );\n CREATE TABLE IF NOT EXISTS ${n}.work_usage (\n account_id text NOT NULL, work_id text NOT NULL, event_id text NOT NULL,\n credits bigint NOT NULL CHECK (credits >= 0), charged bigint NOT NULL CHECK (charged >= 0 AND charged <= credits), reference text NOT NULL,\n PRIMARY KEY(account_id, work_id, event_id), FOREIGN KEY(account_id, work_id) REFERENCES ${n}.work(account_id, work_id)\n );`;\n};\n/** Durable execution claim + capped customer charge. A crash leaves work running\n * and its credits held: never automatically rerun an uncertain external effect.\n * Provider cost over the agreed budget is recorded as absorbed, not customer debt. */\nexport const createPostgresCreditWork = (\n client: CreditSqlClient,\n schema = \"billing_credits\",\n) => {\n const n = namespace(schema);\n const read = async (sql: CreditSql, accountId: string, workId: string) => {\n const { rows } = await sql.query(\n `SELECT state FROM ${n}.work WHERE account_id = $1 AND work_id = $2 FOR UPDATE`,\n [accountId, workId],\n );\n return rows[0]?.state as CreditWork | undefined;\n };\n const save = (\n sql: CreditSql,\n accountId: string,\n workId: string,\n state: CreditWork,\n ) =>\n sql.query(\n `UPDATE ${n}.work SET state = $3::text::jsonb, updated_at = now() WHERE account_id = $1 AND work_id = $2`,\n [accountId, workId, JSON.stringify(state)],\n );\n const ledger = (sql: CreditSql) =>\n createCreditAccountLedger(\n createPostgresCreditAccountStore(\n { ...sql, transaction: (run) => run(sql) },\n schema,\n ),\n );\n const bindingMatches = (work: CreditWork, binding: DeferredCreditBinding) => {\n id(binding.effectId);\n id(binding.authorizationId);\n if (\n work.deferred?.effectId !== binding.effectId ||\n work.deferred.authorizationId !== binding.authorizationId\n )\n throw new Error(\"Deferred credit authorization mismatch\");\n };\n const finish = (\n accountId: string,\n workId: string,\n result: string,\n failed: boolean,\n binding?: DeferredCreditBinding,\n ) => {\n id(accountId);\n id(workId);\n return client.transaction(async (sql) => {\n await sql.query(\n `SELECT account_id FROM ${n}.accounts WHERE account_id = $1 FOR UPDATE`,\n [accountId],\n );\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n if (binding) bindingMatches(work, binding);\n else if (work.deferred)\n throw new Error(\"Deferred work requires its bound worker outcome\");\n if (work.status !== \"running\") return work;\n await ledger(sql).execute(accountId, `work-settle:${workId}`, {\n kind: \"settle\",\n reservationId: `work:${workId}`,\n credits: work.charged,\n });\n work.status = failed ? \"failed\" : \"completed\";\n work.result = result;\n await save(sql, accountId, workId, work);\n return work;\n });\n };\n return {\n /** Bound durable progress only: the caller must already own the effect lease.\n * CAS prevents stale workers from overwriting a newer checkpoint. */\n checkpointDeferred: (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n expectedRevision: number,\n value: string,\n ) => {\n id(accountId);\n id(workId);\n integer(expectedRevision);\n if (expectedRevision === Number.MAX_SAFE_INTEGER || typeof value !== \"string\" || value.length > 1_000_000)\n throw new Error(\"Invalid credit work checkpoint\");\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n bindingMatches(work, binding);\n if (work.status !== \"running\") throw new Error(\"Credit work already finished\");\n if ((work.checkpoint?.revision ?? 0) !== expectedRevision)\n throw new Error(\"Credit work checkpoint revision mismatch\");\n work.checkpoint = { revision: expectedRevision + 1, value };\n await save(sql, accountId, workId, work);\n return work.checkpoint;\n });\n },\n /** Call inside the same transaction as begin, authorization binding and outbox\n * enqueue. This transfers a reservation, never starts work or grants a lease. */\n handoff: (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n ) => {\n id(accountId);\n id(workId);\n id(binding.effectId);\n id(binding.authorizationId);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n if (work.deferred) {\n bindingMatches(work, binding);\n return work;\n }\n if (work.status !== \"running\")\n throw new Error(\"Credit work already finished\");\n work.deferred = {\n effectId: binding.effectId,\n authorizationId: binding.authorizationId,\n };\n await save(sql, accountId, workId, work);\n return work;\n });\n },\n /** Trusted worker reattaches accounting after its durable execution claim.\n * This is NOT execution authorization or permission to retry a provider. */\n resumeDeferred: (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n ) => {\n id(accountId);\n id(workId);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n bindingMatches(work, binding);\n return work;\n });\n },\n /** Settle only a durable terminal result after all usage writes are drained.\n * Unknown outcomes keep credits reserved and require operator reconciliation. */\n finishDeferred: async (\n accountId: string,\n workId: string,\n binding: DeferredCreditBinding,\n outcome: \"succeeded\" | \"failed\" | \"unknown\",\n result: string,\n ) => {\n if (\n outcome !== \"succeeded\" &&\n outcome !== \"failed\" &&\n outcome !== \"unknown\"\n )\n throw new Error(\"Invalid deferred outcome\");\n if (outcome !== \"unknown\")\n return finish(accountId, workId, result, outcome === \"failed\", binding);\n id(accountId);\n id(workId);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n bindingMatches(work, binding);\n return work;\n });\n },\n get: (accountId: string, workId: string) => {\n id(accountId);\n id(workId);\n return client.transaction(\n async (sql) => (await read(sql, accountId, workId)) ?? null,\n );\n },\n begin: (\n accountId: string,\n workId: string,\n request: string,\n budget: number,\n admit?: () => Promise<CreditWorkAdmission>,\n ) => {\n id(accountId);\n id(workId);\n integer(budget);\n if (!budget || !request || request.length > 256)\n throw new Error(\"Invalid credit work request\");\n return client.transaction(async (sql) => {\n // One account lock serializes competing claims, including absent work rows.\n await sql.query(\n `SELECT account_id FROM ${n}.accounts WHERE account_id = $1 FOR UPDATE`,\n [accountId],\n );\n const existing = await read(sql, accountId, workId);\n if (existing) {\n if (existing.request !== request || existing.budget !== budget)\n throw new Error(\"Credit work ID reused with different input\");\n return { fresh: false, work: existing };\n }\n const admission = admit ? await admit() : undefined;\n if (admission) {\n if (typeof admission.policy !== \"string\" || !admission.policy || admission.policy.length > 256)\n throw new Error(\"Invalid credit admission policy\");\n if (!canAffordCreditStep(budget, 0, admission.minimumCredits))\n throw new Error(`This work requires at least ${admission.minimumCredits} service credits. No credits reserved; request a new estimate and user-approved budget.`);\n }\n await ledger(sql).execute(accountId, `work-reserve:${workId}`, {\n kind: \"reserve\",\n reservationId: `work:${workId}`,\n credits: budget,\n });\n const work: CreditWork = {\n ...(admission ? { admission: { minimumCredits: admission.minimumCredits, policy: admission.policy } } : {}),\n request,\n budget,\n charged: 0,\n absorbed: 0,\n status: \"running\",\n result: null,\n };\n await sql.query(\n `INSERT INTO ${n}.work (account_id, work_id, state) VALUES ($1, $2, $3::text::jsonb)`,\n [accountId, workId, JSON.stringify(work)],\n );\n return { fresh: true, work };\n });\n },\n record: (\n accountId: string,\n workId: string,\n eventId: string,\n credits: number,\n reference: string,\n ) => {\n id(accountId);\n id(workId);\n id(eventId);\n integer(credits);\n id(reference);\n return client.transaction(async (sql) => {\n const work = await read(sql, accountId, workId);\n if (!work) throw new Error(\"Credit work does not exist\");\n const { rows } = await sql.query(\n `SELECT credits, charged, reference FROM ${n}.work_usage WHERE account_id = $1 AND work_id = $2 AND event_id = $3`,\n [accountId, workId, eventId],\n );\n const previous = rows[0];\n if (previous) {\n if (\n Number(previous.credits) !== credits ||\n previous.reference !== reference\n )\n throw new Error(\"Credit work event reused with different input\");\n return { charged: Number(previous.charged), fresh: false };\n }\n if (work.status !== \"running\")\n throw new Error(\"Credit work already finished\");\n const charged = Math.min(credits, work.budget - work.charged);\n work.charged += charged;\n work.absorbed += credits - charged;\n integer(work.charged);\n integer(work.absorbed);\n await sql.query(\n `INSERT INTO ${n}.work_usage (account_id, work_id, event_id, credits, charged, reference) VALUES ($1, $2, $3, $4, $5, $6)`,\n [accountId, workId, eventId, credits, charged, reference],\n );\n await save(sql, accountId, workId, work);\n return { charged, fresh: true };\n });\n },\n finish: (\n accountId: string,\n workId: string,\n result: string,\n failed = false,\n ) => finish(accountId, workId, result, failed),\n };\n};\n"
|
|
8
8
|
],
|
|
9
|
-
"mappings": "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",
|
|
10
|
-
"debugId": "
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "2C69834D9628E60664756E2164756E21",
|
|
11
11
|
"names": []
|
|
12
12
|
}
|
package/docs/prepaid-credits.md
CHANGED
|
@@ -56,3 +56,18 @@ Charges remain capped at the approved budget; overruns are absorbed. Unused
|
|
|
56
56
|
credits are released only on definite settlement. An unknown external outcome
|
|
57
57
|
requires the application's audited reconciliation process before settlement or
|
|
58
58
|
any replacement action. No automatic expiry release is safe for an uncertain send.
|
|
59
|
+
|
|
60
|
+
### Minimum-budget admission
|
|
61
|
+
|
|
62
|
+
Pass a trusted async fifth argument to `begin` returning `{ minimumCredits,
|
|
63
|
+
policy }`. It runs under the account lock only for a new work ID, before any
|
|
64
|
+
reservation. Rejecting or unavailable pricing rolls back without a claim. Exact
|
|
65
|
+
replays still validate the original input and budget, but never call admission.
|
|
66
|
+
Keep admission local and quick; do not call a provider while holding this lock.
|
|
67
|
+
|
|
68
|
+
The policy is persisted in `work.admission`. Workers can use
|
|
69
|
+
`canAffordCreditStep(budget, charged, minimumCredits)` after draining usage and
|
|
70
|
+
before marking a new provider step in flight. Use a conservative current estimate
|
|
71
|
+
and the persisted floor; stop with saved partial results when it no longer fits.
|
|
72
|
+
An estimate is not an authorization, guaranteed price, or provider-spend ceiling.
|
|
73
|
+
The explicit charge cap and absorbed overrun accounting still apply.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@absolutejs/billing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Provider-neutral pricing and invoice computation used by the hosted AbsoluteJS.ai platform. Converts metered usage into exact integer-micro line items with tiers and allowances.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|