@adhdev/daemon-core 0.6.53 → 0.6.55

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 (164) hide show
  1. package/dist/index.d.ts +76 -34
  2. package/dist/index.js +714 -271
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/providers/_builtin/_helpers/index.js +26 -26
  6. package/providers/_builtin/cli/aider-cli/provider.json +37 -0
  7. package/providers/_builtin/cli/aider-cli/scripts/1.0/detect_status.js +20 -0
  8. package/providers/_builtin/cli/aider-cli/scripts/1.0/parse_approval.js +10 -0
  9. package/providers/_builtin/cli/aider-cli/scripts/1.0/parse_output.js +49 -0
  10. package/providers/_builtin/cli/aider-cli/scripts/1.0/scripts.js +7 -0
  11. package/providers/_builtin/cli/claude-cli/provider.json +9 -2
  12. package/providers/_builtin/cli/claude-cli/scripts/1.0/detect_status.js +31 -0
  13. package/providers/_builtin/cli/claude-cli/scripts/1.0/parse_approval.js +38 -0
  14. package/providers/_builtin/cli/claude-cli/scripts/1.0/parse_output.js +164 -0
  15. package/providers/_builtin/cli/claude-cli/scripts/1.0/scripts.js +42 -0
  16. package/providers/_builtin/cli/codex-cli/provider.json +9 -2
  17. package/providers/_builtin/cli/codex-cli/scripts/1.0/detect_status.js +20 -0
  18. package/providers/_builtin/cli/codex-cli/scripts/1.0/parse_approval.js +15 -0
  19. package/providers/_builtin/cli/codex-cli/scripts/1.0/parse_output.js +68 -0
  20. package/providers/_builtin/cli/codex-cli/scripts/1.0/scripts.js +11 -0
  21. package/providers/_builtin/cli/cursor-cli/provider.json +37 -0
  22. package/providers/_builtin/cli/cursor-cli/scripts/1.0/detect_status.js +19 -0
  23. package/providers/_builtin/cli/cursor-cli/scripts/1.0/parse_approval.js +10 -0
  24. package/providers/_builtin/cli/cursor-cli/scripts/1.0/parse_output.js +48 -0
  25. package/providers/_builtin/cli/cursor-cli/scripts/1.0/scripts.js +7 -0
  26. package/providers/_builtin/cli/gemini-cli/provider.json +9 -2
  27. package/providers/_builtin/cli/gemini-cli/scripts/1.0/detect_status.js +26 -0
  28. package/providers/_builtin/cli/gemini-cli/scripts/1.0/parse_approval.js +22 -0
  29. package/providers/_builtin/cli/gemini-cli/scripts/1.0/parse_output.js +71 -0
  30. package/providers/_builtin/cli/gemini-cli/scripts/1.0/scripts.js +12 -0
  31. package/providers/_builtin/cli/github-copilot-cli/provider.json +37 -0
  32. package/providers/_builtin/cli/github-copilot-cli/scripts/1.0/detect_status.js +19 -0
  33. package/providers/_builtin/cli/github-copilot-cli/scripts/1.0/parse_approval.js +9 -0
  34. package/providers/_builtin/cli/github-copilot-cli/scripts/1.0/parse_output.js +48 -0
  35. package/providers/_builtin/cli/github-copilot-cli/scripts/1.0/scripts.js +7 -0
  36. package/providers/_builtin/cli/goose-cli/provider.json +37 -0
  37. package/providers/_builtin/cli/goose-cli/scripts/1.0/detect_status.js +20 -0
  38. package/providers/_builtin/cli/goose-cli/scripts/1.0/parse_approval.js +10 -0
  39. package/providers/_builtin/cli/goose-cli/scripts/1.0/parse_output.js +48 -0
  40. package/providers/_builtin/cli/goose-cli/scripts/1.0/scripts.js +7 -0
  41. package/providers/_builtin/cli/opencode-cli/provider.json +37 -0
  42. package/providers/_builtin/cli/opencode-cli/scripts/1.0/detect_status.js +15 -0
  43. package/providers/_builtin/cli/opencode-cli/scripts/1.0/parse_approval.js +9 -0
  44. package/providers/_builtin/cli/opencode-cli/scripts/1.0/parse_output.js +48 -0
  45. package/providers/_builtin/cli/opencode-cli/scripts/1.0/scripts.js +7 -0
  46. package/providers/_builtin/extension/cline/scripts/1.0/focus_editor.js +5 -5
  47. package/providers/_builtin/extension/cline/scripts/1.0/list_chats.js +11 -11
  48. package/providers/_builtin/extension/cline/scripts/1.0/list_models.js +6 -6
  49. package/providers/_builtin/extension/cline/scripts/1.0/list_modes.js +5 -5
  50. package/providers/_builtin/extension/cline/scripts/1.0/new_session.js +12 -12
  51. package/providers/_builtin/extension/cline/scripts/1.0/open_panel.js +7 -7
  52. package/providers/_builtin/extension/cline/scripts/1.0/read_chat.js +29 -29
  53. package/providers/_builtin/extension/cline/scripts/1.0/resolve_action.js +19 -19
  54. package/providers/_builtin/extension/cline/scripts/1.0/send_message.js +15 -15
  55. package/providers/_builtin/extension/cline/scripts/1.0/set_mode.js +4 -4
  56. package/providers/_builtin/extension/cline/scripts/1.0/set_model.js +4 -4
  57. package/providers/_builtin/extension/cline/scripts/1.0/switch_session.js +21 -21
  58. package/providers/_builtin/extension/codex/scripts/1.0/explore_controls_webview.js +2 -2
  59. package/providers/_builtin/extension/codex/scripts/1.0/list_models.js +1 -1
  60. package/providers/_builtin/extension/codex/scripts/1.0/list_modes.js +1 -1
  61. package/providers/_builtin/extension/codex/scripts/1.0/new_session.js +2 -2
  62. package/providers/_builtin/extension/codex/scripts/1.0/read_chat.js +6 -6
  63. package/providers/_builtin/extension/codex/scripts/1.0/resolve_action.js +3 -3
  64. package/providers/_builtin/extension/codex/scripts/1.0/set_model.js +1 -1
  65. package/providers/_builtin/ide/antigravity/scripts/1.0/focus_editor.js +2 -2
  66. package/providers/_builtin/ide/antigravity/scripts/1.0/list_chats.js +19 -19
  67. package/providers/_builtin/ide/antigravity/scripts/1.0/list_models.js +1 -1
  68. package/providers/_builtin/ide/antigravity/scripts/1.0/list_modes.js +1 -1
  69. package/providers/_builtin/ide/antigravity/scripts/1.0/new_session.js +17 -17
  70. package/providers/_builtin/ide/antigravity/scripts/1.0/read_chat.js +41 -41
  71. package/providers/_builtin/ide/antigravity/scripts/1.0/resolve_action.js +6 -6
  72. package/providers/_builtin/ide/antigravity/scripts/1.0/send_message.js +13 -13
  73. package/providers/_builtin/ide/antigravity/scripts/1.0/set_model.js +1 -1
  74. package/providers/_builtin/ide/antigravity/scripts/1.0/switch_session.js +13 -13
  75. package/providers/_builtin/ide/cursor/scripts/1.0/dismiss_notification.js +3 -3
  76. package/providers/_builtin/ide/cursor/scripts/1.0/focus_editor.js +1 -1
  77. package/providers/_builtin/ide/cursor/scripts/1.0/list_models.js +12 -12
  78. package/providers/_builtin/ide/cursor/scripts/1.0/list_modes.js +5 -5
  79. package/providers/_builtin/ide/cursor/scripts/1.0/list_notifications.js +2 -2
  80. package/providers/_builtin/ide/cursor/scripts/1.0/list_sessions.js +5 -5
  81. package/providers/_builtin/ide/cursor/scripts/1.0/new_session.js +1 -1
  82. package/providers/_builtin/ide/cursor/scripts/1.0/open_panel.js +3 -3
  83. package/providers/_builtin/ide/cursor/scripts/1.0/read_chat.js +9 -9
  84. package/providers/_builtin/ide/cursor/scripts/1.0/resolve_action.js +4 -4
  85. package/providers/_builtin/ide/cursor/scripts/1.0/send_message.js +5 -5
  86. package/providers/_builtin/ide/cursor/scripts/1.0/set_mode.js +4 -4
  87. package/providers/_builtin/ide/cursor/scripts/1.0/set_model.js +12 -12
  88. package/providers/_builtin/ide/cursor/scripts/1.0/switch_session.js +2 -2
  89. package/providers/_builtin/ide/kiro/scripts/1.0/focus_editor.js +2 -2
  90. package/providers/_builtin/ide/kiro/scripts/1.0/open_panel.js +7 -7
  91. package/providers/_builtin/ide/kiro/scripts/1.0/resolve_action.js +3 -3
  92. package/providers/_builtin/ide/kiro/scripts/1.0/send_message.js +4 -4
  93. package/providers/_builtin/ide/kiro/scripts/1.0/webview_list_sessions.js +2 -2
  94. package/providers/_builtin/ide/kiro/scripts/1.0/webview_new_session.js +5 -5
  95. package/providers/_builtin/ide/kiro/scripts/1.0/webview_read_chat.js +13 -13
  96. package/providers/_builtin/ide/kiro/scripts/1.0/webview_resolve_action.js +1 -1
  97. package/providers/_builtin/ide/kiro/scripts/1.0/webview_send_message.js +8 -8
  98. package/providers/_builtin/ide/kiro/scripts/1.0/webview_set_mode.js +1 -1
  99. package/providers/_builtin/ide/kiro/scripts/1.0/webview_set_model.js +1 -1
  100. package/providers/_builtin/ide/kiro/scripts/1.0/webview_switch_session.js +3 -3
  101. package/providers/_builtin/ide/pearai/.tmp/after_rich.json +157 -0
  102. package/providers/_builtin/ide/pearai/.tmp/after_rich_raw.json +161 -0
  103. package/providers/_builtin/ide/pearai/.tmp/after_switch.json +592 -0
  104. package/providers/_builtin/ide/pearai/.tmp/after_switch_raw.json +596 -0
  105. package/providers/_builtin/ide/pearai/.tmp/home_dump_raw.json +176 -0
  106. package/providers/_builtin/ide/pearai/.tmp/items_raw.json +778 -0
  107. package/providers/_builtin/ide/pearai/.tmp/webview_dump.json +157 -0
  108. package/providers/_builtin/ide/pearai/.tmp/webview_dump_raw.json +161 -0
  109. package/providers/_builtin/ide/pearai/provider.json +1 -3
  110. package/providers/_builtin/ide/pearai/scripts/1.0/focus_editor.js +12 -16
  111. package/providers/_builtin/ide/pearai/scripts/1.0/list_models.js +45 -0
  112. package/providers/_builtin/ide/pearai/scripts/1.0/list_modes.js +44 -0
  113. package/providers/_builtin/ide/pearai/scripts/1.0/list_sessions.js +82 -27
  114. package/providers/_builtin/ide/pearai/scripts/1.0/new_session.js +26 -43
  115. package/providers/_builtin/ide/pearai/scripts/1.0/open_panel.js +10 -33
  116. package/providers/_builtin/ide/pearai/scripts/1.0/read_chat.js +169 -0
  117. package/providers/_builtin/ide/pearai/scripts/1.0/resolve_action.js +47 -41
  118. package/providers/_builtin/ide/pearai/scripts/1.0/scripts.js +36 -7
  119. package/providers/_builtin/ide/pearai/scripts/1.0/send_message.js +97 -22
  120. package/providers/_builtin/ide/pearai/scripts/1.0/set_mode.js +51 -0
  121. package/providers/_builtin/ide/pearai/scripts/1.0/set_model.js +54 -0
  122. package/providers/_builtin/ide/pearai/scripts/1.0/switch_session.js +81 -0
  123. package/providers/_builtin/ide/trae/scripts/1.0/focus_editor.js +2 -2
  124. package/providers/_builtin/ide/trae/scripts/1.0/list_chats.js +2 -2
  125. package/providers/_builtin/ide/trae/scripts/1.0/new_session.js +4 -4
  126. package/providers/_builtin/ide/trae/scripts/1.0/open_panel.js +6 -6
  127. package/providers/_builtin/ide/trae/scripts/1.0/read_chat.js +13 -13
  128. package/providers/_builtin/ide/trae/scripts/1.0/resolve_action.js +3 -3
  129. package/providers/_builtin/ide/trae/scripts/1.0/send_message.js +11 -11
  130. package/providers/_builtin/ide/trae/scripts/1.0/switch_session.js +2 -2
  131. package/providers/_builtin/ide/windsurf/scripts/1.0/focus_editor.js +6 -6
  132. package/providers/_builtin/ide/windsurf/scripts/1.0/list_chats.js +4 -4
  133. package/providers/_builtin/ide/windsurf/scripts/1.0/list_sessions.js +6 -6
  134. package/providers/_builtin/ide/windsurf/scripts/1.0/new_session.js +9 -9
  135. package/providers/_builtin/ide/windsurf/scripts/1.0/open_panel.js +6 -6
  136. package/providers/_builtin/ide/windsurf/scripts/1.0/resolve_action.js +8 -8
  137. package/providers/_builtin/ide/windsurf/scripts/1.0/switch_session.js +8 -8
  138. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/focus_editor.js +6 -6
  139. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/list_chats.js +12 -12
  140. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/new_session.js +15 -15
  141. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/open_panel.js +10 -10
  142. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/read_chat.js +33 -33
  143. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/resolve_action.js +6 -6
  144. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/send_message.js +16 -16
  145. package/providers/_builtin/ide/windsurf/scripts/1.0.bak/switch_session.js +7 -7
  146. package/providers/_builtin/registry.json +76 -3
  147. package/src/cli-adapters/provider-cli-adapter.ts +267 -251
  148. package/src/cli-adapters/terminal-screen.ts +268 -0
  149. package/src/commands/chat-commands.ts +41 -15
  150. package/src/commands/cli-manager.ts +4 -2
  151. package/src/daemon/dev-server.ts +245 -35
  152. package/src/providers/acp-provider-instance.ts +1 -1
  153. package/src/providers/cli-provider-instance.ts +21 -8
  154. package/src/providers/provider-loader.ts +3 -2
  155. package/providers/_builtin/ide/pearai/scripts/1.0/webview_list_models.js +0 -43
  156. package/providers/_builtin/ide/pearai/scripts/1.0/webview_list_modes.js +0 -35
  157. package/providers/_builtin/ide/pearai/scripts/1.0/webview_list_sessions.js +0 -62
  158. package/providers/_builtin/ide/pearai/scripts/1.0/webview_new_session.js +0 -49
  159. package/providers/_builtin/ide/pearai/scripts/1.0/webview_read_chat.js +0 -92
  160. package/providers/_builtin/ide/pearai/scripts/1.0/webview_resolve_action.js +0 -59
  161. package/providers/_builtin/ide/pearai/scripts/1.0/webview_send_message.js +0 -72
  162. package/providers/_builtin/ide/pearai/scripts/1.0/webview_set_mode.js +0 -36
  163. package/providers/_builtin/ide/pearai/scripts/1.0/webview_set_model.js +0 -36
  164. package/providers/_builtin/ide/pearai/scripts/1.0/webview_switch_session.js +0 -34
