@agenticprimitives/fabric 0.0.0-alpha.10 → 0.0.0-alpha.12

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 (72) hide show
  1. package/CLAUDE.md +30 -49
  2. package/dist/adoption.d.ts +79 -0
  3. package/dist/adoption.d.ts.map +1 -0
  4. package/dist/adoption.js +95 -0
  5. package/dist/adoption.js.map +1 -0
  6. package/dist/cloudflare/authority-verdict-cache.d.ts +28 -1
  7. package/dist/cloudflare/authority-verdict-cache.d.ts.map +1 -1
  8. package/dist/cloudflare/authority-verdict-cache.js +32 -1
  9. package/dist/cloudflare/authority-verdict-cache.js.map +1 -1
  10. package/dist/cloudflare/index.d.ts +3 -1
  11. package/dist/cloudflare/index.d.ts.map +1 -1
  12. package/dist/cloudflare/index.js +3 -1
  13. package/dist/cloudflare/index.js.map +1 -1
  14. package/dist/cloudflare/principal-gateway-do.d.ts +18 -0
  15. package/dist/cloudflare/principal-gateway-do.d.ts.map +1 -1
  16. package/dist/cloudflare/principal-gateway-do.js +9 -2
  17. package/dist/cloudflare/principal-gateway-do.js.map +1 -1
  18. package/dist/cloudflare/sql-vault.d.ts.map +1 -1
  19. package/dist/cloudflare/sql-vault.js +56 -0
  20. package/dist/cloudflare/sql-vault.js.map +1 -1
  21. package/dist/cloudflare/vault-exchange-store.d.ts +47 -0
  22. package/dist/cloudflare/vault-exchange-store.d.ts.map +1 -0
  23. package/dist/cloudflare/vault-exchange-store.js +118 -0
  24. package/dist/cloudflare/vault-exchange-store.js.map +1 -0
  25. package/dist/cloudflare/vault-interaction-store.d.ts +44 -0
  26. package/dist/cloudflare/vault-interaction-store.d.ts.map +1 -0
  27. package/dist/cloudflare/vault-interaction-store.js +245 -0
  28. package/dist/cloudflare/vault-interaction-store.js.map +1 -0
  29. package/dist/email/index.d.ts +75 -0
  30. package/dist/email/index.d.ts.map +1 -0
  31. package/dist/email/index.js +77 -0
  32. package/dist/email/index.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/interactions/grant-scopes.d.ts +21 -0
  38. package/dist/interactions/grant-scopes.d.ts.map +1 -0
  39. package/dist/interactions/grant-scopes.js +39 -0
  40. package/dist/interactions/grant-scopes.js.map +1 -0
  41. package/dist/interactions/index.d.ts +1 -0
  42. package/dist/interactions/index.d.ts.map +1 -1
  43. package/dist/interactions/index.js +3 -0
  44. package/dist/interactions/index.js.map +1 -1
  45. package/dist/interactions/open-case.d.ts +60 -0
  46. package/dist/interactions/open-case.d.ts.map +1 -0
  47. package/dist/interactions/open-case.js +83 -0
  48. package/dist/interactions/open-case.js.map +1 -0
  49. package/dist/messaging/consult-routing.d.ts +21 -14
  50. package/dist/messaging/consult-routing.d.ts.map +1 -1
  51. package/dist/messaging/consult-routing.js +34 -25
  52. package/dist/messaging/consult-routing.js.map +1 -1
  53. package/dist/messaging/consult.d.ts +4 -0
  54. package/dist/messaging/consult.d.ts.map +1 -1
  55. package/dist/messaging/consult.js +3 -1
  56. package/dist/messaging/consult.js.map +1 -1
  57. package/dist/messaging/conversation.d.ts +69 -1
  58. package/dist/messaging/conversation.d.ts.map +1 -1
  59. package/dist/messaging/conversation.js +131 -0
  60. package/dist/messaging/conversation.js.map +1 -1
  61. package/dist/messaging/index.d.ts +2 -1
  62. package/dist/messaging/index.d.ts.map +1 -1
  63. package/dist/messaging/index.js +6 -1
  64. package/dist/messaging/index.js.map +1 -1
  65. package/dist/messaging/outbound-message.d.ts +42 -0
  66. package/dist/messaging/outbound-message.d.ts.map +1 -0
  67. package/dist/messaging/outbound-message.js +64 -0
  68. package/dist/messaging/outbound-message.js.map +1 -0
  69. package/dist/record-catalog.d.ts.map +1 -1
  70. package/dist/record-catalog.js +5 -0
  71. package/dist/record-catalog.js.map +1 -1
  72. package/package.json +13 -9
