@grackle-ai/core 0.131.0 → 0.132.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.
Files changed (92) hide show
  1. package/README.md +4 -2
  2. package/dist/ahp-mapper.d.ts +95 -0
  3. package/dist/ahp-mapper.d.ts.map +1 -0
  4. package/dist/ahp-mapper.js +499 -0
  5. package/dist/ahp-mapper.js.map +1 -0
  6. package/dist/ahp-session-state.d.ts +169 -0
  7. package/dist/ahp-session-state.d.ts.map +1 -0
  8. package/dist/ahp-session-state.js +474 -0
  9. package/dist/ahp-session-state.js.map +1 -0
  10. package/dist/auto-reconnect.js +5 -1
  11. package/dist/auto-reconnect.js.map +1 -1
  12. package/dist/budget-checker.d.ts.map +1 -1
  13. package/dist/budget-checker.js +2 -1
  14. package/dist/budget-checker.js.map +1 -1
  15. package/dist/compute-task-status.d.ts.map +1 -1
  16. package/dist/compute-task-status.js +1 -3
  17. package/dist/compute-task-status.js.map +1 -1
  18. package/dist/concurrency.d.ts.map +1 -1
  19. package/dist/concurrency.js +1 -1
  20. package/dist/concurrency.js.map +1 -1
  21. package/dist/credential-bundle.d.ts.map +1 -1
  22. package/dist/credential-bundle.js +12 -10
  23. package/dist/credential-bundle.js.map +1 -1
  24. package/dist/event-bus.d.ts.map +1 -1
  25. package/dist/event-bus.js.map +1 -1
  26. package/dist/event-processor.d.ts.map +1 -1
  27. package/dist/event-processor.js +105 -15
  28. package/dist/event-processor.js.map +1 -1
  29. package/dist/github-account-import.d.ts.map +1 -1
  30. package/dist/github-account-import.js +3 -1
  31. package/dist/github-account-import.js.map +1 -1
  32. package/dist/grpc-shared-utils.d.ts.map +1 -1
  33. package/dist/grpc-shared-utils.js.map +1 -1
  34. package/dist/index.d.ts +2 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +2 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/log-writer.d.ts.map +1 -1
  39. package/dist/log-writer.js +1 -5
  40. package/dist/log-writer.js.map +1 -1
  41. package/dist/logger.d.ts.map +1 -1
  42. package/dist/logger.js.map +1 -1
  43. package/dist/notification-router.d.ts.map +1 -1
  44. package/dist/notification-router.js +3 -1
  45. package/dist/notification-router.js.map +1 -1
  46. package/dist/persona-mapper.d.ts.map +1 -1
  47. package/dist/persona-mapper.js.map +1 -1
  48. package/dist/pipe-delivery.d.ts.map +1 -1
  49. package/dist/pipe-delivery.js +13 -7
  50. package/dist/pipe-delivery.js.map +1 -1
  51. package/dist/processor-registry.d.ts.map +1 -1
  52. package/dist/processor-registry.js.map +1 -1
  53. package/dist/reanimate-agent.d.ts.map +1 -1
  54. package/dist/reanimate-agent.js.map +1 -1
  55. package/dist/session-action-recorder.d.ts +2 -1
  56. package/dist/session-action-recorder.d.ts.map +1 -1
  57. package/dist/session-action-recorder.js +8 -1
  58. package/dist/session-action-recorder.js.map +1 -1
  59. package/dist/session-recovery.d.ts.map +1 -1
  60. package/dist/session-recovery.js +4 -3
  61. package/dist/session-recovery.js.map +1 -1
  62. package/dist/signals/signal-delivery.d.ts.map +1 -1
  63. package/dist/signals/signal-delivery.js.map +1 -1
  64. package/dist/spawn-context-registry.d.ts.map +1 -1
  65. package/dist/spawn-context-registry.js.map +1 -1
  66. package/dist/stream-hub.d.ts.map +1 -1
  67. package/dist/stream-hub.js +6 -2
  68. package/dist/stream-hub.js.map +1 -1
  69. package/dist/stream-registry.d.ts.map +1 -1
  70. package/dist/stream-registry.js +18 -8
  71. package/dist/stream-registry.js.map +1 -1
  72. package/dist/task-session.d.ts.map +1 -1
  73. package/dist/task-session.js +35 -14
  74. package/dist/task-session.js.map +1 -1
  75. package/dist/telemetry.d.ts.map +1 -1
  76. package/dist/telemetry.js.map +1 -1
  77. package/dist/test-utils/mock-database.d.ts +2 -0
  78. package/dist/test-utils/mock-database.d.ts.map +1 -1
  79. package/dist/test-utils/mock-database.js +20 -3
  80. package/dist/test-utils/mock-database.js.map +1 -1
  81. package/dist/token-push.d.ts.map +1 -1
  82. package/dist/token-push.js.map +1 -1
  83. package/dist/trace-context.d.ts.map +1 -1
  84. package/dist/trace-context.js +4 -4
  85. package/dist/trace-context.js.map +1 -1
  86. package/dist/transcript.d.ts.map +1 -1
  87. package/dist/transcript.js +3 -1
  88. package/dist/transcript.js.map +1 -1
  89. package/dist/version-check.d.ts.map +1 -1
  90. package/dist/version-check.js +19 -4
  91. package/dist/version-check.js.map +1 -1
  92. package/package.json +12 -10
