@shipfox/api-logs 10.0.0 → 10.1.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.
@@ -1,6 +1,6 @@
1
1
  $ shipfox-swc && shipfox-temporal-bundle dist/temporal/workflows/index.js
2
- Successfully compiled: 59 files with swc (440.92ms)
3
- 2026-07-28T07:35:36.197Z [INFO] asset workflow-bundle-17839eee3b21fbae5b8c.js 3.18 MiB [emitted] [immutable] (name: main)
2
+ Successfully compiled: 59 files with swc (492.56ms)
3
+ 2026-07-28T09:17:58.175Z [INFO] asset workflow-bundle-17839eee3b21fbae5b8c.js 3.18 MiB [emitted] [immutable] (name: main)
4
4
  orphan modules 33.5 KiB [orphan] 21 modules
5
5
  runtime modules 1.13 KiB 5 modules
6
6
  modules by path ../../../node_modules/.pnpm/ 970 KiB 196 modules
@@ -16,6 +16,6 @@ optional modules 30 bytes [optional]
16
16
  __temporal_custom_payload_converter (ignored) 15 bytes [optional] [built] [code generated]
17
17
  __temporal_custom_failure_converter (ignored) 15 bytes [optional] [built] [code generated]
18
18
  ../../shared/node/temporal/dist/workflow-error-interceptor.js 1.21 KiB [built] [code generated]
19
- webpack 5.107.2 compiled successfully in 6770 ms
20
- 2026-07-28T07:35:36.211Z [INFO] Workflow bundle created { size: '3.18MB' }
19
+ webpack 5.107.2 compiled successfully in 6443 ms
20
+ 2026-07-28T09:17:58.188Z [INFO] Workflow bundle created { size: '3.18MB' }
21
21
  /home/runner/work/shipfox/shipfox/libs/api/logs/dist/temporal/workflows/index.js: 3335222 bytes
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @shipfox/api-logs
2
2
 
3
+ ## 10.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 0760f79: Name and tone Claude session events that carry useful signal.
8
+
9
+ ### Patch Changes
10
+
11
+ - @shipfox/api-auth-context@10.1.0
12
+
3
13
  ## 10.0.0
4
14
 
