@agenticprimitives/fabric 0.0.0-alpha.3 → 0.0.0-alpha.31
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/CLAUDE.md +30 -29
- package/README.md +18 -16
- package/dist/adoption.d.ts +79 -0
- package/dist/adoption.d.ts.map +1 -0
- package/dist/adoption.js +95 -0
- package/dist/adoption.js.map +1 -0
- package/dist/case-emissions.d.ts +95 -0
- package/dist/case-emissions.d.ts.map +1 -0
- package/dist/case-emissions.js +208 -0
- package/dist/case-emissions.js.map +1 -0
- package/dist/case-machine.d.ts +28 -2
- package/dist/case-machine.d.ts.map +1 -1
- package/dist/case-machine.js +34 -7
- package/dist/case-machine.js.map +1 -1
- package/dist/cloudflare/authority-verdict-cache.d.ts +28 -1
- package/dist/cloudflare/authority-verdict-cache.d.ts.map +1 -1
- package/dist/cloudflare/authority-verdict-cache.js +32 -1
- package/dist/cloudflare/authority-verdict-cache.js.map +1 -1
- package/dist/cloudflare/index.d.ts +4 -1
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/index.js +7 -1
- package/dist/cloudflare/index.js.map +1 -1
- package/dist/cloudflare/interaction-store.d.ts +55 -0
- package/dist/cloudflare/interaction-store.d.ts.map +1 -0
- package/dist/cloudflare/interaction-store.js +230 -0
- package/dist/cloudflare/interaction-store.js.map +1 -0
- package/dist/cloudflare/principal-gateway-do.d.ts +136 -2
- package/dist/cloudflare/principal-gateway-do.d.ts.map +1 -1
- package/dist/cloudflare/principal-gateway-do.js +190 -8
- package/dist/cloudflare/principal-gateway-do.js.map +1 -1
- package/dist/cloudflare/sql-vault.d.ts.map +1 -1
- package/dist/cloudflare/sql-vault.js +56 -0
- package/dist/cloudflare/sql-vault.js.map +1 -1
- package/dist/cloudflare/vault-exchange-store.d.ts +47 -0
- package/dist/cloudflare/vault-exchange-store.d.ts.map +1 -0
- package/dist/cloudflare/vault-exchange-store.js +118 -0
- package/dist/cloudflare/vault-exchange-store.js.map +1 -0
- package/dist/cloudflare/vault-interaction-store.d.ts +44 -0
- package/dist/cloudflare/vault-interaction-store.d.ts.map +1 -0
- package/dist/cloudflare/vault-interaction-store.js +245 -0
- package/dist/cloudflare/vault-interaction-store.js.map +1 -0
- package/dist/communicative-act.d.ts +24 -1
- package/dist/communicative-act.d.ts.map +1 -1
- package/dist/communicative-act.js +28 -0
- package/dist/communicative-act.js.map +1 -1
- package/dist/delivery-envelope.d.ts.map +1 -1
- package/dist/delivery-envelope.js +0 -1
- package/dist/delivery-envelope.js.map +1 -1
- package/dist/email/index.d.ts +75 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +77 -0
- package/dist/email/index.js.map +1 -0
- package/dist/enum-retirement.d.ts +43 -0
- package/dist/enum-retirement.d.ts.map +1 -0
- package/dist/enum-retirement.js +93 -0
- package/dist/enum-retirement.js.map +1 -0
- package/dist/exchange-record.d.ts +35 -4
- package/dist/exchange-record.d.ts.map +1 -1
- package/dist/exchange-record.js.map +1 -1
- package/dist/exchange-reducer.d.ts +32 -4
- package/dist/exchange-reducer.d.ts.map +1 -1
- package/dist/exchange-reducer.js +75 -1
- package/dist/exchange-reducer.js.map +1 -1
- package/dist/exchange-state.d.ts +30 -8
- package/dist/exchange-state.d.ts.map +1 -1
- package/dist/exchange-state.js +12 -10
- package/dist/exchange-state.js.map +1 -1
- package/dist/inbox-doc.d.ts +2 -2
- package/dist/inbox-doc.d.ts.map +1 -1
- package/dist/inbox-doc.js.map +1 -1
- package/dist/inbox-projection.d.ts +2 -2
- package/dist/inbox-projection.d.ts.map +1 -1
- package/dist/inbox-projection.js.map +1 -1
- package/dist/inbox-revision.d.ts +42 -0
- package/dist/inbox-revision.d.ts.map +1 -0
- package/dist/inbox-revision.js +57 -0
- package/dist/inbox-revision.js.map +1 -0
- package/dist/index.d.ts +26 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/interaction-machines.d.ts +136 -0
- package/dist/interaction-machines.d.ts.map +1 -0
- package/dist/interaction-machines.js +174 -0
- package/dist/interaction-machines.js.map +1 -0
- package/dist/interaction-profile.d.ts +136 -0
- package/dist/interaction-profile.d.ts.map +1 -0
- package/dist/interaction-profile.js +212 -0
- package/dist/interaction-profile.js.map +1 -0
- package/dist/interaction-record.d.ts +168 -0
- package/dist/interaction-record.d.ts.map +1 -0
- package/dist/interaction-record.js +108 -0
- package/dist/interaction-record.js.map +1 -0
- package/dist/interactions/grant-scopes.d.ts +21 -0
- package/dist/interactions/grant-scopes.d.ts.map +1 -0
- package/dist/interactions/grant-scopes.js +88 -0
- package/dist/interactions/grant-scopes.js.map +1 -0
- package/dist/interactions/index.d.ts +1 -0
- package/dist/interactions/index.d.ts.map +1 -1
- package/dist/interactions/index.js +3 -0
- package/dist/interactions/index.js.map +1 -1
- package/dist/interactions/machine.d.ts +2 -2
- package/dist/interactions/machine.d.ts.map +1 -1
- package/dist/interactions/machine.js +2 -2
- package/dist/interactions/machine.js.map +1 -1
- package/dist/interactions/open-case.d.ts +60 -0
- package/dist/interactions/open-case.d.ts.map +1 -0
- package/dist/interactions/open-case.js +83 -0
- package/dist/interactions/open-case.js.map +1 -0
- package/dist/interactions/store.d.ts +9 -0
- package/dist/interactions/store.d.ts.map +1 -1
- package/dist/interactions/store.js +57 -2
- package/dist/interactions/store.js.map +1 -1
- package/dist/messaging/board.d.ts +3 -3
- package/dist/messaging/board.d.ts.map +1 -1
- package/dist/messaging/board.js +2 -2
- package/dist/messaging/board.js.map +1 -1
- package/dist/messaging/consult-routing.d.ts +21 -14
- package/dist/messaging/consult-routing.d.ts.map +1 -1
- package/dist/messaging/consult-routing.js +34 -25
- package/dist/messaging/consult-routing.js.map +1 -1
- package/dist/messaging/consult.d.ts +4 -0
- package/dist/messaging/consult.d.ts.map +1 -1
- package/dist/messaging/consult.js +3 -1
- package/dist/messaging/consult.js.map +1 -1
- package/dist/messaging/conversation-interaction.d.ts +66 -0
- package/dist/messaging/conversation-interaction.d.ts.map +1 -0
- package/dist/messaging/conversation-interaction.js +139 -0
- package/dist/messaging/conversation-interaction.js.map +1 -0
- package/dist/messaging/conversation.d.ts +69 -1
- package/dist/messaging/conversation.d.ts.map +1 -1
- package/dist/messaging/conversation.js +131 -0
- package/dist/messaging/conversation.js.map +1 -1
- package/dist/messaging/delivery.d.ts +2 -2
- package/dist/messaging/delivery.d.ts.map +1 -1
- package/dist/messaging/delivery.js +8 -1
- package/dist/messaging/delivery.js.map +1 -1
- package/dist/messaging/envelope.d.ts +7 -3
- package/dist/messaging/envelope.d.ts.map +1 -1
- package/dist/messaging/envelope.js +18 -1
- package/dist/messaging/envelope.js.map +1 -1
- package/dist/messaging/hash.d.ts +8 -2
- package/dist/messaging/hash.d.ts.map +1 -1
- package/dist/messaging/hash.js +6 -0
- package/dist/messaging/hash.js.map +1 -1
- package/dist/messaging/inbox-assistant.d.ts +16 -4
- package/dist/messaging/inbox-assistant.d.ts.map +1 -1
- package/dist/messaging/inbox-assistant.js +27 -4
- package/dist/messaging/inbox-assistant.js.map +1 -1
- package/dist/messaging/index.d.ts +6 -2
- package/dist/messaging/index.d.ts.map +1 -1
- package/dist/messaging/index.js +10 -1
- package/dist/messaging/index.js.map +1 -1
- package/dist/messaging/outbound-message.d.ts +42 -0
- package/dist/messaging/outbound-message.d.ts.map +1 -0
- package/dist/messaging/outbound-message.js +64 -0
- package/dist/messaging/outbound-message.js.map +1 -0
- package/dist/messaging/projector.d.ts +3 -3
- package/dist/messaging/projector.d.ts.map +1 -1
- package/dist/messaging/projector.js.map +1 -1
- package/dist/messaging/receipts.d.ts +3 -3
- package/dist/messaging/receipts.d.ts.map +1 -1
- package/dist/messaging/receipts.js.map +1 -1
- package/dist/messaging/rules.d.ts +10 -3
- package/dist/messaging/rules.d.ts.map +1 -1
- package/dist/messaging/rules.js +8 -1
- package/dist/messaging/rules.js.map +1 -1
- package/dist/messaging/store.d.ts +4 -4
- package/dist/messaging/store.d.ts.map +1 -1
- package/dist/messaging/store.js +5 -3
- package/dist/messaging/store.js.map +1 -1
- package/dist/messaging/types.d.ts +30 -0
- package/dist/messaging/types.d.ts.map +1 -1
- package/dist/messaging/types.js +3 -0
- package/dist/messaging/types.js.map +1 -1
- package/dist/messaging/vault-store.d.ts +2 -2
- package/dist/messaging/vault-store.d.ts.map +1 -1
- package/dist/protocol-binding.d.ts +71 -0
- package/dist/protocol-binding.d.ts.map +1 -0
- package/dist/protocol-binding.js +0 -0
- package/dist/protocol-binding.js.map +1 -0
- package/dist/record-catalog.d.ts.map +1 -1
- package/dist/record-catalog.js +12 -0
- package/dist/record-catalog.js.map +1 -1
- package/package.json +28 -15
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConversationDescriptorV1 } from './types.js';
|
|
1
|
+
import type { ConversationDescriptorV1, ConversationId } from './types.js';
|
|
2
2
|
export type ConversationValidationError = 'bad_version' | 'bad_id' | 'missing_owner' | 'empty_participants' | 'owner_not_participant' | 'bad_participant_policy' | 'bad_created_at' | 'too_many_context_refs' | 'bad_context_ref';
|
|
3
3
|
/** Structural validation, fail-closed. Empty array iff admissible. */
|
|
4
4
|
export declare function validateConversationDescriptor(d: ConversationDescriptorV1): ConversationValidationError[];
|
|
@@ -32,4 +32,72 @@ export declare function summarizeConversations(items: readonly {
|
|
|
32
32
|
label?: string;
|
|
33
33
|
}[];
|
|
34
34
|
}[]): ConversationSummaryV1[];
|
|
35
|
+
/** The EVM address inside a CAIP-10 (or bare) agent id, lowercased; '' when there is none. */
|
|
36
|
+
export declare function agentAddressOf(id: string): string;
|
|
37
|
+
/** Prefix that marks an id as a deterministic pairwise DM (`conv_dm_<32 hex>`). */
|
|
38
|
+
export declare const DIRECT_CONVERSATION_PREFIX = "conv_dm_";
|
|
39
|
+
/**
|
|
40
|
+
* The one conversation id for the DM between `a` and `b` — order-independent, address-keyed, so the
|
|
41
|
+
* same pair always names the same thread from either side. Self-DM (a === b) is a valid pair.
|
|
42
|
+
*/
|
|
43
|
+
export declare function directConversationId(a: string, b: string): Promise<ConversationId>;
|
|
44
|
+
export declare const isDirectConversationId: (id: string) => boolean;
|
|
45
|
+
/** The bucket key for a counterparty set: sorted lowercase addresses joined by `+`. */
|
|
46
|
+
export declare function directMessageKey(counterparties: readonly string[]): string;
|
|
47
|
+
export interface DirectMessageSummaryV1 {
|
|
48
|
+
/** `directMessageKey` of the counterparties — stable across conversation ids. */
|
|
49
|
+
key: string;
|
|
50
|
+
/** The OTHER parties' addresses (lowercase). One entry for a DM; several for a small group. */
|
|
51
|
+
counterparties: string[];
|
|
52
|
+
/** Every conversation folded into this bucket, most recently active first. */
|
|
53
|
+
conversationIds: ConversationId[];
|
|
54
|
+
messageCount: number;
|
|
55
|
+
unread: number;
|
|
56
|
+
lastEventAt: string;
|
|
57
|
+
/** The newest non-trashed message — what the rail previews. */
|
|
58
|
+
lastMessageId: string;
|
|
59
|
+
/** True when the owner sent the newest message (rail shows "You: …"). */
|
|
60
|
+
lastFromOwner: boolean;
|
|
61
|
+
/** Union of context refs across every message in the bucket. */
|
|
62
|
+
contextRefs: {
|
|
63
|
+
kind: string;
|
|
64
|
+
id: string;
|
|
65
|
+
label?: string;
|
|
66
|
+
}[];
|
|
67
|
+
hasPending: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface DirectMessageSummaryInput {
|
|
70
|
+
/** The owner whose projection this is (CAIP-10 or address). */
|
|
71
|
+
owner: string;
|
|
72
|
+
items: readonly {
|
|
73
|
+
messageId: string;
|
|
74
|
+
conversationId: ConversationId;
|
|
75
|
+
folder: string;
|
|
76
|
+
unread: boolean;
|
|
77
|
+
lastEventAt: string;
|
|
78
|
+
contextRefs: {
|
|
79
|
+
kind: string;
|
|
80
|
+
id: string;
|
|
81
|
+
label?: string;
|
|
82
|
+
}[];
|
|
83
|
+
}[];
|
|
84
|
+
/** Owner's descriptors by conversation id — the participant list when present. */
|
|
85
|
+
descriptors: Readonly<Record<string, {
|
|
86
|
+
participants: readonly string[];
|
|
87
|
+
}>>;
|
|
88
|
+
/** Envelope addressing by message id — the participant list when a descriptor is absent. */
|
|
89
|
+
envelopes: Readonly<Record<string, {
|
|
90
|
+
from: string;
|
|
91
|
+
to: readonly string[];
|
|
92
|
+
}>>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Fold the owner's inbox into per-counterparty DM buckets, newest activity first.
|
|
96
|
+
*
|
|
97
|
+
* The counterparties of a conversation come from its descriptor's participants minus the owner; a
|
|
98
|
+
* conversation with no descriptor (an older recipient-side thread) derives them from its envelopes'
|
|
99
|
+
* `from`/`to`. A conversation whose only participant is the owner is a self-DM (Slack's "you" space).
|
|
100
|
+
* Trashed items are skipped, as `summarizeConversations` skips them. Pure and deterministic.
|
|
101
|
+
*/
|
|
102
|
+
export declare function summarizeDirectMessages(input: DirectMessageSummaryInput): DirectMessageSummaryV1[];
|
|
35
103
|
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/messaging/conversation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/messaging/conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// anchors, append policy); it never authorizes delivery — admission validates
|
|
4
4
|
// every envelope independently, and each side keeps its own descriptor copy.
|
|
5
5
|
import { MAX_CONTEXT_REFS } from './envelope.js';
|
|
6
|
+
import { sha256Hex32 } from './hash.js';
|
|
6
7
|
const HEX32_RE = /^0x[0-9a-f]{64}$/;
|
|
7
8
|
const POLICIES = [
|
|
8
9
|
'fixed',
|
|
@@ -69,4 +70,134 @@ export function summarizeConversations(items) {
|
|
|
69
70
|
}
|
|
70
71
|
return [...byConv.values()].sort((a, b) => b.lastEventAt.localeCompare(a.lastEventAt));
|
|
71
72
|
}
|
|
73
|
+
// ─── Direct messages — the Slack DM model (spec 313 §2 amendment) ────────────────────────────────────
|
|
74
|
+
//
|
|
75
|
+
// A direct message is identified by WHO, not by what it is about. There is one DM between two agents,
|
|
76
|
+
// ever — the way Slack has one DM per pair — and a "new message" to someone you have already talked
|
|
77
|
+
// to lands in that same DM. A subject line is not a conversation boundary; it never was, it was just
|
|
78
|
+
// the only thing the old composer had to title a fresh `conv_` id with.
|
|
79
|
+
//
|
|
80
|
+
// TWO PIECES, both pure:
|
|
81
|
+
// • `directConversationId(a, b)` — the DETERMINISTIC id of the DM between two agents. Both sides
|
|
82
|
+
// mint the same id without coordinating, so a first message racing from each end still lands in
|
|
83
|
+
// ONE conversation, and "continue the DM with X" needs no lookup.
|
|
84
|
+
// • `summarizeDirectMessages(...)` — the rail projection: every conversation the owner has with the
|
|
85
|
+
// same counterparty set, folded into one bucket, newest activity first, with the last message
|
|
86
|
+
// named so the rail can show it. Historical random-id conversations with the same counterparty
|
|
87
|
+
// fold into the bucket too — no migration, the projection absorbs them (deletes > deprecations).
|
|
88
|
+
//
|
|
89
|
+
// Neither is authority. A bucket is a VIEW over the owner's own projection; the id is a name for a
|
|
90
|
+
// thread, and admission still validates every envelope on its own (spec 312 §4.2).
|
|
91
|
+
const ADDR_RE = /0x[0-9a-fA-F]{40}$/;
|
|
92
|
+
/** The EVM address inside a CAIP-10 (or bare) agent id, lowercased; '' when there is none. */
|
|
93
|
+
export function agentAddressOf(id) {
|
|
94
|
+
return (String(id).match(ADDR_RE)?.[0] ?? '').toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
/** Prefix that marks an id as a deterministic pairwise DM (`conv_dm_<32 hex>`). */
|
|
97
|
+
export const DIRECT_CONVERSATION_PREFIX = 'conv_dm_';
|
|
98
|
+
/**
|
|
99
|
+
* The one conversation id for the DM between `a` and `b` — order-independent, address-keyed, so the
|
|
100
|
+
* same pair always names the same thread from either side. Self-DM (a === b) is a valid pair.
|
|
101
|
+
*/
|
|
102
|
+
export async function directConversationId(a, b) {
|
|
103
|
+
const x = agentAddressOf(a);
|
|
104
|
+
const y = agentAddressOf(b);
|
|
105
|
+
if (!x || !y)
|
|
106
|
+
throw new Error('directConversationId: both parties must be EVM agents');
|
|
107
|
+
const [lo, hi] = x < y ? [x, y] : [y, x];
|
|
108
|
+
const digest = await sha256Hex32(`ap.direct-message.v1|${lo}|${hi}`);
|
|
109
|
+
return `${DIRECT_CONVERSATION_PREFIX}${digest.slice(2, 34)}`;
|
|
110
|
+
}
|
|
111
|
+
export const isDirectConversationId = (id) => id.startsWith(DIRECT_CONVERSATION_PREFIX);
|
|
112
|
+
/** The bucket key for a counterparty set: sorted lowercase addresses joined by `+`. */
|
|
113
|
+
export function directMessageKey(counterparties) {
|
|
114
|
+
return [...new Set(counterparties.map(agentAddressOf).filter(Boolean))].sort().join('+');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Fold the owner's inbox into per-counterparty DM buckets, newest activity first.
|
|
118
|
+
*
|
|
119
|
+
* The counterparties of a conversation come from its descriptor's participants minus the owner; a
|
|
120
|
+
* conversation with no descriptor (an older recipient-side thread) derives them from its envelopes'
|
|
121
|
+
* `from`/`to`. A conversation whose only participant is the owner is a self-DM (Slack's "you" space).
|
|
122
|
+
* Trashed items are skipped, as `summarizeConversations` skips them. Pure and deterministic.
|
|
123
|
+
*/
|
|
124
|
+
export function summarizeDirectMessages(input) {
|
|
125
|
+
const me = agentAddressOf(input.owner);
|
|
126
|
+
const live = input.items.filter((i) => i.folder !== 'trash');
|
|
127
|
+
// 1. counterparties per conversation
|
|
128
|
+
const partiesByConv = new Map();
|
|
129
|
+
for (const item of live) {
|
|
130
|
+
if (partiesByConv.has(item.conversationId))
|
|
131
|
+
continue;
|
|
132
|
+
const d = input.descriptors[item.conversationId];
|
|
133
|
+
const set = new Set();
|
|
134
|
+
if (d) {
|
|
135
|
+
for (const p of d.participants) {
|
|
136
|
+
const a = agentAddressOf(p);
|
|
137
|
+
if (a && a !== me)
|
|
138
|
+
set.add(a);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
for (const i of live) {
|
|
143
|
+
if (i.conversationId !== item.conversationId)
|
|
144
|
+
continue;
|
|
145
|
+
const e = input.envelopes[i.messageId];
|
|
146
|
+
if (!e)
|
|
147
|
+
continue;
|
|
148
|
+
for (const p of [e.from, ...e.to]) {
|
|
149
|
+
const a = agentAddressOf(p);
|
|
150
|
+
if (a && a !== me)
|
|
151
|
+
set.add(a);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Nobody but the owner ⇒ self-DM, keyed by the owner.
|
|
156
|
+
partiesByConv.set(item.conversationId, set.size > 0 ? [...set].sort() : [me]);
|
|
157
|
+
}
|
|
158
|
+
// 2. fold conversations into buckets
|
|
159
|
+
const buckets = new Map();
|
|
160
|
+
for (const item of live) {
|
|
161
|
+
const parties = partiesByConv.get(item.conversationId);
|
|
162
|
+
const key = directMessageKey(parties);
|
|
163
|
+
const b = buckets.get(key) ?? {
|
|
164
|
+
key,
|
|
165
|
+
counterparties: parties,
|
|
166
|
+
conversationIds: [],
|
|
167
|
+
messageCount: 0,
|
|
168
|
+
unread: 0,
|
|
169
|
+
lastEventAt: item.lastEventAt,
|
|
170
|
+
lastMessageId: item.messageId,
|
|
171
|
+
lastFromOwner: item.folder === 'sent',
|
|
172
|
+
contextRefs: [],
|
|
173
|
+
hasPending: false,
|
|
174
|
+
convLast: new Map(),
|
|
175
|
+
};
|
|
176
|
+
b.messageCount += 1;
|
|
177
|
+
if (item.unread)
|
|
178
|
+
b.unread += 1;
|
|
179
|
+
if (item.folder === 'pending')
|
|
180
|
+
b.hasPending = true;
|
|
181
|
+
if (item.lastEventAt >= b.lastEventAt) {
|
|
182
|
+
b.lastEventAt = item.lastEventAt;
|
|
183
|
+
b.lastMessageId = item.messageId;
|
|
184
|
+
b.lastFromOwner = item.folder === 'sent';
|
|
185
|
+
}
|
|
186
|
+
const prevConv = b.convLast.get(item.conversationId);
|
|
187
|
+
if (!prevConv || item.lastEventAt > prevConv)
|
|
188
|
+
b.convLast.set(item.conversationId, item.lastEventAt);
|
|
189
|
+
for (const ref of item.contextRefs) {
|
|
190
|
+
if (!b.contextRefs.some((r) => r.kind === ref.kind && r.id === ref.id)) {
|
|
191
|
+
b.contextRefs.push({ kind: ref.kind, id: ref.id, ...(ref.label !== undefined ? { label: ref.label } : {}) });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
buckets.set(key, b);
|
|
195
|
+
}
|
|
196
|
+
return [...buckets.values()]
|
|
197
|
+
.map(({ convLast, ...b }) => ({
|
|
198
|
+
...b,
|
|
199
|
+
conversationIds: [...convLast.entries()].sort((x, y) => y[1].localeCompare(x[1])).map(([id]) => id),
|
|
200
|
+
}))
|
|
201
|
+
.sort((a, b) => b.lastEventAt.localeCompare(a.lastEventAt));
|
|
202
|
+
}
|
|
72
203
|
//# sourceMappingURL=conversation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/messaging/conversation.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAG7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/messaging/conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AuditSink } from '@agenticprimitives/audit';
|
|
2
2
|
import type { InboxProjector } from './projector.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { AnyMessageEnvelope, MessageEventV1 } from './types.js';
|
|
4
4
|
import type { RuleApplication } from './rules.js';
|
|
5
5
|
export interface AuditedInboxDelivery {
|
|
6
6
|
/**
|
|
@@ -8,7 +8,7 @@ export interface AuditedInboxDelivery {
|
|
|
8
8
|
* `bodyBytes` is provided the body-hash binding is enforced (§8.4); pass the
|
|
9
9
|
* bytes fetched from the vault whenever the body was transported.
|
|
10
10
|
*/
|
|
11
|
-
admit(envelope:
|
|
11
|
+
admit(envelope: AnyMessageEnvelope, event: MessageEventV1, bodyBytes?: Uint8Array): Promise<RuleApplication>;
|
|
12
12
|
}
|
|
13
13
|
export declare function createAuditedInboxDelivery(opts: {
|
|
14
14
|
projector: InboxProjector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/messaging/delivery.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/messaging/delivery.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwBlD,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,KAAK,CACH,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,cAAc,EACrB,SAAS,CAAC,EAAE,UAAU,GACrB,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,oBAAoB,CAiCvB"}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
// Fail-closed ordering: validate → verify body hash → AUDIT (await) → commit.
|
|
4
4
|
// If the audit write fails the message is NOT admitted (spec 291 discipline for
|
|
5
5
|
// privileged outcomes); rejects are audited as `denied` before throwing.
|
|
6
|
+
import { isEnvelopeV2 } from './types.js';
|
|
7
|
+
import { performativeOf } from '../communicative-act.js';
|
|
6
8
|
import { validateMessageEnvelope } from './envelope.js';
|
|
7
9
|
import { verifyBodyHash } from './hash.js';
|
|
8
10
|
function auditEventBase(envelope, recipient) {
|
|
@@ -14,7 +16,12 @@ function auditEventBase(envelope, recipient) {
|
|
|
14
16
|
// Hashes/ids only — never bodies, subjects, or PII (spec 309 §9).
|
|
15
17
|
context: {
|
|
16
18
|
from: envelope.from,
|
|
17
|
-
|
|
19
|
+
// spec 340 — the audit records what the message DOES, which spans both wire versions. `kind` is
|
|
20
|
+
// kept when the envelope is V1 so historical rows stay comparable, and is simply absent on V2
|
|
21
|
+
// rather than being back-derived: `performativeForKind` is not injective, so a reconstructed
|
|
22
|
+
// `kind` would be a guess written into an audit trail.
|
|
23
|
+
performative: performativeOf(envelope),
|
|
24
|
+
...(isEnvelopeV2(envelope) ? {} : { kind: envelope.kind }),
|
|
18
25
|
classification: envelope.classification,
|
|
19
26
|
bodyHash: envelope.bodyHash,
|
|
20
27
|
conversationId: envelope.conversationId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/messaging/delivery.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,yEAAyE;AAKzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,SAAS,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/messaging/delivery.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,yEAAyE;AAKzE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,SAAS,cAAc,CAAC,QAA4B,EAAE,SAAiB;IACrE,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,EAAE,EAAE,SAAS,EAAE;QAClD,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC7C,kEAAkE;QAClE,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,gGAAgG;YAChG,8FAA8F;YAC9F,6FAA6F;YAC7F,uDAAuD;YACvD,YAAY,EAAE,cAAc,CAAC,QAAQ,CAAC;YACtC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1D,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,cAAc,EAAE,QAAQ,CAAC,cAAc;SACxC;KACF,CAAC;AACJ,CAAC;AAeD,MAAM,UAAU,0BAA0B,CAAC,IAK1C;IACC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAE7C,KAAK,UAAU,MAAM,CAAC,QAA4B,EAAE,MAAc;QAChE,MAAM,KAAK,CAAC,KAAK,CAAC;YAChB,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC;YACtC,MAAM,EAAE,0BAA0B;YAClC,OAAO,EAAE,QAAQ;YACjB,MAAM;SACP,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,CAAC,EAAE,cAAc,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS;YACpC,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,qBAAqB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzF,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,EAAE;gBAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;YAC3F,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;gBAC5E,OAAO,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;YAC/C,CAAC;YAED,oEAAoE;YACpE,MAAM,KAAK,CAAC,KAAK,CAAC;gBAChB,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC;gBACtC,MAAM,EAAE,0BAA0B;gBAClC,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;YAEH,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AnyMessageEnvelope, ConversationId, MessageId, ThreadId } from './types.js';
|
|
2
2
|
export declare function generateMessageId(): MessageId;
|
|
3
3
|
export declare function generateConversationId(): ConversationId;
|
|
4
4
|
export declare function generateThreadId(): ThreadId;
|
|
5
|
-
export type EnvelopeValidationError = 'bad_version' | 'bad_id' | 'bad_conversation_id' | 'missing_from' | 'empty_recipients' | 'bad_created_at' | 'bad_expires_at' | 'expired_before_created' | 'bad_body_hash' | 'missing_body_content_type' | 'bad_attachment_hash' | 'too_many_context_refs' | 'bad_context_ref'
|
|
5
|
+
export type EnvelopeValidationError = 'bad_version' | 'bad_id' | 'bad_conversation_id' | 'missing_from' | 'empty_recipients' | 'bad_created_at' | 'bad_expires_at' | 'expired_before_created' | 'bad_body_hash' | 'missing_body_content_type' | 'bad_attachment_hash' | 'too_many_context_refs' | 'bad_context_ref'
|
|
6
|
+
/** V2-only (spec 340 cutover): the version says v2 but the act it performs is absent. */
|
|
7
|
+
| 'missing_performative'
|
|
8
|
+
/** V2-only: a half-migrated sender stamped v2 while still emitting the retired `kind` taxonomy. */
|
|
9
|
+
| 'v2_carries_retired_kind';
|
|
6
10
|
/** Envelope context refs are bounded so refs stay metadata, not payload. */
|
|
7
11
|
export declare const MAX_CONTEXT_REFS = 8;
|
|
8
12
|
/**
|
|
@@ -10,5 +14,5 @@ export declare const MAX_CONTEXT_REFS = 8;
|
|
|
10
14
|
* recipient admission policy are the recipient runtime's job (spec 309 §4.4).
|
|
11
15
|
* Returns an empty array iff the envelope is structurally admissible.
|
|
12
16
|
*/
|
|
13
|
-
export declare function validateMessageEnvelope(env:
|
|
17
|
+
export declare function validateMessageEnvelope(env: AnyMessageEnvelope): EnvelopeValidationError[];
|
|
14
18
|
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/messaging/envelope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/messaging/envelope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAqB,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW7G,wBAAgB,iBAAiB,IAAI,SAAS,CAE7C;AAED,wBAAgB,sBAAsB,IAAI,cAAc,CAEvD;AAED,wBAAgB,gBAAgB,IAAI,QAAQ,CAE3C;AAED,MAAM,MAAM,uBAAuB,GAC/B,aAAa,GACb,QAAQ,GACR,qBAAqB,GACrB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,wBAAwB,GACxB,eAAe,GACf,2BAA2B,GAC3B,qBAAqB,GACrB,uBAAuB,GACvB,iBAAiB;AACnB,yFAAyF;GACvF,sBAAsB;AACxB,mGAAmG;GACjG,yBAAyB,CAAC;AAE9B,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAQlC;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,kBAAkB,GAAG,uBAAuB,EAAE,CA6C1F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Envelope construction + structural validation (fail-closed, spec 309 §8).
|
|
2
|
+
import { isEnvelopeV2 } from './types.js';
|
|
2
3
|
function randomSuffix() {
|
|
3
4
|
const bytes = new Uint8Array(16);
|
|
4
5
|
globalThis.crypto.getRandomValues(bytes);
|
|
@@ -28,8 +29,24 @@ function isIsoDate(s) {
|
|
|
28
29
|
*/
|
|
29
30
|
export function validateMessageEnvelope(env) {
|
|
30
31
|
const errors = [];
|
|
31
|
-
|
|
32
|
+
// spec 340 — the ap.message.v2 cutover, reader half. BOTH wire versions are structurally
|
|
33
|
+
// admissible. This must ship and be DEPLOYED EVERYWHERE before any sender emits V2: a V2 envelope
|
|
34
|
+
// reaching a validator that only knows V1 is rejected as `bad_version`, which on a peer hop is a
|
|
35
|
+
// delivery failure, not a degraded read.
|
|
36
|
+
//
|
|
37
|
+
// The two shapes are checked for what each one IS, not merely tolerated: V2 must carry a
|
|
38
|
+
// `performative` and must NOT carry `kind`, so a half-migrated sender that stamps v2 while still
|
|
39
|
+
// emitting the retired taxonomy fails here instead of quietly producing an envelope whose version
|
|
40
|
+
// and content disagree.
|
|
41
|
+
if (isEnvelopeV2(env)) {
|
|
42
|
+
if (!env.performative)
|
|
43
|
+
errors.push('missing_performative');
|
|
44
|
+
if (env.kind !== undefined)
|
|
45
|
+
errors.push('v2_carries_retired_kind');
|
|
46
|
+
}
|
|
47
|
+
else if (env.version !== 'ap.message.v1') {
|
|
32
48
|
errors.push('bad_version');
|
|
49
|
+
}
|
|
33
50
|
if (!env.id?.startsWith('msg_'))
|
|
34
51
|
errors.push('bad_id');
|
|
35
52
|
if (!env.conversationId?.startsWith('conv_'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/messaging/envelope.ts"],"names":[],"mappings":"AAAA,4EAA4E;
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/messaging/envelope.ts"],"names":[],"mappings":"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"}
|
package/dist/messaging/hash.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Hex32, MessageEnvelopeV1 } from './types.js';
|
|
1
|
+
import type { AnyMessageEnvelope, Hex32, MessageEnvelopeV1 } from './types.js';
|
|
2
2
|
import { canonicalizeJson } from '@agenticprimitives/types';
|
|
3
3
|
/** Deterministic JSON: sorted keys, `undefined` members dropped. Hoisted to `@agenticprimitives/types` as
|
|
4
4
|
* `canonicalizeJson` (spec 316 Open Decision F); kept here as an alias for back-compat. */
|
|
@@ -8,8 +8,14 @@ export declare function sha256Hex32(input: string | Uint8Array): Promise<Hex32>;
|
|
|
8
8
|
* Hash of the canonical envelope EXCLUDING `signature` — this is the payload a
|
|
9
9
|
* sender signs and a recipient verifies (spec 309 §8.1). Deterministic across
|
|
10
10
|
* key order and undefined optional fields.
|
|
11
|
+
*
|
|
12
|
+
* Version-agnostic BY CONSTRUCTION, and that is the property the ap.message.v2 cutover rests on: it
|
|
13
|
+
* canonicalizes whatever fields the envelope has. A V1 envelope hashes today exactly as it hashed
|
|
14
|
+
* before V2 existed, so every historical signature and delivery receipt still verifies. `version` is
|
|
15
|
+
* itself inside the hashed body, so V1 and V2 of otherwise-identical content are domain-separated for
|
|
16
|
+
* free — no envelope can be replayed across versions.
|
|
11
17
|
*/
|
|
12
|
-
export declare function hashMessageEnvelope(envelope:
|
|
18
|
+
export declare function hashMessageEnvelope(envelope: AnyMessageEnvelope): Promise<Hex32>;
|
|
13
19
|
/**
|
|
14
20
|
* Body-hash binding (spec 309 §8.4): the envelope's `bodyHash` MUST equal the
|
|
15
21
|
* digest of the vault-resident body bytes. Recipients enforce this BEFORE
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/messaging/hash.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/messaging/hash.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI5D;4FAC4F;AAC5F,eAAO,MAAM,mBAAmB,yBAAmB,CAAC;AAEpD,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAO5E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CAGtF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAC7C,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
package/dist/messaging/hash.js
CHANGED
|
@@ -20,6 +20,12 @@ export async function sha256Hex32(input) {
|
|
|
20
20
|
* Hash of the canonical envelope EXCLUDING `signature` — this is the payload a
|
|
21
21
|
* sender signs and a recipient verifies (spec 309 §8.1). Deterministic across
|
|
22
22
|
* key order and undefined optional fields.
|
|
23
|
+
*
|
|
24
|
+
* Version-agnostic BY CONSTRUCTION, and that is the property the ap.message.v2 cutover rests on: it
|
|
25
|
+
* canonicalizes whatever fields the envelope has. A V1 envelope hashes today exactly as it hashed
|
|
26
|
+
* before V2 existed, so every historical signature and delivery receipt still verifies. `version` is
|
|
27
|
+
* itself inside the hashed body, so V1 and V2 of otherwise-identical content are domain-separated for
|
|
28
|
+
* free — no envelope can be replayed across versions.
|
|
23
29
|
*/
|
|
24
30
|
export async function hashMessageEnvelope(envelope) {
|
|
25
31
|
const { signature: _signature, ...unsigned } = envelope;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/messaging/hash.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,kEAAkE;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AAE9B;4FAC4F;AAC5F,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA0B;IAC1D,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAA+B,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,KAAK,GAAG,EAAW,CAAC;AAC7B,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/messaging/hash.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,kEAAkE;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AAE9B;4FAC4F;AAC5F,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA0B;IAC1D,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAA+B,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,KAAK,GAAG,EAAW,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAA4B;IACpE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC;IACxD,OAAO,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAA6C,EAC7C,SAAqB;IAErB,OAAO,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC;AAC9D,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CanonicalAgentId } from '@agenticprimitives/types';
|
|
2
|
-
import type { ConversationDescriptorV1, MessageEnvelopeV1 } from './types.js';
|
|
2
|
+
import type { ConversationDescriptorV1, MessageEnvelopeV1, MessageEnvelopeV2, MessageId, AnyMessageEnvelope } from './types.js';
|
|
3
3
|
/** Owner-controlled auto-reply assistant config for a PERSON's 1:1 inbox (spec 328 §2).
|
|
4
4
|
* One record in the person's vault; `enabled:false` is the disable tombstone (one record, no
|
|
5
5
|
* delete ceremony — absent and disabled are the same answer). Display name is captured AT
|
|
@@ -27,13 +27,16 @@ export declare const INBOX_ASSISTANT_FRESH_WINDOW_MS: number;
|
|
|
27
27
|
* - not addressed `to` the principal → false
|
|
28
28
|
* - createdAt stale (> fresh window) or before enabledAt → false (backfill floods can't fire)
|
|
29
29
|
* The seen-ledger dedup and the per-conversation rate bucket are the caller's (DO storage). */
|
|
30
|
-
export declare function inboxAssistantTrigger(assistant: PersonAssistantV1 | null | undefined, envelope: Pick<
|
|
30
|
+
export declare function inboxAssistantTrigger(assistant: PersonAssistantV1 | null | undefined, envelope: Pick<AnyMessageEnvelope, 'from' | 'to' | 'actor' | 'createdAt' | 'inReplyTo'> & Partial<Pick<MessageEnvelopeV1, 'kind'>> & Partial<Pick<MessageEnvelopeV2, 'performative'>>, principalAddr: string, nowMs?: number): boolean;
|
|
31
31
|
/** One fixed-window rate state (DO-storage resident at the execution point). */
|
|
32
32
|
export interface FixedWindowState {
|
|
33
33
|
windowStart: number;
|
|
34
34
|
count: number;
|
|
35
35
|
}
|
|
36
|
-
/** Pure fixed-window rate decision
|
|
36
|
+
/** Pure fixed-window rate decision — SAME ALGORITHM as `rate-control.fixedWindowAllow`, kept local
|
|
37
|
+
* because `fabric` may not import `rate-control` (not in its allowedImports; adding that edge is an
|
|
38
|
+
* architectural decision, not a cleanup). If you change the boundary condition here, change it
|
|
39
|
+
* there. (spec 328 §3; the same 6/10min semantics as spec 327's
|
|
37
40
|
* per-topic bucket, extracted so the bound is unit-testable without a DO). The caller persists
|
|
38
41
|
* `next` whether or not the dispatch is allowed (denied attempts still consume nothing — the
|
|
39
42
|
* count only advances on allow). */
|
|
@@ -46,7 +49,7 @@ export declare function fixedWindowAllow(prev: FixedWindowState | undefined, now
|
|
|
46
49
|
};
|
|
47
50
|
export type AssistantReplyResult = {
|
|
48
51
|
ok: true;
|
|
49
|
-
envelope:
|
|
52
|
+
envelope: MessageEnvelopeV2;
|
|
50
53
|
counterparty: CanonicalAgentId;
|
|
51
54
|
counterpartyAddr: string;
|
|
52
55
|
bodyBytes: Uint8Array;
|
|
@@ -63,6 +66,15 @@ export declare function buildAssistantInboxReply(conversations: ConversationDesc
|
|
|
63
66
|
principal: CanonicalAgentId;
|
|
64
67
|
conversationId: string;
|
|
65
68
|
bodyText: string;
|
|
69
|
+
/**
|
|
70
|
+
* The message being answered. REQUIRED, because this envelope is a RESPONSE and V2 has no other
|
|
71
|
+
* way to say so: `performativeForKind` is not injective, so `INFORM` alone cannot distinguish a
|
|
72
|
+
* reply from an original. spec 340 §R.4 makes `inReplyTo` the conformance requirement for exactly
|
|
73
|
+
* this, and `inboxAssistantTrigger`'s V2 branch reads it. Omitting it would emit an envelope that
|
|
74
|
+
* claims to be an original and, but for the `actor` marker being checked first, would be
|
|
75
|
+
* auto-answerable — the assistant answering its own replies.
|
|
76
|
+
*/
|
|
77
|
+
inReplyTo: MessageId;
|
|
66
78
|
now?: string;
|
|
67
79
|
}): Promise<AssistantReplyResult>;
|
|
68
80
|
//# sourceMappingURL=inbox-assistant.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-assistant.d.ts","sourceRoot":"","sources":["../../src/messaging/inbox-assistant.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox-assistant.d.ts","sourceRoot":"","sources":["../../src/messaging/inbox-assistant.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIhI;;;gGAGgG;AAChG,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB;0EACsE;IACtE,OAAO,EAAE,KAAK,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gGAAgG;AAChG,eAAO,MAAM,+BAA+B,QAAc,CAAC;AAE3D;;;;;;;;;;gGAUgG;AAChG,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC/C,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC,GACrF,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,EAC7F,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CA6BT;AAED,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;qCAMqC;AACrC,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAO9C;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAC;IAAC,YAAY,EAAE,gBAAgB,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,GAC1H;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC;;;;yFAIyF;AACzF,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,wBAAwB,EAAE,GAAG,SAAS,EACrD,IAAI,EAAE;IACJ,SAAS,EAAE,gBAAgB,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GACA,OAAO,CAAC,oBAAoB,CAAC,CAyC/B"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { generateMessageId, validateMessageEnvelope } from './envelope.js';
|
|
2
2
|
import { sha256Hex32 } from './hash.js';
|
|
3
3
|
import { messageBodyResource } from './vault-store.js';
|
|
4
|
+
import { isOriginalMessage } from '../communicative-act.js';
|
|
5
|
+
import { isEnvelopeV2 } from './types.js';
|
|
4
6
|
/** Backfill/replay guard: only envelopes created within this window of the scan may trigger. */
|
|
5
7
|
export const INBOX_ASSISTANT_FRESH_WINDOW_MS = 10 * 60_000;
|
|
6
8
|
/** Should a just-committed inbound envelope trigger the person's auto-reply assistant
|
|
@@ -19,8 +21,24 @@ export function inboxAssistantTrigger(assistant, envelope, principalAddr, nowMs)
|
|
|
19
21
|
return false;
|
|
20
22
|
if (envelope.actor)
|
|
21
23
|
return false;
|
|
22
|
-
|
|
24
|
+
// ONE RULE PER WIRE VERSION, not a translation (spec 340 W9). V1 keeps `kind === 'plain'` byte for
|
|
25
|
+
// byte: its behaviour must not shift under a version bump it is not part of.
|
|
26
|
+
//
|
|
27
|
+
// V2 cannot express that test. `performativeForKind` is not injective — `plain` and `response` BOTH
|
|
28
|
+
// map to INFORM — so a V2 envelope has no way to say "not a response". Translating the V1 rule as
|
|
29
|
+
// `performative === 'INFORM'` would have widened it, and the assistant would start answering
|
|
30
|
+
// replies, including its own. What `kind: 'response'` actually meant is "this has an antecedent",
|
|
31
|
+
// and `inReplyTo` says that directly. Hence the V2 CONFORMANCE REQUIREMENT: a V2 envelope that
|
|
32
|
+
// responds to another MUST carry `inReplyTo`; it is what makes it a response.
|
|
33
|
+
if (isEnvelopeV2(envelope)) {
|
|
34
|
+
if (envelope.performative !== 'INFORM')
|
|
35
|
+
return false;
|
|
36
|
+
if (!isOriginalMessage(envelope))
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
else if (envelope.kind !== 'plain') {
|
|
23
40
|
return false;
|
|
41
|
+
}
|
|
24
42
|
const me = principalAddr.toLowerCase();
|
|
25
43
|
const addrOf = (caip) => (caip.match(/0x[0-9a-fA-F]{40}$/)?.[0] ?? '').toLowerCase();
|
|
26
44
|
if (addrOf(String(envelope.from)) === me)
|
|
@@ -38,7 +56,10 @@ export function inboxAssistantTrigger(assistant, envelope, principalAddr, nowMs)
|
|
|
38
56
|
return false;
|
|
39
57
|
return true;
|
|
40
58
|
}
|
|
41
|
-
/** Pure fixed-window rate decision
|
|
59
|
+
/** Pure fixed-window rate decision — SAME ALGORITHM as `rate-control.fixedWindowAllow`, kept local
|
|
60
|
+
* because `fabric` may not import `rate-control` (not in its allowedImports; adding that edge is an
|
|
61
|
+
* architectural decision, not a cleanup). If you change the boundary condition here, change it
|
|
62
|
+
* there. (spec 328 §3; the same 6/10min semantics as spec 327's
|
|
42
63
|
* per-topic bucket, extracted so the bound is unit-testable without a DO). The caller persists
|
|
43
64
|
* `next` whether or not the dispatch is allowed (denied attempts still consume nothing — the
|
|
44
65
|
* count only advances on allow). */
|
|
@@ -77,10 +98,10 @@ export async function buildAssistantInboxReply(conversations, opts) {
|
|
|
77
98
|
const messageId = generateMessageId();
|
|
78
99
|
const bodyBytes = new TextEncoder().encode(bodyText);
|
|
79
100
|
const envelope = {
|
|
80
|
-
version: 'ap.message.
|
|
101
|
+
version: 'ap.message.v2',
|
|
81
102
|
id: messageId,
|
|
82
103
|
conversationId: descriptor.id,
|
|
83
|
-
|
|
104
|
+
performative: 'INFORM',
|
|
84
105
|
from: opts.principal,
|
|
85
106
|
to: [counterparty],
|
|
86
107
|
...(descriptor.title ? { subject: descriptor.title } : {}),
|
|
@@ -89,6 +110,8 @@ export async function buildAssistantInboxReply(conversations, opts) {
|
|
|
89
110
|
body: { resource: messageBodyResource(messageId), classification: 'internal', updatedAt: now },
|
|
90
111
|
bodyHash: await sha256Hex32(bodyBytes),
|
|
91
112
|
bodyContentType: 'text/plain',
|
|
113
|
+
// The causal edge — what makes this a response under V2 (spec 340 §R.4).
|
|
114
|
+
inReplyTo: opts.inReplyTo,
|
|
92
115
|
...(descriptor.contextRefs ? { contextRefs: descriptor.contextRefs } : {}),
|
|
93
116
|
// spec 324 §9 — machine-readable agent-authored provenance; also the loop-prevention marker
|
|
94
117
|
// the counterparty's own assistant skips on (spec 328 §7).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-assistant.js","sourceRoot":"","sources":["../../src/messaging/inbox-assistant.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox-assistant.js","sourceRoot":"","sources":["../../src/messaging/inbox-assistant.ts"],"names":[],"mappings":"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"}
|