@1sat/permission-module 0.0.50 → 0.0.52

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 (54) hide show
  1. package/dist/apply.d.ts +1 -1
  2. package/dist/apply.d.ts.map +1 -1
  3. package/dist/apply.js +3 -3
  4. package/dist/apply.js.map +1 -1
  5. package/dist/apply.test.js +48 -43
  6. package/dist/apply.test.js.map +1 -1
  7. package/dist/basketAccess.d.ts +40 -0
  8. package/dist/basketAccess.d.ts.map +1 -0
  9. package/dist/basketAccess.js +238 -0
  10. package/dist/basketAccess.js.map +1 -0
  11. package/dist/buildPromptIntent.d.ts +15 -0
  12. package/dist/buildPromptIntent.d.ts.map +1 -0
  13. package/dist/buildPromptIntent.js +575 -0
  14. package/dist/buildPromptIntent.js.map +1 -0
  15. package/dist/createOneSatPermissionModule.d.ts +10 -5
  16. package/dist/createOneSatPermissionModule.d.ts.map +1 -1
  17. package/dist/createOneSatPermissionModule.js +28 -6
  18. package/dist/createOneSatPermissionModule.js.map +1 -1
  19. package/dist/enrichIntent.d.ts +121 -5
  20. package/dist/enrichIntent.d.ts.map +1 -1
  21. package/dist/enrichIntent.js +576 -137
  22. package/dist/enrichIntent.js.map +1 -1
  23. package/dist/handlers.d.ts +12 -32
  24. package/dist/handlers.d.ts.map +1 -1
  25. package/dist/handlers.js +121 -155
  26. package/dist/handlers.js.map +1 -1
  27. package/dist/index.d.ts +5 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +4 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/listOutputsScope.test.d.ts +2 -0
  32. package/dist/listOutputsScope.test.d.ts.map +1 -0
  33. package/dist/listOutputsScope.test.js +126 -0
  34. package/dist/listOutputsScope.test.js.map +1 -0
  35. package/dist/promptModel.d.ts +115 -0
  36. package/dist/promptModel.d.ts.map +1 -0
  37. package/dist/promptModel.js +7 -0
  38. package/dist/promptModel.js.map +1 -0
  39. package/dist/types.d.ts +36 -10
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/types.js.map +1 -1
  42. package/dist/verifyIntent.d.ts +4 -4
  43. package/dist/verifyIntent.d.ts.map +1 -1
  44. package/dist/verifyIntent.js +120 -40
  45. package/dist/verifyIntent.js.map +1 -1
  46. package/dist/viewScope.d.ts +51 -0
  47. package/dist/viewScope.d.ts.map +1 -0
  48. package/dist/viewScope.js +113 -0
  49. package/dist/viewScope.js.map +1 -0
  50. package/dist/viewScope.test.d.ts +2 -0
  51. package/dist/viewScope.test.d.ts.map +1 -0
  52. package/dist/viewScope.test.js +60 -0
  53. package/dist/viewScope.test.js.map +1 -0
  54. package/package.json +42 -42
package/dist/apply.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import type { CreateActionArgs, WalletInterface } from '@bsv/sdk';
2
- export declare function applyCreateAction(baseWallet: WalletInterface, args: CreateActionArgs, intent?: string): Promise<void>;
2
+ export declare function applyCreateAction(baseWallet: WalletInterface, args: CreateActionArgs, _intent?: string): Promise<void>;
3
3
  //# sourceMappingURL=apply.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAEjE,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAEf"}
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAEjE,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,gBAAgB,EACtB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAEf"}
package/dist/apply.js CHANGED
@@ -2,8 +2,8 @@
2
2
  * Module-side apply entry. Crypto always uses the module's base wallet
3
3
  * (never the gated WPM wrapper). Implementations live in @1sat/actions.
4
4
  */
