@evalops/maestro 0.10.21 → 0.10.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agent.d.ts +1 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +15 -4
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +68 -3
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/types.d.ts +3 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +7 -1
- package/dist/agent/transport.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/bootstrap/tools-setup.d.ts.map +1 -1
- package/dist/bootstrap/tools-setup.js +3 -2
- package/dist/bootstrap/tools-setup.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts.map +1 -1
- package/dist/cli/commands/a2a.js +141 -8
- package/dist/cli/commands/a2a.js.map +1 -1
- package/dist/cli/commands/codex.d.ts.map +1 -1
- package/dist/cli/commands/codex.js +4 -3
- package/dist/cli/commands/codex.js.map +1 -1
- package/dist/cli/commands/hosted-runner.d.ts +1 -0
- package/dist/cli/commands/hosted-runner.d.ts.map +1 -1
- package/dist/cli/commands/hosted-runner.js +31 -2
- package/dist/cli/commands/hosted-runner.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +2 -9
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli-tui/commands/a2a-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/a2a-handlers.js +55 -0
- package/dist/cli-tui/commands/a2a-handlers.js.map +1 -1
- package/dist/cli.js +3925 -2024
- package/dist/codex/compatibility.d.ts +17 -1
- package/dist/codex/compatibility.d.ts.map +1 -1
- package/dist/codex/compatibility.js +57 -1
- package/dist/codex/compatibility.js.map +1 -1
- package/dist/guardian/config.d.ts +8 -6
- package/dist/guardian/config.d.ts.map +1 -1
- package/dist/guardian/config.js +33 -7
- package/dist/guardian/config.js.map +1 -1
- package/dist/guardian/runner.d.ts.map +1 -1
- package/dist/guardian/runner.js +54 -9
- package/dist/guardian/runner.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +2 -0
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/fathom-cua.d.ts +3 -0
- package/dist/mcp/fathom-cua.d.ts.map +1 -0
- package/dist/mcp/fathom-cua.js +158 -0
- package/dist/mcp/fathom-cua.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts +58 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
- package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/platform/a2a-cockpit.d.ts +90 -0
- package/dist/platform/a2a-cockpit.d.ts.map +1 -0
- package/dist/platform/a2a-cockpit.js +302 -0
- package/dist/platform/a2a-cockpit.js.map +1 -0
- package/dist/platform/a2a-fleet.d.ts +14 -0
- package/dist/platform/a2a-fleet.d.ts.map +1 -1
- package/dist/platform/a2a-fleet.js +66 -1
- package/dist/platform/a2a-fleet.js.map +1 -1
- package/dist/platform/a2a-ownership.d.ts +27 -0
- package/dist/platform/a2a-ownership.d.ts.map +1 -0
- package/dist/platform/a2a-ownership.js +149 -0
- package/dist/platform/a2a-ownership.js.map +1 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
- package/dist/platform/a2a-task-ledger.js +29 -5
- package/dist/platform/a2a-task-ledger.js.map +1 -1
- package/dist/server/agent-trajectory-replay-lab.d.ts +36 -0
- package/dist/server/agent-trajectory-replay-lab.d.ts.map +1 -0
- package/dist/server/agent-trajectory-replay-lab.js +48 -0
- package/dist/server/agent-trajectory-replay-lab.js.map +1 -0
- package/dist/server/any-agent-control-plane-proof.d.ts +42 -0
- package/dist/server/any-agent-control-plane-proof.d.ts.map +1 -0
- package/dist/server/any-agent-control-plane-proof.js +175 -0
- package/dist/server/any-agent-control-plane-proof.js.map +1 -0
- package/dist/server/app-context.d.ts +1 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/a2a-cockpit.d.ts +3 -0
- package/dist/server/handlers/a2a-cockpit.d.ts.map +1 -0
- package/dist/server/handlers/a2a-cockpit.js +71 -0
- package/dist/server/handlers/a2a-cockpit.js.map +1 -0
- package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
- package/dist/server/handlers/headless-sessions.js +17 -2
- package/dist/server/handlers/headless-sessions.js.map +1 -1
- package/dist/server/handlers/session-artifacts.d.ts.map +1 -1
- package/dist/server/handlers/session-artifacts.js +14 -58
- package/dist/server/handlers/session-artifacts.js.map +1 -1
- package/dist/server/handlers/session-replay-lab.d.ts +13 -0
- package/dist/server/handlers/session-replay-lab.d.ts.map +1 -0
- package/dist/server/handlers/session-replay-lab.js +80 -0
- package/dist/server/handlers/session-replay-lab.js.map +1 -0
- package/dist/server/handlers/stats.js +1 -1
- package/dist/server/handlers/stats.js.map +1 -1
- package/dist/server/handlers/status.d.ts +44 -3
- package/dist/server/handlers/status.d.ts.map +1 -1
- package/dist/server/handlers/status.js +227 -17
- package/dist/server/handlers/status.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +17 -0
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +143 -3
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-agent-runtime-progress.d.ts +17 -0
- package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
- package/dist/server/hosted-agent-runtime-progress.js +352 -15
- package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +14 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/services/intelligent-router/index.d.ts +1 -1
- package/dist/services/intelligent-router/index.d.ts.map +1 -1
- package/dist/services/intelligent-router/index.js +1 -1
- package/dist/services/intelligent-router/index.js.map +1 -1
- package/dist/services/intelligent-router/normalize.d.ts +10 -2
- package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
- package/dist/services/intelligent-router/normalize.js +20 -1
- package/dist/services/intelligent-router/normalize.js.map +1 -1
- package/dist/services/intelligent-router/service.d.ts.map +1 -1
- package/dist/services/intelligent-router/service.js +35 -0
- package/dist/services/intelligent-router/service.js.map +1 -1
- package/dist/services/intelligent-router/types.d.ts +13 -0
- package/dist/services/intelligent-router/types.d.ts.map +1 -1
- package/dist/services/intelligent-router/types.js +1 -0
- package/dist/services/intelligent-router/types.js.map +1 -1
- package/dist/telemetry/cli-command-aggregator.d.ts +1 -0
- package/dist/telemetry/cli-command-aggregator.d.ts.map +1 -1
- package/dist/telemetry/cli-command-aggregator.js +23 -0
- package/dist/telemetry/cli-command-aggregator.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +11 -5
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-event-catalog.d.ts +15 -1
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-catalog.js +30 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +289 -283
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const A2A_OWNERSHIP_RECORD_KEYS = [
|
|
2
|
+
"scopeKey",
|
|
3
|
+
"sessionScope",
|
|
4
|
+
"workspaceId",
|
|
5
|
+
"workspace_id",
|
|
6
|
+
"organizationId",
|
|
7
|
+
"organization_id",
|
|
8
|
+
"orgId",
|
|
9
|
+
"teamId",
|
|
10
|
+
"team_id",
|
|
11
|
+
"ownerSubject",
|
|
12
|
+
"owner_subject",
|
|
13
|
+
"ownerId",
|
|
14
|
+
"owner_id",
|
|
15
|
+
"userId",
|
|
16
|
+
"user_id",
|
|
17
|
+
"actorId",
|
|
18
|
+
"actor_id",
|
|
19
|
+
"keyId",
|
|
20
|
+
"key_id",
|
|
21
|
+
];
|
|
22
|
+
export function hasA2AOwnershipScope(scope) {
|
|
23
|
+
return Boolean(scope &&
|
|
24
|
+
Object.values(scope).some((value) => typeof value === "string" && value.trim().length > 0));
|
|
25
|
+
}
|
|
26
|
+
export function hasA2AOwnershipRecordMarkers(record) {
|
|
27
|
+
return metadataValues(record, A2A_OWNERSHIP_RECORD_KEYS).length > 0;
|
|
28
|
+
}
|
|
29
|
+
export function matchesA2AOwnershipScope(record, scope) {
|
|
30
|
+
if (!hasA2AOwnershipScope(scope)) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
let sawMarker = false;
|
|
34
|
+
let matched = false;
|
|
35
|
+
let matchedIdentity = false;
|
|
36
|
+
let sawIdentityMarker = false;
|
|
37
|
+
const scopedIds = normalizedValues(scope.scopeKey);
|
|
38
|
+
if (!matchRequiredDimension(metadataValues(record, ["scopeKey", "sessionScope"]), scopedIds, (next) => {
|
|
39
|
+
sawMarker = true;
|
|
40
|
+
matched ||= next;
|
|
41
|
+
})) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const workspaceIds = normalizedValues(scope.workspaceId);
|
|
45
|
+
if (!matchRequiredDimension(metadataValues(record, ["workspaceId", "workspace_id"]), workspaceIds, (next) => {
|
|
46
|
+
sawMarker = true;
|
|
47
|
+
matched ||= next;
|
|
48
|
+
})) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const orgIds = normalizedValues(scope.orgId);
|
|
52
|
+
if (!matchRequiredDimension(metadataValues(record, ["organizationId", "organization_id", "orgId"]), orgIds, (next) => {
|
|
53
|
+
sawMarker = true;
|
|
54
|
+
matched ||= next;
|
|
55
|
+
})) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const teamIds = normalizedValues(scope.teamId);
|
|
59
|
+
if (!matchRequiredDimension(metadataValues(record, ["teamId", "team_id"]), teamIds, (next) => {
|
|
60
|
+
sawMarker = true;
|
|
61
|
+
matched ||= next;
|
|
62
|
+
})) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const identities = identityValues(scope);
|
|
66
|
+
if (!matchRequiredDimension(metadataValues(record, [
|
|
67
|
+
"ownerSubject",
|
|
68
|
+
"owner_subject",
|
|
69
|
+
"ownerId",
|
|
70
|
+
"owner_id",
|
|
71
|
+
"userId",
|
|
72
|
+
"user_id",
|
|
73
|
+
"actorId",
|
|
74
|
+
"actor_id",
|
|
75
|
+
"keyId",
|
|
76
|
+
"key_id",
|
|
77
|
+
]), identities, (next) => {
|
|
78
|
+
sawMarker = true;
|
|
79
|
+
sawIdentityMarker = true;
|
|
80
|
+
matched ||= next;
|
|
81
|
+
matchedIdentity ||= next;
|
|
82
|
+
})) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if (identities.size > 0 && sawIdentityMarker && !matchedIdentity) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return sawMarker && matched;
|
|
89
|
+
}
|
|
90
|
+
function matchRequiredDimension(values, expected, observe) {
|
|
91
|
+
if (values.length === 0) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
if (expected.size === 0) {
|
|
95
|
+
observe(false);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const matched = values.some((value) => expected.has(normalize(value)));
|
|
99
|
+
observe(matched);
|
|
100
|
+
return matched;
|
|
101
|
+
}
|
|
102
|
+
function metadataValues(record, keys) {
|
|
103
|
+
const values = new Set();
|
|
104
|
+
for (const key of keys) {
|
|
105
|
+
const direct = directString(record, key);
|
|
106
|
+
if (direct) {
|
|
107
|
+
values.add(direct);
|
|
108
|
+
}
|
|
109
|
+
const metadata = metadataString(record.metadata, key);
|
|
110
|
+
if (metadata) {
|
|
111
|
+
values.add(metadata);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return [...values];
|
|
115
|
+
}
|
|
116
|
+
function directString(record, key) {
|
|
117
|
+
const value = record[key];
|
|
118
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
119
|
+
}
|
|
120
|
+
function metadataString(metadata, key) {
|
|
121
|
+
const value = metadata?.[key];
|
|
122
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
123
|
+
}
|
|
124
|
+
function normalizedValues(...values) {
|
|
125
|
+
return new Set(values
|
|
126
|
+
.flatMap((value) => identityAliases(value))
|
|
127
|
+
.map(normalize)
|
|
128
|
+
.filter(Boolean));
|
|
129
|
+
}
|
|
130
|
+
function identityValues(scope) {
|
|
131
|
+
return normalizedValues(scope.subject, scope.userId, scope.keyId);
|
|
132
|
+
}
|
|
133
|
+
function identityAliases(value) {
|
|
134
|
+
const trimmed = value?.trim();
|
|
135
|
+
if (!trimmed) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
const aliases = [trimmed];
|
|
139
|
+
for (const prefix of ["user:", "key:"]) {
|
|
140
|
+
if (trimmed.startsWith(prefix)) {
|
|
141
|
+
aliases.push(trimmed.slice(prefix.length));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return aliases;
|
|
145
|
+
}
|
|
146
|
+
function normalize(value) {
|
|
147
|
+
return value.trim().toLowerCase();
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=a2a-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-ownership.js","sourceRoot":"","sources":["../../src/platform/a2a-ownership.ts"],"names":[],"mappings":"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","sourcesContent":["export interface A2AOwnershipScope {\n\tscopeKey?: string;\n\tsubject?: string;\n\tuserId?: string;\n\tkeyId?: string;\n\tworkspaceId?: string;\n\torgId?: string;\n\tteamId?: string;\n}\n\nexport interface A2AOwnershipRecord {\n\tworkspaceId?: string;\n\torganizationId?: string;\n\torgId?: string;\n\tteamId?: string;\n\tactorId?: string;\n\townerId?: string;\n\tuserId?: string;\n\tkeyId?: string;\n\townerSubject?: string;\n\tscopeKey?: string;\n\tsessionScope?: string;\n\tmetadata?: Record<string, string | number | boolean>;\n}\n\nconst A2A_OWNERSHIP_RECORD_KEYS = [\n\t\"scopeKey\",\n\t\"sessionScope\",\n\t\"workspaceId\",\n\t\"workspace_id\",\n\t\"organizationId\",\n\t\"organization_id\",\n\t\"orgId\",\n\t\"teamId\",\n\t\"team_id\",\n\t\"ownerSubject\",\n\t\"owner_subject\",\n\t\"ownerId\",\n\t\"owner_id\",\n\t\"userId\",\n\t\"user_id\",\n\t\"actorId\",\n\t\"actor_id\",\n\t\"keyId\",\n\t\"key_id\",\n] as const;\n\nexport function hasA2AOwnershipScope(\n\tscope: A2AOwnershipScope | undefined,\n): scope is A2AOwnershipScope {\n\treturn Boolean(\n\t\tscope &&\n\t\t\tObject.values(scope).some(\n\t\t\t\t(value) => typeof value === \"string\" && value.trim().length > 0,\n\t\t\t),\n\t);\n}\n\nexport function hasA2AOwnershipRecordMarkers(\n\trecord: A2AOwnershipRecord,\n): boolean {\n\treturn metadataValues(record, A2A_OWNERSHIP_RECORD_KEYS).length > 0;\n}\n\nexport function matchesA2AOwnershipScope(\n\trecord: A2AOwnershipRecord,\n\tscope: A2AOwnershipScope | undefined,\n): boolean {\n\tif (!hasA2AOwnershipScope(scope)) {\n\t\treturn true;\n\t}\n\tlet sawMarker = false;\n\tlet matched = false;\n\tlet matchedIdentity = false;\n\tlet sawIdentityMarker = false;\n\n\tconst scopedIds = normalizedValues(scope.scopeKey);\n\tif (\n\t\t!matchRequiredDimension(\n\t\t\tmetadataValues(record, [\"scopeKey\", \"sessionScope\"]),\n\t\t\tscopedIds,\n\t\t\t(next) => {\n\t\t\t\tsawMarker = true;\n\t\t\t\tmatched ||= next;\n\t\t\t},\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\tconst workspaceIds = normalizedValues(scope.workspaceId);\n\tif (\n\t\t!matchRequiredDimension(\n\t\t\tmetadataValues(record, [\"workspaceId\", \"workspace_id\"]),\n\t\t\tworkspaceIds,\n\t\t\t(next) => {\n\t\t\t\tsawMarker = true;\n\t\t\t\tmatched ||= next;\n\t\t\t},\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\tconst orgIds = normalizedValues(scope.orgId);\n\tif (\n\t\t!matchRequiredDimension(\n\t\t\tmetadataValues(record, [\"organizationId\", \"organization_id\", \"orgId\"]),\n\t\t\torgIds,\n\t\t\t(next) => {\n\t\t\t\tsawMarker = true;\n\t\t\t\tmatched ||= next;\n\t\t\t},\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\tconst teamIds = normalizedValues(scope.teamId);\n\tif (\n\t\t!matchRequiredDimension(\n\t\t\tmetadataValues(record, [\"teamId\", \"team_id\"]),\n\t\t\tteamIds,\n\t\t\t(next) => {\n\t\t\t\tsawMarker = true;\n\t\t\t\tmatched ||= next;\n\t\t\t},\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\tconst identities = identityValues(scope);\n\tif (\n\t\t!matchRequiredDimension(\n\t\t\tmetadataValues(record, [\n\t\t\t\t\"ownerSubject\",\n\t\t\t\t\"owner_subject\",\n\t\t\t\t\"ownerId\",\n\t\t\t\t\"owner_id\",\n\t\t\t\t\"userId\",\n\t\t\t\t\"user_id\",\n\t\t\t\t\"actorId\",\n\t\t\t\t\"actor_id\",\n\t\t\t\t\"keyId\",\n\t\t\t\t\"key_id\",\n\t\t\t]),\n\t\t\tidentities,\n\t\t\t(next) => {\n\t\t\t\tsawMarker = true;\n\t\t\t\tsawIdentityMarker = true;\n\t\t\t\tmatched ||= next;\n\t\t\t\tmatchedIdentity ||= next;\n\t\t\t},\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\tif (identities.size > 0 && sawIdentityMarker && !matchedIdentity) {\n\t\treturn false;\n\t}\n\treturn sawMarker && matched;\n}\n\nfunction matchRequiredDimension(\n\tvalues: readonly string[],\n\texpected: ReadonlySet<string>,\n\tobserve: (matched: boolean) => void,\n): boolean {\n\tif (values.length === 0) {\n\t\treturn true;\n\t}\n\tif (expected.size === 0) {\n\t\tobserve(false);\n\t\treturn false;\n\t}\n\tconst matched = values.some((value) => expected.has(normalize(value)));\n\tobserve(matched);\n\treturn matched;\n}\n\nfunction metadataValues(\n\trecord: A2AOwnershipRecord,\n\tkeys: readonly string[],\n): string[] {\n\tconst values = new Set<string>();\n\tfor (const key of keys) {\n\t\tconst direct = directString(record, key);\n\t\tif (direct) {\n\t\t\tvalues.add(direct);\n\t\t}\n\t\tconst metadata = metadataString(record.metadata, key);\n\t\tif (metadata) {\n\t\t\tvalues.add(metadata);\n\t\t}\n\t}\n\treturn [...values];\n}\n\nfunction directString(\n\trecord: A2AOwnershipRecord,\n\tkey: string,\n): string | undefined {\n\tconst value = (record as Record<string, unknown>)[key];\n\treturn typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction metadataString(\n\tmetadata: Record<string, string | number | boolean> | undefined,\n\tkey: string,\n): string | undefined {\n\tconst value = metadata?.[key];\n\treturn typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction normalizedValues(\n\t...values: Array<string | undefined>\n): ReadonlySet<string> {\n\treturn new Set(\n\t\tvalues\n\t\t\t.flatMap((value) => identityAliases(value))\n\t\t\t.map(normalize)\n\t\t\t.filter(Boolean),\n\t);\n}\n\nfunction identityValues(scope: A2AOwnershipScope): ReadonlySet<string> {\n\treturn normalizedValues(scope.subject, scope.userId, scope.keyId);\n}\n\nfunction identityAliases(value: string | undefined): string[] {\n\tconst trimmed = value?.trim();\n\tif (!trimmed) {\n\t\treturn [];\n\t}\n\tconst aliases = [trimmed];\n\tfor (const prefix of [\"user:\", \"key:\"]) {\n\t\tif (trimmed.startsWith(prefix)) {\n\t\t\taliases.push(trimmed.slice(prefix.length));\n\t\t}\n\t}\n\treturn aliases;\n}\n\nfunction normalize(value: string): string {\n\treturn value.trim().toLowerCase();\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-task-ledger.d.ts","sourceRoot":"","sources":["../../src/platform/a2a-task-ledger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"a2a-task-ledger.d.ts","sourceRoot":"","sources":["../../src/platform/a2a-task-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -176,7 +176,7 @@ export async function recordA2ATaskStart(input) {
|
|
|
176
176
|
const now = (input.now ?? new Date()).toISOString();
|
|
177
177
|
const taskId = trimString(input.task.id) ?? fail("A2A task id is required");
|
|
178
178
|
const existingIndex = ledger.tasks.findIndex((entry) => entry.peer === input.peer && entry.taskId === taskId);
|
|
179
|
-
const metadata =
|
|
179
|
+
const metadata = mergeLedgerMetadata(extractA2ATaskLedgerMetadata(input.task), input.metadata);
|
|
180
180
|
const workGraph = extractA2AWorkGraphMetadata(input.task);
|
|
181
181
|
const userText = input.text.trim();
|
|
182
182
|
const entry = {
|
|
@@ -249,10 +249,7 @@ export async function recordA2ATaskReply(input) {
|
|
|
249
249
|
const taskId = trimString(input.task.id) ?? fail("A2A task id is required");
|
|
250
250
|
const existingIndex = ledger.tasks.findIndex((entry) => entry.peer === input.peer && entry.taskId === taskId);
|
|
251
251
|
const previous = existingIndex >= 0 ? ledger.tasks[existingIndex] : undefined;
|
|
252
|
-
const metadata =
|
|
253
|
-
...(previous?.metadata ?? {}),
|
|
254
|
-
...(input.metadata ?? {}),
|
|
255
|
-
});
|
|
252
|
+
const metadata = mergeLedgerMetadata(previous?.metadata, extractA2ATaskLedgerMetadata(input.task), input.metadata);
|
|
256
253
|
const workGraph = extractA2AWorkGraphMetadata(input.task) ?? previous?.workGraph;
|
|
257
254
|
const userText = input.text.trim();
|
|
258
255
|
const taskResponse = extractA2ATaskResponse(input.task);
|
|
@@ -333,6 +330,7 @@ export async function updateA2ATaskInLedger(input) {
|
|
|
333
330
|
const previous = ledger.tasks[index];
|
|
334
331
|
const taskResponse = extractA2ATaskResponse(input.task);
|
|
335
332
|
const responseText = taskResponse?.text ?? previous.responseText;
|
|
333
|
+
const metadata = mergeLedgerMetadata(previous.metadata, extractA2ATaskLedgerMetadata(input.task));
|
|
336
334
|
const workGraph = extractA2AWorkGraphMetadata(input.task) ?? previous.workGraph;
|
|
337
335
|
const entry = {
|
|
338
336
|
...previous,
|
|
@@ -341,6 +339,7 @@ export async function updateA2ATaskInLedger(input) {
|
|
|
341
339
|
? { contextId: trimString(input.task.contextId) }
|
|
342
340
|
: {}),
|
|
343
341
|
...(responseText ? { responseText } : {}),
|
|
342
|
+
...(metadata ? { metadata } : {}),
|
|
344
343
|
...(workGraph ? { workGraph } : {}),
|
|
345
344
|
updatedAt: now,
|
|
346
345
|
...(isFinalA2AState(input.task.status.state)
|
|
@@ -516,6 +515,31 @@ function cleanMetadata(input) {
|
|
|
516
515
|
typeof entry[1] === "boolean");
|
|
517
516
|
return entries.length > 0 ? Object.fromEntries(entries) : undefined;
|
|
518
517
|
}
|
|
518
|
+
function extractA2ATaskLedgerMetadata(task) {
|
|
519
|
+
if (!isRecord(task.metadata)) {
|
|
520
|
+
return undefined;
|
|
521
|
+
}
|
|
522
|
+
return cleanMetadata(Object.fromEntries(Object.entries(task.metadata).filter(([key]) => !isSecretLikeKey(key))));
|
|
523
|
+
}
|
|
524
|
+
function mergeLedgerMetadata(...inputs) {
|
|
525
|
+
const merged = Object.assign({}, ...inputs.filter(Boolean));
|
|
526
|
+
return cleanMetadata(merged);
|
|
527
|
+
}
|
|
528
|
+
function isSecretLikeKey(key) {
|
|
529
|
+
const normalized = key.toLowerCase().replace(/[-_]/gu, "");
|
|
530
|
+
return (normalized === "authorization" ||
|
|
531
|
+
normalized === "token" ||
|
|
532
|
+
normalized.endsWith("token") ||
|
|
533
|
+
normalized === "secret" ||
|
|
534
|
+
normalized.endsWith("secret") ||
|
|
535
|
+
normalized === "password" ||
|
|
536
|
+
normalized.endsWith("password") ||
|
|
537
|
+
normalized === "apikey" ||
|
|
538
|
+
normalized.endsWith("apikey") ||
|
|
539
|
+
normalized === "credentials" ||
|
|
540
|
+
normalized.endsWith("credentials") ||
|
|
541
|
+
normalized === "bearer");
|
|
542
|
+
}
|
|
519
543
|
function stringValue(input) {
|
|
520
544
|
return typeof input === "string" ? trimString(input) : undefined;
|
|
521
545
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-task-ledger.js","sourceRoot":"","sources":["../../src/platform/a2a-task-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAEN,2BAA2B,EAC3B,6BAA6B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2EtD,MAAM,mBAAmB,GAAG,iDAAiD,CAAC;AAC9E,MAAM,6BAA6B,GAAG,iCAAiC,CAAC;AACxE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,sBAAsB,GAAG,oBAAoB,GAAG,oBAAoB,CAAC;AAC3E,MAAM,sBAAsB,GAAG,OAAO,CAAC;AACvC,MAAM,0BAA0B,GAAG,WAAW,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,IAAa;IACjD,MAAM,UAAU,GACf,UAAU,CAAC,IAAI,CAAC;QAChB,WAAW,CAAC,CAAC,wBAAwB,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACjE,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,UAAgC,EAAE;IAElC,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,wBAAwB,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO;QACN,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAChC,oBAAoB,CAAC,IAAI,EAAE,SAAS,KAAK,GAAG,CAAC,CAC7C;KACD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,MAAyB,EACzB,UAAgC,EAAE;IAElC,OAAO,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,CAC1C,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CACnC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAChC,MAAyB,EACzB,UAAgC,EAAE;IAElC,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC;IAC9D,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACjE,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC;IACb,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,KAAK,UAAU,qBAAqB,CACnC,OAA6B,EAC7B,EAAoB;IAEpB,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;IACnD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC;IACrD,SAAS,CAAC;QACT,IAAI,CAAC;YACJ,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,MAAM,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAC;YACb,CAAC;YACD,IAAI,MAAM,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,SAAS;YACV,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IACD,MAAM,aAAa,GAAG,wBAAwB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC;QACJ,OAAO,MAAM,EAAE,EAAE,CAAC;IACnB,CAAC;YAAS,CAAC;QACV,aAAa,EAAE,CAAC;QAChB,IAAI,MAAM,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAClD,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,uBAAuB,CACrC,QAAgB,EAChB,SAAiB;IAEjB,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EAAE,GAAG,SAAS,IAAI,EAAE;YACzE,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QACH,MAAM,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB,CAChC,QAAgB,EAChB,SAAiB;IAEjB,MAAM,QAAQ,GAAmC,WAAW,CAAC,GAAG,EAAE;QACjE,KAAK,0BAA0B,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC7B,IACC,OAAO,QAAQ,KAAK,QAAQ;QAC5B,OAAO,IAAI,QAAQ;QACnB,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU,EACnC,CAAC;QACF,QAAQ,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,QAAgB,EAChB,SAAiB;IAEjB,IAAI,CAAC;QACJ,IAAI,MAAM,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAClD,MAAM,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,iEAAiE;IAClE,CAAC;AACF,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,SAAS,CACd,IAAI,CAAC,QAAQ,EAAE,0BAA0B,CAAC,EAC1C,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EACjB,EAAE,IAAI,EAAE,KAAK,EAAE,CACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,SAAiB;IAEjB,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,QAAQ,CAC3B,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EACtC,MAAM,CACN,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;AACF,CAAC;AAED,KAAK,UAAU,uBAAuB,CACrC,QAAgB;IAEhB,KAAK,MAAM,IAAI,IAAI;QAClB,IAAI,CAAC,QAAQ,EAAE,0BAA0B,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC;QACtC,QAAQ;KACR,EAAE,CAAC;QACH,IAAI,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAC;YACb,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,QAAQ,iBAAiB,CAAC,EAAE;QACxE,IAAI,EAAE,QAAQ;KACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,KAA8B;IAE9B,OAAO,qBAAqB,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5E,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAC/D,CAAC;QACF,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAuB;YACjC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,EAAE,EACD,aAAa,IAAI,CAAC;gBACjB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAE,CAAC,EAAE;gBACjC,CAAC,CAAC,oBAAoB,UAAU,EAAE,EAAE;YACtC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,YAAY;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,eAAe;gBACxB,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACN,MAAM;YACN,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;gBACtD,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE;gBACpE,CAAC,CAAC,EAAE,CAAC;YACN,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;gBAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACN,IAAI,EAAE,QAAQ;YACd,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAC9B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,UAAU,EAAE;gBACX;oBACC,EAAE,EAAE,GAAG;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;oBACd,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;wBAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;wBAC5C,CAAC,CAAC,EAAE,CAAC;iBACN;aACD;YACD,SAAS,EACR,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG;YAClE,SAAS,EAAE,GAAG;SACd,CAAC;QACF,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,YAAY,EAAE,CAAC;YAClB,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;YACvC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;gBACrB,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;gBAC9B,SAAS,EAAE,YAAY,CAAC,SAAS;aACjC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;QACzB,CAAC;aAAM,CAAC;YACP,OAAO,KAAK,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,KAA8B;IAE9B,OAAO,qBAAqB,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5E,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAC/D,CAAC;QACF,MAAM,QAAQ,GACb,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,QAAQ,GAAG,aAAa,CAAC;YAC9B,GAAG,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;YAC7B,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,MAAM,SAAS,GACd,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,SAAS,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,YAAY,EAAE,IAAI,IAAI,QAAQ,EAAE,YAAY,CAAC;QAClE,MAAM,KAAK,GAAuB;YACjC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnB,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,oBAAoB,UAAU,EAAE,EAAE;YACtD,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,SAAS;YACjC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,IAAI,QAAQ,EAAE,eAAe,CAAC;gBACvD,CAAC,CAAC;oBACA,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,QAAQ,EAAE,eAAe;iBACnE;gBACF,CAAC,CAAC,EAAE,CAAC;YACN,MAAM;YACN,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS,CAAC;gBAC1D,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACxE,CAAC,CAAC,EAAE,CAAC;YACN,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ;YAChC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAC9B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,UAAU,EAAE;gBACX,GAAG,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;gBAC/B;oBACC,EAAE,EAAE,GAAG;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC1B;aACD;YACD,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;YACd,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;QACF,IAAI,YAAY,IAAI,2BAA2B,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YACtE,KAAK,CAAC,UAAU,GAAG;gBAClB,GAAG,KAAK,CAAC,UAAU;gBACnB;oBACC,EAAE,EAAE,GAAG;oBACP,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;oBAC9B,SAAS,EAAE,YAAY,CAAC,SAAS;iBACjC;aACD,CAAC;QACH,CAAC;QACD,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,WAAW,GAAG,QAAQ,EAAE,WAAW,IAAI,GAAG,CAAC;QAClD,CAAC;aAAM,CAAC;YACP,OAAO,KAAK,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,KAAyB;IAEzB,OAAO,qBAAqB,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CACnC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAC/D,CAAC;QACF,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC;QACtC,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,YAAY,EAAE,IAAI,IAAI,QAAQ,CAAC,YAAY,CAAC;QACjE,MAAM,SAAS,GACd,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC;QAC/D,MAAM,KAAK,GAAuB;YACjC,GAAG,QAAQ;YACX,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAC9B,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBACnC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBACjD,CAAC,CAAC,EAAE,CAAC;YACN,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,SAAS,EAAE,GAAG;YACd,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3C,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,GAAG,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;SACN,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,IAAI,YAAY,IAAI,2BAA2B,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YACtE,KAAK,CAAC,UAAU,GAAG;gBAClB,GAAG,KAAK,CAAC,UAAU;gBACnB;oBACC,EAAE,EAAE,GAAG;oBACP,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;oBAC9B,SAAS,EAAE,YAAY,CAAC,SAAS;iBACjC;aACD,CAAC;QACH,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAC5B,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,MAAyB,EACzB,UAA6B,EAAE;IAE/B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,KAAK;SACjB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;SAC/C,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,MAAyB,EACzB,IAAY;IAEZ,OAAO,kBAAkB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC/C,OAAO,sBAAsB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,sBAAsB,CAC9B,IAAa;IAEb,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO;YACN,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS;SACzC,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS;QAClC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IACzD,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO;YACN,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,kBAAkB,EAAE,SAAS;SACxC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,2BAA2B,CACnC,KAAyB,EACzB,QAA6B;IAE7B,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAC5B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,CACxE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC/C,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACrD,OAAO,6BAA6B,CAAC,IAAI,CACxC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAC5C,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA+B;IACxD,OAAO,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,cAAc,CAAC,OAAmB;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,OAAO,CAAC;AAClD,CAAC;AAED,SAAS,2BAA2B,CACnC,OAAiC;IAEjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,SAAS;QACV,CAAC;QACD,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC;QAChB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAC5B,KAAc,EACd,IAAY;IAEZ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QACjD,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrC,wBAAwB,CAAC,IAAI,EAAE,GAAG,IAAI,eAAe,KAAK,GAAG,CAAC,CAC9D;QACF,CAAC,CAAC,EAAE,CAAC;IACN,MAAM,KAAK,GAAuB;QACjC,EAAE;QACF,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;QACzD,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,KAAK;QACL,UAAU;QACV,SAAS;QACT,SAAS;KACT,CAAC;IACF,KAAK,MAAM,GAAG,IAAI;QACjB,iBAAiB;QACjB,WAAW;QACX,WAAW;QACX,MAAM;QACN,KAAK;QACL,cAAc;QACd,aAAa;KACJ,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACF,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,SAAS,GAAG,6BAA6B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,SAAS,EAAE,CAAC;QACf,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAChC,KAAc,EACd,IAAY;IAEZ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,MAAM,KAAK,GAA2B;QACrC,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC;QAC1C,IAAI;QACJ,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC;KAChD,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAU,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CACrB,KAA0C;IAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAgD,EAAE,CACvD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAC9B,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,cAAc,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC/B,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC;AACT,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAY;IAChD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AAC/C,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC5B,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { A2AMessage, A2ATask } from \"./a2a-client.js\";\nimport {\n\ttype A2AWorkGraphMetadata,\n\textractA2AWorkGraphMetadata,\n\tnormalizeA2AWorkGraphMetadata,\n} from \"./a2a-work-graph.js\";\nimport { getEnvValue, trimString } from \"./client.js\";\n\nexport type A2ATaskKind = \"delegation\" | \"message\";\nexport type A2ATranscriptRole = \"user\" | \"agent\";\n\nexport interface A2ATaskTranscriptEntry {\n\tat: string;\n\trole: A2ATranscriptRole;\n\ttext: string;\n\tstate?: string;\n\tmessageId?: string;\n}\n\nexport interface A2ATaskLedgerEntry {\n\tid: string;\n\tkind: A2ATaskKind;\n\tpeer: string;\n\tpeerDisplayName?: string;\n\ttaskId: string;\n\tcontextId?: string;\n\tmessageId?: string;\n\ttext: string;\n\trole?: string;\n\tcwd?: string;\n\tstate: string;\n\tresponseText?: string;\n\tmetadata?: Record<string, string | number | boolean>;\n\tworkGraph?: A2AWorkGraphMetadata;\n\ttranscript: A2ATaskTranscriptEntry[];\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tcompletedAt?: string;\n}\n\nexport interface A2ATaskLedgerFile {\n\ttasks: A2ATaskLedgerEntry[];\n}\n\nexport interface A2ATaskLedgerOptions {\n\tpath?: string;\n\tnow?: Date;\n}\n\nexport interface RecordA2ATaskStartInput extends A2ATaskLedgerOptions {\n\tpeer: string;\n\tpeerDisplayName?: string;\n\ttask: A2ATask;\n\ttext: string;\n\tmessageId?: string;\n\tcontextId?: string;\n\tkind?: A2ATaskKind;\n\trole?: string;\n\tcwd?: string;\n\tmetadata?: Record<string, string | number | boolean | undefined>;\n}\n\nexport interface UpdateA2ATaskInput extends A2ATaskLedgerOptions {\n\tpeer: string;\n\ttask: A2ATask;\n}\n\nexport interface RecordA2ATaskReplyInput extends A2ATaskLedgerOptions {\n\tpeer: string;\n\tpeerDisplayName?: string;\n\ttask: A2ATask;\n\ttext: string;\n\tmessageId: string;\n\tmetadata?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface A2ATaskResponseText {\n\ttext: string;\n\tmessageId?: string;\n}\n\nconst FINAL_STATE_PATTERN = /(COMPLETED|FAILED|CANCELED|CANCELLED|REJECTED)/u;\nconst ACTION_REQUIRED_STATE_PATTERN = /(INPUT_REQUIRED|AUTH_REQUIRED)/u;\nconst LEDGER_LOCK_RETRY_MS = 25;\nconst LEDGER_LOCK_HEARTBEAT_MS = 10_000;\nconst LEDGER_LOCK_STALE_MS = 30_000;\nconst LEDGER_LOCK_TIMEOUT_MS = LEDGER_LOCK_STALE_MS + LEDGER_LOCK_RETRY_MS;\nconst LEDGER_LOCK_OWNER_FILE = \"owner\";\nconst LEDGER_LOCK_HEARTBEAT_FILE = \"heartbeat\";\n\nexport function getA2ATaskLedgerPath(path?: string): string {\n\tconst configured =\n\t\ttrimString(path) ??\n\t\tgetEnvValue([\"MAESTRO_A2A_TASKS_FILE\", \"CODEX_A2A_TASKS_FILE\"]);\n\tif (configured) {\n\t\treturn expandHome(configured);\n\t}\n\treturn join(homedir(), \".maestro\", \"a2a\", \"tasks.json\");\n}\n\nexport async function loadA2ATaskLedger(\n\toptions: A2ATaskLedgerOptions = {},\n): Promise<A2ATaskLedgerFile> {\n\tconst path = getA2ATaskLedgerPath(options.path);\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif (hasNodeCode(error, \"ENOENT\")) {\n\t\t\treturn { tasks: [] };\n\t\t}\n\t\tthrow error;\n\t}\n\tconst parsed = JSON.parse(raw) as unknown;\n\tif (!isRecord(parsed)) {\n\t\tthrow new Error(`A2A task ledger at ${path} must be a JSON object`);\n\t}\n\tconst tasks = Array.isArray(parsed.tasks) ? parsed.tasks : [];\n\treturn {\n\t\ttasks: tasks.map((task, index) =>\n\t\t\tnormalizeLedgerEntry(task, `tasks[${index}]`),\n\t\t),\n\t};\n}\n\nexport async function saveA2ATaskLedger(\n\tledger: A2ATaskLedgerFile,\n\toptions: A2ATaskLedgerOptions = {},\n): Promise<string> {\n\treturn withA2ATaskLedgerLock(options, () =>\n\t\twriteA2ATaskLedger(ledger, options),\n\t);\n}\n\nasync function writeA2ATaskLedger(\n\tledger: A2ATaskLedgerFile,\n\toptions: A2ATaskLedgerOptions = {},\n): Promise<string> {\n\tconst path = getA2ATaskLedgerPath(options.path);\n\tconst tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n\tawait mkdir(dirname(path), { recursive: true, mode: 0o700 });\n\ttry {\n\t\tawait writeFile(tempPath, `${JSON.stringify(ledger, null, 2)}\\n`, {\n\t\t\tmode: 0o600,\n\t\t});\n\t\tawait rename(tempPath, path);\n\t} catch (error) {\n\t\tawait rm(tempPath, { force: true }).catch(() => undefined);\n\t\tthrow error;\n\t}\n\treturn path;\n}\n\nasync function withA2ATaskLedgerLock<T>(\n\toptions: A2ATaskLedgerOptions,\n\tfn: () => Promise<T>,\n): Promise<T> {\n\tconst path = getA2ATaskLedgerPath(options.path);\n\tconst lockPath = `${path}.lock`;\n\tconst lockToken = `${process.pid}:${randomUUID()}`;\n\tawait mkdir(dirname(path), { recursive: true, mode: 0o700 });\n\tconst deadline = Date.now() + LEDGER_LOCK_TIMEOUT_MS;\n\tfor (;;) {\n\t\ttry {\n\t\t\tawait mkdir(lockPath, { mode: 0o700 });\n\t\t\tawait writeLedgerLockMetadata(lockPath, lockToken);\n\t\t\tbreak;\n\t\t} catch (error) {\n\t\t\tif (!hasNodeCode(error, \"EEXIST\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (await isStaleLedgerLock(lockPath)) {\n\t\t\t\tawait rm(lockPath, { force: true, recursive: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tawait sleep(LEDGER_LOCK_RETRY_MS);\n\t\t}\n\t}\n\tconst stopHeartbeat = startLedgerLockHeartbeat(lockPath, lockToken);\n\ttry {\n\t\treturn await fn();\n\t} finally {\n\t\tstopHeartbeat();\n\t\tif (await isOwnedLedgerLock(lockPath, lockToken)) {\n\t\t\tawait rm(lockPath, { force: true, recursive: true });\n\t\t}\n\t}\n}\n\nasync function writeLedgerLockMetadata(\n\tlockPath: string,\n\tlockToken: string,\n): Promise<void> {\n\ttry {\n\t\tawait writeFile(join(lockPath, LEDGER_LOCK_OWNER_FILE), `${lockToken}\\n`, {\n\t\t\tmode: 0o600,\n\t\t});\n\t\tawait writeLedgerLockHeartbeat(lockPath);\n\t} catch (error) {\n\t\tawait rm(lockPath, { force: true, recursive: true }).catch(() => undefined);\n\t\tthrow error;\n\t}\n}\n\nfunction startLedgerLockHeartbeat(\n\tlockPath: string,\n\tlockToken: string,\n): () => void {\n\tconst interval: ReturnType<typeof setInterval> = setInterval(() => {\n\t\tvoid refreshLedgerLockHeartbeat(lockPath, lockToken);\n\t}, LEDGER_LOCK_HEARTBEAT_MS);\n\tif (\n\t\ttypeof interval === \"object\" &&\n\t\t\"unref\" in interval &&\n\t\ttypeof interval.unref === \"function\"\n\t) {\n\t\tinterval.unref();\n\t}\n\treturn () => clearInterval(interval);\n}\n\nasync function refreshLedgerLockHeartbeat(\n\tlockPath: string,\n\tlockToken: string,\n): Promise<void> {\n\ttry {\n\t\tif (await isOwnedLedgerLock(lockPath, lockToken)) {\n\t\t\tawait writeLedgerLockHeartbeat(lockPath);\n\t\t}\n\t} catch {\n\t\t// Best-effort only; ownership is re-checked before lock cleanup.\n\t}\n}\n\nasync function writeLedgerLockHeartbeat(lockPath: string): Promise<void> {\n\tawait writeFile(\n\t\tjoin(lockPath, LEDGER_LOCK_HEARTBEAT_FILE),\n\t\t`${Date.now()}\\n`,\n\t\t{ mode: 0o600 },\n\t);\n}\n\nasync function isOwnedLedgerLock(\n\tlockPath: string,\n\tlockToken: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst owner = await readFile(\n\t\t\tjoin(lockPath, LEDGER_LOCK_OWNER_FILE),\n\t\t\t\"utf8\",\n\t\t);\n\t\treturn owner.trim() === lockToken;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function isStaleLedgerLock(lockPath: string): Promise<boolean> {\n\ttry {\n\t\tconst lock = await statLedgerLockHeartbeat(lockPath);\n\t\treturn Date.now() - lock.mtimeMs > LEDGER_LOCK_STALE_MS;\n\t} catch (error) {\n\t\treturn hasNodeCode(error, \"ENOENT\");\n\t}\n}\n\nasync function statLedgerLockHeartbeat(\n\tlockPath: string,\n): Promise<{ mtimeMs: number }> {\n\tfor (const path of [\n\t\tjoin(lockPath, LEDGER_LOCK_HEARTBEAT_FILE),\n\t\tjoin(lockPath, LEDGER_LOCK_OWNER_FILE),\n\t\tlockPath,\n\t]) {\n\t\ttry {\n\t\t\treturn await stat(path);\n\t\t} catch (error) {\n\t\t\tif (!hasNodeCode(error, \"ENOENT\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tthrow Object.assign(new Error(`Ledger lock ${lockPath} does not exist`), {\n\t\tcode: \"ENOENT\",\n\t});\n}\n\nexport async function recordA2ATaskStart(\n\tinput: RecordA2ATaskStartInput,\n): Promise<{ entry: A2ATaskLedgerEntry; path: string }> {\n\treturn withA2ATaskLedgerLock(input, async () => {\n\t\tconst ledger = await loadA2ATaskLedger(input);\n\t\tconst now = (input.now ?? new Date()).toISOString();\n\t\tconst taskId = trimString(input.task.id) ?? fail(\"A2A task id is required\");\n\t\tconst existingIndex = ledger.tasks.findIndex(\n\t\t\t(entry) => entry.peer === input.peer && entry.taskId === taskId,\n\t\t);\n\t\tconst metadata = cleanMetadata(input.metadata);\n\t\tconst workGraph = extractA2AWorkGraphMetadata(input.task);\n\t\tconst userText = input.text.trim();\n\t\tconst entry: A2ATaskLedgerEntry = {\n\t\t\t...(existingIndex >= 0 ? ledger.tasks[existingIndex] : {}),\n\t\t\tid:\n\t\t\t\texistingIndex >= 0\n\t\t\t\t\t? ledger.tasks[existingIndex]!.id\n\t\t\t\t\t: `maestro-a2a-task-${randomUUID()}`,\n\t\t\tkind: input.kind ?? \"delegation\",\n\t\t\tpeer: input.peer,\n\t\t\t...(input.peerDisplayName\n\t\t\t\t? { peerDisplayName: input.peerDisplayName }\n\t\t\t\t: {}),\n\t\t\ttaskId,\n\t\t\t...(trimString(input.task.contextId ?? input.contextId)\n\t\t\t\t? { contextId: trimString(input.task.contextId ?? input.contextId) }\n\t\t\t\t: {}),\n\t\t\t...(trimString(input.messageId)\n\t\t\t\t? { messageId: trimString(input.messageId) }\n\t\t\t\t: {}),\n\t\t\ttext: userText,\n\t\t\t...(trimString(input.role) ? { role: trimString(input.role) } : {}),\n\t\t\t...(trimString(input.cwd) ? { cwd: trimString(input.cwd) } : {}),\n\t\t\tstate: input.task.status.state,\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t\t...(workGraph ? { workGraph } : {}),\n\t\t\ttranscript: [\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\ttext: userText,\n\t\t\t\t\t...(trimString(input.messageId)\n\t\t\t\t\t\t? { messageId: trimString(input.messageId) }\n\t\t\t\t\t\t: {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tcreatedAt:\n\t\t\t\texistingIndex >= 0 ? ledger.tasks[existingIndex]!.createdAt : now,\n\t\t\tupdatedAt: now,\n\t\t};\n\t\tconst taskResponse = extractA2ATaskResponse(input.task);\n\t\tif (taskResponse) {\n\t\t\tentry.responseText = taskResponse.text;\n\t\t\tentry.transcript.push({\n\t\t\t\tat: now,\n\t\t\t\trole: \"agent\",\n\t\t\t\ttext: taskResponse.text,\n\t\t\t\tstate: input.task.status.state,\n\t\t\t\tmessageId: taskResponse.messageId,\n\t\t\t});\n\t\t}\n\t\tif (isFinalA2AState(entry.state)) {\n\t\t\tentry.completedAt = now;\n\t\t} else {\n\t\t\tdelete entry.completedAt;\n\t\t}\n\t\tif (existingIndex >= 0) {\n\t\t\tledger.tasks[existingIndex] = entry;\n\t\t} else {\n\t\t\tledger.tasks.push(entry);\n\t\t}\n\t\tconst path = await writeA2ATaskLedger(ledger, input);\n\t\treturn { entry, path };\n\t});\n}\n\nexport async function recordA2ATaskReply(\n\tinput: RecordA2ATaskReplyInput,\n): Promise<{ entry: A2ATaskLedgerEntry; path: string }> {\n\treturn withA2ATaskLedgerLock(input, async () => {\n\t\tconst ledger = await loadA2ATaskLedger(input);\n\t\tconst now = (input.now ?? new Date()).toISOString();\n\t\tconst taskId = trimString(input.task.id) ?? fail(\"A2A task id is required\");\n\t\tconst existingIndex = ledger.tasks.findIndex(\n\t\t\t(entry) => entry.peer === input.peer && entry.taskId === taskId,\n\t\t);\n\t\tconst previous =\n\t\t\texistingIndex >= 0 ? ledger.tasks[existingIndex] : undefined;\n\t\tconst metadata = cleanMetadata({\n\t\t\t...(previous?.metadata ?? {}),\n\t\t\t...(input.metadata ?? {}),\n\t\t});\n\t\tconst workGraph =\n\t\t\textractA2AWorkGraphMetadata(input.task) ?? previous?.workGraph;\n\t\tconst userText = input.text.trim();\n\t\tconst taskResponse = extractA2ATaskResponse(input.task);\n\t\tconst responseText = taskResponse?.text ?? previous?.responseText;\n\t\tconst entry: A2ATaskLedgerEntry = {\n\t\t\t...(previous ?? {}),\n\t\t\tid: previous?.id ?? `maestro-a2a-task-${randomUUID()}`,\n\t\t\tkind: previous?.kind ?? \"message\",\n\t\t\tpeer: input.peer,\n\t\t\t...((input.peerDisplayName ?? previous?.peerDisplayName)\n\t\t\t\t? {\n\t\t\t\t\t\tpeerDisplayName: input.peerDisplayName ?? previous?.peerDisplayName,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\ttaskId,\n\t\t\t...(trimString(input.task.contextId ?? previous?.contextId)\n\t\t\t\t? { contextId: trimString(input.task.contextId ?? previous?.contextId) }\n\t\t\t\t: {}),\n\t\t\tmessageId: input.messageId,\n\t\t\ttext: previous?.text ?? userText,\n\t\t\t...(previous?.role ? { role: previous.role } : {}),\n\t\t\t...(previous?.cwd ? { cwd: previous.cwd } : {}),\n\t\t\tstate: input.task.status.state,\n\t\t\t...(responseText ? { responseText } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t\t...(workGraph ? { workGraph } : {}),\n\t\t\ttranscript: [\n\t\t\t\t...(previous?.transcript ?? []),\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\ttext: userText,\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcreatedAt: previous?.createdAt ?? now,\n\t\t\tupdatedAt: now,\n\t\t\t...(previous?.completedAt ? { completedAt: previous.completedAt } : {}),\n\t\t};\n\t\tif (taskResponse && shouldAppendAgentTranscript(entry, taskResponse)) {\n\t\t\tentry.transcript = [\n\t\t\t\t...entry.transcript,\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"agent\",\n\t\t\t\t\ttext: taskResponse.text,\n\t\t\t\t\tstate: input.task.status.state,\n\t\t\t\t\tmessageId: taskResponse.messageId,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\tif (isFinalA2AState(input.task.status.state)) {\n\t\t\tentry.completedAt = previous?.completedAt ?? now;\n\t\t} else {\n\t\t\tdelete entry.completedAt;\n\t\t}\n\t\tif (existingIndex >= 0) {\n\t\t\tledger.tasks[existingIndex] = entry;\n\t\t} else {\n\t\t\tledger.tasks.push(entry);\n\t\t}\n\t\tconst path = await writeA2ATaskLedger(ledger, input);\n\t\treturn { entry, path };\n\t});\n}\n\nexport async function updateA2ATaskInLedger(\n\tinput: UpdateA2ATaskInput,\n): Promise<{ entry: A2ATaskLedgerEntry | null; path: string }> {\n\treturn withA2ATaskLedgerLock(input, async () => {\n\t\tconst ledger = await loadA2ATaskLedger(input);\n\t\tconst taskId = trimString(input.task.id) ?? fail(\"A2A task id is required\");\n\t\tconst index = ledger.tasks.findIndex(\n\t\t\t(entry) => entry.peer === input.peer && entry.taskId === taskId,\n\t\t);\n\t\tconst path = getA2ATaskLedgerPath(input.path);\n\t\tif (index < 0) {\n\t\t\treturn { entry: null, path };\n\t\t}\n\t\tconst now = (input.now ?? new Date()).toISOString();\n\t\tconst previous = ledger.tasks[index]!;\n\t\tconst taskResponse = extractA2ATaskResponse(input.task);\n\t\tconst responseText = taskResponse?.text ?? previous.responseText;\n\t\tconst workGraph =\n\t\t\textractA2AWorkGraphMetadata(input.task) ?? previous.workGraph;\n\t\tconst entry: A2ATaskLedgerEntry = {\n\t\t\t...previous,\n\t\t\tstate: input.task.status.state,\n\t\t\t...(trimString(input.task.contextId)\n\t\t\t\t? { contextId: trimString(input.task.contextId) }\n\t\t\t\t: {}),\n\t\t\t...(responseText ? { responseText } : {}),\n\t\t\t...(workGraph ? { workGraph } : {}),\n\t\t\tupdatedAt: now,\n\t\t\t...(isFinalA2AState(input.task.status.state)\n\t\t\t\t? { completedAt: previous.completedAt ?? now }\n\t\t\t\t: {}),\n\t\t};\n\t\tif (!isFinalA2AState(input.task.status.state)) {\n\t\t\tdelete entry.completedAt;\n\t\t}\n\t\tif (taskResponse && shouldAppendAgentTranscript(entry, taskResponse)) {\n\t\t\tentry.transcript = [\n\t\t\t\t...entry.transcript,\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"agent\",\n\t\t\t\t\ttext: taskResponse.text,\n\t\t\t\t\tstate: input.task.status.state,\n\t\t\t\t\tmessageId: taskResponse.messageId,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\tledger.tasks[index] = entry;\n\t\tawait writeA2ATaskLedger(ledger, input);\n\t\treturn { entry, path };\n\t});\n}\n\nexport function listA2ATaskEntries(\n\tledger: A2ATaskLedgerFile,\n\toptions: { peer?: string } = {},\n): A2ATaskLedgerEntry[] {\n\tconst peer = trimString(options.peer);\n\treturn ledger.tasks\n\t\t.filter((entry) => !peer || entry.peer === peer)\n\t\t.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));\n}\n\nexport function latestA2ATaskForPeer(\n\tledger: A2ATaskLedgerFile,\n\tpeer: string,\n): A2ATaskLedgerEntry | undefined {\n\treturn listA2ATaskEntries(ledger, { peer })[0];\n}\n\nexport function extractA2ATaskText(task: A2ATask): string | undefined {\n\treturn extractA2ATaskResponse(task)?.text;\n}\n\nfunction extractA2ATaskResponse(\n\ttask: A2ATask,\n): A2ATaskResponseText | undefined {\n\tconst statusText = firstMessageText(task.status.message);\n\tif (statusText) {\n\t\treturn {\n\t\t\ttext: statusText,\n\t\t\tmessageId: task.status.message?.messageId,\n\t\t};\n\t}\n\tconst artifactText = task.artifacts\n\t\t?.flatMap((artifact) => artifact.parts)\n\t\t.map((part) => trimString(part.text))\n\t\t.find((text): text is string => Boolean(text));\n\tif (artifactText) {\n\t\treturn { text: artifactText };\n\t}\n\tconst latestAgentMessage = latestAgentMessageInHistory(task.history);\n\tconst historyText = firstMessageText(latestAgentMessage);\n\tif (historyText) {\n\t\treturn {\n\t\t\ttext: historyText,\n\t\t\tmessageId: latestAgentMessage?.messageId,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction shouldAppendAgentTranscript(\n\tentry: A2ATaskLedgerEntry,\n\tresponse: A2ATaskResponseText,\n): boolean {\n\tif (response.messageId) {\n\t\treturn !entry.transcript.some(\n\t\t\t(item) => item.role === \"agent\" && item.messageId === response.messageId,\n\t\t);\n\t}\n\tconst last = entry.transcript.at(-1);\n\treturn !last || last.role !== \"agent\" || last.text !== response.text;\n}\n\nexport function isTerminalA2AState(state: string): boolean {\n\treturn isFinalA2AState(state) || isActionRequiredA2AState(state);\n}\n\nexport function isFinalA2AState(state: string): boolean {\n\treturn FINAL_STATE_PATTERN.test(state.toUpperCase().replace(/[\\s-]+/gu, \"_\"));\n}\n\nexport function isActionRequiredA2AState(state: string): boolean {\n\treturn ACTION_REQUIRED_STATE_PATTERN.test(\n\t\tstate.toUpperCase().replace(/[\\s-]+/gu, \"_\"),\n\t);\n}\n\nfunction firstMessageText(message: A2AMessage | undefined): string | undefined {\n\treturn message?.parts.map((part) => trimString(part.text)).find(Boolean);\n}\n\nfunction isAgentMessage(message: A2AMessage): boolean {\n\tconst role = message.role.toUpperCase();\n\treturn role === \"ROLE_AGENT\" || role === \"AGENT\";\n}\n\nfunction latestAgentMessageInHistory(\n\thistory: A2AMessage[] | undefined,\n): A2AMessage | undefined {\n\tif (!history) {\n\t\treturn undefined;\n\t}\n\tfor (const message of [...history].reverse()) {\n\t\tif (!isAgentMessage(message)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (firstMessageText(message)) {\n\t\t\treturn message;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction normalizeLedgerEntry(\n\tinput: unknown,\n\tpath: string,\n): A2ATaskLedgerEntry {\n\tif (!isRecord(input)) {\n\t\tthrow new Error(`A2A task ledger ${path} must be a JSON object`);\n\t}\n\tconst id = requiredString(input.id, `${path}.id`);\n\tconst peer = requiredString(input.peer, `${path}.peer`);\n\tconst taskId = requiredString(input.taskId, `${path}.taskId`);\n\tconst text = requiredString(input.text, `${path}.text`);\n\tconst state = requiredString(input.state, `${path}.state`);\n\tconst createdAt = requiredString(input.createdAt, `${path}.createdAt`);\n\tconst updatedAt = requiredString(input.updatedAt, `${path}.updatedAt`);\n\tconst transcript = Array.isArray(input.transcript)\n\t\t? input.transcript.map((item, index) =>\n\t\t\t\tnormalizeTranscriptEntry(item, `${path}.transcript[${index}]`),\n\t\t\t)\n\t\t: [];\n\tconst entry: A2ATaskLedgerEntry = {\n\t\tid,\n\t\tkind: input.kind === \"message\" ? \"message\" : \"delegation\",\n\t\tpeer,\n\t\ttaskId,\n\t\ttext,\n\t\tstate,\n\t\ttranscript,\n\t\tcreatedAt,\n\t\tupdatedAt,\n\t};\n\tfor (const key of [\n\t\t\"peerDisplayName\",\n\t\t\"contextId\",\n\t\t\"messageId\",\n\t\t\"role\",\n\t\t\"cwd\",\n\t\t\"responseText\",\n\t\t\"completedAt\",\n\t] as const) {\n\t\tconst value = stringValue(input[key]);\n\t\tif (value) {\n\t\t\tentry[key] = value;\n\t\t}\n\t}\n\tif (isRecord(input.metadata)) {\n\t\tentry.metadata = cleanMetadata(input.metadata);\n\t}\n\tconst workGraph = normalizeA2AWorkGraphMetadata(input.workGraph);\n\tif (workGraph) {\n\t\tentry.workGraph = workGraph;\n\t}\n\treturn entry;\n}\n\nfunction normalizeTranscriptEntry(\n\tinput: unknown,\n\tpath: string,\n): A2ATaskTranscriptEntry {\n\tif (!isRecord(input)) {\n\t\tthrow new Error(`A2A task ledger ${path} must be a JSON object`);\n\t}\n\tconst role = input.role === \"agent\" ? \"agent\" : \"user\";\n\tconst entry: A2ATaskTranscriptEntry = {\n\t\tat: requiredString(input.at, `${path}.at`),\n\t\trole,\n\t\ttext: requiredString(input.text, `${path}.text`),\n\t};\n\tfor (const key of [\"state\", \"messageId\"] as const) {\n\t\tconst value = stringValue(input[key]);\n\t\tif (value) {\n\t\t\tentry[key] = value;\n\t\t}\n\t}\n\treturn entry;\n}\n\nfunction cleanMetadata(\n\tinput: Record<string, unknown> | undefined,\n): Record<string, string | number | boolean> | undefined {\n\tif (!input) {\n\t\treturn undefined;\n\t}\n\tconst entries = Object.entries(input).filter(\n\t\t(entry): entry is [string, string | number | boolean] =>\n\t\t\ttypeof entry[1] === \"string\" ||\n\t\t\ttypeof entry[1] === \"number\" ||\n\t\t\ttypeof entry[1] === \"boolean\",\n\t);\n\treturn entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction stringValue(input: unknown): string | undefined {\n\treturn typeof input === \"string\" ? trimString(input) : undefined;\n}\n\nfunction requiredString(input: unknown, path: string): string {\n\tconst value = stringValue(input);\n\tif (!value) {\n\t\tthrow new Error(`A2A task ledger ${path} is required`);\n\t}\n\treturn value;\n}\n\nfunction expandHome(path: string): string {\n\treturn path === \"~\" || path.startsWith(\"~/\")\n\t\t? join(homedir(), path.slice(2))\n\t\t: path;\n}\n\nfunction hasNodeCode(error: unknown, code: string): boolean {\n\treturn isRecord(error) && error.code === code;\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction fail(message: string): never {\n\tthrow new Error(message);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"a2a-task-ledger.js","sourceRoot":"","sources":["../../src/platform/a2a-task-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { A2AMessage, A2ATask } from \"./a2a-client.js\";\nimport {\n\ttype A2AWorkGraphMetadata,\n\textractA2AWorkGraphMetadata,\n\tnormalizeA2AWorkGraphMetadata,\n} from \"./a2a-work-graph.js\";\nimport { getEnvValue, trimString } from \"./client.js\";\n\nexport type A2ATaskKind = \"delegation\" | \"message\";\nexport type A2ATranscriptRole = \"user\" | \"agent\";\n\nexport interface A2ATaskTranscriptEntry {\n\tat: string;\n\trole: A2ATranscriptRole;\n\ttext: string;\n\tstate?: string;\n\tmessageId?: string;\n}\n\nexport interface A2ATaskLedgerEntry {\n\tid: string;\n\tkind: A2ATaskKind;\n\tpeer: string;\n\tpeerDisplayName?: string;\n\ttaskId: string;\n\tcontextId?: string;\n\tmessageId?: string;\n\ttext: string;\n\trole?: string;\n\tcwd?: string;\n\tstate: string;\n\tresponseText?: string;\n\tmetadata?: Record<string, string | number | boolean>;\n\tworkGraph?: A2AWorkGraphMetadata;\n\ttranscript: A2ATaskTranscriptEntry[];\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tcompletedAt?: string;\n}\n\nexport interface A2ATaskLedgerFile {\n\ttasks: A2ATaskLedgerEntry[];\n}\n\nexport interface A2ATaskLedgerOptions {\n\tpath?: string;\n\tnow?: Date;\n}\n\nexport interface RecordA2ATaskStartInput extends A2ATaskLedgerOptions {\n\tpeer: string;\n\tpeerDisplayName?: string;\n\ttask: A2ATask;\n\ttext: string;\n\tmessageId?: string;\n\tcontextId?: string;\n\tkind?: A2ATaskKind;\n\trole?: string;\n\tcwd?: string;\n\tmetadata?: Record<string, string | number | boolean | undefined>;\n}\n\nexport interface UpdateA2ATaskInput extends A2ATaskLedgerOptions {\n\tpeer: string;\n\ttask: A2ATask;\n}\n\nexport interface RecordA2ATaskReplyInput extends A2ATaskLedgerOptions {\n\tpeer: string;\n\tpeerDisplayName?: string;\n\ttask: A2ATask;\n\ttext: string;\n\tmessageId: string;\n\tmetadata?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface A2ATaskResponseText {\n\ttext: string;\n\tmessageId?: string;\n}\n\nconst FINAL_STATE_PATTERN = /(COMPLETED|FAILED|CANCELED|CANCELLED|REJECTED)/u;\nconst ACTION_REQUIRED_STATE_PATTERN = /(INPUT_REQUIRED|AUTH_REQUIRED)/u;\nconst LEDGER_LOCK_RETRY_MS = 25;\nconst LEDGER_LOCK_HEARTBEAT_MS = 10_000;\nconst LEDGER_LOCK_STALE_MS = 30_000;\nconst LEDGER_LOCK_TIMEOUT_MS = LEDGER_LOCK_STALE_MS + LEDGER_LOCK_RETRY_MS;\nconst LEDGER_LOCK_OWNER_FILE = \"owner\";\nconst LEDGER_LOCK_HEARTBEAT_FILE = \"heartbeat\";\n\nexport function getA2ATaskLedgerPath(path?: string): string {\n\tconst configured =\n\t\ttrimString(path) ??\n\t\tgetEnvValue([\"MAESTRO_A2A_TASKS_FILE\", \"CODEX_A2A_TASKS_FILE\"]);\n\tif (configured) {\n\t\treturn expandHome(configured);\n\t}\n\treturn join(homedir(), \".maestro\", \"a2a\", \"tasks.json\");\n}\n\nexport async function loadA2ATaskLedger(\n\toptions: A2ATaskLedgerOptions = {},\n): Promise<A2ATaskLedgerFile> {\n\tconst path = getA2ATaskLedgerPath(options.path);\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif (hasNodeCode(error, \"ENOENT\")) {\n\t\t\treturn { tasks: [] };\n\t\t}\n\t\tthrow error;\n\t}\n\tconst parsed = JSON.parse(raw) as unknown;\n\tif (!isRecord(parsed)) {\n\t\tthrow new Error(`A2A task ledger at ${path} must be a JSON object`);\n\t}\n\tconst tasks = Array.isArray(parsed.tasks) ? parsed.tasks : [];\n\treturn {\n\t\ttasks: tasks.map((task, index) =>\n\t\t\tnormalizeLedgerEntry(task, `tasks[${index}]`),\n\t\t),\n\t};\n}\n\nexport async function saveA2ATaskLedger(\n\tledger: A2ATaskLedgerFile,\n\toptions: A2ATaskLedgerOptions = {},\n): Promise<string> {\n\treturn withA2ATaskLedgerLock(options, () =>\n\t\twriteA2ATaskLedger(ledger, options),\n\t);\n}\n\nasync function writeA2ATaskLedger(\n\tledger: A2ATaskLedgerFile,\n\toptions: A2ATaskLedgerOptions = {},\n): Promise<string> {\n\tconst path = getA2ATaskLedgerPath(options.path);\n\tconst tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n\tawait mkdir(dirname(path), { recursive: true, mode: 0o700 });\n\ttry {\n\t\tawait writeFile(tempPath, `${JSON.stringify(ledger, null, 2)}\\n`, {\n\t\t\tmode: 0o600,\n\t\t});\n\t\tawait rename(tempPath, path);\n\t} catch (error) {\n\t\tawait rm(tempPath, { force: true }).catch(() => undefined);\n\t\tthrow error;\n\t}\n\treturn path;\n}\n\nasync function withA2ATaskLedgerLock<T>(\n\toptions: A2ATaskLedgerOptions,\n\tfn: () => Promise<T>,\n): Promise<T> {\n\tconst path = getA2ATaskLedgerPath(options.path);\n\tconst lockPath = `${path}.lock`;\n\tconst lockToken = `${process.pid}:${randomUUID()}`;\n\tawait mkdir(dirname(path), { recursive: true, mode: 0o700 });\n\tconst deadline = Date.now() + LEDGER_LOCK_TIMEOUT_MS;\n\tfor (;;) {\n\t\ttry {\n\t\t\tawait mkdir(lockPath, { mode: 0o700 });\n\t\t\tawait writeLedgerLockMetadata(lockPath, lockToken);\n\t\t\tbreak;\n\t\t} catch (error) {\n\t\t\tif (!hasNodeCode(error, \"EEXIST\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (await isStaleLedgerLock(lockPath)) {\n\t\t\t\tawait rm(lockPath, { force: true, recursive: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tawait sleep(LEDGER_LOCK_RETRY_MS);\n\t\t}\n\t}\n\tconst stopHeartbeat = startLedgerLockHeartbeat(lockPath, lockToken);\n\ttry {\n\t\treturn await fn();\n\t} finally {\n\t\tstopHeartbeat();\n\t\tif (await isOwnedLedgerLock(lockPath, lockToken)) {\n\t\t\tawait rm(lockPath, { force: true, recursive: true });\n\t\t}\n\t}\n}\n\nasync function writeLedgerLockMetadata(\n\tlockPath: string,\n\tlockToken: string,\n): Promise<void> {\n\ttry {\n\t\tawait writeFile(join(lockPath, LEDGER_LOCK_OWNER_FILE), `${lockToken}\\n`, {\n\t\t\tmode: 0o600,\n\t\t});\n\t\tawait writeLedgerLockHeartbeat(lockPath);\n\t} catch (error) {\n\t\tawait rm(lockPath, { force: true, recursive: true }).catch(() => undefined);\n\t\tthrow error;\n\t}\n}\n\nfunction startLedgerLockHeartbeat(\n\tlockPath: string,\n\tlockToken: string,\n): () => void {\n\tconst interval: ReturnType<typeof setInterval> = setInterval(() => {\n\t\tvoid refreshLedgerLockHeartbeat(lockPath, lockToken);\n\t}, LEDGER_LOCK_HEARTBEAT_MS);\n\tif (\n\t\ttypeof interval === \"object\" &&\n\t\t\"unref\" in interval &&\n\t\ttypeof interval.unref === \"function\"\n\t) {\n\t\tinterval.unref();\n\t}\n\treturn () => clearInterval(interval);\n}\n\nasync function refreshLedgerLockHeartbeat(\n\tlockPath: string,\n\tlockToken: string,\n): Promise<void> {\n\ttry {\n\t\tif (await isOwnedLedgerLock(lockPath, lockToken)) {\n\t\t\tawait writeLedgerLockHeartbeat(lockPath);\n\t\t}\n\t} catch {\n\t\t// Best-effort only; ownership is re-checked before lock cleanup.\n\t}\n}\n\nasync function writeLedgerLockHeartbeat(lockPath: string): Promise<void> {\n\tawait writeFile(\n\t\tjoin(lockPath, LEDGER_LOCK_HEARTBEAT_FILE),\n\t\t`${Date.now()}\\n`,\n\t\t{ mode: 0o600 },\n\t);\n}\n\nasync function isOwnedLedgerLock(\n\tlockPath: string,\n\tlockToken: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst owner = await readFile(\n\t\t\tjoin(lockPath, LEDGER_LOCK_OWNER_FILE),\n\t\t\t\"utf8\",\n\t\t);\n\t\treturn owner.trim() === lockToken;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function isStaleLedgerLock(lockPath: string): Promise<boolean> {\n\ttry {\n\t\tconst lock = await statLedgerLockHeartbeat(lockPath);\n\t\treturn Date.now() - lock.mtimeMs > LEDGER_LOCK_STALE_MS;\n\t} catch (error) {\n\t\treturn hasNodeCode(error, \"ENOENT\");\n\t}\n}\n\nasync function statLedgerLockHeartbeat(\n\tlockPath: string,\n): Promise<{ mtimeMs: number }> {\n\tfor (const path of [\n\t\tjoin(lockPath, LEDGER_LOCK_HEARTBEAT_FILE),\n\t\tjoin(lockPath, LEDGER_LOCK_OWNER_FILE),\n\t\tlockPath,\n\t]) {\n\t\ttry {\n\t\t\treturn await stat(path);\n\t\t} catch (error) {\n\t\t\tif (!hasNodeCode(error, \"ENOENT\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tthrow Object.assign(new Error(`Ledger lock ${lockPath} does not exist`), {\n\t\tcode: \"ENOENT\",\n\t});\n}\n\nexport async function recordA2ATaskStart(\n\tinput: RecordA2ATaskStartInput,\n): Promise<{ entry: A2ATaskLedgerEntry; path: string }> {\n\treturn withA2ATaskLedgerLock(input, async () => {\n\t\tconst ledger = await loadA2ATaskLedger(input);\n\t\tconst now = (input.now ?? new Date()).toISOString();\n\t\tconst taskId = trimString(input.task.id) ?? fail(\"A2A task id is required\");\n\t\tconst existingIndex = ledger.tasks.findIndex(\n\t\t\t(entry) => entry.peer === input.peer && entry.taskId === taskId,\n\t\t);\n\t\tconst metadata = mergeLedgerMetadata(\n\t\t\textractA2ATaskLedgerMetadata(input.task),\n\t\t\tinput.metadata,\n\t\t);\n\t\tconst workGraph = extractA2AWorkGraphMetadata(input.task);\n\t\tconst userText = input.text.trim();\n\t\tconst entry: A2ATaskLedgerEntry = {\n\t\t\t...(existingIndex >= 0 ? ledger.tasks[existingIndex] : {}),\n\t\t\tid:\n\t\t\t\texistingIndex >= 0\n\t\t\t\t\t? ledger.tasks[existingIndex]!.id\n\t\t\t\t\t: `maestro-a2a-task-${randomUUID()}`,\n\t\t\tkind: input.kind ?? \"delegation\",\n\t\t\tpeer: input.peer,\n\t\t\t...(input.peerDisplayName\n\t\t\t\t? { peerDisplayName: input.peerDisplayName }\n\t\t\t\t: {}),\n\t\t\ttaskId,\n\t\t\t...(trimString(input.task.contextId ?? input.contextId)\n\t\t\t\t? { contextId: trimString(input.task.contextId ?? input.contextId) }\n\t\t\t\t: {}),\n\t\t\t...(trimString(input.messageId)\n\t\t\t\t? { messageId: trimString(input.messageId) }\n\t\t\t\t: {}),\n\t\t\ttext: userText,\n\t\t\t...(trimString(input.role) ? { role: trimString(input.role) } : {}),\n\t\t\t...(trimString(input.cwd) ? { cwd: trimString(input.cwd) } : {}),\n\t\t\tstate: input.task.status.state,\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t\t...(workGraph ? { workGraph } : {}),\n\t\t\ttranscript: [\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\ttext: userText,\n\t\t\t\t\t...(trimString(input.messageId)\n\t\t\t\t\t\t? { messageId: trimString(input.messageId) }\n\t\t\t\t\t\t: {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tcreatedAt:\n\t\t\t\texistingIndex >= 0 ? ledger.tasks[existingIndex]!.createdAt : now,\n\t\t\tupdatedAt: now,\n\t\t};\n\t\tconst taskResponse = extractA2ATaskResponse(input.task);\n\t\tif (taskResponse) {\n\t\t\tentry.responseText = taskResponse.text;\n\t\t\tentry.transcript.push({\n\t\t\t\tat: now,\n\t\t\t\trole: \"agent\",\n\t\t\t\ttext: taskResponse.text,\n\t\t\t\tstate: input.task.status.state,\n\t\t\t\tmessageId: taskResponse.messageId,\n\t\t\t});\n\t\t}\n\t\tif (isFinalA2AState(entry.state)) {\n\t\t\tentry.completedAt = now;\n\t\t} else {\n\t\t\tdelete entry.completedAt;\n\t\t}\n\t\tif (existingIndex >= 0) {\n\t\t\tledger.tasks[existingIndex] = entry;\n\t\t} else {\n\t\t\tledger.tasks.push(entry);\n\t\t}\n\t\tconst path = await writeA2ATaskLedger(ledger, input);\n\t\treturn { entry, path };\n\t});\n}\n\nexport async function recordA2ATaskReply(\n\tinput: RecordA2ATaskReplyInput,\n): Promise<{ entry: A2ATaskLedgerEntry; path: string }> {\n\treturn withA2ATaskLedgerLock(input, async () => {\n\t\tconst ledger = await loadA2ATaskLedger(input);\n\t\tconst now = (input.now ?? new Date()).toISOString();\n\t\tconst taskId = trimString(input.task.id) ?? fail(\"A2A task id is required\");\n\t\tconst existingIndex = ledger.tasks.findIndex(\n\t\t\t(entry) => entry.peer === input.peer && entry.taskId === taskId,\n\t\t);\n\t\tconst previous =\n\t\t\texistingIndex >= 0 ? ledger.tasks[existingIndex] : undefined;\n\t\tconst metadata = mergeLedgerMetadata(\n\t\t\tprevious?.metadata,\n\t\t\textractA2ATaskLedgerMetadata(input.task),\n\t\t\tinput.metadata,\n\t\t);\n\t\tconst workGraph =\n\t\t\textractA2AWorkGraphMetadata(input.task) ?? previous?.workGraph;\n\t\tconst userText = input.text.trim();\n\t\tconst taskResponse = extractA2ATaskResponse(input.task);\n\t\tconst responseText = taskResponse?.text ?? previous?.responseText;\n\t\tconst entry: A2ATaskLedgerEntry = {\n\t\t\t...(previous ?? {}),\n\t\t\tid: previous?.id ?? `maestro-a2a-task-${randomUUID()}`,\n\t\t\tkind: previous?.kind ?? \"message\",\n\t\t\tpeer: input.peer,\n\t\t\t...((input.peerDisplayName ?? previous?.peerDisplayName)\n\t\t\t\t? {\n\t\t\t\t\t\tpeerDisplayName: input.peerDisplayName ?? previous?.peerDisplayName,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\ttaskId,\n\t\t\t...(trimString(input.task.contextId ?? previous?.contextId)\n\t\t\t\t? { contextId: trimString(input.task.contextId ?? previous?.contextId) }\n\t\t\t\t: {}),\n\t\t\tmessageId: input.messageId,\n\t\t\ttext: previous?.text ?? userText,\n\t\t\t...(previous?.role ? { role: previous.role } : {}),\n\t\t\t...(previous?.cwd ? { cwd: previous.cwd } : {}),\n\t\t\tstate: input.task.status.state,\n\t\t\t...(responseText ? { responseText } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t\t...(workGraph ? { workGraph } : {}),\n\t\t\ttranscript: [\n\t\t\t\t...(previous?.transcript ?? []),\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\ttext: userText,\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t},\n\t\t\t],\n\t\t\tcreatedAt: previous?.createdAt ?? now,\n\t\t\tupdatedAt: now,\n\t\t\t...(previous?.completedAt ? { completedAt: previous.completedAt } : {}),\n\t\t};\n\t\tif (taskResponse && shouldAppendAgentTranscript(entry, taskResponse)) {\n\t\t\tentry.transcript = [\n\t\t\t\t...entry.transcript,\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"agent\",\n\t\t\t\t\ttext: taskResponse.text,\n\t\t\t\t\tstate: input.task.status.state,\n\t\t\t\t\tmessageId: taskResponse.messageId,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\tif (isFinalA2AState(input.task.status.state)) {\n\t\t\tentry.completedAt = previous?.completedAt ?? now;\n\t\t} else {\n\t\t\tdelete entry.completedAt;\n\t\t}\n\t\tif (existingIndex >= 0) {\n\t\t\tledger.tasks[existingIndex] = entry;\n\t\t} else {\n\t\t\tledger.tasks.push(entry);\n\t\t}\n\t\tconst path = await writeA2ATaskLedger(ledger, input);\n\t\treturn { entry, path };\n\t});\n}\n\nexport async function updateA2ATaskInLedger(\n\tinput: UpdateA2ATaskInput,\n): Promise<{ entry: A2ATaskLedgerEntry | null; path: string }> {\n\treturn withA2ATaskLedgerLock(input, async () => {\n\t\tconst ledger = await loadA2ATaskLedger(input);\n\t\tconst taskId = trimString(input.task.id) ?? fail(\"A2A task id is required\");\n\t\tconst index = ledger.tasks.findIndex(\n\t\t\t(entry) => entry.peer === input.peer && entry.taskId === taskId,\n\t\t);\n\t\tconst path = getA2ATaskLedgerPath(input.path);\n\t\tif (index < 0) {\n\t\t\treturn { entry: null, path };\n\t\t}\n\t\tconst now = (input.now ?? new Date()).toISOString();\n\t\tconst previous = ledger.tasks[index]!;\n\t\tconst taskResponse = extractA2ATaskResponse(input.task);\n\t\tconst responseText = taskResponse?.text ?? previous.responseText;\n\t\tconst metadata = mergeLedgerMetadata(\n\t\t\tprevious.metadata,\n\t\t\textractA2ATaskLedgerMetadata(input.task),\n\t\t);\n\t\tconst workGraph =\n\t\t\textractA2AWorkGraphMetadata(input.task) ?? previous.workGraph;\n\t\tconst entry: A2ATaskLedgerEntry = {\n\t\t\t...previous,\n\t\t\tstate: input.task.status.state,\n\t\t\t...(trimString(input.task.contextId)\n\t\t\t\t? { contextId: trimString(input.task.contextId) }\n\t\t\t\t: {}),\n\t\t\t...(responseText ? { responseText } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t\t...(workGraph ? { workGraph } : {}),\n\t\t\tupdatedAt: now,\n\t\t\t...(isFinalA2AState(input.task.status.state)\n\t\t\t\t? { completedAt: previous.completedAt ?? now }\n\t\t\t\t: {}),\n\t\t};\n\t\tif (!isFinalA2AState(input.task.status.state)) {\n\t\t\tdelete entry.completedAt;\n\t\t}\n\t\tif (taskResponse && shouldAppendAgentTranscript(entry, taskResponse)) {\n\t\t\tentry.transcript = [\n\t\t\t\t...entry.transcript,\n\t\t\t\t{\n\t\t\t\t\tat: now,\n\t\t\t\t\trole: \"agent\",\n\t\t\t\t\ttext: taskResponse.text,\n\t\t\t\t\tstate: input.task.status.state,\n\t\t\t\t\tmessageId: taskResponse.messageId,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\tledger.tasks[index] = entry;\n\t\tawait writeA2ATaskLedger(ledger, input);\n\t\treturn { entry, path };\n\t});\n}\n\nexport function listA2ATaskEntries(\n\tledger: A2ATaskLedgerFile,\n\toptions: { peer?: string } = {},\n): A2ATaskLedgerEntry[] {\n\tconst peer = trimString(options.peer);\n\treturn ledger.tasks\n\t\t.filter((entry) => !peer || entry.peer === peer)\n\t\t.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));\n}\n\nexport function latestA2ATaskForPeer(\n\tledger: A2ATaskLedgerFile,\n\tpeer: string,\n): A2ATaskLedgerEntry | undefined {\n\treturn listA2ATaskEntries(ledger, { peer })[0];\n}\n\nexport function extractA2ATaskText(task: A2ATask): string | undefined {\n\treturn extractA2ATaskResponse(task)?.text;\n}\n\nfunction extractA2ATaskResponse(\n\ttask: A2ATask,\n): A2ATaskResponseText | undefined {\n\tconst statusText = firstMessageText(task.status.message);\n\tif (statusText) {\n\t\treturn {\n\t\t\ttext: statusText,\n\t\t\tmessageId: task.status.message?.messageId,\n\t\t};\n\t}\n\tconst artifactText = task.artifacts\n\t\t?.flatMap((artifact) => artifact.parts)\n\t\t.map((part) => trimString(part.text))\n\t\t.find((text): text is string => Boolean(text));\n\tif (artifactText) {\n\t\treturn { text: artifactText };\n\t}\n\tconst latestAgentMessage = latestAgentMessageInHistory(task.history);\n\tconst historyText = firstMessageText(latestAgentMessage);\n\tif (historyText) {\n\t\treturn {\n\t\t\ttext: historyText,\n\t\t\tmessageId: latestAgentMessage?.messageId,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction shouldAppendAgentTranscript(\n\tentry: A2ATaskLedgerEntry,\n\tresponse: A2ATaskResponseText,\n): boolean {\n\tif (response.messageId) {\n\t\treturn !entry.transcript.some(\n\t\t\t(item) => item.role === \"agent\" && item.messageId === response.messageId,\n\t\t);\n\t}\n\tconst last = entry.transcript.at(-1);\n\treturn !last || last.role !== \"agent\" || last.text !== response.text;\n}\n\nexport function isTerminalA2AState(state: string): boolean {\n\treturn isFinalA2AState(state) || isActionRequiredA2AState(state);\n}\n\nexport function isFinalA2AState(state: string): boolean {\n\treturn FINAL_STATE_PATTERN.test(state.toUpperCase().replace(/[\\s-]+/gu, \"_\"));\n}\n\nexport function isActionRequiredA2AState(state: string): boolean {\n\treturn ACTION_REQUIRED_STATE_PATTERN.test(\n\t\tstate.toUpperCase().replace(/[\\s-]+/gu, \"_\"),\n\t);\n}\n\nfunction firstMessageText(message: A2AMessage | undefined): string | undefined {\n\treturn message?.parts.map((part) => trimString(part.text)).find(Boolean);\n}\n\nfunction isAgentMessage(message: A2AMessage): boolean {\n\tconst role = message.role.toUpperCase();\n\treturn role === \"ROLE_AGENT\" || role === \"AGENT\";\n}\n\nfunction latestAgentMessageInHistory(\n\thistory: A2AMessage[] | undefined,\n): A2AMessage | undefined {\n\tif (!history) {\n\t\treturn undefined;\n\t}\n\tfor (const message of [...history].reverse()) {\n\t\tif (!isAgentMessage(message)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (firstMessageText(message)) {\n\t\t\treturn message;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction normalizeLedgerEntry(\n\tinput: unknown,\n\tpath: string,\n): A2ATaskLedgerEntry {\n\tif (!isRecord(input)) {\n\t\tthrow new Error(`A2A task ledger ${path} must be a JSON object`);\n\t}\n\tconst id = requiredString(input.id, `${path}.id`);\n\tconst peer = requiredString(input.peer, `${path}.peer`);\n\tconst taskId = requiredString(input.taskId, `${path}.taskId`);\n\tconst text = requiredString(input.text, `${path}.text`);\n\tconst state = requiredString(input.state, `${path}.state`);\n\tconst createdAt = requiredString(input.createdAt, `${path}.createdAt`);\n\tconst updatedAt = requiredString(input.updatedAt, `${path}.updatedAt`);\n\tconst transcript = Array.isArray(input.transcript)\n\t\t? input.transcript.map((item, index) =>\n\t\t\t\tnormalizeTranscriptEntry(item, `${path}.transcript[${index}]`),\n\t\t\t)\n\t\t: [];\n\tconst entry: A2ATaskLedgerEntry = {\n\t\tid,\n\t\tkind: input.kind === \"message\" ? \"message\" : \"delegation\",\n\t\tpeer,\n\t\ttaskId,\n\t\ttext,\n\t\tstate,\n\t\ttranscript,\n\t\tcreatedAt,\n\t\tupdatedAt,\n\t};\n\tfor (const key of [\n\t\t\"peerDisplayName\",\n\t\t\"contextId\",\n\t\t\"messageId\",\n\t\t\"role\",\n\t\t\"cwd\",\n\t\t\"responseText\",\n\t\t\"completedAt\",\n\t] as const) {\n\t\tconst value = stringValue(input[key]);\n\t\tif (value) {\n\t\t\tentry[key] = value;\n\t\t}\n\t}\n\tif (isRecord(input.metadata)) {\n\t\tentry.metadata = cleanMetadata(input.metadata);\n\t}\n\tconst workGraph = normalizeA2AWorkGraphMetadata(input.workGraph);\n\tif (workGraph) {\n\t\tentry.workGraph = workGraph;\n\t}\n\treturn entry;\n}\n\nfunction normalizeTranscriptEntry(\n\tinput: unknown,\n\tpath: string,\n): A2ATaskTranscriptEntry {\n\tif (!isRecord(input)) {\n\t\tthrow new Error(`A2A task ledger ${path} must be a JSON object`);\n\t}\n\tconst role = input.role === \"agent\" ? \"agent\" : \"user\";\n\tconst entry: A2ATaskTranscriptEntry = {\n\t\tat: requiredString(input.at, `${path}.at`),\n\t\trole,\n\t\ttext: requiredString(input.text, `${path}.text`),\n\t};\n\tfor (const key of [\"state\", \"messageId\"] as const) {\n\t\tconst value = stringValue(input[key]);\n\t\tif (value) {\n\t\t\tentry[key] = value;\n\t\t}\n\t}\n\treturn entry;\n}\n\nfunction cleanMetadata(\n\tinput: Record<string, unknown> | undefined,\n): Record<string, string | number | boolean> | undefined {\n\tif (!input) {\n\t\treturn undefined;\n\t}\n\tconst entries = Object.entries(input).filter(\n\t\t(entry): entry is [string, string | number | boolean] =>\n\t\t\ttypeof entry[1] === \"string\" ||\n\t\t\ttypeof entry[1] === \"number\" ||\n\t\t\ttypeof entry[1] === \"boolean\",\n\t);\n\treturn entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction extractA2ATaskLedgerMetadata(\n\ttask: A2ATask,\n): Record<string, string | number | boolean> | undefined {\n\tif (!isRecord(task.metadata)) {\n\t\treturn undefined;\n\t}\n\treturn cleanMetadata(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(task.metadata).filter(([key]) => !isSecretLikeKey(key)),\n\t\t),\n\t);\n}\n\nfunction mergeLedgerMetadata(\n\t...inputs: Array<Record<string, unknown> | undefined>\n): Record<string, string | number | boolean> | undefined {\n\tconst merged = Object.assign({}, ...inputs.filter(Boolean));\n\treturn cleanMetadata(merged);\n}\n\nfunction isSecretLikeKey(key: string): boolean {\n\tconst normalized = key.toLowerCase().replace(/[-_]/gu, \"\");\n\treturn (\n\t\tnormalized === \"authorization\" ||\n\t\tnormalized === \"token\" ||\n\t\tnormalized.endsWith(\"token\") ||\n\t\tnormalized === \"secret\" ||\n\t\tnormalized.endsWith(\"secret\") ||\n\t\tnormalized === \"password\" ||\n\t\tnormalized.endsWith(\"password\") ||\n\t\tnormalized === \"apikey\" ||\n\t\tnormalized.endsWith(\"apikey\") ||\n\t\tnormalized === \"credentials\" ||\n\t\tnormalized.endsWith(\"credentials\") ||\n\t\tnormalized === \"bearer\"\n\t);\n}\n\nfunction stringValue(input: unknown): string | undefined {\n\treturn typeof input === \"string\" ? trimString(input) : undefined;\n}\n\nfunction requiredString(input: unknown, path: string): string {\n\tconst value = stringValue(input);\n\tif (!value) {\n\t\tthrow new Error(`A2A task ledger ${path} is required`);\n\t}\n\treturn value;\n}\n\nfunction expandHome(path: string): string {\n\treturn path === \"~\" || path.startsWith(\"~/\")\n\t\t? join(homedir(), path.slice(2))\n\t\t: path;\n}\n\nfunction hasNodeCode(error: unknown, code: string): boolean {\n\treturn isRecord(error) && error.code === code;\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction fail(message: string): never {\n\tthrow new Error(message);\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ComposerRunTimelineResponse } from "@evalops/contracts";
|
|
2
|
+
import { type AgentTrajectoryInspectionReport } from "./agent-trajectory-inspection.js";
|
|
3
|
+
import { type AgentTrajectoryReplayReport } from "./agent-trajectory-replay.js";
|
|
4
|
+
import { type AgentTrajectoryScoreReport, type AgentTrajectoryScorerRule } from "./agent-trajectory-scorers.js";
|
|
5
|
+
import { type AgentTrajectoryReport } from "./agent-trajectory.js";
|
|
6
|
+
export declare const AGENT_TRAJECTORY_REPLAY_LAB_SCHEMA = "evalops.maestro.agent-trajectory-replay-lab.v1";
|
|
7
|
+
export declare const DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES: AgentTrajectoryScorerRule[];
|
|
8
|
+
export interface AgentTrajectoryReplayLabReport {
|
|
9
|
+
schemaVersion: typeof AGENT_TRAJECTORY_REPLAY_LAB_SCHEMA;
|
|
10
|
+
generatedAt: string;
|
|
11
|
+
run: AgentTrajectoryReport["run"];
|
|
12
|
+
summary: {
|
|
13
|
+
timelineItems: number;
|
|
14
|
+
trajectoryEvents: number;
|
|
15
|
+
replayDeltas: number;
|
|
16
|
+
replayErrors: number;
|
|
17
|
+
replayWarnings: number;
|
|
18
|
+
scoreRules: number;
|
|
19
|
+
scoreFailures: number;
|
|
20
|
+
scoreWarnings: number;
|
|
21
|
+
jumpTargets: number;
|
|
22
|
+
phases: number;
|
|
23
|
+
toolCalls: number;
|
|
24
|
+
};
|
|
25
|
+
timeline: ComposerRunTimelineResponse;
|
|
26
|
+
trajectory: AgentTrajectoryReport;
|
|
27
|
+
replay: AgentTrajectoryReplayReport;
|
|
28
|
+
score: AgentTrajectoryScoreReport;
|
|
29
|
+
inspection: AgentTrajectoryInspectionReport;
|
|
30
|
+
}
|
|
31
|
+
export interface BuildAgentTrajectoryReplayLabOptions {
|
|
32
|
+
rules?: AgentTrajectoryScorerRule[];
|
|
33
|
+
generatedAt?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function buildAgentTrajectoryReplayLab(timeline: ComposerRunTimelineResponse, options?: BuildAgentTrajectoryReplayLabOptions): AgentTrajectoryReplayLabReport;
|
|
36
|
+
//# sourceMappingURL=agent-trajectory-replay-lab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-trajectory-replay-lab.d.ts","sourceRoot":"","sources":["../../src/server/agent-trajectory-replay-lab.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACN,KAAK,+BAA+B,EAEpC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACN,KAAK,2BAA2B,EAEhC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAE9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,KAAK,qBAAqB,EAE1B,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,kCAAkC,mDACE,CAAC;AAElD,eAAO,MAAM,yCAAyC,EAAE,yBAAyB,EAS/E,CAAC;AAEH,MAAM,WAAW,8BAA8B;IAC9C,aAAa,EAAE,OAAO,kCAAkC,CAAC;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE,2BAA2B,CAAC;IACtC,UAAU,EAAE,qBAAqB,CAAC;IAClC,MAAM,EAAE,2BAA2B,CAAC;IACpC,KAAK,EAAE,0BAA0B,CAAC;IAClC,UAAU,EAAE,+BAA+B,CAAC;CAC5C;AAED,MAAM,WAAW,oCAAoC;IACpD,KAAK,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,6BAA6B,CAC5C,QAAQ,EAAE,2BAA2B,EACrC,OAAO,GAAE,oCAAyC,GAChD,8BAA8B,CAoChC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { buildAgentTrajectoryInspectionReport, } from "./agent-trajectory-inspection.js";
|
|
2
|
+
import { replayAgentTrajectoryReport, } from "./agent-trajectory-replay.js";
|
|
3
|
+
import { scoreAgentTrajectoryReport, } from "./agent-trajectory-scorers.js";
|
|
4
|
+
import { buildAgentTrajectoryReport, } from "./agent-trajectory.js";
|
|
5
|
+
export const AGENT_TRAJECTORY_REPLAY_LAB_SCHEMA = "evalops.maestro.agent-trajectory-replay-lab.v1";
|
|
6
|
+
export const DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES = [
|
|
7
|
+
{
|
|
8
|
+
id: "final-event-has-evidence",
|
|
9
|
+
severity: "error",
|
|
10
|
+
description: "The final answer or runtime terminal event must have evidence.",
|
|
11
|
+
finalEvidenceCoverage: true,
|
|
12
|
+
},
|
|
13
|
+
];
|
|
14
|
+
export function buildAgentTrajectoryReplayLab(timeline, options = {}) {
|
|
15
|
+
const trajectory = buildAgentTrajectoryReport(timeline);
|
|
16
|
+
const replay = replayAgentTrajectoryReport(trajectory);
|
|
17
|
+
const score = scoreAgentTrajectoryReport(trajectory, options.rules ?? DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES);
|
|
18
|
+
const inspection = buildAgentTrajectoryInspectionReport({
|
|
19
|
+
timelineItems: timeline.items,
|
|
20
|
+
trajectory,
|
|
21
|
+
replay,
|
|
22
|
+
score,
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
schemaVersion: AGENT_TRAJECTORY_REPLAY_LAB_SCHEMA,
|
|
26
|
+
generatedAt: options.generatedAt ?? new Date().toISOString(),
|
|
27
|
+
run: trajectory.run,
|
|
28
|
+
summary: {
|
|
29
|
+
timelineItems: timeline.items.length,
|
|
30
|
+
trajectoryEvents: trajectory.counts.events,
|
|
31
|
+
replayDeltas: replay.counts.deltas,
|
|
32
|
+
replayErrors: replay.counts.errors,
|
|
33
|
+
replayWarnings: replay.counts.warnings,
|
|
34
|
+
scoreRules: score.counts.rules,
|
|
35
|
+
scoreFailures: score.counts.failed,
|
|
36
|
+
scoreWarnings: score.counts.warnings,
|
|
37
|
+
jumpTargets: inspection.counts.jumpTargets,
|
|
38
|
+
phases: replay.counts.phases,
|
|
39
|
+
toolCalls: replay.counts.toolCalls,
|
|
40
|
+
},
|
|
41
|
+
timeline,
|
|
42
|
+
trajectory,
|
|
43
|
+
replay,
|
|
44
|
+
score,
|
|
45
|
+
inspection,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=agent-trajectory-replay-lab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-trajectory-replay-lab.js","sourceRoot":"","sources":["../../src/server/agent-trajectory-replay-lab.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,oCAAoC,GACpC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEN,2BAA2B,GAC3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAGN,0BAA0B,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEN,0BAA0B,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,kCAAkC,GAC9C,gDAAgD,CAAC;AAElD,MAAM,CAAC,MAAM,yCAAyC,GACrD;IACC;QACC,EAAE,EAAE,0BAA0B;QAC9B,QAAQ,EAAE,OAAO;QACjB,WAAW,EACV,gEAAgE;QACjE,qBAAqB,EAAE,IAAI;KAC3B;CACD,CAAC;AA+BH,MAAM,UAAU,6BAA6B,CAC5C,QAAqC,EACrC,UAAgD,EAAE;IAElD,MAAM,UAAU,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,0BAA0B,CACvC,UAAU,EACV,OAAO,CAAC,KAAK,IAAI,yCAAyC,CAC1D,CAAC;IACF,MAAM,UAAU,GAAG,oCAAoC,CAAC;QACvD,aAAa,EAAE,QAAQ,CAAC,KAAK;QAC7B,UAAU;QACV,MAAM;QACN,KAAK;KACL,CAAC,CAAC;IACH,OAAO;QACN,aAAa,EAAE,kCAAkC;QACjD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5D,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,OAAO,EAAE;YACR,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;YACpC,gBAAgB,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM;YAC1C,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAClC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAClC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;YACtC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;YAC9B,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAClC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;YACpC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW;YAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;SAClC;QACD,QAAQ;QACR,UAAU;QACV,MAAM;QACN,KAAK;QACL,UAAU;KACV,CAAC;AACH,CAAC","sourcesContent":["import type { ComposerRunTimelineResponse } from \"@evalops/contracts\";\nimport {\n\ttype AgentTrajectoryInspectionReport,\n\tbuildAgentTrajectoryInspectionReport,\n} from \"./agent-trajectory-inspection.js\";\nimport {\n\ttype AgentTrajectoryReplayReport,\n\treplayAgentTrajectoryReport,\n} from \"./agent-trajectory-replay.js\";\nimport {\n\ttype AgentTrajectoryScoreReport,\n\ttype AgentTrajectoryScorerRule,\n\tscoreAgentTrajectoryReport,\n} from \"./agent-trajectory-scorers.js\";\nimport {\n\ttype AgentTrajectoryReport,\n\tbuildAgentTrajectoryReport,\n} from \"./agent-trajectory.js\";\n\nexport const AGENT_TRAJECTORY_REPLAY_LAB_SCHEMA =\n\t\"evalops.maestro.agent-trajectory-replay-lab.v1\";\n\nexport const DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES: AgentTrajectoryScorerRule[] =\n\t[\n\t\t{\n\t\t\tid: \"final-event-has-evidence\",\n\t\t\tseverity: \"error\",\n\t\t\tdescription:\n\t\t\t\t\"The final answer or runtime terminal event must have evidence.\",\n\t\t\tfinalEvidenceCoverage: true,\n\t\t},\n\t];\n\nexport interface AgentTrajectoryReplayLabReport {\n\tschemaVersion: typeof AGENT_TRAJECTORY_REPLAY_LAB_SCHEMA;\n\tgeneratedAt: string;\n\trun: AgentTrajectoryReport[\"run\"];\n\tsummary: {\n\t\ttimelineItems: number;\n\t\ttrajectoryEvents: number;\n\t\treplayDeltas: number;\n\t\treplayErrors: number;\n\t\treplayWarnings: number;\n\t\tscoreRules: number;\n\t\tscoreFailures: number;\n\t\tscoreWarnings: number;\n\t\tjumpTargets: number;\n\t\tphases: number;\n\t\ttoolCalls: number;\n\t};\n\ttimeline: ComposerRunTimelineResponse;\n\ttrajectory: AgentTrajectoryReport;\n\treplay: AgentTrajectoryReplayReport;\n\tscore: AgentTrajectoryScoreReport;\n\tinspection: AgentTrajectoryInspectionReport;\n}\n\nexport interface BuildAgentTrajectoryReplayLabOptions {\n\trules?: AgentTrajectoryScorerRule[];\n\tgeneratedAt?: string;\n}\n\nexport function buildAgentTrajectoryReplayLab(\n\ttimeline: ComposerRunTimelineResponse,\n\toptions: BuildAgentTrajectoryReplayLabOptions = {},\n): AgentTrajectoryReplayLabReport {\n\tconst trajectory = buildAgentTrajectoryReport(timeline);\n\tconst replay = replayAgentTrajectoryReport(trajectory);\n\tconst score = scoreAgentTrajectoryReport(\n\t\ttrajectory,\n\t\toptions.rules ?? DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES,\n\t);\n\tconst inspection = buildAgentTrajectoryInspectionReport({\n\t\ttimelineItems: timeline.items,\n\t\ttrajectory,\n\t\treplay,\n\t\tscore,\n\t});\n\treturn {\n\t\tschemaVersion: AGENT_TRAJECTORY_REPLAY_LAB_SCHEMA,\n\t\tgeneratedAt: options.generatedAt ?? new Date().toISOString(),\n\t\trun: trajectory.run,\n\t\tsummary: {\n\t\t\ttimelineItems: timeline.items.length,\n\t\t\ttrajectoryEvents: trajectory.counts.events,\n\t\t\treplayDeltas: replay.counts.deltas,\n\t\t\treplayErrors: replay.counts.errors,\n\t\t\treplayWarnings: replay.counts.warnings,\n\t\t\tscoreRules: score.counts.rules,\n\t\t\tscoreFailures: score.counts.failed,\n\t\t\tscoreWarnings: score.counts.warnings,\n\t\t\tjumpTargets: inspection.counts.jumpTargets,\n\t\t\tphases: replay.counts.phases,\n\t\t\ttoolCalls: replay.counts.toolCalls,\n\t\t},\n\t\ttimeline,\n\t\ttrajectory,\n\t\treplay,\n\t\tscore,\n\t\tinspection,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { A2ACockpitSummary } from "../platform/a2a-cockpit.js";
|
|
2
|
+
import type { ModelPerformanceAggregate, RoutingDecision } from "../services/intelligent-router/types.js";
|
|
3
|
+
import type { AgentTrajectoryReplayLabReport } from "./agent-trajectory-replay-lab.js";
|
|
4
|
+
import type { RunHealthSnapshot } from "./handlers/status.js";
|
|
5
|
+
export declare const ANY_AGENT_CONTROL_PLANE_PROOF_SCHEMA = "evalops.maestro.any-agent-control-plane-proof.v1";
|
|
6
|
+
export type AnyAgentControlPlaneProofStatus = "passed" | "needs_attention" | "incomplete";
|
|
7
|
+
export type AnyAgentControlPlaneCapabilityStatus = "passed" | "warning" | "failed";
|
|
8
|
+
export type AnyAgentControlPlaneCapabilityId = "a2a_discovery" | "a2a_delegation" | "model_routing" | "eval_backed_routing" | "runtime_observability" | "trajectory_replay" | "operator_handoff";
|
|
9
|
+
export interface AnyAgentControlPlaneProofInput {
|
|
10
|
+
generatedAt?: string;
|
|
11
|
+
a2a?: A2ACockpitSummary;
|
|
12
|
+
routingDecisions?: RoutingDecision[];
|
|
13
|
+
routeMetrics?: ModelPerformanceAggregate[];
|
|
14
|
+
replayLab?: AgentTrajectoryReplayLabReport;
|
|
15
|
+
runHealth?: RunHealthSnapshot;
|
|
16
|
+
}
|
|
17
|
+
export interface AnyAgentControlPlaneCapabilityProof {
|
|
18
|
+
id: AnyAgentControlPlaneCapabilityId;
|
|
19
|
+
label: string;
|
|
20
|
+
status: AnyAgentControlPlaneCapabilityStatus;
|
|
21
|
+
evidence: string[];
|
|
22
|
+
blocker?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface AnyAgentControlPlaneProofReport {
|
|
25
|
+
schemaVersion: typeof ANY_AGENT_CONTROL_PLANE_PROOF_SCHEMA;
|
|
26
|
+
generatedAt: string;
|
|
27
|
+
status: AnyAgentControlPlaneProofStatus;
|
|
28
|
+
summary: {
|
|
29
|
+
capabilities: number;
|
|
30
|
+
passed: number;
|
|
31
|
+
warnings: number;
|
|
32
|
+
failed: number;
|
|
33
|
+
agentsObserved: number;
|
|
34
|
+
routingDecisions: number;
|
|
35
|
+
evalBackedRoutes: number;
|
|
36
|
+
};
|
|
37
|
+
capabilities: AnyAgentControlPlaneCapabilityProof[];
|
|
38
|
+
blockers: string[];
|
|
39
|
+
operatorNextActions: string[];
|
|
40
|
+
}
|
|
41
|
+
export declare function buildAnyAgentControlPlaneProof(input: AnyAgentControlPlaneProofInput): AnyAgentControlPlaneProofReport;
|
|
42
|
+
//# sourceMappingURL=any-agent-control-plane-proof.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"any-agent-control-plane-proof.d.ts","sourceRoot":"","sources":["../../src/server/any-agent-control-plane-proof.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EACX,yBAAyB,EACzB,eAAe,EACf,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,eAAO,MAAM,oCAAoC,qDACE,CAAC;AAEpD,MAAM,MAAM,+BAA+B,GACxC,QAAQ,GACR,iBAAiB,GACjB,YAAY,CAAC;AAEhB,MAAM,MAAM,oCAAoC,GAC7C,QAAQ,GACR,SAAS,GACT,QAAQ,CAAC;AAEZ,MAAM,MAAM,gCAAgC,GACzC,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,qBAAqB,GACrB,uBAAuB,GACvB,mBAAmB,GACnB,kBAAkB,CAAC;AAEtB,MAAM,WAAW,8BAA8B;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,YAAY,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAC3C,SAAS,CAAC,EAAE,8BAA8B,CAAC;IAC3C,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,mCAAmC;IACnD,EAAE,EAAE,gCAAgC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,oCAAoC,CAAC;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,+BAA+B;IAC/C,aAAa,EAAE,OAAO,oCAAoC,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,+BAA+B,CAAC;IACxC,OAAO,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,mCAAmC,EAAE,CAAC;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC9B;AA8RD,wBAAgB,8BAA8B,CAC7C,KAAK,EAAE,8BAA8B,GACnC,+BAA+B,CAuCjC"}
|