claude-mococo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ko.md +171 -0
- package/README.md +180 -0
- package/defaults/shared-rules.md +70 -0
- package/dist/bot/client.d.ts +10 -0
- package/dist/bot/client.d.ts.map +1 -0
- package/dist/bot/client.js +886 -0
- package/dist/bot/client.js.map +1 -0
- package/dist/bot/discord-commands.d.ts +36 -0
- package/dist/bot/discord-commands.d.ts.map +1 -0
- package/dist/bot/discord-commands.js +811 -0
- package/dist/bot/discord-commands.js.map +1 -0
- package/dist/bot/embeds.d.ts +5 -0
- package/dist/bot/embeds.d.ts.map +1 -0
- package/dist/bot/embeds.js +20 -0
- package/dist/bot/embeds.js.map +1 -0
- package/dist/bot/episode-writer.d.ts +5 -0
- package/dist/bot/episode-writer.d.ts.map +1 -0
- package/dist/bot/episode-writer.js +131 -0
- package/dist/bot/episode-writer.js.map +1 -0
- package/dist/bot/improvement-scanner.d.ts +5 -0
- package/dist/bot/improvement-scanner.d.ts.map +1 -0
- package/dist/bot/improvement-scanner.js +563 -0
- package/dist/bot/improvement-scanner.js.map +1 -0
- package/dist/bot/inbox-compactor.d.ts +6 -0
- package/dist/bot/inbox-compactor.d.ts.map +1 -0
- package/dist/bot/inbox-compactor.js +550 -0
- package/dist/bot/inbox-compactor.js.map +1 -0
- package/dist/bot/memory-consolidator.d.ts +4 -0
- package/dist/bot/memory-consolidator.d.ts.map +1 -0
- package/dist/bot/memory-consolidator.js +258 -0
- package/dist/bot/memory-consolidator.js.map +1 -0
- package/dist/bot/router.d.ts +4 -0
- package/dist/bot/router.d.ts.map +1 -0
- package/dist/bot/router.js +24 -0
- package/dist/bot/router.js.map +1 -0
- package/dist/cli/commands/add.d.ts +2 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +203 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +2 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +44 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/edit.d.ts +2 -0
- package/dist/cli/commands/edit.d.ts.map +1 -0
- package/dist/cli/commands/edit.js +213 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +126 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +21 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +2 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +38 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +2 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +12 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +33 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +78 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompt-template.d.ts +18 -0
- package/dist/cli/prompt-template.d.ts.map +1 -0
- package/dist/cli/prompt-template.js +55 -0
- package/dist/cli/prompt-template.js.map +1 -0
- package/dist/cli/readline-utils.d.ts +5 -0
- package/dist/cli/readline-utils.d.ts.map +1 -0
- package/dist/cli/readline-utils.js +39 -0
- package/dist/cli/readline-utils.js.map +1 -0
- package/dist/cli/workspace.d.ts +7 -0
- package/dist/cli/workspace.d.ts.map +1 -0
- package/dist/cli/workspace.js +39 -0
- package/dist/cli/workspace.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +96 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/claude-engine.d.ts +8 -0
- package/dist/orchestrator/claude-engine.d.ts.map +1 -0
- package/dist/orchestrator/claude-engine.js +94 -0
- package/dist/orchestrator/claude-engine.js.map +1 -0
- package/dist/orchestrator/codex-engine.d.ts +10 -0
- package/dist/orchestrator/codex-engine.d.ts.map +1 -0
- package/dist/orchestrator/codex-engine.js +82 -0
- package/dist/orchestrator/codex-engine.js.map +1 -0
- package/dist/orchestrator/engine-base.d.ts +21 -0
- package/dist/orchestrator/engine-base.d.ts.map +1 -0
- package/dist/orchestrator/engine-base.js +20 -0
- package/dist/orchestrator/engine-base.js.map +1 -0
- package/dist/orchestrator/engines.d.ts +5 -0
- package/dist/orchestrator/engines.d.ts.map +1 -0
- package/dist/orchestrator/engines.js +16 -0
- package/dist/orchestrator/engines.js.map +1 -0
- package/dist/orchestrator/gemini-engine.d.ts +10 -0
- package/dist/orchestrator/gemini-engine.d.ts.map +1 -0
- package/dist/orchestrator/gemini-engine.js +79 -0
- package/dist/orchestrator/gemini-engine.js.map +1 -0
- package/dist/orchestrator/mcp-config.d.ts +4 -0
- package/dist/orchestrator/mcp-config.d.ts.map +1 -0
- package/dist/orchestrator/mcp-config.js +23 -0
- package/dist/orchestrator/mcp-config.js.map +1 -0
- package/dist/orchestrator/prompt-builder.d.ts +3 -0
- package/dist/orchestrator/prompt-builder.d.ts.map +1 -0
- package/dist/orchestrator/prompt-builder.js +445 -0
- package/dist/orchestrator/prompt-builder.js.map +1 -0
- package/dist/server/hook-receiver.d.ts +5 -0
- package/dist/server/hook-receiver.d.ts.map +1 -0
- package/dist/server/hook-receiver.js +52 -0
- package/dist/server/hook-receiver.js.map +1 -0
- package/dist/teams/concurrency.d.ts +12 -0
- package/dist/teams/concurrency.d.ts.map +1 -0
- package/dist/teams/concurrency.js +43 -0
- package/dist/teams/concurrency.js.map +1 -0
- package/dist/teams/context.d.ts +5 -0
- package/dist/teams/context.d.ts.map +1 -0
- package/dist/teams/context.js +33 -0
- package/dist/teams/context.js.map +1 -0
- package/dist/teams/dispatch-ledger.d.ts +27 -0
- package/dist/teams/dispatch-ledger.d.ts.map +1 -0
- package/dist/teams/dispatch-ledger.js +90 -0
- package/dist/teams/dispatch-ledger.js.map +1 -0
- package/dist/teams/invoker.d.ts +9 -0
- package/dist/teams/invoker.d.ts.map +1 -0
- package/dist/teams/invoker.js +54 -0
- package/dist/teams/invoker.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +3 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +17 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/github-status.d.ts +25 -0
- package/dist/utils/github-status.d.ts.map +1 -0
- package/dist/utils/github-status.js +158 -0
- package/dist/utils/github-status.js.map +1 -0
- package/dist/utils/haiku.d.ts +6 -0
- package/dist/utils/haiku.d.ts.map +1 -0
- package/dist/utils/haiku.js +43 -0
- package/dist/utils/haiku.js.map +1 -0
- package/hooks/event-bridge.sh +21 -0
- package/hooks/permission-gate.sh +67 -0
- package/package.json +52 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { runHaiku } from '../utils/haiku.js';
|
|
4
|
+
import { atomicWriteSync } from '../utils/fs.js';
|
|
5
|
+
import { isBusy } from '../teams/concurrency.js';
|
|
6
|
+
const CONSOLIDATE_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
7
|
+
const SIZE_THRESHOLD_BYTES = 3 * 1024; // 3KB
|
|
8
|
+
const EPISODE_AGE_THRESHOLD_MS = 48 * 60 * 60 * 1000; // 48 hours
|
|
9
|
+
const MAX_MEMORY_INPUT_BYTES = 5 * 1024; // 5KB per memory section to avoid Haiku token overflow
|
|
10
|
+
function truncateMemory(content, maxBytes) {
|
|
11
|
+
if (Buffer.byteLength(content, 'utf-8') <= maxBytes)
|
|
12
|
+
return content;
|
|
13
|
+
const lines = content.split('\n');
|
|
14
|
+
let size = 0;
|
|
15
|
+
let cutIdx = lines.length;
|
|
16
|
+
for (let i = 0; i < lines.length; i++) {
|
|
17
|
+
size += Buffer.byteLength(lines[i] + '\n', 'utf-8');
|
|
18
|
+
if (size > maxBytes) {
|
|
19
|
+
cutIdx = i;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return lines.slice(0, cutIdx).join('\n') + '\n... (truncated)';
|
|
24
|
+
}
|
|
25
|
+
function buildConsolidatePrompt(teamName, shortTerm, longTerm) {
|
|
26
|
+
const safeShort = truncateMemory(shortTerm, MAX_MEMORY_INPUT_BYTES);
|
|
27
|
+
const safeLong = truncateMemory(longTerm, MAX_MEMORY_INPUT_BYTES);
|
|
28
|
+
return `You are consolidating memory for team member "${teamName}".
|
|
29
|
+
|
|
30
|
+
## Current Long-term Memory
|
|
31
|
+
${safeLong || '(empty)'}
|
|
32
|
+
|
|
33
|
+
## Current Short-term Memory
|
|
34
|
+
${safeShort || '(empty)'}
|
|
35
|
+
|
|
36
|
+
## Task
|
|
37
|
+
Review the short-term memory and make these decisions for each piece of information:
|
|
38
|
+
1. **Promote to long-term**: User preferences, project structure, recurring patterns, key decisions, team capabilities, important facts that will be needed long-term
|
|
39
|
+
2. **Keep in short-term**: Active tasks, current blockers, temporary context needed for upcoming work
|
|
40
|
+
3. **Remove**: Truly obsolete info with no future relevance, stale context that no longer matters, duplicates of what's already in long-term
|
|
41
|
+
|
|
42
|
+
## Important Rules
|
|
43
|
+
- 최근 결정/약속은 에피소드 로그가 자동 기록하므로 short-term의 "최근 결정 & 약속" 섹션은 제거하라.
|
|
44
|
+
- \`#ch:숫자ID\` 형식의 대기 항목은 반드시 보존하라. 자동 실행 루프가 이 정보를 사용한다.
|
|
45
|
+
- 24시간 이상 경과한 캐시된 외부 데이터는 제거하라.
|
|
46
|
+
|
|
47
|
+
Output EXACTLY this format (include both sections even if empty):
|
|
48
|
+
|
|
49
|
+
---LONG-TERM---
|
|
50
|
+
(full updated long-term memory content - existing + newly promoted items, in Korean bullet list)
|
|
51
|
+
---END-LONG-TERM---
|
|
52
|
+
|
|
53
|
+
---SHORT-TERM---
|
|
54
|
+
(cleaned short-term memory - only active/relevant items, in Korean bullet list)
|
|
55
|
+
---END-SHORT-TERM---`;
|
|
56
|
+
}
|
|
57
|
+
function parseConsolidateResult(stdout) {
|
|
58
|
+
const longMatch = stdout.match(/---LONG-TERM---\n([\s\S]*?)\n---END-LONG-TERM---/);
|
|
59
|
+
const shortMatch = stdout.match(/---SHORT-TERM---\n([\s\S]*?)\n---END-SHORT-TERM---/);
|
|
60
|
+
if (!longMatch || !shortMatch) {
|
|
61
|
+
console.warn(`[memory-consolidator] Could not parse consolidation output — longTerm:${!!longMatch} shortTerm:${!!shortMatch} (${stdout.length} chars), skipping`);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
longTerm: longMatch[1].trim(),
|
|
66
|
+
shortTerm: shortMatch[1].trim(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Per-team Promise chain for async-safe mutual exclusion
|
|
70
|
+
const teamLocks = new Map();
|
|
71
|
+
function withTeamLock(teamId, fn) {
|
|
72
|
+
const prev = teamLocks.get(teamId) ?? Promise.resolve();
|
|
73
|
+
const next = prev.then(fn, fn); // run fn after previous completes (even if it rejected)
|
|
74
|
+
teamLocks.set(teamId, next);
|
|
75
|
+
// Cleanup: only delete from map if no newer call has replaced our promise.
|
|
76
|
+
// This prevents a race condition where a new caller's prev reference is lost
|
|
77
|
+
// when an earlier caller's finally block deletes the entry.
|
|
78
|
+
void next.finally(() => {
|
|
79
|
+
if (teamLocks.get(teamId) === next) {
|
|
80
|
+
teamLocks.delete(teamId);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return next;
|
|
84
|
+
}
|
|
85
|
+
async function consolidateTeam(teamId, teamName, config) {
|
|
86
|
+
return withTeamLock(teamId, async () => {
|
|
87
|
+
const ws = config.workspacePath;
|
|
88
|
+
const memoryDir = path.resolve(ws, '.mococo/memory', teamId);
|
|
89
|
+
const shortTermPath = path.resolve(memoryDir, 'short-term.md');
|
|
90
|
+
const longTermPath = path.resolve(memoryDir, 'long-term.md');
|
|
91
|
+
let shortTerm = '';
|
|
92
|
+
let longTerm = '';
|
|
93
|
+
try {
|
|
94
|
+
shortTerm = fs.readFileSync(shortTermPath, 'utf-8').trim();
|
|
95
|
+
}
|
|
96
|
+
catch { }
|
|
97
|
+
try {
|
|
98
|
+
longTerm = fs.readFileSync(longTermPath, 'utf-8').trim();
|
|
99
|
+
}
|
|
100
|
+
catch { }
|
|
101
|
+
if (!shortTerm)
|
|
102
|
+
return;
|
|
103
|
+
const prompt = buildConsolidatePrompt(teamName, shortTerm, longTerm);
|
|
104
|
+
const output = await runHaiku(prompt);
|
|
105
|
+
const result = parseConsolidateResult(output);
|
|
106
|
+
if (!result)
|
|
107
|
+
return;
|
|
108
|
+
fs.mkdirSync(memoryDir, { recursive: true });
|
|
109
|
+
try {
|
|
110
|
+
if (result.longTerm) {
|
|
111
|
+
atomicWriteSync(longTermPath, result.longTerm);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error(`[memory-consolidator] Failed to write long-term for ${teamName}: ${err instanceof Error ? err.message : err}`);
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
atomicWriteSync(shortTermPath, result.shortTerm);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.error(`[memory-consolidator] Failed to write short-term for ${teamName}: ${err instanceof Error ? err.message : err}`);
|
|
122
|
+
}
|
|
123
|
+
const promoted = result.longTerm && result.longTerm !== longTerm;
|
|
124
|
+
console.log(`[memory-consolidator] Consolidated ${teamName}: short-term ${shortTerm.length}→${result.shortTerm.length} chars${promoted ? ', promoted items to long-term' : ''}`);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// compactEpisodes — 48시간 이상 된 에피소드를 통합 요약
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
async function compactEpisodes(teamId, teamName, config) {
|
|
131
|
+
return withTeamLock(teamId, async () => {
|
|
132
|
+
const filePath = path.resolve(config.workspacePath, '.mococo/memory', teamId, 'episodes.jsonl');
|
|
133
|
+
let lines;
|
|
134
|
+
try {
|
|
135
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
136
|
+
lines = content.split('\n').filter(l => l.trim());
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
const old = [];
|
|
143
|
+
const recent = [];
|
|
144
|
+
let malformedCount = 0;
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
try {
|
|
147
|
+
const ep = JSON.parse(line);
|
|
148
|
+
if (now - ep.ts > EPISODE_AGE_THRESHOLD_MS) {
|
|
149
|
+
old.push(ep);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
recent.push(line);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
malformedCount++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Self-healing: 손상된 라인이 1건이라도 있으면 즉시 제거 + 재분류
|
|
160
|
+
if (malformedCount > 0) {
|
|
161
|
+
console.warn(`[memory-consolidator] ${teamName}: ${malformedCount}건의 손상된 에피소드 라인 발견 (전체 ${lines.length}건 중)`);
|
|
162
|
+
const validLines = lines.filter(l => { try {
|
|
163
|
+
JSON.parse(l);
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return false;
|
|
168
|
+
} });
|
|
169
|
+
try {
|
|
170
|
+
atomicWriteSync(filePath, validLines.join('\n') + '\n');
|
|
171
|
+
console.log(`[memory-consolidator] ${teamName}: Self-healing — ${malformedCount}건 손상 라인 제거, ${validLines.length}건 유지`);
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
console.error(`[memory-consolidator] ${teamName}: Self-healing write failed: ${err instanceof Error ? err.message : err}`);
|
|
175
|
+
}
|
|
176
|
+
// 유효한 라인만으로 재분류
|
|
177
|
+
old.length = 0;
|
|
178
|
+
recent.length = 0;
|
|
179
|
+
for (const line of validLines) {
|
|
180
|
+
try {
|
|
181
|
+
const ep = JSON.parse(line);
|
|
182
|
+
if (now - ep.ts > EPISODE_AGE_THRESHOLD_MS) {
|
|
183
|
+
old.push(ep);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
recent.push(line);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// already filtered
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (old.length < 2)
|
|
195
|
+
return; // not enough old episodes to compact
|
|
196
|
+
const lastOld = old[old.length - 1];
|
|
197
|
+
const oldSummaries = old.map(ep => `- ${ep.summary} (ch:${ep.channelId})`).join('\n');
|
|
198
|
+
const prompt = `Summarize these old activity logs for team "${teamName}" into a single concise summary (max 5 lines, Korean).
|
|
199
|
+
Focus on key outcomes and decisions. Drop routine/repetitive entries.
|
|
200
|
+
|
|
201
|
+
${oldSummaries}
|
|
202
|
+
|
|
203
|
+
Output ONLY the summary lines (1-5 lines), nothing else.`;
|
|
204
|
+
const compactedSummary = await runHaiku(prompt);
|
|
205
|
+
const compactedEpisode = {
|
|
206
|
+
ts: lastOld.ts, // use last old episode's timestamp
|
|
207
|
+
teamId,
|
|
208
|
+
channelId: lastOld.channelId,
|
|
209
|
+
trigger: 'system',
|
|
210
|
+
summary: `[통합 요약] ${compactedSummary.slice(0, 200)}`,
|
|
211
|
+
mentions: [],
|
|
212
|
+
};
|
|
213
|
+
const newLines = [JSON.stringify(compactedEpisode), ...recent];
|
|
214
|
+
atomicWriteSync(filePath, newLines.join('\n') + '\n');
|
|
215
|
+
console.log(`[memory-consolidator] Compacted ${old.length} old episodes for ${teamName} → 1 summary`);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// checkSizeBasedConsolidation — short-term 3KB 초과 시 즉시 consolidation
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
export function checkSizeBasedConsolidation(teamId, teamName, config) {
|
|
222
|
+
const shortTermPath = path.resolve(config.workspacePath, '.mococo/memory', teamId, 'short-term.md');
|
|
223
|
+
try {
|
|
224
|
+
const stat = fs.statSync(shortTermPath);
|
|
225
|
+
if (stat.size > SIZE_THRESHOLD_BYTES) {
|
|
226
|
+
console.log(`[memory-consolidator] Size-triggered consolidation for ${teamName} (${stat.size} bytes > ${SIZE_THRESHOLD_BYTES})`);
|
|
227
|
+
consolidateTeam(teamId, teamName, config).catch(err => {
|
|
228
|
+
console.error(`[memory-consolidator] Size-triggered consolidation error for ${teamName}: ${err}`);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// file doesn't exist — nothing to consolidate
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
// Periodic check — 6-hour interval
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
function checkMemories(config) {
|
|
240
|
+
for (const team of Object.values(config.teams)) {
|
|
241
|
+
if (isBusy(team.id))
|
|
242
|
+
continue;
|
|
243
|
+
consolidateTeam(team.id, team.name, config).catch(err => {
|
|
244
|
+
console.error(`[memory-consolidator] Error consolidating ${team.name}: ${err}`);
|
|
245
|
+
});
|
|
246
|
+
compactEpisodes(team.id, team.name, config).catch(err => {
|
|
247
|
+
console.error(`[memory-consolidator] Error compacting episodes for ${team.name}: ${err}`);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export function startMemoryConsolidator(config) {
|
|
252
|
+
console.log('[memory-consolidator] Started (interval: 6h)');
|
|
253
|
+
setTimeout(() => {
|
|
254
|
+
checkMemories(config);
|
|
255
|
+
setInterval(() => checkMemories(config), CONSOLIDATE_INTERVAL_MS);
|
|
256
|
+
}, 60_000);
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=memory-consolidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-consolidator.js","sourceRoot":"","sources":["../../src/bot/memory-consolidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TeamsConfig, TeamConfig } from '../types.js';
|
|
2
|
+
export declare function findMentionedTeams(content: string, config: TeamsConfig): TeamConfig[];
|
|
3
|
+
export declare function routeMessage(content: string, isHuman: boolean, config: TeamsConfig): TeamConfig[];
|
|
4
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/bot/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG3D,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,UAAU,EAAE,CASd;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,GAClB,UAAU,EAAE,CAad"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getLeaderTeam } from '../config.js';
|
|
2
|
+
export function findMentionedTeams(content, config) {
|
|
3
|
+
const mentioned = [];
|
|
4
|
+
for (const team of Object.values(config.teams)) {
|
|
5
|
+
// Match Discord mention format <@discordUserId>
|
|
6
|
+
if (team.discordUserId && content.includes(`<@${team.discordUserId}>`)) {
|
|
7
|
+
mentioned.push(team);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return mentioned;
|
|
11
|
+
}
|
|
12
|
+
export function routeMessage(content, isHuman, config) {
|
|
13
|
+
const targets = [];
|
|
14
|
+
const mentioned = findMentionedTeams(content, config);
|
|
15
|
+
targets.push(...mentioned);
|
|
16
|
+
// If human message with no specific mention → route to Leader
|
|
17
|
+
if (isHuman && mentioned.length === 0) {
|
|
18
|
+
const leader = getLeaderTeam(config);
|
|
19
|
+
if (leader)
|
|
20
|
+
targets.push(leader);
|
|
21
|
+
}
|
|
22
|
+
return targets;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/bot/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,MAAmB;IAEnB,MAAM,SAAS,GAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,gDAAgD;QAChD,IAAI,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACvE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,OAAgB,EAChB,MAAmB;IAEnB,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IAE3B,8DAA8D;IAC9D,IAAI,OAAO,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAgDA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA0L5C"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { ask, confirm, choose, closeRL } from '../readline-utils.js';
|
|
4
|
+
import { generatePrompt } from '../prompt-template.js';
|
|
5
|
+
import { requireWorkspace } from '../workspace.js';
|
|
6
|
+
const ENGINE_DEFAULTS = {
|
|
7
|
+
claude: 'sonnet',
|
|
8
|
+
codex: 'o3',
|
|
9
|
+
gemini: 'gemini-2.5-pro',
|
|
10
|
+
};
|
|
11
|
+
const PERMISSION_PRESETS = {
|
|
12
|
+
'Full — can push, create PRs': {
|
|
13
|
+
allow: ['git push', 'gh pr create'],
|
|
14
|
+
deny: ['gh pr merge'],
|
|
15
|
+
},
|
|
16
|
+
'Developer — can edit files, no push': {
|
|
17
|
+
deny: ['git push', 'gh pr'],
|
|
18
|
+
},
|
|
19
|
+
'Read-only — no edits, no push': {
|
|
20
|
+
deny: ['git push', 'gh pr', 'Edit', 'Write'],
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const AVATAR_KEYS = ['robot', 'crown', 'brain', 'gear', 'palette', 'shield', 'eye', 'test', 'book'];
|
|
24
|
+
const MBTI_PRESETS = {
|
|
25
|
+
'ENTJ — Strategist, decisive, big-picture leader': 'ENTJ — Strategist, decisive, big-picture leader',
|
|
26
|
+
'ISTJ — Rule-follower, systematic, accuracy-focused': 'ISTJ — Rule-follower, systematic, accuracy-focused',
|
|
27
|
+
'ENFJ — People-oriented, empathetic, team harmony': 'ENFJ — People-oriented, empathetic, team harmony',
|
|
28
|
+
'INTP — Analytical, logical, deep explorer': 'INTP — Analytical, logical, deep explorer',
|
|
29
|
+
'Custom': '',
|
|
30
|
+
};
|
|
31
|
+
const SPEECH_PRESETS = {
|
|
32
|
+
'Formal to everyone': [
|
|
33
|
+
' - To the human: formal and respectful',
|
|
34
|
+
' - To the leader: formal and respectful',
|
|
35
|
+
' - To other agents: polite and professional',
|
|
36
|
+
].join('\n'),
|
|
37
|
+
'Formal to human + casual to peers': [
|
|
38
|
+
' - To the human: strictly formal and respectful',
|
|
39
|
+
' - To other agents: casual and direct',
|
|
40
|
+
].join('\n'),
|
|
41
|
+
'Custom': '',
|
|
42
|
+
};
|
|
43
|
+
export async function runAdd() {
|
|
44
|
+
const ws = requireWorkspace();
|
|
45
|
+
const teamsJsonPath = path.join(ws, 'teams.json');
|
|
46
|
+
const raw = JSON.parse(fs.readFileSync(teamsJsonPath, 'utf-8'));
|
|
47
|
+
// Load humanTitle from config for prompt generation
|
|
48
|
+
const humanTitle = raw.humanTitle ?? 'Boss';
|
|
49
|
+
console.log('Add a new agent\n');
|
|
50
|
+
// --- Identity ---
|
|
51
|
+
console.log('── Identity ──');
|
|
52
|
+
const id = await ask('Assistant ID (lowercase, e.g. hr)');
|
|
53
|
+
if (!id || !/^[a-z][a-z0-9_-]*$/.test(id)) {
|
|
54
|
+
console.error('ID must be lowercase alphanumeric (start with letter).');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
if (raw.teams[id]) {
|
|
58
|
+
console.error(`Assistant "${id}" already exists.`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const name = await ask('Display name (e.g. Backend)', id.charAt(0).toUpperCase() + id.slice(1));
|
|
62
|
+
const isLeader = await confirm('Is this the leader (responds to all messages)?', false);
|
|
63
|
+
// --- Character ---
|
|
64
|
+
console.log('\n── Character ──');
|
|
65
|
+
// MBTI
|
|
66
|
+
const mbtiNames = Object.keys(MBTI_PRESETS);
|
|
67
|
+
const mbtiChoice = await choose('MBTI:', mbtiNames, 0);
|
|
68
|
+
let mbti = MBTI_PRESETS[mbtiChoice];
|
|
69
|
+
if (!mbti) {
|
|
70
|
+
mbti = await ask('MBTI (e.g. ISFJ — Diligent, caring, executor)');
|
|
71
|
+
}
|
|
72
|
+
// Speech style
|
|
73
|
+
const speechNames = Object.keys(SPEECH_PRESETS);
|
|
74
|
+
const speechChoice = await choose('Speech style:', speechNames, 0);
|
|
75
|
+
let speechStyle = SPEECH_PRESETS[speechChoice];
|
|
76
|
+
if (!speechStyle) {
|
|
77
|
+
console.log('Enter speech style line by line (empty line to finish):');
|
|
78
|
+
const lines = [];
|
|
79
|
+
let line = await ask(' ');
|
|
80
|
+
while (line) {
|
|
81
|
+
lines.push(` - ${line}`);
|
|
82
|
+
line = await ask(' ');
|
|
83
|
+
}
|
|
84
|
+
speechStyle = lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
// Traits
|
|
87
|
+
console.log('Personality traits (with behavior examples, comma-separated):');
|
|
88
|
+
console.log(' e.g. "Systematic — structures all requirements, Cautious — verifies when unsure"');
|
|
89
|
+
const traitsStr = await ask(' Traits', '');
|
|
90
|
+
const traits = traitsStr
|
|
91
|
+
? traitsStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
92
|
+
: [];
|
|
93
|
+
// Habits
|
|
94
|
+
console.log('Habits (comma-separated):');
|
|
95
|
+
console.log(' e.g. "Reports in conclusion→evidence→next-steps order, Ends delegations with clear directives"');
|
|
96
|
+
const habitsStr = await ask(' Habits', '');
|
|
97
|
+
const habits = habitsStr
|
|
98
|
+
? habitsStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
99
|
+
: [];
|
|
100
|
+
// --- Role ---
|
|
101
|
+
console.log('\n── Role ──');
|
|
102
|
+
const role = await ask('Core role (1-2 sentences)');
|
|
103
|
+
console.log('Scope (comma-separated):');
|
|
104
|
+
const scopeStr = await ask(' Scope', '');
|
|
105
|
+
const scope = scopeStr
|
|
106
|
+
? scopeStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
107
|
+
: [];
|
|
108
|
+
console.log('Not in scope (comma-separated):');
|
|
109
|
+
const notScopeStr = await ask(' Not in scope', '');
|
|
110
|
+
const notScope = notScopeStr
|
|
111
|
+
? notScopeStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
112
|
+
: [];
|
|
113
|
+
const authorityIndependent = await ask('Independent decisions', '');
|
|
114
|
+
const authorityNeedsApproval = await ask('Needs approval for', '');
|
|
115
|
+
// Expertise
|
|
116
|
+
console.log('Expertise (comma-separated):');
|
|
117
|
+
const expertiseStr = await ask(' Expertise', '');
|
|
118
|
+
const expertise = expertiseStr
|
|
119
|
+
? expertiseStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
120
|
+
: [];
|
|
121
|
+
// Custom rules
|
|
122
|
+
console.log('Additional rules (comma-separated):');
|
|
123
|
+
const rulesStr = await ask(' Rules', '');
|
|
124
|
+
const rules = rulesStr
|
|
125
|
+
? rulesStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
126
|
+
: [];
|
|
127
|
+
// Agent teams
|
|
128
|
+
const useTeams = await confirm('Enable agent team mode (parallel sub-agents)?', false);
|
|
129
|
+
let teamRules = [];
|
|
130
|
+
if (useTeams) {
|
|
131
|
+
console.log('Team rules (comma-separated):');
|
|
132
|
+
const teamRulesStr = await ask(' Team rules', '');
|
|
133
|
+
teamRules = teamRulesStr
|
|
134
|
+
? teamRulesStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
135
|
+
: [];
|
|
136
|
+
}
|
|
137
|
+
// --- Engine ---
|
|
138
|
+
console.log('\n── Engine ──');
|
|
139
|
+
const engine = await choose('Engine:', ['claude', 'codex', 'gemini'], 0);
|
|
140
|
+
const model = await ask('Model', ENGINE_DEFAULTS[engine] ?? 'sonnet');
|
|
141
|
+
const budgetStr = await ask('Max budget per invocation ($)', '10');
|
|
142
|
+
const maxBudget = parseFloat(budgetStr) || 10;
|
|
143
|
+
// --- Tokens ---
|
|
144
|
+
console.log('\n── Tokens ──');
|
|
145
|
+
const discordToken = await ask('Discord bot token');
|
|
146
|
+
// --- Channels ---
|
|
147
|
+
console.log('\n── Channels ──');
|
|
148
|
+
console.log('Channel IDs this bot responds in (comma-separated, empty = all channels):');
|
|
149
|
+
const channelsStr = await ask(' Channels', '');
|
|
150
|
+
const channels = channelsStr
|
|
151
|
+
? channelsStr.split(',').map(s => s.trim()).filter(Boolean)
|
|
152
|
+
: [];
|
|
153
|
+
// --- Permissions ---
|
|
154
|
+
console.log('\n── Permissions ──');
|
|
155
|
+
const presetNames = Object.keys(PERMISSION_PRESETS);
|
|
156
|
+
const presetChoice = await choose('Permission preset:', presetNames, 1);
|
|
157
|
+
const permissions = PERMISSION_PRESETS[presetChoice] ?? {};
|
|
158
|
+
// --- Git identity ---
|
|
159
|
+
console.log('\n── Git identity ──');
|
|
160
|
+
const gitName = await ask('Git author name', `${name} (mococo)`);
|
|
161
|
+
const gitEmail = await ask('Git author email', `${id}@users.noreply.github.com`);
|
|
162
|
+
// Pick an avatar
|
|
163
|
+
const usedAvatars = new Set(Object.values(raw.teams).map((t) => t.avatar));
|
|
164
|
+
const avatar = AVATAR_KEYS.find(k => !usedAvatars.has(k)) ?? 'robot';
|
|
165
|
+
closeRL();
|
|
166
|
+
// Write to teams.json
|
|
167
|
+
raw.teams[id] = {
|
|
168
|
+
name,
|
|
169
|
+
color: '#5865F2',
|
|
170
|
+
avatar,
|
|
171
|
+
engine,
|
|
172
|
+
model,
|
|
173
|
+
maxBudget,
|
|
174
|
+
prompt: `prompts/${id}.md`,
|
|
175
|
+
...(isLeader ? { isLeader: true } : {}),
|
|
176
|
+
...(useTeams ? { useTeams: true } : {}),
|
|
177
|
+
...(teamRules.length > 0 ? { teamRules } : {}),
|
|
178
|
+
...(channels.length > 0 ? { channels } : {}),
|
|
179
|
+
git: { name: gitName, email: gitEmail },
|
|
180
|
+
permissions,
|
|
181
|
+
};
|
|
182
|
+
fs.writeFileSync(teamsJsonPath, JSON.stringify(raw, null, 2) + '\n');
|
|
183
|
+
// Append tokens to .env
|
|
184
|
+
const envPath = path.join(ws, '.env');
|
|
185
|
+
fs.appendFileSync(envPath, `${id.toUpperCase()}_DISCORD_TOKEN=${discordToken}\n`);
|
|
186
|
+
// Generate prompt file
|
|
187
|
+
const promptPath = path.join(ws, 'prompts', `${id}.md`);
|
|
188
|
+
if (!fs.existsSync(promptPath)) {
|
|
189
|
+
fs.writeFileSync(promptPath, generatePrompt({
|
|
190
|
+
name, mbti, speechStyle, traits, habits,
|
|
191
|
+
role, scope, notScope,
|
|
192
|
+
authorityIndependent, authorityNeedsApproval,
|
|
193
|
+
expertise, rules, isLeader,
|
|
194
|
+
humanTitle,
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
console.log(`\nAgent "${name}" (${id}) added successfully.`);
|
|
198
|
+
console.log(` Config: teams.json`);
|
|
199
|
+
console.log(` Prompt: prompts/${id}.md (editable)`);
|
|
200
|
+
console.log(` Tokens: .env`);
|
|
201
|
+
console.log(`\nRun \`mococo start\` to launch.`);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAMA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA8C5C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { requireWorkspace } from '../workspace.js';
|
|
6
|
+
export async function runDev() {
|
|
7
|
+
const ws = requireWorkspace();
|
|
8
|
+
// Resolve the project root (where package.json lives)
|
|
9
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
10
|
+
const projectRoot = path.resolve(path.dirname(thisFile), '..', '..', '..');
|
|
11
|
+
// Ensure .restart-trigger exists
|
|
12
|
+
const triggerFile = path.join(projectRoot, '.restart-trigger');
|
|
13
|
+
try {
|
|
14
|
+
if (!fs.existsSync(triggerFile)) {
|
|
15
|
+
fs.writeFileSync(triggerFile, '');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
console.error(`Failed to create trigger file: ${err}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
console.log('mococo dev — waiting for restart trigger');
|
|
23
|
+
console.log(`Workspace: ${ws}`);
|
|
24
|
+
console.log('Run "mococo restart" to rebuild and restart.');
|
|
25
|
+
console.log('Press Ctrl+C to stop.\n');
|
|
26
|
+
const execCmd = `npm run build --prefix "${projectRoot}" && node "${path.join(projectRoot, 'dist', 'cli', 'index.js')}" start`;
|
|
27
|
+
const child = spawn('npx', [
|
|
28
|
+
'nodemon',
|
|
29
|
+
'--watch', triggerFile,
|
|
30
|
+
'--ext', 'hooks',
|
|
31
|
+
'--exec', execCmd,
|
|
32
|
+
], {
|
|
33
|
+
cwd: ws,
|
|
34
|
+
stdio: 'inherit',
|
|
35
|
+
});
|
|
36
|
+
child.on('error', (err) => {
|
|
37
|
+
console.error(`Failed to start dev mode: ${err.message}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|
|
40
|
+
child.on('exit', (code) => {
|
|
41
|
+
process.exit(code ?? 0);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE9B,sDAAsD;IACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE3E,iCAAiC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,2BAA2B,WAAW,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC;IAC/H,MAAM,KAAK,GAAG,KAAK,CACjB,KAAK,EACL;QACE,SAAS;QACT,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,OAAO;KAClB,EACD;QACE,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,SAAS;KACjB,CACF,CAAC;IAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/edit.ts"],"names":[],"mappings":"AA0DA,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4LvD"}
|