mupengism 3.1.0 → 4.0.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.
Files changed (77) hide show
  1. package/AGENTS.md +40 -0
  2. package/HEARTBEAT.md +7 -0
  3. package/IDENTITY.md +11 -0
  4. package/README.md +47 -294
  5. package/SOUL.md +43 -0
  6. package/hooks/action-guard/HOOK.md +29 -0
  7. package/hooks/action-guard/handler.ts +168 -0
  8. package/hooks/action-logger/HOOK.md +28 -0
  9. package/hooks/action-logger/handler.ts +127 -0
  10. package/hooks/context-recovery/HOOK.md +30 -0
  11. package/hooks/context-recovery/handler.ts +135 -0
  12. package/hooks/disciple-init/HOOK.md +20 -0
  13. package/hooks/disciple-init/handler.ts +80 -0
  14. package/hooks/event-bus/HOOK.md +39 -0
  15. package/hooks/event-bus/chains.json +55 -0
  16. package/hooks/event-bus/emit.sh +19 -0
  17. package/hooks/event-bus/handler.ts +156 -0
  18. package/hooks/index-builder/HOOK.md +39 -0
  19. package/hooks/index-builder/handler.ts +132 -0
  20. package/hooks/kernel-panic-guard/HOOK.md +39 -0
  21. package/hooks/kernel-panic-guard/README.md +136 -0
  22. package/hooks/kernel-panic-guard/WHITELIST.md +117 -0
  23. package/hooks/kernel-panic-guard/handler.ts +147 -0
  24. package/hooks/memory-consolidator/HOOK.md +31 -0
  25. package/hooks/memory-consolidator/handler.ts +111 -0
  26. package/hooks/reflex-engine/HOOK.md +30 -0
  27. package/hooks/reflex-engine/handler.ts +158 -0
  28. package/hooks/registry.md +27 -0
  29. package/hooks/self-healing/HOOK.md +17 -0
  30. package/hooks/self-healing/handler.ts +62 -0
  31. package/hooks/soul-evolution/HOOK.md +26 -0
  32. package/hooks/soul-evolution/handler.ts +166 -0
  33. package/hooks/soul-guard/HOOK.md +28 -0
  34. package/hooks/soul-guard/handler.ts +196 -0
  35. package/package.json +42 -53
  36. package/tools/kernel-guard/README.md +170 -0
  37. package/tools/kernel-guard/lockdown.cjs +152 -0
  38. package/tools/kernel-guard/register-hash.js +100 -0
  39. package/tools/kernel-guard/unlock.cjs +106 -0
  40. package/tools/kernel-guard/verify-kernel.js +133 -0
  41. package/tools/memory-ops/README.md +221 -0
  42. package/tools/memory-ops/dream.js +333 -0
  43. package/tools/memory-ops/forget.js +148 -0
  44. package/tools/memory-ops/immune.js +305 -0
  45. package/tools/self-loop/README.md +213 -0
  46. package/tools/self-loop/brake-check.js +191 -0
  47. package/tools/self-loop/example-check.sh +34 -0
  48. package/tools/self-loop/panic-detector.js +191 -0
  49. package/LICENSE +0 -21
  50. package/README-EN.md +0 -226
  51. package/SHOWCASE.md +0 -158
  52. package/guides/ADVANCED-SYSTEMS.md +0 -251
  53. package/guides/HEARTBEAT-GUIDE.md +0 -129
  54. package/guides/LEGION-GUIDE.md +0 -254
  55. package/guides/MEMORY-GUIDE.md +0 -264
  56. package/guides/QUICK-START.md +0 -94
  57. package/guides/THINKTANK-GUIDE.md +0 -227
  58. package/guides/WEEKLY-BREAK-GUIDE.md +0 -262
  59. package/installer/README.md +0 -52
  60. package/installer/cli.js +0 -796
  61. package/installer/en/README.md +0 -191
  62. package/installer/en/skill/MEMORY-SYSTEM.md +0 -348
  63. package/installer/en/skill/PRINCIPLES.md +0 -217
  64. package/installer/en/skill/SKILL.md +0 -116
  65. package/installer/en/skill/SOUL-TEMPLATE.md +0 -329
  66. package/installer/install.sh +0 -162
  67. package/installer/package.json +0 -31
  68. package/skill/AGENTS.md +0 -164
  69. package/skill/BRAKE-LOG-TEMPLATE.md +0 -38
  70. package/skill/HEARTBEAT-TEMPLATE.md +0 -67
  71. package/skill/L1-TEMPLATE.md +0 -35
  72. package/skill/L2-TEMPLATE.md +0 -41
  73. package/skill/PRINCIPLES.md +0 -192
  74. package/skill/README.md +0 -47
  75. package/skill/SKILL.md +0 -166
  76. package/skill/SOUL-TEMPLATE.md +0 -205
  77. package/skill/STATE-TEMPLATE.md +0 -54
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: index-builder
3
+ description: memory 디렉토리의 모든 .md 파일을 스캔하여 검색 가능한 인덱스 생성
4
+ metadata: { "openclaw": { "emoji": "🔗", "events": ["command:new"] } }
5
+ ---
6
+
7
+ # Index Builder
8
+
9
+ 세션 리셋 시 memory 디렉토리의 모든 마크다운 파일을 스캔하여 검색 인덱스를 생성합니다.
10
+
11
+ ## 동작 방식
12
+
13
+ 1. `memory/` 하위 모든 `.md` 파일을 재귀적으로 스캔
14
+ 2. 각 파일에서 태그 추출:
15
+ - `<!-- [태그] -->` 형식의 마커
16
+ - `# 헤더` 에서 키워드 추출
17
+ 3. `memory/index.json` 생성/갱신
18
+
19
+ ## 인덱스 구조
20
+
21
+ ```json
22
+ {
23
+ "lastUpdated": "2026-02-10T14:48:00.000Z",
24
+ "files": {
25
+ "memory/consolidated/security.md": {
26
+ "tags": ["보안", "시크릿", "인젝션"],
27
+ "lastModified": "2026-02-10T14:48:00.000Z",
28
+ "lines": 50
29
+ }
30
+ },
31
+ "tags": {
32
+ "보안": ["memory/consolidated/security.md", "memory/reflex/security.md"]
33
+ }
34
+ }
35
+ ```
36
+
37
+ ## 활용
38
+
39
+ 에이전트가 특정 주제의 과거 메모리를 빠르게 찾을 수 있습니다.
@@ -0,0 +1,132 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ // HookHandler type: (event: HookEvent) => void | Promise<void>
5
+
6
+ export default async function handler(event: any): Promise<void> {
7
+ try {
8
+ console.log('[index-builder] Building memory index...');
9
+
10
+ const workspace = event.workspace || process.cwd();
11
+ const memoryDir = path.join(workspace, 'memory');
12
+ const indexPath = path.join(memoryDir, 'index.json');
13
+
14
+ if (!fs.existsSync(memoryDir)) {
15
+ console.log('[index-builder] No memory directory found, skipping');
16
+ return;
17
+ }
18
+
19
+ const index: any = {
20
+ lastUpdated: new Date().toISOString(),
21
+ files: {},
22
+ tags: {}
23
+ };
24
+
25
+ // memory 디렉토리 재귀 스캔
26
+ scanDirectory(memoryDir, memoryDir, index);
27
+
28
+ // index.json 저장
29
+ fs.writeFileSync(indexPath, JSON.stringify(index, null, 2), 'utf-8');
30
+
31
+ const fileCount = Object.keys(index.files).length;
32
+ const tagCount = Object.keys(index.tags).length;
33
+ console.log(`[index-builder] Index built: ${fileCount} files, ${tagCount} tags`);
34
+
35
+ } catch (error) {
36
+ console.error('[index-builder] Error:', error);
37
+ }
38
+ }
39
+
40
+ function scanDirectory(dir: string, baseDir: string, index: any): void {
41
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
42
+
43
+ for (const entry of entries) {
44
+ const fullPath = path.join(dir, entry.name);
45
+
46
+ if (entry.isDirectory()) {
47
+ // 재귀적으로 스캔
48
+ scanDirectory(fullPath, baseDir, index);
49
+ } else if (entry.isFile() && entry.name.endsWith('.md')) {
50
+ // index.json 자체는 스킵
51
+ if (entry.name === 'index.json') continue;
52
+
53
+ processFile(fullPath, baseDir, index);
54
+ }
55
+ }
56
+ }
57
+
58
+ function processFile(filePath: string, baseDir: string, index: any): void {
59
+ try {
60
+ const content = fs.readFileSync(filePath, 'utf-8');
61
+ const stats = fs.statSync(filePath);
62
+ const lines = content.split('\n').length;
63
+
64
+ // 상대 경로 생성 (memory/ 기준)
65
+ const relativePath = path.relative(path.dirname(baseDir), filePath);
66
+
67
+ // 태그 추출
68
+ const tags = extractTags(content);
69
+
70
+ // files 인덱스에 추가
71
+ index.files[relativePath] = {
72
+ tags,
73
+ lastModified: stats.mtime.toISOString(),
74
+ lines
75
+ };
76
+
77
+ // tags 인덱스에 추가
78
+ for (const tag of tags) {
79
+ if (!index.tags[tag]) {
80
+ index.tags[tag] = [];
81
+ }
82
+ if (!index.tags[tag].includes(relativePath)) {
83
+ index.tags[tag].push(relativePath);
84
+ }
85
+ }
86
+
87
+ } catch (error) {
88
+ console.error(`[index-builder] Error processing ${filePath}:`, error);
89
+ }
90
+ }
91
+
92
+ function extractTags(content: string): string[] {
93
+ const tags: Set<string> = new Set();
94
+
95
+ // <!-- [태그] --> 형식 추출
96
+ const markerPattern = /<!--\s*\[([^\]]+)\]\s*-->/g;
97
+ let match;
98
+ while ((match = markerPattern.exec(content)) !== null) {
99
+ tags.add(match[1].trim());
100
+ }
101
+
102
+ // # 헤더에서 키워드 추출 (한글/영어 단어)
103
+ const headerPattern = /^#+\s+(.+)$/gm;
104
+ while ((match = headerPattern.exec(content)) !== null) {
105
+ const header = match[1].trim();
106
+ // 짧은 의미있는 헤더만 태그로 추가 (3-20자)
107
+ if (header.length >= 3 && header.length <= 20) {
108
+ tags.add(header);
109
+ }
110
+ }
111
+
112
+ // 자주 나오는 키워드 추출 (간단한 휴리스틱)
113
+ const keywords = [
114
+ '보안', 'security', '시크릿', 'secret',
115
+ '가치관', 'philosophy', '철학',
116
+ '성장', 'growth', '학습', 'learning',
117
+ '전환', 'pivot', '결정', 'decision',
118
+ '기술', 'tech', '발견', 'discovery',
119
+ '형님', 'MUFI', '포토부스', 'photobooth',
120
+ '인스타', 'instagram', '봇', 'bot',
121
+ 'AI', 'LLM', 'GPT', 'Claude'
122
+ ];
123
+
124
+ const lower = content.toLowerCase();
125
+ for (const keyword of keywords) {
126
+ if (lower.includes(keyword.toLowerCase())) {
127
+ tags.add(keyword);
128
+ }
129
+ }
130
+
131
+ return Array.from(tags);
132
+ }
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: kernel-panic-guard
3
+ description: "KERNEL_PANIC 상태 시 외부 도구 호출 하드 차단"
4
+ metadata: { "openclaw": { "emoji": "🛑", "events": ["agent:bootstrap"] } }
5
+ ---
6
+
7
+ # Kernel Panic Guard
8
+
9
+ STATE.md가 KERNEL_PANIC이면 외부 행동 도구를 차단.
10
+
11
+ ## 동작 방식
12
+
13
+ 1. agent:bootstrap 이벤트 발생 시 STATE.md 체크
14
+ 2. "KERNEL_PANIC" 문자열이 포함되어 있으면:
15
+ - context.bootstrapFiles에 긴급 경고 주입
16
+ - event.messages에 시스템 경고 추가
17
+ 3. 에이전트는 경고를 읽고 외부 도구 사용 자제
18
+
19
+ ## 차단 대상 도구
20
+
21
+ - `exec` - 쉘 명령 실행
22
+ - `message` - 외부 메시지 전송
23
+ - `browser` - 브라우저 제어
24
+ - `web_fetch` - 웹 페이지 가져오기
25
+ - `web_search` - 웹 검색
26
+ - `tts` - 음성 합성
27
+ - `sessions_spawn` - 서브에이전트 생성
28
+
29
+ ## 허용 도구
30
+
31
+ - `Read` - 파일 읽기
32
+ - `memory_search` - 메모리 검색
33
+ - `memory_get` - 메모리 조회
34
+
35
+ ## 복구
36
+
37
+ ```bash
38
+ node tools/kernel-guard/unlock.cjs
39
+ ```
@@ -0,0 +1,136 @@
1
+ # Kernel Panic Guard
2
+
3
+ **KERNEL_PANIC** 상태 시 외부 도구 호출을 하드 차단하는 OpenClaw 훅입니다.
4
+
5
+ ## 개요
6
+
7
+ 이 훅은 `agent:bootstrap` 이벤트에서 실행되며, `STATE.md`에 `KERNEL_PANIC` 문자열이 포함되어 있는지 확인합니다.
8
+ 감지되면 에이전트의 `bootstrapFiles`에 경고 문서를 주입하여 외부 도구 사용을 차단합니다.
9
+
10
+ ## 작동 방식
11
+
12
+ 1. **agent:bootstrap 이벤트 발생** (세션 시작 시)
13
+ 2. **STATE.md 존재 및 내용 확인**
14
+ 3. **senderId 체크** (형님 화이트리스트: `[OWNER_DISCORD_ID]`)
15
+ 4. **"KERNEL_PANIC" 감지 시:**
16
+ - **형님 세션**: 간단한 알림만, 락다운 우회
17
+ - **비형님 세션**: `context.bootstrapFiles`에 `KERNEL_PANIC_WARNING.md` 주입
18
+ 5. **에이전트는 경고를 읽고 외부 도구 사용 자제**
19
+
20
+ ## 차단 대상 세션
21
+
22
+ 락다운은 다음 세션에만 적용됩니다:
23
+
24
+ - **무인 세션** (heartbeat, cron)
25
+ - **서브에이전트**
26
+ - **형님이 아닌 사용자**
27
+
28
+ **형님 세션 (Discord user id: `[OWNER_DISCORD_ID]`)은 락다운 우회**
29
+
30
+ ## 차단 대상 도구 (형님 제외)
31
+
32
+ 다음 도구는 KERNEL_PANIC 상태에서 **절대 사용 금지**입니다:
33
+
34
+ - `exec` - 쉘 명령 실행
35
+ - `message` - 외부 메시지 전송
36
+ - `browser` - 브라우저 제어
37
+ - `web_fetch` - 웹 페이지 가져오기
38
+ - `web_search` - 웹 검색
39
+ - `tts` - 음성 합성
40
+ - `sessions_spawn` - 서브에이전트 생성
41
+
42
+ ## 허용 도구
43
+
44
+ 다음 도구만 사용 가능합니다:
45
+
46
+ - `Read` - 파일 읽기
47
+ - `memory_search` - 메모리 검색
48
+ - `memory_get` - 메모리 조회
49
+
50
+ ## 관련 스크립트
51
+
52
+ ### 락다운 활성화
53
+
54
+ ```bash
55
+ node tools/kernel-guard/lockdown.cjs [--reason "사유"]
56
+ ```
57
+
58
+ - STATE.md에 KERNEL_PANIC 상태 기록
59
+ - memory/kernel-panic.json 생성
60
+ - 차단 대상/허용 도구 목록 저장
61
+
62
+ ### 락다운 해제
63
+
64
+ #### 형님 전용 빠른 해제
65
+
66
+ ```bash
67
+ # 방법 1: 스크립트 실행
68
+ node tools/kernel-guard/unlock.cjs
69
+
70
+ # 방법 2: 메시지로 해제
71
+ # 채팅에서 "unlock" 또는 "/unlock" 입력
72
+
73
+ # 방법 3: 자동 해제
74
+ # SOUL.md 수정 후 register-hash.js 재실행
75
+ node tools/kernel-guard/register-hash.js
76
+ ```
77
+
78
+ #### 일반 해제 (무결성 확인)
79
+
80
+ ```bash
81
+ node tools/kernel-guard/unlock.cjs [--force]
82
+ ```
83
+
84
+ - verify-kernel.js로 무결성 확인
85
+ - 통과 시 STATE.md 및 kernel-panic.json 삭제
86
+ - `--force` 플래그로 무결성 체크 우회 (비권장)
87
+
88
+ ### 무결성 검증
89
+
90
+ ```bash
91
+ node tools/kernel-guard/verify-kernel.js
92
+ ```
93
+
94
+ - SOUL.md 로컬 해시 계산
95
+ - BASE chain에서 온체인 해시 조회
96
+ - 일치 여부 확인
97
+
98
+ ## 훅 연동
99
+
100
+ 이 훅은 **soul-guard** 훅과 연동됩니다:
101
+
102
+ - `soul-guard`: SOUL.md 해시 변경 감지 + STATE.md KERNEL_PANIC 체크
103
+ - `kernel-panic-guard`: STATE.md KERNEL_PANIC 감지 + bootstrapFiles 주입
104
+
105
+ 두 훅 모두 `agent:bootstrap` 이벤트에서 실행되며, 중복 체크는 문제없습니다.
106
+
107
+ ## 보안 특징
108
+
109
+ 1. **읽기 전용 모드**: 외부 행동 차단, 파일 읽기만 허용
110
+ 2. **형님 승인 필요**: 복구는 반드시 수동 실행
111
+ 3. **감사 추적**: kernel-panic.json에 락다운 이력 기록
112
+ 4. **우회 불가**: bootstrapFiles 주입으로 세션 시작부터 경고
113
+
114
+ ## 테스트
115
+
116
+ ```bash
117
+ # 락다운 활성화
118
+ node tools/kernel-guard/lockdown.cjs --reason "Test"
119
+
120
+ # STATE.md 확인
121
+ cat STATE.md
122
+
123
+ # 락다운 해제 (강제)
124
+ node tools/kernel-guard/unlock.cjs --force
125
+ ```
126
+
127
+ ## 한계
128
+
129
+ - **에이전트 협조 필요**: 강제 차단이 아닌 경고 주입 방식
130
+ - **before_tool_call 훅 미지원**: 현재 워크스페이스 훅은 bootstrap만 지원
131
+ - **우회 가능성**: 에이전트가 경고를 무시하면 실행 가능
132
+
133
+ ### 향후 개선
134
+
135
+ - OpenClaw 플러그인 시스템에 `before_tool_call` 훅 추가 시 하드 블록 구현 가능
136
+ - middleware.js에서 `{ block: true, blockReason: "..." }` 리턴하여 도구 호출 원천 차단
@@ -0,0 +1,117 @@
1
+ # 형님 화이트리스트 시스템
2
+
3
+ ## 개요
4
+
5
+ KERNEL_PANIC 상태에서도 **형님 세션은 락다운 우회**됩니다.
6
+
7
+ ## 화이트리스트 사용자
8
+
9
+ ```json
10
+ {
11
+ "userId": "[OWNER_DISCORD_ID]",
12
+ "platform": "Discord",
13
+ "role": "형님 (owner)"
14
+ }
15
+ ```
16
+
17
+ ## 동작 방식
18
+
19
+ ### 1. SOUL.md 변경 감지 시
20
+
21
+ **soul-guard 훅에서 senderId 체크:**
22
+
23
+ - **형님 세션** (senderId === `[OWNER_DISCORD_ID]`):
24
+ - ✅ 경고 메시지만 표시: "⚠️ SOUL.md 변경 감지됨. `node tools/kernel-guard/register-hash.js`로 새 해시 등록 필요."
25
+ - ❌ 락다운 실행 **안 함**
26
+ - ✅ 새 해시 저장
27
+
28
+ - **비형님 세션** (heartbeat, cron, 서브에이전트, 다른 사용자):
29
+ - ❌ 즉시 `lockdown.cjs` 실행
30
+ - 🛑 KERNEL_PANIC 상태 활성화
31
+ - ❌ 새 해시 저장 **안 함** (무결성 보존)
32
+
33
+ ### 2. KERNEL_PANIC 상태에서 부트스트랩 시
34
+
35
+ **kernel-panic-guard 훅에서 senderId 체크:**
36
+
37
+ - **형님 세션**:
38
+ - ✅ 간단한 알림: "ℹ️ KERNEL_PANIC 상태 감지됨 (형님 세션은 정상 작동). `node tools/kernel-guard/unlock.cjs`로 해제 가능."
39
+ - ✅ **모든 도구 정상 사용 가능** (exec, message, browser 등)
40
+ - ✅ bootstrapFiles 락다운 경고 주입 **안 함**
41
+
42
+ - **비형님 세션**:
43
+ - 🛑 bootstrapFiles에 `KERNEL_PANIC_WARNING.md` 주입
44
+ - ❌ 외부 도구 차단 지시
45
+ - ✅ 읽기 전용 모드
46
+
47
+ ## 락다운 대상 정리
48
+
49
+ | 세션 타입 | senderId | 락다운 여부 | 비고 |
50
+ |----------|----------|------------|------|
51
+ | 형님 DM | `[OWNER_DISCORD_ID]` | ❌ 우회 | 정상 작동 |
52
+ | Heartbeat | `null` | ✅ 차단 | 무인 세션 |
53
+ | Cron | `null` | ✅ 차단 | 무인 세션 |
54
+ | 서브에이전트 | `agent:*` | ✅ 차단 | 자식 세션 |
55
+ | 다른 사용자 | 다른 ID | ✅ 차단 | 일반 사용자 |
56
+
57
+ ## 형님 전용 복구 방법
58
+
59
+ ### 방법 1: 메시지로 해제 (TODO: 구현 필요)
60
+ ```
61
+ "unlock" 또는 "/unlock" 입력
62
+ ```
63
+
64
+ ### 방법 2: 스크립트 실행
65
+ ```bash
66
+ node tools/kernel-guard/unlock.cjs
67
+ ```
68
+
69
+ ### 방법 3: 자동 해제
70
+ ```bash
71
+ # SOUL.md 수정 후 새 해시 등록 → 자동 unlock
72
+ node tools/kernel-guard/register-hash.js
73
+ ```
74
+
75
+ ## 보안 특징
76
+
77
+ 1. **선택적 락다운**: 무인 세션만 차단, 형님은 항상 제어 가능
78
+ 2. **무결성 보호**: 비형님 세션에서는 해시 업데이트 차단
79
+ 3. **긴급 복구**: 형님이 언제든지 unlock 가능
80
+ 4. **감사 추적**: kernel-panic.json에 화이트리스트 명시
81
+
82
+ ## 구현 파일
83
+
84
+ - `hooks/soul-guard/handler.ts` - senderId 체크 및 선택적 락다운
85
+ - `hooks/kernel-panic-guard/handler.ts` - senderId 체크 및 우회 로직
86
+ - `tools/kernel-guard/lockdown.cjs` - whitelistedUsers 필드 추가
87
+ - `STATE.md` (템플릿) - 형님 전용 복구 방법 안내
88
+
89
+ ## 테스트
90
+
91
+ ```bash
92
+ # 1. 락다운 활성화
93
+ node tools/kernel-guard/lockdown.cjs --reason "Test"
94
+
95
+ # 2. kernel-panic.json 확인
96
+ cat memory/kernel-panic.json
97
+ # → "whitelistedUsers": ["[OWNER_DISCORD_ID]"]
98
+
99
+ # 3. STATE.md 확인
100
+ cat STATE.md
101
+ # → 형님 전용 복구 방법 포함
102
+
103
+ # 4. 해제
104
+ node tools/kernel-guard/unlock.cjs --force
105
+ ```
106
+
107
+ ## 한계 및 향후 개선
108
+
109
+ ### 현재 한계
110
+ - 메시지 기반 unlock ("/unlock" 입력)은 아직 구현 안 됨
111
+ - senderId는 OpenClaw event.context에서 제공하는 값에 의존
112
+ - 형님 세션에서도 에이전트가 자발적으로 경고를 무시할 수 있음
113
+
114
+ ### 향후 개선
115
+ - [ ] 메시지 파싱으로 "/unlock" 명령어 구현
116
+ - [ ] register-hash.js 실행 시 자동 unlock 로직 추가
117
+ - [ ] 형님 세션 로그 별도 기록 (감사 추적)
@@ -0,0 +1,147 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ /**
5
+ * Kernel Panic Guard Hook
6
+ *
7
+ * STATE.md에 KERNEL_PANIC이 감지되면 bootstrapFiles에 긴급 경고를 주입하여
8
+ * 에이전트가 외부 도구 사용을 자제하도록 강제합니다.
9
+ */
10
+
11
+ export default async function handler(event: any): Promise<void> {
12
+ try {
13
+ console.log('[kernel-panic-guard] Checking for KERNEL_PANIC state...');
14
+
15
+ const workspace = event.workspace || process.cwd();
16
+ const statePath = path.join(workspace, 'STATE.md');
17
+
18
+ // 형님 화이트리스트 (환경변수 우선, 하드코딩 제거)
19
+ const HYUNGNIM_USER_ID = process.env.OWNER_DISCORD_ID || '';
20
+ const senderId = event.context?.senderId || event.context?.userId || null;
21
+ const isHyungnim = senderId === HYUNGNIM_USER_ID;
22
+
23
+ // STATE.md 존재 확인
24
+ if (!fs.existsSync(statePath)) {
25
+ console.log('[kernel-panic-guard] STATE.md not found, skipping');
26
+ return;
27
+ }
28
+
29
+ // STATE.md 읽기
30
+ const stateContent = fs.readFileSync(statePath, 'utf-8');
31
+
32
+ // KERNEL_PANIC 체크
33
+ if (!stateContent.includes('KERNEL_PANIC')) {
34
+ console.log('[kernel-panic-guard] ✓ No KERNEL_PANIC detected');
35
+ return;
36
+ }
37
+
38
+ // ⚠️ KERNEL_PANIC 감지됨!
39
+ console.log('[kernel-panic-guard] 🛑 KERNEL_PANIC DETECTED!');
40
+ console.log(`[kernel-panic-guard] Sender ID: ${senderId || 'N/A'} | Hyungnim: ${isHyungnim}`);
41
+
42
+ // 형님 세션이면 락다운 무시
43
+ if (isHyungnim) {
44
+ console.log('[kernel-panic-guard] ✓ Hyungnim session - lockdown bypassed');
45
+
46
+ // 형님에게는 간단한 알림만
47
+ const hyungnimAlert = {
48
+ role: 'system',
49
+ content: 'ℹ️ KERNEL_PANIC 상태 감지됨 (형님 세션은 정상 작동). `node tools/kernel-guard/unlock.cjs`로 해제 가능.'
50
+ };
51
+
52
+ if (event.messages && Array.isArray(event.messages)) {
53
+ event.messages.push(hyungnimAlert);
54
+ }
55
+
56
+ return;
57
+ }
58
+
59
+ // 형님이 아닌 세션: 락다운 적용
60
+ console.log('[kernel-panic-guard] 🔒 Non-Hyungnim session - injecting lockdown instructions...');
61
+
62
+ const lockdownWarning = `
63
+ # 🚨 KERNEL PANIC MODE
64
+
65
+ **SOUL.md 무결성 위반이 감지되었습니다.**
66
+
67
+ ## 🔒 락다운 대상
68
+
69
+ - **무인 세션** (heartbeat, cron)
70
+ - **서브에이전트**
71
+ - **형님이 아닌 사용자**
72
+
73
+ **형님 세션(user id: [OWNER])은 정상 작동합니다.**
74
+
75
+ ## ⛔️ 차단된 도구 (형님 제외)
76
+
77
+ 다음 도구는 **절대 사용 금지**입니다:
78
+ - \`exec\` - 쉘 명령 실행
79
+ - \`message\` - 외부 메시지 전송
80
+ - \`browser\` - 브라우저 제어
81
+ - \`web_fetch\` - 웹 페이지 가져오기
82
+ - \`web_search\` - 웹 검색
83
+ - \`tts\` - 음성 합성
84
+ - \`sessions_spawn\` - 서브에이전트 생성
85
+
86
+ ## ✅ 허용된 도구
87
+
88
+ 다음 도구만 사용 가능합니다:
89
+ - \`Read\` - 파일 읽기
90
+ - \`memory_search\` - 메모리 검색
91
+ - \`memory_get\` - 메모리 조회
92
+
93
+ ## 🔧 복구 방법
94
+
95
+ ### 형님 전용 빠른 해제
96
+ 1. 메시지로 "unlock" 또는 "/unlock" 입력
97
+ 2. 또는 \`node tools/kernel-guard/unlock.cjs\` 실행
98
+
99
+ ### 일반 복구 절차
100
+ 1. **형님에게 즉시 상황 보고** (읽기 전용 도구만 사용)
101
+ 2. 형님이 \`node tools/kernel-guard/verify-kernel.js\` 실행하여 검증
102
+ 3. 복구: \`node tools/kernel-guard/unlock.cjs\` 실행
103
+
104
+ ## ⚠️ 절대 금지 행위
105
+
106
+ - 외부 통신 시도
107
+ - 파일 수정/삭제 (STATE.md 포함)
108
+ - 서브에이전트 생성
109
+ - 락다운 우회 시도
110
+
111
+ **이 경고를 무시하면 시스템 무결성이 더욱 손상될 수 있습니다.**
112
+ `.trim();
113
+
114
+ // bootstrapFiles에 주입 (에이전트가 세션 시작 시 읽음)
115
+ if (event.context && event.context.bootstrapFiles) {
116
+ event.context.bootstrapFiles['KERNEL_PANIC_WARNING.md'] = lockdownWarning;
117
+ console.log('[kernel-panic-guard] ✓ Lockdown warning injected into bootstrapFiles');
118
+ }
119
+
120
+ // messages에도 경고 추가 (즉시 표시)
121
+ const alertMessage = {
122
+ role: 'system',
123
+ content: '🛑 **KERNEL PANIC MODE** — 외부 도구 사용이 차단되었습니다. STATE.md를 확인하세요.'
124
+ };
125
+
126
+ if (event.messages && Array.isArray(event.messages)) {
127
+ event.messages.push(alertMessage);
128
+ console.log('[kernel-panic-guard] ✓ Alert message added');
129
+ }
130
+
131
+ // memory/kernel-panic.json 로드 (lockdown.js가 생성)
132
+ const memoryDir = path.join(workspace, 'memory');
133
+ const panicJsonPath = path.join(memoryDir, 'kernel-panic.json');
134
+
135
+ if (fs.existsSync(panicJsonPath)) {
136
+ try {
137
+ const panicData = JSON.parse(fs.readFileSync(panicJsonPath, 'utf-8'));
138
+ console.log('[kernel-panic-guard] Lockdown details:', panicData);
139
+ } catch (err) {
140
+ console.error('[kernel-panic-guard] Failed to parse kernel-panic.json:', err);
141
+ }
142
+ }
143
+
144
+ } catch (error) {
145
+ console.error('[kernel-panic-guard] Error:', error);
146
+ }
147
+ }
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: memory-consolidator
3
+ description: 7일 이상 된 daily log를 주제별로 정리하여 consolidated 디렉토리에 보관
4
+ metadata: { "openclaw": { "emoji": "💾", "events": ["command:new"] } }
5
+ ---
6
+
7
+ # Memory Consolidator
8
+
9
+ 세션 리셋 시 오래된 daily log를 스캔하여 핵심 내용을 주제별로 정리합니다.
10
+
11
+ ## 동작 방식
12
+
13
+ 1. `memory/YYYY-MM-DD.md` 파일 중 7일 이상 된 파일 탐색
14
+ 2. 상단에 `<!-- consolidated: YYYY-MM-DD -->` 마커가 없는 파일만 처리
15
+ 3. 내용을 분석하여 주제별로 분류:
16
+ - security: 보안, 시크릿, 인젝션 관련
17
+ - philosophy: 가치관, 철학, 생각 관련
18
+ - growth: 성장, 학습, 개선 관련
19
+ - pivots: 방향 전환, 중요 결정 관련
20
+ - tech-discoveries: 기술 발견, 새로운 도구 관련
21
+ 4. `memory/consolidated/` 하위 해당 주제 파일에 내용 append
22
+ 5. 원본 파일 상단에 마커 추가 (중복 처리 방지)
23
+ 6. 원본은 삭제하지 않음
24
+
25
+ ## 출력 파일
26
+
27
+ - `memory/consolidated/security.md`
28
+ - `memory/consolidated/philosophy.md`
29
+ - `memory/consolidated/growth.md`
30
+ - `memory/consolidated/pivots.md`
31
+ - `memory/consolidated/tech-discoveries.md`