5
- import { applyP1SatIntent } from '@1sat/actions';
6
- export async function applyCreateAction(baseWallet, args, intent) {
7
- await applyP1SatIntent(baseWallet, args, intent);
5
+ import { applyP1SatCreateAction } from '@1sat/actions';
6
+ export async function applyCreateAction(baseWallet, args, _intent) {
7
+ await applyP1SatCreateAction(baseWallet, args);
8
8
  }
9
9
  //# sourceMappingURL=apply.js.map
package/dist/apply.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGhD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,UAA2B,EAC3B,IAAsB,EACtB,MAAe;IAEf,MAAM,gBAAgB,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;AACjD,CAAC"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAGtD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,UAA2B,EAC3B,IAAsB,EACtB,OAAgB;IAEhB,MAAM,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AAC/C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from 'bun:test';
2
- import { OPNS_BASKET, OPNS_REGISTER_COUNTERPARTY, OPNS_REGISTER_SIG_PLACEHOLDER_LEN, P1SAT_INTENTS, P1SAT_PROTOCOL, buildIntentLabel, opnsRegisterKeyId, } from '@1sat/types';
2
+ import { OPNS_BASKET, OPNS_REGISTER_COUNTERPARTY, OPNS_REGISTER_SIG_PLACEHOLDER_LEN, P1SAT_PROTOCOL, buildActionDispatchLabel, buildInputAssetLabel, opnsRegisterKeyId, } from '@1sat/types';
3
3
  import { LockingScript, PrivateKey, PushDrop, Utils } from '@bsv/sdk';
4
4
  import { applyCreateAction } from './apply';
5
5
  import { CommitmentCache } from './commitmentCache';
@@ -15,10 +15,26 @@ function mockBaseWallet() {
15
15
  return { publicKey: protocolKey };
16
16
  },
17
17
  async createSignature(_args) {
18
- // 70-byte DER-ish stub — PushDrop only embeds the bytes
19
18
  const sig = new Array(70).fill(0x30);
20
19
  return { signature: sig };
21
20
  },
21
+ async listOutputs() {
22
+ return {
23
+ totalOutputs: 1,
24
+ outputs: [
25
+ {
26
+ satoshis: 1,
27
+ spendable: true,
28
+ outpoint: `${'aa'.repeat(32)}.0`,
29
+ tags: ['id:test-id'],
30
+ customInstructions: JSON.stringify({
31
+ protocolID: P1SAT_PROTOCOL,
32
+ keyID: 'test',
33
+ }),
34
+ },
35
+ ],
36
+ };
37
+ },
22
38
  };
23
39
  }
24
40
  /** Complete opns.register lock with the signature field left zeroed. */