5
15
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../../src/core/session/claude/rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EAIf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,qBAAqB,CAAC;AAc5D,eAAO,MAAM,oCAAoC,aAY/C,CAAC;AAGH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,kBAAkB,GAC1B,uBAAuB,CA4BzB;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,SAAS,cAAc,EAAE,CA6C3B;AAED,wBAAgB,QAAQ,CACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,SAAS,cAAc,EAAE,CA6B3B;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,OAAO,GACrB,uBAAuB,CA6BzB"}
1
+ {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../../src/core/session/claude/rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EAIf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,qBAAqB,CAAC;AAe5D,eAAO,MAAM,oCAAoC,aAY/C,CAAC;AAkGH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,kBAAkB,GAC1B,uBAAuB,CA+CzB;AAMD,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,SAAS,cAAc,EAAE,CA6C3B;AAED,wBAAgB,QAAQ,CACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,SAAS,cAAc,EAAE,CA6B3B;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,OAAO,GACrB,uBAAuB,CA6BzB"}
@@ -1,5 +1,5 @@
1
1
  import { asLooseObject } from '../entry-schema.js';
2
- import { booleanField, field, formatNumber, isMeta, metaItem, stringField, stringifyValue, toJson } from '../object.js';
2
+ import { booleanField, field, formatNumber, isMeta, metaItem, numberField, stringField, stringifyValue, toJson } from '../object.js';
3
3
  import { lifecycleRow, messageRow, thinkingRow } from '../rows.js';
4
4
  export const PURE_PROGRESS_CLAUDE_SYSTEM_SUBTYPES = new Set([
5
5
  'thinking_tokens',
@@ -15,6 +15,84 @@ export const PURE_PROGRESS_CLAUDE_SYSTEM_SUBTYPES = new Set([
15
15
  'plugin_install'
16
16
  ]);
17
17
  const OUTPUT_REPROMPT_PREFIX = 'The previous turn ended without setting required workflow outputs:';
18
+ const SYSTEM_EVENT_MAPPINGS = {
19
+ permission_denied: {
20
+ label: 'Permission denied',
21
+ tone: 'error',
22
+ detail: (message)=>stringField(message, 'tool_name') ?? null,
23
+ meta: (message)=>[
24
+ metaItem('reason', stringField(message, 'decision_reason') ?? stringField(message, 'message'))
25
+ ].filter(isMeta)
26
+ },
27
+ api_retry: {
28
+ label: 'API retry',
29
+ tone: 'warning',
30
+ detail: (message)=>{
31
+ const attempt = numberField(message, 'attempt');
32
+ const maxRetries = numberField(message, 'max_retries');
33
+ return attempt == null || maxRetries == null ? null : `attempt ${formatNumber(attempt)}/${formatNumber(maxRetries)}`;
34
+ },
35
+ meta: (message)=>[
36
+ numberMeta(message, 'error_status', 'status'),
37
+ numberMeta(message, 'retry_delay_ms', 'retry delay', 'ms')
38
+ ].filter(isMeta)
39
+ },
40
+ informational: {
41
+ label: (message)=>titleCase(stringField(message, 'level') ?? 'informational'),
42
+ tone: (message)=>stringField(message, 'level') === 'warning' ? 'warning' : 'default',
43
+ detail: (message)=>stringField(message, 'content') ?? null
44
+ },
45
+ compact_boundary: {
46
+ label: 'Context compacted',
47
+ tone: 'default',
48
+ meta: (message)=>{
49
+ const compactMetadata = asLooseObject(field(message, 'compact_metadata')) ?? {};
50
+ return [
51
+ metaItem('trigger', stringField(compactMetadata, 'trigger')),
52
+ numberMeta(compactMetadata, 'pre_tokens', 'tokens before', 'tokens'),
53
+ numberMeta(compactMetadata, 'post_tokens', 'tokens after', 'tokens'),
54
+ numberMeta(compactMetadata, 'duration_ms', 'duration', 'ms')
55
+ ].filter(isMeta);
56
+ }
57
+ },
58
+ model_refusal_fallback: {
59
+ label: 'Model refused, fell back',
60
+ tone: 'warning'
61
+ },
62
+ model_refusal_no_fallback: {
63
+ label: 'Model refused',
64
+ tone: 'error'
65
+ },
66
+ mirror_error: {
67
+ label: 'Session mirror failed',
68
+ tone: 'error',
69
+ detail: (message)=>stringField(message, 'error') ?? null
70
+ },
71
+ worker_shutting_down: {
72
+ label: 'Worker shutting down',
73
+ tone: 'warning'
74
+ },
75
+ elicitation_complete: {
76
+ label: 'Elicitation complete',
77
+ tone: 'default'
78
+ },
79
+ notification: {
80
+ label: 'Notification',
81
+ tone: 'default'
82
+ },
83
+ task_started: {
84
+ label: 'Task started',
85
+ tone: 'default'
86
+ },
87
+ task_updated: {
88
+ label: 'Task updated',
89
+ tone: 'default'
90
+ },
91
+ task_notification: {
92
+ label: 'Task notification',
93
+ tone: 'default'
94
+ }
95
+ };
18
96
  export function systemRow(timestamp, message, context) {
19
97
  const subtype = stringField(message, 'subtype');
20
98
  const sessionId = stringField(message, 'session_id') ?? stringField(message, 'sessionId');
@@ -24,17 +102,31 @@ export function systemRow(timestamp, message, context) {
24
102
  metaItem('model', stringField(message, 'model')),
25
103
  metaItem('permission', stringField(message, 'permissionMode') ?? stringField(message, 'permission_mode'))
26
104
  ].filter(isMeta);
27
- if (!isInit) return lifecycleRow(timestamp, 'Session event', sessionId ?? null, 'default', false, baseMeta);
105
+ if (!isInit) {
106
+ const mapping = subtype === undefined ? undefined : SYSTEM_EVENT_MAPPINGS[subtype];
107
+ const label = mapping === undefined ? `Session event (${subtype ?? 'unknown'})` : typeof mapping.label === 'function' ? mapping.label(message) : mapping.label;
108
+ const tone = mapping === undefined ? 'default' : typeof mapping.tone === 'function' ? mapping.tone(message) : mapping.tone;
109
+ const detail = mapping?.detail?.(message) ?? null;
110
+ const meta = [
111
+ ...baseMeta,
112
+ ...mapping?.meta?.(message) ?? []
113
+ ];
114
+ return lifecycleRow(timestamp, label, detail, tone, false, meta);
115
+ }
28
116
  const isNewSession = !context.hasInit || sessionId === undefined || sessionId !== context.sessionId;
29
117
  context.hasInit = true;
30
118
  context.sessionId = sessionId ?? null;
31
119
  context.turn = isNewSession ? 1 : context.turn + 1;
32
120
  const label = isNewSession ? 'Session started' : `Turn ${context.turn} started`;
33
121
  const meta = [
122
+ metaItem('session', isNewSession ? sessionId : null),
34
123
  metaItem('turn', isNewSession ? null : String(context.turn)),
35
124
  ...baseMeta
36
125
  ].filter(isMeta);
37
- return lifecycleRow(timestamp, label, sessionId ?? null, 'default', false, meta);
126
+ return lifecycleRow(timestamp, label, null, 'default', false, meta);
127
+ }
128
+ function titleCase(value) {
129
+ return value.length === 0 ? value : `${value[0]?.toUpperCase()}${value.slice(1)}`;
38
130
  }
39
131
  export function assistantRows(timestamp, message) {
40
132
  const sdkMessage = asLooseObject(message.message) ?? message;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/session/claude/rows.ts"],"sourcesContent":["import type {\n SessionViewLifecycleRow,\n SessionViewRow,\n SessionViewRowMeta,\n SessionViewToolCallRow,\n SessionViewToolResultRow,\n} from '@shipfox/api-logs-dto';\nimport type {ClaudeParseContext} from '../claude-parser.js';\nimport {asLooseObject} from '../entry-schema.js';\nimport {\n booleanField,\n field,\n formatNumber,\n isMeta,\n metaItem,\n stringField,\n stringifyValue,\n toJson,\n} from '../object.js';\nimport {lifecycleRow, messageRow, thinkingRow} from '../rows.js';\n\nexport const PURE_PROGRESS_CLAUDE_SYSTEM_SUBTYPES = new Set<string>([\n 'thinking_tokens',\n 'status',\n 'session_state_changed',\n 'task_progress',\n 'hook_progress',\n 'hook_started',\n 'commands_changed',\n 'files_persisted',\n 'memory_recall',\n 'local_command_output',\n 'plugin_install',\n]);\nconst OUTPUT_REPROMPT_PREFIX = 'The previous turn ended without setting required workflow outputs:';\n\nexport function systemRow(\n timestamp: number,\n message: Record<string, unknown>,\n context: ClaudeParseContext,\n): SessionViewLifecycleRow {\n const subtype = stringField(message, 'subtype');\n const sessionId = stringField(message, 'session_id') ?? stringField(message, 'sessionId');\n const isInit = subtype === 'init' || message.type === 'init';\n const baseMeta = [\n metaItem('cwd', stringField(message, 'cwd'), false),\n metaItem('model', stringField(message, 'model')),\n metaItem(\n 'permission',\n stringField(message, 'permissionMode') ?? stringField(message, 'permission_mode'),\n ),\n ].filter(isMeta);\n\n if (!isInit)\n return lifecycleRow(timestamp, 'Session event', sessionId ?? null, 'default', false, baseMeta);\n\n const isNewSession =\n !context.hasInit || sessionId === undefined || sessionId !== context.sessionId;\n context.hasInit = true;\n context.sessionId = sessionId ?? null;\n context.turn = isNewSession ? 1 : context.turn + 1;\n\n const label = isNewSession ? 'Session started' : `Turn ${context.turn} started`;\n const meta = [metaItem('turn', isNewSession ? null : String(context.turn)), ...baseMeta].filter(\n isMeta,\n );\n\n return lifecycleRow(timestamp, label, sessionId ?? null, 'default', false, meta);\n}\n\nexport function assistantRows(\n timestamp: number,\n message: Record<string, unknown>,\n): readonly SessionViewRow[] {\n const sdkMessage = asLooseObject(message.message) ?? message;\n const rows: SessionViewRow[] = [];\n const textParts: string[] = [];\n const thinkingParts: string[] = [];\n\n const pushText = () => {\n if (textParts.length === 0) return;\n rows.push(messageRow(timestamp, 'assistant', 'assistant', textParts.join('\\n\\n'), false));\n textParts.length = 0;\n };\n const pushThinking = () => {\n if (thinkingParts.length === 0) return;\n rows.push(thinkingRow(timestamp, thinkingParts.join('\\n\\n')));\n thinkingParts.length = 0;\n };\n\n for (const block of contentBlocks(sdkMessage)) {\n const type = stringField(block, 'type');\n if (type === 'tool_use' || type === 'tool-use' || type === 'toolCall') {\n pushText();\n pushThinking();\n rows.push(toolCallRow(timestamp, block));\n continue;\n }\n\n if (type === 'thinking' || type === 'reasoning') {\n pushText();\n const text = blockText(block);\n if (text) thinkingParts.push(text);\n continue;\n }\n\n pushThinking();\n const text = blockText(block);\n if (text) textParts.push(text);\n }\n\n pushText();\n pushThinking();\n\n if (rows.length > 0) return rows;\n\n const text = stringField(sdkMessage, 'content') ?? stringField(message, 'result');\n return [messageRow(timestamp, 'assistant', 'assistant', text ?? toJson(message), false)];\n}\n\nexport function userRows(\n timestamp: number,\n message: Record<string, unknown>,\n): readonly SessionViewRow[] {\n const sdkMessage = asLooseObject(message.message) ?? message;\n const role = isPlatformMessage(sdkMessage) ? 'platform' : 'user';\n const rows: SessionViewRow[] = [];\n const textParts: string[] = [];\n const pushText = () => {\n if (textParts.length === 0) return;\n rows.push(messageRow(timestamp, role, role, textParts.join('\\n\\n'), false));\n textParts.length = 0;\n };\n\n for (const block of contentBlocks(sdkMessage)) {\n const type = stringField(block, 'type');\n if (type === 'tool_result' || type === 'tool-result') {\n pushText();\n rows.push(toolResultRow(timestamp, block));\n continue;\n }\n\n const text = blockText(block);\n if (text) textParts.push(text);\n }\n\n pushText();\n\n if (rows.length > 0) return rows;\n\n const content = stringField(sdkMessage, 'content');\n return [messageRow(timestamp, role, role, content ?? toJson(message), false)];\n}\n\nexport function resultRow(\n timestamp: number,\n message: Record<string, unknown>,\n turn: number,\n isFinalResult: boolean,\n): SessionViewLifecycleRow {\n const isError = booleanField(message, 'is_error') || booleanField(message, 'isError');\n const subtype = stringField(message, 'subtype');\n const terminalFailure = isError || subtype === 'error';\n const detail =\n stringField(message, 'result') ??\n stringField(message, 'error') ??\n stringField(message, 'message') ??\n null;\n const meta = [\n metaItem('turn', !terminalFailure && !isFinalResult && turn > 0 ? String(turn) : null),\n numberMeta(message, 'duration_ms', 'duration', 'ms'),\n numberMeta(message, 'duration_api_ms', 'api duration', 'ms'),\n numberMeta(message, 'num_turns', 'turns'),\n costMeta(message),\n ].filter(isMeta);\n\n return lifecycleRow(\n timestamp,\n terminalFailure\n ? 'Session failed'\n : isFinalResult || turn === 0\n ? 'Session completed'\n : `Turn ${turn} completed`,\n detail,\n terminalFailure ? 'error' : 'default',\n terminalFailure,\n meta,\n );\n}\n\nfunction isPlatformMessage(message: Record<string, unknown>): boolean {\n const content = field(message, 'content');\n if (typeof content === 'string') return content.startsWith(OUTPUT_REPROMPT_PREFIX);\n if (!Array.isArray(content)) return false;\n\n return content.some((block) => {\n const object = asLooseObject(block);\n return stringField(object, 'text')?.startsWith(OUTPUT_REPROMPT_PREFIX) === true;\n });\n}\n\nfunction contentBlocks(message: Record<string, unknown>): Record<string, unknown>[] {\n const content = message.content;\n if (!Array.isArray(content)) return [];\n\n return content.flatMap((block) => {\n const object = asLooseObject(block);\n return object ? [object] : [];\n });\n}\n\nfunction toolCallRow(timestamp: number, block: Record<string, unknown>): SessionViewToolCallRow {\n return {\n kind: 'tool-call',\n timestamp,\n id: stringField(block, 'id') ?? null,\n name: stringField(block, 'name') ?? 'tool',\n input: stringifyValue(field(block, 'input') ?? {}),\n };\n}\n\nfunction toolResultRow(\n timestamp: number,\n block: Record<string, unknown>,\n): SessionViewToolResultRow {\n return {\n kind: 'tool-result',\n timestamp,\n toolCallId: stringField(block, 'tool_use_id') ?? stringField(block, 'toolUseId') ?? null,\n toolName: stringField(block, 'name') ?? 'tool',\n output: blockText(block) || stringifyValue(field(block, 'content') ?? ''),\n isError: booleanField(block, 'is_error') || booleanField(block, 'isError'),\n };\n}\n\nfunction blockText(block: Record<string, unknown>): string {\n const content = field(block, 'content');\n if (Array.isArray(content)) {\n return content\n .map((item) => {\n const object = asLooseObject(item);\n return object ? blockText(object) : typeof item === 'string' ? item : '';\n })\n .filter(Boolean)\n .join('\\n\\n');\n }\n\n return (\n stringField(block, 'text') ??\n stringField(block, 'thinking') ??\n (typeof content === 'string' ? content : '') ??\n ''\n );\n}\n\nfunction numberMeta(\n value: unknown,\n key: string,\n label: string,\n unit?: string,\n): SessionViewRowMeta | null {\n const raw = field(value, key);\n if (typeof raw !== 'number' || !Number.isFinite(raw)) return null;\n\n return metaItem(label, unit ? `${formatNumber(raw)} ${unit}` : formatNumber(raw));\n}\n\nfunction costMeta(message: Record<string, unknown>): SessionViewRowMeta | null {\n const value = field(message, 'total_cost_usd') ?? field(message, 'totalCostUsd');\n if (typeof value !== 'number' || !Number.isFinite(value)) return null;\n\n return metaItem('cost', `$${value.toFixed(value < 0.01 ? 4 : 2)}`);\n}\n"],"names":["asLooseObject","booleanField","field","formatNumber","isMeta","metaItem","stringField","stringifyValue","toJson","lifecycleRow","messageRow","thinkingRow","PURE_PROGRESS_CLAUDE_SYSTEM_SUBTYPES","Set","OUTPUT_REPROMPT_PREFIX","systemRow","timestamp","message","context","subtype","sessionId","isInit","type","baseMeta","filter","isNewSession","hasInit","undefined","turn","label","meta","String","assistantRows","sdkMessage","rows","textParts","thinkingParts","pushText","length","push","join","pushThinking","block","contentBlocks","toolCallRow","text","blockText","userRows","role","isPlatformMessage","toolResultRow","content","resultRow","isFinalResult","isError","terminalFailure","detail","numberMeta","costMeta","startsWith","Array","isArray","some","object","flatMap","kind","id","name","input","toolCallId","toolName","output","map","item","Boolean","value","key","unit","raw","Number","isFinite","toFixed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/core/session/claude/rows.ts"],"sourcesContent":["import type {\n SessionViewLifecycleRow,\n SessionViewRow,\n SessionViewRowMeta,\n SessionViewToolCallRow,\n SessionViewToolResultRow,\n} from '@shipfox/api-logs-dto';\nimport type {ClaudeParseContext} from '../claude-parser.js';\nimport {asLooseObject} from '../entry-schema.js';\nimport {\n booleanField,\n field,\n formatNumber,\n isMeta,\n metaItem,\n numberField,\n stringField,\n stringifyValue,\n toJson,\n} from '../object.js';\nimport {lifecycleRow, messageRow, thinkingRow} from '../rows.js';\n\nexport const PURE_PROGRESS_CLAUDE_SYSTEM_SUBTYPES = new Set<string>([\n 'thinking_tokens',\n 'status',\n 'session_state_changed',\n 'task_progress',\n 'hook_progress',\n 'hook_started',\n 'commands_changed',\n 'files_persisted',\n 'memory_recall',\n 'local_command_output',\n 'plugin_install',\n]);\nconst OUTPUT_REPROMPT_PREFIX = 'The previous turn ended without setting required workflow outputs:';\n\ntype SystemEventMapping = {\n label: string | ((message: Record<string, unknown>) => string);\n tone:\n | SessionViewLifecycleRow['tone']\n | ((message: Record<string, unknown>) => SessionViewLifecycleRow['tone']);\n detail?: (message: Record<string, unknown>) => string | null;\n meta?: (message: Record<string, unknown>) => readonly SessionViewRowMeta[];\n};\n\nconst SYSTEM_EVENT_MAPPINGS: Record<string, SystemEventMapping> = {\n permission_denied: {\n label: 'Permission denied',\n tone: 'error',\n detail: (message) => stringField(message, 'tool_name') ?? null,\n meta: (message) =>\n [\n metaItem(\n 'reason',\n stringField(message, 'decision_reason') ?? stringField(message, 'message'),\n ),\n ].filter(isMeta),\n },\n api_retry: {\n label: 'API retry',\n tone: 'warning',\n detail: (message) => {\n const attempt = numberField(message, 'attempt');\n const maxRetries = numberField(message, 'max_retries');\n return attempt == null || maxRetries == null\n ? null\n : `attempt ${formatNumber(attempt)}/${formatNumber(maxRetries)}`;\n },\n meta: (message) =>\n [\n numberMeta(message, 'error_status', 'status'),\n numberMeta(message, 'retry_delay_ms', 'retry delay', 'ms'),\n ].filter(isMeta),\n },\n informational: {\n label: (message) => titleCase(stringField(message, 'level') ?? 'informational'),\n tone: (message) => (stringField(message, 'level') === 'warning' ? 'warning' : 'default'),\n detail: (message) => stringField(message, 'content') ?? null,\n },\n compact_boundary: {\n label: 'Context compacted',\n tone: 'default',\n meta: (message) => {\n const compactMetadata = asLooseObject(field(message, 'compact_metadata')) ?? {};\n return [\n metaItem('trigger', stringField(compactMetadata, 'trigger')),\n numberMeta(compactMetadata, 'pre_tokens', 'tokens before', 'tokens'),\n numberMeta(compactMetadata, 'post_tokens', 'tokens after', 'tokens'),\n numberMeta(compactMetadata, 'duration_ms', 'duration', 'ms'),\n ].filter(isMeta);\n },\n },\n model_refusal_fallback: {\n label: 'Model refused, fell back',\n tone: 'warning',\n },\n model_refusal_no_fallback: {\n label: 'Model refused',\n tone: 'error',\n },\n mirror_error: {\n label: 'Session mirror failed',\n tone: 'error',\n detail: (message) => stringField(message, 'error') ?? null,\n },\n worker_shutting_down: {\n label: 'Worker shutting down',\n tone: 'warning',\n },\n elicitation_complete: {\n label: 'Elicitation complete',\n tone: 'default',\n },\n notification: {\n label: 'Notification',\n tone: 'default',\n },\n task_started: {\n label: 'Task started',\n tone: 'default',\n },\n task_updated: {\n label: 'Task updated',\n tone: 'default',\n },\n task_notification: {\n label: 'Task notification',\n tone: 'default',\n },\n};\n\nexport function systemRow(\n timestamp: number,\n message: Record<string, unknown>,\n context: ClaudeParseContext,\n): SessionViewLifecycleRow {\n const subtype = stringField(message, 'subtype');\n const sessionId = stringField(message, 'session_id') ?? stringField(message, 'sessionId');\n const isInit = subtype === 'init' || message.type === 'init';\n const baseMeta = [\n metaItem('cwd', stringField(message, 'cwd'), false),\n metaItem('model', stringField(message, 'model')),\n metaItem(\n 'permission',\n stringField(message, 'permissionMode') ?? stringField(message, 'permission_mode'),\n ),\n ].filter(isMeta);\n\n if (!isInit) {\n const mapping = subtype === undefined ? undefined : SYSTEM_EVENT_MAPPINGS[subtype];\n const label =\n mapping === undefined\n ? `Session event (${subtype ?? 'unknown'})`\n : typeof mapping.label === 'function'\n ? mapping.label(message)\n : mapping.label;\n const tone =\n mapping === undefined\n ? 'default'\n : typeof mapping.tone === 'function'\n ? mapping.tone(message)\n : mapping.tone;\n const detail = mapping?.detail?.(message) ?? null;\n const meta = [...baseMeta, ...(mapping?.meta?.(message) ?? [])];\n\n return lifecycleRow(timestamp, label, detail, tone, false, meta);\n }\n\n const isNewSession =\n !context.hasInit || sessionId === undefined || sessionId !== context.sessionId;\n context.hasInit = true;\n context.sessionId = sessionId ?? null;\n context.turn = isNewSession ? 1 : context.turn + 1;\n\n const label = isNewSession ? 'Session started' : `Turn ${context.turn} started`;\n const meta = [\n metaItem('session', isNewSession ? sessionId : null),\n metaItem('turn', isNewSession ? null : String(context.turn)),\n ...baseMeta,\n ].filter(isMeta);\n\n return lifecycleRow(timestamp, label, null, 'default', false, meta);\n}\n\nfunction titleCase(value: string): string {\n return value.length === 0 ? value : `${value[0]?.toUpperCase()}${value.slice(1)}`;\n}\n\nexport function assistantRows(\n timestamp: number,\n message: Record<string, unknown>,\n): readonly SessionViewRow[] {\n const sdkMessage = asLooseObject(message.message) ?? message;\n const rows: SessionViewRow[] = [];\n const textParts: string[] = [];\n const thinkingParts: string[] = [];\n\n const pushText = () => {\n if (textParts.length === 0) return;\n rows.push(messageRow(timestamp, 'assistant', 'assistant', textParts.join('\\n\\n'), false));\n textParts.length = 0;\n };\n const pushThinking = () => {\n if (thinkingParts.length === 0) return;\n rows.push(thinkingRow(timestamp, thinkingParts.join('\\n\\n')));\n thinkingParts.length = 0;\n };\n\n for (const block of contentBlocks(sdkMessage)) {\n const type = stringField(block, 'type');\n if (type === 'tool_use' || type === 'tool-use' || type === 'toolCall') {\n pushText();\n pushThinking();\n rows.push(toolCallRow(timestamp, block));\n continue;\n }\n\n if (type === 'thinking' || type === 'reasoning') {\n pushText();\n const text = blockText(block);\n if (text) thinkingParts.push(text);\n continue;\n }\n\n pushThinking();\n const text = blockText(block);\n if (text) textParts.push(text);\n }\n\n pushText();\n pushThinking();\n\n if (rows.length > 0) return rows;\n\n const text = stringField(sdkMessage, 'content') ?? stringField(message, 'result');\n return [messageRow(timestamp, 'assistant', 'assistant', text ?? toJson(message), false)];\n}\n\nexport function userRows(\n timestamp: number,\n message: Record<string, unknown>,\n): readonly SessionViewRow[] {\n const sdkMessage = asLooseObject(message.message) ?? message;\n const role = isPlatformMessage(sdkMessage) ? 'platform' : 'user';\n const rows: SessionViewRow[] = [];\n const textParts: string[] = [];\n const pushText = () => {\n if (textParts.length === 0) return;\n rows.push(messageRow(timestamp, role, role, textParts.join('\\n\\n'), false));\n textParts.length = 0;\n };\n\n for (const block of contentBlocks(sdkMessage)) {\n const type = stringField(block, 'type');\n if (type === 'tool_result' || type === 'tool-result') {\n pushText();\n rows.push(toolResultRow(timestamp, block));\n continue;\n }\n\n const text = blockText(block);\n if (text) textParts.push(text);\n }\n\n pushText();\n\n if (rows.length > 0) return rows;\n\n const content = stringField(sdkMessage, 'content');\n return [messageRow(timestamp, role, role, content ?? toJson(message), false)];\n}\n\nexport function resultRow(\n timestamp: number,\n message: Record<string, unknown>,\n turn: number,\n isFinalResult: boolean,\n): SessionViewLifecycleRow {\n const isError = booleanField(message, 'is_error') || booleanField(message, 'isError');\n const subtype = stringField(message, 'subtype');\n const terminalFailure = isError || subtype === 'error';\n const detail =\n stringField(message, 'result') ??\n stringField(message, 'error') ??\n stringField(message, 'message') ??\n null;\n const meta = [\n metaItem('turn', !terminalFailure && !isFinalResult && turn > 0 ? String(turn) : null),\n numberMeta(message, 'duration_ms', 'duration', 'ms'),\n numberMeta(message, 'duration_api_ms', 'api duration', 'ms'),\n numberMeta(message, 'num_turns', 'turns'),\n costMeta(message),\n ].filter(isMeta);\n\n return lifecycleRow(\n timestamp,\n terminalFailure\n ? 'Session failed'\n : isFinalResult || turn === 0\n ? 'Session completed'\n : `Turn ${turn} completed`,\n detail,\n terminalFailure ? 'error' : 'default',\n terminalFailure,\n meta,\n );\n}\n\nfunction isPlatformMessage(message: Record<string, unknown>): boolean {\n const content = field(message, 'content');\n if (typeof content === 'string') return content.startsWith(OUTPUT_REPROMPT_PREFIX);\n if (!Array.isArray(content)) return false;\n\n return content.some((block) => {\n const object = asLooseObject(block);\n return stringField(object, 'text')?.startsWith(OUTPUT_REPROMPT_PREFIX) === true;\n });\n}\n\nfunction contentBlocks(message: Record<string, unknown>): Record<string, unknown>[] {\n const content = message.content;\n if (!Array.isArray(content)) return [];\n\n return content.flatMap((block) => {\n const object = asLooseObject(block);\n return object ? [object] : [];\n });\n}\n\nfunction toolCallRow(timestamp: number, block: Record<string, unknown>): SessionViewToolCallRow {\n return {\n kind: 'tool-call',\n timestamp,\n id: stringField(block, 'id') ?? null,\n name: stringField(block, 'name') ?? 'tool',\n input: stringifyValue(field(block, 'input') ?? {}),\n };\n}\n\nfunction toolResultRow(\n timestamp: number,\n block: Record<string, unknown>,\n): SessionViewToolResultRow {\n return {\n kind: 'tool-result',\n timestamp,\n toolCallId: stringField(block, 'tool_use_id') ?? stringField(block, 'toolUseId') ?? null,\n toolName: stringField(block, 'name') ?? 'tool',\n output: blockText(block) || stringifyValue(field(block, 'content') ?? ''),\n isError: booleanField(block, 'is_error') || booleanField(block, 'isError'),\n };\n}\n\nfunction blockText(block: Record<string, unknown>): string {\n const content = field(block, 'content');\n if (Array.isArray(content)) {\n return content\n .map((item) => {\n const object = asLooseObject(item);\n return object ? blockText(object) : typeof item === 'string' ? item : '';\n })\n .filter(Boolean)\n .join('\\n\\n');\n }\n\n return (\n stringField(block, 'text') ??\n stringField(block, 'thinking') ??\n (typeof content === 'string' ? content : '') ??\n ''\n );\n}\n\nfunction numberMeta(\n value: unknown,\n key: string,\n label: string,\n unit?: string,\n): SessionViewRowMeta | null {\n const raw = field(value, key);\n if (typeof raw !== 'number' || !Number.isFinite(raw)) return null;\n\n return metaItem(label, unit ? `${formatNumber(raw)} ${unit}` : formatNumber(raw));\n}\n\nfunction costMeta(message: Record<string, unknown>): SessionViewRowMeta | null {\n const value = field(message, 'total_cost_usd') ?? field(message, 'totalCostUsd');\n if (typeof value !== 'number' || !Number.isFinite(value)) return null;\n\n return metaItem('cost', `$${value.toFixed(value < 0.01 ? 4 : 2)}`);\n}\n"],"names":["asLooseObject","booleanField","field","formatNumber","isMeta","metaItem","numberField","stringField","stringifyValue","toJson","lifecycleRow","messageRow","thinkingRow","PURE_PROGRESS_CLAUDE_SYSTEM_SUBTYPES","Set","OUTPUT_REPROMPT_PREFIX","SYSTEM_EVENT_MAPPINGS","permission_denied","label","tone","detail","message","meta","filter","api_retry","attempt","maxRetries","numberMeta","informational","titleCase","compact_boundary","compactMetadata","model_refusal_fallback","model_refusal_no_fallback","mirror_error","worker_shutting_down","elicitation_complete","notification","task_started","task_updated","task_notification","systemRow","timestamp","context","subtype","sessionId","isInit","type","baseMeta","mapping","undefined","isNewSession","hasInit","turn","String","value","length","toUpperCase","slice","assistantRows","sdkMessage","rows","textParts","thinkingParts","pushText","push","join","pushThinking","block","contentBlocks","toolCallRow","text","blockText","userRows","role","isPlatformMessage","toolResultRow","content","resultRow","isFinalResult","isError","terminalFailure","costMeta","startsWith","Array","isArray","some","object","flatMap","kind","id","name","input","toolCallId","toolName","output","map","item","Boolean","key","unit","raw","Number","isFinite","toFixed"],"mappings":"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"}