@yuaone/core 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.
Files changed (235) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/context-manager.test.d.ts +6 -0
  4. package/dist/__tests__/context-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/context-manager.test.js +220 -0
  6. package/dist/__tests__/context-manager.test.js.map +1 -0
  7. package/dist/__tests__/governor.test.d.ts +6 -0
  8. package/dist/__tests__/governor.test.d.ts.map +1 -0
  9. package/dist/__tests__/governor.test.js +210 -0
  10. package/dist/__tests__/governor.test.js.map +1 -0
  11. package/dist/__tests__/model-router.test.d.ts +6 -0
  12. package/dist/__tests__/model-router.test.d.ts.map +1 -0
  13. package/dist/__tests__/model-router.test.js +329 -0
  14. package/dist/__tests__/model-router.test.js.map +1 -0
  15. package/dist/agent-logger.d.ts +384 -0
  16. package/dist/agent-logger.d.ts.map +1 -0
  17. package/dist/agent-logger.js +820 -0
  18. package/dist/agent-logger.js.map +1 -0
  19. package/dist/agent-loop.d.ts +163 -0
  20. package/dist/agent-loop.d.ts.map +1 -0
  21. package/dist/agent-loop.js +609 -0
  22. package/dist/agent-loop.js.map +1 -0
  23. package/dist/agent-modes.d.ts +85 -0
  24. package/dist/agent-modes.d.ts.map +1 -0
  25. package/dist/agent-modes.js +418 -0
  26. package/dist/agent-modes.js.map +1 -0
  27. package/dist/approval.d.ts +137 -0
  28. package/dist/approval.d.ts.map +1 -0
  29. package/dist/approval.js +299 -0
  30. package/dist/approval.js.map +1 -0
  31. package/dist/async-completion-queue.d.ts +56 -0
  32. package/dist/async-completion-queue.d.ts.map +1 -0
  33. package/dist/async-completion-queue.js +77 -0
  34. package/dist/async-completion-queue.js.map +1 -0
  35. package/dist/auto-fix.d.ts +174 -0
  36. package/dist/auto-fix.d.ts.map +1 -0
  37. package/dist/auto-fix.js +319 -0
  38. package/dist/auto-fix.js.map +1 -0
  39. package/dist/codebase-context.d.ts +396 -0
  40. package/dist/codebase-context.d.ts.map +1 -0
  41. package/dist/codebase-context.js +1260 -0
  42. package/dist/codebase-context.js.map +1 -0
  43. package/dist/conflict-resolver.d.ts +191 -0
  44. package/dist/conflict-resolver.d.ts.map +1 -0
  45. package/dist/conflict-resolver.js +524 -0
  46. package/dist/conflict-resolver.js.map +1 -0
  47. package/dist/constants.d.ts +52 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +141 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/context-budget.d.ts +435 -0
  52. package/dist/context-budget.d.ts.map +1 -0
  53. package/dist/context-budget.js +903 -0
  54. package/dist/context-budget.js.map +1 -0
  55. package/dist/context-compressor.d.ts +143 -0
  56. package/dist/context-compressor.d.ts.map +1 -0
  57. package/dist/context-compressor.js +511 -0
  58. package/dist/context-compressor.js.map +1 -0
  59. package/dist/context-manager.d.ts +112 -0
  60. package/dist/context-manager.d.ts.map +1 -0
  61. package/dist/context-manager.js +247 -0
  62. package/dist/context-manager.js.map +1 -0
  63. package/dist/continuous-reflection.d.ts +267 -0
  64. package/dist/continuous-reflection.d.ts.map +1 -0
  65. package/dist/continuous-reflection.js +338 -0
  66. package/dist/continuous-reflection.js.map +1 -0
  67. package/dist/cross-file-refactor.d.ts +352 -0
  68. package/dist/cross-file-refactor.d.ts.map +1 -0
  69. package/dist/cross-file-refactor.js +1544 -0
  70. package/dist/cross-file-refactor.js.map +1 -0
  71. package/dist/dag-orchestrator.d.ts +138 -0
  72. package/dist/dag-orchestrator.d.ts.map +1 -0
  73. package/dist/dag-orchestrator.js +379 -0
  74. package/dist/dag-orchestrator.js.map +1 -0
  75. package/dist/debate-orchestrator.d.ts +301 -0
  76. package/dist/debate-orchestrator.d.ts.map +1 -0
  77. package/dist/debate-orchestrator.js +719 -0
  78. package/dist/debate-orchestrator.js.map +1 -0
  79. package/dist/dependency-analyzer.d.ts +113 -0
  80. package/dist/dependency-analyzer.d.ts.map +1 -0
  81. package/dist/dependency-analyzer.js +444 -0
  82. package/dist/dependency-analyzer.js.map +1 -0
  83. package/dist/design-loop.d.ts +59 -0
  84. package/dist/design-loop.d.ts.map +1 -0
  85. package/dist/design-loop.js +344 -0
  86. package/dist/design-loop.js.map +1 -0
  87. package/dist/doc-intelligence.d.ts +383 -0
  88. package/dist/doc-intelligence.d.ts.map +1 -0
  89. package/dist/doc-intelligence.js +1307 -0
  90. package/dist/doc-intelligence.js.map +1 -0
  91. package/dist/dynamic-role-generator.d.ts +76 -0
  92. package/dist/dynamic-role-generator.d.ts.map +1 -0
  93. package/dist/dynamic-role-generator.js +194 -0
  94. package/dist/dynamic-role-generator.js.map +1 -0
  95. package/dist/errors.d.ts +69 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +102 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/event-bus.d.ts +159 -0
  100. package/dist/event-bus.d.ts.map +1 -0
  101. package/dist/event-bus.js +305 -0
  102. package/dist/event-bus.js.map +1 -0
  103. package/dist/execution-engine.d.ts +425 -0
  104. package/dist/execution-engine.d.ts.map +1 -0
  105. package/dist/execution-engine.js +1555 -0
  106. package/dist/execution-engine.js.map +1 -0
  107. package/dist/git-intelligence.d.ts +306 -0
  108. package/dist/git-intelligence.d.ts.map +1 -0
  109. package/dist/git-intelligence.js +1099 -0
  110. package/dist/git-intelligence.js.map +1 -0
  111. package/dist/governor.d.ts +77 -0
  112. package/dist/governor.d.ts.map +1 -0
  113. package/dist/governor.js +161 -0
  114. package/dist/governor.js.map +1 -0
  115. package/dist/hierarchical-planner.d.ts +313 -0
  116. package/dist/hierarchical-planner.d.ts.map +1 -0
  117. package/dist/hierarchical-planner.js +981 -0
  118. package/dist/hierarchical-planner.js.map +1 -0
  119. package/dist/index.d.ts +121 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +123 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/intent-inference.d.ts +103 -0
  124. package/dist/intent-inference.d.ts.map +1 -0
  125. package/dist/intent-inference.js +605 -0
  126. package/dist/intent-inference.js.map +1 -0
  127. package/dist/interrupt-manager.d.ts +143 -0
  128. package/dist/interrupt-manager.d.ts.map +1 -0
  129. package/dist/interrupt-manager.js +196 -0
  130. package/dist/interrupt-manager.js.map +1 -0
  131. package/dist/kernel.d.ts +564 -0
  132. package/dist/kernel.d.ts.map +1 -0
  133. package/dist/kernel.js +1419 -0
  134. package/dist/kernel.js.map +1 -0
  135. package/dist/language-support.d.ts +232 -0
  136. package/dist/language-support.d.ts.map +1 -0
  137. package/dist/language-support.js +1134 -0
  138. package/dist/language-support.js.map +1 -0
  139. package/dist/llm-client.d.ts +82 -0
  140. package/dist/llm-client.d.ts.map +1 -0
  141. package/dist/llm-client.js +475 -0
  142. package/dist/llm-client.js.map +1 -0
  143. package/dist/mcp-client.d.ts +232 -0
  144. package/dist/mcp-client.d.ts.map +1 -0
  145. package/dist/mcp-client.js +718 -0
  146. package/dist/mcp-client.js.map +1 -0
  147. package/dist/memory-manager.d.ts +200 -0
  148. package/dist/memory-manager.d.ts.map +1 -0
  149. package/dist/memory-manager.js +568 -0
  150. package/dist/memory-manager.js.map +1 -0
  151. package/dist/memory.d.ts +87 -0
  152. package/dist/memory.d.ts.map +1 -0
  153. package/dist/memory.js +341 -0
  154. package/dist/memory.js.map +1 -0
  155. package/dist/model-router.d.ts +245 -0
  156. package/dist/model-router.d.ts.map +1 -0
  157. package/dist/model-router.js +632 -0
  158. package/dist/model-router.js.map +1 -0
  159. package/dist/parallel-executor.d.ts +125 -0
  160. package/dist/parallel-executor.d.ts.map +1 -0
  161. package/dist/parallel-executor.js +201 -0
  162. package/dist/parallel-executor.js.map +1 -0
  163. package/dist/perf-optimizer.d.ts +212 -0
  164. package/dist/perf-optimizer.d.ts.map +1 -0
  165. package/dist/perf-optimizer.js +721 -0
  166. package/dist/perf-optimizer.js.map +1 -0
  167. package/dist/persona.d.ts +305 -0
  168. package/dist/persona.d.ts.map +1 -0
  169. package/dist/persona.js +887 -0
  170. package/dist/persona.js.map +1 -0
  171. package/dist/planner.d.ts +70 -0
  172. package/dist/planner.d.ts.map +1 -0
  173. package/dist/planner.js +264 -0
  174. package/dist/planner.js.map +1 -0
  175. package/dist/qa-pipeline.d.ts +365 -0
  176. package/dist/qa-pipeline.d.ts.map +1 -0
  177. package/dist/qa-pipeline.js +1352 -0
  178. package/dist/qa-pipeline.js.map +1 -0
  179. package/dist/reasoning-adapter.d.ts +116 -0
  180. package/dist/reasoning-adapter.d.ts.map +1 -0
  181. package/dist/reasoning-adapter.js +187 -0
  182. package/dist/reasoning-adapter.js.map +1 -0
  183. package/dist/role-registry.d.ts +55 -0
  184. package/dist/role-registry.d.ts.map +1 -0
  185. package/dist/role-registry.js +192 -0
  186. package/dist/role-registry.js.map +1 -0
  187. package/dist/sandbox-tiers.d.ts +327 -0
  188. package/dist/sandbox-tiers.d.ts.map +1 -0
  189. package/dist/sandbox-tiers.js +928 -0
  190. package/dist/sandbox-tiers.js.map +1 -0
  191. package/dist/security-scanner.d.ts +222 -0
  192. package/dist/security-scanner.d.ts.map +1 -0
  193. package/dist/security-scanner.js +1129 -0
  194. package/dist/security-scanner.js.map +1 -0
  195. package/dist/security.d.ts +93 -0
  196. package/dist/security.d.ts.map +1 -0
  197. package/dist/security.js +393 -0
  198. package/dist/security.js.map +1 -0
  199. package/dist/self-reflection.d.ts +397 -0
  200. package/dist/self-reflection.d.ts.map +1 -0
  201. package/dist/self-reflection.js +908 -0
  202. package/dist/self-reflection.js.map +1 -0
  203. package/dist/session-persistence.d.ts +191 -0
  204. package/dist/session-persistence.d.ts.map +1 -0
  205. package/dist/session-persistence.js +395 -0
  206. package/dist/session-persistence.js.map +1 -0
  207. package/dist/speculative-executor.d.ts +210 -0
  208. package/dist/speculative-executor.d.ts.map +1 -0
  209. package/dist/speculative-executor.js +618 -0
  210. package/dist/speculative-executor.js.map +1 -0
  211. package/dist/state-machine.d.ts +289 -0
  212. package/dist/state-machine.d.ts.map +1 -0
  213. package/dist/state-machine.js +695 -0
  214. package/dist/state-machine.js.map +1 -0
  215. package/dist/sub-agent.d.ts +177 -0
  216. package/dist/sub-agent.d.ts.map +1 -0
  217. package/dist/sub-agent.js +303 -0
  218. package/dist/sub-agent.js.map +1 -0
  219. package/dist/system-prompt.d.ts +26 -0
  220. package/dist/system-prompt.d.ts.map +1 -0
  221. package/dist/system-prompt.js +84 -0
  222. package/dist/system-prompt.js.map +1 -0
  223. package/dist/test-intelligence.d.ts +439 -0
  224. package/dist/test-intelligence.d.ts.map +1 -0
  225. package/dist/test-intelligence.js +1165 -0
  226. package/dist/test-intelligence.js.map +1 -0
  227. package/dist/types.d.ts +632 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +6 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/vector-index.d.ts +314 -0
  232. package/dist/vector-index.d.ts.map +1 -0
  233. package/dist/vector-index.js +618 -0
  234. package/dist/vector-index.js.map +1 -0
  235. package/package.json +41 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @module design-loop
