@agenticprimitives/payments 0.0.0-alpha.10

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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/dist/entitlement/index.d.ts +125 -0
  4. package/dist/entitlement/index.d.ts.map +1 -0
  5. package/dist/entitlement/index.js +128 -0
  6. package/dist/entitlement/index.js.map +1 -0
  7. package/dist/entitlement/voucher.d.ts +85 -0
  8. package/dist/entitlement/voucher.d.ts.map +1 -0
  9. package/dist/entitlement/voucher.js +109 -0
  10. package/dist/entitlement/voucher.js.map +1 -0
  11. package/dist/index.d.ts +135 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +60 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/mandate-sign.d.ts +187 -0
  16. package/dist/mandate-sign.d.ts.map +1 -0
  17. package/dist/mandate-sign.js +177 -0
  18. package/dist/mandate-sign.js.map +1 -0
  19. package/dist/mandate.d.ts +33 -0
  20. package/dist/mandate.d.ts.map +1 -0
  21. package/dist/mandate.js +40 -0
  22. package/dist/mandate.js.map +1 -0
  23. package/dist/ops.d.ts +55 -0
  24. package/dist/ops.d.ts.map +1 -0
  25. package/dist/ops.js +66 -0
  26. package/dist/ops.js.map +1 -0
  27. package/dist/rails/escrow.d.ts +156 -0
  28. package/dist/rails/escrow.d.ts.map +1 -0
  29. package/dist/rails/escrow.js +88 -0
  30. package/dist/rails/escrow.js.map +1 -0
  31. package/dist/rails/invoice.d.ts +65 -0
  32. package/dist/rails/invoice.d.ts.map +1 -0
  33. package/dist/rails/invoice.js +57 -0
  34. package/dist/rails/invoice.js.map +1 -0
  35. package/dist/rails/recurring.d.ts +56 -0
  36. package/dist/rails/recurring.d.ts.map +1 -0
  37. package/dist/rails/recurring.js +58 -0
  38. package/dist/rails/recurring.js.map +1 -0
  39. package/dist/rails/wallet.d.ts +16 -0
  40. package/dist/rails/wallet.d.ts.map +1 -0
  41. package/dist/rails/wallet.js +20 -0
  42. package/dist/rails/wallet.js.map +1 -0
  43. package/dist/rails/x402/executor.d.ts +118 -0
  44. package/dist/rails/x402/executor.d.ts.map +1 -0
  45. package/dist/rails/x402/executor.js +243 -0
  46. package/dist/rails/x402/executor.js.map +1 -0
  47. package/dist/rails/x402/index.d.ts +11 -0
  48. package/dist/rails/x402/index.d.ts.map +1 -0
  49. package/dist/rails/x402/index.js +8 -0
  50. package/dist/rails/x402/index.js.map +1 -0
  51. package/dist/rails/x402/nonce-store.d.ts +30 -0
  52. package/dist/rails/x402/nonce-store.d.ts.map +1 -0
  53. package/dist/rails/x402/nonce-store.js +35 -0
  54. package/dist/rails/x402/nonce-store.js.map +1 -0
  55. package/dist/rails/x402/quote.d.ts +41 -0
  56. package/dist/rails/x402/quote.d.ts.map +1 -0
  57. package/dist/rails/x402/quote.js +84 -0
  58. package/dist/rails/x402/quote.js.map +1 -0
  59. package/dist/rails/x402/resource.d.ts +42 -0
  60. package/dist/rails/x402/resource.d.ts.map +1 -0
  61. package/dist/rails/x402/resource.js +71 -0
  62. package/dist/rails/x402/resource.js.map +1 -0
  63. package/dist/rails/x402/wire.d.ts +81 -0
  64. package/dist/rails/x402/wire.d.ts.map +1 -0
  65. package/dist/rails/x402/wire.js +125 -0
  66. package/dist/rails/x402/wire.js.map +1 -0
  67. package/dist/receipt.d.ts +36 -0
  68. package/dist/receipt.d.ts.map +1 -0
  69. package/dist/receipt.js +50 -0
  70. package/dist/receipt.js.map +1 -0
  71. package/dist/refund.d.ts +29 -0
  72. package/dist/refund.d.ts.map +1 -0
  73. package/dist/refund.js +19 -0
  74. package/dist/refund.js.map +1 -0
  75. package/dist/split.d.ts +27 -0
  76. package/dist/split.d.ts.map +1 -0
  77. package/dist/split.js +33 -0
  78. package/dist/split.js.map +1 -0
  79. package/dist/transfer.d.ts +51 -0
  80. package/dist/transfer.d.ts.map +1 -0
  81. package/dist/transfer.js +54 -0
  82. package/dist/transfer.js.map +1 -0
  83. package/package.json +61 -0
  84. package/spec.md +5 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Split payouts (spec 243 §5.5) — app-triggered payout fan-out.
