recoder-a2a-sdk 1.0.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/dist/audit-helpers.d.mts +209 -0
- package/dist/audit-helpers.d.ts +209 -0
- package/dist/audit-helpers.js +905 -0
- package/dist/audit-helpers.js.map +1 -0
- package/dist/audit-helpers.mjs +34 -0
- package/dist/audit-helpers.mjs.map +1 -0
- package/dist/chunk-7GY5FFBI.mjs +117 -0
- package/dist/chunk-7GY5FFBI.mjs.map +1 -0
- package/dist/chunk-AGD6G5N6.mjs +141 -0
- package/dist/chunk-AGD6G5N6.mjs.map +1 -0
- package/dist/chunk-BWCRJDUB.mjs +357 -0
- package/dist/chunk-BWCRJDUB.mjs.map +1 -0
- package/dist/chunk-DPFH2JIC.mjs +141 -0
- package/dist/chunk-DPFH2JIC.mjs.map +1 -0
- package/dist/chunk-EP2GHC3R.mjs +116 -0
- package/dist/chunk-EP2GHC3R.mjs.map +1 -0
- package/dist/chunk-JOZQDX7A.mjs +359 -0
- package/dist/chunk-JOZQDX7A.mjs.map +1 -0
- package/dist/chunk-MAA7JZ2Q.mjs +142 -0
- package/dist/chunk-MAA7JZ2Q.mjs.map +1 -0
- package/dist/chunk-QVOOBAUA.mjs +140 -0
- package/dist/chunk-QVOOBAUA.mjs.map +1 -0
- package/dist/chunk-T5GUBIFZ.mjs +358 -0
- package/dist/chunk-T5GUBIFZ.mjs.map +1 -0
- package/dist/chunk-WLNW7Y2H.mjs +636 -0
- package/dist/chunk-WLNW7Y2H.mjs.map +1 -0
- package/dist/chunk-XSELW6DU.mjs +356 -0
- package/dist/chunk-XSELW6DU.mjs.map +1 -0
- package/dist/envelope-builders.d.mts +189 -0
- package/dist/envelope-builders.d.ts +189 -0
- package/dist/envelope-builders.js +652 -0
- package/dist/envelope-builders.js.map +1 -0
- package/dist/envelope-builders.mjs +20 -0
- package/dist/envelope-builders.mjs.map +1 -0
- package/dist/error-mapping.d.mts +132 -0
- package/dist/error-mapping.d.ts +132 -0
- package/dist/error-mapping.js +642 -0
- package/dist/error-mapping.js.map +1 -0
- package/dist/error-mapping.mjs +16 -0
- package/dist/error-mapping.mjs.map +1 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +1798 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +153 -0
- package/dist/index.mjs.map +1 -0
- package/dist/state-mapping.d.mts +139 -0
- package/dist/state-mapping.d.ts +139 -0
- package/dist/state-mapping.js +641 -0
- package/dist/state-mapping.js.map +1 -0
- package/dist/state-mapping.mjs +28 -0
- package/dist/state-mapping.mjs.map +1 -0
- package/dist/validation.d.mts +117 -0
- package/dist/validation.d.ts +117 -0
- package/dist/validation.js +850 -0
- package/dist/validation.js.map +1 -0
- package/dist/validation.mjs +22 -0
- package/dist/validation.mjs.map +1 -0
- package/package.json +18 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// src/envelope-builders.ts
|
|
2
|
+
import {
|
|
3
|
+
TaskStateEnum,
|
|
4
|
+
createTaskEnvelope,
|
|
5
|
+
transitionTaskEnvelope
|
|
6
|
+
} from "@recoder/shared/a2a/schemas";
|
|
7
|
+
function buildCodexEnvelope(input, options) {
|
|
8
|
+
const connectorMeta = {
|
|
9
|
+
...options?.connector_metadata
|
|
10
|
+
};
|
|
11
|
+
if (options?.model) connectorMeta.model = options.model;
|
|
12
|
+
if (options?.endpoint) connectorMeta.endpoint = options.endpoint;
|
|
13
|
+
const connector = {
|
|
14
|
+
platform: "codex",
|
|
15
|
+
protocol: "jsonrpc",
|
|
16
|
+
connector_id: options?.connector_id ?? "codex-v1",
|
|
17
|
+
name: "Codex Adapter",
|
|
18
|
+
metadata: Object.keys(connectorMeta).length > 0 ? connectorMeta : void 0
|
|
19
|
+
};
|
|
20
|
+
const assignee = input.assignee ?? {
|
|
21
|
+
agent_id: `codex-agent-${input.workspace_id}`,
|
|
22
|
+
platform: "codex",
|
|
23
|
+
name: "Codex Agent"
|
|
24
|
+
};
|
|
25
|
+
return createTaskEnvelope({
|
|
26
|
+
id: input.id,
|
|
27
|
+
workspace_id: input.workspace_id,
|
|
28
|
+
thread_id: input.thread_id,
|
|
29
|
+
trace_id: input.trace_id,
|
|
30
|
+
parent_id: input.parent_id,
|
|
31
|
+
requester: input.requester,
|
|
32
|
+
assignee,
|
|
33
|
+
connector,
|
|
34
|
+
payload: input.payload,
|
|
35
|
+
metadata: input.metadata,
|
|
36
|
+
tags: input.tags,
|
|
37
|
+
initial_state: input.initial_state,
|
|
38
|
+
now: input.now
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function buildClaudeEnvelope(input, options) {
|
|
42
|
+
const connectorMeta = {
|
|
43
|
+
...options?.connector_metadata
|
|
44
|
+
};
|
|
45
|
+
if (options?.model) connectorMeta.model = options.model;
|
|
46
|
+
if (options?.endpoint) connectorMeta.endpoint = options.endpoint;
|
|
47
|
+
if (options?.max_tokens !== void 0) connectorMeta.max_tokens = options.max_tokens;
|
|
48
|
+
const connector = {
|
|
49
|
+
platform: "claude_code",
|
|
50
|
+
protocol: "jsonrpc",
|
|
51
|
+
connector_id: options?.connector_id ?? "claude-code-v1",
|
|
52
|
+
name: "Claude Code Adapter",
|
|
53
|
+
metadata: Object.keys(connectorMeta).length > 0 ? connectorMeta : void 0
|
|
54
|
+
};
|
|
55
|
+
const assignee = input.assignee ?? {
|
|
56
|
+
agent_id: `claude-agent-${input.workspace_id}`,
|
|
57
|
+
platform: "claude_code",
|
|
58
|
+
name: "Claude Code Agent"
|
|
59
|
+
};
|
|
60
|
+
return createTaskEnvelope({
|
|
61
|
+
id: input.id,
|
|
62
|
+
workspace_id: input.workspace_id,
|
|
63
|
+
thread_id: input.thread_id,
|
|
64
|
+
trace_id: input.trace_id,
|
|
65
|
+
parent_id: input.parent_id,
|
|
66
|
+
requester: input.requester,
|
|
67
|
+
assignee,
|
|
68
|
+
connector,
|
|
69
|
+
payload: input.payload,
|
|
70
|
+
metadata: input.metadata,
|
|
71
|
+
tags: input.tags,
|
|
72
|
+
initial_state: input.initial_state,
|
|
73
|
+
now: input.now
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function completeEnvelope(envelope, result, options) {
|
|
77
|
+
const transitioned = transitionTaskEnvelope(envelope, TaskStateEnum.Completed, options);
|
|
78
|
+
return {
|
|
79
|
+
...transitioned,
|
|
80
|
+
result
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function failEnvelope(envelope, error, options) {
|
|
84
|
+
const transitioned = transitionTaskEnvelope(envelope, TaskStateEnum.Failed, options);
|
|
85
|
+
return {
|
|
86
|
+
...transitioned,
|
|
87
|
+
error
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function cancelEnvelope(envelope, options) {
|
|
91
|
+
return transitionTaskEnvelope(envelope, TaskStateEnum.Cancelled, options);
|
|
92
|
+
}
|
|
93
|
+
function startEnvelope(envelope, options) {
|
|
94
|
+
return transitionTaskEnvelope(envelope, TaskStateEnum.Working, options);
|
|
95
|
+
}
|
|
96
|
+
function a2aErrorToTaskErrorInfo(a2aError) {
|
|
97
|
+
return {
|
|
98
|
+
code: a2aError.code,
|
|
99
|
+
category: a2aError.category,
|
|
100
|
+
message: a2aError.message,
|
|
101
|
+
severity: a2aError.severity,
|
|
102
|
+
retryable: a2aError.retryable,
|
|
103
|
+
details: a2aError.details
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export {
|
|
108
|
+
buildCodexEnvelope,
|
|
109
|
+
buildClaudeEnvelope,
|
|
110
|
+
completeEnvelope,
|
|
111
|
+
failEnvelope,
|
|
112
|
+
cancelEnvelope,
|
|
113
|
+
startEnvelope,
|
|
114
|
+
a2aErrorToTaskErrorInfo
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=chunk-EP2GHC3R.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/envelope-builders.ts"],"sourcesContent":["/**\n * @module envelope-builders\n *\n * Convenience factory functions for creating `TaskEnvelope` instances\n * pre-configured for specific connector platforms.\n *\n * These builders reduce boilerplate in adapter code by pre-filling the\n * `connector`, `requester`, and `assignee` fields with sensible defaults\n * for each platform while still allowing full override.\n *\n * @example\n * ```ts\n * import { buildCodexEnvelope, buildClaudeEnvelope } from '@recoder/a2a-sdk/envelope-builders';\n *\n * const codexEnv = buildCodexEnvelope({\n * id: 'task_01',\n * workspace_id: 'ws_abc',\n * thread_id: 'thr_def',\n * trace_id: '4bf92f3577b34da6a3ce929d0e0e4736',\n * requester: { agent_id: 'agent-pm', platform: 'recoder_pm' },\n * payload: { kind: 'text', text: 'Implement auth flow' },\n * });\n * ```\n */\n\nimport {\n type TaskEnvelope,\n type TaskAgentRef,\n type TaskConnectorInfo,\n type TaskState,\n type TaskResult,\n type TaskErrorInfo,\n type CreateTaskEnvelopeInput,\n TaskStateEnum,\n createTaskEnvelope,\n transitionTaskEnvelope,\n} from '@recoder/shared/a2a/schemas';\n\nimport type { RecoderPayload, RecoderAgentPlatform } from '@recoder/shared/a2a';\n\n// ---------------------------------------------------------------------------\n// Shared input type for connector envelope builders\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal input for a connector-specific envelope builder.\n * Fields that can be derived from the connector context are optional.\n */\nexport interface ConnectorEnvelopeInput {\n /** Unique task ID. */\n id: string;\n /** Workspace ID. */\n workspace_id: string;\n /** Thread ID. */\n thread_id: string;\n /** Trace ID (W3C Trace Context compatible). */\n trace_id: string;\n /** Optional parent span ID. */\n parent_id?: string;\n /** The requester agent reference. */\n requester: TaskAgentRef;\n /** Optional override for the assignee (defaults to the connector agent). */\n assignee?: TaskAgentRef;\n /** The task payload. */\n payload: RecoderPayload | RecoderPayload[];\n /** Optional metadata. */\n metadata?: Record<string, unknown>;\n /** Optional tags. */\n tags?: string[];\n /** Override the initial state (defaults to 'submitted'). */\n initial_state?: TaskState;\n /** Override the creation timestamp. */\n now?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Codex envelope builder\n// ---------------------------------------------------------------------------\n\n/**\n * Optional overrides specific to Codex envelopes.\n */\nexport interface CodexEnvelopeOptions {\n /** Override the Codex connector ID (defaults to 'codex-v1'). */\n connector_id?: string;\n /** Codex model name (stored in connector metadata). */\n model?: string;\n /** Codex API endpoint (stored in connector metadata). */\n endpoint?: string;\n /** Additional connector metadata. */\n connector_metadata?: Record<string, unknown>;\n}\n\n/**\n * Build a `TaskEnvelope` pre-configured for the Codex connector.\n *\n * Defaults:\n * - `connector.platform`: `'codex'`\n * - `connector.protocol`: `'jsonrpc'`\n * - `connector.connector_id`: `'codex-v1'`\n * - `assignee.platform`: `'codex'`\n *\n * @param input - The core envelope fields.\n * @param options - Optional Codex-specific overrides.\n * @returns A fully populated `TaskEnvelope`.\n */\nexport function buildCodexEnvelope(\n input: ConnectorEnvelopeInput,\n options?: CodexEnvelopeOptions,\n): TaskEnvelope {\n const connectorMeta: Record<string, unknown> = {\n ...options?.connector_metadata,\n };\n if (options?.model) connectorMeta.model = options.model;\n if (options?.endpoint) connectorMeta.endpoint = options.endpoint;\n\n const connector: TaskConnectorInfo = {\n platform: 'codex',\n protocol: 'jsonrpc',\n connector_id: options?.connector_id ?? 'codex-v1',\n name: 'Codex Adapter',\n metadata: Object.keys(connectorMeta).length > 0 ? connectorMeta : undefined,\n };\n\n const assignee: TaskAgentRef = input.assignee ?? {\n agent_id: `codex-agent-${input.workspace_id}`,\n platform: 'codex',\n name: 'Codex Agent',\n };\n\n return createTaskEnvelope({\n id: input.id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n trace_id: input.trace_id,\n parent_id: input.parent_id,\n requester: input.requester,\n assignee,\n connector,\n payload: input.payload,\n metadata: input.metadata,\n tags: input.tags,\n initial_state: input.initial_state,\n now: input.now,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Claude Code envelope builder\n// ---------------------------------------------------------------------------\n\n/**\n * Optional overrides specific to Claude Code envelopes.\n */\nexport interface ClaudeEnvelopeOptions {\n /** Override the Claude connector ID (defaults to 'claude-code-v1'). */\n connector_id?: string;\n /** Claude model name (stored in connector metadata). */\n model?: string;\n /** Claude API endpoint (stored in connector metadata). */\n endpoint?: string;\n /** Maximum tokens for the Claude session. */\n max_tokens?: number;\n /** Additional connector metadata. */\n connector_metadata?: Record<string, unknown>;\n}\n\n/**\n * Build a `TaskEnvelope` pre-configured for the Claude Code connector.\n *\n * Defaults:\n * - `connector.platform`: `'claude_code'`\n * - `connector.protocol`: `'jsonrpc'`\n * - `connector.connector_id`: `'claude-code-v1'`\n * - `assignee.platform`: `'claude_code'`\n *\n * @param input - The core envelope fields.\n * @param options - Optional Claude-specific overrides.\n * @returns A fully populated `TaskEnvelope`.\n */\nexport function buildClaudeEnvelope(\n input: ConnectorEnvelopeInput,\n options?: ClaudeEnvelopeOptions,\n): TaskEnvelope {\n const connectorMeta: Record<string, unknown> = {\n ...options?.connector_metadata,\n };\n if (options?.model) connectorMeta.model = options.model;\n if (options?.endpoint) connectorMeta.endpoint = options.endpoint;\n if (options?.max_tokens !== undefined) connectorMeta.max_tokens = options.max_tokens;\n\n const connector: TaskConnectorInfo = {\n platform: 'claude_code',\n protocol: 'jsonrpc',\n connector_id: options?.connector_id ?? 'claude-code-v1',\n name: 'Claude Code Adapter',\n metadata: Object.keys(connectorMeta).length > 0 ? connectorMeta : undefined,\n };\n\n const assignee: TaskAgentRef = input.assignee ?? {\n agent_id: `claude-agent-${input.workspace_id}`,\n platform: 'claude_code',\n name: 'Claude Code Agent',\n };\n\n return createTaskEnvelope({\n id: input.id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n trace_id: input.trace_id,\n parent_id: input.parent_id,\n requester: input.requester,\n assignee,\n connector,\n payload: input.payload,\n metadata: input.metadata,\n tags: input.tags,\n initial_state: input.initial_state,\n now: input.now,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Envelope lifecycle helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Apply a result to a completed task envelope.\n *\n * Transitions the envelope to `completed` and attaches the result payload.\n *\n * @param envelope - The current task envelope (must be in a non-terminal state).\n * @param result - The result data.\n * @param options - Optional reason and actor for the transition.\n * @returns The updated envelope with state `completed` and the result attached.\n */\nexport function completeEnvelope(\n envelope: TaskEnvelope,\n result: TaskResult,\n options?: { reason?: string; triggered_by?: string; now?: string },\n): TaskEnvelope {\n const transitioned = transitionTaskEnvelope(envelope, TaskStateEnum.Completed, options);\n return {\n ...transitioned,\n result,\n };\n}\n\n/**\n * Apply an error to a failed task envelope.\n *\n * Transitions the envelope to `failed` and attaches the error info.\n *\n * @param envelope - The current task envelope (must be in a non-terminal state).\n * @param error - The error information.\n * @param options - Optional reason and actor for the transition.\n * @returns The updated envelope with state `failed` and the error attached.\n */\nexport function failEnvelope(\n envelope: TaskEnvelope,\n error: TaskErrorInfo,\n options?: { reason?: string; triggered_by?: string; now?: string },\n): TaskEnvelope {\n const transitioned = transitionTaskEnvelope(envelope, TaskStateEnum.Failed, options);\n return {\n ...transitioned,\n error,\n };\n}\n\n/**\n * Cancel a task envelope.\n *\n * Transitions the envelope to `cancelled`.\n *\n * @param envelope - The current task envelope.\n * @param options - Optional reason and actor for the transition.\n * @returns The updated envelope with state `cancelled`.\n */\nexport function cancelEnvelope(\n envelope: TaskEnvelope,\n options?: { reason?: string; triggered_by?: string; now?: string },\n): TaskEnvelope {\n return transitionTaskEnvelope(envelope, TaskStateEnum.Cancelled, options);\n}\n\n/**\n * Start working on a task envelope.\n *\n * Transitions the envelope from `submitted` to `working`.\n *\n * @param envelope - The current task envelope (must be in `submitted` state).\n * @param options - Optional reason and actor for the transition.\n * @returns The updated envelope with state `working`.\n */\nexport function startEnvelope(\n envelope: TaskEnvelope,\n options?: { reason?: string; triggered_by?: string; now?: string },\n): TaskEnvelope {\n return transitionTaskEnvelope(envelope, TaskStateEnum.Working, options);\n}\n\n// ---------------------------------------------------------------------------\n// Utility: Convert A2AError to TaskErrorInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a canonical `A2AError` to the `TaskErrorInfo` shape expected\n * by the `TaskEnvelope.error` field.\n *\n * @param a2aError - The source A2AError.\n * @returns A `TaskErrorInfo` suitable for embedding in an envelope.\n */\nexport function a2aErrorToTaskErrorInfo(a2aError: {\n code: string;\n category: string;\n message: string;\n severity: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n}): TaskErrorInfo {\n return {\n code: a2aError.code,\n category: a2aError.category,\n message: a2aError.message,\n severity: a2aError.severity as TaskErrorInfo['severity'],\n retryable: a2aError.retryable,\n details: a2aError.details,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AuditActorKindEnum,
|
|
3
|
+
AuditEventTypeEnum,
|
|
4
|
+
AuditSeverityEnum,
|
|
5
|
+
AuditTargetKindEnum,
|
|
6
|
+
createAuditEvent
|
|
7
|
+
} from "./chunk-WLNW7Y2H.mjs";
|
|
8
|
+
|
|
9
|
+
// src/audit-helpers.ts
|
|
10
|
+
function agentActor(agentId, platform, name) {
|
|
11
|
+
return {
|
|
12
|
+
kind: AuditActorKindEnum.Agent,
|
|
13
|
+
id: agentId,
|
|
14
|
+
platform,
|
|
15
|
+
name
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function connectorActor(connectorId, platform, name) {
|
|
19
|
+
return {
|
|
20
|
+
kind: AuditActorKindEnum.Connector,
|
|
21
|
+
id: connectorId,
|
|
22
|
+
platform,
|
|
23
|
+
name
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function systemActor(systemId = "control-plane") {
|
|
27
|
+
return {
|
|
28
|
+
kind: AuditActorKindEnum.System,
|
|
29
|
+
id: systemId,
|
|
30
|
+
name: "A2A Control Plane"
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function taskTarget(taskId) {
|
|
34
|
+
return {
|
|
35
|
+
kind: AuditTargetKindEnum.Task,
|
|
36
|
+
id: taskId
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function connectorTarget(connectorId, name) {
|
|
40
|
+
return {
|
|
41
|
+
kind: AuditTargetKindEnum.Connector,
|
|
42
|
+
id: connectorId,
|
|
43
|
+
name
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function emitTaskSubmitted(input) {
|
|
47
|
+
return createAuditEvent({
|
|
48
|
+
id: input.id,
|
|
49
|
+
event_type: AuditEventTypeEnum.TaskSubmitted,
|
|
50
|
+
severity: AuditSeverityEnum.Info,
|
|
51
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
52
|
+
target: taskTarget(input.task_id),
|
|
53
|
+
trace_id: input.trace_id,
|
|
54
|
+
workspace_id: input.workspace_id,
|
|
55
|
+
thread_id: input.thread_id,
|
|
56
|
+
task_id: input.task_id,
|
|
57
|
+
parent_event_id: input.parent_event_id,
|
|
58
|
+
metadata: input.metadata,
|
|
59
|
+
tags: input.tags,
|
|
60
|
+
now: input.now
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function emitTaskStarted(input) {
|
|
64
|
+
return createAuditEvent({
|
|
65
|
+
id: input.id,
|
|
66
|
+
event_type: AuditEventTypeEnum.TaskStarted,
|
|
67
|
+
severity: AuditSeverityEnum.Info,
|
|
68
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
69
|
+
target: taskTarget(input.task_id),
|
|
70
|
+
trace_id: input.trace_id,
|
|
71
|
+
workspace_id: input.workspace_id,
|
|
72
|
+
thread_id: input.thread_id,
|
|
73
|
+
task_id: input.task_id,
|
|
74
|
+
parent_event_id: input.parent_event_id,
|
|
75
|
+
metadata: input.metadata,
|
|
76
|
+
tags: input.tags,
|
|
77
|
+
now: input.now
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function emitTaskProgress(input) {
|
|
81
|
+
const metadata = { ...input.metadata };
|
|
82
|
+
if (input.progress_pct !== void 0) {
|
|
83
|
+
metadata.progress_pct = input.progress_pct;
|
|
84
|
+
}
|
|
85
|
+
return createAuditEvent({
|
|
86
|
+
id: input.id,
|
|
87
|
+
event_type: AuditEventTypeEnum.TaskProgress,
|
|
88
|
+
severity: AuditSeverityEnum.Info,
|
|
89
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
90
|
+
target: taskTarget(input.task_id),
|
|
91
|
+
trace_id: input.trace_id,
|
|
92
|
+
workspace_id: input.workspace_id,
|
|
93
|
+
thread_id: input.thread_id,
|
|
94
|
+
task_id: input.task_id,
|
|
95
|
+
parent_event_id: input.parent_event_id,
|
|
96
|
+
metadata,
|
|
97
|
+
tags: input.tags,
|
|
98
|
+
now: input.now
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function emitTaskInputRequired(input) {
|
|
102
|
+
return createAuditEvent({
|
|
103
|
+
id: input.id,
|
|
104
|
+
event_type: AuditEventTypeEnum.TaskInputRequired,
|
|
105
|
+
severity: AuditSeverityEnum.Info,
|
|
106
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
107
|
+
target: taskTarget(input.task_id),
|
|
108
|
+
trace_id: input.trace_id,
|
|
109
|
+
workspace_id: input.workspace_id,
|
|
110
|
+
thread_id: input.thread_id,
|
|
111
|
+
task_id: input.task_id,
|
|
112
|
+
parent_event_id: input.parent_event_id,
|
|
113
|
+
metadata: input.metadata,
|
|
114
|
+
tags: input.tags,
|
|
115
|
+
now: input.now
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function emitTaskCompleted(input) {
|
|
119
|
+
return createAuditEvent({
|
|
120
|
+
id: input.id,
|
|
121
|
+
event_type: AuditEventTypeEnum.TaskCompleted,
|
|
122
|
+
severity: AuditSeverityEnum.Info,
|
|
123
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
124
|
+
target: taskTarget(input.task_id),
|
|
125
|
+
trace_id: input.trace_id,
|
|
126
|
+
workspace_id: input.workspace_id,
|
|
127
|
+
thread_id: input.thread_id,
|
|
128
|
+
task_id: input.task_id,
|
|
129
|
+
parent_event_id: input.parent_event_id,
|
|
130
|
+
duration_ms: input.duration_ms,
|
|
131
|
+
metadata: input.metadata,
|
|
132
|
+
tags: input.tags,
|
|
133
|
+
now: input.now
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
function emitTaskFailed(input) {
|
|
137
|
+
const metadata = { ...input.metadata };
|
|
138
|
+
if (input.error_code) metadata.error_code = input.error_code;
|
|
139
|
+
if (input.error_message) metadata.error_message = input.error_message;
|
|
140
|
+
return createAuditEvent({
|
|
141
|
+
id: input.id,
|
|
142
|
+
event_type: AuditEventTypeEnum.TaskFailed,
|
|
143
|
+
severity: AuditSeverityEnum.Error,
|
|
144
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
145
|
+
target: taskTarget(input.task_id),
|
|
146
|
+
trace_id: input.trace_id,
|
|
147
|
+
workspace_id: input.workspace_id,
|
|
148
|
+
thread_id: input.thread_id,
|
|
149
|
+
task_id: input.task_id,
|
|
150
|
+
parent_event_id: input.parent_event_id,
|
|
151
|
+
duration_ms: input.duration_ms,
|
|
152
|
+
metadata,
|
|
153
|
+
tags: input.tags,
|
|
154
|
+
now: input.now
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function emitTaskCancelled(input) {
|
|
158
|
+
const metadata = { ...input.metadata };
|
|
159
|
+
if (input.reason) metadata.cancellation_reason = input.reason;
|
|
160
|
+
return createAuditEvent({
|
|
161
|
+
id: input.id,
|
|
162
|
+
event_type: AuditEventTypeEnum.TaskCancelled,
|
|
163
|
+
severity: AuditSeverityEnum.Info,
|
|
164
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
165
|
+
target: taskTarget(input.task_id),
|
|
166
|
+
trace_id: input.trace_id,
|
|
167
|
+
workspace_id: input.workspace_id,
|
|
168
|
+
thread_id: input.thread_id,
|
|
169
|
+
task_id: input.task_id,
|
|
170
|
+
parent_event_id: input.parent_event_id,
|
|
171
|
+
metadata,
|
|
172
|
+
tags: input.tags,
|
|
173
|
+
now: input.now
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
function emitConnectorAttached(input) {
|
|
177
|
+
return createAuditEvent({
|
|
178
|
+
id: input.id,
|
|
179
|
+
event_type: AuditEventTypeEnum.ConnectorAttached,
|
|
180
|
+
severity: AuditSeverityEnum.Info,
|
|
181
|
+
actor: systemActor(),
|
|
182
|
+
target: connectorTarget(input.connector_id, input.connector_name),
|
|
183
|
+
trace_id: input.trace_id,
|
|
184
|
+
workspace_id: input.workspace_id,
|
|
185
|
+
thread_id: input.thread_id,
|
|
186
|
+
task_id: input.task_id,
|
|
187
|
+
parent_event_id: input.parent_event_id,
|
|
188
|
+
metadata: {
|
|
189
|
+
...input.metadata,
|
|
190
|
+
connector_platform: input.connector_platform
|
|
191
|
+
},
|
|
192
|
+
tags: input.tags,
|
|
193
|
+
now: input.now
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function emitConnectorHealth(input) {
|
|
197
|
+
return createAuditEvent({
|
|
198
|
+
id: input.id,
|
|
199
|
+
event_type: AuditEventTypeEnum.ConnectorHealth,
|
|
200
|
+
severity: input.healthy ? AuditSeverityEnum.Info : AuditSeverityEnum.Warning,
|
|
201
|
+
actor: connectorActor(input.connector_id, input.connector_platform, input.connector_name),
|
|
202
|
+
target: connectorTarget(input.connector_id, input.connector_name),
|
|
203
|
+
trace_id: input.trace_id,
|
|
204
|
+
workspace_id: input.workspace_id,
|
|
205
|
+
thread_id: input.thread_id,
|
|
206
|
+
task_id: input.task_id,
|
|
207
|
+
parent_event_id: input.parent_event_id,
|
|
208
|
+
metadata: {
|
|
209
|
+
...input.metadata,
|
|
210
|
+
healthy: input.healthy,
|
|
211
|
+
...input.latency_ms !== void 0 ? { latency_ms: input.latency_ms } : {}
|
|
212
|
+
},
|
|
213
|
+
tags: input.tags,
|
|
214
|
+
now: input.now
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function emitConnectorError(input) {
|
|
218
|
+
return createAuditEvent({
|
|
219
|
+
id: input.id,
|
|
220
|
+
event_type: AuditEventTypeEnum.ConnectorError,
|
|
221
|
+
severity: AuditSeverityEnum.Error,
|
|
222
|
+
actor: connectorActor(input.connector_id, input.connector_platform, input.connector_name),
|
|
223
|
+
target: connectorTarget(input.connector_id, input.connector_name),
|
|
224
|
+
trace_id: input.trace_id,
|
|
225
|
+
workspace_id: input.workspace_id,
|
|
226
|
+
thread_id: input.thread_id,
|
|
227
|
+
task_id: input.task_id,
|
|
228
|
+
parent_event_id: input.parent_event_id,
|
|
229
|
+
metadata: {
|
|
230
|
+
...input.metadata,
|
|
231
|
+
...input.error_code ? { error_code: input.error_code } : {},
|
|
232
|
+
error_message: input.error_message
|
|
233
|
+
},
|
|
234
|
+
tags: input.tags,
|
|
235
|
+
now: input.now
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
function emitPolicyChecked(input) {
|
|
239
|
+
const policyContext = {
|
|
240
|
+
action: input.action,
|
|
241
|
+
rule: input.rule,
|
|
242
|
+
approved: input.approved,
|
|
243
|
+
reason: input.reason,
|
|
244
|
+
agent_id: input.agent_id
|
|
245
|
+
};
|
|
246
|
+
return createAuditEvent({
|
|
247
|
+
id: input.id,
|
|
248
|
+
event_type: AuditEventTypeEnum.PolicyChecked,
|
|
249
|
+
severity: AuditSeverityEnum.Info,
|
|
250
|
+
actor: systemActor("policy-engine"),
|
|
251
|
+
target: taskTarget(input.task_id),
|
|
252
|
+
trace_id: input.trace_id,
|
|
253
|
+
workspace_id: input.workspace_id,
|
|
254
|
+
thread_id: input.thread_id,
|
|
255
|
+
task_id: input.task_id,
|
|
256
|
+
parent_event_id: input.parent_event_id,
|
|
257
|
+
duration_ms: input.duration_ms,
|
|
258
|
+
policy: policyContext,
|
|
259
|
+
metadata: input.metadata,
|
|
260
|
+
tags: input.tags,
|
|
261
|
+
now: input.now
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
function emitPolicyApproved(input) {
|
|
265
|
+
return createAuditEvent({
|
|
266
|
+
id: input.id,
|
|
267
|
+
event_type: AuditEventTypeEnum.PolicyApproved,
|
|
268
|
+
severity: AuditSeverityEnum.Info,
|
|
269
|
+
actor: systemActor("policy-engine"),
|
|
270
|
+
target: taskTarget(input.task_id),
|
|
271
|
+
trace_id: input.trace_id,
|
|
272
|
+
workspace_id: input.workspace_id,
|
|
273
|
+
thread_id: input.thread_id,
|
|
274
|
+
task_id: input.task_id,
|
|
275
|
+
parent_event_id: input.parent_event_id,
|
|
276
|
+
duration_ms: input.duration_ms,
|
|
277
|
+
policy: {
|
|
278
|
+
action: input.action,
|
|
279
|
+
rule: input.rule,
|
|
280
|
+
approved: true,
|
|
281
|
+
reason: input.reason,
|
|
282
|
+
agent_id: input.agent_id
|
|
283
|
+
},
|
|
284
|
+
metadata: input.metadata,
|
|
285
|
+
tags: input.tags,
|
|
286
|
+
now: input.now
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
function emitPolicyDenied(input) {
|
|
290
|
+
return createAuditEvent({
|
|
291
|
+
id: input.id,
|
|
292
|
+
event_type: AuditEventTypeEnum.PolicyDenied,
|
|
293
|
+
severity: AuditSeverityEnum.Warning,
|
|
294
|
+
actor: systemActor("policy-engine"),
|
|
295
|
+
target: taskTarget(input.task_id),
|
|
296
|
+
trace_id: input.trace_id,
|
|
297
|
+
workspace_id: input.workspace_id,
|
|
298
|
+
thread_id: input.thread_id,
|
|
299
|
+
task_id: input.task_id,
|
|
300
|
+
parent_event_id: input.parent_event_id,
|
|
301
|
+
duration_ms: input.duration_ms,
|
|
302
|
+
policy: {
|
|
303
|
+
action: input.action,
|
|
304
|
+
rule: input.rule,
|
|
305
|
+
approved: false,
|
|
306
|
+
reason: input.reason,
|
|
307
|
+
agent_id: input.agent_id
|
|
308
|
+
},
|
|
309
|
+
metadata: input.metadata,
|
|
310
|
+
tags: input.tags,
|
|
311
|
+
now: input.now
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
var STATE_TO_EVENT_TYPE = {
|
|
315
|
+
submitted: AuditEventTypeEnum.TaskSubmitted,
|
|
316
|
+
working: AuditEventTypeEnum.TaskStarted,
|
|
317
|
+
"input-required": AuditEventTypeEnum.TaskInputRequired,
|
|
318
|
+
completed: AuditEventTypeEnum.TaskCompleted,
|
|
319
|
+
failed: AuditEventTypeEnum.TaskFailed,
|
|
320
|
+
cancelled: AuditEventTypeEnum.TaskCancelled
|
|
321
|
+
};
|
|
322
|
+
function emitAuditForTransition(input, newState) {
|
|
323
|
+
const eventType = STATE_TO_EVENT_TYPE[newState] ?? AuditEventTypeEnum.TaskProgress;
|
|
324
|
+
const severity = newState === "failed" ? AuditSeverityEnum.Error : newState === "cancelled" ? AuditSeverityEnum.Warning : AuditSeverityEnum.Info;
|
|
325
|
+
return createAuditEvent({
|
|
326
|
+
id: input.id,
|
|
327
|
+
event_type: eventType,
|
|
328
|
+
severity,
|
|
329
|
+
actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),
|
|
330
|
+
target: taskTarget(input.task_id),
|
|
331
|
+
trace_id: input.trace_id,
|
|
332
|
+
workspace_id: input.workspace_id,
|
|
333
|
+
thread_id: input.thread_id,
|
|
334
|
+
task_id: input.task_id,
|
|
335
|
+
parent_event_id: input.parent_event_id,
|
|
336
|
+
duration_ms: input.duration_ms,
|
|
337
|
+
metadata: input.metadata,
|
|
338
|
+
tags: input.tags,
|
|
339
|
+
now: input.now
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export {
|
|
344
|
+
emitTaskSubmitted,
|
|
345
|
+
emitTaskStarted,
|
|
346
|
+
emitTaskProgress,
|
|
347
|
+
emitTaskInputRequired,
|
|
348
|
+
emitTaskCompleted,
|
|
349
|
+
emitTaskFailed,
|
|
350
|
+
emitTaskCancelled,
|
|
351
|
+
emitConnectorAttached,
|
|
352
|
+
emitConnectorHealth,
|
|
353
|
+
emitConnectorError,
|
|
354
|
+
emitPolicyChecked,
|
|
355
|
+
emitPolicyApproved,
|
|
356
|
+
emitPolicyDenied,
|
|
357
|
+
emitAuditForTransition
|
|
358
|
+
};
|
|
359
|
+
//# sourceMappingURL=chunk-JOZQDX7A.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/audit-helpers.ts"],"sourcesContent":["/**\n * @module audit-helpers\n *\n * High-level audit event emitter helpers for common A2A operations.\n *\n * Instead of manually constructing `CreateAuditEventInput` objects for every\n * lifecycle event, adapter code can call these type-safe helper functions\n * which pre-fill the `event_type`, `actor`, `target`, and `severity` fields\n * for the most common scenarios.\n *\n * All helpers return an `AuditEvent` (not a side-effecting \"emit\"). The\n * caller is responsible for persisting or publishing the event through\n * the audit-log service transport layer.\n *\n * @example\n * ```ts\n * import { emitTaskSubmitted, emitConnectorInvoked } from '@recoder/a2a-sdk/audit-helpers';\n *\n * const evt = emitTaskSubmitted({\n * id: 'evt_01',\n * task_id: 'task_01',\n * workspace_id: 'ws_abc',\n * trace_id: '4bf92f3577b34da6a3ce929d0e0e4736',\n * actor_agent_id: 'agent-pm',\n * actor_platform: 'recoder_pm',\n * });\n * await auditLogService.persist(evt);\n * ```\n */\n\nimport {\n type AuditEvent,\n type AuditActor,\n type AuditTarget,\n type AuditSeverity,\n type AuditPolicyContext,\n AuditEventTypeEnum,\n AuditActorKindEnum,\n AuditTargetKindEnum,\n AuditSeverityEnum,\n createAuditEvent,\n} from '@recoder/shared/a2a/schemas';\n\nimport type { RecoderAgentPlatform } from '@recoder/shared/a2a';\n\n// ---------------------------------------------------------------------------\n// Common input base\n// ---------------------------------------------------------------------------\n\n/**\n * Common fields required by all audit event helpers.\n */\nexport interface AuditEventBase {\n /** Unique event ID. */\n id: string;\n /** Workspace ID. */\n workspace_id: string;\n /** Trace ID for correlation with the originating TaskEnvelope. */\n trace_id: string;\n /** Optional thread ID. */\n thread_id?: string;\n /** Optional parent event ID. */\n parent_event_id?: string;\n /** Optional additional metadata. */\n metadata?: Record<string, unknown>;\n /** Optional tags. */\n tags?: string[];\n /** Override the timestamp (defaults to now). */\n now?: string;\n}\n\n/**\n * Fields for task-scoped audit events.\n */\nexport interface TaskAuditEventInput extends AuditEventBase {\n /** The task ID that this event is about. */\n task_id: string;\n /** The actor agent ID. */\n actor_agent_id: string;\n /** The actor's platform. */\n actor_platform: RecoderAgentPlatform;\n /** Optional actor display name. */\n actor_name?: string;\n}\n\n/**\n * Fields for connector-scoped audit events.\n */\nexport interface ConnectorAuditEventInput extends AuditEventBase {\n /** The connector ID. */\n connector_id: string;\n /** The connector platform. */\n connector_platform: RecoderAgentPlatform;\n /** Optional task ID. */\n task_id?: string;\n /** Optional connector display name. */\n connector_name?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction agentActor(\n agentId: string,\n platform: RecoderAgentPlatform,\n name?: string,\n): AuditActor {\n return {\n kind: AuditActorKindEnum.Agent,\n id: agentId,\n platform,\n name,\n };\n}\n\nfunction connectorActor(\n connectorId: string,\n platform: RecoderAgentPlatform,\n name?: string,\n): AuditActor {\n return {\n kind: AuditActorKindEnum.Connector,\n id: connectorId,\n platform,\n name,\n };\n}\n\nfunction systemActor(systemId: string = 'control-plane'): AuditActor {\n return {\n kind: AuditActorKindEnum.System,\n id: systemId,\n name: 'A2A Control Plane',\n };\n}\n\nfunction taskTarget(taskId: string): AuditTarget {\n return {\n kind: AuditTargetKindEnum.Task,\n id: taskId,\n };\n}\n\nfunction connectorTarget(\n connectorId: string,\n name?: string,\n): AuditTarget {\n return {\n kind: AuditTargetKindEnum.Connector,\n id: connectorId,\n name,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Task lifecycle events\n// ---------------------------------------------------------------------------\n\n/**\n * Emit a `task.submitted` audit event.\n *\n * Call this when a new task envelope is created and submitted to the\n * control plane.\n */\nexport function emitTaskSubmitted(input: TaskAuditEventInput): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.TaskSubmitted,\n severity: AuditSeverityEnum.Info,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `task.started` audit event.\n *\n * Call this when a task transitions from `submitted` to `working`.\n */\nexport function emitTaskStarted(input: TaskAuditEventInput): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.TaskStarted,\n severity: AuditSeverityEnum.Info,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `task.progress` audit event.\n *\n * Call this for intermediate progress updates during task execution.\n */\nexport function emitTaskProgress(\n input: TaskAuditEventInput & { progress_pct?: number },\n): AuditEvent {\n const metadata = { ...input.metadata };\n if (input.progress_pct !== undefined) {\n metadata.progress_pct = input.progress_pct;\n }\n\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.TaskProgress,\n severity: AuditSeverityEnum.Info,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `task.input_required` audit event.\n *\n * Call this when the assignee agent needs additional input.\n */\nexport function emitTaskInputRequired(input: TaskAuditEventInput): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.TaskInputRequired,\n severity: AuditSeverityEnum.Info,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `task.completed` audit event.\n *\n * Call this when a task reaches the `completed` terminal state.\n */\nexport function emitTaskCompleted(\n input: TaskAuditEventInput & { duration_ms?: number },\n): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.TaskCompleted,\n severity: AuditSeverityEnum.Info,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n duration_ms: input.duration_ms,\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `task.failed` audit event.\n *\n * Call this when a task reaches the `failed` terminal state.\n */\nexport function emitTaskFailed(\n input: TaskAuditEventInput & {\n error_code?: string;\n error_message?: string;\n duration_ms?: number;\n },\n): AuditEvent {\n const metadata: Record<string, unknown> = { ...input.metadata };\n if (input.error_code) metadata.error_code = input.error_code;\n if (input.error_message) metadata.error_message = input.error_message;\n\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.TaskFailed,\n severity: AuditSeverityEnum.Error,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n duration_ms: input.duration_ms,\n metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `task.cancelled` audit event.\n *\n * Call this when a task is explicitly cancelled.\n */\nexport function emitTaskCancelled(\n input: TaskAuditEventInput & { reason?: string },\n): AuditEvent {\n const metadata: Record<string, unknown> = { ...input.metadata };\n if (input.reason) metadata.cancellation_reason = input.reason;\n\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.TaskCancelled,\n severity: AuditSeverityEnum.Info,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Connector events\n// ---------------------------------------------------------------------------\n\n/**\n * Emit a `connector.attached` audit event.\n *\n * Call this when a connector is attached to an agent for task execution.\n */\nexport function emitConnectorAttached(input: ConnectorAuditEventInput): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.ConnectorAttached,\n severity: AuditSeverityEnum.Info,\n actor: systemActor(),\n target: connectorTarget(input.connector_id, input.connector_name),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata: {\n ...input.metadata,\n connector_platform: input.connector_platform,\n },\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `connector.health` audit event.\n *\n * Call this when a connector emits a health check or diagnostic event.\n */\nexport function emitConnectorHealth(\n input: ConnectorAuditEventInput & {\n healthy: boolean;\n latency_ms?: number;\n },\n): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.ConnectorHealth,\n severity: input.healthy ? AuditSeverityEnum.Info : AuditSeverityEnum.Warning,\n actor: connectorActor(input.connector_id, input.connector_platform, input.connector_name),\n target: connectorTarget(input.connector_id, input.connector_name),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata: {\n ...input.metadata,\n healthy: input.healthy,\n ...(input.latency_ms !== undefined ? { latency_ms: input.latency_ms } : {}),\n },\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `connector.error` audit event.\n *\n * Call this when a connector encounters an error during task execution.\n */\nexport function emitConnectorError(\n input: ConnectorAuditEventInput & {\n error_code?: string;\n error_message: string;\n },\n): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.ConnectorError,\n severity: AuditSeverityEnum.Error,\n actor: connectorActor(input.connector_id, input.connector_platform, input.connector_name),\n target: connectorTarget(input.connector_id, input.connector_name),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n metadata: {\n ...input.metadata,\n ...(input.error_code ? { error_code: input.error_code } : {}),\n error_message: input.error_message,\n },\n tags: input.tags,\n now: input.now,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Policy events\n// ---------------------------------------------------------------------------\n\n/**\n * Input for policy audit events.\n */\nexport interface PolicyAuditEventInput extends AuditEventBase {\n /** The task ID the policy was checked for. */\n task_id: string;\n /** The agent ID the policy was evaluated against. */\n agent_id: string;\n /** The policy action (e.g. 'file:write', 'bash:exec'). */\n action: string;\n /** The rule that was applied ('auto', 'prompt', 'deny'). */\n rule: string;\n /** Whether the action was approved. */\n approved: boolean;\n /** Human-readable reason for the decision. */\n reason: string;\n /** Duration of the policy check. */\n duration_ms?: number;\n}\n\n/**\n * Emit a `policy.checked` audit event.\n *\n * Call this after a policy evaluation completes.\n */\nexport function emitPolicyChecked(input: PolicyAuditEventInput): AuditEvent {\n const policyContext: AuditPolicyContext = {\n action: input.action,\n rule: input.rule,\n approved: input.approved,\n reason: input.reason,\n agent_id: input.agent_id,\n };\n\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.PolicyChecked,\n severity: AuditSeverityEnum.Info,\n actor: systemActor('policy-engine'),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n duration_ms: input.duration_ms,\n policy: policyContext,\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `policy.approved` audit event.\n *\n * Convenience wrapper around `emitPolicyChecked` for approved actions.\n */\nexport function emitPolicyApproved(\n input: Omit<PolicyAuditEventInput, 'approved'>,\n): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.PolicyApproved,\n severity: AuditSeverityEnum.Info,\n actor: systemActor('policy-engine'),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n duration_ms: input.duration_ms,\n policy: {\n action: input.action,\n rule: input.rule,\n approved: true,\n reason: input.reason,\n agent_id: input.agent_id,\n },\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n/**\n * Emit a `policy.denied` audit event.\n *\n * Convenience wrapper for denied actions.\n */\nexport function emitPolicyDenied(\n input: Omit<PolicyAuditEventInput, 'approved'>,\n): AuditEvent {\n return createAuditEvent({\n id: input.id,\n event_type: AuditEventTypeEnum.PolicyDenied,\n severity: AuditSeverityEnum.Warning,\n actor: systemActor('policy-engine'),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n duration_ms: input.duration_ms,\n policy: {\n action: input.action,\n rule: input.rule,\n approved: false,\n reason: input.reason,\n agent_id: input.agent_id,\n },\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Compound helper: emit audit event from envelope transition\n// ---------------------------------------------------------------------------\n\n/**\n * Mapping from canonical TaskState to the appropriate audit event emitter.\n * Used by `emitAuditForTransition` to automatically produce the right\n * event type when a task envelope transitions.\n */\nconst STATE_TO_EVENT_TYPE = {\n submitted: AuditEventTypeEnum.TaskSubmitted,\n working: AuditEventTypeEnum.TaskStarted,\n 'input-required': AuditEventTypeEnum.TaskInputRequired,\n completed: AuditEventTypeEnum.TaskCompleted,\n failed: AuditEventTypeEnum.TaskFailed,\n cancelled: AuditEventTypeEnum.TaskCancelled,\n} as const;\n\n/**\n * Automatically emit the correct audit event type for a task state\n * transition. This is the preferred method for adapter code that processes\n * state changes and wants to emit a matching audit event without manually\n * switching on the state.\n *\n * @param input - The task audit event input.\n * @param newState - The canonical state the task transitioned to.\n * @returns An `AuditEvent` with the correct event_type for the transition.\n */\nexport function emitAuditForTransition(\n input: TaskAuditEventInput & { duration_ms?: number },\n newState: string,\n): AuditEvent {\n const eventType =\n STATE_TO_EVENT_TYPE[newState as keyof typeof STATE_TO_EVENT_TYPE] ??\n AuditEventTypeEnum.TaskProgress;\n\n const severity =\n newState === 'failed'\n ? AuditSeverityEnum.Error\n : newState === 'cancelled'\n ? AuditSeverityEnum.Warning\n : AuditSeverityEnum.Info;\n\n return createAuditEvent({\n id: input.id,\n event_type: eventType,\n severity,\n actor: agentActor(input.actor_agent_id, input.actor_platform, input.actor_name),\n target: taskTarget(input.task_id),\n trace_id: input.trace_id,\n workspace_id: input.workspace_id,\n thread_id: input.thread_id,\n task_id: input.task_id,\n parent_event_id: input.parent_event_id,\n duration_ms: input.duration_ms,\n metadata: input.metadata,\n tags: input.tags,\n now: input.now,\n });\n}\n"],"mappings":"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","names":[]}
|