@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 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.
@@ -0,0 +1,2 @@
1
+ export * from "./runtime.js";
2
+ export * from "./server.js";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./runtime.js";
2
+ export * from "./server.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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;
@@ -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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"}
@@ -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
+ }