@gobing-ai/ts-llm-jsonl-importer 0.4.53 → 0.4.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assistant-duration.d.ts +41 -0
- package/dist/assistant-duration.d.ts.map +1 -0
- package/dist/assistant-duration.js +51 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/jsonl-importer-dao.d.ts +20 -1
- package/dist/jsonl-importer-dao.d.ts.map +1 -1
- package/dist/jsonl-importer-dao.js +33 -1
- package/dist/mappers.d.ts +34 -3
- package/dist/mappers.d.ts.map +1 -1
- package/dist/mappers.js +300 -10
- package/dist/opencode-importer.js +36 -1
- package/dist/schema-sql.d.ts +7 -0
- package/dist/schema-sql.d.ts.map +1 -1
- package/dist/schema-sql.js +8 -0
- package/dist/tables.d.ts +14 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +19 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/assistant-duration.ts +64 -0
- package/src/index.ts +17 -3
- package/src/jsonl-importer-dao.ts +54 -2
- package/src/mappers.ts +330 -11
- package/src/opencode-importer.ts +41 -2
- package/src/schema-sql.ts +9 -0
- package/src/tables.ts +21 -0
- package/src/types.ts +23 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { DbAdapter } from '@gobing-ai/ts-db';
|
|
2
|
+
/**
|
|
3
|
+
* ETL-derived assistant-step duration (repatriated upstream from Spur task 0747 / ADR-105).
|
|
4
|
+
*
|
|
5
|
+
* Four of six sources — `claude`, `pi`, `codex`, `agy` — write no per-step
|
|
6
|
+
* `duration_ms` at all, so bottleneck ranking and per-model latency were unusable for
|
|
7
|
+
* the two busiest of them and ~73% of the measured span could not be attributed to
|
|
8
|
+
* llm/tool/idle. The transcripts carry a per-record `ts`, so the delta from the
|
|
9
|
+
* preceding record in the same session is derivable here.
|
|
10
|
+
*
|
|
11
|
+
* **It is an approximation and is labelled as one.** The delta includes queue and
|
|
12
|
+
* network time, which is arguably what "assistant step duration" should mean for
|
|
13
|
+
* bottleneck ranking, but it is not the provider's own number. `duration_source` carries
|
|
14
|
+
* that distinction to every consumer: `NULL` is provider-reported, `'derived'` is this
|
|
15
|
+
* function's work. Nothing may present the two as the same measurement.
|
|
16
|
+
*/
|
|
17
|
+
/** `history_message.duration_source` values. `NULL` means provider-reported. */
|
|
18
|
+
export declare const DURATION_SOURCE_DERIVED = "derived";
|
|
19
|
+
/**
|
|
20
|
+
* Deltas above this are session gaps, not work: the operator walked away and came back.
|
|
21
|
+
* Attributing an overnight gap to an assistant step would corrupt the very ranking this
|
|
22
|
+
* derivation exists to make usable, so those rows stay unmeasured.
|
|
23
|
+
*/
|
|
24
|
+
export declare const DERIVED_DURATION_CEILING_MS: number;
|
|
25
|
+
/** What one derivation pass changed, and what it deliberately left alone. */
|
|
26
|
+
export interface DeriveAssistantDurationsResult {
|
|
27
|
+
/** Rows that gained a derived `duration_ms` on this pass. */
|
|
28
|
+
derived: number;
|
|
29
|
+
/** Candidate rows left unmeasured because the delta exceeded the ceiling. */
|
|
30
|
+
skippedOverCeiling: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fill `duration_ms` for assistant rows that have none, from the timestamp delta to the
|
|
34
|
+
* preceding record in the same session.
|
|
35
|
+
*
|
|
36
|
+
* Idempotent and additive: a row whose `duration_ms` is already set is never touched, so
|
|
37
|
+
* a provider measurement always wins over a derived one, and re-running after a later
|
|
38
|
+
* import only fills rows the earlier pass could not reach.
|
|
39
|
+
*/
|
|
40
|
+
export declare function deriveAssistantDurations(db: DbAdapter): Promise<DeriveAssistantDurationsResult>;
|
|
41
|
+
//# sourceMappingURL=assistant-duration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-duration.d.ts","sourceRoot":"","sources":["../src/assistant-duration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;;;;;;;;;;;;;GAcG;AAEH,gFAAgF;AAChF,eAAO,MAAM,uBAAuB,YAAY,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAE1D,6EAA6E;AAC7E,MAAM,WAAW,8BAA8B;IAC3C,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAkBrG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { findAssistantDurationCandidates, updateAssistantDuration } from './jsonl-importer-dao.js';
|
|
2
|
+
/**
|
|
3
|
+
* ETL-derived assistant-step duration (repatriated upstream from Spur task 0747 / ADR-105).
|
|
4
|
+
*
|
|
5
|
+
* Four of six sources — `claude`, `pi`, `codex`, `agy` — write no per-step
|
|
6
|
+
* `duration_ms` at all, so bottleneck ranking and per-model latency were unusable for
|
|
7
|
+
* the two busiest of them and ~73% of the measured span could not be attributed to
|
|
8
|
+
* llm/tool/idle. The transcripts carry a per-record `ts`, so the delta from the
|
|
9
|
+
* preceding record in the same session is derivable here.
|
|
10
|
+
*
|
|
11
|
+
* **It is an approximation and is labelled as one.** The delta includes queue and
|
|
12
|
+
* network time, which is arguably what "assistant step duration" should mean for
|
|
13
|
+
* bottleneck ranking, but it is not the provider's own number. `duration_source` carries
|
|
14
|
+
* that distinction to every consumer: `NULL` is provider-reported, `'derived'` is this
|
|
15
|
+
* function's work. Nothing may present the two as the same measurement.
|
|
16
|
+
*/
|
|
17
|
+
/** `history_message.duration_source` values. `NULL` means provider-reported. */
|
|
18
|
+
export const DURATION_SOURCE_DERIVED = 'derived';
|
|
19
|
+
/**
|
|
20
|
+
* Deltas above this are session gaps, not work: the operator walked away and came back.
|
|
21
|
+
* Attributing an overnight gap to an assistant step would corrupt the very ranking this
|
|
22
|
+
* derivation exists to make usable, so those rows stay unmeasured.
|
|
23
|
+
*/
|
|
24
|
+
export const DERIVED_DURATION_CEILING_MS = 30 * 60 * 1000;
|
|
25
|
+
/**
|
|
26
|
+
* Fill `duration_ms` for assistant rows that have none, from the timestamp delta to the
|
|
27
|
+
* preceding record in the same session.
|
|
28
|
+
*
|
|
29
|
+
* Idempotent and additive: a row whose `duration_ms` is already set is never touched, so
|
|
30
|
+
* a provider measurement always wins over a derived one, and re-running after a later
|
|
31
|
+
* import only fills rows the earlier pass could not reach.
|
|
32
|
+
*/
|
|
33
|
+
export async function deriveAssistantDurations(db) {
|
|
34
|
+
const rows = await findAssistantDurationCandidates(db);
|
|
35
|
+
let derived = 0;
|
|
36
|
+
let skippedOverCeiling = 0;
|
|
37
|
+
for (const row of rows) {
|
|
38
|
+
// A non-positive delta means the records share a timestamp or arrived out of
|
|
39
|
+
// order; there is no duration to claim, so leave the row unmeasured rather than
|
|
40
|
+
// invent a zero (0680 R6: absent is not zero).
|
|
41
|
+
if (row.deltaMs === null || row.deltaMs <= 0)
|
|
42
|
+
continue;
|
|
43
|
+
if (row.deltaMs > DERIVED_DURATION_CEILING_MS) {
|
|
44
|
+
skippedOverCeiling += 1;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
await updateAssistantDuration(db, row.recordHash, row.deltaMs, DURATION_SOURCE_DERIVED);
|
|
48
|
+
derived += 1;
|
|
49
|
+
}
|
|
50
|
+
return { derived, skippedOverCeiling };
|
|
51
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
export { DERIVED_DURATION_CEILING_MS, type DeriveAssistantDurationsResult, DURATION_SOURCE_DERIVED, deriveAssistantDurations, } from './assistant-duration';
|
|
1
2
|
export { HistoryImportError } from './errors';
|
|
2
3
|
export { sha256, stableJson } from './hash';
|
|
3
4
|
export { runJsonlImport } from './importer';
|
|
4
|
-
export { applyHistoryImportSchema, normalizeSourceFilePaths } from './jsonl-importer-dao';
|
|
5
|
-
export { sessionIdFromSourcePath } from './mappers';
|
|
5
|
+
export { applyHistoryImportSchema, normalizeSourceFilePaths, TYPED_HISTORY_TABLES } from './jsonl-importer-dao';
|
|
6
|
+
export { canonicalizeSkillName, extractSkillCalls, type SkillCallIdentity, sessionIdFromSourcePath, skillCallEntry, } from './mappers';
|
|
6
7
|
export { type OpenCodeImportOptions, runOpenCodeImport } from './opencode-importer';
|
|
7
8
|
export { DEFAULT_REDACTION_RULES, redactRecord, redactValue } from './redaction';
|
|
8
|
-
export { HISTORY_IMPORT_SCHEMA_SQL } from './schema-sql';
|
|
9
|
+
export { HISTORY_IMPORT_SCHEMA_SQL, HISTORY_IMPORT_SCHEMA_VERSION } from './schema-sql';
|
|
9
10
|
export { getSourceDefinition, resolveSourceDefinition, SOURCE_DEFINITIONS, VALID_TABLE_NAME, validateSourceDefinition, } from './sources';
|
|
10
|
-
export
|
|
11
|
+
export { BOOKKEEPING_HISTORY_TABLES, IMPORTER_OWNED_TABLES } from './tables';
|
|
12
|
+
export type { FieldTransform, ImportIssue, ImportMode, ImportOptions, ImportResult, JsonObject, LlmJsonlSource, ReconcileSummary, RedactionRule, SkillCall, SkillCallSplitRecord, SourceDefinition, SplitConfig, SplitEntry, TransformContext, } from './types';
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,2BAA2B,EAC3B,KAAK,8BAA8B,EACnC,uBAAuB,EACvB,wBAAwB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChH,OAAO,EACH,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,cAAc,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EACH,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,GAC3B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC7E,YAAY,EACR,cAAc,EACd,WAAW,EACX,UAAU,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,gBAAgB,GACnB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
export { DERIVED_DURATION_CEILING_MS, DURATION_SOURCE_DERIVED, deriveAssistantDurations, } from './assistant-duration.js';
|
|
1
2
|
export { HistoryImportError } from './errors.js';
|
|
2
3
|
export { sha256, stableJson } from './hash.js';
|
|
3
4
|
export { runJsonlImport } from './importer.js';
|
|
4
|
-
export { applyHistoryImportSchema, normalizeSourceFilePaths } from './jsonl-importer-dao.js';
|
|
5
|
-
export { sessionIdFromSourcePath } from './mappers.js';
|
|
5
|
+
export { applyHistoryImportSchema, normalizeSourceFilePaths, TYPED_HISTORY_TABLES } from './jsonl-importer-dao.js';
|
|
6
|
+
export { canonicalizeSkillName, extractSkillCalls, sessionIdFromSourcePath, skillCallEntry, } from './mappers.js';
|
|
6
7
|
export { runOpenCodeImport } from './opencode-importer.js';
|
|
7
8
|
export { DEFAULT_REDACTION_RULES, redactRecord, redactValue } from './redaction.js';
|
|
8
|
-
export { HISTORY_IMPORT_SCHEMA_SQL } from './schema-sql.js';
|
|
9
|
+
export { HISTORY_IMPORT_SCHEMA_SQL, HISTORY_IMPORT_SCHEMA_VERSION } from './schema-sql.js';
|
|
9
10
|
export { getSourceDefinition, resolveSourceDefinition, SOURCE_DEFINITIONS, VALID_TABLE_NAME, validateSourceDefinition, } from './sources.js';
|
|
11
|
+
export { BOOKKEEPING_HISTORY_TABLES, IMPORTER_OWNED_TABLES } from './tables.js';
|
|
@@ -11,6 +11,12 @@ export interface SourceCheckpoint {
|
|
|
11
11
|
readonly size: number | null;
|
|
12
12
|
readonly mtimeMs: number | null;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Typed contract tables created and populated by the importer.
|
|
16
|
+
*
|
|
17
|
+
* Promoted to public surface per task 0749 (ADR-105).
|
|
18
|
+
*/
|
|
19
|
+
export declare const TYPED_HISTORY_TABLES: readonly ["history_message", "history_tool_call", "history_skill_call"];
|
|
14
20
|
declare function targetTableFor(table: string): string;
|
|
15
21
|
declare function timestamp(now: ImportOptions['now']): string;
|
|
16
22
|
declare function ETL_TABLE_DDL(table: string): string;
|
|
@@ -91,6 +97,19 @@ export declare function codexUsageAttributionUpdateOp(recordHash: string, tokens
|
|
|
91
97
|
* most 200 per `IN (...)` (task 0060 F9 — replaces the per-record SELECT loop).
|
|
92
98
|
*/
|
|
93
99
|
export declare function ledgerExistingHashes(db: ImportOptions['db'], hashes: readonly string[]): Promise<Set<string>>;
|
|
100
|
+
/** Candidate assistant-message row for duration derivation. */
|
|
101
|
+
export interface AssistantDurationCandidate {
|
|
102
|
+
readonly recordHash: string;
|
|
103
|
+
readonly deltaMs: number | null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Fetch candidate assistant rows lacking duration_ms along with timestamp delta to preceding record.
|
|
107
|
+
*/
|
|
108
|
+
export declare function findAssistantDurationCandidates(db: DbAdapter): Promise<AssistantDurationCandidate[]>;
|
|
109
|
+
/**
|
|
110
|
+
* Update duration_ms and duration_source for a previously unmeasured assistant row.
|
|
111
|
+
*/
|
|
112
|
+
export declare function updateAssistantDuration(db: DbAdapter, recordHash: string, durationMs: number, durationSource: string): Promise<void>;
|
|
94
113
|
declare function insertRecord(db: ImportOptions['db'], targetTable: string, recordHash: string, sourceFile: string, sourceLine: number, splitIndex: number, payload: JsonObject, now: ImportOptions['now']): Promise<void>;
|
|
95
114
|
declare function insertLedger(db: ImportOptions['db'], recordHash: string, source: string, sourceFile: string, sourceLine: number, splitIndex: number, targetTable: string, now: ImportOptions['now']): Promise<void>;
|
|
96
115
|
/**
|
|
@@ -149,7 +168,7 @@ export interface OpenCodeExistingEntry {
|
|
|
149
168
|
}
|
|
150
169
|
/** Normalized OpenCode entry awaiting a history-table write. */
|
|
151
170
|
export interface OpenCodeQueuedEntry {
|
|
152
|
-
targetTable: 'history_message' | 'history_tool_call';
|
|
171
|
+
targetTable: 'history_message' | 'history_tool_call' | 'history_skill_call';
|
|
153
172
|
splitIndex: number;
|
|
154
173
|
record: JsonObject;
|
|
155
174
|
recordHash: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-importer-dao.d.ts","sourceRoot":"","sources":["../src/jsonl-importer-dao.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI7D,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE7F,UAAU,aAAa;IACnB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"jsonl-importer-dao.d.ts","sourceRoot":"","sources":["../src/jsonl-importer-dao.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { HistoryImportError } from './errors.js';
|
|
2
2
|
import { HISTORY_IMPORT_SCHEMA_SQL } from './schema-sql.js';
|
|
3
3
|
import { VALID_TABLE_NAME } from './sources.js';
|
|
4
|
+
/**
|
|
5
|
+
* Typed contract tables created and populated by the importer.
|
|
6
|
+
*
|
|
7
|
+
* Promoted to public surface per task 0749 (ADR-105).
|
|
8
|
+
*/
|
|
9
|
+
export const TYPED_HISTORY_TABLES = ['history_message', 'history_tool_call', 'history_skill_call'];
|
|
4
10
|
/** Column allowlist per typed contract table; order is the INSERT column order. */
|
|
5
11
|
const TYPED_TABLE_COLUMNS = {
|
|
6
12
|
history_message: [
|
|
@@ -299,6 +305,32 @@ export async function ledgerExistingHashes(db, hashes) {
|
|
|
299
305
|
}
|
|
300
306
|
return existing;
|
|
301
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Fetch candidate assistant rows lacking duration_ms along with timestamp delta to preceding record.
|
|
310
|
+
*/
|
|
311
|
+
export async function findAssistantDurationCandidates(db) {
|
|
312
|
+
const candidateSql = `
|
|
313
|
+
WITH ordered AS (
|
|
314
|
+
SELECT record_hash,
|
|
315
|
+
role,
|
|
316
|
+
duration_ms,
|
|
317
|
+
ts,
|
|
318
|
+
LAG(ts) OVER (PARTITION BY source, session_id ORDER BY seq) AS prev_ts
|
|
319
|
+
FROM history_message
|
|
320
|
+
WHERE ts IS NOT NULL AND ts LIKE '____-__-__T%'
|
|
321
|
+
)
|
|
322
|
+
SELECT record_hash AS recordHash,
|
|
323
|
+
CAST(ROUND((unixepoch(ts, 'subsec') - unixepoch(prev_ts, 'subsec')) * 1000) AS INTEGER) AS deltaMs
|
|
324
|
+
FROM ordered
|
|
325
|
+
WHERE role = 'assistant' AND duration_ms IS NULL AND prev_ts IS NOT NULL`;
|
|
326
|
+
return db.queryAll(candidateSql);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Update duration_ms and duration_source for a previously unmeasured assistant row.
|
|
330
|
+
*/
|
|
331
|
+
export async function updateAssistantDuration(db, recordHash, durationMs, durationSource) {
|
|
332
|
+
await db.run('UPDATE history_message SET duration_ms = ?, duration_source = ? WHERE record_hash = ? AND duration_ms IS NULL', durationMs, durationSource, recordHash);
|
|
333
|
+
}
|
|
302
334
|
async function insertRecord(db, targetTable, recordHash, sourceFile, sourceLine, splitIndex, payload, now) {
|
|
303
335
|
const op = recordInsertOp(targetTable, recordHash, sourceFile, sourceLine, splitIndex, payload, now);
|
|
304
336
|
await ensureTargetTable(db, targetTable);
|
|
@@ -502,7 +534,7 @@ export function deleteCheckpointOperation(source, sourceFile) {
|
|
|
502
534
|
export function openCodeBulkWriteOperations(entries, checkpointFiles, now) {
|
|
503
535
|
const importedAt = timestamp(now);
|
|
504
536
|
const operations = [];
|
|
505
|
-
for (const table of ['history_message', 'history_tool_call']) {
|
|
537
|
+
for (const table of ['history_message', 'history_tool_call', 'history_skill_call']) {
|
|
506
538
|
const tableEntries = entries.filter((entry) => entry.targetTable === table);
|
|
507
539
|
for (let offset = 0; offset < tableEntries.length; offset += 100) {
|
|
508
540
|
const chunk = tableEntries.slice(offset, offset + 100);
|
package/dist/mappers.d.ts
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import type { JsonObject, SplitEntry, TransformContext } from './types';
|
|
2
|
+
import type { JsonObject, SkillCallSplitRecord, SplitEntry, TransformContext } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Canonicalize a harness skill name: `sp-dev-run` / `$sp-dev-run` / `/skill:sp-dev-run` →
|
|
5
|
+
* `sp:dev-run`; `rd3-*` → `rd3:*`. Only the frozen harness package set is rewritten — an
|
|
6
|
+
* unqualified name like `code-review` is kept verbatim (exact structural match, 0736 R4).
|
|
7
|
+
*/
|
|
8
|
+
export declare function canonicalizeSkillName(raw: string): string;
|
|
9
|
+
/** Identity fields a split already computed for its parent message (skill rows join it). */
|
|
10
|
+
export interface SkillCallIdentity {
|
|
11
|
+
readonly sessionId: string;
|
|
12
|
+
readonly seq: number;
|
|
13
|
+
/** Split index of the parent message entry in the same split batch (_messageSplitIndex). */
|
|
14
|
+
readonly messageSplitIndex: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Detect skill-load events in one raw source record (0736 R1/R2). Dispatches on the source in
|
|
18
|
+
* the transform context; unknown sources return nothing. Detection signatures per source are
|
|
19
|
+
* the verified ones from the storm report §10.3:
|
|
20
|
+
*
|
|
21
|
+
* - L1 native load tool is authoritative (claude/omp `Skill`, agy `view_file` skill reads,
|
|
22
|
+
* grok `read_file` on SKILL.md, opencode native `skill`).
|
|
23
|
+
* - Sources with no L1 trigger on their structural signal: pi's `<skill name= location=>`
|
|
24
|
+
* wrapper, codex's `<skill><name>/<path>` block, gemini's L0 harness prefix.
|
|
25
|
+
* - L0/L2 never trigger for agents that have an L1 (false-positive suppression, 0736 R4).
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractSkillCalls(raw: JsonObject, context: TransformContext | undefined, identity: SkillCallIdentity): readonly SkillCallSplitRecord[];
|
|
28
|
+
/**
|
|
29
|
+
* Route one skill-load row to `history_skill_call` exactly like tool calls route to
|
|
30
|
+
* `history_tool_call`: a SplitEntry whose record the importer normalizes, hashes, dedups,
|
|
31
|
+
* and inserts through the typed-column path.
|
|
32
|
+
*/
|
|
33
|
+
export declare function skillCallEntry(record: SkillCallSplitRecord): SplitEntry;
|
|
3
34
|
/** Compute args_digest: sha256 of stable-jsonified, key-sorted, redacted args. */
|
|
4
35
|
export declare function argsDigest(args: unknown): string;
|
|
5
36
|
/**
|
|
@@ -9,7 +40,7 @@ export declare function argsDigest(args: unknown): string;
|
|
|
9
40
|
*/
|
|
10
41
|
export declare function maybeArgsRaw(_source: string, toolName: string, args: unknown): string | undefined;
|
|
11
42
|
/** Map a Claude Code JSONL record into one or more ETL split entries. */
|
|
12
|
-
export declare function claudeSplit(raw: Record<string, unknown
|
|
43
|
+
export declare function claudeSplit(raw: Record<string, unknown>, context?: TransformContext): readonly SplitEntry[];
|
|
13
44
|
/** Map a Pi JSONL record into one or more ETL split entries. */
|
|
14
45
|
export declare function piSplit(raw: Record<string, unknown>, context?: TransformContext): readonly SplitEntry[];
|
|
15
46
|
/** Map an OMP JSONL record into one or more ETL split entries. */
|
|
@@ -70,7 +101,7 @@ export declare function geminiSplit(raw: Record<string, unknown>, context?: Tran
|
|
|
70
101
|
*/
|
|
71
102
|
export declare function sessionIdFromSourcePath(source: string, sourceFile: string): string | undefined;
|
|
72
103
|
/** Map a Grok JSONL record into one or more ETL split entries. */
|
|
73
|
-
export declare function grokSplit(raw: Record<string, unknown
|
|
104
|
+
export declare function grokSplit(raw: Record<string, unknown>, context?: TransformContext): readonly SplitEntry[];
|
|
74
105
|
/** Compute a stable field-shape key from a JSON object: sorted, lowercased, +-joined top-level keys. */
|
|
75
106
|
export declare function stableFieldShape(raw: JsonObject): string;
|
|
76
107
|
/** Identity field map for the Claude mapper. */
|
package/dist/mappers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../src/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../src/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAmF9F;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASzD;AAED,4FAA4F;AAC5F,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC7B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,QAAQ,EAAE,iBAAiB,GAC5B,SAAS,oBAAoB,EAAE,CAmBjC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,UAAU,CAIvE;AA+LD,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAGhD;AAwHD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAwBjG;AAMD,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAuH3G;AAMD,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAwHvG;AAmBD,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAoHxG;AAoBD,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAChC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,yDAAyD;IACzD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CASrE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,GAAG,IAAI,CAS5F;AAMD,wEAAwE;AACxE,MAAM,WAAW,sBAAsB;IACnC,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,wDAAwD;IACxD,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,sBAAsB,GAAG,IAAI,CA8BlG;AAMD,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAiM1G;AAMD,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAwIxG;AAMD,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAuF3G;AAMD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgB9F;AAiMD,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,UAAU,EAAE,CAkTzG;AAgFD,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAKxD;AAMD,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,wBAE5B,CAAC;AACF,4CAA4C;AAC5C,eAAO,MAAM,YAAY,wBAA8F,CAAC;AACxH,6CAA6C;AAC7C,eAAO,MAAM,aAAa,wBAEzB,CAAC;AACF,+CAA+C;AAC/C,eAAO,MAAM,eAAe,wBAE3B,CAAC;AACF,6CAA6C;AAC7C,eAAO,MAAM,aAAa,wBAEzB,CAAC;AACF,8CAA8C;AAC9C,eAAO,MAAM,cAAc,wBAE1B,CAAC;AACF,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,wBAE5B,CAAC;AAQF,oDAAoD;AACpD,eAAO,MAAM,aAAa,gCAAoB,CAAC;AAC/C,gDAAgD;AAChD,eAAO,MAAM,SAAS,gCAAoB,CAAC;AAC3C,iDAAiD;AACjD,eAAO,MAAM,UAAU,gCAAoB,CAAC;AAC5C,mDAAmD;AACnD,eAAO,MAAM,YAAY,gCAAoB,CAAC;AAC9C,iDAAiD;AACjD,eAAO,MAAM,UAAU,gCAAoB,CAAC;AAC5C,kDAAkD;AAClD,eAAO,MAAM,WAAW,gCAAoB,CAAC;AAC7C,oDAAoD;AACpD,eAAO,MAAM,aAAa,gCAAoB,CAAC"}
|