klaus-agent 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.
Files changed (163) hide show
  1. package/README.md +685 -0
  2. package/dist/approval/approval.d.ts +18 -0
  3. package/dist/approval/approval.js +93 -0
  4. package/dist/approval/approval.js.map +1 -0
  5. package/dist/approval/types.d.ts +21 -0
  6. package/dist/approval/types.js +3 -0
  7. package/dist/approval/types.js.map +1 -0
  8. package/dist/background/task-manager.d.ts +14 -0
  9. package/dist/background/task-manager.js +89 -0
  10. package/dist/background/task-manager.js.map +1 -0
  11. package/dist/background/tools.d.ts +4 -0
  12. package/dist/background/tools.js +74 -0
  13. package/dist/background/tools.js.map +1 -0
  14. package/dist/background/types.d.ts +31 -0
  15. package/dist/background/types.js +3 -0
  16. package/dist/background/types.js.map +1 -0
  17. package/dist/checkpoint/checkpoint-manager.d.ts +19 -0
  18. package/dist/checkpoint/checkpoint-manager.js +49 -0
  19. package/dist/checkpoint/checkpoint-manager.js.map +1 -0
  20. package/dist/checkpoint/dmail.d.ts +10 -0
  21. package/dist/checkpoint/dmail.js +26 -0
  22. package/dist/checkpoint/dmail.js.map +1 -0
  23. package/dist/checkpoint/types.d.ts +12 -0
  24. package/dist/checkpoint/types.js +3 -0
  25. package/dist/checkpoint/types.js.map +1 -0
  26. package/dist/compaction/compaction.d.ts +6 -0
  27. package/dist/compaction/compaction.js +104 -0
  28. package/dist/compaction/compaction.js.map +1 -0
  29. package/dist/compaction/summarizer.d.ts +10 -0
  30. package/dist/compaction/summarizer.js +75 -0
  31. package/dist/compaction/summarizer.js.map +1 -0
  32. package/dist/compaction/types.d.ts +23 -0
  33. package/dist/compaction/types.js +3 -0
  34. package/dist/compaction/types.js.map +1 -0
  35. package/dist/core/agent-loop.d.ts +37 -0
  36. package/dist/core/agent-loop.js +337 -0
  37. package/dist/core/agent-loop.js.map +1 -0
  38. package/dist/core/agent.d.ts +97 -0
  39. package/dist/core/agent.js +335 -0
  40. package/dist/core/agent.js.map +1 -0
  41. package/dist/extensions/runner.d.ts +19 -0
  42. package/dist/extensions/runner.js +88 -0
  43. package/dist/extensions/runner.js.map +1 -0
  44. package/dist/extensions/types.d.ts +179 -0
  45. package/dist/extensions/types.js +3 -0
  46. package/dist/extensions/types.js.map +1 -0
  47. package/dist/index.d.ts +78 -0
  48. package/dist/index.js +53 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/injection/history-normalizer.d.ts +2 -0
  51. package/dist/injection/history-normalizer.js +34 -0
  52. package/dist/injection/history-normalizer.js.map +1 -0
  53. package/dist/injection/injection-manager.d.ts +8 -0
  54. package/dist/injection/injection-manager.js +28 -0
  55. package/dist/injection/injection-manager.js.map +1 -0
  56. package/dist/injection/types.d.ts +8 -0
  57. package/dist/injection/types.js +3 -0
  58. package/dist/injection/types.js.map +1 -0
  59. package/dist/llm/provider.d.ts +16 -0
  60. package/dist/llm/provider.js +233 -0
  61. package/dist/llm/provider.js.map +1 -0
  62. package/dist/llm/types.d.ts +110 -0
  63. package/dist/llm/types.js +3 -0
  64. package/dist/llm/types.js.map +1 -0
  65. package/dist/multi-agent/labor-market.d.ts +16 -0
  66. package/dist/multi-agent/labor-market.js +40 -0
  67. package/dist/multi-agent/labor-market.js.map +1 -0
  68. package/dist/multi-agent/task-executor.d.ts +12 -0
  69. package/dist/multi-agent/task-executor.js +38 -0
  70. package/dist/multi-agent/task-executor.js.map +1 -0
  71. package/dist/multi-agent/task-tool.d.ts +4 -0
  72. package/dist/multi-agent/task-tool.js +46 -0
  73. package/dist/multi-agent/task-tool.js.map +1 -0
  74. package/dist/multi-agent/types.d.ts +7 -0
  75. package/dist/multi-agent/types.js +3 -0
  76. package/dist/multi-agent/types.js.map +1 -0
  77. package/dist/session/session-context-builder.d.ts +2 -0
  78. package/dist/session/session-context-builder.js +52 -0
  79. package/dist/session/session-context-builder.js.map +1 -0
  80. package/dist/session/session-manager.d.ts +30 -0
  81. package/dist/session/session-manager.js +209 -0
  82. package/dist/session/session-manager.js.map +1 -0
  83. package/dist/session/types.d.ts +61 -0
  84. package/dist/session/types.js +3 -0
  85. package/dist/session/types.js.map +1 -0
  86. package/dist/skills/discovery.d.ts +2 -0
  87. package/dist/skills/discovery.js +29 -0
  88. package/dist/skills/discovery.js.map +1 -0
  89. package/dist/skills/loader.d.ts +3 -0
  90. package/dist/skills/loader.js +46 -0
  91. package/dist/skills/loader.js.map +1 -0
  92. package/dist/skills/skill-tool.d.ts +3 -0
  93. package/dist/skills/skill-tool.js +38 -0
  94. package/dist/skills/skill-tool.js.map +1 -0
  95. package/dist/skills/types.d.ts +14 -0
  96. package/dist/skills/types.js +3 -0
  97. package/dist/skills/types.js.map +1 -0
  98. package/dist/tools/executor.d.ts +37 -0
  99. package/dist/tools/executor.js +131 -0
  100. package/dist/tools/executor.js.map +1 -0
  101. package/dist/tools/mcp-adapter.d.ts +57 -0
  102. package/dist/tools/mcp-adapter.js +113 -0
  103. package/dist/tools/mcp-adapter.js.map +1 -0
  104. package/dist/tools/types.d.ts +43 -0
  105. package/dist/tools/types.js +2 -0
  106. package/dist/tools/types.js.map +1 -0
  107. package/dist/types.d.ts +96 -0
  108. package/dist/types.js +3 -0
  109. package/dist/types.js.map +1 -0
  110. package/dist/utils/id.d.ts +1 -0
  111. package/dist/utils/id.js +9 -0
  112. package/dist/utils/id.js.map +1 -0
  113. package/dist/utils/jsonl.d.ts +3 -0
  114. package/dist/utils/jsonl.js +17 -0
  115. package/dist/utils/jsonl.js.map +1 -0
  116. package/dist/wire/types.d.ts +10 -0
  117. package/dist/wire/types.js +3 -0
  118. package/dist/wire/types.js.map +1 -0
  119. package/dist/wire/wire.d.ts +20 -0
  120. package/dist/wire/wire.js +71 -0
  121. package/dist/wire/wire.js.map +1 -0
  122. package/package.json +26 -0
  123. package/src/approval/approval.ts +108 -0
  124. package/src/approval/types.ts +26 -0
  125. package/src/background/task-manager.ts +112 -0
  126. package/src/background/tools.ts +84 -0
  127. package/src/background/types.ts +29 -0
  128. package/src/checkpoint/checkpoint-manager.ts +60 -0
  129. package/src/checkpoint/dmail.ts +35 -0
  130. package/src/checkpoint/types.ts +16 -0
  131. package/src/compaction/compaction.ts +119 -0
  132. package/src/compaction/summarizer.ts +83 -0
  133. package/src/compaction/types.ts +29 -0
  134. package/src/core/agent-loop.ts +427 -0
  135. package/src/core/agent.ts +430 -0
  136. package/src/extensions/runner.ts +138 -0
  137. package/src/extensions/types.ts +177 -0
  138. package/src/index.ts +221 -0
  139. package/src/injection/history-normalizer.ts +44 -0
  140. package/src/injection/injection-manager.ts +34 -0
  141. package/src/injection/types.ts +12 -0
  142. package/src/llm/provider.ts +254 -0
  143. package/src/llm/types.ts +146 -0
  144. package/src/multi-agent/labor-market.ts +54 -0
  145. package/src/multi-agent/task-executor.ts +49 -0
  146. package/src/multi-agent/task-tool.ts +58 -0
  147. package/src/multi-agent/types.ts +10 -0
  148. package/src/session/session-context-builder.ts +65 -0
  149. package/src/session/session-manager.ts +258 -0
  150. package/src/session/types.ts +93 -0
  151. package/src/skills/discovery.ts +32 -0
  152. package/src/skills/loader.ts +54 -0
  153. package/src/skills/skill-tool.ts +50 -0
  154. package/src/skills/types.ts +18 -0
  155. package/src/tools/executor.ts +196 -0
  156. package/src/tools/mcp-adapter.ts +185 -0
  157. package/src/tools/types.ts +64 -0
  158. package/src/types.ts +96 -0
  159. package/src/utils/id.ts +8 -0
  160. package/src/utils/jsonl.ts +19 -0
  161. package/src/wire/types.ts +14 -0
  162. package/src/wire/wire.ts +79 -0
  163. package/tsconfig.json +19 -0