3
+ * @description Design Mode Agent Loop — AgentLoop를 확장하여 디자인 전용 동작을 추가.
4
+ *
5
+ * AgentLoop의 private 멤버에 접근할 수 없으므로, 다음 전략으로 디자인 로직을 주입:
6
+ * 1. 시스템 프롬프트에 DESIGN_SYSTEM_PROMPT를 합성 (생성자에서)
7
+ * 2. toolExecutor를 래핑하여 파일 편집 시 경로 검증 + 보안 스캔 수행
8
+ * 3. 사용자 메시지에 DOM 컨텍스트를 자동 주입 (run() 오버라이드)
9
+ * 4. 디자인 전용 이벤트를 emit
10
+ */
11
+ import { AgentLoop, type AgentLoopOptions } from "./agent-loop.js";
12
+ import type { AgentTermination, DesignSessionConfig, DOMSnapshot } from "./types.js";
13
+ /** DesignLoop 생성 옵션 */
14
+ export interface DesignLoopOptions extends AgentLoopOptions {
15
+ /** Design Mode 세션 설정 */
16
+ designConfig: DesignSessionConfig;
17
+ /** DOM 스냅샷 콜백 (브라우저에서 접근성 트리 가져오기) */
18
+ getSnapshot: () => Promise<DOMSnapshot>;
19
+ /** 스크린샷 콜백 (base64 이미지 반환, 선택) */
20
+ getScreenshot?: () => Promise<string>;
21
+ }
22
+ /**
23
+ * DesignLoop — Design Mode 전용 Agent Loop.
24
+ *
25
+ * AgentLoop를 확장하여:
26
+ * - 디자인 시스템 프롬프트 주입
27
+ * - DOM 컨텍스트 자동 주입 (run 오버라이드)
28
+ * - 파일 편집 경로 검증 (toolExecutor 래핑)
29
+ * - 보안 패턴 스캔 (파일 쓰기 후)
30
+ * - 디자인 전용 이벤트 emit
31
+ */
32
+ export declare class DesignLoop extends AgentLoop {
33
+ private readonly designConfig;
34
+ private readonly getSnapshot;
35
+ private readonly getScreenshot?;
36
+ constructor(options: DesignLoopOptions);
37
+ /**
38
+ * run()을 오버라이드하여 DOM 컨텍스트를 사용자 메시지 앞에 주입.
39
+ */
40
+ run(userMessage: string): Promise<AgentTermination>;
41
+ /**
42
+ * 현재 디자인 설정을 반환.
43
+ */
44
+ getDesignConfig(): Readonly<DesignSessionConfig>;
45
+ /**
46
+ * AgentConfig의 시스템 프롬프트에 디자인 프롬프트를 주입.
47
+ */
48
+ private static injectDesignPrompt;
49
+ /**
50
+ * ToolExecutor를 래핑하여 파일 편집 도구 호출 시 경로 검증 + 보안 스캔을 수행.
51
+ * emit 콜백은 나중에 _setEmitCallback으로 바인딩.
52
+ */
53
+ private static wrapToolExecutor;
54
+ /**
55
+ * 디자인 이벤트를 emit.
56
+ */
57
+ private emitDesignEvent;
58
+ }
59
+ //# sourceMappingURL=design-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-loop.d.ts","sourceRoot":"","sources":["../src/design-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAEV,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EAMZ,MAAM,YAAY,CAAC;AAuCpB,uBAAuB;AACvB,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,wBAAwB;IACxB,YAAY,EAAE,mBAAmB,CAAC;IAClC,sCAAsC;IACtC,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACvC;AAYD;;;;;;;;;GASG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAwB;gBAE3C,OAAO,EAAE,iBAAiB;IAgCtC;;OAEG;IACY,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0ClE;;OAEG;IACH,eAAe,IAAI,QAAQ,CAAC,mBAAmB,CAAC;IAMhD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAmBjC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAQ/B;;OAEG;IACH,OAAO,CAAC,eAAe;CAQxB"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * @module design-loop
3
+ * @description Design Mode Agent Loop — AgentLoop를 확장하여 디자인 전용 동작을 추가.
4
+ *
5
+ * AgentLoop의 private 멤버에 접근할 수 없으므로, 다음 전략으로 디자인 로직을 주입:
6
+ * 1. 시스템 프롬프트에 DESIGN_SYSTEM_PROMPT를 합성 (생성자에서)
7
+ * 2. toolExecutor를 래핑하여 파일 편집 시 경로 검증 + 보안 스캔 수행
8
+ * 3. 사용자 메시지에 DOM 컨텍스트를 자동 주입 (run() 오버라이드)
9
+ * 4. 디자인 전용 이벤트를 emit
10
+ */
11
+ import { AgentLoop } from "./agent-loop.js";
12
+ import { DESIGN_ALLOWED_PATHS, DESIGN_BLOCKED_PATHS, DESIGN_SECURITY_PATTERNS, } from "./constants.js";
13
+ // ─── Design System Prompt ───
14
+ const DESIGN_SYSTEM_PROMPT = `
15
+ ## Design Mode — Active
16
+
17
+ You are operating in **Design Mode**. Your purpose is to help the user visually design and refine their frontend UI by editing source files and observing live results.
18
+
19
+ ### Available Design Tools
20
+ - **design_snapshot** — Capture current DOM accessibility tree
21
+ - **design_screenshot** — Capture a visual screenshot of the current page
22
+ - **design_navigate** — Navigate the browser to a URL
23
+ - **design_resize** — Resize the browser viewport
24
+ - **design_inspect** — Inspect a specific DOM element
25
+ - **design_scroll** — Scroll the page
26
+
27
+ ### Design Mode Rules
28
+ 1. **Allowed paths only** — You may ONLY modify files under: ${DESIGN_ALLOWED_PATHS.join(", ")}
29
+ 2. **Blocked paths** — NEVER modify: ${DESIGN_BLOCKED_PATHS.join(", ")}
30
+ 3. **Security checks** — Before writing any file:
31
+ - No \`dangerouslySetInnerHTML\` unless explicitly requested
32
+ - No inline event handlers (\`onclick=\`, \`onerror=\`, etc.)
33
+ - No \`javascript:\` URLs
34
+ - No inline \`<script>\` tags
35
+ - Avoid inline \`style=\` attributes (prefer CSS classes/modules)
36
+ - No template literal injection with user input
37
+ 4. **Show diffs** — Always show the diff of every file change so the user can review
38
+ 5. **Live preview** — After editing, take a snapshot or screenshot to verify the visual result
39
+ 6. **Iterative refinement** — Make small, incremental changes. Check the result after each edit.
40
+ `.trim();
41
+ // ─── DesignLoop ───
42
+ /**
43
+ * DesignLoop — Design Mode 전용 Agent Loop.
44
+ *
45
+ * AgentLoop를 확장하여:
46
+ * - 디자인 시스템 프롬프트 주입
47
+ * - DOM 컨텍스트 자동 주입 (run 오버라이드)
48
+ * - 파일 편집 경로 검증 (toolExecutor 래핑)
49
+ * - 보안 패턴 스캔 (파일 쓰기 후)
50
+ * - 디자인 전용 이벤트 emit
51
+ */
52
+ export class DesignLoop extends AgentLoop {
53
+ designConfig;
54
+ getSnapshot;
55
+ getScreenshot;
56
+ constructor(options) {
57
+ // 1. 시스템 프롬프트에 Design Mode 프롬프트를 합성
58
+ const enhancedConfig = DesignLoop.injectDesignPrompt(options.config, options.designConfig);
59
+ // 2. toolExecutor를 래핑하여 경로 검증 + 보안 스캔 추가
60
+ const wrappedExecutor = DesignLoop.wrapToolExecutor(options.toolExecutor, options.designConfig,
61
+ // emit 콜백은 생성 후 바인딩 (아래에서 설정)
62
+ () => { });
63
+ // AgentLoop 생성
64
+ super({
65
+ ...options,
66
+ config: enhancedConfig,
67
+ toolExecutor: wrappedExecutor,
68
+ });
69
+ this.designConfig = options.designConfig;
70
+ this.getSnapshot = options.getSnapshot;
71
+ this.getScreenshot = options.getScreenshot;
72
+ // 3. emit 콜백을 실제 인스턴스로 바인딩
73
+ wrappedExecutor._setEmitCallback((event) => {
74
+ this.emitDesignEvent(event);
75
+ });
76
+ }
77
+ /**
78
+ * run()을 오버라이드하여 DOM 컨텍스트를 사용자 메시지 앞에 주입.
79
+ */
80
+ async run(userMessage) {
81
+ // DOM 스냅샷 가져와서 컨텍스트로 주입
82
+ let contextPrefix = "";
83
+ try {
84
+ const snapshot = await this.getSnapshot();
85
+ contextPrefix += `\n[Design Context — DOM Snapshot]\nURL: ${snapshot.url}\nTitle: ${snapshot.title}\nTimestamp: ${new Date(snapshot.timestamp).toISOString()}\n\nAccessibility Tree:\n${truncate(snapshot.accessibilityTree, 8000)}\n`;
86
+ this.emitDesignEvent({
87
+ type: "design:dom_snapshot",
88
+ data: { url: snapshot.url, title: snapshot.title },
89
+ timestamp: Date.now(),
90
+ });
91
+ }
92
+ catch {
93
+ // 스냅샷 실패 시 무시하고 진행
94
+ contextPrefix += "\n[Design Context — DOM snapshot unavailable]\n";
95
+ }
96
+ // 스크린샷이 가능하면 추가
97
+ if (this.getScreenshot && this.designConfig.autoVision) {
98
+ try {
99
+ const screenshot = await this.getScreenshot();
100
+ contextPrefix += `\n[Design Context — Screenshot captured (base64, ${Math.round(screenshot.length / 1024)}KB)]\n`;
101
+ this.emitDesignEvent({
102
+ type: "design:screenshot",
103
+ data: { sizeKB: Math.round(screenshot.length / 1024) },
104
+ timestamp: Date.now(),
105
+ });
106
+ }
107
+ catch {
108
+ // 스크린샷 실패 시 무시
109
+ }
110
+ }
111
+ // 컨텍스트를 사용자 메시지에 합성
112
+ const enrichedMessage = contextPrefix
113
+ ? `${contextPrefix}\n---\n\n${userMessage}`
114
+ : userMessage;
115
+ return super.run(enrichedMessage);
116
+ }
117
+ /**
118
+ * 현재 디자인 설정을 반환.
119
+ */
120
+ getDesignConfig() {
121
+ return { ...this.designConfig };
122
+ }
123
+ // ─── Static Helpers ───
124
+ /**
125
+ * AgentConfig의 시스템 프롬프트에 디자인 프롬프트를 주입.
126
+ */
127
+ static injectDesignPrompt(config, designConfig) {
128
+ const viewportInfo = designConfig.viewport
129
+ ? `\nCurrent viewport: ${designConfig.viewport.width}x${designConfig.viewport.height}`
130
+ : "";
131
+ const designPromptSection = `\n\n${DESIGN_SYSTEM_PROMPT}\n\n### Project Context\n- Working directory: ${designConfig.workDir}${viewportInfo}\n`;
132
+ return {
133
+ ...config,
134
+ loop: {
135
+ ...config.loop,
136
+ systemPrompt: config.loop.systemPrompt + designPromptSection,
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * ToolExecutor를 래핑하여 파일 편집 도구 호출 시 경로 검증 + 보안 스캔을 수행.
142
+ * emit 콜백은 나중에 _setEmitCallback으로 바인딩.
143
+ */
144
+ static wrapToolExecutor(original, designConfig, emitCallback) {
145
+ return new WrappedToolExecutor(original, designConfig, emitCallback);
146
+ }
147
+ /**
148
+ * 디자인 이벤트를 emit.
149
+ */
150
+ emitDesignEvent(event) {
151
+ this.emit("design_event", event);
152
+ // 기존 이벤트 버스와도 호환 (agent:error 등으로 변환 가능)
153
+ this.emit("event", {
154
+ kind: "agent:thinking",
155
+ content: `[Design] ${event.type}: ${JSON.stringify(event.data)}`,
156
+ });
157
+ }
158
+ }
159
+ // ─── Wrapped Tool Executor ───
160
+ /**
161
+ * ToolExecutor를 래핑하여 Design Mode 전용 검증을 추가하는 내부 클래스.
162
+ */
163
+ class WrappedToolExecutor {
164
+ definitions;
165
+ original;
166
+ designConfig;
167
+ emitCallback;
168
+ constructor(original, designConfig, emitCallback) {
169
+ this.original = original;
170
+ this.definitions = original.definitions;
171
+ this.designConfig = designConfig;
172
+ this.emitCallback = emitCallback;
173
+ }
174
+ /**
175
+ * emit 콜백을 (재)설정. DesignLoop 인스턴스 생성 후 바인딩용.
176
+ */
177
+ _setEmitCallback(cb) {
178
+ this.emitCallback = cb;
179
+ }
180
+ async execute(call, abortSignal) {
181
+ const args = this.parseArgs(call.arguments);
182
+ // 파일 수정 도구인 경우 경로 검증
183
+ if (isFileWriteTool(call.name)) {
184
+ const filePath = extractFilePath(args);
185
+ if (filePath) {
186
+ // 1. 차단 경로 체크
187
+ const blockedPath = this.isBlockedPath(filePath);
188
+ if (blockedPath) {
189
+ return {
190
+ tool_call_id: call.id,
191
+ name: call.name,
192
+ output: `[DESIGN MODE BLOCKED] Cannot modify "${filePath}" — path is blocked in Design Mode (matched: ${blockedPath}). Only files under ${DESIGN_ALLOWED_PATHS.join(", ")} are allowed.`,
193
+ success: false,
194
+ durationMs: 0,
195
+ };
196
+ }
197
+ // 2. 허용 경로 체크
198
+ if (!this.isAllowedPath(filePath)) {
199
+ return {
200
+ tool_call_id: call.id,
201
+ name: call.name,
202
+ output: `[DESIGN MODE BLOCKED] Cannot modify "${filePath}" — not under an allowed path. Allowed: ${DESIGN_ALLOWED_PATHS.join(", ")}`,
203
+ success: false,
204
+ durationMs: 0,
205
+ };
206
+ }
207
+ }
208
+ }
209
+ // 원래 도구 실행
210
+ const result = await this.original.execute(call, abortSignal);
211
+ // 파일 수정 도구 성공 시 보안 스캔
212
+ if (isFileWriteTool(call.name) && result.success) {
213
+ const content = extractFileContent(args);
214
+ if (content) {
215
+ const warnings = scanForSecurityIssues(content);
216
+ if (warnings.length > 0) {
217
+ const warningText = warnings
218
+ .map((w) => ` [${w.category.toUpperCase()}] Line ${w.line}: ${w.content.trim()} (pattern: ${w.pattern})`)
219
+ .join("\n");
220
+ // 보안 경고 이벤트 emit
221
+ this.emitCallback({
222
+ type: "design:security_warning",
223
+ data: { warnings, filePath: extractFilePath(args) },
224
+ timestamp: Date.now(),
225
+ });
226
+ // 결과에 경고 추가 (LLM이 인지하도록)
227
+ result.output += `\n\n⚠️ DESIGN MODE SECURITY WARNINGS:\n${warningText}\n\nPlease review and fix these security issues before proceeding.`;
228
+ }
229
+ }
230
+ // 파일 변경 이벤트
231
+ const filePath = extractFilePath(args);
232
+ if (filePath) {
233
+ this.emitCallback({
234
+ type: "design:file_changed",
235
+ data: { path: filePath },
236
+ timestamp: Date.now(),
237
+ });
238
+ }
239
+ }
240
+ return result;
241
+ }
242
+ /**
243
+ * 경로가 차단 목록에 해당하는지 검사.
244
+ */
245
+ isBlockedPath(filePath) {
246
+ // workDir 기준으로 상대 경로 계산
247
+ const relative = this.toRelative(filePath);
248
+ for (const blocked of DESIGN_BLOCKED_PATHS) {
249
+ if (relative === blocked || relative.startsWith(blocked)) {
250
+ return blocked;
251
+ }
252
+ }
253
+ return null;
254
+ }
255
+ /**
256
+ * 경로가 허용 목록에 해당하는지 검사.
257
+ */
258
+ isAllowedPath(filePath) {
259
+ const relative = this.toRelative(filePath);
260
+ for (const allowed of DESIGN_ALLOWED_PATHS) {
261
+ if (relative.startsWith(allowed)) {
262
+ return true;
263
+ }
264
+ }
265
+ return false;
266
+ }
267
+ /**
268
+ * 절대 경로를 workDir 기준 상대 경로로 변환.
269
+ */
270
+ toRelative(filePath) {
271
+ const workDir = this.designConfig.workDir.endsWith("/")
272
+ ? this.designConfig.workDir
273
+ : this.designConfig.workDir + "/";
274
+ if (filePath.startsWith(workDir)) {
275
+ return filePath.slice(workDir.length);
276
+ }
277
+ return filePath;
278
+ }
279
+ /**
280
+ * 도구 인자를 파싱.
281
+ */
282
+ parseArgs(args) {
283
+ if (typeof args === "string") {
284
+ try {
285
+ return JSON.parse(args);
286
+ }
287
+ catch {
288
+ return { raw: args };
289
+ }
290
+ }
291
+ return args;
292
+ }
293
+ }
294
+ // ─── Utility Functions ───
295
+ /** 파일 수정 도구인지 확인 */
296
+ function isFileWriteTool(toolName) {
297
+ return ["file_write", "file_edit"].includes(toolName);
298
+ }
299
+ /** 도구 인자에서 파일 경로 추출 */
300
+ function extractFilePath(args) {
301
+ const path = args.path ??
302
+ args.file ??
303
+ args.file_path ??
304
+ null;
305
+ return path;
306
+ }
307
+ /** 도구 인자에서 파일 내용 추출 */
308
+ function extractFileContent(args) {
309
+ const content = args.content ??
310
+ args.new_string ??
311
+ args.text ??
312
+ null;
313
+ return content;
314
+ }
315
+ /** 문자열 길이 제한 */
316
+ function truncate(str, maxLen) {
317
+ if (str.length <= maxLen)
318
+ return str;
319
+ return str.slice(0, maxLen) + `\n... (truncated, ${str.length} total chars)`;
320
+ }
321
+ /**
322
+ * 파일 내용에서 보안 문제를 스캔.
323
+ * DESIGN_SECURITY_PATTERNS의 xss/csp/injection 패턴을 검사.
324
+ */
325
+ function scanForSecurityIssues(content) {
326
+ const warnings = [];
327
+ const lines = content.split("\n");
328
+ for (const [category, patterns] of Object.entries(DESIGN_SECURITY_PATTERNS)) {
329
+ for (const pattern of patterns) {
330
+ for (let i = 0; i < lines.length; i++) {
331
+ if (pattern.test(lines[i])) {
332
+ warnings.push({
333
+ category,
334
+ pattern: pattern.source,
335
+ line: i + 1,
336
+ content: lines[i],
337
+ });
338
+ }
339
+ }
340
+ }
341
+ }
342
+ return warnings;
343
+ }
344
+ //# sourceMappingURL=design-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-loop.js","sourceRoot":"","sources":["../src/design-loop.ts"],"names":[],"mappings":"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"}