@agentfold/proxy 0.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/LICENSE +21 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.d.ts +50 -0
- package/dist/runtime.js +451 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +171 -0
- package/dist/server.js.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AgentFold contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AgentFoldConfig, RequestMetrics } from "@agentfold/shared";
|
|
2
|
+
import { AgentFoldStore } from "@agentfold/store";
|
|
3
|
+
/**
|
|
4
|
+
* AgentFoldRuntime �?orchestration shared by the HTTP proxy, MCP server and CLI.
|
|
5
|
+
*
|
|
6
|
+
* RAW HISTORY IS SOURCE OF TRUTH: every tool result is persisted (redacted)
|
|
7
|
+
* into the immutable ledger before folding, so every [AFOLD:id] is recoverable.
|
|
8
|
+
*
|
|
9
|
+
* Fail-open is the caller's responsibility (proxy/server.ts): this class
|
|
10
|
+
* returns { ok:false } on internal errors instead of throwing at the wire.
|
|
11
|
+
*/
|
|
12
|
+
export declare const VERSION = "0.1.0";
|
|
13
|
+
export interface RuntimeResult<T> {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
body?: T;
|
|
16
|
+
metrics?: RequestMetrics;
|
|
17
|
+
warning?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RecallOptions {
|
|
20
|
+
grep?: string;
|
|
21
|
+
lineStart?: number;
|
|
22
|
+
lineEnd?: number;
|
|
23
|
+
tokenCap?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface RecallOutput {
|
|
26
|
+
foldId: string;
|
|
27
|
+
content: string;
|
|
28
|
+
truncated: boolean;
|
|
29
|
+
grepApplied: boolean;
|
|
30
|
+
integrityVerified: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare class AgentFoldRuntime {
|
|
33
|
+
readonly config: AgentFoldConfig;
|
|
34
|
+
readonly store: AgentFoldStore;
|
|
35
|
+
constructor(config: AgentFoldConfig, store: AgentFoldStore);
|
|
36
|
+
handleChatCompletions(body: Record<string, unknown>): RuntimeResult<Record<string, unknown>>;
|
|
37
|
+
handleResponses(body: Record<string, unknown>): RuntimeResult<Record<string, unknown>>;
|
|
38
|
+
recall(foldId: string, opts?: RecallOptions): RecallOutput;
|
|
39
|
+
status(): Record<string, unknown>;
|
|
40
|
+
handoff(sessionId: string): Record<string, unknown>;
|
|
41
|
+
private retrieveContextBlocks;
|
|
42
|
+
private persistChatEvents;
|
|
43
|
+
private persistResponseEvents;
|
|
44
|
+
private persistFolds;
|
|
45
|
+
/** Insert compiler injection blocks (pinned/task/memory) as chat messages. */
|
|
46
|
+
private mergeInjectionMessages;
|
|
47
|
+
private mergeInjectionItems;
|
|
48
|
+
}
|
|
49
|
+
export declare function deriveSessionId(model: string, keys: string[]): string;
|
|
50
|
+
export declare function grepWithContext(content: string, pattern: string, contextLines?: number): string;
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { AgentFoldError } from "@agentfold/shared";
|
|
3
|
+
import { applyChatFoldPatches, applyResponsesFoldPatches, buildFoldDigest, chatFoldContent, chatToBlocks, compileContext, deriveFoldId, estimateTokens, extractAnchors, redactSecrets, responsesFoldContent, responsesToBlocks } from "@agentfold/core";
|
|
4
|
+
/**
|
|
5
|
+
* AgentFoldRuntime �?orchestration shared by the HTTP proxy, MCP server and CLI.
|
|
6
|
+
*
|
|
7
|
+
* RAW HISTORY IS SOURCE OF TRUTH: every tool result is persisted (redacted)
|
|
8
|
+
* into the immutable ledger before folding, so every [AFOLD:id] is recoverable.
|
|
9
|
+
*
|
|
10
|
+
* Fail-open is the caller's responsibility (proxy/server.ts): this class
|
|
11
|
+
* returns { ok:false } on internal errors instead of throwing at the wire.
|
|
12
|
+
*/
|
|
13
|
+
export const VERSION = "0.1.0";
|
|
14
|
+
export class AgentFoldRuntime {
|
|
15
|
+
config;
|
|
16
|
+
store;
|
|
17
|
+
constructor(config, store) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
this.store = store;
|
|
20
|
+
}
|
|
21
|
+
// ------------------------------------------------------- chat completions
|
|
22
|
+
handleChatCompletions(body) {
|
|
23
|
+
try {
|
|
24
|
+
const messages = body.messages;
|
|
25
|
+
if (!Array.isArray(messages)) {
|
|
26
|
+
return { ok: false, warning: "missing messages array" };
|
|
27
|
+
}
|
|
28
|
+
const model = typeof body.model === "string" ? body.model : "unknown";
|
|
29
|
+
const chatMessages = messages;
|
|
30
|
+
const sessionId = deriveSessionId(model, chatMessages.map((m) => messageSessionKey(m)));
|
|
31
|
+
const storeOk = this.persistChatEvents(sessionId, model, chatMessages);
|
|
32
|
+
if (!storeOk && !this.config.strictMode) {
|
|
33
|
+
// FAIL OPEN: without the ledger a fold would be unrecoverable.
|
|
34
|
+
return { ok: false, warning: "store unavailable; failing open" };
|
|
35
|
+
}
|
|
36
|
+
const blocks = chatToBlocks(chatMessages);
|
|
37
|
+
const { pinnedText, taskStateText, memoryCards } = this.retrieveContextBlocks(sessionId, blocks);
|
|
38
|
+
const compiled = compileContext({
|
|
39
|
+
model,
|
|
40
|
+
blocks,
|
|
41
|
+
config: this.config,
|
|
42
|
+
sessionId,
|
|
43
|
+
eventIdFor: (blockIndex) => `evt:${sessionId}:${blockIndex}`,
|
|
44
|
+
sequenceFor: (blockIndex) => blockIndex,
|
|
45
|
+
pinnedText,
|
|
46
|
+
taskStateText,
|
|
47
|
+
memoryCards
|
|
48
|
+
});
|
|
49
|
+
this.persistFolds(sessionId, compiled.plan, compiled.blocks);
|
|
50
|
+
this.store.recordMetrics(compiled.metrics);
|
|
51
|
+
// Apply fold patches back onto the original message objects.
|
|
52
|
+
const blockByIndex = new Map(compiled.blocks.map((b) => [b.index, b]));
|
|
53
|
+
const patches = compiled.plan
|
|
54
|
+
.map((entry) => {
|
|
55
|
+
const block = blockByIndex.get(entry.blockIndex);
|
|
56
|
+
if (!block)
|
|
57
|
+
return null;
|
|
58
|
+
return { index: entry.messageIndex, content: chatFoldContent(block, entry.digest) };
|
|
59
|
+
})
|
|
60
|
+
.filter((p) => p != null);
|
|
61
|
+
const patched = applyChatFoldPatches(chatMessages, patches);
|
|
62
|
+
const newBody = { ...body, messages: patched };
|
|
63
|
+
if (pinnedText || memoryCards.length > 0) {
|
|
64
|
+
// Compiler injected blocks are already part of patches? No �?injections
|
|
65
|
+
// are new blocks; add them as messages at the same position.
|
|
66
|
+
newBody.messages = this.mergeInjectionMessages(patched, compiled.blocks);
|
|
67
|
+
}
|
|
68
|
+
return { ok: true, body: newBody, metrics: compiled.metrics };
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
return { ok: false, warning: `compile failed: ${err.message}` };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ------------------------------------------------------------- responses
|
|
75
|
+
handleResponses(body) {
|
|
76
|
+
try {
|
|
77
|
+
const input = body.input;
|
|
78
|
+
const model = typeof body.model === "string" ? body.model : "unknown";
|
|
79
|
+
const { blocks, passthroughItems } = responsesToBlocks(input);
|
|
80
|
+
if (blocks.length === 0) {
|
|
81
|
+
return { ok: false, warning: "no mappable input items" };
|
|
82
|
+
}
|
|
83
|
+
const sessionId = deriveSessionId(model, blocks.map((b) => `${b.kind}:${b.text.slice(0, 200)}`));
|
|
84
|
+
const persisted = this.persistResponseEvents(sessionId, model, input);
|
|
85
|
+
if (!persisted && !this.config.strictMode) {
|
|
86
|
+
return { ok: false, warning: "store unavailable; failing open" };
|
|
87
|
+
}
|
|
88
|
+
const { pinnedText, taskStateText, memoryCards } = this.retrieveContextBlocks(sessionId, blocks);
|
|
89
|
+
const compiled = compileContext({
|
|
90
|
+
model,
|
|
91
|
+
blocks,
|
|
92
|
+
config: this.config,
|
|
93
|
+
sessionId,
|
|
94
|
+
eventIdFor: (blockIndex) => `evt:${sessionId}:${blockIndex}`,
|
|
95
|
+
sequenceFor: (blockIndex) => blockIndex,
|
|
96
|
+
pinnedText,
|
|
97
|
+
taskStateText,
|
|
98
|
+
memoryCards
|
|
99
|
+
});
|
|
100
|
+
this.persistFolds(sessionId, compiled.plan, compiled.blocks);
|
|
101
|
+
this.store.recordMetrics(compiled.metrics);
|
|
102
|
+
const blockByIndex = new Map(compiled.blocks.map((b) => [b.index, b]));
|
|
103
|
+
const items = Array.isArray(input) ? input : [];
|
|
104
|
+
const patches = compiled.plan
|
|
105
|
+
.map((entry) => {
|
|
106
|
+
const block = blockByIndex.get(entry.blockIndex);
|
|
107
|
+
if (!block)
|
|
108
|
+
return null;
|
|
109
|
+
return { index: entry.messageIndex, output: responsesFoldContent(block, entry.digest) };
|
|
110
|
+
})
|
|
111
|
+
.filter((p) => p != null);
|
|
112
|
+
let newInput;
|
|
113
|
+
if (typeof input === "string") {
|
|
114
|
+
newInput = input; // single user string �?never folded
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
newInput = this.mergeInjectionItems(applyResponsesFoldPatches(items, patches), compiled.blocks);
|
|
118
|
+
}
|
|
119
|
+
const newBody = { ...body, input: newInput };
|
|
120
|
+
void passthroughItems;
|
|
121
|
+
return { ok: true, body: newBody, metrics: compiled.metrics };
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
return { ok: false, warning: `compile failed: ${err.message}` };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ------------------------------------------------------------------ recall
|
|
128
|
+
recall(foldId, opts = {}) {
|
|
129
|
+
const { content, integrityVerified } = this.store.recall(foldId);
|
|
130
|
+
const cap = opts.tokenCap ?? this.config.recallTokenCap;
|
|
131
|
+
let out = content;
|
|
132
|
+
let truncated = false;
|
|
133
|
+
let grepApplied = false;
|
|
134
|
+
if (opts.grep) {
|
|
135
|
+
grepApplied = true;
|
|
136
|
+
out = grepWithContext(content, opts.grep);
|
|
137
|
+
}
|
|
138
|
+
if (opts.lineStart != null || opts.lineEnd != null) {
|
|
139
|
+
const lines = out.split("\n");
|
|
140
|
+
const start = Math.max(0, (opts.lineStart ?? 1) - 1);
|
|
141
|
+
const end = Math.min(lines.length, opts.lineEnd ?? lines.length);
|
|
142
|
+
out = lines.slice(start, end).join("\n");
|
|
143
|
+
}
|
|
144
|
+
const tokens = estimateTokens(out);
|
|
145
|
+
if (tokens > cap) {
|
|
146
|
+
const charBudget = cap * 4;
|
|
147
|
+
out = out.slice(0, charBudget) + `\n…[truncated: showing first ~${cap} tokens of ${tokens}]`;
|
|
148
|
+
truncated = true;
|
|
149
|
+
}
|
|
150
|
+
return { foldId, content: out, truncated, grepApplied, integrityVerified };
|
|
151
|
+
}
|
|
152
|
+
// ------------------------------------------------------- status & handoff
|
|
153
|
+
status() {
|
|
154
|
+
const stats = this.store.aggregateStats();
|
|
155
|
+
return {
|
|
156
|
+
version: VERSION,
|
|
157
|
+
healthy: this.store.isHealthy,
|
|
158
|
+
dbPath: this.config.storage.dbPath,
|
|
159
|
+
strictMode: this.config.strictMode,
|
|
160
|
+
foldAt: this.config.foldAt,
|
|
161
|
+
foldStep: this.config.foldStep,
|
|
162
|
+
targetLiveBudgetFraction: this.config.targetLiveBudgetFraction,
|
|
163
|
+
absoluteLiveCap: this.config.absoluteLiveCap,
|
|
164
|
+
redactSecrets: this.config.storage.redactSecrets,
|
|
165
|
+
stats
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
handoff(sessionId) {
|
|
169
|
+
const events = this.store.getEvents(sessionId);
|
|
170
|
+
const firstUser = events.find((e) => e.kind === "user");
|
|
171
|
+
const assistantCount = events.filter((e) => e.kind === "assistant").length;
|
|
172
|
+
const toolResults = events.filter((e) => e.kind === "tool_result");
|
|
173
|
+
const fullText = events.map((e) => e.content).join("\n");
|
|
174
|
+
const { anchors } = extractAnchors(fullText);
|
|
175
|
+
const failedFolds = [];
|
|
176
|
+
const importantFolds = [];
|
|
177
|
+
for (const e of toolResults.slice(-200)) {
|
|
178
|
+
const foldId = deriveFoldId(sessionId, e.sequence, createHash("sha256").update(e.content, "utf8").digest("hex"));
|
|
179
|
+
const fold = this.store.getFold(foldId);
|
|
180
|
+
if (fold) {
|
|
181
|
+
if (fold.resultKind === "failed" || fold.errorCount > 0)
|
|
182
|
+
failedFolds.push(foldId);
|
|
183
|
+
else if (fold.originalTokens > 2000)
|
|
184
|
+
importantFolds.push(foldId);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const pins = this.store.listPins(sessionId).map((p) => p.text);
|
|
188
|
+
return {
|
|
189
|
+
parent_session: sessionId,
|
|
190
|
+
generated_at: new Date().toISOString(),
|
|
191
|
+
goal: firstUser ? firstUser.content.slice(0, 500) : "(unknown)",
|
|
192
|
+
completed_work: `${assistantCount} assistant turns, ${toolResults.length} tool results`,
|
|
193
|
+
files_touched: anchors.filter((a) => /\.[A-Za-z0-9]{1,6}$|\//.test(a)).slice(0, 15),
|
|
194
|
+
decisions: pins.slice(0, 5),
|
|
195
|
+
known_failures: { fold_ids: failedFolds.slice(0, 8) },
|
|
196
|
+
important_folds: importantFolds.slice(0, 8),
|
|
197
|
+
resume_hint: "Use agentfold_recall id=<fold_id> to recover folded details."
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// ------------------------------------------------------------- internals
|
|
201
|
+
retrieveContextBlocks(sessionId, blocks) {
|
|
202
|
+
try {
|
|
203
|
+
const pins = this.store.listPins(sessionId);
|
|
204
|
+
const pinnedText = pins.length > 0 ? pins.map((p) => p.text).join("\n") : null;
|
|
205
|
+
const taskStateText = this.store.getTaskState(sessionId);
|
|
206
|
+
const queryBlock = [...blocks].reverse().find((b) => b.kind === "user");
|
|
207
|
+
const memoryCards = queryBlock && queryBlock.text.length > 8
|
|
208
|
+
? this.store.searchMemories(queryBlock.text.slice(0, 400), {
|
|
209
|
+
sessionId,
|
|
210
|
+
limit: this.config.retrievalTopK
|
|
211
|
+
})
|
|
212
|
+
: [];
|
|
213
|
+
return { pinnedText, taskStateText, memoryCards };
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return { pinnedText: null, taskStateText: null, memoryCards: [] };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
persistChatEvents(sessionId, model, messages) {
|
|
220
|
+
try {
|
|
221
|
+
const now = new Date().toISOString();
|
|
222
|
+
const events = messages.map((msg, sequence) => {
|
|
223
|
+
const raw = msgText(msg);
|
|
224
|
+
const red = this.config.storage.redactSecrets
|
|
225
|
+
? redactSecrets(raw)
|
|
226
|
+
: { content: raw, redacted: false, hadPrivateSection: false };
|
|
227
|
+
return {
|
|
228
|
+
id: `evt:${sessionId}:${sequence}`,
|
|
229
|
+
sessionId,
|
|
230
|
+
sequence,
|
|
231
|
+
timestamp: now,
|
|
232
|
+
kind: kindOfRole(msg.role),
|
|
233
|
+
toolName: msg.name != null ? String(msg.name) : undefined,
|
|
234
|
+
toolCallId: msg.tool_call_id != null ? String(msg.tool_call_id) : undefined,
|
|
235
|
+
content: red.content,
|
|
236
|
+
contentSha256: createHash("sha256").update(red.content, "utf8").digest("hex"),
|
|
237
|
+
metadataJson: safeJson({ toolCalls: msg.tool_calls ?? undefined }),
|
|
238
|
+
tokenEstimate: estimateTokens(red.content),
|
|
239
|
+
sensitive: red.redacted,
|
|
240
|
+
foldable: msg.role === "tool",
|
|
241
|
+
source: "proxy"
|
|
242
|
+
};
|
|
243
|
+
});
|
|
244
|
+
this.store.ensureSession(sessionId, model, undefined, now);
|
|
245
|
+
this.store.appendEvents(events);
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false; // persistence failure -> recall unavailable, folding disabled upstream
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
persistResponseEvents(sessionId, model, input) {
|
|
253
|
+
try {
|
|
254
|
+
if (!Array.isArray(input))
|
|
255
|
+
return true;
|
|
256
|
+
const now = new Date().toISOString();
|
|
257
|
+
const events = [];
|
|
258
|
+
input.forEach((raw, sequence) => {
|
|
259
|
+
const item = (raw ?? {});
|
|
260
|
+
let kind = null;
|
|
261
|
+
let content = "";
|
|
262
|
+
let toolName;
|
|
263
|
+
let toolCallId;
|
|
264
|
+
if (item.type === "message" || item.type == null) {
|
|
265
|
+
kind = kindOfRole(String(item.role ?? "user"));
|
|
266
|
+
content = typeof item.content === "string" ? item.content : safeJson(item.content);
|
|
267
|
+
}
|
|
268
|
+
else if (item.type === "function_call_output") {
|
|
269
|
+
kind = "tool_result";
|
|
270
|
+
content = typeof item.output === "string" ? item.output : safeJson(item.output);
|
|
271
|
+
toolCallId = item.call_id;
|
|
272
|
+
}
|
|
273
|
+
else if (item.type === "function_call") {
|
|
274
|
+
kind = "tool_call";
|
|
275
|
+
content = String(item.arguments ?? "");
|
|
276
|
+
toolName = item.name;
|
|
277
|
+
toolCallId = item.call_id;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
return; // reasoning / unknown items are never persisted
|
|
281
|
+
}
|
|
282
|
+
const red = this.config.storage.redactSecrets
|
|
283
|
+
? redactSecrets(content)
|
|
284
|
+
: { content, redacted: false, hadPrivateSection: false };
|
|
285
|
+
events.push({
|
|
286
|
+
id: `evt:${sessionId}:${sequence}`,
|
|
287
|
+
sessionId,
|
|
288
|
+
sequence,
|
|
289
|
+
timestamp: now,
|
|
290
|
+
kind,
|
|
291
|
+
toolName,
|
|
292
|
+
toolCallId,
|
|
293
|
+
content: red.content,
|
|
294
|
+
contentSha256: createHash("sha256").update(red.content, "utf8").digest("hex"),
|
|
295
|
+
metadataJson: "{}",
|
|
296
|
+
tokenEstimate: estimateTokens(red.content),
|
|
297
|
+
sensitive: red.redacted,
|
|
298
|
+
foldable: kind === "tool_result",
|
|
299
|
+
source: "proxy"
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
this.store.ensureSession(sessionId, model, undefined, now);
|
|
303
|
+
this.store.appendEvents(events);
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
persistFolds(sessionId, plan, blocks) {
|
|
311
|
+
try {
|
|
312
|
+
const blockByIndex = new Map(blocks.map((b) => [b.index, b]));
|
|
313
|
+
for (const entry of plan) {
|
|
314
|
+
const block = blockByIndex.get(entry.blockIndex);
|
|
315
|
+
if (!block)
|
|
316
|
+
continue;
|
|
317
|
+
let record;
|
|
318
|
+
if (entry.record) {
|
|
319
|
+
record = entry.record;
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
record = buildFoldDigest({
|
|
323
|
+
foldId: entry.foldId,
|
|
324
|
+
toolName: block.toolName,
|
|
325
|
+
resultKind: entry.resultKind,
|
|
326
|
+
content: block.text
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
record.sessionId = sessionId;
|
|
330
|
+
record.originalEventId = `evt:${sessionId}:${entry.blockIndex}`;
|
|
331
|
+
record.createdAt = new Date().toISOString();
|
|
332
|
+
if (record.sha256 !== entry.sha256) {
|
|
333
|
+
throw new AgentFoldError(`digest sha mismatch for ${entry.foldId}`, "integrity_error");
|
|
334
|
+
}
|
|
335
|
+
this.store.upsertFold(record);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
if (this.config.strictMode)
|
|
340
|
+
throw err;
|
|
341
|
+
// fail-open: fold stays in-memory for this request; recall unavailable
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/** Insert compiler injection blocks (pinned/task/memory) as chat messages. */
|
|
345
|
+
mergeInjectionMessages(messages, blocks) {
|
|
346
|
+
const injections = blocks.filter((b) => b.index < 0);
|
|
347
|
+
if (injections.length === 0)
|
|
348
|
+
return messages;
|
|
349
|
+
const out = [...messages];
|
|
350
|
+
const lastSystem = findLastIndex(messages, (m) => m.role === "system" || m.role === "developer");
|
|
351
|
+
const injectMsgs = injections.map((b) => ({ role: b.kind === "user" ? "user" : "system", content: b.text }));
|
|
352
|
+
out.splice(lastSystem + 1, 0, ...injectMsgs);
|
|
353
|
+
return out;
|
|
354
|
+
}
|
|
355
|
+
mergeInjectionItems(items, blocks) {
|
|
356
|
+
const injections = blocks.filter((b) => b.index < 0);
|
|
357
|
+
if (injections.length === 0)
|
|
358
|
+
return items;
|
|
359
|
+
const out = [...items];
|
|
360
|
+
const lastSystem = findLastIndex(items, (i) => i.role === "system" || i.role === "developer");
|
|
361
|
+
const injectItems = injections.map((b) => ({
|
|
362
|
+
type: "message",
|
|
363
|
+
role: b.kind === "user" ? "user" : "system",
|
|
364
|
+
content: [{ type: "input_text", text: b.text }]
|
|
365
|
+
}));
|
|
366
|
+
out.splice(lastSystem + 1, 0, ...injectItems);
|
|
367
|
+
return out;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// ------------------------------------------------------------------ utilities
|
|
371
|
+
export function deriveSessionId(model, keys) {
|
|
372
|
+
const firstSystem = keys.find((k) => k.startsWith("system:")) ?? "";
|
|
373
|
+
const firstUser = keys.find((k) => k.startsWith("user:")) ?? "";
|
|
374
|
+
return createHash("sha256")
|
|
375
|
+
.update(`${model}\u0000${firstSystem}\u0000${firstUser}`, "utf8")
|
|
376
|
+
.digest("hex")
|
|
377
|
+
.slice(0, 16);
|
|
378
|
+
}
|
|
379
|
+
function messageSessionKey(m) {
|
|
380
|
+
const text = typeof m.content === "string" ? m.content : "";
|
|
381
|
+
return `${m.role}:${text.slice(0, 200)}`;
|
|
382
|
+
}
|
|
383
|
+
function msgText(m) {
|
|
384
|
+
if (typeof m.content === "string")
|
|
385
|
+
return m.content;
|
|
386
|
+
if (Array.isArray(m.content)) {
|
|
387
|
+
return m.content
|
|
388
|
+
.filter((p) => typeof p?.text === "string")
|
|
389
|
+
.map((p) => p.text)
|
|
390
|
+
.join("\n");
|
|
391
|
+
}
|
|
392
|
+
return "";
|
|
393
|
+
}
|
|
394
|
+
function kindOfRole(role) {
|
|
395
|
+
if (role === "system")
|
|
396
|
+
return "system";
|
|
397
|
+
if (role === "developer")
|
|
398
|
+
return "developer";
|
|
399
|
+
if (role === "user")
|
|
400
|
+
return "user";
|
|
401
|
+
if (role === "assistant")
|
|
402
|
+
return "assistant";
|
|
403
|
+
return "tool_result";
|
|
404
|
+
}
|
|
405
|
+
export function grepWithContext(content, pattern, contextLines = 3) {
|
|
406
|
+
let re;
|
|
407
|
+
try {
|
|
408
|
+
re = new RegExp(pattern, "i");
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
re = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i");
|
|
412
|
+
}
|
|
413
|
+
const lines = content.split("\n");
|
|
414
|
+
const matched = new Set();
|
|
415
|
+
lines.forEach((line, i) => {
|
|
416
|
+
if (re.test(line)) {
|
|
417
|
+
for (let j = Math.max(0, i - contextLines); j <= Math.min(lines.length - 1, i + contextLines); j++) {
|
|
418
|
+
matched.add(j);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
if (matched.size === 0)
|
|
423
|
+
return `(no match for /${pattern}/)`;
|
|
424
|
+
const out = [];
|
|
425
|
+
let prev = -2;
|
|
426
|
+
for (let i = 0; i < lines.length; i++) {
|
|
427
|
+
if (matched.has(i)) {
|
|
428
|
+
if (i - prev > 1)
|
|
429
|
+
out.push("...");
|
|
430
|
+
out.push(`${i + 1}: ${lines[i]}`);
|
|
431
|
+
prev = i;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return out.join("\n");
|
|
435
|
+
}
|
|
436
|
+
function safeJson(v) {
|
|
437
|
+
try {
|
|
438
|
+
return JSON.stringify(v ?? {});
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
return "{}";
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function findLastIndex(arr, pred) {
|
|
445
|
+
for (let i = arr.length - 1; i >= 0; i--) {
|
|
446
|
+
if (pred(arr[i]))
|
|
447
|
+
return i;
|
|
448
|
+
}
|
|
449
|
+
return -1;
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import type { AgentFoldConfig } from "@agentfold/shared";
|
|
3
|
+
import { AgentFoldRuntime, type RuntimeResult } from "./runtime.js";
|
|
4
|
+
export interface ProxyServerOptions {
|
|
5
|
+
config: AgentFoldConfig;
|
|
6
|
+
runtime: AgentFoldRuntime;
|
|
7
|
+
onMetrics?: (m: RuntimeResult<unknown>, overheadMs: number) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createProxyServer(opts: ProxyServerOptions): http.Server;
|
|
10
|
+
export declare function startProxyServer(opts: ProxyServerOptions): Promise<http.Server>;
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import { VERSION } from "./runtime.js";
|
|
3
|
+
/**
|
|
4
|
+
* OpenAI-compatible proxy (Mode A).
|
|
5
|
+
*
|
|
6
|
+
* FAIL-OPEN: any internal error — parse failure, store failure, fold engine
|
|
7
|
+
* exception, unknown message shapes — forwards the ORIGINAL request upstream.
|
|
8
|
+
* The agent must never break because AgentFold is broken, unless strictMode.
|
|
9
|
+
*
|
|
10
|
+
* Unknown request fields are never removed: the compiler only rewrites
|
|
11
|
+
* messages/input; everything else is passed through byte-for-byte.
|
|
12
|
+
*/
|
|
13
|
+
const MAX_BODY_BYTES = 128 * 1024 * 1024;
|
|
14
|
+
export function createProxyServer(opts) {
|
|
15
|
+
const { config, runtime } = opts;
|
|
16
|
+
const server = http.createServer((req, res) => {
|
|
17
|
+
const started = process.hrtime.bigint();
|
|
18
|
+
const chunks = [];
|
|
19
|
+
let aborted = false;
|
|
20
|
+
req.on("data", (c) => {
|
|
21
|
+
if (!aborted)
|
|
22
|
+
chunks.push(c);
|
|
23
|
+
});
|
|
24
|
+
req.on("end", () => {
|
|
25
|
+
if (aborted)
|
|
26
|
+
return;
|
|
27
|
+
const bodyBuf = Buffer.concat(chunks);
|
|
28
|
+
handleRequest(req, res, bodyBuf, started);
|
|
29
|
+
});
|
|
30
|
+
req.on("error", () => {
|
|
31
|
+
aborted = true;
|
|
32
|
+
try {
|
|
33
|
+
res.destroy();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
/* ignore */
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
function handleRequest(req, res, bodyBuf, started) {
|
|
40
|
+
const path = (req.url ?? "").split("?")[0] ?? "";
|
|
41
|
+
// Local diagnostics endpoints (not forwarded).
|
|
42
|
+
if (req.method === "GET" && (path === "/agentfold/health" || path === "/agentfold/metrics")) {
|
|
43
|
+
const payload = JSON.stringify(path === "/agentfold/health"
|
|
44
|
+
? { status: "ok", version: VERSION, ...runtime.status() }
|
|
45
|
+
: runtime.status());
|
|
46
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
47
|
+
res.end(payload);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const isChat = req.method === "POST" && path === "/v1/chat/completions";
|
|
51
|
+
const isResponses = req.method === "POST" && path === "/v1/responses";
|
|
52
|
+
if (!isChat && !isResponses) {
|
|
53
|
+
forward(req, res, bodyBuf, started);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
let parsed = null;
|
|
57
|
+
try {
|
|
58
|
+
parsed = JSON.parse(bodyBuf.toString("utf8"));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
parsed = null; // not JSON -> passthrough untouched
|
|
62
|
+
}
|
|
63
|
+
if (!parsed) {
|
|
64
|
+
forward(req, res, bodyBuf, started);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const result = isChat ? runtime.handleChatCompletions(parsed) : runtime.handleResponses(parsed);
|
|
68
|
+
const overheadMs = Number((process.hrtime.bigint() - started) / 1000000n);
|
|
69
|
+
opts.onMetrics?.(result, overheadMs);
|
|
70
|
+
if (!result.ok || !result.body) {
|
|
71
|
+
// FAIL OPEN (or fail loudly in strictMode).
|
|
72
|
+
if (config.strictMode) {
|
|
73
|
+
res.writeHead(500, { "content-type": "application/json" });
|
|
74
|
+
res.end(JSON.stringify({ error: { message: result.warning ?? "agentfold compile failed", type: "agentfold_error" } }));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
forward(req, res, bodyBuf, started);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const newBuf = Buffer.from(JSON.stringify(result.body), "utf8");
|
|
81
|
+
forward(req, res, newBuf, started, result);
|
|
82
|
+
}
|
|
83
|
+
function forward(req, res, bodyBuf, started, result) {
|
|
84
|
+
const headers = {};
|
|
85
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
86
|
+
if (key === "host" || key === "content-length")
|
|
87
|
+
continue;
|
|
88
|
+
headers[key] = value;
|
|
89
|
+
}
|
|
90
|
+
const upstream = new URL(config.upstreamBaseUrl);
|
|
91
|
+
headers.host = upstream.host;
|
|
92
|
+
const options = {
|
|
93
|
+
protocol: upstream.protocol,
|
|
94
|
+
hostname: upstream.hostname,
|
|
95
|
+
port: upstream.port || (upstream.protocol === "https:" ? 443 : 80),
|
|
96
|
+
path: req.url,
|
|
97
|
+
method: req.method,
|
|
98
|
+
headers: {
|
|
99
|
+
...headers,
|
|
100
|
+
"content-length": String(bodyBuf.length)
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const upstreamReq = http.request(options, (upstreamRes) => {
|
|
104
|
+
const isStream = isSseResponse(upstreamRes);
|
|
105
|
+
if (isStream || !result) {
|
|
106
|
+
res.writeHead(upstreamRes.statusCode ?? 502, upstreamRes.headers);
|
|
107
|
+
upstreamRes.pipe(res);
|
|
108
|
+
upstreamRes.on("end", () => res.end());
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Buffered non-stream response: best-effort usage capture, then forward.
|
|
112
|
+
const respChunks = [];
|
|
113
|
+
let size = 0;
|
|
114
|
+
upstreamRes.on("data", (c) => {
|
|
115
|
+
size += c.length;
|
|
116
|
+
if (size <= 20 * 1024 * 1024)
|
|
117
|
+
respChunks.push(c);
|
|
118
|
+
});
|
|
119
|
+
upstreamRes.on("end", () => {
|
|
120
|
+
const respBuf = Buffer.concat(respChunks);
|
|
121
|
+
captureUsage(respBuf, result);
|
|
122
|
+
const outHeaders = { ...upstreamRes.headers };
|
|
123
|
+
outHeaders["content-length"] = String(respBuf.length);
|
|
124
|
+
delete outHeaders["transfer-encoding"];
|
|
125
|
+
res.writeHead(upstreamRes.statusCode ?? 502, outHeaders);
|
|
126
|
+
res.end(respBuf);
|
|
127
|
+
});
|
|
128
|
+
upstreamRes.on("error", () => {
|
|
129
|
+
try {
|
|
130
|
+
res.destroy();
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
/* ignore */
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
upstreamReq.on("error", (err) => {
|
|
138
|
+
res.writeHead(502, { "content-type": "application/json" });
|
|
139
|
+
res.end(JSON.stringify({ error: { message: `upstream error: ${err.message}`, type: "agentfold_upstream_error" } }));
|
|
140
|
+
});
|
|
141
|
+
if (bodyBuf.length > 0)
|
|
142
|
+
upstreamReq.write(bodyBuf);
|
|
143
|
+
upstreamReq.end();
|
|
144
|
+
}
|
|
145
|
+
function isSseResponse(res) {
|
|
146
|
+
const ct = String(res.headers["content-type"] ?? "");
|
|
147
|
+
return ct.includes("text/event-stream");
|
|
148
|
+
}
|
|
149
|
+
function captureUsage(respBuf, result) {
|
|
150
|
+
try {
|
|
151
|
+
const parsed = JSON.parse(respBuf.toString("utf8"));
|
|
152
|
+
if (parsed?.usage?.prompt_tokens != null && result.metrics) {
|
|
153
|
+
// Real billing tokens are now known; heuristics stay flagged estimated.
|
|
154
|
+
result.metrics.warnings.push(`upstream_prompt_tokens=${parsed.usage.prompt_tokens} (heuristic estimate was ${result.metrics.originalTokens})`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// compressed or non-JSON — cache_metrics_unavailable
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return server;
|
|
163
|
+
}
|
|
164
|
+
export function startProxyServer(opts) {
|
|
165
|
+
return new Promise((resolve, reject) => {
|
|
166
|
+
const server = createProxyServer(opts);
|
|
167
|
+
server.once("error", reject);
|
|
168
|
+
server.listen(opts.config.port, "127.0.0.1", () => resolve(server));
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentfold/proxy",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@agentfold/core": "0.1.0",
|
|
15
|
+
"@agentfold/shared": "0.1.0",
|
|
16
|
+
"@agentfold/store": "0.1.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"typescript": "^5.7.0"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/279458179/agentfold.git"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"ai",
|
|
33
|
+
"agents",
|
|
34
|
+
"context",
|
|
35
|
+
"llm",
|
|
36
|
+
"memory",
|
|
37
|
+
"tokens",
|
|
38
|
+
"context-window",
|
|
39
|
+
"openai",
|
|
40
|
+
"mcp"
|
|
41
|
+
],
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"description": "AgentFold — virtual memory for AI agents: fold cold context, recall anything.",
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc -b",
|
|
46
|
+
"test": "vitest run"
|
|
47
|
+
}
|
|
48
|
+
}
|