@xxmachina/components 19.51.0 → 19.81.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 (118) hide show
  1. package/fesm2022/xxmachina-components-extras-flow.mjs +73 -140
  2. package/fesm2022/xxmachina-components-extras-flow.mjs.map +1 -1
  3. package/fesm2022/xxmachina-components-features-query.mjs +3 -29
  4. package/fesm2022/xxmachina-components-features-query.mjs.map +1 -1
  5. package/fesm2022/xxmachina-components-groups-query-form.mjs +0 -54
  6. package/fesm2022/xxmachina-components-groups-query-form.mjs.map +1 -1
  7. package/fesm2022/xxmachina-components-molecules-inline-edit-field.mjs +0 -1
  8. package/fesm2022/xxmachina-components-molecules-inline-edit-field.mjs.map +1 -1
  9. package/fesm2022/xxmachina-components-molecules-user-avatar-menu.mjs +96 -0
  10. package/fesm2022/xxmachina-components-molecules-user-avatar-menu.mjs.map +1 -0
  11. package/fesm2022/xxmachina-components-molecules-weekly-header.mjs +2 -2
  12. package/fesm2022/xxmachina-components-molecules-workspace-selector.mjs +123 -0
  13. package/fesm2022/xxmachina-components-molecules-workspace-selector.mjs.map +1 -0
  14. package/fesm2022/xxmachina-components-organisms-calendar-section.mjs +2 -2
  15. package/fesm2022/xxmachina-components-organisms-calendar-section.mjs.map +1 -1
  16. package/fesm2022/xxmachina-components-organisms-event-input-section.mjs +0 -1
  17. package/fesm2022/xxmachina-components-organisms-event-input-section.mjs.map +1 -1
  18. package/fesm2022/xxmachina-components-organisms-terminal-input-section.mjs +2 -18
  19. package/fesm2022/xxmachina-components-organisms-terminal-input-section.mjs.map +1 -1
  20. package/fesm2022/xxmachina-components-organisms-video-trimmer-section.mjs +0 -3
  21. package/fesm2022/xxmachina-components-organisms-video-trimmer-section.mjs.map +1 -1
  22. package/fesm2022/xxmachina-components-organisms-xterm.mjs +283 -261
  23. package/fesm2022/xxmachina-components-organisms-xterm.mjs.map +1 -1
  24. package/fesm2022/xxmachina-components-pages-command.mjs +3 -9
  25. package/fesm2022/xxmachina-components-pages-command.mjs.map +1 -1
  26. package/fesm2022/xxmachina-components-pages-query-v2.mjs +0 -13
  27. package/fesm2022/xxmachina-components-pages-query-v2.mjs.map +1 -1
  28. package/fesm2022/xxmachina-components-pages-query.mjs +3 -67
  29. package/fesm2022/xxmachina-components-pages-query.mjs.map +1 -1
  30. package/fesm2022/xxmachina-components-pages-thread.mjs +2 -18
  31. package/fesm2022/xxmachina-components-pages-thread.mjs.map +1 -1
  32. package/fesm2022/{xxmachina-components-routes-commands-command.routes-CSwIdXZg.mjs → xxmachina-components-routes-commands-command.routes-Ca2yVrwL.mjs} +1 -2
  33. package/fesm2022/xxmachina-components-routes-commands-command.routes-Ca2yVrwL.mjs.map +1 -0
  34. package/fesm2022/{xxmachina-components-routes-commands-pages.routes-j2xVop4W.mjs → xxmachina-components-routes-commands-pages.routes-COpFeEsz.mjs} +2 -2
  35. package/fesm2022/{xxmachina-components-routes-commands-pages.routes-j2xVop4W.mjs.map → xxmachina-components-routes-commands-pages.routes-COpFeEsz.mjs.map} +1 -1
  36. package/fesm2022/xxmachina-components-routes-commands.mjs +1 -2
  37. package/fesm2022/xxmachina-components-routes-commands.mjs.map +1 -1
  38. package/fesm2022/xxmachina-components-routes-pages.mjs +0 -1
  39. package/fesm2022/xxmachina-components-routes-pages.mjs.map +1 -1
  40. package/fesm2022/xxmachina-components-routes-queries.mjs +0 -2
  41. package/fesm2022/xxmachina-components-routes-queries.mjs.map +1 -1
  42. package/fesm2022/{xxmachina-components-routes-query-pages.routes-CxTbOJDQ.mjs → xxmachina-components-routes-query-pages.routes-BNuONo3g.mjs} +1 -5
  43. package/fesm2022/xxmachina-components-routes-query-pages.routes-BNuONo3g.mjs.map +1 -0
  44. package/fesm2022/xxmachina-components-routes-query.mjs +1 -1
  45. package/fesm2022/{xxmachina-components-routes-resources-pages.routes-CRXxavHb.mjs → xxmachina-components-routes-resources-pages.routes-DEu2qpeu.mjs} +2 -2
  46. package/fesm2022/{xxmachina-components-routes-resources-pages.routes-CRXxavHb.mjs.map → xxmachina-components-routes-resources-pages.routes-DEu2qpeu.mjs.map} +1 -1
  47. package/fesm2022/{xxmachina-components-routes-resources-resource.routes-CkkmqB2_.mjs → xxmachina-components-routes-resources-resource.routes-CWxi2agj.mjs} +1 -2
  48. package/fesm2022/xxmachina-components-routes-resources-resource.routes-CWxi2agj.mjs.map +1 -0
  49. package/fesm2022/xxmachina-components-routes-resources.mjs +1 -1
  50. package/fesm2022/xxmachina-components-routes-transformer.mjs +0 -1
  51. package/fesm2022/xxmachina-components-routes-transformer.mjs.map +1 -1
  52. package/fesm2022/xxmachina-components-services-forms-query.mjs +1 -1
  53. package/fesm2022/xxmachina-components-services-forms-query.mjs.map +1 -1
  54. package/fesm2022/xxmachina-components-services-graphql.mjs +0 -4
  55. package/fesm2022/xxmachina-components-services-graphql.mjs.map +1 -1
  56. package/fesm2022/xxmachina-components-services-json-schema.mjs +6 -12
  57. package/fesm2022/xxmachina-components-services-json-schema.mjs.map +1 -1
  58. package/fesm2022/xxmachina-components-services-query.mjs +0 -7
  59. package/fesm2022/xxmachina-components-services-query.mjs.map +1 -1
  60. package/fesm2022/xxmachina-components-services-recording.mjs +0 -13
  61. package/fesm2022/xxmachina-components-services-recording.mjs.map +1 -1
  62. package/fesm2022/xxmachina-components-services-thread.mjs +0 -2
  63. package/fesm2022/xxmachina-components-services-thread.mjs.map +1 -1
  64. package/fesm2022/xxmachina-components-services-version.mjs +171 -0
  65. package/fesm2022/xxmachina-components-services-version.mjs.map +1 -0
  66. package/fesm2022/xxmachina-components-services-workspace-switcher.mjs +9 -0
  67. package/fesm2022/xxmachina-components-services-workspace-switcher.mjs.map +1 -0
  68. package/fesm2022/xxmachina-components-templates-agent.mjs +98 -146
  69. package/fesm2022/xxmachina-components-templates-agent.mjs.map +1 -1
  70. package/fesm2022/xxmachina-components-templates-background.mjs +10 -30
  71. package/fesm2022/xxmachina-components-templates-background.mjs.map +1 -1
  72. package/fesm2022/xxmachina-components-templates-env.mjs +295 -0
  73. package/fesm2022/xxmachina-components-templates-env.mjs.map +1 -0
  74. package/fesm2022/xxmachina-components-templates-flow-nodes-issue.mjs.map +1 -1
  75. package/fesm2022/xxmachina-components-templates-flow.mjs +1 -1
  76. package/fesm2022/xxmachina-components-templates-flow.mjs.map +1 -1
  77. package/fesm2022/xxmachina-components-templates-machina-icon-button-menu.mjs +78 -0
  78. package/fesm2022/xxmachina-components-templates-machina-icon-button-menu.mjs.map +1 -0
  79. package/fesm2022/xxmachina-components.mjs +9 -10
  80. package/fesm2022/xxmachina-components.mjs.map +1 -1
  81. package/package.json +25 -1
  82. package/types/xxmachina-components-extras-flow.d.ts +8 -43
  83. package/types/xxmachina-components-extras-flow.d.ts.map +1 -1
  84. package/types/xxmachina-components-features-query.d.ts +3 -24
  85. package/types/xxmachina-components-features-query.d.ts.map +1 -1
  86. package/types/xxmachina-components-groups-query-form.d.ts +2 -2
  87. package/types/xxmachina-components-molecules-user-avatar-menu.d.ts +19 -0
  88. package/types/xxmachina-components-molecules-user-avatar-menu.d.ts.map +1 -0
  89. package/types/xxmachina-components-molecules-workspace-selector.d.ts +25 -0
  90. package/types/xxmachina-components-molecules-workspace-selector.d.ts.map +1 -0
  91. package/types/xxmachina-components-organisms-xterm.d.ts +130 -111
  92. package/types/xxmachina-components-organisms-xterm.d.ts.map +1 -1
  93. package/types/xxmachina-components-pages-query-v2.d.ts +0 -3
  94. package/types/xxmachina-components-pages-query-v2.d.ts.map +1 -1
  95. package/types/xxmachina-components-pages-query.d.ts +0 -19
  96. package/types/xxmachina-components-pages-query.d.ts.map +1 -1
  97. package/types/xxmachina-components-services-forms-query.d.ts +1 -1
  98. package/types/xxmachina-components-services-graphql.d.ts +0 -3
  99. package/types/xxmachina-components-services-graphql.d.ts.map +1 -1
  100. package/types/xxmachina-components-services-query.d.ts +0 -7
  101. package/types/xxmachina-components-services-query.d.ts.map +1 -1
  102. package/types/xxmachina-components-services-version.d.ts +32 -0
  103. package/types/xxmachina-components-services-version.d.ts.map +1 -0
  104. package/types/xxmachina-components-services-workspace-switcher.d.ts +17 -0
  105. package/types/xxmachina-components-services-workspace-switcher.d.ts.map +1 -0
  106. package/types/xxmachina-components-templates-agent.d.ts +2 -1
  107. package/types/xxmachina-components-templates-agent.d.ts.map +1 -1
  108. package/types/xxmachina-components-templates-env.d.ts +43 -0
  109. package/types/xxmachina-components-templates-env.d.ts.map +1 -0
  110. package/types/xxmachina-components-templates-flow-nodes-issue.d.ts +0 -2
  111. package/types/xxmachina-components-templates-flow-nodes-issue.d.ts.map +1 -1
  112. package/types/xxmachina-components-templates-machina-icon-button-menu.d.ts +18 -0
  113. package/types/xxmachina-components-templates-machina-icon-button-menu.d.ts.map +1 -0
  114. package/types/xxmachina-components.d.ts +2 -0
  115. package/types/xxmachina-components.d.ts.map +1 -1
  116. package/fesm2022/xxmachina-components-routes-commands-command.routes-CSwIdXZg.mjs.map +0 -1
  117. package/fesm2022/xxmachina-components-routes-query-pages.routes-CxTbOJDQ.mjs.map +0 -1
  118. package/fesm2022/xxmachina-components-routes-resources-resource.routes-CkkmqB2_.mjs.map +0 -1
