@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.
- package/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +10 -0
- package/dist/core/session/claude/rows.d.ts.map +1 -1
- package/dist/core/session/claude/rows.js +95 -3
- package/dist/core/session/claude/rows.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/core/session/claude/rows.ts +125 -6
- package/src/core/session/claude-parser.test.ts +167 -7
- package/tsconfig.build.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
$ shipfox-swc && shipfox-temporal-bundle dist/temporal/workflows/index.js
|
|
2
|
-
Successfully compiled: 59 files with swc (
|
|
3
|
-
2026-07-
|
|
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
|
|
20
|
-
2026-07-
|
|
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 +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;
|
|
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)
|
|
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,
|
|
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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"}
|