linguclaw 0.4.3 → 0.5.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.
@@ -0,0 +1,337 @@
1
+ "use strict";
2
+ /**
3
+ * Chain of Thought - Transparent reasoning and action tracking system
4
+ *
5
+ * Core capabilities:
6
+ * - Thought Logs: See exactly what the agent is "thinking"
7
+ * - Action Tracking: Real-time visibility into which tools are being used
8
+ * - Reasoning Chain: Full audit trail of decisions and their outcomes
9
+ * - Event Streaming: WebSocket-compatible event emission for live UI updates
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ChainOfThought = void 0;
13
+ exports.getChainOfThought = getChainOfThought;
14
+ const events_1 = require("events");
15
+ const logger_1 = require("./logger");
16
+ const logger = (0, logger_1.getLogger)();
17
+ const DEFAULT_CONFIG = {
18
+ maxThoughtsPerSession: 500,
19
+ maxActionsPerSession: 200,
20
+ enableStreaming: true,
21
+ verboseLogging: false,
22
+ persistToDisk: false,
23
+ };
24
+ // ==================== Chain of Thought Engine ====================
25
+ class ChainOfThought extends events_1.EventEmitter {
26
+ config;
27
+ sessions = new Map();
28
+ activeSession = null;
29
+ idCounter = 0;
30
+ constructor(config) {
31
+ super();
32
+ this.config = { ...DEFAULT_CONFIG, ...config };
33
+ }
34
+ /**
35
+ * Start a new reasoning session
36
+ */
37
+ startSession(task, sessionId) {
38
+ const id = sessionId || `session-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`;
39
+ this.sessions.set(id, {
40
+ task,
41
+ startedAt: new Date(),
42
+ thoughts: [],
43
+ actions: [],
44
+ chain: [],
45
+ });
46
+ this.activeSession = id;
47
+ this.emit('session:start', { sessionId: id, task });
48
+ logger.info(`[CoT] Session started: ${id} — "${task.substring(0, 100)}"`);
49
+ return id;
50
+ }
51
+ /**
52
+ * End a reasoning session
53
+ */
54
+ endSession(sessionId, conclusion) {
55
+ const sid = sessionId || this.activeSession;
56
+ if (!sid)
57
+ return null;
58
+ const session = this.sessions.get(sid);
59
+ if (!session)
60
+ return null;
61
+ if (conclusion) {
62
+ this.think(sid, 'conclusion', conclusion);
63
+ }
64
+ const summary = {
65
+ sessionId: sid,
66
+ task: session.task,
67
+ startedAt: session.startedAt,
68
+ endedAt: new Date(),
69
+ totalThoughts: session.thoughts.length,
70
+ totalActions: session.actions.length,
71
+ failedActions: session.actions.filter(a => a.status === 'failed').length,
72
+ corrections: session.thoughts.filter(t => t.type === 'correction').length,
73
+ reasoningChain: session.chain,
74
+ finalConclusion: conclusion,
75
+ };
76
+ this.emit('session:end', summary);
77
+ logger.info(`[CoT] Session ended: ${sid} — ${summary.totalThoughts} thoughts, ${summary.totalActions} actions`);
78
+ if (this.activeSession === sid) {
79
+ this.activeSession = null;
80
+ }
81
+ return summary;
82
+ }
83
+ /**
84
+ * Record a thought
85
+ */
86
+ think(sessionId, type, content, meta) {
87
+ const sid = sessionId || this.activeSession;
88
+ const session = sid ? this.sessions.get(sid) : null;
89
+ const thought = {
90
+ id: `thought-${++this.idCounter}`,
91
+ sessionId: sid || 'unknown',
92
+ timestamp: new Date(),
93
+ type,
94
+ content,
95
+ confidence: meta?.confidence,
96
+ relatedActionId: meta?.relatedActionId,
97
+ parentThoughtId: meta?.parentThoughtId,
98
+ metadata: meta?.metadata,
99
+ };
100
+ if (session) {
101
+ if (session.thoughts.length < this.config.maxThoughtsPerSession) {
102
+ session.thoughts.push(thought);
103
+ }
104
+ session.chain.push({ thought });
105
+ }
106
+ if (this.config.enableStreaming) {
107
+ this.emit('thought', thought);
108
+ }
109
+ if (this.config.verboseLogging) {
110
+ logger.info(`[CoT] 💭 [${type}] ${content.substring(0, 150)}`);
111
+ }
112
+ return thought;
113
+ }
114
+ /**
115
+ * Record an action start
116
+ */
117
+ startAction(sessionId, tool, operation, input, metadata) {
118
+ const sid = sessionId || this.activeSession;
119
+ const session = sid ? this.sessions.get(sid) : null;
120
+ const action = {
121
+ id: `action-${++this.idCounter}`,
122
+ sessionId: sid || 'unknown',
123
+ timestamp: new Date(),
124
+ tool,
125
+ operation,
126
+ input: input.substring(0, 2000),
127
+ status: 'started',
128
+ metadata,
129
+ };
130
+ if (session) {
131
+ if (session.actions.length < this.config.maxActionsPerSession) {
132
+ session.actions.push(action);
133
+ }
134
+ // Attach to last reasoning step or create new one
135
+ const lastStep = session.chain[session.chain.length - 1];
136
+ if (lastStep && !lastStep.action) {
137
+ lastStep.action = action;
138
+ }
139
+ else {
140
+ session.chain.push({
141
+ thought: {
142
+ id: `thought-${++this.idCounter}`,
143
+ sessionId: sid || 'unknown',
144
+ timestamp: new Date(),
145
+ type: 'observation',
146
+ content: `Executing ${tool}.${operation}`,
147
+ relatedActionId: action.id,
148
+ },
149
+ action,
150
+ });
151
+ }
152
+ }
153
+ if (this.config.enableStreaming) {
154
+ this.emit('action:start', action);
155
+ }
156
+ if (this.config.verboseLogging) {
157
+ logger.info(`[CoT] 🔧 [${tool}.${operation}] ${input.substring(0, 100)}`);
158
+ }
159
+ return action;
160
+ }
161
+ /**
162
+ * Update an action's status
163
+ */
164
+ updateAction(actionId, update) {
165
+ for (const session of this.sessions.values()) {
166
+ const action = session.actions.find(a => a.id === actionId);
167
+ if (action) {
168
+ if (update.status)
169
+ action.status = update.status;
170
+ if (update.output !== undefined)
171
+ action.output = update.output.substring(0, 5000);
172
+ if (update.error !== undefined)
173
+ action.error = update.error;
174
+ if (update.duration !== undefined)
175
+ action.duration = update.duration;
176
+ if (this.config.enableStreaming) {
177
+ this.emit('action:update', action);
178
+ }
179
+ // Update the chain step result
180
+ const step = session.chain.find(s => s.action?.id === actionId);
181
+ if (step) {
182
+ step.result = update.output || update.error;
183
+ }
184
+ return action;
185
+ }
186
+ }
187
+ return null;
188
+ }
189
+ /**
190
+ * Complete an action
191
+ */
192
+ completeAction(actionId, output, startTime) {
193
+ return this.updateAction(actionId, {
194
+ status: 'completed',
195
+ output,
196
+ duration: startTime ? Date.now() - startTime : undefined,
197
+ });
198
+ }
199
+ /**
200
+ * Fail an action
201
+ */
202
+ failAction(actionId, error, startTime) {
203
+ return this.updateAction(actionId, {
204
+ status: 'failed',
205
+ error,
206
+ duration: startTime ? Date.now() - startTime : undefined,
207
+ });
208
+ }
209
+ /**
210
+ * Get the full reasoning chain for a session
211
+ */
212
+ getChain(sessionId) {
213
+ const sid = sessionId || this.activeSession;
214
+ if (!sid)
215
+ return [];
216
+ return this.sessions.get(sid)?.chain || [];
217
+ }
218
+ /**
219
+ * Get all thoughts for a session
220
+ */
221
+ getThoughts(sessionId, type) {
222
+ const sid = sessionId || this.activeSession;
223
+ if (!sid)
224
+ return [];
225
+ const thoughts = this.sessions.get(sid)?.thoughts || [];
226
+ if (type)
227
+ return thoughts.filter(t => t.type === type);
228
+ return thoughts;
229
+ }
230
+ /**
231
+ * Get all actions for a session
232
+ */
233
+ getActions(sessionId, tool) {
234
+ const sid = sessionId || this.activeSession;
235
+ if (!sid)
236
+ return [];
237
+ const actions = this.sessions.get(sid)?.actions || [];
238
+ if (tool)
239
+ return actions.filter(a => a.tool === tool);
240
+ return actions;
241
+ }
242
+ /**
243
+ * Get session summary without ending it
244
+ */
245
+ getSessionSummary(sessionId) {
246
+ const sid = sessionId || this.activeSession;
247
+ if (!sid)
248
+ return null;
249
+ const session = this.sessions.get(sid);
250
+ if (!session)
251
+ return null;
252
+ return {
253
+ sessionId: sid,
254
+ task: session.task,
255
+ startedAt: session.startedAt,
256
+ totalThoughts: session.thoughts.length,
257
+ totalActions: session.actions.length,
258
+ failedActions: session.actions.filter(a => a.status === 'failed').length,
259
+ corrections: session.thoughts.filter(t => t.type === 'correction').length,
260
+ reasoningChain: session.chain,
261
+ };
262
+ }
263
+ /**
264
+ * Get a human-readable reasoning trace
265
+ */
266
+ getReadableTrace(sessionId) {
267
+ const chain = this.getChain(sessionId);
268
+ if (chain.length === 0)
269
+ return 'No reasoning trace available.';
270
+ const lines = [];
271
+ for (let i = 0; i < chain.length; i++) {
272
+ const step = chain[i];
273
+ const idx = i + 1;
274
+ // Thought
275
+ const typeEmoji = {
276
+ reasoning: '🧠',
277
+ planning: '📋',
278
+ observation: '👁️',
279
+ decision: '⚖️',
280
+ reflection: '🪞',
281
+ correction: '🔄',
282
+ hypothesis: '💡',
283
+ conclusion: '✅',
284
+ }[step.thought.type] || '💭';
285
+ lines.push(`${idx}. ${typeEmoji} [${step.thought.type.toUpperCase()}] ${step.thought.content}`);
286
+ // Action
287
+ if (step.action) {
288
+ const statusEmoji = {
289
+ started: '⏳',
290
+ running: '🔄',
291
+ completed: '✅',
292
+ failed: '❌',
293
+ cancelled: '🚫',
294
+ }[step.action.status] || '❓';
295
+ lines.push(` ${statusEmoji} ${step.action.tool}.${step.action.operation}: ${step.action.input.substring(0, 100)}`);
296
+ if (step.action.output) {
297
+ lines.push(` → ${step.action.output.substring(0, 200)}`);
298
+ }
299
+ if (step.action.error) {
300
+ lines.push(` ✗ ${step.action.error.substring(0, 200)}`);
301
+ }
302
+ if (step.action.duration) {
303
+ lines.push(` ⏱ ${step.action.duration}ms`);
304
+ }
305
+ }
306
+ lines.push('');
307
+ }
308
+ return lines.join('\n');
309
+ }
310
+ /**
311
+ * Get active session ID
312
+ */
313
+ getActiveSessionId() {
314
+ return this.activeSession;
315
+ }
316
+ /**
317
+ * Clean up old sessions
318
+ */
319
+ cleanup(maxAge = 3600000) {
320
+ const now = Date.now();
321
+ for (const [id, session] of this.sessions) {
322
+ if (now - session.startedAt.getTime() > maxAge && id !== this.activeSession) {
323
+ this.sessions.delete(id);
324
+ }
325
+ }
326
+ }
327
+ }
328
+ exports.ChainOfThought = ChainOfThought;
329
+ // ==================== Singleton ====================
330
+ let instance = null;
331
+ function getChainOfThought(config) {
332
+ if (!instance) {
333
+ instance = new ChainOfThought(config);
334
+ }
335
+ return instance;
336
+ }
337
+ //# sourceMappingURL=chain-of-thought.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-of-thought.js","sourceRoot":"","sources":["../src/chain-of-thought.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Code Sandbox - Execute Python/JavaScript/TypeScript code safely in Docker
3
+ *
4
+ * Core capabilities:
5
+ * - Execute code in isolated Docker containers
6
+ * - Support for Python, JavaScript, TypeScript, and Shell
7
+ * - Memory and CPU limits for safety
8
+ * - Timeout enforcement
9
+ * - Output capture (stdout, stderr, files)
10
+ * - Fallback to local execution with safety checks
11
+ */
12
+ export type SandboxLanguage = 'python' | 'javascript' | 'typescript' | 'shell';
13
+ export interface CodeExecRequest {
14
+ language: SandboxLanguage;
15
+ code: string;
16
+ timeout?: number;
17
+ stdin?: string;
18
+ env?: Record<string, string>;
19
+ workDir?: string;
20
+ packages?: string[];
21
+ }
22
+ export interface CodeExecResult {
23
+ success: boolean;
24
+ stdout: string;
25
+ stderr: string;
26
+ exitCode: number;
27
+ executionTime: number;
28
+ sandboxed: boolean;
29
+ language: SandboxLanguage;
30
+ error?: string;
31
+ files?: {
32
+ name: string;
33
+ content: string;
34
+ }[];
35
+ }
36
+ export declare class CodeSandbox {
37
+ private dockerAvailable;
38
+ private tempDir;
39
+ constructor();
40
+ /**
41
+ * Initialize and check Docker availability
42
+ */
43
+ init(): Promise<boolean>;
44
+ get isDockerAvailable(): boolean;
45
+ /**
46
+ * Execute code in sandbox
47
+ */
48
+ execute(request: CodeExecRequest): Promise<CodeExecResult>;
49
+ /**
50
+ * Execute code in Docker container
51
+ */
52
+ private executeInDocker;
53
+ /**
54
+ * Execute code locally with safety restrictions (fallback when Docker unavailable)
55
+ */
56
+ private executeLocally;
57
+ /**
58
+ * Check code for dangerous patterns
59
+ */
60
+ private checkCodeSafety;
61
+ /**
62
+ * Parse Docker container logs into stdout/stderr
63
+ */
64
+ private parseDockerLogs;
65
+ /**
66
+ * Get available languages and their status
67
+ */
68
+ getAvailableLanguages(): Promise<Record<SandboxLanguage, {
69
+ available: boolean;
70
+ runtime: string;
71
+ }>>;
72
+ /**
73
+ * Utility: ensure directory exists
74
+ */
75
+ private ensureDir;
76
+ /**
77
+ * Utility: safely delete a file
78
+ */
79
+ private safeDelete;
80
+ }
81
+ //# sourceMappingURL=code-sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-sandbox.d.ts","sourceRoot":"","sources":["../src/code-sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAyDD,qBAAa,WAAW;IACtB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAS;;IAOxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAe9B,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BhE;;OAEG;YACW,eAAe;IA0F7B;;OAEG;YACW,cAAc;IAuE5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAwBxG;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;IACH,OAAO,CAAC,UAAU;CAKnB"}