@antaif3ng/til-work 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 (150) hide show
  1. package/README.md +573 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +7 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/core/agent.d.ts +78 -0
  7. package/dist/core/agent.d.ts.map +1 -0
  8. package/dist/core/agent.js +372 -0
  9. package/dist/core/agent.js.map +1 -0
  10. package/dist/core/compaction.d.ts +40 -0
  11. package/dist/core/compaction.d.ts.map +1 -0
  12. package/dist/core/compaction.js +228 -0
  13. package/dist/core/compaction.js.map +1 -0
  14. package/dist/core/config.d.ts +54 -0
  15. package/dist/core/config.d.ts.map +1 -0
  16. package/dist/core/config.js +257 -0
  17. package/dist/core/config.js.map +1 -0
  18. package/dist/core/llm.d.ts +29 -0
  19. package/dist/core/llm.d.ts.map +1 -0
  20. package/dist/core/llm.js +553 -0
  21. package/dist/core/llm.js.map +1 -0
  22. package/dist/core/markdown.d.ts +20 -0
  23. package/dist/core/markdown.d.ts.map +1 -0
  24. package/dist/core/markdown.js +173 -0
  25. package/dist/core/markdown.js.map +1 -0
  26. package/dist/core/memory.d.ts +30 -0
  27. package/dist/core/memory.d.ts.map +1 -0
  28. package/dist/core/memory.js +163 -0
  29. package/dist/core/memory.js.map +1 -0
  30. package/dist/core/pricing.d.ts +21 -0
  31. package/dist/core/pricing.d.ts.map +1 -0
  32. package/dist/core/pricing.js +70 -0
  33. package/dist/core/pricing.js.map +1 -0
  34. package/dist/core/session-manager.d.ts +83 -0
  35. package/dist/core/session-manager.d.ts.map +1 -0
  36. package/dist/core/session-manager.js +250 -0
  37. package/dist/core/session-manager.js.map +1 -0
  38. package/dist/core/session.d.ts +76 -0
  39. package/dist/core/session.d.ts.map +1 -0
  40. package/dist/core/session.js +270 -0
  41. package/dist/core/session.js.map +1 -0
  42. package/dist/core/skills.d.ts +49 -0
  43. package/dist/core/skills.d.ts.map +1 -0
  44. package/dist/core/skills.js +232 -0
  45. package/dist/core/skills.js.map +1 -0
  46. package/dist/core/system-prompt.d.ts +17 -0
  47. package/dist/core/system-prompt.d.ts.map +1 -0
  48. package/dist/core/system-prompt.js +77 -0
  49. package/dist/core/system-prompt.js.map +1 -0
  50. package/dist/core/tool-permissions.d.ts +12 -0
  51. package/dist/core/tool-permissions.d.ts.map +1 -0
  52. package/dist/core/tool-permissions.js +71 -0
  53. package/dist/core/tool-permissions.js.map +1 -0
  54. package/dist/core/types.d.ts +157 -0
  55. package/dist/core/types.d.ts.map +1 -0
  56. package/dist/core/types.js +21 -0
  57. package/dist/core/types.js.map +1 -0
  58. package/dist/extensions/builtin/mcp.d.ts +61 -0
  59. package/dist/extensions/builtin/mcp.d.ts.map +1 -0
  60. package/dist/extensions/builtin/mcp.js +407 -0
  61. package/dist/extensions/builtin/mcp.js.map +1 -0
  62. package/dist/extensions/index.d.ts +4 -0
  63. package/dist/extensions/index.d.ts.map +1 -0
  64. package/dist/extensions/index.js +3 -0
  65. package/dist/extensions/index.js.map +1 -0
  66. package/dist/extensions/loader.d.ts +19 -0
  67. package/dist/extensions/loader.d.ts.map +1 -0
  68. package/dist/extensions/loader.js +118 -0
  69. package/dist/extensions/loader.js.map +1 -0
  70. package/dist/extensions/runner.d.ts +28 -0
  71. package/dist/extensions/runner.d.ts.map +1 -0
  72. package/dist/extensions/runner.js +77 -0
  73. package/dist/extensions/runner.js.map +1 -0
  74. package/dist/extensions/types.d.ts +84 -0
  75. package/dist/extensions/types.d.ts.map +1 -0
  76. package/dist/extensions/types.js +6 -0
  77. package/dist/extensions/types.js.map +1 -0
  78. package/dist/index.d.ts +21 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +15 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/main.d.ts +5 -0
  83. package/dist/main.d.ts.map +1 -0
  84. package/dist/main.js +355 -0
  85. package/dist/main.js.map +1 -0
  86. package/dist/modes/interactive.d.ts +6 -0
  87. package/dist/modes/interactive.d.ts.map +1 -0
  88. package/dist/modes/interactive.js +961 -0
  89. package/dist/modes/interactive.js.map +1 -0
  90. package/dist/modes/oneshot.d.ts +8 -0
  91. package/dist/modes/oneshot.d.ts.map +1 -0
  92. package/dist/modes/oneshot.js +71 -0
  93. package/dist/modes/oneshot.js.map +1 -0
  94. package/dist/tools/bash.d.ts +3 -0
  95. package/dist/tools/bash.d.ts.map +1 -0
  96. package/dist/tools/bash.js +104 -0
  97. package/dist/tools/bash.js.map +1 -0
  98. package/dist/tools/edit.d.ts +3 -0
  99. package/dist/tools/edit.d.ts.map +1 -0
  100. package/dist/tools/edit.js +63 -0
  101. package/dist/tools/edit.js.map +1 -0
  102. package/dist/tools/file-manager.d.ts +3 -0
  103. package/dist/tools/file-manager.d.ts.map +1 -0
  104. package/dist/tools/file-manager.js +85 -0
  105. package/dist/tools/file-manager.js.map +1 -0
  106. package/dist/tools/index.d.ts +17 -0
  107. package/dist/tools/index.d.ts.map +1 -0
  108. package/dist/tools/index.js +42 -0
  109. package/dist/tools/index.js.map +1 -0
  110. package/dist/tools/read.d.ts +3 -0
  111. package/dist/tools/read.d.ts.map +1 -0
  112. package/dist/tools/read.js +65 -0
  113. package/dist/tools/read.js.map +1 -0
  114. package/dist/tools/system-info.d.ts +3 -0
  115. package/dist/tools/system-info.d.ts.map +1 -0
  116. package/dist/tools/system-info.js +101 -0
  117. package/dist/tools/system-info.js.map +1 -0
  118. package/dist/tools/web-fetch.d.ts +3 -0
  119. package/dist/tools/web-fetch.d.ts.map +1 -0
  120. package/dist/tools/web-fetch.js +117 -0
  121. package/dist/tools/web-fetch.js.map +1 -0
  122. package/dist/tools/web-search.d.ts +9 -0
  123. package/dist/tools/web-search.d.ts.map +1 -0
  124. package/dist/tools/web-search.js +124 -0
  125. package/dist/tools/web-search.js.map +1 -0
  126. package/dist/tools/write.d.ts +3 -0
  127. package/dist/tools/write.d.ts.map +1 -0
  128. package/dist/tools/write.js +30 -0
  129. package/dist/tools/write.js.map +1 -0
  130. package/dist/utils/autocomplete.d.ts +23 -0
  131. package/dist/utils/autocomplete.d.ts.map +1 -0
  132. package/dist/utils/autocomplete.js +191 -0
  133. package/dist/utils/autocomplete.js.map +1 -0
  134. package/dist/utils/file-processor.d.ts +19 -0
  135. package/dist/utils/file-processor.d.ts.map +1 -0
  136. package/dist/utils/file-processor.js +86 -0
  137. package/dist/utils/file-processor.js.map +1 -0
  138. package/dist/utils/path.d.ts +8 -0
  139. package/dist/utils/path.d.ts.map +1 -0
  140. package/dist/utils/path.js +60 -0
  141. package/dist/utils/path.js.map +1 -0
  142. package/dist/utils/shell.d.ts +6 -0
  143. package/dist/utils/shell.d.ts.map +1 -0
  144. package/dist/utils/shell.js +64 -0
  145. package/dist/utils/shell.js.map +1 -0
  146. package/dist/utils/truncate.d.ts +12 -0
  147. package/dist/utils/truncate.d.ts.map +1 -0
  148. package/dist/utils/truncate.js +46 -0
  149. package/dist/utils/truncate.js.map +1 -0
  150. package/package.json +58 -0
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Session persistence manager.
3
+ * Stores conversations as append-only JSONL files (matching pi-mono pattern).
4
+ *
5
+ * File layout:
6
+ * ~/.til/sessions/--<encoded-cwd>--/<timestamp>_<sessionId>.jsonl
7
+ *
8
+ * Each line is one of:
9
+ * { type: "session", id, timestamp, cwd, model } — header (first line)
10
+ * { type: "message", id, message } — user/assistant/toolResult
11
+ * { type: "model_change", from, to, timestamp } — model switch event
12
+ */
13
+ import { randomUUID } from "node:crypto";
14
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, statSync, } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { homedir } from "node:os";
17
+ // ── Helpers ──
18
+ function getSessionsBaseDir() {
19
+ return join(homedir(), ".til", "sessions");
20
+ }
21
+ function encodeCwd(cwd) {
22
+ return `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
23
+ }
24
+ function getSessionDir(cwd) {
25
+ const dir = join(getSessionsBaseDir(), encodeCwd(cwd));
26
+ if (!existsSync(dir)) {
27
+ mkdirSync(dir, { recursive: true });
28
+ }
29
+ return dir;
30
+ }
31
+ function formatTimestamp(date) {
32
+ return date.toISOString().replace(/[:.]/g, "-");
33
+ }
34
+ function generateEntryId() {
35
+ return randomUUID().slice(0, 8);
36
+ }
37
+ // ── SessionManager ──
38
+ export class SessionManager {
39
+ _sessionId;
40
+ _filePath;
41
+ _cwd;
42
+ _isResumed;
43
+ _restoredMessageCount;
44
+ constructor(sessionId, filePath, cwd, isResumed, restoredMessageCount) {
45
+ this._sessionId = sessionId;
46
+ this._filePath = filePath;
47
+ this._cwd = cwd;
48
+ this._isResumed = isResumed;
49
+ this._restoredMessageCount = restoredMessageCount;
50
+ }
51
+ get sessionId() { return this._sessionId; }
52
+ get shortId() { return this._sessionId.slice(0, 8); }
53
+ get filePath() { return this._filePath; }
54
+ get cwd() { return this._cwd; }
55
+ get isResumed() { return this._isResumed; }
56
+ get restoredMessageCount() { return this._restoredMessageCount; }
57
+ /**
58
+ * Create a new session and write the header.
59
+ */
60
+ static create(cwd, modelId) {
61
+ const sessionId = randomUUID();
62
+ const timestamp = new Date().toISOString();
63
+ const dir = getSessionDir(cwd);
64
+ const filePath = join(dir, `${formatTimestamp(new Date())}_${sessionId}.jsonl`);
65
+ const header = {
66
+ type: "session",
67
+ id: sessionId,
68
+ timestamp,
69
+ cwd,
70
+ model: modelId,
71
+ };
72
+ appendFileSync(filePath, JSON.stringify(header) + "\n", "utf-8");
73
+ return new SessionManager(sessionId, filePath, cwd, false, 0);
74
+ }
75
+ /**
76
+ * Continue the most recent session for the given cwd.
77
+ * Returns null if no sessions exist.
78
+ */
79
+ static continueRecent(cwd) {
80
+ const dir = getSessionDir(cwd);
81
+ const file = findMostRecentSession(dir);
82
+ if (!file)
83
+ return null;
84
+ return SessionManager.loadFromFile(file, cwd);
85
+ }
86
+ /**
87
+ * Open a session by short ID (or full UUID prefix).
88
+ * Searches both cwd-specific dir and all session dirs.
89
+ */
90
+ static open(idPrefix, cwd) {
91
+ const candidates = getAllSessionFiles(cwd);
92
+ const match = candidates.find((info) => info.id.startsWith(idPrefix) || info.shortId === idPrefix);
93
+ if (!match)
94
+ return null;
95
+ return SessionManager.loadFromFile(match.filePath, cwd);
96
+ }
97
+ /**
98
+ * List sessions for the given cwd (most recent first).
99
+ */
100
+ static list(cwd) {
101
+ return getAllSessionFiles(cwd).sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
102
+ }
103
+ /**
104
+ * Load from a specific JSONL file.
105
+ */
106
+ static loadFromFile(filePath, cwd) {
107
+ const entries = parseSessionFile(filePath);
108
+ const header = entries.find((e) => e.type === "session");
109
+ const messages = entries.filter((e) => e.type === "message");
110
+ const sessionId = header?.id ?? randomUUID();
111
+ const resolvedCwd = header?.cwd ?? cwd;
112
+ return new SessionManager(sessionId, filePath, resolvedCwd, true, messages.length);
113
+ }
114
+ // ── Write operations ──
115
+ appendMessage(message) {
116
+ const entry = {
117
+ type: "message",
118
+ id: generateEntryId(),
119
+ message,
120
+ };
121
+ appendFileSync(this._filePath, JSON.stringify(entry) + "\n", "utf-8");
122
+ }
123
+ appendModelChange(from, to) {
124
+ const entry = {
125
+ type: "model_change",
126
+ from,
127
+ to,
128
+ timestamp: new Date().toISOString(),
129
+ };
130
+ appendFileSync(this._filePath, JSON.stringify(entry) + "\n", "utf-8");
131
+ }
132
+ // ── Read operations ──
133
+ loadMessages() {
134
+ const entries = parseSessionFile(this._filePath);
135
+ return entries
136
+ .filter((e) => e.type === "message")
137
+ .map((e) => e.message);
138
+ }
139
+ loadHeader() {
140
+ const entries = parseSessionFile(this._filePath);
141
+ return entries.find((e) => e.type === "session") ?? null;
142
+ }
143
+ }
144
+ // ── File scanning ──
145
+ function findMostRecentSession(dir) {
146
+ if (!existsSync(dir))
147
+ return null;
148
+ let mostRecent = null;
149
+ let mostRecentMtime = 0;
150
+ for (const file of readdirSync(dir)) {
151
+ if (!file.endsWith(".jsonl"))
152
+ continue;
153
+ const fullPath = join(dir, file);
154
+ try {
155
+ const stat = statSync(fullPath);
156
+ if (stat.mtimeMs > mostRecentMtime) {
157
+ mostRecentMtime = stat.mtimeMs;
158
+ mostRecent = fullPath;
159
+ }
160
+ }
161
+ catch { /* skip unreadable */ }
162
+ }
163
+ return mostRecent;
164
+ }
165
+ function getAllSessionFiles(cwd) {
166
+ const results = [];
167
+ const baseDir = getSessionsBaseDir();
168
+ if (!existsSync(baseDir))
169
+ return results;
170
+ // Prioritize cwd-specific directory, then scan all
171
+ const cwdDir = join(baseDir, encodeCwd(cwd));
172
+ const dirsToScan = new Set();
173
+ if (existsSync(cwdDir))
174
+ dirsToScan.add(cwdDir);
175
+ for (const entry of readdirSync(baseDir)) {
176
+ const fullPath = join(baseDir, entry);
177
+ try {
178
+ if (statSync(fullPath).isDirectory()) {
179
+ dirsToScan.add(fullPath);
180
+ }
181
+ }
182
+ catch { /* skip */ }
183
+ }
184
+ for (const dir of dirsToScan) {
185
+ for (const file of readdirSync(dir)) {
186
+ if (!file.endsWith(".jsonl"))
187
+ continue;
188
+ const filePath = join(dir, file);
189
+ try {
190
+ const info = getSessionInfoQuick(filePath);
191
+ if (info)
192
+ results.push(info);
193
+ }
194
+ catch { /* skip corrupt files */ }
195
+ }
196
+ }
197
+ return results;
198
+ }
199
+ function getSessionInfoQuick(filePath) {
200
+ try {
201
+ const content = readFileSync(filePath, "utf-8");
202
+ const firstLine = content.split("\n")[0];
203
+ if (!firstLine)
204
+ return null;
205
+ const header = JSON.parse(firstLine);
206
+ if (header.type !== "session")
207
+ return null;
208
+ const lines = content.split("\n").filter((l) => l.trim());
209
+ const messageCount = lines.filter((l) => {
210
+ try {
211
+ return JSON.parse(l).type === "message";
212
+ }
213
+ catch {
214
+ return false;
215
+ }
216
+ }).length;
217
+ const stat = statSync(filePath);
218
+ return {
219
+ id: header.id,
220
+ shortId: header.id.slice(0, 8),
221
+ filePath,
222
+ timestamp: header.timestamp,
223
+ cwd: header.cwd,
224
+ model: header.model,
225
+ messageCount,
226
+ mtime: stat.mtime,
227
+ };
228
+ }
229
+ catch {
230
+ return null;
231
+ }
232
+ }
233
+ // ── JSONL parsing ──
234
+ function parseSessionFile(filePath) {
235
+ if (!existsSync(filePath))
236
+ return [];
237
+ const content = readFileSync(filePath, "utf-8");
238
+ const entries = [];
239
+ for (const line of content.split("\n")) {
240
+ const trimmed = line.trim();
241
+ if (!trimmed)
242
+ continue;
243
+ try {
244
+ entries.push(JSON.parse(trimmed));
245
+ }
246
+ catch { /* skip malformed lines */ }
247
+ }
248
+ return entries;
249
+ }
250
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * TilSession: wraps Agent with configuration, tool management,
3
+ * skill loading, memory, session persistence, and system prompt lifecycle.
4
+ */
5
+ import { Agent } from "./agent.js";
6
+ import { type Skill } from "./skills.js";
7
+ import { SessionManager, type SessionInfo } from "./session-manager.js";
8
+ import type { AgentEvent, Message, ModelConfig, Usage } from "./types.js";
9
+ import { ExtensionRunner } from "../extensions/runner.js";
10
+ import type { CommandDefinition } from "../extensions/types.js";
11
+ export type { Skill } from "./skills.js";
12
+ export type { SessionInfo } from "./session-manager.js";
13
+ export interface SessionOptions {
14
+ cwd?: string;
15
+ model?: string;
16
+ baseUrl?: string;
17
+ tools?: string[];
18
+ skillPaths?: string[];
19
+ noSkills?: boolean;
20
+ customInstructions?: string;
21
+ getSteeringMessages?: () => Promise<Message[]>;
22
+ getFollowUpMessages?: () => Promise<Message[]>;
23
+ onToolCallRequest?: (toolName: string, args: Record<string, any>) => Promise<{
24
+ block: boolean;
25
+ reason?: string;
26
+ }>;
27
+ /** Resume a specific session by short ID or full UUID prefix */
28
+ resumeSessionId?: string;
29
+ /** Continue the most recent session for the cwd */
30
+ continueSession?: boolean;
31
+ }
32
+ export declare class TilSession {
33
+ readonly agent: Agent;
34
+ readonly model: ModelConfig;
35
+ readonly cwd: string;
36
+ readonly skills: Skill[];
37
+ readonly sessionManager: SessionManager;
38
+ readonly extensionRunner?: ExtensionRunner;
39
+ private config;
40
+ private toolNames;
41
+ private customInstructions?;
42
+ private _cumulativeUsage;
43
+ private _lastTurnUsage?;
44
+ private constructor();
45
+ static create(options?: SessionOptions): Promise<TilSession>;
46
+ subscribe(fn: (e: AgentEvent) => void): () => void;
47
+ prompt(input: string): Promise<void>;
48
+ abort(): void;
49
+ clearMessages(): void;
50
+ switchModel(modelId: string): void;
51
+ getSkillNames(): string[];
52
+ /** Get extension commands for use in interactive mode */
53
+ getExtensionCommands(): Map<string, CommandDefinition>;
54
+ /** Get info about loaded extensions */
55
+ getExtensionInfo(): Array<{
56
+ name: string;
57
+ path: string;
58
+ toolCount: number;
59
+ commandCount: number;
60
+ }>;
61
+ /** Shut down extensions (call on exit) */
62
+ shutdown(): Promise<void>;
63
+ getMemoryContent(): string | null;
64
+ get cumulativeUsage(): Usage;
65
+ get lastTurnUsage(): Usage | undefined;
66
+ getUsageSummary(): string;
67
+ getLastTurnUsageSummary(): string;
68
+ getContextUsagePercent(): {
69
+ percent: number;
70
+ display: string;
71
+ };
72
+ /** List sessions for the current cwd */
73
+ static listSessions(cwd?: string): SessionInfo[];
74
+ private refreshSystemPrompt;
75
+ }
76
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * TilSession: wraps Agent with configuration, tool management,
3
+ * skill loading, memory, session persistence, and system prompt lifecycle.
4
+ */
5
+ import { Agent } from "./agent.js";
6
+ import { buildSystemPrompt } from "./system-prompt.js";
7
+ import { loadConfig, resolveModel, resolveApiKey, resolveBaseUrl } from "./config.js";
8
+ import { createAllTools, TOOL_NAMES } from "../tools/index.js";
9
+ import { loadSkills } from "./skills.js";
10
+ import { loadMemory, getMemoryDisplay, loadProjectContextFiles } from "./memory.js";
11
+ import { SessionManager } from "./session-manager.js";
12
+ import { calculateCost, formatUsage, formatContextPercent } from "./pricing.js";
13
+ import { calculateContextTokens, estimateAllTokens } from "./compaction.js";
14
+ import { createEmptyUsage, addUsage } from "./types.js";
15
+ import { loadAllExtensions } from "../extensions/loader.js";
16
+ import { ExtensionRunner } from "../extensions/runner.js";
17
+ import { registerMcpServers } from "../extensions/builtin/mcp.js";
18
+ export class TilSession {
19
+ agent;
20
+ model;
21
+ cwd;
22
+ skills;
23
+ sessionManager;
24
+ extensionRunner;
25
+ config;
26
+ toolNames;
27
+ customInstructions;
28
+ _cumulativeUsage = createEmptyUsage();
29
+ _lastTurnUsage;
30
+ constructor(agent, model, cwd, config, skills, toolNames, sessionManager, customInstructions, extensionRunner) {
31
+ this.agent = agent;
32
+ this.model = model;
33
+ this.cwd = cwd;
34
+ this.config = config;
35
+ this.skills = skills;
36
+ this.toolNames = toolNames;
37
+ this.sessionManager = sessionManager;
38
+ this.customInstructions = customInstructions;
39
+ this.extensionRunner = extensionRunner;
40
+ }
41
+ static async create(options = {}) {
42
+ const config = await loadConfig();
43
+ const cwd = options.cwd ?? process.cwd();
44
+ const modelId = options.model ?? config.defaultModel.id;
45
+ const model = resolveModel(modelId, config);
46
+ model.apiKey = resolveApiKey(model, config);
47
+ model.baseUrl = options.baseUrl ?? resolveBaseUrl(model, config);
48
+ // Load skills
49
+ const skillResult = options.noSkills
50
+ ? { skills: [], diagnostics: [] }
51
+ : loadSkills({
52
+ cwd,
53
+ skillPaths: options.skillPaths,
54
+ includeDefaults: true,
55
+ });
56
+ const skills = skillResult.skills;
57
+ const toolNames = options.tools ?? config.defaultTools ?? [...TOOL_NAMES.DEFAULT];
58
+ const allToolsMap = new Map();
59
+ for (const tool of createAllTools(cwd)) {
60
+ allToolsMap.set(tool.name, tool);
61
+ }
62
+ const selectedTools = toolNames
63
+ .map((name) => allToolsMap.get(name))
64
+ .filter((t) => t !== undefined);
65
+ // Load extensions (user extensions + MCP servers)
66
+ let extensionRunner;
67
+ const extensionToolNames = [];
68
+ try {
69
+ const loadedExtensions = await loadAllExtensions(cwd, config);
70
+ // Load MCP servers as a built-in extension
71
+ if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {
72
+ const mcpExtension = {
73
+ path: "<builtin:mcp>",
74
+ name: "mcp",
75
+ tools: new Map(),
76
+ commands: new Map(),
77
+ handlers: new Map(),
78
+ };
79
+ const mcpApi = {
80
+ cwd,
81
+ config,
82
+ registerTool(tool) { mcpExtension.tools.set(tool.name, tool); },
83
+ registerCommand(cmd) { mcpExtension.commands.set(cmd.name, cmd); },
84
+ on(event, handler) {
85
+ if (!mcpExtension.handlers.has(event))
86
+ mcpExtension.handlers.set(event, []);
87
+ mcpExtension.handlers.get(event).push(handler);
88
+ },
89
+ };
90
+ await registerMcpServers(mcpApi, config.mcpServers);
91
+ loadedExtensions.push(mcpExtension);
92
+ }
93
+ if (loadedExtensions.length > 0) {
94
+ extensionRunner = new ExtensionRunner(loadedExtensions);
95
+ const extensionTools = extensionRunner.getAllTools();
96
+ for (const tool of extensionTools) {
97
+ selectedTools.push(tool);
98
+ extensionToolNames.push(tool.name);
99
+ }
100
+ }
101
+ }
102
+ catch (err) {
103
+ console.error(`Extension loading warning: ${err.message}`);
104
+ }
105
+ const allToolNamesList = [...toolNames, ...extensionToolNames];
106
+ const systemPrompt = buildSystemPrompt({
107
+ cwd,
108
+ tools: allToolNamesList,
109
+ skills,
110
+ customInstructions: options.customInstructions,
111
+ });
112
+ const agentOpts = {
113
+ systemPrompt,
114
+ model,
115
+ tools: selectedTools,
116
+ contextWindow: model.contextWindow,
117
+ compactionSettings: config.compaction,
118
+ getSteeringMessages: options.getSteeringMessages,
119
+ getFollowUpMessages: options.getFollowUpMessages,
120
+ onToolCallRequest: options.onToolCallRequest,
121
+ };
122
+ const agent = new Agent(agentOpts);
123
+ // Session persistence: resume, continue, or create new
124
+ let sm = null;
125
+ if (options.resumeSessionId) {
126
+ sm = SessionManager.open(options.resumeSessionId, cwd);
127
+ }
128
+ else if (options.continueSession) {
129
+ sm = SessionManager.continueRecent(cwd);
130
+ }
131
+ if (sm) {
132
+ // Restore messages into the agent
133
+ const messages = sm.loadMessages();
134
+ agent.setMessages(messages);
135
+ }
136
+ else {
137
+ sm = SessionManager.create(cwd, model.id);
138
+ }
139
+ const session = new TilSession(agent, model, cwd, config, skills, allToolNamesList, sm, options.customInstructions, extensionRunner);
140
+ // Auto-persist, usage tracking, and extension event forwarding
141
+ agent.subscribe((event) => {
142
+ if (event.type === "message_end") {
143
+ session.sessionManager.appendMessage(event.message);
144
+ if (event.message.role === "assistant") {
145
+ const assistantMsg = event.message;
146
+ if (assistantMsg.usage) {
147
+ session._lastTurnUsage = assistantMsg.usage;
148
+ const cost = calculateCost(session.model.id, assistantMsg.usage);
149
+ assistantMsg.usage.cost = cost;
150
+ addUsage(session._cumulativeUsage, assistantMsg.usage);
151
+ if (!session._cumulativeUsage.cost) {
152
+ session._cumulativeUsage.cost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 };
153
+ }
154
+ }
155
+ }
156
+ }
157
+ // Forward events to extensions
158
+ if (extensionRunner) {
159
+ if (event.type === "agent_start") {
160
+ extensionRunner.emit("agent_start", {});
161
+ }
162
+ else if (event.type === "agent_end") {
163
+ extensionRunner.emit("agent_end", { messages: event.messages });
164
+ }
165
+ else if (event.type === "tool_execution_start") {
166
+ extensionRunner.emit("tool_call", { toolName: event.toolName, args: event.args });
167
+ }
168
+ else if (event.type === "tool_execution_end") {
169
+ extensionRunner.emit("tool_result", {
170
+ toolName: event.toolName,
171
+ result: { content: Array.isArray(event.result) ? event.result : [{ type: "text", text: String(event.result) }] },
172
+ isError: event.isError,
173
+ });
174
+ }
175
+ }
176
+ });
177
+ // Emit session_start to extensions
178
+ if (extensionRunner) {
179
+ await extensionRunner.emit("session_start", { cwd });
180
+ }
181
+ return session;
182
+ }
183
+ subscribe(fn) {
184
+ return this.agent.subscribe(fn);
185
+ }
186
+ async prompt(input) {
187
+ this.refreshSystemPrompt();
188
+ return this.agent.prompt(input);
189
+ }
190
+ abort() {
191
+ this.agent.abort();
192
+ }
193
+ clearMessages() {
194
+ this.agent.clearMessages();
195
+ }
196
+ switchModel(modelId) {
197
+ const oldId = this.model.id;
198
+ const model = resolveModel(modelId, this.config);
199
+ model.apiKey = resolveApiKey(model, this.config);
200
+ model.baseUrl = resolveBaseUrl(model, this.config);
201
+ this.agent.setModel(model);
202
+ this.sessionManager.appendModelChange(oldId, modelId);
203
+ }
204
+ getSkillNames() {
205
+ return this.skills.map((s) => s.name);
206
+ }
207
+ /** Get extension commands for use in interactive mode */
208
+ getExtensionCommands() {
209
+ return this.extensionRunner?.getAllCommands() ?? new Map();
210
+ }
211
+ /** Get info about loaded extensions */
212
+ getExtensionInfo() {
213
+ if (!this.extensionRunner)
214
+ return [];
215
+ return this.extensionRunner.loadedExtensions.map((ext) => ({
216
+ name: ext.name,
217
+ path: ext.path,
218
+ toolCount: ext.tools.size,
219
+ commandCount: ext.commands.size,
220
+ }));
221
+ }
222
+ /** Shut down extensions (call on exit) */
223
+ async shutdown() {
224
+ await this.extensionRunner?.shutdown(this.cwd);
225
+ }
226
+ getMemoryContent() {
227
+ const memory = loadMemory(this.cwd);
228
+ return getMemoryDisplay(memory, this.cwd);
229
+ }
230
+ // ── Usage ──
231
+ get cumulativeUsage() {
232
+ return this._cumulativeUsage;
233
+ }
234
+ get lastTurnUsage() {
235
+ return this._lastTurnUsage;
236
+ }
237
+ getUsageSummary() {
238
+ return formatUsage(this._cumulativeUsage, this.model.id);
239
+ }
240
+ getLastTurnUsageSummary() {
241
+ if (!this._lastTurnUsage)
242
+ return "";
243
+ return formatUsage(this._lastTurnUsage, this.model.id);
244
+ }
245
+ getContextUsagePercent() {
246
+ const contextTokens = this._lastTurnUsage
247
+ ? calculateContextTokens(this._lastTurnUsage)
248
+ : estimateAllTokens(this.agent.currentState.messages);
249
+ const contextWindow = this.model.contextWindow ?? 128000;
250
+ return formatContextPercent(contextTokens, contextWindow);
251
+ }
252
+ /** List sessions for the current cwd */
253
+ static listSessions(cwd) {
254
+ return SessionManager.list(cwd ?? process.cwd());
255
+ }
256
+ refreshSystemPrompt() {
257
+ const memory = loadMemory(this.cwd);
258
+ const contextFiles = loadProjectContextFiles(this.cwd);
259
+ const systemPrompt = buildSystemPrompt({
260
+ cwd: this.cwd,
261
+ tools: this.toolNames,
262
+ skills: this.skills,
263
+ customInstructions: this.customInstructions,
264
+ memory,
265
+ contextFiles,
266
+ });
267
+ this.agent.setSystemPrompt(systemPrompt);
268
+ }
269
+ }
270
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}