@spool-lab/session-kit 0.6.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.
@@ -0,0 +1,116 @@
1
+ export type SessionProvider = 'claude' | 'codex';
2
+ export type JsonPrimitive = boolean | number | string | null;
3
+ export type JsonValue = JsonPrimitive | JsonValue[] | {
4
+ [key: string]: JsonValue;
5
+ };
6
+ export interface CanonicalizeOptions {
7
+ workspaceRoot?: string;
8
+ homeDir?: string;
9
+ }
10
+ export interface CanonicalRecord {
11
+ oid: string;
12
+ data: string;
13
+ }
14
+ /**
15
+ * A record fetched sparsely (e.g. the reader pulling only a file's edit
16
+ * records from the hub): `i` is the record's position in the full
17
+ * sequence and overrides the array position for index attribution.
18
+ */
19
+ export interface IndexedRecord {
20
+ i: number;
21
+ data: string;
22
+ }
23
+ export type SessionRecord = string | CanonicalRecord | IndexedRecord;
24
+ export interface SessionRecordsOptions {
25
+ provider: SessionProvider;
26
+ workspaceRoot?: string;
27
+ }
28
+ export type EditTool = 'Edit' | 'Write' | 'MultiEdit' | 'NotebookEdit' | 'apply_patch';
29
+ export interface TextReplacement {
30
+ oldText: string;
31
+ newText: string;
32
+ replaceAll?: boolean;
33
+ oldStart?: number;
34
+ oldLines?: number;
35
+ newStart?: number;
36
+ newLines?: number;
37
+ }
38
+ export interface EditEvent {
39
+ provider: SessionProvider;
40
+ recordIndex: number;
41
+ resultRecordIndex: number;
42
+ tool: EditTool;
43
+ path: string;
44
+ timestamp?: string;
45
+ before?: string;
46
+ after?: string;
47
+ replacements: TextReplacement[];
48
+ }
49
+ export type ViewRecordKind = 'user' | 'assistant' | 'tool' | 'edit' | 'other';
50
+ export interface ViewIndexEntry {
51
+ i: number;
52
+ kind: ViewRecordKind;
53
+ size: number;
54
+ ts?: string;
55
+ file?: string;
56
+ tool?: string;
57
+ excerpt?: string;
58
+ }
59
+ export interface ViewFileEntry {
60
+ path: string;
61
+ /**
62
+ * Every record index needed to reconstruct this file's edits client-side:
63
+ * tool-call records and their paired result records.
64
+ */
65
+ events: number[];
66
+ adds: number;
67
+ dels: number;
68
+ }
69
+ export interface ViewOutlineEntry {
70
+ i: number;
71
+ excerpt: string;
72
+ }
73
+ export interface Diffstat {
74
+ files: number;
75
+ adds: number;
76
+ dels: number;
77
+ }
78
+ export interface SessionViewV1 {
79
+ v: 1;
80
+ index: ViewIndexEntry[];
81
+ files: ViewFileEntry[];
82
+ outline: ViewOutlineEntry[];
83
+ firstPrompt: string;
84
+ lastReply: string;
85
+ diffstat: Diffstat;
86
+ }
87
+ export type DiffLineKind = 'context' | 'add' | 'del';
88
+ export interface DiffLine {
89
+ kind: DiffLineKind;
90
+ text: string;
91
+ recordIndices: number[];
92
+ oldLine?: number;
93
+ newLine?: number;
94
+ }
95
+ export interface DiffHunk {
96
+ oldStart: number;
97
+ oldLines: number;
98
+ newStart: number;
99
+ newLines: number;
100
+ lines: DiffLine[];
101
+ recordIndices: number[];
102
+ }
103
+ export interface SessionFileDiff {
104
+ path: string;
105
+ events: number[];
106
+ oldText: string;
107
+ newText: string;
108
+ hunks: DiffHunk[];
109
+ adds: number;
110
+ dels: number;
111
+ }
112
+ export interface SessionDiff {
113
+ files: SessionFileDiff[];
114
+ diffstat: Diffstat;
115
+ }
116
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/view.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { SessionProvider, SessionRecord, SessionRecordsOptions, SessionViewV1 } from './types.js';
2
+ export declare function deriveView(provider: SessionProvider, records: readonly SessionRecord[]): SessionViewV1;
3
+ export declare function deriveView(records: readonly SessionRecord[], options: SessionRecordsOptions): SessionViewV1;
4
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,aAAa,EAGd,MAAM,YAAY,CAAA;AAenB,wBAAgB,UAAU,CACxB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,aAAa,CAAA;AAChB,wBAAgB,UAAU,CACxB,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,OAAO,EAAE,qBAAqB,GAC7B,aAAa,CAAA"}
package/dist/view.js ADDED
@@ -0,0 +1,221 @@
1
+ import { composeSessionDiff } from './diff.js';
2
+ import { extractEditEvents } from './edits.js';
3
+ const EXCERPT_BYTES = 4 * 1024;
4
+ const VIEW_BYTES = 8 * 1024 * 1024;
5
+ const textEncoder = new TextEncoder();
6
+ export function deriveView(first, second) {
7
+ const { provider, records, workspaceRoot } = normalizeArguments(first, second);
8
+ const editEvents = extractEditEvents(records, {
9
+ provider,
10
+ ...(workspaceRoot === undefined ? {} : { workspaceRoot }),
11
+ });
12
+ const eventsByRecord = groupEventsByRecord(editEvents);
13
+ const parsed = records.map(parseRecord);
14
+ const index = [];
15
+ const outline = [];
16
+ let firstPrompt = '';
17
+ let lastReply = '';
18
+ for (let position = 0; position < records.length; position += 1) {
19
+ const raw = records[position];
20
+ const data = typeof raw === 'string' ? raw : raw.data;
21
+ const recordIndex = typeof raw !== 'string' && 'i' in raw ? raw.i : position;
22
+ const record = parsed[position] ?? null;
23
+ const recordEvents = eventsByRecord.get(recordIndex) ?? [];
24
+ const details = classifyRecord(provider, record, recordEvents);
25
+ const timestamp = stringAt(record, 'timestamp');
26
+ const excerpt = details.text ? truncateUtf8(details.text.trim(), EXCERPT_BYTES) : '';
27
+ const files = [...new Set(recordEvents.map(event => event.path))];
28
+ const entry = {
29
+ i: recordIndex,
30
+ kind: details.kind,
31
+ size: textEncoder.encode(data).byteLength,
32
+ ...(timestamp === undefined ? {} : { ts: timestamp }),
33
+ ...(files.length === 1 ? { file: files[0] } : {}),
34
+ ...(details.tool === undefined ? {} : { tool: details.tool }),
35
+ ...(excerpt ? { excerpt } : {}),
36
+ };
37
+ index.push(entry);
38
+ if (details.messageRole === 'user' && excerpt) {
39
+ outline.push({ i: recordIndex, excerpt });
40
+ if (!firstPrompt)
41
+ firstPrompt = excerpt;
42
+ }
43
+ if (details.messageRole === 'assistant' && excerpt)
44
+ lastReply = excerpt;
45
+ }
46
+ const diff = composeSessionDiff(editEvents);
47
+ const view = {
48
+ v: 1,
49
+ index,
50
+ files: diff.files.map(file => ({
51
+ path: file.path,
52
+ events: file.events,
53
+ adds: file.adds,
54
+ dels: file.dels,
55
+ })),
56
+ outline,
57
+ firstPrompt,
58
+ lastReply,
59
+ diffstat: diff.diffstat,
60
+ };
61
+ if (textEncoder.encode(JSON.stringify(view)).byteLength > VIEW_BYTES) {
62
+ throw new RangeError('Derived view exceeds the 8 MB wire limit');
63
+ }
64
+ return view;
65
+ }
66
+ function normalizeArguments(first, second) {
67
+ if (typeof first === 'string') {
68
+ return { provider: first, records: second };
69
+ }
70
+ const options = second;
71
+ return {
72
+ provider: options.provider,
73
+ records: first,
74
+ ...(options.workspaceRoot === undefined ? {} : { workspaceRoot: options.workspaceRoot }),
75
+ };
76
+ }
77
+ function groupEventsByRecord(events) {
78
+ const grouped = new Map();
79
+ for (const event of events) {
80
+ const existing = grouped.get(event.recordIndex);
81
+ if (existing)
82
+ existing.push(event);
83
+ else
84
+ grouped.set(event.recordIndex, [event]);
85
+ }
86
+ return grouped;
87
+ }
88
+ function parseRecord(record) {
89
+ const data = typeof record === 'string' ? record : record.data;
90
+ try {
91
+ const parsed = JSON.parse(data);
92
+ return isObject(parsed) ? parsed : null;
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ function classifyRecord(provider, record, editEvents) {
99
+ if (!record)
100
+ return { kind: 'other' };
101
+ const details = provider === 'claude' ? classifyClaude(record) : classifyCodex(record);
102
+ if (editEvents.length > 0) {
103
+ const tool = editEvents[0]?.tool;
104
+ return { ...details, kind: 'edit', ...(tool === undefined ? {} : { tool }) };
105
+ }
106
+ return details;
107
+ }
108
+ function classifyClaude(record) {
109
+ const message = objectAt(record, 'message');
110
+ const role = stringAt(message, 'role');
111
+ const content = message?.['content'];
112
+ const text = claudeText(content);
113
+ if (Array.isArray(content)) {
114
+ const items = content.filter(isObject);
115
+ if (items.some(item => item['type'] === 'tool_result'))
116
+ return { kind: 'tool' };
117
+ const toolUse = items.find(item => item['type'] === 'tool_use');
118
+ if (toolUse) {
119
+ const tool = stringAt(toolUse, 'name');
120
+ return {
121
+ kind: 'tool',
122
+ ...(tool === undefined ? {} : { tool }),
123
+ ...(role === 'assistant' && text ? { text, messageRole: 'assistant' } : {}),
124
+ };
125
+ }
126
+ }
127
+ if (role === 'user') {
128
+ return { kind: 'user', messageRole: 'user', ...(text ? { text } : {}) };
129
+ }
130
+ if (role === 'assistant') {
131
+ return { kind: 'assistant', messageRole: 'assistant', ...(text ? { text } : {}) };
132
+ }
133
+ if (record['type'] === 'summary') {
134
+ const summary = stringAt(record, 'summary');
135
+ return { kind: 'other', ...(summary ? { text: summary } : {}) };
136
+ }
137
+ return { kind: 'other' };
138
+ }
139
+ function classifyCodex(record) {
140
+ const payload = objectAt(record, 'payload');
141
+ if (!payload)
142
+ return { kind: 'other' };
143
+ const payloadType = stringAt(payload, 'type');
144
+ if (payloadType === 'user_message') {
145
+ const text = stringAt(payload, 'message');
146
+ return { kind: 'user', messageRole: 'user', ...(text ? { text } : {}) };
147
+ }
148
+ if (payloadType === 'agent_message') {
149
+ const text = stringAt(payload, 'message');
150
+ return { kind: 'assistant', messageRole: 'assistant', ...(text ? { text } : {}) };
151
+ }
152
+ if (payloadType === 'custom_tool_call' || payloadType === 'function_call') {
153
+ const tool = stringAt(payload, 'name');
154
+ return { kind: 'tool', ...(tool === undefined ? {} : { tool }) };
155
+ }
156
+ if (payloadType === 'custom_tool_call_output'
157
+ || payloadType === 'function_call_output'
158
+ || payloadType === 'patch_apply_end')
159
+ return { kind: 'tool' };
160
+ const role = stringAt(payload, 'role');
161
+ const text = codexResponseText(payload['content']);
162
+ if (role === 'user')
163
+ return { kind: 'user', messageRole: 'user', ...(text ? { text } : {}) };
164
+ if (role === 'assistant') {
165
+ return { kind: 'assistant', messageRole: 'assistant', ...(text ? { text } : {}) };
166
+ }
167
+ return { kind: 'other' };
168
+ }
169
+ function claudeText(content) {
170
+ if (typeof content === 'string')
171
+ return content;
172
+ if (!Array.isArray(content))
173
+ return '';
174
+ return content
175
+ .filter(isObject)
176
+ .filter(item => item['type'] === 'text')
177
+ .map(item => stringAt(item, 'text') ?? '')
178
+ .filter(Boolean)
179
+ .join('\n');
180
+ }
181
+ function codexResponseText(content) {
182
+ if (!Array.isArray(content))
183
+ return '';
184
+ return content
185
+ .filter(isObject)
186
+ .filter(item => item['type'] === 'output_text' || item['type'] === 'text' || item['type'] === 'input_text')
187
+ .map(item => stringAt(item, 'text') ?? '')
188
+ .filter(Boolean)
189
+ .join('\n');
190
+ }
191
+ function truncateUtf8(value, maxBytes) {
192
+ if (textEncoder.encode(value).byteLength <= maxBytes)
193
+ return value;
194
+ let low = 0;
195
+ let high = value.length;
196
+ while (low < high) {
197
+ const middle = Math.ceil((low + high) / 2);
198
+ if (textEncoder.encode(value.slice(0, middle)).byteLength <= maxBytes)
199
+ low = middle;
200
+ else
201
+ high = middle - 1;
202
+ }
203
+ if (low > 0) {
204
+ const last = value.charCodeAt(low - 1);
205
+ if (last >= 0xd800 && last <= 0xdbff)
206
+ low -= 1;
207
+ }
208
+ return value.slice(0, low);
209
+ }
210
+ function objectAt(source, key) {
211
+ const value = source?.[key];
212
+ return isObject(value) ? value : null;
213
+ }
214
+ function stringAt(source, key) {
215
+ const value = source?.[key];
216
+ return typeof value === 'string' ? value : undefined;
217
+ }
218
+ function isObject(value) {
219
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
220
+ }
221
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@spool-lab/session-kit",
3
+ "version": "0.6.0",
4
+ "description": "Browser-safe canonical records, sequence hashing, edit extraction, views, and session diffs for Spool v2.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "devDependencies": {
21
+ "vitest": "^3.2.4"
22
+ },
23
+ "scripts": {
24
+ "build": "pnpm run clean && tsc",
25
+ "dev": "tsc --watch",
26
+ "test": "vitest run",
27
+ "test:watch": "vitest",
28
+ "typecheck": "tsc --noEmit",
29
+ "clean": "rm -rf dist"
30
+ }
31
+ }