pilot-ai 0.4.0 → 0.4.1
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/README.md +23 -0
- package/dist/agent/claude.d.ts +4 -0
- package/dist/agent/claude.d.ts.map +1 -1
- package/dist/agent/claude.js +12 -2
- package/dist/agent/claude.js.map +1 -1
- package/dist/agent/core.d.ts +1 -0
- package/dist/agent/core.d.ts.map +1 -1
- package/dist/agent/core.js +25 -1
- package/dist/agent/core.js.map +1 -1
- package/dist/agent/session.d.ts +44 -0
- package/dist/agent/session.d.ts.map +1 -0
- package/dist/agent/session.js +129 -0
- package/dist/agent/session.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,6 +56,8 @@ Pilot-AI is a local AI agent that lives on your Mac. Send it natural-language co
|
|
|
56
56
|
- **Notion integration** — search, create, update pages and databases
|
|
57
57
|
- **Google integration** — Gmail, Google Calendar, and Google Drive via OAuth2
|
|
58
58
|
- **MCP auto-discovery** — agent detects needed MCP servers and proposes installation with one-click approval
|
|
59
|
+
- **Coding agent** — writes code, runs builds, executes tests, and iterates until the task is done
|
|
60
|
+
- **Session continuity** — messages in the same thread share a Claude session with full conversation context
|
|
59
61
|
- **Scheduled tasks** — cron-like jobs with natural language scheduling
|
|
60
62
|
- **Skills system** — teach the agent reusable procedures
|
|
61
63
|
- **Project awareness** — resolves projects, remembers context per project
|
|
@@ -126,6 +128,27 @@ Just message your agent in Slack or Telegram:
|
|
|
126
128
|
| `Send a draft email to john@example.com` | Composes a Gmail draft with the given content |
|
|
127
129
|
| `List files in my Google Drive "Projects" folder` | Browses Google Drive and lists folder contents |
|
|
128
130
|
|
|
131
|
+
### Coding Sessions
|
|
132
|
+
|
|
133
|
+
The agent can write, build, test, and iterate on code — just like Claude Code. Messages in the same thread maintain full conversation context:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
You: "Add a /health endpoint to the API server in fridgify"
|
|
137
|
+
Agent: ✏️ Editing file... ⚡ Running: npm run build... ✅ Done!
|
|
138
|
+
Added GET /health endpoint returning { status: "ok", uptime: ... }
|
|
139
|
+
Build passes, tests pass.
|
|
140
|
+
|
|
141
|
+
You: "Also add a test for it" ← same thread, agent remembers context
|
|
142
|
+
Agent: ✏️ Writing test... ⚡ Running: npm test...
|
|
143
|
+
Added test in tests/api/health.test.ts — 3 assertions, all pass.
|
|
144
|
+
|
|
145
|
+
You: "Commit and push"
|
|
146
|
+
Agent: 📂 Checking git... ⚡ Running: git commit...
|
|
147
|
+
Committed: "feat: add /health endpoint" and pushed to origin/main.
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Each Slack/Telegram thread maps to a persistent Claude session. The agent retains full context across messages — no need to repeat yourself.
|
|
151
|
+
|
|
129
152
|
## CLI Reference
|
|
130
153
|
|
|
131
154
|
```bash
|
package/dist/agent/claude.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ export interface ClaudeCliOptions {
|
|
|
6
6
|
mcpConfigPath?: string;
|
|
7
7
|
timeoutMs?: number;
|
|
8
8
|
onToolUse?: (status: string) => void;
|
|
9
|
+
/** Start a new session with this UUID */
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
/** Resume an existing session by its UUID */
|
|
12
|
+
resumeSessionId?: string;
|
|
9
13
|
}
|
|
10
14
|
export interface ClaudeCliResult {
|
|
11
15
|
result: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,UAYjC,CAAC;AAEF;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,GAAE,MAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,GAAE,MAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAapF;AA8BD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoGzF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4B5D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB"}
|
package/dist/agent/claude.js
CHANGED
|
@@ -85,8 +85,18 @@ function describeToolUse(toolName, input) {
|
|
|
85
85
|
* Runs `claude -p --output-format json` and parses the JSON response.
|
|
86
86
|
*/
|
|
87
87
|
export async function invokeClaudeCli(options) {
|
|
88
|
-
const { prompt, systemPrompt, cwd, allowedTools, mcpConfigPath, timeoutMs = DEFAULT_TIMEOUT_MS, onToolUse } = options;
|
|
89
|
-
const args = [
|
|
88
|
+
const { prompt, systemPrompt, cwd, allowedTools, mcpConfigPath, timeoutMs = DEFAULT_TIMEOUT_MS, onToolUse, sessionId, resumeSessionId } = options;
|
|
89
|
+
const args = [];
|
|
90
|
+
// Session management: --resume takes precedence (continuing existing session)
|
|
91
|
+
if (resumeSessionId) {
|
|
92
|
+
args.push('-p', '--resume', resumeSessionId, '--output-format', 'json');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
args.push('-p', '--output-format', 'json');
|
|
96
|
+
if (sessionId) {
|
|
97
|
+
args.push('--session-id', sessionId);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
90
100
|
if (cwd) {
|
|
91
101
|
args.push('--cwd', cwd);
|
|
92
102
|
}
|
package/dist/agent/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/core.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export declare class AgentCore {
|
|
|
12
12
|
private handleMessage;
|
|
13
13
|
/**
|
|
14
14
|
* Resolves project from message, builds memory context, and invokes Claude.
|
|
15
|
+
* Uses session continuity: messages in the same thread share a Claude session.
|
|
15
16
|
*/
|
|
16
17
|
private invokeClaudeWithContext;
|
|
17
18
|
}
|
package/dist/agent/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/agent/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/agent/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAqBvD,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,iBAAiB,CAAoB;gBAEjC,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW;IAkB5D,OAAO,CAAC,aAAa;IAOf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAMb,aAAa;IAmG3B;;;OAGG;YACW,uBAAuB;CAuGtC"}
|
package/dist/agent/core.js
CHANGED
|
@@ -11,6 +11,7 @@ import { buildSkillsContext } from './skills.js';
|
|
|
11
11
|
import { buildToolDescriptions } from './tool-descriptions.js';
|
|
12
12
|
import { getMcpConfigPathIfExists } from '../tools/figma-mcp.js';
|
|
13
13
|
import { buildMcpContext } from './mcp-manager.js';
|
|
14
|
+
import { getSession, createSession, touchSession, cleanupSessions } from './session.js';
|
|
14
15
|
import { detectPermissionError, PermissionWatcher } from '../security/permissions.js';
|
|
15
16
|
function log(message) {
|
|
16
17
|
console.log(`[${new Date().toISOString()}] ${message}`);
|
|
@@ -143,6 +144,7 @@ export class AgentCore {
|
|
|
143
144
|
}
|
|
144
145
|
/**
|
|
145
146
|
* Resolves project from message, builds memory context, and invokes Claude.
|
|
147
|
+
* Uses session continuity: messages in the same thread share a Claude session.
|
|
146
148
|
*/
|
|
147
149
|
async invokeClaudeWithContext(msg, onStatus) {
|
|
148
150
|
// Resolve project from message text
|
|
@@ -171,6 +173,7 @@ RULES:
|
|
|
171
173
|
5. THINK STEP BY STEP — Before acting, plan your approach. "The user wants X. To find X, I need to check Y, which means I should run Z."
|
|
172
174
|
6. COMPLETE THE TASK — Do not stop halfway. If a command fails, try another approach. If you need more info, search for it. Only respond to the user when you have a concrete answer or have completed the action.
|
|
173
175
|
7. BE CONCISE — Report results directly. No filler, no "I'd be happy to help", no restating the question.
|
|
176
|
+
8. CODING TASKS — When asked to write or modify code, follow this workflow: understand → implement → build → test → fix errors → report. You have full access to the filesystem and shell. Write code, run builds, execute tests, and iterate until the task is done. Never say "I can't write code" — you absolutely can.
|
|
174
177
|
|
|
175
178
|
CREDENTIAL MANAGEMENT:
|
|
176
179
|
You have a credential store at ~/.pilot/credentials/. Use it to store and retrieve API keys, tokens, and service account files.
|
|
@@ -204,14 +207,35 @@ You have a credential store at ~/.pilot/credentials/. Use it to store and retrie
|
|
|
204
207
|
apiKey: this.config.claude.apiKey,
|
|
205
208
|
});
|
|
206
209
|
}
|
|
210
|
+
// Session continuity: map messenger threads to Claude sessions
|
|
211
|
+
const threadId = msg.threadId ?? msg.channelId;
|
|
212
|
+
const existingSession = await getSession(msg.platform, msg.channelId, threadId);
|
|
213
|
+
let sessionId;
|
|
214
|
+
let resumeSessionId;
|
|
215
|
+
if (existingSession) {
|
|
216
|
+
// Resume existing session — Claude retains full conversation context
|
|
217
|
+
resumeSessionId = existingSession.sessionId;
|
|
218
|
+
await touchSession(msg.platform, msg.channelId, threadId);
|
|
219
|
+
log(`Resuming session ${resumeSessionId} (turn ${existingSession.turnCount + 1})`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
// New session — create and store mapping
|
|
223
|
+
const session = await createSession(msg.platform, msg.channelId, threadId, projectPath);
|
|
224
|
+
sessionId = session.sessionId;
|
|
225
|
+
log(`New session ${sessionId}`);
|
|
226
|
+
}
|
|
227
|
+
// Periodically clean up expired sessions (non-blocking)
|
|
228
|
+
cleanupSessions().catch(() => { });
|
|
207
229
|
const mcpConfigPath = await getMcpConfigPathIfExists() ?? undefined;
|
|
208
230
|
const result = await invokeClaudeCli({
|
|
209
231
|
prompt: msg.text,
|
|
210
|
-
systemPrompt,
|
|
232
|
+
systemPrompt: resumeSessionId ? undefined : systemPrompt, // Only send system prompt on first turn
|
|
211
233
|
cwd: projectPath,
|
|
212
234
|
allowedTools: DEFAULT_ALLOWED_TOOLS,
|
|
213
235
|
mcpConfigPath,
|
|
214
236
|
onToolUse: (status) => onStatus?.(status),
|
|
237
|
+
sessionId,
|
|
238
|
+
resumeSessionId,
|
|
215
239
|
});
|
|
216
240
|
return result.result;
|
|
217
241
|
}
|
package/dist/agent/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/agent/core.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/agent/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface SessionEntry {
|
|
2
|
+
/** Claude CLI session ID (UUID) */
|
|
3
|
+
sessionId: string;
|
|
4
|
+
/** Messenger thread ID */
|
|
5
|
+
threadId: string;
|
|
6
|
+
/** Channel ID */
|
|
7
|
+
channelId: string;
|
|
8
|
+
/** Platform */
|
|
9
|
+
platform: 'slack' | 'telegram';
|
|
10
|
+
/** Project path (if resolved) */
|
|
11
|
+
projectPath?: string;
|
|
12
|
+
/** When this session was created */
|
|
13
|
+
createdAt: string;
|
|
14
|
+
/** When this session was last used */
|
|
15
|
+
lastUsedAt: string;
|
|
16
|
+
/** Number of turns in this session */
|
|
17
|
+
turnCount: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gets an existing session for a thread, or null if none exists.
|
|
21
|
+
* Expired sessions (older than TTL) are automatically cleaned up.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSession(platform: string, channelId: string, threadId: string): Promise<SessionEntry | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new session for a thread.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSession(platform: 'slack' | 'telegram', channelId: string, threadId: string, projectPath?: string): Promise<SessionEntry>;
|
|
28
|
+
/**
|
|
29
|
+
* Updates a session's lastUsedAt and increments turn count.
|
|
30
|
+
*/
|
|
31
|
+
export declare function touchSession(platform: string, channelId: string, threadId: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Removes expired sessions. Called periodically.
|
|
34
|
+
*/
|
|
35
|
+
export declare function cleanupSessions(): Promise<number>;
|
|
36
|
+
/**
|
|
37
|
+
* Gets session count (for monitoring).
|
|
38
|
+
*/
|
|
39
|
+
export declare function getSessionCount(): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* Resets loaded state (for testing).
|
|
42
|
+
*/
|
|
43
|
+
export declare function resetSessionStore(): void;
|
|
44
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,QAAQ,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgB9B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,OAAO,GAAG,UAAU,EAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAevD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session store for mapping messenger threads to Claude CLI sessions.
|
|
3
|
+
* Enables multi-turn conversations where each Slack/Telegram thread
|
|
4
|
+
* maintains a continuous Claude session with full context.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import crypto from 'node:crypto';
|
|
9
|
+
import { getPilotDir } from '../config/store.js';
|
|
10
|
+
const SESSION_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
11
|
+
function getSessionStorePath() {
|
|
12
|
+
return path.join(getPilotDir(), 'sessions.json');
|
|
13
|
+
}
|
|
14
|
+
let sessions = new Map();
|
|
15
|
+
let loaded = false;
|
|
16
|
+
/**
|
|
17
|
+
* Builds a unique key for thread identification.
|
|
18
|
+
*/
|
|
19
|
+
function threadKey(platform, channelId, threadId) {
|
|
20
|
+
return `${platform}:${channelId}:${threadId}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Loads sessions from disk.
|
|
24
|
+
*/
|
|
25
|
+
async function ensureLoaded() {
|
|
26
|
+
if (loaded)
|
|
27
|
+
return;
|
|
28
|
+
try {
|
|
29
|
+
const data = await fs.readFile(getSessionStorePath(), 'utf-8');
|
|
30
|
+
const entries = JSON.parse(data);
|
|
31
|
+
sessions = new Map(entries.map((e) => [threadKey(e.platform, e.channelId, e.threadId), e]));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
sessions = new Map();
|
|
35
|
+
}
|
|
36
|
+
loaded = true;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Persists sessions to disk.
|
|
40
|
+
*/
|
|
41
|
+
async function save() {
|
|
42
|
+
const entries = Array.from(sessions.values());
|
|
43
|
+
await fs.writeFile(getSessionStorePath(), JSON.stringify(entries, null, 2), { mode: 0o600 });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gets an existing session for a thread, or null if none exists.
|
|
47
|
+
* Expired sessions (older than TTL) are automatically cleaned up.
|
|
48
|
+
*/
|
|
49
|
+
export async function getSession(platform, channelId, threadId) {
|
|
50
|
+
await ensureLoaded();
|
|
51
|
+
const key = threadKey(platform, channelId, threadId);
|
|
52
|
+
const entry = sessions.get(key);
|
|
53
|
+
if (!entry)
|
|
54
|
+
return null;
|
|
55
|
+
// Check TTL
|
|
56
|
+
const age = Date.now() - new Date(entry.lastUsedAt).getTime();
|
|
57
|
+
if (age > SESSION_TTL_MS) {
|
|
58
|
+
sessions.delete(key);
|
|
59
|
+
await save();
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return entry;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates a new session for a thread.
|
|
66
|
+
*/
|
|
67
|
+
export async function createSession(platform, channelId, threadId, projectPath) {
|
|
68
|
+
await ensureLoaded();
|
|
69
|
+
const entry = {
|
|
70
|
+
sessionId: crypto.randomUUID(),
|
|
71
|
+
threadId,
|
|
72
|
+
channelId,
|
|
73
|
+
platform,
|
|
74
|
+
projectPath,
|
|
75
|
+
createdAt: new Date().toISOString(),
|
|
76
|
+
lastUsedAt: new Date().toISOString(),
|
|
77
|
+
turnCount: 1,
|
|
78
|
+
};
|
|
79
|
+
const key = threadKey(platform, channelId, threadId);
|
|
80
|
+
sessions.set(key, entry);
|
|
81
|
+
await save();
|
|
82
|
+
return entry;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Updates a session's lastUsedAt and increments turn count.
|
|
86
|
+
*/
|
|
87
|
+
export async function touchSession(platform, channelId, threadId) {
|
|
88
|
+
await ensureLoaded();
|
|
89
|
+
const key = threadKey(platform, channelId, threadId);
|
|
90
|
+
const entry = sessions.get(key);
|
|
91
|
+
if (entry) {
|
|
92
|
+
entry.lastUsedAt = new Date().toISOString();
|
|
93
|
+
entry.turnCount++;
|
|
94
|
+
await save();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Removes expired sessions. Called periodically.
|
|
99
|
+
*/
|
|
100
|
+
export async function cleanupSessions() {
|
|
101
|
+
await ensureLoaded();
|
|
102
|
+
const now = Date.now();
|
|
103
|
+
let removed = 0;
|
|
104
|
+
for (const [key, entry] of sessions) {
|
|
105
|
+
const age = now - new Date(entry.lastUsedAt).getTime();
|
|
106
|
+
if (age > SESSION_TTL_MS) {
|
|
107
|
+
sessions.delete(key);
|
|
108
|
+
removed++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (removed > 0)
|
|
112
|
+
await save();
|
|
113
|
+
return removed;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Gets session count (for monitoring).
|
|
117
|
+
*/
|
|
118
|
+
export async function getSessionCount() {
|
|
119
|
+
await ensureLoaded();
|
|
120
|
+
return sessions.size;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Resets loaded state (for testing).
|
|
124
|
+
*/
|
|
125
|
+
export function resetSessionStore() {
|
|
126
|
+
sessions = new Map();
|
|
127
|
+
loaded = false;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"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"}
|