@absolutejs/agent 0.22.3 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commerce.d.ts +77 -0
- package/dist/commerce.js +241 -0
- package/dist/commerce.js.map +10 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +3 -3
- package/dist/manifest.js +5 -3
- package/dist/manifest.js.map +3 -3
- package/dist/manifest.json +4 -2
- package/package.json +8 -3
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { type EffectAdapterCredentialInstallation, type EffectAdapterExecutionEnvelope, type EffectAdapterInstallationRegistry, type EffectStore, type ExecutionSqlClient } from "@absolutejs/execution";
|
|
2
|
+
import type { AgentSpendRequest, SpendRequestResult, SpendMandate } from "@absolutejs/wallet";
|
|
3
|
+
export type AgentPurchaseIntentStatus = "drafted" | "pending_approval" | "mandate_ready" | "installation_ready" | "enqueued" | "cancelled";
|
|
4
|
+
export type AgentPurchaseIntentInput<Payload = unknown> = {
|
|
5
|
+
actionId: string;
|
|
6
|
+
adapterId: string;
|
|
7
|
+
agentId: string;
|
|
8
|
+
allowanceId: string;
|
|
9
|
+
amountMinor: number;
|
|
10
|
+
category?: string;
|
|
11
|
+
credentials?: ReadonlyArray<EffectAdapterCredentialInstallation>;
|
|
12
|
+
currency: string;
|
|
13
|
+
destination?: string;
|
|
14
|
+
effect: string;
|
|
15
|
+
expiresAt: string;
|
|
16
|
+
handler: string;
|
|
17
|
+
idempotencyKey: string;
|
|
18
|
+
installationId: string;
|
|
19
|
+
merchantId: string;
|
|
20
|
+
ownerId: string;
|
|
21
|
+
payload: Payload;
|
|
22
|
+
purchaseId: string;
|
|
23
|
+
refundable?: boolean;
|
|
24
|
+
tenantId: string;
|
|
25
|
+
};
|
|
26
|
+
export type AgentPurchaseIntent<Payload = unknown> = {
|
|
27
|
+
createdAt: number;
|
|
28
|
+
effectId: string;
|
|
29
|
+
envelope: EffectAdapterExecutionEnvelope<Payload>;
|
|
30
|
+
input: AgentPurchaseIntentInput<Payload>;
|
|
31
|
+
inputDigest: string;
|
|
32
|
+
mandate?: SpendMandate;
|
|
33
|
+
mandateId: string;
|
|
34
|
+
status: AgentPurchaseIntentStatus;
|
|
35
|
+
updatedAt: number;
|
|
36
|
+
};
|
|
37
|
+
export type AgentPurchaseIntentStore = {
|
|
38
|
+
get: (tenantId: string, purchaseId: string) => Promise<AgentPurchaseIntent | undefined>;
|
|
39
|
+
getByIdempotencyKey: (tenantId: string, idempotencyKey: string) => Promise<AgentPurchaseIntent | undefined>;
|
|
40
|
+
list: (input: {
|
|
41
|
+
limit: number;
|
|
42
|
+
ownerId?: string;
|
|
43
|
+
status?: AgentPurchaseIntentStatus;
|
|
44
|
+
tenantId?: string;
|
|
45
|
+
}) => Promise<AgentPurchaseIntent[]>;
|
|
46
|
+
save: (intent: AgentPurchaseIntent) => Promise<void>;
|
|
47
|
+
};
|
|
48
|
+
export declare class AgentPurchaseIntentError extends Error {
|
|
49
|
+
}
|
|
50
|
+
export declare const createMemoryAgentPurchaseIntentStore: () => AgentPurchaseIntentStore;
|
|
51
|
+
export declare const agentPurchaseIntentsPostgresSchemaSql: (namespace?: string) => string;
|
|
52
|
+
export declare const createPostgresAgentPurchaseIntentStore: (options: {
|
|
53
|
+
client: ExecutionSqlClient;
|
|
54
|
+
namespace?: string;
|
|
55
|
+
}) => AgentPurchaseIntentStore;
|
|
56
|
+
type PurchaseWallet = {
|
|
57
|
+
cancelSpend: (mandateId: string) => Promise<unknown>;
|
|
58
|
+
requestSpend: (request: AgentSpendRequest, options?: {
|
|
59
|
+
mandateId?: string;
|
|
60
|
+
}) => Promise<SpendRequestResult>;
|
|
61
|
+
};
|
|
62
|
+
export declare const createAgentPurchaseOrchestrator: (options: {
|
|
63
|
+
effects: Pick<EffectStore, "enqueue" | "getByIdempotencyKey">;
|
|
64
|
+
installations: Pick<EffectAdapterInstallationRegistry, "disable" | "enable" | "put">;
|
|
65
|
+
now?: () => number;
|
|
66
|
+
store: AgentPurchaseIntentStore;
|
|
67
|
+
wallet: PurchaseWallet;
|
|
68
|
+
}) => {
|
|
69
|
+
list: (input: {
|
|
70
|
+
limit: number;
|
|
71
|
+
ownerId?: string;
|
|
72
|
+
status?: AgentPurchaseIntentStatus;
|
|
73
|
+
tenantId?: string;
|
|
74
|
+
}) => Promise<AgentPurchaseIntent[]>;
|
|
75
|
+
submit: <Payload>(input: AgentPurchaseIntentInput<Payload>) => Promise<AgentPurchaseIntent<Payload>>;
|
|
76
|
+
};
|
|
77
|
+
export {};
|
package/dist/commerce.js
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/commerce.ts
|
|
3
|
+
import {
|
|
4
|
+
effectAdapterExecutionInputDigest
|
|
5
|
+
} from "@absolutejs/execution";
|
|
6
|
+
|
|
7
|
+
class AgentPurchaseIntentError extends Error {
|
|
8
|
+
}
|
|
9
|
+
var keyOf = (tenantId, purchaseId) => `${tenantId}\x00${purchaseId}`;
|
|
10
|
+
var createMemoryAgentPurchaseIntentStore = () => {
|
|
11
|
+
const records = new Map;
|
|
12
|
+
return {
|
|
13
|
+
get: async (tenantId, purchaseId) => {
|
|
14
|
+
const value = records.get(keyOf(tenantId, purchaseId));
|
|
15
|
+
return value ? structuredClone(value) : undefined;
|
|
16
|
+
},
|
|
17
|
+
getByIdempotencyKey: async (tenantId, idempotencyKey) => {
|
|
18
|
+
const value = [...records.values()].find((intent) => intent.input.tenantId === tenantId && intent.input.idempotencyKey === idempotencyKey);
|
|
19
|
+
return value ? structuredClone(value) : undefined;
|
|
20
|
+
},
|
|
21
|
+
list: async (input) => [...records.values()].filter(({ input: intent, status }) => (!input.tenantId || intent.tenantId === input.tenantId) && (!input.ownerId || intent.ownerId === input.ownerId) && (!input.status || status === input.status)).sort((left, right) => right.createdAt - left.createdAt).slice(0, input.limit).map((value) => structuredClone(value)),
|
|
22
|
+
save: async (intent) => {
|
|
23
|
+
const key = keyOf(intent.input.tenantId, intent.input.purchaseId);
|
|
24
|
+
const existing = records.get(key);
|
|
25
|
+
if (existing && existing.inputDigest !== intent.inputDigest)
|
|
26
|
+
throw new AgentPurchaseIntentError("Purchase identity belongs to another immutable request");
|
|
27
|
+
const idempotent = [...records.values()].find(({ input }) => input.tenantId === intent.input.tenantId && input.idempotencyKey === intent.input.idempotencyKey);
|
|
28
|
+
if (idempotent && idempotent.input.purchaseId !== intent.input.purchaseId)
|
|
29
|
+
throw new AgentPurchaseIntentError("Purchase idempotency key belongs to another request");
|
|
30
|
+
records.set(key, structuredClone(intent));
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
var namespaceOf = (namespace) => {
|
|
35
|
+
if (!/^[a-z_][a-z0-9_]*$/.test(namespace))
|
|
36
|
+
throw new AgentPurchaseIntentError("Purchase intent namespace must be a simple identifier");
|
|
37
|
+
return namespace;
|
|
38
|
+
};
|
|
39
|
+
var agentPurchaseIntentsPostgresSchemaSql = (namespace = "agent_commerce") => {
|
|
40
|
+
const ns = namespaceOf(namespace);
|
|
41
|
+
return `CREATE SCHEMA IF NOT EXISTS ${ns};
|
|
42
|
+
CREATE TABLE IF NOT EXISTS ${ns}.purchase_intents (
|
|
43
|
+
purchase_id text PRIMARY KEY,
|
|
44
|
+
tenant_id text NOT NULL,
|
|
45
|
+
owner_id text NOT NULL,
|
|
46
|
+
idempotency_key text NOT NULL,
|
|
47
|
+
status text NOT NULL,
|
|
48
|
+
input_digest text NOT NULL,
|
|
49
|
+
data jsonb NOT NULL,
|
|
50
|
+
created_at bigint NOT NULL,
|
|
51
|
+
updated_at bigint NOT NULL,
|
|
52
|
+
UNIQUE (tenant_id, idempotency_key),
|
|
53
|
+
UNIQUE (tenant_id, purchase_id)
|
|
54
|
+
);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS purchase_intents_inventory_idx ON ${ns}.purchase_intents (tenant_id, created_at DESC);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS purchase_intents_owner_idx ON ${ns}.purchase_intents (owner_id, created_at DESC);`;
|
|
57
|
+
};
|
|
58
|
+
var parseRow = (row) => {
|
|
59
|
+
if (!row)
|
|
60
|
+
return;
|
|
61
|
+
return typeof row.data === "string" ? JSON.parse(row.data) : row.data;
|
|
62
|
+
};
|
|
63
|
+
var createPostgresAgentPurchaseIntentStore = (options) => {
|
|
64
|
+
const ns = namespaceOf(options.namespace ?? "agent_commerce");
|
|
65
|
+
return {
|
|
66
|
+
get: async (tenantId, purchaseId) => parseRow((await options.client.query(`SELECT data FROM ${ns}.purchase_intents WHERE tenant_id = $1 AND purchase_id = $2`, [tenantId, purchaseId])).rows[0]),
|
|
67
|
+
getByIdempotencyKey: async (tenantId, idempotencyKey) => parseRow((await options.client.query(`SELECT data FROM ${ns}.purchase_intents WHERE tenant_id = $1 AND idempotency_key = $2`, [tenantId, idempotencyKey])).rows[0]),
|
|
68
|
+
list: async (input) => {
|
|
69
|
+
const clauses = [];
|
|
70
|
+
const values = [];
|
|
71
|
+
if (input.tenantId) {
|
|
72
|
+
values.push(input.tenantId);
|
|
73
|
+
clauses.push(`tenant_id = $${values.length}`);
|
|
74
|
+
}
|
|
75
|
+
if (input.ownerId) {
|
|
76
|
+
values.push(input.ownerId);
|
|
77
|
+
clauses.push(`owner_id = $${values.length}`);
|
|
78
|
+
}
|
|
79
|
+
if (input.status) {
|
|
80
|
+
values.push(input.status);
|
|
81
|
+
clauses.push(`status = $${values.length}`);
|
|
82
|
+
}
|
|
83
|
+
values.push(input.limit);
|
|
84
|
+
const where = clauses.length > 0 ? ` WHERE ${clauses.join(" AND ")}` : "";
|
|
85
|
+
const result = await options.client.query(`SELECT data FROM ${ns}.purchase_intents${where} ORDER BY created_at DESC LIMIT $${values.length}`, values);
|
|
86
|
+
return result.rows.map((row) => parseRow(row));
|
|
87
|
+
},
|
|
88
|
+
save: async (intent) => {
|
|
89
|
+
const result = await options.client.query(`INSERT INTO ${ns}.purchase_intents
|
|
90
|
+
(purchase_id, tenant_id, owner_id, idempotency_key, status, input_digest, data, created_at, updated_at)
|
|
91
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, $8, $9)
|
|
92
|
+
ON CONFLICT (purchase_id) DO UPDATE SET
|
|
93
|
+
status = excluded.status,
|
|
94
|
+
data = excluded.data,
|
|
95
|
+
updated_at = excluded.updated_at
|
|
96
|
+
WHERE ${ns}.purchase_intents.tenant_id = excluded.tenant_id
|
|
97
|
+
AND ${ns}.purchase_intents.input_digest = excluded.input_digest
|
|
98
|
+
AND ${ns}.purchase_intents.idempotency_key = excluded.idempotency_key
|
|
99
|
+
RETURNING purchase_id`, [
|
|
100
|
+
intent.input.purchaseId,
|
|
101
|
+
intent.input.tenantId,
|
|
102
|
+
intent.input.ownerId,
|
|
103
|
+
intent.input.idempotencyKey,
|
|
104
|
+
intent.status,
|
|
105
|
+
intent.inputDigest,
|
|
106
|
+
JSON.stringify(intent),
|
|
107
|
+
intent.createdAt,
|
|
108
|
+
intent.updatedAt
|
|
109
|
+
]);
|
|
110
|
+
if (result.rows.length !== 1)
|
|
111
|
+
throw new AgentPurchaseIntentError("Purchase identity belongs to another immutable request");
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
var createAgentPurchaseOrchestrator = (options) => {
|
|
116
|
+
const now = options.now ?? Date.now;
|
|
117
|
+
const saveStatus = async (intent, status, mandate) => {
|
|
118
|
+
const next = {
|
|
119
|
+
...intent,
|
|
120
|
+
...mandate ? { mandate } : {},
|
|
121
|
+
status,
|
|
122
|
+
updatedAt: now()
|
|
123
|
+
};
|
|
124
|
+
await options.store.save(next);
|
|
125
|
+
return next;
|
|
126
|
+
};
|
|
127
|
+
const submit = async (input) => {
|
|
128
|
+
if (!input.purchaseId.trim() || !input.idempotencyKey.trim())
|
|
129
|
+
throw new AgentPurchaseIntentError("Purchase and idempotency identities are required");
|
|
130
|
+
if (!Number.isSafeInteger(input.amountMinor) || input.amountMinor <= 0)
|
|
131
|
+
throw new AgentPurchaseIntentError("Purchase amount must be positive integer minor units");
|
|
132
|
+
const mandateId = `mandate:purchase:${input.purchaseId}`;
|
|
133
|
+
const effectId = `purchase:${input.purchaseId}`;
|
|
134
|
+
const envelope = {
|
|
135
|
+
currency: input.currency,
|
|
136
|
+
...input.destination ? { destination: input.destination } : {},
|
|
137
|
+
effect: input.effect,
|
|
138
|
+
installationId: input.installationId,
|
|
139
|
+
mandateId,
|
|
140
|
+
payload: input.payload,
|
|
141
|
+
spendMinor: input.amountMinor
|
|
142
|
+
};
|
|
143
|
+
const inputDigest = await effectAdapterExecutionInputDigest(envelope);
|
|
144
|
+
const existing = await options.store.get(input.tenantId, input.purchaseId);
|
|
145
|
+
const idempotent = await options.store.getByIdempotencyKey(input.tenantId, input.idempotencyKey);
|
|
146
|
+
const prior = existing ?? idempotent;
|
|
147
|
+
if (prior) {
|
|
148
|
+
if (prior.input.purchaseId !== input.purchaseId || prior.inputDigest !== inputDigest)
|
|
149
|
+
throw new AgentPurchaseIntentError("Purchase identity belongs to another immutable request");
|
|
150
|
+
if (prior.status === "enqueued" || prior.status === "cancelled")
|
|
151
|
+
return prior;
|
|
152
|
+
}
|
|
153
|
+
let intent = prior ?? {
|
|
154
|
+
createdAt: now(),
|
|
155
|
+
effectId,
|
|
156
|
+
envelope,
|
|
157
|
+
input,
|
|
158
|
+
inputDigest,
|
|
159
|
+
mandateId,
|
|
160
|
+
status: "drafted",
|
|
161
|
+
updatedAt: now()
|
|
162
|
+
};
|
|
163
|
+
await options.store.save(intent);
|
|
164
|
+
const spendRequest = {
|
|
165
|
+
action: input.effect,
|
|
166
|
+
agentId: input.agentId,
|
|
167
|
+
allowanceId: input.allowanceId,
|
|
168
|
+
amountCents: input.amountMinor,
|
|
169
|
+
cartHash: inputDigest,
|
|
170
|
+
...input.category ? { category: input.category } : {},
|
|
171
|
+
currency: input.currency,
|
|
172
|
+
expiresAt: input.expiresAt,
|
|
173
|
+
idempotencyKey: `purchase:${input.idempotencyKey}`,
|
|
174
|
+
merchantId: input.merchantId,
|
|
175
|
+
...input.refundable === undefined ? {} : { refundable: input.refundable }
|
|
176
|
+
};
|
|
177
|
+
const requested = await options.wallet.requestSpend(spendRequest, {
|
|
178
|
+
mandateId
|
|
179
|
+
});
|
|
180
|
+
if (requested.mandate.status === "pending_approval")
|
|
181
|
+
return await saveStatus(intent, "pending_approval", requested.mandate);
|
|
182
|
+
if (requested.mandate.status !== "active")
|
|
183
|
+
throw new AgentPurchaseIntentError(`Purchase mandate is ${requested.mandate.status}`);
|
|
184
|
+
intent = await saveStatus(intent, "mandate_ready", requested.mandate);
|
|
185
|
+
await options.installations.put({
|
|
186
|
+
adapterId: input.adapterId,
|
|
187
|
+
installationId: input.installationId,
|
|
188
|
+
policy: {
|
|
189
|
+
credentials: input.credentials ?? [],
|
|
190
|
+
destinations: input.destination ? [input.destination] : [],
|
|
191
|
+
effects: [input.effect],
|
|
192
|
+
spend: {
|
|
193
|
+
currency: input.currency,
|
|
194
|
+
mandateId,
|
|
195
|
+
maxMinorPerEffect: input.amountMinor
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
tenantId: input.tenantId
|
|
199
|
+
});
|
|
200
|
+
await options.installations.enable(input.tenantId, input.installationId);
|
|
201
|
+
intent = await saveStatus(intent, "installation_ready");
|
|
202
|
+
const timestamp = now();
|
|
203
|
+
const effect = {
|
|
204
|
+
actionId: input.actionId,
|
|
205
|
+
attempts: 0,
|
|
206
|
+
availableAt: timestamp,
|
|
207
|
+
createdAt: timestamp,
|
|
208
|
+
effectId,
|
|
209
|
+
handler: input.handler,
|
|
210
|
+
idempotencyKey: `purchase:${input.idempotencyKey}`,
|
|
211
|
+
input: envelope,
|
|
212
|
+
inputDigest,
|
|
213
|
+
status: "pending",
|
|
214
|
+
tenantId: input.tenantId,
|
|
215
|
+
updatedAt: timestamp
|
|
216
|
+
};
|
|
217
|
+
if (!await options.effects.enqueue(effect)) {
|
|
218
|
+
const duplicate = await options.effects.getByIdempotencyKey(input.tenantId, effect.idempotencyKey);
|
|
219
|
+
if (!duplicate || duplicate.effectId !== effect.effectId || duplicate.inputDigest !== effect.inputDigest) {
|
|
220
|
+
await options.installations.disable(input.tenantId, input.installationId);
|
|
221
|
+
await options.wallet.cancelSpend(mandateId);
|
|
222
|
+
throw new AgentPurchaseIntentError("Purchase effect idempotency key belongs to another request");
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return await saveStatus(intent, "enqueued");
|
|
226
|
+
};
|
|
227
|
+
return {
|
|
228
|
+
list: options.store.list,
|
|
229
|
+
submit
|
|
230
|
+
};
|
|
231
|
+
};
|
|
232
|
+
export {
|
|
233
|
+
createPostgresAgentPurchaseIntentStore,
|
|
234
|
+
createMemoryAgentPurchaseIntentStore,
|
|
235
|
+
createAgentPurchaseOrchestrator,
|
|
236
|
+
agentPurchaseIntentsPostgresSchemaSql,
|
|
237
|
+
AgentPurchaseIntentError
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
//# debugId=457EBBA7D3AC94FB64756E2164756E21
|
|
241
|
+
//# sourceMappingURL=commerce.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commerce.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n effectAdapterExecutionInputDigest,\n type EffectAdapterCredentialInstallation,\n type EffectAdapterExecutionEnvelope,\n type EffectAdapterInstallationRegistry,\n type EffectRecord,\n type EffectStore,\n type ExecutionSqlClient,\n} from \"@absolutejs/execution\";\nimport type {\n AgentSpendRequest,\n SpendRequestResult,\n SpendMandate,\n} from \"@absolutejs/wallet\";\n\nexport type AgentPurchaseIntentStatus =\n | \"drafted\"\n | \"pending_approval\"\n | \"mandate_ready\"\n | \"installation_ready\"\n | \"enqueued\"\n | \"cancelled\";\n\nexport type AgentPurchaseIntentInput<Payload = unknown> = {\n actionId: string;\n adapterId: string;\n agentId: string;\n allowanceId: string;\n amountMinor: number;\n category?: string;\n credentials?: ReadonlyArray<EffectAdapterCredentialInstallation>;\n currency: string;\n destination?: string;\n effect: string;\n expiresAt: string;\n handler: string;\n idempotencyKey: string;\n installationId: string;\n merchantId: string;\n ownerId: string;\n payload: Payload;\n purchaseId: string;\n refundable?: boolean;\n tenantId: string;\n};\n\nexport type AgentPurchaseIntent<Payload = unknown> = {\n createdAt: number;\n effectId: string;\n envelope: EffectAdapterExecutionEnvelope<Payload>;\n input: AgentPurchaseIntentInput<Payload>;\n inputDigest: string;\n mandate?: SpendMandate;\n mandateId: string;\n status: AgentPurchaseIntentStatus;\n updatedAt: number;\n};\n\nexport type AgentPurchaseIntentStore = {\n get: (\n tenantId: string,\n purchaseId: string,\n ) => Promise<AgentPurchaseIntent | undefined>;\n getByIdempotencyKey: (\n tenantId: string,\n idempotencyKey: string,\n ) => Promise<AgentPurchaseIntent | undefined>;\n list: (input: {\n limit: number;\n ownerId?: string;\n status?: AgentPurchaseIntentStatus;\n tenantId?: string;\n }) => Promise<AgentPurchaseIntent[]>;\n save: (intent: AgentPurchaseIntent) => Promise<void>;\n};\n\nexport class AgentPurchaseIntentError extends Error {}\n\nconst keyOf = (tenantId: string, purchaseId: string) =>\n `${tenantId}\\u0000${purchaseId}`;\n\nexport const createMemoryAgentPurchaseIntentStore =\n (): AgentPurchaseIntentStore => {\n const records = new Map<string, AgentPurchaseIntent>();\n return {\n get: async (tenantId, purchaseId) => {\n const value = records.get(keyOf(tenantId, purchaseId));\n return value ? structuredClone(value) : undefined;\n },\n getByIdempotencyKey: async (tenantId, idempotencyKey) => {\n const value = [...records.values()].find(\n (intent) =>\n intent.input.tenantId === tenantId &&\n intent.input.idempotencyKey === idempotencyKey,\n );\n return value ? structuredClone(value) : undefined;\n },\n list: async (input) =>\n [...records.values()]\n .filter(\n ({ input: intent, status }) =>\n (!input.tenantId || intent.tenantId === input.tenantId) &&\n (!input.ownerId || intent.ownerId === input.ownerId) &&\n (!input.status || status === input.status),\n )\n .sort((left, right) => right.createdAt - left.createdAt)\n .slice(0, input.limit)\n .map((value) => structuredClone(value)),\n save: async (intent) => {\n const key = keyOf(intent.input.tenantId, intent.input.purchaseId);\n const existing = records.get(key);\n if (existing && existing.inputDigest !== intent.inputDigest)\n throw new AgentPurchaseIntentError(\n \"Purchase identity belongs to another immutable request\",\n );\n const idempotent = [...records.values()].find(\n ({ input }) =>\n input.tenantId === intent.input.tenantId &&\n input.idempotencyKey === intent.input.idempotencyKey,\n );\n if (\n idempotent &&\n idempotent.input.purchaseId !== intent.input.purchaseId\n )\n throw new AgentPurchaseIntentError(\n \"Purchase idempotency key belongs to another request\",\n );\n records.set(key, structuredClone(intent));\n },\n };\n };\n\nconst namespaceOf = (namespace: string) => {\n if (!/^[a-z_][a-z0-9_]*$/.test(namespace))\n throw new AgentPurchaseIntentError(\n \"Purchase intent namespace must be a simple identifier\",\n );\n return namespace;\n};\n\nexport const agentPurchaseIntentsPostgresSchemaSql = (\n namespace = \"agent_commerce\",\n) => {\n const ns = namespaceOf(namespace);\n return `CREATE SCHEMA IF NOT EXISTS ${ns};\nCREATE TABLE IF NOT EXISTS ${ns}.purchase_intents (\n purchase_id text PRIMARY KEY,\n tenant_id text NOT NULL,\n owner_id text NOT NULL,\n idempotency_key text NOT NULL,\n status text NOT NULL,\n input_digest text NOT NULL,\n data jsonb NOT NULL,\n created_at bigint NOT NULL,\n updated_at bigint NOT NULL,\n UNIQUE (tenant_id, idempotency_key),\n UNIQUE (tenant_id, purchase_id)\n);\nCREATE INDEX IF NOT EXISTS purchase_intents_inventory_idx ON ${ns}.purchase_intents (tenant_id, created_at DESC);\nCREATE INDEX IF NOT EXISTS purchase_intents_owner_idx ON ${ns}.purchase_intents (owner_id, created_at DESC);`;\n};\n\ntype AgentPurchaseIntentRow = { data: AgentPurchaseIntent | string };\nconst parseRow = (row: AgentPurchaseIntentRow | undefined) => {\n if (!row) return undefined;\n return (\n typeof row.data === \"string\" ? JSON.parse(row.data) : row.data\n ) as AgentPurchaseIntent;\n};\n\nexport const createPostgresAgentPurchaseIntentStore = (options: {\n client: ExecutionSqlClient;\n namespace?: string;\n}): AgentPurchaseIntentStore => {\n const ns = namespaceOf(options.namespace ?? \"agent_commerce\");\n return {\n get: async (tenantId, purchaseId) =>\n parseRow(\n (\n await options.client.query<AgentPurchaseIntentRow>(\n `SELECT data FROM ${ns}.purchase_intents WHERE tenant_id = $1 AND purchase_id = $2`,\n [tenantId, purchaseId],\n )\n ).rows[0],\n ),\n getByIdempotencyKey: async (tenantId, idempotencyKey) =>\n parseRow(\n (\n await options.client.query<AgentPurchaseIntentRow>(\n `SELECT data FROM ${ns}.purchase_intents WHERE tenant_id = $1 AND idempotency_key = $2`,\n [tenantId, idempotencyKey],\n )\n ).rows[0],\n ),\n list: async (input) => {\n const clauses: string[] = [];\n const values: unknown[] = [];\n if (input.tenantId) {\n values.push(input.tenantId);\n clauses.push(`tenant_id = $${values.length}`);\n }\n if (input.ownerId) {\n values.push(input.ownerId);\n clauses.push(`owner_id = $${values.length}`);\n }\n if (input.status) {\n values.push(input.status);\n clauses.push(`status = $${values.length}`);\n }\n values.push(input.limit);\n const where = clauses.length > 0 ? ` WHERE ${clauses.join(\" AND \")}` : \"\";\n const result = await options.client.query<AgentPurchaseIntentRow>(\n `SELECT data FROM ${ns}.purchase_intents${where} ORDER BY created_at DESC LIMIT $${values.length}`,\n values,\n );\n return result.rows.map((row) => parseRow(row)!);\n },\n save: async (intent) => {\n const result = await options.client.query<{ purchase_id: string }>(\n `INSERT INTO ${ns}.purchase_intents\n (purchase_id, tenant_id, owner_id, idempotency_key, status, input_digest, data, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, $8, $9)\n ON CONFLICT (purchase_id) DO UPDATE SET\n status = excluded.status,\n data = excluded.data,\n updated_at = excluded.updated_at\n WHERE ${ns}.purchase_intents.tenant_id = excluded.tenant_id\n AND ${ns}.purchase_intents.input_digest = excluded.input_digest\n AND ${ns}.purchase_intents.idempotency_key = excluded.idempotency_key\n RETURNING purchase_id`,\n [\n intent.input.purchaseId,\n intent.input.tenantId,\n intent.input.ownerId,\n intent.input.idempotencyKey,\n intent.status,\n intent.inputDigest,\n JSON.stringify(intent),\n intent.createdAt,\n intent.updatedAt,\n ],\n );\n if (result.rows.length !== 1)\n throw new AgentPurchaseIntentError(\n \"Purchase identity belongs to another immutable request\",\n );\n },\n };\n};\n\ntype PurchaseWallet = {\n cancelSpend: (mandateId: string) => Promise<unknown>;\n requestSpend: (\n request: AgentSpendRequest,\n options?: { mandateId?: string },\n ) => Promise<SpendRequestResult>;\n};\n\nexport const createAgentPurchaseOrchestrator = (options: {\n effects: Pick<EffectStore, \"enqueue\" | \"getByIdempotencyKey\">;\n installations: Pick<\n EffectAdapterInstallationRegistry,\n \"disable\" | \"enable\" | \"put\"\n >;\n now?: () => number;\n store: AgentPurchaseIntentStore;\n wallet: PurchaseWallet;\n}) => {\n const now = options.now ?? Date.now;\n\n const saveStatus = async (\n intent: AgentPurchaseIntent,\n status: AgentPurchaseIntentStatus,\n mandate?: SpendMandate,\n ) => {\n const next: AgentPurchaseIntent = {\n ...intent,\n ...(mandate ? { mandate } : {}),\n status,\n updatedAt: now(),\n };\n await options.store.save(next);\n return next;\n };\n\n const submit = async <Payload>(\n input: AgentPurchaseIntentInput<Payload>,\n ): Promise<AgentPurchaseIntent<Payload>> => {\n if (!input.purchaseId.trim() || !input.idempotencyKey.trim())\n throw new AgentPurchaseIntentError(\n \"Purchase and idempotency identities are required\",\n );\n if (!Number.isSafeInteger(input.amountMinor) || input.amountMinor <= 0)\n throw new AgentPurchaseIntentError(\n \"Purchase amount must be positive integer minor units\",\n );\n const mandateId = `mandate:purchase:${input.purchaseId}`;\n const effectId = `purchase:${input.purchaseId}`;\n const envelope: EffectAdapterExecutionEnvelope<Payload> = {\n currency: input.currency,\n ...(input.destination ? { destination: input.destination } : {}),\n effect: input.effect,\n installationId: input.installationId,\n mandateId,\n payload: input.payload,\n spendMinor: input.amountMinor,\n };\n const inputDigest = await effectAdapterExecutionInputDigest(envelope);\n const existing = await options.store.get(input.tenantId, input.purchaseId);\n const idempotent = await options.store.getByIdempotencyKey(\n input.tenantId,\n input.idempotencyKey,\n );\n const prior = existing ?? idempotent;\n if (prior) {\n if (\n prior.input.purchaseId !== input.purchaseId ||\n prior.inputDigest !== inputDigest\n )\n throw new AgentPurchaseIntentError(\n \"Purchase identity belongs to another immutable request\",\n );\n if (prior.status === \"enqueued\" || prior.status === \"cancelled\")\n return prior as AgentPurchaseIntent<Payload>;\n }\n let intent = (prior ?? {\n createdAt: now(),\n effectId,\n envelope,\n input,\n inputDigest,\n mandateId,\n status: \"drafted\" as const,\n updatedAt: now(),\n }) as AgentPurchaseIntent<Payload>;\n await options.store.save(intent);\n\n const spendRequest: AgentSpendRequest = {\n action: input.effect,\n agentId: input.agentId,\n allowanceId: input.allowanceId,\n amountCents: input.amountMinor,\n cartHash: inputDigest,\n ...(input.category ? { category: input.category } : {}),\n currency: input.currency,\n expiresAt: input.expiresAt,\n idempotencyKey: `purchase:${input.idempotencyKey}`,\n merchantId: input.merchantId,\n ...(input.refundable === undefined\n ? {}\n : { refundable: input.refundable }),\n };\n const requested = await options.wallet.requestSpend(spendRequest, {\n mandateId,\n });\n if (requested.mandate.status === \"pending_approval\")\n return (await saveStatus(\n intent,\n \"pending_approval\",\n requested.mandate,\n )) as AgentPurchaseIntent<Payload>;\n if (requested.mandate.status !== \"active\")\n throw new AgentPurchaseIntentError(\n `Purchase mandate is ${requested.mandate.status}`,\n );\n intent = (await saveStatus(\n intent,\n \"mandate_ready\",\n requested.mandate,\n )) as AgentPurchaseIntent<Payload>;\n\n await options.installations.put({\n adapterId: input.adapterId,\n installationId: input.installationId,\n policy: {\n credentials: input.credentials ?? [],\n destinations: input.destination ? [input.destination] : [],\n effects: [input.effect],\n spend: {\n currency: input.currency,\n mandateId,\n maxMinorPerEffect: input.amountMinor,\n },\n },\n tenantId: input.tenantId,\n });\n await options.installations.enable(input.tenantId, input.installationId);\n intent = (await saveStatus(\n intent,\n \"installation_ready\",\n )) as AgentPurchaseIntent<Payload>;\n\n const timestamp = now();\n const effect: EffectRecord = {\n actionId: input.actionId,\n attempts: 0,\n availableAt: timestamp,\n createdAt: timestamp,\n effectId,\n handler: input.handler,\n idempotencyKey: `purchase:${input.idempotencyKey}`,\n input: envelope,\n inputDigest,\n status: \"pending\",\n tenantId: input.tenantId,\n updatedAt: timestamp,\n };\n if (!(await options.effects.enqueue(effect))) {\n const duplicate = await options.effects.getByIdempotencyKey(\n input.tenantId,\n effect.idempotencyKey,\n );\n if (\n !duplicate ||\n duplicate.effectId !== effect.effectId ||\n duplicate.inputDigest !== effect.inputDigest\n ) {\n await options.installations.disable(\n input.tenantId,\n input.installationId,\n );\n await options.wallet.cancelSpend(mandateId);\n throw new AgentPurchaseIntentError(\n \"Purchase effect idempotency key belongs to another request\",\n );\n }\n }\n return (await saveStatus(\n intent,\n \"enqueued\",\n )) as AgentPurchaseIntent<Payload>;\n };\n\n return {\n list: options.store.list,\n submit,\n };\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "457EBBA7D3AC94FB64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export declare const AGENT_STACK_PACKAGES: {
|
|
|
3
3
|
readonly actions: "@absolutejs/agency";
|
|
4
4
|
readonly auth: "@absolutejs/auth";
|
|
5
5
|
readonly conformance: "@absolutejs/agent-conformance";
|
|
6
|
+
readonly commerce: "@absolutejs/agent/commerce";
|
|
6
7
|
readonly control: "@absolutejs/agent-control";
|
|
7
8
|
readonly discovery: "@absolutejs/agent-discovery";
|
|
8
9
|
readonly execution: "@absolutejs/execution";
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ var AGENT_STACK_PACKAGES = {
|
|
|
5
5
|
actions: "@absolutejs/agency",
|
|
6
6
|
auth: "@absolutejs/auth",
|
|
7
7
|
conformance: "@absolutejs/agent-conformance",
|
|
8
|
+
commerce: "@absolutejs/agent/commerce",
|
|
8
9
|
control: "@absolutejs/agent-control",
|
|
9
10
|
discovery: "@absolutejs/agent-discovery",
|
|
10
11
|
execution: "@absolutejs/execution",
|
|
@@ -75,5 +76,5 @@ export {
|
|
|
75
76
|
AGENT_STACK_PACKAGES
|
|
76
77
|
};
|
|
77
78
|
|
|
78
|
-
//# debugId=
|
|
79
|
+
//# debugId=7D0FD7A8890B50CE64756E2164756E21
|
|
79
80
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"export const AGENT_STACK_PACKAGES = {\n a2a: \"@absolutejs/a2a\",\n actions: \"@absolutejs/agency\",\n auth: \"@absolutejs/auth\",\n conformance: \"@absolutejs/agent-conformance\",\n control: \"@absolutejs/agent-control\",\n discovery: \"@absolutejs/agent-discovery\",\n execution: \"@absolutejs/execution\",\n inbox: \"@absolutejs/agent-inbox\",\n mcp: \"@absolutejs/mcp\",\n memory: \"@absolutejs/agent-memory\",\n policy: \"@absolutejs/policy\",\n runtime: \"@absolutejs/agent-runtime\",\n sandbox: \"@absolutejs/agent-sandbox\",\n trust: \"@absolutejs/agent-trust\",\n wallet: \"@absolutejs/wallet\",\n} as const;\n\nexport const PRODUCTION_AGENT_CAPABILITIES = [\n \"identity\",\n \"authorization\",\n \"durability\",\n \"sandbox\",\n \"trust\",\n \"memory\",\n \"triggers\",\n \"discovery\",\n \"interoperability\",\n \"spend\",\n \"operations\",\n \"conformance\",\n] as const;\n\nexport type ProductionAgentCapability =\n (typeof PRODUCTION_AGENT_CAPABILITIES)[number];\n\nexport type AgentStackComponent<Instance = unknown> = {\n capability: ProductionAgentCapability;\n instance: Instance;\n name: string;\n productionReady?: () => boolean | Promise<boolean>;\n};\n\nexport type AgentStack<Components extends readonly AgentStackComponent[]> = {\n components: Components;\n get: <Name extends Components[number][\"name\"]>(\n name: Name,\n ) => Extract<Components[number], { name: Name }>[\"instance\"];\n readiness: () => Promise<AgentStackReadiness>;\n};\n\nexport type AgentStackReadiness = {\n capabilities: Record<ProductionAgentCapability, boolean>;\n missing: ProductionAgentCapability[];\n ready: boolean;\n};\n\nconst readinessOf = async (\n components: readonly AgentStackComponent[],\n): Promise<AgentStackReadiness> => {\n const capabilities = Object.fromEntries(\n PRODUCTION_AGENT_CAPABILITIES.map((capability) => [capability, false]),\n ) as Record<ProductionAgentCapability, boolean>;\n for (const component of components) {\n if ((await component.productionReady?.()) === false) continue;\n capabilities[component.capability] = true;\n }\n const missing = PRODUCTION_AGENT_CAPABILITIES.filter(\n (capability) => !capabilities[capability],\n );\n\n return { capabilities, missing, ready: missing.length === 0 };\n};\n\nexport const defineAgentStack = <\n const Components extends readonly AgentStackComponent[],\n>(\n components: Components,\n): AgentStack<Components> => {\n const names = new Set<string>();\n for (const component of components) {\n if (names.has(component.name)) {\n throw new Error(`Duplicate agent stack component: ${component.name}`);\n }\n names.add(component.name);\n }\n\n return {\n components,\n get: (name) => {\n const component = components.find((candidate) => candidate.name === name);\n if (component === undefined) {\n throw new Error(`Unknown agent stack component: ${String(name)}`);\n }\n\n return component.instance as Extract<\n Components[number],\n { name: typeof name }\n >[\"instance\"];\n },\n readiness: () => readinessOf(components),\n };\n};\n\nexport const assertProductionReady = async (\n stack: Pick<AgentStack<readonly AgentStackComponent[]>, \"readiness\">,\n) => {\n const readiness = await stack.readiness();\n if (!readiness.ready) {\n throw new Error(\n `Agent stack is missing production capabilities: ${readiness.missing.join(\", \")}`,\n );\n }\n\n return readiness;\n};\n"
|
|
5
|
+
"export const AGENT_STACK_PACKAGES = {\n a2a: \"@absolutejs/a2a\",\n actions: \"@absolutejs/agency\",\n auth: \"@absolutejs/auth\",\n conformance: \"@absolutejs/agent-conformance\",\n commerce: \"@absolutejs/agent/commerce\",\n control: \"@absolutejs/agent-control\",\n discovery: \"@absolutejs/agent-discovery\",\n execution: \"@absolutejs/execution\",\n inbox: \"@absolutejs/agent-inbox\",\n mcp: \"@absolutejs/mcp\",\n memory: \"@absolutejs/agent-memory\",\n policy: \"@absolutejs/policy\",\n runtime: \"@absolutejs/agent-runtime\",\n sandbox: \"@absolutejs/agent-sandbox\",\n trust: \"@absolutejs/agent-trust\",\n wallet: \"@absolutejs/wallet\",\n} as const;\n\nexport const PRODUCTION_AGENT_CAPABILITIES = [\n \"identity\",\n \"authorization\",\n \"durability\",\n \"sandbox\",\n \"trust\",\n \"memory\",\n \"triggers\",\n \"discovery\",\n \"interoperability\",\n \"spend\",\n \"operations\",\n \"conformance\",\n] as const;\n\nexport type ProductionAgentCapability =\n (typeof PRODUCTION_AGENT_CAPABILITIES)[number];\n\nexport type AgentStackComponent<Instance = unknown> = {\n capability: ProductionAgentCapability;\n instance: Instance;\n name: string;\n productionReady?: () => boolean | Promise<boolean>;\n};\n\nexport type AgentStack<Components extends readonly AgentStackComponent[]> = {\n components: Components;\n get: <Name extends Components[number][\"name\"]>(\n name: Name,\n ) => Extract<Components[number], { name: Name }>[\"instance\"];\n readiness: () => Promise<AgentStackReadiness>;\n};\n\nexport type AgentStackReadiness = {\n capabilities: Record<ProductionAgentCapability, boolean>;\n missing: ProductionAgentCapability[];\n ready: boolean;\n};\n\nconst readinessOf = async (\n components: readonly AgentStackComponent[],\n): Promise<AgentStackReadiness> => {\n const capabilities = Object.fromEntries(\n PRODUCTION_AGENT_CAPABILITIES.map((capability) => [capability, false]),\n ) as Record<ProductionAgentCapability, boolean>;\n for (const component of components) {\n if ((await component.productionReady?.()) === false) continue;\n capabilities[component.capability] = true;\n }\n const missing = PRODUCTION_AGENT_CAPABILITIES.filter(\n (capability) => !capabilities[capability],\n );\n\n return { capabilities, missing, ready: missing.length === 0 };\n};\n\nexport const defineAgentStack = <\n const Components extends readonly AgentStackComponent[],\n>(\n components: Components,\n): AgentStack<Components> => {\n const names = new Set<string>();\n for (const component of components) {\n if (names.has(component.name)) {\n throw new Error(`Duplicate agent stack component: ${component.name}`);\n }\n names.add(component.name);\n }\n\n return {\n components,\n get: (name) => {\n const component = components.find((candidate) => candidate.name === name);\n if (component === undefined) {\n throw new Error(`Unknown agent stack component: ${String(name)}`);\n }\n\n return component.instance as Extract<\n Components[number],\n { name: typeof name }\n >[\"instance\"];\n },\n readiness: () => readinessOf(components),\n };\n};\n\nexport const assertProductionReady = async (\n stack: Pick<AgentStack<readonly AgentStackComponent[]>, \"readiness\">,\n) => {\n const readiness = await stack.readiness();\n if (!readiness.ready) {\n throw new Error(\n `Agent stack is missing production capabilities: ${readiness.missing.join(\", \")}`,\n );\n }\n\n return readiness;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;AAAO,IAAM,uBAAuB;AAAA,EAClC,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BA,IAAM,cAAc,OAClB,eACiC;AAAA,EACjC,MAAM,eAAe,OAAO,YAC1B,8BAA8B,IAAI,CAAC,eAAe,CAAC,YAAY,KAAK,CAAC,CACvE;AAAA,EACA,WAAW,aAAa,YAAY;AAAA,IAClC,IAAK,MAAM,UAAU,kBAAkB,MAAO;AAAA,MAAO;AAAA,IACrD,aAAa,UAAU,cAAc;AAAA,EACvC;AAAA,EACA,MAAM,UAAU,8BAA8B,OAC5C,CAAC,eAAe,CAAC,aAAa,WAChC;AAAA,EAEA,OAAO,EAAE,cAAc,SAAS,OAAO,QAAQ,WAAW,EAAE;AAAA;AAGvD,IAAM,mBAAmB,CAG9B,eAC2B;AAAA,EAC3B,MAAM,QAAQ,IAAI;AAAA,EAClB,WAAW,aAAa,YAAY;AAAA,IAClC,IAAI,MAAM,IAAI,UAAU,IAAI,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,oCAAoC,UAAU,MAAM;AAAA,IACtE;AAAA,IACA,MAAM,IAAI,UAAU,IAAI;AAAA,EAC1B;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA,KAAK,CAAC,SAAS;AAAA,MACb,MAAM,YAAY,WAAW,KAAK,CAAC,cAAc,UAAU,SAAS,IAAI;AAAA,MACxE,IAAI,cAAc,WAAW;AAAA,QAC3B,MAAM,IAAI,MAAM,kCAAkC,OAAO,IAAI,GAAG;AAAA,MAClE;AAAA,MAEA,OAAO,UAAU;AAAA;AAAA,IAKnB,WAAW,MAAM,YAAY,UAAU;AAAA,EACzC;AAAA;AAGK,IAAM,wBAAwB,OACnC,UACG;AAAA,EACH,MAAM,YAAY,MAAM,MAAM,UAAU;AAAA,EACxC,IAAI,CAAC,UAAU,OAAO;AAAA,IACpB,MAAM,IAAI,MACR,mDAAmD,UAAU,QAAQ,KAAK,IAAI,GAChF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;AAAO,IAAM,uBAAuB;AAAA,EAClC,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BA,IAAM,cAAc,OAClB,eACiC;AAAA,EACjC,MAAM,eAAe,OAAO,YAC1B,8BAA8B,IAAI,CAAC,eAAe,CAAC,YAAY,KAAK,CAAC,CACvE;AAAA,EACA,WAAW,aAAa,YAAY;AAAA,IAClC,IAAK,MAAM,UAAU,kBAAkB,MAAO;AAAA,MAAO;AAAA,IACrD,aAAa,UAAU,cAAc;AAAA,EACvC;AAAA,EACA,MAAM,UAAU,8BAA8B,OAC5C,CAAC,eAAe,CAAC,aAAa,WAChC;AAAA,EAEA,OAAO,EAAE,cAAc,SAAS,OAAO,QAAQ,WAAW,EAAE;AAAA;AAGvD,IAAM,mBAAmB,CAG9B,eAC2B;AAAA,EAC3B,MAAM,QAAQ,IAAI;AAAA,EAClB,WAAW,aAAa,YAAY;AAAA,IAClC,IAAI,MAAM,IAAI,UAAU,IAAI,GAAG;AAAA,MAC7B,MAAM,IAAI,MAAM,oCAAoC,UAAU,MAAM;AAAA,IACtE;AAAA,IACA,MAAM,IAAI,UAAU,IAAI;AAAA,EAC1B;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA,KAAK,CAAC,SAAS;AAAA,MACb,MAAM,YAAY,WAAW,KAAK,CAAC,cAAc,UAAU,SAAS,IAAI;AAAA,MACxE,IAAI,cAAc,WAAW;AAAA,QAC3B,MAAM,IAAI,MAAM,kCAAkC,OAAO,IAAI,GAAG;AAAA,MAClE;AAAA,MAEA,OAAO,UAAU;AAAA;AAAA,IAKnB,WAAW,MAAM,YAAY,UAAU;AAAA,EACzC;AAAA;AAGK,IAAM,wBAAwB,OACnC,UACG;AAAA,EACH,MAAM,YAAY,MAAM,MAAM,UAAU;AAAA,EACxC,IAAI,CAAC,UAAU,OAAO;AAAA,IACpB,MAAM,IAAI,MACR,mDAAmD,UAAU,QAAQ,KAAK,IAAI,GAChF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;",
|
|
8
|
+
"debugId": "7D0FD7A8890B50CE64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/manifest.js
CHANGED
|
@@ -10,7 +10,8 @@ var manifest = defineManifest()({
|
|
|
10
10
|
intents: [
|
|
11
11
|
"build an agent-first application",
|
|
12
12
|
"audit an agent stack",
|
|
13
|
-
"compose agent infrastructure"
|
|
13
|
+
"compose agent infrastructure",
|
|
14
|
+
"orchestrate a durable agent purchase"
|
|
14
15
|
],
|
|
15
16
|
keywords: [
|
|
16
17
|
"agents",
|
|
@@ -18,7 +19,8 @@ var manifest = defineManifest()({
|
|
|
18
19
|
"identity",
|
|
19
20
|
"orchestration",
|
|
20
21
|
"security",
|
|
21
|
-
"interoperability"
|
|
22
|
+
"interoperability",
|
|
23
|
+
"commerce"
|
|
22
24
|
],
|
|
23
25
|
protocols: ["OAuth 2.0", "MCP", "A2A 1.0", "Arazzo 1.1", "WebMCP"]
|
|
24
26
|
},
|
|
@@ -77,5 +79,5 @@ export {
|
|
|
77
79
|
manifest
|
|
78
80
|
};
|
|
79
81
|
|
|
80
|
-
//# debugId=
|
|
82
|
+
//# debugId=419D832CDDB84C0964756E2164756E21
|
|
81
83
|
//# sourceMappingURL=manifest.js.map
|
package/dist/manifest.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/manifest.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { defineManifest, toolFactory } from \"@absolutejs/manifest\";\nimport { Type } from \"@sinclair/typebox\";\n\nconst tool = toolFactory<never>();\n\nexport const manifest = defineManifest<Record<string, never>, never>()({\n contract: 2,\n discovery: {\n audiences: [\"agent-hosts\", \"application-developers\"],\n intents: [\n \"build an agent-first application\",\n \"audit an agent stack\",\n \"compose agent infrastructure\",\n ],\n keywords: [\n \"agents\",\n \"absolutejs\",\n \"identity\",\n \"orchestration\",\n \"security\",\n \"interoperability\",\n ],\n protocols: [\"OAuth 2.0\", \"MCP\", \"A2A 1.0\", \"Arazzo 1.1\", \"WebMCP\"],\n },\n identity: {\n accent: \"#111827\",\n category: \"ai\",\n description:\n \"The discoverable production agent stack for AbsoluteJS: auth.md identity and delegation, policy-gated actions, certified tenant-scoped effect adapters, durable execution, sandboxing, trust, memory, triggers, MCP, A2A, Arazzo, WebMCP, spend controls, operations, and conformance.\",\n docsUrl: \"https://github.com/absolutejs/agent\",\n name: \"@absolutejs/agent\",\n tagline: \"Build agents that can safely act, persist, pay, and be found.\",\n },\n settings: Type.Object({}),\n tools: {\n inspect_agent_stack: tool.workspace({\n annotations: { readOnlyHint: true },\n capabilities: [\"read\", \"glob\"],\n description:\n \"Inspect an AbsoluteJS project for the production agent stack and report missing safety or discoverability packages.\",\n input: Type.Object({}),\n handler: async (_input, workspace) => {\n const packageFiles = (await workspace.glob?.(\"**/package.json\")) ?? [];\n const packageFile = packageFiles.find(\n (file) => !file.includes(\"node_modules\"),\n );\n if (packageFile === undefined) return \"No package.json found.\";\n const source = (await workspace.read(packageFile)) ?? \"\";\n if (source.includes('\"@absolutejs/agent\"')) {\n return \"The @absolutejs/agent production stack is installed.\";\n }\n const expected = [\n \"@absolutejs/auth\",\n \"@absolutejs/agency\",\n \"@absolutejs/agent-runtime\",\n \"@absolutejs/agent-sandbox\",\n \"@absolutejs/agent-trust\",\n \"@absolutejs/agent-discovery\",\n \"@absolutejs/agent-conformance\",\n ];\n const missing = expected.filter((name) => !source.includes(name));\n\n return missing.length === 0\n ? \"Core production agent packages are present.\"\n : `Missing production agent packages: ${missing.join(\", \")}`;\n },\n }),\n },\n wiring: [\n {\n description:\n \"Import the typed stack composer and add each production capability explicitly.\",\n id: \"default\",\n server: {\n code: \"defineAgentStack([])\",\n imports: [{ from: \"@absolutejs/agent\", names: [\"defineAgentStack\"] }],\n placement: \"module-scope\",\n },\n title: \"Production agent stack\",\n },\n ],\n});\n"
|
|
5
|
+
"import { defineManifest, toolFactory } from \"@absolutejs/manifest\";\nimport { Type } from \"@sinclair/typebox\";\n\nconst tool = toolFactory<never>();\n\nexport const manifest = defineManifest<Record<string, never>, never>()({\n contract: 2,\n discovery: {\n audiences: [\"agent-hosts\", \"application-developers\"],\n intents: [\n \"build an agent-first application\",\n \"audit an agent stack\",\n \"compose agent infrastructure\",\n \"orchestrate a durable agent purchase\",\n ],\n keywords: [\n \"agents\",\n \"absolutejs\",\n \"identity\",\n \"orchestration\",\n \"security\",\n \"interoperability\",\n \"commerce\",\n ],\n protocols: [\"OAuth 2.0\", \"MCP\", \"A2A 1.0\", \"Arazzo 1.1\", \"WebMCP\"],\n },\n identity: {\n accent: \"#111827\",\n category: \"ai\",\n description:\n \"The discoverable production agent stack for AbsoluteJS: auth.md identity and delegation, policy-gated actions, certified tenant-scoped effect adapters, durable execution, sandboxing, trust, memory, triggers, MCP, A2A, Arazzo, WebMCP, spend controls, operations, and conformance.\",\n docsUrl: \"https://github.com/absolutejs/agent\",\n name: \"@absolutejs/agent\",\n tagline: \"Build agents that can safely act, persist, pay, and be found.\",\n },\n settings: Type.Object({}),\n tools: {\n inspect_agent_stack: tool.workspace({\n annotations: { readOnlyHint: true },\n capabilities: [\"read\", \"glob\"],\n description:\n \"Inspect an AbsoluteJS project for the production agent stack and report missing safety or discoverability packages.\",\n input: Type.Object({}),\n handler: async (_input, workspace) => {\n const packageFiles = (await workspace.glob?.(\"**/package.json\")) ?? [];\n const packageFile = packageFiles.find(\n (file) => !file.includes(\"node_modules\"),\n );\n if (packageFile === undefined) return \"No package.json found.\";\n const source = (await workspace.read(packageFile)) ?? \"\";\n if (source.includes('\"@absolutejs/agent\"')) {\n return \"The @absolutejs/agent production stack is installed.\";\n }\n const expected = [\n \"@absolutejs/auth\",\n \"@absolutejs/agency\",\n \"@absolutejs/agent-runtime\",\n \"@absolutejs/agent-sandbox\",\n \"@absolutejs/agent-trust\",\n \"@absolutejs/agent-discovery\",\n \"@absolutejs/agent-conformance\",\n ];\n const missing = expected.filter((name) => !source.includes(name));\n\n return missing.length === 0\n ? \"Core production agent packages are present.\"\n : `Missing production agent packages: ${missing.join(\", \")}`;\n },\n }),\n },\n wiring: [\n {\n description:\n \"Import the typed stack composer and add each production capability explicitly.\",\n id: \"default\",\n server: {\n code: \"defineAgentStack([])\",\n imports: [{ from: \"@absolutejs/agent\", names: [\"defineAgentStack\"] }],\n placement: \"module-scope\",\n },\n title: \"Production agent stack\",\n },\n ],\n});\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;AAAA;AACA;AAEA,IAAM,OAAO,YAAmB;AAEzB,IAAM,WAAW,eAA6C,EAAE;AAAA,EACrE,UAAU;AAAA,EACV,WAAW;AAAA,IACT,WAAW,CAAC,eAAe,wBAAwB;AAAA,IACnD,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,WAAW,CAAC,aAAa,OAAO,WAAW,cAAc,QAAQ;AAAA,EACnE;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aACE;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,UAAU,KAAK,OAAO,CAAC,CAAC;AAAA,EACxB,OAAO;AAAA,IACL,qBAAqB,KAAK,UAAU;AAAA,MAClC,aAAa,EAAE,cAAc,KAAK;AAAA,MAClC,cAAc,CAAC,QAAQ,MAAM;AAAA,MAC7B,aACE;AAAA,MACF,OAAO,KAAK,OAAO,CAAC,CAAC;AAAA,MACrB,SAAS,OAAO,QAAQ,cAAc;AAAA,QACpC,MAAM,eAAgB,MAAM,UAAU,OAAO,iBAAiB,KAAM,CAAC;AAAA,QACrE,MAAM,cAAc,aAAa,KAC/B,CAAC,SAAS,CAAC,KAAK,SAAS,cAAc,CACzC;AAAA,QACA,IAAI,gBAAgB;AAAA,UAAW,OAAO;AAAA,QACtC,MAAM,SAAU,MAAM,UAAU,KAAK,WAAW,KAAM;AAAA,QACtD,IAAI,OAAO,SAAS,qBAAqB,GAAG;AAAA,UAC1C,OAAO;AAAA,QACT;AAAA,QACA,MAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAM,UAAU,SAAS,OAAO,CAAC,SAAS,CAAC,OAAO,SAAS,IAAI,CAAC;AAAA,QAEhE,OAAO,QAAQ,WAAW,IACtB,gDACA,sCAAsC,QAAQ,KAAK,IAAI;AAAA;AAAA,IAE/D,CAAC;AAAA,EACH;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,MACE,aACE;AAAA,MACF,IAAI;AAAA,MACJ,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,MAAM,qBAAqB,OAAO,CAAC,kBAAkB,EAAE,CAAC;AAAA,QACpE,WAAW;AAAA,MACb;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;AAAA;AACA;AAEA,IAAM,OAAO,YAAmB;AAEzB,IAAM,WAAW,eAA6C,EAAE;AAAA,EACrE,UAAU;AAAA,EACV,WAAW;AAAA,IACT,WAAW,CAAC,eAAe,wBAAwB;AAAA,IACnD,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,WAAW,CAAC,aAAa,OAAO,WAAW,cAAc,QAAQ;AAAA,EACnE;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aACE;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,UAAU,KAAK,OAAO,CAAC,CAAC;AAAA,EACxB,OAAO;AAAA,IACL,qBAAqB,KAAK,UAAU;AAAA,MAClC,aAAa,EAAE,cAAc,KAAK;AAAA,MAClC,cAAc,CAAC,QAAQ,MAAM;AAAA,MAC7B,aACE;AAAA,MACF,OAAO,KAAK,OAAO,CAAC,CAAC;AAAA,MACrB,SAAS,OAAO,QAAQ,cAAc;AAAA,QACpC,MAAM,eAAgB,MAAM,UAAU,OAAO,iBAAiB,KAAM,CAAC;AAAA,QACrE,MAAM,cAAc,aAAa,KAC/B,CAAC,SAAS,CAAC,KAAK,SAAS,cAAc,CACzC;AAAA,QACA,IAAI,gBAAgB;AAAA,UAAW,OAAO;AAAA,QACtC,MAAM,SAAU,MAAM,UAAU,KAAK,WAAW,KAAM;AAAA,QACtD,IAAI,OAAO,SAAS,qBAAqB,GAAG;AAAA,UAC1C,OAAO;AAAA,QACT;AAAA,QACA,MAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAM,UAAU,SAAS,OAAO,CAAC,SAAS,CAAC,OAAO,SAAS,IAAI,CAAC;AAAA,QAEhE,OAAO,QAAQ,WAAW,IACtB,gDACA,sCAAsC,QAAQ,KAAK,IAAI;AAAA;AAAA,IAE/D,CAAC;AAAA,EACH;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,MACE,aACE;AAAA,MACF,IAAI;AAAA,MACJ,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,MAAM,qBAAqB,OAAO,CAAC,kBAAkB,EAAE,CAAC;AAAA,QACpE,WAAW;AAAA,MACb;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;",
|
|
8
|
+
"debugId": "419D832CDDB84C0964756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/manifest.json
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"intents": [
|
|
9
9
|
"build an agent-first application",
|
|
10
10
|
"audit an agent stack",
|
|
11
|
-
"compose agent infrastructure"
|
|
11
|
+
"compose agent infrastructure",
|
|
12
|
+
"orchestrate a durable agent purchase"
|
|
12
13
|
],
|
|
13
14
|
"keywords": [
|
|
14
15
|
"agents",
|
|
@@ -16,7 +17,8 @@
|
|
|
16
17
|
"identity",
|
|
17
18
|
"orchestration",
|
|
18
19
|
"security",
|
|
19
|
-
"interoperability"
|
|
20
|
+
"interoperability",
|
|
21
|
+
"commerce"
|
|
20
22
|
],
|
|
21
23
|
"protocols": [
|
|
22
24
|
"OAuth 2.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@absolutejs/agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "The production-grade, provider-neutral agent stack for AbsoluteJS: auth, actions, runtime, sandboxing, trust, memory, inbox, discovery, MCP, A2A, policy, wallet limits, controls, and conformance.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,6 +47,11 @@
|
|
|
47
47
|
"import": "./dist/conformance.js",
|
|
48
48
|
"default": "./dist/conformance.js"
|
|
49
49
|
},
|
|
50
|
+
"./commerce": {
|
|
51
|
+
"types": "./dist/commerce.d.ts",
|
|
52
|
+
"import": "./dist/commerce.js",
|
|
53
|
+
"default": "./dist/commerce.js"
|
|
54
|
+
},
|
|
50
55
|
"./control": {
|
|
51
56
|
"types": "./dist/control.d.ts",
|
|
52
57
|
"import": "./dist/control.js",
|
|
@@ -143,11 +148,11 @@
|
|
|
143
148
|
"@absolutejs/agent-trust": "^0.2.0",
|
|
144
149
|
"@absolutejs/arazzo": "^0.1.2",
|
|
145
150
|
"@absolutejs/auth": "^0.56.14",
|
|
146
|
-
"@absolutejs/execution": "^0.
|
|
151
|
+
"@absolutejs/execution": "^0.14.0",
|
|
147
152
|
"@absolutejs/manifest": "^0.3.0",
|
|
148
153
|
"@absolutejs/mcp": "^0.11.0",
|
|
149
154
|
"@absolutejs/policy": "^0.2.0",
|
|
150
|
-
"@absolutejs/wallet": "^0.8.
|
|
155
|
+
"@absolutejs/wallet": "^0.8.3",
|
|
151
156
|
"@absolutejs/webmcp": "^0.1.3",
|
|
152
157
|
"@sinclair/typebox": "^0.34.0"
|
|
153
158
|
},
|