@polpo-ai/core 0.18.14 → 0.18.16
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/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/run-delivery-owner.d.ts.map +1 -1
- package/dist/run-delivery-owner.js +68 -4
- package/dist/run-delivery-owner.js.map +1 -1
- package/dist/run-delivery-owner.test.js +251 -4
- package/dist/run-delivery-owner.test.js.map +1 -1
- package/dist/session-client-tool-settlement.d.ts +93 -0
- package/dist/session-client-tool-settlement.d.ts.map +1 -0
- package/dist/session-client-tool-settlement.js +195 -0
- package/dist/session-client-tool-settlement.js.map +1 -0
- package/dist/session-client-tool-settlement.test.d.ts +2 -0
- package/dist/session-client-tool-settlement.test.d.ts.map +1 -0
- package/dist/session-client-tool-settlement.test.js +143 -0
- package/dist/session-client-tool-settlement.test.js.map +1 -0
- package/dist/session-store.d.ts +7 -0
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js.map +1 -1
- package/dist/tool-execution-receipts.d.ts +23 -0
- package/dist/tool-execution-receipts.d.ts.map +1 -1
- package/dist/tool-execution-receipts.js +108 -0
- package/dist/tool-execution-receipts.js.map +1 -1
- package/dist/tool-execution-receipts.test.js +135 -2
- package/dist/tool-execution-receipts.test.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { SessionContinuationScope } from "./session-continuation.js";
|
|
2
|
+
import type { Message, Session, ToolCallInfo } from "./session-store.js";
|
|
3
|
+
export type ClientToolSettlementOutcome = "success" | "failed" | "cancelled";
|
|
4
|
+
export interface ClientToolResolutionInput {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
toolCallId: string;
|
|
7
|
+
agent?: string;
|
|
8
|
+
user?: string;
|
|
9
|
+
/** Trusted host partition; never copied from the public JSON body. */
|
|
10
|
+
scope?: SessionContinuationScope;
|
|
11
|
+
}
|
|
12
|
+
export type SettleClientToolInput = ClientToolResolutionInput & {
|
|
13
|
+
expectedSessionVersion: number;
|
|
14
|
+
idempotencyKey: string;
|
|
15
|
+
} & ({
|
|
16
|
+
outcome: "success";
|
|
17
|
+
result: string;
|
|
18
|
+
reason?: never;
|
|
19
|
+
} | {
|
|
20
|
+
outcome: "failed" | "cancelled";
|
|
21
|
+
result?: string;
|
|
22
|
+
reason?: string;
|
|
23
|
+
});
|
|
24
|
+
/** Immutable receipt for settlement-only; it never creates or asserts a Run. */
|
|
25
|
+
export interface ClientToolSettlementReceipt {
|
|
26
|
+
id: string;
|
|
27
|
+
sessionId: string;
|
|
28
|
+
toolCallId: string;
|
|
29
|
+
sourceAssistantMessageId: string;
|
|
30
|
+
resultMessageId: string;
|
|
31
|
+
outcome: ClientToolSettlementOutcome;
|
|
32
|
+
sessionVersion: number;
|
|
33
|
+
settledAt: string;
|
|
34
|
+
}
|
|
35
|
+
/** Internal persisted record. Fingerprint and key are not public response fields. */
|
|
36
|
+
export interface StoredClientToolSettlement extends ClientToolSettlementReceipt {
|
|
37
|
+
idempotencyKey: string;
|
|
38
|
+
fingerprint: string;
|
|
39
|
+
}
|
|
40
|
+
/** The accepted continuation receipt is independent of whether its Run survives. */
|
|
41
|
+
export interface ClientToolContinuationReceipt {
|
|
42
|
+
sessionId: string;
|
|
43
|
+
toolCallId: string;
|
|
44
|
+
runId: string;
|
|
45
|
+
sessionVersion: number;
|
|
46
|
+
acceptedAt?: string;
|
|
47
|
+
}
|
|
48
|
+
export type ClientToolResolution = {
|
|
49
|
+
sessionId: string;
|
|
50
|
+
toolCallId: string;
|
|
51
|
+
sessionVersion: number;
|
|
52
|
+
} & ({
|
|
53
|
+
status: "pending";
|
|
54
|
+
continuationAccepted: false;
|
|
55
|
+
} | {
|
|
56
|
+
status: "settled";
|
|
57
|
+
continuationAccepted: false;
|
|
58
|
+
receipt: ClientToolSettlementReceipt;
|
|
59
|
+
} | {
|
|
60
|
+
status: "continuation";
|
|
61
|
+
continuationAccepted: true;
|
|
62
|
+
receipt: ClientToolContinuationReceipt;
|
|
63
|
+
});
|
|
64
|
+
export interface SettledClientTool {
|
|
65
|
+
status: "settled" | "replay";
|
|
66
|
+
receipt: ClientToolSettlementReceipt;
|
|
67
|
+
}
|
|
68
|
+
export type ClientToolSettlementErrorCode = "invalid_client_tool_settlement" | "session_not_found" | "session_version_conflict" | "client_tool_settlement_scope_mismatch" | "client_tool_call_not_found" | "client_tool_call_not_pending" | "client_tool_call_unverifiable" | "client_tool_settlement_conflict" | "continuation_already_accepted" | "idempotency_conflict" | "client_tool_settlement_corrupt" | "client_tool_settlement_unavailable";
|
|
69
|
+
export declare class ClientToolSettlementError extends Error {
|
|
70
|
+
readonly code: ClientToolSettlementErrorCode;
|
|
71
|
+
readonly continuation?: ClientToolContinuationReceipt | undefined;
|
|
72
|
+
constructor(code: ClientToolSettlementErrorCode, message: string, continuation?: ClientToolContinuationReceipt | undefined);
|
|
73
|
+
}
|
|
74
|
+
export interface NormalizedClientToolSettlement {
|
|
75
|
+
fingerprint: string;
|
|
76
|
+
/** A bounded JSON object string, compatible with every SessionStore. */
|
|
77
|
+
content: string;
|
|
78
|
+
}
|
|
79
|
+
export declare const MAX_CLIENT_TOOL_SETTLEMENT_RESULT_BYTES: number;
|
|
80
|
+
export declare const MAX_CLIENT_TOOL_SETTLEMENT_REASON_BYTES = 4096;
|
|
81
|
+
/** JSON escaping can expand a valid result; bound the stored envelope too. */
|
|
82
|
+
export declare const MAX_CLIENT_TOOL_SETTLEMENT_CONTENT_BYTES: number;
|
|
83
|
+
/** Normalize before entering a store transaction. No caller-provided fingerprint. */
|
|
84
|
+
export declare function normalizeClientToolSettlement(input: SettleClientToolInput): Promise<NormalizedClientToolSettlement>;
|
|
85
|
+
export declare function assertClientToolSettlementScope(session: Session, input: ClientToolResolutionInput): void;
|
|
86
|
+
export declare function resolveClientToolSettlementTarget(messages: readonly Message[], toolCallId: string): {
|
|
87
|
+
message: Message;
|
|
88
|
+
call: ToolCallInfo;
|
|
89
|
+
};
|
|
90
|
+
/** Receipt-backed projection, also used before stale assistant writes can replace a settled call. */
|
|
91
|
+
export declare function projectClientToolSettlements(messages: readonly Message[], receipts: readonly StoredClientToolSettlement[]): Message[];
|
|
92
|
+
export declare function publicClientToolSettlementReceipt(receipt: StoredClientToolSettlement): ClientToolSettlementReceipt;
|
|
93
|
+
//# sourceMappingURL=session-client-tool-settlement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-client-tool-settlement.d.ts","sourceRoot":"","sources":["../src/session-client-tool-settlement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { projectResolvedClientToolCalls } from "./session-continuation.js";
|
|
2
|
+
export class ClientToolSettlementError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
continuation;
|
|
5
|
+
constructor(code, message, continuation) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.continuation = continuation;
|
|
9
|
+
this.name = "ClientToolSettlementError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export const MAX_CLIENT_TOOL_SETTLEMENT_RESULT_BYTES = 64 * 1024;
|
|
13
|
+
export const MAX_CLIENT_TOOL_SETTLEMENT_REASON_BYTES = 4096;
|
|
14
|
+
/** JSON escaping can expand a valid result; bound the stored envelope too. */
|
|
15
|
+
export const MAX_CLIENT_TOOL_SETTLEMENT_CONTENT_BYTES = 6 * (64 * 1024 + 4096) + 256;
|
|
16
|
+
function invalid(message) {
|
|
17
|
+
throw new ClientToolSettlementError("invalid_client_tool_settlement", message);
|
|
18
|
+
}
|
|
19
|
+
function bounded(value, name, limit, required = false) {
|
|
20
|
+
if (value === undefined && !required)
|
|
21
|
+
return;
|
|
22
|
+
if (typeof value !== "string" || (required && !value.trim())
|
|
23
|
+
|| new TextEncoder().encode(value).byteLength > limit)
|
|
24
|
+
invalid(`Invalid ${name}`);
|
|
25
|
+
}
|
|
26
|
+
/** Normalize before entering a store transaction. No caller-provided fingerprint. */
|
|
27
|
+
export async function normalizeClientToolSettlement(input) {
|
|
28
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
29
|
+
invalid("Invalid settlement input");
|
|
30
|
+
bounded(input.sessionId, "sessionId", 256, true);
|
|
31
|
+
bounded(input.toolCallId, "toolCallId", 256, true);
|
|
32
|
+
bounded(input.idempotencyKey, "idempotencyKey", 256, true);
|
|
33
|
+
bounded(input.agent, "agent", 1024);
|
|
34
|
+
bounded(input.user, "user", 1024);
|
|
35
|
+
if (!Number.isSafeInteger(input.expectedSessionVersion) || input.expectedSessionVersion < 0) {
|
|
36
|
+
invalid("Invalid expectedSessionVersion");
|
|
37
|
+
}
|
|
38
|
+
if (!["success", "failed", "cancelled"].includes(input.outcome))
|
|
39
|
+
invalid("Invalid outcome");
|
|
40
|
+
if (input.outcome === "success" && (typeof input.result !== "string" || input.reason !== undefined)) {
|
|
41
|
+
invalid("Success requires a string result and no reason");
|
|
42
|
+
}
|
|
43
|
+
bounded(input.result, "result", MAX_CLIENT_TOOL_SETTLEMENT_RESULT_BYTES);
|
|
44
|
+
bounded(input.reason, "reason", MAX_CLIENT_TOOL_SETTLEMENT_REASON_BYTES);
|
|
45
|
+
if (input.scope !== undefined) {
|
|
46
|
+
if (!input.scope || typeof input.scope !== "object")
|
|
47
|
+
invalid("Invalid scope");
|
|
48
|
+
bounded(input.scope.key, "scope.key", 4096, true);
|
|
49
|
+
bounded(input.scope.version, "scope.version", 1024);
|
|
50
|
+
}
|
|
51
|
+
const content = JSON.stringify({
|
|
52
|
+
ok: input.outcome === "success",
|
|
53
|
+
outcome: input.outcome,
|
|
54
|
+
...(input.result !== undefined ? { result: input.result } : {}),
|
|
55
|
+
...(input.outcome !== "success" ? { error: input.reason ?? `Client tool ${input.outcome}` } : {}),
|
|
56
|
+
});
|
|
57
|
+
if (new TextEncoder().encode(content).byteLength > MAX_CLIENT_TOOL_SETTLEMENT_CONTENT_BYTES) {
|
|
58
|
+
invalid("Settlement envelope is too large");
|
|
59
|
+
}
|
|
60
|
+
const semantics = JSON.stringify({
|
|
61
|
+
sessionId: input.sessionId, toolCallId: input.toolCallId,
|
|
62
|
+
agent: input.agent ?? null, user: input.user ?? null,
|
|
63
|
+
scope: input.scope ? { key: input.scope.key, version: input.scope.version ?? null } : null,
|
|
64
|
+
content,
|
|
65
|
+
});
|
|
66
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(semantics));
|
|
67
|
+
return { content, fingerprint: Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, "0")).join("") };
|
|
68
|
+
}
|
|
69
|
+
export function assertClientToolSettlementScope(session, input) {
|
|
70
|
+
if (session.id !== input.sessionId || session.agent !== input.agent || session.user !== input.user
|
|
71
|
+
|| session.scope?.key !== input.scope?.key || session.scope?.version !== input.scope?.version
|
|
72
|
+
|| Boolean(session.scope) !== Boolean(input.scope)) {
|
|
73
|
+
throw new ClientToolSettlementError("client_tool_settlement_scope_mismatch", "Client tool scope does not match the session");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function resolveClientToolSettlementTarget(messages, toolCallId) {
|
|
77
|
+
const targets = messages.flatMap(message => message.role === "assistant"
|
|
78
|
+
? (message.toolCalls ?? []).filter(call => call.id === toolCallId).map(call => ({ message, call })) : []);
|
|
79
|
+
if (targets.length === 0)
|
|
80
|
+
throw new ClientToolSettlementError("client_tool_call_not_found", "Client tool call not found");
|
|
81
|
+
if (targets.length !== 1)
|
|
82
|
+
throw new ClientToolSettlementError("client_tool_settlement_corrupt", "Client tool call is ambiguous");
|
|
83
|
+
const target = targets[0];
|
|
84
|
+
if (target.call.state !== "interrupted" || messages.some(message => message.role === "tool" && message.toolCallId === toolCallId)) {
|
|
85
|
+
throw new ClientToolSettlementError("client_tool_call_not_pending", "Client tool call is not pending");
|
|
86
|
+
}
|
|
87
|
+
if (!target.call.continuationClientTools?.some(tool => tool.type === "function" && tool.function?.name === target.call.name)) {
|
|
88
|
+
throw new ClientToolSettlementError("client_tool_call_unverifiable", "The frozen client tool definition is unavailable");
|
|
89
|
+
}
|
|
90
|
+
return target;
|
|
91
|
+
}
|
|
92
|
+
function assertStoredClientToolSettlement(receipt) {
|
|
93
|
+
const identifiers = [receipt?.id, receipt?.sessionId, receipt?.toolCallId,
|
|
94
|
+
receipt?.sourceAssistantMessageId, receipt?.resultMessageId, receipt?.idempotencyKey];
|
|
95
|
+
if (identifiers.some(value => typeof value !== "string" || !value.trim()
|
|
96
|
+
|| new TextEncoder().encode(value).byteLength > 256)
|
|
97
|
+
|| !Number.isSafeInteger(receipt?.sessionVersion) || receipt.sessionVersion < 0
|
|
98
|
+
|| typeof receipt.settledAt !== "string" || !/^\d{4}-\d{2}-\d{2}T/.test(receipt.settledAt)
|
|
99
|
+
|| !Number.isFinite(Date.parse(receipt.settledAt))
|
|
100
|
+
|| typeof receipt.fingerprint !== "string" || !/^[a-f0-9]{64}$/.test(receipt.fingerprint)
|
|
101
|
+
|| !["success", "failed", "cancelled"].includes(receipt.outcome)) {
|
|
102
|
+
throw new ClientToolSettlementError("client_tool_settlement_corrupt", "Client tool settlement receipt is invalid");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Receipt-backed projection, also used before stale assistant writes can replace a settled call. */
|
|
106
|
+
export function projectClientToolSettlements(messages, receipts) {
|
|
107
|
+
const corrupt = () => { throw new ClientToolSettlementError("client_tool_settlement_corrupt", "Client tool settlement history is inconsistent"); };
|
|
108
|
+
const receiptIds = new Set();
|
|
109
|
+
const calls = new Map();
|
|
110
|
+
const results = new Map();
|
|
111
|
+
const sources = new Map();
|
|
112
|
+
for (const receipt of receipts) {
|
|
113
|
+
assertStoredClientToolSettlement(receipt);
|
|
114
|
+
if (!receipt.id || receiptIds.has(receipt.id) || calls.has(receipt.toolCallId) || results.has(receipt.resultMessageId)
|
|
115
|
+
|| !["success", "failed", "cancelled"].includes(receipt.outcome))
|
|
116
|
+
corrupt();
|
|
117
|
+
receiptIds.add(receipt.id);
|
|
118
|
+
const source = messages.filter(message => message.id === receipt.sourceAssistantMessageId);
|
|
119
|
+
const result = messages.filter(message => message.id === receipt.resultMessageId);
|
|
120
|
+
const declared = messages.flatMap(message => message.role === "assistant"
|
|
121
|
+
? (message.toolCalls ?? []).filter(call => call.id === receipt.toolCallId) : []);
|
|
122
|
+
if (source.length !== 1 || source[0].role !== "assistant" || declared.length !== 1
|
|
123
|
+
|| !source[0].toolCalls?.some(call => call.id === receipt.toolCallId)
|
|
124
|
+
|| result.length !== 1 || result[0].role !== "tool" || result[0].toolCallId !== receipt.toolCallId
|
|
125
|
+
|| messages.filter(message => message.role === "tool" && message.toolCallId === receipt.toolCallId).length !== 1)
|
|
126
|
+
corrupt();
|
|
127
|
+
let envelope;
|
|
128
|
+
try {
|
|
129
|
+
envelope = typeof result[0].content === "string" ? JSON.parse(result[0].content) : null;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
corrupt();
|
|
133
|
+
}
|
|
134
|
+
if (!envelope || typeof envelope !== "object" || Array.isArray(envelope)
|
|
135
|
+
|| envelope.outcome !== receipt.outcome || envelope.ok !== (receipt.outcome === "success")
|
|
136
|
+
|| (envelope.result !== undefined && typeof envelope.result !== "string")
|
|
137
|
+
|| (receipt.outcome === "success"
|
|
138
|
+
? typeof envelope.result !== "string" || envelope.error !== undefined
|
|
139
|
+
: typeof envelope.error !== "string"))
|
|
140
|
+
corrupt();
|
|
141
|
+
calls.set(receipt.toolCallId, receipt);
|
|
142
|
+
results.set(receipt.resultMessageId, result[0]);
|
|
143
|
+
sources.set(receipt.sourceAssistantMessageId, [...(sources.get(receipt.sourceAssistantMessageId) ?? []), receipt]);
|
|
144
|
+
}
|
|
145
|
+
// A source can mix ordinarily completed calls and later settlements. Move all
|
|
146
|
+
// its existing results together, preserving the declaration order.
|
|
147
|
+
const sourceResults = new Map();
|
|
148
|
+
for (const sourceId of sources.keys()) {
|
|
149
|
+
const source = messages.find(message => message.id === sourceId);
|
|
150
|
+
const byCall = new Map();
|
|
151
|
+
for (const call of source.toolCalls ?? []) {
|
|
152
|
+
const matches = messages.filter(message => message.role === "tool" && message.toolCallId === call.id);
|
|
153
|
+
if (matches.length > 1)
|
|
154
|
+
corrupt();
|
|
155
|
+
if (matches[0]) {
|
|
156
|
+
byCall.set(call.id, matches[0]);
|
|
157
|
+
results.set(matches[0].id, matches[0]);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
sourceResults.set(sourceId, byCall);
|
|
161
|
+
}
|
|
162
|
+
const projected = projectResolvedClientToolCalls(messages);
|
|
163
|
+
const output = [];
|
|
164
|
+
for (const message of projected) {
|
|
165
|
+
if (results.has(message.id))
|
|
166
|
+
continue;
|
|
167
|
+
const settled = sources.get(message.id);
|
|
168
|
+
if (!settled) {
|
|
169
|
+
output.push(message);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const toolCalls = message.toolCalls.map(call => {
|
|
173
|
+
const receipt = calls.get(call.id);
|
|
174
|
+
if (!receipt)
|
|
175
|
+
return call;
|
|
176
|
+
const { continuationClientTools: _catalog, ...rest } = call;
|
|
177
|
+
const content = results.get(receipt.resultMessageId).content;
|
|
178
|
+
return { ...rest, state: receipt.outcome === "success" ? "completed" : "error",
|
|
179
|
+
settlementOutcome: receipt.outcome, result: typeof content === "string" ? content : JSON.stringify(content) };
|
|
180
|
+
});
|
|
181
|
+
output.push({ ...message, toolCalls });
|
|
182
|
+
for (const call of toolCalls) {
|
|
183
|
+
const result = sourceResults.get(message.id)?.get(call.id);
|
|
184
|
+
if (result)
|
|
185
|
+
output.push(result);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return output;
|
|
189
|
+
}
|
|
190
|
+
export function publicClientToolSettlementReceipt(receipt) {
|
|
191
|
+
assertStoredClientToolSettlement(receipt);
|
|
192
|
+
const { id, sessionId, toolCallId, sourceAssistantMessageId, resultMessageId, outcome, sessionVersion, settledAt } = receipt;
|
|
193
|
+
return { id, sessionId, toolCallId, sourceAssistantMessageId, resultMessageId, outcome, sessionVersion, settledAt };
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=session-client-tool-settlement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-client-tool-settlement.js","sourceRoot":"","sources":["../src/session-client-tool-settlement.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AA8E3E,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAEvC;IAEA;IAHX,YACW,IAAmC,EAC5C,OAAe,EACN,YAA4C;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAA+B;QAEnC,iBAAY,GAAZ,YAAY,CAAgC;QAGrD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAQD,MAAM,CAAC,MAAM,uCAAuC,GAAG,EAAE,GAAG,IAAI,CAAC;AACjE,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AAC5D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AAErF,SAAS,OAAO,CAAC,OAAe;IAC9B,MAAM,IAAI,yBAAyB,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,IAAY,EAAE,KAAa,EAAE,QAAQ,GAAG,KAAK;IAC5E,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;WACvD,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,KAAK;QAAE,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,KAA4B;IAE5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACrG,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,EAAE,CAAC;QAC5F,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5F,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;QACpG,OAAO,CAAC,gDAAgD,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,uCAAuC,CAAC,CAAC;IACzE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,uCAAuC,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,EAAE,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS;QAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,eAAe,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClG,CAAC,CAAC;IACH,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,GAAG,wCAAwC,EAAE,CAAC;QAC5F,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU;QACxD,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QACpD,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QAC1F,OAAO;KACR,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACrG,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3H,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,OAAgB,EAAE,KAAgC;IAChG,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;WAC7F,OAAO,CAAC,KAAK,EAAE,GAAG,KAAK,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,KAAK,EAAE,OAAO;WAC1F,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,yBAAyB,CAAC,uCAAuC,EAAE,8CAA8C,CAAC,CAAC;IAC/H,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,QAA4B,EAAE,UAAkB;IAEhD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;QACtE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5G,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAC;IAC1H,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,gCAAgC,EAAE,+BAA+B,CAAC,CAAC;IACjI,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,aAAa,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,EAAE,CAAC;QAClI,MAAM,IAAI,yBAAyB,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7H,MAAM,IAAI,yBAAyB,CAAC,+BAA+B,EAAE,kDAAkD,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gCAAgC,CAAC,OAAmC;IAC3E,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU;QACvE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxF,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;WACjE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;WACnD,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC;WAC5E,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;WACvF,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;WAC/C,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;WACtF,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,yBAAyB,CAAC,gCAAgC,EAAE,2CAA2C,CAAC,CAAC;IACrH,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,4BAA4B,CAC1C,QAA4B,EAAE,QAA+C;IAE7E,MAAM,OAAO,GAAG,GAAU,EAAE,GAAG,MAAM,IAAI,yBAAyB,CAAC,gCAAgC,EAAE,gDAAgD,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1J,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwC,CAAC;IAChE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,gCAAgC,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;eACjH,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9E,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YACvE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;eAC9E,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC;eACnE,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;eACjG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9H,IAAI,QAAa,CAAC;QAClB,IAAI,CAAC;YAAC,QAAQ,GAAG,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAAC,CAAC;QAClG,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;eACnE,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC;eACvF,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC;eACtE,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS;gBAC/B,CAAC,CAAC,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;gBACrE,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACrD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACrH,CAAC;IACD,8EAA8E;IAC9E,mEAAmE;IACnE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC9D,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAE,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;YACtG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,SAAS,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,SAAS;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC1B,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAE,CAAC,OAAO,CAAC;YAC9D,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,WAAoB,CAAC,CAAC,CAAC,OAAgB;gBAC9F,iBAAiB,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAClH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3D,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAmC;IACnF,gCAAgC,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,wBAAwB,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC7H,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,wBAAwB,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACtH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-client-tool-settlement.test.d.ts","sourceRoot":"","sources":["../src/session-client-tool-settlement.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { assertClientToolSettlementScope, normalizeClientToolSettlement, projectClientToolSettlements, publicClientToolSettlementReceipt, resolveClientToolSettlementTarget, } from "./session-client-tool-settlement.js";
|
|
3
|
+
const input = {
|
|
4
|
+
sessionId: "session-ncc-fixture", toolCallId: "call_never_accepted_fixture_c",
|
|
5
|
+
agent: "leo", user: "external-user", expectedSessionVersion: 44,
|
|
6
|
+
idempotencyKey: "recover-call", outcome: "cancelled", reason: "Request was never accepted",
|
|
7
|
+
};
|
|
8
|
+
const session = {
|
|
9
|
+
id: input.sessionId, agent: input.agent, user: input.user,
|
|
10
|
+
createdAt: "2026-10-17T00:00:00Z", updatedAt: "2026-10-17T00:00:00Z", messageCount: 1,
|
|
11
|
+
};
|
|
12
|
+
const assistant = {
|
|
13
|
+
id: "assistant", role: "assistant", content: "", ts: "2026-10-17T00:00:00Z",
|
|
14
|
+
toolCalls: [{
|
|
15
|
+
id: input.toolCallId, name: "apply_site_change", state: "interrupted",
|
|
16
|
+
continuationClientTools: [{ type: "function", function: { name: "apply_site_change" } }],
|
|
17
|
+
}],
|
|
18
|
+
};
|
|
19
|
+
const receipt = {
|
|
20
|
+
id: "settlement", sessionId: input.sessionId, toolCallId: input.toolCallId,
|
|
21
|
+
sourceAssistantMessageId: "assistant", resultMessageId: "result", outcome: "cancelled",
|
|
22
|
+
sessionVersion: 45, settledAt: "2026-10-17T01:00:00Z", idempotencyKey: "key", fingerprint: "a".repeat(64),
|
|
23
|
+
};
|
|
24
|
+
const result = {
|
|
25
|
+
id: "result", role: "tool", content: '{"ok":false,"outcome":"cancelled","error":"Cancelled"}',
|
|
26
|
+
toolCallId: input.toolCallId, ts: receipt.settledAt,
|
|
27
|
+
};
|
|
28
|
+
describe("client-tool settlement domain", () => {
|
|
29
|
+
it("fingerprints semantics independently of delivery version/key and binds exact scope", async () => {
|
|
30
|
+
const first = await normalizeClientToolSettlement(input);
|
|
31
|
+
expect(await normalizeClientToolSettlement({ ...input, expectedSessionVersion: 45, idempotencyKey: "retry" }))
|
|
32
|
+
.toEqual(first);
|
|
33
|
+
for (const change of [{ user: "other" }, { agent: "other" }, { reason: "different" }, { scope: { key: "partition" } }]) {
|
|
34
|
+
expect((await normalizeClientToolSettlement({ ...input, ...change })).fingerprint).not.toBe(first.fingerprint);
|
|
35
|
+
}
|
|
36
|
+
expect(first.fingerprint).toMatch(/^[a-f0-9]{64}$/);
|
|
37
|
+
expect(JSON.parse(first.content)).toEqual({ ok: false, outcome: "cancelled", error: input.reason });
|
|
38
|
+
});
|
|
39
|
+
it.each(["success", "failed", "cancelled"])("preserves exact JSON-looking result strings for %s", async (outcome) => {
|
|
40
|
+
const value = '[1, {"text":"à\\n"}]';
|
|
41
|
+
const normalized = await normalizeClientToolSettlement({
|
|
42
|
+
sessionId: "s", toolCallId: "c", expectedSessionVersion: 0,
|
|
43
|
+
idempotencyKey: "k", outcome, result: value,
|
|
44
|
+
});
|
|
45
|
+
expect(JSON.parse(normalized.content).result).toBe(value);
|
|
46
|
+
expect(JSON.parse(normalized.content).ok).toBe(outcome === "success");
|
|
47
|
+
});
|
|
48
|
+
it.each([
|
|
49
|
+
{ expectedSessionVersion: -1 }, { expectedSessionVersion: 1.5 },
|
|
50
|
+
{ idempotencyKey: " " }, { outcome: "completed" }, { outcome: "success", result: undefined },
|
|
51
|
+
{ result: { unvalidated: true } }, { result: "🍋".repeat(20_000) }, { reason: "x".repeat(5000) },
|
|
52
|
+
])("rejects malformed or oversized input before a store transaction %#", async (change) => {
|
|
53
|
+
await expect(normalizeClientToolSettlement({ ...input, ...change }))
|
|
54
|
+
.rejects.toMatchObject({ code: "invalid_client_tool_settlement" });
|
|
55
|
+
});
|
|
56
|
+
it("requires exact agent, external user and trusted partition", () => {
|
|
57
|
+
expect(() => assertClientToolSettlementScope(session, input)).not.toThrow();
|
|
58
|
+
for (const change of [{ user: undefined }, { agent: undefined }, { scope: { key: "forged" } }]) {
|
|
59
|
+
expect(() => assertClientToolSettlementScope(session, { ...input, ...change }))
|
|
60
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_settlement_scope_mismatch" }));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
it("resolves an exact older pending client call and rejects ambiguity or server tools", () => {
|
|
64
|
+
const later = { id: "later", role: "user", content: "later", ts: result.ts };
|
|
65
|
+
expect(resolveClientToolSettlementTarget([assistant, later], input.toolCallId).message.id).toBe("assistant");
|
|
66
|
+
expect(() => resolveClientToolSettlementTarget([assistant, { ...assistant, id: "duplicate" }], input.toolCallId))
|
|
67
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_settlement_corrupt" }));
|
|
68
|
+
const server = structuredClone(assistant);
|
|
69
|
+
delete server.toolCalls[0].continuationClientTools;
|
|
70
|
+
expect(() => resolveClientToolSettlementTarget([server], input.toolCallId))
|
|
71
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_call_unverifiable" }));
|
|
72
|
+
expect(() => resolveClientToolSettlementTarget([assistant, result], input.toolCallId))
|
|
73
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_call_not_pending" }));
|
|
74
|
+
});
|
|
75
|
+
it("places a late result next to its source and keeps cancellation terminal on every read", () => {
|
|
76
|
+
const later = { id: "later", role: "user", content: "later", ts: result.ts };
|
|
77
|
+
const physical = [assistant, later, result];
|
|
78
|
+
const projected = projectClientToolSettlements(physical, [receipt]);
|
|
79
|
+
expect(projected.map(message => message.id)).toEqual(["assistant", "result", "later"]);
|
|
80
|
+
expect(projected[0].toolCalls[0]).toMatchObject({ state: "error", settlementOutcome: "cancelled" });
|
|
81
|
+
expect(projected[0].toolCalls[0]).not.toHaveProperty("continuationClientTools");
|
|
82
|
+
expect(projectClientToolSettlements(projected, [receipt])).toEqual(projected);
|
|
83
|
+
expect(physical[0].toolCalls[0].state).toBe("interrupted");
|
|
84
|
+
});
|
|
85
|
+
it.each(["success", "failed", "cancelled"])("materializes %s without changing the stored result", (outcome) => {
|
|
86
|
+
const typedResult = { ...result, content: JSON.stringify({ ok: outcome === "success", outcome,
|
|
87
|
+
...(outcome === "success" ? { result: "complete" } : { error: "Stopped" }) }) };
|
|
88
|
+
const projected = projectClientToolSettlements([assistant, typedResult], [{ ...receipt, outcome }]);
|
|
89
|
+
expect(projected[0].toolCalls[0]).toMatchObject({
|
|
90
|
+
state: outcome === "success" ? "completed" : "error", settlementOutcome: outcome, result: typedResult.content,
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
it("fails closed on a receipt missing its result and on duplicate receipt identities", () => {
|
|
94
|
+
expect(() => projectClientToolSettlements([assistant], [receipt]))
|
|
95
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_settlement_corrupt" }));
|
|
96
|
+
expect(() => projectClientToolSettlements([assistant, result], [receipt, receipt]))
|
|
97
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_settlement_corrupt" }));
|
|
98
|
+
});
|
|
99
|
+
it("keeps legacy ordinary continuation projection and never exposes internal receipt fields", () => {
|
|
100
|
+
expect(projectClientToolSettlements([assistant, result], [])[0].toolCalls[0].state).toBe("completed");
|
|
101
|
+
const publicReceipt = publicClientToolSettlementReceipt(receipt);
|
|
102
|
+
expect(publicReceipt).not.toHaveProperty("fingerprint");
|
|
103
|
+
expect(publicReceipt).not.toHaveProperty("idempotencyKey");
|
|
104
|
+
expect(publicReceipt).not.toHaveProperty("runId");
|
|
105
|
+
});
|
|
106
|
+
it("orders settled and ordinary sibling results by the assistant declaration", () => {
|
|
107
|
+
const source = { ...assistant, toolCalls: [
|
|
108
|
+
{ id: "ordinary", name: "ordinary", state: "completed", result: "ok" },
|
|
109
|
+
assistant.toolCalls[0],
|
|
110
|
+
] };
|
|
111
|
+
const ordinary = { id: "ordinary-result", role: "tool", content: "ok", toolCallId: "ordinary", ts: assistant.ts };
|
|
112
|
+
const later = { id: "later", role: "user", content: "next", ts: result.ts };
|
|
113
|
+
const projected = projectClientToolSettlements([source, ordinary, later, result], [receipt]);
|
|
114
|
+
expect(projected.map(message => message.id)).toEqual(["assistant", "ordinary-result", "result", "later"]);
|
|
115
|
+
});
|
|
116
|
+
it("uses declared order for multiple settlements even when receipt and physical order differ", () => {
|
|
117
|
+
const secondCall = { ...assistant.toolCalls[0], id: "second-call" };
|
|
118
|
+
const source = { ...assistant, toolCalls: [secondCall, assistant.toolCalls[0]] };
|
|
119
|
+
const secondResult = { ...result, id: "second-result", toolCallId: secondCall.id };
|
|
120
|
+
const secondReceipt = { ...receipt, id: "second-settlement", toolCallId: secondCall.id, resultMessageId: secondResult.id };
|
|
121
|
+
expect(projectClientToolSettlements([source, result, secondResult], [receipt, secondReceipt]).map(message => message.id))
|
|
122
|
+
.toEqual(["assistant", "second-result", "result"]);
|
|
123
|
+
});
|
|
124
|
+
it("does not depend on trusted scope object property order", async () => {
|
|
125
|
+
const scoped = { ...input, scope: { key: "project:prod", version: "2" } };
|
|
126
|
+
const reordered = { ...input, scope: { version: "2", key: "project:prod" } };
|
|
127
|
+
expect(await normalizeClientToolSettlement(scoped)).toEqual(await normalizeClientToolSettlement(reordered));
|
|
128
|
+
expect(() => assertClientToolSettlementScope({ ...session, scope: scoped.scope }, reordered)).not.toThrow();
|
|
129
|
+
});
|
|
130
|
+
it.each(["invalid-json", '[{"ok":false}]', '{"ok":true,"outcome":"success","result":"forged"}'])("rejects inconsistent persisted result content %#", content => {
|
|
131
|
+
expect(() => projectClientToolSettlements([assistant, { ...result, content }], [receipt]))
|
|
132
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_settlement_corrupt" }));
|
|
133
|
+
});
|
|
134
|
+
it.each([
|
|
135
|
+
{ sessionVersion: "garbage" }, { sessionVersion: -1 }, { sessionVersion: 1.5 },
|
|
136
|
+
{ settledAt: 17 }, { settledAt: "not-a-date" }, { id: "" }, { sourceAssistantMessageId: 8 },
|
|
137
|
+
{ fingerprint: "invalid" }, { idempotencyKey: "" },
|
|
138
|
+
])("rejects corrupt stored receipt fields %#", change => {
|
|
139
|
+
expect(() => projectClientToolSettlements([assistant, result], [{ ...receipt, ...change }]))
|
|
140
|
+
.toThrowError(expect.objectContaining({ code: "client_tool_settlement_corrupt" }));
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=session-client-tool-settlement.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-client-tool-settlement.test.js","sourceRoot":"","sources":["../src/session-client-tool-settlement.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,iCAAiC,EACjC,iCAAiC,GAGlC,MAAM,qCAAqC,CAAC;AAE7C,MAAM,KAAK,GAA0B;IACnC,SAAS,EAAE,qBAAqB,EAAE,UAAU,EAAE,+BAA+B;IAC7E,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,sBAAsB,EAAE,EAAE;IAC/D,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,4BAA4B;CAC3F,CAAC;AACF,MAAM,OAAO,GAAY;IACvB,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;IACzD,SAAS,EAAE,sBAAsB,EAAE,SAAS,EAAE,sBAAsB,EAAE,YAAY,EAAE,CAAC;CACtF,CAAC;AACF,MAAM,SAAS,GAAY;IACzB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,sBAAsB;IAC3E,SAAS,EAAE,CAAC;YACV,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa;YACrE,uBAAuB,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC;SACzF,CAAC;CACH,CAAC;AACF,MAAM,OAAO,GAA+B;IAC1C,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU;IAC1E,wBAAwB,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW;IACtF,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;CAC1G,CAAC;AACF,MAAM,MAAM,GAAY;IACtB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wDAAwD;IAC7F,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS;CACpD,CAAC;AAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,KAAK,GAAG,MAAM,6BAA6B,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,6BAA6B,CAAC,EAAE,GAAG,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;aAC3G,OAAO,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;YACvH,MAAM,CAAC,CAAC,MAAM,6BAA6B,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjH,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC,CAAC,oDAAoD,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC3H,MAAM,KAAK,GAAG,sBAAsB,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,6BAA6B,CAAC;YACrD,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC;YAC1D,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;SAC5C,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE;QAC/D,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;QAC5F,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;KACjG,CAAC,CAAC,oEAAoE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxF,MAAM,MAAM,CAAC,6BAA6B,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAS,CAAC,CAAC;aACxE,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC5E,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/F,MAAM,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;iBAC5E,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,KAAK,GAAY,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;QACtF,MAAM,CAAC,iCAAiC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7G,MAAM,CAAC,GAAG,EAAE,CAAC,iCAAiC,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;aAC9G,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC,SAAU,CAAC,CAAC,CAAE,CAAC,uBAAuB,CAAC;QACrD,MAAM,CAAC,GAAG,EAAE,CAAC,iCAAiC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;aACxE,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,GAAG,EAAE,CAAC,iCAAiC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;aACnF,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,MAAM,KAAK,GAAY,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;QACtF,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,4BAA4B,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,SAAU,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,SAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC,CAAC;QAClF,MAAM,CAAC,4BAA4B,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9E,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,SAAU,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC,CAAC,oDAAoD,EAAE,CAAC,OAAO,EAAE,EAAE;QACrH,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,KAAK,SAAS,EAAE,OAAO;gBAC3F,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAClF,MAAM,SAAS,GAAG,4BAA4B,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACpG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,SAAU,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAChD,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO;SAC9G,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;aAC/D,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;aAChF,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;QACjG,MAAM,CAAC,4BAA4B,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,SAAU,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzG,MAAM,aAAa,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACxD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAC3D,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,MAAM,GAAY,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE;gBACjD,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;gBACtE,SAAS,CAAC,SAAU,CAAC,CAAC,CAAE;aACzB,EAAE,CAAC;QACJ,MAAM,QAAQ,GAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;QAC3H,MAAM,KAAK,GAAY,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;QACrF,MAAM,SAAS,GAAG,4BAA4B,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7F,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC,SAAU,CAAC,CAAC,CAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;QACtE,MAAM,MAAM,GAAY,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,SAAU,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;QAC5F,MAAM,YAAY,GAAY,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;QAC5F,MAAM,aAAa,GAA+B,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC;QACvJ,MAAM,CAAC,4BAA4B,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aACtH,OAAO,CAAC,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;QAC1E,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,CAAC;QAC7E,MAAM,CAAC,MAAM,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,6BAA6B,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5G,MAAM,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC9G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,gBAAgB,EAAE,mDAAmD,CAAC,CAAC,CAAC,kDAAkD,EAAE,OAAO,CAAC,EAAE;QAC7J,MAAM,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;aACvF,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE;QAC9E,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,wBAAwB,EAAE,CAAC,EAAE;QAC3F,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;KACnD,CAAC,CAAC,0CAA0C,EAAE,MAAM,CAAC,EAAE;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAS,CAAC,CAAC,CAAC;aAChG,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/session-store.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ChatSuggestion } from "./chat-interactions.js";
|
|
2
2
|
import type { PreparedSessionContinuation, PrepareSessionContinuationInput, SessionContinuationScope } from "./session-continuation.js";
|
|
3
3
|
import type { CanonicalTurnCommitted } from "./canonical-turn.js";
|
|
4
|
+
import type { ClientToolSettlementOutcome, ClientToolResolutionInput, ClientToolResolution, SettleClientToolInput, SettledClientTool } from "./session-client-tool-settlement.js";
|
|
4
5
|
/**
|
|
5
6
|
* Chat session storage — persists conversation threads across TUI restarts.
|
|
6
7
|
* Nomenclature aligned with OpenCode: Session, Message, SessionStore.
|
|
@@ -48,6 +49,8 @@ export interface ToolCallInfo {
|
|
|
48
49
|
* continuation; callers cannot redeclare or widen this catalog.
|
|
49
50
|
*/
|
|
50
51
|
continuationClientTools?: SessionClientToolDefinition[];
|
|
52
|
+
/** Exact application outcome of a settlement-only operation. */
|
|
53
|
+
settlementOutcome?: ClientToolSettlementOutcome;
|
|
51
54
|
}
|
|
52
55
|
export interface Message {
|
|
53
56
|
id: string;
|
|
@@ -165,6 +168,10 @@ export interface SessionStore {
|
|
|
165
168
|
prune(keepSessions: number): Promise<number>;
|
|
166
169
|
/** Atomically append one pending client-tool result and reserve its continuation run. */
|
|
167
170
|
prepareContinuation?(input: PrepareSessionContinuationInput): Promise<PreparedSessionContinuation>;
|
|
171
|
+
/** Atomic receipt/state lookup; it must never admit or execute work. */
|
|
172
|
+
getClientToolResolution?(input: ClientToolResolutionInput): Promise<ClientToolResolution>;
|
|
173
|
+
/** Atomically close an unaccepted client call without invoking model, handler, or Loop. */
|
|
174
|
+
settleClientTool?(input: SettleClientToolInput): Promise<SettledClientTool>;
|
|
168
175
|
/** Atomically finalize the assistant message and insert one durable turn outbox record. */
|
|
169
176
|
commitCanonicalTurn?(input: CommitCanonicalTurnInput): Promise<CommitCanonicalTurnResult>;
|
|
170
177
|
/** Read one committed identifier-only turn event for durable dispatch/reconcile. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EACV,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EACV,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,qCAAqC,CAAC;AAE7C;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAExD,qEAAqE;AACrE,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,aAAa,CAAC;AAE5F,mFAAmF;AACnF,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACxD,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;CACjD;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,kFAAkF;IAClF,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,oEAAoE;IACpE,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,6BAA6B,QAAY,CAAC;AAEvD,sFAAsF;AACtF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,QAAQ,SAAgC,GACvC,kBAAkB,GAAG,SAAS,CAchC;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,2HAA2H;IAC3H,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;QAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;QACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;KACzC,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,EACtC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,sFAAsF;IACtF,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,EACtC,SAAS,CAAC,EAAE,YAAY,EAAE,EAC1B,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE;;;OAGG;IACH,YAAY,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC5D,uHAAuH;IACvH,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACtE,wDAAwD;IACxD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,yFAAyF;IACzF,mBAAmB,CAAC,CAClB,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACxC,wEAAwE;IACxE,uBAAuB,CAAC,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1F,2FAA2F;IAC3F,gBAAgB,CAAC,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5E,2FAA2F;IAC3F,mBAAmB,CAAC,CAClB,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACtC,oFAAoF;IACpF,gBAAgB,CAAC,CACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAC/C,mFAAmF;IACnF,yBAAyB,CAAC,CACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAAC;IAChD,2BAA2B,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,kCAAkC,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ,oBAAoB,CAGtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAsFA,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD,sFAAsF;AACtF,MAAM,UAAU,yBAAyB,CACvC,KAAgC,EAChC,QAAQ,GAAG,6BAA6B;IAExC,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,IAAI,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAEzE,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC;QAC5D,IAAI,KAAK,GAAG,cAAc,GAAG,QAAQ;YAAE,MAAM;QAC7C,IAAI,IAAI,SAAS,CAAC;QAClB,KAAK,IAAI,cAAc,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAuID;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAAoC,EACpC,IAAa;IAEb,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -33,6 +33,29 @@ export interface ToolExecutionReceiptStore {
|
|
|
33
33
|
result?: string;
|
|
34
34
|
}): Promise<ToolExecutionReceipt>;
|
|
35
35
|
}
|
|
36
|
+
export interface SettleToolExecutionReceiptOptions {
|
|
37
|
+
/** Stops any additional commit attempt after the current one settles. */
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Safe terminal error for a tool whose result exists but whose durable receipt
|
|
42
|
+
* could not be confirmed. The original database error is retained as a
|
|
43
|
+
* non-enumerable cause and must never be serialized into public Run events.
|
|
44
|
+
*/
|
|
45
|
+
export declare class ToolReceiptSettlementError extends Error {
|
|
46
|
+
readonly name = "ToolReceiptSettlementError";
|
|
47
|
+
readonly code = "tool_receipt_settlement_failed";
|
|
48
|
+
readonly operation = "tool_receipt_settle";
|
|
49
|
+
readonly attempts: number;
|
|
50
|
+
readonly causeCode?: string;
|
|
51
|
+
constructor(attempts: number, cause: unknown);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Confirm the same terminal receipt with bounded retries. A retry never claims
|
|
55
|
+
* or executes the tool again. Atomic stores can therefore recover both a
|
|
56
|
+
* failure before commit and a lost acknowledgement after commit.
|
|
57
|
+
*/
|
|
58
|
+
export declare function settleToolExecutionReceiptWithRetry(store: ToolExecutionReceiptStore, input: Parameters<ToolExecutionReceiptStore["settle"]>[0], options?: SettleToolExecutionReceiptOptions): Promise<ToolExecutionReceipt>;
|
|
36
59
|
export declare function toolArgumentsFingerprint(toolName: string, args: Readonly<Record<string, unknown>>): string;
|
|
37
60
|
/** Request-local default. Hosts can supply a durable atomic store for resume. */
|
|
38
61
|
export declare class InMemoryToolExecutionReceiptStore implements ToolExecutionReceiptStore {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-execution-receipts.d.ts","sourceRoot":"","sources":["../src/tool-execution-receipts.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GACjC,UAAU,GACV,WAAW,GACX,UAAU,GACV,SAAS,GACT,WAAW,GACX,QAAQ,GACR,iBAAiB,CAAC;AAEtB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9F;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,GAAG,0BAA0B,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExK,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,KAAK,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,oBAAoB,EAAE,MAAM,CAAC;KAC9B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,iBAAiB,CAAC;QAClD,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"tool-execution-receipts.d.ts","sourceRoot":"","sources":["../src/tool-execution-receipts.ts"],"names":[],"mappings":"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"}
|