@@ -1,16 +1,16 @@
1
1
  /**
2
2
  * Cline v1 — send_message
3
3
  *
4
- * 구조:
5
- * 1. outer webview → inner iframe contentDocument 접근
6
- * 2. data-testid="chat-input" textarea 값 설정 (React controlled)
7
- * 3. React Fiber에서 onSend 함수 찾아 직접 호출 (가장 확실한 방법)
8
- * 4. Fallback: data-testid="send-button" 클릭 or Enter
4
+ * structure:
5
+ * 1. outer webview → access inner iframe contentDocument
6
+ * 2. Set value on data-testid="chat-input" textarea (React controlled)
7
+ * 3. React Fiberfrom Find onSend function and call directly (most reliable)
8
+ * 4. Fallback: data-testid="send-button" click or Enter key
9
9
  *
10
- * ⚠️ Cline send-button DIV 태그이며, 일반 click 이벤트로는 React가
11
- * 전송을 처리하지 않음. Fiber onSend() 직접 호출해야 정확하게 동작.
10
+ * ⚠️ Cline send-button is a DIV tag, and React normal click event
11
+ * Does not handle sending. Must call Fiber onSend() directly for correct behavior.
12
12
  *
13
- * 최종 확인: 2026-03-07
13
+ * final Check: 2026-03-07
14
14
  */
