@mandujs/core 0.12.1 → 0.13.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/README.ko.md +304 -304
- package/README.md +653 -653
- package/package.json +8 -8
- package/src/brain/architecture/analyzer.ts +28 -26
- package/src/brain/doctor/analyzer.ts +1 -1
- package/src/bundler/build.ts +91 -91
- package/src/bundler/css.ts +302 -302
- package/src/bundler/dev.ts +0 -1
- package/src/change/history.ts +3 -3
- package/src/change/snapshot.ts +10 -9
- package/src/change/transaction.ts +2 -2
- package/src/client/Link.tsx +227 -227
- package/src/client/globals.ts +44 -44
- package/src/client/hooks.ts +267 -267
- package/src/client/index.ts +5 -5
- package/src/client/island.ts +8 -8
- package/src/client/router.ts +435 -435
- package/src/client/runtime.ts +23 -23
- package/src/client/serialize.ts +404 -404
- package/src/client/window-state.ts +101 -101
- package/src/config/mandu.ts +94 -96
- package/src/config/validate.ts +213 -215
- package/src/config/watcher.ts +311 -311
- package/src/constants.ts +40 -40
- package/src/content/content-layer.ts +314 -314
- package/src/content/content.test.ts +433 -433
- package/src/content/data-store.ts +245 -245
- package/src/content/digest.ts +133 -133
- package/src/content/index.ts +164 -164
- package/src/content/loader-context.ts +172 -172
- package/src/content/loaders/api.ts +216 -216
- package/src/content/loaders/file.ts +169 -169
- package/src/content/loaders/glob.ts +252 -252
- package/src/content/loaders/index.ts +34 -34
- package/src/content/loaders/types.ts +137 -137
- package/src/content/meta-store.ts +209 -209
- package/src/content/types.ts +282 -282
- package/src/content/watcher.ts +135 -135
- package/src/contract/client-safe.test.ts +42 -42
- package/src/contract/client-safe.ts +114 -114
- package/src/contract/client.ts +16 -16
- package/src/contract/define.ts +459 -459
- package/src/contract/handler.ts +10 -10
- package/src/contract/normalize.test.ts +276 -276
- package/src/contract/normalize.ts +404 -404
- package/src/contract/registry.test.ts +206 -206
- package/src/contract/registry.ts +568 -568
- package/src/contract/schema.ts +48 -48
- package/src/contract/types.ts +58 -58
- package/src/contract/validator.ts +32 -32
- package/src/devtools/ai/context-builder.ts +375 -375
- package/src/devtools/ai/index.ts +25 -25
- package/src/devtools/ai/mcp-connector.ts +465 -465
- package/src/devtools/client/catchers/error-catcher.ts +327 -327
- package/src/devtools/client/catchers/index.ts +18 -18
- package/src/devtools/client/catchers/network-proxy.ts +363 -363
- package/src/devtools/client/components/index.ts +39 -39
- package/src/devtools/client/components/kitchen-root.tsx +362 -362
- package/src/devtools/client/components/mandu-character.tsx +241 -241
- package/src/devtools/client/components/overlay.tsx +368 -368
- package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
- package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
- package/src/devtools/client/components/panel/index.ts +32 -32
- package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
- package/src/devtools/client/components/panel/network-panel.tsx +292 -292
- package/src/devtools/client/components/panel/panel-container.tsx +259 -259
- package/src/devtools/client/filters/context-filters.ts +282 -282
- package/src/devtools/client/filters/index.ts +16 -16
- package/src/devtools/client/index.ts +63 -63
- package/src/devtools/client/persistence.ts +335 -335
- package/src/devtools/client/state-manager.ts +478 -478
- package/src/devtools/design-tokens.ts +263 -263
- package/src/devtools/hook/create-hook.ts +207 -207
- package/src/devtools/hook/index.ts +13 -13
- package/src/devtools/index.ts +439 -439
- package/src/devtools/init.ts +266 -266
- package/src/devtools/protocol.ts +237 -237
- package/src/devtools/server/index.ts +17 -17
- package/src/devtools/server/source-context.ts +444 -444
- package/src/devtools/types.ts +319 -319
- package/src/devtools/worker/index.ts +25 -25
- package/src/devtools/worker/redaction-worker.ts +222 -222
- package/src/devtools/worker/worker-manager.ts +409 -409
- package/src/error/classifier.ts +2 -2
- package/src/error/domains.ts +265 -265
- package/src/error/formatter.ts +32 -32
- package/src/error/result.ts +46 -46
- package/src/error/stack-analyzer.ts +5 -0
- package/src/error/types.ts +6 -6
- package/src/errors/extractor.ts +409 -409
- package/src/errors/index.ts +19 -19
- package/src/filling/auth.ts +308 -308
- package/src/filling/context.ts +569 -569
- package/src/filling/deps.ts +238 -238
- package/src/generator/contract-glue.ts +2 -1
- package/src/generator/generate.ts +12 -10
- package/src/generator/index.ts +3 -3
- package/src/generator/templates.ts +80 -79
- package/src/guard/analyzer.ts +360 -360
- package/src/guard/ast-analyzer.ts +806 -806
- package/src/guard/auto-correct.ts +1 -1
- package/src/guard/check.ts +128 -128
- package/src/guard/contract-guard.ts +9 -9
- package/src/guard/file-type.test.ts +24 -24
- package/src/guard/healing.ts +2 -0
- package/src/guard/index.ts +2 -0
- package/src/guard/negotiation.ts +430 -4
- package/src/guard/presets/atomic.ts +70 -70
- package/src/guard/presets/clean.ts +77 -77
- package/src/guard/presets/cqrs.test.ts +175 -0
- package/src/guard/presets/cqrs.ts +107 -0
- package/src/guard/presets/fsd.ts +79 -79
- package/src/guard/presets/hexagonal.ts +68 -68
- package/src/guard/presets/index.ts +291 -288
- package/src/guard/reporter.ts +445 -445
- package/src/guard/rules.ts +12 -12
- package/src/guard/statistics.ts +578 -578
- package/src/guard/suggestions.ts +358 -352
- package/src/guard/types.ts +348 -347
- package/src/guard/validator.ts +834 -834
- package/src/guard/watcher.ts +404 -404
- package/src/index.ts +1 -0
- package/src/intent/index.ts +310 -310
- package/src/island/index.ts +304 -304
- package/src/logging/index.ts +22 -22
- package/src/logging/transports.ts +365 -365
- package/src/paths.test.ts +47 -0
- package/src/paths.ts +47 -0
- package/src/plugins/index.ts +38 -38
- package/src/plugins/registry.ts +377 -377
- package/src/plugins/types.ts +363 -363
- package/src/report/build.ts +1 -1
- package/src/report/index.ts +1 -1
- package/src/router/fs-patterns.ts +387 -387
- package/src/router/fs-routes.ts +344 -401
- package/src/router/fs-scanner.ts +497 -497
- package/src/router/fs-types.ts +270 -278
- package/src/router/index.ts +81 -81
- package/src/runtime/boundary.tsx +232 -232
- package/src/runtime/compose.ts +222 -222
- package/src/runtime/lifecycle.ts +381 -381
- package/src/runtime/logger.test.ts +345 -345
- package/src/runtime/logger.ts +677 -677
- package/src/runtime/router.test.ts +476 -476
- package/src/runtime/router.ts +105 -105
- package/src/runtime/security.ts +155 -155
- package/src/runtime/server.ts +24 -24
- package/src/runtime/session-key.ts +328 -328
- package/src/runtime/ssr.ts +367 -367
- package/src/runtime/streaming-ssr.ts +1245 -1245
- package/src/runtime/trace.ts +144 -144
- package/src/seo/index.ts +214 -214
- package/src/seo/integration/ssr.ts +307 -307
- package/src/seo/render/basic.ts +427 -427
- package/src/seo/render/index.ts +143 -143
- package/src/seo/render/jsonld.ts +539 -539
- package/src/seo/render/opengraph.ts +191 -191
- package/src/seo/render/robots.ts +116 -116
- package/src/seo/render/sitemap.ts +137 -137
- package/src/seo/render/twitter.ts +126 -126
- package/src/seo/resolve/index.ts +353 -353
- package/src/seo/resolve/opengraph.ts +143 -143
- package/src/seo/resolve/robots.ts +73 -73
- package/src/seo/resolve/title.ts +94 -94
- package/src/seo/resolve/twitter.ts +73 -73
- package/src/seo/resolve/url.ts +97 -97
- package/src/seo/routes/index.ts +290 -290
- package/src/seo/types.ts +575 -575
- package/src/slot/validator.ts +39 -39
- package/src/spec/index.ts +3 -3
- package/src/spec/load.ts +76 -76
- package/src/spec/lock.ts +56 -56
- package/src/utils/bun.ts +8 -8
- package/src/utils/lru-cache.ts +75 -75
- package/src/utils/safe-io.ts +188 -188
- package/src/utils/string-safe.ts +298 -298
- package/src/watcher/rules.ts +5 -5
package/src/devtools/init.ts
CHANGED
|
@@ -1,266 +1,266 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mandu Kitchen DevTools - Initialization
|
|
3
|
-
* @version 1.1.0
|
|
4
|
-
*
|
|
5
|
-
* 통합 초기화 함수
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { DevToolsConfig } from './types';
|
|
9
|
-
import { initializeHook } from './hook';
|
|
10
|
-
import {
|
|
11
|
-
mountKitchen,
|
|
12
|
-
unmountKitchen,
|
|
13
|
-
initializeErrorCatcher,
|
|
14
|
-
destroyErrorCatcher,
|
|
15
|
-
initializeNetworkProxy,
|
|
16
|
-
destroyNetworkProxy,
|
|
17
|
-
initializePersistence,
|
|
18
|
-
destroyPersistence,
|
|
19
|
-
getStateManager,
|
|
20
|
-
getPersistenceManager,
|
|
21
|
-
} from './client';
|
|
22
|
-
import { initializeWorkerManager, destroyWorkerManager } from './worker';
|
|
23
|
-
import { getContextBuilder, resetContextBuilder, getMCPConnector, destroyMCPConnector } from './ai';
|
|
24
|
-
|
|
25
|
-
// ============================================================================
|
|
26
|
-
// Types
|
|
27
|
-
// ============================================================================
|
|
28
|
-
|
|
29
|
-
export interface KitchenInstance {
|
|
30
|
-
/** DevTools 언마운트 및 정리 */
|
|
31
|
-
destroy: () => void;
|
|
32
|
-
/** 상태 관리자 접근 */
|
|
33
|
-
getState: () => any;
|
|
34
|
-
/** 에러 리포트 */
|
|
35
|
-
reportError: (error: Error | string) => void;
|
|
36
|
-
/** DevTools 열기 */
|
|
37
|
-
open: () => void;
|
|
38
|
-
/** DevTools 닫기 */
|
|
39
|
-
close: () => void;
|
|
40
|
-
/** DevTools 토글 */
|
|
41
|
-
toggle: () => void;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// Initialization
|
|
46
|
-
// ============================================================================
|
|
47
|
-
|
|
48
|
-
let isInitialized = false;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Mandu Kitchen DevTools 초기화
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```typescript
|
|
55
|
-
* import { initManduKitchen } from '@mandu/core/devtools';
|
|
56
|
-
*
|
|
57
|
-
* // 앱 시작 시 초기화
|
|
58
|
-
* const kitchen = initManduKitchen({
|
|
59
|
-
* position: 'bottom-right',
|
|
60
|
-
* features: {
|
|
61
|
-
* errorOverlay: true,
|
|
62
|
-
* networkMonitor: true,
|
|
63
|
-
* },
|
|
64
|
-
* });
|
|
65
|
-
*
|
|
66
|
-
* // 나중에 정리
|
|
67
|
-
* kitchen.destroy();
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
export function initManduKitchen(config: DevToolsConfig = {}): KitchenInstance {
|
|
71
|
-
// Production 환경에서는 noop 반환
|
|
72
|
-
if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production') {
|
|
73
|
-
return createNoopInstance();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// 브라우저 환경이 아니면 noop 반환
|
|
77
|
-
if (typeof window === 'undefined') {
|
|
78
|
-
return createNoopInstance();
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// 이미 초기화되었으면 기존 인스턴스 반환
|
|
82
|
-
if (isInitialized) {
|
|
83
|
-
console.warn('[Mandu Kitchen] Already initialized. Call destroy() first to reinitialize.');
|
|
84
|
-
return createInstance();
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// 비활성화 설정이면 noop 반환
|
|
88
|
-
if (config.enabled === false) {
|
|
89
|
-
return createNoopInstance();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// 초기화 시작
|
|
93
|
-
try {
|
|
94
|
-
// 1. Hook 초기화
|
|
95
|
-
initializeHook();
|
|
96
|
-
|
|
97
|
-
// 2. Error Catcher 초기화
|
|
98
|
-
if (config.features?.errorOverlay !== false) {
|
|
99
|
-
initializeErrorCatcher();
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// 3. Network Proxy 초기화
|
|
103
|
-
if (config.features?.networkMonitor !== false) {
|
|
104
|
-
initializeNetworkProxy({
|
|
105
|
-
bodyPolicy: {
|
|
106
|
-
collectBody: config.network?.collectBody ?? false,
|
|
107
|
-
optInPolicy: {
|
|
108
|
-
maxBytes: config.network?.bodyMaxBytes ?? 10_000,
|
|
109
|
-
applyPIIFilter: true,
|
|
110
|
-
applySecretFilter: true,
|
|
111
|
-
allowedContentTypes: ['application/json', 'text/plain', 'text/event-stream'],
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// 4. Persistence 초기화
|
|
118
|
-
if (config.persistence?.enabled !== false) {
|
|
119
|
-
const persistence = initializePersistence(config.persistence);
|
|
120
|
-
|
|
121
|
-
// 저장된 이벤트 복원
|
|
122
|
-
const savedEvents = persistence.loadEvents();
|
|
123
|
-
if (savedEvents.length > 0) {
|
|
124
|
-
const stateManager = getStateManager(config);
|
|
125
|
-
for (const event of savedEvents) {
|
|
126
|
-
stateManager.handleEvent(event);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// 5. v1.1: Worker Manager 초기화 (백그라운드, 실패해도 계속)
|
|
132
|
-
initializeWorkerManager().catch((err) => {
|
|
133
|
-
console.warn('[Mandu Kitchen] Worker initialization failed, using main thread fallback:', err);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
// 6. v1.1: AI Context Builder 초기화
|
|
137
|
-
const contextBuilder = getContextBuilder({ config });
|
|
138
|
-
|
|
139
|
-
// 7. UI 마운트
|
|
140
|
-
mountKitchen(config);
|
|
141
|
-
|
|
142
|
-
isInitialized = true;
|
|
143
|
-
|
|
144
|
-
console.log('[Mandu Kitchen] DevTools v1.1 initialized 🥟');
|
|
145
|
-
|
|
146
|
-
return createInstance();
|
|
147
|
-
} catch (error) {
|
|
148
|
-
console.error('[Mandu Kitchen] Initialization failed:', error);
|
|
149
|
-
return createNoopInstance();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* DevTools 정리
|
|
155
|
-
*/
|
|
156
|
-
export function destroyManduKitchen(): void {
|
|
157
|
-
if (!isInitialized) return;
|
|
158
|
-
|
|
159
|
-
try {
|
|
160
|
-
// UI 언마운트
|
|
161
|
-
unmountKitchen();
|
|
162
|
-
|
|
163
|
-
// v1.0 모듈 정리
|
|
164
|
-
destroyErrorCatcher();
|
|
165
|
-
destroyNetworkProxy();
|
|
166
|
-
destroyPersistence();
|
|
167
|
-
|
|
168
|
-
// v1.1 모듈 정리
|
|
169
|
-
destroyWorkerManager();
|
|
170
|
-
resetContextBuilder();
|
|
171
|
-
destroyMCPConnector();
|
|
172
|
-
|
|
173
|
-
isInitialized = false;
|
|
174
|
-
|
|
175
|
-
console.log('[Mandu Kitchen] DevTools destroyed');
|
|
176
|
-
} catch (error) {
|
|
177
|
-
console.error('[Mandu Kitchen] Cleanup failed:', error);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// ============================================================================
|
|
182
|
-
// Instance Factories
|
|
183
|
-
// ============================================================================
|
|
184
|
-
|
|
185
|
-
function createInstance(): KitchenInstance {
|
|
186
|
-
return {
|
|
187
|
-
destroy: destroyManduKitchen,
|
|
188
|
-
|
|
189
|
-
getState: () => getStateManager().getState(),
|
|
190
|
-
|
|
191
|
-
reportError: (error: Error | string) => {
|
|
192
|
-
const stateManager = getStateManager();
|
|
193
|
-
const message = typeof error === 'string' ? error : error.message;
|
|
194
|
-
const stack = typeof error === 'string' ? undefined : error.stack;
|
|
195
|
-
|
|
196
|
-
stateManager.addError({
|
|
197
|
-
id: `manual-${Date.now()}`,
|
|
198
|
-
type: 'runtime',
|
|
199
|
-
severity: 'error',
|
|
200
|
-
message,
|
|
201
|
-
stack,
|
|
202
|
-
timestamp: Date.now(),
|
|
203
|
-
url: window.location.href,
|
|
204
|
-
});
|
|
205
|
-
},
|
|
206
|
-
|
|
207
|
-
open: () => getStateManager().open(),
|
|
208
|
-
close: () => getStateManager().close(),
|
|
209
|
-
toggle: () => getStateManager().toggle(),
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function createNoopInstance(): KitchenInstance {
|
|
214
|
-
return {
|
|
215
|
-
destroy: () => {},
|
|
216
|
-
getState: () => ({} as any),
|
|
217
|
-
reportError: () => {},
|
|
218
|
-
open: () => {},
|
|
219
|
-
close: () => {},
|
|
220
|
-
toggle: () => {},
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// ============================================================================
|
|
225
|
-
// Auto-initialization (optional)
|
|
226
|
-
// ============================================================================
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* 자동 초기화 (script 태그로 로드 시)
|
|
230
|
-
*
|
|
231
|
-
* HTML에서 사용:
|
|
232
|
-
* <script src="mandu-kitchen.js" data-auto-init data-position="bottom-left"></script>
|
|
233
|
-
*/
|
|
234
|
-
export function autoInit(): void {
|
|
235
|
-
if (typeof document === 'undefined') return;
|
|
236
|
-
|
|
237
|
-
// DOMContentLoaded 이후에 실행
|
|
238
|
-
if (document.readyState === 'loading') {
|
|
239
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
240
|
-
checkAndInit();
|
|
241
|
-
});
|
|
242
|
-
} else {
|
|
243
|
-
checkAndInit();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
function checkAndInit(): void {
|
|
248
|
-
// data-auto-init 속성이 있는 script 태그 찾기
|
|
249
|
-
const script = document.querySelector('script[data-mandu-kitchen-auto-init]');
|
|
250
|
-
if (!script) return;
|
|
251
|
-
|
|
252
|
-
const config: DevToolsConfig = {};
|
|
253
|
-
|
|
254
|
-
// data 속성에서 설정 읽기
|
|
255
|
-
const position = script.getAttribute('data-position');
|
|
256
|
-
if (position) {
|
|
257
|
-
config.position = position as DevToolsConfig['position'];
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
const theme = script.getAttribute('data-theme');
|
|
261
|
-
if (theme) {
|
|
262
|
-
config.theme = theme as DevToolsConfig['theme'];
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
initManduKitchen(config);
|
|
266
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Mandu Kitchen DevTools - Initialization
|
|
3
|
+
* @version 1.1.0
|
|
4
|
+
*
|
|
5
|
+
* 통합 초기화 함수
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { DevToolsConfig } from './types';
|
|
9
|
+
import { initializeHook } from './hook';
|
|
10
|
+
import {
|
|
11
|
+
mountKitchen,
|
|
12
|
+
unmountKitchen,
|
|
13
|
+
initializeErrorCatcher,
|
|
14
|
+
destroyErrorCatcher,
|
|
15
|
+
initializeNetworkProxy,
|
|
16
|
+
destroyNetworkProxy,
|
|
17
|
+
initializePersistence,
|
|
18
|
+
destroyPersistence,
|
|
19
|
+
getStateManager,
|
|
20
|
+
getPersistenceManager,
|
|
21
|
+
} from './client';
|
|
22
|
+
import { initializeWorkerManager, destroyWorkerManager } from './worker';
|
|
23
|
+
import { getContextBuilder, resetContextBuilder, getMCPConnector, destroyMCPConnector } from './ai';
|
|
24
|
+
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Types
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
export interface KitchenInstance {
|
|
30
|
+
/** DevTools 언마운트 및 정리 */
|
|
31
|
+
destroy: () => void;
|
|
32
|
+
/** 상태 관리자 접근 */
|
|
33
|
+
getState: () => any;
|
|
34
|
+
/** 에러 리포트 */
|
|
35
|
+
reportError: (error: Error | string) => void;
|
|
36
|
+
/** DevTools 열기 */
|
|
37
|
+
open: () => void;
|
|
38
|
+
/** DevTools 닫기 */
|
|
39
|
+
close: () => void;
|
|
40
|
+
/** DevTools 토글 */
|
|
41
|
+
toggle: () => void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Initialization
|
|
46
|
+
// ============================================================================
|
|
47
|
+
|
|
48
|
+
let isInitialized = false;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Mandu Kitchen DevTools 초기화
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* import { initManduKitchen } from '@mandu/core/devtools';
|
|
56
|
+
*
|
|
57
|
+
* // 앱 시작 시 초기화
|
|
58
|
+
* const kitchen = initManduKitchen({
|
|
59
|
+
* position: 'bottom-right',
|
|
60
|
+
* features: {
|
|
61
|
+
* errorOverlay: true,
|
|
62
|
+
* networkMonitor: true,
|
|
63
|
+
* },
|
|
64
|
+
* });
|
|
65
|
+
*
|
|
66
|
+
* // 나중에 정리
|
|
67
|
+
* kitchen.destroy();
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export function initManduKitchen(config: DevToolsConfig = {}): KitchenInstance {
|
|
71
|
+
// Production 환경에서는 noop 반환
|
|
72
|
+
if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production') {
|
|
73
|
+
return createNoopInstance();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// 브라우저 환경이 아니면 noop 반환
|
|
77
|
+
if (typeof window === 'undefined') {
|
|
78
|
+
return createNoopInstance();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 이미 초기화되었으면 기존 인스턴스 반환
|
|
82
|
+
if (isInitialized) {
|
|
83
|
+
console.warn('[Mandu Kitchen] Already initialized. Call destroy() first to reinitialize.');
|
|
84
|
+
return createInstance();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 비활성화 설정이면 noop 반환
|
|
88
|
+
if (config.enabled === false) {
|
|
89
|
+
return createNoopInstance();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 초기화 시작
|
|
93
|
+
try {
|
|
94
|
+
// 1. Hook 초기화
|
|
95
|
+
initializeHook();
|
|
96
|
+
|
|
97
|
+
// 2. Error Catcher 초기화
|
|
98
|
+
if (config.features?.errorOverlay !== false) {
|
|
99
|
+
initializeErrorCatcher();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// 3. Network Proxy 초기화
|
|
103
|
+
if (config.features?.networkMonitor !== false) {
|
|
104
|
+
initializeNetworkProxy({
|
|
105
|
+
bodyPolicy: {
|
|
106
|
+
collectBody: config.network?.collectBody ?? false,
|
|
107
|
+
optInPolicy: {
|
|
108
|
+
maxBytes: config.network?.bodyMaxBytes ?? 10_000,
|
|
109
|
+
applyPIIFilter: true,
|
|
110
|
+
applySecretFilter: true,
|
|
111
|
+
allowedContentTypes: ['application/json', 'text/plain', 'text/event-stream'],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// 4. Persistence 초기화
|
|
118
|
+
if (config.persistence?.enabled !== false) {
|
|
119
|
+
const persistence = initializePersistence(config.persistence);
|
|
120
|
+
|
|
121
|
+
// 저장된 이벤트 복원
|
|
122
|
+
const savedEvents = persistence.loadEvents();
|
|
123
|
+
if (savedEvents.length > 0) {
|
|
124
|
+
const stateManager = getStateManager(config);
|
|
125
|
+
for (const event of savedEvents) {
|
|
126
|
+
stateManager.handleEvent(event);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// 5. v1.1: Worker Manager 초기화 (백그라운드, 실패해도 계속)
|
|
132
|
+
initializeWorkerManager().catch((err) => {
|
|
133
|
+
console.warn('[Mandu Kitchen] Worker initialization failed, using main thread fallback:', err);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// 6. v1.1: AI Context Builder 초기화
|
|
137
|
+
const contextBuilder = getContextBuilder({ config });
|
|
138
|
+
|
|
139
|
+
// 7. UI 마운트
|
|
140
|
+
mountKitchen(config);
|
|
141
|
+
|
|
142
|
+
isInitialized = true;
|
|
143
|
+
|
|
144
|
+
console.log('[Mandu Kitchen] DevTools v1.1 initialized 🥟');
|
|
145
|
+
|
|
146
|
+
return createInstance();
|
|
147
|
+
} catch (error) {
|
|
148
|
+
console.error('[Mandu Kitchen] Initialization failed:', error);
|
|
149
|
+
return createNoopInstance();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* DevTools 정리
|
|
155
|
+
*/
|
|
156
|
+
export function destroyManduKitchen(): void {
|
|
157
|
+
if (!isInitialized) return;
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
// UI 언마운트
|
|
161
|
+
unmountKitchen();
|
|
162
|
+
|
|
163
|
+
// v1.0 모듈 정리
|
|
164
|
+
destroyErrorCatcher();
|
|
165
|
+
destroyNetworkProxy();
|
|
166
|
+
destroyPersistence();
|
|
167
|
+
|
|
168
|
+
// v1.1 모듈 정리
|
|
169
|
+
destroyWorkerManager();
|
|
170
|
+
resetContextBuilder();
|
|
171
|
+
destroyMCPConnector();
|
|
172
|
+
|
|
173
|
+
isInitialized = false;
|
|
174
|
+
|
|
175
|
+
console.log('[Mandu Kitchen] DevTools destroyed');
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error('[Mandu Kitchen] Cleanup failed:', error);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ============================================================================
|
|
182
|
+
// Instance Factories
|
|
183
|
+
// ============================================================================
|
|
184
|
+
|
|
185
|
+
function createInstance(): KitchenInstance {
|
|
186
|
+
return {
|
|
187
|
+
destroy: destroyManduKitchen,
|
|
188
|
+
|
|
189
|
+
getState: () => getStateManager().getState(),
|
|
190
|
+
|
|
191
|
+
reportError: (error: Error | string) => {
|
|
192
|
+
const stateManager = getStateManager();
|
|
193
|
+
const message = typeof error === 'string' ? error : error.message;
|
|
194
|
+
const stack = typeof error === 'string' ? undefined : error.stack;
|
|
195
|
+
|
|
196
|
+
stateManager.addError({
|
|
197
|
+
id: `manual-${Date.now()}`,
|
|
198
|
+
type: 'runtime',
|
|
199
|
+
severity: 'error',
|
|
200
|
+
message,
|
|
201
|
+
stack,
|
|
202
|
+
timestamp: Date.now(),
|
|
203
|
+
url: window.location.href,
|
|
204
|
+
});
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
open: () => getStateManager().open(),
|
|
208
|
+
close: () => getStateManager().close(),
|
|
209
|
+
toggle: () => getStateManager().toggle(),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function createNoopInstance(): KitchenInstance {
|
|
214
|
+
return {
|
|
215
|
+
destroy: () => {},
|
|
216
|
+
getState: () => ({} as any),
|
|
217
|
+
reportError: () => {},
|
|
218
|
+
open: () => {},
|
|
219
|
+
close: () => {},
|
|
220
|
+
toggle: () => {},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ============================================================================
|
|
225
|
+
// Auto-initialization (optional)
|
|
226
|
+
// ============================================================================
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* 자동 초기화 (script 태그로 로드 시)
|
|
230
|
+
*
|
|
231
|
+
* HTML에서 사용:
|
|
232
|
+
* <script src="mandu-kitchen.js" data-auto-init data-position="bottom-left"></script>
|
|
233
|
+
*/
|
|
234
|
+
export function autoInit(): void {
|
|
235
|
+
if (typeof document === 'undefined') return;
|
|
236
|
+
|
|
237
|
+
// DOMContentLoaded 이후에 실행
|
|
238
|
+
if (document.readyState === 'loading') {
|
|
239
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
240
|
+
checkAndInit();
|
|
241
|
+
});
|
|
242
|
+
} else {
|
|
243
|
+
checkAndInit();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function checkAndInit(): void {
|
|
248
|
+
// data-auto-init 속성이 있는 script 태그 찾기
|
|
249
|
+
const script = document.querySelector('script[data-mandu-kitchen-auto-init]');
|
|
250
|
+
if (!script) return;
|
|
251
|
+
|
|
252
|
+
const config: DevToolsConfig = {};
|
|
253
|
+
|
|
254
|
+
// data 속성에서 설정 읽기
|
|
255
|
+
const position = script.getAttribute('data-position');
|
|
256
|
+
if (position) {
|
|
257
|
+
config.position = position as DevToolsConfig['position'];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const theme = script.getAttribute('data-theme');
|
|
261
|
+
if (theme) {
|
|
262
|
+
config.theme = theme as DevToolsConfig['theme'];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
initManduKitchen(config);
|
|
266
|
+
}
|