package/README.md CHANGED
@@ -32,8 +32,10 @@ This package is consumed by `@grackle-ai/server` (the orchestrator) which wires
32
32
  ```typescript
33
33
  import {
34
34
  registerGrackleRoutes,
35
- registerAdapter, startHeartbeat,
36
- emit, subscribe,
35
+ registerAdapter,
36
+ startHeartbeat,
37
+ emit,
38
+ subscribe,
37
39
  createWsBridge,
38
40
  logger,
39
41
  } from "@grackle-ai/core";
@@ -0,0 +1,95 @@
1
+ /**
2
+ * AgentEvent → AHP SessionAction mapper (AHP HR1b / RFC #1292).
3
+ *
4
+ * Stateless function that translates a single PowerLine `AgentEvent` into one
5
+ * or more AHP `SessionAction` payloads. The mapper is stateless — it requires
6
+ * a `MapperContext` from the caller to track turn state and tool-call pairing.
7
+ *
8
+ * This mapper is an interim bridge while PowerLine still produces AgentEvents
9
+ * and the AHP host eventually takes over the transport (HR8).
10
+ *
11
+ * @module ahp-mapper
12
+ */
13
+ import type { powerline } from "@grackle-ai/common";
14
+ import { type StateAction } from "@grackle-ai/ahp";
15
+ /**
16
+ * Disposition of a single AgentEvent after mapping.
17
+ */
18
+ export type Disposition = "mapped" | "carried" | "dropped";
19
+ /**
20
+ * Metadata describing how an AgentEvent was handled.
21
+ */
22
+ export interface MappingNote {
23
+ /** Index of the AgentEvent in the stream (0-based). */
24
+ index: number;
25
+ /** The original AgentEvent type string. */
26
+ type: string;
27
+ /** Whether the event was mapped to AHP actions, carried as metadata, or dropped. */
28
+ disposition: Disposition;
29
+ /** Human-readable detail about the mapping decision. */
30
+ detail: string;
31
+ }
32
+ /**
33
+ * Context maintained by `SessionStateManager` and passed to the mapper.
34
+ * Tracks turn state and tool-call pairing across a stream of events.
35
+ */
36
+ export interface MapperContext {
37
+ /** ID of the currently active turn, or `undefined` if no turn has started. */
38
+ turnId?: string;
39
+ /**
40
+ * Stack of open tool call IDs (LIFO). Used for pairing `tool_result` events
41
+ * with their corresponding `tool_use` when `toolCallId` is not available.
42
+ */
43
+ openToolCalls: string[];
44
+ /**
45
+ * Monotonically increasing counter for generating unique part IDs within
46
+ * the current session.
47
+ */
48
+ partCounter: number;
49
+ /**
50
+ * Monotonically increasing event index. Stored in snapshots so delta replay
51
+ * can seed the starting index and generate consistent synthetic turn/tool IDs
52
+ * (e.g. `turn-${index}`) for events that lack explicit IDs.
53
+ */
54
+ eventIndex: number;
55
+ /**
56
+ * Accumulated `_meta` fields carried across events. The mapper merges
57
+ * cost and runtimeSessionId into this object.
58
+ */
59
+ metaAccumulator: {
60
+ /** Accumulated cost in millicents (AHP-upstream gap; rides on `_meta`). */
61
+ costMillicents?: number;
62
+ /** Runtime-provided session ID from the `runtime_session_id` event. */
63
+ runtimeSessionId?: string;
64
+ };
65
+ }
66
+ /** Result of mapping a single AgentEvent. */
67
+ export interface MapResult {
68
+ /** AHP StateAction[] produced from this event (all session-specific). */
69
+ actions: StateAction[];
70
+ /** Mapping disposition for this event (always zero or one). */
71
+ note?: MappingNote;
72
+ }
73
+ /**
74
+ * Map a PowerLine `AgentEvent` into AHP `SessionAction` payloads.
75
+ *
76
+ * | AgentEvent type | AHP action(s) | Disposition |
77
+ * |-----------------|---------------|-------------|
78
+ * | `turn_started` | `SessionTurnStarted` | mapped |
79
+ * | `turn_complete` | `SessionTurnComplete` | mapped |
80
+ * | `input_needed` | advisory only | dropped |
81
+ * | `text` | `SessionResponsePart(markdown)` | mapped |
82
+ * | `tool_use` | `SessionToolCallStart` + `SessionToolCallReady` | mapped |
83
+ * | `tool_result` | `SessionToolCallComplete` | mapped |
84
+ * | `usage` | (none — cost accumulated in `_meta`) | carried |
85
+ * | `error` (in-turn) | `SessionError` | mapped |
86
+ * | `error` (pre-turn) | `SessionCreationFailed` | mapped |
87
+ * | `status: failed` | `SessionError` or `SessionCreationFailed` | mapped |
88
+ * | `status: killed/terminated` | `SessionError` (abandoned turn) | conditional |
89
+ * | `status: completed/waiting_input/running` | dropped | dropped |
90
+ * | `system` (diagnostic) | dropped (OTLP telemetry) | carried |
91
+ * | `system` (non-diagnostic) | `SessionResponsePart(systemNotification)` | mapped |
92
+ * | `runtime_session_id` | `_meta.runtimeSessionId` | carried |
93
+ */
94
+ export declare function mapAgentEvent(event: powerline.AgentEvent, index: number, context: MapperContext): MapResult;
95
+ //# sourceMappingURL=ahp-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ahp-mapper.d.ts","sourceRoot":"","sources":["../src/ahp-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAML,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAYzB;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,WAAW,EAAE,WAAW,CAAC;IACzB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,EAAE;QACf,2EAA2E;QAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,uEAAuE;QACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,yEAAyE;IACzE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AA2CD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,CAAC,UAAU,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,SAAS,CA4cX"}
@@ -0,0 +1,499 @@
1
+ /**
2
+ * AgentEvent → AHP SessionAction mapper (AHP HR1b / RFC #1292).
3
+ *
4
+ * Stateless function that translates a single PowerLine `AgentEvent` into one
5
+ * or more AHP `SessionAction` payloads. The mapper is stateless — it requires
6
+ * a `MapperContext` from the caller to track turn state and tool-call pairing.
7
+ *
8
+ * This mapper is an interim bridge while PowerLine still produces AgentEvents
9
+ * and the AHP host eventually takes over the transport (HR8).
10
+ *
11
+ * @module ahp-mapper
12
+ */
13
+ import { ActionType, ToolCallConfirmationReason, ToolResultContentType, ResponsePartKind, } from "@grackle-ai/ahp";
14
+ /** Safely parse an event's content JSON, returning a record or undefined on failure. */
15
+ function safeParseContent(content) {
16
+ if (!content)
17
+ return undefined;
18
+ try {
19
+ return JSON.parse(content);
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ /** Build an ErrorInfo from a message string. */
26
+ function makeErrorInfo(message) {
27
+ return { message, errorType: "unknown" };
28
+ }
29
+ /** Build a ToolResultContent from a string. */
30
+ function makeTextResult(text) {
31
+ return { type: ToolResultContentType.Text, text };
32
+ }
33
+ /** Check whether a system event is a diagnostic (HR7) that routes to OTLP. */
34
+ function isDiagnosticEvent(event) {
35
+ if (event.diagnostic)
36
+ return true;
37
+ const parsed = safeParseContent(event.content);
38
+ if (parsed) {
39
+ const keys = Object.keys(parsed);
40
+ if ((keys.includes("span") || keys.includes("trace") || keys.includes("level")) &&
41
+ !keys.some((k) => k === "text" || k === "content" || k === "tool_name")) {
42
+ return true;
43
+ }
44
+ }
45
+ return false;
46
+ }
47
+ /**
48
+ * Get a string field from parsed JSON content with fallbacks.
49
+ * @param parsed - The parsed JSON object to look up.
50
+ * @param fields - Field names to try (in order).
51
+ * @param fallback - Literal fallback value if no field is found.
52
+ * @returns The first found field value as a string, or the fallback.
53
+ */
54
+ function str(parsed, fields, fallback) {
55
+ for (const field of fields) {
56
+ const val = parsed[field];
57
+ if (val !== undefined)
58
+ return String(val);
59
+ }
60
+ return fallback;
61
+ }
62
+ /**
63
+ * Map a PowerLine `AgentEvent` into AHP `SessionAction` payloads.
64
+ *
65
+ * | AgentEvent type | AHP action(s) | Disposition |
66
+ * |-----------------|---------------|-------------|
67
+ * | `turn_started` | `SessionTurnStarted` | mapped |
68
+ * | `turn_complete` | `SessionTurnComplete` | mapped |
69
+ * | `input_needed` | advisory only | dropped |
70
+ * | `text` | `SessionResponsePart(markdown)` | mapped |
71
+ * | `tool_use` | `SessionToolCallStart` + `SessionToolCallReady` | mapped |
72
+ * | `tool_result` | `SessionToolCallComplete` | mapped |
73
+ * | `usage` | (none — cost accumulated in `_meta`) | carried |
74
+ * | `error` (in-turn) | `SessionError` | mapped |
75
+ * | `error` (pre-turn) | `SessionCreationFailed` | mapped |
76
+ * | `status: failed` | `SessionError` or `SessionCreationFailed` | mapped |
77
+ * | `status: killed/terminated` | `SessionError` (abandoned turn) | conditional |
78
+ * | `status: completed/waiting_input/running` | dropped | dropped |
79
+ * | `system` (diagnostic) | dropped (OTLP telemetry) | carried |
80
+ * | `system` (non-diagnostic) | `SessionResponsePart(systemNotification)` | mapped |
81
+ * | `runtime_session_id` | `_meta.runtimeSessionId` | carried |
82
+ */
83
+ export function mapAgentEvent(event, index, context) {
84
+ const actions = [];
85
+ let note;
86
+ const { type, content, toolCallId, turnId } = event;
87
+ // Proto string fields default to "", treat empty as undefined
88
+ const eventTurnId = turnId || undefined;
89
+ const parsed = safeParseContent(content);
90
+ const hasParsed = parsed !== undefined;
91
+ switch (type) {
92
+ // ─── Turn lifecycle ────────────────────────────────────────────
93
+ case "turn_started": {
94
+ const userMessage = hasParsed ? str(parsed, ["user_message"], content || "") : content || "";
95
+ // Always derive a fresh turnId when eventTurnId is absent — don't inherit stale context.turnId
96
+ const derivedTurnId = eventTurnId || `turn-${index}`;
97
+ actions.push({
98
+ type: ActionType.SessionTurnStarted,
99
+ turnId: derivedTurnId,
100
+ userMessage: { text: userMessage },
101
+ });
102
+ context.turnId = derivedTurnId;
103
+ context.openToolCalls = [];
104
+ // partCounter is NOT reset here — it increments across turns so part IDs
105
+ // are globally unique within a session (part-0, part-1, … across all turns).
106
+ note = {
107
+ index,
108
+ type: "turn_started",
109
+ disposition: "mapped",
110
+ detail: `Mapped to SessionTurnStarted (turnId=${context.turnId})`,
111
+ };
112
+ break;
113
+ }
114
+ case "turn_complete": {
115
+ const turnId = eventTurnId || context.turnId;
116
+ if (turnId) {
117
+ actions.push({
118
+ type: ActionType.SessionTurnComplete,
119
+ turnId,
120
+ });
121
+ context.turnId = undefined;
122
+ context.openToolCalls = [];
123
+ note = {
124
+ index,
125
+ type: "turn_complete",
126
+ disposition: "mapped",
127
+ detail: `Mapped to SessionTurnComplete (turnId=${turnId})`,
128
+ };
129
+ }
130
+ else {
131
+ note = {
132
+ index,
133
+ type: "turn_complete",
134
+ disposition: "dropped",
135
+ detail: "No active turn to complete",
136
+ };
137
+ }
138
+ break;
139
+ }
140
+ // ─── Dropped: advisory only ────────────────────────────────────
141
+ case "input_needed": {
142
+ note = {
143
+ index,
144
+ type: "input_needed",
145
+ disposition: "dropped",
146
+ detail: "Advisory event — no structured elicitation content yet",
147
+ };
148
+ break;
149
+ }
150
+ // ─── Response parts ────────────────────────────────────────────
151
+ case "text": {
152
+ const turnId = eventTurnId || context.turnId;
153
+ if (!turnId) {
154
+ note = {
155
+ index,
156
+ type: "text",
157
+ disposition: "dropped",
158
+ detail: "No active turn for text part",
159
+ };
160
+ break;
161
+ }
162
+ const partId = `part-${context.partCounter++}`;
163
+ actions.push({
164
+ type: ActionType.SessionResponsePart,
165
+ turnId,
166
+ part: {
167
+ kind: ResponsePartKind.Markdown,
168
+ id: partId,
169
+ content: content || "",
170
+ },
171
+ });
172
+ note = {
173
+ index,
174
+ type: "text",
175
+ disposition: "mapped",
176
+ detail: `Mapped to SessionResponsePart (partId=${partId})`,
177
+ };
178
+ break;
179
+ }
180
+ // ─── Tool calls ────────────────────────────────────────────────
181
+ case "tool_use": {
182
+ const turnId = eventTurnId || context.turnId;
183
+ if (!turnId) {
184
+ note = {
185
+ index,
186
+ type: "tool_use",
187
+ disposition: "dropped",
188
+ detail: "No active turn for tool_use",
189
+ };
190
+ break;
191
+ }
192
+ const toolCallIdValue = toolCallId || `tc-${context.partCounter++}`;
193
+ const toolName = hasParsed
194
+ ? str(parsed, ["tool_name", "name"], "unknown_tool")
195
+ : "unknown_tool";
196
+ const displayName = hasParsed ? str(parsed, ["display_name"], toolName) : toolName;
197
+ const invocationMessage = hasParsed
198
+ ? str(parsed, ["invocation_message"], `Running ${toolName}`)
199
+ : `Running ${toolName}`;
200
+ // SessionToolCallStart
201
+ actions.push({
202
+ type: ActionType.SessionToolCallStart,
203
+ turnId,
204
+ toolCallId: toolCallIdValue,
205
+ toolName,
206
+ displayName,
207
+ });
208
+ // SessionToolCallReady with auto-confirmation
209
+ actions.push({
210
+ type: ActionType.SessionToolCallReady,
211
+ turnId,
212
+ toolCallId: toolCallIdValue,
213
+ invocationMessage,
214
+ confirmed: ToolCallConfirmationReason.NotNeeded,
215
+ });
216
+ context.openToolCalls.push(toolCallIdValue);
217
+ note = {
218
+ index,
219
+ type: "tool_use",
220
+ disposition: "mapped",
221
+ detail: `Mapped to SessionToolCallStart + SessionToolCallReady (toolCallId=${toolCallIdValue})`,
222
+ };
223
+ break;
224
+ }
225
+ case "tool_result": {
226
+ const turnId = eventTurnId || context.turnId;
227
+ if (!turnId) {
228
+ note = {
229
+ index,
230
+ type: "tool_result",
231
+ disposition: "dropped",
232
+ detail: "No active turn for tool_result",
233
+ };
234
+ break;
235
+ }
236
+ // Pair by first-class toolCallId (HR3), with LIFO stack fallback
237
+ const pairedToolCallId = toolCallId || context.openToolCalls.pop() || "";
238
+ // Remove matched id from stack when first-class toolCallId is provided
239
+ if (toolCallId) {
240
+ const idx = context.openToolCalls.indexOf(toolCallId);
241
+ if (idx !== -1) {
242
+ context.openToolCalls.splice(idx, 1);
243
+ }
244
+ }
245
+ if (!pairedToolCallId) {
246
+ note = {
247
+ index,
248
+ type: "tool_result",
249
+ disposition: "dropped",
250
+ detail: "No matching tool call for result",
251
+ };
252
+ break;
253
+ }
254
+ const isOk = hasParsed
255
+ ? "is_ok" in parsed
256
+ ? parsed.is_ok === true
257
+ : "success" in parsed
258
+ ? parsed.success === true
259
+ : true
260
+ : true;
261
+ const pastTenseMessage = hasParsed
262
+ ? str(parsed, ["past_tense_message"], content || "")
263
+ : content || "";
264
+ const resultText = hasParsed ? str(parsed, ["content"], content || "") : content || "";
265
+ actions.push({
266
+ type: ActionType.SessionToolCallComplete,
267
+ turnId,
268
+ toolCallId: pairedToolCallId,
269
+ result: {
270
+ success: isOk,
271
+ pastTenseMessage,
272
+ content: isOk ? [makeTextResult(resultText)] : undefined,
273
+ error: isOk ? undefined : { message: pastTenseMessage },
274
+ },
275
+ });
276
+ // System notification for successful result
277
+ if (isOk && content) {
278
+ const displayText = resultText.length > 200 ? resultText.slice(0, 200) + "..." : resultText;
279
+ actions.push({
280
+ type: ActionType.SessionResponsePart,
281
+ turnId,
282
+ part: {
283
+ kind: ResponsePartKind.SystemNotification,
284
+ content: displayText,
285
+ },
286
+ });
287
+ }
288
+ note = {
289
+ index,
290
+ type: "tool_result",
291
+ disposition: "mapped",
292
+ detail: `Mapped to SessionToolCallComplete (toolCallId=${pairedToolCallId})`,
293
+ };
294
+ break;
295
+ }
296
+ // ─── Usage (carried via _meta) ─────────────────────────────────
297
+ case "usage": {
298
+ const rawCost = hasParsed ? parsed.cost_millicents : undefined;
299
+ // eslint-disable-next-line eqeqeq -- `!= null` checks both null and undefined in one expression
300
+ if (rawCost != null && Number.isFinite(Number(rawCost))) {
301
+ const prevCost = context.metaAccumulator.costMillicents ?? 0;
302
+ const cost = Number(rawCost);
303
+ context.metaAccumulator.costMillicents = Math.max(0, prevCost + Math.trunc(cost));
304
+ }
305
+ note = {
306
+ index,
307
+ type: "usage",
308
+ disposition: "carried",
309
+ detail: `Usage tracked — costMillicents now ${context.metaAccumulator.costMillicents ?? 0}`,
310
+ };
311
+ break;
312
+ }
313
+ // ─── Errors ────────────────────────────────────────────────────
314
+ case "error": {
315
+ const turnId = eventTurnId || context.turnId;
316
+ const errorDetail = content || "Unknown error";
317
+ if (turnId) {
318
+ actions.push({
319
+ type: ActionType.SessionError,
320
+ turnId,
321
+ error: makeErrorInfo(errorDetail),
322
+ });
323
+ note = {
324
+ index,
325
+ type: "error",
326
+ disposition: "mapped",
327
+ detail: `Mapped to SessionError (turnId=${turnId})`,
328
+ };
329
+ context.turnId = undefined;
330
+ }
331
+ else {
332
+ actions.push({
333
+ type: ActionType.SessionCreationFailed,
334
+ error: makeErrorInfo(errorDetail),
335
+ });
336
+ note = {
337
+ index,
338
+ type: "error",
339
+ disposition: "mapped",
340
+ detail: "Mapped to SessionCreationFailed (no active turn)",
341
+ };
342
+ }
343
+ break;
344
+ }
345
+ // ─── Status events ─────────────────────────────────────────────
346
+ case "status": {
347
+ const statusContent = content || "";
348
+ const turnId = eventTurnId || context.turnId;
349
+ switch (statusContent) {
350
+ case "failed": {
351
+ if (turnId) {
352
+ actions.push({
353
+ type: ActionType.SessionError,
354
+ turnId,
355
+ error: makeErrorInfo("Session failed during turn"),
356
+ });
357
+ context.turnId = undefined;
358
+ note = {
359
+ index,
360
+ type: "status",
361
+ disposition: "mapped",
362
+ detail: `Mapped to SessionError (status=failed, turnId=${turnId})`,
363
+ };
364
+ }
365
+ else {
366
+ actions.push({
367
+ type: ActionType.SessionCreationFailed,
368
+ error: makeErrorInfo("Session creation failed"),
369
+ });
370
+ note = {
371
+ index,
372
+ type: "status",
373
+ disposition: "mapped",
374
+ detail: "Mapped to SessionCreationFailed (status=failed)",
375
+ };
376
+ }
377
+ break;
378
+ }
379
+ case "killed":
380
+ case "terminated": {
381
+ if (turnId) {
382
+ actions.push({
383
+ type: ActionType.SessionError,
384
+ turnId,
385
+ error: makeErrorInfo(`Session ${statusContent} during turn`),
386
+ });
387
+ context.turnId = undefined;
388
+ context.openToolCalls = [];
389
+ note = {
390
+ index,
391
+ type: "status",
392
+ disposition: "mapped",
393
+ detail: `Mapped to SessionError (status=${statusContent})`,
394
+ };
395
+ }
396
+ else {
397
+ note = {
398
+ index,
399
+ type: "status",
400
+ disposition: "dropped",
401
+ detail: `No active turn for status=${statusContent}`,
402
+ };
403
+ }
404
+ break;
405
+ }
406
+ case "completed":
407
+ case "waiting_input":
408
+ case "running": {
409
+ note = {
410
+ index,
411
+ type: "status",
412
+ disposition: "dropped",
413
+ detail: `Dropped — redundant with turn_* events (status=${statusContent})`,
414
+ };
415
+ break;
416
+ }
417
+ default: {
418
+ note = {
419
+ index,
420
+ type: "status",
421
+ disposition: "dropped",
422
+ detail: `Dropped — unrecognized status (${statusContent})`,
423
+ };
424
+ }
425
+ }
426
+ break;
427
+ }
428
+ // ─── System events ─────────────────────────────────────────────
429
+ case "system": {
430
+ const turnId = eventTurnId || context.turnId;
431
+ if (isDiagnosticEvent(event)) {
432
+ note = {
433
+ index,
434
+ type: "system",
435
+ disposition: "carried",
436
+ detail: "Dropped — diagnostic event routes to ahp-otlp telemetry",
437
+ };
438
+ break;
439
+ }
440
+ if (turnId) {
441
+ actions.push({
442
+ type: ActionType.SessionResponsePart,
443
+ turnId,
444
+ part: {
445
+ kind: ResponsePartKind.SystemNotification,
446
+ content: content || "",
447
+ },
448
+ });
449
+ note = {
450
+ index,
451
+ type: "system",
452
+ disposition: "mapped",
453
+ detail: "Mapped to SessionResponsePart(systemNotification)",
454
+ };
455
+ }
456
+ else {
457
+ note = {
458
+ index,
459
+ type: "system",
460
+ disposition: "dropped",
461
+ detail: "No active turn for system event",
462
+ };
463
+ }
464
+ break;
465
+ }
466
+ // ─── Internal control events ───────────────────────────────────
467
+ case "runtime_session_id": {
468
+ if (content) {
469
+ context.metaAccumulator.runtimeSessionId = content;
470
+ note = {
471
+ index,
472
+ type: "runtime_session_id",
473
+ disposition: "carried",
474
+ detail: "Carried as _meta.runtimeSessionId",
475
+ };
476
+ }
477
+ else {
478
+ note = {
479
+ index,
480
+ type: "runtime_session_id",
481
+ disposition: "dropped",
482
+ detail: "No content to carry",
483
+ };
484
+ }
485
+ break;
486
+ }
487
+ // ─── Unknown event types ───────────────────────────────────────
488
+ default: {
489
+ note = {
490
+ index,
491
+ type,
492
+ disposition: "dropped",
493
+ detail: `Unrecognized event type: ${type}`,
494
+ };
495
+ }
496
+ }
497
+ return { actions, note };
498
+ }
499
+ //# sourceMappingURL=ahp-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ahp-mapper.js","sourceRoot":"","sources":["../src/ahp-mapper.ts"],"names":[],"mappings":"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"}