@@ -35,8 +51,8 @@ async function registerArgs(wallet, outpoint = `${'aa'.repeat(32)}.0`) {
35
51
  return {
36
52
  description: 'Publish OpNS',
37
53
  labels: [
38
- buildIntentLabel(P1SAT_INTENTS.OPNS_REGISTER),
39
- 'p 1sat input opns test-id',
54
+ buildActionDispatchLabel('opns'),
55
+ buildInputAssetLabel(OPNS_BASKET, 'test-id'),
40
56
  ],
41
57
  inputs: [
42
58
  {
@@ -56,36 +72,28 @@ async function registerArgs(wallet, outpoint = `${'aa'.repeat(32)}.0`) {
56
72
  ],
57
73
  };
58
74
  }
59
- describe('applyCreateAction / opns.register', () => {
60
- test('replaces the zeroed signature in place (same outputs array ref)', async () => {
75
+ describe('applyCreateAction / script seal', () => {
76
+ test('seals zeroed PushDrop signature in place', async () => {
61
77
  const wallet = mockBaseWallet();
62
78
  const args = await registerArgs(wallet);
63
79
  const outputsRef = args.outputs;
64
80
  const out = outputsRef[0];
65
81
  const before = out.lockingScript;
66
- await applyCreateAction(wallet, args, P1SAT_INTENTS.OPNS_REGISTER);
82
+ await applyCreateAction(wallet, args);
67
83
  expect(args.outputs).toBe(outputsRef);
68
84
  expect(out.lockingScript).not.toBe(before);
69
85
  const fields = PushDrop.decode(LockingScript.fromHex(out.lockingScript)).fields;
70
86
  const signature = fields[fields.length - 1];
71
87
  expect(signature.some((b) => b !== 0)).toBe(true);
72
- // Placeholder was sized to the longest DER signature, so the sealed
73
- // script is never larger than what was estimated.
74
88
  expect(out.lockingScript.length).toBeLessThanOrEqual(before.length);
75
89
  });
76
- test('unknown intent fails closed', async () => {
77
- const wallet = mockBaseWallet();
78
- const args = await registerArgs(wallet);
79
- args.labels = [buildIntentLabel('nope.unknown')];
80
- await expect(applyCreateAction(wallet, args)).rejects.toThrow(/unknown intent/);
81
- });
82
- test('validate-only intents leave lockingScript unchanged', async () => {
90
+ test('no-op when script is already sealed', async () => {
83
91
  const wallet = mockBaseWallet();
84
92
  const args = await registerArgs(wallet);
85
- args.labels = [buildIntentLabel(P1SAT_INTENTS.OPNS_DEREGISTER)];
86
- const before = args.outputs[0].lockingScript;
87
- await applyCreateAction(wallet, args, P1SAT_INTENTS.OPNS_DEREGISTER);
88
- expect(args.outputs[0].lockingScript).toBe(before);
93
+ await applyCreateAction(wallet, args);
94
+ const sealed = args.outputs[0].lockingScript;
95
+ await applyCreateAction(wallet, args);
96
+ expect(args.outputs[0].lockingScript).toBe(sealed);
89
97
  });
90
98
  });
91
99
  describe('handleCreateActionRequest admin vs dApp', () => {
@@ -102,6 +110,8 @@ describe('handleCreateActionRequest admin vs dApp', () => {
102
110
  wallet,
103
111
  promptHandler,
104
112
  cache: new CommitmentCache(60),
113
+ schemeId: 'opns',
114
+ ownedBaskets: new Set([OPNS_BASKET]),
105
115
  adminOriginator: 'admin.yours.org',
106
116
  };
107
117
  const next = await handleCreateActionRequest(deps, args, 'admin.yours.org');
@@ -110,50 +120,45 @@ describe('handleCreateActionRequest admin vs dApp', () => {
110
120
  });
111
121
  test('dApp prompts then applies on approve', async () => {
112
122
  const wallet = mockBaseWallet();
113
- // enrichIntent listOutputs will fail → empty inputs; still applies
114
- const listWallet = {
115
- ...wallet,
116
- async listOutputs() {
117
- return { totalOutputs: 0, outputs: [] };
118
- },
119
- };
120
123
  const args = await registerArgs(wallet);
121
124
  const before = args.outputs[0].lockingScript;
122
- let promptSummary = '';
125
+ let promptKind = '';
126
+ let legCount = 0;
127
+ let sealLeg = false;
123
128
  const promptHandler = async (req) => {
124
- // A host may hand this request to a renderer in another process — the
125
- // browser extension writes it through chrome.storage. Anything that
126
- // cannot be structured-cloned (a promise, a function) arrives as `{}`
127
- // and breaks the prompt, so the payload must survive a round trip.
128
129
  expect(() => structuredClone(req)).not.toThrow();
129
- promptSummary = req.summary;
130
- expect(req.intent.p1satIntent).toBe('opns.register');
130
+ // Transaction IR: panels built in-module (no raw legs on the wire).
131
+ const panels = req.payload.panels;
132
+ promptKind = String(req.payload.title ?? '');
133
+ legCount = panels?.length ?? 0;
134
+ sealLeg = Boolean(panels?.some((p) => p.meta?.some((m) => m.key === 'Sign' &&
135
+ (m.value?.includes('PushDrop') || m.value?.includes('Sigma')))));
131
136
  return true;
132
137
  };
133
138
  const deps = {
134
- wallet: listWallet,
139
+ wallet,
135
140
  promptHandler,
136
141
  cache: new CommitmentCache(60),
142
+ schemeId: 'opns',
143
+ ownedBaskets: new Set([OPNS_BASKET]),
137
144
  adminOriginator: 'admin.yours.org',
138
145
  };
139
146
  const next = await handleCreateActionRequest(deps, args, 'https://dapp.example');
140
- expect(promptSummary.toLowerCase()).toContain('publish');
147
+ expect(promptKind).toBe('Transaction Request');
148
+ expect(legCount).toBeGreaterThan(0);
149
+ expect(sealLeg).toBe(true);
141
150
  expect(next.outputs[0].lockingScript).not.toBe(before);
142
151
  });
143
152
  test('dApp reject does not apply', async () => {
144
153
  const wallet = mockBaseWallet();
145
- const listWallet = {
146
- ...wallet,
147
- async listOutputs() {
148
- return { totalOutputs: 0, outputs: [] };
149
- },
150
- };
151
154
  const args = await registerArgs(wallet);
152
155
  const before = args.outputs[0].lockingScript;
153
156
  const deps = {
154
- wallet: listWallet,
157
+ wallet,
155
158
  promptHandler: async () => false,
156
159
  cache: new CommitmentCache(60),
160
+ schemeId: 'opns',
161
+ ownedBaskets: new Set([OPNS_BASKET]),
157
162
  adminOriginator: 'admin.yours.org',
158
163
  };
159
164
  await expect(handleCreateActionRequest(deps, args, 'https://dapp.example')).rejects.toThrow(/rejected/);
@@ -1 +1 @@
1
- {"version":3,"file":"apply.test.js","sourceRoot":"","sources":["../src/apply.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EACN,WAAW,EACX,0BAA0B,EAC1B,iCAAiC,EACjC,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GACjB,MAAM,aAAa,CAAA;AAOpB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAGtD,SAAS,cAAc;IACtB,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;IACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAA;IAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAA;IAEpE,OAAO;QACN,KAAK,CAAC,YAAY,CAAC,IAAsB;YACxC,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;YACpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAA;QAClC,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,KAA0B;YAC/C,wDAAwD;YACxD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;QAC1B,CAAC;KAC6B,CAAA;AAChC,CAAC;AAED,wEAAwE;AACxE,KAAK,UAAU,YAAY,CAC1B,MAAuB,EACvB,QAAgB;IAEhB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACtE,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAC7C;QACC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;QAC/B,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;KACpD,EACD,cAAc,EACd,iBAAiB,CAAC,QAAQ,CAAC,EAC3B,0BAA0B,EAC1B,IAAI,EACJ,KAAK,CACL,CAAA;IACD,OAAO,MAAM,CAAC,KAAK,EAAE,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,YAAY,CAC1B,MAAuB,EACvB,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;IAEjC,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC1D,OAAO;QACN,WAAW,EAAE,cAAc;QAC3B,MAAM,EAAE;YACP,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC;YAC7C,2BAA2B;SAC3B;QACD,MAAM,EAAE;YACP;gBACC,QAAQ;gBACR,gBAAgB,EAAE,WAAW;gBAC7B,qBAAqB,EAAE,GAAG;aAC1B;SACD;QACD,OAAO,EAAE;YACR;gBACC,aAAa;gBACb,QAAQ,EAAE,CAAC;gBACX,iBAAiB,EAAE,MAAM;gBACzB,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC;aACtC;SACD;KACD,CAAA;AACF,CAAC;AAED,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAClD,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAQ,CAAA;QAChC,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAA;QAEhC,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;QAElE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE1C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAC7B,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CACxC,CAAC,MAAM,CAAA;QACR,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC3C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,oEAAoE;QACpE,kDAAkD;QAClD,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAA;QAChD,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5D,gBAAgB,CAChB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAA;QAC7C,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;QACpE,MAAM,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACxD,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAA;QAC7C,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,aAAa,GAAkB,KAAK,IAAI,EAAE;YAC/C,QAAQ,GAAG,IAAI,CAAA;YACf,OAAO,IAAI,CAAA;QACZ,CAAC,CAAA;QACD,MAAM,IAAI,GAAG;YACZ,MAAM;YACN,aAAa;YACb,KAAK,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC;YAC9B,eAAe,EAAE,iBAAiB;SAClC,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAA;QAC3E,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC5B,MAAM,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;QAC/B,mEAAmE;QACnE,MAAM,UAAU,GAAG;YAClB,GAAG,MAAM;YACT,KAAK,CAAC,WAAW;gBAChB,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;YACxC,CAAC;SAC6B,CAAA;QAE/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAA;QAC7C,IAAI,aAAa,GAAG,EAAE,CAAA;QACtB,MAAM,aAAa,GAAkB,KAAK,EAAE,GAAG,EAAE,EAAE;YAClD,sEAAsE;YACtE,oEAAoE;YACpE,sEAAsE;YACtE,mEAAmE;YACnE,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;YAChD,aAAa,GAAG,GAAG,CAAC,OAAO,CAAA;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACpD,OAAO,IAAI,CAAA;QACZ,CAAC,CAAA;QACD,MAAM,IAAI,GAAG;YACZ,MAAM,EAAE,UAAU;YAClB,aAAa;YACb,KAAK,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC;YAC9B,eAAe,EAAE,iBAAiB;SAClC,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,yBAAyB,CAC3C,IAAI,EACJ,IAAI,EACJ,sBAAsB,CACtB,CAAA;QACD,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;QAC/B,MAAM,UAAU,GAAG;YAClB,GAAG,MAAM;YACT,KAAK,CAAC,WAAW;gBAChB,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;YACxC,CAAC;SAC6B,CAAA;QAC/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAA;QAC7C,MAAM,IAAI,GAAG;YACZ,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;YAChC,KAAK,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC;YAC9B,eAAe,EAAE,iBAAiB;SAClC,CAAA;QAED,MAAM,MAAM,CACX,yBAAyB,CAAC,IAAI,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAC7D,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC7B,MAAM,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"apply.test.js","sourceRoot":"","sources":["../src/apply.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { PermissionSchemeId } from '@1sat/types';
2
+ import type { IPermissionStore } from '@1sat/wallet';
3
+ import type { InternalizeActionArgs, ListOutputsArgs } from '@bsv/sdk';
4
+ import type { PromptHandler, VerificationServices } from './types';
5
+ /** Deps needed for basket / view-scope gating (no createAction pipeline). */
6
+ export interface BasketAccessDeps {
7
+ schemeId: PermissionSchemeId;
8
+ ownedBaskets: ReadonlySet<string>;
9
+ promptHandler: PromptHandler;
10
+ adminOriginator?: string;
11
+ permissionStore?: IPermissionStore;
12
+ services?: VerificationServices;
13
+ }
14
+ /**
15
+ * Gate access to storage baskets (internalize / plain owned basket).
16
+ * Admin bypasses. Grants keyed by storage basket name.
17
+ */
18
+ export declare function ensureBasketAccess(deps: BasketAccessDeps, originator: string, baskets: Iterable<string>): Promise<void>;
19
+ /**
20
+ * Gate view under `p <scheme> <scope>`.
21
+ *
22
+ * Grant keys:
23
+ * - `p <scheme> all` covers every scope/value
24
+ * - bare `p <scheme> collection` (etc.) = legacy whole-axis
25
+ * - `p <scheme> collection <value>` = one allowed axis tag value
26
+ */
27
+ export declare function ensureViewScopeAccess(deps: BasketAccessDeps, originator: string, grantBasket: string, axisValues?: string[]): Promise<void>;
28
+ /**
29
+ * listOutputs onRequest:
30
+ * - `p <scheme> <scope>` → parse scope, view grant, normalize to storage
31
+ * - collection/app/creator: force tagQueryMode `all`
32
+ * - id: leave the caller's query mode
33
+ * - plain owned storage basket → ordinary basket access
34
+ */
35
+ export declare function handleListOutputsRequest(deps: BasketAccessDeps, args: ListOutputsArgs, originator: string): Promise<ListOutputsArgs>;
36
+ /**
37
+ * internalizeAction onRequest: gate basket access for insertion baskets.
38
+ */
39
+ export declare function handleInternalizeActionRequest(deps: BasketAccessDeps, args: InternalizeActionArgs, originator: string): Promise<InternalizeActionArgs>;
40
+ //# sourceMappingURL=basketAccess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basketAccess.d.ts","sourceRoot":"","sources":["../src/basketAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAEX,aAAa,EACb,oBAAoB,EACpB,MAAM,SAAS,CAAA;AAGhB,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,aAAa,EAAE,aAAa,CAAA;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,gBAAgB,CAAA;IAClC,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAC/B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAAM,EAAO,GACvB,OAAO,CAAC,IAAI,CAAC,CAwCf;AAiID;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAoD1B;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CACnD,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,qBAAqB,EAC3B,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAYhC"}
@@ -0,0 +1,238 @@
1
+ import { nameFromMap } from '@1sat/types';
2
+ import { axisTagValues, parseViewBasket, viewGrantKey } from './viewScope';
3
+ /**
4
+ * Gate access to storage baskets (internalize / plain owned basket).
5
+ * Admin bypasses. Grants keyed by storage basket name.
6
+ */
7
+ export async function ensureBasketAccess(deps, originator, baskets) {
8
+ if (deps.adminOriginator && originator === deps.adminOriginator)
9
+ return;
10
+ const unique = new Set();
11
+ for (const b of baskets) {
12
+ if (typeof b !== 'string')
13
+ continue;
14
+ const n = b.trim().toLowerCase();
15
+ if (deps.ownedBaskets.has(n))
16
+ unique.add(n);
17
+ }
18
+ if (unique.size === 0)
19
+ return;
20
+ await ensureGrants(deps, originator, [...unique], 'basket');
21
+ }
22
+ /**
23
+ * Gate view under `p <scheme> <scope>`.
24
+ *
25
+ * Grant keys:
26
+ * - `p <scheme> all` covers every scope/value
27
+ * - bare `p <scheme> collection` (etc.) = legacy whole-axis
28
+ * - `p <scheme> collection <value>` = one allowed axis tag value
29
+ */
30
+ export async function ensureViewScopeAccess(deps, originator, grantBasket, axisValues = []) {
31
+ if (deps.adminOriginator && originator === deps.adminOriginator)
32
+ return;
33
+ const allGrant = `p ${deps.schemeId} all`;
34
+ const keysToEnsure = axisValues.length === 0
35
+ ? [grantBasket]
36
+ : axisValues.map((v) => viewGrantKey(grantBasket, v));
37
+ if (deps.permissionStore) {
38
+ const all = await deps.permissionStore.findGrant({
39
+ type: 'basket',
40
+ originator,
41
+ basket: allGrant,
42
+ });
43
+ if (all && !isGrantExpired(all.expiry))
44
+ return;
45
+ // Legacy whole-axis grant covers any value on that axis
46
+ const whole = await deps.permissionStore.findGrant({
47
+ type: 'basket',
48
+ originator,
49
+ basket: grantBasket,
50
+ });
51
+ if (whole && !isGrantExpired(whole.expiry))
52
+ return;
53
+ const missing = [];
54
+ for (const key of keysToEnsure) {
55
+ const g = await deps.permissionStore.findGrant({
56
+ type: 'basket',
57
+ originator,
58
+ basket: key,
59
+ });
60
+ if (!g || isGrantExpired(g.expiry))
61
+ missing.push(key);
62
+ }
63
+ if (missing.length === 0)
64
+ return;
65
+ await ensureGrants(deps, originator, missing, 'view');
66
+ return;
67
+ }
68
+ await ensureGrants(deps, originator, keysToEnsure, 'view');
69
+ }
70
+ async function ensureGrants(deps, originator, grantKeys, kind) {
71
+ const toPrompt = [];
72
+ if (deps.permissionStore) {
73
+ for (const basket of grantKeys) {
74
+ const grant = await deps.permissionStore.findGrant({
75
+ type: 'basket',
76
+ originator,
77
+ basket,
78
+ });
79
+ if (!grant || isGrantExpired(grant.expiry)) {
80
+ toPrompt.push(basket);
81
+ }
82
+ }
83
+ }
84
+ else {
85
+ toPrompt.push(...grantKeys);
86
+ }
87
+ if (toPrompt.length === 0)
88
+ return;
89
+ const label = kind === 'view' ? 'view' : 'access';
90
+ const baskets = await enrichBasketAccessRequests(deps, toPrompt);
91
+ const approved = await deps.promptHandler({
92
+ kind: 'basketAccess',
93
+ originator,
94
+ payload: { baskets },
95
+ summary: toPrompt.length === 1
96
+ ? `Grant ${label} to ${toPrompt[0]}`
97
+ : `Grant ${label} to ${toPrompt.length} baskets`,
98
+ });
99
+ if (!approved) {
100
+ throw new Error(`Permission module (${deps.schemeId}): user denied ${label} (${toPrompt.join(', ')}).`);
101
+ }
102
+ if (deps.permissionStore) {
103
+ const now = Date.now();
104
+ for (const basket of toPrompt) {
105
+ await deps.permissionStore.putGrant({
106
+ key: { type: 'basket', originator, basket },
107
+ expiry: 0,
108
+ grantedAt: now,
109
+ });
110
+ }
111
+ }
112
+ }
113
+ function isGrantExpired(expiry) {
114
+ if (!expiry)
115
+ return false;
116
+ return expiry < Math.floor(Date.now() / 1000);
117
+ }
118
+ /** Parse `p 1sat collection <value>` style grant keys. */
119
+ function parseViewGrantKey(key) {
120
+ const m = /^p\s+[a-z0-9]+\s+(all|collection|app|creator|id)(?:\s+(.+))?$/i.exec(key.trim());
121
+ if (!m)
122
+ return {};
123
+ return {
124
+ scope: m[1].toLowerCase(),
125
+ ...(m[2]?.trim() && { value: m[2].trim() }),
126
+ };
127
+ }
128
+ /**
129
+ * Attach scope/value and optional OrdFS display (name + image) for collection
130
+ * (and similar) view grants. Never throws — enrichment is best-effort.
131
+ */
132
+ async function enrichBasketAccessRequests(deps, grantKeys) {
133
+ const base = grantKeys.map((basket) => {
134
+ const { scope, value } = parseViewGrantKey(basket);
135
+ return {
136
+ basket,
137
+ scope,
138
+ value,
139
+ description: scope === 'collection' && value
140
+ ? 'View items in this collection'
141
+ : scope === 'all'
142
+ ? 'View entire 1sat inventory'
143
+ : scope
144
+ ? `View ${scope}-scoped items`
145
+ : undefined,
146
+ };
147
+ });
148
+ const collectionIds = base
149
+ .filter((b) => b.scope === 'collection' && b.value)
150
+ .map((b) => b.value);
151
+ if (collectionIds.length === 0)
152
+ return base;
153
+ const bulk = deps.services?.ordfs?.bulkMetadata;
154
+ const getContentUrl = deps.services?.ordfs?.getContentUrl;
155
+ if (typeof bulk !== 'function')
156
+ return base;
157
+ try {
158
+ const meta = await bulk.call(deps.services?.ordfs, collectionIds);
159
+ for (const b of base) {
160
+ if (b.scope !== 'collection' || !b.value)
161
+ continue;
162
+ const m = meta[b.value] ?? meta[b.value.replace('_', '.')];
163
+ if (!m)
164
+ continue;
165
+ const name = nameFromMap(m.map);
166
+ if (name)
167
+ b.name = name;
168
+ const ct = m.contentType?.split(';')[0]?.trim().toLowerCase() ?? '';
169
+ if (ct.startsWith('image/') && typeof getContentUrl === 'function') {
170
+ b.imageUrl = getContentUrl.call(deps.services?.ordfs, b.value);
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ /* keep id-only rows */
176
+ }
177
+ return base;
178
+ }
179
+ /**
180
+ * listOutputs onRequest:
181
+ * - `p <scheme> <scope>` → parse scope, view grant, normalize to storage
182
+ * - collection/app/creator: force tagQueryMode `all`
183
+ * - id: leave the caller's query mode
184
+ * - plain owned storage basket → ordinary basket access
185
+ */
186
+ export async function handleListOutputsRequest(deps, args, originator) {
187
+ const raw = args.basket;
188
+ if (!raw || typeof raw !== 'string')
189
+ return args;
190
+ const trimmed = raw.trim().toLowerCase();
191
+ const pPrefix = `p ${deps.schemeId}`;
192
+ if (deps.ownedBaskets.has(trimmed)) {
193
+ await ensureBasketAccess(deps, originator, [trimmed]);
194
+ return args;
195
+ }
196
+ if (trimmed !== pPrefix && !trimmed.startsWith(`${pPrefix} `)) {
197
+ return args;
198
+ }
199
+ const parsed = parseViewBasket(deps.schemeId, raw);
200
+ if (!parsed.ok) {
201
+ throw new Error(`Permission module (${deps.schemeId}): ${parsed.error}`);
202
+ }
203
+ // Non-all scopes: values live in tags (may contain _ . : illegal in baskets)
204
+ let axisValues = [];
205
+ if (parsed.axisPrefix) {
206
+ axisValues = axisTagValues(args.tags, parsed.axisPrefix);
207
+ if (axisValues.length === 0) {
208
+ throw new Error(`Permission module (${deps.schemeId}): basket "${parsed.grantBasket}" requires at least one ${parsed.axisPrefix}* tag`);
209
+ }
210
+ }
211
+ // id lookup: targeted query — do not require standing all/collection grants
212
+ if (!parsed.autoAllowView) {
213
+ await ensureViewScopeAccess(deps, originator, parsed.grantBasket, axisValues);
214
+ }
215
+ const next = {
216
+ ...args,
217
+ basket: parsed.storageBasket,
218
+ };
219
+ if (parsed.axisPrefix && !parsed.autoAllowView) {
220
+ next.tagQueryMode = 'all';
221
+ }
222
+ return next;
223
+ }
224
+ /**
225
+ * internalizeAction onRequest: gate basket access for insertion baskets.
226
+ */
227
+ export async function handleInternalizeActionRequest(deps, args, originator) {
228
+ const baskets = [];
229
+ for (const out of args.outputs ?? []) {
230
+ if (out.protocol === 'basket insertion' &&
231
+ out.insertionRemittance?.basket) {
232
+ baskets.push(out.insertionRemittance.basket);
233
+ }
234
+ }
235
+ await ensureBasketAccess(deps, originator, baskets);
236
+ return args;
237
+ }
238
+ //# sourceMappingURL=basketAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basketAccess.js","sourceRoot":"","sources":["../src/basketAccess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { EnrichedIntent } from './enrichIntent';
2
+ import type { TransactionPrompt } from './promptModel';
3
+ /** Overlay-resolved token facts (dec/sym/icon) keyed by token id. */
4
+ export type TokenMetaMap = Record<string, {
5
+ dec?: number;
6
+ sym?: string;
7
+ icon?: string;
8
+ iconUrl?: string;
9
+ }>;
10
+ /**
11
+ * Turn enrich output into the serializable prompt IR the UI renders.
12
+ * All classification and presentation facts are settled here.
13
+ */
14
+ export declare function buildTransactionPrompt(enriched: EnrichedIntent, contentUrls: Record<string, string>, originator: string, tokenMeta?: TokenMetaMap): TransactionPrompt;
15
+ //# sourceMappingURL=buildPromptIntent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPromptIntent.d.ts","sourceRoot":"","sources":["../src/buildPromptIntent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,cAAc,EAId,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAIX,iBAAiB,EACjB,MAAM,eAAe,CAAA;AAEtB,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,MAAM,CAChC,MAAM,EACN;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAC/D,CAAA;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,YAAiB,GAC1B,iBAAiB,CA6GnB"}