@@ -0,0 +1,93 @@
1
+ // Queue-based approval system
2
+ import { generateId } from "../utils/id.js";
3
+ export class ApprovalImpl {
4
+ _yolo;
5
+ _autoApproveActions;
6
+ _pending = new Map();
7
+ _queue = [];
8
+ _waiters = [];
9
+ constructor(config) {
10
+ this._yolo = config?.yolo ?? false;
11
+ this._autoApproveActions = new Set(config?.autoApproveActions ?? []);
12
+ }
13
+ async request(sender, action, description, toolCallId) {
14
+ if (this._yolo)
15
+ return true;
16
+ if (this._autoApproveActions.has(action))
17
+ return true;
18
+ const req = {
19
+ id: generateId(),
20
+ toolCallId,
21
+ sender,
22
+ action,
23
+ description,
24
+ };
25
+ return new Promise((resolve) => {
26
+ this._pending.set(req.id, { request: req, resolve });
27
+ // Deliver to waiter or queue
28
+ const waiter = this._waiters.shift();
29
+ if (waiter) {
30
+ waiter(req);
31
+ }
32
+ else {
33
+ this._queue.push(req);
34
+ }
35
+ });
36
+ }
37
+ async fetchRequest() {
38
+ const queued = this._queue.shift();
39
+ if (queued)
40
+ return queued;
41
+ return new Promise((resolve, reject) => {
42
+ const waiter = (req) => resolve(req);
43
+ waiter._reject = reject;
44
+ this._waiters.push(waiter);
45
+ });
46
+ }
47
+ /** Cancel all pending waiters (e.g., on agent dispose) */
48
+ cancelPendingWaiters() {
49
+ for (const waiter of this._waiters) {
50
+ const reject = waiter._reject;
51
+ if (reject)
52
+ reject(new Error("Approval cancelled"));
53
+ }
54
+ this._waiters = [];
55
+ }
56
+ resolve(requestId, response) {
57
+ const pending = this._pending.get(requestId);
58
+ if (!pending)
59
+ return;
60
+ this._pending.delete(requestId);
61
+ if (response === "approve_for_session") {
62
+ this._autoApproveActions.add(pending.request.action);
63
+ pending.resolve(true);
64
+ }
65
+ else {
66
+ pending.resolve(response === "approve");
67
+ }
68
+ }
69
+ setYolo(yolo) {
70
+ this._yolo = yolo;
71
+ }
72
+ isYolo() {
73
+ return this._yolo;
74
+ }
75
+ get autoApproveActions() {
76
+ return this._autoApproveActions;
77
+ }
78
+ share() {
79
+ // Shared state (yolo, autoApproveActions), independent queue
80
+ // Use a shared state object so changes propagate bidirectionally
81
+ const shared = new ApprovalImpl();
82
+ shared._autoApproveActions = this._autoApproveActions; // same reference
83
+ // Share yolo via getter/setter delegation
84
+ const parent = this;
85
+ Object.defineProperty(shared, '_yolo', {
86
+ get() { return parent._yolo; },
87
+ set(v) { parent._yolo = v; },
88
+ configurable: true,
89
+ });
90
+ return shared;
91
+ }
92
+ }
93
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/approval/approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type ApprovalResponse = "approve" | "approve_for_session" | "reject";
2
+ export interface ApprovalRequest {
3
+ id: string;
4
+ toolCallId: string;
5
+ sender: string;
6
+ action: string;
7
+ description: string;
8
+ }
9
+ export interface ApprovalConfig {
10
+ yolo?: boolean;
11
+ autoApproveActions?: string[];
12
+ }
13
+ export interface Approval {
14
+ request(sender: string, action: string, description: string, toolCallId: string): Promise<boolean>;
15
+ fetchRequest(): Promise<ApprovalRequest>;
16
+ resolve(requestId: string, response: ApprovalResponse): void;
17
+ setYolo(yolo: boolean): void;
18
+ isYolo(): boolean;
19
+ readonly autoApproveActions: Set<string>;
20
+ share(): Approval;
21
+ }
@@ -0,0 +1,3 @@
1
+ // Approval system types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/approval/types.ts"],"names":[],"mappings":"AAAA,wBAAwB"}
@@ -0,0 +1,14 @@
1
+ import type { BackgroundTaskInfo, BackgroundTaskHandle, BackgroundTaskEvent } from "./types.js";
2
+ export declare class BackgroundTaskManager {
3
+ private _tasks;
4
+ private _onEvent?;
5
+ constructor(onEvent?: (event: BackgroundTaskEvent) => void);
6
+ spawn<T>(name: string, fn: (signal: AbortSignal) => Promise<T>): BackgroundTaskHandle<T>;
7
+ get(id: string): BackgroundTaskHandle | undefined;
8
+ list(): BackgroundTaskInfo[];
9
+ abort(id: string): boolean;
10
+ abortAll(): void;
11
+ dispose(): void;
12
+ private _toInfo;
13
+ private _toHandle;
14
+ }
@@ -0,0 +1,89 @@
1
+ // Background task manager — in-process async task execution
2
+ import { generateId } from "../utils/id.js";
3
+ export class BackgroundTaskManager {
4
+ _tasks = new Map();
5
+ _onEvent;
6
+ constructor(onEvent) {
7
+ this._onEvent = onEvent;
8
+ }
9
+ spawn(name, fn) {
10
+ const id = generateId();
11
+ const abortController = new AbortController();
12
+ const now = Date.now();
13
+ const task = {
14
+ id,
15
+ name,
16
+ status: "running",
17
+ createdAt: now,
18
+ startedAt: now,
19
+ abortController,
20
+ };
21
+ this._tasks.set(id, task);
22
+ this._onEvent?.({ type: "task_started", task: this._toInfo(task) });
23
+ fn(abortController.signal).then((result) => {
24
+ task.status = "completed";
25
+ task.completedAt = Date.now();
26
+ task.result = result;
27
+ try {
28
+ this._onEvent?.({ type: "task_completed", task: this._toInfo(task), result });
29
+ }
30
+ catch { }
31
+ }, (err) => {
32
+ task.status = "failed";
33
+ task.completedAt = Date.now();
34
+ task.error = err instanceof Error ? err : new Error(String(err));
35
+ try {
36
+ this._onEvent?.({ type: "task_failed", task: this._toInfo(task), error: task.error.message });
37
+ }
38
+ catch { }
39
+ });
40
+ return this._toHandle(task);
41
+ }
42
+ get(id) {
43
+ const task = this._tasks.get(id);
44
+ return task ? this._toHandle(task) : undefined;
45
+ }
46
+ list() {
47
+ return [...this._tasks.values()].map((t) => this._toInfo(t));
48
+ }
49
+ abort(id) {
50
+ const task = this._tasks.get(id);
51
+ if (!task || task.status !== "running")
52
+ return false;
53
+ task.abortController.abort();
54
+ return true;
55
+ }
56
+ abortAll() {
57
+ for (const task of this._tasks.values()) {
58
+ if (task.status === "running") {
59
+ task.abortController.abort();
60
+ }
61
+ }
62
+ }
63
+ dispose() {
64
+ this.abortAll();
65
+ this._tasks.clear();
66
+ }
67
+ _toInfo(task) {
68
+ return {
69
+ id: task.id,
70
+ name: task.name,
71
+ status: task.status,
72
+ createdAt: task.createdAt,
73
+ startedAt: task.startedAt,
74
+ completedAt: task.completedAt,
75
+ error: task.error?.message,
76
+ };
77
+ }
78
+ _toHandle(task) {
79
+ return {
80
+ get id() { return task.id; },
81
+ get name() { return task.name; },
82
+ get status() { return task.status; },
83
+ get result() { return task.result; },
84
+ get error() { return task.error; },
85
+ abort: () => task.abortController.abort(),
86
+ };
87
+ }
88
+ }
89
+ //# sourceMappingURL=task-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../src/background/task-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AgentTool } from "../tools/types.js";
2
+ import type { BackgroundTaskManager } from "./task-manager.js";
3
+ import type { TaskFactory } from "./types.js";
4
+ export declare function createBackgroundTaskTools(manager: BackgroundTaskManager, factories?: Record<string, TaskFactory>): AgentTool[];
@@ -0,0 +1,74 @@
1
+ // Built-in background task tools — allows LLM to manage background tasks
2
+ import { Type } from "@sinclair/typebox";
3
+ export function createBackgroundTaskTools(manager, factories) {
4
+ const tools = [
5
+ {
6
+ name: "check_task_status",
7
+ label: "Check Task Status",
8
+ description: "Check the status of background tasks. If no task_id is provided, returns all tasks.",
9
+ parameters: Type.Object({
10
+ task_id: Type.Optional(Type.String({ description: "Task ID to check. Omit to list all tasks." })),
11
+ }),
12
+ async execute(_toolCallId, params) {
13
+ if (params.task_id) {
14
+ const handle = manager.get(params.task_id);
15
+ if (!handle) {
16
+ return { content: [{ type: "text", text: `No task found with ID: ${params.task_id}` }] };
17
+ }
18
+ return { content: [{ type: "text", text: JSON.stringify({ id: handle.id, name: handle.name, status: handle.status }, null, 2) }] };
19
+ }
20
+ const tasks = manager.list();
21
+ if (tasks.length === 0) {
22
+ return { content: [{ type: "text", text: "No background tasks." }] };
23
+ }
24
+ return { content: [{ type: "text", text: JSON.stringify(tasks, null, 2) }] };
25
+ },
26
+ },
27
+ {
28
+ name: "get_task_result",
29
+ label: "Get Task Result",
30
+ description: "Get the result of a completed background task.",
31
+ parameters: Type.Object({
32
+ task_id: Type.String({ description: "Task ID to get the result for." }),
33
+ }),
34
+ async execute(_toolCallId, params) {
35
+ const handle = manager.get(params.task_id);
36
+ if (!handle) {
37
+ return { content: [{ type: "text", text: `No task found with ID: ${params.task_id}` }] };
38
+ }
39
+ if (handle.status === "running") {
40
+ return { content: [{ type: "text", text: `Task "${handle.name}" is still running.` }] };
41
+ }
42
+ if (handle.status === "failed") {
43
+ return { content: [{ type: "text", text: `Task "${handle.name}" failed: ${handle.error?.message ?? "unknown error"}` }] };
44
+ }
45
+ const resultText = handle.result !== undefined ? JSON.stringify(handle.result, null, 2) : "(no result)";
46
+ return { content: [{ type: "text", text: resultText }] };
47
+ },
48
+ },
49
+ ];
50
+ if (factories && Object.keys(factories).length > 0) {
51
+ const names = Object.keys(factories);
52
+ const description = `Start a background task. Available tasks:\n${names.map((n) => `- ${n}`).join("\n")}`;
53
+ tools.push({
54
+ name: "start_background_task",
55
+ label: "Start Background Task",
56
+ description,
57
+ parameters: Type.Object({
58
+ task_name: Type.String({ description: "Name of the task to start." }),
59
+ args: Type.Optional(Type.Unknown({ description: "Arguments to pass to the task." })),
60
+ }),
61
+ async execute(_toolCallId, params) {
62
+ const factory = factories[params.task_name];
63
+ if (!factory) {
64
+ const available = Object.keys(factories).join(", ");
65
+ return { content: [{ type: "text", text: `Unknown task: "${params.task_name}". Available: ${available}` }] };
66
+ }
67
+ const handle = manager.spawn(params.task_name, (signal) => factory(params.args, signal));
68
+ return { content: [{ type: "text", text: `Task started: ${handle.name} (ID: ${handle.id})` }] };
69
+ },
70
+ });
71
+ }
72
+ return tools;
73
+ }
74
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/background/tools.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAKzC,MAAM,UAAU,yBAAyB,CACvC,OAA8B,EAC9B,SAAuC;IAEvC,MAAM,KAAK,GAAgB;QACzB;YACE,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,qFAAqF;YAClG,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;gBACtB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC,CAAC;aAClG,CAAC;YACF,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAA4B;gBAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC3F,CAAC;oBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrI,CAAC;gBACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;gBACvE,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/E,CAAC;SACF;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,gDAAgD;YAC7D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;gBACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;aACxE,CAAC;YACF,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAA2B;gBAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3F,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC,EAAE,CAAC;gBAC1F,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC/B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC5H,CAAC;gBACD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBACxG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YAC3D,CAAC;SACF;KACF,CAAC;IAEF,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,8CAA8C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAE1G,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,uBAAuB;YAC9B,WAAW;YACX,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;gBACtB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;gBACrE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC,CAAC;aACrF,CAAC;YACF,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAA6C;gBAC9E,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,MAAM,CAAC,SAAS,iBAAiB,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC/G,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBACzF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAClG,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,31 @@
1
+ export type BackgroundTaskStatus = "pending" | "running" | "completed" | "failed";
2
+ export interface BackgroundTaskInfo {
3
+ id: string;
4
+ name: string;
5
+ status: BackgroundTaskStatus;
6
+ createdAt: number;
7
+ startedAt?: number;
8
+ completedAt?: number;
9
+ error?: string;
10
+ }
11
+ export interface BackgroundTaskHandle<T = unknown> {
12
+ readonly id: string;
13
+ readonly name: string;
14
+ readonly status: BackgroundTaskStatus;
15
+ readonly result?: T;
16
+ readonly error?: Error;
17
+ abort(): void;
18
+ }
19
+ export type BackgroundTaskEvent = {
20
+ type: "task_started";
21
+ task: BackgroundTaskInfo;
22
+ } | {
23
+ type: "task_completed";
24
+ task: BackgroundTaskInfo;
25
+ result: unknown;
26
+ } | {
27
+ type: "task_failed";
28
+ task: BackgroundTaskInfo;
29
+ error: string;
30
+ };
31
+ export type TaskFactory = (args: unknown, signal: AbortSignal) => Promise<unknown>;
@@ -0,0 +1,3 @@
1
+ // Background task types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/background/types.ts"],"names":[],"mappings":"AAAA,wBAAwB"}
@@ -0,0 +1,19 @@
1
+ import type { SessionManager } from "../session/session-manager.js";
2
+ import type { CheckpointInfo } from "./types.js";
3
+ import { DenwaRenji } from "./dmail.js";
4
+ export declare class CheckpointManager {
5
+ private _session;
6
+ private _checkpoints;
7
+ private _nextId;
8
+ private _denwaRenji;
9
+ constructor(_session: SessionManager);
10
+ get denwaRenji(): DenwaRenji;
11
+ checkpoint(): Promise<CheckpointInfo>;
12
+ getCheckpoint(checkpointId: number): CheckpointInfo | undefined;
13
+ getAllCheckpoints(): CheckpointInfo[];
14
+ /**
15
+ * Handle D-Mail: branch from the target checkpoint and inject the message.
16
+ * Returns the D-Mail content if one was pending, null otherwise.
17
+ */
18
+ handleDMail(): Promise<string | null>;
19
+ }
@@ -0,0 +1,49 @@
1
+ // Checkpoint manager — creates checkpoints in session tree, handles D-Mail revert
2
+ import { DenwaRenji } from "./dmail.js";
3
+ export class CheckpointManager {
4
+ _session;
5
+ _checkpoints = [];
6
+ _nextId = 0; // Global counter, never resets after D-Mail
7
+ _denwaRenji = new DenwaRenji();
8
+ constructor(_session) {
9
+ this._session = _session;
10
+ }
11
+ get denwaRenji() {
12
+ return this._denwaRenji;
13
+ }
14
+ async checkpoint() {
15
+ const checkpointId = this._nextId++;
16
+ const entryId = await this._session.appendCheckpoint(checkpointId);
17
+ const info = { checkpointId, entryId };
18
+ this._checkpoints.push(info);
19
+ this._denwaRenji.setCheckpointCount(this._checkpoints.length);
20
+ return info;
21
+ }
22
+ getCheckpoint(checkpointId) {
23
+ return this._checkpoints.find((cp) => cp.checkpointId === checkpointId);
24
+ }
25
+ getAllCheckpoints() {
26
+ return [...this._checkpoints];
27
+ }
28
+ /**
29
+ * Handle D-Mail: branch from the target checkpoint and inject the message.
30
+ * Returns the D-Mail content if one was pending, null otherwise.
31
+ */
32
+ async handleDMail() {
33
+ const dmail = this._denwaRenji.fetchPendingDMail();
34
+ if (!dmail)
35
+ return null;
36
+ const checkpoint = this._checkpoints.find((cp) => cp.checkpointId === dmail.checkpointId);
37
+ if (!checkpoint) {
38
+ throw new Error(`Checkpoint ${dmail.checkpointId} not found`);
39
+ }
40
+ // Branch session tree back to checkpoint entry
41
+ this._session.branch(checkpoint.entryId);
42
+ // Remove checkpoints after the target (keep target itself)
43
+ const targetIdx = this._checkpoints.indexOf(checkpoint);
44
+ this._checkpoints.length = targetIdx + 1;
45
+ this._denwaRenji.setCheckpointCount(this._checkpoints.length);
46
+ return dmail.message;
47
+ }
48
+ }
49
+ //# sourceMappingURL=checkpoint-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.js","sourceRoot":"","sources":["../../src/checkpoint/checkpoint-manager.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAIlF,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,OAAO,iBAAiB;IAKR;IAJZ,YAAY,GAAqB,EAAE,CAAC;IACpC,OAAO,GAAG,CAAC,CAAC,CAAC,4CAA4C;IACzD,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC;IAEvC,YAAoB,QAAwB;QAAxB,aAAQ,GAAR,QAAQ,CAAgB;IAAG,CAAC;IAEhD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAEnE,MAAM,IAAI,GAAmB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,YAAoB;QAChC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;IAC1E,CAAC;IAED,iBAAiB;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACnD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,YAAY,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,+CAA+C;QAC/C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzC,2DAA2D;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE9D,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { DMail } from "./types.js";
2
+ export declare class DenwaRenji {
3
+ private _pendingDMail;
4
+ private _checkpointCount;
5
+ sendDMail(message: string, checkpointId: number): void;
6
+ setCheckpointCount(n: number): void;
7
+ getCheckpointCount(): number;
8
+ fetchPendingDMail(): DMail | null;
9
+ hasPendingDMail(): boolean;
10
+ }
@@ -0,0 +1,26 @@
1
+ // DenwaRenji — D-Mail state machine
2
+ export class DenwaRenji {
3
+ _pendingDMail = null;
4
+ _checkpointCount = 0;
5
+ sendDMail(message, checkpointId) {
6
+ if (checkpointId < 0 || checkpointId >= this._checkpointCount) {
7
+ throw new Error(`Invalid checkpoint ID ${checkpointId}. Valid range: 0-${this._checkpointCount - 1}`);
8
+ }
9
+ this._pendingDMail = { message, checkpointId };
10
+ }
11
+ setCheckpointCount(n) {
12
+ this._checkpointCount = n;
13
+ }
14
+ getCheckpointCount() {
15
+ return this._checkpointCount;
16
+ }
17
+ fetchPendingDMail() {
18
+ const dmail = this._pendingDMail;
19
+ this._pendingDMail = null;
20
+ return dmail;
21
+ }
22
+ hasPendingDMail() {
23
+ return this._pendingDMail !== null;
24
+ }
25
+ }
26
+ //# sourceMappingURL=dmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dmail.js","sourceRoot":"","sources":["../../src/checkpoint/dmail.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAIpC,MAAM,OAAO,UAAU;IACb,aAAa,GAAiB,IAAI,CAAC;IACnC,gBAAgB,GAAG,CAAC,CAAC;IAE7B,SAAS,CAAC,OAAe,EAAE,YAAoB;QAC7C,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACb,yBAAyB,YAAY,oBAAoB,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,CACrF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IACjD,CAAC;IAED,kBAAkB,CAAC,CAAS;QAC1B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,iBAAiB;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export interface CheckpointConfig {
2
+ enabled?: boolean;
3
+ enableDMail?: boolean;
4
+ }
5
+ export interface DMail {
6
+ message: string;
7
+ checkpointId: number;
8
+ }
9
+ export interface CheckpointInfo {
10
+ checkpointId: number;
11
+ entryId: string;
12
+ }
@@ -0,0 +1,3 @@
1
+ // Checkpoint and D-Mail types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/checkpoint/types.ts"],"names":[],"mappings":"AAAA,8BAA8B"}
@@ -0,0 +1,6 @@
1
+ import type { AgentMessage } from "../types.js";
2
+ import type { CutPointResult } from "./types.js";
3
+ export declare function estimateTokens(messages: AgentMessage[]): number;
4
+ export declare function shouldCompact(contextTokens: number, maxContextTokens: number, reserveTokens: number): boolean;
5
+ export declare function findCutPoint(messages: AgentMessage[], keepRecentTokens: number): CutPointResult;
6
+ export declare function messagesToText(messages: AgentMessage[]): string;
@@ -0,0 +1,104 @@
1
+ // Compaction logic — token estimation, cut point detection, shouldCompact
2
+ const CHARS_PER_TOKEN = 4;
3
+ export function estimateTokens(messages) {
4
+ let total = 0;
5
+ for (const msg of messages) {
6
+ total += estimateMessageTokens(msg);
7
+ }
8
+ return total;
9
+ }
10
+ function estimateMessageTokens(msg) {
11
+ if (!msg || typeof msg !== "object" || !("role" in msg))
12
+ return 0;
13
+ const m = msg;
14
+ if (m.role === "user") {
15
+ if (typeof m.content === "string")
16
+ return Math.ceil(m.content.length / CHARS_PER_TOKEN);
17
+ return m.content.reduce((sum, block) => {
18
+ if (block.type === "text")
19
+ return sum + Math.ceil(block.text.length / CHARS_PER_TOKEN);
20
+ return sum + 1000; // image estimate
21
+ }, 0);
22
+ }
23
+ if (m.role === "assistant") {
24
+ return m.content.reduce((sum, block) => {
25
+ if (block.type === "text")
26
+ return sum + Math.ceil(block.text.length / CHARS_PER_TOKEN);
27
+ if (block.type === "thinking")
28
+ return sum + Math.ceil(block.thinking.length / CHARS_PER_TOKEN);
29
+ if (block.type === "tool_call")
30
+ return sum + Math.ceil(JSON.stringify(block.input).length / CHARS_PER_TOKEN) + 20;
31
+ return sum;
32
+ }, 0);
33
+ }
34
+ if (m.role === "tool_result") {
35
+ if (typeof m.content === "string")
36
+ return Math.ceil(m.content.length / CHARS_PER_TOKEN);
37
+ return m.content.reduce((sum, block) => {
38
+ if (block.type === "text")
39
+ return sum + Math.ceil(block.text.length / CHARS_PER_TOKEN);
40
+ return sum + 1000;
41
+ }, 0);
42
+ }
43
+ return 0;
44
+ }
45
+ export function shouldCompact(contextTokens, maxContextTokens, reserveTokens) {
46
+ return contextTokens > maxContextTokens - reserveTokens;
47
+ }
48
+ export function findCutPoint(messages, keepRecentTokens) {
49
+ if (messages.length === 0) {
50
+ return { firstKeptIndex: 0, isSplitTurn: false };
51
+ }
52
+ // Walk backwards, accumulating tokens until we reach keepRecentTokens
53
+ let accumulated = 0;
54
+ let cutIndex = messages.length;
55
+ for (let i = messages.length - 1; i >= 0; i--) {
56
+ const tokens = estimateMessageTokens(messages[i]);
57
+ accumulated += tokens;
58
+ if (accumulated >= keepRecentTokens) {
59
+ cutIndex = i + 1;
60
+ break;
61
+ }
62
+ }
63
+ // Ensure we don't cut at a tool_result (must follow its tool_call)
64
+ while (cutIndex < messages.length) {
65
+ const msg = messages[cutIndex];
66
+ if (msg && typeof msg === "object" && "role" in msg && msg.role === "tool_result") {
67
+ cutIndex++;
68
+ }
69
+ else {
70
+ break;
71
+ }
72
+ }
73
+ // Don't cut if nothing to discard
74
+ if (cutIndex <= 1) {
75
+ return { firstKeptIndex: 0, isSplitTurn: false };
76
+ }
77
+ const isSplitTurn = cutIndex > 0 && cutIndex < messages.length &&
78
+ messages[cutIndex - 1] && typeof messages[cutIndex - 1] === "object" &&
79
+ "role" in messages[cutIndex - 1] && messages[cutIndex - 1].role === "assistant";
80
+ return { firstKeptIndex: cutIndex, isSplitTurn };
81
+ }
82
+ export function messagesToText(messages) {
83
+ const parts = [];
84
+ for (const msg of messages) {
85
+ if (!msg || typeof msg !== "object" || !("role" in msg))
86
+ continue;
87
+ const m = msg;
88
+ if (m.role === "user") {
89
+ const text = typeof m.content === "string" ? m.content : m.content.filter((b) => b.type === "text").map((b) => b.text).join("\n");
90
+ parts.push(`User: ${text}`);
91
+ }
92
+ else if (m.role === "assistant") {
93
+ const text = m.content.filter((b) => b.type === "text").map((b) => b.text).join("\n");
94
+ const toolCalls = m.content.filter((b) => b.type === "tool_call").map((b) => b.name);
95
+ parts.push(`Assistant: ${text}${toolCalls.length ? ` [tools: ${toolCalls.join(", ")}]` : ""}`);
96
+ }
97
+ else if (m.role === "tool_result") {
98
+ const text = typeof m.content === "string" ? m.content : m.content.filter((b) => b.type === "text").map((b) => b.text).join("\n");
99
+ parts.push(`Tool result: ${text.slice(0, 500)}`);
100
+ }
101
+ }
102
+ return parts.join("\n");
103
+ }
104
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/compaction/compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { LLMProvider } from "../llm/types.js";
2
+ import type { AgentMessage } from "../types.js";
3
+ import type { CompactionSummarizer, CompactionInput } from "./types.js";
4
+ export declare class LLMSummarizer implements CompactionSummarizer {
5
+ private provider;
6
+ private modelId;
7
+ constructor(provider: LLMProvider, modelId: string);
8
+ summarize(messages: CompactionInput[], previousSummary?: string): Promise<string>;
9
+ }
10
+ export declare function agentMessagesToCompactionInput(messages: AgentMessage[]): CompactionInput[];