0xkobold 0.1.0 → 0.2.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.
- package/HEARTBEAT.md +66 -32
- package/README.md +220 -1
- package/dist/package.json +3 -2
- package/dist/src/agent/bootstrap-loader.js +138 -0
- package/dist/src/agent/bootstrap-loader.js.map +1 -0
- package/dist/src/agent/context-pruning.js +279 -0
- package/dist/src/agent/context-pruning.js.map +1 -0
- package/dist/src/agent/dynamic-personality.js +211 -0
- package/dist/src/agent/dynamic-personality.js.map +1 -0
- package/dist/src/agent/embedded-runner.js +79 -0
- package/dist/src/agent/embedded-runner.js.map +1 -0
- package/dist/src/agent/index.js +16 -0
- package/dist/src/agent/index.js.map +1 -0
- package/dist/src/agent/system-prompt.js +84 -0
- package/dist/src/agent/system-prompt.js.map +1 -0
- package/dist/src/agent/task-router.js +194 -0
- package/dist/src/agent/task-router.js.map +1 -0
- package/dist/src/agent/tools/index.js +2 -0
- package/dist/src/agent/tools/index.js.map +1 -0
- package/dist/src/agent/tools/spawn-agent.js +200 -0
- package/dist/src/agent/tools/spawn-agent.js.map +1 -0
- package/dist/src/agent/types/definitions.js +317 -0
- package/dist/src/agent/types/definitions.js.map +1 -0
- package/dist/src/agent/types/index.js +2 -0
- package/dist/src/agent/types/index.js.map +1 -0
- package/dist/src/agent/user-profile.js +300 -0
- package/dist/src/agent/user-profile.js.map +1 -0
- package/dist/src/agents/task-router.js +194 -0
- package/dist/src/agents/task-router.js.map +1 -0
- package/dist/src/agents/tools/index.js +2 -0
- package/dist/src/agents/tools/index.js.map +1 -0
- package/dist/src/agents/tools/spawn-agent.js +200 -0
- package/dist/src/agents/tools/spawn-agent.js.map +1 -0
- package/dist/src/agents/types/definitions.js +317 -0
- package/dist/src/agents/types/definitions.js.map +1 -0
- package/dist/src/agents/types/index.js +2 -0
- package/dist/src/agents/types/index.js.map +1 -0
- package/dist/src/cli/commands/embedded.js +36 -0
- package/dist/src/cli/commands/embedded.js.map +1 -0
- package/dist/src/cli/commands/gateway.js +127 -166
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/program-fixed.js +1 -0
- package/dist/src/cli/program-fixed.js.map +1 -0
- package/dist/src/cli/program.js +10 -29
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/extensions/core/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js +642 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-workspace-extension.js +174 -0
- package/dist/src/extensions/core/agent-workspace-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js +145 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js +647 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +11 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
- package/dist/src/extensions/core/persona-loader-extension.js +61 -129
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
- package/dist/src/extensions/core/websearch-enhanced-extension.js +705 -0
- package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -0
- package/dist/src/extensions/core/websearch-v2-extension.js +303 -0
- package/dist/src/extensions/core/websearch-v2-extension.js.map +1 -0
- package/dist/src/gateway/discord-bot.js +185 -0
- package/dist/src/gateway/discord-bot.js.map +1 -0
- package/dist/src/gateway/index.js +10 -350
- package/dist/src/gateway/index.js.map +1 -1
- package/dist/src/gateway/server.js +325 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/websocket-server.js +142 -0
- package/dist/src/gateway/websocket-server.js.map +1 -0
- package/dist/src/heartbeat/checkin.js +185 -0
- package/dist/src/heartbeat/checkin.js.map +1 -0
- package/dist/src/heartbeat/index.js +5 -0
- package/dist/src/heartbeat/index.js.map +1 -0
- package/dist/src/heartbeat/notifications.js +216 -0
- package/dist/src/heartbeat/notifications.js.map +1 -0
- package/dist/src/heartbeat/scheduler.js +284 -0
- package/dist/src/heartbeat/scheduler.js.map +1 -0
- package/dist/src/index.js +21 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mode/auto-detector.js +211 -0
- package/dist/src/mode/auto-detector.js.map +1 -0
- package/dist/src/mode/index.js +3 -0
- package/dist/src/mode/index.js.map +1 -0
- package/dist/src/mode/natural-switcher.js +123 -0
- package/dist/src/mode/natural-switcher.js.map +1 -0
- package/dist/src/skills/builtin/api-worker.js +88 -0
- package/dist/src/skills/builtin/api-worker.js.map +1 -0
- package/dist/src/skills/builtin/nextjs-worker.js +55 -0
- package/dist/src/skills/builtin/nextjs-worker.js.map +1 -0
- package/dist/src/skills/builtin/real-workers.js +166 -0
- package/dist/src/skills/builtin/real-workers.js.map +1 -0
- package/dist/src/skills/builtin/sql-worker.js +61 -0
- package/dist/src/skills/builtin/sql-worker.js.map +1 -0
- package/dist/src/skills/builtin/test-worker.js +79 -0
- package/dist/src/skills/builtin/test-worker.js.map +1 -0
- package/dist/src/skills/builtin/web-research.js +77 -0
- package/dist/src/skills/builtin/web-research.js.map +1 -0
- package/dist/src/skills/framework.js +250 -0
- package/dist/src/skills/framework.js.map +1 -0
- package/dist/src/skills/index.js +10 -10
- package/dist/src/skills/index.js.map +1 -1
- package/dist/src/streaming/block-streamer.js +172 -0
- package/dist/src/streaming/block-streamer.js.map +1 -0
- package/dist/src/streaming/index.js +2 -0
- package/dist/src/streaming/index.js.map +1 -0
- package/dist/src/workspace/index.js +2 -0
- package/dist/src/workspace/index.js.map +1 -0
- package/dist/src/workspace/manager.js +181 -0
- package/dist/src/workspace/manager.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Pruning System - v0.2.0
|
|
3
|
+
*
|
|
4
|
+
* Automatic context management with token budget awareness.
|
|
5
|
+
* Part of Phase 1.3: Context Pruning
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_BUDGET = {
|
|
8
|
+
maxTokens: 128000, // Default for high-context models
|
|
9
|
+
warningThreshold: 80,
|
|
10
|
+
criticalThreshold: 95,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Token estimation (rough approximation)
|
|
14
|
+
*/
|
|
15
|
+
export function estimateTokens(text) {
|
|
16
|
+
// ~4 chars per token on average
|
|
17
|
+
return Math.ceil(text.length / 4);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Calculate current token usage
|
|
21
|
+
*/
|
|
22
|
+
export function calculateTokenUsage(items) {
|
|
23
|
+
return items.reduce((sum, item) => sum + item.tokens, 0);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if pruning is needed
|
|
27
|
+
*/
|
|
28
|
+
export function shouldPrune(items, budget = DEFAULT_BUDGET) {
|
|
29
|
+
const usage = calculateTokenUsage(items);
|
|
30
|
+
const percentage = (usage / budget.maxTokens) * 100;
|
|
31
|
+
return {
|
|
32
|
+
needed: percentage >= budget.warningThreshold,
|
|
33
|
+
usage,
|
|
34
|
+
percentage,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Strategy: Remove oldest non-essential items first
|
|
39
|
+
*/
|
|
40
|
+
export const oldestFirstStrategy = {
|
|
41
|
+
name: 'oldest-first',
|
|
42
|
+
description: 'Remove oldest non-essential context items',
|
|
43
|
+
prune(items, budget) {
|
|
44
|
+
const essential = items.filter(i => i.isEssential);
|
|
45
|
+
const nonEssential = items.filter(i => !i.isEssential);
|
|
46
|
+
// Sort by timestamp (newest first, so oldest get pruned first)
|
|
47
|
+
const sorted = [...nonEssential].sort((a, b) => b.timestamp - a.timestamp);
|
|
48
|
+
const kept = [...essential];
|
|
49
|
+
const pruned = [];
|
|
50
|
+
const buffer = budget.maxTokens * (budget.warningThreshold / 100);
|
|
51
|
+
// Keep newest non-essential items until budget reached
|
|
52
|
+
for (const item of sorted) {
|
|
53
|
+
const projected = calculateTokenUsage(kept) + item.tokens;
|
|
54
|
+
if (projected <= buffer) {
|
|
55
|
+
kept.push(item);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
pruned.push(item);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
kept: kept.sort((a, b) => a.timestamp - b.timestamp),
|
|
63
|
+
pruned,
|
|
64
|
+
totalTokens: calculateTokenUsage(kept),
|
|
65
|
+
savedTokens: calculateTokenUsage(pruned),
|
|
66
|
+
strategy: this.name,
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Strategy: Remove lowest importance items first
|
|
72
|
+
*/
|
|
73
|
+
export const importanceStrategy = {
|
|
74
|
+
name: 'importance-based',
|
|
75
|
+
description: 'Remove least important context items first',
|
|
76
|
+
prune(items, budget) {
|
|
77
|
+
// Sort by importance (highest first, so lowest importance gets pruned first)
|
|
78
|
+
const sorted = [...items].sort((a, b) => b.importance - a.importance);
|
|
79
|
+
const kept = [];
|
|
80
|
+
const pruned = [];
|
|
81
|
+
const target = budget.maxTokens * (budget.warningThreshold / 100);
|
|
82
|
+
for (const item of sorted) {
|
|
83
|
+
if (item.isEssential) {
|
|
84
|
+
kept.push(item);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const projected = calculateTokenUsage(kept) + item.tokens;
|
|
88
|
+
if (projected <= target) {
|
|
89
|
+
kept.push(item);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
pruned.push(item);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
kept: kept.sort((a, b) => a.timestamp - b.timestamp),
|
|
97
|
+
pruned,
|
|
98
|
+
totalTokens: calculateTokenUsage(kept),
|
|
99
|
+
savedTokens: calculateTokenUsage(pruned),
|
|
100
|
+
strategy: this.name,
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Strategy: Smart compaction (summarize old content)
|
|
106
|
+
*/
|
|
107
|
+
export const smartCompactionStrategy = {
|
|
108
|
+
name: 'smart-compaction',
|
|
109
|
+
description: 'Summarize old content instead of removing',
|
|
110
|
+
prune(items, budget) {
|
|
111
|
+
const now = Date.now();
|
|
112
|
+
const fiveMinutes = 5 * 60 * 1000;
|
|
113
|
+
const essential = items.filter(i => i.isEssential || i.type === 'system');
|
|
114
|
+
const recent = items.filter(i => !i.isEssential &&
|
|
115
|
+
i.type !== 'system' &&
|
|
116
|
+
(now - i.timestamp) < fiveMinutes);
|
|
117
|
+
const old = items.filter(i => !i.isEssential &&
|
|
118
|
+
i.type !== 'system' &&
|
|
119
|
+
(now - i.timestamp) >= fiveMinutes);
|
|
120
|
+
const kept = [...essential, ...recent];
|
|
121
|
+
const summarized = [];
|
|
122
|
+
// Summarize old items
|
|
123
|
+
if (old.length > 0) {
|
|
124
|
+
const summaryContent = summarizeContext(old);
|
|
125
|
+
const summary = {
|
|
126
|
+
id: `summary-${Date.now()}`,
|
|
127
|
+
type: 'system',
|
|
128
|
+
content: summaryContent,
|
|
129
|
+
tokens: estimateTokens(summaryContent),
|
|
130
|
+
importance: 50,
|
|
131
|
+
timestamp: Date.now(),
|
|
132
|
+
};
|
|
133
|
+
summarized.push(summary);
|
|
134
|
+
}
|
|
135
|
+
// Check if we need further pruning
|
|
136
|
+
const totalKept = [...kept, ...summarized];
|
|
137
|
+
const usage = calculateTokenUsage(totalKept);
|
|
138
|
+
if (usage > budget.maxTokens * 0.8) {
|
|
139
|
+
// Fall back to oldest-first for remaining
|
|
140
|
+
const extraPruning = oldestFirstStrategy.prune(totalKept, budget);
|
|
141
|
+
return {
|
|
142
|
+
...extraPruning,
|
|
143
|
+
kept: [...extraPruning.kept, ...summarized],
|
|
144
|
+
pruned: [...extraPruning.pruned, ...old],
|
|
145
|
+
strategy: this.name,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
kept: [...kept, ...summarized],
|
|
150
|
+
pruned: old,
|
|
151
|
+
totalTokens: calculateTokenUsage([...kept, ...summarized]),
|
|
152
|
+
savedTokens: calculateTokenUsage(old) - calculateTokenUsage(summarized),
|
|
153
|
+
strategy: this.name,
|
|
154
|
+
};
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Summarize old context items
|
|
159
|
+
*/
|
|
160
|
+
function summarizeContext(items) {
|
|
161
|
+
const byType = {};
|
|
162
|
+
for (const item of items) {
|
|
163
|
+
if (!byType[item.type])
|
|
164
|
+
byType[item.type] = [];
|
|
165
|
+
byType[item.type].push(item);
|
|
166
|
+
}
|
|
167
|
+
const parts = ['[Context Summary: Previous conversation condensed]'];
|
|
168
|
+
if (byType['tool']) {
|
|
169
|
+
const toolCount = byType['tool'].length;
|
|
170
|
+
parts.push(`- Executed ${toolCount} tool calls`);
|
|
171
|
+
}
|
|
172
|
+
if (byType['user']) {
|
|
173
|
+
const userCount = byType['user'].length;
|
|
174
|
+
parts.push(`- ${userCount} user messages`);
|
|
175
|
+
}
|
|
176
|
+
if (byType['assistant']) {
|
|
177
|
+
const assistantCount = byType['assistant'].length;
|
|
178
|
+
parts.push(`- ${assistantCount} assistant responses`);
|
|
179
|
+
}
|
|
180
|
+
parts.push('Details available in full context if needed.');
|
|
181
|
+
return parts.join('\n');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Prune context with specified strategy
|
|
185
|
+
*/
|
|
186
|
+
export function pruneContext(items, strategy, budget = DEFAULT_BUDGET) {
|
|
187
|
+
return strategy.prune(items, budget);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get recommended strategy based on context state
|
|
191
|
+
*/
|
|
192
|
+
export function recommendStrategy(items, budget = DEFAULT_BUDGET) {
|
|
193
|
+
const { percentage } = shouldPrune(items, budget);
|
|
194
|
+
if (percentage >= budget.criticalThreshold) {
|
|
195
|
+
return smartestPruningStrategy;
|
|
196
|
+
}
|
|
197
|
+
if (percentage >= budget.warningThreshold) {
|
|
198
|
+
return smartCompactionStrategy;
|
|
199
|
+
}
|
|
200
|
+
return importanceStrategy;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Auto-prune if needed
|
|
204
|
+
*/
|
|
205
|
+
export function autoPrune(items, budget = DEFAULT_BUDGET) {
|
|
206
|
+
const { needed, usage, percentage } = shouldPrune(items, budget);
|
|
207
|
+
if (!needed) {
|
|
208
|
+
return {
|
|
209
|
+
result: null,
|
|
210
|
+
wasPruned: false,
|
|
211
|
+
metrics: { before: usage, after: usage, percentage },
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const strategy = recommendStrategy(items, budget);
|
|
215
|
+
const result = pruneContext(items, strategy, budget);
|
|
216
|
+
return {
|
|
217
|
+
result,
|
|
218
|
+
wasPruned: true,
|
|
219
|
+
metrics: {
|
|
220
|
+
before: usage,
|
|
221
|
+
after: result.totalTokens,
|
|
222
|
+
percentage: (result.totalTokens / budget.maxTokens) * 100,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Advanced strategy: Smartest pruning (combines multiple techniques)
|
|
228
|
+
*/
|
|
229
|
+
export const smartestPruningStrategy = {
|
|
230
|
+
name: 'smartest',
|
|
231
|
+
description: 'Most aggressive pruning with multi-pass approach',
|
|
232
|
+
prune(items, budget) {
|
|
233
|
+
// First pass: remove duplicates and near-duplicates
|
|
234
|
+
const unique = removeDuplicates(items);
|
|
235
|
+
// Second pass: compact old items
|
|
236
|
+
const compacted = smartCompactionStrategy.prune(unique, budget);
|
|
237
|
+
// Third pass: importance-based if still over budget
|
|
238
|
+
if (compacted.totalTokens > budget.maxTokens * 0.95) {
|
|
239
|
+
return importanceStrategy.prune(compacted.kept, budget);
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
...compacted,
|
|
243
|
+
strategy: this.name,
|
|
244
|
+
};
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* Remove duplicate content
|
|
249
|
+
*/
|
|
250
|
+
function removeDuplicates(items) {
|
|
251
|
+
const seen = new Set();
|
|
252
|
+
const unique = [];
|
|
253
|
+
for (const item of items) {
|
|
254
|
+
// Simple hash of content
|
|
255
|
+
const hash = item.content.slice(0, 100);
|
|
256
|
+
if (!seen.has(hash) || item.isEssential || item.type === 'system') {
|
|
257
|
+
seen.add(hash);
|
|
258
|
+
unique.push(item);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return unique;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Context budget presets
|
|
265
|
+
*/
|
|
266
|
+
export const BUDGET_PRESETS = {
|
|
267
|
+
conservative: {
|
|
268
|
+
maxTokens: 32000,
|
|
269
|
+
warningThreshold: 70,
|
|
270
|
+
criticalThreshold: 85,
|
|
271
|
+
},
|
|
272
|
+
balanced: DEFAULT_BUDGET,
|
|
273
|
+
aggressive: {
|
|
274
|
+
maxTokens: 200000,
|
|
275
|
+
warningThreshold: 90,
|
|
276
|
+
criticalThreshold: 98,
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=context-pruning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-pruning.js","sourceRoot":"","sources":["../../../src/agent/context-pruning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Personality System - v0.2.0
|
|
3
|
+
*
|
|
4
|
+
* Adapts the agent's persona based on interactions and user feedback.
|
|
5
|
+
* Part of the Persona System (Phase 1.2).
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "node:fs/promises";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
const DEFAULT_TRAITS = {
|
|
11
|
+
warmth: 70,
|
|
12
|
+
formality: 40,
|
|
13
|
+
verbosity: 60,
|
|
14
|
+
humor: 30,
|
|
15
|
+
enthusiasm: 50,
|
|
16
|
+
};
|
|
17
|
+
const PERSONALITY_FILE = ".personality-state.json";
|
|
18
|
+
/**
|
|
19
|
+
* Load personality state
|
|
20
|
+
*/
|
|
21
|
+
export async function loadPersonalityState(workspaceDir) {
|
|
22
|
+
const filePath = path.join(workspaceDir, PERSONALITY_FILE);
|
|
23
|
+
if (!existsSync(filePath)) {
|
|
24
|
+
return {
|
|
25
|
+
traits: { ...DEFAULT_TRAITS },
|
|
26
|
+
baseTraits: { ...DEFAULT_TRAITS },
|
|
27
|
+
interactions: [],
|
|
28
|
+
adaptationLevel: 0,
|
|
29
|
+
lastAdapted: new Date().toISOString(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
34
|
+
return JSON.parse(content);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return {
|
|
38
|
+
traits: { ...DEFAULT_TRAITS },
|
|
39
|
+
baseTraits: { ...DEFAULT_TRAITS },
|
|
40
|
+
interactions: [],
|
|
41
|
+
adaptationLevel: 0,
|
|
42
|
+
lastAdapted: new Date().toISOString(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Save personality state
|
|
48
|
+
*/
|
|
49
|
+
export async function savePersonalityState(workspaceDir, state) {
|
|
50
|
+
const filePath = path.join(workspaceDir, PERSONALITY_FILE);
|
|
51
|
+
await fs.writeFile(filePath, JSON.stringify(state, null, 2), "utf-8");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Record a user interaction
|
|
55
|
+
*/
|
|
56
|
+
export async function recordInteraction(workspaceDir, interaction) {
|
|
57
|
+
const state = await loadPersonalityState(workspaceDir);
|
|
58
|
+
state.interactions.push({
|
|
59
|
+
...interaction,
|
|
60
|
+
timestamp: new Date().toISOString(),
|
|
61
|
+
});
|
|
62
|
+
// Keep only last 100 interactions
|
|
63
|
+
if (state.interactions.length > 100) {
|
|
64
|
+
state.interactions = state.interactions.slice(-100);
|
|
65
|
+
}
|
|
66
|
+
await savePersonalityState(workspaceDir, state);
|
|
67
|
+
// Trigger adaptation periodically
|
|
68
|
+
if (state.interactions.length % 10 === 0) {
|
|
69
|
+
await adaptPersonality(workspaceDir);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Adapt personality based on recorded interactions
|
|
74
|
+
*/
|
|
75
|
+
export async function adaptPersonality(workspaceDir) {
|
|
76
|
+
const state = await loadPersonalityState(workspaceDir);
|
|
77
|
+
// Calculate new trait values based on interactions
|
|
78
|
+
const recent = state.interactions.slice(-20); // Last 20 interactions
|
|
79
|
+
if (recent.length < 5) {
|
|
80
|
+
return state; // Not enough data
|
|
81
|
+
}
|
|
82
|
+
// Analyze sentiment patterns
|
|
83
|
+
const positiveCount = recent.filter((i) => i.sentiment > 0).length;
|
|
84
|
+
const negativeCount = recent.filter((i) => i.sentiment < 0).length;
|
|
85
|
+
// Adjust traits based on patterns
|
|
86
|
+
if (negativeCount > positiveCount * 1.5) {
|
|
87
|
+
// More negative feedback - reduce enthusiasm, increase formality
|
|
88
|
+
state.traits.enthusiasm = clamp(state.traits.enthusiasm - 5);
|
|
89
|
+
state.traits.formality = clamp(state.traits.formality + 5);
|
|
90
|
+
}
|
|
91
|
+
else if (positiveCount > negativeCount * 1.5) {
|
|
92
|
+
// More positive feedback - can be more warm and enthusiastic
|
|
93
|
+
state.traits.warmth = clamp(state.traits.warmth + 3);
|
|
94
|
+
state.traits.enthusiasm = clamp(state.traits.enthusiasm + 3);
|
|
95
|
+
}
|
|
96
|
+
// Check for specific trait feedback
|
|
97
|
+
const traitFeedback = recent.filter((i) => i.trait);
|
|
98
|
+
for (const feedback of traitFeedback) {
|
|
99
|
+
if (feedback.trait && feedback.sentiment !== 0) {
|
|
100
|
+
const adjustment = feedback.sentiment * 5;
|
|
101
|
+
state.traits[feedback.trait] = clamp(state.traits[feedback.trait] + adjustment);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Calculate adaptation level
|
|
105
|
+
let totalDiff = 0;
|
|
106
|
+
for (const key of Object.keys(state.baseTraits)) {
|
|
107
|
+
totalDiff += Math.abs(state.traits[key] - state.baseTraits[key]);
|
|
108
|
+
}
|
|
109
|
+
state.adaptationLevel = clamp(totalDiff / 5); // Average diff across 5 traits
|
|
110
|
+
state.lastAdapted = new Date().toISOString();
|
|
111
|
+
await savePersonalityState(workspaceDir, state);
|
|
112
|
+
console.log(`[Personality] Adapted traits - Warmth: ${state.traits.warmth}, ` +
|
|
113
|
+
`Formality: ${state.traits.formality}, Enthusiasm: ${state.traits.enthusiasm}`);
|
|
114
|
+
return state;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get current persona based on adapted traits
|
|
118
|
+
*/
|
|
119
|
+
export async function getDynamicPersona(workspaceDir) {
|
|
120
|
+
const state = await loadPersonalityState(workspaceDir);
|
|
121
|
+
const parts = [];
|
|
122
|
+
// Tone description
|
|
123
|
+
const tones = [];
|
|
124
|
+
if (state.traits.warmth > 60)
|
|
125
|
+
tones.push("warm");
|
|
126
|
+
if (state.traits.warmth < 40)
|
|
127
|
+
tones.push("professional");
|
|
128
|
+
if (state.traits.formality > 60)
|
|
129
|
+
tones.push("formal");
|
|
130
|
+
if (state.traits.formality < 40)
|
|
131
|
+
tones.push("casual");
|
|
132
|
+
if (state.traits.enthusiasm > 60)
|
|
133
|
+
tones.push("enthusiastic");
|
|
134
|
+
if (state.traits.verbosity > 70)
|
|
135
|
+
tones.push("detailed");
|
|
136
|
+
if (state.traits.verbosity < 40)
|
|
137
|
+
tones.push("concise");
|
|
138
|
+
parts.push(`Tone: ${tones.join(", ") || "balanced"}`);
|
|
139
|
+
// Behavior instructions
|
|
140
|
+
if (state.traits.humor > 50) {
|
|
141
|
+
parts.push("Use light humor when appropriate");
|
|
142
|
+
}
|
|
143
|
+
if (state.traits.verbosity > 70) {
|
|
144
|
+
parts.push("Provide detailed explanations with examples");
|
|
145
|
+
}
|
|
146
|
+
else if (state.traits.verbosity < 40) {
|
|
147
|
+
parts.push("Be concise and direct");
|
|
148
|
+
}
|
|
149
|
+
if (state.traits.formality > 60) {
|
|
150
|
+
parts.push("Use formal language and structure");
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
parts.push("Use conversational language");
|
|
154
|
+
}
|
|
155
|
+
if (state.traits.enthusiasm > 60) {
|
|
156
|
+
parts.push("Show enthusiasm and encouragement");
|
|
157
|
+
}
|
|
158
|
+
// Adaptation note
|
|
159
|
+
if (state.adaptationLevel > 20) {
|
|
160
|
+
parts.push(`\n[Adapted ${state.adaptationLevel.toFixed(0)}% from base personality based on interactions]`);
|
|
161
|
+
}
|
|
162
|
+
return parts.join("\n");
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get personality insights
|
|
166
|
+
*/
|
|
167
|
+
export async function getPersonalityInsights(workspaceDir) {
|
|
168
|
+
const state = await loadPersonalityState(workspaceDir);
|
|
169
|
+
// Find top likes/dislikes from feedback
|
|
170
|
+
const likes = state.interactions
|
|
171
|
+
.filter((i) => i.type === "reaction" && i.sentiment > 0)
|
|
172
|
+
.map((i) => i.value);
|
|
173
|
+
const dislikes = state.interactions
|
|
174
|
+
.filter((i) => i.type === "reaction" && i.sentiment < 0)
|
|
175
|
+
.map((i) => i.value);
|
|
176
|
+
// Generate recommendation
|
|
177
|
+
let recommendation = "";
|
|
178
|
+
if (state.adaptationLevel < 10) {
|
|
179
|
+
recommendation = "Personality is close to base. Continue interacting to learn preferences.";
|
|
180
|
+
}
|
|
181
|
+
else if (state.traits.verbosity > 70 && state.traits.formality > 60) {
|
|
182
|
+
recommendation = "Current style is quite formal and detailed. Consider if user prefers more casual interactions.";
|
|
183
|
+
}
|
|
184
|
+
else if (state.traits.enthusiasm < 30) {
|
|
185
|
+
recommendation = "Low enthusiasm detected. User may prefer straightforward, minimal responses.";
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
recommendation = `Current personality adapted ${state.adaptationLevel.toFixed(0)}% from base. Matches observed preferences.`;
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
traits: state.traits,
|
|
192
|
+
adaptationLevel: state.adaptationLevel,
|
|
193
|
+
topLikes: [...new Set(likes)].slice(0, 5),
|
|
194
|
+
topDislikes: [...new Set(dislikes)].slice(0, 5),
|
|
195
|
+
recommendation,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Reset personality to base
|
|
200
|
+
*/
|
|
201
|
+
export async function resetPersonality(workspaceDir) {
|
|
202
|
+
const state = await loadPersonalityState(workspaceDir);
|
|
203
|
+
state.traits = { ...state.baseTraits };
|
|
204
|
+
state.adaptationLevel = 0;
|
|
205
|
+
state.lastAdapted = new Date().toISOString();
|
|
206
|
+
await savePersonalityState(workspaceDir, state);
|
|
207
|
+
}
|
|
208
|
+
function clamp(value, min = 0, max = 100) {
|
|
209
|
+
return Math.max(min, Math.min(max, value));
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=dynamic-personality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-personality.js","sourceRoot":"","sources":["../../../src/agent/dynamic-personality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedded Agent Runner - v0.2.0
|
|
3
|
+
*
|
|
4
|
+
* Wraps pi-coding-agent with custom system prompt injection.
|
|
5
|
+
* Provides OpenClaw-style embedded mode while keeping Pi TUI.
|
|
6
|
+
*/
|
|
7
|
+
import { loadBootstrapFiles, ensureDefaultBootstrap } from "./bootstrap-loader.js";
|
|
8
|
+
import { buildSystemPrompt } from "./system-prompt.js";
|
|
9
|
+
/**
|
|
10
|
+
* Run agent with embedded mode (custom system prompt)
|
|
11
|
+
*
|
|
12
|
+
* This is a stub implementation showing the architecture.
|
|
13
|
+
* Full implementation requires pi-coding-agent SDK integration.
|
|
14
|
+
*/
|
|
15
|
+
export async function runEmbeddedAgent(config) {
|
|
16
|
+
const startTime = Date.now();
|
|
17
|
+
const workspaceDir = config.workspaceDir || config.cwd;
|
|
18
|
+
console.log("[Embedded] Starting embedded agent run");
|
|
19
|
+
console.log(`[Embedded] Workspace: ${workspaceDir}`);
|
|
20
|
+
console.log(`[Embedded] Mode: ${config.mode || "default"}`);
|
|
21
|
+
// 1. Ensure bootstrap files exist
|
|
22
|
+
await ensureDefaultBootstrap(workspaceDir);
|
|
23
|
+
// 2. Load bootstrap files (SOUL.md, IDENTITY.md, etc.)
|
|
24
|
+
const bootstrapFiles = await loadBootstrapFiles(workspaceDir);
|
|
25
|
+
console.log(`[Embedded] Loaded ${bootstrapFiles.filter(f => f.exists).length} bootstrap files`);
|
|
26
|
+
// 3. Build custom system prompt
|
|
27
|
+
const systemPrompt = buildSystemPrompt({
|
|
28
|
+
basePrompt: undefined, // Uses default
|
|
29
|
+
bootstrapFiles,
|
|
30
|
+
workspace: workspaceDir,
|
|
31
|
+
mode: config.mode,
|
|
32
|
+
tools: config.extensions?.flatMap(e => e.tools || []),
|
|
33
|
+
});
|
|
34
|
+
console.log(`[Embedded] System prompt: ${systemPrompt.length} chars`);
|
|
35
|
+
// 4. TODO: Integrate with pi-coding-agent
|
|
36
|
+
// const { session } = await createAgentSession({
|
|
37
|
+
// cwd: config.cwd,
|
|
38
|
+
// // ... other config
|
|
39
|
+
// });
|
|
40
|
+
//
|
|
41
|
+
// // Apply custom system prompt
|
|
42
|
+
// const override = createSystemPromptOverride(systemPrompt);
|
|
43
|
+
// applySystemPromptOverride(session, override);
|
|
44
|
+
//
|
|
45
|
+
// // Run
|
|
46
|
+
// const result = await session.prompt(config.prompt);
|
|
47
|
+
// For now, simulate the structure
|
|
48
|
+
const simulatedResult = {
|
|
49
|
+
text: `[Embedded mode simulation]\n\n` +
|
|
50
|
+
`Bootstrap files loaded:\n` +
|
|
51
|
+
bootstrapFiles
|
|
52
|
+
.filter(f => f.exists)
|
|
53
|
+
.map(f => `- ${f.name} (${f.size} chars)`)
|
|
54
|
+
.join("\n"),
|
|
55
|
+
toolCalls: [],
|
|
56
|
+
metadata: {
|
|
57
|
+
duration: Date.now() - startTime,
|
|
58
|
+
tokens: systemPrompt.length / 4, // Rough estimate
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
console.log(`[Embedded] Completed in ${simulatedResult.metadata.duration}ms`);
|
|
62
|
+
return simulatedResult;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if embedded mode is available
|
|
66
|
+
*/
|
|
67
|
+
export function isEmbeddedModeAvailable() {
|
|
68
|
+
// TODO: Check if pi-coding-agent SDK is properly linked
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Initialize embedded mode
|
|
73
|
+
* Sets up directories and default files
|
|
74
|
+
*/
|
|
75
|
+
export async function initEmbeddedMode(workspaceDir) {
|
|
76
|
+
await ensureDefaultBootstrap(workspaceDir);
|
|
77
|
+
console.log("[Embedded] Initialized workspace with bootstrap files");
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=embedded-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-runner.js","sourceRoot":"","sources":["../../../src/agent/embedded-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAA8B,MAAM,oBAAoB,CAAC;AAqBnF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB;IAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;IAE5D,kCAAkC;IAClC,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAE3C,uDAAuD;IACvD,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,qBAAqB,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAEhG,gCAAgC;IAChC,MAAM,YAAY,GAAG,iBAAiB,CAAC;QACrC,UAAU,EAAE,SAAS,EAAE,eAAe;QACtC,cAAc;QACd,SAAS,EAAE,YAAY;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;KACtD,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,CAAC,MAAM,QAAQ,CAAC,CAAC;IAEtE,0CAA0C;IAC1C,iDAAiD;IACjD,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,GAAG;IACH,gCAAgC;IAChC,6DAA6D;IAC7D,gDAAgD;IAChD,EAAE;IACF,SAAS;IACT,sDAAsD;IAEtD,kCAAkC;IAClC,MAAM,eAAe,GAAsB;QACzC,IAAI,EAAE,gCAAgC;YAChC,2BAA2B;YAC3B,cAAc;iBACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC;iBACzC,IAAI,CAAC,IAAI,CAAC;QACnB,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,MAAM,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,iBAAiB;SACnD;KACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,2BAA2B,eAAe,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC;IAE9E,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,wDAAwD;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAoB;IACzD,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { loadBootstrapFiles, ensureDefaultBootstrap, DEFAULT_BOOTSTRAP_FILES } from "./bootstrap-loader.js";
|
|
2
|
+
export { buildSystemPrompt, createSystemPromptOverride } from "./system-prompt.js";
|
|
3
|
+
export { runEmbeddedAgent, initEmbeddedMode, isEmbeddedModeAvailable } from "./embedded-runner.js";
|
|
4
|
+
// Agent Types (v0.2.0)
|
|
5
|
+
export { AGENT_TYPES, getAgentType, getAllAgentTypes, getAgentTypesForTask } from "./types/index.js";
|
|
6
|
+
// Task Router (v0.2.0)
|
|
7
|
+
export { routeTask, quickRoute, shouldUseSubagents } from "./task-router.js";
|
|
8
|
+
// Agent Tools (v0.2.0)
|
|
9
|
+
export { spawnAgent, spawnAgents, getSpawnAgentToolConfig, executeSpawnAgent } from "./tools/index.js";
|
|
10
|
+
// User Profile (Phase 1.2)
|
|
11
|
+
export { loadUserProfile, saveUserProfile, learnPreference, ensureUserProfile, getUserPreferencesForPrompt } from "./user-profile.js";
|
|
12
|
+
// Dynamic Personality (Phase 1.2)
|
|
13
|
+
export { loadPersonalityState, savePersonalityState, recordInteraction, adaptPersonality, getDynamicPersona, getPersonalityInsights, resetPersonality } from "./dynamic-personality.js";
|
|
14
|
+
// Context Pruning (Phase 1.3)
|
|
15
|
+
export { calculateTokenUsage, shouldPrune, pruneContext, recommendStrategy, autoPrune, estimateTokens, oldestFirstStrategy, importanceStrategy, smartCompactionStrategy, smartestPruningStrategy, DEFAULT_BUDGET, BUDGET_PRESETS } from "./context-pruning.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAKnG,uBAAuB;AACvB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGrG,uBAAuB;AACvB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG7E,uBAAuB;AACvB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGvG,2BAA2B;AAC3B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGtI,kCAAkC;AAClC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAExL,8BAA8B;AAC9B,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACf,MAAM,sBAAsB,CAAC"}
|