@dudousxd/nestjs-agent-core 0.40.0 → 0.42.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/README.md +7 -0
- package/dist/ag-ui/index.cjs +46 -10
- package/dist/ag-ui/index.cjs.map +1 -1
- package/dist/ag-ui/index.d.cts +9 -3
- package/dist/ag-ui/index.d.ts +9 -3
- package/dist/ag-ui/index.js +46 -10
- package/dist/ag-ui/index.js.map +1 -1
- package/dist/{catalog-CrzetM3_.d.cts → catalog-BKS3Yxo6.d.cts} +2 -0
- package/dist/{catalog-CrzetM3_.d.ts → catalog-BKS3Yxo6.d.ts} +2 -0
- package/dist/genui/builtins.cjs.map +1 -1
- package/dist/genui/builtins.d.cts +1 -1
- package/dist/genui/builtins.d.ts +1 -1
- package/dist/genui/builtins.js.map +1 -1
- package/dist/genui/index.cjs +660 -68
- package/dist/genui/index.cjs.map +1 -1
- package/dist/genui/index.d.cts +5 -5
- package/dist/genui/index.d.ts +5 -5
- package/dist/genui/index.js +654 -68
- package/dist/genui/index.js.map +1 -1
- package/dist/guardrails/index.cjs +3 -1
- package/dist/guardrails/index.cjs.map +1 -1
- package/dist/guardrails/index.d.cts +5 -4
- package/dist/guardrails/index.d.ts +5 -4
- package/dist/guardrails/index.js +3 -1
- package/dist/guardrails/index.js.map +1 -1
- package/dist/index.cjs +1164 -421
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +124 -13
- package/dist/index.d.ts +124 -13
- package/dist/index.js +1156 -421
- package/dist/index.js.map +1 -1
- package/dist/{processors-BR3nICcp.d.ts → processors-BKILjME5.d.ts} +1 -1
- package/dist/{processors-B7nfbU6E.d.cts → processors-DpHBqRuE.d.cts} +1 -1
- package/dist/{stream-events-M0jc7lSW.d.cts → stream-events-C-pj3bVY.d.cts} +92 -4
- package/dist/{stream-events-DAmes2Of.d.ts → stream-events-D92SgfRk.d.ts} +92 -4
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -69,6 +69,8 @@ __export(src_exports, {
|
|
|
69
69
|
DEFAULT_MAX_SKILLS: () => DEFAULT_MAX_SKILLS,
|
|
70
70
|
DEFAULT_REFUSAL_REASON: () => DEFAULT_REFUSAL_REASON,
|
|
71
71
|
DEFAULT_STRUCTURED_OUTPUT_INSTRUCTION: () => DEFAULT_STRUCTURED_OUTPUT_INSTRUCTION,
|
|
72
|
+
DEFAULT_TEXT_ACTION_PROPOSAL_REPLIES: () => DEFAULT_TEXT_ACTION_PROPOSAL_REPLIES,
|
|
73
|
+
DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY: () => DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY,
|
|
72
74
|
DEFAULT_TOOL_TRANSIENT_RETRY_ATTEMPTS: () => DEFAULT_TOOL_TRANSIENT_RETRY_ATTEMPTS,
|
|
73
75
|
DEFAULT_TOOL_TRANSIENT_RETRY_BACKOFF_MS: () => DEFAULT_TOOL_TRANSIENT_RETRY_BACKOFF_MS,
|
|
74
76
|
DefaultApprovalPolicy: () => DefaultApprovalPolicy,
|
|
@@ -126,12 +128,13 @@ __export(src_exports, {
|
|
|
126
128
|
buildSkillsBlock: () => buildSkillsBlock,
|
|
127
129
|
canActorUseTool: () => canActorUseTool,
|
|
128
130
|
canonicalActionProposalJson: () => canonicalActionProposalJson,
|
|
129
|
-
canonicalJson: () =>
|
|
131
|
+
canonicalJson: () => canonicalJson2,
|
|
130
132
|
claimActionProposalOutcome: () => claimActionProposalOutcome,
|
|
131
133
|
closeEmptyRoles: () => closeEmptyRoles,
|
|
132
134
|
compositeSkillProvider: () => compositeSkillProvider,
|
|
133
135
|
confirmTokenExpiry: () => confirmTokenExpiry,
|
|
134
136
|
createFrameBuffer: () => createFrameBuffer,
|
|
137
|
+
createFunctionalTool: () => createFunctionalTool,
|
|
135
138
|
createIncrementalGate: () => createIncrementalGate,
|
|
136
139
|
createNegotiatedUiCollector: () => createNegotiatedUiCollector,
|
|
137
140
|
createNoopEmitUi: () => createNoopEmitUi,
|
|
@@ -145,6 +148,7 @@ __export(src_exports, {
|
|
|
145
148
|
detachedDelivered: () => detachedDelivered,
|
|
146
149
|
detachedStarted: () => detachedStarted,
|
|
147
150
|
detachedUnsettled: () => detachedUnsettled,
|
|
151
|
+
emitToolPresentations: () => emitToolPresentations,
|
|
148
152
|
encodeStreamEvent: () => encodeStreamEvent,
|
|
149
153
|
escapeUnsafeToolUiText: () => escapeUnsafeToolUiText,
|
|
150
154
|
estimateCost: () => estimateCost,
|
|
@@ -183,6 +187,7 @@ __export(src_exports, {
|
|
|
183
187
|
parseTextActionProposalCommand: () => parseTextActionProposalCommand,
|
|
184
188
|
personaCatalogEntry: () => personaCatalogEntry,
|
|
185
189
|
prepareActionProposal: () => prepareActionProposal,
|
|
190
|
+
ptBrActionProposalText: () => ptBrActionProposalText,
|
|
186
191
|
publishAgentDelegated: () => publishAgentDelegated,
|
|
187
192
|
publishAgentMemoryResolved: () => publishAgentMemoryResolved,
|
|
188
193
|
publishAgentMemoryWritten: () => publishAgentMemoryWritten,
|
|
@@ -239,6 +244,9 @@ __export(src_exports, {
|
|
|
239
244
|
streamFailure: () => streamFailure,
|
|
240
245
|
summarizeWithModel: () => summarizeWithModel,
|
|
241
246
|
tenantScope: () => tenantScope,
|
|
247
|
+
textActionProposalReply: () => textActionProposalReply,
|
|
248
|
+
toActionProposalMutationView: () => toActionProposalMutationView,
|
|
249
|
+
toActionProposalView: () => toActionProposalView,
|
|
242
250
|
toolCallApprovalFromRow: () => toolCallApprovalFromRow,
|
|
243
251
|
toolCallContext: () => toolCallContext,
|
|
244
252
|
traceLlmTurn: () => traceLlmTurn,
|
|
@@ -800,37 +808,37 @@ async function mayDecideApproval(policy, actor, decision) {
|
|
|
800
808
|
return defaultCanDecide(actor, decision);
|
|
801
809
|
}
|
|
802
810
|
__name(mayDecideApproval, "mayDecideApproval");
|
|
803
|
-
function toolCallApprovalFromRow(
|
|
804
|
-
if (
|
|
811
|
+
function toolCallApprovalFromRow(row2) {
|
|
812
|
+
if (row2.approver === null || row2.approver === void 0) {
|
|
805
813
|
return null;
|
|
806
814
|
}
|
|
807
|
-
const status =
|
|
808
|
-
const expiresAt =
|
|
815
|
+
const status = row2.status === "pending_approval" || row2.status === "proposed" ? "pending" : row2.status === "rejected" ? "rejected" : row2.status === "expired" ? "expired" : "approved";
|
|
816
|
+
const expiresAt = row2.expiresAt instanceof Date ? row2.expiresAt.toISOString() : typeof row2.expiresAt === "string" ? row2.expiresAt : void 0;
|
|
809
817
|
const decided = status === "approved" || status === "rejected";
|
|
810
818
|
return {
|
|
811
|
-
toolCallId:
|
|
812
|
-
...
|
|
813
|
-
proposalId:
|
|
819
|
+
toolCallId: row2.toolCallId,
|
|
820
|
+
...row2.proposalId != null ? {
|
|
821
|
+
proposalId: row2.proposalId
|
|
814
822
|
} : {},
|
|
815
|
-
approver:
|
|
816
|
-
...
|
|
817
|
-
confirmation:
|
|
823
|
+
approver: row2.approver,
|
|
824
|
+
...row2.confirmation != null ? {
|
|
825
|
+
confirmation: row2.confirmation
|
|
818
826
|
} : {},
|
|
819
827
|
status,
|
|
820
828
|
...expiresAt !== void 0 ? {
|
|
821
829
|
expiresAt
|
|
822
830
|
} : {},
|
|
823
|
-
...
|
|
831
|
+
...row2.remember === true ? {
|
|
824
832
|
remember: true
|
|
825
833
|
} : {},
|
|
826
|
-
...decided && typeof
|
|
827
|
-
decidedBy:
|
|
834
|
+
...decided && typeof row2.executedByRef === "string" ? {
|
|
835
|
+
decidedBy: row2.executedByRef
|
|
828
836
|
} : {},
|
|
829
|
-
...decided && typeof
|
|
830
|
-
decidedVia:
|
|
837
|
+
...decided && typeof row2.decidedVia === "string" ? {
|
|
838
|
+
decidedVia: row2.decidedVia
|
|
831
839
|
} : {},
|
|
832
|
-
...status === "rejected" && typeof
|
|
833
|
-
reason:
|
|
840
|
+
...status === "rejected" && typeof row2.error === "string" ? {
|
|
841
|
+
reason: row2.error
|
|
834
842
|
} : {}
|
|
835
843
|
};
|
|
836
844
|
}
|
|
@@ -847,24 +855,24 @@ function estimateCost(usage, price) {
|
|
|
847
855
|
return uncachedInputTokens / 1e6 * price.inputPricePer1m + cacheWriteTokens / 1e6 * (price.cacheWritePricePer1m ?? price.inputPricePer1m) + cacheReadTokens / 1e6 * (price.cacheReadPricePer1m ?? price.inputPricePer1m) + usage.outputTokens / 1e6 * price.outputPricePer1m;
|
|
848
856
|
}
|
|
849
857
|
__name(estimateCost, "estimateCost");
|
|
850
|
-
function rowCost(
|
|
851
|
-
return
|
|
858
|
+
function rowCost(row2, prices) {
|
|
859
|
+
return row2.costUsd ?? estimateCost(row2, prices.get(row2.modelId));
|
|
852
860
|
}
|
|
853
861
|
__name(rowCost, "rowCost");
|
|
854
862
|
function bucketByModel(rows, prices) {
|
|
855
863
|
const byModel = /* @__PURE__ */ new Map();
|
|
856
|
-
for (const
|
|
857
|
-
const bucket = byModel.get(
|
|
864
|
+
for (const row2 of rows) {
|
|
865
|
+
const bucket = byModel.get(row2.modelId) ?? {
|
|
858
866
|
requests: 0,
|
|
859
867
|
inputTokens: 0,
|
|
860
868
|
outputTokens: 0,
|
|
861
869
|
costUsd: 0
|
|
862
870
|
};
|
|
863
871
|
bucket.requests += 1;
|
|
864
|
-
bucket.inputTokens +=
|
|
865
|
-
bucket.outputTokens +=
|
|
866
|
-
bucket.costUsd += rowCost(
|
|
867
|
-
byModel.set(
|
|
872
|
+
bucket.inputTokens += row2.inputTokens;
|
|
873
|
+
bucket.outputTokens += row2.outputTokens;
|
|
874
|
+
bucket.costUsd += rowCost(row2, prices);
|
|
875
|
+
byModel.set(row2.modelId, bucket);
|
|
868
876
|
}
|
|
869
877
|
const result2 = [];
|
|
870
878
|
for (const [modelId, bucket] of byModel) {
|
|
@@ -882,18 +890,18 @@ function bucketByModel(rows, prices) {
|
|
|
882
890
|
__name(bucketByModel, "bucketByModel");
|
|
883
891
|
function bucketByActor(rows, prices) {
|
|
884
892
|
const byActor = /* @__PURE__ */ new Map();
|
|
885
|
-
for (const
|
|
886
|
-
const bucket = byActor.get(
|
|
893
|
+
for (const row2 of rows) {
|
|
894
|
+
const bucket = byActor.get(row2.actorRef) ?? {
|
|
887
895
|
requests: 0,
|
|
888
896
|
totalTokens: 0,
|
|
889
897
|
costUsd: 0,
|
|
890
898
|
threadIds: /* @__PURE__ */ new Set()
|
|
891
899
|
};
|
|
892
900
|
bucket.requests += 1;
|
|
893
|
-
bucket.totalTokens +=
|
|
894
|
-
bucket.costUsd += rowCost(
|
|
895
|
-
bucket.threadIds.add(
|
|
896
|
-
byActor.set(
|
|
901
|
+
bucket.totalTokens += row2.inputTokens + row2.outputTokens;
|
|
902
|
+
bucket.costUsd += rowCost(row2, prices);
|
|
903
|
+
bucket.threadIds.add(row2.threadId);
|
|
904
|
+
byActor.set(row2.actorRef, bucket);
|
|
897
905
|
}
|
|
898
906
|
const result2 = [];
|
|
899
907
|
for (const [actorRef, bucket] of byActor) {
|
|
@@ -911,16 +919,16 @@ function bucketByActor(rows, prices) {
|
|
|
911
919
|
__name(bucketByActor, "bucketByActor");
|
|
912
920
|
function bucketByThread(rows, prices, threads, options) {
|
|
913
921
|
const byThread = /* @__PURE__ */ new Map();
|
|
914
|
-
for (const
|
|
915
|
-
const bucket = byThread.get(
|
|
922
|
+
for (const row2 of rows) {
|
|
923
|
+
const bucket = byThread.get(row2.threadId) ?? {
|
|
916
924
|
requests: 0,
|
|
917
925
|
totalTokens: 0,
|
|
918
926
|
costUsd: 0
|
|
919
927
|
};
|
|
920
928
|
bucket.requests += 1;
|
|
921
|
-
bucket.totalTokens +=
|
|
922
|
-
bucket.costUsd += rowCost(
|
|
923
|
-
byThread.set(
|
|
929
|
+
bucket.totalTokens += row2.inputTokens + row2.outputTokens;
|
|
930
|
+
bucket.costUsd += rowCost(row2, prices);
|
|
931
|
+
byThread.set(row2.threadId, bucket);
|
|
924
932
|
}
|
|
925
933
|
const result2 = [];
|
|
926
934
|
for (const [threadId, bucket] of byThread) {
|
|
@@ -949,26 +957,26 @@ function rollupThreadUsage(rows, prices) {
|
|
|
949
957
|
totalTokens: 0,
|
|
950
958
|
costUsd: 0
|
|
951
959
|
};
|
|
952
|
-
for (const
|
|
960
|
+
for (const row2 of rows) {
|
|
953
961
|
rollup.requests += 1;
|
|
954
|
-
rollup.inputTokens +=
|
|
955
|
-
rollup.outputTokens +=
|
|
956
|
-
rollup.totalTokens +=
|
|
957
|
-
rollup.costUsd += rowCost(
|
|
962
|
+
rollup.inputTokens += row2.inputTokens;
|
|
963
|
+
rollup.outputTokens += row2.outputTokens;
|
|
964
|
+
rollup.totalTokens += row2.inputTokens + row2.outputTokens;
|
|
965
|
+
rollup.costUsd += rowCost(row2, prices);
|
|
958
966
|
}
|
|
959
967
|
return rollup;
|
|
960
968
|
}
|
|
961
969
|
__name(rollupThreadUsage, "rollupThreadUsage");
|
|
962
970
|
function bucketUsageTrend(rows, prices) {
|
|
963
971
|
const byDay = /* @__PURE__ */ new Map();
|
|
964
|
-
for (const
|
|
965
|
-
const bucket = byDay.get(
|
|
972
|
+
for (const row2 of rows) {
|
|
973
|
+
const bucket = byDay.get(row2.day) ?? {
|
|
966
974
|
totalTokens: 0,
|
|
967
975
|
costUsd: 0
|
|
968
976
|
};
|
|
969
|
-
bucket.totalTokens +=
|
|
970
|
-
bucket.costUsd += rowCost(
|
|
971
|
-
byDay.set(
|
|
977
|
+
bucket.totalTokens += row2.inputTokens + row2.outputTokens;
|
|
978
|
+
bucket.costUsd += rowCost(row2, prices);
|
|
979
|
+
byDay.set(row2.day, bucket);
|
|
972
980
|
}
|
|
973
981
|
const result2 = [];
|
|
974
982
|
for (const [day, bucket] of byDay) {
|
|
@@ -1004,7 +1012,7 @@ async function filterToolsByEnabled(entries) {
|
|
|
1004
1012
|
entry,
|
|
1005
1013
|
enabled: await isToolEnabled(entry.spec, entry.handler)
|
|
1006
1014
|
})));
|
|
1007
|
-
return checked.filter((
|
|
1015
|
+
return checked.filter((row2) => row2.enabled).map((row2) => row2.entry);
|
|
1008
1016
|
}
|
|
1009
1017
|
__name(filterToolsByEnabled, "filterToolsByEnabled");
|
|
1010
1018
|
async function canActorUseTool(actor, handler) {
|
|
@@ -1016,7 +1024,7 @@ async function filterToolsByCanUse(entries, actor) {
|
|
|
1016
1024
|
entry,
|
|
1017
1025
|
allowed: await canActorUseTool(actor, entry.handler)
|
|
1018
1026
|
})));
|
|
1019
|
-
return checked.filter((
|
|
1027
|
+
return checked.filter((row2) => row2.allowed).map((row2) => row2.entry);
|
|
1020
1028
|
}
|
|
1021
1029
|
__name(filterToolsByCanUse, "filterToolsByCanUse");
|
|
1022
1030
|
async function filterToolsByRole(tools, actor, policy) {
|
|
@@ -2916,20 +2924,20 @@ function validateActionProposalDiscoveryIndexBatch(command) {
|
|
|
2916
2924
|
__name(validateActionProposalDiscoveryIndexBatch, "validateActionProposalDiscoveryIndexBatch");
|
|
2917
2925
|
|
|
2918
2926
|
// src/action-proposal-outcome.ts
|
|
2919
|
-
function attachActionProposalOutcome(
|
|
2920
|
-
if (
|
|
2921
|
-
const execution =
|
|
2927
|
+
function attachActionProposalOutcome(row2, now, ui = [], text) {
|
|
2928
|
+
if (row2.outcome) return row2;
|
|
2929
|
+
const execution = row2.execution;
|
|
2922
2930
|
const outcome = {
|
|
2923
|
-
id: `${
|
|
2924
|
-
proposalId:
|
|
2931
|
+
id: `${row2.id}:outcome:1`,
|
|
2932
|
+
proposalId: row2.id,
|
|
2925
2933
|
outcomeVersion: 1,
|
|
2926
|
-
tenantRef:
|
|
2927
|
-
actorRef:
|
|
2928
|
-
threadId:
|
|
2929
|
-
originRunId:
|
|
2930
|
-
originToolCallId:
|
|
2931
|
-
toolName:
|
|
2932
|
-
decision:
|
|
2934
|
+
tenantRef: row2.tenantRef,
|
|
2935
|
+
actorRef: row2.actorRef,
|
|
2936
|
+
threadId: row2.threadId,
|
|
2937
|
+
originRunId: row2.originRunId,
|
|
2938
|
+
originToolCallId: row2.originToolCallId,
|
|
2939
|
+
toolName: row2.toolName,
|
|
2940
|
+
decision: row2.decision,
|
|
2933
2941
|
ui,
|
|
2934
2942
|
createdAt: now,
|
|
2935
2943
|
...text !== void 0 ? {
|
|
@@ -2943,12 +2951,12 @@ function attachActionProposalOutcome(row, now, ui = [], text) {
|
|
|
2943
2951
|
} : {},
|
|
2944
2952
|
...execution?.error !== void 0 ? {
|
|
2945
2953
|
error: execution.error
|
|
2946
|
-
} :
|
|
2947
|
-
error:
|
|
2954
|
+
} : row2.decisionAudit?.reason !== void 0 ? {
|
|
2955
|
+
error: row2.decisionAudit.reason
|
|
2948
2956
|
} : {}
|
|
2949
2957
|
};
|
|
2950
2958
|
return snapshotActionProposal({
|
|
2951
|
-
...
|
|
2959
|
+
...row2,
|
|
2952
2960
|
outcome,
|
|
2953
2961
|
outcomeDelivery: {
|
|
2954
2962
|
status: "pending",
|
|
@@ -2958,13 +2966,13 @@ function attachActionProposalOutcome(row, now, ui = [], text) {
|
|
|
2958
2966
|
});
|
|
2959
2967
|
}
|
|
2960
2968
|
__name(attachActionProposalOutcome, "attachActionProposalOutcome");
|
|
2961
|
-
function claimActionProposalOutcome(
|
|
2969
|
+
function claimActionProposalOutcome(row2, command, now, token) {
|
|
2962
2970
|
validateActionProposalWorkerClaim(command, now);
|
|
2963
|
-
const delivery =
|
|
2964
|
-
if (!
|
|
2971
|
+
const delivery = row2.outcomeDelivery;
|
|
2972
|
+
if (!row2.outcome || !delivery || delivery.status !== "pending" || delivery.lease && now < delivery.lease.expiresAt) return null;
|
|
2965
2973
|
const generation = delivery.generation + 1;
|
|
2966
2974
|
return snapshotActionProposal({
|
|
2967
|
-
...
|
|
2975
|
+
...row2,
|
|
2968
2976
|
outcomeDelivery: {
|
|
2969
2977
|
...delivery,
|
|
2970
2978
|
generation,
|
|
@@ -2978,11 +2986,11 @@ function claimActionProposalOutcome(row, command, now, token) {
|
|
|
2978
2986
|
});
|
|
2979
2987
|
}
|
|
2980
2988
|
__name(claimActionProposalOutcome, "claimActionProposalOutcome");
|
|
2981
|
-
function actionProposalOutcomeFenceValid(
|
|
2989
|
+
function actionProposalOutcomeFenceValid(row2, command, now) {
|
|
2982
2990
|
if (!Number.isSafeInteger(now)) throw new RangeError("Invalid server clock");
|
|
2983
2991
|
if (typeof command.token !== "string" || !command.token || !Number.isSafeInteger(command.generation) || command.generation < 1 || typeof command.outcomeId !== "string" || !command.outcomeId) throw new TypeError("Invalid outcome fence");
|
|
2984
|
-
const delivery =
|
|
2985
|
-
return
|
|
2992
|
+
const delivery = row2.outcomeDelivery;
|
|
2993
|
+
return row2.outcome?.id === command.outcomeId && delivery?.status === "pending" && delivery.generation === command.generation && delivery.lease?.token === command.token && delivery.lease.generation === command.generation && now < delivery.lease.expiresAt;
|
|
2986
2994
|
}
|
|
2987
2995
|
__name(actionProposalOutcomeFenceValid, "actionProposalOutcomeFenceValid");
|
|
2988
2996
|
function outcomeSummary(outcome) {
|
|
@@ -3157,21 +3165,21 @@ function check(schema, value, path, root, issues, depth) {
|
|
|
3157
3165
|
});
|
|
3158
3166
|
return;
|
|
3159
3167
|
}
|
|
3160
|
-
const
|
|
3161
|
-
if (typeof
|
|
3162
|
-
const target = resolveRef(root,
|
|
3168
|
+
const s2 = schema;
|
|
3169
|
+
if (typeof s2.$ref === "string") {
|
|
3170
|
+
const target = resolveRef(root, s2.$ref);
|
|
3163
3171
|
if (target === void 0) {
|
|
3164
3172
|
issues.push({
|
|
3165
3173
|
path,
|
|
3166
|
-
message: `references unknown schema ${
|
|
3174
|
+
message: `references unknown schema ${s2.$ref}`
|
|
3167
3175
|
});
|
|
3168
3176
|
return;
|
|
3169
3177
|
}
|
|
3170
3178
|
check(target, value, path, root, issues, depth + 1);
|
|
3171
3179
|
}
|
|
3172
|
-
if (
|
|
3173
|
-
const types = Array.isArray(
|
|
3174
|
-
|
|
3180
|
+
if (s2.type !== void 0) {
|
|
3181
|
+
const types = Array.isArray(s2.type) ? s2.type : [
|
|
3182
|
+
s2.type
|
|
3175
3183
|
];
|
|
3176
3184
|
if (!types.some((type) => matchesType(type, value))) {
|
|
3177
3185
|
issues.push({
|
|
@@ -3181,76 +3189,76 @@ function check(schema, value, path, root, issues, depth) {
|
|
|
3181
3189
|
return;
|
|
3182
3190
|
}
|
|
3183
3191
|
}
|
|
3184
|
-
if (Array.isArray(
|
|
3192
|
+
if (Array.isArray(s2.enum) && !s2.enum.some((option) => deepEqual(option, value))) {
|
|
3185
3193
|
issues.push({
|
|
3186
3194
|
path,
|
|
3187
|
-
message: `must be one of ${
|
|
3195
|
+
message: `must be one of ${s2.enum.map((option) => JSON.stringify(option)).join(", ")}`
|
|
3188
3196
|
});
|
|
3189
3197
|
}
|
|
3190
|
-
if ("const" in
|
|
3198
|
+
if ("const" in s2 && !deepEqual(s2.const, value)) {
|
|
3191
3199
|
issues.push({
|
|
3192
3200
|
path,
|
|
3193
|
-
message: `must be ${JSON.stringify(
|
|
3201
|
+
message: `must be ${JSON.stringify(s2.const)}`
|
|
3194
3202
|
});
|
|
3195
3203
|
}
|
|
3196
3204
|
if (typeof value === "string") {
|
|
3197
|
-
if (typeof
|
|
3205
|
+
if (typeof s2.minLength === "number" && value.length < s2.minLength) {
|
|
3198
3206
|
issues.push({
|
|
3199
3207
|
path,
|
|
3200
|
-
message: `must be at least ${
|
|
3208
|
+
message: `must be at least ${s2.minLength} characters`
|
|
3201
3209
|
});
|
|
3202
3210
|
}
|
|
3203
|
-
if (typeof
|
|
3211
|
+
if (typeof s2.maxLength === "number" && value.length > s2.maxLength) {
|
|
3204
3212
|
issues.push({
|
|
3205
3213
|
path,
|
|
3206
|
-
message: `must be at most ${
|
|
3214
|
+
message: `must be at most ${s2.maxLength} characters`
|
|
3207
3215
|
});
|
|
3208
3216
|
}
|
|
3209
|
-
if (typeof
|
|
3217
|
+
if (typeof s2.pattern === "string") {
|
|
3210
3218
|
let pattern;
|
|
3211
3219
|
try {
|
|
3212
|
-
pattern = new RegExp(
|
|
3220
|
+
pattern = new RegExp(s2.pattern, "u");
|
|
3213
3221
|
} catch {
|
|
3214
3222
|
pattern = void 0;
|
|
3215
3223
|
}
|
|
3216
3224
|
if (pattern !== void 0 && !pattern.test(value)) {
|
|
3217
3225
|
issues.push({
|
|
3218
3226
|
path,
|
|
3219
|
-
message: `must match ${
|
|
3227
|
+
message: `must match ${s2.pattern}`
|
|
3220
3228
|
});
|
|
3221
3229
|
}
|
|
3222
3230
|
}
|
|
3223
3231
|
}
|
|
3224
3232
|
if (typeof value === "number") {
|
|
3225
|
-
if (typeof
|
|
3233
|
+
if (typeof s2.minimum === "number" && value < s2.minimum) {
|
|
3226
3234
|
issues.push({
|
|
3227
3235
|
path,
|
|
3228
|
-
message: `must be >= ${
|
|
3236
|
+
message: `must be >= ${s2.minimum}`
|
|
3229
3237
|
});
|
|
3230
3238
|
}
|
|
3231
|
-
if (typeof
|
|
3239
|
+
if (typeof s2.maximum === "number" && value > s2.maximum) {
|
|
3232
3240
|
issues.push({
|
|
3233
3241
|
path,
|
|
3234
|
-
message: `must be <= ${
|
|
3242
|
+
message: `must be <= ${s2.maximum}`
|
|
3235
3243
|
});
|
|
3236
3244
|
}
|
|
3237
3245
|
}
|
|
3238
3246
|
if (Array.isArray(value)) {
|
|
3239
|
-
if (typeof
|
|
3247
|
+
if (typeof s2.minItems === "number" && value.length < s2.minItems) {
|
|
3240
3248
|
issues.push({
|
|
3241
3249
|
path,
|
|
3242
|
-
message: `must have at least ${
|
|
3250
|
+
message: `must have at least ${s2.minItems} items`
|
|
3243
3251
|
});
|
|
3244
3252
|
}
|
|
3245
|
-
if (typeof
|
|
3253
|
+
if (typeof s2.maxItems === "number" && value.length > s2.maxItems) {
|
|
3246
3254
|
issues.push({
|
|
3247
3255
|
path,
|
|
3248
|
-
message: `must have at most ${
|
|
3256
|
+
message: `must have at most ${s2.maxItems} items`
|
|
3249
3257
|
});
|
|
3250
3258
|
}
|
|
3251
|
-
if (
|
|
3259
|
+
if (s2.items !== void 0 && !Array.isArray(s2.items)) {
|
|
3252
3260
|
value.forEach((item, index) => {
|
|
3253
|
-
check(
|
|
3261
|
+
check(s2.items, item, [
|
|
3254
3262
|
...path,
|
|
3255
3263
|
index
|
|
3256
3264
|
], root, issues, depth + 1);
|
|
@@ -3259,9 +3267,9 @@ function check(schema, value, path, root, issues, depth) {
|
|
|
3259
3267
|
}
|
|
3260
3268
|
if (matchesType("object", value)) {
|
|
3261
3269
|
const record2 = value;
|
|
3262
|
-
const properties = typeof
|
|
3263
|
-
if (Array.isArray(
|
|
3264
|
-
for (const key of
|
|
3270
|
+
const properties = typeof s2.properties === "object" && s2.properties !== null ? s2.properties : {};
|
|
3271
|
+
if (Array.isArray(s2.required)) {
|
|
3272
|
+
for (const key of s2.required) {
|
|
3265
3273
|
if (record2[key] === void 0) {
|
|
3266
3274
|
issues.push({
|
|
3267
3275
|
path: [
|
|
@@ -3281,7 +3289,7 @@ function check(schema, value, path, root, issues, depth) {
|
|
|
3281
3289
|
key
|
|
3282
3290
|
], root, issues, depth + 1);
|
|
3283
3291
|
}
|
|
3284
|
-
} else if (
|
|
3292
|
+
} else if (s2.additionalProperties === false) {
|
|
3285
3293
|
issues.push({
|
|
3286
3294
|
path: [
|
|
3287
3295
|
...path,
|
|
@@ -3289,34 +3297,34 @@ function check(schema, value, path, root, issues, depth) {
|
|
|
3289
3297
|
],
|
|
3290
3298
|
message: "is not a known property"
|
|
3291
3299
|
});
|
|
3292
|
-
} else if (typeof
|
|
3293
|
-
check(
|
|
3300
|
+
} else if (typeof s2.additionalProperties === "object" && s2.additionalProperties !== null) {
|
|
3301
|
+
check(s2.additionalProperties, entry, [
|
|
3294
3302
|
...path,
|
|
3295
3303
|
key
|
|
3296
3304
|
], root, issues, depth + 1);
|
|
3297
3305
|
}
|
|
3298
3306
|
}
|
|
3299
3307
|
}
|
|
3300
|
-
if (Array.isArray(
|
|
3301
|
-
for (const sub of
|
|
3308
|
+
if (Array.isArray(s2.allOf)) {
|
|
3309
|
+
for (const sub of s2.allOf) check(sub, value, path, root, issues, depth + 1);
|
|
3302
3310
|
}
|
|
3303
|
-
if (Array.isArray(
|
|
3304
|
-
const options = Array.isArray(
|
|
3311
|
+
if (Array.isArray(s2.anyOf) || Array.isArray(s2.oneOf)) {
|
|
3312
|
+
const options = Array.isArray(s2.anyOf) ? s2.anyOf : s2.oneOf;
|
|
3305
3313
|
const passing = options.filter((sub) => {
|
|
3306
3314
|
const nested = [];
|
|
3307
3315
|
check(sub, value, path, root, nested, depth + 1);
|
|
3308
3316
|
return nested.length === 0;
|
|
3309
3317
|
}).length;
|
|
3310
|
-
if (Array.isArray(
|
|
3318
|
+
if (Array.isArray(s2.anyOf) ? passing === 0 : passing !== 1) {
|
|
3311
3319
|
issues.push({
|
|
3312
3320
|
path,
|
|
3313
|
-
message: Array.isArray(
|
|
3321
|
+
message: Array.isArray(s2.anyOf) ? "does not match any allowed shape" : "must match exactly one allowed shape"
|
|
3314
3322
|
});
|
|
3315
3323
|
}
|
|
3316
3324
|
}
|
|
3317
|
-
if (
|
|
3325
|
+
if (s2.not !== void 0) {
|
|
3318
3326
|
const nested = [];
|
|
3319
|
-
check(
|
|
3327
|
+
check(s2.not, value, path, root, nested, depth + 1);
|
|
3320
3328
|
if (nested.length === 0) {
|
|
3321
3329
|
issues.push({
|
|
3322
3330
|
path,
|
|
@@ -3373,7 +3381,7 @@ function buildCatalog(byName, validator) {
|
|
|
3373
3381
|
]
|
|
3374
3382
|
};
|
|
3375
3383
|
}
|
|
3376
|
-
const result2 = await validateProps(definition.props, props, validator);
|
|
3384
|
+
const result2 = await validateProps(definition.outputProps ?? definition.props, props, validator);
|
|
3377
3385
|
return result2;
|
|
3378
3386
|
},
|
|
3379
3387
|
validateSync(component, props) {
|
|
@@ -3389,11 +3397,11 @@ function buildCatalog(byName, validator) {
|
|
|
3389
3397
|
]
|
|
3390
3398
|
};
|
|
3391
3399
|
}
|
|
3392
|
-
return validatePropsSync(definition.props, props, validator);
|
|
3400
|
+
return validatePropsSync(definition.outputProps ?? definition.props, props, validator);
|
|
3393
3401
|
},
|
|
3394
3402
|
jsonSchemaFor(component) {
|
|
3395
3403
|
const definition = byName.get(component);
|
|
3396
|
-
return definition === void 0 ? void 0 : toJsonSchema(definition.props);
|
|
3404
|
+
return definition === void 0 ? void 0 : toJsonSchema(definition.outputProps ?? definition.props);
|
|
3397
3405
|
},
|
|
3398
3406
|
extend(more) {
|
|
3399
3407
|
const next = new Map(byName);
|
|
@@ -3409,7 +3417,7 @@ __name(buildCatalog, "buildCatalog");
|
|
|
3409
3417
|
|
|
3410
3418
|
// src/genui/tree.ts
|
|
3411
3419
|
var GENUI_TREE_COMPONENT = "genui:tree";
|
|
3412
|
-
async function validateTree(catalog, tree, limits = {}) {
|
|
3420
|
+
async function validateTree(catalog, tree, limits = {}, phase = "output") {
|
|
3413
3421
|
const maxDepth = limits.maxDepth ?? 12;
|
|
3414
3422
|
const maxNodes = limits.maxNodes ?? 200;
|
|
3415
3423
|
const issues = [];
|
|
@@ -3461,7 +3469,7 @@ async function validateTree(catalog, tree, limits = {}) {
|
|
|
3461
3469
|
});
|
|
3462
3470
|
return void 0;
|
|
3463
3471
|
}
|
|
3464
|
-
const validated = await catalog.validate(element.type, element.props ?? {});
|
|
3472
|
+
const validated = phase === "input" ? await validateProps(definition.props, element.props ?? {}, catalog.validator) : await catalog.validate(element.type, element.props ?? {});
|
|
3465
3473
|
let props = {};
|
|
3466
3474
|
if (!validated.ok) {
|
|
3467
3475
|
for (const issue4 of validated.issues) {
|
|
@@ -3821,8 +3829,8 @@ function snapshotActionProposal(value) {
|
|
|
3821
3829
|
return JSON.parse(canonicalActionProposalJson(value));
|
|
3822
3830
|
}
|
|
3823
3831
|
__name(snapshotActionProposal, "snapshotActionProposal");
|
|
3824
|
-
function actionProposalScopeMatches(
|
|
3825
|
-
return
|
|
3832
|
+
function actionProposalScopeMatches(row2, scope) {
|
|
3833
|
+
return row2.tenantRef === scope.tenantRef && row2.actorRef === scope.actorRef && row2.threadId === scope.threadId;
|
|
3826
3834
|
}
|
|
3827
3835
|
__name(actionProposalScopeMatches, "actionProposalScopeMatches");
|
|
3828
3836
|
function initialActionProposal(input, now) {
|
|
@@ -3838,9 +3846,9 @@ function initialActionProposal(input, now) {
|
|
|
3838
3846
|
});
|
|
3839
3847
|
}
|
|
3840
3848
|
__name(initialActionProposal, "initialActionProposal");
|
|
3841
|
-
function actionProposalCreationMatches(
|
|
3849
|
+
function actionProposalCreationMatches(row2, input) {
|
|
3842
3850
|
validateActionProposalCreation(input);
|
|
3843
|
-
const { decision: _decision, decisionAudit: _audit, execution: _execution, createdAt: _created, updatedAt: _updated, supersededBy: _supersededBy, outcome: _outcome, outcomeDelivery: _delivery, ...original } =
|
|
3851
|
+
const { decision: _decision, decisionAudit: _audit, execution: _execution, createdAt: _created, updatedAt: _updated, supersededBy: _supersededBy, outcome: _outcome, outcomeDelivery: _delivery, ...original } = row2;
|
|
3844
3852
|
return canonicalActionProposalJson(original) === canonicalActionProposalJson(input);
|
|
3845
3853
|
}
|
|
3846
3854
|
__name(actionProposalCreationMatches, "actionProposalCreationMatches");
|
|
@@ -3851,7 +3859,7 @@ function result(status, proposal) {
|
|
|
3851
3859
|
};
|
|
3852
3860
|
}
|
|
3853
3861
|
__name(result, "result");
|
|
3854
|
-
function transitionActionProposalDecision(
|
|
3862
|
+
function transitionActionProposalDecision(row2, command, now) {
|
|
3855
3863
|
checkTime(now);
|
|
3856
3864
|
if (![
|
|
3857
3865
|
"approved",
|
|
@@ -3862,11 +3870,11 @@ function transitionActionProposalDecision(row, command, now) {
|
|
|
3862
3870
|
checkString(command.via);
|
|
3863
3871
|
if (command.reason !== void 0 && typeof command.reason !== "string") throw new TypeError("reason must be a string");
|
|
3864
3872
|
if (command.remember !== void 0 && typeof command.remember !== "boolean") throw new TypeError("remember must be a boolean");
|
|
3865
|
-
if (
|
|
3866
|
-
return result(
|
|
3873
|
+
if (row2.decision !== "pending") {
|
|
3874
|
+
return result(row2.decision === command.decision ? "unchanged" : row2.decision === "expired" ? "expired" : "conflict", row2);
|
|
3867
3875
|
}
|
|
3868
|
-
const next = snapshotActionProposal(
|
|
3869
|
-
if (
|
|
3876
|
+
const next = snapshotActionProposal(row2);
|
|
3877
|
+
if (row2.expiresAt !== null && now >= row2.expiresAt) {
|
|
3870
3878
|
next.decision = "expired";
|
|
3871
3879
|
next.decisionAudit = {
|
|
3872
3880
|
actorRef: "system",
|
|
@@ -3876,7 +3884,7 @@ function transitionActionProposalDecision(row, command, now) {
|
|
|
3876
3884
|
next.updatedAt = now;
|
|
3877
3885
|
return result(command.decision === "expired" ? "applied" : "expired", attachActionProposalOutcome(next, now));
|
|
3878
3886
|
}
|
|
3879
|
-
if (command.decision === "expired") return result("conflict",
|
|
3887
|
+
if (command.decision === "expired") return result("conflict", row2);
|
|
3880
3888
|
const { decision, ...audit } = command;
|
|
3881
3889
|
next.decision = decision;
|
|
3882
3890
|
next.decisionAudit = {
|
|
@@ -3904,13 +3912,13 @@ function checkLeaseMs(leaseMs, now) {
|
|
|
3904
3912
|
if (!Number.isSafeInteger(leaseMs) || leaseMs <= 0 || !Number.isSafeInteger(now + leaseMs)) throw new RangeError("leaseMs must be finite and positive");
|
|
3905
3913
|
}
|
|
3906
3914
|
__name(checkLeaseMs, "checkLeaseMs");
|
|
3907
|
-
function transitionActionProposalClaim(
|
|
3915
|
+
function transitionActionProposalClaim(row2, command, now, token) {
|
|
3908
3916
|
checkLeaseMs(command.leaseMs, now);
|
|
3909
3917
|
checkString(command.workerId);
|
|
3910
3918
|
checkString(token);
|
|
3911
|
-
const execution =
|
|
3912
|
-
if (
|
|
3913
|
-
const next = snapshotActionProposal(
|
|
3919
|
+
const execution = row2.execution;
|
|
3920
|
+
if (row2.decision !== "approved" || !execution || execution.status !== "queued" && !(execution.status === "executing" && execution.lease && now >= execution.lease.expiresAt)) return result("conflict", row2);
|
|
3921
|
+
const next = snapshotActionProposal(row2);
|
|
3914
3922
|
const generation = execution.generation + 1;
|
|
3915
3923
|
next.execution = {
|
|
3916
3924
|
status: "executing",
|
|
@@ -3926,32 +3934,32 @@ function transitionActionProposalClaim(row, command, now, token) {
|
|
|
3926
3934
|
return result("applied", next);
|
|
3927
3935
|
}
|
|
3928
3936
|
__name(transitionActionProposalClaim, "transitionActionProposalClaim");
|
|
3929
|
-
function leaseStatus(
|
|
3937
|
+
function leaseStatus(row2, command, now) {
|
|
3930
3938
|
checkTime(now);
|
|
3931
3939
|
checkString(command.token);
|
|
3932
3940
|
if (!Number.isSafeInteger(command.generation) || command.generation < 1) throw new RangeError("Invalid lease generation");
|
|
3933
|
-
const work =
|
|
3934
|
-
if (
|
|
3941
|
+
const work = row2.execution;
|
|
3942
|
+
if (row2.decision !== "approved" || work?.status !== "executing" || !work.lease || work.generation !== command.generation || work.lease.generation !== command.generation || work.lease.token !== command.token) return "conflict";
|
|
3935
3943
|
return now >= work.lease.expiresAt ? "expired" : "valid";
|
|
3936
3944
|
}
|
|
3937
3945
|
__name(leaseStatus, "leaseStatus");
|
|
3938
|
-
function transitionActionProposalLease(
|
|
3946
|
+
function transitionActionProposalLease(row2, command, now) {
|
|
3939
3947
|
checkLeaseMs(command.leaseMs, now);
|
|
3940
|
-
const status = leaseStatus(
|
|
3941
|
-
if (status !== "valid") return result(status,
|
|
3942
|
-
const next = snapshotActionProposal(
|
|
3948
|
+
const status = leaseStatus(row2, command, now);
|
|
3949
|
+
if (status !== "valid") return result(status, row2);
|
|
3950
|
+
const next = snapshotActionProposal(row2);
|
|
3943
3951
|
if (next.execution?.lease) next.execution.lease.expiresAt = Math.max(next.execution.lease.expiresAt, now + command.leaseMs);
|
|
3944
3952
|
next.updatedAt = now;
|
|
3945
3953
|
return result("applied", next);
|
|
3946
3954
|
}
|
|
3947
3955
|
__name(transitionActionProposalLease, "transitionActionProposalLease");
|
|
3948
|
-
function transitionActionProposalSettlement(
|
|
3956
|
+
function transitionActionProposalSettlement(row2, command, now) {
|
|
3949
3957
|
checkTime(now);
|
|
3950
3958
|
if (command.status !== "succeeded" && command.status !== "failed") throw new TypeError("Unsupported settlement status");
|
|
3951
3959
|
if (command.status === "succeeded" && command.error !== void 0 || command.status === "failed" && (typeof command.error !== "string" || command.result !== void 0)) throw new TypeError("Ambiguous action proposal settlement");
|
|
3952
|
-
const status = leaseStatus(
|
|
3953
|
-
if (status !== "valid") return result(status,
|
|
3954
|
-
const next = snapshotActionProposal(
|
|
3960
|
+
const status = leaseStatus(row2, command, now);
|
|
3961
|
+
if (status !== "valid") return result(status, row2);
|
|
3962
|
+
const next = snapshotActionProposal(row2);
|
|
3955
3963
|
next.execution = command.status === "succeeded" ? {
|
|
3956
3964
|
status: "succeeded",
|
|
3957
3965
|
generation: command.generation,
|
|
@@ -3971,16 +3979,16 @@ function transitionActionProposalSettlement(row, command, now) {
|
|
|
3971
3979
|
return result("applied", attachActionProposalOutcome(next, now, command.ui, command.text));
|
|
3972
3980
|
}
|
|
3973
3981
|
__name(transitionActionProposalSettlement, "transitionActionProposalSettlement");
|
|
3974
|
-
function transitionActionProposalSupersession(
|
|
3982
|
+
function transitionActionProposalSupersession(row2, replacement, command, now) {
|
|
3975
3983
|
checkTime(now);
|
|
3976
3984
|
checkString(command.replacementProposalId);
|
|
3977
3985
|
checkString(command.actorRef);
|
|
3978
3986
|
checkString(command.via);
|
|
3979
|
-
if (replacement.id !== command.replacementProposalId ||
|
|
3980
|
-
if (
|
|
3981
|
-
if (
|
|
3982
|
-
if (
|
|
3983
|
-
...transitionActionProposalDecision(
|
|
3987
|
+
if (replacement.id !== command.replacementProposalId || row2.id === replacement.id || !actionProposalScopeMatches(row2, replacement) || row2.toolName !== replacement.toolName || !row2.replacementKey || row2.replacementKey !== replacement.replacementKey) return result("conflict", row2);
|
|
3988
|
+
if (row2.decision === "superseded") return result(row2.supersededBy === replacement.id ? "unchanged" : "conflict", row2);
|
|
3989
|
+
if (row2.decision !== "pending") return result("conflict", row2);
|
|
3990
|
+
if (row2.expiresAt !== null && now >= row2.expiresAt) return {
|
|
3991
|
+
...transitionActionProposalDecision(row2, {
|
|
3984
3992
|
decision: "expired",
|
|
3985
3993
|
actorRef: "system",
|
|
3986
3994
|
via: "expiry"
|
|
@@ -3988,7 +3996,7 @@ function transitionActionProposalSupersession(row, replacement, command, now) {
|
|
|
3988
3996
|
status: "expired"
|
|
3989
3997
|
};
|
|
3990
3998
|
const next = snapshotActionProposal({
|
|
3991
|
-
...
|
|
3999
|
+
...row2,
|
|
3992
4000
|
decision: "superseded",
|
|
3993
4001
|
supersededBy: replacement.id,
|
|
3994
4002
|
decisionAudit: {
|
|
@@ -4003,6 +4011,560 @@ function transitionActionProposalSupersession(row, replacement, command, now) {
|
|
|
4003
4011
|
}
|
|
4004
4012
|
__name(transitionActionProposalSupersession, "transitionActionProposalSupersession");
|
|
4005
4013
|
|
|
4014
|
+
// src/genui/builtins.ts
|
|
4015
|
+
var str = /* @__PURE__ */ __name((description, extra = {}) => ({
|
|
4016
|
+
type: "string",
|
|
4017
|
+
...description !== void 0 ? {
|
|
4018
|
+
description
|
|
4019
|
+
} : {},
|
|
4020
|
+
...extra
|
|
4021
|
+
}), "str");
|
|
4022
|
+
var obj = /* @__PURE__ */ __name((properties, required = []) => ({
|
|
4023
|
+
type: "object",
|
|
4024
|
+
properties,
|
|
4025
|
+
required,
|
|
4026
|
+
additionalProperties: false
|
|
4027
|
+
}), "obj");
|
|
4028
|
+
var arr = /* @__PURE__ */ __name((items, extra = {}) => ({
|
|
4029
|
+
type: "array",
|
|
4030
|
+
items,
|
|
4031
|
+
...extra
|
|
4032
|
+
}), "arr");
|
|
4033
|
+
var cell = {
|
|
4034
|
+
type: [
|
|
4035
|
+
"string",
|
|
4036
|
+
"number",
|
|
4037
|
+
"boolean",
|
|
4038
|
+
"null"
|
|
4039
|
+
]
|
|
4040
|
+
};
|
|
4041
|
+
var row = {
|
|
4042
|
+
type: "object",
|
|
4043
|
+
additionalProperties: cell
|
|
4044
|
+
};
|
|
4045
|
+
var s = /* @__PURE__ */ __name((value) => value === null || value === void 0 ? "" : String(value), "s");
|
|
4046
|
+
var heading = /* @__PURE__ */ __name((props) => props.title ? `*${s(props.title)}*
|
|
4047
|
+
` : "", "heading");
|
|
4048
|
+
function textTable(columns, rows, max = 15) {
|
|
4049
|
+
const shown = rows.slice(0, max);
|
|
4050
|
+
const widths = columns.map((column) => Math.min(28, Math.max(column.label.length, ...shown.map((r) => s(r[column.key]).length))));
|
|
4051
|
+
const format = /* @__PURE__ */ __name((values) => values.map((value, index) => value.slice(0, widths[index]).padEnd(widths[index] ?? 0)).join(" "), "format");
|
|
4052
|
+
const lines = [
|
|
4053
|
+
format(columns.map((column) => column.label)),
|
|
4054
|
+
widths.map((width) => "-".repeat(width)).join(" "),
|
|
4055
|
+
...shown.map((r) => format(columns.map((column) => s(r[column.key]))))
|
|
4056
|
+
];
|
|
4057
|
+
if (rows.length > max) lines.push(`\u2026 ${rows.length - max} more rows`);
|
|
4058
|
+
return `\`\`\`
|
|
4059
|
+
${lines.join("\n")}
|
|
4060
|
+
\`\`\``;
|
|
4061
|
+
}
|
|
4062
|
+
__name(textTable, "textTable");
|
|
4063
|
+
function lineDiff(before, after) {
|
|
4064
|
+
const a = before.split("\n");
|
|
4065
|
+
const b = after.split("\n");
|
|
4066
|
+
if (a.length * b.length > 25e4) {
|
|
4067
|
+
return [
|
|
4068
|
+
...a.map((text) => ({
|
|
4069
|
+
op: "del",
|
|
4070
|
+
text
|
|
4071
|
+
})),
|
|
4072
|
+
...b.map((text) => ({
|
|
4073
|
+
op: "add",
|
|
4074
|
+
text
|
|
4075
|
+
}))
|
|
4076
|
+
];
|
|
4077
|
+
}
|
|
4078
|
+
const dp = Array.from({
|
|
4079
|
+
length: a.length + 1
|
|
4080
|
+
}, () => new Array(b.length + 1).fill(0));
|
|
4081
|
+
const at = /* @__PURE__ */ __name((i2, j2) => dp[i2]?.[j2] ?? 0, "at");
|
|
4082
|
+
for (let i2 = a.length - 1; i2 >= 0; i2--) {
|
|
4083
|
+
for (let j2 = b.length - 1; j2 >= 0; j2--) {
|
|
4084
|
+
dp[i2][j2] = a[i2] === b[j2] ? at(i2 + 1, j2 + 1) + 1 : Math.max(at(i2 + 1, j2), at(i2, j2 + 1));
|
|
4085
|
+
}
|
|
4086
|
+
}
|
|
4087
|
+
const out = [];
|
|
4088
|
+
let i = 0;
|
|
4089
|
+
let j = 0;
|
|
4090
|
+
while (i < a.length && j < b.length) {
|
|
4091
|
+
if (a[i] === b[j]) {
|
|
4092
|
+
out.push({
|
|
4093
|
+
op: "same",
|
|
4094
|
+
text: a[i]
|
|
4095
|
+
});
|
|
4096
|
+
i++;
|
|
4097
|
+
j++;
|
|
4098
|
+
} else if (at(i + 1, j) >= at(i, j + 1)) {
|
|
4099
|
+
out.push({
|
|
4100
|
+
op: "del",
|
|
4101
|
+
text: a[i++]
|
|
4102
|
+
});
|
|
4103
|
+
} else {
|
|
4104
|
+
out.push({
|
|
4105
|
+
op: "add",
|
|
4106
|
+
text: b[j++]
|
|
4107
|
+
});
|
|
4108
|
+
}
|
|
4109
|
+
}
|
|
4110
|
+
while (i < a.length) out.push({
|
|
4111
|
+
op: "del",
|
|
4112
|
+
text: a[i++]
|
|
4113
|
+
});
|
|
4114
|
+
while (j < b.length) out.push({
|
|
4115
|
+
op: "add",
|
|
4116
|
+
text: b[j++]
|
|
4117
|
+
});
|
|
4118
|
+
return out;
|
|
4119
|
+
}
|
|
4120
|
+
__name(lineDiff, "lineDiff");
|
|
4121
|
+
function bar(value, max, width = 20) {
|
|
4122
|
+
const n = max > 0 ? Math.round(Math.abs(value) / max * width) : 0;
|
|
4123
|
+
return "\u2588".repeat(n) || "\u258F";
|
|
4124
|
+
}
|
|
4125
|
+
__name(bar, "bar");
|
|
4126
|
+
var DataTable = defineComponent({
|
|
4127
|
+
name: "DataTable",
|
|
4128
|
+
title: "Data table",
|
|
4129
|
+
description: "Tabular data (records with the same fields) as a sortable table. Prefer it over markdown tables for more than 3 rows.",
|
|
4130
|
+
props: obj({
|
|
4131
|
+
title: str("Short caption"),
|
|
4132
|
+
columns: arr(obj({
|
|
4133
|
+
key: str("Field name in each row"),
|
|
4134
|
+
label: str("Column header"),
|
|
4135
|
+
align: str(void 0, {
|
|
4136
|
+
enum: [
|
|
4137
|
+
"left",
|
|
4138
|
+
"right",
|
|
4139
|
+
"center"
|
|
4140
|
+
]
|
|
4141
|
+
}),
|
|
4142
|
+
format: str("How to format values", {
|
|
4143
|
+
enum: [
|
|
4144
|
+
"text",
|
|
4145
|
+
"number",
|
|
4146
|
+
"currency",
|
|
4147
|
+
"percent",
|
|
4148
|
+
"date",
|
|
4149
|
+
"link"
|
|
4150
|
+
]
|
|
4151
|
+
})
|
|
4152
|
+
}, [
|
|
4153
|
+
"key",
|
|
4154
|
+
"label"
|
|
4155
|
+
]), {
|
|
4156
|
+
minItems: 1,
|
|
4157
|
+
maxItems: 12
|
|
4158
|
+
}),
|
|
4159
|
+
rows: arr(row, {
|
|
4160
|
+
maxItems: 500
|
|
4161
|
+
})
|
|
4162
|
+
}, [
|
|
4163
|
+
"columns",
|
|
4164
|
+
"rows"
|
|
4165
|
+
]),
|
|
4166
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${heading(props)}${textTable(props.columns ?? [], props.rows ?? [])}`, "fallbackText")
|
|
4167
|
+
});
|
|
4168
|
+
var Chart = defineComponent({
|
|
4169
|
+
name: "Chart",
|
|
4170
|
+
title: "Chart",
|
|
4171
|
+
description: "`bar` to compare categories, `line` for a trend over time. `data` is a list of points; `xKey` names the category/time field and each series names a numeric field.",
|
|
4172
|
+
props: obj({
|
|
4173
|
+
type: str("Chart type", {
|
|
4174
|
+
enum: [
|
|
4175
|
+
"bar",
|
|
4176
|
+
"line"
|
|
4177
|
+
]
|
|
4178
|
+
}),
|
|
4179
|
+
title: str(),
|
|
4180
|
+
xKey: str("Field of each point used for the x axis"),
|
|
4181
|
+
series: arr(obj({
|
|
4182
|
+
key: str("Numeric field"),
|
|
4183
|
+
label: str()
|
|
4184
|
+
}, [
|
|
4185
|
+
"key"
|
|
4186
|
+
]), {
|
|
4187
|
+
minItems: 1,
|
|
4188
|
+
maxItems: 6
|
|
4189
|
+
}),
|
|
4190
|
+
data: arr(row, {
|
|
4191
|
+
minItems: 1,
|
|
4192
|
+
maxItems: 200
|
|
4193
|
+
}),
|
|
4194
|
+
unit: str("Unit shown after values, e.g. `KB` or `%`")
|
|
4195
|
+
}, [
|
|
4196
|
+
"type",
|
|
4197
|
+
"xKey",
|
|
4198
|
+
"series",
|
|
4199
|
+
"data"
|
|
4200
|
+
]),
|
|
4201
|
+
fallbackText: /* @__PURE__ */ __name((props) => {
|
|
4202
|
+
const series = props.series ?? [];
|
|
4203
|
+
const data = props.data ?? [];
|
|
4204
|
+
const first = series[0]?.key ?? "";
|
|
4205
|
+
const max = Math.max(0, ...data.map((point) => Math.abs(Number(point[first]) || 0)));
|
|
4206
|
+
const unit = props.unit ? ` ${s(props.unit)}` : "";
|
|
4207
|
+
const lines = data.slice(0, 20).map((point) => `${s(point[props.xKey]).slice(0, 18).padEnd(18)} ${bar(Number(point[first]) || 0, max)} ${s(point[first])}${unit}`);
|
|
4208
|
+
return `${heading(props)}\`\`\`
|
|
4209
|
+
${lines.join("\n")}
|
|
4210
|
+
\`\`\``;
|
|
4211
|
+
}, "fallbackText")
|
|
4212
|
+
});
|
|
4213
|
+
var KpiCards = defineComponent({
|
|
4214
|
+
name: "KpiCards",
|
|
4215
|
+
title: "KPI cards",
|
|
4216
|
+
description: "A few key numbers (metrics, totals, counts) as cards.",
|
|
4217
|
+
props: obj({
|
|
4218
|
+
title: str(),
|
|
4219
|
+
items: arr(obj({
|
|
4220
|
+
label: str(),
|
|
4221
|
+
value: {
|
|
4222
|
+
type: [
|
|
4223
|
+
"string",
|
|
4224
|
+
"number"
|
|
4225
|
+
]
|
|
4226
|
+
},
|
|
4227
|
+
delta: str("Change, e.g. `+12%`"),
|
|
4228
|
+
trend: str(void 0, {
|
|
4229
|
+
enum: [
|
|
4230
|
+
"up",
|
|
4231
|
+
"down",
|
|
4232
|
+
"flat"
|
|
4233
|
+
]
|
|
4234
|
+
}),
|
|
4235
|
+
hint: str()
|
|
4236
|
+
}, [
|
|
4237
|
+
"label",
|
|
4238
|
+
"value"
|
|
4239
|
+
]), {
|
|
4240
|
+
minItems: 1,
|
|
4241
|
+
maxItems: 8
|
|
4242
|
+
})
|
|
4243
|
+
}, [
|
|
4244
|
+
"items"
|
|
4245
|
+
]),
|
|
4246
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${heading(props)}${(props.items ?? []).map((item) => `\u2022 *${s(item.label)}:* ${s(item.value)}${item.delta ? ` (${s(item.delta)})` : ""}`).join("\n")}`, "fallbackText")
|
|
4247
|
+
});
|
|
4248
|
+
var SourceCards = defineComponent({
|
|
4249
|
+
name: "SourceCards",
|
|
4250
|
+
title: "Sources",
|
|
4251
|
+
description: "The documents, pages or links an answer is based on, as cards.",
|
|
4252
|
+
props: obj({
|
|
4253
|
+
title: str(),
|
|
4254
|
+
items: arr(obj({
|
|
4255
|
+
title: str(),
|
|
4256
|
+
url: str(),
|
|
4257
|
+
snippet: str(),
|
|
4258
|
+
source: str("e.g. Wiki, GitHub")
|
|
4259
|
+
}, [
|
|
4260
|
+
"title"
|
|
4261
|
+
]), {
|
|
4262
|
+
minItems: 1,
|
|
4263
|
+
maxItems: 12
|
|
4264
|
+
})
|
|
4265
|
+
}, [
|
|
4266
|
+
"items"
|
|
4267
|
+
]),
|
|
4268
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${heading(props)}${(props.items ?? []).map((item) => `\u2022 ${item.url ? `<${s(item.url)}|${s(item.title)}>` : s(item.title)}${item.source ? ` \u2014 ${s(item.source)}` : ""}`).join("\n")}`, "fallbackText")
|
|
4269
|
+
});
|
|
4270
|
+
var Checklist = defineComponent({
|
|
4271
|
+
name: "Checklist",
|
|
4272
|
+
title: "Checklist",
|
|
4273
|
+
description: "Steps or a to-do list with done/not-done state.",
|
|
4274
|
+
props: obj({
|
|
4275
|
+
title: str(),
|
|
4276
|
+
items: arr(obj({
|
|
4277
|
+
label: str(),
|
|
4278
|
+
done: {
|
|
4279
|
+
type: "boolean"
|
|
4280
|
+
},
|
|
4281
|
+
note: str()
|
|
4282
|
+
}, [
|
|
4283
|
+
"label"
|
|
4284
|
+
]), {
|
|
4285
|
+
minItems: 1,
|
|
4286
|
+
maxItems: 50
|
|
4287
|
+
})
|
|
4288
|
+
}, [
|
|
4289
|
+
"items"
|
|
4290
|
+
]),
|
|
4291
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${heading(props)}${(props.items ?? []).map((item) => `${item.done ? "\u2611" : "\u2610"} ${s(item.label)}${item.note ? ` \u2014 _${s(item.note)}_` : ""}`).join("\n")}`, "fallbackText")
|
|
4292
|
+
});
|
|
4293
|
+
var Timeline = defineComponent({
|
|
4294
|
+
name: "Timeline",
|
|
4295
|
+
title: "Timeline",
|
|
4296
|
+
description: "Events in chronological order (the history of a project, an incident, a deal).",
|
|
4297
|
+
props: obj({
|
|
4298
|
+
title: str(),
|
|
4299
|
+
events: arr(obj({
|
|
4300
|
+
date: str(),
|
|
4301
|
+
title: str(),
|
|
4302
|
+
description: str()
|
|
4303
|
+
}, [
|
|
4304
|
+
"title"
|
|
4305
|
+
]), {
|
|
4306
|
+
minItems: 1,
|
|
4307
|
+
maxItems: 50
|
|
4308
|
+
})
|
|
4309
|
+
}, [
|
|
4310
|
+
"events"
|
|
4311
|
+
]),
|
|
4312
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${heading(props)}${(props.events ?? []).map((event) => `\u2022 ${event.date ? `*${s(event.date)}* ` : ""}${s(event.title)}${event.description ? ` \u2014 ${s(event.description)}` : ""}`).join("\n")}`, "fallbackText")
|
|
4313
|
+
});
|
|
4314
|
+
var CodeBlock = defineComponent({
|
|
4315
|
+
name: "CodeBlock",
|
|
4316
|
+
title: "Code",
|
|
4317
|
+
description: "A code snippet or file excerpt with syntax highlighting.",
|
|
4318
|
+
props: obj({
|
|
4319
|
+
title: str(),
|
|
4320
|
+
language: str(),
|
|
4321
|
+
code: str()
|
|
4322
|
+
}, [
|
|
4323
|
+
"code"
|
|
4324
|
+
]),
|
|
4325
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${heading(props)}\`\`\`
|
|
4326
|
+
${s(props.code)}
|
|
4327
|
+
\`\`\``, "fallbackText")
|
|
4328
|
+
});
|
|
4329
|
+
var Diff = defineComponent({
|
|
4330
|
+
name: "Diff",
|
|
4331
|
+
title: "Diff",
|
|
4332
|
+
description: "A before/after change to a text or code file, as a line diff.",
|
|
4333
|
+
props: obj({
|
|
4334
|
+
title: str(),
|
|
4335
|
+
language: str(),
|
|
4336
|
+
before: str(),
|
|
4337
|
+
after: str()
|
|
4338
|
+
}, [
|
|
4339
|
+
"before",
|
|
4340
|
+
"after"
|
|
4341
|
+
]),
|
|
4342
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${heading(props)}\`\`\`
|
|
4343
|
+
${lineDiff(s(props.before), s(props.after)).map((line) => `${line.op === "add" ? "+" : line.op === "del" ? "-" : " "} ${line.text}`).join("\n")}
|
|
4344
|
+
\`\`\``, "fallbackText")
|
|
4345
|
+
});
|
|
4346
|
+
var Callout = defineComponent({
|
|
4347
|
+
name: "Callout",
|
|
4348
|
+
title: "Callout",
|
|
4349
|
+
description: "A short note, warning or success message, emphasized.",
|
|
4350
|
+
props: obj({
|
|
4351
|
+
tone: str(void 0, {
|
|
4352
|
+
enum: [
|
|
4353
|
+
"info",
|
|
4354
|
+
"success",
|
|
4355
|
+
"warning",
|
|
4356
|
+
"danger"
|
|
4357
|
+
]
|
|
4358
|
+
}),
|
|
4359
|
+
title: str(),
|
|
4360
|
+
text: str()
|
|
4361
|
+
}, [
|
|
4362
|
+
"text"
|
|
4363
|
+
]),
|
|
4364
|
+
fallbackText: /* @__PURE__ */ __name((props) => `${props.tone === "warning" || props.tone === "danger" ? ":warning: " : ":information_source: "}${heading(props)}${s(props.text)}`, "fallbackText")
|
|
4365
|
+
});
|
|
4366
|
+
var Stack = defineComponent({
|
|
4367
|
+
name: "Stack",
|
|
4368
|
+
title: "Stack",
|
|
4369
|
+
description: "Lays its children out vertically (or horizontally with direction=row).",
|
|
4370
|
+
props: obj({
|
|
4371
|
+
direction: str(void 0, {
|
|
4372
|
+
enum: [
|
|
4373
|
+
"column",
|
|
4374
|
+
"row"
|
|
4375
|
+
]
|
|
4376
|
+
}),
|
|
4377
|
+
gap: {
|
|
4378
|
+
type: "number"
|
|
4379
|
+
}
|
|
4380
|
+
}),
|
|
4381
|
+
children: true,
|
|
4382
|
+
fallbackText: /* @__PURE__ */ __name(() => "", "fallbackText")
|
|
4383
|
+
});
|
|
4384
|
+
var Card = defineComponent({
|
|
4385
|
+
name: "Card",
|
|
4386
|
+
title: "Card",
|
|
4387
|
+
description: "A box with an optional title around its children.",
|
|
4388
|
+
props: obj({
|
|
4389
|
+
title: str(),
|
|
4390
|
+
subtitle: str()
|
|
4391
|
+
}),
|
|
4392
|
+
children: true,
|
|
4393
|
+
fallbackText: /* @__PURE__ */ __name((props) => props.title ? `*${s(props.title)}*${props.subtitle ? ` \u2014 ${s(props.subtitle)}` : ""}` : "", "fallbackText")
|
|
4394
|
+
});
|
|
4395
|
+
var Heading = defineComponent({
|
|
4396
|
+
name: "Heading",
|
|
4397
|
+
title: "Heading",
|
|
4398
|
+
description: "A heading.",
|
|
4399
|
+
props: obj({
|
|
4400
|
+
text: str()
|
|
4401
|
+
}, [
|
|
4402
|
+
"text"
|
|
4403
|
+
]),
|
|
4404
|
+
fallbackText: /* @__PURE__ */ __name((props) => `*${s(props.text)}*`, "fallbackText")
|
|
4405
|
+
});
|
|
4406
|
+
var Text = defineComponent({
|
|
4407
|
+
name: "Text",
|
|
4408
|
+
title: "Text",
|
|
4409
|
+
description: "A paragraph of plain text (no markdown).",
|
|
4410
|
+
props: obj({
|
|
4411
|
+
text: str(),
|
|
4412
|
+
muted: {
|
|
4413
|
+
type: "boolean"
|
|
4414
|
+
}
|
|
4415
|
+
}, [
|
|
4416
|
+
"text"
|
|
4417
|
+
]),
|
|
4418
|
+
fallbackText: /* @__PURE__ */ __name((props) => s(props.text), "fallbackText")
|
|
4419
|
+
});
|
|
4420
|
+
var Badge = defineComponent({
|
|
4421
|
+
name: "Badge",
|
|
4422
|
+
title: "Badge",
|
|
4423
|
+
description: "A small label.",
|
|
4424
|
+
props: obj({
|
|
4425
|
+
text: str(),
|
|
4426
|
+
tone: str(void 0, {
|
|
4427
|
+
enum: [
|
|
4428
|
+
"neutral",
|
|
4429
|
+
"brand",
|
|
4430
|
+
"success",
|
|
4431
|
+
"warning",
|
|
4432
|
+
"danger"
|
|
4433
|
+
]
|
|
4434
|
+
})
|
|
4435
|
+
}, [
|
|
4436
|
+
"text"
|
|
4437
|
+
]),
|
|
4438
|
+
fallbackText: /* @__PURE__ */ __name((props) => `[${s(props.text)}]`, "fallbackText")
|
|
4439
|
+
});
|
|
4440
|
+
var Link = defineComponent({
|
|
4441
|
+
name: "Link",
|
|
4442
|
+
title: "Link",
|
|
4443
|
+
description: "A link to an http(s) URL.",
|
|
4444
|
+
props: obj({
|
|
4445
|
+
text: str(),
|
|
4446
|
+
url: str(void 0, {
|
|
4447
|
+
pattern: "^https?://"
|
|
4448
|
+
})
|
|
4449
|
+
}, [
|
|
4450
|
+
"text",
|
|
4451
|
+
"url"
|
|
4452
|
+
]),
|
|
4453
|
+
fallbackText: /* @__PURE__ */ __name((props) => `<${s(props.url)}|${s(props.text || props.url)}>`, "fallbackText")
|
|
4454
|
+
});
|
|
4455
|
+
var Image = defineComponent({
|
|
4456
|
+
name: "Image",
|
|
4457
|
+
title: "Image",
|
|
4458
|
+
description: "An image from an https URL.",
|
|
4459
|
+
props: obj({
|
|
4460
|
+
url: str(void 0, {
|
|
4461
|
+
pattern: "^https://"
|
|
4462
|
+
}),
|
|
4463
|
+
alt: str()
|
|
4464
|
+
}, [
|
|
4465
|
+
"url"
|
|
4466
|
+
]),
|
|
4467
|
+
fallbackText: /* @__PURE__ */ __name((props) => s(props.url), "fallbackText")
|
|
4468
|
+
});
|
|
4469
|
+
|
|
4470
|
+
// src/genui/registry.ts
|
|
4471
|
+
function snapshotComponentPresentation(value) {
|
|
4472
|
+
const seen = /* @__PURE__ */ new Set();
|
|
4473
|
+
const check2 = /* @__PURE__ */ __name((entry) => {
|
|
4474
|
+
if (entry === null || typeof entry === "string" || typeof entry === "boolean") return;
|
|
4475
|
+
if (typeof entry === "number" && Number.isFinite(entry)) return;
|
|
4476
|
+
if (typeof entry !== "object" || entry === null) throw new TypeError("genui: presentation must contain only JSON values");
|
|
4477
|
+
if (seen.has(entry)) throw new TypeError("genui: presentation must contain acyclic JSON values");
|
|
4478
|
+
if (!Array.isArray(entry) && Object.getPrototypeOf(entry) !== Object.prototype && Object.getPrototypeOf(entry) !== null) throw new TypeError("genui: presentation must contain plain JSON objects");
|
|
4479
|
+
seen.add(entry);
|
|
4480
|
+
for (const item of Object.values(entry)) check2(item);
|
|
4481
|
+
seen.delete(entry);
|
|
4482
|
+
}, "check");
|
|
4483
|
+
check2(value);
|
|
4484
|
+
return JSON.parse(JSON.stringify(value));
|
|
4485
|
+
}
|
|
4486
|
+
__name(snapshotComponentPresentation, "snapshotComponentPresentation");
|
|
4487
|
+
function createComponent(definition, options = {}) {
|
|
4488
|
+
defineComponent(definition);
|
|
4489
|
+
const catalog = defineCatalog([
|
|
4490
|
+
definition
|
|
4491
|
+
], options);
|
|
4492
|
+
const factory = /* @__PURE__ */ __name(async (props) => {
|
|
4493
|
+
const result2 = await validateProps(definition.props, props, catalog.validator);
|
|
4494
|
+
if (!result2.ok) throw new Error(`genui: invalid ${definition.name} props: ${formatIssues(result2.issues)}`);
|
|
4495
|
+
const normalized = snapshotComponentPresentation(result2.value);
|
|
4496
|
+
if (typeof normalized !== "object" || normalized === null || Array.isArray(normalized)) throw new TypeError("genui: component props must be a JSON object");
|
|
4497
|
+
const portable = await catalog.validate(definition.name, normalized);
|
|
4498
|
+
if (!portable.ok || canonicalJson(snapshotComponentPresentation(portable.value)) !== canonicalJson(normalized)) {
|
|
4499
|
+
throw new Error(`genui: ${definition.name} requires outputProps accepting stable normalized JSON props`);
|
|
4500
|
+
}
|
|
4501
|
+
return {
|
|
4502
|
+
component: definition.name,
|
|
4503
|
+
props: normalized,
|
|
4504
|
+
version: definition.version ?? 1,
|
|
4505
|
+
fallbackText: componentToText(catalog, definition.name, normalized)
|
|
4506
|
+
};
|
|
4507
|
+
}, "factory");
|
|
4508
|
+
return Object.assign(factory, {
|
|
4509
|
+
definition
|
|
4510
|
+
});
|
|
4511
|
+
}
|
|
4512
|
+
__name(createComponent, "createComponent");
|
|
4513
|
+
var table = createComponent(DataTable);
|
|
4514
|
+
var chart = createComponent(Chart);
|
|
4515
|
+
function validatePresentationBatch(presentations) {
|
|
4516
|
+
const batch = Array.isArray(presentations) ? presentations : [
|
|
4517
|
+
presentations
|
|
4518
|
+
];
|
|
4519
|
+
return batch.map((item) => {
|
|
4520
|
+
const presentation = snapshotComponentPresentation(item);
|
|
4521
|
+
if (typeof presentation !== "object" || presentation === null || typeof presentation.component !== "string" || !/^[A-Za-z][A-Za-z0-9]{0,63}$/.test(presentation.component) || !Number.isSafeInteger(presentation.version) || presentation.version <= 0 || typeof presentation.fallbackText !== "string" || typeof presentation.props !== "object" || presentation.props === null || Array.isArray(presentation.props)) {
|
|
4522
|
+
throw new TypeError("genui: invalid component presentation");
|
|
4523
|
+
}
|
|
4524
|
+
return presentation;
|
|
4525
|
+
});
|
|
4526
|
+
}
|
|
4527
|
+
__name(validatePresentationBatch, "validatePresentationBatch");
|
|
4528
|
+
function canonicalJson(value) {
|
|
4529
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
|
|
4530
|
+
if (typeof value === "object" && value !== null) {
|
|
4531
|
+
const record2 = value;
|
|
4532
|
+
return `{${Object.keys(record2).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record2[key])}`).join(",")}}`;
|
|
4533
|
+
}
|
|
4534
|
+
return JSON.stringify(value);
|
|
4535
|
+
}
|
|
4536
|
+
__name(canonicalJson, "canonicalJson");
|
|
4537
|
+
|
|
4538
|
+
// src/tool-presentations.ts
|
|
4539
|
+
async function emitToolPresentations(handler, output, ctx, toolName) {
|
|
4540
|
+
if (handler.present === void 0) return;
|
|
4541
|
+
try {
|
|
4542
|
+
const result2 = await handler.present(output, ctx);
|
|
4543
|
+
if (result2 === void 0) return;
|
|
4544
|
+
const batch = validatePresentationBatch(result2);
|
|
4545
|
+
for (const presentation of batch) {
|
|
4546
|
+
await ctx.emitUi(presentation.component, presentation.props, {
|
|
4547
|
+
version: presentation.version,
|
|
4548
|
+
fallbackText: presentation.fallbackText
|
|
4549
|
+
});
|
|
4550
|
+
}
|
|
4551
|
+
} catch (error) {
|
|
4552
|
+
if (ctx.onPresentationError !== void 0) {
|
|
4553
|
+
try {
|
|
4554
|
+
await ctx.onPresentationError(error, {
|
|
4555
|
+
toolName
|
|
4556
|
+
});
|
|
4557
|
+
return;
|
|
4558
|
+
} catch (reportError) {
|
|
4559
|
+
console.warn(`Tool "${toolName}" presentation error reporter failed`, reportError);
|
|
4560
|
+
}
|
|
4561
|
+
} else {
|
|
4562
|
+
console.warn(`Tool "${toolName}" presentation failed after successful execution`, error);
|
|
4563
|
+
}
|
|
4564
|
+
}
|
|
4565
|
+
}
|
|
4566
|
+
__name(emitToolPresentations, "emitToolPresentations");
|
|
4567
|
+
|
|
4006
4568
|
// src/tool-registry.ts
|
|
4007
4569
|
var ToolForbiddenError = class extends Error {
|
|
4008
4570
|
static {
|
|
@@ -4085,6 +4647,15 @@ var ToolRegistry = class {
|
|
|
4085
4647
|
handler
|
|
4086
4648
|
});
|
|
4087
4649
|
}
|
|
4650
|
+
/** Whether a successful preflight shortcut has UI to journal. */
|
|
4651
|
+
hasPresentation(name) {
|
|
4652
|
+
return typeof this.entries.get(name)?.handler.present === "function";
|
|
4653
|
+
}
|
|
4654
|
+
/** Present an already authorized successful domain result without executing its action again. */
|
|
4655
|
+
async presentOutput(name, output, ctx) {
|
|
4656
|
+
const entry = this.entries.get(name);
|
|
4657
|
+
if (entry !== void 0) await emitToolPresentations(entry.handler, output, ctx, name);
|
|
4658
|
+
}
|
|
4088
4659
|
has(name) {
|
|
4089
4660
|
return this.entries.has(name);
|
|
4090
4661
|
}
|
|
@@ -4170,8 +4741,9 @@ var ToolRegistry = class {
|
|
|
4170
4741
|
}) : void 0;
|
|
4171
4742
|
if (trusted) assertTrustedInput(name, hookInput, executionInput);
|
|
4172
4743
|
if (result2?.status === "denied") throw new ToolPreflightDeniedError(name, result2.reason);
|
|
4173
|
-
|
|
4174
|
-
|
|
4744
|
+
const output = result2?.status === "completed" ? result2.output : await entry.handler.execute(executionInput, withEmit);
|
|
4745
|
+
await emitToolPresentations(entry.handler, output, withEmit, name);
|
|
4746
|
+
return output;
|
|
4175
4747
|
}
|
|
4176
4748
|
/** Authorize and validate without executing. The caller journals this result before approval. */
|
|
4177
4749
|
async prepare(name, input, ctx, policy, options = {}) {
|
|
@@ -4237,6 +4809,7 @@ var DefaultRolesPolicy = class {
|
|
|
4237
4809
|
this.emptyRoles = options.emptyRoles ?? "allow";
|
|
4238
4810
|
}
|
|
4239
4811
|
can(actor, tool) {
|
|
4812
|
+
if (tool.ability !== void 0 && tool.roles === void 0) return false;
|
|
4240
4813
|
const allowed = tool.roles ?? this.defaultRoles;
|
|
4241
4814
|
if (allowed.length === 0) return this.emptyRoles === "allow";
|
|
4242
4815
|
return (actor.roles ?? []).some((role) => allowed.includes(role));
|
|
@@ -4386,7 +4959,8 @@ var AGENT_SPAN_EVENTS = [
|
|
|
4386
4959
|
"llm.turn",
|
|
4387
4960
|
"tool.execution",
|
|
4388
4961
|
"retrieval",
|
|
4389
|
-
"follow-ups"
|
|
4962
|
+
"follow-ups",
|
|
4963
|
+
"structured-output"
|
|
4390
4964
|
];
|
|
4391
4965
|
var AGENT_DIAGNOSTIC_EVENTS = [
|
|
4392
4966
|
"run.started",
|
|
@@ -4424,8 +4998,19 @@ function createNegotiatedUiCollector(toolCallId, scope, resolveCatalog, write) {
|
|
|
4424
4998
|
}, "restart"),
|
|
4425
4999
|
emit: /* @__PURE__ */ __name(async (component, props, options = {}) => {
|
|
4426
5000
|
if (!resolveCatalog) {
|
|
4427
|
-
|
|
4428
|
-
return collector.emit(component, props, options);
|
|
5001
|
+
const declared = scope.uiCapabilities === void 0 || scope.uiCapabilities.components.some((entry) => entry.name === component && entry.version === (options.version ?? 1));
|
|
5002
|
+
if (declared) return collector.emit(component, props, options);
|
|
5003
|
+
const id2 = options.id ?? `${toolCallId}:ui:${next++}`;
|
|
5004
|
+
if (options.fallbackText !== void 0 && options.fallbackText.length > 0) {
|
|
5005
|
+
texts.set(id2, options.fallbackText);
|
|
5006
|
+
await write?.({
|
|
5007
|
+
kind: "text",
|
|
5008
|
+
text: options.fallbackText
|
|
5009
|
+
});
|
|
5010
|
+
}
|
|
5011
|
+
return {
|
|
5012
|
+
id: id2
|
|
5013
|
+
};
|
|
4429
5014
|
}
|
|
4430
5015
|
const capturedProps = snapshotActionProposal(props);
|
|
4431
5016
|
const capturedOptions = {
|
|
@@ -5512,6 +6097,10 @@ async function claimToolCall(turn, call) {
|
|
|
5512
6097
|
...spec?.terminal === true ? {
|
|
5513
6098
|
terminal: true
|
|
5514
6099
|
} : {},
|
|
6100
|
+
// Journal this extra checkpoint's opt-in; historical claims without it keep their sequence.
|
|
6101
|
+
...preflight?.status === "completed" && deps.registry.hasPresentation(call.name) ? {
|
|
6102
|
+
presentCompletedPreflight: true
|
|
6103
|
+
} : {},
|
|
5515
6104
|
...approval !== void 0 ? {
|
|
5516
6105
|
approval
|
|
5517
6106
|
} : {},
|
|
@@ -5542,6 +6131,9 @@ async function claimToolCall(turn, call) {
|
|
|
5542
6131
|
...persisted?.terminal === true ? {
|
|
5543
6132
|
terminal: true
|
|
5544
6133
|
} : {},
|
|
6134
|
+
...persisted?.presentCompletedPreflight === true ? {
|
|
6135
|
+
presentCompletedPreflight: true
|
|
6136
|
+
} : {},
|
|
5545
6137
|
...toolType === "action" && persisted?.approval !== void 0 ? {
|
|
5546
6138
|
approval: persisted.approval
|
|
5547
6139
|
} : {},
|
|
@@ -6068,6 +6660,19 @@ async function runClaimedToolCall(turn, claimed) {
|
|
|
6068
6660
|
}
|
|
6069
6661
|
if (claimed.preflight !== void 0 && claimed.preflight.status !== "ready") {
|
|
6070
6662
|
const result2 = claimed.preflight;
|
|
6663
|
+
if (result2.status === "completed" && claimed.presentCompletedPreflight === true) {
|
|
6664
|
+
const raw = await hooks.step(`present:${call.id}`, async () => {
|
|
6665
|
+
const ui = createNegotiatedUiCollector(call.id, ctx, deps.resolveUiCatalog, (event) => turn.writer.write(encodeStreamEvent(event)));
|
|
6666
|
+
await deps.registry.presentOutput(call.name, result2.output, {
|
|
6667
|
+
...toolCallContext(ctx, call.id),
|
|
6668
|
+
emitUi: ui.emit
|
|
6669
|
+
});
|
|
6670
|
+
return wrapToolStepOutput(result2.output, ui.components(), ui.text());
|
|
6671
|
+
});
|
|
6672
|
+
const presented = unwrapToolStepOutput(raw);
|
|
6673
|
+
if (presented.ui.length > 0) turn.toolUi.set(call.id, presented.ui);
|
|
6674
|
+
if (presented.text) turn.toolText.set(call.id, presented.text);
|
|
6675
|
+
}
|
|
6071
6676
|
if (result2.status === "completed" && claimed.terminal === true) turn.halt.terminal = true;
|
|
6072
6677
|
const outcome = result2.status === "completed" ? {
|
|
6073
6678
|
status: "executed",
|
|
@@ -6959,14 +7564,14 @@ var InMemoryActionProposalStore = class {
|
|
|
6959
7564
|
}
|
|
6960
7565
|
async createActionProposal(input) {
|
|
6961
7566
|
validateActionProposalCreation(input);
|
|
6962
|
-
const
|
|
6963
|
-
if (
|
|
6964
|
-
if (!actionProposalScopeMatches(
|
|
7567
|
+
const row2 = this.rows.get(input.id);
|
|
7568
|
+
if (row2) {
|
|
7569
|
+
if (!actionProposalScopeMatches(row2, input)) return {
|
|
6965
7570
|
status: "conflict"
|
|
6966
7571
|
};
|
|
6967
7572
|
return {
|
|
6968
|
-
status: actionProposalCreationMatches(
|
|
6969
|
-
proposal: snapshotActionProposal(
|
|
7573
|
+
status: actionProposalCreationMatches(row2, input) ? "unchanged" : "conflict",
|
|
7574
|
+
proposal: snapshotActionProposal(row2)
|
|
6970
7575
|
};
|
|
6971
7576
|
}
|
|
6972
7577
|
const proposal = initialActionProposal(input, this.clock());
|
|
@@ -6977,42 +7582,42 @@ var InMemoryActionProposalStore = class {
|
|
|
6977
7582
|
};
|
|
6978
7583
|
}
|
|
6979
7584
|
async getActionProposal(scope, id) {
|
|
6980
|
-
const
|
|
6981
|
-
return
|
|
7585
|
+
const row2 = this.rows.get(id);
|
|
7586
|
+
return row2 && actionProposalScopeMatches(row2, scope) ? snapshotActionProposal(row2) : null;
|
|
6982
7587
|
}
|
|
6983
7588
|
async listActionProposals(scope, query = {}) {
|
|
6984
7589
|
const limit = validateActionProposalListQuery(query);
|
|
6985
7590
|
return [
|
|
6986
7591
|
...this.rows.values()
|
|
6987
|
-
].filter((
|
|
7592
|
+
].filter((row2) => actionProposalScopeMatches(row2, scope) && (query.decision === void 0 || row2.decision === query.decision) && (query.after === void 0 || row2.createdAt > query.after.createdAt || row2.createdAt === query.after.createdAt && row2.id > query.after.id)).sort((a, b) => a.createdAt - b.createdAt || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)).slice(0, limit).map(snapshotActionProposal);
|
|
6988
7593
|
}
|
|
6989
7594
|
mutate(scope, id, transition) {
|
|
6990
|
-
const
|
|
6991
|
-
if (!
|
|
7595
|
+
const row2 = this.rows.get(id);
|
|
7596
|
+
if (!row2 || !actionProposalScopeMatches(row2, scope)) return {
|
|
6992
7597
|
status: "not_found"
|
|
6993
7598
|
};
|
|
6994
|
-
const result2 = transition(
|
|
7599
|
+
const result2 = transition(row2, this.clock());
|
|
6995
7600
|
if (result2.proposal) this.rows.set(id, snapshotActionProposal(result2.proposal));
|
|
6996
7601
|
return result2;
|
|
6997
7602
|
}
|
|
6998
7603
|
async decideActionProposal(scope, id, command) {
|
|
6999
|
-
return this.mutate(scope, id, (
|
|
7604
|
+
return this.mutate(scope, id, (row2, now) => transitionActionProposalDecision(row2, command, now));
|
|
7000
7605
|
}
|
|
7001
7606
|
async claimActionProposal(scope, id, command) {
|
|
7002
|
-
return this.mutate(scope, id, (
|
|
7607
|
+
return this.mutate(scope, id, (row2, now) => transitionActionProposalClaim(row2, command, now, (0, import_node_crypto2.randomUUID)()));
|
|
7003
7608
|
}
|
|
7004
7609
|
async extendActionProposalLease(scope, id, command) {
|
|
7005
|
-
return this.mutate(scope, id, (
|
|
7610
|
+
return this.mutate(scope, id, (row2, now) => transitionActionProposalLease(row2, command, now));
|
|
7006
7611
|
}
|
|
7007
7612
|
async settleActionProposal(scope, id, command) {
|
|
7008
|
-
return this.mutate(scope, id, (
|
|
7613
|
+
return this.mutate(scope, id, (row2, now) => transitionActionProposalSettlement(row2, command, now));
|
|
7009
7614
|
}
|
|
7010
7615
|
async claimNextActionProposal(command) {
|
|
7011
7616
|
const now = this.clock();
|
|
7012
7617
|
validateActionProposalWorkerClaim(command, now);
|
|
7013
7618
|
const candidates = [
|
|
7014
7619
|
...this.rows.values()
|
|
7015
|
-
].filter((
|
|
7620
|
+
].filter((row2) => row2.decision === "approved" && (row2.execution?.status === "queued" || row2.execution?.status === "executing" && row2.execution.lease !== null && now >= row2.execution.lease.expiresAt)).sort((a, b) => a.createdAt - b.createdAt || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)).slice(0, 32);
|
|
7016
7621
|
for (const candidate of candidates) {
|
|
7017
7622
|
const claimed = await this.claimActionProposal(candidate, candidate.id, command);
|
|
7018
7623
|
if (claimed.status === "applied" && claimed.proposal) return claimed.proposal;
|
|
@@ -7024,7 +7629,7 @@ var InMemoryActionProposalStore = class {
|
|
|
7024
7629
|
validateActionProposalExpiryBatch(command, now);
|
|
7025
7630
|
const candidates = [
|
|
7026
7631
|
...this.rows.values()
|
|
7027
|
-
].filter((
|
|
7632
|
+
].filter((row2) => row2.decision === "pending" && row2.expiresAt !== null && now >= row2.expiresAt).sort((a, b) => a.createdAt - b.createdAt || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)).slice(0, command.limit);
|
|
7028
7633
|
let expired = 0;
|
|
7029
7634
|
for (const candidate of candidates) {
|
|
7030
7635
|
const result2 = await this.decideActionProposal(candidate, candidate.id, {
|
|
@@ -7041,11 +7646,11 @@ var InMemoryActionProposalStore = class {
|
|
|
7041
7646
|
validateActionProposalWorkerClaim(command, now);
|
|
7042
7647
|
const candidates = [
|
|
7043
7648
|
...this.rows.values()
|
|
7044
|
-
].filter((
|
|
7649
|
+
].filter((row2) => row2.outcomeDelivery?.status === "pending" && (!row2.outcomeDelivery.lease || now >= row2.outcomeDelivery.lease.expiresAt)).sort((a, b) => a.createdAt - b.createdAt || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)).slice(0, 32);
|
|
7045
7650
|
for (const candidate of candidates) {
|
|
7046
|
-
const
|
|
7047
|
-
if (!
|
|
7048
|
-
const next = claimActionProposalOutcome(
|
|
7651
|
+
const row2 = this.rows.get(candidate.id);
|
|
7652
|
+
if (!row2) continue;
|
|
7653
|
+
const next = claimActionProposalOutcome(row2, command, this.clock(), (0, import_node_crypto2.randomUUID)());
|
|
7049
7654
|
if (!next?.outcome || !next.outcomeDelivery?.lease) continue;
|
|
7050
7655
|
this.rows.set(next.id, next);
|
|
7051
7656
|
return {
|
|
@@ -7065,9 +7670,9 @@ var InMemoryActionProposalStore = class {
|
|
|
7065
7670
|
if (existing) return this.createActionProposal(input);
|
|
7066
7671
|
const proposal = initialActionProposal(input, this.clock());
|
|
7067
7672
|
const replacements = [];
|
|
7068
|
-
if (input.replacementKey) for (const
|
|
7069
|
-
if (
|
|
7070
|
-
const result2 = transitionActionProposalSupersession(
|
|
7673
|
+
if (input.replacementKey) for (const row2 of this.rows.values()) {
|
|
7674
|
+
if (row2.decision !== "pending" || !actionProposalScopeMatches(row2, input) || row2.toolName !== input.toolName || row2.replacementKey !== input.replacementKey) continue;
|
|
7675
|
+
const result2 = transitionActionProposalSupersession(row2, proposal, {
|
|
7071
7676
|
replacementProposalId: proposal.id,
|
|
7072
7677
|
actorRef: input.actorRef,
|
|
7073
7678
|
via: "supersession"
|
|
@@ -7075,7 +7680,7 @@ var InMemoryActionProposalStore = class {
|
|
|
7075
7680
|
if (result2.proposal) replacements.push(result2.proposal);
|
|
7076
7681
|
}
|
|
7077
7682
|
this.rows.set(proposal.id, proposal);
|
|
7078
|
-
for (const
|
|
7683
|
+
for (const row2 of replacements) this.rows.set(row2.id, row2);
|
|
7079
7684
|
return {
|
|
7080
7685
|
status: "created",
|
|
7081
7686
|
proposal: snapshotActionProposal(proposal)
|
|
@@ -7086,7 +7691,7 @@ var InMemoryActionProposalStore = class {
|
|
|
7086
7691
|
if (!replacement || !actionProposalScopeMatches(replacement, scope)) return {
|
|
7087
7692
|
status: "not_found"
|
|
7088
7693
|
};
|
|
7089
|
-
return this.mutate(scope, id, (
|
|
7694
|
+
return this.mutate(scope, id, (row2, now) => transitionActionProposalSupersession(row2, replacement, command, now));
|
|
7090
7695
|
}
|
|
7091
7696
|
};
|
|
7092
7697
|
|
|
@@ -7111,7 +7716,7 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7111
7716
|
throw new Error(`thread ${id} already exists`);
|
|
7112
7717
|
}
|
|
7113
7718
|
const ts = this.now();
|
|
7114
|
-
const
|
|
7719
|
+
const row2 = {
|
|
7115
7720
|
id,
|
|
7116
7721
|
actorRef: input.actor.id,
|
|
7117
7722
|
tenantRef: input.actor.tenantRef ?? null,
|
|
@@ -7124,20 +7729,20 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7124
7729
|
persona: input.persona
|
|
7125
7730
|
} : {}
|
|
7126
7731
|
};
|
|
7127
|
-
this.threads.set(id,
|
|
7128
|
-
return this.toSummary(
|
|
7732
|
+
this.threads.set(id, row2);
|
|
7733
|
+
return this.toSummary(row2);
|
|
7129
7734
|
}
|
|
7130
7735
|
async getThread(threadId) {
|
|
7131
|
-
const
|
|
7132
|
-
if (
|
|
7736
|
+
const row2 = this.threads.get(threadId);
|
|
7737
|
+
if (row2 === void 0) {
|
|
7133
7738
|
return null;
|
|
7134
7739
|
}
|
|
7135
7740
|
return {
|
|
7136
|
-
...this.toSummary(
|
|
7137
|
-
messages:
|
|
7741
|
+
...this.toSummary(row2),
|
|
7742
|
+
messages: row2.messages.map((message) => this.withApprovals(message)),
|
|
7138
7743
|
// The run streaming right now — the one field the read-model reports it under.
|
|
7139
|
-
...
|
|
7140
|
-
activeRunId:
|
|
7744
|
+
...row2.activeStreamId !== void 0 ? {
|
|
7745
|
+
activeRunId: row2.activeStreamId
|
|
7141
7746
|
} : {}
|
|
7142
7747
|
};
|
|
7143
7748
|
}
|
|
@@ -7203,7 +7808,7 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7203
7808
|
async listThreads(actorRef, limit = 50) {
|
|
7204
7809
|
return [
|
|
7205
7810
|
...this.threads.values()
|
|
7206
|
-
].filter((
|
|
7811
|
+
].filter((row2) => row2.actorRef === actorRef && !row2.transient).sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)).slice(0, limit).map((row2) => this.toSummary(row2));
|
|
7207
7812
|
}
|
|
7208
7813
|
async softDeleteThread(threadId) {
|
|
7209
7814
|
this.threads.delete(threadId);
|
|
@@ -7219,7 +7824,7 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7219
7824
|
];
|
|
7220
7825
|
const id = crypto.randomUUID();
|
|
7221
7826
|
const ts = this.now();
|
|
7222
|
-
const
|
|
7827
|
+
const row2 = {
|
|
7223
7828
|
id,
|
|
7224
7829
|
actorRef: source.actorRef,
|
|
7225
7830
|
tenantRef: source.tenantRef,
|
|
@@ -7241,8 +7846,8 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7241
7846
|
persona: source.persona
|
|
7242
7847
|
} : {}
|
|
7243
7848
|
};
|
|
7244
|
-
this.threads.set(id,
|
|
7245
|
-
return this.toSummary(
|
|
7849
|
+
this.threads.set(id, row2);
|
|
7850
|
+
return this.toSummary(row2);
|
|
7246
7851
|
}
|
|
7247
7852
|
async ownerOfThread(threadId) {
|
|
7248
7853
|
return this.threads.get(threadId)?.actorRef ?? null;
|
|
@@ -7262,38 +7867,38 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7262
7867
|
return call.runId ?? this.threads.get(call.threadId)?.activeStreamId ?? null;
|
|
7263
7868
|
}
|
|
7264
7869
|
async ownerOfActiveStream(runId) {
|
|
7265
|
-
for (const
|
|
7266
|
-
if (
|
|
7267
|
-
return
|
|
7870
|
+
for (const row2 of this.threads.values()) {
|
|
7871
|
+
if (row2.activeStreamId === runId) {
|
|
7872
|
+
return row2.actorRef;
|
|
7268
7873
|
}
|
|
7269
7874
|
}
|
|
7270
7875
|
return null;
|
|
7271
7876
|
}
|
|
7272
7877
|
async setTitle(threadId, title) {
|
|
7273
|
-
const
|
|
7274
|
-
if (
|
|
7275
|
-
|
|
7276
|
-
|
|
7878
|
+
const row2 = this.threads.get(threadId);
|
|
7879
|
+
if (row2 !== void 0) {
|
|
7880
|
+
row2.title = title;
|
|
7881
|
+
row2.updatedAt = this.now();
|
|
7277
7882
|
}
|
|
7278
7883
|
}
|
|
7279
7884
|
async updateThread(threadId, patch) {
|
|
7280
|
-
const
|
|
7281
|
-
if (
|
|
7885
|
+
const row2 = this.threads.get(threadId);
|
|
7886
|
+
if (row2 === void 0) {
|
|
7282
7887
|
return;
|
|
7283
7888
|
}
|
|
7284
7889
|
if (patch.title !== void 0) {
|
|
7285
|
-
|
|
7890
|
+
row2.title = patch.title;
|
|
7286
7891
|
}
|
|
7287
7892
|
if (patch.defaultAgent !== void 0) {
|
|
7288
|
-
|
|
7893
|
+
row2.defaultAgent = patch.defaultAgent;
|
|
7289
7894
|
}
|
|
7290
7895
|
if (patch.model !== void 0) {
|
|
7291
|
-
|
|
7896
|
+
row2.model = patch.model;
|
|
7292
7897
|
}
|
|
7293
7898
|
if (patch.persona !== void 0) {
|
|
7294
|
-
|
|
7899
|
+
row2.persona = patch.persona;
|
|
7295
7900
|
}
|
|
7296
|
-
|
|
7901
|
+
row2.updatedAt = this.now();
|
|
7297
7902
|
}
|
|
7298
7903
|
async activeRunForThread(threadId) {
|
|
7299
7904
|
return this.threads.get(threadId)?.activeStreamId ?? null;
|
|
@@ -7341,64 +7946,64 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7341
7946
|
}
|
|
7342
7947
|
/** Settle a run's outcome. A no-op when the run is unknown (mirrors `setTitle`/`updateThread`). */
|
|
7343
7948
|
async recordRunEnd(end) {
|
|
7344
|
-
const
|
|
7345
|
-
if (
|
|
7949
|
+
const row2 = this.runs.get(end.runId);
|
|
7950
|
+
if (row2 === void 0) {
|
|
7346
7951
|
return;
|
|
7347
7952
|
}
|
|
7348
|
-
|
|
7349
|
-
|
|
7953
|
+
row2.status = end.status;
|
|
7954
|
+
row2.settledAt = this.now();
|
|
7350
7955
|
if (end.durationMs !== void 0) {
|
|
7351
|
-
|
|
7956
|
+
row2.durationMs = end.durationMs;
|
|
7352
7957
|
}
|
|
7353
7958
|
if (end.errorCode !== void 0) {
|
|
7354
|
-
|
|
7959
|
+
row2.errorCode = end.errorCode;
|
|
7355
7960
|
}
|
|
7356
7961
|
if (end.errorMessage !== void 0) {
|
|
7357
|
-
|
|
7962
|
+
row2.errorMessage = end.errorMessage;
|
|
7358
7963
|
}
|
|
7359
7964
|
}
|
|
7360
7965
|
/** Bump the run's llm-step retry counter. */
|
|
7361
7966
|
async bumpRunRetries(runId) {
|
|
7362
|
-
const
|
|
7363
|
-
if (
|
|
7364
|
-
|
|
7967
|
+
const row2 = this.runs.get(runId);
|
|
7968
|
+
if (row2 !== void 0) {
|
|
7969
|
+
row2.retries += 1;
|
|
7365
7970
|
}
|
|
7366
7971
|
}
|
|
7367
7972
|
async promoteThread(threadId) {
|
|
7368
|
-
const
|
|
7369
|
-
if (
|
|
7370
|
-
|
|
7371
|
-
|
|
7973
|
+
const row2 = this.threads.get(threadId);
|
|
7974
|
+
if (row2?.transient) {
|
|
7975
|
+
row2.transient = false;
|
|
7976
|
+
row2.updatedAt = this.now();
|
|
7372
7977
|
}
|
|
7373
7978
|
}
|
|
7374
7979
|
async setActiveStream(threadId, runId) {
|
|
7375
|
-
const
|
|
7376
|
-
if (
|
|
7980
|
+
const row2 = this.threads.get(threadId);
|
|
7981
|
+
if (row2 !== void 0) {
|
|
7377
7982
|
if (runId === null) {
|
|
7378
|
-
delete
|
|
7983
|
+
delete row2.activeStreamId;
|
|
7379
7984
|
} else {
|
|
7380
|
-
|
|
7985
|
+
row2.activeStreamId = runId;
|
|
7381
7986
|
}
|
|
7382
7987
|
}
|
|
7383
7988
|
}
|
|
7384
7989
|
async claimActiveStream(threadId, runId, options = {}) {
|
|
7385
|
-
const
|
|
7386
|
-
if (
|
|
7990
|
+
const row2 = this.threads.get(threadId);
|
|
7991
|
+
if (row2 === void 0) {
|
|
7387
7992
|
return false;
|
|
7388
7993
|
}
|
|
7389
|
-
const holder =
|
|
7994
|
+
const holder = row2.activeStreamId;
|
|
7390
7995
|
if (holder !== void 0 && holder !== runId && holder !== options.replacing) {
|
|
7391
7996
|
return false;
|
|
7392
7997
|
}
|
|
7393
|
-
|
|
7998
|
+
row2.activeStreamId = runId;
|
|
7394
7999
|
return true;
|
|
7395
8000
|
}
|
|
7396
8001
|
async releaseActiveStream(threadId, runId) {
|
|
7397
|
-
const
|
|
7398
|
-
if (
|
|
8002
|
+
const row2 = this.threads.get(threadId);
|
|
8003
|
+
if (row2?.activeStreamId !== runId) {
|
|
7399
8004
|
return false;
|
|
7400
8005
|
}
|
|
7401
|
-
delete
|
|
8006
|
+
delete row2.activeStreamId;
|
|
7402
8007
|
return true;
|
|
7403
8008
|
}
|
|
7404
8009
|
async enqueueMessage(input) {
|
|
@@ -7426,6 +8031,9 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7426
8031
|
...input.uiCapabilities !== void 0 ? {
|
|
7427
8032
|
uiCapabilities: input.uiCapabilities
|
|
7428
8033
|
} : {},
|
|
8034
|
+
...input.hostContext !== void 0 ? {
|
|
8035
|
+
hostContext: input.hostContext
|
|
8036
|
+
} : {},
|
|
7429
8037
|
...input.interrupt === true ? {
|
|
7430
8038
|
interrupt: true
|
|
7431
8039
|
} : {},
|
|
@@ -7531,38 +8139,38 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7531
8139
|
return void 0;
|
|
7532
8140
|
}
|
|
7533
8141
|
async getThreadActionProposalScope(threadId) {
|
|
7534
|
-
const
|
|
7535
|
-
return
|
|
8142
|
+
const row2 = this.threads.get(threadId);
|
|
8143
|
+
return row2 ? {
|
|
7536
8144
|
threadId,
|
|
7537
|
-
actorRef:
|
|
7538
|
-
tenantRef:
|
|
8145
|
+
actorRef: row2.actorRef,
|
|
8146
|
+
tenantRef: row2.tenantRef
|
|
7539
8147
|
} : null;
|
|
7540
8148
|
}
|
|
7541
8149
|
async admitActionProposalOutcome(command) {
|
|
7542
|
-
const
|
|
8150
|
+
const row2 = [
|
|
7543
8151
|
...this.rows.values()
|
|
7544
|
-
].find((
|
|
7545
|
-
if (!
|
|
8152
|
+
].find((row3) => row3.outcome?.id === command.outcomeId);
|
|
8153
|
+
if (!row2?.outcome || !row2.outcomeDelivery) return {
|
|
7546
8154
|
status: "not_found"
|
|
7547
8155
|
};
|
|
7548
|
-
if (
|
|
8156
|
+
if (row2.outcomeDelivery.status === "admitted") return {
|
|
7549
8157
|
status: "unchanged",
|
|
7550
|
-
...
|
|
7551
|
-
messageId:
|
|
8158
|
+
...row2.outcomeDelivery.messageId !== void 0 ? {
|
|
8159
|
+
messageId: row2.outcomeDelivery.messageId
|
|
7552
8160
|
} : {}
|
|
7553
8161
|
};
|
|
7554
|
-
if (
|
|
8162
|
+
if (row2.outcomeDelivery.status === "discarded") return {
|
|
7555
8163
|
status: "discarded"
|
|
7556
8164
|
};
|
|
7557
|
-
if (!actionProposalOutcomeFenceValid(
|
|
8165
|
+
if (!actionProposalOutcomeFenceValid(row2, command, this.clock())) return {
|
|
7558
8166
|
status: "conflict"
|
|
7559
8167
|
};
|
|
7560
|
-
const thread = this.threads.get(
|
|
8168
|
+
const thread = this.threads.get(row2.threadId);
|
|
7561
8169
|
if (!thread) {
|
|
7562
|
-
this.rows.set(
|
|
7563
|
-
...
|
|
8170
|
+
this.rows.set(row2.id, snapshotActionProposal({
|
|
8171
|
+
...row2,
|
|
7564
8172
|
outcomeDelivery: {
|
|
7565
|
-
...
|
|
8173
|
+
...row2.outcomeDelivery,
|
|
7566
8174
|
status: "discarded",
|
|
7567
8175
|
lease: null
|
|
7568
8176
|
}
|
|
@@ -7571,7 +8179,7 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7571
8179
|
status: "discarded"
|
|
7572
8180
|
};
|
|
7573
8181
|
}
|
|
7574
|
-
if (thread.actorRef !==
|
|
8182
|
+
if (thread.actorRef !== row2.actorRef || thread.tenantRef !== row2.tenantRef) return {
|
|
7575
8183
|
status: "conflict"
|
|
7576
8184
|
};
|
|
7577
8185
|
if (thread.activeStreamId) return {
|
|
@@ -7580,15 +8188,15 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7580
8188
|
const message = {
|
|
7581
8189
|
id: crypto.randomUUID(),
|
|
7582
8190
|
role: "assistant",
|
|
7583
|
-
content: actionProposalOutcomeText(
|
|
8191
|
+
content: actionProposalOutcomeText(row2.outcome),
|
|
7584
8192
|
createdAt: this.now(),
|
|
7585
|
-
actionProposalOutcome: snapshotActionProposal(
|
|
7586
|
-
ui: snapshotActionProposal(
|
|
8193
|
+
actionProposalOutcome: snapshotActionProposal(row2.outcome),
|
|
8194
|
+
ui: snapshotActionProposal(row2.outcome.ui)
|
|
7587
8195
|
};
|
|
7588
8196
|
const next = snapshotActionProposal({
|
|
7589
|
-
...
|
|
8197
|
+
...row2,
|
|
7590
8198
|
outcomeDelivery: {
|
|
7591
|
-
...
|
|
8199
|
+
...row2.outcomeDelivery,
|
|
7592
8200
|
status: "admitted",
|
|
7593
8201
|
lease: null,
|
|
7594
8202
|
messageId: message.id
|
|
@@ -7596,15 +8204,15 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7596
8204
|
});
|
|
7597
8205
|
thread.messages.push(message);
|
|
7598
8206
|
thread.updatedAt = message.createdAt;
|
|
7599
|
-
this.rows.set(
|
|
8207
|
+
this.rows.set(row2.id, next);
|
|
7600
8208
|
return {
|
|
7601
8209
|
status: "applied",
|
|
7602
8210
|
messageId: message.id
|
|
7603
8211
|
};
|
|
7604
8212
|
}
|
|
7605
8213
|
async appendMessage(input) {
|
|
7606
|
-
const
|
|
7607
|
-
if (
|
|
8214
|
+
const row2 = this.threads.get(input.threadId);
|
|
8215
|
+
if (row2 === void 0) {
|
|
7608
8216
|
throw new Error(`thread ${input.threadId} not found`);
|
|
7609
8217
|
}
|
|
7610
8218
|
const message = {
|
|
@@ -7649,13 +8257,13 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7649
8257
|
actionProposalOutcome: input.actionProposalOutcome
|
|
7650
8258
|
} : {}
|
|
7651
8259
|
};
|
|
7652
|
-
|
|
7653
|
-
|
|
8260
|
+
row2.messages.push(message);
|
|
8261
|
+
row2.updatedAt = message.createdAt;
|
|
7654
8262
|
return message;
|
|
7655
8263
|
}
|
|
7656
8264
|
async setMessageToolResults(messageId, results) {
|
|
7657
|
-
for (const
|
|
7658
|
-
const message =
|
|
8265
|
+
for (const row2 of this.threads.values()) {
|
|
8266
|
+
const message = row2.messages.find((candidate) => candidate.id === messageId);
|
|
7659
8267
|
if (message !== void 0) {
|
|
7660
8268
|
message.toolResults = results;
|
|
7661
8269
|
return;
|
|
@@ -7663,12 +8271,12 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7663
8271
|
}
|
|
7664
8272
|
}
|
|
7665
8273
|
async setMessageUi(messageId, ui) {
|
|
7666
|
-
for (const
|
|
7667
|
-
const index =
|
|
7668
|
-
const message =
|
|
8274
|
+
for (const row2 of this.threads.values()) {
|
|
8275
|
+
const index = row2.messages.findIndex((candidate) => candidate.id === messageId);
|
|
8276
|
+
const message = row2.messages[index];
|
|
7669
8277
|
if (message !== void 0) {
|
|
7670
8278
|
const { ui: _previous, ...rest } = message;
|
|
7671
|
-
|
|
8279
|
+
row2.messages[index] = ui.length > 0 ? {
|
|
7672
8280
|
...rest,
|
|
7673
8281
|
ui
|
|
7674
8282
|
} : rest;
|
|
@@ -7680,12 +8288,12 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7680
8288
|
return this.threadIdForMessage(messageId) ?? null;
|
|
7681
8289
|
}
|
|
7682
8290
|
async setMessageFeedback(messageId, feedback) {
|
|
7683
|
-
for (const
|
|
7684
|
-
const index =
|
|
7685
|
-
const message =
|
|
8291
|
+
for (const row2 of this.threads.values()) {
|
|
8292
|
+
const index = row2.messages.findIndex((candidate) => candidate.id === messageId);
|
|
8293
|
+
const message = row2.messages[index];
|
|
7686
8294
|
if (message !== void 0) {
|
|
7687
8295
|
const { feedback: _previous, ...rest } = message;
|
|
7688
|
-
|
|
8296
|
+
row2.messages[index] = feedback !== null ? {
|
|
7689
8297
|
...rest,
|
|
7690
8298
|
feedback
|
|
7691
8299
|
} : rest;
|
|
@@ -7694,13 +8302,13 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7694
8302
|
}
|
|
7695
8303
|
}
|
|
7696
8304
|
async truncateFrom(threadId, messageId) {
|
|
7697
|
-
const
|
|
7698
|
-
if (
|
|
8305
|
+
const row2 = this.threads.get(threadId);
|
|
8306
|
+
if (row2 === void 0) {
|
|
7699
8307
|
return;
|
|
7700
8308
|
}
|
|
7701
|
-
const cutoff =
|
|
8309
|
+
const cutoff = row2.messages.findIndex((message) => message.id === messageId);
|
|
7702
8310
|
if (cutoff >= 0) {
|
|
7703
|
-
|
|
8311
|
+
row2.messages = row2.messages.slice(0, cutoff);
|
|
7704
8312
|
}
|
|
7705
8313
|
}
|
|
7706
8314
|
/**
|
|
@@ -7765,16 +8373,16 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7765
8373
|
async toolCallOutcomes(toolCallIds) {
|
|
7766
8374
|
const outcomes = [];
|
|
7767
8375
|
for (const id of toolCallIds) {
|
|
7768
|
-
const
|
|
7769
|
-
if (
|
|
8376
|
+
const row2 = this.toolCalls.get(id);
|
|
8377
|
+
if (row2 !== void 0) {
|
|
7770
8378
|
outcomes.push({
|
|
7771
8379
|
id,
|
|
7772
|
-
status:
|
|
7773
|
-
...
|
|
7774
|
-
output:
|
|
8380
|
+
status: row2.status,
|
|
8381
|
+
...row2.output !== void 0 ? {
|
|
8382
|
+
output: row2.output
|
|
7775
8383
|
} : {},
|
|
7776
|
-
...
|
|
7777
|
-
error:
|
|
8384
|
+
...row2.error !== void 0 ? {
|
|
8385
|
+
error: row2.error
|
|
7778
8386
|
} : {}
|
|
7779
8387
|
});
|
|
7780
8388
|
}
|
|
@@ -7783,38 +8391,38 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7783
8391
|
}
|
|
7784
8392
|
async failUnsettledToolCalls(runId, error) {
|
|
7785
8393
|
let settled = 0;
|
|
7786
|
-
for (const
|
|
7787
|
-
if (
|
|
7788
|
-
|
|
7789
|
-
|
|
8394
|
+
for (const row2 of this.toolCalls.values()) {
|
|
8395
|
+
if (row2.runId === runId && row2.status === "pending_approval") {
|
|
8396
|
+
row2.status = "failed";
|
|
8397
|
+
row2.error = error;
|
|
7790
8398
|
settled += 1;
|
|
7791
8399
|
}
|
|
7792
8400
|
}
|
|
7793
8401
|
return settled;
|
|
7794
8402
|
}
|
|
7795
8403
|
async updateToolCall(input) {
|
|
7796
|
-
const
|
|
7797
|
-
if (
|
|
8404
|
+
const row2 = this.toolCalls.get(input.toolCallId);
|
|
8405
|
+
if (row2 === void 0) {
|
|
7798
8406
|
return;
|
|
7799
8407
|
}
|
|
7800
|
-
|
|
8408
|
+
row2.status = input.status;
|
|
7801
8409
|
if (input.output !== void 0) {
|
|
7802
|
-
|
|
8410
|
+
row2.output = input.output;
|
|
7803
8411
|
}
|
|
7804
8412
|
if (input.error !== void 0) {
|
|
7805
|
-
|
|
8413
|
+
row2.error = input.error;
|
|
7806
8414
|
}
|
|
7807
8415
|
if (input.executionMs !== void 0) {
|
|
7808
|
-
|
|
8416
|
+
row2.executionMs = input.executionMs;
|
|
7809
8417
|
}
|
|
7810
8418
|
if (input.executedByRef !== void 0) {
|
|
7811
|
-
|
|
8419
|
+
row2.executedByRef = input.executedByRef;
|
|
7812
8420
|
}
|
|
7813
8421
|
if (input.remember !== void 0) {
|
|
7814
|
-
|
|
8422
|
+
row2.remember = input.remember;
|
|
7815
8423
|
}
|
|
7816
8424
|
if (input.decidedVia !== void 0) {
|
|
7817
|
-
|
|
8425
|
+
row2.decidedVia = input.decidedVia;
|
|
7818
8426
|
}
|
|
7819
8427
|
}
|
|
7820
8428
|
async recordUsage(input) {
|
|
@@ -7842,9 +8450,9 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7842
8450
|
return this.usageBetween(actorRef, day, day);
|
|
7843
8451
|
}
|
|
7844
8452
|
async usageBetween(actorRef, fromDay, toDay) {
|
|
7845
|
-
const rows = this.usage.filter((
|
|
7846
|
-
const usedTokens = rows.reduce((sum,
|
|
7847
|
-
const costUsd = rows.reduce((sum,
|
|
8453
|
+
const rows = this.usage.filter((row2) => row2.actorRef === actorRef && row2.day >= fromDay && row2.day <= toDay);
|
|
8454
|
+
const usedTokens = rows.reduce((sum, row2) => sum + row2.inputTokens + row2.outputTokens, 0);
|
|
8455
|
+
const costUsd = rows.reduce((sum, row2) => sum + (row2.costUsd ?? 0), 0);
|
|
7848
8456
|
return {
|
|
7849
8457
|
usedTokens,
|
|
7850
8458
|
costUsd
|
|
@@ -7852,30 +8460,30 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7852
8460
|
}
|
|
7853
8461
|
/** Test helper: read the recorded usage rows (modelId + token totals). */
|
|
7854
8462
|
usageRows() {
|
|
7855
|
-
return this.usage.map((
|
|
7856
|
-
actorRef:
|
|
7857
|
-
tokens:
|
|
7858
|
-
modelId:
|
|
8463
|
+
return this.usage.map((row2) => ({
|
|
8464
|
+
actorRef: row2.actorRef,
|
|
8465
|
+
tokens: row2.inputTokens + row2.outputTokens,
|
|
8466
|
+
modelId: row2.modelId
|
|
7859
8467
|
}));
|
|
7860
8468
|
}
|
|
7861
8469
|
/** Governance read-model feed: recorded usage rows with the input/output split + thread/day. */
|
|
7862
8470
|
governanceUsage() {
|
|
7863
|
-
return this.usage.map((
|
|
7864
|
-
actorRef:
|
|
7865
|
-
threadId:
|
|
7866
|
-
modelId:
|
|
7867
|
-
inputTokens:
|
|
7868
|
-
outputTokens:
|
|
7869
|
-
day:
|
|
7870
|
-
createdAt:
|
|
7871
|
-
...
|
|
7872
|
-
cacheWriteTokens:
|
|
8471
|
+
return this.usage.map((row2) => ({
|
|
8472
|
+
actorRef: row2.actorRef,
|
|
8473
|
+
threadId: row2.threadId,
|
|
8474
|
+
modelId: row2.modelId,
|
|
8475
|
+
inputTokens: row2.inputTokens,
|
|
8476
|
+
outputTokens: row2.outputTokens,
|
|
8477
|
+
day: row2.day,
|
|
8478
|
+
createdAt: row2.createdAt,
|
|
8479
|
+
...row2.cacheWriteTokens !== void 0 ? {
|
|
8480
|
+
cacheWriteTokens: row2.cacheWriteTokens
|
|
7873
8481
|
} : {},
|
|
7874
|
-
...
|
|
7875
|
-
cacheReadTokens:
|
|
8482
|
+
...row2.cacheReadTokens !== void 0 ? {
|
|
8483
|
+
cacheReadTokens: row2.cacheReadTokens
|
|
7876
8484
|
} : {},
|
|
7877
|
-
...
|
|
7878
|
-
costUsd:
|
|
8485
|
+
...row2.costUsd !== void 0 ? {
|
|
8486
|
+
costUsd: row2.costUsd
|
|
7879
8487
|
} : {}
|
|
7880
8488
|
}));
|
|
7881
8489
|
}
|
|
@@ -7883,22 +8491,22 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7883
8491
|
governanceToolCalls() {
|
|
7884
8492
|
return [
|
|
7885
8493
|
...this.toolCalls.values()
|
|
7886
|
-
].map((
|
|
7887
|
-
toolCallId:
|
|
7888
|
-
toolName:
|
|
7889
|
-
toolType:
|
|
7890
|
-
status:
|
|
7891
|
-
threadId:
|
|
7892
|
-
messageId:
|
|
7893
|
-
createdAt:
|
|
7894
|
-
...
|
|
7895
|
-
executionMs:
|
|
8494
|
+
].map((row2) => ({
|
|
8495
|
+
toolCallId: row2.toolCallId,
|
|
8496
|
+
toolName: row2.toolName,
|
|
8497
|
+
toolType: row2.toolType,
|
|
8498
|
+
status: row2.status,
|
|
8499
|
+
threadId: row2.threadId,
|
|
8500
|
+
messageId: row2.messageId,
|
|
8501
|
+
createdAt: row2.createdAt,
|
|
8502
|
+
...row2.executionMs !== void 0 ? {
|
|
8503
|
+
executionMs: row2.executionMs
|
|
7896
8504
|
} : {},
|
|
7897
|
-
...
|
|
7898
|
-
error:
|
|
8505
|
+
...row2.error !== void 0 ? {
|
|
8506
|
+
error: row2.error
|
|
7899
8507
|
} : {},
|
|
7900
|
-
...
|
|
7901
|
-
runId:
|
|
8508
|
+
...row2.runId !== void 0 ? {
|
|
8509
|
+
runId: row2.runId
|
|
7902
8510
|
} : {}
|
|
7903
8511
|
}));
|
|
7904
8512
|
}
|
|
@@ -7958,51 +8566,51 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
7958
8566
|
governanceThreads() {
|
|
7959
8567
|
return [
|
|
7960
8568
|
...this.threads.values()
|
|
7961
|
-
].map((
|
|
7962
|
-
threadId:
|
|
7963
|
-
title:
|
|
7964
|
-
actorRef:
|
|
7965
|
-
messageCount:
|
|
7966
|
-
updatedAt:
|
|
8569
|
+
].map((row2) => ({
|
|
8570
|
+
threadId: row2.id,
|
|
8571
|
+
title: row2.title,
|
|
8572
|
+
actorRef: row2.actorRef,
|
|
8573
|
+
messageCount: row2.messages.length,
|
|
8574
|
+
updatedAt: row2.updatedAt
|
|
7967
8575
|
}));
|
|
7968
8576
|
}
|
|
7969
8577
|
/** Governance read-model feed: recorded run outcomes (the reliability surfaces). */
|
|
7970
8578
|
governanceRuns() {
|
|
7971
8579
|
return [
|
|
7972
8580
|
...this.runs.values()
|
|
7973
|
-
].map((
|
|
7974
|
-
runId:
|
|
7975
|
-
threadId:
|
|
7976
|
-
actorRef:
|
|
7977
|
-
status:
|
|
7978
|
-
retries:
|
|
7979
|
-
startedAt:
|
|
7980
|
-
...
|
|
7981
|
-
agentName:
|
|
8581
|
+
].map((row2) => ({
|
|
8582
|
+
runId: row2.runId,
|
|
8583
|
+
threadId: row2.threadId,
|
|
8584
|
+
actorRef: row2.actorRef,
|
|
8585
|
+
status: row2.status,
|
|
8586
|
+
retries: row2.retries,
|
|
8587
|
+
startedAt: row2.startedAt,
|
|
8588
|
+
...row2.agentName !== void 0 ? {
|
|
8589
|
+
agentName: row2.agentName
|
|
7982
8590
|
} : {},
|
|
7983
|
-
...
|
|
7984
|
-
parentRunId:
|
|
8591
|
+
...row2.parentRunId !== void 0 ? {
|
|
8592
|
+
parentRunId: row2.parentRunId
|
|
7985
8593
|
} : {},
|
|
7986
|
-
...
|
|
7987
|
-
durationMs:
|
|
8594
|
+
...row2.durationMs !== void 0 ? {
|
|
8595
|
+
durationMs: row2.durationMs
|
|
7988
8596
|
} : {},
|
|
7989
|
-
...
|
|
7990
|
-
errorCode:
|
|
8597
|
+
...row2.errorCode !== void 0 ? {
|
|
8598
|
+
errorCode: row2.errorCode
|
|
7991
8599
|
} : {},
|
|
7992
|
-
...
|
|
7993
|
-
errorMessage:
|
|
8600
|
+
...row2.errorMessage !== void 0 ? {
|
|
8601
|
+
errorMessage: row2.errorMessage
|
|
7994
8602
|
} : {},
|
|
7995
|
-
...
|
|
7996
|
-
settledAt:
|
|
8603
|
+
...row2.settledAt !== void 0 ? {
|
|
8604
|
+
settledAt: row2.settledAt
|
|
7997
8605
|
} : {},
|
|
7998
|
-
...
|
|
7999
|
-
promptHash:
|
|
8606
|
+
...row2.promptHash !== void 0 ? {
|
|
8607
|
+
promptHash: row2.promptHash
|
|
8000
8608
|
} : {}
|
|
8001
8609
|
}));
|
|
8002
8610
|
}
|
|
8003
8611
|
threadIdForMessage(messageId) {
|
|
8004
|
-
for (const [threadId,
|
|
8005
|
-
if (
|
|
8612
|
+
for (const [threadId, row2] of this.threads) {
|
|
8613
|
+
if (row2.messages.some((message) => message.id === messageId)) {
|
|
8006
8614
|
return threadId;
|
|
8007
8615
|
}
|
|
8008
8616
|
}
|
|
@@ -8012,54 +8620,54 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
8012
8620
|
toolCallRows() {
|
|
8013
8621
|
return [
|
|
8014
8622
|
...this.toolCalls.values()
|
|
8015
|
-
].map((
|
|
8016
|
-
toolCallId:
|
|
8017
|
-
toolName:
|
|
8018
|
-
toolType:
|
|
8019
|
-
status:
|
|
8020
|
-
input:
|
|
8021
|
-
...
|
|
8022
|
-
output:
|
|
8623
|
+
].map((row2) => ({
|
|
8624
|
+
toolCallId: row2.toolCallId,
|
|
8625
|
+
toolName: row2.toolName,
|
|
8626
|
+
toolType: row2.toolType,
|
|
8627
|
+
status: row2.status,
|
|
8628
|
+
input: row2.input,
|
|
8629
|
+
...row2.output !== void 0 ? {
|
|
8630
|
+
output: row2.output
|
|
8023
8631
|
} : {},
|
|
8024
|
-
...
|
|
8025
|
-
error:
|
|
8632
|
+
...row2.error !== void 0 ? {
|
|
8633
|
+
error: row2.error
|
|
8026
8634
|
} : {},
|
|
8027
|
-
...
|
|
8028
|
-
runId:
|
|
8635
|
+
...row2.runId !== void 0 ? {
|
|
8636
|
+
runId: row2.runId
|
|
8029
8637
|
} : {},
|
|
8030
|
-
...
|
|
8031
|
-
executedByRef:
|
|
8638
|
+
...row2.executedByRef !== void 0 ? {
|
|
8639
|
+
executedByRef: row2.executedByRef
|
|
8032
8640
|
} : {},
|
|
8033
|
-
...
|
|
8034
|
-
approver:
|
|
8641
|
+
...row2.approver !== void 0 ? {
|
|
8642
|
+
approver: row2.approver
|
|
8035
8643
|
} : {},
|
|
8036
|
-
...
|
|
8037
|
-
expiresAt:
|
|
8644
|
+
...row2.expiresAt !== void 0 ? {
|
|
8645
|
+
expiresAt: row2.expiresAt
|
|
8038
8646
|
} : {},
|
|
8039
|
-
...
|
|
8040
|
-
remember:
|
|
8647
|
+
...row2.remember !== void 0 ? {
|
|
8648
|
+
remember: row2.remember
|
|
8041
8649
|
} : {},
|
|
8042
|
-
...
|
|
8043
|
-
decidedVia:
|
|
8650
|
+
...row2.decidedVia !== void 0 ? {
|
|
8651
|
+
decidedVia: row2.decidedVia
|
|
8044
8652
|
} : {}
|
|
8045
8653
|
}));
|
|
8046
8654
|
}
|
|
8047
|
-
toSummary(
|
|
8048
|
-
const last =
|
|
8655
|
+
toSummary(row2) {
|
|
8656
|
+
const last = row2.messages[row2.messages.length - 1];
|
|
8049
8657
|
return {
|
|
8050
|
-
id:
|
|
8051
|
-
title:
|
|
8052
|
-
transient:
|
|
8053
|
-
createdAt:
|
|
8054
|
-
updatedAt:
|
|
8658
|
+
id: row2.id,
|
|
8659
|
+
title: row2.title,
|
|
8660
|
+
transient: row2.transient,
|
|
8661
|
+
createdAt: row2.createdAt,
|
|
8662
|
+
updatedAt: row2.updatedAt,
|
|
8055
8663
|
...last !== void 0 ? {
|
|
8056
8664
|
lastMessagePreview: last.content.slice(0, 120)
|
|
8057
8665
|
} : {},
|
|
8058
|
-
defaultAgent:
|
|
8059
|
-
...
|
|
8060
|
-
model:
|
|
8666
|
+
defaultAgent: row2.defaultAgent ?? null,
|
|
8667
|
+
...row2.model != null ? {
|
|
8668
|
+
model: row2.model
|
|
8061
8669
|
} : {},
|
|
8062
|
-
persona:
|
|
8670
|
+
persona: row2.persona ?? null
|
|
8063
8671
|
};
|
|
8064
8672
|
}
|
|
8065
8673
|
};
|
|
@@ -8067,22 +8675,22 @@ var InMemoryAgentStore = class extends InMemoryActionProposalStore {
|
|
|
8067
8675
|
// src/confirm-token.ts
|
|
8068
8676
|
var import_node_crypto3 = require("crypto");
|
|
8069
8677
|
var DEFAULT_CONFIRM_TTL_MS = 15 * 60 * 1e3;
|
|
8070
|
-
function
|
|
8678
|
+
function canonicalJson2(value) {
|
|
8071
8679
|
if (value === void 0) return "null";
|
|
8072
8680
|
if (value === null || typeof value !== "object") return JSON.stringify(value) ?? "null";
|
|
8073
|
-
if (Array.isArray(value)) return `[${value.map(
|
|
8681
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson2).join(",")}]`;
|
|
8074
8682
|
if (typeof value.toJSON === "function") {
|
|
8075
|
-
return
|
|
8683
|
+
return canonicalJson2(value.toJSON());
|
|
8076
8684
|
}
|
|
8077
8685
|
const entries = Object.entries(value).filter(([, entry]) => entry !== void 0).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
|
|
8078
|
-
return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${
|
|
8686
|
+
return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson2(entry)}`).join(",")}}`;
|
|
8079
8687
|
}
|
|
8080
|
-
__name(
|
|
8688
|
+
__name(canonicalJson2, "canonicalJson");
|
|
8081
8689
|
function signature(subject, expiresAt, secret) {
|
|
8082
8690
|
if (secret === "") {
|
|
8083
8691
|
throw new Error("confirm token: the secret is empty");
|
|
8084
8692
|
}
|
|
8085
|
-
return (0, import_node_crypto3.createHmac)("sha256", secret).update(
|
|
8693
|
+
return (0, import_node_crypto3.createHmac)("sha256", secret).update(canonicalJson2([
|
|
8086
8694
|
"agent-confirm",
|
|
8087
8695
|
subject.tool,
|
|
8088
8696
|
subject.actorId,
|
|
@@ -8410,8 +9018,8 @@ var SqlTokenStreamSink = class {
|
|
|
8410
9018
|
autoPurge;
|
|
8411
9019
|
writes = /* @__PURE__ */ new Map();
|
|
8412
9020
|
lastAutoPurge = 0;
|
|
8413
|
-
constructor(
|
|
8414
|
-
this.table =
|
|
9021
|
+
constructor(table2, options = {}) {
|
|
9022
|
+
this.table = table2;
|
|
8415
9023
|
this.pollIntervalMs = Math.max(1, options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS);
|
|
8416
9024
|
this.idlePollIntervalMs = Math.max(this.pollIntervalMs, options.idlePollIntervalMs ?? DEFAULT_IDLE_POLL_INTERVAL_MS);
|
|
8417
9025
|
this.flushMs = Math.max(0, options.flushMs ?? DEFAULT_FLUSH_MS);
|
|
@@ -8553,15 +9161,15 @@ var SqlTokenStreamSink = class {
|
|
|
8553
9161
|
let quietSince = Date.now();
|
|
8554
9162
|
while (true) {
|
|
8555
9163
|
const rows = await this.table.read(runId, cursor, READ_PAGE);
|
|
8556
|
-
for (const
|
|
8557
|
-
cursor =
|
|
8558
|
-
if (
|
|
8559
|
-
if (
|
|
8560
|
-
throw new AgentStreamError(JSON.parse(
|
|
9164
|
+
for (const row2 of rows) {
|
|
9165
|
+
cursor = row2.seq;
|
|
9166
|
+
if (row2.frame === null) {
|
|
9167
|
+
if (row2.error !== null) {
|
|
9168
|
+
throw new AgentStreamError(JSON.parse(row2.error));
|
|
8561
9169
|
}
|
|
8562
9170
|
return;
|
|
8563
9171
|
}
|
|
8564
|
-
yield encoder2.encode(
|
|
9172
|
+
yield encoder2.encode(row2.frame);
|
|
8565
9173
|
}
|
|
8566
9174
|
if (rows.length > 0) {
|
|
8567
9175
|
quietSince = Date.now();
|
|
@@ -8613,8 +9221,8 @@ var SqlTokenStreamSink = class {
|
|
|
8613
9221
|
};
|
|
8614
9222
|
|
|
8615
9223
|
// src/action-proposal-text.ts
|
|
8616
|
-
function resolveTextActionProposalDecision(text, proposals) {
|
|
8617
|
-
const command = parseTextActionProposalCommand(text);
|
|
9224
|
+
function resolveTextActionProposalDecision(text, proposals, vocabulary) {
|
|
9225
|
+
const command = parseTextActionProposalCommand(text, vocabulary);
|
|
8618
9226
|
if (command.status === "unmatched") return command;
|
|
8619
9227
|
const { decision, remember } = command;
|
|
8620
9228
|
const pending = proposals.filter((proposal) => proposal.decision === "pending");
|
|
@@ -8649,40 +9257,136 @@ function resolveTextActionProposalDecision(text, proposals) {
|
|
|
8649
9257
|
};
|
|
8650
9258
|
}
|
|
8651
9259
|
__name(resolveTextActionProposalDecision, "resolveTextActionProposalDecision");
|
|
8652
|
-
|
|
9260
|
+
var DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY = {
|
|
9261
|
+
approve: [
|
|
9262
|
+
"yes",
|
|
9263
|
+
"confirm",
|
|
9264
|
+
"approve",
|
|
9265
|
+
"approved",
|
|
9266
|
+
"ok"
|
|
9267
|
+
],
|
|
9268
|
+
reject: [
|
|
9269
|
+
"no",
|
|
9270
|
+
"cancel",
|
|
9271
|
+
"reject",
|
|
9272
|
+
"deny"
|
|
9273
|
+
],
|
|
9274
|
+
remember: [
|
|
9275
|
+
"always in this conversation"
|
|
9276
|
+
]
|
|
9277
|
+
};
|
|
9278
|
+
var DEFAULT_TEXT_ACTION_PROPOSAL_REPLIES = {
|
|
9279
|
+
approved: "Proposal approved and queued to run.",
|
|
9280
|
+
rejected: "Proposal rejected; nothing was run.",
|
|
9281
|
+
expired: "The proposal expired; nothing was run.",
|
|
9282
|
+
unchanged: "This proposal could not be changed; refresh the list to see where it stands.",
|
|
9283
|
+
ambiguous: /* @__PURE__ */ __name((ids) => `Which proposal? Reply confirm #ID or cancel #ID: ${ids.join(", ")}`, "ambiguous"),
|
|
9284
|
+
tooMany: "There are several proposals. Confirm or reject one with an explicit #ID."
|
|
9285
|
+
};
|
|
9286
|
+
function textActionProposalReply(result2, decision, replies = DEFAULT_TEXT_ACTION_PROPOSAL_REPLIES) {
|
|
9287
|
+
return result2.status === "expired" || result2.proposal?.decision === "expired" ? replies.expired : result2.status === "applied" || result2.status === "unchanged" ? decision === "approved" ? replies.approved : replies.rejected : replies.unchanged;
|
|
9288
|
+
}
|
|
9289
|
+
__name(textActionProposalReply, "textActionProposalReply");
|
|
9290
|
+
var escapeRegExp = /* @__PURE__ */ __name((word) => word.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "escapeRegExp");
|
|
9291
|
+
var alternatives = /* @__PURE__ */ __name((words) => words.map((word) => word.trim()).filter((word) => word.length > 0).map((word) => escapeRegExp(word).replace(/\s+/g, "\\s+")).join("|"), "alternatives");
|
|
9292
|
+
var fold = /* @__PURE__ */ __name((word) => word.trim().toLowerCase(), "fold");
|
|
9293
|
+
function parseTextActionProposalCommand(text, vocabulary = DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY) {
|
|
8653
9294
|
if (/[\r\n]/u.test(text)) return {
|
|
8654
9295
|
status: "unmatched"
|
|
8655
9296
|
};
|
|
8656
|
-
const
|
|
8657
|
-
|
|
9297
|
+
const verbs = alternatives([
|
|
9298
|
+
...vocabulary.approve,
|
|
9299
|
+
...vocabulary.reject
|
|
9300
|
+
]);
|
|
9301
|
+
if (verbs.length === 0) return {
|
|
9302
|
+
status: "unmatched"
|
|
9303
|
+
};
|
|
9304
|
+
const remember = alternatives(vocabulary.remember);
|
|
9305
|
+
const match = new RegExp(`^(${verbs})${remember.length > 0 ? `(?: (${remember}))?` : "()"}(?: #([^\\s]+?))?[.!]?$`, "iu").exec(text.trim());
|
|
8658
9306
|
if (!match) return {
|
|
8659
9307
|
status: "unmatched"
|
|
8660
9308
|
};
|
|
8661
|
-
const verb = match[1]
|
|
9309
|
+
const verb = match[1] === void 0 ? void 0 : fold(match[1]);
|
|
8662
9310
|
if (verb === void 0) return {
|
|
8663
9311
|
status: "unmatched"
|
|
8664
9312
|
};
|
|
8665
|
-
const decision =
|
|
8666
|
-
|
|
8667
|
-
|
|
8668
|
-
"rejeito",
|
|
8669
|
-
"n\xE3o",
|
|
8670
|
-
"nao"
|
|
8671
|
-
].includes(verb) ? "rejected" : "approved";
|
|
8672
|
-
const remember = match[2] !== void 0;
|
|
8673
|
-
if (remember && decision !== "approved") return {
|
|
9313
|
+
const decision = vocabulary.reject.some((word) => fold(word) === verb) ? "rejected" : "approved";
|
|
9314
|
+
const remembers = match[2] !== void 0 && match[2] !== "";
|
|
9315
|
+
if (remembers && decision !== "approved") return {
|
|
8674
9316
|
status: "unmatched"
|
|
8675
9317
|
};
|
|
8676
9318
|
return {
|
|
8677
9319
|
status: "command",
|
|
8678
9320
|
decision,
|
|
8679
|
-
remember,
|
|
9321
|
+
remember: remembers,
|
|
8680
9322
|
...match[3] !== void 0 ? {
|
|
8681
9323
|
proposalId: match[3]
|
|
8682
9324
|
} : {}
|
|
8683
9325
|
};
|
|
8684
9326
|
}
|
|
8685
9327
|
__name(parseTextActionProposalCommand, "parseTextActionProposalCommand");
|
|
9328
|
+
var ptBrActionProposalText = {
|
|
9329
|
+
vocabulary: {
|
|
9330
|
+
approve: [
|
|
9331
|
+
"sim",
|
|
9332
|
+
"confirmo",
|
|
9333
|
+
"confirmar",
|
|
9334
|
+
"aprovar",
|
|
9335
|
+
"aprovo",
|
|
9336
|
+
"pode",
|
|
9337
|
+
...DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY.approve
|
|
9338
|
+
],
|
|
9339
|
+
reject: [
|
|
9340
|
+
"n\xE3o",
|
|
9341
|
+
"nao",
|
|
9342
|
+
"cancelar",
|
|
9343
|
+
"cancela",
|
|
9344
|
+
"rejeitar",
|
|
9345
|
+
"rejeito",
|
|
9346
|
+
...DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY.reject
|
|
9347
|
+
],
|
|
9348
|
+
remember: [
|
|
9349
|
+
"sempre nesta conversa",
|
|
9350
|
+
...DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY.remember
|
|
9351
|
+
]
|
|
9352
|
+
},
|
|
9353
|
+
replies: {
|
|
9354
|
+
approved: "Proposta aprovada e enfileirada para execu\xE7\xE3o.",
|
|
9355
|
+
rejected: "Proposta rejeitada; nenhuma a\xE7\xE3o foi executada.",
|
|
9356
|
+
expired: "A proposta expirou; nenhuma a\xE7\xE3o foi executada.",
|
|
9357
|
+
unchanged: "N\xE3o foi poss\xEDvel alterar esta proposta; atualize a lista para consultar seu estado.",
|
|
9358
|
+
ambiguous: /* @__PURE__ */ __name((ids) => `Qual proposta? Responda confirmar #ID ou cancelar #ID: ${ids.join(", ")}`, "ambiguous"),
|
|
9359
|
+
tooMany: "H\xE1 v\xE1rias propostas. Confirme ou rejeite usando #ID expl\xEDcito."
|
|
9360
|
+
}
|
|
9361
|
+
};
|
|
9362
|
+
|
|
9363
|
+
// src/action-proposal-view.ts
|
|
9364
|
+
function toActionProposalView(proposal) {
|
|
9365
|
+
const { execution, outcomeDelivery, idempotencyKey: _idempotencyKey, preparationInput: _preparationInput, executionContext: _executionContext, ...rest } = proposal;
|
|
9366
|
+
return {
|
|
9367
|
+
...rest,
|
|
9368
|
+
execution: execution === null ? null : withoutLease(execution),
|
|
9369
|
+
...outcomeDelivery !== void 0 ? {
|
|
9370
|
+
outcomeDelivery: withoutLease(outcomeDelivery)
|
|
9371
|
+
} : {}
|
|
9372
|
+
};
|
|
9373
|
+
}
|
|
9374
|
+
__name(toActionProposalView, "toActionProposalView");
|
|
9375
|
+
function toActionProposalMutationView(result2) {
|
|
9376
|
+
const { proposal, ...rest } = result2;
|
|
9377
|
+
return {
|
|
9378
|
+
...rest,
|
|
9379
|
+
...proposal !== void 0 ? {
|
|
9380
|
+
proposal: toActionProposalView(proposal)
|
|
9381
|
+
} : {}
|
|
9382
|
+
};
|
|
9383
|
+
}
|
|
9384
|
+
__name(toActionProposalMutationView, "toActionProposalMutationView");
|
|
9385
|
+
function withoutLease(value) {
|
|
9386
|
+
const { lease: _lease, ...rest } = value;
|
|
9387
|
+
return rest;
|
|
9388
|
+
}
|
|
9389
|
+
__name(withoutLease, "withoutLease");
|
|
8686
9390
|
|
|
8687
9391
|
// src/action-proposal-executor.ts
|
|
8688
9392
|
var ActionProposalExecutor = class {
|
|
@@ -8914,6 +9618,37 @@ function assertIndependentActionCapabilities(store, resolver) {
|
|
|
8914
9618
|
if (required.some((method) => typeof candidate[method] !== "function")) throw new Error("Independent action mode requires proposal, worker, outcome and admission capabilities on the conversation store");
|
|
8915
9619
|
}
|
|
8916
9620
|
__name(assertIndependentActionCapabilities, "assertIndependentActionCapabilities");
|
|
9621
|
+
|
|
9622
|
+
// src/functional-tool.ts
|
|
9623
|
+
function createFunctionalTool(definition) {
|
|
9624
|
+
const { input, execute, present, preflight, isEnabled, canUse, describe, kind, ...metadata } = definition;
|
|
9625
|
+
return {
|
|
9626
|
+
spec: {
|
|
9627
|
+
...metadata,
|
|
9628
|
+
kind: kind ?? "read",
|
|
9629
|
+
inputSchema: input
|
|
9630
|
+
},
|
|
9631
|
+
handler: {
|
|
9632
|
+
execute: execute.bind(definition),
|
|
9633
|
+
...present === void 0 ? {} : {
|
|
9634
|
+
present: present.bind(definition)
|
|
9635
|
+
},
|
|
9636
|
+
...preflight === void 0 ? {} : {
|
|
9637
|
+
preflight: preflight.bind(definition)
|
|
9638
|
+
},
|
|
9639
|
+
...isEnabled === void 0 ? {} : {
|
|
9640
|
+
isEnabled: isEnabled.bind(definition)
|
|
9641
|
+
},
|
|
9642
|
+
...canUse === void 0 ? {} : {
|
|
9643
|
+
canUse: canUse.bind(definition)
|
|
9644
|
+
},
|
|
9645
|
+
...describe === void 0 ? {} : {
|
|
9646
|
+
describe: describe.bind(definition)
|
|
9647
|
+
}
|
|
9648
|
+
}
|
|
9649
|
+
};
|
|
9650
|
+
}
|
|
9651
|
+
__name(createFunctionalTool, "createFunctionalTool");
|
|
8917
9652
|
// Annotate the CommonJS export names for ESM import in node:
|
|
8918
9653
|
0 && (module.exports = {
|
|
8919
9654
|
AGENT_ACTOR_DIRECTORY,
|
|
@@ -8964,6 +9699,8 @@ __name(assertIndependentActionCapabilities, "assertIndependentActionCapabilities
|
|
|
8964
9699
|
DEFAULT_MAX_SKILLS,
|
|
8965
9700
|
DEFAULT_REFUSAL_REASON,
|
|
8966
9701
|
DEFAULT_STRUCTURED_OUTPUT_INSTRUCTION,
|
|
9702
|
+
DEFAULT_TEXT_ACTION_PROPOSAL_REPLIES,
|
|
9703
|
+
DEFAULT_TEXT_ACTION_PROPOSAL_VOCABULARY,
|
|
8967
9704
|
DEFAULT_TOOL_TRANSIENT_RETRY_ATTEMPTS,
|
|
8968
9705
|
DEFAULT_TOOL_TRANSIENT_RETRY_BACKOFF_MS,
|
|
8969
9706
|
DefaultApprovalPolicy,
|
|
@@ -9027,6 +9764,7 @@ __name(assertIndependentActionCapabilities, "assertIndependentActionCapabilities
|
|
|
9027
9764
|
compositeSkillProvider,
|
|
9028
9765
|
confirmTokenExpiry,
|
|
9029
9766
|
createFrameBuffer,
|
|
9767
|
+
createFunctionalTool,
|
|
9030
9768
|
createIncrementalGate,
|
|
9031
9769
|
createNegotiatedUiCollector,
|
|
9032
9770
|
createNoopEmitUi,
|
|
@@ -9040,6 +9778,7 @@ __name(assertIndependentActionCapabilities, "assertIndependentActionCapabilities
|
|
|
9040
9778
|
detachedDelivered,
|
|
9041
9779
|
detachedStarted,
|
|
9042
9780
|
detachedUnsettled,
|
|
9781
|
+
emitToolPresentations,
|
|
9043
9782
|
encodeStreamEvent,
|
|
9044
9783
|
escapeUnsafeToolUiText,
|
|
9045
9784
|
estimateCost,
|
|
@@ -9078,6 +9817,7 @@ __name(assertIndependentActionCapabilities, "assertIndependentActionCapabilities
|
|
|
9078
9817
|
parseTextActionProposalCommand,
|
|
9079
9818
|
personaCatalogEntry,
|
|
9080
9819
|
prepareActionProposal,
|
|
9820
|
+
ptBrActionProposalText,
|
|
9081
9821
|
publishAgentDelegated,
|
|
9082
9822
|
publishAgentMemoryResolved,
|
|
9083
9823
|
publishAgentMemoryWritten,
|
|
@@ -9134,6 +9874,9 @@ __name(assertIndependentActionCapabilities, "assertIndependentActionCapabilities
|
|
|
9134
9874
|
streamFailure,
|
|
9135
9875
|
summarizeWithModel,
|
|
9136
9876
|
tenantScope,
|
|
9877
|
+
textActionProposalReply,
|
|
9878
|
+
toActionProposalMutationView,
|
|
9879
|
+
toActionProposalView,
|
|
9137
9880
|
toolCallApprovalFromRow,
|
|
9138
9881
|
toolCallContext,
|
|
9139
9882
|
traceLlmTurn,
|