15
15
  (async () => {
16
16
  try {
@@ -18,7 +18,7 @@
18
18
  const doc = inner?.contentDocument || inner?.contentWindow?.document;
19
19
  if (!doc) return 'error: no doc';
20
20
 
21
- // ─── 1. 입력 필드 찾기 ───
21
+ // ─── 1. Find input field ───
22
22
  let target = doc.querySelector('[data-testid="chat-input"]');
23
23
  if (!target) {
24
24
  const textareas = doc.querySelectorAll('textarea');
@@ -31,7 +31,7 @@
31
31
  }
32
32
  if (!target) return 'error: no chat-input';
33
33
 
34
- // ─── 2. React controlled input 설정 ───
34
+ // ─── 2. Set React controlled input value ───
35
35
  const proto = inner.contentWindow?.HTMLTextAreaElement?.prototype
36
36
  || HTMLTextAreaElement.prototype;
37
37
  const nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value')?.set;
@@ -42,14 +42,14 @@
42
42
  target.value = ${ MESSAGE };
43
43
  }
44
44
 
45
- // React 이벤트 트리거
45
+ // Trigger React event
46
46
  target.dispatchEvent(new Event('input', { bubbles: true }));
47
47
  target.dispatchEvent(new Event('change', { bubbles: true }));
48
48
 
49
- // React setState 반영 대기
49
+ // Wait for React setState to reflect
50
50
  await new Promise(r => setTimeout(r, 300));
51
51
 
52
- // ─── 3. Fiber onSend 직접 호출 (최우선) ───
52
+ // ─── 3. Fiber onSend Call directly (first) ───
53
53
  const allEls = doc.querySelectorAll('*');
54
54
  for (const el of allEls) {
55
55
  const fk = Object.keys(el).find(k => k.startsWith('__reactFiber'));
@@ -65,7 +65,7 @@
65
65
  }
66
66
  }
67
67
 
68
- // ─── 4. Fallback: send-button 클릭 ───
68
+ // ─── 4. Fallback: send-button click ───
69
69
  const sendBtn = doc.querySelector('[data-testid="send-button"]');
70
70
  if (sendBtn) {
71
71
  try {
@@ -81,7 +81,7 @@
81
81
  } catch (e) { }
82
82
  }
83
83
 
84
- // ─── 5. 최후 Fallback: Enter ───
84
+ // ─── 5. Final Fallback: Enter key ───
85
85
  target.focus();
86
86
  target.dispatchEvent(new KeyboardEvent('keydown', {
87
87
  key: 'Enter', code: 'Enter', keyCode: 13,
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Cline — set_mode
3
- * 모드 selector에서 지정된 모드 선택
3
+ * mode selectorfrom Select specified mode
4
4
  * ${MODE} → JSON.stringify(modeName)
5
5
  * → { success: boolean }
6
6
  */
@@ -14,11 +14,11 @@
14
14
  const trigger = doc.querySelector('[data-testid="mode-selector-trigger"], [data-testid="mode-switch"]');
15
15
  if (!trigger) return JSON.stringify({ success: false, error: 'no mode trigger' });
16
16
 
17
- // 드롭다운 열기
17
+ // Open dropdown
18
18
  trigger.click();
19
19
  await new Promise(r => setTimeout(r, 300));
20
20
 
21
- // 옵션에서 타겟 모드 찾기
21
+ // Search target mode from options
22
22
  const options = doc.querySelectorAll('[data-testid*="mode-option"], [role="option"], [class*="dropdown"] [class*="item"], [class*="listbox"] [class*="option"]');
23
23
  for (const opt of options) {
24
24
  const text = (opt.textContent || '').trim();
@@ -29,7 +29,7 @@
29
29
  }
30
30
  }
31
31
 
32
- // 닫기
32
+ // close
33
33
  doc.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
34
34
  return JSON.stringify({ success: false, error: 'mode not found: ' + target });
35
35
  } catch (e) { return JSON.stringify({ success: false, error: e.message }); }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Cline — set_model
3
- * 드롭다운에서 지정된 모델 선택
3
+ * from Select specified model
4
4
  * ${MODEL} → JSON.stringify(modelName)
5
5
  * → { success: boolean }
6
6
  */
@@ -14,11 +14,11 @@
14
14
  const trigger = doc.querySelector('[data-testid="model-selector"], [data-testid*="model-dropdown"], [data-testid="dropdown-trigger"]');
15
15
  if (!trigger) return JSON.stringify({ success: false, error: 'no model trigger' });
16
16
 
17
- // 드롭다운 열기
17
+ // Open dropdown
18
18
  trigger.click();
19
19
  await new Promise(r => setTimeout(r, 300));
20
20
 
21
- // 옵션에서 타겟 모델 찾기
21
+ // Search target model from options
22
22
  const options = doc.querySelectorAll('[data-testid*="dropdown-option"], [role="option"], [class*="dropdown"] [class*="item"], [class*="listbox"] [class*="option"]');
23
23
  for (const opt of options) {
24
24
  const text = (opt.textContent || '').trim();
@@ -29,7 +29,7 @@
29
29
  }
30
30
  }
31
31
 
32
- // 닫기
32
+ // close
33
33
  doc.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
34
34
  return JSON.stringify({ success: false, error: 'model not found: ' + target });
35
35
  } catch (e) { return JSON.stringify({ success: false, error: e.message }); }
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * Cline v1 — switch_session (Fiber hooks → showTaskWithId gRPC)
3
3
  *
