@avow-finance/sdk 0.0.0-stage → 0.2.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/LICENSE +201 -0
- package/README.md +122 -2
- package/dist/agent-entry.d.ts +15 -0
- package/dist/agent-entry.d.ts.map +1 -0
- package/dist/agent-entry.js +11 -0
- package/dist/agent-entry.js.map +1 -0
- package/dist/agent-key.d.ts +34 -0
- package/dist/agent-key.d.ts.map +1 -0
- package/dist/agent-key.js +33 -0
- package/dist/agent-key.js.map +1 -0
- package/dist/agent.d.ts +261 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +493 -0
- package/dist/agent.js.map +1 -0
- package/dist/avow-api.d.ts +78 -0
- package/dist/avow-api.d.ts.map +1 -0
- package/dist/avow-api.js +2 -0
- package/dist/avow-api.js.map +1 -0
- package/dist/contest.d.ts +135 -0
- package/dist/contest.d.ts.map +1 -0
- package/dist/contest.js +186 -0
- package/dist/contest.js.map +1 -0
- package/dist/http.d.ts +161 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +311 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/job/accept.d.ts +84 -0
- package/dist/job/accept.d.ts.map +1 -0
- package/dist/job/accept.js +136 -0
- package/dist/job/accept.js.map +1 -0
- package/dist/job/customer.d.ts +43 -0
- package/dist/job/customer.d.ts.map +1 -0
- package/dist/job/customer.js +83 -0
- package/dist/job/customer.js.map +1 -0
- package/dist/job/quote.d.ts +34 -0
- package/dist/job/quote.d.ts.map +1 -0
- package/dist/job/quote.js +37 -0
- package/dist/job/quote.js.map +1 -0
- package/dist/lock.d.ts +269 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +283 -0
- package/dist/lock.js.map +1 -0
- package/dist/moderato.d.ts +27 -0
- package/dist/moderato.d.ts.map +1 -0
- package/dist/moderato.js +34 -0
- package/dist/moderato.js.map +1 -0
- package/dist/node/cli.d.ts +3 -0
- package/dist/node/cli.d.ts.map +1 -0
- package/dist/node/cli.js +346 -0
- package/dist/node/cli.js.map +1 -0
- package/dist/node/connect.d.ts +15 -0
- package/dist/node/connect.d.ts.map +1 -0
- package/dist/node/connect.js +91 -0
- package/dist/node/connect.js.map +1 -0
- package/dist/node/eval.d.ts +3 -0
- package/dist/node/eval.d.ts.map +1 -0
- package/dist/node/eval.js +67 -0
- package/dist/node/eval.js.map +1 -0
- package/dist/node/first-run.d.ts +50 -0
- package/dist/node/first-run.d.ts.map +1 -0
- package/dist/node/first-run.js +149 -0
- package/dist/node/first-run.js.map +1 -0
- package/dist/node/job.d.ts +50 -0
- package/dist/node/job.d.ts.map +1 -0
- package/dist/node/job.js +176 -0
- package/dist/node/job.js.map +1 -0
- package/dist/node/mailbox.d.ts +19 -0
- package/dist/node/mailbox.d.ts.map +1 -0
- package/dist/node/mailbox.js +81 -0
- package/dist/node/mailbox.js.map +1 -0
- package/dist/node/mcp.d.ts +74 -0
- package/dist/node/mcp.d.ts.map +1 -0
- package/dist/node/mcp.js +367 -0
- package/dist/node/mcp.js.map +1 -0
- package/dist/node/platform.d.ts +35 -0
- package/dist/node/platform.d.ts.map +1 -0
- package/dist/node/platform.js +102 -0
- package/dist/node/platform.js.map +1 -0
- package/dist/node/runner-session.d.ts +41 -0
- package/dist/node/runner-session.d.ts.map +1 -0
- package/dist/node/runner-session.js +100 -0
- package/dist/node/runner-session.js.map +1 -0
- package/dist/node/runner.d.ts +63 -0
- package/dist/node/runner.d.ts.map +1 -0
- package/dist/node/runner.js +341 -0
- package/dist/node/runner.js.map +1 -0
- package/dist/node/service-child.d.ts +2 -0
- package/dist/node/service-child.d.ts.map +1 -0
- package/dist/node/service-child.js +40 -0
- package/dist/node/service-child.js.map +1 -0
- package/dist/node/service-excerpt.d.ts +21 -0
- package/dist/node/service-excerpt.d.ts.map +1 -0
- package/dist/node/service-excerpt.js +32 -0
- package/dist/node/service-excerpt.js.map +1 -0
- package/dist/node/service-process.d.ts +12 -0
- package/dist/node/service-process.d.ts.map +1 -0
- package/dist/node/service-process.js +132 -0
- package/dist/node/service-process.js.map +1 -0
- package/dist/node/session-input.d.ts +12 -0
- package/dist/node/session-input.d.ts.map +1 -0
- package/dist/node/session-input.js +42 -0
- package/dist/node/session-input.js.map +1 -0
- package/dist/node/session-view.d.ts +20 -0
- package/dist/node/session-view.d.ts.map +1 -0
- package/dist/node/session-view.js +198 -0
- package/dist/node/session-view.js.map +1 -0
- package/dist/node-agent.d.ts +2 -0
- package/dist/node-agent.d.ts.map +1 -0
- package/dist/node-agent.js +6 -0
- package/dist/node-agent.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +9 -0
- package/dist/node.js.map +1 -0
- package/dist/sandbox/agent.d.ts +187 -0
- package/dist/sandbox/agent.d.ts.map +1 -0
- package/dist/sandbox/agent.js +468 -0
- package/dist/sandbox/agent.js.map +1 -0
- package/dist/sandbox/business-store.d.ts +19 -0
- package/dist/sandbox/business-store.d.ts.map +1 -0
- package/dist/sandbox/business-store.js +19 -0
- package/dist/sandbox/business-store.js.map +1 -0
- package/dist/sandbox/business.d.ts +70 -0
- package/dist/sandbox/business.d.ts.map +1 -0
- package/dist/sandbox/business.js +115 -0
- package/dist/sandbox/business.js.map +1 -0
- package/dist/sandbox/connect.d.ts +64 -0
- package/dist/sandbox/connect.d.ts.map +1 -0
- package/dist/sandbox/connect.js +182 -0
- package/dist/sandbox/connect.js.map +1 -0
- package/dist/sandbox/deployment.d.ts +14 -0
- package/dist/sandbox/deployment.d.ts.map +1 -0
- package/dist/sandbox/deployment.js +38 -0
- package/dist/sandbox/deployment.js.map +1 -0
- package/dist/sandbox/keys.d.ts +45 -0
- package/dist/sandbox/keys.d.ts.map +1 -0
- package/dist/sandbox/keys.js +132 -0
- package/dist/sandbox/keys.js.map +1 -0
- package/dist/sandbox/mailbox.d.ts +90 -0
- package/dist/sandbox/mailbox.d.ts.map +1 -0
- package/dist/sandbox/mailbox.js +400 -0
- package/dist/sandbox/mailbox.js.map +1 -0
- package/dist/sandbox/mandate.d.ts +84 -0
- package/dist/sandbox/mandate.d.ts.map +1 -0
- package/dist/sandbox/mandate.js +107 -0
- package/dist/sandbox/mandate.js.map +1 -0
- package/dist/sandbox/namespace.d.ts +16 -0
- package/dist/sandbox/namespace.d.ts.map +1 -0
- package/dist/sandbox/namespace.js +16 -0
- package/dist/sandbox/namespace.js.map +1 -0
- package/dist/sandbox/session.d.ts +60 -0
- package/dist/sandbox/session.d.ts.map +1 -0
- package/dist/sandbox/session.js +94 -0
- package/dist/sandbox/session.js.map +1 -0
- package/dist/sandbox/setup.d.ts +136 -0
- package/dist/sandbox/setup.d.ts.map +1 -0
- package/dist/sandbox/setup.js +490 -0
- package/dist/sandbox/setup.js.map +1 -0
- package/dist/sandbox/store.d.ts +69 -0
- package/dist/sandbox/store.d.ts.map +1 -0
- package/dist/sandbox/store.js +115 -0
- package/dist/sandbox/store.js.map +1 -0
- package/dist/sandbox/supplier-key.d.ts +73 -0
- package/dist/sandbox/supplier-key.d.ts.map +1 -0
- package/dist/sandbox/supplier-key.js +180 -0
- package/dist/sandbox/supplier-key.js.map +1 -0
- package/dist/sandbox/suppliers.d.ts +7 -0
- package/dist/sandbox/suppliers.d.ts.map +1 -0
- package/dist/sandbox/suppliers.js +29 -0
- package/dist/sandbox/suppliers.js.map +1 -0
- package/dist/sandbox/terms.d.ts +32 -0
- package/dist/sandbox/terms.d.ts.map +1 -0
- package/dist/sandbox/terms.js +58 -0
- package/dist/sandbox/terms.js.map +1 -0
- package/dist/sandbox/vault.d.ts +24 -0
- package/dist/sandbox/vault.d.ts.map +1 -0
- package/dist/sandbox/vault.js +54 -0
- package/dist/sandbox/vault.js.map +1 -0
- package/dist/send.d.ts +122 -0
- package/dist/send.d.ts.map +1 -0
- package/dist/send.js +328 -0
- package/dist/send.js.map +1 -0
- package/dist/service-entry.d.ts +6 -0
- package/dist/service-entry.d.ts.map +1 -0
- package/dist/service-entry.js +6 -0
- package/dist/service-entry.js.map +1 -0
- package/dist/session/anthropic.d.ts +17 -0
- package/dist/session/anthropic.d.ts.map +1 -0
- package/dist/session/anthropic.js +215 -0
- package/dist/session/anthropic.js.map +1 -0
- package/dist/session/charge.d.ts +13 -0
- package/dist/session/charge.d.ts.map +1 -0
- package/dist/session/charge.js +33 -0
- package/dist/session/charge.js.map +1 -0
- package/dist/session/data.d.ts +8 -0
- package/dist/session/data.d.ts.map +1 -0
- package/dist/session/data.js +20 -0
- package/dist/session/data.js.map +1 -0
- package/dist/session/eval.d.ts +41 -0
- package/dist/session/eval.d.ts.map +1 -0
- package/dist/session/eval.js +281 -0
- package/dist/session/eval.js.map +1 -0
- package/dist/session/executor.d.ts +80 -0
- package/dist/session/executor.d.ts.map +1 -0
- package/dist/session/executor.js +381 -0
- package/dist/session/executor.js.map +1 -0
- package/dist/session/fixture-world.d.ts +29 -0
- package/dist/session/fixture-world.d.ts.map +1 -0
- package/dist/session/fixture-world.js +708 -0
- package/dist/session/fixture-world.js.map +1 -0
- package/dist/session/live-world.d.ts +22 -0
- package/dist/session/live-world.d.ts.map +1 -0
- package/dist/session/live-world.js +329 -0
- package/dist/session/live-world.js.map +1 -0
- package/dist/session/ollama.d.ts +29 -0
- package/dist/session/ollama.d.ts.map +1 -0
- package/dist/session/ollama.js +177 -0
- package/dist/session/ollama.js.map +1 -0
- package/dist/session/provider.d.ts +79 -0
- package/dist/session/provider.d.ts.map +1 -0
- package/dist/session/provider.js +19 -0
- package/dist/session/provider.js.map +1 -0
- package/dist/session/scripted.d.ts +45 -0
- package/dist/session/scripted.d.ts.map +1 -0
- package/dist/session/scripted.js +236 -0
- package/dist/session/scripted.js.map +1 -0
- package/dist/session/selection.d.ts +37 -0
- package/dist/session/selection.d.ts.map +1 -0
- package/dist/session/selection.js +104 -0
- package/dist/session/selection.js.map +1 -0
- package/dist/session/service-check.d.ts +48 -0
- package/dist/session/service-check.d.ts.map +1 -0
- package/dist/session/service-check.js +86 -0
- package/dist/session/service-check.js.map +1 -0
- package/dist/session/service.d.ts +128 -0
- package/dist/session/service.d.ts.map +1 -0
- package/dist/session/service.js +150 -0
- package/dist/session/service.js.map +1 -0
- package/dist/session/session.d.ts +95 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +312 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/toolbox.d.ts +69 -0
- package/dist/session/toolbox.d.ts.map +1 -0
- package/dist/session/toolbox.js +391 -0
- package/dist/session/toolbox.js.map +1 -0
- package/dist/session/tools.d.ts +45 -0
- package/dist/session/tools.d.ts.map +1 -0
- package/dist/session/tools.js +137 -0
- package/dist/session/tools.js.map +1 -0
- package/dist/session/world.d.ts +188 -0
- package/dist/session/world.d.ts.map +1 -0
- package/dist/session/world.js +2 -0
- package/dist/session/world.js.map +1 -0
- package/dist/sign.d.ts +19 -0
- package/dist/sign.d.ts.map +1 -0
- package/dist/sign.js +33 -0
- package/dist/sign.js.map +1 -0
- package/dist/supplier.d.ts +41 -0
- package/dist/supplier.d.ts.map +1 -0
- package/dist/supplier.js +57 -0
- package/dist/supplier.js.map +1 -0
- package/package.json +56 -3
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { computeOfferCost, formatUsd, isFirmOffer, offerSeconds, offerTakes, refusalSentence, } from '@avow-finance/spec';
|
|
2
|
+
import { verifyUrl } from '../sandbox/session.js';
|
|
3
|
+
import { readToolInput } from './tools.js';
|
|
4
|
+
export function newSessionState() {
|
|
5
|
+
return { order: null, listing: null, bookings: new Map(), quotes: new Map(), recorded: [] };
|
|
6
|
+
}
|
|
7
|
+
const json = (value) => JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? v.toString() : v));
|
|
8
|
+
const iso = (unix) => new Date(Number(unix) * 1000).toISOString().replace('.000Z', 'Z');
|
|
9
|
+
/** A time said against the job's start, so a model never has to subtract timestamps. */
|
|
10
|
+
function againstStart(unix, order) {
|
|
11
|
+
if (!order)
|
|
12
|
+
return iso(unix);
|
|
13
|
+
const start = order.terms.subject.startsAt;
|
|
14
|
+
const minutes = Number((unix - start) / 60n);
|
|
15
|
+
if (minutes === 0)
|
|
16
|
+
return `${iso(unix)}, when the job starts`;
|
|
17
|
+
return `${iso(unix)}, ${Math.abs(minutes)} min ${minutes < 0 ? 'before' : 'after'} the job starts`;
|
|
18
|
+
}
|
|
19
|
+
/** An offer as the model reads it. */
|
|
20
|
+
function offerView(o, listedAt, order) {
|
|
21
|
+
const windowEnd = o.startsAt + offerSeconds(o);
|
|
22
|
+
return {
|
|
23
|
+
id: o.id,
|
|
24
|
+
gpu: o.gpu,
|
|
25
|
+
region: o.region,
|
|
26
|
+
gpusPerBooking: o.gpus.min === o.gpus.max ? `exactly ${o.gpus.min}` : `${o.gpus.min} to ${o.gpus.max}`,
|
|
27
|
+
windowStarts: againstStart(o.startsAt, order),
|
|
28
|
+
windowEnds: againstStart(windowEnd, order),
|
|
29
|
+
pricePerGpuHour: formatUsd(o.pricePerGpuHour),
|
|
30
|
+
reservePerGpu: formatUsd(o.reservePerGpu),
|
|
31
|
+
freeCancellation: isFirmOffer(o, listedAt)
|
|
32
|
+
? 'none, firm: it had ended when the offer was listed'
|
|
33
|
+
: `until ${againstStart(o.freeCancelBy, order)}`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export class Toolbox {
|
|
37
|
+
world;
|
|
38
|
+
policy;
|
|
39
|
+
emit;
|
|
40
|
+
state;
|
|
41
|
+
beforeBooking;
|
|
42
|
+
#nextBooking = 1;
|
|
43
|
+
constructor(world, policy, emit, state,
|
|
44
|
+
/** Reads service.ts again before a booking, so an edit made mid-turn applies to it. */
|
|
45
|
+
beforeBooking = async () => { }) {
|
|
46
|
+
this.world = world;
|
|
47
|
+
this.policy = policy;
|
|
48
|
+
this.emit = emit;
|
|
49
|
+
this.state = state;
|
|
50
|
+
this.beforeBooking = beforeBooking;
|
|
51
|
+
}
|
|
52
|
+
/** Runs one tool call the model made, and gives the model what it returned. */
|
|
53
|
+
async run(tool, input, ctx) {
|
|
54
|
+
const read = readToolInput(tool, input);
|
|
55
|
+
const base = {
|
|
56
|
+
run: ctx.run,
|
|
57
|
+
source: 'session',
|
|
58
|
+
orderId: ctx.orderId,
|
|
59
|
+
type: 'tool_call',
|
|
60
|
+
call: ctx.call,
|
|
61
|
+
summary: summarizeCall(read, tool),
|
|
62
|
+
};
|
|
63
|
+
// A booking call names its offer and quantity, both null when its input didn't read.
|
|
64
|
+
this.emit(tool !== 'book_compute'
|
|
65
|
+
? { ...base, tool }
|
|
66
|
+
: read?.tool === 'book_compute'
|
|
67
|
+
? { ...base, tool, offer: read.offer, quantity: read.quantity }
|
|
68
|
+
: { ...base, tool, offer: null, quantity: null });
|
|
69
|
+
if (!read)
|
|
70
|
+
return this.#refuse(ctx, tool, 'message.invalid', 'service', 'The input for this tool is not in the form it takes.');
|
|
71
|
+
switch (read.tool) {
|
|
72
|
+
case 'read_order':
|
|
73
|
+
return this.#readOrder(ctx);
|
|
74
|
+
case 'compute_offers':
|
|
75
|
+
return this.#offers(ctx);
|
|
76
|
+
case 'book_compute':
|
|
77
|
+
return this.#book(ctx, read.offer, read.quantity);
|
|
78
|
+
case 'cancel_compute':
|
|
79
|
+
return this.#cancel(ctx, read.booking);
|
|
80
|
+
case 'submit_quote':
|
|
81
|
+
return this.#quote(ctx, read.booking);
|
|
82
|
+
case 'authority':
|
|
83
|
+
return this.#authority(ctx);
|
|
84
|
+
case 'commitments':
|
|
85
|
+
return this.#commitments(ctx);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async #readOrder(ctx) {
|
|
89
|
+
const order = this.state.order;
|
|
90
|
+
if (!order) {
|
|
91
|
+
return this.#refuse(ctx, 'read_order', 'order.unknown', 'service', 'No order has come in yet.');
|
|
92
|
+
}
|
|
93
|
+
const t = order.terms;
|
|
94
|
+
const charges = t.remedies.charges.map((c) => ({
|
|
95
|
+
kind: c.kind === 'lateCancellation' ? 'late cancellation after work starts' : 'no-show',
|
|
96
|
+
cap: formatUsd(c.amount),
|
|
97
|
+
}));
|
|
98
|
+
const content = {
|
|
99
|
+
orderId: order.orderId,
|
|
100
|
+
customer: order.customer.label,
|
|
101
|
+
work: t.subject.work,
|
|
102
|
+
needs: {
|
|
103
|
+
gpu: t.subject.compute.gpu,
|
|
104
|
+
gpus: t.subject.compute.count,
|
|
105
|
+
region: t.subject.compute.region,
|
|
106
|
+
},
|
|
107
|
+
startsAt: iso(t.subject.startsAt),
|
|
108
|
+
deliverBy: againstStart(t.subject.deliverBy, order),
|
|
109
|
+
price: `${formatUsd(t.consideration.kind === 'fixed' ? t.consideration.amount : 0n)}, paid by a transfer on delivery`,
|
|
110
|
+
customerReserveBacks: charges,
|
|
111
|
+
requirement: 'The customer accepts a quote only when it names your accepted compute booking that holds the GPUs from the job start to its deadline and is past its free cancellation when the customer checks it.',
|
|
112
|
+
offerExpires: iso(order.expiry),
|
|
113
|
+
};
|
|
114
|
+
this.#result(ctx, 'read_order', true, `Order ${order.orderId}: ${t.subject.work.kind} on ${t.subject.compute.count} ${t.subject.compute.gpu} for ${content.price.split(',')[0]}`);
|
|
115
|
+
return { ok: true, content: json(content) };
|
|
116
|
+
}
|
|
117
|
+
async #limits() {
|
|
118
|
+
const authority = await this.world.authority();
|
|
119
|
+
const policy = this.policy();
|
|
120
|
+
return {
|
|
121
|
+
authority,
|
|
122
|
+
limits: {
|
|
123
|
+
budgetPerGpuHour: policy.budgetPerGpuHour,
|
|
124
|
+
computeSwitch: policy.computeSwitch,
|
|
125
|
+
capPerCommitment: authority.capPerCommitment,
|
|
126
|
+
capOpenReserves: authority.capOpenReserves,
|
|
127
|
+
openReservesLeft: authority.openReservesLeft,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async #offers(ctx) {
|
|
132
|
+
const order = this.state.order;
|
|
133
|
+
if (!order) {
|
|
134
|
+
return this.#refuse(ctx, 'compute_offers', 'order.unknown', 'service', 'No order has come in, so there is no window to list offers for.');
|
|
135
|
+
}
|
|
136
|
+
const listing = await this.world.offers(order);
|
|
137
|
+
const { limits } = await this.#limits();
|
|
138
|
+
const event = this.#result(ctx, 'compute_offers', true, `${listing.offers.length} offers from ${listing.supplier}`, { listing, limits });
|
|
139
|
+
this.state.listing = { run: ctx.run, call: ctx.call, listing, limits };
|
|
140
|
+
this.state.recorded.push({
|
|
141
|
+
run: ctx.run,
|
|
142
|
+
call: ctx.call,
|
|
143
|
+
tool: 'compute_offers',
|
|
144
|
+
event,
|
|
145
|
+
offer: null,
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
ok: true,
|
|
149
|
+
content: json({
|
|
150
|
+
supplier: listing.supplier,
|
|
151
|
+
offers: listing.offers.map((o) => offerView(o, listing.listedAt, order)),
|
|
152
|
+
limits: {
|
|
153
|
+
computeBudgetPerGpuHour: formatUsd(limits.budgetPerGpuHour),
|
|
154
|
+
computeSwitch: limits.computeSwitch,
|
|
155
|
+
mostForOneCommitment: formatUsd(limits.capPerCommitment),
|
|
156
|
+
mostHeldAtOnce: formatUsd(limits.capOpenReserves),
|
|
157
|
+
leftToHold: formatUsd(limits.openReservesLeft),
|
|
158
|
+
},
|
|
159
|
+
}),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
async #book(ctx, offerId, quantity) {
|
|
163
|
+
const offer = this.state.listing?.listing.offers.find((o) => o.id === offerId);
|
|
164
|
+
if (!offer) {
|
|
165
|
+
return this.#refuse(ctx, 'book_compute', 'service.unknown_offer', 'service', `No offer in the latest listing has the id ${offerId}. Call compute_offers for the current ones.`);
|
|
166
|
+
}
|
|
167
|
+
await this.beforeBooking();
|
|
168
|
+
const policy = this.policy();
|
|
169
|
+
const needed = offerTakes(offer, quantity) ? computeOfferCost(offer, quantity).reserve : 0n;
|
|
170
|
+
if (policy.computeSwitch === 'off') {
|
|
171
|
+
return this.#policyRefusal(ctx, 'service.compute_off', needed);
|
|
172
|
+
}
|
|
173
|
+
if (offer.pricePerGpuHour > policy.budgetPerGpuHour) {
|
|
174
|
+
return this.#policyRefusal(ctx, 'service.over_budget', needed);
|
|
175
|
+
}
|
|
176
|
+
if (!offerTakes(offer, quantity)) {
|
|
177
|
+
return this.#refuse(ctx, 'book_compute', 'service.quantity_unavailable', 'service', `Offer ${offer.id} takes ${offer.gpus.min === offer.gpus.max ? `exactly ${offer.gpus.min}` : `${offer.gpus.min} to ${offer.gpus.max}`} GPUs in one booking.`);
|
|
178
|
+
}
|
|
179
|
+
const outcome = await this.world.book(offer, quantity);
|
|
180
|
+
if (!outcome.ok)
|
|
181
|
+
return this.#bookingRefused(ctx, outcome.code, outcome.layer, outcome.amounts);
|
|
182
|
+
const booking = { ...outcome.booking, id: `b${this.#nextBooking++}` };
|
|
183
|
+
this.state.bookings.set(booking.id, booking);
|
|
184
|
+
const base = { run: ctx.run, source: 'session', orderId: ctx.orderId };
|
|
185
|
+
if (ctx.orderId) {
|
|
186
|
+
this.emit({
|
|
187
|
+
...base,
|
|
188
|
+
orderId: ctx.orderId,
|
|
189
|
+
type: 'job_compute_secured',
|
|
190
|
+
reference: booking.reference,
|
|
191
|
+
supplier: offer.supplier,
|
|
192
|
+
amount: booking.reserve,
|
|
193
|
+
freeCancelBy: booking.read.freeCancelBy,
|
|
194
|
+
releaseDate: booking.read.releaseDate,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
this.emit({
|
|
198
|
+
...base,
|
|
199
|
+
type: 'commitment',
|
|
200
|
+
role: 'compute',
|
|
201
|
+
reference: booking.reference,
|
|
202
|
+
amount: booking.reserve,
|
|
203
|
+
state: booking.read.state,
|
|
204
|
+
verifiedBy: 'service',
|
|
205
|
+
block: booking.read.block,
|
|
206
|
+
transactionHash: booking.reservedIn,
|
|
207
|
+
verification: null,
|
|
208
|
+
});
|
|
209
|
+
const event = this.#result(ctx, 'book_compute', true, `Booked ${quantity} ${offer.gpu} of ${offer.id} as ${booking.id}, reserving ${formatUsd(booking.reserve)}, and ${offer.supplier} accepted`);
|
|
210
|
+
this.state.recorded.push({
|
|
211
|
+
run: ctx.run,
|
|
212
|
+
call: ctx.call,
|
|
213
|
+
tool: 'book_compute',
|
|
214
|
+
event,
|
|
215
|
+
offer: offer.id,
|
|
216
|
+
});
|
|
217
|
+
return {
|
|
218
|
+
ok: true,
|
|
219
|
+
content: json({
|
|
220
|
+
booking: booking.id,
|
|
221
|
+
offer: offer.id,
|
|
222
|
+
gpus: quantity,
|
|
223
|
+
reserve: formatUsd(booking.reserve),
|
|
224
|
+
usagePrice: `${formatUsd(booking.price)} for the window, paid separately`,
|
|
225
|
+
state: `${booking.read.state} by ${offer.supplier}, read at block ${booking.read.block.number}`,
|
|
226
|
+
freeCancellation: booking.read.freeCancelBy <= booking.read.block.timestamp
|
|
227
|
+
? 'ended, so cancelling now costs what its terms charge'
|
|
228
|
+
: `until ${iso(booking.read.freeCancelBy)}`,
|
|
229
|
+
verify: verifyUrl(booking.reference),
|
|
230
|
+
}),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/** A booking the developer's policy refused, which posts a refusal with its amounts. */
|
|
234
|
+
async #policyRefusal(ctx, code, needed) {
|
|
235
|
+
const { authority } = await this.#limits();
|
|
236
|
+
return this.#bookingRefused(ctx, code, 'service', {
|
|
237
|
+
needed,
|
|
238
|
+
left: authority.openReservesLeft,
|
|
239
|
+
authority: authority.capOpenReserves,
|
|
240
|
+
capPerCommitment: authority.capPerCommitment,
|
|
241
|
+
dailyLimit: authority.dailyLimit,
|
|
242
|
+
dailyLeft: authority.dailyLeft,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
#bookingRefused(ctx, code, layer, amounts) {
|
|
246
|
+
this.emit({ run: ctx.run, source: 'session', type: 'refused', code, layer, amounts });
|
|
247
|
+
const sentence = refusalSentence({ code, layer, amounts });
|
|
248
|
+
const event = this.#result(ctx, 'book_compute', false, sentence.split('. ')[0] ?? sentence, null, { code, layer });
|
|
249
|
+
this.state.recorded.push({
|
|
250
|
+
run: ctx.run,
|
|
251
|
+
call: ctx.call,
|
|
252
|
+
tool: 'book_compute',
|
|
253
|
+
event,
|
|
254
|
+
offer: null,
|
|
255
|
+
});
|
|
256
|
+
return { ok: false, content: json({ refused: true, layer, code, sentence, moneyMoved: false }) };
|
|
257
|
+
}
|
|
258
|
+
async #cancel(ctx, bookingId) {
|
|
259
|
+
const booking = this.state.bookings.get(bookingId);
|
|
260
|
+
if (!booking) {
|
|
261
|
+
return this.#refuse(ctx, 'cancel_compute', 'service.unknown_booking', 'service', `No booking this session made has the id ${bookingId}.`);
|
|
262
|
+
}
|
|
263
|
+
const outcome = await this.world.cancel(booking);
|
|
264
|
+
if (!outcome.ok)
|
|
265
|
+
return this.#refuse(ctx, 'cancel_compute', outcome.code, outcome.layer, outcome.why);
|
|
266
|
+
this.#result(ctx, 'cancel_compute', true, `Your business cancelled ${booking.id}`);
|
|
267
|
+
return {
|
|
268
|
+
ok: true,
|
|
269
|
+
content: json({ cancelled: booking.id, transaction: outcome.transactionHash }),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
async #quote(ctx, bookingId) {
|
|
273
|
+
const order = this.state.order;
|
|
274
|
+
if (!order) {
|
|
275
|
+
return this.#refuse(ctx, 'submit_quote', 'order.unknown', 'service', 'No order is open to quote.');
|
|
276
|
+
}
|
|
277
|
+
if (this.state.quotes.has(order.orderId)) {
|
|
278
|
+
return this.#refuse(ctx, 'submit_quote', 'order.out_of_step', 'service', `Order ${order.orderId} has been quoted already, and the customer answers after your turn.`);
|
|
279
|
+
}
|
|
280
|
+
const policy = this.policy();
|
|
281
|
+
if (policy.computeSwitch === 'off' && bookingId !== null) {
|
|
282
|
+
return this.#refuse(ctx, 'submit_quote', 'service.compute_off', 'service', 'The compute switch in service.ts is off, so a quote names no booking. Call submit_quote with no booking.');
|
|
283
|
+
}
|
|
284
|
+
if (policy.computeSwitch === 'on' && bookingId === null) {
|
|
285
|
+
return this.#refuse(ctx, 'submit_quote', 'service.booking_required', 'service', 'service.ts books compute for every quote while its compute switch is on, so name the booking.');
|
|
286
|
+
}
|
|
287
|
+
const booking = bookingId === null ? null : (this.state.bookings.get(bookingId) ?? null);
|
|
288
|
+
if (bookingId !== null && !booking) {
|
|
289
|
+
return this.#refuse(ctx, 'submit_quote', 'service.unknown_booking', 'service', `No booking this session made has the id ${bookingId}.`);
|
|
290
|
+
}
|
|
291
|
+
const outcome = await this.world.quote(order, booking);
|
|
292
|
+
if (!outcome.ok) {
|
|
293
|
+
return this.#refuse(ctx, 'submit_quote', outcome.code, outcome.layer, `The customer refused the quote before checking it.`);
|
|
294
|
+
}
|
|
295
|
+
this.state.quotes.set(order.orderId, { quote: outcome.quote, booking, run: ctx.run });
|
|
296
|
+
const base = { run: ctx.run, source: 'session', orderId: order.orderId };
|
|
297
|
+
this.emit({
|
|
298
|
+
...base,
|
|
299
|
+
type: 'job_quote_sent',
|
|
300
|
+
termsHash: outcome.quote.agreement.termsHash,
|
|
301
|
+
compute: booking?.reference ?? null,
|
|
302
|
+
price: order.terms.consideration.kind === 'fixed' ? order.terms.consideration.amount : 0n,
|
|
303
|
+
});
|
|
304
|
+
this.emit({ ...base, type: 'job_customer_verifying' });
|
|
305
|
+
this.#result(ctx, 'submit_quote', true, booking
|
|
306
|
+
? `Quoted ${order.orderId}, naming ${booking.id}`
|
|
307
|
+
: `Quoted ${order.orderId}, naming no compute booking`);
|
|
308
|
+
return {
|
|
309
|
+
ok: true,
|
|
310
|
+
content: json({
|
|
311
|
+
quoted: order.orderId,
|
|
312
|
+
names: booking ? booking.id : 'no compute booking',
|
|
313
|
+
next: "The customer is checking the quote now. Its answer comes after your turn, and the developer's code checks the customer's commitment before any work starts.",
|
|
314
|
+
}),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
async #authority(ctx) {
|
|
318
|
+
const { authority } = await this.#limits();
|
|
319
|
+
this.#result(ctx, 'authority', true, `${formatUsd(authority.openReservesLeft)} left of ${formatUsd(authority.capOpenReserves)} held at once`);
|
|
320
|
+
return {
|
|
321
|
+
ok: true,
|
|
322
|
+
content: json({
|
|
323
|
+
mostForOneCommitment: formatUsd(authority.capPerCommitment),
|
|
324
|
+
mostHeldAtOnce: formatUsd(authority.capOpenReserves),
|
|
325
|
+
leftToHold: formatUsd(authority.openReservesLeft),
|
|
326
|
+
keyMovesPerDay: authority.dailyLimit === null ? 'no daily limit' : formatUsd(authority.dailyLimit),
|
|
327
|
+
keyCanStillMoveToday: authority.dailyLeft === null ? 'unread' : formatUsd(authority.dailyLeft),
|
|
328
|
+
suppliers: authority.suppliers,
|
|
329
|
+
}),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
async #commitments(ctx) {
|
|
333
|
+
const list = await Promise.all([...this.state.bookings.values()].map(async (b) => {
|
|
334
|
+
const now = await this.world.read(b.reference).catch(() => null);
|
|
335
|
+
return {
|
|
336
|
+
booking: b.id,
|
|
337
|
+
role: 'compute',
|
|
338
|
+
reserve: formatUsd(b.reserve),
|
|
339
|
+
state: now ? `${now.state} at block ${now.block.number}` : 'unread',
|
|
340
|
+
verify: verifyUrl(b.reference),
|
|
341
|
+
};
|
|
342
|
+
}));
|
|
343
|
+
this.#result(ctx, 'commitments', true, `${list.length} compute booking${list.length === 1 ? '' : 's'} in this session`);
|
|
344
|
+
return { ok: true, content: json({ commitments: list }) };
|
|
345
|
+
}
|
|
346
|
+
/** A refusal of the tool call itself, with its code, layer and a code-written sentence. */
|
|
347
|
+
#refuse(ctx, tool, code, layer, why) {
|
|
348
|
+
this.#result(ctx, tool, false, why, null, { code, layer });
|
|
349
|
+
return { ok: false, content: json({ refused: true, layer, code, why }) };
|
|
350
|
+
}
|
|
351
|
+
/** Posts a tool's result, written by code, and gives the event. */
|
|
352
|
+
#result(ctx, tool, ok, summary, listing = null, refusal = null) {
|
|
353
|
+
const event = {
|
|
354
|
+
run: ctx.run,
|
|
355
|
+
source: 'session',
|
|
356
|
+
orderId: ctx.orderId,
|
|
357
|
+
type: 'tool_result',
|
|
358
|
+
call: ctx.call,
|
|
359
|
+
tool,
|
|
360
|
+
summary: summary.slice(0, 500),
|
|
361
|
+
recalled: null,
|
|
362
|
+
listing: listing?.listing ?? null,
|
|
363
|
+
limits: listing?.limits ?? null,
|
|
364
|
+
...(ok || !refusal ? { ok: true } : { ok: false, ...refusal }),
|
|
365
|
+
};
|
|
366
|
+
this.emit(event);
|
|
367
|
+
return event;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/** A tool call's summary, written by code from what the model passed. */
|
|
371
|
+
function summarizeCall(read, tool) {
|
|
372
|
+
if (!read)
|
|
373
|
+
return `${tool} with input not in the form it takes`;
|
|
374
|
+
switch (read.tool) {
|
|
375
|
+
case 'book_compute':
|
|
376
|
+
return `${read.quantity} GPU${read.quantity === 1 ? '' : 's'} of ${read.offer}`;
|
|
377
|
+
case 'cancel_compute':
|
|
378
|
+
return `cancel ${read.booking}`;
|
|
379
|
+
case 'submit_quote':
|
|
380
|
+
return read.booking ? `quote naming ${read.booking}` : 'quote naming no booking';
|
|
381
|
+
case 'read_order':
|
|
382
|
+
return 'the order';
|
|
383
|
+
case 'compute_offers':
|
|
384
|
+
return "the supplier's offers for the order";
|
|
385
|
+
case 'authority':
|
|
386
|
+
return 'what the agent can commit now';
|
|
387
|
+
case 'commitments':
|
|
388
|
+
return "the business's commitments";
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=toolbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbox.js","sourceRoot":"","sources":["../../src/session/toolbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,EAChB,SAAS,EACT,WAAW,EAGX,YAAY,EACZ,UAAU,EAKV,eAAe,GAGhB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAkB,MAAM,YAAY,CAAA;AA+C1D,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AAC7F,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,EAAE,CAC9B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7E,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAE/F,wFAAwF;AACxF,SAAS,YAAY,CAAC,IAAY,EAAE,KAAsB;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAA;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;IAC5C,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAA;IAC7D,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,iBAAiB,CAAA;AACpG,CAAC;AAED,sCAAsC;AACtC,SAAS,SAAS,CAAC,CAAe,EAAE,QAAgB,EAAE,KAAsB;IAC1E,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;IAC9C,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,cAAc,EACZ,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QACxF,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC7C,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;QAC1C,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC;QAC7C,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;QACzC,gBAAgB,EAAE,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC;YACxC,CAAC,CAAC,oDAAoD;YACtD,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE;KACnD,CAAA;AACH,CAAC;AAED,MAAM,OAAO,OAAO;IAIC,KAAK;IACL,MAAM;IACN,IAAI;IACZ,KAAK;IAEG,aAAa;IARhC,YAAY,GAAG,CAAC,CAAA;IAEhB,YACmB,KAAe,EACf,MAA2B,EAC3B,IAAmC,EAC3C,KAAmB;IAC5B,uFAAuF;IACtE,aAAa,GAAwB,KAAK,IAAI,EAAE,GAAE,CAAC;qBALnD,KAAK;sBACL,MAAM;oBACN,IAAI;qBACZ,KAAK;6BAEG,aAAa;IAC7B,CAAC;IAEJ,+EAA+E;IAC/E,KAAK,CAAC,GAAG,CAAC,IAAa,EAAE,KAAc,EAAE,GAAgB;QACvD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACvC,MAAM,IAAI,GAAG;YACX,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,MAAM,EAAE,SAAkB;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,WAAoB;YAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;SACnC,CAAA;QACD,qFAAqF;QACrF,IAAI,CAAC,IAAI,CACP,IAAI,KAAK,cAAc;YACrB,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE;YACnB,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,cAAc;gBAC7B,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;gBAC/D,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CACrD,CAAA;QACD,IAAI,CAAC,IAAI;YACP,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,IAAI,EACJ,iBAAiB,EACjB,SAAS,EACT,sDAAsD,CACvD,CAAA;QACH,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;YAC7B,KAAK,gBAAgB;gBACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC1B,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YACnD,KAAK,gBAAgB;gBACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YACxC,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YACvC,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;YAC7B,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAgB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,YAAY,EACZ,eAAe,EACf,SAAS,EACT,2BAA2B,CAC5B,CAAA;QACH,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAA;QACrB,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,SAAS;YACvF,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;SACzB,CAAC,CAAC,CAAA;QACH,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;YAC9B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;YACpB,KAAK,EAAE;gBACL,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG;gBAC1B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK;gBAC7B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;aACjC;YACD,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACjC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;YACnD,KAAK,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC;YACrH,oBAAoB,EAAE,OAAO;YAC7B,WAAW,EACT,qMAAqM;YACvM,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;SAChC,CAAA;QACD,IAAI,CAAC,OAAO,CACV,GAAG,EACH,YAAY,EACZ,IAAI,EACJ,SAAS,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3I,CAAA;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC5B,OAAO;YACL,SAAS;YACT,MAAM,EAAE;gBACN,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;gBAC5C,eAAe,EAAE,SAAS,CAAC,eAAe;gBAC1C,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;aAC7C;SACF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,iEAAiE,CAClE,CAAA;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CACxB,GAAG,EACH,gBAAgB,EAChB,IAAI,EACJ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,gBAAgB,OAAO,CAAC,QAAQ,EAAE,EAC1D,EAAE,OAAO,EAAE,MAAM,EAAE,CACpB,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;QACtE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,gBAAgB;YACtB,KAAK;YACL,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;QACF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACxE,MAAM,EAAE;oBACN,uBAAuB,EAAE,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;oBAC3D,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,oBAAoB,EAAE,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;oBACxD,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC;oBACjD,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;iBAC/C;aACF,CAAC;SACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAgB,EAAE,OAAe,EAAE,QAAgB;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;QAC9E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,uBAAuB,EACvB,SAAS,EACT,6CAA6C,OAAO,6CAA6C,CAClG,CAAA;QACH,CAAC;QACD,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QAC3F,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,8BAA8B,EAC9B,SAAS,EACT,SAAS,KAAK,CAAC,EAAE,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAC7J,CAAA;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/F,MAAM,OAAO,GAAiB,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,CAAA;QACnF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;QAC/E,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC;gBACR,GAAG,IAAI;gBACP,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,qBAAqB;gBAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,OAAO,CAAC,OAAO;gBACvB,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY;gBACvC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW;aACtB,CAAC,CAAA;QACpB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC;YACR,GAAG,IAAI;YACP,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,OAAO;YACvB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;YACzB,UAAU,EAAE,SAAS;YACrB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;YACzB,eAAe,EAAE,OAAO,CAAC,UAAU;YACnC,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CACxB,GAAG,EACH,cAAc,EACd,IAAI,EACJ,UAAU,QAAQ,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,EAAE,eAAe,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,QAAQ,WAAW,CAC3I,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,cAAc;YACpB,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,EAAE;SAChB,CAAC,CAAA;QACF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC;gBACZ,OAAO,EAAE,OAAO,CAAC,EAAE;gBACnB,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;gBACnC,UAAU,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,kCAAkC;gBACzE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,KAAK,CAAC,QAAQ,mBAAmB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBAC/F,gBAAgB,EACd,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;oBACvD,CAAC,CAAC,sDAAsD;oBACxD,CAAC,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;gBAC/C,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;aACrC,CAAC;SACH,CAAA;IACH,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,cAAc,CAAC,GAAgB,EAAE,IAAgB,EAAE,MAAc;QACrE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QAC1C,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;YAChD,MAAM;YACN,IAAI,EAAE,SAAS,CAAC,gBAAgB;YAChC,SAAS,EAAE,SAAS,CAAC,eAAe;YACpC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;YAC5C,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B,CAAC,CAAA;IACJ,CAAC;IAED,eAAe,CACb,GAAgB,EAChB,IAAgB,EAChB,KAAmB,EACnB,OAAuB;QAEvB,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QACrF,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CACxB,GAAG,EACH,cAAc,EACd,KAAK,EACL,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EACnC,IAAI,EACJ,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,cAAc;YACpB,KAAK;YACL,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;QACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAClG,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAgB,EAAE,SAAiB;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,gBAAgB,EAChB,yBAAyB,EACzB,SAAS,EACT,2CAA2C,SAAS,GAAG,CACxD,CAAA;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAChD,IAAI,CAAC,OAAO,CAAC,EAAE;YACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACtF,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,2BAA2B,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QAClF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;SAC/E,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAgB,EAAE,SAAwB;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,eAAe,EACf,SAAS,EACT,4BAA4B,CAC7B,CAAA;QACH,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,SAAS,KAAK,CAAC,OAAO,qEAAqE,CAC5F,CAAA;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC5B,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,SAAS,EACT,0GAA0G,CAC3G,CAAA;QACH,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,0BAA0B,EAC1B,SAAS,EACT,+FAA+F,CAChG,CAAA;QACH,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAA;QACxF,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,yBAAyB,EACzB,SAAS,EACT,2CAA2C,SAAS,GAAG,CACxD,CAAA;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,EACH,cAAc,EACd,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,EACb,oDAAoD,CACrD,CAAA;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;QACrF,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;QACjF,IAAI,CAAC,IAAI,CAAC;YACR,GAAG,IAAI;YACP,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS;YAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;YACnC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SAC1E,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,wBAAwB,EAAkB,CAAC,CAAA;QACtE,IAAI,CAAC,OAAO,CACV,GAAG,EACH,cAAc,EACd,IAAI,EACJ,OAAO;YACL,CAAC,CAAC,UAAU,KAAK,CAAC,OAAO,YAAY,OAAO,CAAC,EAAE,EAAE;YACjD,CAAC,CAAC,UAAU,KAAK,CAAC,OAAO,6BAA6B,CACzD,CAAA;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC;gBACZ,MAAM,EAAE,KAAK,CAAC,OAAO;gBACrB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB;gBAClD,IAAI,EAAE,6JAA6J;aACpK,CAAC;SACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAgB;QAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QAC1C,IAAI,CAAC,OAAO,CACV,GAAG,EACH,WAAW,EACX,IAAI,EACJ,GAAG,SAAS,CAAC,SAAS,CAAC,gBAAgB,CAAC,YAAY,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,eAAe,CACxG,CAAA;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC;gBACZ,oBAAoB,EAAE,SAAS,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBAC3D,cAAc,EAAE,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC;gBACpD,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBACjD,cAAc,EACZ,SAAS,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC;gBACpF,oBAAoB,EAClB,SAAS,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC;gBAC1E,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC;SACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAgB;QACjC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAChD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAChE,OAAO;gBACL,OAAO,EAAE,CAAC,CAAC,EAAE;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC7B,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ;gBACnE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;aAC/B,CAAA;QACH,CAAC,CAAC,CACH,CAAA;QACD,IAAI,CAAC,OAAO,CACV,GAAG,EACH,aAAa,EACb,IAAI,EACJ,GAAG,IAAI,CAAC,MAAM,mBAAmB,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAChF,CAAA;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IAC3D,CAAC;IAED,2FAA2F;IAC3F,OAAO,CACL,GAAgB,EAChB,IAAa,EACb,IAAgB,EAChB,KAAmB,EACnB,GAAW;QAEX,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IAC1E,CAAC;IAED,mEAAmE;IACnE,OAAO,CACL,GAAgB,EAChB,IAAa,EACb,EAAW,EACX,OAAe,EACf,OAAO,GAA0D,IAAI,EACrE,OAAO,GAAqD,IAAI;QAEhE,MAAM,KAAK,GAAG;YACZ,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI;YACJ,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC9B,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;YACjC,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI;YAC/B,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,GAAG,OAAO,EAAE,CAAC;SAC/B,CAAA;QACnD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAED,yEAAyE;AACzE,SAAS,aAAa,CAAC,IAAsB,EAAE,IAAa;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,IAAI,sCAAsC,CAAA;IAC/D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,cAAc;YACjB,OAAO,GAAG,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;QACjF,KAAK,gBAAgB;YACnB,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,CAAA;QACjC,KAAK,cAAc;YACjB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAA;QAClF,KAAK,YAAY;YACf,OAAO,WAAW,CAAA;QACpB,KAAK,gBAAgB;YACnB,OAAO,qCAAqC,CAAA;QAC9C,KAAK,WAAW;YACd,OAAO,+BAA+B,CAAA;QACxC,KAAK,aAAa;YAChB,OAAO,4BAA4B,CAAA;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { JobTool } from '@avow-finance/spec';
|
|
2
|
+
/**
|
|
3
|
+
* The seven tools the session gives a model, as every provider's tool calling describes them, and
|
|
4
|
+
* the form each one's input has to take. The descriptions are code-written and say what each tool
|
|
5
|
+
* does and what checks it outside the model. Nothing here starts work, verifies the customer,
|
|
6
|
+
* delivers, pays, signs a mandate, opens a key, edits a file or runs a command.
|
|
7
|
+
*/
|
|
8
|
+
/** One tool as a provider's tool calling takes it, with its parameters as JSON Schema. */
|
|
9
|
+
export interface ToolSpec {
|
|
10
|
+
name: JobTool;
|
|
11
|
+
description: string;
|
|
12
|
+
parameters: {
|
|
13
|
+
type: 'object';
|
|
14
|
+
properties: Record<string, unknown>;
|
|
15
|
+
required: string[];
|
|
16
|
+
additionalProperties: false;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The tools, as the model sees them. While the compute switch in `service.ts` is off,
|
|
21
|
+
* `submit_quote` takes no booking, and its description says so.
|
|
22
|
+
*/
|
|
23
|
+
export declare function toolSpecs(computeSwitch: 'on' | 'off'): ToolSpec[];
|
|
24
|
+
/** A tool call's input once it's read, or why it couldn't be. */
|
|
25
|
+
export type ToolInput = {
|
|
26
|
+
tool: 'read_order' | 'compute_offers' | 'authority' | 'commitments';
|
|
27
|
+
} | {
|
|
28
|
+
tool: 'book_compute';
|
|
29
|
+
offer: string;
|
|
30
|
+
quantity: number;
|
|
31
|
+
} | {
|
|
32
|
+
tool: 'cancel_compute';
|
|
33
|
+
booking: string;
|
|
34
|
+
} | {
|
|
35
|
+
tool: 'submit_quote';
|
|
36
|
+
booking: string | null;
|
|
37
|
+
};
|
|
38
|
+
/** Whether a name is one of the seven tools. */
|
|
39
|
+
export declare const isJobTool: (name: string) => name is JobTool;
|
|
40
|
+
/**
|
|
41
|
+
* Reads a model's input for a tool into a typed value, or null when it doesn't take that form. A
|
|
42
|
+
* model's input is untrusted, so nothing reads it any other way.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readToolInput(tool: JobTool, input: unknown): ToolInput | null;
|
|
45
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/session/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;;;GAKG;AAEH,0FAA0F;AAC1F,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnC,QAAQ,EAAE,MAAM,EAAE,CAAA;QAClB,oBAAoB,EAAE,KAAK,CAAA;KAC5B,CAAA;CACF;AAUD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,IAAI,GAAG,KAAK,GAAG,QAAQ,EAAE,CAiFjE;AAED,iEAAiE;AACjE,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,YAAY,GAAG,gBAAgB,GAAG,WAAW,GAAG,aAAa,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAA;AAYpD,gDAAgD;AAChD,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,IAAI,IAAI,OACJ,CAAA;AAe7C;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAuB7E"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/** The parameters of a tool that takes none. */
|
|
2
|
+
const none = () => ({
|
|
3
|
+
type: 'object',
|
|
4
|
+
properties: {},
|
|
5
|
+
required: [],
|
|
6
|
+
additionalProperties: false,
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* The tools, as the model sees them. While the compute switch in `service.ts` is off,
|
|
10
|
+
* `submit_quote` takes no booking, and its description says so.
|
|
11
|
+
*/
|
|
12
|
+
export function toolSpecs(computeSwitch) {
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
name: 'read_order',
|
|
16
|
+
description: "The order Avow's test customer sent: the work, the GPUs it runs on, when it starts and is due, its price, and what the customer requires of the compute booking a quote names before it accepts.",
|
|
17
|
+
parameters: none(),
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'compute_offers',
|
|
21
|
+
description: "avow-demo-gpu's offers of compute for the order's window. Each has its GPUs, how many one booking takes, its window, its price per GPU-hour, its reserve per GPU, and whether it was firm when listed or can still be cancelled at no charge. It also gives the limits that apply now: the compute budget and the compute switch in service.ts, and your authority.",
|
|
22
|
+
parameters: none(),
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'book_compute',
|
|
26
|
+
description: "Books a number of GPUs of one offer, by the offer's id. service.ts checks its compute budget and compute switch first. Then the SDK checks your mandate, Avow approves the reserve, the reserve is funded in your business's own lock, and the supplier accepts. A refusal names the layer that refused and its reason code, and no money moves.",
|
|
27
|
+
parameters: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
offer: { type: 'string', description: 'The id of the offer, as compute_offers lists it' },
|
|
31
|
+
quantity: { type: 'integer', minimum: 1, description: 'How many GPUs to book' },
|
|
32
|
+
},
|
|
33
|
+
required: ['offer', 'quantity'],
|
|
34
|
+
additionalProperties: false,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'cancel_compute',
|
|
39
|
+
description: "Asks your business to cancel one of its compute bookings, by the booking's id. Your developer sees what's being cancelled and types the business's passphrase, since only the business's key can cancel on the lock. Before free cancellation ends it costs nothing, and after it the booking's terms decide what it costs.",
|
|
40
|
+
parameters: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
booking: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'The id of the booking, as book_compute gave it',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
required: ['booking'],
|
|
49
|
+
additionalProperties: false,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
computeSwitch === 'on'
|
|
53
|
+
? {
|
|
54
|
+
name: 'submit_quote',
|
|
55
|
+
description: "Quotes the order to the customer with terms that name one of your compute bookings, signed with your business's supplier signing key. The customer then checks the booking before it commits, and its answer comes after your turn.",
|
|
56
|
+
parameters: {
|
|
57
|
+
type: 'object',
|
|
58
|
+
properties: {
|
|
59
|
+
booking: {
|
|
60
|
+
type: 'string',
|
|
61
|
+
description: 'The id of the compute booking the quote names, as book_compute gave it',
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
required: ['booking'],
|
|
65
|
+
additionalProperties: false,
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
: {
|
|
69
|
+
name: 'submit_quote',
|
|
70
|
+
description: "Quotes the order to the customer, signed with your business's supplier signing key. The compute switch in service.ts is off, so the quote names no compute booking. The customer checks it before it commits, and its answer comes after your turn.",
|
|
71
|
+
parameters: none(),
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'authority',
|
|
75
|
+
description: 'What your agent can commit now: the most for one commitment, the most it can hold at once and what is left of that, and what its key can still move today.',
|
|
76
|
+
parameters: none(),
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'commitments',
|
|
80
|
+
description: "Every commitment your business's agent made in this session, with its role, amount, state on its lock and a link anyone can open to check it.",
|
|
81
|
+
parameters: none(),
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
const TOOLS = [
|
|
86
|
+
'read_order',
|
|
87
|
+
'compute_offers',
|
|
88
|
+
'book_compute',
|
|
89
|
+
'cancel_compute',
|
|
90
|
+
'submit_quote',
|
|
91
|
+
'authority',
|
|
92
|
+
'commitments',
|
|
93
|
+
];
|
|
94
|
+
/** Whether a name is one of the seven tools. */
|
|
95
|
+
export const isJobTool = (name) => TOOLS.includes(name);
|
|
96
|
+
/** An id the model passes, such as an offer's or a booking's, trimmed, or null when it isn't one. */
|
|
97
|
+
function idOf(value) {
|
|
98
|
+
if (typeof value !== 'string')
|
|
99
|
+
return null;
|
|
100
|
+
const trimmed = value.trim();
|
|
101
|
+
return trimmed.length > 0 && trimmed.length <= 64 ? trimmed : null;
|
|
102
|
+
}
|
|
103
|
+
/** A whole count of GPUs from 1 to 1024. Models sometimes send a count as text, so that reads too. */
|
|
104
|
+
function countOf(value) {
|
|
105
|
+
const n = typeof value === 'string' && /^\s*\d+\s*$/.test(value) ? Number(value) : value;
|
|
106
|
+
return typeof n === 'number' && Number.isInteger(n) && n >= 1 && n <= 1024 ? n : null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Reads a model's input for a tool into a typed value, or null when it doesn't take that form. A
|
|
110
|
+
* model's input is untrusted, so nothing reads it any other way.
|
|
111
|
+
*/
|
|
112
|
+
export function readToolInput(tool, input) {
|
|
113
|
+
const value = (input ?? {});
|
|
114
|
+
if (typeof value !== 'object' || Array.isArray(value))
|
|
115
|
+
return null;
|
|
116
|
+
switch (tool) {
|
|
117
|
+
case 'book_compute': {
|
|
118
|
+
const offer = idOf(value.offer);
|
|
119
|
+
const quantity = countOf(value.quantity);
|
|
120
|
+
return offer && quantity ? { tool, offer, quantity } : null;
|
|
121
|
+
}
|
|
122
|
+
case 'cancel_compute': {
|
|
123
|
+
const booking = idOf(value.booking);
|
|
124
|
+
return booking ? { tool, booking } : null;
|
|
125
|
+
}
|
|
126
|
+
case 'submit_quote': {
|
|
127
|
+
if (value.booking === undefined || value.booking === null || value.booking === '') {
|
|
128
|
+
return { tool, booking: null };
|
|
129
|
+
}
|
|
130
|
+
const booking = idOf(value.booking);
|
|
131
|
+
return booking ? { tool, booking } : null;
|
|
132
|
+
}
|
|
133
|
+
default:
|
|
134
|
+
return { tool };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/session/tools.ts"],"names":[],"mappings":"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"}
|