@@ -0,0 +1,245 @@
1
+ // The VAULT-BACKED `InteractionStore` (spec 316 §0b, ADR-0055 amendment, audit G-2).
2
+ //
3
+ // Same residency decision as the exchange store, for the same reason: **each party holds their own copy**.
4
+ // An Interaction is a governed situation with participants, and each participant's vault holds their view
5
+ // of it. No single system of record; no copy authoritative over another. A rebuild is therefore a
6
+ // SINGLE-VAULT read — recovery never waits on a counterparty being reachable, willing, or still extant.
7
+ //
8
+ // SIX FAMILIES, ONE INDEX. Interactions, decisions, commitments, inbox entries, context snapshots and
9
+ // protocol bindings each get their own vault resource; one `interaction.index` document carries the ids.
10
+ // Six index documents would mean six writes to keep in step and six ways for them to drift.
11
+ //
12
+ // THE TWO INVARIANTS OF THE DO-LOCAL STORE ARE PRESERVED EXACTLY, because they are about immutability and
13
+ // they do not become negotiable when the backing store changes:
14
+ //
15
+ // 1. A ContextSnapshot is CONTENT-ADDRESSED and the digest is verified before storing. A forged snapshot
16
+ // is refused at the door rather than detected later. Re-putting a verified digest that is already
17
+ // present is a no-op — that is what content-addressing means.
18
+ // 2. Every transition goes THROUGH its machine. This store never assigns a state, so "the creditor
19
+ // discharges, not the debtor" cannot be bypassed by writing the row. A rejected transition writes
20
+ // NOTHING: persisting it "for the audit trail" would make the machine advisory.
21
+ //
22
+ // It confers nothing. Persisting a commitment does not make it owed; persisting a decision authorizes
23
+ // nothing (ADR-0041).
24
+ import { verifyContextSnapshot } from '../interaction-record.js';
25
+ import { applyInteractionTransition, applyDecisionTransition, applyCommitmentTransition, applyInboxTransition, } from '../interaction-machines.js';
26
+ import { bindingKey, resolveInteractionByBinding, } from '../protocol-binding.js';
27
+ export const INTERACTION_INDEX_RESOURCE = 'interaction.index';
28
+ export const interactionResource = (id) => `interaction:${String(id)}`;
29
+ export const decisionResource = (id) => `interaction.decision:${id}`;
30
+ export const commitmentResource = (id) => `interaction.commitment:${id}`;
31
+ export const snapshotResource = (digest) => `interaction.snapshot:${digest}`;
32
+ export const inboxEntryResource = (viewer, exchangeId) => `interaction.inbox:${viewer.toLowerCase()}:${exchangeId}`;
33
+ /** States an obligation is still live in. `discharged`/`breached`/`void` are ended, differently. */
34
+ const OPEN_COMMITMENT_STATES = new Set(['proposed', 'active', 'fulfilment-claimed']);
35
+ const EMPTY = {
36
+ version: 1, interactions: [], decisions: [], commitments: [], snapshots: [], inboxEntries: [], bindings: {},
37
+ };
38
+ export function createVaultInteractionStore(vault, owner, cache) {
39
+ const readIndex = async () => {
40
+ const obj = await vault.read({ owner, resource: INTERACTION_INDEX_RESOURCE });
41
+ return { ...EMPTY, ...(obj?.data ?? {}) };
42
+ };
43
+ const writeIndex = async (mutate) => {
44
+ const next = mutate(await readIndex());
45
+ await vault.write({ owner, resource: INTERACTION_INDEX_RESOURCE, data: next, classification: 'internal' });
46
+ };
47
+ /** WRITE-THROUGH. The vault first — the durable fact — then the index, then the DO-local cache. A crash
48
+ * after the first leaves a cache that can be re-derived; the reverse order leaves one that cannot. */
49
+ const save = async (resource, data, index) => {
50
+ await vault.write({ owner, resource, data, classification: 'internal' });
51
+ if (index)
52
+ await writeIndex(index);
53
+ cache?.put(resource, data);
54
+ };
55
+ const load = async (resource) => {
56
+ const hit = cache?.get(resource);
57
+ // A cache hit is the SAME answer the vault holds, not a second mechanism (ADR-0013).
58
+ if (hit)
59
+ return hit;
60
+ const obj = await vault.read({ owner, resource });
61
+ return obj?.data ?? null;
62
+ };
63
+ const addOnce = (list, id) => (list.includes(id) ? list : [...list, id]);
64
+ const store = {
65
+ // ── Interactions ────────────────────────────────────────────────────────────────────────────────
66
+ async putInteraction(record) {
67
+ await save(interactionResource(record.interactionId), record, (i) => ({
68
+ ...i, interactions: addOnce(i.interactions, String(record.interactionId)),
69
+ }));
70
+ },
71
+ async getInteraction(id) {
72
+ return load(interactionResource(id));
73
+ },
74
+ async listInteractions() {
75
+ const idx = await readIndex();
76
+ const all = await Promise.all(idx.interactions.map((id) => this.getInteraction(id)));
77
+ return all.filter((r) => r !== null);
78
+ },
79
+ async transitionInteraction(id, event) {
80
+ const record = await this.getInteraction(id);
81
+ if (!record)
82
+ return null;
83
+ const result = applyInteractionTransition(lifecycleOf(record), event);
84
+ // Fail-closed: a rejection leaves the record exactly as it was.
85
+ if (result.ok) {
86
+ await this.putInteraction({
87
+ ...record, lifecycleState: result.next.state, updatedAt: event.at, rev: record.rev + 1,
88
+ });
89
+ }
90
+ return result;
91
+ },
92
+ // ── Protocol bindings ───────────────────────────────────────────────────────────────────────────
93
+ async bindProtocolTo(id, binding) {
94
+ const key = bindingKey(binding.protocol, binding.field, binding.value);
95
+ await writeIndex((i) => ({
96
+ ...i,
97
+ // Appended, never de-duplicated across interactions: a correlator naming two interactions IS the
98
+ // ambiguity, and collapsing it here would answer an ambiguous question with a confident wrong one.
99
+ bindings: { ...i.bindings, [key]: [...(i.bindings[key] ?? []), String(id)] },
100
+ }));
101
+ },
102
+ async resolveByBinding(protocol, field, value) {
103
+ const idx = await readIndex();
104
+ const key = bindingKey(protocol, field, value);
105
+ // Reuses the in-memory resolver so every backing store agrees on what "ambiguous" means.
106
+ return resolveInteractionByBinding(new Map([[key, (idx.bindings[key] ?? [])]]), protocol, field, value);
107
+ },
108
+ // ── Context snapshots (content-addressed) ───────────────────────────────────────────────────────
109
+ async putContextSnapshot(snapshot) {
110
+ // Verified BEFORE storing. A snapshot whose digest does not match its bytes is not evidence, and
111
+ // storing it would make a later verification failure look like tampering rather than corruption.
112
+ if (!(await verifyContextSnapshot(snapshot)))
113
+ return { ok: false, reason: 'digest-mismatch' };
114
+ if (await load(snapshotResource(snapshot.digest))) {
115
+ // Digest verified and already present ⇒ the content is the same. Two parties observing one
116
+ // context legitimately store it twice; the stored bytes win.
117
+ return { ok: true, stored: 'identical' };
118
+ }
119
+ await save(snapshotResource(snapshot.digest), snapshot, (i) => ({
120
+ ...i, snapshots: addOnce(i.snapshots, snapshot.digest),
121
+ }));
122
+ return { ok: true, stored: 'new' };
123
+ },
124
+ async getContextSnapshot(digest) {
125
+ return load(snapshotResource(digest));
126
+ },
127
+ // ── Decisions ───────────────────────────────────────────────────────────────────────────────────
128
+ async putDecision(record) {
129
+ await save(decisionResource(record.decisionId), record, (i) => ({
130
+ ...i, decisions: addOnce(i.decisions, record.decisionId),
131
+ }));
132
+ },
133
+ async getDecision(id) {
134
+ return load(decisionResource(id));
135
+ },
136
+ async transitionDecision(id, event) {
137
+ const record = await this.getDecision(id);
138
+ if (!record)
139
+ return null;
140
+ const result = applyDecisionTransition(record, event);
141
+ if (result.ok)
142
+ await this.putDecision(result.next);
143
+ return result;
144
+ },
145
+ // ── Commitments ─────────────────────────────────────────────────────────────────────────────────
146
+ async putCommitment(record) {
147
+ await save(commitmentResource(record.commitmentId), record, (i) => ({
148
+ ...i, commitments: addOnce(i.commitments, record.commitmentId),
149
+ }));
150
+ },
151
+ async getCommitment(id) {
152
+ return load(commitmentResource(id));
153
+ },
154
+ async listOpenCommitments() {
155
+ const idx = await readIndex();
156
+ const all = await Promise.all(idx.commitments.map((id) => this.getCommitment(id)));
157
+ // Filtered on the RECORD's state, never on a state cached in the index. "What is still owed" is
158
+ // machine-owned, and an index that answered it from its own copy could report an obligation as open
159
+ // after the creditor discharged it — the exact confusion the six machines exist to prevent.
160
+ return all
161
+ .filter((r) => r !== null && OPEN_COMMITMENT_STATES.has(r.state))
162
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
163
+ },
164
+ async transitionCommitment(id, event) {
165
+ const record = await this.getCommitment(id);
166
+ if (!record)
167
+ return null;
168
+ const result = applyCommitmentTransition(record, event);
169
+ if (result.ok)
170
+ await this.putCommitment(result.next);
171
+ return result;
172
+ },
173
+ // ── Inbox entries ───────────────────────────────────────────────────────────────────────────────
174
+ async putInboxEntry(entry) {
175
+ const viewer = String(entry.viewer).toLowerCase();
176
+ await save(inboxEntryResource(viewer, entry.exchangeId), entry, (i) => ({
177
+ ...i,
178
+ inboxEntries: i.inboxEntries.some((e) => e.viewer === viewer && e.exchangeId === entry.exchangeId)
179
+ ? i.inboxEntries
180
+ : [...i.inboxEntries, { viewer, exchangeId: entry.exchangeId }],
181
+ }));
182
+ },
183
+ async getInboxEntry(viewer, exchangeId) {
184
+ return load(inboxEntryResource(String(viewer), exchangeId));
185
+ },
186
+ async transitionInbox(viewer, exchangeId, event) {
187
+ const entry = await this.getInboxEntry(viewer, exchangeId);
188
+ if (!entry)
189
+ return null;
190
+ const result = applyInboxTransition(entry, event);
191
+ if (result.ok)
192
+ await this.putInboxEntry(result.next);
193
+ return result;
194
+ },
195
+ // ── Rebuild ─────────────────────────────────────────────────────────────────────────────────────
196
+ async rebuild() {
197
+ cache?.clear();
198
+ const idx = await readIndex();
199
+ const missing = [];
200
+ const recovered = {
201
+ interactions: 0, decisions: 0, commitments: 0, snapshots: 0, inboxEntries: 0,
202
+ };
203
+ const pull = async (family, resource) => {
204
+ const obj = await vault.read({ owner, resource });
205
+ if (!obj?.data) {
206
+ missing.push(resource);
207
+ return;
208
+ }
209
+ cache?.put(resource, obj.data);
210
+ recovered[family] = (recovered[family] ?? 0) + 1;
211
+ };
212
+ for (const id of idx.interactions)
213
+ await pull('interactions', interactionResource(id));
214
+ for (const id of idx.decisions)
215
+ await pull('decisions', decisionResource(id));
216
+ for (const id of idx.commitments)
217
+ await pull('commitments', commitmentResource(id));
218
+ for (const d of idx.snapshots)
219
+ await pull('snapshots', snapshotResource(d));
220
+ for (const e of idx.inboxEntries)
221
+ await pull('inboxEntries', inboxEntryResource(e.viewer, e.exchangeId));
222
+ return { recovered, missing };
223
+ },
224
+ };
225
+ return store;
226
+ }
227
+ /**
228
+ * The lifecycle facet of a stored interaction, for the machine to operate on.
229
+ *
230
+ * `principal` and `participations` are NOT optional decoration. The interaction machine decides who may
231
+ * drive a transition from them, so a facet that omitted them would hand the machine an interaction with
232
+ * no participants and no custodian — every transition rejected, for a reason that reads like a state-model
233
+ * problem. (Which is how this was found: the first version dropped both and the legal-transition test
234
+ * failed while the rejection tests still "passed".)
235
+ */
236
+ function lifecycleOf(record) {
237
+ return {
238
+ interactionId: record.interactionId,
239
+ state: record.lifecycleState,
240
+ principal: record.principal,
241
+ participations: record.participations,
242
+ updatedAt: record.updatedAt,
243
+ };
244
+ }
245
+ //# sourceMappingURL=vault-interaction-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-interaction-store.js","sourceRoot":"","sources":["../../src/cloudflare/vault-interaction-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /** What a provider needs to send one message. Deliberately small — no attachments, no templates. */
2
+ export interface OutboundEmailV1 {
3
+ to: string;
4
+ subject: string;
5
+ text: string;
6
+ /** Optional HTML alternative. Providers that cannot send it fall back to `text`. */
7
+ html?: string;
8
+ /** Set when this mail continues a conversation, so replies thread in the recipient's mail client. */
9
+ inReplyTo?: string;
10
+ }
11
+ export interface EmailSendResultV1 {
12
+ ok: boolean;
13
+ /** The provider's own id for the message, when it gives one — kept so a thread can cite it. */
14
+ messageId?: string;
15
+ error?: string;
16
+ /** Which provider actually sent it. Recorded, because "the email went" is a different fact per rail. */
17
+ via?: string;
18
+ }
19
+ /**
20
+ * THE PORT. One method, and the implementations are leaves.
21
+ *
22
+ * `available` is separate from `send` on purpose: a surface must be able to say "email is not set up
23
+ * here" BEFORE offering somebody an email invitation, rather than accepting the address and failing.
24
+ */
25
+ export interface EmailSenderPort {
26
+ readonly name: string;
27
+ available(): boolean;
28
+ send(msg: OutboundEmailV1): Promise<EmailSendResultV1>;
29
+ }
30
+ /**
31
+ * TWO INTEGRATIONS, ONE PORT — the first that is available sends.
32
+ *
33
+ * Not a fallback chain (ADR-0013): the order is a DEPLOYMENT PREFERENCE stated once, and a provider that
34
+ * is configured but fails returns an error rather than handing the message to the next one. Sending the
35
+ * same mail twice because the first attempt's response was slow is worse than not sending it.
36
+ */
37
+ export declare function firstAvailableSender(senders: readonly EmailSenderPort[]): EmailSenderPort | null;
38
+ /** An inbound message, already parsed. The adapter does the MIME; this is what the inbox needs. */
39
+ export interface InboundEmailV1 {
40
+ /** What the mail was sent TO — the only routable fact in it. */
41
+ to: string;
42
+ /** What it CLAIMS to be from. Unverified by construction; shown as a claim, never resolved as identity. */
43
+ from: string;
44
+ subject: string;
45
+ text: string;
46
+ /** Provider message id, for de-duplication and for citing the mail this message came from. */
47
+ messageId?: string;
48
+ /** Names only. An attachment is announced, never admitted (rule 4). */
49
+ attachments?: Array<{
50
+ name: string;
51
+ size?: number;
52
+ contentType?: string;
53
+ }>;
54
+ }
55
+ /** The handle an address routes to: `alice@faithnet.me` → `alice`. Empty when the zone is not ours. */
56
+ export declare function handleFromAddress(address: string, zones: readonly string[]): string;
57
+ /** Is this a well-formed address at all? Shape only — nothing here says a mailbox exists. */
58
+ export declare function isEmailAddress(v: string): boolean;
59
+ export declare const EMAIL_BODY_LIMIT = 16000;
60
+ /**
61
+ * An inbound email as the message a thread will hold.
62
+ *
63
+ * WHAT IT KEEPS: the words, who it says it is from, what it was about, and what came with it BY NAME.
64
+ * WHAT IT REFUSES: anything past the cap (truncated, and it says so — a body silently cut in half is a
65
+ * message that misleads), and every attachment's content.
66
+ *
67
+ * The result is deliberately plain text: a thread that renders remote HTML from an unverified sender is
68
+ * a phishing surface with a nice font.
69
+ */
70
+ export declare function inboundEmailToMessage(mail: InboundEmailV1): {
71
+ bodyText: string;
72
+ subject: string;
73
+ claimedFrom: string;
74
+ };
75
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/email/index.ts"],"names":[],"mappings":"AAwBA,oGAAoG;AACpG,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,SAAS,IAAI,OAAO,CAAC;IACrB,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe,GAAG,IAAI,CAEhG;AAED,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,2GAA2G;IAC3G,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,uGAAuG;AACvG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAQnF;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAetH"}
@@ -0,0 +1,77 @@
1
+ // EMAIL AS A CHANNEL INTO THE INBOX — spec 365.
2
+ //
3
+ // A person's agent should be reachable by the address they already have, and an email they send or
4
+ // receive should land in the SAME thread as everything else they say to that person. Two mailboxes for
5
+ // one relationship is how half a conversation goes missing.
6
+ //
7
+ // FOUR RULES, and the whole design is these:
8
+ //
9
+ // 1. AN EMAIL IS NOT AUTHORITY (spec 309 §4.2). Inbound mail creates a MESSAGE and can never trigger
10
+ // an act. Nobody sends an email that moves money; the acts a person can take from a thread are the
11
+ // ones their own surface offers them, under their own mandate.
12
+ // 2. THE SENDER IS AN UNVERIFIED CLAIM. `From:` is a header anyone can write, so routing is done by
13
+ // the address the mail was SENT TO (`<handle>@<zone>` → the naming service → an agent), never by
14
+ // who it says it is from. The claim travels with the message, labelled as a claim.
15
+ // 3. PARSE IN MEMORY, STORE IN THE VAULT (spec 362 §6.2). The raw message is read into a message body
16
+ // the owner's vault holds and is never written to a serving-plane store — a mailbox is exactly the
17
+ // kind of durable private record ADR-0055 keeps out of DO storage.
18
+ // 4. BOUNDED, ALWAYS. A body has a size cap and attachments are named, not admitted: an inbox that
19
+ // accepts whatever arrives is a way to fill somebody's vault from the outside.
20
+ //
21
+ // The SENDER PORT is here and the providers are not: a transport is a leaf binding that depends inward
22
+ // (ADR-0057), and this package must not know whether the deployment sends through an HTTP API or a
23
+ // platform binding.
24
+ /**
25
+ * TWO INTEGRATIONS, ONE PORT — the first that is available sends.
26
+ *
27
+ * Not a fallback chain (ADR-0013): the order is a DEPLOYMENT PREFERENCE stated once, and a provider that
28
+ * is configured but fails returns an error rather than handing the message to the next one. Sending the
29
+ * same mail twice because the first attempt's response was slow is worse than not sending it.
30
+ */
31
+ export function firstAvailableSender(senders) {
32
+ return senders.find((s) => s.available()) ?? null;
33
+ }
34
+ /** The handle an address routes to: `alice@faithnet.me` → `alice`. Empty when the zone is not ours. */
35
+ export function handleFromAddress(address, zones) {
36
+ const at = address.trim().toLowerCase();
37
+ const m = /^([^@\s]+)@([^@\s]+)$/.exec(at);
38
+ if (!m)
39
+ return '';
40
+ const [, local = '', domain = ''] = m;
41
+ if (!zones.some((z) => domain === z.toLowerCase() || domain.endsWith(`.${z.toLowerCase()}`)))
42
+ return '';
43
+ // Plus-addressing is the person's own tag, not part of who they are: `alice+bills@` is alice.
44
+ return (local.split('+')[0] ?? '').trim();
45
+ }
46
+ /** Is this a well-formed address at all? Shape only — nothing here says a mailbox exists. */
47
+ export function isEmailAddress(v) {
48
+ return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(v.trim());
49
+ }
50
+ export const EMAIL_BODY_LIMIT = 16_000;
51
+ /**
52
+ * An inbound email as the message a thread will hold.
53
+ *
54
+ * WHAT IT KEEPS: the words, who it says it is from, what it was about, and what came with it BY NAME.
55
+ * WHAT IT REFUSES: anything past the cap (truncated, and it says so — a body silently cut in half is a
56
+ * message that misleads), and every attachment's content.
57
+ *
58
+ * The result is deliberately plain text: a thread that renders remote HTML from an unverified sender is
59
+ * a phishing surface with a nice font.
60
+ */
61
+ export function inboundEmailToMessage(mail) {
62
+ const body = (mail.text ?? '').trim();
63
+ const truncated = body.length > EMAIL_BODY_LIMIT;
64
+ const kept = truncated ? `${body.slice(0, EMAIL_BODY_LIMIT)}\n\n[…] this email was longer than ${EMAIL_BODY_LIMIT} characters and the rest was not kept.` : body;
65
+ const files = (mail.attachments ?? []).filter((a) => a.name);
66
+ const noted = files.length
67
+ ? `\n\n${files.length === 1 ? 'It came with a file' : `It came with ${files.length} files`}, which were not saved: ${files.map((f) => f.name).join(', ')}.`
68
+ : '';
69
+ return {
70
+ subject: (mail.subject ?? '').trim() || '(no subject)',
71
+ claimedFrom: (mail.from ?? '').trim(),
72
+ // WHO IT SAYS IT IS FROM, said as a claim. A person reading this must not be able to mistake an
73
+ // email address for a verified identity — that mistake is the whole of email fraud.
74
+ bodyText: `${kept}${noted}\n\n— sent by email from ${mail.from} (an email address, not a verified agent)`,
75
+ };
76
+ }
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/email/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export type { FabricCaseV1, CaseFsmFields, CaseTransition, CaseTransitionEventV1
11
11
  export { caseTransitionEmissions, applyCaseEmissions, seedDecision, seedCommitment, decisionIdForCase, commitmentIdForCase, EMITTING_CASE_TRANSITIONS, } from './case-emissions.js';
12
12
  export type { CaseEmissionsV1, CaseEmissionApplyResult, EmissionOutcome, DecisionSeedV1, CommitmentSeedV1, } from './case-emissions.js';
13
13
  export { applyExchangeEvent, caseViewFromRecord } from './exchange-reducer.js';
14
+ export { openCase, derivedCaseId, type OpenCaseInput, type OpenCaseResult } from './interactions/open-case.js';
14
15
  export type { ExchangeApplyResult } from './exchange-reducer.js';
15
16
  export { EXCHANGE_REDUCER_VERSION, eventSetDigest, replayExchange } from './exchange-reducer.js';
16
17
  export type { MaterializationProvenanceV1, ExchangeReplayResult } from './exchange-reducer.js';
@@ -36,4 +37,6 @@ export { buildDeliveryEnvelope, admitDeliveryEnvelope, deliveryToExchangeRecord,
36
37
  export type { DeliveryEnvelopeV1, DeliveryAdmission } from './delivery-envelope.js';
37
38
  export { emptyInboxData, parseInboxData, hydrateInboxStores, mergeContextRefs, upsertConversation, type InboxDataV1, } from './inbox-doc.js';
38
39
  export { RECORD_CATALOG, catalogEntryFor, type RecordCatalogEntry } from './record-catalog.js';
40
+ export { adoptionStage, compareServed, classifyDivergence, shouldShadow, recordDivergence, SHADOW_INTERVAL_MS, DIVERGENCE_BUFFER } from './adoption.js';
41
+ export type { AdoptionConcern, AdoptionStage, AdoptionEntry, AdoptionLedger, Divergence } from './adoption.js';
39
42
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -22,6 +22,7 @@ export { applyCaseTransition, isTerminalCaseState, TERMINAL_CASE_STATES, require
22
22
  export { caseTransitionEmissions, applyCaseEmissions, seedDecision, seedCommitment, decisionIdForCase, commitmentIdForCase, EMITTING_CASE_TRANSITIONS, } from './case-emissions.js';
23
23
  // The unified exchange-event reducer (spec 316 §b/§2) — one append-only stream, one reducer over the record.
24
24
  export { applyExchangeEvent, caseViewFromRecord } from './exchange-reducer.js';
25
+ export { openCase, derivedCaseId } from './interactions/open-case.js';
25
26
  // Materialization provenance (spec 340 INV-340-8) — rebuilt state travels WITH which events and which
26
27
  // rules produced it, so a dropped event and a never-received one stop looking identical.
27
28
  export { EXCHANGE_REDUCER_VERSION, eventSetDigest, replayExchange } from './exchange-reducer.js';
@@ -61,4 +62,7 @@ export { emptyInboxData, parseInboxData, hydrateInboxStores, mergeContextRefs, u
61
62
  // The registered record catalog (spec 322 §1) — resource pattern → type tag + ontology binding +
62
63
  // classification floor. The catalog, never the resource string, carries the semantics.
63
64
  export { RECORD_CATALOG, catalogEntryFor } from './record-catalog.js';
65
+ // ── ADR-0060 / spec 399 §4 — the serving-plane adoption LADDER: ledger types, the rung rule, divergence and sampling.
66
+ // The ledger's VALUES stay with the product whose ops they name.
67
+ export { adoptionStage, compareServed, classifyDivergence, shouldShadow, recordDivergence, SHADOW_INTERVAL_MS, DIVERGENCE_BUFFER } from './adoption.js';
64
68
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /** Ops the record-scope gate distinguishes: a tombstone (`delete`) is a DISTINCT op from `write`. */
2
+ export type RecordScopeOp = 'read' | 'write' | 'delete';
3
+ /** A group of resources granted the same ops, before a server is named. */
4
+ export interface RecordScopeSpec {
5
+ resources: ReadonlyArray<string>;
6
+ ops: ReadonlyArray<RecordScopeOp>;
7
+ }
8
+ /** One group bound to an MCP server — structurally the delegation package's `VaultRecordScopeGrant`, so it
9
+ * feeds `buildVaultRecordScopeCaveat` directly; fabric does not depend on delegation (ADR-0047 boundary). */
10
+ export interface RecordScopeGroup {
11
+ server: string;
12
+ resources: string[];
13
+ ops: RecordScopeOp[];
14
+ }
15
+ export declare const INTERACTIONS_GRANT_CORE_SCOPES: ReadonlyArray<RecordScopeSpec>;
16
+ /**
17
+ * The grant's scope groups for one MCP server: the core, then the product's extensions (its own app
18
+ * namespaces — read-only for the agent's grounding, read+write for steward seeding), in that order.
19
+ */
20
+ export declare function interactionsGrantScopes(server: string, extensions?: ReadonlyArray<RecordScopeSpec>): RecordScopeGroup[];
21
+ //# sourceMappingURL=grant-scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grant-scopes.d.ts","sourceRoot":"","sources":["../../src/interactions/grant-scopes.ts"],"names":[],"mappings":"AAgBA,qGAAqG;AACrG,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAAG,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CAAE;AAExG;8GAC8G;AAC9G,MAAM,WAAW,gBAAgB;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,aAAa,EAAE,CAAA;CAAE;AAE/F,eAAO,MAAM,8BAA8B,EAAE,aAAa,CAAC,eAAe,CA8BzE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,aAAa,CAAC,eAAe,CAAM,GAAG,gBAAgB,EAAE,CAE3H"}
@@ -0,0 +1,39 @@
1
+ export const INTERACTIONS_GRANT_CORE_SCOPES = [
2
+ { resources: [
3
+ 'vault:conversation.index', 'vault:conversation.topic:*', 'vault:message.body:topic:*',
4
+ 'vault:inbox.data', 'vault:directory.data', 'vault:relationships.data', 'vault:member.profile:*',
5
+ 'vault:org.membership:*', 'vault:org.applications', 'vault:impact-profile', 'vault:capabilities.data',
6
+ 'vault:skills.data', 'vault:home.manifest', 'vault:control-events.data', 'vault:coordination.requests',
7
+ 'vault:coordination.index', 'vault:coordination.endeavor:*', 'vault:content.*',
8
+ 'vault:resolution.requests', 'vault:resolution.grants', 'vault:archetype.assignment', 'vault:payment.receipt:*',
9
+ 'vault:household.data',
10
+ // Spec 370 P7 — the person's own recent asks, so "him" can mean whom they just meant.
11
+ 'vault:conversation.recent',
12
+ // Spec 381 — a run's provenance, kept where the authority was spent (the DO copy is the rebuild).
13
+ 'vault:run.provenance:*',
14
+ // Spec 391 — a step's raw result, too large for the run's record, kept where the run ran.
15
+ 'vault:run.artifact:*',
16
+ // Spec 385 — the person's scoped confirmation memory (which "David", per word + capability + argument).
17
+ 'vault:confirmation.preferences',
18
+ // Spec 394 — the person's standing instructions (a declared default per room + capability + argument).
19
+ 'vault:standing.instructions',
20
+ ], ops: ['read', 'write'] },
21
+ // Spec 354 K3 — the PLAYBOOK may also be REMOVED, which is a real custodial act: an agent goes back to the
22
+ // bare harness. A tombstone is a DISTINCT op at the record-scope gate (spec 317 §3.2 / audit F1 — a
23
+ // write-only delegate must not be able to censor records), so the broad bucket above cannot express it.
24
+ { resources: ['vault:archetype.assignment'], ops: ['read', 'write', 'delete'] },
25
+ // Spec 322 W3f — dm bodies are READ-only here: the DO serves the owner's mail reads, while only the
26
+ // (write-only) delivery plane may create them. Planes stay disjoint on writes.
27
+ { resources: ['vault:message.body:dm:*'], ops: ['read'] },
28
+ // The org's own invitations, read-only — what makes membership-read's invited-member path live. Writes
29
+ // stay on the delivery plane.
30
+ { resources: ['vault:org.invite:*'], ops: ['read'] },
31
+ ];
32
+ /**
33
+ * The grant's scope groups for one MCP server: the core, then the product's extensions (its own app
34
+ * namespaces — read-only for the agent's grounding, read+write for steward seeding), in that order.
35
+ */
36
+ export function interactionsGrantScopes(server, extensions = []) {
37
+ return [...INTERACTIONS_GRANT_CORE_SCOPES, ...extensions].map((g) => ({ server, resources: [...g.resources], ops: [...g.ops] }));
38
+ }
39
+ //# sourceMappingURL=grant-scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grant-scopes.js","sourceRoot":"","sources":["../../src/interactions/grant-scopes.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,MAAM,8BAA8B,GAAmC;IAC5E,EAAE,SAAS,EAAE;YACX,0BAA0B,EAAE,4BAA4B,EAAE,4BAA4B;YACtF,kBAAkB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,wBAAwB;YAChG,wBAAwB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,yBAAyB;YACrG,mBAAmB,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,6BAA6B;YACtG,0BAA0B,EAAE,+BAA+B,EAAE,iBAAiB;YAC9E,2BAA2B,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,yBAAyB;YAC/G,sBAAsB;YACtB,sFAAsF;YACtF,2BAA2B;YAC3B,kGAAkG;YAClG,wBAAwB;YACxB,0FAA0F;YAC1F,sBAAsB;YACtB,wGAAwG;YACxG,gCAAgC;YAChC,uGAAuG;YACvG,6BAA6B;SAC9B,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAC3B,2GAA2G;IAC3G,oGAAoG;IACpG,wGAAwG;IACxG,EAAE,SAAS,EAAE,CAAC,4BAA4B,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IAC/E,oGAAoG;IACpG,+EAA+E;IAC/E,EAAE,SAAS,EAAE,CAAC,yBAAyB,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE;IACzD,uGAAuG;IACvG,8BAA8B;IAC9B,EAAE,SAAS,EAAE,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE;CACrD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,aAA6C,EAAE;IACrG,OAAO,CAAC,GAAG,8BAA8B,EAAE,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnI,CAAC"}
@@ -12,4 +12,5 @@ export { type PresentationDefinitionRef, type CredentialFormat, type PermissionT
12
12
  export { type DataSensitivity, type ActionRiskMetadataV1, type RiskDisposition, type RiskEvaluationOpts, type RiskEvaluation, evaluateActionRisk, } from './risk.js';
13
13
  export { type ActionCardKind, type ActionDescriptorV1, type ActionCardV1, type CardValidationError, validateActionCard, } from './cards.js';
14
14
  export { type InteractionExchangeRecordV1, buildExchangeRecord, type RelationshipExchangePort, } from './relationship.js';
15
+ export { INTERACTIONS_GRANT_CORE_SCOPES, interactionsGrantScopes, type RecordScopeOp, type RecordScopeSpec, type RecordScopeGroup, } from './grant-scopes.js';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interactions/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AACrE,eAAO,MAAM,cAAc,EAAG,qBAA8B,CAAC;AAC7D,eAAO,MAAM,QAAQ,4CAA4C,CAAC;AAElE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,QAAQ,EACR,cAAc,EACd,WAAW,EACX,WAAW,EACX,OAAO,GACR,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,KAAK,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EAAE,KAAK,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,sBAAsB,EACtB,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,iCAAiC,GAClC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,2BAA2B,EAChC,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interactions/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AACrE,eAAO,MAAM,cAAc,EAAG,qBAA8B,CAAC;AAC7D,eAAO,MAAM,QAAQ,4CAA4C,CAAC;AAElE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,QAAQ,EACR,cAAc,EACd,WAAW,EACX,WAAW,EACX,OAAO,GACR,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,KAAK,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EAAE,KAAK,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,sBAAsB,EACtB,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,iCAAiC,GAClC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,2BAA2B,EAChC,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC"}
@@ -20,4 +20,7 @@ export { createPermissionTicket, isTicketExpired, checkPresentationAnswersChalle
20
20
  export { evaluateActionRisk, } from './risk.js';
21
21
  export { validateActionCard, } from './cards.js';
22
22
  export { buildExchangeRecord, } from './relationship.js';
23
+ // The interactions grant's record scopes — one list the Home (issuing the grant) and the agent runtime
24
+ // (a chartered child's genesis planes) both compose from; the product appends its own namespaces.
25
+ export { INTERACTIONS_GRANT_CORE_SCOPES, interactionsGrantScopes, } from './grant-scopes.js';
23
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interactions/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2EAA2E;AAC3E,+EAA+E;AAC/E,6EAA6E;AAC7E,4CAA4C;AAC5C,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,qBAA8B,CAAC;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAG,yCAAyC,CAAC;AA0BlE,OAAO,EACL,eAAe,EACf,eAAe,EAGf,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EAEnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,WAAW,EACX,OAAO,GACR,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAyB,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EAAgC,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,EAML,yBAAyB,EAIzB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAOL,sBAAsB,EACtB,eAAe,EAGf,iCAAiC,GAClC,MAAM,cAAc,CAAC;AAEtB,OAAO,EAML,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAKL,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAEL,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interactions/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2EAA2E;AAC3E,+EAA+E;AAC/E,6EAA6E;AAC7E,4CAA4C;AAC5C,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,qBAA8B,CAAC;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAG,yCAAyC,CAAC;AA0BlE,OAAO,EACL,eAAe,EACf,eAAe,EAGf,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EAEnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,WAAW,EACX,OAAO,GACR,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAyB,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EAAgC,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,EAML,yBAAyB,EAIzB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAOL,sBAAsB,EACtB,eAAe,EAGf,iCAAiC,GAClC,MAAM,cAAc,CAAC;AAEtB,OAAO,EAML,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAKL,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAEL,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAE3B,uGAAuG;AACvG,kGAAkG;AAClG,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,GAIxB,MAAM,mBAAmB,CAAC"}