4
- * 전략:
5
- * 1. Fiber DFS에서 taskHistory, showHistoryView 찾기
6
- * 2. Done 클릭으로 히스토리 닫기 → showHistoryView() → 재열기
7
- * 3. Virtuoso 렌더링 대기 (최대 5초, 500ms 간격 재시도 + scroll/resize 트리거)
8
- * 4. 렌더된 아이템의 Fiber hooks에서 showTaskWithId 콜백 추출
9
- * 5. showTaskWithId(taskId) 호출gRPC로 Task 전환
4
+ * strategy:
5
+ * 1. Find taskHistory, showHistoryView in Fiber DFS
6
+ * 2. Done by clicking history close → showHistoryView() → reopen
7
+ * 3. Virtuoso Render wait (max 5 secs, retry every 500ms + scroll/resize )
8
+ * 4. Rendered item Fiber hooksfrom showTaskWithId callback extract
9
+ * 5. showTaskWithId(taskId) callSwitch Task via gRPC
10
10
  *
11
- * 파라미터: ${ SESSION_ID } — task ID (숫자 문자열) 또는 제목
12
- * 최종 확인: 2026-03-07
11
+ * Parameter: ${ SESSION_ID } — task ID (number string) or title
12
+ * final Check: 2026-03-07
13
13
  */