@@ -20,11 +20,8 @@ import { svgToSixel, XtermOrganism } from '@xxmachina/components/organisms/xterm
20
20
  import { NavigatorOrganismStore } from '@ng-atomic/components/organisms/navigator';
21
21
  import chalk from 'chalk';
22
22
 
23
- /**
24
- * コアメッセージ(共通部分)
25
- */
26
23
  const CORE_MESSAGE = `${chalk.cyan('● What is Plan X?')}
27
- Plan X is a modern WebRTC-based session manager, an alternative to SSH and Tmux.
24
+ A modern SSH and tmux alternative, peer-to-peer over WebRTC.
28
25
  Connect any machine worldwide with a single command and deploy AI agents anywhere.
29
26
 
30
27
  ${chalk.cyan(`● Vision: ${chalk.bold.yellow('"The Planet is the Computer"')}`)}
@@ -42,18 +39,12 @@ ${chalk.cyan('● Meta-Kernel')}
42
39
  ${chalk.cyan('● Autopoiesis')}
43
40
  Self-improving, self-sustaining, self-replicating living system
44
41
  Agents evolve themselves and spawn new agents`;
45
- /**
46
- * ウェルカムメッセージ(起動時に表示)
47
- */
48
42
  const WELCOME_MESSAGE = `${chalk.cyan(`● Welcome to ${chalk.bold.yellow('Plan X')}`)}
49
43
 
50
44
  ${CORE_MESSAGE}
51
45
 
52
46
  ${chalk.gray('powered by Plan X Agent LLC.')}
53
47
  `;
