@agent-native/core 0.118.1 → 0.119.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +11 -0
- package/corpus/core/docs/content/a2a-protocol.mdx +15 -0
- package/corpus/core/docs/content/template-chat.mdx +1 -1
- package/corpus/core/docs/content/template-plan.mdx +3 -3
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/activity.ts +371 -0
- package/corpus/core/src/a2a/client.ts +3 -1
- package/corpus/core/src/a2a/index.ts +21 -0
- package/corpus/core/src/a2a/types.ts +8 -0
- package/corpus/core/src/agent/model-config.ts +19 -23
- package/corpus/core/src/agent/production-agent.ts +167 -100
- package/corpus/core/src/agent/types.ts +16 -1
- package/corpus/core/src/client/chat/tool-call-display.tsx +190 -35
- package/corpus/core/src/client/chat-model-groups.ts +67 -27
- package/corpus/core/src/client/sharing/ShareButton.tsx +1 -27
- package/corpus/core/src/client/sharing/ShareDialog.tsx +0 -16
- package/corpus/core/src/client/sharing/useShareButtonController.ts +0 -7
- package/corpus/core/src/client/sharing/useShareDialogController.ts +0 -2
- package/corpus/core/src/client/sse-event-processor.ts +85 -1
- package/corpus/core/src/localization/default-messages.ts +6 -0
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -18
- package/corpus/core/src/scripts/call-agent.ts +49 -6
- package/corpus/core/src/server/agent-chat-plugin.ts +50 -10
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- package/corpus/templates/clips/changelog/2026-07-23-fixed-recordings-failing-to-save-with-a-cancelled-or-cleanup.md +6 -0
- package/corpus/templates/clips/server/plugins/db.ts +9 -1
- package/dist/a2a/activity.d.ts +50 -0
- package/dist/a2a/activity.d.ts.map +1 -0
- package/dist/a2a/activity.js +236 -0
- package/dist/a2a/activity.js.map +1 -0
- package/dist/a2a/client.d.ts +2 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +1 -1
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/index.d.ts +2 -1
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +1 -0
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/types.d.ts +1 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts +2 -2
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/model-config.d.ts +16 -16
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +19 -23
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts +26 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +137 -80
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/types.d.ts +10 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +63 -14
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat-model-groups.d.ts.map +1 -1
- package/dist/client/chat-model-groups.js +44 -21
- package/dist/client/chat-model-groups.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +1 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +3 -4
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +1 -2
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/sharing/useShareButtonController.d.ts +0 -1
- package/dist/client/sharing/useShareButtonController.d.ts.map +1 -1
- package/dist/client/sharing/useShareButtonController.js +0 -6
- package/dist/client/sharing/useShareButtonController.js.map +1 -1
- package/dist/client/sharing/useShareDialogController.d.ts +0 -1
- package/dist/client/sharing/useShareDialogController.d.ts.map +1 -1
- package/dist/client/sharing/useShareDialogController.js +0 -1
- package/dist/client/sharing/useShareDialogController.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +12 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +63 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/localization/default-messages.d.ts +6 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +6 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +1 -18
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +49 -6
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +38 -10
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- package/docs/content/a2a-protocol.mdx +15 -0
- package/docs/content/template-chat.mdx +1 -1
- package/docs/content/template-plan.mdx +3 -3
- package/package.json +1 -1
- package/src/a2a/activity.ts +371 -0
- package/src/a2a/client.ts +3 -1
- package/src/a2a/index.ts +21 -0
- package/src/a2a/types.ts +8 -0
- package/src/agent/model-config.ts +19 -23
- package/src/agent/production-agent.ts +167 -100
- package/src/agent/types.ts +16 -1
- package/src/client/chat/tool-call-display.tsx +190 -35
- package/src/client/chat-model-groups.ts +67 -27
- package/src/client/sharing/ShareButton.tsx +1 -27
- package/src/client/sharing/ShareDialog.tsx +0 -16
- package/src/client/sharing/useShareButtonController.ts +0 -7
- package/src/client/sharing/useShareDialogController.ts +0 -2
- package/src/client/sse-event-processor.ts +85 -1
- package/src/localization/default-messages.ts +6 -0
- package/src/scripts/agent-engines/list-agent-engines.ts +1 -18
- package/src/scripts/call-agent.ts +49 -6
- package/src/server/agent-chat-plugin.ts +50 -10
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
- package/dist/observability/hosted-model-experiment.d.ts +0 -39
- package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
- package/dist/observability/hosted-model-experiment.js +0 -90
- package/dist/observability/hosted-model-experiment.js.map +0 -1
- package/src/observability/hosted-model-experiment.ts +0 -118
|
@@ -13,6 +13,11 @@ import {
|
|
|
13
13
|
type H3Event,
|
|
14
14
|
} from "h3";
|
|
15
15
|
|
|
16
|
+
import {
|
|
17
|
+
applyA2AAgentActivityEvent,
|
|
18
|
+
buildA2AAgentActivityPart,
|
|
19
|
+
createA2AAgentActivityState,
|
|
20
|
+
} from "../a2a/activity.js";
|
|
16
21
|
import {
|
|
17
22
|
appendA2AArtifactLinks,
|
|
18
23
|
buildA2ARecoverableArtifactMessage,
|
|
@@ -400,6 +405,8 @@ export function createSerializedA2ATaskStatusWriter(
|
|
|
400
405
|
};
|
|
401
406
|
}
|
|
402
407
|
|
|
408
|
+
const A2A_ACTIVITY_CHECKPOINT_MIN_INTERVAL_MS = 2_000;
|
|
409
|
+
|
|
403
410
|
export async function resolveA2ARecoverableArtifactSecret(
|
|
404
411
|
orgId: string | null | undefined = getRequestOrgId(),
|
|
405
412
|
): Promise<string | undefined> {
|
|
@@ -1656,10 +1663,36 @@ export function createAgentChatPlugin(
|
|
|
1656
1663
|
const a2aEvents: AgentChatEvent[] = [];
|
|
1657
1664
|
const a2aToolResults: A2AToolResultSummary[] = [];
|
|
1658
1665
|
let lastRecoverableArtifactText = "";
|
|
1666
|
+
let activityState = createA2AAgentActivityState();
|
|
1667
|
+
let lastActivityCheckpointAt = 0;
|
|
1659
1668
|
const recoverableArtifactSecret =
|
|
1660
1669
|
await resolveA2ARecoverableArtifactSecret();
|
|
1661
1670
|
const recoverableArtifactStatusWriter =
|
|
1662
1671
|
createSerializedA2ATaskStatusWriter(context.taskId);
|
|
1672
|
+
const activityStatusMessage = (): A2AMessage => ({
|
|
1673
|
+
role: "agent",
|
|
1674
|
+
...(lastRecoverableArtifactText
|
|
1675
|
+
? { metadata: { agentNativeRecoverableArtifacts: true } }
|
|
1676
|
+
: {}),
|
|
1677
|
+
parts: [
|
|
1678
|
+
buildA2AAgentActivityPart(activityState),
|
|
1679
|
+
...(lastRecoverableArtifactText
|
|
1680
|
+
? [{ type: "text" as const, text: lastRecoverableArtifactText }]
|
|
1681
|
+
: []),
|
|
1682
|
+
],
|
|
1683
|
+
});
|
|
1684
|
+
const checkpointActivity = (force = false) => {
|
|
1685
|
+
const now = Date.now();
|
|
1686
|
+
if (
|
|
1687
|
+
!force &&
|
|
1688
|
+
now - lastActivityCheckpointAt <
|
|
1689
|
+
A2A_ACTIVITY_CHECKPOINT_MIN_INTERVAL_MS
|
|
1690
|
+
) {
|
|
1691
|
+
return;
|
|
1692
|
+
}
|
|
1693
|
+
lastActivityCheckpointAt = now;
|
|
1694
|
+
recoverableArtifactStatusWriter.enqueue(activityStatusMessage());
|
|
1695
|
+
};
|
|
1663
1696
|
const controller = new AbortController();
|
|
1664
1697
|
const correlation = sanitizeA2ACorrelationMetadata(context.metadata);
|
|
1665
1698
|
const telemetryThreadId =
|
|
@@ -1697,6 +1730,12 @@ export function createAgentChatPlugin(
|
|
|
1697
1730
|
turnId: context.taskId,
|
|
1698
1731
|
send: (event) => {
|
|
1699
1732
|
a2aEvents.push(event);
|
|
1733
|
+
const nextActivityState = applyA2AAgentActivityEvent(
|
|
1734
|
+
activityState,
|
|
1735
|
+
event,
|
|
1736
|
+
);
|
|
1737
|
+
const activityChanged = nextActivityState !== activityState;
|
|
1738
|
+
activityState = nextActivityState;
|
|
1700
1739
|
if (event.type === "tool_start") {
|
|
1701
1740
|
console.log(`[A2A] Tool call: ${event.tool}`);
|
|
1702
1741
|
} else if (event.type === "tool_done") {
|
|
@@ -1727,22 +1766,20 @@ export function createAgentChatPlugin(
|
|
|
1727
1766
|
recoverableArtifactText !== lastRecoverableArtifactText
|
|
1728
1767
|
) {
|
|
1729
1768
|
lastRecoverableArtifactText = recoverableArtifactText;
|
|
1730
|
-
recoverableArtifactStatusWriter.enqueue({
|
|
1731
|
-
role: "agent",
|
|
1732
|
-
metadata: { agentNativeRecoverableArtifacts: true },
|
|
1733
|
-
parts: [
|
|
1734
|
-
{
|
|
1735
|
-
type: "text",
|
|
1736
|
-
text: recoverableArtifactText,
|
|
1737
|
-
},
|
|
1738
|
-
],
|
|
1739
|
-
});
|
|
1740
1769
|
}
|
|
1741
1770
|
} else if (event.type === "error") {
|
|
1742
1771
|
console.error(`[A2A] Error: ${event.error}`);
|
|
1743
1772
|
} else if (event.type === "done") {
|
|
1744
1773
|
console.log(`[A2A] Done. Events: ${a2aEvents.length}`);
|
|
1745
1774
|
}
|
|
1775
|
+
if (activityChanged) {
|
|
1776
|
+
checkpointActivity(
|
|
1777
|
+
event.type === "tool_start" ||
|
|
1778
|
+
event.type === "tool_done" ||
|
|
1779
|
+
event.type === "error" ||
|
|
1780
|
+
event.type === "done",
|
|
1781
|
+
);
|
|
1782
|
+
}
|
|
1746
1783
|
},
|
|
1747
1784
|
signal: controller.signal,
|
|
1748
1785
|
},
|
|
@@ -1779,6 +1816,7 @@ export function createAgentChatPlugin(
|
|
|
1779
1816
|
|
|
1780
1817
|
// The continuation can observe terminal output immediately, so make
|
|
1781
1818
|
// its latest mutation checkpoint durable first.
|
|
1819
|
+
checkpointActivity(true);
|
|
1782
1820
|
await recoverableArtifactStatusWriter.flush();
|
|
1783
1821
|
|
|
1784
1822
|
const approval = [...a2aEvents]
|
|
@@ -1817,6 +1855,7 @@ export function createAgentChatPlugin(
|
|
|
1817
1855
|
},
|
|
1818
1856
|
},
|
|
1819
1857
|
parts: [
|
|
1858
|
+
buildA2AAgentActivityPart(activityState),
|
|
1820
1859
|
{
|
|
1821
1860
|
type: "text" as const,
|
|
1822
1861
|
text:
|
|
@@ -1851,6 +1890,7 @@ export function createAgentChatPlugin(
|
|
|
1851
1890
|
yield {
|
|
1852
1891
|
role: "agent" as const,
|
|
1853
1892
|
parts: [
|
|
1893
|
+
buildA2AAgentActivityPart(activityState),
|
|
1854
1894
|
{
|
|
1855
1895
|
type: "text" as const,
|
|
1856
1896
|
text: finalText || "(no response)",
|
|
@@ -195,6 +195,22 @@ for await (const update of client.stream({
|
|
|
195
195
|
}
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
+
### Agent activity in delegated chat
|
|
199
|
+
|
|
200
|
+
Agent Native peers attach a bounded `data` part with
|
|
201
|
+
`kind: "agent-native/agent-activity"` to in-progress and terminal task status
|
|
202
|
+
messages. It contains the same user-visible reasoning summaries shown in the
|
|
203
|
+
receiving app, tool names and completion states, elapsed time, and progressive
|
|
204
|
+
response text. It never includes tool inputs, tool results, credentials, or
|
|
205
|
+
hidden provider reasoning.
|
|
206
|
+
|
|
207
|
+
`call-agent` reads this optional part while it polls an asynchronous task and
|
|
208
|
+
renders the remote work as a nested agent run. Unknown A2A peers do not need to
|
|
209
|
+
implement the extension: their ordinary status and final text still render in
|
|
210
|
+
the same nested block. Treat activity data as untrusted presentation content;
|
|
211
|
+
never use it for identity, authorization, approval, routing, or artifact
|
|
212
|
+
validation.
|
|
213
|
+
|
|
198
214
|
### Carrying explicit chat authorization
|
|
199
215
|
|
|
200
216
|
When the authenticated caller has an exact consequential action that the user
|
|
@@ -1333,8 +1333,16 @@ async function sweepOrphanedResumableSessions(): Promise<void> {
|
|
|
1333
1333
|
if (!key.startsWith(prefix)) continue;
|
|
1334
1334
|
const recordingId = key.slice(prefix.length);
|
|
1335
1335
|
if (!recordingId) continue;
|
|
1336
|
+
// `application_state.updated_at` is epoch-ms (a JS number on SQLite, a
|
|
1337
|
+
// BIGINT string on Postgres), but the staleness cutoffs below are ISO-8601.
|
|
1338
|
+
// Normalize to ISO before comparing — a raw epoch-ms value ("1753…") always
|
|
1339
|
+
// sorts lexically below any "2…" ISO date, which would flag every live
|
|
1340
|
+
// upload as stale and force-fail it.
|
|
1341
|
+
const sessionUpdatedAtMs = Number(row.updated_at);
|
|
1336
1342
|
const sessionUpdatedAt =
|
|
1337
|
-
|
|
1343
|
+
Number.isFinite(sessionUpdatedAtMs) && sessionUpdatedAtMs > 0
|
|
1344
|
+
? new Date(sessionUpdatedAtMs).toISOString()
|
|
1345
|
+
: "";
|
|
1338
1346
|
|
|
1339
1347
|
let shouldSweep = false;
|
|
1340
1348
|
try {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AgentChatEvent } from "../agent/types.js";
|
|
2
|
+
import type { DataPart, Part } from "./types.js";
|
|
3
|
+
export declare const A2A_AGENT_ACTIVITY_KIND = "agent-native/agent-activity";
|
|
4
|
+
export declare const A2A_AGENT_ACTIVITY_VERSION = 1;
|
|
5
|
+
export declare const MAX_A2A_ACTIVITY_REASONING_CHARS = 32768;
|
|
6
|
+
export declare const MAX_A2A_ACTIVITY_RESPONSE_CHARS = 32768;
|
|
7
|
+
export declare const MAX_A2A_ACTIVITY_TOTAL_CHARS = 98304;
|
|
8
|
+
export declare const MAX_A2A_ACTIVITY_REASONING_SEGMENTS = 128;
|
|
9
|
+
export declare const MAX_A2A_ACTIVITY_TOOL_CALLS = 64;
|
|
10
|
+
export declare const MAX_A2A_ACTIVITY_TOOL_NAME_CHARS = 96;
|
|
11
|
+
export declare const MAX_A2A_ACTIVITY_TOOL_ID_CHARS = 128;
|
|
12
|
+
export type A2AAgentActivityPhase = "reasoning" | "tool" | "responding" | "complete" | "error";
|
|
13
|
+
export type A2AAgentActivityToolStatus = "running" | "completed" | "failed";
|
|
14
|
+
export interface A2AAgentActivityToolCall {
|
|
15
|
+
name: string;
|
|
16
|
+
id?: string;
|
|
17
|
+
status: A2AAgentActivityToolStatus;
|
|
18
|
+
}
|
|
19
|
+
export interface A2AAgentActivitySnapshot extends Record<string, unknown> {
|
|
20
|
+
kind: typeof A2A_AGENT_ACTIVITY_KIND;
|
|
21
|
+
version: typeof A2A_AGENT_ACTIVITY_VERSION;
|
|
22
|
+
sequence: number;
|
|
23
|
+
startedAt: number;
|
|
24
|
+
updatedAt: number;
|
|
25
|
+
durationMs: number;
|
|
26
|
+
activePhase: A2AAgentActivityPhase;
|
|
27
|
+
reasoning: string[];
|
|
28
|
+
toolCalls: A2AAgentActivityToolCall[];
|
|
29
|
+
responseText?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface A2AAgentActivityState {
|
|
32
|
+
sequence: number;
|
|
33
|
+
startedAt: number;
|
|
34
|
+
updatedAt: number;
|
|
35
|
+
activePhase: A2AAgentActivityPhase;
|
|
36
|
+
reasoning: string[];
|
|
37
|
+
toolCalls: A2AAgentActivityToolCall[];
|
|
38
|
+
responseText: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function createA2AAgentActivityState(startedAt?: number): A2AAgentActivityState;
|
|
41
|
+
/**
|
|
42
|
+
* Converts internal loop events into a bounded activity snapshot. It carries
|
|
43
|
+
* only reasoning text already emitted to the local chat, never tool inputs or
|
|
44
|
+
* results.
|
|
45
|
+
*/
|
|
46
|
+
export declare function applyA2AAgentActivityEvent(state: A2AAgentActivityState, event: AgentChatEvent, updatedAt?: number): A2AAgentActivityState;
|
|
47
|
+
export declare function buildA2AAgentActivitySnapshot(state: A2AAgentActivityState): A2AAgentActivitySnapshot;
|
|
48
|
+
export declare function buildA2AAgentActivityPart(state: A2AAgentActivityState): DataPart;
|
|
49
|
+
export declare function parseA2AAgentActivityPart(part: Part | unknown): A2AAgentActivitySnapshot | null;
|
|
50
|
+
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/a2a/activity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AACrE,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,gCAAgC,QAAS,CAAC;AACvD,eAAO,MAAM,+BAA+B,QAAS,CAAC;AACtD,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,mCAAmC,MAAM,CAAC;AACvD,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,MAAM,GACN,YAAY,GACZ,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5E,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,IAAI,EAAE,OAAO,uBAAuB,CAAC;IACrC,OAAO,EAAE,OAAO,0BAA0B,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,SAAa,GACrB,qBAAqB,CAUvB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,cAAc,EACrB,SAAS,SAAa,GACrB,qBAAqB,CAkDvB;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,qBAAqB,GAC3B,wBAAwB,CAa1B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,qBAAqB,GAC3B,QAAQ,CAEV;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,GAAG,OAAO,GACnB,wBAAwB,GAAG,IAAI,CAyBjC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { sanitizeToolErrorText } from "../agent/tool-error-redaction.js";
|
|
2
|
+
export const A2A_AGENT_ACTIVITY_KIND = "agent-native/agent-activity";
|
|
3
|
+
export const A2A_AGENT_ACTIVITY_VERSION = 1;
|
|
4
|
+
export const MAX_A2A_ACTIVITY_REASONING_CHARS = 32_768;
|
|
5
|
+
export const MAX_A2A_ACTIVITY_RESPONSE_CHARS = 32_768;
|
|
6
|
+
export const MAX_A2A_ACTIVITY_TOTAL_CHARS = 98_304;
|
|
7
|
+
export const MAX_A2A_ACTIVITY_REASONING_SEGMENTS = 128;
|
|
8
|
+
export const MAX_A2A_ACTIVITY_TOOL_CALLS = 64;
|
|
9
|
+
export const MAX_A2A_ACTIVITY_TOOL_NAME_CHARS = 96;
|
|
10
|
+
export const MAX_A2A_ACTIVITY_TOOL_ID_CHARS = 128;
|
|
11
|
+
export function createA2AAgentActivityState(startedAt = Date.now()) {
|
|
12
|
+
return {
|
|
13
|
+
sequence: 0,
|
|
14
|
+
startedAt,
|
|
15
|
+
updatedAt: startedAt,
|
|
16
|
+
activePhase: "reasoning",
|
|
17
|
+
reasoning: [],
|
|
18
|
+
toolCalls: [],
|
|
19
|
+
responseText: "",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Converts internal loop events into a bounded activity snapshot. It carries
|
|
24
|
+
* only reasoning text already emitted to the local chat, never tool inputs or
|
|
25
|
+
* results.
|
|
26
|
+
*/
|
|
27
|
+
export function applyA2AAgentActivityEvent(state, event, updatedAt = Date.now()) {
|
|
28
|
+
const next = { ...state, updatedAt: normalizeTimestamp(updatedAt) };
|
|
29
|
+
let changed = false;
|
|
30
|
+
switch (event.type) {
|
|
31
|
+
case "thinking":
|
|
32
|
+
next.activePhase = "reasoning";
|
|
33
|
+
next.reasoning = appendBoundedSegment(next.reasoning, event.text, MAX_A2A_ACTIVITY_REASONING_CHARS, next.toolCalls.length);
|
|
34
|
+
changed = true;
|
|
35
|
+
break;
|
|
36
|
+
case "tool_start":
|
|
37
|
+
next.activePhase = "tool";
|
|
38
|
+
next.responseText = "";
|
|
39
|
+
next.toolCalls = appendToolCall(next.toolCalls, toolFromEvent(event));
|
|
40
|
+
changed = true;
|
|
41
|
+
break;
|
|
42
|
+
case "tool_done":
|
|
43
|
+
next.activePhase = "tool";
|
|
44
|
+
next.toolCalls = settleToolCall(next.toolCalls, toolFromEvent(event));
|
|
45
|
+
changed = true;
|
|
46
|
+
break;
|
|
47
|
+
case "text":
|
|
48
|
+
next.activePhase = "responding";
|
|
49
|
+
next.responseText = appendBoundedText(next.responseText, event.text, MAX_A2A_ACTIVITY_RESPONSE_CHARS);
|
|
50
|
+
changed = true;
|
|
51
|
+
break;
|
|
52
|
+
case "done":
|
|
53
|
+
next.activePhase = "complete";
|
|
54
|
+
changed = true;
|
|
55
|
+
break;
|
|
56
|
+
case "error":
|
|
57
|
+
next.activePhase = "error";
|
|
58
|
+
changed = true;
|
|
59
|
+
break;
|
|
60
|
+
case "clear":
|
|
61
|
+
next.responseText = "";
|
|
62
|
+
changed = true;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
return changed ? { ...next, sequence: state.sequence + 1 } : state;
|
|
66
|
+
}
|
|
67
|
+
export function buildA2AAgentActivitySnapshot(state) {
|
|
68
|
+
return {
|
|
69
|
+
kind: A2A_AGENT_ACTIVITY_KIND,
|
|
70
|
+
version: A2A_AGENT_ACTIVITY_VERSION,
|
|
71
|
+
sequence: state.sequence,
|
|
72
|
+
startedAt: state.startedAt,
|
|
73
|
+
updatedAt: state.updatedAt,
|
|
74
|
+
durationMs: Math.max(0, state.updatedAt - state.startedAt),
|
|
75
|
+
activePhase: state.activePhase,
|
|
76
|
+
reasoning: state.reasoning,
|
|
77
|
+
toolCalls: state.toolCalls,
|
|
78
|
+
...(state.responseText ? { responseText: state.responseText } : {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export function buildA2AAgentActivityPart(state) {
|
|
82
|
+
return { type: "data", data: buildA2AAgentActivitySnapshot(state) };
|
|
83
|
+
}
|
|
84
|
+
export function parseA2AAgentActivityPart(part) {
|
|
85
|
+
if (!part || typeof part !== "object")
|
|
86
|
+
return null;
|
|
87
|
+
const candidate = part;
|
|
88
|
+
if (candidate.type !== "data" || !isRecord(candidate.data))
|
|
89
|
+
return null;
|
|
90
|
+
const data = candidate.data;
|
|
91
|
+
if (data.kind !== A2A_AGENT_ACTIVITY_KIND ||
|
|
92
|
+
data.version !== A2A_AGENT_ACTIVITY_VERSION ||
|
|
93
|
+
!isSafeInteger(data.sequence) ||
|
|
94
|
+
!isSafeInteger(data.startedAt) ||
|
|
95
|
+
!isSafeInteger(data.updatedAt) ||
|
|
96
|
+
!isSafeInteger(data.durationMs) ||
|
|
97
|
+
!isPhase(data.activePhase) ||
|
|
98
|
+
data.updatedAt < data.startedAt ||
|
|
99
|
+
data.durationMs !== data.updatedAt - data.startedAt ||
|
|
100
|
+
!isSafeReasoning(data.reasoning) ||
|
|
101
|
+
!isSafeToolCalls(data.toolCalls) ||
|
|
102
|
+
(data.responseText !== undefined &&
|
|
103
|
+
!isSafeText(data.responseText, MAX_A2A_ACTIVITY_RESPONSE_CHARS)) ||
|
|
104
|
+
activityCharacterCount(data) > MAX_A2A_ACTIVITY_TOTAL_CHARS) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return data;
|
|
108
|
+
}
|
|
109
|
+
function toolFromEvent(event) {
|
|
110
|
+
const id = sanitizeToolId(event.id);
|
|
111
|
+
return {
|
|
112
|
+
name: sanitizeToolName(event.tool),
|
|
113
|
+
...(id ? { id } : {}),
|
|
114
|
+
status: event.type === "tool_start"
|
|
115
|
+
? "running"
|
|
116
|
+
: event.isError
|
|
117
|
+
? "failed"
|
|
118
|
+
: "completed",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function appendBoundedText(current, addition, maxChars) {
|
|
122
|
+
return sanitizeText(`${current}${addition}`, maxChars);
|
|
123
|
+
}
|
|
124
|
+
function appendBoundedSegment(current, addition, maxChars, precedingToolCount) {
|
|
125
|
+
const used = current.reduce((total, text) => total + text.length, 0);
|
|
126
|
+
if (used >= maxChars ||
|
|
127
|
+
current.length >= MAX_A2A_ACTIVITY_REASONING_SEGMENTS) {
|
|
128
|
+
return current;
|
|
129
|
+
}
|
|
130
|
+
const text = sanitizeText(addition, maxChars - used);
|
|
131
|
+
if (!text)
|
|
132
|
+
return current;
|
|
133
|
+
const next = [...current];
|
|
134
|
+
while (next.length < precedingToolCount &&
|
|
135
|
+
next.length < MAX_A2A_ACTIVITY_REASONING_SEGMENTS) {
|
|
136
|
+
next.push("");
|
|
137
|
+
}
|
|
138
|
+
if (next.length === precedingToolCount) {
|
|
139
|
+
return [...next, text];
|
|
140
|
+
}
|
|
141
|
+
next[precedingToolCount] = `${next[precedingToolCount] ?? ""}${text}`;
|
|
142
|
+
return next;
|
|
143
|
+
}
|
|
144
|
+
function appendToolCall(current, tool) {
|
|
145
|
+
return current.length < MAX_A2A_ACTIVITY_TOOL_CALLS
|
|
146
|
+
? [...current, tool]
|
|
147
|
+
: current;
|
|
148
|
+
}
|
|
149
|
+
function settleToolCall(current, tool) {
|
|
150
|
+
for (let index = current.length - 1; index >= 0; index -= 1) {
|
|
151
|
+
const existing = current[index];
|
|
152
|
+
if ((tool.id && tool.id === existing.id) ||
|
|
153
|
+
(!tool.id && tool.name === existing.name)) {
|
|
154
|
+
return current.map((value, itemIndex) => itemIndex === index ? tool : value);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return appendToolCall(current, tool);
|
|
158
|
+
}
|
|
159
|
+
function sanitizeText(value, maxChars) {
|
|
160
|
+
return sanitizeToolErrorText(value)
|
|
161
|
+
.replace(/\r\n?/g, "\n")
|
|
162
|
+
.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, "")
|
|
163
|
+
.slice(0, maxChars);
|
|
164
|
+
}
|
|
165
|
+
function sanitizeToolName(value) {
|
|
166
|
+
return sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_NAME_CHARS) || "tool";
|
|
167
|
+
}
|
|
168
|
+
function sanitizeToolId(value) {
|
|
169
|
+
const sanitized = value
|
|
170
|
+
? sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_ID_CHARS)
|
|
171
|
+
: "";
|
|
172
|
+
return sanitized || undefined;
|
|
173
|
+
}
|
|
174
|
+
function normalizeTimestamp(value) {
|
|
175
|
+
return isSafeInteger(value) ? value : Date.now();
|
|
176
|
+
}
|
|
177
|
+
function isRecord(value) {
|
|
178
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
179
|
+
}
|
|
180
|
+
function isSafeInteger(value) {
|
|
181
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
182
|
+
}
|
|
183
|
+
function isPhase(value) {
|
|
184
|
+
return ["reasoning", "tool", "responding", "complete", "error"].includes(value);
|
|
185
|
+
}
|
|
186
|
+
function isSafeReasoning(value) {
|
|
187
|
+
return (Array.isArray(value) &&
|
|
188
|
+
value.length <= MAX_A2A_ACTIVITY_REASONING_SEGMENTS &&
|
|
189
|
+
value.reduce((total, text) => total + (typeof text === "string" ? text.length : Infinity), 0) <= MAX_A2A_ACTIVITY_REASONING_CHARS &&
|
|
190
|
+
value.every((text) => isSafeText(text, MAX_A2A_ACTIVITY_REASONING_CHARS)));
|
|
191
|
+
}
|
|
192
|
+
function isSafeToolCalls(value) {
|
|
193
|
+
return (Array.isArray(value) &&
|
|
194
|
+
value.length <= MAX_A2A_ACTIVITY_TOOL_CALLS &&
|
|
195
|
+
value.every(isSafeToolCall));
|
|
196
|
+
}
|
|
197
|
+
function isSafeToolCall(value) {
|
|
198
|
+
if (!isRecord(value) || !isSafeToolName(value.name))
|
|
199
|
+
return false;
|
|
200
|
+
return ((value.id === undefined || isSafeToolId(value.id)) &&
|
|
201
|
+
(value.status === "running" ||
|
|
202
|
+
value.status === "completed" ||
|
|
203
|
+
value.status === "failed"));
|
|
204
|
+
}
|
|
205
|
+
function isSafeText(value, maxChars) {
|
|
206
|
+
return (typeof value === "string" &&
|
|
207
|
+
value.length <= maxChars &&
|
|
208
|
+
value === sanitizeText(value, maxChars));
|
|
209
|
+
}
|
|
210
|
+
function isSafeToolName(value) {
|
|
211
|
+
return (typeof value === "string" &&
|
|
212
|
+
value.length <= MAX_A2A_ACTIVITY_TOOL_NAME_CHARS &&
|
|
213
|
+
value === sanitizeToolName(value));
|
|
214
|
+
}
|
|
215
|
+
function isSafeToolId(value) {
|
|
216
|
+
return (typeof value === "string" &&
|
|
217
|
+
value.length <= MAX_A2A_ACTIVITY_TOOL_ID_CHARS &&
|
|
218
|
+
value === sanitizeToolId(value));
|
|
219
|
+
}
|
|
220
|
+
function activityCharacterCount(data) {
|
|
221
|
+
const reasoning = Array.isArray(data.reasoning)
|
|
222
|
+
? data.reasoning.reduce((total, text) => total + (typeof text === "string" ? text.length : 0), 0)
|
|
223
|
+
: 0;
|
|
224
|
+
const response = typeof data.responseText === "string" ? data.responseText.length : 0;
|
|
225
|
+
const tools = Array.isArray(data.toolCalls)
|
|
226
|
+
? data.toolCalls.reduce((total, tool) => {
|
|
227
|
+
if (!isRecord(tool))
|
|
228
|
+
return total;
|
|
229
|
+
return (total +
|
|
230
|
+
(typeof tool.name === "string" ? tool.name.length : 0) +
|
|
231
|
+
(typeof tool.id === "string" ? tool.id.length : 0));
|
|
232
|
+
}, 0)
|
|
233
|
+
: 0;
|
|
234
|
+
return reasoning + response + tools;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/a2a/activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { sanitizeToolErrorText } from \"../agent/tool-error-redaction.js\";\nimport type { AgentChatEvent } from \"../agent/types.js\";\nimport type { DataPart, Part } from \"./types.js\";\n\nexport const A2A_AGENT_ACTIVITY_KIND = \"agent-native/agent-activity\";\nexport const A2A_AGENT_ACTIVITY_VERSION = 1;\nexport const MAX_A2A_ACTIVITY_REASONING_CHARS = 32_768;\nexport const MAX_A2A_ACTIVITY_RESPONSE_CHARS = 32_768;\nexport const MAX_A2A_ACTIVITY_TOTAL_CHARS = 98_304;\nexport const MAX_A2A_ACTIVITY_REASONING_SEGMENTS = 128;\nexport const MAX_A2A_ACTIVITY_TOOL_CALLS = 64;\nexport const MAX_A2A_ACTIVITY_TOOL_NAME_CHARS = 96;\nexport const MAX_A2A_ACTIVITY_TOOL_ID_CHARS = 128;\n\nexport type A2AAgentActivityPhase =\n | \"reasoning\"\n | \"tool\"\n | \"responding\"\n | \"complete\"\n | \"error\";\n\nexport type A2AAgentActivityToolStatus = \"running\" | \"completed\" | \"failed\";\n\nexport interface A2AAgentActivityToolCall {\n name: string;\n id?: string;\n status: A2AAgentActivityToolStatus;\n}\n\nexport interface A2AAgentActivitySnapshot extends Record<string, unknown> {\n kind: typeof A2A_AGENT_ACTIVITY_KIND;\n version: typeof A2A_AGENT_ACTIVITY_VERSION;\n sequence: number;\n startedAt: number;\n updatedAt: number;\n durationMs: number;\n activePhase: A2AAgentActivityPhase;\n reasoning: string[];\n toolCalls: A2AAgentActivityToolCall[];\n responseText?: string;\n}\n\nexport interface A2AAgentActivityState {\n sequence: number;\n startedAt: number;\n updatedAt: number;\n activePhase: A2AAgentActivityPhase;\n reasoning: string[];\n toolCalls: A2AAgentActivityToolCall[];\n responseText: string;\n}\n\nexport function createA2AAgentActivityState(\n startedAt = Date.now(),\n): A2AAgentActivityState {\n return {\n sequence: 0,\n startedAt,\n updatedAt: startedAt,\n activePhase: \"reasoning\",\n reasoning: [],\n toolCalls: [],\n responseText: \"\",\n };\n}\n\n/**\n * Converts internal loop events into a bounded activity snapshot. It carries\n * only reasoning text already emitted to the local chat, never tool inputs or\n * results.\n */\nexport function applyA2AAgentActivityEvent(\n state: A2AAgentActivityState,\n event: AgentChatEvent,\n updatedAt = Date.now(),\n): A2AAgentActivityState {\n const next = { ...state, updatedAt: normalizeTimestamp(updatedAt) };\n let changed = false;\n\n switch (event.type) {\n case \"thinking\":\n next.activePhase = \"reasoning\";\n next.reasoning = appendBoundedSegment(\n next.reasoning,\n event.text,\n MAX_A2A_ACTIVITY_REASONING_CHARS,\n next.toolCalls.length,\n );\n changed = true;\n break;\n case \"tool_start\":\n next.activePhase = \"tool\";\n next.responseText = \"\";\n next.toolCalls = appendToolCall(next.toolCalls, toolFromEvent(event));\n changed = true;\n break;\n case \"tool_done\":\n next.activePhase = \"tool\";\n next.toolCalls = settleToolCall(next.toolCalls, toolFromEvent(event));\n changed = true;\n break;\n case \"text\":\n next.activePhase = \"responding\";\n next.responseText = appendBoundedText(\n next.responseText,\n event.text,\n MAX_A2A_ACTIVITY_RESPONSE_CHARS,\n );\n changed = true;\n break;\n case \"done\":\n next.activePhase = \"complete\";\n changed = true;\n break;\n case \"error\":\n next.activePhase = \"error\";\n changed = true;\n break;\n case \"clear\":\n next.responseText = \"\";\n changed = true;\n break;\n }\n\n return changed ? { ...next, sequence: state.sequence + 1 } : state;\n}\n\nexport function buildA2AAgentActivitySnapshot(\n state: A2AAgentActivityState,\n): A2AAgentActivitySnapshot {\n return {\n kind: A2A_AGENT_ACTIVITY_KIND,\n version: A2A_AGENT_ACTIVITY_VERSION,\n sequence: state.sequence,\n startedAt: state.startedAt,\n updatedAt: state.updatedAt,\n durationMs: Math.max(0, state.updatedAt - state.startedAt),\n activePhase: state.activePhase,\n reasoning: state.reasoning,\n toolCalls: state.toolCalls,\n ...(state.responseText ? { responseText: state.responseText } : {}),\n };\n}\n\nexport function buildA2AAgentActivityPart(\n state: A2AAgentActivityState,\n): DataPart {\n return { type: \"data\", data: buildA2AAgentActivitySnapshot(state) };\n}\n\nexport function parseA2AAgentActivityPart(\n part: Part | unknown,\n): A2AAgentActivitySnapshot | null {\n if (!part || typeof part !== \"object\") return null;\n const candidate = part as { type?: unknown; data?: unknown };\n if (candidate.type !== \"data\" || !isRecord(candidate.data)) return null;\n const data = candidate.data;\n if (\n data.kind !== A2A_AGENT_ACTIVITY_KIND ||\n data.version !== A2A_AGENT_ACTIVITY_VERSION ||\n !isSafeInteger(data.sequence) ||\n !isSafeInteger(data.startedAt) ||\n !isSafeInteger(data.updatedAt) ||\n !isSafeInteger(data.durationMs) ||\n !isPhase(data.activePhase) ||\n data.updatedAt < data.startedAt ||\n data.durationMs !== data.updatedAt - data.startedAt ||\n !isSafeReasoning(data.reasoning) ||\n !isSafeToolCalls(data.toolCalls) ||\n (data.responseText !== undefined &&\n !isSafeText(data.responseText, MAX_A2A_ACTIVITY_RESPONSE_CHARS)) ||\n activityCharacterCount(data) > MAX_A2A_ACTIVITY_TOTAL_CHARS\n ) {\n return null;\n }\n\n return data as unknown as A2AAgentActivitySnapshot;\n}\n\nfunction toolFromEvent(\n event: Extract<AgentChatEvent, { type: \"tool_start\" | \"tool_done\" }>,\n): A2AAgentActivityToolCall {\n const id = sanitizeToolId(event.id);\n return {\n name: sanitizeToolName(event.tool),\n ...(id ? { id } : {}),\n status:\n event.type === \"tool_start\"\n ? \"running\"\n : event.isError\n ? \"failed\"\n : \"completed\",\n };\n}\n\nfunction appendBoundedText(\n current: string,\n addition: string,\n maxChars: number,\n) {\n return sanitizeText(`${current}${addition}`, maxChars);\n}\n\nfunction appendBoundedSegment(\n current: string[],\n addition: string,\n maxChars: number,\n precedingToolCount: number,\n): string[] {\n const used = current.reduce((total, text) => total + text.length, 0);\n if (\n used >= maxChars ||\n current.length >= MAX_A2A_ACTIVITY_REASONING_SEGMENTS\n ) {\n return current;\n }\n const text = sanitizeText(addition, maxChars - used);\n if (!text) return current;\n const next = [...current];\n while (\n next.length < precedingToolCount &&\n next.length < MAX_A2A_ACTIVITY_REASONING_SEGMENTS\n ) {\n next.push(\"\");\n }\n if (next.length === precedingToolCount) {\n return [...next, text];\n }\n next[precedingToolCount] = `${next[precedingToolCount] ?? \"\"}${text}`;\n return next;\n}\n\nfunction appendToolCall(\n current: A2AAgentActivityToolCall[],\n tool: A2AAgentActivityToolCall,\n): A2AAgentActivityToolCall[] {\n return current.length < MAX_A2A_ACTIVITY_TOOL_CALLS\n ? [...current, tool]\n : current;\n}\n\nfunction settleToolCall(\n current: A2AAgentActivityToolCall[],\n tool: A2AAgentActivityToolCall,\n): A2AAgentActivityToolCall[] {\n for (let index = current.length - 1; index >= 0; index -= 1) {\n const existing = current[index];\n if (\n (tool.id && tool.id === existing.id) ||\n (!tool.id && tool.name === existing.name)\n ) {\n return current.map((value, itemIndex) =>\n itemIndex === index ? tool : value,\n );\n }\n }\n return appendToolCall(current, tool);\n}\n\nfunction sanitizeText(value: string, maxChars: number): string {\n return sanitizeToolErrorText(value)\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]/g, \"\")\n .slice(0, maxChars);\n}\n\nfunction sanitizeToolName(value: string): string {\n return sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_NAME_CHARS) || \"tool\";\n}\n\nfunction sanitizeToolId(value: string | undefined): string | undefined {\n const sanitized = value\n ? sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_ID_CHARS)\n : \"\";\n return sanitized || undefined;\n}\n\nfunction normalizeTimestamp(value: number): number {\n return isSafeInteger(value) ? value : Date.now();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isPhase(value: unknown): value is A2AAgentActivityPhase {\n return [\"reasoning\", \"tool\", \"responding\", \"complete\", \"error\"].includes(\n value as string,\n );\n}\n\nfunction isSafeReasoning(value: unknown): value is string[] {\n return (\n Array.isArray(value) &&\n value.length <= MAX_A2A_ACTIVITY_REASONING_SEGMENTS &&\n value.reduce(\n (total, text) =>\n total + (typeof text === \"string\" ? text.length : Infinity),\n 0,\n ) <= MAX_A2A_ACTIVITY_REASONING_CHARS &&\n value.every((text) => isSafeText(text, MAX_A2A_ACTIVITY_REASONING_CHARS))\n );\n}\n\nfunction isSafeToolCalls(value: unknown): value is A2AAgentActivityToolCall[] {\n return (\n Array.isArray(value) &&\n value.length <= MAX_A2A_ACTIVITY_TOOL_CALLS &&\n value.every(isSafeToolCall)\n );\n}\n\nfunction isSafeToolCall(value: unknown): value is A2AAgentActivityToolCall {\n if (!isRecord(value) || !isSafeToolName(value.name)) return false;\n return (\n (value.id === undefined || isSafeToolId(value.id)) &&\n (value.status === \"running\" ||\n value.status === \"completed\" ||\n value.status === \"failed\")\n );\n}\n\nfunction isSafeText(value: unknown, maxChars: number): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= maxChars &&\n value === sanitizeText(value, maxChars)\n );\n}\n\nfunction isSafeToolName(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= MAX_A2A_ACTIVITY_TOOL_NAME_CHARS &&\n value === sanitizeToolName(value)\n );\n}\n\nfunction isSafeToolId(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= MAX_A2A_ACTIVITY_TOOL_ID_CHARS &&\n value === sanitizeToolId(value)\n );\n}\n\nfunction activityCharacterCount(data: Record<string, unknown>): number {\n const reasoning = Array.isArray(data.reasoning)\n ? data.reasoning.reduce(\n (total, text) => total + (typeof text === \"string\" ? text.length : 0),\n 0,\n )\n : 0;\n const response =\n typeof data.responseText === \"string\" ? data.responseText.length : 0;\n const tools = Array.isArray(data.toolCalls)\n ? data.toolCalls.reduce((total, tool) => {\n if (!isRecord(tool)) return total;\n return (\n total +\n (typeof tool.name === \"string\" ? tool.name.length : 0) +\n (typeof tool.id === \"string\" ? tool.id.length : 0)\n );\n }, 0)\n : 0;\n return reasoning + response + tools;\n}\n"]}
|
package/dist/a2a/client.d.ts
CHANGED
|
@@ -128,6 +128,8 @@ export declare class A2AClient {
|
|
|
128
128
|
*/
|
|
129
129
|
export declare function callAgent(url: string, text: string, opts?: {
|
|
130
130
|
apiKey?: string;
|
|
131
|
+
/** Additional transport metadata. Receivers must not use it as identity. */
|
|
132
|
+
metadata?: Record<string, unknown>;
|
|
131
133
|
contextId?: string;
|
|
132
134
|
userEmail?: string;
|
|
133
135
|
orgDomain?: string;
|
package/dist/a2a/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/a2a/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/a2a/client.ts"],"names":[],"mappings":"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"}
|
package/dist/a2a/client.js
CHANGED
|
@@ -454,7 +454,7 @@ function isA2AAuthRejectionResponse(status, text) {
|
|
|
454
454
|
* identity (instead of blindly trusting metadata).
|
|
455
455
|
*/
|
|
456
456
|
export async function callAgent(url, text, opts) {
|
|
457
|
-
const metadata = {};
|
|
457
|
+
const metadata = { ...opts?.metadata };
|
|
458
458
|
if (opts?.userEmail)
|
|
459
459
|
metadata.userEmail = opts.userEmail;
|
|
460
460
|
if (opts?.orgDomain)
|