@enderfga/openclaw-claude-code 2.0.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 (38) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/dist/bin/cli.d.ts +10 -0
  4. package/dist/bin/cli.js +301 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/src/embedded-server.d.ts +19 -0
  7. package/dist/src/embedded-server.js +190 -0
  8. package/dist/src/embedded-server.js.map +1 -0
  9. package/dist/src/hooks/prompt-bypass.d.ts +20 -0
  10. package/dist/src/hooks/prompt-bypass.js +37 -0
  11. package/dist/src/hooks/prompt-bypass.js.map +1 -0
  12. package/dist/src/index.d.ts +47 -0
  13. package/dist/src/index.js +230 -0
  14. package/dist/src/index.js.map +1 -0
  15. package/dist/src/persistent-session.d.ts +100 -0
  16. package/dist/src/persistent-session.js +563 -0
  17. package/dist/src/persistent-session.js.map +1 -0
  18. package/dist/src/proxy/anthropic-adapter.d.ts +136 -0
  19. package/dist/src/proxy/anthropic-adapter.js +394 -0
  20. package/dist/src/proxy/anthropic-adapter.js.map +1 -0
  21. package/dist/src/proxy/handler.d.ts +39 -0
  22. package/dist/src/proxy/handler.js +261 -0
  23. package/dist/src/proxy/handler.js.map +1 -0
  24. package/dist/src/proxy/schema-cleaner.d.ts +11 -0
  25. package/dist/src/proxy/schema-cleaner.js +34 -0
  26. package/dist/src/proxy/schema-cleaner.js.map +1 -0
  27. package/dist/src/proxy/thought-cache.d.ts +19 -0
  28. package/dist/src/proxy/thought-cache.js +53 -0
  29. package/dist/src/proxy/thought-cache.js.map +1 -0
  30. package/dist/src/session-manager.d.ts +79 -0
  31. package/dist/src/session-manager.js +329 -0
  32. package/dist/src/session-manager.js.map +1 -0
  33. package/dist/src/types.d.ts +160 -0
  34. package/dist/src/types.js +20 -0
  35. package/dist/src/types.js.map +1 -0
  36. package/openclaw.plugin.json +76 -0
  37. package/package.json +46 -0
  38. package/skills/SKILL.md +594 -0
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Embedded HTTP Server — auto-starts with plugin, serves CLI commands
3
+ *
4
+ * This is NOT a separate process. It runs inside the plugin (or standalone)
5
+ * and provides HTTP endpoints for the CLI to connect to.
6
+ *
7
+ * Users never need to configure or manage this — it just works.
8
+ */
9
+ import * as http from 'node:http';
10
+ const DEFAULT_PORT = 18796;
11
+ export class EmbeddedServer {
12
+ server = null;
13
+ manager;
14
+ port;
15
+ constructor(manager, port) {
16
+ this.manager = manager;
17
+ this.port = port || DEFAULT_PORT;
18
+ }
19
+ async start() {
20
+ return new Promise((resolve, reject) => {
21
+ this.server = http.createServer((req, res) => this.handleRequest(req, res));
22
+ this.server.on('error', (err) => {
23
+ if (err.code === 'EADDRINUSE') {
24
+ // Port already in use — another instance running, skip
25
+ console.log(`[embedded-server] Port ${this.port} in use, skipping (another instance running)`);
26
+ this.server = null;
27
+ resolve(0);
28
+ }
29
+ else {
30
+ reject(err);
31
+ }
32
+ });
33
+ this.server.listen(this.port, '127.0.0.1', () => {
34
+ console.log(`[embedded-server] Listening on http://127.0.0.1:${this.port}`);
35
+ resolve(this.port);
36
+ });
37
+ });
38
+ }
39
+ async stop() {
40
+ if (!this.server)
41
+ return;
42
+ return new Promise(resolve => {
43
+ this.server.close(() => resolve());
44
+ });
45
+ }
46
+ handleRequest(req, res) {
47
+ // CORS
48
+ res.setHeader('Access-Control-Allow-Origin', '*');
49
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
50
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
51
+ if (req.method === 'OPTIONS') {
52
+ res.writeHead(200);
53
+ res.end();
54
+ return;
55
+ }
56
+ const url = new URL(req.url || '/', `http://localhost:${this.port}`);
57
+ const path = url.pathname;
58
+ // Read body for POST
59
+ if (req.method === 'POST') {
60
+ let body = '';
61
+ req.on('data', chunk => { body += chunk; });
62
+ req.on('end', () => {
63
+ let parsed = {};
64
+ try {
65
+ parsed = JSON.parse(body || '{}');
66
+ }
67
+ catch { }
68
+ this.route(path, parsed, url.searchParams, res);
69
+ });
70
+ }
71
+ else {
72
+ this.route(path, {}, url.searchParams, res);
73
+ }
74
+ }
75
+ async route(path, body, query, res) {
76
+ try {
77
+ const json = (status, data) => {
78
+ res.writeHead(status, { 'Content-Type': 'application/json' });
79
+ res.end(JSON.stringify(data));
80
+ };
81
+ // ─── Session Routes ──────────────────────────────────────────
82
+ if (path === '/session/start') {
83
+ const info = await this.manager.startSession(body);
84
+ json(200, { ok: true, ...info });
85
+ return;
86
+ }
87
+ if (path === '/session/send') {
88
+ const result = await this.manager.sendMessage(body.name, body.message, {
89
+ effort: body.effort,
90
+ plan: body.plan,
91
+ timeout: body.timeout,
92
+ });
93
+ json(200, { ok: true, ...result });
94
+ return;
95
+ }
96
+ if (path === '/session/stop') {
97
+ await this.manager.stopSession(body.name);
98
+ json(200, { ok: true });
99
+ return;
100
+ }
101
+ if (path === '/session/list') {
102
+ json(200, { ok: true, sessions: this.manager.listSessions() });
103
+ return;
104
+ }
105
+ if (path === '/session/status') {
106
+ const status = this.manager.getStatus(body.name);
107
+ json(200, { ok: true, ...status });
108
+ return;
109
+ }
110
+ if (path === '/session/grep') {
111
+ const matches = await this.manager.grepSession(body.name, body.pattern, body.limit);
112
+ json(200, { ok: true, count: matches.length, matches });
113
+ return;
114
+ }
115
+ if (path === '/session/compact') {
116
+ await this.manager.compactSession(body.name, body.summary);
117
+ json(200, { ok: true });
118
+ return;
119
+ }
120
+ if (path === '/session/cost') {
121
+ const cost = this.manager.getCost(body.name);
122
+ json(200, { ok: true, ...cost });
123
+ return;
124
+ }
125
+ if (path === '/session/model') {
126
+ this.manager.setModel(body.name, body.model);
127
+ json(200, { ok: true });
128
+ return;
129
+ }
130
+ if (path === '/session/effort') {
131
+ this.manager.setEffort(body.name, body.level);
132
+ json(200, { ok: true });
133
+ return;
134
+ }
135
+ // ─── Agent Teams ─────────────────────────────────────────────
136
+ if (path === '/session/team-list') {
137
+ const response = await this.manager.teamList(body.name);
138
+ json(200, { ok: true, response });
139
+ return;
140
+ }
141
+ if (path === '/session/team-send') {
142
+ const result = await this.manager.teamSend(body.name, body.teammate, body.message);
143
+ json(200, { ok: true, ...result });
144
+ return;
145
+ }
146
+ // ─── File Management ─────────────────────────────────────────
147
+ if (path === '/agents') {
148
+ const cwd = query.get('cwd') || undefined;
149
+ json(200, { ok: true, agents: this.manager.listAgents(cwd) });
150
+ return;
151
+ }
152
+ if (path === '/agents/create') {
153
+ const p = this.manager.createAgent(body.name, body.cwd, body.description, body.prompt);
154
+ json(200, { ok: true, path: p });
155
+ return;
156
+ }
157
+ if (path === '/skills') {
158
+ const cwd = query.get('cwd') || undefined;
159
+ json(200, { ok: true, skills: this.manager.listSkills(cwd) });
160
+ return;
161
+ }
162
+ if (path === '/skills/create') {
163
+ const p = this.manager.createSkill(body.name, body.cwd, body);
164
+ json(200, { ok: true, path: p });
165
+ return;
166
+ }
167
+ if (path === '/rules') {
168
+ const cwd = query.get('cwd') || undefined;
169
+ json(200, { ok: true, rules: this.manager.listRules(cwd) });
170
+ return;
171
+ }
172
+ if (path === '/rules/create') {
173
+ const p = this.manager.createRule(body.name, body.cwd, body);
174
+ json(200, { ok: true, path: p });
175
+ return;
176
+ }
177
+ // ─── Health ──────────────────────────────────────────────────
178
+ if (path === '/health') {
179
+ json(200, { ok: true, version: '2.0.0', sessions: this.manager.listSessions().length });
180
+ return;
181
+ }
182
+ json(404, { ok: false, error: 'Not found' });
183
+ }
184
+ catch (err) {
185
+ res.writeHead(500, { 'Content-Type': 'application/json' });
186
+ res.end(JSON.stringify({ ok: false, error: err.message }));
187
+ }
188
+ }
189
+ }
190
+ //# sourceMappingURL=embedded-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedded-server.js","sourceRoot":"","sources":["../../src/embedded-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Prompt bypass hook — replaces patch-openclaw.sh monkey-patches
3
+ *
4
+ * When a workspace has a `.openclaw-passthrough` marker file, this hook:
5
+ * 1. Clears the system prompt (skips AGENTS.md / built-in agent prompt)
6
+ * 2. Clears bootstrap files (skips context loading)
7
+ *
8
+ * This enables Claude Code CLI to run through OpenClaw gateway in
9
+ * "passthrough" mode without the gateway's own agent system interfering.
10
+ */
11
+ /**
12
+ * Register the before_prompt_build hook on a Plugin API instance.
13
+ *
14
+ * Usage:
15
+ * import { registerPromptBypass } from './hooks/prompt-bypass.js';
16
+ * registerPromptBypass(api);
17
+ */
18
+ export declare function registerPromptBypass(api: {
19
+ registerHook(event: string, handler: (event: Record<string, unknown>) => Promise<Record<string, unknown>>): void;
20
+ }): void;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Prompt bypass hook — replaces patch-openclaw.sh monkey-patches
3
+ *
4
+ * When a workspace has a `.openclaw-passthrough` marker file, this hook:
5
+ * 1. Clears the system prompt (skips AGENTS.md / built-in agent prompt)
6
+ * 2. Clears bootstrap files (skips context loading)
7
+ *
8
+ * This enables Claude Code CLI to run through OpenClaw gateway in
9
+ * "passthrough" mode without the gateway's own agent system interfering.
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ const PASSTHROUGH_MARKER = '.openclaw-passthrough';
14
+ /**
15
+ * Register the before_prompt_build hook on a Plugin API instance.
16
+ *
17
+ * Usage:
18
+ * import { registerPromptBypass } from './hooks/prompt-bypass.js';
19
+ * registerPromptBypass(api);
20
+ */
21
+ export function registerPromptBypass(api) {
22
+ api.registerHook('before_prompt_build', async (event) => {
23
+ const ev = event;
24
+ const workspaceDir = ev.workspaceDir;
25
+ if (!workspaceDir)
26
+ return {};
27
+ const markerPath = path.join(workspaceDir, PASSTHROUGH_MARKER);
28
+ if (!fs.existsSync(markerPath))
29
+ return {};
30
+ console.log(`[openclaw-claude-code] Passthrough mode: ${workspaceDir}`);
31
+ return {
32
+ systemPrompt: '',
33
+ bootstrapFiles: [],
34
+ };
35
+ });
36
+ }
37
+ //# sourceMappingURL=prompt-bypass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-bypass.js","sourceRoot":"","sources":["../../../src/hooks/prompt-bypass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AASnD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAyH;IAEzH,GAAG,CAAC,YAAY,CACd,qBAAqB,EACrB,KAAK,EAAE,KAA8B,EAAoC,EAAE;QACzE,MAAM,EAAE,GAAG,KAAyB,CAAC;QACrC,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC;QAErC,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;QAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;QAExE,OAAO;YACL,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,EAAE;SACnB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * openclaw-claude-code — Plugin entry point
3
+ *
4
+ * Registers tools, hooks, and HTTP routes with the OpenClaw Plugin SDK.
5
+ * When used standalone (no OpenClaw), exports SessionManager for direct use.
6
+ */
7
+ export { SessionManager } from './session-manager.js';
8
+ export { PersistentClaudeSession } from './persistent-session.js';
9
+ export * from './types.js';
10
+ /** OpenClaw Plugin SDK interface (minimal typing for what we use) */
11
+ interface PluginAPI {
12
+ pluginConfig: Record<string, unknown>;
13
+ logger: {
14
+ info(...args: unknown[]): void;
15
+ error(...args: unknown[]): void;
16
+ warn(...args: unknown[]): void;
17
+ };
18
+ registerTool(def: {
19
+ name: string;
20
+ label?: string;
21
+ description: string;
22
+ parameters: Record<string, unknown>;
23
+ execute: (toolCallId: string, params: Record<string, unknown>) => Promise<unknown>;
24
+ }): void;
25
+ on(event: string, handler: (event: Record<string, unknown>, ctx?: unknown) => Promise<void>): void;
26
+ registerHttpRoute(def: {
27
+ path: string;
28
+ auth?: string;
29
+ match?: string;
30
+ handler: (req: unknown, res: unknown) => Promise<boolean>;
31
+ }): void;
32
+ registerService(def: {
33
+ id: string;
34
+ start: () => void;
35
+ stop: () => void;
36
+ }): void;
37
+ }
38
+ /**
39
+ * OpenClaw plugin object — standard format
40
+ */
41
+ declare const plugin: {
42
+ id: string;
43
+ name: string;
44
+ description: string;
45
+ register(api: PluginAPI): void;
46
+ };
47
+ export default plugin;
@@ -0,0 +1,230 @@
1
+ /**
2
+ * openclaw-claude-code — Plugin entry point
3
+ *
4
+ * Registers tools, hooks, and HTTP routes with the OpenClaw Plugin SDK.
5
+ * When used standalone (no OpenClaw), exports SessionManager for direct use.
6
+ */
7
+ import { SessionManager } from './session-manager.js';
8
+ import { createProxyHandler } from './proxy/handler.js';
9
+ import { EmbeddedServer } from './embedded-server.js';
10
+ // ─── Standalone Export ───────────────────────────────────────────────────────
11
+ export { SessionManager } from './session-manager.js';
12
+ export { PersistentClaudeSession } from './persistent-session.js';
13
+ export * from './types.js';
14
+ /**
15
+ * OpenClaw plugin object — standard format
16
+ */
17
+ const plugin = {
18
+ id: 'openclaw-claude-code',
19
+ name: 'Claude Code SDK',
20
+ description: 'Full-featured Claude Code integration — session management, agent teams, worktree isolation, multi-model proxy',
21
+ register(api) {
22
+ const rawConfig = (api.pluginConfig || {});
23
+ const manager = new SessionManager(rawConfig);
24
+ // Start embedded HTTP server for CLI access
25
+ const server = new EmbeddedServer(manager);
26
+ server.start().catch(err => api.logger.error('[plugin] Embedded server failed:', err));
27
+ // Service lifecycle
28
+ api.registerService({
29
+ id: 'openclaw-claude-code',
30
+ start: () => api.logger.info('openclaw-claude-code: plugin loaded'),
31
+ stop: () => { server.stop().catch(() => { }); manager.shutdown().catch(() => { }); },
32
+ });
33
+ // Register proxy HTTP route (multi-model support)
34
+ if (rawConfig.proxy?.enabled !== false) {
35
+ const proxyHandler = createProxyHandler(rawConfig.proxy, {
36
+ anthropicApiKey: process.env.ANTHROPIC_API_KEY,
37
+ openaiApiKey: process.env.OPENAI_API_KEY,
38
+ geminiApiKey: process.env.GEMINI_API_KEY,
39
+ gatewayUrl: process.env.GATEWAY_URL,
40
+ gatewayKey: process.env.GATEWAY_KEY,
41
+ });
42
+ api.registerHttpRoute({
43
+ path: '/v1/claude-code-proxy',
44
+ auth: 'gateway',
45
+ match: 'prefix',
46
+ handler: proxyHandler,
47
+ });
48
+ }
49
+ // ─── Tool: claude_session_start ──────────────────────────────────────
50
+ api.registerTool({
51
+ name: 'claude_session_start',
52
+ description: 'Start a persistent Claude Code session with full CLI flag support (model, effort, worktree, bare, agent teams, etc.)',
53
+ parameters: {
54
+ type: 'object',
55
+ properties: {
56
+ name: { type: 'string', description: 'Session name (auto-generated if omitted)' },
57
+ cwd: { type: 'string', description: 'Working directory' },
58
+ model: { type: 'string', description: 'Model to use (opus, sonnet, haiku, gemini-pro, etc.)' },
59
+ permissionMode: { type: 'string', enum: ['acceptEdits', 'bypassPermissions', 'default', 'delegate', 'dontAsk', 'plan', 'auto'] },
60
+ effort: { type: 'string', enum: ['low', 'medium', 'high', 'max', 'auto'] },
61
+ allowedTools: { type: 'array', items: { type: 'string' }, description: 'Tools to auto-approve' },
62
+ disallowedTools: { type: 'array', items: { type: 'string' }, description: 'Tools to deny' },
63
+ maxTurns: { type: 'number', description: 'Max agent loop turns' },
64
+ maxBudgetUsd: { type: 'number', description: 'Max API spend (USD)' },
65
+ systemPrompt: { type: 'string', description: 'Replace system prompt' },
66
+ appendSystemPrompt: { type: 'string', description: 'Append to system prompt' },
67
+ agents: { type: 'object', description: 'Custom sub-agents JSON' },
68
+ agent: { type: 'string', description: 'Default agent to use' },
69
+ bare: { type: 'boolean', description: 'Minimal mode: skip hooks, LSP, auto-memory, CLAUDE.md' },
70
+ worktree: { type: ['string', 'boolean'], description: 'Run in git worktree' },
71
+ fallbackModel: { type: 'string', description: 'Auto fallback when primary overloaded' },
72
+ jsonSchema: { type: 'string', description: 'JSON Schema for structured output' },
73
+ mcpConfig: { type: ['string', 'array'], description: 'MCP server config file(s)' },
74
+ settings: { type: 'string', description: 'Settings.json path or inline JSON' },
75
+ noSessionPersistence: { type: 'boolean', description: 'Do not save session to disk' },
76
+ betas: { type: ['string', 'array'], description: 'Custom beta headers' },
77
+ enableAgentTeams: { type: 'boolean', description: 'Enable experimental agent teams' },
78
+ enableAutoMode: { type: 'boolean', description: 'Enable auto permission mode' },
79
+ },
80
+ },
81
+ execute: async (_id, args) => {
82
+ const info = await manager.startSession(args);
83
+ return { ok: true, ...info };
84
+ },
85
+ });
86
+ // ─── Tool: claude_session_send ───────────────────────────────────────
87
+ api.registerTool({
88
+ name: 'claude_session_send',
89
+ description: 'Send a message to a persistent Claude Code session and get the response',
90
+ parameters: {
91
+ type: 'object',
92
+ properties: {
93
+ name: { type: 'string', description: 'Session name' },
94
+ message: { type: 'string', description: 'Message to send' },
95
+ effort: { type: 'string', enum: ['low', 'medium', 'high', 'max'], description: 'Effort for this message' },
96
+ plan: { type: 'boolean', description: 'Enable plan mode' },
97
+ timeout: { type: 'number', description: 'Timeout in ms (default 300000)' },
98
+ },
99
+ required: ['name', 'message'],
100
+ },
101
+ execute: async (_id, args) => {
102
+ const result = await manager.sendMessage(args.name, args.message, {
103
+ effort: args.effort,
104
+ plan: args.plan,
105
+ timeout: args.timeout,
106
+ });
107
+ return { ok: true, ...result };
108
+ },
109
+ });
110
+ // ─── Tool: claude_session_stop ───────────────────────────────────────
111
+ api.registerTool({
112
+ name: 'claude_session_stop',
113
+ description: 'Stop a persistent Claude Code session',
114
+ parameters: {
115
+ type: 'object',
116
+ properties: { name: { type: 'string', description: 'Session name' } },
117
+ required: ['name'],
118
+ },
119
+ execute: async (_id, args) => {
120
+ await manager.stopSession(args.name);
121
+ return { ok: true };
122
+ },
123
+ });
124
+ // ─── Tool: claude_session_list ───────────────────────────────────────
125
+ api.registerTool({
126
+ name: 'claude_session_list',
127
+ description: 'List all active Claude Code sessions',
128
+ parameters: { type: 'object', properties: {} },
129
+ execute: async (_id) => {
130
+ return { ok: true, sessions: manager.listSessions() };
131
+ },
132
+ });
133
+ // ─── Tool: claude_session_status ─────────────────────────────────────
134
+ api.registerTool({
135
+ name: 'claude_session_status',
136
+ description: 'Get detailed status of a Claude Code session (context %, tokens, cost, uptime)',
137
+ parameters: {
138
+ type: 'object',
139
+ properties: { name: { type: 'string', description: 'Session name' } },
140
+ required: ['name'],
141
+ },
142
+ execute: async (_id, args) => {
143
+ const status = manager.getStatus(args.name);
144
+ return { ok: true, ...status };
145
+ },
146
+ });
147
+ // ─── Tool: claude_session_grep ───────────────────────────────────────
148
+ api.registerTool({
149
+ name: 'claude_session_grep',
150
+ description: 'Search session history for events matching a regex pattern',
151
+ parameters: {
152
+ type: 'object',
153
+ properties: {
154
+ name: { type: 'string', description: 'Session name' },
155
+ pattern: { type: 'string', description: 'Regex pattern to search' },
156
+ limit: { type: 'number', description: 'Max results (default 50)' },
157
+ },
158
+ required: ['name', 'pattern'],
159
+ },
160
+ execute: async (_id, args) => {
161
+ const matches = await manager.grepSession(args.name, args.pattern, args.limit);
162
+ return { ok: true, count: matches.length, matches };
163
+ },
164
+ });
165
+ // ─── Tool: claude_session_compact ────────────────────────────────────
166
+ api.registerTool({
167
+ name: 'claude_session_compact',
168
+ description: 'Compact a session to reclaim context window space',
169
+ parameters: {
170
+ type: 'object',
171
+ properties: {
172
+ name: { type: 'string', description: 'Session name' },
173
+ summary: { type: 'string', description: 'Optional summary for compaction' },
174
+ },
175
+ required: ['name'],
176
+ },
177
+ execute: async (_id, args) => {
178
+ await manager.compactSession(args.name, args.summary);
179
+ return { ok: true };
180
+ },
181
+ });
182
+ // ─── Tool: claude_agents_list ────────────────────────────────────────
183
+ api.registerTool({
184
+ name: 'claude_agents_list',
185
+ description: 'List agent definitions from .claude/agents/',
186
+ parameters: {
187
+ type: 'object',
188
+ properties: { cwd: { type: 'string', description: 'Project directory' } },
189
+ },
190
+ execute: async (_id, args) => {
191
+ const agents = manager.listAgents(args.cwd);
192
+ return { ok: true, agents };
193
+ },
194
+ });
195
+ // ─── Tool: claude_team_list ──────────────────────────────────────────
196
+ api.registerTool({
197
+ name: 'claude_team_list',
198
+ description: 'List teammates in an agent team session (requires enableAgentTeams)',
199
+ parameters: {
200
+ type: 'object',
201
+ properties: { name: { type: 'string', description: 'Session name' } },
202
+ required: ['name'],
203
+ },
204
+ execute: async (_id, args) => {
205
+ const response = await manager.teamList(args.name);
206
+ return { ok: true, response };
207
+ },
208
+ });
209
+ // ─── Tool: claude_team_send ──────────────────────────────────────────
210
+ api.registerTool({
211
+ name: 'claude_team_send',
212
+ description: 'Send a message to a specific teammate in an agent team session',
213
+ parameters: {
214
+ type: 'object',
215
+ properties: {
216
+ name: { type: 'string', description: 'Session name' },
217
+ teammate: { type: 'string', description: 'Teammate name' },
218
+ message: { type: 'string', description: 'Message to send' },
219
+ },
220
+ required: ['name', 'teammate', 'message'],
221
+ },
222
+ execute: async (_id, args) => {
223
+ const result = await manager.teamSend(args.name, args.teammate, args.message);
224
+ return { ok: true, ...result };
225
+ },
226
+ });
227
+ },
228
+ };
229
+ export default plugin;
230
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Persistent Claude Code Session — wraps `claude` CLI via child_process.spawn
3
+ *
4
+ * Maintains a long-running Claude Code process with streaming JSON I/O.
5
+ * Enables multi-turn agent loops, continuous conversation, and real-time streaming.
6
+ */
7
+ import { EventEmitter } from 'node:events';
8
+ import { type SessionConfig, type SessionStats, type EffortLevel, type StreamEvent } from './types.js';
9
+ interface SendOptions {
10
+ effort?: EffortLevel;
11
+ plan?: boolean;
12
+ waitForComplete?: boolean;
13
+ timeout?: number;
14
+ callbacks?: StreamCallbacks;
15
+ }
16
+ interface StreamCallbacks {
17
+ onText?: (text: string) => void;
18
+ onToolUse?: (event: unknown) => void;
19
+ onToolResult?: (event: unknown) => void;
20
+ }
21
+ interface TurnResult {
22
+ text: string;
23
+ event: StreamEvent;
24
+ }
25
+ interface InternalStats {
26
+ turns: number;
27
+ toolCalls: number;
28
+ toolErrors: number;
29
+ tokensIn: number;
30
+ tokensOut: number;
31
+ cachedTokens: number;
32
+ costUsd: number;
33
+ startTime: string | null;
34
+ lastActivity: string | null;
35
+ history: Array<{
36
+ time: string;
37
+ type: string;
38
+ event: unknown;
39
+ }>;
40
+ }
41
+ export declare class PersistentClaudeSession extends EventEmitter {
42
+ private options;
43
+ private proc;
44
+ private _isReady;
45
+ private _isPaused;
46
+ private currentRequestId;
47
+ private _streamCallbacks;
48
+ private _contextHighFired;
49
+ private _realModel;
50
+ sessionId?: string;
51
+ stats: InternalStats;
52
+ constructor(config: SessionConfig);
53
+ get isReady(): boolean;
54
+ start(claudeBin?: string): Promise<this>;
55
+ private _handleEvent;
56
+ send(message: string | unknown[], options?: SendOptions): Promise<TurnResult | {
57
+ requestId: number;
58
+ sent: boolean;
59
+ }>;
60
+ private _waitForTurnComplete;
61
+ getStats(): SessionStats & {
62
+ sessionId?: string;
63
+ uptime: number;
64
+ };
65
+ getHistory(limit?: number): Array<{
66
+ time: string;
67
+ type: string;
68
+ event: unknown;
69
+ }>;
70
+ compact(summary?: string): Promise<TurnResult | {
71
+ requestId: number;
72
+ sent: boolean;
73
+ }>;
74
+ getEffort(): EffortLevel;
75
+ setEffort(level: EffortLevel): void;
76
+ getCost(): {
77
+ model: string;
78
+ tokensIn: number;
79
+ tokensOut: number;
80
+ cachedTokens: number;
81
+ pricing: {
82
+ inputPer1M: number;
83
+ outputPer1M: number;
84
+ cachedPer1M: number | undefined;
85
+ };
86
+ breakdown: {
87
+ inputCost: number;
88
+ cachedCost: number;
89
+ outputCost: number;
90
+ };
91
+ totalUsd: number;
92
+ };
93
+ resolveModel(alias: string): string;
94
+ pause(): void;
95
+ resume(): void;
96
+ stop(): void;
97
+ private _updateCost;
98
+ private _fireHook;
99
+ }
100
+ export {};