@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.
- package/dist/apply.d.ts +1 -1
- package/dist/apply.d.ts.map +1 -1
- package/dist/apply.js +3 -3
- package/dist/apply.js.map +1 -1
- package/dist/apply.test.js +48 -43
- package/dist/apply.test.js.map +1 -1
- package/dist/basketAccess.d.ts +40 -0
- package/dist/basketAccess.d.ts.map +1 -0
- package/dist/basketAccess.js +238 -0
- package/dist/basketAccess.js.map +1 -0
- package/dist/buildPromptIntent.d.ts +15 -0
- package/dist/buildPromptIntent.d.ts.map +1 -0
- package/dist/buildPromptIntent.js +575 -0
- package/dist/buildPromptIntent.js.map +1 -0
- package/dist/createOneSatPermissionModule.d.ts +10 -5
- package/dist/createOneSatPermissionModule.d.ts.map +1 -1
- package/dist/createOneSatPermissionModule.js +28 -6
- package/dist/createOneSatPermissionModule.js.map +1 -1
- package/dist/enrichIntent.d.ts +121 -5
- package/dist/enrichIntent.d.ts.map +1 -1
- package/dist/enrichIntent.js +576 -137
- package/dist/enrichIntent.js.map +1 -1
- package/dist/handlers.d.ts +12 -32
- package/dist/handlers.d.ts.map +1 -1
- package/dist/handlers.js +121 -155
- package/dist/handlers.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/listOutputsScope.test.d.ts +2 -0
- package/dist/listOutputsScope.test.d.ts.map +1 -0
- package/dist/listOutputsScope.test.js +126 -0
- package/dist/listOutputsScope.test.js.map +1 -0
- package/dist/promptModel.d.ts +115 -0
- package/dist/promptModel.d.ts.map +1 -0
- package/dist/promptModel.js +7 -0
- package/dist/promptModel.js.map +1 -0
- package/dist/types.d.ts +36 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/verifyIntent.d.ts +4 -4
- package/dist/verifyIntent.d.ts.map +1 -1
- package/dist/verifyIntent.js +120 -40
- package/dist/verifyIntent.js.map +1 -1
- package/dist/viewScope.d.ts +51 -0
- package/dist/viewScope.d.ts.map +1 -0
- package/dist/viewScope.js +113 -0
- package/dist/viewScope.js.map +1 -0
- package/dist/viewScope.test.d.ts +2 -0
- package/dist/viewScope.test.d.ts.map +1 -0
- package/dist/viewScope.test.js +60 -0
- package/dist/viewScope.test.js.map +1 -0
- 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,
|
|
2
|
+
export declare function applyCreateAction(baseWallet: WalletInterface, args: CreateActionArgs, _intent?: string): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=apply.d.ts.map
|
package/dist/apply.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
6
|
-
export async function applyCreateAction(baseWallet, args,
|
|
7
|
-
await
|
|
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,
|
|
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"}
|
package/dist/apply.test.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
39
|
-
'
|
|
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 /
|
|
60
|
-
test('
|
|
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
|
|
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('
|
|
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
|
-
|
|
86
|
-
const
|
|
87
|
-
await applyCreateAction(wallet, args
|
|
88
|
-
expect(args.outputs[0].lockingScript).toBe(
|
|
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
|
|
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
|
-
|
|
130
|
-
|
|
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
|
|
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(
|
|
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
|
|
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/);
|
package/dist/apply.test.js.map
CHANGED
|
@@ -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,
|
|
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"}
|