3
+ *
4
+ * One amount split to N recipients by basis points (Seaport recipient-specific-consideration
5
+ * pattern). `bps` MUST sum to 10000; the rounding remainder is assigned to the first recipient
6
+ * so the legs total EXACTLY `amount` (no dust left in the treasury). Each leg is its own
7
+ * transfer plan (and its own receipt). Connected-account onboarding / KYB stays app layer.
8
+ */
9
+ import type { Address } from '@agenticprimitives/types';
10
+ import { type TransferPlan } from './transfer.js';
11
+ export interface SplitRecipient {
12
+ to: Address;
13
+ bps: number;
14
+ }
15
+ export interface SplitLeg {
16
+ to: Address;
17
+ bps: number;
18
+ amount: bigint;
19
+ plan: TransferPlan;
20
+ }
21
+ export declare const BPS_DENOMINATOR = 10000;
22
+ export declare function buildSplitPayout(input: {
23
+ asset: Address;
24
+ amount: bigint;
25
+ recipients: SplitRecipient[];
26
+ }): SplitLeg[];
27
+ //# sourceMappingURL=split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../src/split.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,cAAc,EAAE,CAAA;CAAE,GAAG,QAAQ,EAAE,CAkBpH"}
package/dist/split.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Split payouts (spec 243 §5.5) — app-triggered payout fan-out.
3
+ *
4
+ * One amount split to N recipients by basis points (Seaport recipient-specific-consideration
5
+ * pattern). `bps` MUST sum to 10000; the rounding remainder is assigned to the first recipient
6
+ * so the legs total EXACTLY `amount` (no dust left in the treasury). Each leg is its own
7
+ * transfer plan (and its own receipt). Connected-account onboarding / KYB stays app layer.
8
+ */
9
+ import { buildErc20Transfer } from './transfer.js';
10
+ export const BPS_DENOMINATOR = 10_000;
11
+ export function buildSplitPayout(input) {
12
+ const { asset, amount, recipients } = input;
13
+ if (recipients.length === 0)
14
+ throw new Error('[split] at least one recipient required');
15
+ if (amount <= 0n)
16
+ throw new Error('[split] amount must be > 0');
17
+ const totalBps = recipients.reduce((s, r) => s + r.bps, 0);
18
+ if (totalBps !== BPS_DENOMINATOR)
19
+ throw new Error(`[split] bps must sum to ${BPS_DENOMINATOR}, got ${totalBps}`);
20
+ for (const r of recipients)
21
+ if (r.bps <= 0)
22
+ throw new Error('[split] each recipient bps must be > 0');
23
+ const amounts = recipients.map((r) => (amount * BigInt(r.bps)) / BigInt(BPS_DENOMINATOR));
24
+ const remainder = amount - amounts.reduce((s, a) => s + a, 0n);
25
+ amounts[0] += remainder; // assign rounding dust to the first recipient → legs total exactly `amount`
26
+ return recipients.map((r, i) => ({
27
+ to: r.to,
28
+ bps: r.bps,
29
+ amount: amounts[i],
30
+ plan: buildErc20Transfer(asset, r.to, amounts[i]),
31
+ }));
32
+ }
33
+ //# sourceMappingURL=split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.js","sourceRoot":"","sources":["../src/split.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,kBAAkB,EAAqB,MAAM,eAAe,CAAC;AActE,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,MAAM,UAAU,gBAAgB,CAAC,KAAuE;IACtG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACxF,IAAI,MAAM,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,QAAQ,KAAK,eAAe;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,eAAe,SAAS,QAAQ,EAAE,CAAC,CAAC;IACjH,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAEtG,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,CAAC,CAAE,IAAI,SAAS,CAAC,CAAC,4EAA4E;IAEtG,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE;QACnB,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC;KACnD,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Shared transfer-plan plumbing for the non-x402 rails (spec 243 §5.5).
3
+ *
4
+ * A `TransferPlan` is the inner call an SA executes (`AgentAccount.execute(to, value, data)`
5
+ * or a UserOp / wallet tx) — the same `{to, value, data}` shape the x402 rail's
6
+ * `buildRedemptionCalldata` returns. Wallet / invoice / refund / split all reduce to one or
7
+ * more ERC-20 transfers from the payer or treasury SA.
8
+ */
9
+ import { type Address, type Hex } from 'viem';
10
+ export interface TransferPlan {
11
+ to: Address;
12
+ value: bigint;
13
+ data: Hex;
14
+ }
15
+ export declare const ERC20_TRANSFER_ABI: readonly [{
16
+ readonly type: "function";
17
+ readonly name: "transfer";
18
+ readonly stateMutability: "nonpayable";
19
+ readonly inputs: readonly [{
20
+ readonly name: "to";
21
+ readonly type: "address";
22
+ }, {
23
+ readonly name: "amount";
24
+ readonly type: "uint256";
25
+ }];
26
+ readonly outputs: readonly [{
27
+ readonly type: "bool";
28
+ }];
29
+ }];
30
+ /** A single ERC-20 transfer: the executing SA calls `asset.transfer(to, amount)`. */
31
+ export declare function buildErc20Transfer(asset: Address, to: Address, amount: bigint): TransferPlan;
32
+ /** A native-value transfer (the executing SA sends `amount` wei to `to`). */
33
+ export declare function buildNativeTransfer(to: Address, amount: bigint): TransferPlan;
34
+ export declare const ERC20_APPROVE_ABI: readonly [{
35
+ readonly type: "function";
36
+ readonly name: "approve";
37
+ readonly stateMutability: "nonpayable";
38
+ readonly inputs: readonly [{
39
+ readonly name: "spender";
40
+ readonly type: "address";
41
+ }, {
42
+ readonly name: "amount";
43
+ readonly type: "uint256";
44
+ }];
45
+ readonly outputs: readonly [{
46
+ readonly type: "bool";
47
+ }];
48
+ }];
49
+ /** An ERC-20 approval — needed before the escrow `deposit` pulls funds via `transferFrom`. */
50
+ export declare function buildErc20Approve(asset: Address, spender: Address, amount: bigint): TransferPlan;
51
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAsB,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;CACX;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;EAWrB,CAAC;AAEX,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAM5F;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAE7E;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;EAWpB,CAAC;AAEX,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAMhG"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Shared transfer-plan plumbing for the non-x402 rails (spec 243 §5.5).
3
+ *
4
+ * A `TransferPlan` is the inner call an SA executes (`AgentAccount.execute(to, value, data)`
5
+ * or a UserOp / wallet tx) — the same `{to, value, data}` shape the x402 rail's
6
+ * `buildRedemptionCalldata` returns. Wallet / invoice / refund / split all reduce to one or
7
+ * more ERC-20 transfers from the payer or treasury SA.
8
+ */
9
+ import { encodeFunctionData } from 'viem';
10
+ export const ERC20_TRANSFER_ABI = [
11
+ {
12
+ type: 'function',
13
+ name: 'transfer',
14
+ stateMutability: 'nonpayable',
15
+ inputs: [
16
+ { name: 'to', type: 'address' },
17
+ { name: 'amount', type: 'uint256' },
18
+ ],
19
+ outputs: [{ type: 'bool' }],
20
+ },
21
+ ];
22
+ /** A single ERC-20 transfer: the executing SA calls `asset.transfer(to, amount)`. */
23
+ export function buildErc20Transfer(asset, to, amount) {
24
+ return {
25
+ to: asset,
26
+ value: 0n,
27
+ data: encodeFunctionData({ abi: ERC20_TRANSFER_ABI, functionName: 'transfer', args: [to, amount] }),
28
+ };
29
+ }
30
+ /** A native-value transfer (the executing SA sends `amount` wei to `to`). */
31
+ export function buildNativeTransfer(to, amount) {
32
+ return { to, value: amount, data: '0x' };
33
+ }
34
+ export const ERC20_APPROVE_ABI = [
35
+ {
36
+ type: 'function',
37
+ name: 'approve',
38
+ stateMutability: 'nonpayable',
39
+ inputs: [
40
+ { name: 'spender', type: 'address' },
41
+ { name: 'amount', type: 'uint256' },
42
+ ],
43
+ outputs: [{ type: 'bool' }],
44
+ },
45
+ ];
46
+ /** An ERC-20 approval — needed before the escrow `deposit` pulls funds via `transferFrom`. */
47
+ export function buildErc20Approve(asset, spender, amount) {
48
+ return {
49
+ to: asset,
50
+ value: 0n,
51
+ data: encodeFunctionData({ abi: ERC20_APPROVE_ABI, functionName: 'approve', args: [spender, amount] }),
52
+ };
53
+ }
54
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAA0B,MAAM,MAAM,CAAC;AAQlE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KAC5B;CACO,CAAC;AAEX,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,EAAW,EAAE,MAAc;IAC5E,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;KACpG,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,EAAW,EAAE,MAAc;IAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KAC5B;CACO,CAAC;AAEX,8FAA8F;AAC9F,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,OAAgB,EAAE,MAAc;IAChF,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;KACvG,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@agenticprimitives/payments",
3
+ "version": "0.0.0-alpha.10",
4
+ "description": "PaymentMandate + ContextBinding + MandateConstraints + open/closed mode discrimination. Three W1 rails (x402, wallet, sponsored-userop). PaymentReceipt asserted into AttestationRegistry per ADR-0023.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/agentictrustlabs/agenticprimitives.git",
9
+ "directory": "packages/payments"
10
+ },
11
+ "homepage": "https://github.com/agentictrustlabs/agenticprimitives/tree/master/packages/payments",
12
+ "bugs": {
13
+ "url": "https://github.com/agentictrustlabs/agenticprimitives/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "LICENSE",
26
+ "dist",
27
+ "spec.md",
28
+ "README.md"
29
+ ],
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "peerDependencies": {
34
+ "viem": "^2.52.2"
35
+ },
36
+ "devDependencies": {
37
+ "vitest": "^4.1.8",
38
+ "viem": "^2.52.2"
39
+ },
40
+ "keywords": [
41
+ "agentic",
42
+ "primitives",
43
+ "payments"
44
+ ],
45
+ "dependencies": {
46
+ "@noble/hashes": "^2.2.0",
47
+ "@noble/curves": "^2.2.0",
48
+ "@agenticprimitives/attestations": "0.0.0-alpha.10",
49
+ "@agenticprimitives/delegation": "1.0.0-alpha.14",
50
+ "@agenticprimitives/types": "1.0.0-alpha.14",
51
+ "@agenticprimitives/verifiable-credentials": "0.0.0-alpha.11"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc -p tsconfig.build.json",
55
+ "typecheck": "tsc -p tsconfig.json --noEmit",
56
+ "test": "vitest run",
57
+ "test:unit": "vitest run test/unit --passWithNoTests",
58
+ "test:watch": "vitest",
59
+ "clean": "rm -rf dist"
60
+ }
61
+ }
package/spec.md ADDED
@@ -0,0 +1,5 @@
1
+ # Spec pointer
2
+
3
+ Canonical spec: [`../../specs/243-*.md`](../../specs/)
4
+
5
+ Owning layers (per [coordination-substrate.md](../../docs/architecture/coordination-substrate.md)): layer-9b.