@agenticprimitives/intent-engagement 0.0.0-alpha.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Agentic Trust Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @agenticprimitives/intent-engagement
2
+
3
+ The layer between *candidate found* and *authorized provider is working* (spec 336): a **probe** carrying a minimized
4
+ projection of an intent, the provider's **response** (offer · decline · needs-clarification · referral ·
5
+ temporarily-unavailable · human-ux-required — business facts, never errors), a **firm offer** signed over RFC 8785
6
+ canonical bytes, an **acceptance** that pins the offer's digest and can broaden nothing, the **mandate requirement** the
7
+ work will need (RFC 9396 shape — a description, never authority), the **execute** command, and the **receipt** that binds
8
+ intent, offer, mandate, executing agent and outcome by digest.
9
+
10
+ Pure. No transport, no keys, no LLM. Two deterministic reducers (`decide` → events, `evolve` → state) for the engagement
11
+ and offer state machines; models may suggest facts, they never transition state. Signing goes through the caller's signer.
@@ -0,0 +1,50 @@
1
+ import type { Hex } from 'viem';
2
+ import type { Address, EngagementCampaignV1, EngagementSituationV1, IsoTime, OfferSelectionV1 } from './documents.js';
3
+ import type { CandidateV1 } from './ports.js';
4
+ /** Every probe is a disclosure to one more party: the budget bounds how many are asked, how many offers
5
+ * are wanted before the campaign stops asking, and when it stops waiting. */
6
+ export interface CampaignBudgetV1 {
7
+ maxCandidates: number;
8
+ offersWanted: number;
9
+ deadline: IsoTime;
10
+ }
11
+ export declare function openCampaign(input: {
12
+ campaignId: string;
13
+ intentId: string;
14
+ intentVersion?: number;
15
+ intentDigest: Hex;
16
+ requester: Address;
17
+ budget: CampaignBudgetV1;
18
+ candidates: ReadonlyArray<Address>;
19
+ }): EngagementCampaignV1;
20
+ /** One candidate's standing in the evaluation: an eligible firm offer, or why it is not one. */
21
+ export interface OfferEvaluationV1 {
22
+ provider: Address;
23
+ engagementId: string;
24
+ offerId?: string;
25
+ offerDigest?: Hex;
26
+ eligible: boolean;
27
+ because: string;
28
+ }
29
+ /**
30
+ * THE SELECTION. Among eligible firm offers, ordered rules — each applied only when it separates the field,
31
+ * each named in `because` when it does:
32
+ * 1. declares the capability in the PUBLIC tier (the resolver's evidence, spec 281) — over one that does not;
33
+ * 2. holds a RELATIONSHIP with the requester (as the candidate row asserts) — over a stranger;
34
+ * 3. the earliest firm offer received;
35
+ * 4. the order the campaign asked in.
36
+ * No rule is a weight, and no two are summed: a stranger's offer is never "0.7 of" a member's.
37
+ */
38
+ export declare function selectOffer(input: {
39
+ campaign: EngagementCampaignV1;
40
+ situations: ReadonlyArray<EngagementSituationV1>;
41
+ candidates: ReadonlyArray<CandidateV1>;
42
+ capability: string;
43
+ now: IsoTime;
44
+ }): {
45
+ campaign: EngagementCampaignV1;
46
+ situations: EngagementSituationV1[];
47
+ selection: OfferSelectionV1 | null;
48
+ evaluations: OfferEvaluationV1[];
49
+ };
50
+ //# sourceMappingURL=campaign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign.d.ts","sourceRoot":"","sources":["../src/campaign.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAsB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE1I,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C;8EAC8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IACpG,MAAM,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC9D,GAAG,oBAAoB,CAevB;AAED,gGAAgG;AAChG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,QAAQ,EAAE,oBAAoB,CAAC;IAAC,UAAU,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAAC,UAAU,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;CAC5J,GAAG;IAAE,QAAQ,EAAE,oBAAoB,CAAC;IAAC,UAAU,EAAE,qBAAqB,EAAE,CAAC;IAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAmDhJ"}
@@ -0,0 +1,125 @@
1
+ import { offerDigest } from './digests.js';
2
+ import { stepEngagement } from './reducer.js';
3
+ export function openCampaign(input) {
4
+ const seen = new Set();
5
+ const candidates = [];
6
+ for (const c of input.candidates) {
7
+ const k = c.toLowerCase();
8
+ if (seen.has(k) || k === input.requester.toLowerCase())
9
+ continue; // never probe yourself; never twice
10
+ seen.add(k);
11
+ candidates.push(c);
12
+ if (candidates.length >= input.budget.maxCandidates)
13
+ break; // THE DISCLOSURE BUDGET
14
+ }
15
+ return {
16
+ type: 'ap.engagement-campaign.v1', campaignId: input.campaignId, intentId: input.intentId, intentVersion: input.intentVersion ?? 1,
17
+ intentDigest: input.intentDigest, requester: input.requester, maxCandidates: input.budget.maxCandidates, offersWanted: input.budget.offersWanted,
18
+ deadline: input.budget.deadline, candidates, engagements: [], state: 'open',
19
+ };
20
+ }
21
+ const lc = (s) => s.toLowerCase();
22
+ /** The issued, unexpired offer in a situation that names the capability and binds this campaign's intent. */
23
+ function eligibleOffer(s, capability, intentDigest, now) {
24
+ const issued = Object.values(s.offers).filter((o) => o.state === 'issued').map((o) => o.offer);
25
+ if (!issued.length) {
26
+ const kind = s.lastResponseKind;
27
+ const last = s.responses[s.responses.length - 1]?.content;
28
+ if (!kind || !last)
29
+ return { because: s.state === 'expired' ? 'no answer before the deadline' : `no offer (${s.state})` };
30
+ switch (last.kind) {
31
+ case 'decline': return { because: `declined: ${last.reason}${last.detail ? ` — ${last.detail}` : ''}` };
32
+ case 'needs-clarification': return { because: 'asked a question; this campaign takes only firm offers' };
33
+ case 'referral': return { because: `referred to ${last.to}; a referral is recorded, never followed` };
34
+ case 'temporarily-unavailable': return { because: `unavailable until ${last.until}` };
35
+ case 'human-ux-required': return { because: 'a human channel is required — a person\'s agent does not commit its person from a server' };
36
+ case 'offer': return { because: last.offer.type !== 'ap.fulfillment-offer.v1' ? 'an indicative proposal, not a firm offer' : `its offer is ${Object.values(s.offers)[0]?.state ?? 'not open'}` };
37
+ }
38
+ }
39
+ // Newest revision first, so a superseding offer is the one judged.
40
+ const offer = [...issued].sort((a, b) => b.revision - a.revision)[0];
41
+ if (Date.parse(offer.expiresAt) <= Date.parse(now))
42
+ return { because: `its offer expired at ${offer.expiresAt}` };
43
+ if (!offer.requirement.actions.includes(capability))
44
+ return { because: `its offer does not name ${capability}` };
45
+ if (lc(offer.intentDigest) !== lc(intentDigest) || lc(offer.requirement.intentDigest) !== lc(intentDigest))
46
+ return { because: 'its offer binds another intent' };
47
+ if (!offer.signature || offer.signature === '0x')
48
+ return { because: 'its offer is unsigned' };
49
+ return { offer, digest: offerDigest(offer) };
50
+ }
51
+ /**
52
+ * THE SELECTION. Among eligible firm offers, ordered rules — each applied only when it separates the field,
53
+ * each named in `because` when it does:
54
+ * 1. declares the capability in the PUBLIC tier (the resolver's evidence, spec 281) — over one that does not;
55
+ * 2. holds a RELATIONSHIP with the requester (as the candidate row asserts) — over a stranger;
56
+ * 3. the earliest firm offer received;
57
+ * 4. the order the campaign asked in.
58
+ * No rule is a weight, and no two are summed: a stranger's offer is never "0.7 of" a member's.
59
+ */
60
+ export function selectOffer(input) {
61
+ const { campaign, capability, now } = input;
62
+ const order = new Map(campaign.candidates.map((c, i) => [lc(c), i]));
63
+ const candidateOf = (a) => input.candidates.find((c) => lc(c.agent) === lc(a));
64
+ const evaluations = [];
65
+ const eligible = [];
66
+ for (const s of [...input.situations].sort((a, b) => (order.get(lc(a.candidate)) ?? 99) - (order.get(lc(b.candidate)) ?? 99))) {
67
+ const e = eligibleOffer(s, capability, campaign.intentDigest, now);
68
+ if ('because' in e) {
69
+ evaluations.push({ provider: s.candidate, engagementId: s.engagementId, eligible: false, because: e.because });
70
+ continue;
71
+ }
72
+ eligible.push({ s, offer: e.offer, digest: e.digest });
73
+ evaluations.push({ provider: s.candidate, engagementId: s.engagementId, offerId: e.offer.offerId, offerDigest: e.digest, eligible: true, because: 'a firm offer, signed, unexpired, naming the capability and this intent' });
74
+ }
75
+ if (!eligible.length)
76
+ return { campaign: { ...campaign, state: campaign.state }, situations: [...input.situations], selection: null, evaluations };
77
+ let field = eligible;
78
+ const because = [];
79
+ const declares = (a) => !!candidateOf(a)?.capabilityEvidence.some((ev) => ev.capability === capability);
80
+ const related = (a) => !!candidateOf(a)?.relationship;
81
+ const narrow = (keep, why) => {
82
+ const kept = field.filter(keep);
83
+ if (kept.length && kept.length < field.length) {
84
+ because.push(why(kept, field.filter((x) => !keep(x))));
85
+ field = kept;
86
+ }
87
+ };
88
+ narrow((x) => declares(x.s.candidate), (_k, d) => `declares ${capability} in the public tier; ${d.map((x) => x.s.candidate).join(', ')} ${d.length === 1 ? 'does' : 'do'} not`);
89
+ narrow((x) => related(x.s.candidate), (k, _d) => `holds a relationship with the requester (${candidateOf(k[0].s.candidate)?.relationship?.kind})`);
90
+ if (field.length > 1) {
91
+ const earliest = [...field].sort((a, b) => Date.parse(a.offer.issuedAt) - Date.parse(b.offer.issuedAt))[0];
92
+ const ties = field.filter((x) => x.offer.issuedAt === earliest.offer.issuedAt);
93
+ if (ties.length < field.length) {
94
+ because.push(`the earliest firm offer (${earliest.offer.issuedAt})`);
95
+ field = ties;
96
+ }
97
+ if (field.length > 1) {
98
+ because.push('asked first — nothing else distinguishes the offers');
99
+ field = [field[0]];
100
+ }
101
+ }
102
+ if (!because.length)
103
+ because.push('the only firm offer received');
104
+ const winner = field[0];
105
+ const decidedAt = now;
106
+ const selection = {
107
+ type: 'ap.offer-selection.v1', campaignId: campaign.campaignId,
108
+ selected: { offerId: winner.offer.offerId, offerDigest: winner.digest, provider: winner.offer.provider },
109
+ because,
110
+ notSelected: evaluations.filter((e) => lc(e.provider) !== lc(winner.offer.provider)).map((e) => ({ offerId: e.offerId ?? '', provider: e.provider, because: e.eligible ? `a firm offer, not selected: ${winner.offer.provider} was preferred (${because[0]})` : e.because })),
111
+ decidedAt,
112
+ };
113
+ // The reducer moves state, nothing else: the winner is SELECTED, every other open conversation is CLOSED not-selected.
114
+ const situations = input.situations.map((s) => {
115
+ if (s.engagementId === winner.s.engagementId) {
116
+ const r = stepEngagement(s, { kind: 'SelectOffer', offerId: winner.offer.offerId, offerDigest: winner.digest, because, idempotencyKey: `${campaign.campaignId}:select:${winner.offer.offerId}`, now });
117
+ return r.ok ? r.state : s;
118
+ }
119
+ const why = selection.notSelected.find((n) => lc(n.provider) === lc(s.candidate))?.because ?? 'not selected';
120
+ const r = stepEngagement(s, { kind: 'NotSelected', because: why, idempotencyKey: `${campaign.campaignId}:not-selected:${s.engagementId}`, now });
121
+ return r.ok ? r.state : s;
122
+ });
123
+ return { campaign: { ...campaign, selection, state: 'selected' }, situations, selection, evaluations };
124
+ }
125
+ //# sourceMappingURL=campaign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign.js","sourceRoot":"","sources":["../src/campaign.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type Hex } from 'viem';
2
+ import type { EngagementProbeV1, FulfillmentOfferV1, FulfillmentReceiptV1, IntentProjectionV1, OfferAcceptanceV1 } from './documents.js';
3
+ export declare const digestOf: (doc: unknown) => Hex;
4
+ /** The projection as it goes on the wire — the local `withholds` manifest stripped (naming omitted
5
+ * categories on the wire can itself leak, §3.1). */
6
+ export declare function wireProjection(p: IntentProjectionV1): Omit<IntentProjectionV1, 'withholds'>;
7
+ export declare const projectionDigest: (p: IntentProjectionV1) => Hex;
8
+ export declare const probeDigest: (p: EngagementProbeV1) => Hex;
9
+ /** The offer WITHOUT its signature — what the provider signs and what an acceptance pins. */
10
+ export declare const offerDigest: (o: FulfillmentOfferV1) => Hex;
11
+ export declare const acceptanceDigest: (a: OfferAcceptanceV1) => Hex;
12
+ export declare const receiptDigest: (r: FulfillmentReceiptV1) => Hex;
13
+ //# sourceMappingURL=digests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digests.d.ts","sourceRoot":"","sources":["../src/digests.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEzI,eAAO,MAAM,QAAQ,QAAS,OAAO,KAAG,GAAqD,CAAC;AAE9F;qDACqD;AACrD,wBAAgB,cAAc,CAAC,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAG3F;AAED,eAAO,MAAM,gBAAgB,MAAO,kBAAkB,KAAG,GAAkC,CAAC;AAC5F,eAAO,MAAM,WAAW,MAAO,iBAAiB,KAAG,GAAkB,CAAC;AACtE,6FAA6F;AAC7F,eAAO,MAAM,WAAW,MAAO,kBAAkB,KAAG,GAA+E,CAAC;AACpI,eAAO,MAAM,gBAAgB,MAAO,iBAAiB,KAAG,GAA+E,CAAC;AACxI,eAAO,MAAM,aAAa,MAAO,oBAAoB,KAAG,GAA+E,CAAC"}
@@ -0,0 +1,19 @@
1
+ // DIGESTS — RFC 8785 JCS canonical bytes → keccak256, the ONE way a document is bound (the same
2
+ // canonicaliser `delegation.intentDigest` uses, so a requirement's `intentDigest` and a probe's agree byte
3
+ // for byte). Signing itself goes through the caller's signer; nothing here holds a key.
4
+ import { keccak256, stringToBytes } from 'viem';
5
+ import { jcsCanonicalize } from '@agenticprimitives/types';
6
+ export const digestOf = (doc) => keccak256(stringToBytes(jcsCanonicalize(doc)));
7
+ /** The projection as it goes on the wire — the local `withholds` manifest stripped (naming omitted
8
+ * categories on the wire can itself leak, §3.1). */
9
+ export function wireProjection(p) {
10
+ const { withholds: _w, ...wire } = p;
11
+ return wire;
12
+ }
13
+ export const projectionDigest = (p) => digestOf(wireProjection(p));
14
+ export const probeDigest = (p) => digestOf(p);
15
+ /** The offer WITHOUT its signature — what the provider signs and what an acceptance pins. */
16
+ export const offerDigest = (o) => { const { signature: _s, ...unsigned } = o; return digestOf(unsigned); };
17
+ export const acceptanceDigest = (a) => { const { signature: _s, ...unsigned } = a; return digestOf(unsigned); };
18
+ export const receiptDigest = (r) => { const { signature: _s, ...unsigned } = r; return digestOf(unsigned); };
19
+ //# sourceMappingURL=digests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digests.js","sourceRoot":"","sources":["../src/digests.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,2GAA2G;AAC3G,wFAAwF;AACxF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAY,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAO,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE9F;qDACqD;AACrD,MAAM,UAAU,cAAc,CAAC,CAAqB;IAClD,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAqB,EAAO,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAoB,EAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtE,6FAA6F;AAC7F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAqB,EAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpI,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAoB,EAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACxI,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAuB,EAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,282 @@
1
+ import type { Hex } from 'viem';
2
+ export type Address = `0x${string}`;
3
+ export type IsoTime = string;
4
+ export type ProjectionKind = 'discovery' | 'engagement' | 'execution';
5
+ /** A purpose- and audience-bound view of an intent. Derived, never edited independently. The `fields` are
6
+ * what was released; what was withheld is a LOCAL manifest (`withholds`, never on the wire). */
7
+ export interface IntentProjectionV1 {
8
+ type: 'ap.intent-projection.v1';
9
+ kind: ProjectionKind;
10
+ intentId: string;
11
+ intentVersion: number;
12
+ /** keccak(JCS) of the canonical intent this projects — the requester's, never re-derived by a provider. */
13
+ intentDigest: Hex;
14
+ /** `broadcast` for discovery; ONE candidate for engagement; the selected provider for execution. */
15
+ audience: 'broadcast' | Address;
16
+ purpose: string;
17
+ fields: Record<string, unknown>;
18
+ /** Local only. Stripped by `wireProjection` before a probe is built. */
19
+ withholds?: string[];
20
+ }
21
+ export type EngagementObjective = 'availability-check' | 'accept-or-decline' | 'indicative-proposal' | 'firm-offer' | 'negotiation';
22
+ export type ClarificationMode = 'not-allowed' | 'structured-only' | 'conversational';
23
+ export type HumanChannel = 'json-schema-form' | 'a2ui' | 'external-url';
24
+ export type ProbeProcessingModel = 'direct-message' | 'evaluation-task' | 'reciprocal-a2a';
25
+ export interface InteractionPolicyV1 {
26
+ clarification: ClarificationMode;
27
+ humanChannels: HumanChannel[];
28
+ maxRounds: number;
29
+ }
30
+ export interface EngagementProbeV1 {
31
+ type: 'ap.engagement-probe.v1';
32
+ probeId: string;
33
+ engagementId: string;
34
+ campaignId: string;
35
+ requester: Address;
36
+ candidate: Address;
37
+ /** The engagement projection the candidate reviews — audience = candidate, `withholds` stripped. */
38
+ projection: Omit<IntentProjectionV1, 'withholds'>;
39
+ projectionDigest: Hex;
40
+ intentDigest: Hex;
41
+ objective: EngagementObjective;
42
+ interaction: InteractionPolicyV1;
43
+ processing: ProbeProcessingModel;
44
+ replyBy: IsoTime;
45
+ /** Single-use. A response must echo it; a second response with the same nonce is a duplicate. */
46
+ probeNonce: string;
47
+ issuedAt: IsoTime;
48
+ }
49
+ export interface EngagementAcknowledgementV1 {
50
+ type: 'ap.engagement-ack.v1';
51
+ probeId: string;
52
+ engagementId: string;
53
+ provider: Address;
54
+ processing: ProbeProcessingModel;
55
+ responseExpectedBy: IsoTime;
56
+ issuedAt: IsoTime;
57
+ }
58
+ export type EngagementResponseKind = 'offer' | 'needs-clarification' | 'human-ux-required' | 'referral' | 'decline' | 'temporarily-unavailable';
59
+ /** §3.5a — the kinds are two axes: what the act DOES, and what an INFORM's content is about. */
60
+ export declare const RESPONSE_KIND_AXES: Readonly<Record<EngagementResponseKind, {
61
+ performative: 'PROPOSE' | 'REJECT' | 'QUERY' | 'INFORM';
62
+ content?: 'other-provider' | 'time' | 'how-the-answer-arrives';
63
+ }>>;
64
+ /** A named claim the provider needs, answered by the vault with a value, a predicate, a credential — or a refusal. */
65
+ export interface QuestionV1 {
66
+ name: string;
67
+ schema: Record<string, unknown>;
68
+ purpose: string;
69
+ sensitivity: 'public' | 'internal' | 'personal';
70
+ }
71
+ export interface QuestionSetV1 {
72
+ type: 'ap.question-set.v1';
73
+ questions: QuestionV1[];
74
+ }
75
+ /** An opaque single-use handle to a provider UX. Carries NO content; consent to open is not approval. */
76
+ export interface HumanInteractionRequestV1 {
77
+ type: 'ap.human-interaction.v1';
78
+ channel: HumanChannel;
79
+ handle: string;
80
+ expiresAt: IsoTime;
81
+ }
82
+ export type EngagementResponseContentV1 = {
83
+ kind: 'offer';
84
+ offer: FulfillmentOfferV1 | IndicativeFulfillmentProposalV1;
85
+ } | {
86
+ kind: 'decline';
87
+ reason: string;
88
+ detail?: string;
89
+ } | {
90
+ kind: 'needs-clarification';
91
+ questions: QuestionSetV1;
92
+ } | {
93
+ kind: 'referral';
94
+ to: Address;
95
+ because?: string;
96
+ } | {
97
+ kind: 'temporarily-unavailable';
98
+ until?: IsoTime;
99
+ because?: string;
100
+ } | {
101
+ kind: 'human-ux-required';
102
+ request: HumanInteractionRequestV1;
103
+ };
104
+ export interface EngagementResponseV1 {
105
+ type: 'ap.engagement-response.v1';
106
+ responseId: string;
107
+ inReplyTo: string;
108
+ engagementId: string;
109
+ provider: Address;
110
+ probeNonce: string;
111
+ content: EngagementResponseContentV1;
112
+ issuedAt: IsoTime;
113
+ /** Duplicates never duplicate transitions: two responses with one key are one response. */
114
+ idempotencyKey: string;
115
+ }
116
+ /** RFC 9396 shape — WHAT the work will need. A description; publishable; grants nothing. Structurally the
117
+ * `delegation` package's `MandateRequirementV1`, mirrored so this package stays a leaf. */
118
+ export interface MandateRequirementV1 {
119
+ type: string;
120
+ actions: string[];
121
+ locations?: string[];
122
+ limits?: Record<string, string | number>;
123
+ intentDigest: Hex;
124
+ projectionDigest?: Hex;
125
+ offerDigest?: Hex;
126
+ validAfter?: number;
127
+ validUntil: number;
128
+ methods?: Hex[];
129
+ }
130
+ export interface OfferTermsV1 {
131
+ scopeAccepted: string;
132
+ assumptions?: string[];
133
+ exclusions?: string[];
134
+ /** The fields the projection withheld that the offer names as needed — what a mandate may authorize disclosing. */
135
+ requiredInputs?: string[];
136
+ expectedArtifacts?: string[];
137
+ price?: {
138
+ amount: string;
139
+ currency: string;
140
+ };
141
+ jurisdiction?: string;
142
+ dataHandling?: string;
143
+ }
144
+ /** NON-binding. Its own class so an estimate and an acceptance-capable instrument are never confusable. */
145
+ export interface IndicativeFulfillmentProposalV1 {
146
+ type: 'ap.indicative-proposal.v1';
147
+ proposalId: string;
148
+ engagementId: string;
149
+ provider: Address;
150
+ basisOfOffer: Hex;
151
+ intentDigest: Hex;
152
+ terms: OfferTermsV1;
153
+ issuedAt: IsoTime;
154
+ }
155
+ /** The provider's SIGNED, expiring, conditional commitment to fulfil ONE intent on stated terms. Immutable:
156
+ * a change is a new revision that supersedes this one. */
157
+ export interface FulfillmentOfferV1 {
158
+ type: 'ap.fulfillment-offer.v1';
159
+ offerId: string;
160
+ revision: number;
161
+ supersedes?: string;
162
+ engagementId: string;
163
+ provider: Address;
164
+ requester: Address;
165
+ basisOfOffer: Hex;
166
+ intentDigest: Hex;
167
+ terms: OfferTermsV1;
168
+ requirement: MandateRequirementV1;
169
+ expiresAt: IsoTime;
170
+ issuedAt: IsoTime;
171
+ /** The provider SA's signature over `offerDigest(offer)` — ERC-1271 / ECDSA, verified by the caller's checks. */
172
+ signature: Hex;
173
+ }
174
+ /** Pins the accepted offer's digest. Cannot broaden or modify terms — a differing acceptance is a counter-proposal
175
+ * and belongs in a new offer revision. */
176
+ export interface OfferAcceptanceV1 {
177
+ type: 'ap.offer-acceptance.v1';
178
+ acceptanceId: string;
179
+ engagementId: string;
180
+ offerId: string;
181
+ offerDigest: Hex;
182
+ requester: Address;
183
+ acceptedAt: IsoTime;
184
+ signature: Hex;
185
+ }
186
+ /** The campaign's PRIVATE comparison decision, with reasons and the losing offers — reviewable, never a score. */
187
+ export interface OfferSelectionV1 {
188
+ type: 'ap.offer-selection.v1';
189
+ campaignId: string;
190
+ selected: {
191
+ offerId: string;
192
+ offerDigest: Hex;
193
+ provider: Address;
194
+ };
195
+ because: string[];
196
+ notSelected: Array<{
197
+ offerId: string;
198
+ provider: Address;
199
+ because: string;
200
+ }>;
201
+ decidedAt: IsoTime;
202
+ }
203
+ /** The explicit typed command that creates a fulfillment task — never a re-send of the intent. */
204
+ export interface ExecuteAcceptedOfferV1 {
205
+ type: 'ap.execute-accepted-offer.v1';
206
+ engagementId: string;
207
+ offerId: string;
208
+ offerDigest: Hex;
209
+ acceptanceId: string;
210
+ acceptanceDigest: Hex;
211
+ /** The mandate presented — by reference (its delegation hash). The wire travels beside this command. */
212
+ mandateRef: Hex;
213
+ idempotencyKey: string;
214
+ issuedAt: IsoTime;
215
+ }
216
+ export interface FulfillmentReceiptV1 {
217
+ type: 'ap.fulfillment-receipt.v1';
218
+ receiptId: string;
219
+ engagementId: string;
220
+ intentDigest: Hex;
221
+ offerDigest: Hex;
222
+ mandateRef: Hex;
223
+ taskRef?: string;
224
+ executingAgent: Address;
225
+ action: string;
226
+ outcome: 'completed' | 'failed' | 'declined';
227
+ evidenceRefs: string[];
228
+ issuedAt: IsoTime;
229
+ signature: Hex;
230
+ }
231
+ export interface RemoteA2AContextV1 {
232
+ provider: Address;
233
+ contextId: string;
234
+ taskId?: string;
235
+ }
236
+ export type EngagementState = 'new' | 'probe-sent' | 'waiting-on-provider' | 'waiting-on-requester' | 'offer-open' | 'offer-selected' | 'awaiting-mandate' | 'fulfillment-linked' | 'closed-declined' | 'closed-referred' | 'closed-unavailable' | 'closed-not-selected' | 'expired' | 'cancelled';
237
+ export type OfferState = 'draft' | 'issued' | 'accepted' | 'rejected' | 'withdrawn' | 'superseded' | 'expired';
238
+ /** ONE requester–candidate conversation. */
239
+ export interface EngagementSituationV1 {
240
+ type: 'ap.engagement-situation.v1';
241
+ engagementId: string;
242
+ campaignId: string;
243
+ requester: Address;
244
+ candidate: Address;
245
+ state: EngagementState;
246
+ /** The last response KIND — an event, not a durable state (§4). */
247
+ lastResponseKind?: EngagementResponseKind;
248
+ probes: EngagementProbeV1[];
249
+ responses: EngagementResponseV1[];
250
+ offers: Record<string, {
251
+ offer: FulfillmentOfferV1;
252
+ state: OfferState;
253
+ }>;
254
+ acceptance?: OfferAcceptanceV1;
255
+ mandateRef?: Hex;
256
+ taskRef?: string;
257
+ transport?: RemoteA2AContextV1;
258
+ closeReason?: string;
259
+ /** Every idempotency key seen, so a duplicate is recognised as one. */
260
+ seen: string[];
261
+ updatedAt: IsoTime;
262
+ }
263
+ /** ONE intent, MANY candidates. */
264
+ export interface EngagementCampaignV1 {
265
+ type: 'ap.engagement-campaign.v1';
266
+ campaignId: string;
267
+ intentId: string;
268
+ intentVersion: number;
269
+ intentDigest: Hex;
270
+ requester: Address;
271
+ /** Every probe is a disclosure to one more party. */
272
+ maxCandidates: number;
273
+ offersWanted: number;
274
+ deadline: IsoTime;
275
+ candidates: Address[];
276
+ engagements: string[];
277
+ selection?: OfferSelectionV1;
278
+ state: 'open' | 'selected' | 'closed';
279
+ }
280
+ /** Conformance profiles a provider advertises per capability, in its card (§8.5). */
281
+ export type ConformanceProfile = 'IEP Core' | 'IEP Evaluation Task' | 'IEP Clarification' | 'IEP Human Interaction' | 'IEP Negotiation' | 'IEP Signed Offer' | 'IEP Mandated Execution';
282
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** §3.5a — the kinds are two axes: what the act DOES, and what an INFORM's content is about. */
2
+ export const RESPONSE_KIND_AXES = {
3
+ 'offer': { performative: 'PROPOSE' },
4
+ 'decline': { performative: 'REJECT' },
5
+ 'needs-clarification': { performative: 'QUERY' },
6
+ 'referral': { performative: 'INFORM', content: 'other-provider' },
7
+ 'temporarily-unavailable': { performative: 'INFORM', content: 'time' },
8
+ 'human-ux-required': { performative: 'INFORM', content: 'how-the-answer-arrives' },
9
+ };
10
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"AA2EA,gGAAgG;AAChG,MAAM,CAAC,MAAM,kBAAkB,GAA0K;IACvM,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;IACpC,SAAS,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE;IACrC,qBAAqB,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE;IAChD,UAAU,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE;IACjE,yBAAyB,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;IACtE,mBAAmB,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,EAAE;CACnF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Address, FulfillmentReceiptV1 } from './documents.js';
2
+ import type { Hex } from 'viem';
3
+ export declare function fulfillmentReceipt(input: {
4
+ receiptId: string;
5
+ engagementId: string;
6
+ intentDigest: Hex;
7
+ offerDigest: Hex;
8
+ mandateRef: Hex;
9
+ executingAgent: Address;
10
+ action: string;
11
+ outcome?: FulfillmentReceiptV1['outcome'];
12
+ evidenceRefs: string[];
13
+ taskRef?: string;
14
+ issuedAt: string;
15
+ sign: (digest: Hex) => Hex;
16
+ }): FulfillmentReceiptV1;
17
+ //# sourceMappingURL=fulfillment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fulfillment.d.ts","sourceRoot":"","sources":["../src/fulfillment.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGhC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC;IAAC,WAAW,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAC9F,cAAc,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAC3G,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC;CAChE,GAAG,oBAAoB,CASvB"}
@@ -0,0 +1,12 @@
1
+ import { receiptDigest } from './digests.js';
2
+ export function fulfillmentReceipt(input) {
3
+ const unsigned = {
4
+ type: 'ap.fulfillment-receipt.v1', receiptId: input.receiptId, engagementId: input.engagementId,
5
+ intentDigest: input.intentDigest, offerDigest: input.offerDigest, mandateRef: input.mandateRef,
6
+ ...(input.taskRef ? { taskRef: input.taskRef } : {}), executingAgent: input.executingAgent, action: input.action,
7
+ outcome: input.outcome ?? 'completed', evidenceRefs: input.evidenceRefs, issuedAt: input.issuedAt,
8
+ };
9
+ const digest = receiptDigest({ ...unsigned, signature: '0x' });
10
+ return { ...unsigned, signature: input.sign(digest) };
11
+ }
12
+ //# sourceMappingURL=fulfillment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fulfillment.js","sourceRoot":"","sources":["../src/fulfillment.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,KAIlC;IACC,MAAM,QAAQ,GAA4C;QACxD,IAAI,EAAE,2BAA2B,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY;QAC/F,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU;QAC9F,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;QAChH,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAClG,CAAC;IACF,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,EAA0B,CAAC,CAAC;IACvF,OAAO,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACxD,CAAC"}