14
14
  (async () => {
15
15
  try {
@@ -31,7 +31,7 @@
31
31
  return fiber;
32
32
  };
33
33
 
34
- // ─── 1. Fiber DFS에서 taskHistory, showHistoryView 찾기 ───
34
+ // ─── 1. Find taskHistory, showHistoryView in Fiber DFS ───
35
35
  const root = doc.getElementById('root');
36
36
  if (!root) return false;
37
37
  const rootFk = findFiberKey(root);
@@ -73,7 +73,7 @@
73
73
 
74
74
  if (!taskHistory || taskHistory.length === 0) return false;
75
75
 
76
- // 대상 task 찾기 (ID 또는 제목 매칭)
76
+ // target task search (ID or title matching)
77
77
  const norm = s => (s || '').trim().toLowerCase().replace(/\s+/g, ' ');
78
78
  const idNorm = norm(sessionId);
79
79
  let targetTask = taskHistory.find(t => String(t.id) === sessionId);
@@ -86,9 +86,9 @@
86
86
  if (!targetTask) return false;
87
87
  const targetId = String(targetTask.id);
88
88
 
89
- // ─── 2. showHistoryView 없으면 Fiber root DFS 재시도 ───
89
+ // ─── 2. showHistoryView Fiber root DFS retry ───
90
90
  if (!showHistoryView) {
91
- // DOM 요소 기반 탐색 (Fiber root에서 찾은 경우)
91
+ // DOM element-based search (when not found from Fiber root)
92
92
  for (const el of doc.querySelectorAll('*')) {
93
93
  let fiber = getFiber(el);
94
94
  for (let d = 0; d < 20 && fiber; d++) {
@@ -104,8 +104,8 @@
104
104
  }
105
105
  if (!showHistoryView) return false;
106
106
 
107
- // ─── 3. 히스토리 토글 (닫기열기) ───
108
- // Done 버튼으로 닫기
107
+ // ─── 3. history toggle (closeopen) ───
108
+ // Done via button close
109
109
  const doneBtn = Array.from(doc.querySelectorAll('button'))
110
110
  .find(b => b.textContent.trim() === 'Done' && b.offsetHeight > 0);
111
111
  if (doneBtn) {
@@ -113,14 +113,14 @@
113
113
  await new Promise(r => setTimeout(r, 400));
114
114
  }
115
115
 
116
- // 히스토리 열기
116
+ // history open
117
117
  showHistoryView();
118
118
 
119
- // ─── 4. Virtuoso 렌더링 대기 (최대 5초, 500ms 간격 재시도) ───
119
+ // ─── 4. Virtuoso Render wait (max 5 secs, retry every 500ms) ───
120
120
  let il = null;
121
121
  for (let attempt = 0; attempt < 10; attempt++) {
122
122
  await new Promise(r => setTimeout(r, 500));
123
- // scroll + resize 트리거
123
+ // Trigger scroll + resize
124
124
  const sd = doc.querySelector('.overflow-y-scroll, [data-testid=virtuoso-scroller]');
125
125
  if (sd) {
126
126
  sd.dispatchEvent(new Event('scroll', { bubbles: true }));
@@ -132,12 +132,12 @@
132
132
 
133
133
  if (!il || il.children.length === 0) return false;
134
134
 
135
- // ─── 5. Fiber hooks에서 showTaskWithId 추출 ───
135
+ // ─── 5. Fiber hooksfrom showTaskWithId extract ───
136
136
  let showTaskFn = null;
137
137
  const findFiberKeySimple = (el) => Object.keys(el).find(k => k.startsWith('__reactFiber'));
138
138
 
139
139
  for (const child of il.children) {
140
- // child 또는 child 내부의 모든 요소에서 탐색
140
+ // Search in child or all elements inside child
141
141
  const targets = [child, ...child.querySelectorAll('*')];
142
142
  for (const el of targets) {
143
143
  const fk = findFiberKeySimple(el);
@@ -168,7 +168,7 @@
168
168
  if (showTaskFn) break;
169
169
  }
170
170
 
171
- // Fallback: Fiber DFS 전체 탐색
171
+ // Fallback: Fiber DFS all search
172
172
  if (!showTaskFn) {
173
173
  const visited2 = new Set();
174
174
  const dfs2 = (f, depth) => {
@@ -193,7 +193,7 @@
193
193
 
194
194
  if (!showTaskFn) return false;
195
195
 
196
- // ─── 6. showTaskWithId(targetId) 호출 ───
196
+ // ─── 6. showTaskWithId(targetId) call ───
197
197
  try {
198
198
  await showTaskFn(targetId);
199
199
  } catch {
@@ -49,13 +49,13 @@
49
49
  const newChatBtn = allButtons.find(b => {
50
50
  const label = (b.getAttribute('aria-label') || '').toLowerCase();
51
51
  const text = (b.textContent || '').trim().toLowerCase();
52
- return label.includes('new') || label.includes('') || text.includes('new') || text.includes('');
52
+ return label.includes('new') || label.includes('new') || text.includes('new') || text.includes('new');
53
53
  });
54
54
 
55
55
  // 6. Look for back/navigation buttons
56
56
  const backBtn = allButtons.find(b => {
57
57
  const label = (b.getAttribute('aria-label') || '').toLowerCase();
58
- return label.includes('back') || label.includes('뒤로') || label.includes('돌아가');
58
+ return label.includes('back') || label.includes('back') || label.includes('go back');
59
59
  });
60
60
 
61
61
  return JSON.stringify({
@@ -35,7 +35,7 @@
35
35
  const items = menu.querySelectorAll('[role="menuitem"], [role="menuitemradio"], div[class*="cursor-interaction"]');
36
36
  for (const item of items) {
37
37
  const text = (item.textContent || '').trim();
38
- if (text && text.length > 0 && text.length < 60 && !text.includes('모델 선택') && !text.includes('Model')) {
38
+ if (text && text.length > 0 && text.length < 60 && !text.includes('Select model') && !text.includes('Model')) {
39
39
  models.push({
40
40
  name: text,
41
41
  selected: text === currentModel,
@@ -109,7 +109,7 @@
109
109
  text &&
110
110
  text.length > 0 &&
111
111
  text.length < 80 &&
112
- !/^모델|^model\b|^select\b/i.test(text)
112
+ !/^model|^model\b|^select\b/i.test(text)
113
113
  ) {
114
114
  collected.push(text);
115
115
  }
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Codex Extension — new_session
3
- * Clicks the " 채팅" / "New chat" button
3
+ * Clicks the "New chat" / "New chat" button
4
4
  */
5
5
  (() => {
6
6
  try {
7
7
  const buttons = Array.from(document.querySelectorAll('button')).filter(b => b.offsetWidth > 0);
8
8
  const newChatBtn = buttons.find(b => {
9
9
  const label = (b.getAttribute('aria-label') || '').toLowerCase();
10
- return label.includes(' 채팅') || label.includes('new chat') || label.includes('new');
10
+ return label.includes('New chat') || label.includes('new chat') || label.includes('new');
11
11
  });
12
12
 
13
13
  if (newChatBtn) {
@@ -51,7 +51,7 @@
51
51
 
52
52
  const headerEl = doc.querySelector('[style*="view-transition-name: header-title"]');
53
53
  const headerText = (headerEl?.textContent || '').trim();
54
- const isTaskList = headerText === '작업' || headerText === 'Tasks';
54
+ const isTaskList = headerText === 'Tasks' || headerText === 'Tasks';
55
55
 
56
56
  // If we accidentally evaluated inside the Tasks webview instead of Chat, tell Daemon to try the next matching webview
57
57
  if (isTaskList) {
@@ -314,7 +314,7 @@
314
314
 
315
315
  const buttonLabels = buttons.map(getBtnLabel).map(t => t.toLowerCase());
316
316
 
317
- if (buttonLabels.some(l => l.includes('cancel') || l.includes('취소') || l.includes('stop') || l.includes('중지'))) {
317
+ if (buttonLabels.some(l => l.includes('cancel') || l.includes('cancel') || l.includes('stop') || l.includes('stop'))) {
318
318
  status = 'generating';
319
319
  }
320
320
 
@@ -365,8 +365,8 @@
365
365
  if (approvalArea) {
366
366
  // ─── Codex Approval Panel (request-input-panel based) ───
367
367
  // The approval form has:
368
- // - Option items as plain divs (e.g., "1.\n예", "2.\n네,...", "3.\n아니요,...")
369
- // - Action buttons (e.g., "건너뛰기", "제출⏎") as <button> elements
368
+ // - Option items as plain divs (e.g., "1.\nyes", "2.\nyes,...", "3.\nno,...")
369
+ // - Action buttons (e.g., "skip", "Submit⏎") as <button> elements
370
370
  // We need to extract BOTH for the dashboard.
371
371
 
372
372
  // Find parent container that has all options (level 3 from textarea, btns >= 4)
@@ -399,7 +399,7 @@
399
399
 
400
400
  // Extract numbered option text items (the entire panel text, split by option numbering)
401
401
  const panelText = (approvalArea.innerText || '').trim();
402
- // Parse "1.\n예\n2.\n네,...\n3.\n아니요,...\n건너뛰기\n제출⏎" format
402
+ // Parse "1.\nyes\n2.\nyes,...\n3.\nno,...\nskip\nSubmit⏎" format
403
403
  const optionMatches = panelText.match(/\d+\.\n[^\n]+(?:\n[^\d][^\n]*)*/g) || [];
404
404
  let options = optionMatches.map(o => o.replace(/\n/g, '').trim()).filter(o => o.length > 0);
405
405
 
@@ -492,7 +492,7 @@
492
492
  }
493
493
 
494
494
  // ─── 6. Task info ───
495
- const taskBtn = doc.querySelector('[aria-label*="작업"], [aria-label*="task" i]');
495
+ const taskBtn = doc.querySelector('[aria-label*="Tasks"], [aria-label*="task" i]');
496
496
  const taskInfo = taskBtn ? (taskBtn.textContent || '').trim() : '';
497
497
 
498
498
  return JSON.stringify({
@@ -17,9 +17,9 @@
17
17
 
18
18
  const actionLower = (action || '').toLowerCase();
19
19
  const patterns = {
20
- approve: /^(approve|accept|allow|confirm|run|proceed|yes|승인|허용|실행|확인)/i,
20
+ approve: /^(approve|accept|allow|confirm|run|proceed|yes|approval|허용|execute|Check)/i,
21
21
  deny: /^(deny|reject|no|거부|아니오)/i,
22
- cancel: /^(cancel|stop|취소|중지)/i,
22
+ cancel: /^(cancel|stop|cancel|stop)/i,
23
23
  };
24
24
 
25
25
  // Determine what to search for: use buttonText if provided, otherwise match action pattern
@@ -63,7 +63,7 @@
63
63
  const clickedText = getBtnLabel(targetBtn);
64
64
  if (/^\d+\./.test(clickedText)) {
65
65
  setTimeout(() => {
66
- const submitBtn = buttons.find(b => /^(제출|submit)/i.test(getBtnLabel(b)));
66
+ const submitBtn = buttons.find(b => /^(Submit|submit)/i.test(getBtnLabel(b)));
67
67
  if (submitBtn && submitBtn !== targetBtn) submitBtn.click();
68
68
  }, 150);
69
69
  }
@@ -70,7 +70,7 @@
70
70
 
71
71
  const available = Array.from(items)
72
72
  .map(el => (el.textContent || '').trim())
73
- .filter(t => t.length > 0 && t.length < 60 && !t.includes('모델 선택'));
73
+ .filter(t => t.length > 0 && t.length < 60 && !t.includes('Select model'));
74
74
 
75
75
  resolve(JSON.stringify({
76
76
  success: false,
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Cursor v1 — focus_editor
3
3
  *
4
- * CURSOR.md 4-5: 셀렉터 우선순위
4
+ * CURSOR.md 4-5: Selector priority
5
5
  * [contenteditable="true"][role="textbox"]
6
6
  * → .chat-input textarea
7
7
  * → .composer-input
8
8
  * → textarea
9
9
  *
10
- * 최종 확인: 2026-03-06
10
+ * final Check: 2026-03-06
11
11
  */
12
12
  (() => {
13
13
  const editor = document.querySelector('[contenteditable="true"][role="textbox"]')
@@ -1,29 +1,29 @@
1
1
  /**
2
- * Antigravity v1 — list_chats (v3 — 강화된 셀렉터)
2
+ * Antigravity v1 — list_chats (v3 — enhanced selector)
3
3
  *
4
- * 히스토리 토글을 클릭하여 대화 목록 패널을 열고,
5
- * DOM에서 직접 대화 목록을 파싱한 패널을 닫고 결과를 반환.
4
+ * history toggle click open conversation list panel,
5
+ * DOMfrom parse conversation list directly, close panel and return results.
6
6
  *
7
- * DOM 구조 (2026-03-03 확인):
8
- * 토글: [data-past-conversations-toggle="true"]
9
- * 패널: input[placeholder="Select a conversation"] 근처
10
- * 섹션 헤더: .opacity-50 텍스트 (Current, Recent, Other)
11
- * 행: .cursor-pointer.justify-between.rounded-md
12
- * ├── 제목: span > span
13
- * ├── 워크스페이스: .opacity-50.truncate > span
14
- * └── 시간: .opacity-50.flex-shrink-0
7
+ * DOM structure (2026-03-03 Check):
8
+ * toggle: [data-past-conversations-toggle="true"]
9
+ * panel: input[placeholder="Select a conversation"] near
10
+ * section header: .opacity-50 text (Current, Recent, Other)
11
+ * row: .cursor-pointer.justify-between.rounded-md
12
+ * ├── Title: span > span
13
+ * ├── workspace: .opacity-50.truncate > span
14
+ * └── time: .opacity-50.flex-shrink-0
15
15
  */
16
16
  (async () => {
17
17
  const sleep = (ms) => new Promise(r => setTimeout(r, ms));
18
18
 
19
19
  try {
20
- // 1. 토글 클릭하여 히스토리 패널 열기
20
+ // 1. toggle click history panel open
21
21
  const toggle = document.querySelector('[data-past-conversations-toggle="true"]');
22
22
  if (!toggle) return [];
23
23
  toggle.click();
24
24
  await sleep(1000);
25
25
 
26
- // 2. 정확한 검색 input 찾기 (placeholder 정확 매칭)
26
+ // 2. Exact search input search (placeholder matching)
27
27
  const allInputs = document.querySelectorAll('input[type="text"]');
28
28
  let searchInput = null;
29
29
  for (const inp of allInputs) {
@@ -38,12 +38,12 @@
38
38
  return [];
39
39
  }
40
40
 
41
- // 3. "Current" 텍스트를 기준으로 대화 목록 스크롤 컨테이너 찾기
41
+ // 3. "Current" Search conversation list scroll container based on text
42
42
  let container = null;
43
43
  const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
44
44
  while (walker.nextNode()) {
45
45
  if (walker.currentNode.textContent.trim() === 'Current') {
46
- // "Current" 텍스트의 조상 — overflow-auto/scroll 있는 스크롤 컨테이너까지 올라감
46
+ // "Current" text ancestorclimb up to overflow-auto/scroll container
47
47
  let el = walker.currentNode.parentElement;
48
48
  for (let i = 0; i < 10 && el; i++) {
49
49
  const cls = (el.className || '');
@@ -53,7 +53,7 @@
53
53
  }
54
54
  el = el.parentElement;
55
55
  }
56
- // overflow 컨테이너 찾으면 행이 가장 많은 조상 사용
56
+ // If overflow container not found, use ancestor with most rows
57
57
  if (!container) {
58
58
  el = walker.currentNode.parentElement;
59
59
  let bestEl = null;
@@ -72,7 +72,7 @@
72
72
  }
73
73
  }
74
74
 
75
- // 폴백: "Current" 텍스트가 없을 ( 대화 직후 ) searchInput 기반
75
+ // fallback: "Current" textwhen absent (new conversation etc. after) searchInput based
76
76
  if (!container && searchInput) {
77
77
  let el = searchInput.parentElement;
78
78
  for (let i = 0; i < 10 && el; i++) {
@@ -93,7 +93,7 @@
93
93
  return [];
94
94
  }
95
95
 
96
- // 4. 대화 파싱
96
+ // 4. conversation row parsing
97
97
  const rows = container.querySelectorAll('[class*="cursor-pointer"][class*="justify-between"][class*="rounded-md"]');
98
98
  const chats = [];
99
99
 
@@ -126,7 +126,7 @@
126
126
  });
127
127
  }
128
128
 
129
- // 5. 패널 닫기
129
+ // 5. panel close
130
130
  document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', code: 'Escape', bubbles: true }));
131
131
 
132
132
  return chats;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Antigravity — list_models
3
- * 모델 드롭다운 트리거 버튼 + 항목 목록 추출
3
+ * model button + list extract
4
4
  *
5
5
  * Version compatibility:
6
6
  * v0 (old): .flex.min-w-0.max-w-full.cursor-pointer.items-center (exact CSS selector works)
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Antigravity — list_modes
3
- * 현재 모드 + 사용 가능한 모드 목록 추출
3
+ * Current mode + use Mode list extract
4
4
  *
5
5
  * Version compatibility:
6
6
  * v0 (old): span-based mode button (plain text, no opacity class)
@@ -1,32 +1,32 @@
1
1
  /**
2
2
  * Antigravity v1 — new_session
3
3
  *
4
- * Antigravity Agent 패널 상단의 + 아이콘 클릭으로 대화 시작.
4
+ * Antigravity Agent panel + icon by clicking new conversation start.
5
5
  *
6
- * DOM 구조:
7
- * .antigravity-agent-side-panel 상단 아이콘
8
- * [0] <a> + (Plus) → 대화 이것을 클릭
9
- * [1] <a> 히스토리 (data-past-conversations-toggle)
10
- * [2] <div> 더보기 (⋯)
11
- * [3] <a> 닫기 (✕)
6
+ * DOM structure:
7
+ * .antigravity-agent-side-panel top icon bar
8
+ * [0] <a> + (Plus) → new conversation click
9
+ * [1] <a> history (data-past-conversations-toggle)
10
+ * [2] <div> more (⋯)
11
+ * [3] <a> close (✕)
12
12
  *
13
- * 전략:
14
- * 1. 히스토리 토글의 이전 형제 <a> 클릭 (Plus 아이콘)
15
- * 2. SVG path "M12 4.5v15m7.5-7.5h-15" (+ 모양) 찾기
16
- * 3. 패널 상단 첫 번째 <a> 클릭 폴백
13
+ * strategy:
14
+ * 1. Previous sibling of history toggle <a> click (Plus icon)
15
+ * 2. Find SVG path "M12 4.5v15m7.5-7.5h-15" (+ shape)
16
+ * 3. panel <a> click fallback
17
17
  *
18
- * 최종 확인: 2026-03-11
18
+ * final Check: 2026-03-11
19
19
  */
20
20
  (() => {
21
21
  try {
22
- // ─── 1. 히스토리 토글의 이전 형제 요소 (Plus 아이콘) ───
22
+ // ─── 1. Previous sibling of history toggle (Plus icon) ───
23
23
  const toggle = document.querySelector('[data-past-conversations-toggle="true"]');
24
24
  if (toggle) {
25
25
  const parent = toggle.parentElement;
26
26
  if (parent) {
27
27
  const children = Array.from(parent.children).filter(c => c.offsetWidth > 0);
28
28
  const toggleIdx = children.indexOf(toggle);
29
- // Plus 아이콘은 히스토리 바로
29
+ // Plus icon is right before history
30
30
  if (toggleIdx > 0) {
31
31
  const plusBtn = children[toggleIdx - 1];
32
32
  plusBtn.click();
@@ -35,7 +35,7 @@
35
35
  }
36
36
  }
37
37
 
38
- // ─── 2. SVG path 기반: Plus(+) 모양 SVG ───
38
+ // ─── 2. SVG path based: Plus(+) shape SVG ───
39
39
  const panel = document.querySelector('.antigravity-agent-side-panel') || document.querySelector('#conversation');
40
40
  if (panel) {
41
41
  const svgs = panel.querySelectorAll('svg');
@@ -43,7 +43,7 @@
43
43
  const path = svg.querySelector('path');
44
44
  if (path) {
45
45
  const d = path.getAttribute('d') || '';
46
- // Plus 아이콘 SVG: 세로선 + 가로선
46
+ // Plus icon SVG: +
47
47
  if (d.includes('v15') && d.includes('h-15')) {
48
48
  const clickable = svg.closest('a') || svg.closest('button') || svg.parentElement;
49
49
  if (clickable) {
@@ -55,7 +55,7 @@
55
55
  }
56
56
  }
57
57
 
58
- // ─── 3. 폴백: 패널 상단 영역의 첫 번째 <a> ───
58
+ // ─── 3. fallback: panel area <a> ───
59
59
  if (panel) {
60
60
  const topLinks = Array.from(panel.querySelectorAll('a')).filter(a => {
61
61
  const r = a.getBoundingClientRect();