54
- /**
55
- * aboutコマンドのメッセージ
56
- */
57
48
  const ABOUT_MESSAGE = `${chalk.bold.cyan('● Plan X - OS for the LLM Era')}
58
49
 
59
50
  ${CORE_MESSAGE}
@@ -82,10 +73,10 @@ class AgentTemplate extends NgAtomicComponent {
82
73
  store = inject(EntranceTemplateStore);
83
74
  cdr = inject(ChangeDetectorRef);
84
75
  app = inject(AppService);
85
- // 認証状態のチェック(非ログイン時は閉じるボタンを非表示)
86
76
  authState = injectAuthState();
87
77
  isLoggedIn = computed(() => !!this.authState(), ...(ngDevMode ? [{ debugName: "isLoggedIn" }] : []));
88
78
  endActions = input([], ...(ngDevMode ? [{ debugName: "endActions" }] : []));
79
+ hideInputArea = input(false, ...(ngDevMode ? [{ debugName: "hideInputArea" }] : []));
89
80
  navStartActions = computed(() => {
90
81
  if (!this.isLoggedIn())
91
82
  return [];
@@ -98,40 +89,31 @@ class AgentTemplate extends NgAtomicComponent {
98
89
  showCursor = false;
99
90
  cursorLeft = 60;
100
91
  cursorTop = 12;
101
- // xterm関連
102
92
  terminal;
103
93
  commandHistory = [];
104
94
  historyIndex = -1;
105
- // 入力管理
106
95
  currentInput = '';
107
96
  ngAfterViewInit() {
108
- // 入力フィールドにフォーカス
109
97
  setTimeout(() => {
110
98
  const textarea = this.inputField()?.nativeElement;
111
99
  if (textarea) {
112
100
  textarea.focus();
113
- // 初期高さを適切に設定
114
101
  this.adjustTextareaHeight();
115
102
  }
116
103
  }, 100);
117
104
  }
118
105
  onWindowResize() {
119
- // ウィンドウリサイズ時にターミナルをフィット
120
106
  this.xtermComponent()?.fit();
121
107
  }
122
108
  onTerminalReady(terminal) {
123
109
  this.terminal = terminal;
124
- // 初期化時にターミナルをコンテナサイズにフィット
125
110
  setTimeout(() => {
126
111
  this.xtermComponent()?.fit();
127
112
  }, 50);
128
- // 初期メッセージの表示
129
113
  this.showWelcomeMessage();
130
- // 初回ロード時は最上部にスクロール(アスキーアートから見えるように)
131
114
  setTimeout(() => {
132
115
  this.terminal.scrollToTop();
133
116
  }, 100);
134
- // 入力フィールドにフォーカスと高さ調整
135
117
  const textarea = this.inputField()?.nativeElement;
136
118
  if (textarea) {
137
119
  textarea.focus();
@@ -144,7 +126,6 @@ class AgentTemplate extends NgAtomicComponent {
144
126
  }
145
127
  async showWelcomeMessage() {
146
128
  this.terminal.writeln('');
147
- // assetsからSVGを読み込んでSIXELフォーマットで表示
148
129
  try {
149
130
  const response = await fetch('/assets/machina-ascii-art.svg');
150
131
  const svgString = await response.text();
@@ -154,7 +135,6 @@ class AgentTemplate extends NgAtomicComponent {
154
135
  }
155
136
  catch (error) {
156
137
  console.warn('SIXEL logo display failed, using ASCII fallback:', error);
157
- // フォールバック: ASCII artでX_Xロゴを表示
158
138
  this.terminal.writeln(`${chalk.cyan(' ██╗ ██╗ ██╗ ██╗')}`);
159
139
  this.terminal.writeln(`${chalk.cyan(' ╚██╗██╔╝ ╚██╗██╔╝ ')}`);
160
140
  this.terminal.writeln(`${chalk.cyan(' ╚███╔╝ ╚███╔╝ ')}`);
@@ -163,23 +143,20 @@ class AgentTemplate extends NgAtomicComponent {
163
143
  this.terminal.writeln(`${chalk.cyan(' ╚═╝ ╚═╝ ╚═╝ ╚═╝ ')}`);
164
144
  }
165
145
  this.terminal.writeln('');
166
- // ウェルカムメッセージを表示
167
146
  WELCOME_MESSAGE.split('\n').forEach(line => this.terminal.writeln(line));
168
147
  this.terminal.writeln('');
169
148
  this.terminal.writeln(`${chalk.cyan('● Type \x1b[1;36mlogin\x1b[1;33m to sign in with Google\x1b[0m')}`);
170
149
  this.terminal.writeln(`${chalk.cyan('● Type \x1b[1;36mhelp\x1b[1;33m for more commands\x1b[0m')}`);
171
150
  this.terminal.writeln('');
172
- // プロンプト表示
173
151
  this.showPrompt();
174
152
  }
175
153
  showPrompt() {
176
- // プロンプトはHTML側の入力フィールドで表示するため不要
154
+ void 0;
177
155
  }
178
156
  processCommand(command) {
179
157
  this.isProcessing = true;
180
158
  this.statusText = 'Processing...';
181
159
  this.cdr.markForCheck();
182
- // ログインコマンド
183
160
  if (command === 'login') {
184
161
  this.terminal.writeln('\x1b[1;32m● Initiating Google authentication...\x1b[0m');
185
162
  setTimeout(() => {
@@ -217,7 +194,6 @@ class AgentTemplate extends NgAtomicComponent {
217
194
  this.completeProcessing();
218
195
  }
219
196
  }
220
- // ログアウトコマンド
221
197
  else if (command === 'logout' || command === 'signout') {
222
198
  this.terminal.writeln('\x1b[1;32m● Signing out...\x1b[0m');
223
199
  setTimeout(() => {
@@ -229,7 +205,6 @@ class AgentTemplate extends NgAtomicComponent {
229
205
  }, 500);
230
206
  }, 300);
231
207
  }
232
- // ヘルプコマンド
233
208
  else if (command === 'help' || command === '?') {
234
209
  this.terminal.writeln('\x1b[1;32m● Available commands:\x1b[0m');
235
210
  this.terminal.writeln(' \x1b[36mlogin\x1b[0m - Sign in with Google (default)');
@@ -247,12 +222,10 @@ class AgentTemplate extends NgAtomicComponent {
247
222
  this.terminal.writeln(' \x1b[36m↑\x1b[0m / \x1b[36m↓\x1b[0m - Navigate command history');
248
223
  this.completeProcessing();
249
224
  }
250
- // machina情報コマンド
251
225
  else if (command === 'about') {
252
226
  ABOUT_MESSAGE.split('\n').forEach(line => this.terminal.writeln(line));
253
227
  this.completeProcessing();
254
228
  }
255
- // 利用規約コマンド
256
229
  else if (command === 'terms') {
257
230
  this.terminal.writeln('\x1b[1;32m● Opening Terms of Service...\x1b[0m');
258
231
  setTimeout(() => {
@@ -260,13 +233,11 @@ class AgentTemplate extends NgAtomicComponent {
260
233
  this.completeProcessing();
261
234
  }, 300);
262
235
  }
263
- // クリアコマンド
264
236
  else if (command === 'clear' || command === 'cls') {
265
237
  this.terminal.clear();
266
238
  this.terminal.scrollToBottom();
267
239
  this.completeProcessing();
268
240
  }
269
- // 不明なコマンド
270
241
  else {
271
242
  this.terminal.writeln(`\x1b[1;31m● Command not found: ${command}\x1b[0m`);
272
243
  this.terminal.writeln(' Type "help" for available commands.');
@@ -278,32 +249,24 @@ class AgentTemplate extends NgAtomicComponent {
278
249
  this.statusText = 'Ready';
279
250
  this.cdr.markForCheck();
280
251
  this.terminal.writeln('');
281
- // 最新の出力が見えるようにスクロール
282
252
  this.terminal.scrollToBottom();
283
- // 入力フィールドにフォーカスを戻す
284
253
  setTimeout(() => {
285
254
  this.inputField()?.nativeElement?.focus();
286
255
  }, 100);
287
256
  }
288
257
  handleEnter(event) {
289
- // Shift+EnterまたはCtrl+Enterの場合は改行を許可
290
258
  if (event.shiftKey || event.ctrlKey) {
291
- return; // デフォルト動作(改行)を許可
259
+ return;
292
260
  }
293
261
  event.preventDefault();
294
262
  const actualCommand = this.currentInput.trim();
295
263
  if (actualCommand) {
296
- // コマンドをターミナルに表示(改行を含む場合は適切に処理)
297
264
  const displayCommand = actualCommand.split('\n').map(line => '\x1b[32m> \x1b[0m' + line).join('\r\n');
298
265
  this.terminal.write(displayCommand + '\r\n');
299
- // 履歴に追加
300
266
  this.commandHistory.push(actualCommand);
301
267
  this.historyIndex = this.commandHistory.length;
302
- // コマンドを処理
303
268
  this.processCommand(actualCommand);
304
- // 入力を初期状態にリセット
305
269
  this.currentInput = '';
306
- // textareaの高さをリセット
307
270
  const textarea = this.inputField()?.nativeElement;
308
271
  if (textarea) {
309
272
  textarea.style.height = 'auto';
@@ -313,12 +276,10 @@ class AgentTemplate extends NgAtomicComponent {
313
276
  navigateHistory(event, direction) {
314
277
  event.preventDefault();
315
278
  if (direction === -1 && this.historyIndex > 0) {
316
- // 上矢印
317
279
  this.historyIndex--;
318
280
  this.currentInput = this.commandHistory[this.historyIndex];
319
281
  }
320
282
  else if (direction === 1) {
321
- // 下矢印
322
283
  if (this.historyIndex < this.commandHistory.length - 1) {
323
284
  this.historyIndex++;
324
285
  this.currentInput = this.commandHistory[this.historyIndex];
@@ -351,76 +312,59 @@ class AgentTemplate extends NgAtomicComponent {
351
312
  }
352
313
  this.dispatch(action);
353
314
  }
354
- // 入力フィールドにフォーカスを設定
355
315
  focusInput() {
356
316
  this.inputField()?.nativeElement?.focus();
357
317
  }
358
- // textareaの高さを内容に合わせて調整
359
318
  adjustTextareaHeight() {
360
319
  const textarea = this.inputField()?.nativeElement;
361
320
  if (textarea) {
362
- // 一旦高さをリセット
363
321
  textarea.style.height = '20px';
364
- // scrollHeightを確認し、実際に必要な高さを設定
365
322
  const scrollHeight = textarea.scrollHeight;
366
- // パディングを考慮した最小高さ
367
- const minHeight = 44; // padding: 12px * 2 + line-height: 20px
323
+ const minHeight = 44;
368
324
  textarea.style.height = Math.max(minHeight, scrollHeight) + 'px';
369
325
  }
370
326
  }
371
- // キーダウンイベントのハンドラ(プレフィックス削除防止は不要になったためノーオペレーション)
372
327
  preventPrefixDeletion(_event) {
373
- // No-op: prefix protection no longer needed
328
+ void 0;
374
329
  }
375
- // 入力時の処理
376
330
  handleInput(event) {
377
331
  const textarea = event.target;
378
- // 高さ調整(改行が含まれている場合のみ)
379
332
  if (this.currentInput.includes('\n')) {
380
333
  this.adjustTextareaHeight();
381
334
  }
382
335
  else {
383
- // 1行の場合は固定高さ
384
336
  textarea.style.height = '44px';
385
337
  }
386
- // カーソル位置を更新
387
338
  this.updateCursorPosition();
388
339
  }
389
- // フォーカス時の処理
390
340
  handleFocus() {
391
341
  this.showCursor = true;
392
342
  this.updateCursorPosition();
393
343
  }
394
- // ブラー時の処理
395
344
  handleBlur() {
396
345
  this.showCursor = false;
397
346
  }
398
- // カーソル位置の更新
399
347
  updateCursorPosition() {
400
348
  const textarea = this.inputField()?.nativeElement;
401
349
  if (!textarea)
402
350
  return;
403
351
  const cursorPos = textarea.selectionStart;
404
352
  const textBeforeCursor = this.currentInput.substring(0, cursorPos);
405
- // 改行で分割
406
353
  const lines = textBeforeCursor.split('\n');
407
354
  const currentLineIndex = lines.length - 1;
408
355
  const currentLineText = lines[currentLineIndex];
409
- // 仮のcanvasを使って現在の行のテキスト幅を計算
410
356
  const canvas = document.createElement('canvas');
411
357
  const context = canvas.getContext('2d');
412
358
  if (context) {
413
359
  context.font = '14px "SF Mono", Monaco, monospace';
414
360
  const textWidth = context.measureText(currentLineText).width;
415
- // カーソル位置を設定(パディング分を考慮)
416
- this.cursorLeft = 8 + textWidth; // 8px は textarea の左パディング
417
- // 垂直位置を調整(行数に基づいて、スクロール位置も考慮)
361
+ this.cursorLeft = 8 + textWidth;
418
362
  const scrollTop = textarea.scrollTop;
419
- this.cursorTop = 12 + (currentLineIndex * 20) - scrollTop; // スクロール分を引く
363
+ this.cursorTop = 12 + (currentLineIndex * 20) - scrollTop;
420
364
  }
421
365
  }
422
366
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: AgentTemplate, deps: null, target: i0.ɵɵFactoryTarget.Component });
423
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.1.6", type: AgentTemplate, isStandalone: true, selector: "templates-agent", inputs: { endActions: { classPropertyName: "endActions", publicName: "endActions", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onWindowResize()" }, classAttribute: "template" }, viewQueries: [{ propertyName: "xtermComponent", first: true, predicate: ["xtermComponent"], descendants: true, isSignal: true }, { propertyName: "inputField", first: true, predicate: ["inputField"], descendants: true, isSignal: true }], usesInheritance: true, hostDirectives: [{ directive: i1.EntranceTemplateStore, inputs: ["form", "form", "actions", "actions", "title", "title", "fieldMap", "fieldMap"] }], ngImport: i0, template: `
367
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: AgentTemplate, isStandalone: true, selector: "templates-agent", inputs: { endActions: { classPropertyName: "endActions", publicName: "endActions", isSignal: true, isRequired: false, transformFunction: null }, hideInputArea: { classPropertyName: "hideInputArea", publicName: "hideInputArea", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onWindowResize()" }, classAttribute: "template" }, viewQueries: [{ propertyName: "xtermComponent", first: true, predicate: ["xtermComponent"], descendants: true, isSignal: true }, { propertyName: "inputField", first: true, predicate: ["inputField"], descendants: true, isSignal: true }], usesInheritance: true, hostDirectives: [{ directive: i1.EntranceTemplateStore, inputs: ["form", "form", "actions", "actions", "title", "title", "fieldMap", "fieldMap"] }], ngImport: i0, template: `
424
368
  <frames-scroll class="terminal-window">
425
369
  <organisms-navigator top injectable class="terminal-header"
426
370
  [startActions]="navStartActions()"
@@ -428,51 +372,55 @@ class AgentTemplate extends NgAtomicComponent {
428
372
  (action)="onNavAction($event)"
429
373
  >MACHINA</organisms-navigator>
430
374
 
431
- <organisms-xterm
432
- class="terminal-display"
433
- (terminalReady)="onTerminalReady($event)"
434
- (githubLinkClick)="onGitHubLinkClick($event)"
435
- (click)="focusInput()"
436
- #xtermComponent
437
- />
375
+ <ng-content select="[terminalSlot]">
376
+ <organisms-xterm
377
+ class="terminal-display"
378
+ (terminalReady)="onTerminalReady($event)"
379
+ (githubLinkClick)="onGitHubLinkClick($event)"
380
+ (click)="focusInput()"
381
+ #xtermComponent
382
+ />
383
+ </ng-content>
438
384
 
439
- <div bottom class="input-area">
440
- <div class="input-line">
441
- <span class="input-prefix">></span>
442
- <div class="textarea-wrapper">
443
- <span class="arrow-prefix">></span>
444
- <div class="input-container">
445
- <textarea
446
- #inputField
447
- class="terminal-input"
448
- [(ngModel)]="currentInput"
449
- (keydown.enter)="handleEnter($event)"
450
- (keydown.arrowUp)="navigateHistory($event, -1)"
451
- (keydown.arrowDown)="navigateHistory($event, 1)"
452
- (keydown.control.k)="generateCommand($event)"
453
- (keydown.meta.k)="generateCommand($event)"
454
- (keydown)="preventPrefixDeletion($event)"
455
- (input)="handleInput($event)"
456
- (focus)="handleFocus()"
457
- (blur)="handleBlur()"
458
- (keyup)="updateCursorPosition()"
459
- (click)="updateCursorPosition()"
460
- (scroll)="updateCursorPosition()"
461
- [disabled]="isProcessing"
462
- placeholder="Type a command..."
463
- rows="1"
464
- ></textarea>
465
- <div class="block-cursor"
466
- [class.visible]="showCursor"
467
- [style.left.px]="cursorLeft"
468
- [style.top.px]="cursorTop"
469
- ></div>
385
+ @if (!hideInputArea()) {
386
+ <div bottom class="input-area">
387
+ <div class="input-line">
388
+ <span class="input-prefix">></span>
389
+ <div class="textarea-wrapper">
390
+ <span class="arrow-prefix">></span>
391
+ <div class="input-container">
392
+ <textarea
393
+ #inputField
394
+ class="terminal-input"
395
+ [(ngModel)]="currentInput"
396
+ (keydown.enter)="handleEnter($event)"
397
+ (keydown.arrowUp)="navigateHistory($event, -1)"
398
+ (keydown.arrowDown)="navigateHistory($event, 1)"
399
+ (keydown.control.k)="generateCommand($event)"
400
+ (keydown.meta.k)="generateCommand($event)"
401
+ (keydown)="preventPrefixDeletion($event)"
402
+ (input)="handleInput($event)"
403
+ (focus)="handleFocus()"
404
+ (blur)="handleBlur()"
405
+ (keyup)="updateCursorPosition()"
406
+ (click)="updateCursorPosition()"
407
+ (scroll)="updateCursorPosition()"
408
+ [disabled]="isProcessing"
409
+ placeholder="Type a command..."
410
+ rows="1"
411
+ ></textarea>
412
+ <div class="block-cursor"
413
+ [class.visible]="showCursor"
414
+ [style.left.px]="cursorLeft"
415
+ [style.top.px]="cursorTop"
416
+ ></div>
417
+ </div>
470
418
  </div>
471
419
  </div>
472
420
  </div>
473
- </div>
421
+ }
474
422
  </frames-scroll>
475
- `, isInline: true, styles: [":host{--text: #e0e0e0;--text-SCOPED-IN-entrance-GDNr: var(--text);--user: #00ff00;--user-SCOPED-IN-entrance-GDNr: var(--user);--sys: #888;--sys-SCOPED-IN-entrance-GDNr: var(--sys);--accent: #ff79c6;--accent-SCOPED-IN-entrance-GDNr: var(--accent);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-entrance-GDNr: var(--border)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}:host{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:transparent;font-family:SF Mono,Monaco,monospace;container-type:inline-size;container-name:agent-container;transition:all .3s ease}.terminal-window{--height: 100%;--contents-gap: 0;width:100%;max-width:900px;height:600px;background:#0a0a0a;border:1px solid var(--border-SCOPED-IN-entrance-GDNr);border-radius:8px;box-shadow:0 20px 40px #0000004d;animation:fadeIn .3s;transition:all .3s ease}.terminal-header{display:flex;justify-content:space-between;align-items:center;height:56px;min-height:56px;flex-shrink:0;padding:0;background:#1a1a1a99;border-bottom:1px solid var(--border-SCOPED-IN-entrance-GDNr);transition:all .3s ease;position:relative}.terminal-header .close-button{color:var(--sys-SCOPED-IN-entrance-GDNr);margin-right:.5rem;opacity:.7}.terminal-header .close-button:hover{color:var(--text-SCOPED-IN-entrance-GDNr);opacity:1}.terminal-header .terminal-title{font-size:13px;color:var(--text-SCOPED-IN-entrance-GDNr);font-weight:500;flex:1}.terminal-header .terminal-status{font-size:12px;color:var(--sys-SCOPED-IN-entrance-GDNr);opacity:.7}.terminal-display{width:100%;height:100%;background:#0a0a0a}.input-area{background:#000000e6;border-top:1px solid var(--border-SCOPED-IN-entrance-GDNr);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);transition:all .3s ease;padding:16px 20px}.input-line{display:block;position:relative}.input-line .input-prefix{display:none}.input-line .textarea-wrapper{display:flex;align-items:flex-start;position:relative;border:1px solid rgba(255,255,255,.2);border-radius:4px;transition:border-color .2s ease}.input-line .textarea-wrapper:focus-within{border-color:#fff6}.input-line .textarea-wrapper .arrow-prefix{color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;padding:12px 0 12px 16px;flex-shrink:0;pointer-events:none}.input-line .textarea-wrapper .input-container{flex:1;position:relative;overflow:hidden}.input-line .textarea-wrapper .terminal-input{width:100%;background:transparent;border:none;outline:none;color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;caret-color:transparent;padding:12px 16px 12px 8px;transition:none;resize:none;height:44px;min-height:44px;max-height:200px;overflow-y:auto;overflow-x:hidden;line-height:20px;box-sizing:border-box;white-space:pre-wrap;word-wrap:break-word}.input-line .textarea-wrapper .terminal-input::selection{background:#ffffff4d}.input-line .textarea-wrapper .terminal-input{caret-shape:block}.input-line .textarea-wrapper .terminal-input:disabled{opacity:.5;cursor:not-allowed}.input-line .textarea-wrapper .terminal-input:-webkit-autofill{-webkit-text-fill-color:#e0e0e0;-webkit-box-shadow:0 0 0 1000px rgba(0,0,0,.9) inset}.input-line .textarea-wrapper .terminal-input::placeholder{color:#ffffff4d;opacity:1}.input-line .textarea-wrapper .block-cursor{position:absolute;width:10px;height:20px;background:#e0e0e0;opacity:0;pointer-events:none}.input-line .textarea-wrapper .block-cursor.visible{animation:blink 1s infinite}@keyframes blink{0%,50%{opacity:.8}51%,to{opacity:0}}:host:has(.terminal-window){height:100vh;height:100dvh;overflow-y:auto}@container agent-container (max-width: 600px){:host{padding:0;padding-top:env(safe-area-inset-top)}.terminal-window{height:100%;max-height:100vh;max-height:100dvh;max-width:100%;border-radius:0;border:none;box-shadow:none}.terminal-header{height:56px;padding:0}.terminal-header .terminal-title{font-size:12px}.terminal-header .terminal-status{font-size:11px}.terminal-header .close-button{margin-right:.25rem}}@container agent-container (min-width: 601px) and (max-width: 900px){.terminal-window{max-width:100%;height:100%;border-radius:0}}@container agent-container (max-width: 400px){.terminal-header{height:56px;padding:0}.terminal-header .close-button{margin-right:.2rem}.input-area{padding:12px 16px}.textarea-wrapper .arrow-prefix{font-size:13px;padding:10px 0 10px 12px}.textarea-wrapper .terminal-input{font-size:12px;padding:10px 12px 10px 6px;height:40px;min-height:40px;line-height:20px}}.ascii-art{font-family:Consolas,Monaco,Liberation Mono,Menlo,Courier New,monospace!important;font-size:10px!important;line-height:1.1!important;letter-spacing:0!important;font-weight:400!important;margin:1em 0!important;padding:1em!important;white-space:pre!important;overflow-x:auto!important;overflow-y:hidden!important;display:block!important;width:fit-content!important;background:#ffffff08;border:1px solid var(--border-SCOPED-IN-entrance-GDNr);border-radius:4px;color:var(--accent-SCOPED-IN-entrance-GDNr)!important;opacity:.9;text-shadow:0 0 10px var(--accent-SCOPED-IN-entrance-GDNr),0 0 20px var(--accent-SCOPED-IN-entrance-GDNr);-webkit-font-smoothing:none!important;-moz-osx-font-smoothing:unset!important;font-variant-ligatures:none!important;text-rendering:optimizeLegibility!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ScrollFrame, selector: "frames-scroll" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: XtermOrganism, selector: "organisms-xterm", outputs: ["terminalReady", "githubLinkClick"] }, { kind: "directive", type: NavigatorOrganismStore, selector: "organisms-navigator", inputs: ["startActions", "endActions", "title"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
423
+ `, isInline: true, styles: [":host{--text: #e0e0e0;--text-SCOPED-IN-entrance-0hAu: var(--text);--user: #33ff33;--user-SCOPED-IN-entrance-0hAu: var(--user);--sys: #888;--sys-SCOPED-IN-entrance-0hAu: var(--sys);--accent: #ff79c6;--accent-SCOPED-IN-entrance-0hAu: var(--accent);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-entrance-0hAu: var(--border)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}:host{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:transparent;font-family:SF Mono,Monaco,monospace;container-type:inline-size;container-name:agent-container;transition:all .3s ease}.terminal-window{--height: 100%;--contents-gap: 0;width:100%;max-width:900px;height:600px;background:#0a0a0a;border:1px solid var(--border-SCOPED-IN-entrance-0hAu);border-radius:8px;box-shadow:0 20px 40px #0000004d;animation:fadeIn .3s;transition:all .3s ease}.terminal-header{display:flex;justify-content:space-between;align-items:center;height:56px;min-height:56px;flex-shrink:0;padding:0;background:#1a1a1a99;border-bottom:1px solid var(--border-SCOPED-IN-entrance-0hAu);transition:all .3s ease;position:relative}.terminal-header .close-button{color:var(--sys-SCOPED-IN-entrance-0hAu);margin-right:.5rem;opacity:.7}.terminal-header .close-button:hover{color:var(--text-SCOPED-IN-entrance-0hAu);opacity:1}.terminal-header .terminal-title{font-size:13px;color:var(--text-SCOPED-IN-entrance-0hAu);font-weight:500;flex:1}.terminal-header .terminal-status{font-size:12px;color:var(--sys-SCOPED-IN-entrance-0hAu);opacity:.7}.terminal-display{width:100%;height:100%;background:#0a0a0a}.input-area{background:#000000e6;border-top:1px solid var(--border-SCOPED-IN-entrance-0hAu);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);transition:all .3s ease;padding:16px 20px}.input-line{display:block;position:relative}.input-line .input-prefix{display:none}.input-line .textarea-wrapper{display:flex;align-items:flex-start;position:relative;border:1px solid rgba(255,255,255,.2);border-radius:4px;transition:border-color .2s ease}.input-line .textarea-wrapper:focus-within{border-color:#fff6}.input-line .textarea-wrapper .arrow-prefix{color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;padding:12px 0 12px 16px;flex-shrink:0;pointer-events:none}.input-line .textarea-wrapper .input-container{flex:1;position:relative;overflow:hidden}.input-line .textarea-wrapper .terminal-input{width:100%;background:transparent;border:none;outline:none;color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;caret-color:transparent;padding:12px 16px 12px 8px;transition:none;resize:none;height:44px;min-height:44px;max-height:200px;overflow-y:auto;overflow-x:hidden;line-height:20px;box-sizing:border-box;white-space:pre-wrap;word-wrap:break-word}.input-line .textarea-wrapper .terminal-input::selection{background:#ffffff4d}.input-line .textarea-wrapper .terminal-input{caret-shape:block}.input-line .textarea-wrapper .terminal-input:disabled{opacity:.5;cursor:not-allowed}.input-line .textarea-wrapper .terminal-input:-webkit-autofill{-webkit-text-fill-color:#e0e0e0;-webkit-box-shadow:0 0 0 1000px rgba(0,0,0,.9) inset}.input-line .textarea-wrapper .terminal-input::placeholder{color:#ffffff4d;opacity:1}.input-line .textarea-wrapper .block-cursor{position:absolute;width:10px;height:20px;background:#e0e0e0;opacity:0;pointer-events:none}.input-line .textarea-wrapper .block-cursor.visible{animation:blink 1s infinite}@keyframes blink{0%,50%{opacity:.8}51%,to{opacity:0}}:host:has(.terminal-window){height:100vh;height:100dvh;overflow-y:auto}@container agent-container (max-width: 600px){:host{padding:0;padding-top:env(safe-area-inset-top)}.terminal-window{height:100%;max-height:100vh;max-height:100dvh;max-width:100%;border-radius:0;border:none;box-shadow:none}.terminal-header{height:56px;padding:0}.terminal-header .terminal-title{font-size:12px}.terminal-header .terminal-status{font-size:11px}.terminal-header .close-button{margin-right:.25rem}}@container agent-container (min-width: 601px) and (max-width: 900px){.terminal-window{max-width:100%;height:100%;border-radius:0}}@container agent-container (max-width: 400px){.terminal-header{height:56px;padding:0}.terminal-header .close-button{margin-right:.2rem}.input-area{padding:12px 16px}.textarea-wrapper .arrow-prefix{font-size:13px;padding:10px 0 10px 12px}.textarea-wrapper .terminal-input{font-size:12px;padding:10px 12px 10px 6px;height:40px;min-height:40px;line-height:20px}}.ascii-art{font-family:Consolas,Monaco,Liberation Mono,Menlo,Courier New,monospace!important;font-size:10px!important;line-height:1.1!important;letter-spacing:0!important;font-weight:400!important;margin:1em 0!important;padding:1em!important;white-space:pre!important;overflow-x:auto!important;overflow-y:hidden!important;display:block!important;width:fit-content!important;background:#ffffff08;border:1px solid var(--border-SCOPED-IN-entrance-0hAu);border-radius:4px;color:var(--accent-SCOPED-IN-entrance-0hAu)!important;opacity:.9;text-shadow:0 0 10px var(--accent-SCOPED-IN-entrance-0hAu),0 0 20px var(--accent-SCOPED-IN-entrance-0hAu);-webkit-font-smoothing:none!important;-moz-osx-font-smoothing:unset!important;font-variant-ligatures:none!important;text-rendering:optimizeLegibility!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ScrollFrame, selector: "frames-scroll" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: XtermOrganism, selector: "organisms-xterm", outputs: ["terminalReady", "githubLinkClick"] }, { kind: "directive", type: NavigatorOrganismStore, selector: "organisms-navigator", inputs: ["startActions", "endActions", "title"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
476
424
  }
477
425
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: AgentTemplate, decorators: [{
478
426
  type: Component,
@@ -497,49 +445,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
497
445
  (action)="onNavAction($event)"
498
446
  >MACHINA</organisms-navigator>
499
447
 
500
- <organisms-xterm
501
- class="terminal-display"
502
- (terminalReady)="onTerminalReady($event)"
503
- (githubLinkClick)="onGitHubLinkClick($event)"
504
- (click)="focusInput()"
505
- #xtermComponent
506
- />
448
+ <ng-content select="[terminalSlot]">
449
+ <organisms-xterm
450
+ class="terminal-display"
451
+ (terminalReady)="onTerminalReady($event)"
452
+ (githubLinkClick)="onGitHubLinkClick($event)"
453
+ (click)="focusInput()"
454
+ #xtermComponent
455
+ />
456
+ </ng-content>
507
457
 
508
- <div bottom class="input-area">
509
- <div class="input-line">
510
- <span class="input-prefix">></span>
511
- <div class="textarea-wrapper">
512
- <span class="arrow-prefix">></span>
513
- <div class="input-container">
514
- <textarea
515
- #inputField
516
- class="terminal-input"
517
- [(ngModel)]="currentInput"
518
- (keydown.enter)="handleEnter($event)"
519
- (keydown.arrowUp)="navigateHistory($event, -1)"
520
- (keydown.arrowDown)="navigateHistory($event, 1)"
521
- (keydown.control.k)="generateCommand($event)"
522
- (keydown.meta.k)="generateCommand($event)"
523
- (keydown)="preventPrefixDeletion($event)"
524
- (input)="handleInput($event)"
525
- (focus)="handleFocus()"
526
- (blur)="handleBlur()"
527
- (keyup)="updateCursorPosition()"
528
- (click)="updateCursorPosition()"
529
- (scroll)="updateCursorPosition()"
530
- [disabled]="isProcessing"
531
- placeholder="Type a command..."
532
- rows="1"
533
- ></textarea>
534
- <div class="block-cursor"
535
- [class.visible]="showCursor"
536
- [style.left.px]="cursorLeft"
537
- [style.top.px]="cursorTop"
538
- ></div>
458
+ @if (!hideInputArea()) {
459
+ <div bottom class="input-area">
460
+ <div class="input-line">
461
+ <span class="input-prefix">></span>
462
+ <div class="textarea-wrapper">
463
+ <span class="arrow-prefix">></span>
464
+ <div class="input-container">
465
+ <textarea
466
+ #inputField
467
+ class="terminal-input"
468
+ [(ngModel)]="currentInput"
469
+ (keydown.enter)="handleEnter($event)"
470
+ (keydown.arrowUp)="navigateHistory($event, -1)"
471
+ (keydown.arrowDown)="navigateHistory($event, 1)"
472
+ (keydown.control.k)="generateCommand($event)"
473
+ (keydown.meta.k)="generateCommand($event)"
474
+ (keydown)="preventPrefixDeletion($event)"
475
+ (input)="handleInput($event)"
476
+ (focus)="handleFocus()"
477
+ (blur)="handleBlur()"
478
+ (keyup)="updateCursorPosition()"
479
+ (click)="updateCursorPosition()"
480
+ (scroll)="updateCursorPosition()"
481
+ [disabled]="isProcessing"
482
+ placeholder="Type a command..."
483
+ rows="1"
484
+ ></textarea>
485
+ <div class="block-cursor"
486
+ [class.visible]="showCursor"
487
+ [style.left.px]="cursorLeft"
488
+ [style.top.px]="cursorTop"
489
+ ></div>
490
+ </div>
539
491
  </div>
540
492
  </div>
541
493
  </div>
542
- </div>
494
+ }
543
495
  </frames-scroll>
544
496
  `, host: {
545
497
  class: 'template'
@@ -553,8 +505,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
553
505
  'fieldMap',
554
506
  ],
555
507
  },
556
- ], styles: [":host{--text: #e0e0e0;--text-SCOPED-IN-entrance-GDNr: var(--text);--user: #00ff00;--user-SCOPED-IN-entrance-GDNr: var(--user);--sys: #888;--sys-SCOPED-IN-entrance-GDNr: var(--sys);--accent: #ff79c6;--accent-SCOPED-IN-entrance-GDNr: var(--accent);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-entrance-GDNr: var(--border)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}:host{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:transparent;font-family:SF Mono,Monaco,monospace;container-type:inline-size;container-name:agent-container;transition:all .3s ease}.terminal-window{--height: 100%;--contents-gap: 0;width:100%;max-width:900px;height:600px;background:#0a0a0a;border:1px solid var(--border-SCOPED-IN-entrance-GDNr);border-radius:8px;box-shadow:0 20px 40px #0000004d;animation:fadeIn .3s;transition:all .3s ease}.terminal-header{display:flex;justify-content:space-between;align-items:center;height:56px;min-height:56px;flex-shrink:0;padding:0;background:#1a1a1a99;border-bottom:1px solid var(--border-SCOPED-IN-entrance-GDNr);transition:all .3s ease;position:relative}.terminal-header .close-button{color:var(--sys-SCOPED-IN-entrance-GDNr);margin-right:.5rem;opacity:.7}.terminal-header .close-button:hover{color:var(--text-SCOPED-IN-entrance-GDNr);opacity:1}.terminal-header .terminal-title{font-size:13px;color:var(--text-SCOPED-IN-entrance-GDNr);font-weight:500;flex:1}.terminal-header .terminal-status{font-size:12px;color:var(--sys-SCOPED-IN-entrance-GDNr);opacity:.7}.terminal-display{width:100%;height:100%;background:#0a0a0a}.input-area{background:#000000e6;border-top:1px solid var(--border-SCOPED-IN-entrance-GDNr);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);transition:all .3s ease;padding:16px 20px}.input-line{display:block;position:relative}.input-line .input-prefix{display:none}.input-line .textarea-wrapper{display:flex;align-items:flex-start;position:relative;border:1px solid rgba(255,255,255,.2);border-radius:4px;transition:border-color .2s ease}.input-line .textarea-wrapper:focus-within{border-color:#fff6}.input-line .textarea-wrapper .arrow-prefix{color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;padding:12px 0 12px 16px;flex-shrink:0;pointer-events:none}.input-line .textarea-wrapper .input-container{flex:1;position:relative;overflow:hidden}.input-line .textarea-wrapper .terminal-input{width:100%;background:transparent;border:none;outline:none;color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;caret-color:transparent;padding:12px 16px 12px 8px;transition:none;resize:none;height:44px;min-height:44px;max-height:200px;overflow-y:auto;overflow-x:hidden;line-height:20px;box-sizing:border-box;white-space:pre-wrap;word-wrap:break-word}.input-line .textarea-wrapper .terminal-input::selection{background:#ffffff4d}.input-line .textarea-wrapper .terminal-input{caret-shape:block}.input-line .textarea-wrapper .terminal-input:disabled{opacity:.5;cursor:not-allowed}.input-line .textarea-wrapper .terminal-input:-webkit-autofill{-webkit-text-fill-color:#e0e0e0;-webkit-box-shadow:0 0 0 1000px rgba(0,0,0,.9) inset}.input-line .textarea-wrapper .terminal-input::placeholder{color:#ffffff4d;opacity:1}.input-line .textarea-wrapper .block-cursor{position:absolute;width:10px;height:20px;background:#e0e0e0;opacity:0;pointer-events:none}.input-line .textarea-wrapper .block-cursor.visible{animation:blink 1s infinite}@keyframes blink{0%,50%{opacity:.8}51%,to{opacity:0}}:host:has(.terminal-window){height:100vh;height:100dvh;overflow-y:auto}@container agent-container (max-width: 600px){:host{padding:0;padding-top:env(safe-area-inset-top)}.terminal-window{height:100%;max-height:100vh;max-height:100dvh;max-width:100%;border-radius:0;border:none;box-shadow:none}.terminal-header{height:56px;padding:0}.terminal-header .terminal-title{font-size:12px}.terminal-header .terminal-status{font-size:11px}.terminal-header .close-button{margin-right:.25rem}}@container agent-container (min-width: 601px) and (max-width: 900px){.terminal-window{max-width:100%;height:100%;border-radius:0}}@container agent-container (max-width: 400px){.terminal-header{height:56px;padding:0}.terminal-header .close-button{margin-right:.2rem}.input-area{padding:12px 16px}.textarea-wrapper .arrow-prefix{font-size:13px;padding:10px 0 10px 12px}.textarea-wrapper .terminal-input{font-size:12px;padding:10px 12px 10px 6px;height:40px;min-height:40px;line-height:20px}}.ascii-art{font-family:Consolas,Monaco,Liberation Mono,Menlo,Courier New,monospace!important;font-size:10px!important;line-height:1.1!important;letter-spacing:0!important;font-weight:400!important;margin:1em 0!important;padding:1em!important;white-space:pre!important;overflow-x:auto!important;overflow-y:hidden!important;display:block!important;width:fit-content!important;background:#ffffff08;border:1px solid var(--border-SCOPED-IN-entrance-GDNr);border-radius:4px;color:var(--accent-SCOPED-IN-entrance-GDNr)!important;opacity:.9;text-shadow:0 0 10px var(--accent-SCOPED-IN-entrance-GDNr),0 0 20px var(--accent-SCOPED-IN-entrance-GDNr);-webkit-font-smoothing:none!important;-moz-osx-font-smoothing:unset!important;font-variant-ligatures:none!important;text-rendering:optimizeLegibility!important}\n"] }]
557
- }], propDecorators: { endActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "endActions", required: false }] }], xtermComponent: [{ type: i0.ViewChild, args: ['xtermComponent', { isSignal: true }] }], inputField: [{ type: i0.ViewChild, args: ['inputField', { isSignal: true }] }], onWindowResize: [{
508
+ ], styles: [":host{--text: #e0e0e0;--text-SCOPED-IN-entrance-0hAu: var(--text);--user: #33ff33;--user-SCOPED-IN-entrance-0hAu: var(--user);--sys: #888;--sys-SCOPED-IN-entrance-0hAu: var(--sys);--accent: #ff79c6;--accent-SCOPED-IN-entrance-0hAu: var(--accent);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-entrance-0hAu: var(--border)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}:host{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:transparent;font-family:SF Mono,Monaco,monospace;container-type:inline-size;container-name:agent-container;transition:all .3s ease}.terminal-window{--height: 100%;--contents-gap: 0;width:100%;max-width:900px;height:600px;background:#0a0a0a;border:1px solid var(--border-SCOPED-IN-entrance-0hAu);border-radius:8px;box-shadow:0 20px 40px #0000004d;animation:fadeIn .3s;transition:all .3s ease}.terminal-header{display:flex;justify-content:space-between;align-items:center;height:56px;min-height:56px;flex-shrink:0;padding:0;background:#1a1a1a99;border-bottom:1px solid var(--border-SCOPED-IN-entrance-0hAu);transition:all .3s ease;position:relative}.terminal-header .close-button{color:var(--sys-SCOPED-IN-entrance-0hAu);margin-right:.5rem;opacity:.7}.terminal-header .close-button:hover{color:var(--text-SCOPED-IN-entrance-0hAu);opacity:1}.terminal-header .terminal-title{font-size:13px;color:var(--text-SCOPED-IN-entrance-0hAu);font-weight:500;flex:1}.terminal-header .terminal-status{font-size:12px;color:var(--sys-SCOPED-IN-entrance-0hAu);opacity:.7}.terminal-display{width:100%;height:100%;background:#0a0a0a}.input-area{background:#000000e6;border-top:1px solid var(--border-SCOPED-IN-entrance-0hAu);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);transition:all .3s ease;padding:16px 20px}.input-line{display:block;position:relative}.input-line .input-prefix{display:none}.input-line .textarea-wrapper{display:flex;align-items:flex-start;position:relative;border:1px solid rgba(255,255,255,.2);border-radius:4px;transition:border-color .2s ease}.input-line .textarea-wrapper:focus-within{border-color:#fff6}.input-line .textarea-wrapper .arrow-prefix{color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;padding:12px 0 12px 16px;flex-shrink:0;pointer-events:none}.input-line .textarea-wrapper .input-container{flex:1;position:relative;overflow:hidden}.input-line .textarea-wrapper .terminal-input{width:100%;background:transparent;border:none;outline:none;color:#e0e0e0;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:400;caret-color:transparent;padding:12px 16px 12px 8px;transition:none;resize:none;height:44px;min-height:44px;max-height:200px;overflow-y:auto;overflow-x:hidden;line-height:20px;box-sizing:border-box;white-space:pre-wrap;word-wrap:break-word}.input-line .textarea-wrapper .terminal-input::selection{background:#ffffff4d}.input-line .textarea-wrapper .terminal-input{caret-shape:block}.input-line .textarea-wrapper .terminal-input:disabled{opacity:.5;cursor:not-allowed}.input-line .textarea-wrapper .terminal-input:-webkit-autofill{-webkit-text-fill-color:#e0e0e0;-webkit-box-shadow:0 0 0 1000px rgba(0,0,0,.9) inset}.input-line .textarea-wrapper .terminal-input::placeholder{color:#ffffff4d;opacity:1}.input-line .textarea-wrapper .block-cursor{position:absolute;width:10px;height:20px;background:#e0e0e0;opacity:0;pointer-events:none}.input-line .textarea-wrapper .block-cursor.visible{animation:blink 1s infinite}@keyframes blink{0%,50%{opacity:.8}51%,to{opacity:0}}:host:has(.terminal-window){height:100vh;height:100dvh;overflow-y:auto}@container agent-container (max-width: 600px){:host{padding:0;padding-top:env(safe-area-inset-top)}.terminal-window{height:100%;max-height:100vh;max-height:100dvh;max-width:100%;border-radius:0;border:none;box-shadow:none}.terminal-header{height:56px;padding:0}.terminal-header .terminal-title{font-size:12px}.terminal-header .terminal-status{font-size:11px}.terminal-header .close-button{margin-right:.25rem}}@container agent-container (min-width: 601px) and (max-width: 900px){.terminal-window{max-width:100%;height:100%;border-radius:0}}@container agent-container (max-width: 400px){.terminal-header{height:56px;padding:0}.terminal-header .close-button{margin-right:.2rem}.input-area{padding:12px 16px}.textarea-wrapper .arrow-prefix{font-size:13px;padding:10px 0 10px 12px}.textarea-wrapper .terminal-input{font-size:12px;padding:10px 12px 10px 6px;height:40px;min-height:40px;line-height:20px}}.ascii-art{font-family:Consolas,Monaco,Liberation Mono,Menlo,Courier New,monospace!important;font-size:10px!important;line-height:1.1!important;letter-spacing:0!important;font-weight:400!important;margin:1em 0!important;padding:1em!important;white-space:pre!important;overflow-x:auto!important;overflow-y:hidden!important;display:block!important;width:fit-content!important;background:#ffffff08;border:1px solid var(--border-SCOPED-IN-entrance-0hAu);border-radius:4px;color:var(--accent-SCOPED-IN-entrance-0hAu)!important;opacity:.9;text-shadow:0 0 10px var(--accent-SCOPED-IN-entrance-0hAu),0 0 20px var(--accent-SCOPED-IN-entrance-0hAu);-webkit-font-smoothing:none!important;-moz-osx-font-smoothing:unset!important;font-variant-ligatures:none!important;text-rendering:optimizeLegibility!important}\n"] }]
509
+ }], propDecorators: { endActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "endActions", required: false }] }], hideInputArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideInputArea", required: false }] }], xtermComponent: [{ type: i0.ViewChild, args: ['xtermComponent', { isSignal: true }] }], inputField: [{ type: i0.ViewChild, args: ['inputField', { isSignal: true }] }], onWindowResize: [{
558
510
  type: HostListener,
559
511
  args: ['window:resize']
560
512
  }] } });