@kernl-sdk/storage 0.1.9
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 -0
- package/CHANGELOG.md +113 -0
- package/LICENSE +201 -0
- package/dist/__tests__/table.test.d.ts +2 -0
- package/dist/__tests__/table.test.d.ts.map +1 -0
- package/dist/__tests__/table.test.js +112 -0
- package/dist/base.d.ts +6 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/serde/__tests__/thread.test.d.ts +2 -0
- package/dist/serde/__tests__/thread.test.d.ts.map +1 -0
- package/dist/serde/__tests__/thread.test.js +180 -0
- package/dist/serde/thread.d.ts +89 -0
- package/dist/serde/thread.d.ts.map +1 -0
- package/dist/serde/thread.js +139 -0
- package/dist/table.d.ts +87 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +80 -0
- package/dist/thread/index.d.ts +7 -0
- package/dist/thread/index.d.ts.map +1 -0
- package/dist/thread/index.js +6 -0
- package/dist/thread/schema.d.ts +122 -0
- package/dist/thread/schema.d.ts.map +1 -0
- package/dist/thread/schema.js +141 -0
- package/dist/thread/store.d.ts +6 -0
- package/dist/thread/store.d.ts.map +1 -0
- package/dist/thread/store.js +1 -0
- package/dist/thread/types.d.ts +6 -0
- package/dist/thread/types.d.ts.map +1 -0
- package/dist/thread/types.js +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/package.json +51 -0
- package/src/__tests__/table.test.ts +134 -0
- package/src/base.ts +5 -0
- package/src/index.ts +8 -0
- package/src/serde/__tests__/thread.test.ts +218 -0
- package/src/serde/thread.ts +178 -0
- package/src/table.ts +199 -0
- package/src/thread/index.ts +7 -0
- package/src/thread/schema.ts +170 -0
- package/src/thread/store.ts +5 -0
- package/src/thread/types.ts +13 -0
- package/src/types.ts +67 -0
- package/tsconfig.json +15 -0
- package/vitest.config.ts +15 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread serialization - codecs for converting between domain types and database records.
|
|
3
|
+
*/
|
|
4
|
+
import { type Codec } from "@kernl-sdk/shared/lib";
|
|
5
|
+
import type { IThread, ThreadEvent } from "kernl/internal";
|
|
6
|
+
import type { NewThread } from "../thread/types";
|
|
7
|
+
/**
|
|
8
|
+
* Decoded thread record - validated but not hydrated.
|
|
9
|
+
*
|
|
10
|
+
* Has all IThread fields except:
|
|
11
|
+
* - agent/model are replaced with agentId/model (string references)
|
|
12
|
+
* - input/history/task are not included (loaded separately, task becomes parentTaskId)
|
|
13
|
+
* - context is raw JSONB data (needs reconstruction into Context instance)
|
|
14
|
+
*/
|
|
15
|
+
export type DecodedThread = Omit<IThread, "agent" | "model" | "input" | "history" | "task" | "context"> & {
|
|
16
|
+
namespace: string;
|
|
17
|
+
agentId: string;
|
|
18
|
+
model: string;
|
|
19
|
+
parentTaskId: string | null;
|
|
20
|
+
context: unknown;
|
|
21
|
+
};
|
|
22
|
+
export declare const ThreadCodec: Codec<DecodedThread, {
|
|
23
|
+
id: string;
|
|
24
|
+
namespace: string;
|
|
25
|
+
agent_id: string;
|
|
26
|
+
model: string;
|
|
27
|
+
context: unknown;
|
|
28
|
+
parent_task_id: string | null;
|
|
29
|
+
tick: number;
|
|
30
|
+
state: "running" | "stopped" | "interruptible" | "uninterruptible" | "zombie" | "dead";
|
|
31
|
+
created_at: number;
|
|
32
|
+
updated_at: number;
|
|
33
|
+
metadata: Record<string, unknown> | null;
|
|
34
|
+
}>;
|
|
35
|
+
export declare const ThreadEventRecordCodec: Codec<ThreadEvent, {
|
|
36
|
+
id: string;
|
|
37
|
+
tid: string;
|
|
38
|
+
seq: number;
|
|
39
|
+
timestamp: number;
|
|
40
|
+
metadata: Record<string, unknown> | null;
|
|
41
|
+
kind: "message";
|
|
42
|
+
data: Record<string, unknown>;
|
|
43
|
+
} | {
|
|
44
|
+
id: string;
|
|
45
|
+
tid: string;
|
|
46
|
+
seq: number;
|
|
47
|
+
timestamp: number;
|
|
48
|
+
metadata: Record<string, unknown> | null;
|
|
49
|
+
kind: "reasoning";
|
|
50
|
+
data: Record<string, unknown>;
|
|
51
|
+
} | {
|
|
52
|
+
id: string;
|
|
53
|
+
tid: string;
|
|
54
|
+
seq: number;
|
|
55
|
+
timestamp: number;
|
|
56
|
+
metadata: Record<string, unknown> | null;
|
|
57
|
+
kind: "tool-call";
|
|
58
|
+
data: Record<string, unknown>;
|
|
59
|
+
} | {
|
|
60
|
+
id: string;
|
|
61
|
+
tid: string;
|
|
62
|
+
seq: number;
|
|
63
|
+
timestamp: number;
|
|
64
|
+
metadata: Record<string, unknown> | null;
|
|
65
|
+
kind: "tool-result";
|
|
66
|
+
data: Record<string, unknown>;
|
|
67
|
+
} | {
|
|
68
|
+
id: string;
|
|
69
|
+
tid: string;
|
|
70
|
+
seq: number;
|
|
71
|
+
timestamp: number;
|
|
72
|
+
metadata: Record<string, unknown> | null;
|
|
73
|
+
kind: "system";
|
|
74
|
+
data: null;
|
|
75
|
+
}>;
|
|
76
|
+
export declare const NewThreadCodec: Codec<NewThread, {
|
|
77
|
+
id: string;
|
|
78
|
+
namespace: string;
|
|
79
|
+
agent_id: string;
|
|
80
|
+
model: string;
|
|
81
|
+
context: unknown;
|
|
82
|
+
parent_task_id: string | null;
|
|
83
|
+
tick: number;
|
|
84
|
+
state: "running" | "stopped" | "interruptible" | "uninterruptible" | "zombie" | "dead";
|
|
85
|
+
created_at: number;
|
|
86
|
+
updated_at: number;
|
|
87
|
+
metadata: Record<string, unknown> | null;
|
|
88
|
+
}>;
|
|
89
|
+
//# sourceMappingURL=thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/serde/thread.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,KAAK,EAAmB,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,OAAO,EACP,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAC7D,GAAG;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAyCF,eAAO,MAAM,WAAW;;;;;;;;;;;;EAGtB,CAAC;AAwDH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGjC,CAAC;AA0CH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAGzB,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread serialization - codecs for converting between domain types and database records.
|
|
3
|
+
*/
|
|
4
|
+
import { neapolitanCodec } from "@kernl-sdk/shared/lib";
|
|
5
|
+
import { STOPPED } from "@kernl-sdk/protocol";
|
|
6
|
+
import { ThreadRecordSchema, ThreadEventRecordSchema } from "../thread/schema";
|
|
7
|
+
/* ---- Codecs ---- */
|
|
8
|
+
/**
|
|
9
|
+
* Thread codec - converts between DecodedThread and ThreadRecord.
|
|
10
|
+
*/
|
|
11
|
+
const rawThreadCodec = {
|
|
12
|
+
encode(decoded) {
|
|
13
|
+
return {
|
|
14
|
+
id: decoded.tid,
|
|
15
|
+
namespace: decoded.namespace,
|
|
16
|
+
agent_id: decoded.agentId,
|
|
17
|
+
model: decoded.model,
|
|
18
|
+
parent_task_id: decoded.parentTaskId,
|
|
19
|
+
context: decoded.context,
|
|
20
|
+
tick: decoded.tick,
|
|
21
|
+
state: decoded.state,
|
|
22
|
+
created_at: decoded.createdAt.getTime(),
|
|
23
|
+
updated_at: decoded.updatedAt.getTime(),
|
|
24
|
+
metadata: decoded.metadata,
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
decode(record) {
|
|
28
|
+
return {
|
|
29
|
+
tid: record.id,
|
|
30
|
+
namespace: record.namespace,
|
|
31
|
+
agentId: record.agent_id,
|
|
32
|
+
model: record.model,
|
|
33
|
+
parentTaskId: record.parent_task_id,
|
|
34
|
+
context: record.context,
|
|
35
|
+
tick: record.tick,
|
|
36
|
+
state: record.state,
|
|
37
|
+
createdAt: new Date(record.created_at),
|
|
38
|
+
updatedAt: new Date(record.updated_at),
|
|
39
|
+
metadata: record.metadata,
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export const ThreadCodec = neapolitanCodec({
|
|
44
|
+
codec: rawThreadCodec,
|
|
45
|
+
schema: ThreadRecordSchema,
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* ThreadEvent codec - converts between flat ThreadEvent and ThreadEventRecord.
|
|
49
|
+
*
|
|
50
|
+
* App layer: {kind, ...dataFields, id, tid, seq, timestamp, metadata}
|
|
51
|
+
* DB layer: {kind, data: {...dataFields}, id, tid, seq, timestamp, metadata}
|
|
52
|
+
*/
|
|
53
|
+
const rawThreadEventCodec = {
|
|
54
|
+
encode(event) {
|
|
55
|
+
const base = {
|
|
56
|
+
id: event.id,
|
|
57
|
+
tid: event.tid,
|
|
58
|
+
seq: event.seq,
|
|
59
|
+
timestamp: event.timestamp.getTime(),
|
|
60
|
+
metadata: event.metadata ?? null,
|
|
61
|
+
};
|
|
62
|
+
// System events have no data
|
|
63
|
+
if (event.kind === "system") {
|
|
64
|
+
return { ...base, kind: "system", data: null };
|
|
65
|
+
}
|
|
66
|
+
// Extract data (everything except base fields and kind)
|
|
67
|
+
const { id, tid, seq, timestamp, metadata, kind, ...data } = event;
|
|
68
|
+
return {
|
|
69
|
+
...base,
|
|
70
|
+
kind: event.kind,
|
|
71
|
+
data,
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
decode(record) {
|
|
75
|
+
const base = {
|
|
76
|
+
id: record.id,
|
|
77
|
+
tid: record.tid,
|
|
78
|
+
seq: record.seq,
|
|
79
|
+
timestamp: new Date(record.timestamp),
|
|
80
|
+
metadata: record.metadata ?? {},
|
|
81
|
+
};
|
|
82
|
+
// System events have no data
|
|
83
|
+
if (record.kind === "system") {
|
|
84
|
+
return { ...base, kind: "system" };
|
|
85
|
+
}
|
|
86
|
+
// For non-system events, data is always a record (enforced by schema)
|
|
87
|
+
return {
|
|
88
|
+
...base,
|
|
89
|
+
kind: record.kind,
|
|
90
|
+
...record.data,
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
export const ThreadEventRecordCodec = neapolitanCodec({
|
|
95
|
+
codec: rawThreadEventCodec,
|
|
96
|
+
schema: ThreadEventRecordSchema,
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* NewThread codec - converts NewThread input to ThreadRecord for insertion.
|
|
100
|
+
*
|
|
101
|
+
* Handles default values at encoding time (tick=0, state="stopped", timestamps=now).
|
|
102
|
+
*/
|
|
103
|
+
const rawNewThreadCodec = {
|
|
104
|
+
encode(thread) {
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
return {
|
|
107
|
+
id: thread.id,
|
|
108
|
+
namespace: thread.namespace,
|
|
109
|
+
agent_id: thread.agentId,
|
|
110
|
+
model: thread.model,
|
|
111
|
+
context: thread.context ?? {},
|
|
112
|
+
tick: thread.tick ?? 0,
|
|
113
|
+
state: thread.state ?? STOPPED,
|
|
114
|
+
parent_task_id: thread.parentTaskId ?? null,
|
|
115
|
+
metadata: thread.metadata ?? null,
|
|
116
|
+
created_at: thread.createdAt?.getTime() ?? now,
|
|
117
|
+
updated_at: thread.updatedAt?.getTime() ?? now,
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
decode(record) {
|
|
121
|
+
return {
|
|
122
|
+
id: record.id,
|
|
123
|
+
namespace: record.namespace,
|
|
124
|
+
agentId: record.agent_id,
|
|
125
|
+
model: record.model,
|
|
126
|
+
context: record.context,
|
|
127
|
+
tick: record.tick,
|
|
128
|
+
state: record.state,
|
|
129
|
+
parentTaskId: record.parent_task_id,
|
|
130
|
+
metadata: record.metadata,
|
|
131
|
+
createdAt: new Date(record.created_at),
|
|
132
|
+
updatedAt: new Date(record.updated_at),
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
export const NewThreadCodec = neapolitanCodec({
|
|
137
|
+
codec: rawNewThreadCodec,
|
|
138
|
+
schema: ThreadRecordSchema,
|
|
139
|
+
});
|
package/dist/table.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema name for all kernl tables.
|
|
3
|
+
*/
|
|
4
|
+
export declare const SCHEMA_NAME = "kernl";
|
|
5
|
+
/**
|
|
6
|
+
* Table definition with name, columns, and optional constraints.
|
|
7
|
+
*/
|
|
8
|
+
export interface Table<Name extends string, Cols extends Record<string, Column>> {
|
|
9
|
+
name: Name;
|
|
10
|
+
columns: Cols;
|
|
11
|
+
constraints?: TableConstraint[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Define a table with name, columns, and optional constraints.
|
|
15
|
+
*/
|
|
16
|
+
export declare function defineTable<const Name extends string, const Cols extends Record<string, Column>>(name: Name, columns: Cols, constraints?: TableConstraint[]): Table<Name, Cols>;
|
|
17
|
+
export type ColumnType = "text" | "integer" | "bigint" | "jsonb";
|
|
18
|
+
export type OnDeleteAction = "CASCADE" | "SET NULL" | "RESTRICT";
|
|
19
|
+
/**
|
|
20
|
+
* Column definition with type and constraints.
|
|
21
|
+
*/
|
|
22
|
+
export interface Column<T = unknown> {
|
|
23
|
+
type: ColumnType;
|
|
24
|
+
_table?: string;
|
|
25
|
+
_column?: string;
|
|
26
|
+
_pk?: boolean;
|
|
27
|
+
_nullable?: boolean;
|
|
28
|
+
_unique?: boolean;
|
|
29
|
+
_default?: T;
|
|
30
|
+
_fk?: {
|
|
31
|
+
table: string;
|
|
32
|
+
column: string;
|
|
33
|
+
};
|
|
34
|
+
_onDelete?: OnDeleteAction;
|
|
35
|
+
primaryKey(): Column<T>;
|
|
36
|
+
nullable(): Column<T>;
|
|
37
|
+
default(val: T): Column<T>;
|
|
38
|
+
unique(): Column<T>;
|
|
39
|
+
references(ref: () => Column, opts?: {
|
|
40
|
+
onDelete?: OnDeleteAction;
|
|
41
|
+
}): Column<T>;
|
|
42
|
+
encode(val: T): string;
|
|
43
|
+
decode(val: string): T;
|
|
44
|
+
}
|
|
45
|
+
export declare const text: () => Column<string>;
|
|
46
|
+
export declare const integer: () => Column<number>;
|
|
47
|
+
export declare const bigint: () => Column<number>;
|
|
48
|
+
export declare const jsonb: <T = unknown>() => Column<T>;
|
|
49
|
+
export declare const timestamps: {
|
|
50
|
+
created_at: Column<number>;
|
|
51
|
+
updated_at: Column<number>;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Table-level constraint types.
|
|
55
|
+
*/
|
|
56
|
+
export type TableConstraint = UniqueConstraint | PrimaryKeyConstraint | ForeignKeyConstraint | CheckConstraint | IndexConstraint;
|
|
57
|
+
export interface UniqueConstraint {
|
|
58
|
+
readonly kind: "unique";
|
|
59
|
+
columns: string[];
|
|
60
|
+
name?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface IndexConstraint {
|
|
63
|
+
readonly kind: "index";
|
|
64
|
+
columns: string[];
|
|
65
|
+
unique?: boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface PrimaryKeyConstraint {
|
|
68
|
+
readonly kind: "pkey";
|
|
69
|
+
columns: string[];
|
|
70
|
+
name?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ForeignKeyConstraint {
|
|
73
|
+
readonly kind: "fkey";
|
|
74
|
+
columns: string[];
|
|
75
|
+
references: {
|
|
76
|
+
table: string;
|
|
77
|
+
columns: string[];
|
|
78
|
+
};
|
|
79
|
+
onDelete?: OnDeleteAction;
|
|
80
|
+
name?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface CheckConstraint {
|
|
83
|
+
readonly kind: "check";
|
|
84
|
+
expression: string;
|
|
85
|
+
name?: string;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
|
package/dist/table.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema name for all kernl tables.
|
|
3
|
+
*/
|
|
4
|
+
export const SCHEMA_NAME = "kernl";
|
|
5
|
+
/**
|
|
6
|
+
* Define a table with name, columns, and optional constraints.
|
|
7
|
+
*/
|
|
8
|
+
export function defineTable(name, columns, constraints) {
|
|
9
|
+
// set table/column metadata on each column for FK resolution
|
|
10
|
+
for (const cname in columns) {
|
|
11
|
+
columns[cname]._table = name;
|
|
12
|
+
columns[cname]._column = cname;
|
|
13
|
+
}
|
|
14
|
+
return { name, columns, constraints };
|
|
15
|
+
}
|
|
16
|
+
export const text = () => col("text");
|
|
17
|
+
export const integer = () => col("integer");
|
|
18
|
+
export const bigint = () => col("bigint");
|
|
19
|
+
export const jsonb = () => col("jsonb");
|
|
20
|
+
export const timestamps = {
|
|
21
|
+
created_at: bigint(),
|
|
22
|
+
updated_at: bigint(),
|
|
23
|
+
};
|
|
24
|
+
function col(type) {
|
|
25
|
+
const c = {
|
|
26
|
+
type,
|
|
27
|
+
primaryKey() {
|
|
28
|
+
this._pk = true;
|
|
29
|
+
return this;
|
|
30
|
+
},
|
|
31
|
+
nullable() {
|
|
32
|
+
this._nullable = true;
|
|
33
|
+
return this;
|
|
34
|
+
},
|
|
35
|
+
default(val) {
|
|
36
|
+
this._default = val;
|
|
37
|
+
return this;
|
|
38
|
+
},
|
|
39
|
+
unique() {
|
|
40
|
+
this._unique = true;
|
|
41
|
+
return this;
|
|
42
|
+
},
|
|
43
|
+
references(ref, opts) {
|
|
44
|
+
const targetCol = ref();
|
|
45
|
+
if (targetCol._table && targetCol._column) {
|
|
46
|
+
this._fk = {
|
|
47
|
+
table: targetCol._table,
|
|
48
|
+
column: targetCol._column,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
this._onDelete = opts?.onDelete;
|
|
52
|
+
return this;
|
|
53
|
+
},
|
|
54
|
+
encode(val) {
|
|
55
|
+
if (val === null || val === undefined)
|
|
56
|
+
return "NULL";
|
|
57
|
+
switch (this.type) {
|
|
58
|
+
case "text":
|
|
59
|
+
return `'${String(val).replace(/'/g, "''")}'`;
|
|
60
|
+
case "integer":
|
|
61
|
+
case "bigint":
|
|
62
|
+
return String(val);
|
|
63
|
+
case "jsonb":
|
|
64
|
+
return `'${JSON.stringify(val)}'`;
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
decode(val) {
|
|
68
|
+
switch (this.type) {
|
|
69
|
+
case "text":
|
|
70
|
+
return val;
|
|
71
|
+
case "integer":
|
|
72
|
+
case "bigint":
|
|
73
|
+
return Number.parseInt(val, 10);
|
|
74
|
+
case "jsonb":
|
|
75
|
+
return JSON.parse(val);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
return c;
|
|
80
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/thread/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread record schemas and table definitions.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
/**
|
|
6
|
+
* Threads table schema.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TABLE_THREADS: import("../table").Table<"threads", {
|
|
9
|
+
readonly created_at: import("../table").Column<number>;
|
|
10
|
+
readonly updated_at: import("../table").Column<number>;
|
|
11
|
+
readonly id: import("../table").Column<string>;
|
|
12
|
+
readonly namespace: import("../table").Column<string>;
|
|
13
|
+
readonly agent_id: import("../table").Column<string>;
|
|
14
|
+
readonly model: import("../table").Column<string>;
|
|
15
|
+
readonly context: import("../table").Column<unknown>;
|
|
16
|
+
readonly parent_task_id: import("../table").Column<string>;
|
|
17
|
+
readonly tick: import("../table").Column<number>;
|
|
18
|
+
readonly state: import("../table").Column<string>;
|
|
19
|
+
readonly metadata: import("../table").Column<unknown>;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Thread events table schema.
|
|
23
|
+
*/
|
|
24
|
+
export declare const TABLE_THREAD_EVENTS: import("../table").Table<"thread_events", {
|
|
25
|
+
readonly id: import("../table").Column<string>;
|
|
26
|
+
readonly tid: import("../table").Column<string>;
|
|
27
|
+
readonly seq: import("../table").Column<number>;
|
|
28
|
+
readonly kind: import("../table").Column<string>;
|
|
29
|
+
readonly timestamp: import("../table").Column<number>;
|
|
30
|
+
readonly data: import("../table").Column<unknown>;
|
|
31
|
+
readonly metadata: import("../table").Column<unknown>;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Migrations table.
|
|
35
|
+
*/
|
|
36
|
+
export declare const TABLE_MIGRATIONS: import("../table").Table<"migrations", {
|
|
37
|
+
readonly id: import("../table").Column<string>;
|
|
38
|
+
readonly applied_at: import("../table").Column<number>;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Thread record schema (zod-first).
|
|
42
|
+
*/
|
|
43
|
+
export declare const ThreadRecordSchema: z.ZodObject<{
|
|
44
|
+
id: z.ZodString;
|
|
45
|
+
namespace: z.ZodString;
|
|
46
|
+
agent_id: z.ZodString;
|
|
47
|
+
model: z.ZodString;
|
|
48
|
+
context: z.ZodUnknown;
|
|
49
|
+
parent_task_id: z.ZodNullable<z.ZodString>;
|
|
50
|
+
tick: z.ZodNumber;
|
|
51
|
+
state: z.ZodEnum<{
|
|
52
|
+
running: "running";
|
|
53
|
+
stopped: "stopped";
|
|
54
|
+
interruptible: "interruptible";
|
|
55
|
+
uninterruptible: "uninterruptible";
|
|
56
|
+
zombie: "zombie";
|
|
57
|
+
dead: "dead";
|
|
58
|
+
}>;
|
|
59
|
+
created_at: z.ZodNumber;
|
|
60
|
+
updated_at: z.ZodNumber;
|
|
61
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
62
|
+
}, z.core.$strip>;
|
|
63
|
+
export type ThreadRecord = z.infer<typeof ThreadRecordSchema>;
|
|
64
|
+
/**
|
|
65
|
+
* Thread event inner data - stored in JSONB column.
|
|
66
|
+
*
|
|
67
|
+
* Always an object (record) for non-system events. Inner data is validated by protocol layer
|
|
68
|
+
* and is already JSON-serializable. The actual structure depends on the event kind:
|
|
69
|
+
* - message: {role, content, ...}
|
|
70
|
+
* - tool-call: {callId, toolId, state, arguments}
|
|
71
|
+
* - tool-result: {callId, toolId, state, result, error}
|
|
72
|
+
* - reasoning: {text}
|
|
73
|
+
* - system: null (handled separately)
|
|
74
|
+
*/
|
|
75
|
+
export declare const ThreadEventInnerSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
76
|
+
export type ThreadEventInner = z.infer<typeof ThreadEventInnerSchema>;
|
|
77
|
+
/**
|
|
78
|
+
* Thread event record schema (discriminated union by kind).
|
|
79
|
+
*/
|
|
80
|
+
export declare const ThreadEventRecordSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
81
|
+
id: z.ZodString;
|
|
82
|
+
tid: z.ZodString;
|
|
83
|
+
seq: z.ZodNumber;
|
|
84
|
+
timestamp: z.ZodNumber;
|
|
85
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
86
|
+
kind: z.ZodLiteral<"message">;
|
|
87
|
+
data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
88
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
89
|
+
id: z.ZodString;
|
|
90
|
+
tid: z.ZodString;
|
|
91
|
+
seq: z.ZodNumber;
|
|
92
|
+
timestamp: z.ZodNumber;
|
|
93
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
94
|
+
kind: z.ZodLiteral<"reasoning">;
|
|
95
|
+
data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
96
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
97
|
+
id: z.ZodString;
|
|
98
|
+
tid: z.ZodString;
|
|
99
|
+
seq: z.ZodNumber;
|
|
100
|
+
timestamp: z.ZodNumber;
|
|
101
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
102
|
+
kind: z.ZodLiteral<"tool-call">;
|
|
103
|
+
data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
104
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
105
|
+
id: z.ZodString;
|
|
106
|
+
tid: z.ZodString;
|
|
107
|
+
seq: z.ZodNumber;
|
|
108
|
+
timestamp: z.ZodNumber;
|
|
109
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
110
|
+
kind: z.ZodLiteral<"tool-result">;
|
|
111
|
+
data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
112
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
113
|
+
id: z.ZodString;
|
|
114
|
+
tid: z.ZodString;
|
|
115
|
+
seq: z.ZodNumber;
|
|
116
|
+
timestamp: z.ZodNumber;
|
|
117
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
118
|
+
kind: z.ZodLiteral<"system">;
|
|
119
|
+
data: z.ZodNull;
|
|
120
|
+
}, z.core.$strip>], "kind">;
|
|
121
|
+
export type ThreadEventRecord = z.infer<typeof ThreadEventRecordSchema>;
|
|
122
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/thread/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;EAsBzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;EAqB/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;EAG3B,CAAC;AAIH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;iBAY7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,wCAAoC,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAqDtE;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAMlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|