@loreai/core 0.0.1 → 0.10.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/LICENSE +21 -0
- package/README.md +26 -5
- package/dist/bun/agents-file.d.ts +59 -0
- package/dist/bun/agents-file.d.ts.map +1 -0
- package/dist/bun/config.d.ts +58 -0
- package/dist/bun/config.d.ts.map +1 -0
- package/dist/bun/curator.d.ts +35 -0
- package/dist/bun/curator.d.ts.map +1 -0
- package/dist/bun/db/driver.bun.d.ts +5 -0
- package/dist/bun/db/driver.bun.d.ts.map +1 -0
- package/dist/bun/db/driver.node.d.ts +15 -0
- package/dist/bun/db/driver.node.d.ts.map +1 -0
- package/dist/bun/db.d.ts +22 -0
- package/dist/bun/db.d.ts.map +1 -0
- package/dist/bun/distillation.d.ts +32 -0
- package/dist/bun/distillation.d.ts.map +1 -0
- package/dist/bun/embedding.d.ts +90 -0
- package/dist/bun/embedding.d.ts.map +1 -0
- package/dist/bun/gradient.d.ts +73 -0
- package/dist/bun/gradient.d.ts.map +1 -0
- package/dist/bun/index.d.ts +19 -0
- package/dist/bun/index.d.ts.map +1 -0
- package/dist/bun/index.js +28236 -0
- package/dist/bun/index.js.map +7 -0
- package/dist/bun/lat-reader.d.ts +69 -0
- package/dist/bun/lat-reader.d.ts.map +1 -0
- package/dist/bun/log.d.ts +17 -0
- package/dist/bun/log.d.ts.map +1 -0
- package/dist/bun/ltm.d.ts +138 -0
- package/dist/bun/ltm.d.ts.map +1 -0
- package/dist/bun/markdown.d.ts +37 -0
- package/dist/bun/markdown.d.ts.map +1 -0
- package/dist/bun/prompt.d.ts +47 -0
- package/dist/bun/prompt.d.ts.map +1 -0
- package/dist/bun/recall.d.ts +41 -0
- package/dist/bun/recall.d.ts.map +1 -0
- package/dist/bun/search.d.ts +113 -0
- package/dist/bun/search.d.ts.map +1 -0
- package/dist/bun/temporal.d.ts +66 -0
- package/dist/bun/temporal.d.ts.map +1 -0
- package/dist/bun/types.d.ts +180 -0
- package/dist/bun/types.d.ts.map +1 -0
- package/dist/bun/worker.d.ts +6 -0
- package/dist/bun/worker.d.ts.map +1 -0
- package/dist/node/agents-file.d.ts +59 -0
- package/dist/node/agents-file.d.ts.map +1 -0
- package/dist/node/config.d.ts +58 -0
- package/dist/node/config.d.ts.map +1 -0
- package/dist/node/curator.d.ts +35 -0
- package/dist/node/curator.d.ts.map +1 -0
- package/dist/node/db/driver.bun.d.ts +5 -0
- package/dist/node/db/driver.bun.d.ts.map +1 -0
- package/dist/node/db/driver.node.d.ts +15 -0
- package/dist/node/db/driver.node.d.ts.map +1 -0
- package/dist/node/db.d.ts +22 -0
- package/dist/node/db.d.ts.map +1 -0
- package/dist/node/distillation.d.ts +32 -0
- package/dist/node/distillation.d.ts.map +1 -0
- package/dist/node/embedding.d.ts +90 -0
- package/dist/node/embedding.d.ts.map +1 -0
- package/dist/node/gradient.d.ts +73 -0
- package/dist/node/gradient.d.ts.map +1 -0
- package/dist/node/index.d.ts +19 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +28253 -0
- package/dist/node/index.js.map +7 -0
- package/dist/node/lat-reader.d.ts +69 -0
- package/dist/node/lat-reader.d.ts.map +1 -0
- package/dist/node/log.d.ts +17 -0
- package/dist/node/log.d.ts.map +1 -0
- package/dist/node/ltm.d.ts +138 -0
- package/dist/node/ltm.d.ts.map +1 -0
- package/dist/node/markdown.d.ts +37 -0
- package/dist/node/markdown.d.ts.map +1 -0
- package/dist/node/prompt.d.ts +47 -0
- package/dist/node/prompt.d.ts.map +1 -0
- package/dist/node/recall.d.ts +41 -0
- package/dist/node/recall.d.ts.map +1 -0
- package/dist/node/search.d.ts +113 -0
- package/dist/node/search.d.ts.map +1 -0
- package/dist/node/temporal.d.ts +66 -0
- package/dist/node/temporal.d.ts.map +1 -0
- package/dist/node/types.d.ts +180 -0
- package/dist/node/types.d.ts.map +1 -0
- package/dist/node/worker.d.ts +6 -0
- package/dist/node/worker.d.ts.map +1 -0
- package/dist/types/agents-file.d.ts +59 -0
- package/dist/types/agents-file.d.ts.map +1 -0
- package/dist/types/config.d.ts +58 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/curator.d.ts +35 -0
- package/dist/types/curator.d.ts.map +1 -0
- package/dist/types/db/driver.bun.d.ts +5 -0
- package/dist/types/db/driver.bun.d.ts.map +1 -0
- package/dist/types/db/driver.node.d.ts +15 -0
- package/dist/types/db/driver.node.d.ts.map +1 -0
- package/dist/types/db.d.ts +22 -0
- package/dist/types/db.d.ts.map +1 -0
- package/dist/types/distillation.d.ts +32 -0
- package/dist/types/distillation.d.ts.map +1 -0
- package/dist/types/embedding.d.ts +90 -0
- package/dist/types/embedding.d.ts.map +1 -0
- package/dist/types/gradient.d.ts +73 -0
- package/dist/types/gradient.d.ts.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lat-reader.d.ts +69 -0
- package/dist/types/lat-reader.d.ts.map +1 -0
- package/dist/types/log.d.ts +17 -0
- package/dist/types/log.d.ts.map +1 -0
- package/dist/types/ltm.d.ts +138 -0
- package/dist/types/ltm.d.ts.map +1 -0
- package/dist/types/markdown.d.ts +37 -0
- package/dist/types/markdown.d.ts.map +1 -0
- package/dist/types/prompt.d.ts +47 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/recall.d.ts +41 -0
- package/dist/types/recall.d.ts.map +1 -0
- package/dist/types/search.d.ts +113 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/temporal.d.ts +66 -0
- package/dist/types/temporal.d.ts.map +1 -0
- package/dist/types/types.d.ts +180 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/worker.d.ts +6 -0
- package/dist/types/worker.d.ts.map +1 -0
- package/package.json +48 -5
- package/src/agents-file.ts +406 -0
- package/src/config.ts +132 -0
- package/src/curator.ts +220 -0
- package/src/db/driver.bun.ts +18 -0
- package/src/db/driver.node.ts +54 -0
- package/src/db.ts +433 -0
- package/src/distillation.ts +433 -0
- package/src/embedding.ts +528 -0
- package/src/gradient.ts +1387 -0
- package/src/index.ts +109 -0
- package/src/lat-reader.ts +374 -0
- package/src/log.ts +27 -0
- package/src/ltm.ts +861 -0
- package/src/markdown.ts +129 -0
- package/src/prompt.ts +454 -0
- package/src/recall.ts +446 -0
- package/src/search.ts +330 -0
- package/src/temporal.ts +379 -0
- package/src/types.ts +199 -0
- package/src/worker.ts +26 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-agnostic message and part types for Lore's core memory engine.
|
|
3
|
+
*
|
|
4
|
+
* These replace the direct dependency on `@opencode-ai/sdk`'s `Message` and
|
|
5
|
+
* `Part` types so the core can run under any host (OpenCode, Pi, future ACP
|
|
6
|
+
* server, etc.). Each host adapter converts between its native types and these
|
|
7
|
+
* Lore-internal types at the hook boundary.
|
|
8
|
+
*
|
|
9
|
+
* The type surface is intentionally minimal — only the fields that Lore's
|
|
10
|
+
* runtime code actually reads/writes are included. Fields that only exist for
|
|
11
|
+
* the host's UI or for features Lore doesn't touch are omitted.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Messages
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
export type LoreUserMessage = {
|
|
19
|
+
id: string;
|
|
20
|
+
sessionID: string;
|
|
21
|
+
role: "user";
|
|
22
|
+
time: { created: number };
|
|
23
|
+
/** Agent name (e.g. "build", "plan"). Host-specific; stored as metadata. */
|
|
24
|
+
agent: string;
|
|
25
|
+
/** Model used for this turn. Stored as metadata. */
|
|
26
|
+
model: { providerID: string; modelID: string };
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type LoreAssistantMessage = {
|
|
30
|
+
id: string;
|
|
31
|
+
sessionID: string;
|
|
32
|
+
role: "assistant";
|
|
33
|
+
time: { created: number };
|
|
34
|
+
parentID: string;
|
|
35
|
+
modelID: string;
|
|
36
|
+
providerID: string;
|
|
37
|
+
mode: string;
|
|
38
|
+
path: { cwd: string; root: string };
|
|
39
|
+
cost: number;
|
|
40
|
+
tokens: {
|
|
41
|
+
input: number;
|
|
42
|
+
output: number;
|
|
43
|
+
reasoning: number;
|
|
44
|
+
cache: { read: number; write: number };
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** Discriminated union on `.role`. */
|
|
49
|
+
export type LoreMessage = LoreUserMessage | LoreAssistantMessage;
|
|
50
|
+
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Parts
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
export type LoreTextPart = {
|
|
56
|
+
id: string;
|
|
57
|
+
sessionID: string;
|
|
58
|
+
messageID: string;
|
|
59
|
+
type: "text";
|
|
60
|
+
text: string;
|
|
61
|
+
/** Marks Lore-injected synthetic messages (e.g. distilled prefix). */
|
|
62
|
+
synthetic?: boolean;
|
|
63
|
+
/** Optional timing info — present on real messages, faked on synthetics. */
|
|
64
|
+
time?: { start: number; end?: number };
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export type LoreReasoningPart = {
|
|
68
|
+
id: string;
|
|
69
|
+
sessionID: string;
|
|
70
|
+
messageID: string;
|
|
71
|
+
type: "reasoning";
|
|
72
|
+
text: string;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export type LoreToolStatePending = {
|
|
76
|
+
status: "pending";
|
|
77
|
+
input: unknown;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export type LoreToolStateRunning = {
|
|
81
|
+
status: "running";
|
|
82
|
+
input: unknown;
|
|
83
|
+
metadata?: unknown;
|
|
84
|
+
time: { start: number };
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export type LoreToolStateCompleted = {
|
|
88
|
+
status: "completed";
|
|
89
|
+
input: unknown;
|
|
90
|
+
output: string;
|
|
91
|
+
metadata?: unknown;
|
|
92
|
+
time: { start: number; end: number };
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export type LoreToolStateError = {
|
|
96
|
+
status: "error";
|
|
97
|
+
input: unknown;
|
|
98
|
+
error: string;
|
|
99
|
+
metadata?: unknown;
|
|
100
|
+
time: { start: number; end: number };
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export type LoreToolState =
|
|
104
|
+
| LoreToolStatePending
|
|
105
|
+
| LoreToolStateRunning
|
|
106
|
+
| LoreToolStateCompleted
|
|
107
|
+
| LoreToolStateError;
|
|
108
|
+
|
|
109
|
+
export type LoreToolPart = {
|
|
110
|
+
id: string;
|
|
111
|
+
sessionID: string;
|
|
112
|
+
messageID: string;
|
|
113
|
+
type: "tool";
|
|
114
|
+
tool: string;
|
|
115
|
+
callID: string;
|
|
116
|
+
state: LoreToolState;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Discriminated union on `.type`.
|
|
121
|
+
*
|
|
122
|
+
* Only `text`, `reasoning`, and `tool` are processed by Lore's core logic.
|
|
123
|
+
* All other part types (step-start, snapshot, patch, agent, retry, etc.) flow
|
|
124
|
+
* through untouched — they hit the `else` branch with a flat 20-token estimate
|
|
125
|
+
* in `estimateParts()` and are preserved as-is in the message transform.
|
|
126
|
+
*
|
|
127
|
+
* For type-safe narrowing, use `isToolPart()` / `isTextPart()` helpers below.
|
|
128
|
+
*/
|
|
129
|
+
export type LorePart = LoreTextPart | LoreReasoningPart | LoreToolPart | LoreGenericPart;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Passthrough for host-specific part types that Lore doesn't process.
|
|
133
|
+
* The `type` field is typed as `string` since Lore only cares that it's not
|
|
134
|
+
* one of the three known types.
|
|
135
|
+
*/
|
|
136
|
+
export type LoreGenericPart = {
|
|
137
|
+
type: string;
|
|
138
|
+
[key: string]: unknown;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// Type guard helpers for narrowing LorePart in core logic.
|
|
142
|
+
export function isTextPart(p: LorePart): p is LoreTextPart {
|
|
143
|
+
return p.type === "text";
|
|
144
|
+
}
|
|
145
|
+
export function isReasoningPart(p: LorePart): p is LoreReasoningPart {
|
|
146
|
+
return p.type === "reasoning";
|
|
147
|
+
}
|
|
148
|
+
export function isToolPart(p: LorePart): p is LoreToolPart {
|
|
149
|
+
return p.type === "tool";
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Message with parts (the unit that hooks operate on)
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
|
|
156
|
+
export type LoreMessageWithParts = {
|
|
157
|
+
info: LoreMessage;
|
|
158
|
+
parts: LorePart[];
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
// LLM Client — the only host API Lore's background tasks need
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Abstract interface for single-turn LLM prompt→response.
|
|
167
|
+
*
|
|
168
|
+
* All of Lore's background LLM work (distillation, curation, query expansion)
|
|
169
|
+
* is single-turn: one system+user message in, one text response out. No tool
|
|
170
|
+
* calling, no multi-turn. This interface captures that minimal surface.
|
|
171
|
+
*
|
|
172
|
+
* Host adapters implement this:
|
|
173
|
+
* - OpenCode: wraps `client.session.create()` + `client.session.prompt()`
|
|
174
|
+
* - Pi: wraps `complete()` from `@mariozechner/pi-ai`
|
|
175
|
+
* - Standalone: direct `fetch()` to provider APIs
|
|
176
|
+
*/
|
|
177
|
+
export interface LLMClient {
|
|
178
|
+
/**
|
|
179
|
+
* Send a single prompt and return the text response.
|
|
180
|
+
*
|
|
181
|
+
* @param system System prompt text
|
|
182
|
+
* @param user User message text
|
|
183
|
+
* @param opts Optional model selection and worker identification
|
|
184
|
+
* @returns The assistant's text response, or null on failure
|
|
185
|
+
*/
|
|
186
|
+
prompt(
|
|
187
|
+
system: string,
|
|
188
|
+
user: string,
|
|
189
|
+
opts?: {
|
|
190
|
+
/** Override model for this call. */
|
|
191
|
+
model?: { providerID: string; modelID: string };
|
|
192
|
+
/**
|
|
193
|
+
* Opaque worker identifier used by the host to route the request
|
|
194
|
+
* (e.g. OpenCode uses this as the session agent name).
|
|
195
|
+
*/
|
|
196
|
+
workerID?: string;
|
|
197
|
+
},
|
|
198
|
+
): Promise<string | null>;
|
|
199
|
+
}
|
package/src/worker.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker session tracking and the LLMClient contract.
|
|
3
|
+
*
|
|
4
|
+
* All lore background tasks (distillation, curation, query expansion) use
|
|
5
|
+
* the LLMClient interface for single-turn LLM calls. The actual prompting
|
|
6
|
+
* is implemented by the host adapter (OpenCode, Pi, etc.).
|
|
7
|
+
*
|
|
8
|
+
* This module owns the shared workerSessionIDs set — used by host adapters
|
|
9
|
+
* to skip storing/distilling worker session messages.
|
|
10
|
+
*/
|
|
11
|
+
import type { LLMClient } from "./types";
|
|
12
|
+
|
|
13
|
+
// Re-export for convenience
|
|
14
|
+
export type { LLMClient } from "./types";
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Shared worker session tracking
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
/** Set of ALL worker session IDs across distillation, curator, and query expansion.
|
|
21
|
+
* Used by shouldSkip() in host adapters to avoid storing/distilling worker messages. */
|
|
22
|
+
export const workerSessionIDs = new Set<string>();
|
|
23
|
+
|
|
24
|
+
export function isWorkerSession(sessionID: string): boolean {
|
|
25
|
+
return workerSessionIDs.has(sessionID);
|
|
26
|
+
}
|